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
@@ -3,7 +3,9 @@ import type { DataProvider } from "../types/data-provider";
3
3
  import { findListingOfCompanyName, isCompanyNameInput, readTerminalCodeArg } from "../tickers/company-name-listing";
4
4
  import { isNotATickerMessage } from "./not-a-ticker";
5
5
  import { splitSymbolWords } from "./symbol-args";
6
- import { isProviderBusy } from "../sources/provider-errors";
6
+ import { isNumberCell } from "./symbol-cells";
7
+ import { isProviderBusy, type ProviderBusyError } from "../sources/provider-errors";
8
+ import { unknownBloombergMarket } from "../tickers/terminal-codes";
7
9
 
8
10
  /**
9
11
  * The entries of a list (`splitSymbolArgs`, or a file's lines) as the symbols
@@ -15,20 +17,25 @@ import { isProviderBusy } from "../sources/provider-errors";
15
17
  * pasted line), and otherwise stays whole, a name nothing lists: its words
16
18
  * are not taken for other companies' symbols (INTL, a fund, from a misspelt
17
19
  * `phillip morris intl`). Only those entries cost a search. One search was
18
- * too busy to look up also stays whole, so its lookup says so instead of
19
- * resolving its words as symbols of other companies.
20
+ * too busy to look up is its words only when each has a quote (`GME AMC`),
21
+ * as `readPhraseArgument` reads a quoted line, and otherwise stays whole, so
22
+ * its lookup says so instead of resolving its words as symbols of other
23
+ * companies.
20
24
  */
21
25
  export async function readNameEntries(
22
26
  entries: readonly string[],
23
27
  dataProvider: Pick<DataProvider, "search"> & Partial<Pick<DataProvider, "getQuotesBatch" | "getQuote">>,
24
28
  ): Promise<string[]> {
25
29
  const read = await Promise.all(entries.map(async (entry) => {
26
- // A terminal's code for a listing ("JPM US Equity") is one entry, like a company's name.
27
- if (await readTerminalCodeArg(dataProvider, entry)) return [entry];
30
+ // A terminal's code for a listing ("JPM US Equity", "VOD LN") is one entry, like a company's name, and so is a
31
+ // line written as one whose market code is unknown ("AAPL GP"): its lookup refuses it, never AAPL and GP.
32
+ if (unknownBloombergMarket(entry) || await readTerminalCodeArg(dataProvider, entry)) return [entry];
28
33
  if (!isCompanyNameInput(entry)) return splitSymbolWords([entry]);
29
- if (await findListingOfCompanyName(dataProvider, entry).catch(busyAsFound)) return [entry];
34
+ const named = await findListingOfCompanyName(dataProvider, entry).catch(busyAsAnswer);
35
+ const busy = isProviderBusy(named);
36
+ if (named && !busy) return [entry];
30
37
  const words = splitSymbolWords([entry]);
31
- return await wordsAreSymbols(words, dataProvider) ? words : [entry];
38
+ return await wordsAreSymbols(words, dataProvider, { quoteEvery: busy }) ? words : [entry];
32
39
  }));
33
40
  return read.flat();
34
41
  }
