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
@@ -67,7 +67,7 @@ function ratioShot(resolved: ResolvedPaneFunction, payload: DesktopPaneShotPaylo
67
67
  return { symbol, financials, tab, period, model: ratioTableForFinancials(financials, tab, period, history) };
68
68
  }
69
69
 
70
- const hasRatio = ({ model, tab }: RatioShot, index: number) => tab.ratios.some((def) => (
70
+ const hasRatio = ({ model }: RatioShot, index: number) => model.ratios.some((def) => (
71
71
  typeof model.cells.get(def.id)?.[index]?.value === "number"
72
72
  ));
73
73
 
@@ -106,7 +106,7 @@ export function financialRatioShotEvidence(
106
106
  date: statement.date,
107
107
  periodEnd: ratioPeriodEnd(statement),
108
108
  price: typeof price === "number" ? price : null,
109
- ratios: shot.tab.ratios.flatMap((def) => {
109
+ ratios: shot.model.ratios.flatMap((def) => {
110
110
  const value = shot.model.cells.get(def.id)![index]!.value;
111
111
  return typeof value === "number" ? [{ id: def.id, label: def.label, value }] : [];
112
112
  }),
@@ -12,6 +12,8 @@ import { localTimeSuffix, parseReportTime, type ReportTime } from "../../utils/u
12
12
  import { isRecord } from "../../utils/guards";
13
13
  import { latestRegularSessionClose, readIndexSession } from "../../market-data/market/freshness";
14
14
  import { reportMarketSession, reportVenueSessionDates, type ReportMarket, type SessionObservation, type VenueSessionDate } from "./market-session";
15
+ import { savedCopyShownAt } from "../../data/saved-copies";
16
+ import { releasedText } from "../../utils/release-date";
15
17
 
16
18
  /**
17
19
  * The four states of docs/usage.md#how-current-a-report-is, plus `unreported`
@@ -23,10 +25,26 @@ type ReportFreshnessStatus = HeadlessFreshnessStatus | "unreported";
23
25
  /** What every `fn` report cites about its data, in its JSON and its last text line. */
24
26
  export interface ReportFreshness {
25
27
  source: string;
26
- /** Newest observation: an ISO instant in UTC, or an ISO date. Null when nothing in the data is dated. */
28
+ /**
29
+ * Newest observation: an ISO instant in UTC, or an ISO date. For a figure
30
+ * dated by the period it covers whose release is known (`referencePeriod`),
31
+ * the day or time it was released. Null when nothing in the data is dated.
32
+ */
27
33
  asOf: string | null;
34
+ /**
35
+ * The newest observation's own date when `asOf` is its release: the first
36
+ * day of its period with `periodicity` (`2026-09-01` is Sep 2026), else the
37
+ * day it is dated by (a weekly figure's week end). The status line then
38
+ * reads `Sep 2026, released Tue 20 Oct`.
39
+ */
40
+ referencePeriod?: string;
28
41
  /** Oldest observation, when it is more than a day older than `asOf`. */
29
42
  oldest?: string;
43
+ /**
44
+ * How often the oldest observation publishes, when its rows say and it is
45
+ * not `periodicity` (a quarterly figure beside a monthly one); null for a day.
46
+ */
47
+ oldestPeriodicity?: ReportFreshness["periodicity"] | null;
30
48
  /** With a declared `citeOldest`: the oldest observation whenever it is older than `asOf`. Exports cite it. */
31
49
  oldestObservation?: string;
32
50
  status: ReportFreshnessStatus;
@@ -86,18 +104,42 @@ export interface ReportFreshness {
86
104
  * oldest observation) to when this report was built: `oldest 9 min`.
87
105
  */
88
106
  oldestAgeMinutes?: number;
107
+ /** The data states no feed (`status` is `unreported`) and its line says only its time and age (`ageOnly`). */
108
+ ageOnly?: true;
89
109
  /** What the newest observation is, said before its time: `newest story Tue 29 Sep 2026 20:17 UTC`. */
90
110
  asOfLabel?: string;
91
111
  /** What the figures are, said after the status: `funding = current estimate, pays 08:00 UTC`. */
92
112
  note?: string;
113
+ /** Shorter forms of `note`, in the order a capture's line too long for it tries them. */
114
+ noteVariants?: string[];
93
115
  /** When the figures reach readers and when the next are due, said right after the as-of date. */
94
116
  schedule?: string;
117
+ /** Shorter forms of `schedule`, in the order a status line too long for it tries them. */
118
+ scheduleVariants?: string[];
95
119
  /** Who published the figures, when the data names them. */
96
120
  publisher?: string;
97
121
  /** When the publisher released the data, an ISO instant in UTC or an ISO date, when the data states it. */
98
122
  publishedAt?: string;
99
123
  /** When this report was built. */
100
124
  retrievedAt: string;
125
+ /**
126
+ * Refreshing the data failed and a copy saved earlier answered: when that
127
+ * copy was saved, an ISO instant in UTC. The status line then says
128
+ * `couldn't refresh; saved 21:49 UTC` in place of how current the data is.
129
+ */
130
+ savedAt?: string;
131
+ }
132
+
133
+ /**
134
+ * The freshness a command prints, saying when what it shows (`shown`: its
135
+ * rows, or the data its line is drawn from) came from a copy saved earlier
136
+ * because refreshing it failed (`collectSavedCopies`): its status line then
137
+ * reads `couldn't refresh; saved 21:49 UTC` instead of live or delayed.
138
+ */
139
+ export function withSavedCopy<F extends ReportFreshness | undefined>(freshness: F, shown: unknown): F {
140
+ if (!freshness || freshness.savedAt) return freshness;
141
+ const savedAt = savedCopyShownAt(shown);
142
+ return savedAt == null ? freshness : { ...freshness, savedAt: new Date(savedAt).toISOString() };
101
143
  }
102
144
 
103
145
  /** One source's newest observation: an ISO instant in UTC. */
@@ -140,6 +182,40 @@ interface Observations {
140
182
  units: ReportTime[];
141
183
  /** Metadata and snapshot stamps: candidates for `asOf` only. */
142
184
  extra: ReportTime[];
185
+ /** A unit dated by the period it covers whose row says when it was released (`releasedOn`), and how often. */
186
+ releases?: Map<ReportTime, UnitRelease>;
187
+ }
188
+
189
+ interface UnitRelease {
190
+ released: ReportTime | null;
191
+ periodicity?: NonNullable<HeadlessPaneFreshness["periodicity"]>;
192
+ }
193
+
194
+ const PERIODICITIES = new Set<unknown>(["monthly", "quarterly", "semiannual", "annual"]);
195
+
196
+ /** What a dated row says of its release: `releasedOn` and its `periodicity`, when it names either. */
197
+ function readUnitRelease(record: Record<string, unknown>, time: ReportTime, now: number, observations: Observations): void {
198
+ const hasPeriodicity = PERIODICITIES.has(record.periodicity);
199
+ if (!time.dateOnly || (record.releasedOn == null && !hasPeriodicity)) return;
200
+ (observations.releases ??= new Map()).set(time, {
201
+ released: releaseTime(record.releasedOn as HeadlessPaneFreshness["releasedOn"], time, now),
202
+ ...(hasPeriodicity ? { periodicity: record.periodicity as UnitRelease["periodicity"] } : {}),
203
+ });
204
+ }
205
+
206
+ /**
207
+ * The release and periodicity of the newest observation when the rows dated
208
+ * `asOf` all say the same one; nothing when any of them names none, or they
209
+ * disagree (a monthly and a weekly figure dated the same day).
210
+ */
211
+ function newestUnitRelease(observations: Observations, asOf: ReportTime): UnitRelease | null {
212
+ if (observations.extra.some((time) => time.time > asOf.time)) return null;
213
+ const newest = observations.units.filter((time) => time.time === asOf.time);
214
+ const releases = newest.map((time) => observations.releases?.get(time) ?? null);
215
+ const [first] = releases;
216
+ if (!first || releases.some((release) => !release
217
+ || release.released?.time !== first.released?.time || release.periodicity !== first.periodicity)) return null;
218
+ return first;
143
219
  }
144
220
 
145
221
  function emptySignals(): FeedSignals {
@@ -231,7 +307,10 @@ function collect(
231
307
  ?? (observedKey ? null : observedTime(row, now, UPDATE_KEYS));
232
308
  if (!ignoreStaleFlags) readUnitStale(row, time, signals);
233
309
  readSession(row, time, signals);
234
- if (time) observations.units.push(time);
310
+ if (time) {
311
+ observations.units.push(time);
312
+ readUnitRelease(row, time, now, observations);
313
+ }
235
314
  }
236
315
  if (definition.shape === "series" && !declaredObservations) {
237
316
  for (const series of (result as HeadlessSeriesResult).series) {
@@ -359,6 +438,17 @@ function declaredSources(declared: HeadlessPaneFreshness, now: number): Array<{
359
438
  });
360
439
  }
361
440
 
441
+ /**
442
+ * A declared release of the newest observation, when it is after the
443
+ * observation's day (or a time on it) and not in the future; null for anything
444
+ * else, a figure released the day it is dated by among them.
445
+ */
446
+ function releaseTime(declared: HeadlessPaneFreshness["releasedOn"], observed: ReportTime, now: number): ReportTime | null {
447
+ const released = parseReportTime(declared);
448
+ if (!released || released.time < observed.time || released.time > now + FUTURE_TOLERANCE_MS) return null;
449
+ return released.dateOnly && released.time === observed.time ? null : released;
450
+ }
451
+
362
452
  /** A declared bar period still forming, its last day read as a date; null for anything else. */
363
453
  function readPeriodToDate(declared: HeadlessPaneFreshness["periodToDate"], now: number): { period: "week" | "month"; through: ReportTime | null } | null {
364
454
  if (declared?.period !== "week" && declared?.period !== "month") return null;
@@ -375,7 +465,7 @@ function resolveFreshness({ declared, signals, observations, now }: FreshnessInp
375
465
  const asOf = declaredAsOf ?? periodToDate?.through ?? newest([...observations.units, ...observations.extra]);
376
466
  // The oldest source, not the newest, says how far behind the view can be.
377
467
  const agedFrom = sources.length ? oldest(sources.map(({ time }) => time))
378
- : declared.oldestAge ? oldest(observations.units) ?? asOf : null;
468
+ : declared.oldestAge || declared.ageOnly ? oldest(observations.units) ?? asOf : null;
379
469
  const oldestAgeMinutes = agedFrom && !agedFrom.dateOnly ? Math.max(0, Math.floor((now - agedFrom.time) / 60_000)) : null;
380
470
  // A loader that dates its data itself also says how old the oldest part is, or nothing;
381
471
  // `oldest: null` says the rows are a history, whose first entry is not stale data.
@@ -441,7 +531,10 @@ function resolveFreshness({ declared, signals, observations, now }: FreshnessInp
441
531
  const asOfClose = closeDate && asOf && !declaredAsOf ? closeDate : null;
442
532
  const tradingDayMarket = asOfClose ? closeMarket
443
533
  : asOf?.dateOnly ? declared.tradingDayMarket?.trim() || null : null;
444
- const periodicity = declared.periodicity && asOf?.dateOnly ? declared.periodicity : undefined;
534
+ // Rows dated by the period they cover can say how often they publish and when the newest was released.
535
+ const unitRelease = asOf && !declaredAsOf && !periodToDate ? newestUnitRelease(observations, asOf) : null;
536
+ const periodicity = (declared.periodicity ?? unitRelease?.periodicity) && asOf?.dateOnly
537
+ ? declared.periodicity ?? unitRelease?.periodicity : undefined;
445
538
  // Rows that are quotes (a feed, a venue's session) keep the market line, even on a dataset's pane.
446
539
  const quoted = rowsAreQuotes(signals);
447
540
  // A dataset disseminated with a delay (DTCC's swap tape) lags its newest observation all the same.
@@ -450,14 +543,28 @@ function resolveFreshness({ declared, signals, observations, now }: FreshnessInp
450
543
  const observation = lagDays != null ? declared.observation?.trim() : undefined;
451
544
 
452
545
  const note = declared.note?.trim();
546
+ const noteVariants = note ? (declared.noteVariants ?? []).map((variant) => variant.trim()).filter((variant) => variant && variant !== note) : [];
453
547
  const asOfLabel = asOf ? declared.asOfLabel?.trim() : undefined;
454
548
  const schedule = declared.schedule?.trim();
549
+ const scheduleVariants = schedule ? (declared.scheduleVariants ?? []).map((variant) => variant.trim()).filter((variant) => variant && variant !== schedule) : [];
455
550
  const publisher = declared.publisher?.trim();
456
551
  const publishedAt = parseReportTime(declared.publishedAt);
552
+ // A figure dated by the period it covers is as of its release: September's permits
553
+ // are dated 1 Sep and were released 20 Oct. Age, staleness and the oldest stay the observation's.
554
+ const released = asOf?.dateOnly && !declared.dataset && !periodToDate
555
+ ? releaseTime(declared.releasedOn, asOf, now) ?? unitRelease?.released ?? null : null;
556
+ // The oldest row's own period, when the rows name theirs (a quarterly figure among daily ones).
557
+ const oldestRelease = !declared.periodicity && oldestTime ? observations.releases?.get(oldestTime) : undefined;
558
+ const oldestPeriodicity = declared.oldestPeriodicity !== undefined ? declared.oldestPeriodicity
559
+ : oldestRelease ? oldestRelease.periodicity ?? null : unitRelease?.periodicity ? null : undefined;
457
560
  return {
458
561
  source: declared.source?.trim() || (sources.length ? [...new Set(sources.map(({ source }) => source))].join(", ") : DEFAULT_REPORT_SOURCE),
459
- asOf: asOf ? isoTime(asOf) : null,
460
- ...(asOf && oldestTime && asOf.time - oldestTime.time > OLDEST_GAP_MS ? { oldest: isoTime(oldestTime) } : {}),
562
+ asOf: released ? isoTime(released) : asOf ? isoTime(asOf) : null,
563
+ ...(released && asOf ? { referencePeriod: isoTime(asOf) } : {}),
564
+ ...(asOf && oldestTime && asOf.time - oldestTime.time > OLDEST_GAP_MS ? {
565
+ oldest: isoTime(oldestTime),
566
+ ...(oldestPeriodicity !== undefined && (oldestPeriodicity ?? undefined) !== periodicity ? { oldestPeriodicity } : {}),
567
+ } : {}),
461
568
  ...(asOf && oldestUnit && oldestUnit.time < asOf.time ? { oldestObservation: isoTime(oldestUnit) } : {}),
462
569
  status,
463
570
  ...(delayMinutes != null && delayMinutes > 0 ? { delayMinutes } : {}),
@@ -475,9 +582,12 @@ function resolveFreshness({ declared, signals, observations, now }: FreshnessInp
475
582
  ...(observation ? { observation } : {}),
476
583
  ...(sources.length ? { sources: sources.map(({ source, time }) => ({ source, asOf: isoTime(time) })) } : {}),
477
584
  ...(oldestAgeMinutes != null ? { oldestAgeMinutes } : {}),
585
+ ...(status === "unreported" && declared.ageOnly ? { ageOnly: true as const } : {}),
478
586
  ...(asOfLabel ? { asOfLabel } : {}),
479
587
  ...(note ? { note } : {}),
588
+ ...(noteVariants.length > 0 ? { noteVariants } : {}),
480
589
  ...(schedule ? { schedule } : {}),
590
+ ...(scheduleVariants.length > 0 ? { scheduleVariants } : {}),
481
591
  ...(publisher ? { publisher } : {}),
482
592
  ...(publishedAt ? { publishedAt: isoTime(publishedAt) } : {}),
483
593
  retrievedAt: new Date(now).toISOString(),
@@ -558,7 +668,11 @@ export function deriveRenderedFreshness(
558
668
  declared: merged,
559
669
  signals,
560
670
  // Rendered rows are often a history (a news list, a filing feed), so only the newest is cited.
561
- observations: { units: observed?.observations.units ?? [], extra: [...(observed?.observations.extra ?? []), ...units] },
671
+ observations: {
672
+ units: observed?.observations.units ?? [],
673
+ extra: [...(observed?.observations.extra ?? []), ...units],
674
+ ...(observed?.observations.releases ? { releases: observed.observations.releases } : {}),
675
+ },
562
676
  now,
563
677
  });
564
678
  }
@@ -689,7 +803,8 @@ function statusText(freshness: ReportFreshness, short = false): string {
689
803
  case "not-a-feed":
690
804
  return freshness.basis ? `not a live feed (${freshness.basis})` : "not a live feed";
691
805
  case "unreported":
692
- return "status not reported";
806
+ // Keep any date or age, without inventing a feed status or announcing its absence.
807
+ return "";
693
808
  default: {
694
809
  const _exhaustive: never = freshness.status;
695
810
  return _exhaustive;
@@ -702,6 +817,19 @@ function onRetrievalDay(iso: string, retrievedAt: string): boolean {
702
817
  return iso.slice(0, 10) === retrievedAt.slice(0, 10);
703
818
  }
704
819
 
820
+ /**
821
+ * What a report answered from a saved copy says in place of how current its
822
+ * data is: `couldn't refresh; saved 21:49 UTC`, with the day when the copy was
823
+ * saved on another day than the report was built.
824
+ */
825
+ function savedCopyText(savedAt: string, retrievedAt: string, local: boolean): string {
826
+ const at = Date.parse(savedAt);
827
+ if (!Number.isFinite(at)) return "couldn't refresh";
828
+ const iso = new Date(at).toISOString();
829
+ const time = onRetrievalDay(iso, retrievedAt) ? `${iso.slice(11, 16)} UTC${local ? localTimeSuffix(at) : ""}` : timeText(iso, local);
830
+ return `couldn't refresh; saved ${time}`;
831
+ }
832
+
705
833
  /** `US and XETRA`, `US, XETRA and EPA`. */
706
834
  function listText(items: readonly string[]): string {
707
835
  return items.length <= 1 ? items.join("") : `${items.slice(0, -1).join(", ")} and ${items.at(-1)}`;
@@ -734,14 +862,19 @@ function asOfText(freshness: ReportFreshness, short: boolean, local: boolean, un
734
862
  const market = freshness.tradingDayMarket;
735
863
  const period = freshness.periodicity;
736
864
  const time = parseReportTime(freshness.asOf);
737
- const asOf = freshness.periodToDate ? periodToDateText(freshness.periodToDate, freshness.asOf)
865
+ const reference = freshness.referencePeriod;
866
+ // `Sep 2026, released Tue 20 Oct`: the period the figure covers, then when it was released.
867
+ const released = reference ? releasedText(freshness.asOf, reference) : null;
868
+ const asOf = released && reference ? `${period ? periodText(reference, period) : dayText(reference)}, ${released}`
869
+ : freshness.periodToDate ? periodToDateText(freshness.periodToDate, freshness.asOf)
738
870
  : period ? `${periodText(freshness.asOf, period)} (${period})`
739
871
  : freshness.asOfClose
740
872
  ? `${tradingDayText(freshness.asOfClose, market)} close`
741
873
  : time?.dateOnly ? tradingDayText(freshness.asOf, market)
742
874
  : undated && time && onRetrievalDay(new Date(time.time).toISOString(), freshness.retrievedAt)
743
875
  ? `${new Date(time.time).toISOString().slice(11, 16)} UTC` : timeText(freshness.asOf, local);
744
- const oldest = freshness.oldest && (period ? periodText(freshness.oldest, period) : dayText(freshness.oldest));
876
+ const oldestPeriod = freshness.oldestPeriodicity !== undefined ? freshness.oldestPeriodicity : period;
877
+ const oldest = freshness.oldest && (oldestPeriod ? periodText(freshness.oldest, oldestPeriod) : dayText(freshness.oldest));
745
878
  // A list dated by its newest entry names it, so the time is not read as when the list was read.
746
879
  const dated = freshness.asOfLabel ? `${freshness.asOfLabel} ${asOf}` : asOf;
747
880
  return oldest && !short && freshness.oldestAgeMinutes == null ? `${dated} (oldest ${oldest})` : dated;
@@ -817,10 +950,12 @@ interface StatusLineDetail {
817
950
  local?: "none";
818
951
  /** Leave the day off a time of the day the report was built. */
819
952
  date?: "none";
820
- /** Leave out what the figures are (`funding = current estimate`). */
821
- note?: "none";
822
- /** Leave out when the figures are published and the next are due. */
823
- schedule?: "none";
953
+ /** Leave out what the figures are (`funding = current estimate`), or say the shorter form at this index of `noteVariants`. */
954
+ note?: "none" | number;
955
+ /** Leave out when the figures are published and the next are due, or say the shorter form at this index of `scheduleVariants`. */
956
+ schedule?: "none" | number;
957
+ /** Leave out what not-a-feed data is (`not a live feed` for `not a live feed (weekly report)`). */
958
+ basis?: "none";
824
959
  }
825
960
 
826
961
  /**
@@ -836,11 +971,13 @@ function statusLineParts(freshness: ReportFreshness, detail: StatusLineDetail =
836
971
  return [
837
972
  ...(freshness.sources?.length ? sourcesAsOfParts(freshness, freshness.sources, undated)
838
973
  : [asOfText(freshness, detail.asOf === "short", local, undated)]),
839
- ...(freshness.schedule && detail.schedule !== "none" ? [freshness.schedule] : []),
974
+ ...(freshness.schedule && detail.schedule !== "none"
975
+ ? [typeof detail.schedule === "number" ? freshness.scheduleVariants?.[detail.schedule] ?? freshness.schedule : freshness.schedule] : []),
840
976
  ...(freshness.oldestAgeMinutes != null ? [`oldest ${ageText(freshness.oldestAgeMinutes)}`] : []),
841
- statusText(freshness, detail.status === "short"),
977
+ ...(freshness.savedAt ? [savedCopyText(freshness.savedAt, freshness.retrievedAt, local)]
978
+ : [statusText(detail.basis === "none" ? { ...freshness, basis: undefined } : freshness, detail.status === "short")].filter(Boolean)),
842
979
  ...(freshness.market && detail.market !== "none" ? [marketText(freshness.market, now, detail.market === "short", local)] : []),
843
- ...(freshness.note && detail.note !== "none" ? [freshness.note] : []),
980
+ ...(freshness.note && detail.note !== "none" ? [typeof detail.note === "number" ? freshness.noteVariants?.[detail.note] ?? freshness.note : freshness.note] : []),
844
981
  ];
845
982
  }
846
983
 
@@ -881,7 +1018,8 @@ function datasetLineParts(freshness: ReportFreshness, asOf: string, lagDays: num
881
1018
  ...(detail.source === "none" ? [] : [`Source: ${freshness.source}`]),
882
1019
  `${freshness.observation} ${asOf.slice(0, 10)}`,
883
1020
  lagText(lagDays),
884
- ...(freshness.status === "stale" ? ["stale"] : []),
1021
+ ...(freshness.savedAt ? [savedCopyText(freshness.savedAt, freshness.retrievedAt, false)]
1022
+ : freshness.status === "stale" ? ["stale"] : []),
885
1023
  ];
886
1024
  }
887
1025
  const period = freshness.periodicity;
@@ -892,10 +1030,20 @@ function datasetLineParts(freshness: ReportFreshness, asOf: string, lagDays: num
892
1030
  ...(detail.source === "none" ? [] : [`Source: ${freshness.source}`]),
893
1031
  `observed ${dated(asOf)}${period ? ` (${period})` : ""}${oldest}`,
894
1032
  `lag ${lagDays}d`,
895
- ...(stale ? [stale] : []),
1033
+ ...(freshness.savedAt ? [savedCopyText(freshness.savedAt, freshness.retrievedAt, false)] : stale ? [stale] : []),
896
1034
  ];
897
1035
  }
898
1036
 
1037
+ /**
1038
+ * A line too narrow for its whole schedule keeps when the figures were
1039
+ * published longest: the not-a-feed basis goes first, then the schedule
1040
+ * shortens through `scheduleVariants`. Nothing for a line without them.
1041
+ */
1042
+ function shorterSchedules(freshness: ReportFreshness, detail: StatusLineDetail): StatusLineDetail[] {
1043
+ if (!freshness.schedule || !freshness.scheduleVariants?.length) return [];
1044
+ return [{ ...detail, basis: "none" }, ...freshness.scheduleVariants.map((_, index) => ({ ...detail, basis: "none" as const, schedule: index }))];
1045
+ }
1046
+
899
1047
  /**
900
1048
  * The plain status line of a capture: the longest of `statusLineVariants`,
901
1049
  * `Fri 9 Oct close · 15 min delayed · markets closed until Mon` for quotes.
@@ -927,7 +1075,9 @@ export function paneStatusLineVariants(freshness: ReportFreshness): string[] {
927
1075
  // A dataset's line has no market or local time to leave out: it reads as its report and capture do.
928
1076
  if (datesObservation(freshness)) return statusLineVariants(freshness);
929
1077
  const pane: StatusLineDetail = { local: "none", date: "none" };
930
- const details: StatusLineDetail[] = [pane, { ...pane, market: "short" }, { ...pane, market: "short", status: "short" }, { ...pane, market: "short", status: "short", note: "none" }, { ...pane, market: "short", status: "short", note: "none", schedule: "none" }];
1078
+ const shortest: StatusLineDetail = { ...pane, market: "short", status: "short", note: "none" };
1079
+ const details: StatusLineDetail[] = [pane, { ...pane, market: "short" }, { ...pane, market: "short", status: "short" }, shortest,
1080
+ ...shorterSchedules(freshness, shortest), { ...shortest, schedule: "none" }];
931
1081
  return [...new Set(details.map((detail) => capitalize(statusLineParts(freshness, detail).join(" · "))))];
932
1082
  }
933
1083
 
@@ -964,10 +1114,11 @@ export function statusLineVariants(freshness: ReportFreshness, { source = false
964
1114
  // A line that dates each source keeps every source's time and their age to
965
1115
  // the last: its day goes first, then what the figures are.
966
1116
  const shortest = details.at(-1)!;
967
- // What the figures are goes before when they are published.
1117
+ // What the figures are goes before when they are published, in its shorter forms first.
968
1118
  const trailing: StatusLineDetail[] = [
1119
+ ...(freshness.noteVariants ?? []).map((_, index) => ({ ...shortest, note: index })),
969
1120
  ...(freshness.note ? [{ ...shortest, note: "none" as const }] : []),
970
- ...(freshness.schedule ? [{ ...shortest, note: "none" as const, schedule: "none" as const }] : []),
1121
+ ...(freshness.schedule ? [...shorterSchedules(freshness, { ...shortest, note: "none" }), { ...shortest, note: "none" as const, schedule: "none" as const }] : []),
971
1122
  ];
972
1123
  const variants: StatusLineDetail[] = freshness.sources?.length
973
1124
  ? [{}, ...details.map((detail) => ({ ...detail, date: "none" as const })), { ...shortest, date: "none", note: "none" }]
@@ -1023,7 +1174,7 @@ export function captureStatusLine({ report: loaded, selfDated, quoted, rendered
1023
1174
  }
1024
1175
  if (report && loaded?.declaresData) return sourced(report);
1025
1176
  if (quoted) return plain(quoted, "quotes");
1026
- if (report && report.status !== "unreported") return sourced(report);
1177
+ if (report && (report.status !== "unreported" || report.ageOnly)) return sourced(report);
1027
1178
  return plain(rendered(), null);
1028
1179
  }
1029
1180
 
@@ -104,6 +104,15 @@ export const FUNCTION_HELP: Readonly<Record<string, FunctionHelp>> = {
104
104
  data: QUOTES,
105
105
  bloomberg: ["DES"],
106
106
  },
107
+ ADR: {
108
+ summary: "What exchange rate does a receipt's price imply? A depositary receipt beside its home listing: the ratio, both prices with when each was set, the dollar rate they imply (the CCL rate for an Argentine pair) against spot, and the receipt's premium or discount. Opens DES on its ADR vs Home tab.",
109
+ usage: ["ADR GGAL", "ADR TSM", "ADR GGAL.BA"],
110
+ keys: [key("Enter", " open the listing")],
111
+ data: QUOTES,
112
+ bloomberg: [],
113
+ // A tab of DES, filed under it.
114
+ docs: "DES",
115
+ },
107
116
  QQ: {
108
117
  summary: "A compact board of live quotes for any list of tickers, each with change, range and a sparkline. Good as the always-open strip in a layout.",
109
118
  usage: ["QQ NVDA, AAPL, MSFT"],
@@ -126,8 +135,8 @@ export const FUNCTION_HELP: Readonly<Record<string, FunctionHelp>> = {
126
135
  bloomberg: ["GIP"],
127
136
  },
128
137
  G: {
129
- summary: "Chart any series together: prices, statement lines, valuation multiples, FRED series, map series such as chokepoint transits, indicators and formulas. Series read SYMBOL:field, FRED:series or GEO:series.",
130
- usage: ["G", "G NVDA:revenue, NVDA:net_income", "G XOM, GEO:HORMUZ"],
138
+ summary: "Chart any series together: prices, statement lines, valuation multiples, FRED series, map series such as chokepoint transits, indicators and formulas. Series read SYMBOL:field, FRED:series or GEO:series, separated by commas; tickers with spaces between them are a list too.",
139
+ usage: ["G", "G NVDA:revenue, NVDA:net_income", "G XOM, GEO:HORMUZ", "G AAPL MSFT"],
131
140
  keys: CHART_KEYS,
132
141
  data: { free: "Prices 15 minutes delayed, other series as published", pro: "Prices real-time for US listings, other series as published" },
133
142
  bloomberg: ["G"],
@@ -140,8 +149,8 @@ export const FUNCTION_HELP: Readonly<Record<string, FunctionHelp>> = {
140
149
  bloomberg: [],
141
150
  },
142
151
  CMP: {
143
- summary: "Price returns rebased to a shared start date for two or more tickers, so relative performance reads at a glance.",
144
- usage: ["CMP NVDA, AMD, AVGO"],
152
+ summary: "Price returns rebased to a shared start date for two or more tickers, so relative performance reads at a glance. A leveraged or inverse fund gets its daily objective drawn from its index fund, and its decay in its own panel.",
153
+ usage: ["CMP NVDA, AMD, AVGO", "CMP TQQQ, QQQ"],
145
154
  keys: CHART_KEYS,
146
155
  data: QUOTES,
147
156
  bloomberg: ["COMP", "TRA"],
@@ -228,14 +237,14 @@ export const FUNCTION_HELP: Readonly<Record<string, FunctionHelp>> = {
228
237
  summary: "Screen covered stocks on valuation, growth, margins, liquidity, volatility, short interest, insider activity and 13F holders, then rank the matches by any metric. "
229
238
  + "ATR% is the 14-session average true range as a percent of the last close. IV rank is a rank, not an IV percentile: 0 is the lowest 30-day implied volatility of the past 52 weeks and 100 the highest.",
230
239
  usage: ["EQS"],
231
- keys: [key("a", "dd criterion"), key("m", "etric"), key("s", "ave screen"), key("o", "pen research")],
240
+ keys: [key("a", "dd criterion"), key("m", "etric"), key("t", "check ticker"), key("s", "ave screen"), key("o", "pen research")],
232
241
  data: same("Daily snapshot, statements as filed"),
233
242
  bloomberg: ["EQS"],
234
243
  },
235
244
  OMON: {
236
245
  summary: "Calls and puts by expiry with bid, ask, spread, volume, open interest, implied volatility, Greeks, extrinsic per year and a put's cost as a percent of spot. "
237
246
  + "The Strikes filter lists every strike, a count either side of the money, or a delta band such as .70 to .90 for deep in-the-money LEAPS.",
238
- usage: ["OMON NVDA", "gloomberb fn OMON NVDA --expiration 2028-01-21"],
247
+ usage: ["OMON NVDA", "gloom fn OMON NVDA --expiration 2028-01-21"],
239
248
  keys: [key("c", "alc"), key("a", "dd to OSA"), key("s", "urface")],
240
249
  data: OPTIONS,
241
250
  bloomberg: ["OMON"],
@@ -265,24 +274,33 @@ export const FUNCTION_HELP: Readonly<Record<string, FunctionHelp>> = {
265
274
  OSA: {
266
275
  summary: "Build a multi-leg options position and value it at any spot, date and vol shift: payoff, P&L grid, breakevens and Greeks. European pricing, so no early exercise. "
267
276
  + "With a NAV and a budget in bps it sizes the position as a hedge: contracts, premium, notional protected and coverage of an equity sleeve. "
268
- + "--strategy csp sells a cash-secured put: cash secured, premium, yield on cash and annualised, distance out of the money, break-even, days to expiry and an earnings flag.",
269
- usage: ["OSA AAPL", "gloomberb fn OSA AAPL --strategy vertical --expiration 2027-01-15",
270
- "gloomberb fn OSA KO --strategy csp --strike 85 --expiration 2026-11-20",
271
- "gloomberb fn OSA SPY --strategy put --strike 700 --expiration 2027-01-15 --nav 100m --budget-bps 50 --sleeve 100m"],
277
+ + "--strategy csp sells a cash-secured put: cash secured, premium, yield on cash and annualised, the bid, ask and spread with the yield at the bid, "
278
+ + "distance out of the money, break-even, days to expiry and an earnings flag. CSP ranks the same put across several names.",
279
+ usage: ["OSA AAPL", "gloom fn OSA AAPL --strategy vertical --expiration 2027-01-15",
280
+ "gloom fn OSA KO --strategy csp --strike 85 --expiration 2026-11-20",
281
+ "gloom fn OSA SPY --strategy put --strike 700 --expiration 2027-01-15 --nav 100m --budget-bps 50 --sleeve 100m"],
272
282
  keys: [key("a", "dd leg"), key("c", "hain"), key("d", "ate"), key("v", "ol shift")],
273
283
  data: OPTIONS,
274
284
  bloomberg: ["OSA"],
275
285
  },
286
+ CSP: {
287
+ summary: "Which names pay most to sell a put? For each, the put nearest a delta (0.30) on the expiry nearest a date or a number of days out (30), "
288
+ + "ranked by annualised yield on cash at the bid, with % out of the money, delta, IV rank, the spread (marked wide, never left out) and an earnings flag.",
289
+ usage: ["CSP JPM, GS, KO", "gloom fn CSP JPM GS KO AAPL --delta 0.20 --days 45"],
290
+ keys: [key("Enter", " open in OSA")],
291
+ data: OPTIONS,
292
+ bloomberg: [],
293
+ },
276
294
  OVDV: {
277
295
  summary: "The implied volatility surface fitted from option quotes: 3D sheet, table, smiles, ATM term structure, 25-delta skew and forwards, live or on stored daily closes.",
278
- usage: ["OVDV NVDA", "gloomberb fn OVDV NVDA --tab skew --expiration 2027-01-15", "gloomberb fn OVDV SPY --date 2026-10-09 --tab skew"],
296
+ usage: ["OVDV NVDA", "gloom fn OVDV NVDA --tab skew --expiration 2027-01-15", "gloom fn OVDV SPY --date 2026-10-09 --tab skew"],
279
297
  keys: [key("v", "iew"), key("c", "hain"), key("m", "ore expiries"), key("t", " stored dates")],
280
298
  data: { free: `${DELAYED}; stored dates at the close`, pro: "Real-time; stored dates at the close" },
281
299
  bloomberg: ["OVDV"],
282
300
  },
283
301
  HIVG: {
284
302
  summary: "Daily 30-day, 90-day and one-year at-the-money implied vol since February 2024 against realized vol, with each measure's 52-week rank and percentile.",
285
- usage: ["HIVG AAPL", "gloomberb fn HIVG SPY --lookback ALL --csv"],
303
+ usage: ["HIVG AAPL", "gloom fn HIVG SPY --lookback ALL --csv"],
286
304
  keys: [key("s", "urface")],
287
305
  data: IV_DAILY,
288
306
  bloomberg: ["HIVG", "GV"],
@@ -380,8 +398,8 @@ export const FUNCTION_HELP: Readonly<Record<string, FunctionHelp>> = {
380
398
  bloomberg: ["CACS"],
381
399
  },
382
400
  EVTS: {
383
- summary: "The market's report days with implied and past moves; a ticker picks its row.",
384
- usage: ["EVTS", "EVTS NVDA"],
401
+ summary: "The market's report days with implied and past moves, or a past or coming week or day of them; a ticker picks its row.",
402
+ usage: ["EVTS", "EVTS NVDA", "gloom fn EVTS --week last", "gloom fn EVTS --date 2026-10-15"],
385
403
  keys: [key("t", "icker"), key("e", "stimates"), key("c", "alls"), key("a", "nalysts")],
386
404
  data: EARNINGS_DAYS,
387
405
  bloomberg: ["EVTS"],
@@ -405,7 +423,7 @@ export const FUNCTION_HELP: Readonly<Record<string, FunctionHelp>> = {
405
423
  bloomberg: ["DVD"],
406
424
  },
407
425
  SI: {
408
- summary: "FINRA short interest settlements with shares short, days to cover and average daily volume over time. Daily volume is the other tab.",
426
+ summary: "FINRA short interest settlements with shares short, days to cover and average daily volume over time. Daily volume, fails to deliver and weekly ATS/OTC volume are the other tabs.",
409
427
  usage: ["SI AAPL"],
410
428
  keys: [key("v", "iew"), STEP],
411
429
  data: same("Twice a month, as FINRA publishes"),
@@ -425,6 +443,20 @@ export const FUNCTION_HELP: Readonly<Record<string, FunctionHelp>> = {
425
443
  data: same("Daily, the evening after each session"),
426
444
  bloomberg: [],
427
445
  },
446
+ FTD: {
447
+ summary: "The short interest pane on Fails to deliver: outstanding fail shares for each settlement date and CUSIP. These snapshots are never added across dates.",
448
+ usage: ["FTD AAPL"],
449
+ keys: [key("v", "iew"), OPEN, OPEN_SOURCE],
450
+ data: same("Twice a month, as the SEC publishes"),
451
+ bloomberg: [],
452
+ },
453
+ ATS: {
454
+ summary: "The short interest pane on Weekly ATS/OTC: ATS and non-ATS off-exchange shares and trades. ATS % is ATS shares divided by published off-exchange shares, not total market volume or short volume.",
455
+ usage: ["ATS AAPL"],
456
+ keys: [key("v", "iew"), OPEN, OPEN_SOURCE],
457
+ data: same("Weekly with FINRA's publication delay"),
458
+ bloomberg: [],
459
+ },
428
460
  DIAG: {
429
461
  summary: "A read of the company's filings and numbers into red flags, anomalies, green flags and items to watch, each with the evidence it came from.",
430
462
  usage: ["DIAG NVDA"],
@@ -458,8 +490,8 @@ export const FUNCTION_HELP: Readonly<Record<string, FunctionHelp>> = {
458
490
  bloomberg: ["CF"],
459
491
  },
460
492
  CALLS: {
461
- summary: "Earnings call transcripts with speakers, the analyst Q&A, and extracted guidance and quotes. Alone it lists every transcribed call as it lands.",
462
- usage: ["CALLS", "CALLS NVDA"],
493
+ summary: "Earnings call transcripts with speakers, the analyst Q&A, and extracted guidance and quotes. With a ticker, the company's calls, its next one first with its start and how far away it is. Alone, the calendar of every company's calls this week; --view transcripts lists the latest transcripts.",
494
+ usage: ["CALLS", "CALLS NVDA", "CALLS --view transcripts"],
463
495
  keys: [OPEN, key("/", "find"), OPEN_SOURCE],
464
496
  data: pro("Within hours of the call"),
465
497
  access: "pro",
@@ -506,9 +538,9 @@ export const FUNCTION_HELP: Readonly<Record<string, FunctionHelp>> = {
506
538
  bloomberg: [],
507
539
  },
508
540
  HIRE: {
509
- summary: "Pro hiring momentum: weekly observed open roles, additions and removals, role families, seniority, remote and location mix, peers and primary posting evidence. Observed requisitions are not headcount. No argument opens the covered-company board.",
510
- usage: ["HIRE", "HIRE NET", "HIRE 0700:HKEX"],
511
- keys: [TABS, OPEN, key("e", "vidence"), key("o", "pen source"), key("d", "es"), key("g", "raph")],
541
+ summary: "Pro hiring momentum: weekly observed open roles, additions and removals, role families, seniority, remote and location mix, peers and primary posting evidence. Moves ranks the companies whose new roles accelerated or slowed against their own weeks and their peers, with why and the postings behind it. Observed requisitions are not headcount. No argument opens the covered-company board.",
542
+ usage: ["HIRE", "HIRE NET", "HIRE 0700:HKEX", "gloom fn HIRE RIVN --tab moves"],
543
+ keys: [TABS, OPEN, key("e", "vidence"), key("o", "pen source"), key("d", "es"), key("g", "raph"), key("n", "otify")],
512
544
  data: { free: "Latest values and three rows per section", pro: "Weekly history, all stored observations and evidence" },
513
545
  access: "preview",
514
546
  bloomberg: [],
@@ -658,7 +690,7 @@ export const FUNCTION_HELP: Readonly<Record<string, FunctionHelp>> = {
658
690
  bloomberg: ["CN"],
659
691
  },
660
692
  NI: {
661
- summary: "Market news by topic code (MNA, CB, ENERGY, REG, CRYPTO, EARN, IPO) or sector.",
693
+ summary: "Market news by topic code (MNA, CB, ENERGY, METALS, REG, CRYPTO, EARN, IPO) or sector.",
662
694
  usage: ["NI ENERGY"],
663
695
  keys: [OPEN, SEARCH, POP_OUT, key("t", "icker")],
664
696
  data: NEWS,
@@ -730,7 +762,7 @@ export const FUNCTION_HELP: Readonly<Record<string, FunctionHelp>> = {
730
762
  bloomberg: ["IMAP"],
731
763
  },
732
764
  FXC: {
733
- summary: "A cross-rate matrix for the major currencies, or for any of 45 chosen in its settings or with --currencies from the command line (gloomberb fn FXC --currencies USD,ZAR,NGN).",
765
+ summary: "A cross-rate matrix for the major currencies, or for any of 45 chosen in its settings or with --currencies from the command line (gloom fn FXC --currencies USD,ZAR,NGN).",
734
766
  usage: ["FXC"],
735
767
  keys: [],
736
768
  data: FX,
@@ -751,6 +783,13 @@ export const FUNCTION_HELP: Readonly<Record<string, FunctionHelp>> = {
751
783
  data: same("Real-time where it streams, others every 15 seconds"),
752
784
  bloomberg: [],
753
785
  },
786
+ ETFF: {
787
+ summary: "Daily net flows of the US spot bitcoin and ether ETFs, fund by fund in US$ millions, with the last 5 and 20 days, the running total since launch, and the funds the newest day still waits on.",
788
+ usage: ["ETFF", "gloom fn ETFF --asset eth"],
789
+ keys: [key("1-4", " range"), OPEN_SOURCE],
790
+ data: same("Daily, as each fund reports after the US close"),
791
+ bloomberg: [],
792
+ },
754
793
  FUT: {
755
794
  summary: "Each root's front futures contract (until its stated roll date) and the day's most active month across equity index, equity sectors, rates, energy, metals, agriculture, livestock and FX with last price, unit and session change, grouped by sector.",
756
795
  usage: ["FUT"],
@@ -759,7 +798,7 @@ export const FUNCTION_HELP: Readonly<Record<string, FunctionHelp>> = {
759
798
  bloomberg: ["GLCO"],
760
799
  },
761
800
  CTM: {
762
- summary: "A futures root's listed contracts as a curve against a week and a month ago, with roll yield, contango or backwardation, and each contract's price, open interest and volume. Takes a FUT root, VX or a CME crypto root (BTC, ETH, SOL, XRP), which also shows each contract's premium to spot and annualised basis against the USD pair quote: Ann Basis = (Last / spot - 1) × 365 / days to expiry, simple actual/365.",
801
+ summary: "A futures root's listed contracts as a curve against a week and a month ago, with roll yield, contango or backwardation, and each contract's price, open interest and volume. Takes a FUT root, VX or a CME crypto root (BTC, ETH, SOL, XRP), which also shows each contract's premium to spot and annualised basis against the USD pair in the minute of each contract's last trade: Ann Basis = (Last / spot - 1) × 365 / days to expiry, simple actual/365, with days counted to final settlement.",
763
802
  usage: ["CTM GC", "CTM BTC"],
764
803
  keys: [key("d", "ate"), key("c", "urrent"), STEP],
765
804
  data: same("Delayed, usually 10 minutes; VIX at settlement"),
@@ -986,7 +1025,7 @@ export const FUNCTION_HELP: Readonly<Record<string, FunctionHelp>> = {
986
1025
  },
987
1026
  CDS: {
988
1027
  summary: "Single-name corporate CDS from DTCC public dissemination. CDS alone lists the issuers traded in the last 5 days with trade count, last trade, 5Y spread and its 1W and 1M moves through the roll while the level is current, to rank them by (`fn CDS --sort 1m`); past 2,000bp a name is quoted in points upfront (`57.6 pts`), moves too, and ranks after the bp names; with a ticker or issuer, its 5Y spread (level, date, 1W and 1M change, range), its trades and, in `fn`, its daily levels (`fn CDS F --csv --section daily`).",
989
- usage: ["CDS", "CDS F", "gloomberb fn CDS --sort 1m", "gloomberb fn CDS F --csv --section daily"],
1028
+ usage: ["CDS", "CDS F", "gloom fn CDS --sort 1m", "gloom fn CDS F --csv --section daily"],
990
1029
  keys: [OPEN, STEP],
991
1030
  data: same("Delayed, as trades are disseminated"),
992
1031
  bloomberg: ["CDS"],
@@ -1029,7 +1068,7 @@ export const FUNCTION_HELP: Readonly<Record<string, FunctionHelp>> = {
1029
1068
  bloomberg: ["CF"],
1030
1069
  },
1031
1070
  ETF: {
1032
- summary: "A US-listed fund's SEC filings: registration statements and prospectus updates, shareholder reports, N-CEN and N-PORT reports. Open any of them inline.",
1071
+ summary: "A US-listed fund's facts, a leveraged or inverse fund's daily objective among them, then its own SEC filings: registration statements and prospectus updates, shareholder reports, N-CEN and N-PORT reports. Open any of them inline.",
1033
1072
  usage: ["ETF SPY"],
1034
1073
  keys: [OPEN, OPEN_SOURCE],
1035
1074
  data: AS_FILED,
@@ -1088,7 +1127,7 @@ export const FUNCTION_HELP: Readonly<Record<string, FunctionHelp>> = {
1088
1127
  // Run a workspace
1089
1128
  PF: {
1090
1129
  summary: "Your portfolio or watchlist with live quotes, market value, P&L, weights of the total with cash, and sparklines. With target weights set, each holding adds its target, drift and the trade that rebalances it; broker-synced and manual positions sit in the same table.",
1091
- usage: ["PF"],
1130
+ usage: ["PF", "PF Family"],
1092
1131
  keys: [key("a", "dd"), OPEN, key("s", " grid")],
1093
1132
  data: QUOTES,
1094
1133
  bloomberg: [],
@@ -1307,7 +1346,7 @@ export const FUNCTION_HELP: Readonly<Record<string, FunctionHelp>> = {
1307
1346
  bloomberg: [],
1308
1347
  },
1309
1348
  PL: {
1310
- summary: "What Gloomberb is made of: switch built-ins on and off, one by one or by applying a starter pack, and install plugins from GitHub.",
1349
+ summary: "What Gloom is made of: switch built-ins on and off, one by one or by applying a starter pack, and install plugins from GitHub.",
1311
1350
  usage: ["PL"],
1312
1351
  keys: [key("e", "nable"), key("a", "pply pack"), key("i", "nstall"), SEARCH],
1313
1352
  data: null,