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
@@ -24,8 +24,8 @@ export const SHOT_VIEW_SCRIPT = "cli-pane-shot-entry.js";
24
24
  export const SHOT_VIEW_STYLESHEET = "styles.css";
25
25
  export const SHOT_VIEW_ARCHIVE = "shot-view.json.gz";
26
26
 
27
- const MISSING_VIEW_MESSAGE = "This copy of Gloomberb cannot draw panes: it was built without the page they are drawn in. "
28
- + "Reinstall or update Gloomberb. The standalone gloomberb binary "
27
+ const MISSING_VIEW_MESSAGE = "This copy of Gloom cannot draw panes: it was built without the page they are drawn in. "
28
+ + "Reinstall or update Gloom. The standalone gloom binary "
29
29
  + "(https://github.com/gloom-sh/gloomberb/releases/latest) also includes it.";
30
30
 
31
31
  let prebuiltArchive: string | null = null;
@@ -257,7 +257,7 @@ function shotPageHtml(view: ShotViewFiles, payload: DesktopPaneShotPayload): str
257
257
  return renderElectrobunViewHtml({
258
258
  stylesheet: view.get(SHOT_VIEW_STYLESHEET) ?? "",
259
259
  entrySrc: `./${SHOT_VIEW_SCRIPT}`,
260
- title: "Gloomberb Pane Shot",
260
+ title: "Gloom Pane Shot",
261
261
  loadingText: "Rendering pane...",
262
262
  bootstrapScript: `
263
263
  window.__GLOOM_CLI_SHOT_PAYLOAD__ = ${payloadJson};
@@ -1,15 +1,15 @@
1
1
  import { logFailure } from "../utils/log-failure";
2
2
  import type { EarningsEvent } from "../types/data-provider";
3
+ import type { EarningsDateStatus } from "../types/financials";
3
4
  import { isUsListingExchange } from "../utils/exchanges";
4
5
  import { listingChoiceNote, loadListingQuote, usLineOfListing, type CliListing, type ListingDeps, type ListingVenue } from "./listing-arg";
5
6
  import { sameCompany } from "../tickers/company-name";
6
7
 
7
8
  const DAY_MS = 86_400_000;
8
9
 
9
- /** How firm a report date is: "reported" once there is an actual, else "est" or "confirmed" as the calendar flags it. */
10
- export function earningsDateLabel(event: Pick<EarningsEvent, "isDateEstimate" | "epsActual">): string {
11
- if (event.epsActual != null) return "reported";
12
- return event.isDateEstimate === true ? "est" : event.isDateEstimate === false ? "confirmed" : "";
10
+ /** How firm a report date is, as resolved (shared/earnings-calendar): reported, confirmed, or est for a projected one. */
11
+ export function earningsDateLabel(status: EarningsDateStatus | null): string {
12
+ return status === "projected" ? "est" : status ?? "";
13
13
  }
14
14
 
15
15
  /** Whether the listing trades abroad, where the calendar is the listing's own exchange's rather than the US one. */
package/src/cli/entry.ts CHANGED
@@ -1,12 +1,15 @@
1
- import { dispatchCli, failUnknownCliCommand } from "./index";
1
+ import "./opentui-libc";
2
2
  import { inferCliErrorOptions, printCliError } from "./errors";
3
3
  import { isCliHelpFlag } from "./options";
4
+ import { plainByDefault, setCliPlainOverride } from "../utils/cli-output";
4
5
  import { loadExternalPlugins } from "../plugins/loader";
5
6
  import { restoreExtractedPlugins } from "./restore-plugins";
6
7
  import { measurePerfAsync } from "../utils/perf-marks";
7
8
  import { flushCrashReports, reportCrash } from "../telemetry/crash-reports";
8
9
  import { CRASH_REPORT_EXIT_FLUSH_MS } from "../telemetry/crash-reports-node";
9
10
  import type { CliLaunchRequest } from "../types/plugin";
11
+ import { detectUpdateAction } from "../updater";
12
+ import { linkStandaloneCommand } from "../updater/command-names";
10
13
  import {
11
14
  OPEN_TUI_NATIVE_SMOKE_COMMAND,
12
15
  OPEN_TUI_RUNTIME_SMOKE_COMMAND,
@@ -19,6 +22,10 @@ import {
19
22
  } from "./native-smoke";
20
23
 
21
24
  async function launchOpenTuiApp(cliLaunchRequest: CliLaunchRequest | null = null): Promise<void> {
25
+ // Before anything in the app can reach for the render library, so a temp
26
+ // folder that cannot run it is worked around (or named) first.
27
+ const { loadRenderLib } = await import("../renderers/opentui/render-lib");
28
+ await measurePerfAsync("startup.opentui.render-lib", loadRenderLib);
22
29
  const { startOpenTuiApp } = await import("../renderers/opentui/start");
23
30
  // Before the catalog is read, so a plugin that moved out of this repository is
24
31
  // available in the same session rather than only after a restart.
@@ -58,11 +65,21 @@ export async function runCliEntrypoint(rawArgs = process.argv.slice(2)): Promise
58
65
  process.exit(0);
59
66
  }
60
67
 
68
+ // The standalone binary updates by replacing itself, so one installed as
69
+ // `gloomberb` before the rename gets `gloom` beside it here.
70
+ if (detectUpdateAction()?.kind === "self") linkStandaloneCommand(process.execPath);
71
+
61
72
  if (!command || ((command === "launch-ui" || command === "ui") && !rawArgs.some(isCliHelpFlag))) {
62
73
  await launchOpenTuiApp();
63
74
  return;
64
75
  }
65
76
 
77
+ // Loaded only for a command: a bare launch never reads the commands, and
78
+ // their modules are a noticeable part of what it would load before drawing.
79
+ const { dispatchCli, failUnknownCliCommand } = await import("./index");
80
+ // For a screen reader, a pipe or NO_COLOR: no rule lines, arrows in words, fixed table columns. Set
81
+ // for this process only; `--plain` / `--no-plain` decide it in dispatchCli, and commands run in-process keep theirs.
82
+ setCliPlainOverride(plainByDefault());
66
83
  const externalPlugins = await loadExternalPlugins();
67
84
  const dispatchResult = await dispatchCli(rawArgs, { externalPlugins });
68
85
  if (dispatchResult.kind === "handled") return;
package/src/cli/errors.ts CHANGED
@@ -5,17 +5,29 @@ import { serializeCliError, type CliErrorObject } from "./result";
5
5
  import { cliStyles, cliTerminalWidth, wrapText } from "../utils/cli-output";
6
6
  import { withSearchHints, type FredSeriesCheck } from "./not-a-ticker";
7
7
  import { isProviderBusy, SEARCH_BUSY_CODE, SEARCH_BUSY_MESSAGE } from "../sources/provider-errors";
8
+ import { DATA_SERVICE_UNREACHABLE_MESSAGE, isNetworkFailure } from "../utils/network-failure";
8
9
 
9
10
  const USAGE_PREFIX = "Usage: ";
10
11
  /** The code of every error a command fails with: bad input, nothing found, an option it does not take. */
11
12
  const CLI_ERROR_CODE = "cli_error";
13
+ /** The code of a command whose requests never reached the data service. */
14
+ const SERVICE_UNREACHABLE_CODE = "service_unreachable";
15
+
16
+ /** What to check when nothing answered: the connection, and the proxy when one is set. */
17
+ function unreachableHint(): string {
18
+ const env = typeof process === "undefined" ? {} : process.env;
19
+ const proxy = ["HTTPS_PROXY", "https_proxy", "ALL_PROXY", "all_proxy"].find((name) => env[name]?.trim());
20
+ return proxy
21
+ ? `Check the internet connection and the proxy in ${proxy}, then try again.`
22
+ : "Check the internet connection, then try again.";
23
+ }
12
24
 
13
25
  export interface CliErrorContext {
14
26
  /** The command that failed, used to point at its help. */
15
27
  command?: string;
16
28
  /** What the user typed after the command, so a hint can repeat their own spelling of a symbol. */
17
29
  args?: readonly string[];
18
- /** Which symbols are FRED series the catalog charts, so their hint is `gloomberb fred`. */
30
+ /** Which symbols are FRED series the catalog charts, so their hint is `gloom fred`. */
19
31
  isFredSeries?: FredSeriesCheck;
20
32
  }
21
33
 
@@ -82,6 +94,10 @@ function cliErrorObject(error: unknown): CliErrorObject {
82
94
  if (isProviderBusy(error)) {
83
95
  return { code: SEARCH_BUSY_CODE, message: SEARCH_BUSY_MESSAGE, retryable: true };
84
96
  }
97
+ // No answer came back at all: in Gloom's words, whichever fetch failed (Bun's "Unable to connect", a refused proxy).
98
+ if (isNetworkFailure(error)) {
99
+ return { code: SERVICE_UNREACHABLE_CODE, message: DATA_SERVICE_UNREACHABLE_MESSAGE, details: unreachableHint(), retryable: true };
100
+ }
85
101
  // Gloom Cloud refused what was asked (an unknown series, a bad date): the input was wrong, not the program.
86
102
  if (error instanceof ApiRequestError && error.status === 400) {
87
103
  return { code: CLI_ERROR_CODE, message: error.message };
@@ -102,6 +118,8 @@ export function inferCliErrorOptions(rawArgs: string[]): CliGlobalOptions {
102
118
  if (arg === "--quiet" || arg === "-q") options.quiet = true;
103
119
  if (arg === "--no-color") options.color = false;
104
120
  if (arg === "--color") options.color = true;
121
+ if (arg === "--plain") options.plain = true;
122
+ if (arg === "--no-plain") options.plain = false;
105
123
  }
106
124
  return options;
107
125
  }
@@ -117,7 +135,7 @@ function formatCliErrorText(error: CliErrorObject, context: CliErrorContext): st
117
135
  ...details.map((line) => cliStyles.muted(line)),
118
136
  ];
119
137
  if (context.command) {
120
- lines.push(cliStyles.muted(`Run gloomberb help ${context.command} for details.`));
138
+ lines.push(cliStyles.muted(`Run gloom help ${context.command} for details.`));
121
139
  }
122
140
  return lines.join("\n");
123
141
  }
@@ -1,4 +1,4 @@
1
- /** What `gloomberb <command>` exits with, as `gloomberb help` lists them. */
1
+ /** What `gloom <command>` exits with, as `gloom help` lists them. */
2
2
  export const CLI_EXIT_CODES = {
3
3
  ok: 0,
4
4
  /** Bad input, nothing found, a failed check, or an unexpected error. */
@@ -3,7 +3,7 @@
3
3
  * writes CSV or JSON, so an export can go in an audit file as it is: CSV ends
4
4
  * with `#` lines and JSON carries a `source` object with the same fields.
5
5
  * CSV and NDJSON rows also end with five fixed columns naming what each row
6
- * is (`EXPORT_IDENTITY_COLUMNS`).
6
+ * is (`EXPORT_IDENTITY_COLUMNS`), less any the table already has by name.
7
7
  */
8
8
  import { formatFreshnessLine, type ReportFreshness } from "./pane-functions/freshness";
9
9
  import { parseReportTime } from "../utils/utc-time";
@@ -28,16 +28,20 @@ export interface ExportSource {
28
28
  publicationTime: string | null;
29
29
  /** When the data was retrieved for this export: an ISO instant in UTC. */
30
30
  retrievalTime: string;
31
+ /** Refreshing the data failed and a copy saved earlier answered: when it was saved, an ISO instant in UTC. */
32
+ savedTime?: string;
31
33
  }
32
34
 
33
35
  export function exportSource(freshness: ReportFreshness): ExportSource {
34
36
  return {
35
37
  name: freshness.source,
36
38
  publisher: freshness.publisher ?? null,
37
- observationDate: freshness.asOf,
39
+ // A figure as of its release is still dated by the period it covers; the release is its publication time.
40
+ observationDate: freshness.referencePeriod ?? freshness.asOf,
38
41
  ...(freshness.oldestObservation ? { oldestObservationDate: freshness.oldestObservation } : {}),
39
- publicationTime: freshness.publishedAt ?? null,
42
+ publicationTime: freshness.publishedAt ?? (freshness.referencePeriod ? freshness.asOf : null),
40
43
  retrievalTime: freshness.retrievedAt,
44
+ ...(freshness.savedAt ? { savedTime: freshness.savedAt } : {}),
41
45
  };
42
46
  }
43
47
 
@@ -100,7 +104,8 @@ export function exportIdentityFields(freshness: ReportFreshness, identity: Expor
100
104
  * The lines an export ends with: the source line the text report ends with,
101
105
  * then the publisher, observation date (the newest; the oldest follows when
102
106
  * the data cites it), publication time and retrieval time, each `not
103
- * published` when the data does not say.
107
+ * published` when the data does not say, and when the copy was saved when a
108
+ * saved copy answered because refreshing it failed.
104
109
  */
105
110
  export function exportSourceLines(freshness: ReportFreshness): string[] {
106
111
  const source = exportSource(freshness);
@@ -112,5 +117,6 @@ export function exportSourceLines(freshness: ReportFreshness): string[] {
112
117
  ...(source.oldestObservationDate ? [`Oldest observation: ${source.oldestObservationDate}`] : []),
113
118
  `Publication time: ${stated(source.publicationTime)}`,
114
119
  `Retrieval time: ${source.retrievalTime}`,
120
+ ...(source.savedTime ? [`Saved time: ${source.savedTime}`] : []),
115
121
  ];
116
122
  }
@@ -1,9 +1,9 @@
1
- import type { FinancialStatement, Quote, TickerFinancials } from "../types/financials";
1
+ import type { Quote, TickerFinancials } from "../types/financials";
2
2
  import type { HeadlessPaneFreshness, HeadlessPaneRow } from "../types/headless";
3
3
  import { deriveHeadlessFreshness, type ReportFreshness } from "./pane-functions/freshness";
4
4
  import { fxPairObservation, fxRateObservations, type FxRateTiming } from "../plugins/builtin/shared/fx-rate-freshness";
5
5
  import { quoteObservation, REPORTED_DATA } from "../plugins/builtin/shared/report-freshness";
6
- import { latestFinancialPeriod } from "../utils/latest-financial-period";
6
+ import { latestReportedPeriod } from "../utils/latest-financial-period";
7
7
 
8
8
  /**
9
9
  * The source, as-of and status line of a plain CLI command, derived exactly as
@@ -53,12 +53,6 @@ export function fxPairFreshness(
53
53
  return observation ? rowsFreshness([observation], undefined, undefined, now) : undefined;
54
54
  }
55
55
 
56
- /** The newest reported period end in the statements, the period the trailing figures run through. */
57
- function latestReportedPeriod(financials: Pick<TickerFinancials, "annualStatements" | "quarterlyStatements">): string | null {
58
- const rows: FinancialStatement[] = [...financials.annualStatements, ...financials.quarterlyStatements];
59
- return latestFinancialPeriod(rows, (row) => row.date)?.date ?? null;
60
- }
61
-
62
56
  /**
63
57
  * Fundamentals: reported figures, not a feed. Dated by when the statistics
64
58
  * block was observed, with the newest statement period they run through
@@ -0,0 +1,130 @@
1
+ import type { CloudShortRate } from "../api-client/types";
2
+
3
+ /**
4
+ * An FX forward implied by covered interest parity: the spot carried by each
5
+ * currency's short rate over the tenor. Not a dealer's quote, and said so
6
+ * wherever it is shown.
7
+ */
8
+
9
+ /** What every forward says about itself. */
10
+ export const IMPLIED_FORWARD_LABEL = "implied by rates, not a dealer quote";
11
+
12
+ /** The longest tenor offered: past a year the short rates say little about the term rates a forward prices from. */
13
+ const MAX_FORWARD_DAYS = 366;
14
+ const DAY_MS = 86_400_000;
15
+
16
+ export interface ForwardTenor {
17
+ /** As typed, normalised: `30d`, `3m`. */
18
+ label: string;
19
+ /** Calendar days from today to the forward date. */
20
+ days: number;
21
+ }
22
+
23
+ /**
24
+ * A tenor as days (`30d`), weeks (`4w`), months (`3m`) or years (`1y`). Months
25
+ * and years count calendar days from `today` to the same day that many months
26
+ * on (the month's last day when it has no such day), as a dated forward runs.
27
+ */
28
+ export function parseForwardTenor(text: string, today: Date = new Date()): ForwardTenor | { error: string } {
29
+ const match = /^\s*(\d{1,3})\s*([dwmy])\s*$/i.exec(text);
30
+ if (!match) return { error: `"${text}" is not a tenor; write it as days, weeks, months or years, such as 30d, 2w, 3m or 1y.` };
31
+ const count = Number(match[1]);
32
+ const unit = match[2]!.toLowerCase();
33
+ if (count <= 0) return { error: "A forward tenor is at least one day." };
34
+ const start = Date.UTC(today.getUTCFullYear(), today.getUTCMonth(), today.getUTCDate());
35
+ let days: number;
36
+ if (unit === "d") days = count;
37
+ else if (unit === "w") days = count * 7;
38
+ else {
39
+ const months = unit === "m" ? count : count * 12;
40
+ const target = new Date(Date.UTC(today.getUTCFullYear(), today.getUTCMonth() + months, 1));
41
+ const lastDay = new Date(Date.UTC(target.getUTCFullYear(), target.getUTCMonth() + 1, 0)).getUTCDate();
42
+ target.setUTCDate(Math.min(today.getUTCDate(), lastDay));
43
+ days = Math.round((target.getTime() - start) / DAY_MS);
44
+ }
45
+ if (days > MAX_FORWARD_DAYS) return { error: "Forwards run to 1y: past a year, short rates say little about the term rates a forward prices from." };
46
+ return { label: `${count}${unit}`, days };
47
+ }
48
+
49
+ /** The size of one forward point: a pip, 0.01 for a pair quoted in yen and 0.0001 otherwise. */
50
+ export function forwardPointSize(quoteCurrency: string): number {
51
+ return quoteCurrency === "JPY" ? 0.01 : 0.0001;
52
+ }
53
+
54
+ export interface ImpliedForward {
55
+ spot: number;
56
+ forward: number;
57
+ /** Forward less spot, in points of `pointSize`. */
58
+ points: number;
59
+ pointSize: number;
60
+ /** The forward's premium (positive) or discount over spot across the tenor, percent. */
61
+ premiumPercent: number;
62
+ /** The same premium a year: `premiumPercent` × 360 / days. */
63
+ annualizedPercent: number;
64
+ }
65
+
66
+ /**
67
+ * Covered interest parity for BASE/QUOTE (`spot` QUOTE per BASE): money in
68
+ * either currency earns its own rate as simple interest over `days` on its
69
+ * day count, so F = S × (1 + r_quote × d / basis_quote) / (1 + r_base × d / basis_base).
70
+ * Rates are percent a year.
71
+ */
72
+ export function impliedForward(
73
+ spot: number,
74
+ days: number,
75
+ base: Pick<CloudShortRate, "dayCountBasis"> & { value: number },
76
+ quote: Pick<CloudShortRate, "dayCountBasis"> & { value: number; currency: string },
77
+ ): ImpliedForward {
78
+ const growth = (rate: { value: number; dayCountBasis: number }) => 1 + (rate.value / 100) * days / rate.dayCountBasis;
79
+ const forward = spot * growth(quote) / growth(base);
80
+ const pointSize = forwardPointSize(quote.currency);
81
+ const premiumPercent = (forward / spot - 1) * 100;
82
+ return {
83
+ spot,
84
+ forward,
85
+ points: (forward - spot) / pointSize,
86
+ pointSize,
87
+ premiumPercent,
88
+ annualizedPercent: premiumPercent * 360 / days,
89
+ };
90
+ }
91
+
92
+ /** A rate the forward can use: listed for the currency, with a value. */
93
+ export type ShortRateLookup = { rate: CloudShortRate & { value: number } } | { error: string };
94
+
95
+ /**
96
+ * The currency's short rate, or the sentence naming which rate is missing
97
+ * and why: none served for the currency, or the one served not read.
98
+ */
99
+ export function shortRateFor(currency: string, rates: readonly CloudShortRate[]): ShortRateLookup {
100
+ const rate = rates.find((candidate) => candidate.currency === currency);
101
+ if (!rate) {
102
+ const served = [...new Set(rates.map((candidate) => candidate.currency))].sort();
103
+ return { error: `No short rate for ${currency}${served.length > 0 ? `; forwards are implied for ${served.join(", ")}` : ""}.` };
104
+ }
105
+ if (rate.value == null || !Number.isFinite(rate.value)) {
106
+ return { error: `${rate.name} (${currency}) could not be read${rate.unavailableReason ? `: ${rate.unavailableReason}` : ""}.` };
107
+ }
108
+ return { rate: rate as CloudShortRate & { value: number } };
109
+ }
110
+
111
+ /** `6.776%`: a rate as its publisher prints it, to four decimals at most. */
112
+ export function formatRatePercent(value: number): string {
113
+ return `${Number(value.toFixed(4))}%`;
114
+ }
115
+
116
+ /** `+0.2416%`, signed, to four decimals. */
117
+ export function formatSignedPercent(value: number, decimals = 4): string {
118
+ const fixed = value.toFixed(decimals);
119
+ return `${value >= 0 ? "+" : ""}${fixed}%`;
120
+ }
121
+
122
+ /** Forward points to a tenth of a point, signed: `+430.6`. */
123
+ export function formatForwardPoints(points: number): string {
124
+ return `${points >= 0 ? "+" : ""}${points.toFixed(1)}`;
125
+ }
126
+
127
+ /** `TIIE 28d 6.776% (Banco de México, 2026-10-20; ACT/360)`. */
128
+ export function describeShortRate(rate: CloudShortRate & { value: number }): string {
129
+ return `${rate.name} ${formatRatePercent(rate.value)} (${rate.publisher}, ${rate.asOf ?? "undated"}; ACT/${rate.dayCountBasis})`;
130
+ }
@@ -1,9 +1,9 @@
1
1
  import { currencyMinorDigits } from "../market-data/market/format";
2
- import { parseTypedNumber, readCurrencyAmount } from "../utils/decimal-comma";
2
+ import { parseTypedNumber, readConvertedAmount } from "../utils/decimal-comma";
3
3
  import { currenciesNamed } from "../utils/currency-names";
4
4
 
5
5
  /**
6
- * What `gloomberb fx` is asked for. A bare code is one unit of it in the base
6
+ * What `gloom fx` is asked for. A bare code is one unit of it in the base
7
7
  * currency (`NGN`: USD per 1 NGN). A pair is market convention, BASE/QUOTE:
8
8
  * `USD/NGN` is how many NGN one USD buys, and `ZAR/NGN` a cross of two codes
9
9
  * with neither in USD.
@@ -74,7 +74,7 @@ export function parseFxRequest(raw: string, baseCurrency: string): FxRequest | {
74
74
  return readAs.length > 0 ? { ...request, readAs } : request;
75
75
  }
76
76
 
77
- /** What `gloomberb fx` is asked for, with the amount to convert when one comes first. */
77
+ /** What `gloom fx` is asked for, with the amount to convert when one comes first. */
78
78
  export interface FxArgs {
79
79
  request: FxRequest;
80
80
  /** The amount of `currency` to convert into `baseCurrency`; absent for a rate alone. */
@@ -97,10 +97,11 @@ function joinNameWords(args: readonly string[]): readonly string[] {
97
97
  * `fx` arguments: a currency or a pair (`EUR`, `USD/NGN`), or an amount and
98
98
  * what to convert it from and to (`1234.5 EUR/USD`, `1234,5 EUR USD`). The
99
99
  * amount is an amount of the first currency and reads as cash does
100
- * (`readCurrencyAmount`): `1.234,5` and `1,234.5` are 1234.5, and `1,234` or
101
- * `1.234` are thousands unless that currency has three decimals, where they are
102
- * refused naming both readings. An amount and one currency converts to USD
103
- * (`toUsdByDefault`). The error sentence otherwise.
100
+ * (`readConvertedAmount`): `1.234,5` and `1,234.5` are 1234.5, and `1.234` is
101
+ * 1234 unless that currency has three decimals. A comma before exactly three
102
+ * digits (`1,234`) is refused naming both readings, as `alerts add` refuses it.
103
+ * An amount and one currency converts to USD (`toUsdByDefault`). The error
104
+ * sentence otherwise.
104
105
  */
105
106
  export function parseFxArgs(words: readonly string[], baseCurrency: string): FxArgs | { error: string } {
106
107
  const args = joinNameWords(words);
@@ -129,10 +130,10 @@ export function parseFxArgs(words: readonly string[], baseCurrency: string): FxA
129
130
  const toUsdByDefault = codes.length === 1 && !codes[0]!.includes("/");
130
131
  const request = parseFxRequest(codes.join("/"), "USD");
131
132
  if ("error" in request) return request;
132
- // The amount is in the currency converted from, so its units say what 1,234 means.
133
+ // The amount is in the currency converted from, so its units say what 1.234 means; 1,234 could be either.
133
134
  let amount: number;
134
135
  try {
135
- amount = readCurrencyAmount(first, "The amount", request.currency);
136
+ amount = readConvertedAmount(first, "The amount", request.currency);
136
137
  } catch (error) {
137
138
  return { error: error instanceof Error ? error.message : String(error) };
138
139
  }
@@ -2,7 +2,7 @@ import { cliStyles, cliTerminalWidth, renderDefinitions, renderSection, wrapText
2
2
 
3
3
  /**
4
4
  * Plain-words meanings of the rates, auction, credit and bond yield, energy, perpetual-futures, portfolio,
5
- * fund, bond fund (SEC yield, tax-equivalent yield, muni/Treasury ratio), short interest, quote-board, futures (basis, contango, roll yield), VIX curve (term structure, 3M/30D, VVIX), CFTC positioning (COT trader classes, net % of open interest) and economic-calendar terms the functions
5
+ * fund, bond fund (SEC yield, tax-equivalent yield, muni/Treasury ratio), short interest, quote-board, futures (basis, contango, roll yield), VIX curve (term structure, 3M/30D, VVIX), CFTC positioning (COT trader classes, net % of open interest), depositary receipt (ADR ratio, premium, implied FX, the peso's CCL and MEP rates) and economic-calendar terms the functions
6
6
  * show in their rows, headers and footers.
7
7
  * `catalog glossary` lists them, `catalog explain <term>` prints one, and
8
8
  * `fn <function> --explain` and `portfolio show --explain` follow a report with
@@ -430,6 +430,37 @@ export const GLOSSARY: readonly GlossaryEntry[] = [
430
430
  definition: "How loosely a fund follows its index: how much the gap between the fund's return and the index's swings, usually over a year. "
431
431
  + "Fees, cash and holdings that differ from the index widen it.",
432
432
  },
433
+ // A depositary receipt beside its home listing (ADR, DES), and the peso's market dollar rates `fx USD/ARS` lists.
434
+ {
435
+ term: "ADR ratio", aliases: ["adr", "adrs", "depositary receipt", "american depositary receipt", "depositary ratio", "ads ratio"],
436
+ functions: ["ADR", "DES"], shown: ["Ratio", "ADR Ratio", "ADR ratio"],
437
+ definition: "How many ordinary shares one depositary receipt holds: 1 ADR = 10 ordinary shares means one GGAL in New York is ten GGAL.BA shares in Buenos Aires. "
438
+ + "A receipt's price compares with its home price only once the home price is multiplied by the ratio.",
439
+ },
440
+ {
441
+ term: "ADR premium", aliases: ["adr discount", "adr vs home", "receipt premium", "adr premium/discount"],
442
+ functions: ["ADR"], shown: ["ADR vs home", "premium", "discount"],
443
+ definition: "How far a receipt trades above (a premium) or below (a discount) the home shares it holds, at the spot rate: spot / implied rate - 1. "
444
+ + "Arbitrage keeps it small where money moves freely; where it cannot (Argentina's controls, Taiwan's limits on foreign buying) it runs to several percent.",
445
+ },
446
+ {
447
+ term: "Implied FX", aliases: ["implied exchange rate", "implied dollar rate", "implied fx rate", "adr implied rate"],
448
+ functions: ["ADR"], shown: ["Implied"],
449
+ definition: "The exchange rate at which a receipt and its home shares cost the same: home price × ratio / ADR price. "
450
+ + "GGAL.BA at ARS 6,260, 10 shares a receipt and GGAL at $37.91 imply 6,260 × 10 / 37.91 = 1,651 pesos a dollar.",
451
+ },
452
+ {
453
+ term: "Contado con liquidación", short: "CCL", aliases: ["contado con liquidacion", "contado con liqui", "dolar ccl", "ccl rate", "blue chip swap"],
454
+ functions: ["ADR"],
455
+ definition: "The peso's dollar rate for moving money abroad through securities: buy shares in pesos in Buenos Aires, sell them (or their ADR) for dollars abroad. "
456
+ + "Read from an ADR pair (home × ratio / ADR) or a BYMA C line (peso price / C-line dollar price); it runs above the official wholesale rate.",
457
+ },
458
+ {
459
+ term: "Mercado electrónico de pagos", short: "MEP", aliases: ["mercado electronico de pagos", "dolar mep", "dolar bolsa", "mep rate"],
460
+ functions: ["ADR"],
461
+ definition: "The peso's dollar rate inside Argentina through securities: buy shares in pesos and sell their BYMA D line for dollars paid in Argentina. "
462
+ + "Read as the peso price over the D line's dollar price; it sits near the CCL rate, usually a little under it.",
463
+ },
433
464
  // Bond spreads and yields (CRD, the data catalog's ICE BofA yields, TRACE), a fund's SEC yield, which DVD's cash yield is not,
434
465
  // and the bond fund figures and tax-equivalent maths DVD and fundamentals give with --tax-rate.
435
466
  {
@@ -474,7 +505,7 @@ export const GLOSSARY: readonly GlossaryEntry[] = [
474
505
  functions: ["DVD"], shown: ["Tax-equivalent yield", "Tax-Equivalent Yield"],
475
506
  definition: "The yield a taxable bond needs to match a tax-exempt muni fund after tax: yield / (1 - (federal rate + state rate)), on the SEC yield, "
476
507
  + "else the distribution yield. At 40.8% (37% plus the 3.8% net investment income tax), MUB's 4.04% is 6.83%. A state rate counts only for a "
477
- + "single-state fund of that state (CMF, VTEC for California). gloomberb fn DVD and fundamentals take --tax-rate, --state-rate and --state.",
508
+ + "single-state fund of that state (CMF, VTEC for California). gloom fn DVD and fundamentals take --tax-rate, --state-rate and --state.",
478
509
  },
479
510
  {
480
511
  term: "Muni/Treasury ratio", aliases: ["muni treasury ratio", "muni-to-treasury ratio", "muni/ust ratio", "muni ratio", "municipal treasury ratio"],
@@ -561,8 +592,9 @@ export const GLOSSARY: readonly GlossaryEntry[] = [
561
592
  term: "Float", aliases: ["free float", "public float", "float shares", "floating stock", "% float", "percent of float"],
562
593
  functions: ["SI", "SIW"], shown: ["Float"],
563
594
  definition: "The shares open to public trading: those outstanding less shares held by insiders and strategic holders, never more than the shares outstanding. "
564
- + "% Float is shares short over today's float, so a settlement is measured against the float as it is now, not as it was then; "
565
- + "SI gives it for the latest settlement only.",
595
+ + "The float is the source's own, held within the 10-K or 10-Q cover count and undated; a float held at that count is the count, dated by it. "
596
+ + "SIW's % Float is the latest settlement's shares short over today's float; SI reads each earlier settlement over the float when FINRA published it: "
597
+ + "the cover count known that day, at the share of today's count that floats.",
566
598
  },
567
599
  {
568
600
  // SIW's Setup column prints these two words.
@@ -622,7 +654,7 @@ export const GLOSSARY: readonly GlossaryEntry[] = [
622
654
  {
623
655
  term: "Futures contract", aliases: ["futures", "future", "futures contracts", "contract", "contract month", "expiry", "expiration"],
624
656
  functions: ["FUT", "CTM"], shown: ["CONTRACT", "Contract"],
625
- definition: "An agreement to buy or sell something, such as oil, gold or the S&P 500, at a set price on a set date. Each contract has a month (Dec 26) and expires, "
657
+ definition: "An agreement to buy or sell something, such as oil, gold or the S&P 500, at a set price on a set date. Each contract has a month (Dec 2026) and expires, "
626
658
  + "and most traders close out before then. A contract's own Settlement line says how it ends: in cash or by physical delivery.",
627
659
  },
628
660
  {
@@ -694,8 +726,16 @@ export const GLOSSARY: readonly GlossaryEntry[] = [
694
726
  {
695
727
  term: "Annualised basis", aliases: ["annualized basis", "ann basis", "ann. basis", "basis annualised"], functions: ["CTM", "PERP"], shown: ["Ann Basis", "ANN BASIS"],
696
728
  definition: "The basis restated as a yearly rate, so contracts of different length compare with each other and with a perpetual's funding APR: "
697
- + "(Last / spot - 1) × 365 / days to expiry, simple rather than compounded, on the latest trade against the spot quote. "
698
- + "Inside 30 days a few basis points of spot noise move it by whole points: 10 bp is about ±2 points at 18 days to expiry.",
729
+ + "(Last / spot - 1) × 365 / days to expiry, simple rather than compounded. CTM reads each last trade against spot in the same minute "
730
+ + "and counts days to final settlement to the hour. Inside a week a few basis points of spot noise move it by whole points "
731
+ + "(10 bp is about ±5 points at 7 days), so CTM greys it there and Vs Spot is the figure to read.",
732
+ },
733
+ {
734
+ term: "Crypto composite price", aliases: ["CCC", "crypto composite", "composite price", "composite crypto price"], functions: ["CTM"],
735
+ shown: ["crypto composite price"],
736
+ definition: "A coin's dollar price blended from trading on several crypto exchanges rather than taken from one, quoted around the clock; "
737
+ + "quotes list it under the code CCC. CTM reads CME crypto futures against it, while the futures settle to CME's own reference rate, "
738
+ + "so a small gap at expiry is expected.",
699
739
  },
700
740
  {
701
741
  term: "Contango", aliases: ["contango curve", "upward curve"], functions: ["CTM", "FUT"], shown: ["contango", "Contango"],
@@ -776,8 +816,8 @@ export interface GlossaryLookup {
776
816
  /** The entries the query names: by the term, its abbreviation or an alias. */
777
817
  exact: GlossaryEntry[];
778
818
  /**
779
- * The others whose names start a word with each word of the query: `stop-out` finds stop-out vs average.
780
- * Those that hold the words whole come first.
819
+ * The others whose names hold each word of the query: `stop-out` finds stop-out vs average. Beside a term the
820
+ * query names they hold the words whole; otherwise a word start is enough, and the whole ones come first.
781
821
  */
782
822
  partial: GlossaryEntry[];
783
823
  }
@@ -785,22 +825,26 @@ export interface GlossaryLookup {
785
825
  // Shorter words (the `b` and `c` of `B/C`) would find half the glossary.
786
826
  const MIN_PARTIAL_WORD = 3;
787
827
 
828
+ /** A name's word holds a query word whole, or as its plural: `assets` holds `asset`, `floating` does not hold `float`. */
829
+ const wholeWord = (have: string, word: string) => have === word || have === `${word}s` || have === `${word}es`;
830
+
788
831
  export function lookupGlossary(query: string): GlossaryLookup {
789
832
  const key = lookupKey(query);
790
833
  if (!key) return { exact: [], partial: [] };
791
834
  const exact = GLOSSARY.filter((entry) => names(entry).some((name) => lookupKey(name) === key));
792
835
  const wanted = words(query).filter((word) => word.length >= MIN_PARTIAL_WORD);
793
- const partial = wanted.length === 0 ? [] : GLOSSARY.filter((entry) => {
794
- if (exact.includes(entry)) return false;
836
+ if (wanted.length === 0) return { exact, partial: [] };
837
+ const others = GLOSSARY.filter((entry) => !exact.includes(entry));
838
+ const holding = (match: (have: string, word: string) => boolean) => others.filter((entry) => {
795
839
  const have = names(entry).flatMap(words);
796
- return wanted.every((word) => have.some((name) => name.startsWith(word)));
840
+ return wanted.every((word) => have.some((name) => match(name, word)));
797
841
  });
798
- // The entries that hold the words whole come before those that only start with them: `float` is the float, not the floating rate note.
799
- const whole = (entry: GlossaryEntry) => {
800
- const have = names(entry).flatMap(words);
801
- return wanted.every((word) => have.includes(word));
802
- };
803
- return { exact, partial: partial.sort((left, right) => Number(whole(right)) - Number(whole(left))) };
842
+ // Related to a term the query names are only the terms that hold its words whole: `float` is the float of a
843
+ // stock, and the floating rate note only starts with the same letters. A query that names no term is a search,
844
+ // where a word start (`vol` for volume) still finds a term, after those that hold it whole.
845
+ const whole = holding(wholeWord);
846
+ if (exact.length > 0) return { exact, partial: whole };
847
+ return { exact, partial: [...whole, ...holding((name, word) => name.startsWith(word)).filter((entry) => !whole.includes(entry))] };
804
848
  }
805
849
 
806
850
  function escapeRegExp(text: string): string {
@@ -839,7 +883,7 @@ export function renderGlossaryEntries(entries: readonly GlossaryEntry[]): string
839
883
  /** What `--explain` adds under a report: the terms it shows, or a note that it shows none. */
840
884
  export function renderReportGlossary(token: string, entries: readonly GlossaryEntry[]): string {
841
885
  if (entries.length === 0) {
842
- return wrapText(`${token} shows no glossary terms. gloomberb catalog glossary lists every term.`, textWidth())
886
+ return wrapText(`${token} shows no glossary terms. gloom catalog glossary lists every term.`, textWidth())
843
887
  .map((line) => cliStyles.muted(line)).join("\n");
844
888
  }
845
889
  return [renderSection("Terms"), ...renderGlossaryEntries(entries)].join("\n");
@@ -876,7 +920,7 @@ export function renderGlossaryIndex(): string {
876
920
  index === 0 ? ` ${cliStyles.command(owner)}${" ".repeat(labelWidth - 2 - owner.length)}${line}` : `${" ".repeat(labelWidth)}${line}`
877
921
  ))),
878
922
  "",
879
- ...wrapText("gloomberb catalog glossary <term> explains one; fn <function> --explain and portfolio show --explain add the terms a report shows.", width)
923
+ ...wrapText("gloom catalog glossary <term> explains one; fn <function> --explain and portfolio show --explain add the terms a report shows.", width)
880
924
  .map((line) => cliStyles.muted(line)),
881
925
  ].join("\n");
882
926
  }