@@ -41,14 +48,17 @@ function writtenAsSymbol(word: string): boolean {
41
48
  /**
42
49
  * Whether the words of an entry search found no company for are symbols:
43
50
  * each written as one (2222, BRK.B) or else with a quote, the others asked in
44
- * one batch (`2222 amd pltr`). A batch that fails says nothing, and the
45
- * entry stays a name.
51
+ * one batch (`2222 amd pltr`). With `quoteEvery`, for an entry search was too
52
+ * busy to look up, each but a listing (SAN:EPA) needs a quote, as words in
53
+ * capitals can be a name too (BANK OF AMERICA). A batch that fails says
54
+ * nothing, and the entry stays a name.
46
55
  */
47
56
  async function wordsAreSymbols(
48
57
  words: readonly string[],
49
58
  dataProvider: Partial<Pick<DataProvider, "getQuotesBatch" | "getQuote">>,
59
+ { quoteEvery = false }: { quoteEvery?: boolean } = {},
50
60
  ): Promise<boolean> {
51
- const symbols = words.filter((word) => !writtenAsSymbol(word)).map((word) => word.replace(/^\$/, "").toUpperCase());
61
+ const symbols = words.filter((word) => quoteEvery ? !word.includes(":") : !writtenAsSymbol(word)).map((word) => word.replace(/^\$/, "").toUpperCase());
52
62
  if (symbols.length === 0) return true;
53
63
  if (dataProvider.getQuotesBatch) {
54
64
  const results = await dataProvider.getQuotesBatch(symbols.map((symbol) => ({ symbol, exchange: "" })))
@@ -65,9 +75,9 @@ async function wordsAreSymbols(
65
75
  return quoted.every(Boolean);
66
76
  }
67
77
 
68
- /** `findListingOfCompanyName`'s busy answer as a name to keep whole, any other failure as it is. */
69
- function busyAsFound(error: unknown): true {
70
- if (isProviderBusy(error)) return true;
78
+ /** `findListingOfCompanyName`'s busy answer, returned for the words to be read without it; any other failure as it is. */
79
+ function busyAsAnswer(error: unknown): ProviderBusyError {
80
+ if (isProviderBusy(error)) return error;
71
81
  throw error;
72
82
  }
73
83
 
@@ -83,7 +93,8 @@ export type PhraseReading =
83
93
  * word is one the source says is not a ticker (`"AAPL MSFT"`), else a phrase
84
94
  * (`"10 year yield"`), which is never split into symbols such as YEAR and
85
95
  * YIELD. The words are asked in one batch beside the name search, not a
86
- * request each; a word written as a listing (`SAN:EPA`) is taken as one.
96
+ * request each; a word written as a listing (`SAN:EPA`) is taken as one, and
97
+ * a number (`10.5`, `5.25%`) is never asked: it makes the line a phrase.
87
98
  * When search is too busy to say whether it names a company, a line whose
88
99
  * every word has a quote is still symbols; anything else throws
89
100
  * `ProviderBusyError`, as its words may be other companies' symbols.
@@ -92,9 +103,10 @@ export async function readPhraseArgument(
92
103
  phrase: string,
93
104
  dataProvider: Pick<DataProvider, "search" | "getQuotesBatch">,
94
105
  ): Promise<PhraseReading> {
95
- if (await readTerminalCodeArg(dataProvider, phrase)) return { kind: "symbols", symbols: [phrase] };
106
+ if (unknownBloombergMarket(phrase) || await readTerminalCodeArg(dataProvider, phrase)) return { kind: "symbols", symbols: [phrase] };
96
107
  const words = splitSymbolWords([phrase]);
97
- const asked = words.filter((word) => !word.includes(":")).map((word) => word.replace(/^\$/, "").toUpperCase());
108
+ const numbered = words.some(isNumberCell);
109
+ const asked = words.filter((word) => !word.includes(":") && !isNumberCell(word)).map((word) => word.replace(/^\$/, "").toUpperCase());
98
110
  const [named, results] = await Promise.all([
99
111
  findListingOfCompanyName(dataProvider, phrase).catch((error: unknown) => {
100
112
  if (isProviderBusy(error)) return error;
@@ -105,11 +117,11 @@ export async function readPhraseArgument(
105
117
  : [],
106
118
  ]);
107
119
  if (isProviderBusy(named)) {
108
- if (results.length === asked.length && results.every(({ quote }) => !!quote)) return { kind: "symbols", symbols: words };
120
+ if (!numbered && results.length === asked.length && results.every(({ quote }) => !!quote)) return { kind: "symbols", symbols: words };
109
121
  throw named;
110
122
  }
111
123
  if (named) return { kind: "name", name: phrase };
112
124
  // A word the source could not answer for (an outage) is given the benefit of the doubt, as the line was before.
113
- const notTicker = results.some(({ quote, error }) => !quote && isNotATickerMessage(error instanceof Error ? error.message : String(error ?? "")));
125
+ const notTicker = numbered || results.some(({ quote, error }) => !quote && isNotATickerMessage(error instanceof Error ? error.message : String(error ?? "")));
114
126
  return notTicker ? { kind: "phrase", phrase } : { kind: "symbols", symbols: words };
115
127
  }
@@ -7,6 +7,8 @@ export async function smokeOpenTuiNative(): Promise<void> {
7
7
  }
8
8
 
9
9
  export async function smokeOpenTuiRuntime(): Promise<void> {
10
+ const { loadRenderLib } = await import("../renderers/opentui/render-lib");
11
+ await loadRenderLib();
10
12
  await import("../renderers/opentui/start");
11
13
  const { assertRendersLeaveNoTimingEntries } = await import("../renderers/opentui/render-timing-smoke");
12
14
  await assertRendersLeaveNoTimingEntries();
@@ -5,7 +5,7 @@ import { treasuryYieldHint, treasuryYieldTenor } from "./treasury-yields";
5
5
 
6
6
  // "Not a ticker: APPLE." as the router words it; the symbol ends at the sentence's own period.
7
7
  // One that already names what to try (a search, a FRED series, a yield, the pair search offered) is left alone.
8
- const NOT_A_TICKER_SENTENCE = /Not a ticker: ((?:(?!\.\s)[^\n`\x1b])+?)\.(?=\s|\x1b|$)(?! Try `gloomberb (?:search|fred|quote) | Did you mean )/g;
8
+ const NOT_A_TICKER_SENTENCE = /Not a ticker: ((?:(?!\.\s)[^\n`\x1b])+?)\.(?=\s|\x1b|$)(?! Try `gloom (?:search|fred|quote) | Did you mean )/g;
9
9
 
10
10
  /**
11
11
  * The symbol as the user typed it on the command line (`Apple`), not as the router saw it (`APPLE`).
@@ -25,13 +25,13 @@ function typedSymbol(symbol: string, args: readonly string[]): string {
25
25
  return symbol;
26
26
  }
27
27
 
28
- /** "Try `gloomberb search Apple`." naming what the user typed; a venue (`Apple:NYSE`) is not part of a search. */
28
+ /** "Try `gloom search Apple`." naming what the user typed; a venue (`Apple:NYSE`) is not part of a search. */
29
29
  function searchHint(typed: string): string {
30
30
  const query = typed.split(":")[0]!.trim() || typed;
31
- return `Try \`gloomberb search ${/\s/.test(query) ? JSON.stringify(query) : query}\`.`;
31
+ return `Try \`gloom search ${/\s/.test(query) ? JSON.stringify(query) : query}\`.`;
32
32
  }
33
33
 
34
- /** Whether an id is a FRED series the catalog charts (DFEDTARU), which `gloomberb fred` prints. */
34
+ /** Whether an id is a FRED series the catalog charts (DFEDTARU), which `gloom fred` prints. */
35
35
  export type FredSeriesCheck = (seriesId: string) => boolean;
36
36
 
37
37
  /**
@@ -40,20 +40,30 @@ export type FredSeriesCheck = (seriesId: string) => boolean;
40
40
  * series id (DFEDTARU) is no ticker search finds, so its hint is the `fred` command instead, a
41
41
  * coin on the crypto board typed bare (USDT, TETHER) names its one symbol, USDT-USD, once
42
42
  * `primeBoardCoins` has read the board, and a Treasury yield typed as a ticker (US10Y) names the
43
- * commands that have it.
43
+ * commands that have it. A one-word company name a line says was read as a listing ("Read
44
+ * "APPLE" as AAPL:NASDAQ") is put back in the user's spelling too.
44
45
  */
45
46
  export function withSearchHints(text: string, args: readonly string[], isFredSeries: FredSeriesCheck = () => false): string {
46
- return text.includes("Not a ticker: ")
47
- ? text.replace(NOT_A_TICKER_SENTENCE, (sentence, symbol: string) => {
47
+ const named = withTypedNames(text, args);
48
+ return named.includes("Not a ticker: ")
49
+ ? named.replace(NOT_A_TICKER_SENTENCE, (sentence, symbol: string) => {
48
50
  const typed = typedSymbol(symbol, args);
49
51
  const id = typed.toUpperCase();
50
- if (/^[A-Z0-9]+$/.test(id) && isFredSeries(id)) return `${sentence} Try \`gloomberb fred ${id}\`.`;
52
+ if (/^[A-Z0-9]+$/.test(id) && isFredSeries(id)) return `${sentence} Try \`gloom fred ${id}\`.`;
51
53
  const coin = boardCoinFor(id);
52
54
  if (coin) return `${sentence} Did you mean ${coin.symbol}${coin.name && coin.name.toUpperCase() !== coin.symbol ? ` (${coin.name})` : ""}?`;
53
55
  const tenor = treasuryYieldTenor(typed);
54
56
  return `${sentence} ${tenor ? treasuryYieldHint(tenor) : searchHint(typed)}`;
55
57
  })
56
- : text;
58
+ : named;
59
+ }
60
+
61
+ // "Read "APPLE" as AAPL:NASDAQ (Apple Inc.)." as a list reads a one-word name, upper-cased like a symbol.
62
+ const READ_AS_NAME = /Read "([^"\n]+)" as /g;
63
+
64
+ /** A company's name the line says was read as a listing, in the user's own spelling from `args` (`Apple`). */
65
+ function withTypedNames(text: string, args: readonly string[]): string {
66
+ return text.includes("Read \"") ? text.replace(READ_AS_NAME, (_line, name: string) => `Read "${typedSymbol(name, args)}" as `) : text;
57
67
  }
58
68
 
59
69
  /**
@@ -0,0 +1,5 @@
1
+ import { detectLinuxLibc, selectOpenTuiLibc } from "../utils/linux-libc";
2
+
3
+ // Imported before anything else by every entry: @opentui/core picks its
4
+ // native library the moment it loads.
5
+ selectOpenTuiLibc(process.env, detectLinuxLibc());
@@ -4,6 +4,13 @@ export interface CliGlobalOptions {
4
4
  format: CliOutputFormat;
5
5
  quiet: boolean;
6
6
  color: boolean | null;
7
+ /**
8
+ * `--plain`: tables without rules, arrows in words, every column kept with
9
+ * "—" for an empty cell (`setCliPlainOverride`); `--no-plain` turns it
10
+ * off. Null leaves it to the environment: on with NO_COLOR set to a value,
11
+ * or when stdout is not a terminal (`plainByDefault`).
12
+ */
13
+ plain: boolean | null;
7
14
  limit?: number;
8
15
  /** `--tail <n>`: the newest n rows of a dated series, in their printed order. Never set with `limit`. */
9
16
  tail?: number;
@@ -31,6 +38,7 @@ export const DEFAULT_CLI_OPTIONS: CliGlobalOptions = {
31
38
  format: "text",
32
39
  quiet: false,
33
40
  color: null,
41
+ plain: null,
34
42
  refresh: false,
35
43
  dryRun: false,
36
44
  yes: false,
@@ -110,6 +118,10 @@ export function parseCliGlobalArgs(rawArgs: string[]): ParsedCliArgs {
110
118
  options.color = true;
111
119
  continue;
112
120
  }
121
+ if (arg === "--plain" || arg === "--no-plain") {
122
+ options.plain = arg === "--plain";
123
+ continue;
124
+ }
113
125
  if (arg === "--refresh") {
114
126
  options.refresh = true;
115
127
  continue;
@@ -27,6 +27,8 @@ export interface PaneFunctionCapability {
27
27
  dataRequirements: string[];
28
28
  limitations: string[];
29
29
  options: PaneFunctionOptionDef[];
30
+ /** A rendered view that refuses any option it does not declare (PaneDef.reportOptionsOnly), as a headless report does. */
31
+ strictOptions?: boolean;
30
32
  }
31
33
 
32
34
  const NON_DATA_PANE_IDS = new Set([
@@ -68,6 +70,7 @@ function fallbackCapability(
68
70
  ? RENDERED_VIEW_LIMITATION
69
71
  : "This pane is an interactive surface and does not expose a data report."],
70
72
  options: [...(pane.reportOptions ?? [])],
73
+ ...pane.reportOptionsOnly ? { strictOptions: true } : {},
71
74
  };
72
75
  }
73
76
 
@@ -79,6 +82,14 @@ function optionToken(value: string): string {
79
82
  return value.trim().toLowerCase().replace(/[\s_.-]+/g, "");
80
83
  }
81
84
 
85
+ /**
86
+ * An option as an error names it, the way it is typed on the command line:
87
+ * `--as-of` for the `asOf` the parser reads `--as-of` (or `--asOf`) into.
88
+ */
89
+ export function optionFlag(key: string): string {
90
+ return `--${key.replace(/([a-z0-9])([A-Z])/g, "$1-$2").toLowerCase()}`;
91
+ }
92
+
82
93
  // Choices longer than this move from the flag into its description, where they can wrap.
83
94
  export const MAX_INLINE_CHOICES = 24;
84
95
 
@@ -90,7 +101,7 @@ export function optionChoices(option: PaneFunctionOptionDef): string[] {
90
101
  export function optionFlags(option: PaneFunctionOptionDef): string {
91
102
  const choices = optionChoices(option).join("|");
92
103
  const value = choices && choices.length <= MAX_INLINE_CHOICES ? choices : option.values?.length ? "value" : option.placeholder ?? option.type;
93
- return `--${option.key} <${value}>`;
104
+ return `${optionFlag(option.key)} <${value}>`;
94
105
  }
95
106
 
96
107
  /** The option values a typed word is, by value or alias: `gas` is JODI's `--commodity gas`. */
@@ -99,18 +110,29 @@ function optionValueOf(options: readonly PaneFunctionOptionDef[], typed: string)
99
110
  for (const option of options) {
100
111
  const value = option.values?.find((candidate) => optionToken(candidate.value) === token
101
112
  || candidate.aliases?.some((alias) => optionToken(alias) === token));
102
- if (value) return `--${option.key} ${value.value}`;
113
+ if (value) return `${optionFlag(option.key)} ${value.value}`;
103
114
  }
104
115
  return null;
105
116
  }
106
117
 
118
+ /** Options that name an underlying listing, which a ticker typed after the function is meant for. */
119
+ const LISTING_OPTION_KEYS = new Set(["symbol", "ticker", "underlying"]);
120
+
121
+ /** `--symbol NEM` for a word that reads as a ticker (NEM, BHP:ASX, 7203.T), when the function takes one as an option. */
122
+ function listingOptionOf(options: readonly PaneFunctionOptionDef[], typed: string): string | null {
123
+ const word = typed.trim();
124
+ if (!/^[A-Za-z0-9^][A-Za-z0-9.:=^&-]{0,23}$/.test(word) || !/[A-Za-z]/.test(word)) return null;
125
+ const option = options.find(({ key, type }) => type === "string" && LISTING_OPTION_KEYS.has(optionToken(key)));
126
+ return option ? `${optionFlag(option.key)} ${word}` : null;
127
+ }
128
+
107
129
  /** An option in use, as typed after the function: its own example, else a choice that is not the default. */
108
130
  function optionExample(option: PaneFunctionOptionDef): string {
109
131
  if (option.example) return option.example;
110
- if (option.type === "boolean") return `--${option.key}`;
132
+ if (option.type === "boolean") return optionFlag(option.key);
111
133
  const choice = option.values?.find(({ value }) => value !== option.defaultValue);
112
- if (choice) return `--${option.key} ${choice.value}`;
113
- return `--${option.key} <${option.placeholder ?? option.type}>`;
134
+ if (choice) return `${optionFlag(option.key)} ${choice.value}`;
135
+ return `${optionFlag(option.key)} <${option.placeholder ?? option.type}>`;
114
136
  }
115
137
 
116
138
  /** Options a no-argument error lists before it points at the catalog for the rest. */
@@ -119,7 +141,8 @@ const LISTED_OPTIONS = 6;
119
141
  /**
120
142
  * What a function that takes no argument answers one with: its options and a
121
143
  * command to run. A word that is one of an option's values runs as that option
122
- * (`fn JODI gas` is `fn JODI --commodity gas`); anything else gets an option's example.
144
+ * (`fn JODI gas` is `fn JODI --commodity gas`), and a ticker runs as the option that takes one
145
+ * (`fn OVME NEM` is `fn OVME --symbol NEM`); anything else gets an option's example.
123
146
  */
124
147
  export function noArgumentMessage(
125
148
  options: readonly PaneFunctionOptionDef[],
@@ -128,11 +151,11 @@ export function noArgumentMessage(
128
151
  command: "fn" | "shot" = "fn",
129
152
  ): string {
130
153
  const head = `${code} does not accept an argument.`;
131
- if (options.length === 0) return `${head} Run: gloomberb ${command} ${code}`;
132
- const asOption = optionValueOf(options, typed);
154
+ if (options.length === 0) return `${head} Run: gloom ${command} ${code}`;
155
+ const asOption = optionValueOf(options, typed) ?? listingOptionOf(options, typed);
133
156
  const listed = options.slice(0, LISTED_OPTIONS).map(optionFlags).join(", ");
134
- const more = options.length > LISTED_OPTIONS ? ` and ${options.length - LISTED_OPTIONS} more (gloomberb catalog ${code})` : "";
135
- const run = asOption ? `Run: gloomberb ${command} ${code} ${asOption}` : `Example: gloomberb ${command} ${code} ${optionExample(options[0]!)}`;
157
+ const more = options.length > LISTED_OPTIONS ? ` and ${options.length - LISTED_OPTIONS} more (gloom catalog ${code})` : "";
158
+ const run = asOption ? `Run: gloom ${command} ${code} ${asOption}` : `Example: gloom ${command} ${code} ${optionExample(options[0]!)}`;
136
159
  return `${head} Options: ${listed}${more}. ${run}`;
137
160
  }
138
161
 
@@ -162,6 +185,30 @@ export function getHeadlessPaneDefinition(
162
185
  return template?.headless ?? pane.headless;
163
186
  }
164
187
 
188
+ /** What a function takes after its code: its kind and the name the catalog gives it. */
189
+ export interface PaneFunctionArgument {
190
+ kind?: string;
191
+ placeholder?: string;
192
+ }
193
+
194
+ /**
195
+ * The argument a function takes, as the catalog writes it and `fn` checks it:
196
+ * the `headless` model's, else the template shortcut's, else the one a
197
+ * rendered view declares (`reportArgument`).
198
+ */
199
+ export function paneFunctionArgument(template: PaneTemplateDef | undefined, pane: PaneDef): PaneFunctionArgument {
200
+ const headless = getHeadlessPaneDefinition(template, pane);
201
+ return {
202
+ kind: headless?.argument.kind ?? template?.shortcut?.argKind ?? pane.reportArgument?.kind,
203
+ placeholder: headless?.argument.placeholder ?? template?.shortcut?.argPlaceholder ?? pane.reportArgument?.placeholder,
204
+ };
205
+ }
206
+
207
+ /** A function the catalog lists with no argument, which refuses one as CBR does. */
208
+ export function takesNoArgument({ kind, placeholder }: PaneFunctionArgument): boolean {
209
+ return !placeholder && (!kind || kind === "none");
210
+ }
211
+
165
212
  export function getPaneFunctionCapability(
166
213
  template: PaneTemplateDef | undefined,
167
214
  pane: PaneDef,
@@ -209,7 +256,7 @@ function normalizeEnumValue(option: PaneFunctionOptionDef, rawValue: string, arg
209
256
  if (match) return match.value;
210
257
  const hint = option.invalidValueHint?.(rawValue, argument);
211
258
  throw new Error(
212
- `Invalid --${option.key} value "${rawValue}".${hint ? ` ${hint}` : ""} Use one of: ${option.values?.map(({ value }) => value).join(", ") ?? ""}.`,
259
+ `Invalid ${optionFlag(option.key)} value "${rawValue}".${hint ? ` ${hint}` : ""} Use one of: ${option.values?.map(({ value }) => value).join(", ") ?? ""}.`,
213
260
  );
214
261
  }
215
262
 
@@ -222,19 +269,19 @@ function normalizeOptionValue(
222
269
  if (rawValue === true) return true;
223
270
  if (/^true$/i.test(rawValue)) return true;
224
271
  if (/^false$/i.test(rawValue)) return false;
225
- throw new Error(`Invalid --${option.key} value "${rawValue}". Use true or false.`);
272
+ throw new Error(`Invalid ${optionFlag(option.key)} value "${rawValue}". Use true or false.`);
226
273
  }
227
- if (rawValue === true) throw new Error(`--${option.key} requires a value.`);
274
+ if (rawValue === true) throw new Error(`${optionFlag(option.key)} requires a value.`);
228
275
  if (option.normalize) return option.normalize(rawValue);
229
276
  if (option.type === "enum") return normalizeEnumValue(option, rawValue, argument);
230
277
  if (option.type === "integer") {
231
278
  const value = Number(rawValue);
232
- if (!Number.isInteger(value)) throw new Error(`--${option.key} must be an integer.`);
279
+ if (!Number.isInteger(value)) throw new Error(`${optionFlag(option.key)} must be an integer.`);
233
280
  if (option.minimum != null && value < option.minimum) {
234
- throw new Error(`--${option.key} must be at least ${option.minimum}.`);
281
+ throw new Error(`${optionFlag(option.key)} must be at least ${option.minimum}.`);
235
282
  }
236
283
  if (option.maximum != null && value > option.maximum) {
237
- throw new Error(`--${option.key} must be at most ${option.maximum}.`);
284
+ throw new Error(`${optionFlag(option.key)} must be at most ${option.maximum}.`);
238
285
  }
239
286
  return value;
240
287
  }
@@ -250,7 +297,7 @@ export function normalizeCapabilityOptions(
250
297
  */
251
298
  settings: { strict?: boolean; code?: string; argument?: string | null } = {},
252
299
  ): NormalizedPaneFunctionOptions {
253
- if (!capability.botSafe) {
300
+ if (!capability.botSafe && !capability.strictOptions) {
254
301
  // A rendered view takes any pane setting; the options it declares are checked.
255
302
  return Object.fromEntries(Object.entries(options).map(([key, value]) => {
256
303
  const option = findCapabilityOption(capability, key);
@@ -262,20 +309,27 @@ export function normalizeCapabilityOptions(
262
309
  for (const option of capability.options) {
263
310
  if (option.defaultValue !== undefined) normalized[option.key] = option.defaultValue;
264
311
  }
312
+ // Each option typed, by its key, as the user wrote it (`--window` for RETURN's --range).
313
+ const typed = new Map<string, string>();
265
314
  for (const [rawKey, rawValue] of Object.entries(options)) {
266
315
  const option = findCapabilityOption(capability, rawKey);
316
+ if (option) typed.set(option.key, rawKey);
267
317
  if (!option) {
268
318
  if (settings.strict === false) {
269
319
  normalized[rawKey] = rawValue;
270
320
  continue;
271
321
  }
272
- const supported = capability.options.map(({ key }) => `--${key}`).join(", ");
322
+ const supported = capability.options.map(({ key }) => optionFlag(key)).join(", ");
273
323
  throw new Error(
274
- `${settings.code ?? capability.id} does not support --${rawKey}.${supported ? ` Supported options: ${supported}.` : " It has no options."}`,
324
+ `${settings.code ?? capability.id} does not support ${optionFlag(rawKey)}.${supported ? ` Supported options: ${supported}.` : " It has no options."}`,
275
325
  );
276
326
  }
277
327
  normalized[option.key] = normalizeOptionValue(option, rawValue, settings.argument);
278
328
  }
329
+ for (const [key, rawKey] of typed) {
330
+ const replaced = findCapabilityOption(capability, key)?.replaces?.find((other) => typed.has(other));
331
+ if (replaced) throw new Error(`${optionFlag(rawKey)} replaces ${optionFlag(typed.get(replaced)!)}; give one of them.`);
332
+ }
279
333
  return normalized;
280
334
  }
281
335
 
@@ -285,7 +339,8 @@ export function capabilityPaneSettings(
285
339
  ): Record<string, unknown> {
286
340
  const settings: Record<string, unknown> = {};
287
341
  for (const option of capability.options) {
288
- if (option.pluginState) continue;
342
+ // An option read from pane state sets no setting, unless it also names one.
343
+ if (option.pluginState && !option.settingKey) continue;
289
344
  const value = options[option.key];
290
345
  if (value !== undefined) settings[option.settingKey ?? option.key] = value;
291
346
  }
@@ -13,6 +13,7 @@ import {
13
13
  MAX_INLINE_CHOICES,
14
14
  optionChoices,
15
15
  optionFlags,
16
+ paneFunctionArgument,
16
17
  type PaneFunctionCapability,
17
18
  type PaneFunctionOptionDef,
18
19
  type PaneFunctionReadiness,
@@ -153,12 +154,8 @@ export function findFunctionCode(registry: PaneFunctionCatalog, token: string):
153
154
  ...(headless?.discovery?.aliases ?? []),
154
155
  ];
155
156
  if (!codes.some((code) => code && normalizeLookupToken(code) === wanted)) return null;
156
- return {
157
- argument: argumentHint({
158
- argKind: headless?.argument.kind ?? found.shortcut?.argKind,
159
- argPlaceholder: headless?.argument.placeholder ?? found.shortcut?.argPlaceholder,
160
- }),
161
- };
157
+ const argument = pane ? paneFunctionArgument(found, pane) : { kind: found.shortcut?.argKind, placeholder: found.shortcut?.argPlaceholder };
158
+ return { argument: argumentHint({ argKind: argument.kind, argPlaceholder: argument.placeholder }) };
162
159
  }
163
160
 
164
161
  /** A function code a typed one is a slip away from: what to type, and the function's name. */
@@ -184,7 +181,7 @@ const NEAR_CODE_LIMIT = 3;
184
181
  * among the mnemonics the command bar takes, each named by the code it is
185
182
  * near (`DES` for Ticker Research, whose code is T). Empty when none is that
186
183
  * close, the name is too short to tell, or so many are that none stands out.
187
- * A word typed as a command (`commandWord`, `gloomberb RCDF PLTR`) is held to
184
+ * A word typed as a command (`commandWord`, `gloom RCDF PLTR`) is held to
188
185
  * MIN_COMMAND_WORD_TYPO_LENGTH and the code's first letter, so a ticker typed
189
186
  * there is not taken for a code.
190
187
  */
@@ -259,6 +256,7 @@ async function buildTemplateCatalogEntry(
259
256
  }
260
257
 
261
258
  const headless = getHeadlessPaneDefinition(template, pane);
259
+ const argument = paneFunctionArgument(template, pane);
262
260
  return {
263
261
  token: template.shortcut?.prefix ?? template.id,
264
262
  label: template.label,
@@ -268,8 +266,8 @@ async function buildTemplateCatalogEntry(
268
266
  templateId: template.id,
269
267
  shortcut: template.shortcut?.prefix,
270
268
  aliases: [...(template.shortcut?.aliases ?? [])],
271
- argKind: headless?.argument.kind ?? template.shortcut?.argKind,
272
- argPlaceholder: headless?.argument.placeholder ?? template.shortcut?.argPlaceholder,
269
+ argKind: argument.kind,
270
+ argPlaceholder: argument.placeholder,
273
271
  ...(headless?.argument.examples?.length ? { argExamples: headless.argument.examples } : {}),
274
272
  ...(headless?.argument.kind === "tickers" && template.shortcut?.argKind === "ticker"
275
273
  ? { shotArgument: argumentHint({ argKind: "ticker", argPlaceholder: template.shortcut.argPlaceholder }) } : {}),
@@ -296,6 +294,7 @@ export async function buildPaneCatalogEntries(
296
294
  for (const pane of registry.panes.values()) {
297
295
  if (templatedPaneIds.has(pane.id)) continue;
298
296
  const [shortcut, ...aliases] = builtInPanePrefixes(pane.id);
297
+ const argument = paneFunctionArgument(undefined, pane);
299
298
  entries.push({
300
299
  token: shortcut ?? pane.id,
301
300
  label: pane.name,
@@ -304,8 +303,8 @@ export async function buildPaneCatalogEntries(
304
303
  paneName: pane.name,
305
304
  shortcut,
306
305
  aliases,
307
- argKind: pane.headless?.argument.kind,
308
- argPlaceholder: pane.headless?.argument.placeholder,
306
+ argKind: argument.kind,
307
+ argPlaceholder: argument.placeholder,
309
308
  ...(pane.headless?.argument.examples?.length ? { argExamples: pane.headless.argument.examples } : {}),
310
309
  keywords: [],
311
310
  defaultSettings: {},
@@ -576,7 +575,8 @@ function readinessCell(readiness: PaneFunctionReadiness): string {
576
575
  function optionDescription(option: PaneFunctionOptionDef): string {
577
576
  const choices = optionChoices(option);
578
577
  const parts = [option.description.replace(/\.$/, "")];
579
- if (choices.join("|").length > MAX_INLINE_CHOICES) parts.push(`One of ${choices.join(", ")}`);
578
+ // An enum that also reads other values (a bar size of any length) lists its values as examples.
579
+ if (choices.join("|").length > MAX_INLINE_CHOICES) parts.push(`${option.normalize ? "Such as" : "One of"} ${choices.join(", ")}`);
580
580
  if (option.defaultValue !== undefined && option.defaultValue !== "") parts.push(`Default ${String(option.defaultValue)}`);
581
581
  return `${parts.join(". ")}.`;
582
582
  }
@@ -622,14 +622,14 @@ function renderCatalogEntry(entry: PaneCatalogEntry): string {
622
622
 
623
623
  lines.push("", renderSection("Examples"));
624
624
  if (capability.reportReadiness !== "unsupported") {
625
- lines.push(...wrapCommandLine(`gloomberb fn ${invocation}`, width));
626
- for (const example of entry.argExamples ?? []) lines.push(...wrapCommandLine(`gloomberb fn ${entry.token} ${example}`, width));
625
+ lines.push(...wrapCommandLine(`gloom fn ${invocation}`, width));
626
+ for (const example of entry.argExamples ?? []) lines.push(...wrapCommandLine(`gloom fn ${entry.token} ${example}`, width));
627
627
  for (const option of capability.options) {
628
- if (option.example) lines.push(...wrapCommandLine(`gloomberb fn ${option.exampleWithoutArgument ? entry.token : invocation} ${option.example}`, width));
628
+ if (option.example) lines.push(...wrapCommandLine(`gloom fn ${option.exampleWithoutArgument ? entry.token : invocation} ${option.example}`, width));
629
629
  }
630
630
  }
631
631
  const shotInvocation = entry.shotArgument ? `${entry.token} ${entry.shotArgument}` : invocation;
632
- lines.push(...wrapCommandLine(`gloomberb shot ${shotInvocation} --output ${entry.token.toLowerCase()}.png`, width));
632
+ lines.push(...wrapCommandLine(`gloom shot ${shotInvocation} --output ${entry.token.toLowerCase()}.png`, width));
633
633
  return lines.join("\n");
634
634
  }
635
635
 
@@ -638,10 +638,11 @@ function renderMatchesTable(shown: readonly PaneCatalogEntry[]): string {
638
638
  return renderTable(
639
639
  [
640
640
  { header: "Function", shrink: false },
641
- { header: "Name", maxWidth: 20 },
642
- { header: "Argument", maxWidth: 14 },
641
+ { header: "Name" },
642
+ { header: "Argument" },
643
643
  { header: "Report" },
644
- { header: "Description" },
644
+ // A scan list: the description is cut where it does not fit, and `catalog <function>` prints it whole.
645
+ { header: "Description", shrink: true, minWidth: 20 },
645
646
  ],
646
647
  shown.map((entry) => [
647
648
  cliStyles.command(entry.token),
@@ -675,7 +676,7 @@ function renderAlsoMatches(exact: PaneCatalogEntry, entries: readonly PaneCatalo
675
676
  */
676
677
  export function renderFunctionHelp(entry: PaneCatalogEntry, command: string): string {
677
678
  const width = Math.min(cliTerminalWidth() ?? CATALOG_TEXT_WIDTH, CATALOG_TEXT_WIDTH);
678
- const note = `The options every function takes, and the output formats, are in gloomberb help ${command}.`;
679
+ const note = `The options every function takes, and the output formats, are in gloom help ${command}.`;
679
680
  return [renderCatalogEntry(entry), "", ...wrapText(note, width).map((line) => cliStyles.muted(line))].join("\n");
680
681
  }
681
682
 
@@ -687,7 +688,7 @@ function renderCatalogGlossary(glossary: GlossaryLookup, width: number): string
687
688
  const defined = glossary.exact.length > 0 ? [renderSection("Glossary"), ...renderGlossaryEntries(glossary.exact)] : [];
688
689
  const others = glossary.partial.map((entry) => entry.term).join(", ");
689
690
  const related = others
690
- ? wrapText(`${defined.length > 0 ? "Related" : "Glossary"}: ${others}. gloomberb catalog glossary <term> explains one.`, width)
691
+ ? wrapText(`${defined.length > 0 ? "Related" : "Glossary"}: ${others}. gloom catalog glossary <term> explains one.`, width)
691
692
  .map((line) => cliStyles.muted(line))
692
693
  : [];
693
694
  return [...defined, ...related].join("\n");
@@ -736,7 +737,7 @@ export function renderPaneCatalogReport(
736
737
  if (charted) return withGap([charted, terms].filter(Boolean).join("\n\n"));
737
738
  if (glossary.exact.length > 0 || gap || setting) return withGap(terms);
738
739
  return withTerms(note(args.query
739
- ? `No functions match "${args.query}". Run gloomberb catalog to browse them all.`
740
+ ? `No functions match "${args.query}". Run gloom catalog to browse them all.`
740
741
  : "No functions are available."));
741
742
  }
742
743
 
@@ -752,7 +753,7 @@ export function renderPaneCatalogReport(
752
753
  "",
753
754
  note([
754
755
  loose ? "No function carries every word of the query; these are the closest." : "",
755
- "gloomberb catalog <function> shows its options and examples.",
756
+ "gloom catalog <function> shows its options and examples.",
756
757
  hidden > 0 ? more : "",
757
758
  ].filter(Boolean).join(" ")),
758
759
  ];
@@ -37,7 +37,7 @@ function unavailable<T>(name: string): T {
37
37
  * Context that collects `setup()`-registered panes and templates without
38
38
  * booting the real plugin runtime or its polling engines. Keep this object
39
39
  * exhaustively typed so additions to GloomPluginContext fail at compile time
40
- * instead of crashing `gloomberb catalog` at runtime.
40
+ * instead of crashing `gloom catalog` at runtime.
41
41
  */
42
42
  export function createPaneDiscoveryContext(options: PaneDiscoveryOptions): GloomPluginContext & {
43
43
  panes: Map<string, PaneDef>;
@@ -9,7 +9,8 @@ import { lockNoteLines } from "./lock-note";
9
9
  import { createHeadlessPaneContext } from "./headless";
10
10
  import type { HeadlessPaneContext } from "../../types/headless";
11
11
  import { lockNoteReason } from "../../plugins/builtin/shared/pro-lock-note";
12
- import { renderDesktopShot, type PaneScreenshotResult } from "./screenshot";
12
+ import { renderDesktopShot } from "./screenshot-render";
13
+ import type { PaneScreenshotResult } from "./screenshot-types";
13
14
  import { deriveRenderedFreshness, formatFreshnessLine, type ReportFreshness } from "./freshness";
14
15
  import { exportTextTable, reportFooterLines, type CliReportTables } from "../report-tables";
15
16
  import { declaredReportFreshness, renderedReportFailure, renderedReportFreshness, renderedReportNotices, renderedReportObservations } from "./report-notices";
@@ -301,14 +302,13 @@ export async function buildDomPaneReportFromRender(
301
302
  /** The report's closing lines; a locked view, which read nothing, cites no source. */
302
303
  export function appendDomReportFooter(
303
304
  text: string,
304
- elapsedMs: number,
305
305
  view: DomReportView,
306
306
  freshness: ReportFreshness | undefined,
307
307
  ): string {
308
308
  return [
309
309
  text,
310
310
  "",
311
- domReportNote(elapsedMs, view),
311
+ domReportNote(view),
312
312
  ...(freshness ? [cliStyles.muted(formatFreshnessLine(freshness))] : []),
313
313
  ].join("\n");
314
314
  }
@@ -321,16 +321,19 @@ export function domReportView(data: Readonly<Record<string, unknown>>): DomRepor
321
321
  return data.truncated === true ? "clipped" : data.everyRow === true ? "every-row" : data.wholePane === true ? "whole" : "visible";
322
322
  }
323
323
 
324
- /** What a rendered-view report says about where its values come from. */
325
- export function domReportNote(elapsedMs: number, view: DomReportView): string {
326
- const source = view === "locked"
324
+ /**
325
+ * What a rendered-view report says about where its values come from. How long
326
+ * the render took is no part of it: that is the machine's, not the data's
327
+ * (`elapsedMs` in JSON keeps it).
328
+ */
329
+ export function domReportNote(view: DomReportView): string {
330
+ return view === "locked"
327
331
  ? "Rendered view: the pane is locked, so no values were read."
328
332
  : view === "every-row"
329
333
  ? "Rendered view: every row of the pane's table, including rows scrolled out of view."
330
334
  : view === "whole"
331
335
  ? "Rendered view: the pane grown to fit the whole page."
332
336
  : `Rendered view: values come from the visible pane. ${view === "clipped" ? "The rendered view is clipped." : "The rendered view may be clipped."}`;
333
- return `${source} Render time: ${elapsedMs} ms.`;
334
337
  }
335
338
 
336
339
  function failedDomReport(