gloomberb 0.16.4 → 0.16.6

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 (852) hide show
  1. package/README.md +14 -91
  2. package/package.json +5 -1
  3. package/src/{plugins/builtin/cloud → account}/auth-form.tsx +9 -9
  4. package/src/{plugins/builtin/cloud → account}/auth-model.ts +4 -4
  5. package/src/account/billing.ts +57 -0
  6. package/src/{plugins/builtin/cloud → account}/device-signin-dialog.tsx +18 -12
  7. package/src/{plugins/builtin/cloud → account}/device-signin.ts +2 -2
  8. package/src/{plugins/builtin/cloud → account}/email-auth-attempt.ts +2 -2
  9. package/src/account/session.ts +16 -0
  10. package/src/{plugins/builtin/cloud → account}/upgrade-dialog.tsx +16 -15
  11. package/src/{plugins/builtin/cloud → account}/upgrade-personalization.ts +7 -7
  12. package/src/{plugins/builtin/cloud → account}/upgrade-tickers.ts +6 -6
  13. package/src/{plugins/builtin/cloud → account}/verification-panel.tsx +6 -6
  14. package/src/api-client/central-bank-rates.ts +6 -1
  15. package/src/api-client/chat.ts +26 -0
  16. package/src/api-client/credit-boards.ts +2 -0
  17. package/src/api-client/data.ts +73 -3
  18. package/src/api-client/earnings.ts +6 -0
  19. package/src/api-client/europe-energy.ts +106 -0
  20. package/src/api-client/futures-curve.ts +56 -0
  21. package/src/api-client/index.ts +13 -1
  22. package/src/api-client/market-discovery.ts +13 -1
  23. package/src/api-client/normalizers.ts +32 -0
  24. package/src/api-client/paths.ts +7 -0
  25. package/src/api-client/perps.ts +8 -0
  26. package/src/api-client/request.ts +9 -2
  27. package/src/api-client/research-activity.ts +15 -10
  28. package/src/api-client/socket.ts +29 -0
  29. package/src/api-client/themes.ts +22 -1
  30. package/src/api-client/types.ts +78 -2
  31. package/src/api-client/yield-curves.ts +8 -0
  32. package/src/app/global-shortcuts.ts +50 -2
  33. package/src/app/keybindings/actions.ts +12 -1
  34. package/src/app/pane-runtime/plugin-bindings.ts +2 -2
  35. package/src/app/pane-runtime/ticker-open-runtime.ts +16 -6
  36. package/src/app/runtime/desktop-deeplink.ts +10 -5
  37. package/src/app/runtime/startup.ts +1 -1
  38. package/src/app.tsx +6 -0
  39. package/src/architecture/core-builtin-allowlist.json +8 -26
  40. package/src/ask-gloom/pane-context.ts +114 -0
  41. package/src/ask-gloom/pane-request.ts +70 -0
  42. package/src/ask-gloom/pane-text.ts +201 -0
  43. package/src/brokers/signed-in/sign-in-dialog.tsx +11 -5
  44. package/src/capabilities/chart-series.ts +19 -2
  45. package/src/capabilities/factories.ts +1 -0
  46. package/src/cli/central-bank-events.ts +23 -0
  47. package/src/cli/command-options.ts +17 -5
  48. package/src/cli/commands/crypto-hints.ts +35 -2
  49. package/src/cli/commands/fred-series.ts +146 -0
  50. package/src/cli/commands/market.ts +501 -115
  51. package/src/cli/commands/news-hints.ts +62 -0
  52. package/src/cli/commands/news-search.ts +53 -0
  53. package/src/cli/commands/options-leaps.ts +5 -2
  54. package/src/cli/commands/overview.ts +132 -26
  55. package/src/cli/commands/remote.ts +2 -1
  56. package/src/cli/commands/search.ts +317 -13
  57. package/src/cli/commands/system.ts +55 -8
  58. package/src/cli/commands/ticker.ts +155 -18
  59. package/src/cli/context.ts +45 -14
  60. package/src/cli/desktop-pane-shot.ts +76 -7
  61. package/src/cli/earnings-calendar.ts +71 -0
  62. package/src/cli/errors.ts +7 -5
  63. package/src/cli/exit-codes.ts +8 -0
  64. package/src/cli/export-source.ts +58 -0
  65. package/src/cli/freshness.ts +18 -7
  66. package/src/cli/glossary.ts +483 -0
  67. package/src/cli/help.ts +10 -0
  68. package/src/cli/helpers.ts +2 -5
  69. package/src/cli/history-rows.ts +118 -7
  70. package/src/cli/index-roots.ts +7 -0
  71. package/src/cli/index.ts +29 -9
  72. package/src/cli/known-gaps.ts +84 -0
  73. package/src/cli/listing-arg.ts +551 -97
  74. package/src/cli/not-a-ticker.ts +24 -9
  75. package/src/cli/pane-functions/access-gate.ts +13 -2
  76. package/src/cli/pane-functions/capabilities.ts +4 -3
  77. package/src/cli/pane-functions/catalog.ts +214 -40
  78. package/src/cli/pane-functions/data.ts +42 -8
  79. package/src/cli/pane-functions/discovery.ts +1 -0
  80. package/src/cli/pane-functions/dom.ts +37 -8
  81. package/src/cli/pane-functions/freshness.ts +393 -49
  82. package/src/cli/pane-functions/function-help.ts +31 -15
  83. package/src/cli/pane-functions/headless.ts +98 -30
  84. package/src/cli/pane-functions/index.ts +101 -19
  85. package/src/cli/pane-functions/market-session.ts +22 -8
  86. package/src/cli/pane-functions/options.ts +71 -22
  87. package/src/cli/pane-functions/report-notices.ts +25 -7
  88. package/src/cli/pane-functions/report.ts +15 -8
  89. package/src/cli/pane-functions/resolver.ts +74 -19
  90. package/src/cli/pane-functions/screenshot.ts +250 -27
  91. package/src/cli/perpetual-contract.ts +60 -0
  92. package/src/cli/registry.ts +3 -1
  93. package/src/cli/report-tables.ts +26 -7
  94. package/src/cli/result.ts +45 -11
  95. package/src/cli/series-search.ts +111 -0
  96. package/src/cli/staged-tickers.ts +52 -0
  97. package/src/cli/symbol-args.ts +27 -0
  98. package/src/cli/symbol-list.ts +154 -0
  99. package/src/cli/symbol-rows.ts +154 -0
  100. package/src/cli/ticker-resolution.ts +311 -27
  101. package/src/cli/types.ts +5 -0
  102. package/src/components/chart/composite/axis-overlays.tsx +14 -3
  103. package/src/components/chart/composite/composite-chart.tsx +71 -11
  104. package/src/components/chart/composite/crosshair-readout.tsx +150 -0
  105. package/src/components/chart/composite/downsample.ts +1 -1
  106. package/src/components/chart/composite/format.ts +29 -0
  107. package/src/components/chart/composite/interactions.ts +9 -2
  108. package/src/components/chart/composite/legend.tsx +100 -33
  109. package/src/components/chart/composite/panel-bitmap.ts +70 -35
  110. package/src/components/chart/composite/panel-labels.ts +18 -17
  111. package/src/components/chart/composite/panel-series.ts +1 -0
  112. package/src/components/chart/composite/panel-surface.tsx +46 -21
  113. package/src/components/chart/composite/price-axis-labels.tsx +3 -1
  114. package/src/components/chart/composite/rasterizer.ts +50 -8
  115. package/src/components/chart/composite/scene.ts +2 -1
  116. package/src/components/chart/composite/time-scale.ts +26 -9
  117. package/src/components/chart/composite/types.ts +18 -0
  118. package/src/components/chart/composite/use-composite-viewport.ts +30 -2
  119. package/src/components/chart/native/raster/crosshair.ts +8 -3
  120. package/src/components/chart/native/raster/primitives.ts +85 -21
  121. package/src/components/chart/native/surface/manager.ts +33 -8
  122. package/src/components/chart/surface3d/chart.tsx +1 -1
  123. package/src/components/command-bar/action-runtime.ts +1 -1
  124. package/src/components/command-bar/commands/collection-list.ts +210 -0
  125. package/src/components/command-bar/commands/collection.ts +40 -1
  126. package/src/components/command-bar/commands/direct/index.ts +4 -0
  127. package/src/components/command-bar/commands/registry.ts +8 -0
  128. package/src/components/command-bar/panel/index.tsx +11 -3
  129. package/src/components/command-bar/panel/runtime.ts +3 -0
  130. package/src/components/command-bar/panel/types.ts +2 -0
  131. package/src/components/command-bar/routes/root/plugin-install.ts +4 -4
  132. package/src/components/command-bar/routes/root/provider-search.ts +4 -3
  133. package/src/components/command-bar/routes/ticker-search/results.ts +12 -11
  134. package/src/components/command-bar/routes/ticker-search/route.ts +4 -3
  135. package/src/components/command-bar/routing/actions.ts +1 -1
  136. package/src/components/command-bar/workflow/tickers.ts +42 -17
  137. package/src/components/layout/detached-pane-shell.tsx +68 -39
  138. package/src/components/layout/floating-pane.tsx +10 -1
  139. package/src/components/layout/header.tsx +25 -5
  140. package/src/components/layout/missing-pane.tsx +3 -3
  141. package/src/components/layout/pane/capture-stamp.ts +41 -0
  142. package/src/components/layout/pane/capture-status.ts +12 -0
  143. package/src/components/layout/pane/content.tsx +7 -13
  144. package/src/components/layout/pane/footer/index.tsx +6 -2
  145. package/src/components/layout/pane/footer/keyboard.ts +3 -0
  146. package/src/components/layout/pane/footer/model.ts +41 -1
  147. package/src/components/layout/pane/header.tsx +50 -1
  148. package/src/components/layout/pane/index.tsx +21 -3
  149. package/src/components/layout/pane/sidebar.tsx +88 -21
  150. package/src/components/layout/shell/active-drag.ts +21 -5
  151. package/src/components/layout/shell/cursor-occlusion.ts +2 -1
  152. package/src/components/layout/shell/drag/index.ts +39 -9
  153. package/src/components/layout/shell/drag/live.ts +61 -51
  154. package/src/components/layout/shell/drag/runtime.ts +54 -12
  155. package/src/components/layout/shell/index.tsx +84 -65
  156. package/src/components/layout/shell/menu.ts +14 -1
  157. package/src/components/layout/shell/native/pointer-runtime.ts +3 -1
  158. package/src/components/layout/shell/pane/actions.ts +32 -10
  159. package/src/components/layout/shell/pane/ask.ts +131 -0
  160. package/src/components/layout/shell/pane/capture.ts +162 -0
  161. package/src/components/layout/shell/pane/layers.tsx +218 -50
  162. package/src/components/layout/shell/pane/management-shortcuts.ts +46 -1
  163. package/src/components/layout/shell/shortcuts.ts +21 -4
  164. package/src/components/layout/shell/terminal-pointer-runtime.ts +24 -0
  165. package/src/components/markdown-text.tsx +62 -20
  166. package/src/components/metric-treemap/heat-surface.tsx +8 -1
  167. package/src/components/onboarding/account-step/form-panel.tsx +1 -1
  168. package/src/components/onboarding/account-step/index.tsx +1 -1
  169. package/src/components/onboarding/account-step/qr-panel.tsx +1 -1
  170. package/src/components/onboarding/account-step/signed-in-panel.tsx +1 -1
  171. package/src/components/onboarding/onboarding-keyboard.ts +1 -1
  172. package/src/components/onboarding/onboarding-wizard.tsx +2 -2
  173. package/src/components/onboarding/use-onboarding-upgrade.ts +3 -3
  174. package/src/components/onboarding/wizard-account.ts +2 -2
  175. package/src/components/pane-template-wizard.tsx +9 -1
  176. package/src/components/price-selector-dialog.tsx +11 -2
  177. package/src/components/reader/article-reader.tsx +642 -0
  178. package/src/components/reader/article-text.ts +527 -0
  179. package/src/components/sign-in-gate.tsx +3 -3
  180. package/src/components/ticker/list-table-view.tsx +43 -2
  181. package/src/components/ui/action-row.tsx +2 -1
  182. package/src/components/ui/button.tsx +7 -1
  183. package/src/components/ui/choice-dialog.tsx +6 -4
  184. package/src/components/ui/confirm-dialog.tsx +28 -18
  185. package/src/components/ui/data-table/index.tsx +18 -6
  186. package/src/components/ui/data-table/opentui/index.tsx +37 -6
  187. package/src/components/ui/data-table/types.ts +12 -0
  188. package/src/components/ui/dialog-actions.tsx +64 -0
  189. package/src/components/ui/display.tsx +17 -3
  190. package/src/components/ui/frame.tsx +35 -2
  191. package/src/components/ui/icon.tsx +6 -1
  192. package/src/components/ui/query-bar.tsx +10 -1
  193. package/src/components/ui/text-prompt-dialog.tsx +11 -9
  194. package/src/data/cached-query.ts +2 -0
  195. package/src/data/config/store/migrations.ts +7 -0
  196. package/src/data/config/store/normalize.ts +7 -2
  197. package/src/data/config/store/portfolio-as-of-column.ts +57 -0
  198. package/src/data/ticker-repository.ts +5 -0
  199. package/src/data/ticker-store.ts +15 -0
  200. package/src/docs/content.ts +215 -0
  201. package/src/docs/load.ts +139 -0
  202. package/src/docs/requests.ts +39 -0
  203. package/src/docs/snapshot.chunk.ts +8 -0
  204. package/src/docs/snapshot.json +7555 -0
  205. package/src/docs/topics.ts +216 -0
  206. package/src/i18n/es.ts +65 -5
  207. package/src/i18n/ja.ts +65 -5
  208. package/src/i18n/ko.ts +65 -5
  209. package/src/i18n/zh-cn.ts +65 -5
  210. package/src/i18n/zh-tw.ts +65 -5
  211. package/src/layout/desks.ts +1 -1
  212. package/src/layout/pane-manager/dock-tree.ts +18 -0
  213. package/src/layout/pane-manager/index.ts +1 -0
  214. package/src/layout-marketplace/gallery.tsx +1 -1
  215. package/src/market-data/coordinator/chart.ts +10 -4
  216. package/src/market-data/coordinator/index.ts +6 -3
  217. package/src/{plugins/builtin/futures/contracts.ts → market-data/futures-board.ts} +81 -28
  218. package/src/market-data/futures-contract.ts +151 -0
  219. package/src/market-data/hooks.tsx +10 -2
  220. package/src/market-data/market/format.ts +39 -21
  221. package/src/market-data/market/freshness.ts +84 -20
  222. package/src/market-data/market/session-close-note.ts +3 -2
  223. package/src/market-data/market/status.ts +19 -23
  224. package/src/market-data/published-apac-sessions.ts +23 -1
  225. package/src/market-data/quotes/contributions.ts +5 -0
  226. package/src/market-data/quotes/metadata.ts +19 -24
  227. package/src/market-data/quotes/resolution.ts +5 -0
  228. package/src/market-data/quotes/screener-live-quotes.ts +5 -4
  229. package/src/market-data/result-types.ts +2 -0
  230. package/src/notifications/app-notifier.ts +17 -1
  231. package/src/notifications/notification-log.ts +180 -0
  232. package/src/plugins/auto-update-node.ts +2 -2
  233. package/src/plugins/auto-update.ts +2 -2
  234. package/src/plugins/builtin/account-management/index.tsx +1 -0
  235. package/src/plugins/builtin/account-management/model.ts +1 -56
  236. package/src/plugins/builtin/account-management/pane.tsx +6 -4
  237. package/src/plugins/builtin/account-management/password-dialog.tsx +1 -1
  238. package/src/plugins/builtin/alerts/catalysts.ts +1 -1
  239. package/src/plugins/builtin/alerts/cli.ts +313 -47
  240. package/src/plugins/builtin/alerts/events-pane.tsx +45 -7
  241. package/src/plugins/builtin/alerts/events.ts +23 -2
  242. package/src/plugins/builtin/alerts/focus.ts +27 -0
  243. package/src/plugins/builtin/alerts/history-pane.tsx +7 -2
  244. package/src/plugins/builtin/alerts/history.ts +2 -0
  245. package/src/plugins/builtin/alerts/index.tsx +47 -11
  246. package/src/plugins/builtin/alerts/pane.tsx +27 -1
  247. package/src/plugins/builtin/alerts/research-builder.ts +8 -3
  248. package/src/plugins/builtin/alerts/research-rules.ts +18 -2
  249. package/src/plugins/builtin/alerts/scheduled-check.ts +122 -0
  250. package/src/plugins/builtin/alerts/scheduled-sources.ts +25 -0
  251. package/src/plugins/builtin/alerts/scheduled.ts +254 -0
  252. package/src/plugins/builtin/alerts/targets.ts +92 -0
  253. package/src/plugins/builtin/analytics/index.tsx +8 -3
  254. package/src/plugins/builtin/analytics/risk-headless.ts +60 -27
  255. package/src/plugins/builtin/analytics/risk-math.ts +91 -27
  256. package/src/plugins/builtin/analytics/risk-model.ts +35 -5
  257. package/src/plugins/builtin/analytics/risk-pane.tsx +15 -8
  258. package/src/plugins/builtin/attention/headless.ts +1 -1
  259. package/src/plugins/builtin/attention/index.tsx +2 -0
  260. package/src/plugins/builtin/attention/pane.tsx +3 -1
  261. package/src/plugins/builtin/attention/series.ts +26 -0
  262. package/src/plugins/builtin/awards/headless.ts +88 -18
  263. package/src/plugins/builtin/awards/index.tsx +2 -0
  264. package/src/plugins/builtin/awards/model.ts +41 -1
  265. package/src/plugins/builtin/awards/pane.tsx +22 -13
  266. package/src/plugins/builtin/awards/series.ts +29 -0
  267. package/src/plugins/builtin/backtest/headless.ts +2 -2
  268. package/src/plugins/builtin/bond-calculator/model.ts +2 -1
  269. package/src/plugins/builtin/broker-manager/index.tsx +1 -0
  270. package/src/plugins/builtin/catalysts/headless.ts +1 -1
  271. package/src/plugins/builtin/catalysts/pane.tsx +3 -1
  272. package/src/plugins/builtin/cds/client.ts +49 -12
  273. package/src/plugins/builtin/cds/headless.ts +119 -19
  274. package/src/plugins/builtin/cds/index.tsx +3 -1
  275. package/src/plugins/builtin/cds/model.ts +214 -32
  276. package/src/plugins/builtin/cds/pane.tsx +58 -14
  277. package/src/plugins/builtin/cds/series.ts +19 -0
  278. package/src/plugins/builtin/central-bank-rates/client.ts +4 -0
  279. package/src/plugins/builtin/central-bank-rates/headless.ts +46 -16
  280. package/src/plugins/builtin/central-bank-rates/index.tsx +3 -1
  281. package/src/plugins/builtin/central-bank-rates/model.ts +99 -0
  282. package/src/plugins/builtin/central-bank-rates/pane.tsx +1 -1
  283. package/src/plugins/builtin/central-bank-rates/series.ts +36 -0
  284. package/src/plugins/builtin/chart-composer/catalog-inventory.ts +193 -255
  285. package/src/plugins/builtin/chart-composer/data-catalog-pane.tsx +84 -46
  286. package/src/plugins/builtin/chart-composer/editor.tsx +5 -4
  287. package/src/plugins/builtin/chart-composer/field-series.ts +40 -0
  288. package/src/plugins/builtin/chart-composer/headless-schema.ts +1 -1
  289. package/src/plugins/builtin/chart-composer/headless.ts +70 -5
  290. package/src/plugins/builtin/chart-composer/index.tsx +15 -3
  291. package/src/plugins/builtin/chart-composer/pane.tsx +81 -38
  292. package/src/plugins/builtin/chart-composer/series-catalog.ts +58 -50
  293. package/src/plugins/builtin/chart-composer/series-expression.ts +18 -10
  294. package/src/plugins/builtin/chart-composer/use-series-catalog.ts +59 -3
  295. package/src/plugins/builtin/chart-composer/user-series.ts +84 -0
  296. package/src/plugins/builtin/chat/content/composer-runtime.ts +6 -1
  297. package/src/plugins/builtin/chat/content/composer.tsx +5 -1
  298. package/src/plugins/builtin/chat/content/footer.tsx +12 -0
  299. package/src/plugins/builtin/chat/content/index.tsx +89 -5
  300. package/src/plugins/builtin/chat/content/new-dm-dialog.tsx +10 -2
  301. package/src/plugins/builtin/chat/content/new-messages.tsx +89 -0
  302. package/src/plugins/builtin/chat/content/row-activity.ts +132 -0
  303. package/src/plugins/builtin/chat/content/scroll.ts +127 -27
  304. package/src/plugins/builtin/chat/content/shortcuts.ts +2 -2
  305. package/src/plugins/builtin/chat/content/transcript.tsx +145 -78
  306. package/src/plugins/builtin/chat/content/types.ts +1 -0
  307. package/src/plugins/builtin/chat/controller/fetch.ts +8 -2
  308. package/src/plugins/builtin/chat/controller/index.ts +123 -1
  309. package/src/plugins/builtin/chat/controller/message-loading.ts +3 -0
  310. package/src/plugins/builtin/chat/controller/messages.ts +7 -2
  311. package/src/plugins/builtin/chat/controller/realtime.ts +10 -1
  312. package/src/plugins/builtin/chat/controller/send.ts +61 -1
  313. package/src/plugins/builtin/chat/controller/state.ts +8 -0
  314. package/src/plugins/builtin/chat/ghost-user.ts +20 -0
  315. package/src/plugins/builtin/chat/index.tsx +23 -5
  316. package/src/plugins/builtin/chat/layout.ts +78 -5
  317. package/src/plugins/builtin/chat/message/ai-badge.tsx +18 -0
  318. package/src/plugins/builtin/chat/message/desktop.tsx +55 -6
  319. package/src/plugins/builtin/chat/message/header.tsx +16 -4
  320. package/src/plugins/builtin/chat/message/profile-popover.tsx +5 -1
  321. package/src/plugins/builtin/chat/message/reactions.tsx +210 -0
  322. package/src/plugins/builtin/chat/message/render-state.ts +18 -2
  323. package/src/plugins/builtin/chat/message/terminal.tsx +43 -4
  324. package/src/plugins/builtin/chat/message/types.ts +12 -0
  325. package/src/plugins/builtin/chat/reactions.ts +197 -0
  326. package/src/plugins/builtin/chat/share/flow.tsx +87 -0
  327. package/src/plugins/builtin/chat/share/targets.ts +27 -0
  328. package/src/plugins/builtin/chat/status-widget.tsx +6 -3
  329. package/src/plugins/builtin/chat/unread-inbox-pane.tsx +148 -27
  330. package/src/plugins/builtin/chat/unread-inbox.ts +22 -0
  331. package/src/plugins/builtin/cloud/askg/attached-pane.tsx +69 -0
  332. package/src/plugins/builtin/cloud/askg/controller.ts +111 -19
  333. package/src/plugins/builtin/cloud/askg/executor.ts +57 -3
  334. package/src/plugins/builtin/cloud/askg/manifest.ts +32 -7
  335. package/src/plugins/builtin/cloud/askg/model.ts +27 -8
  336. package/src/plugins/builtin/cloud/askg/pane-attachment.ts +94 -0
  337. package/src/plugins/builtin/cloud/askg/pane.tsx +141 -12
  338. package/src/plugins/builtin/cloud/askg/pending-question.ts +11 -0
  339. package/src/plugins/builtin/cloud/askg/protocol.ts +10 -1
  340. package/src/plugins/builtin/cloud/askg/tool-display.ts +3 -0
  341. package/src/plugins/builtin/cloud/askg/undo.ts +2 -0
  342. package/src/plugins/builtin/cloud/auth-actions.tsx +1 -1
  343. package/src/plugins/builtin/cloud/auth-commands.ts +1 -1
  344. package/src/plugins/builtin/cloud/auth-dialog.tsx +3 -3
  345. package/src/plugins/builtin/cloud/company-picker.tsx +1 -1
  346. package/src/plugins/builtin/cloud/mcp-connect/dialog.tsx +3 -0
  347. package/src/plugins/builtin/cloud/plugin.tsx +19 -2
  348. package/src/plugins/builtin/cloud/team/model.ts +5 -0
  349. package/src/plugins/builtin/cloud/team/module.tsx +1 -0
  350. package/src/plugins/builtin/cloud/team/store.ts +8 -3
  351. package/src/plugins/builtin/cloud/terminal-relay/engine.ts +77 -9
  352. package/src/plugins/builtin/cloud/terminal-relay/manifest.ts +6 -1
  353. package/src/plugins/builtin/cloud/terminal-relay/policy.ts +9 -0
  354. package/src/plugins/builtin/cloud/terminal-relay/prompts.tsx +35 -11
  355. package/src/plugins/builtin/cloud/thesis/exposure.ts +1 -1
  356. package/src/plugins/builtin/cloud/thesis/module.tsx +1 -0
  357. package/src/plugins/builtin/cloud/thesis/prompts.tsx +2 -1
  358. package/src/plugins/builtin/company-attention/app-rank.tsx +1 -1
  359. package/src/plugins/builtin/company-attention/headless.ts +21 -7
  360. package/src/plugins/builtin/company-attention/index.tsx +2 -0
  361. package/src/plugins/builtin/company-attention/model.ts +26 -7
  362. package/src/plugins/builtin/company-attention/pane.tsx +12 -9
  363. package/src/plugins/builtin/company-attention/series.ts +52 -0
  364. package/src/plugins/builtin/company-kpis/headless.ts +97 -10
  365. package/src/plugins/builtin/company-kpis/model.ts +24 -2
  366. package/src/plugins/builtin/company-kpis/pane.tsx +17 -16
  367. package/src/plugins/builtin/composite-plugins.ts +19 -13
  368. package/src/plugins/builtin/connections/index.ts +1 -0
  369. package/src/plugins/builtin/cot/headless.ts +1 -1
  370. package/src/plugins/builtin/cot/index.tsx +3 -1
  371. package/src/plugins/builtin/cot/model.ts +40 -11
  372. package/src/plugins/builtin/cot/series.ts +27 -0
  373. package/src/plugins/builtin/cpi/headless.ts +3 -3
  374. package/src/plugins/builtin/credit-boards/cdx-pane.tsx +10 -1
  375. package/src/plugins/builtin/credit-boards/client.ts +6 -2
  376. package/src/plugins/builtin/credit-boards/headless.ts +108 -31
  377. package/src/plugins/builtin/credit-boards/index.tsx +2 -0
  378. package/src/plugins/builtin/credit-boards/model.ts +11 -1
  379. package/src/plugins/builtin/credit-boards/series.ts +66 -0
  380. package/src/plugins/builtin/credit-conditions/client.ts +12 -9
  381. package/src/plugins/builtin/credit-conditions/headless.ts +13 -2
  382. package/src/plugins/builtin/credit-conditions/index.tsx +18 -9
  383. package/src/plugins/builtin/credit-conditions/model.ts +19 -11
  384. package/src/plugins/builtin/credit-conditions/series.ts +16 -0
  385. package/src/plugins/builtin/credit-documents/headless.ts +33 -3
  386. package/src/plugins/builtin/credit-documents/pane.tsx +3 -1
  387. package/src/plugins/builtin/crypto-board/headless.ts +2 -3
  388. package/src/plugins/builtin/crypto-board/index.tsx +2 -0
  389. package/src/plugins/builtin/crypto-board/model.ts +12 -0
  390. package/src/plugins/builtin/crypto-board/pane.tsx +19 -12
  391. package/src/plugins/builtin/crypto-board/series.ts +48 -0
  392. package/src/plugins/builtin/custom-view/live-quotes.ts +2 -2
  393. package/src/plugins/builtin/debt-maturities/headless.ts +17 -11
  394. package/src/plugins/builtin/debt-maturities/index.tsx +2 -0
  395. package/src/plugins/builtin/debt-maturities/series.ts +45 -0
  396. package/src/plugins/builtin/dividend-yield/client.ts +3 -0
  397. package/src/plugins/builtin/dividend-yield/headless.ts +7 -4
  398. package/src/plugins/builtin/dividend-yield/index.tsx +3 -1
  399. package/src/plugins/builtin/dividend-yield/pane.tsx +3 -1
  400. package/src/plugins/builtin/dividend-yield/series.ts +20 -0
  401. package/src/plugins/builtin/dividend-yield/types.ts +2 -0
  402. package/src/plugins/builtin/docs/blocks.tsx +181 -0
  403. package/src/plugins/builtin/docs/index.tsx +68 -0
  404. package/src/plugins/builtin/docs/pane.tsx +426 -0
  405. package/src/plugins/builtin/docs/targets.ts +72 -0
  406. package/src/plugins/builtin/docs/use-docs.ts +60 -0
  407. package/src/plugins/builtin/doe/headless.ts +12 -8
  408. package/src/plugins/builtin/doe/index.tsx +2 -0
  409. package/src/plugins/builtin/doe/series.ts +62 -0
  410. package/src/plugins/builtin/earnings/client.ts +3 -2
  411. package/src/plugins/builtin/earnings/format.ts +1 -5
  412. package/src/plugins/builtin/earnings/headless.ts +58 -6
  413. package/src/plugins/builtin/earnings/history-model.ts +15 -1
  414. package/src/plugins/builtin/earnings/history-table.ts +13 -2
  415. package/src/plugins/builtin/earnings/history.tsx +7 -3
  416. package/src/plugins/builtin/earnings/index.tsx +9 -0
  417. package/src/plugins/builtin/earnings-calls/headless.ts +28 -2
  418. package/src/plugins/builtin/earnings-calls/index.tsx +1 -1
  419. package/src/plugins/builtin/earnings-ripple/index.tsx +2 -0
  420. package/src/plugins/builtin/econ/fred-catalog.ts +198 -0
  421. package/src/plugins/builtin/econ/fred-series-map.ts +0 -46
  422. package/src/plugins/builtin/econ/index.tsx +2 -0
  423. package/src/plugins/builtin/econ-statistics/defs.ts +5 -0
  424. package/src/plugins/builtin/econ-statistics/headless.ts +19 -4
  425. package/src/plugins/builtin/econ-statistics/stats.ts +1 -0
  426. package/src/plugins/builtin/equity-screener/headless.ts +3 -3
  427. package/src/plugins/builtin/equity-screener/pane.tsx +4 -11
  428. package/src/plugins/builtin/estimate-revisions/headless.ts +3 -3
  429. package/src/plugins/builtin/exposure/drivers.ts +13 -0
  430. package/src/plugins/builtin/exposure/headless.ts +205 -13
  431. package/src/plugins/builtin/exposure/holdings.ts +1 -1
  432. package/src/plugins/builtin/exposure/index.tsx +1 -0
  433. package/src/plugins/builtin/exposure/model.ts +23 -3
  434. package/src/plugins/builtin/exposure/pane.tsx +14 -12
  435. package/src/plugins/builtin/fear-greed/index.tsx +18 -10
  436. package/src/plugins/builtin/fear-greed/series.ts +52 -0
  437. package/src/plugins/builtin/futures/index.tsx +43 -3
  438. package/src/plugins/builtin/futures/model.ts +1 -1
  439. package/src/plugins/builtin/futures/returns.ts +1 -1
  440. package/src/plugins/builtin/futures/series.ts +13 -0
  441. package/src/plugins/builtin/futures/table.tsx +1 -1
  442. package/src/plugins/builtin/futures/use-front-returns.ts +1 -1
  443. package/src/plugins/builtin/futures-curve/client.ts +12 -3
  444. package/src/plugins/builtin/futures-curve/headless.ts +71 -10
  445. package/src/plugins/builtin/futures-curve/index.tsx +1 -1
  446. package/src/plugins/builtin/futures-curve/model.ts +66 -11
  447. package/src/plugins/builtin/futures-curve/pane.tsx +52 -18
  448. package/src/plugins/builtin/fx-matrix/client.ts +63 -0
  449. package/src/plugins/builtin/fx-matrix/export.ts +2 -1
  450. package/src/plugins/builtin/fx-matrix/headless.ts +154 -0
  451. package/src/plugins/builtin/fx-matrix/index.tsx +4 -4
  452. package/src/plugins/builtin/gpu/board.tsx +13 -10
  453. package/src/plugins/builtin/gpu/changes.tsx +4 -4
  454. package/src/plugins/builtin/gpu/client.ts +19 -1
  455. package/src/plugins/builtin/gpu/equities.tsx +14 -10
  456. package/src/plugins/builtin/gpu/headless.ts +58 -27
  457. package/src/plugins/builtin/gpu/history.tsx +3 -3
  458. package/src/plugins/builtin/gpu/index.tsx +2 -0
  459. package/src/plugins/builtin/gpu/model.ts +101 -16
  460. package/src/plugins/builtin/gpu/pane.tsx +28 -12
  461. package/src/plugins/builtin/gpu/series.ts +38 -0
  462. package/src/plugins/builtin/help/function-card.tsx +25 -6
  463. package/src/plugins/builtin/help/function-index.ts +2 -0
  464. package/src/plugins/builtin/help/index.tsx +31 -9
  465. package/src/plugins/builtin/holders/beneficial-model.ts +90 -3
  466. package/src/plugins/builtin/holders/beneficial-report.ts +57 -5
  467. package/src/plugins/builtin/holders/beneficial-view.tsx +55 -11
  468. package/src/plugins/builtin/holders/client.ts +22 -3
  469. package/src/plugins/builtin/holders/format.ts +18 -3
  470. package/src/plugins/builtin/holders/headless.ts +36 -133
  471. package/src/plugins/builtin/holders/pane.tsx +11 -4
  472. package/src/plugins/builtin/holders/report-header.ts +40 -5
  473. package/src/plugins/builtin/holders/report-rows.ts +240 -0
  474. package/src/plugins/builtin/insider/client.ts +35 -20
  475. package/src/plugins/builtin/insider/headless.ts +41 -11
  476. package/src/plugins/builtin/insider/index.tsx +26 -9
  477. package/src/plugins/builtin/insider/insider-data.ts +10 -0
  478. package/src/plugins/builtin/insider/issuer.ts +49 -0
  479. package/src/plugins/builtin/insider/model.ts +3 -0
  480. package/src/plugins/builtin/ipo-calendar/headless.ts +1 -1
  481. package/src/plugins/builtin/iv-history/client.ts +20 -6
  482. package/src/plugins/builtin/iv-history/format.ts +9 -0
  483. package/src/plugins/builtin/iv-history/headless.ts +56 -21
  484. package/src/plugins/builtin/iv-history/index.tsx +2 -0
  485. package/src/plugins/builtin/iv-history/model.ts +143 -8
  486. package/src/plugins/builtin/iv-history/screen-pane.tsx +5 -9
  487. package/src/plugins/builtin/iv-history/series.ts +29 -0
  488. package/src/plugins/builtin/jobs/headless.ts +26 -3
  489. package/src/plugins/builtin/jobs/index.tsx +3 -1
  490. package/src/plugins/builtin/jobs/series.ts +19 -0
  491. package/src/plugins/builtin/kelly-sizer/index.tsx +2 -0
  492. package/src/plugins/builtin/kelly-sizer/pane.tsx +2 -1
  493. package/src/plugins/builtin/kelly-sizer/portfolio.ts +0 -39
  494. package/src/plugins/builtin/macro-day/client.ts +44 -3
  495. package/src/plugins/builtin/macro-day/headless.ts +13 -10
  496. package/src/plugins/builtin/macro-day/model.ts +56 -10
  497. package/src/plugins/builtin/macro-day/pane.tsx +30 -20
  498. package/src/plugins/builtin/market-heatmap/headless.ts +20 -5
  499. package/src/plugins/builtin/market-heatmap/index.tsx +6 -0
  500. package/src/plugins/builtin/market-heatmap/model.ts +19 -11
  501. package/src/plugins/builtin/market-heatmap/portfolio.ts +2 -2
  502. package/src/plugins/builtin/market-movers/client.ts +7 -5
  503. package/src/plugins/builtin/market-movers/index.tsx +3 -2
  504. package/src/plugins/builtin/market-movers/model.ts +30 -0
  505. package/src/plugins/builtin/market-movers/screener.ts +31 -0
  506. package/src/plugins/builtin/market-valuation/chart-series.ts +29 -69
  507. package/src/plugins/builtin/market-valuation/index.tsx +3 -3
  508. package/src/plugins/builtin/market-valuation/indicators.ts +0 -5
  509. package/src/plugins/builtin/members/headless.ts +8 -3
  510. package/src/plugins/builtin/members/model.ts +31 -3
  511. package/src/plugins/builtin/members/pane.tsx +6 -8
  512. package/src/plugins/builtin/mna/distress/headless.ts +4 -4
  513. package/src/plugins/builtin/mna/headless.ts +18 -6
  514. package/src/plugins/builtin/money-markets/headless.ts +5 -4
  515. package/src/plugins/builtin/money-markets/index.tsx +2 -0
  516. package/src/plugins/builtin/money-markets/series.ts +41 -0
  517. package/src/plugins/builtin/news/index.tsx +0 -2
  518. package/src/plugins/builtin/news/wire/news/detail-view.tsx +53 -104
  519. package/src/plugins/builtin/news/wire/news/footer.ts +2 -25
  520. package/src/plugins/builtin/news/wire/news/preset-pane.tsx +0 -2
  521. package/src/plugins/builtin/notes/cli.ts +12 -7
  522. package/src/plugins/builtin/notes/index.tsx +1 -0
  523. package/src/plugins/builtin/options/index.tsx +3 -0
  524. package/src/plugins/builtin/options/view.tsx +1 -1
  525. package/src/plugins/builtin/options-calculator/inputs.ts +2 -1
  526. package/src/plugins/builtin/options-positioning/client.ts +7 -3
  527. package/src/plugins/builtin/options-positioning/headless.ts +4 -3
  528. package/src/plugins/builtin/options-positioning/pane.tsx +2 -2
  529. package/src/plugins/builtin/options-scenario/client.ts +2 -1
  530. package/src/plugins/builtin/options-scenario/headless.ts +1 -0
  531. package/src/plugins/builtin/options-scenario/hedge.ts +2 -1
  532. package/src/plugins/builtin/perps/client.ts +90 -16
  533. package/src/plugins/builtin/perps/equity-row.tsx +52 -17
  534. package/src/plugins/builtin/perps/freshness.ts +66 -0
  535. package/src/plugins/builtin/perps/headless.ts +47 -32
  536. package/src/plugins/builtin/perps/index.tsx +23 -4
  537. package/src/plugins/builtin/perps/list-perpetuals.ts +118 -0
  538. package/src/plugins/builtin/perps/model.ts +20 -5
  539. package/src/plugins/builtin/perps/open-market.ts +15 -0
  540. package/src/plugins/builtin/perps/pane.tsx +76 -20
  541. package/src/plugins/builtin/perps/series.ts +76 -0
  542. package/src/plugins/builtin/plugin-marketplace/index.tsx +1 -1
  543. package/src/plugins/builtin/plugin-marketplace/pane.tsx +73 -67
  544. package/src/plugins/builtin/plugin-module.ts +3 -0
  545. package/src/plugins/builtin/portfolio-list/account-metrics.ts +1 -1
  546. package/src/plugins/builtin/portfolio-list/allocation.ts +5 -4
  547. package/src/plugins/builtin/portfolio-list/cell-version.ts +8 -1
  548. package/src/plugins/builtin/portfolio-list/cli/bulk-symbols.ts +161 -0
  549. package/src/plugins/builtin/portfolio-list/cli/import-13f.ts +109 -0
  550. package/src/plugins/builtin/portfolio-list/cli/portfolio-command.ts +384 -74
  551. package/src/plugins/builtin/portfolio-list/cli/render.ts +437 -71
  552. package/src/plugins/builtin/portfolio-list/cli/shared.ts +21 -4
  553. package/src/plugins/builtin/portfolio-list/cli/watchlist-command.ts +121 -47
  554. package/src/plugins/builtin/portfolio-list/column-values.ts +104 -26
  555. package/src/plugins/builtin/portfolio-list/grid.tsx +1 -1
  556. package/src/plugins/builtin/portfolio-list/headless.ts +84 -18
  557. package/src/plugins/builtin/portfolio-list/imported-from.ts +8 -0
  558. package/src/plugins/builtin/portfolio-list/index.tsx +5 -1
  559. package/src/plugins/builtin/portfolio-list/live-valuation.ts +6 -2
  560. package/src/plugins/builtin/portfolio-list/mutations.ts +2 -9
  561. package/src/plugins/builtin/portfolio-list/pane/data.ts +5 -1
  562. package/src/plugins/builtin/portfolio-list/pane/index.tsx +52 -9
  563. package/src/plugins/builtin/portfolio-list/quick-add/index.tsx +33 -11
  564. package/src/plugins/builtin/portfolio-list/quick-add/resolution.ts +21 -1
  565. package/src/plugins/builtin/portfolio-list/settings.ts +17 -0
  566. package/src/plugins/builtin/portfolio-list/summary/index.tsx +12 -0
  567. package/src/plugins/builtin/portfolio-list/summary/totals.ts +9 -4
  568. package/src/plugins/builtin/portfolio-list/table.tsx +37 -7
  569. package/src/plugins/builtin/power/client.ts +16 -0
  570. package/src/plugins/builtin/power/evidence.ts +63 -10
  571. package/src/plugins/builtin/power/headless.ts +77 -9
  572. package/src/plugins/builtin/power/index.tsx +28 -3
  573. package/src/plugins/builtin/power/model.ts +73 -2
  574. package/src/plugins/builtin/power/pane.tsx +37 -9
  575. package/src/plugins/builtin/power/prices-client.ts +139 -0
  576. package/src/plugins/builtin/power/prices-headless.ts +137 -0
  577. package/src/plugins/builtin/power/prices-model.ts +103 -0
  578. package/src/plugins/builtin/power/prices.tsx +179 -0
  579. package/src/plugins/builtin/rate-path/headless.ts +46 -18
  580. package/src/plugins/builtin/realized-vol/headless.ts +5 -0
  581. package/src/plugins/builtin/relative-rotation/headless.ts +3 -3
  582. package/src/plugins/builtin/research/corporate-actions-pane.tsx +5 -2
  583. package/src/plugins/builtin/research/event-model.ts +68 -24
  584. package/src/plugins/builtin/research/events-headless.ts +2 -1
  585. package/src/plugins/builtin/research/headless.ts +2 -1
  586. package/src/plugins/builtin/research/index.tsx +2 -0
  587. package/src/plugins/builtin/research-search/article.ts +65 -0
  588. package/src/plugins/builtin/research-search/document-view.tsx +33 -215
  589. package/src/plugins/builtin/research-search/model.ts +0 -9
  590. package/src/plugins/builtin/research-search/pane.tsx +41 -30
  591. package/src/plugins/builtin/research-search/snippet.ts +0 -29
  592. package/src/plugins/builtin/revenue-breakdown/headless.ts +18 -6
  593. package/src/plugins/builtin/seasonality/client.ts +15 -7
  594. package/src/plugins/builtin/seasonality/headless.ts +36 -12
  595. package/src/plugins/builtin/seasonality/index.tsx +2 -2
  596. package/src/plugins/builtin/seasonality/model.ts +119 -0
  597. package/src/plugins/builtin/seasonality/pane.tsx +108 -37
  598. package/src/plugins/builtin/sec/headless.ts +25 -3
  599. package/src/plugins/builtin/sec/index.tsx +2 -1
  600. package/src/plugins/builtin/series-inventory.ts +93 -0
  601. package/src/plugins/builtin/shared/cloud-denied.ts +15 -0
  602. package/src/plugins/builtin/shared/cloud-upgrade.ts +1 -1
  603. package/src/plugins/builtin/shared/command-tab.ts +30 -12
  604. package/src/plugins/builtin/shared/earnings-report.ts +55 -0
  605. package/src/plugins/builtin/shared/fred-points.ts +20 -0
  606. package/src/plugins/builtin/shared/free-preview.ts +47 -0
  607. package/src/plugins/builtin/shared/fx-rate-freshness.ts +101 -0
  608. package/src/plugins/builtin/shared/open-description.ts +29 -0
  609. package/src/plugins/builtin/shared/report-freshness.ts +12 -1
  610. package/src/plugins/builtin/shared/series-warning.ts +5 -0
  611. package/src/plugins/builtin/shared/volatility/options.ts +4 -1
  612. package/src/plugins/builtin/short-interest/headless.ts +1 -0
  613. package/src/plugins/builtin/short-interest/index.tsx +2 -0
  614. package/src/plugins/builtin/short-interest/series.ts +36 -0
  615. package/src/plugins/builtin/short-interest/watch-headless.ts +3 -2
  616. package/src/plugins/builtin/short-interest/watch-model.ts +9 -5
  617. package/src/plugins/builtin/short-volume/headless.ts +2 -1
  618. package/src/plugins/builtin/short-volume/index.tsx +2 -0
  619. package/src/plugins/builtin/short-volume/series.ts +23 -0
  620. package/src/plugins/builtin/social-mentions/headless.ts +1 -1
  621. package/src/plugins/builtin/social-mentions/index.tsx +2 -0
  622. package/src/plugins/builtin/social-mentions/series.ts +23 -0
  623. package/src/plugins/builtin/supply-chain/graph-pane.tsx +3 -2
  624. package/src/plugins/builtin/supply-chain/headless.ts +43 -11
  625. package/src/plugins/builtin/supply-chain/model.ts +13 -0
  626. package/src/plugins/builtin/supply-chain/pane.tsx +8 -6
  627. package/src/plugins/builtin/themes/headless.ts +74 -10
  628. package/src/plugins/builtin/themes/model.ts +71 -4
  629. package/src/plugins/builtin/themes/pane.tsx +22 -5
  630. package/src/plugins/builtin/thirteenf/api.ts +1 -0
  631. package/src/plugins/builtin/thirteenf/data.ts +6 -4
  632. package/src/plugins/builtin/thirteenf/headless.ts +217 -36
  633. package/src/plugins/builtin/thirteenf/model.ts +39 -1
  634. package/src/plugins/builtin/thirteenf/overlap.ts +75 -0
  635. package/src/plugins/builtin/thirteenf/pane.tsx +10 -1
  636. package/src/plugins/builtin/thirteenf/report-notes.ts +103 -1
  637. package/src/plugins/builtin/thirteenf/types.ts +2 -0
  638. package/src/plugins/builtin/ticker-detail/data-panes/returns-history.ts +114 -0
  639. package/src/plugins/builtin/ticker-detail/data-panes/returns-model.ts +57 -2
  640. package/src/plugins/builtin/ticker-detail/data-panes/returns-pane.tsx +19 -55
  641. package/src/plugins/builtin/ticker-detail/headless-schema.ts +30 -0
  642. package/src/plugins/builtin/ticker-detail/headless.ts +86 -0
  643. package/src/plugins/builtin/ticker-detail/index.tsx +26 -11
  644. package/src/plugins/builtin/ticker-detail/overview/components.tsx +1 -1
  645. package/src/plugins/builtin/ticker-detail/overview/futures-contract.ts +31 -0
  646. package/src/plugins/builtin/ticker-detail/overview/model.ts +3 -3
  647. package/src/plugins/builtin/ticker-detail/overview/pane.tsx +2 -1
  648. package/src/plugins/builtin/ticker-detail/overview-tab.tsx +49 -5
  649. package/src/plugins/builtin/ticker-detail/quote-monitor/index.tsx +13 -3
  650. package/src/plugins/builtin/time-sales/headless.ts +2 -1
  651. package/src/plugins/builtin/time-sales/index.tsx +2 -1
  652. package/src/plugins/builtin/treasury-auctions/headless.ts +16 -2
  653. package/src/plugins/builtin/treasury-auctions/index.tsx +1 -0
  654. package/src/plugins/builtin/treasury-auctions/model.ts +8 -0
  655. package/src/plugins/builtin/vol-surface/evidence.ts +7 -1
  656. package/src/plugins/builtin/vol-surface/headless.ts +51 -17
  657. package/src/plugins/builtin/vol-surface/heat-grid.tsx +113 -0
  658. package/src/plugins/builtin/vol-surface/model.ts +39 -6
  659. package/src/plugins/builtin/vol-surface/pane.tsx +14 -13
  660. package/src/plugins/builtin/vol-surface/stored.ts +63 -3
  661. package/src/plugins/builtin/vol-surface/surface.tsx +30 -2
  662. package/src/plugins/builtin/volatility/index.tsx +2 -0
  663. package/src/plugins/builtin/volatility/series.ts +84 -0
  664. package/src/plugins/builtin/world-venue-map/basemap-layer.tsx +6 -5
  665. package/src/plugins/builtin/world-venue-map/basemap.ts +6 -3
  666. package/src/plugins/builtin/world-venue-map/geo-draw.tsx +2 -1
  667. package/src/plugins/builtin/world-venue-map/geo-series.ts +26 -1
  668. package/src/plugins/builtin/world-venue-map/geo-svg.tsx +6 -6
  669. package/src/plugins/builtin/world-venue-map/headless.ts +4 -1
  670. package/src/plugins/builtin/world-venue-map/index.ts +2 -1
  671. package/src/plugins/builtin/world-venue-map/layered-pane.tsx +24 -13
  672. package/src/plugins/builtin/world-venue-map/layers.ts +29 -0
  673. package/src/plugins/builtin/world-venue-map/map.tsx +144 -13
  674. package/src/plugins/builtin/world-venue-map/model.ts +56 -19
  675. package/src/plugins/builtin/world-venue-map/pane.tsx +5 -2
  676. package/src/plugins/builtin/yield-curve/chart.ts +2 -2
  677. package/src/plugins/builtin/yield-curve/curves.ts +21 -8
  678. package/src/plugins/builtin/yield-curve/headless.ts +71 -18
  679. package/src/plugins/builtin/yield-curve/index.tsx +4 -2
  680. package/src/plugins/builtin/yield-curve/series.ts +86 -0
  681. package/src/plugins/catalog-browser.ts +2 -1
  682. package/src/plugins/installer.ts +2 -2
  683. package/src/plugins/loader.ts +15 -0
  684. package/src/plugins/manager-node.ts +1 -1
  685. package/src/plugins/{builtin/plugin-marketplace → marketplace}/feed.ts +2 -2
  686. package/src/plugins/{builtin/plugin-marketplace → marketplace}/model.ts +6 -6
  687. package/src/plugins/{builtin/plugin-marketplace → marketplace}/store.ts +1 -1
  688. package/src/plugins/registry/host-actions.ts +11 -0
  689. package/src/plugins/registry/index.ts +89 -4
  690. package/src/portfolio/collection-name.ts +31 -0
  691. package/src/{plugins/builtin/portfolio-list → portfolio}/position-metrics.ts +6 -6
  692. package/src/portfolio/position-value.ts +40 -0
  693. package/src/portfolio/valuation-basis.ts +79 -0
  694. package/src/public/__snapshots__/public-api.test.ts.snap +7 -0
  695. package/src/public/time-series.ts +17 -0
  696. package/src/react/auto-refresh.ts +13 -3
  697. package/src/react/input.ts +33 -1
  698. package/src/react/key-repeat.ts +86 -0
  699. package/src/remote/app-host.tsx +20 -4
  700. package/src/remote/confirm-change.tsx +85 -0
  701. package/src/remote/controller-utils.ts +8 -1
  702. package/src/remote/controller.ts +144 -7
  703. package/src/remote/pane-screenshot.ts +47 -0
  704. package/src/remote/schema.ts +65 -2
  705. package/src/remote/types.ts +30 -0
  706. package/src/remote/watchlist.ts +306 -0
  707. package/src/renderers/browser/main.tsx +4 -3
  708. package/src/renderers/browser/research-entry.ts +4 -2
  709. package/src/renderers/cloudflare/worker.ts +1 -1
  710. package/src/renderers/dom/data-table/frozen-column.ts +3 -1
  711. package/src/renderers/dom/data-table/index.tsx +33 -6
  712. package/src/renderers/dom/data-table/row.tsx +30 -1
  713. package/src/renderers/dom/desktop/control-styles.ts +63 -1
  714. package/src/renderers/dom/desktop/controls.tsx +30 -23
  715. package/src/renderers/dom/desktop/dialog-actions.tsx +170 -0
  716. package/src/renderers/dom/desktop/icons.tsx +16 -0
  717. package/src/renderers/dom/dom-ui-host.tsx +3 -0
  718. package/src/renderers/dom/host/block-glyph-canvas.tsx +6 -3
  719. package/src/renderers/dom/host/box.tsx +8 -0
  720. package/src/renderers/dom/host/chart-surface.tsx +33 -2
  721. package/src/renderers/dom/host/live-frame.ts +6 -2
  722. package/src/renderers/dom/host/overflow-fade.ts +14 -1
  723. package/src/renderers/dom/host/scroll-box.tsx +32 -0
  724. package/src/renderers/dom/host/size-observer.ts +41 -0
  725. package/src/renderers/dom/host/sticky-scroll.ts +128 -0
  726. package/src/renderers/dom/host/style.ts +1 -1
  727. package/src/renderers/dom/host/surface-3d.tsx +19 -7
  728. package/src/renderers/dom/host/surface-fit.ts +406 -0
  729. package/src/renderers/dom/host/text.tsx +1 -1
  730. package/src/renderers/dom/input-host.tsx +1 -0
  731. package/src/renderers/dom/styles.css +102 -5
  732. package/src/renderers/electrobun/bun/application-menu/click.ts +18 -0
  733. package/src/renderers/electrobun/bun/index.ts +3 -2
  734. package/src/renderers/electrobun/shared/protocol.ts +1 -1
  735. package/src/renderers/electrobun/view/cli-pane-shot-entry.tsx +29 -2
  736. package/src/renderers/electrobun/view/cli-pane-shot-frame.tsx +63 -20
  737. package/src/renderers/electrobun/view/cli-pane-shot-health.ts +10 -26
  738. package/src/renderers/electrobun/view/main.tsx +5 -3
  739. package/src/renderers/electrobun/view/remote/asset-data-client.ts +2 -0
  740. package/src/renderers/opentui/chart-surface.tsx +1 -0
  741. package/src/renderers/opentui/frame-capture.ts +33 -0
  742. package/src/renderers/opentui/host.tsx +10 -13
  743. package/src/renderers/opentui/pane-image/glyphs-license.txt +107 -0
  744. package/src/renderers/opentui/pane-image/glyphs.json +1 -0
  745. package/src/renderers/opentui/pane-image/index.ts +107 -0
  746. package/src/renderers/opentui/pane-image/raster.ts +428 -0
  747. package/src/renderers/opentui/start.tsx +3 -3
  748. package/src/renderers/opentui/test-utils.tsx +3 -0
  749. package/src/renderers/opentui/ui-host.tsx +29 -1
  750. package/src/series/capability.ts +75 -0
  751. package/src/series/csv.ts +160 -0
  752. package/src/series/files.ts +107 -0
  753. package/src/series/registry.ts +198 -0
  754. package/src/series/resolve.ts +108 -0
  755. package/src/series/standalone.ts +48 -0
  756. package/src/series/types.ts +153 -0
  757. package/src/series/validate.ts +171 -0
  758. package/src/shares/chat.ts +34 -0
  759. package/src/shares/dialog.tsx +295 -0
  760. package/src/shares/flow.tsx +56 -0
  761. package/src/shares/live.ts +14 -22
  762. package/src/shares/pane-image.ts +152 -0
  763. package/src/shares/personal-pane.ts +64 -0
  764. package/src/shares/portable-layout.ts +4 -2
  765. package/src/shares/prepare.ts +20 -0
  766. package/src/sources/gloomberb-cloud/index.ts +109 -10
  767. package/src/sources/gloomberb-cloud/normalizers.ts +3 -0
  768. package/src/sources/gloomberb-cloud/perpetuals.ts +249 -0
  769. package/src/sources/history-result.ts +1 -0
  770. package/src/sources/history-retention.ts +11 -0
  771. package/src/sources/listing-symbols.ts +4 -1
  772. package/src/sources/listing-target.ts +4 -0
  773. package/src/sources/provider-router/batches.ts +4 -1
  774. package/src/sources/provider-router/cache.ts +4 -2
  775. package/src/sources/provider-router/cached-routes.ts +1 -1
  776. package/src/sources/provider-router/financial-routes.ts +1 -0
  777. package/src/sources/provider-router/financials.ts +13 -0
  778. package/src/sources/provider-router/history.ts +43 -25
  779. package/src/sources/provider-router/index.ts +14 -0
  780. package/src/sources/provider-router/search.ts +1 -0
  781. package/src/state/hooks/inline-tickers.ts +49 -11
  782. package/src/sync/core-contributors.ts +1 -0
  783. package/src/test-support/shell-pane-keys.tsx +1 -0
  784. package/src/theme/theme-context.tsx +15 -1
  785. package/src/tickers/company-name.ts +75 -0
  786. package/src/tickers/instrument-kind.ts +34 -1
  787. package/src/tickers/listing-name.ts +34 -0
  788. package/src/tickers/listing-venues.ts +132 -0
  789. package/src/tickers/open-target.ts +13 -4
  790. package/src/tickers/perpetual-listing.ts +151 -0
  791. package/src/tickers/prediction-listing.ts +26 -0
  792. package/src/tickers/search/index.ts +72 -11
  793. package/src/tickers/search/ranking.ts +98 -20
  794. package/src/tickers/search/types.ts +7 -1
  795. package/src/tickers/ticker-changes.ts +213 -0
  796. package/src/tickers/us-listing.ts +34 -0
  797. package/src/time-series/economic.ts +2 -6
  798. package/src/time-series/hooks.ts +9 -0
  799. package/src/time-series/ice-credit.ts +39 -0
  800. package/src/time-series/resolve.ts +211 -29
  801. package/src/time-series/studies.ts +1 -0
  802. package/src/time-series/types.ts +12 -2
  803. package/src/time-series/use-chart-resolution.ts +32 -0
  804. package/src/types/config.ts +10 -2
  805. package/src/types/data-provider.ts +11 -0
  806. package/src/types/financials.ts +62 -1
  807. package/src/types/headless.ts +113 -0
  808. package/src/types/instrument.ts +4 -0
  809. package/src/types/plugin.ts +52 -2
  810. package/src/types/price-history.ts +7 -0
  811. package/src/types/ticker-changes.ts +26 -0
  812. package/src/types/ticker.ts +14 -0
  813. package/src/ui/context-menu.tsx +13 -1
  814. package/src/ui/host.tsx +57 -3
  815. package/src/ui/live-resize.ts +91 -0
  816. package/src/ui/live-stretch.ts +153 -0
  817. package/src/ui/measured-cells.ts +58 -0
  818. package/src/ui/sticky-scroll.ts +7 -0
  819. package/src/utils/basis-points.ts +17 -0
  820. package/src/utils/central-banks.ts +76 -0
  821. package/src/utils/cli-output.ts +131 -15
  822. package/src/utils/concurrency.ts +25 -0
  823. package/src/utils/crypto-pair.ts +20 -0
  824. package/src/utils/currency-pair.ts +19 -0
  825. package/src/utils/currency-units.ts +11 -0
  826. package/src/utils/datetime-format.ts +27 -6
  827. package/src/utils/decimal-comma.ts +19 -0
  828. package/src/utils/dom-screenshot-css.ts +265 -0
  829. package/src/utils/dom-screenshot-rasters.ts +276 -0
  830. package/src/utils/dom-screenshot.ts +439 -52
  831. package/src/utils/double-escape-close.ts +15 -1
  832. package/src/utils/exchange-rate-snapshot.ts +6 -2
  833. package/src/utils/exchanges.ts +143 -1
  834. package/src/utils/format.ts +35 -5
  835. package/src/utils/forward-dividend.ts +14 -0
  836. package/src/utils/fundamentals.ts +66 -0
  837. package/src/utils/futures-generic.ts +6 -12
  838. package/src/utils/fx-market-hours.ts +15 -5
  839. package/src/utils/fx-status.ts +6 -1
  840. package/src/utils/inline-content-tokenizer.ts +22 -3
  841. package/src/utils/market-capitalization.ts +8 -0
  842. package/src/utils/one-shot.ts +73 -0
  843. package/src/utils/options.ts +37 -8
  844. package/src/utils/price-history.ts +99 -42
  845. package/src/utils/sec-eps-basis.ts +24 -11
  846. package/src/utils/sec.ts +61 -7
  847. package/src/utils/utc-time.ts +63 -4
  848. package/src/plugins/builtin/fx-matrix/freshness.ts +0 -65
  849. /package/src/plugins/{builtin/plugin-marketplace → marketplace}/activation.ts +0 -0
  850. /package/src/plugins/{builtin/plugin-marketplace → marketplace}/ids.ts +0 -0
  851. /package/src/plugins/{builtin/plugin-marketplace → marketplace}/packs.ts +0 -0
  852. /package/src/{plugins/builtin/cloud → tickers}/starter-symbols.ts +0 -0
@@ -1,6 +1,7 @@
1
- import type { CloudCdsHistoryPointPayload, CloudCdsTradePayload } from "../../../api-client";
1
+ import type { CloudCdsHistoryPointPayload, CloudCdsLevelPayload, CloudCdsTradePayload } from "../../../api-client";
2
2
  import type { DataTableColumn, StatItem } from "../../../components";
3
3
  import type { TimeSeriesPoint } from "../../../time-series/types";
4
+ import type { HeadlessPaneFreshness } from "../../../types/headless";
4
5
  import type { TickerRecord } from "../../../types/ticker";
5
6
  import { formatCompact } from "../../../utils/format";
6
7
  import { compareSortValues, type SortPreference } from "../../../utils/sort-values";
@@ -45,7 +46,11 @@ export interface CdsIssuerSummary {
45
46
  issuer: string;
46
47
  trades: number;
47
48
  lastTradeAt: number;
49
+ /** The newest spread a trade reported, when any did. */
48
50
  latestSpreadBp: number | null;
51
+ /** The latest level of the issuer's 5Y line and its date, where it has one: what the list ranks by. */
52
+ spread5yBp: number | null;
53
+ spread5yDate: string | null;
49
54
  }
50
55
 
51
56
  /**
@@ -119,6 +124,32 @@ export function issuerGroupKey(name: string): string {
119
124
  return (meaningful.length > 0 ? meaningful : tokens).join(" ") || name.trim().toLowerCase();
120
125
  }
121
126
 
127
+ /**
128
+ * DTCC writes a comma inside a field as `;` ("CCO Holdings;LLC",
129
+ * "Amazon.com;Inc."), so a name gets its comma back before it is shown,
130
+ * grouped or sent as a query.
131
+ */
132
+ export function displayIssuerName(name: string): string {
133
+ return name.replace(/\s*;\s*/g, ", ").trim();
134
+ }
135
+
136
+ /**
137
+ * What a listing's name says about the security rather than the company:
138
+ * share class, stock or receipt type. The tape names issuers, never their
139
+ * shares, so "Alphabet Inc. Class A Common Stock" has to become "Alphabet Inc.".
140
+ */
141
+ const SECURITY_SUFFIX = /[\s,-]+(?:(?:class|series)\s+[a-z0-9]{1,2}|common|ordinary|stock|shares?|(?:american\s+)?(?:depositary|depository)(?:\s+(?:shares?|receipts?))?|ads|adrs?)$/i;
142
+
143
+ /** The issuer a listing's name stands for, as the tape would name it: its comma back, its share class gone. */
144
+ export function issuerNameOf(name: string): string {
145
+ let current = displayIssuerName(name);
146
+ for (;;) {
147
+ const next = current.replace(SECURITY_SUFFIX, "").trim();
148
+ if (next === current || !next) return current;
149
+ current = next;
150
+ }
151
+ }
152
+
122
153
  /** Mixed case reads as a real name; all-caps is the tape shouting. */
123
154
  function isMixedCase(name: string): boolean {
124
155
  return name !== name.toUpperCase();
@@ -177,9 +208,9 @@ function tapeTime(trade: CloudCdsTradePayload): number | null {
177
208
  */
178
209
  function issuerOf(trade: CloudCdsTradePayload): string | null {
179
210
  const reported = trade.issuerName?.trim();
180
- if (reported) return reported;
211
+ if (reported) return displayIssuerName(reported);
181
212
  const underlier = trade.upiUnderlierName?.trim();
182
- return underlier && identifiesIssuer(underlier) ? underlier : null;
213
+ return underlier && identifiesIssuer(underlier) ? displayIssuerName(underlier) : null;
183
214
  }
184
215
 
185
216
  export function normalizeCdsTrades(trades: readonly CloudCdsTradePayload[]): CdsTrade[] {
@@ -227,6 +258,8 @@ export function summarizeIssuers(trades: readonly CdsTrade[]): CdsIssuerSummary[
227
258
  trades: 1,
228
259
  lastTradeAt: trade.eventAt,
229
260
  latestSpreadBp: trade.spreadBp,
261
+ spread5yBp: null,
262
+ spread5yDate: null,
230
263
  });
231
264
  if (trade.spreadBp != null) spreadAt.set(trade.issuerKey, trade.eventAt);
232
265
  continue;
@@ -242,20 +275,130 @@ export function summarizeIssuers(trades: readonly CdsTrade[]): CdsIssuerSummary[
242
275
  return [...byIssuer.values()];
243
276
  }
244
277
 
278
+ /** The latest 5Y level and its date, by issuer key. */
279
+ export type CdsSpreadLevels = ReadonlyMap<string, { spreadBp: number; date: string }>;
280
+
281
+ /**
282
+ * The backend's levels under the key the list groups issuers by, so every
283
+ * spelling of a name finds its level. Where two names the backend keeps apart
284
+ * fold into one key ("Oracle Corporation", "Oracle Cop"), the spelling the
285
+ * list would show keeps it. Malformed entries are left out.
286
+ */
287
+ export function spreadLevelsOf(levels: readonly CloudCdsLevelPayload[]): CdsSpreadLevels {
288
+ const byKey = new Map<string, { issuer: string; spreadBp: number; date: string }>();
289
+ for (const level of levels) {
290
+ if (typeof level.issuer !== "string" || !/^\d{4}-\d{2}-\d{2}$/.test(level.date) || !Number.isFinite(level.spreadBp)) continue;
291
+ const issuer = displayIssuerName(level.issuer);
292
+ if (!issuer) continue;
293
+ const key = issuerGroupKey(issuer);
294
+ const current = byKey.get(key);
295
+ if (current && preferredIssuerName(current.issuer, issuer) === current.issuer) continue;
296
+ byKey.set(key, { issuer, spreadBp: level.spreadBp, date: level.date });
297
+ }
298
+ return new Map([...byKey].map(([key, { spreadBp, date }]) => [key, { spreadBp, date }]));
299
+ }
300
+
301
+ /** Each issuer with the latest level of its 5Y line, where it has one, so the list ranks by it. */
302
+ export function withSpreadLevels(rows: readonly CdsIssuerSummary[], levels: CdsSpreadLevels | null): CdsIssuerSummary[] {
303
+ if (!levels?.size) return [...rows];
304
+ return rows.map((row) => {
305
+ const level = levels.get(row.key);
306
+ return level ? { ...row, spread5yBp: level.spreadBp, spread5yDate: level.date } : row;
307
+ });
308
+ }
309
+
245
310
  export function tradesForIssuer(trades: readonly CdsTrade[], issuerKey: string): CdsTrade[] {
246
311
  return trades.filter((trade) => trade.issuerKey === issuerKey);
247
312
  }
248
313
 
314
+ /**
315
+ * When the view was last traded: its newest print, or the last day its 5Y
316
+ * line has a level when no print is in the window. Null when neither is.
317
+ */
318
+ export function lastTradeOf(
319
+ trades: readonly Pick<CdsTrade, "eventAt">[],
320
+ points: readonly Pick<CloudCdsHistoryPointPayload, "date">[] = [],
321
+ ): number | string | null {
322
+ const newest = trades.reduce<number | null>((latest, trade) => (latest == null || trade.eventAt > latest ? trade.eventAt : latest), null);
323
+ const lineDate = points.at(-1)?.date ?? null;
324
+ if (newest == null) return lineDate;
325
+ return lineDate && Date.parse(`${lineDate}T00:00:00Z`) > newest ? lineDate : newest;
326
+ }
327
+
328
+ /**
329
+ * How current a CDS view is, the same at the end of `fn`, in the pane footer
330
+ * and on a shot: dated by its last trade, never by when the tape was fetched,
331
+ * with how many days that trade is behind:
332
+ * `Source: DTCC · last trade 2026-10-09 · lag 2 days`.
333
+ */
334
+ export function cdsFreshness(lastTrade: number | string | null): HeadlessPaneFreshness {
335
+ return {
336
+ source: "DTCC",
337
+ // Public dissemination of swap trades, held back by rule for some trades.
338
+ status: "delayed",
339
+ dataset: true,
340
+ observation: "last trade",
341
+ asOf: typeof lastTrade === "number" ? new Date(lastTrade).toISOString() : lastTrade,
342
+ // The rows are a history, whose first entry is not stale data.
343
+ oldest: null,
344
+ };
345
+ }
346
+
347
+ /**
348
+ * What an empty view says: the window searched and, for one name, the
349
+ * reference entity the query became, with what was typed when that differs.
350
+ */
351
+ export function noTradesMessage({ query, issuer, days }: {
352
+ query: string | null;
353
+ issuer: string | null;
354
+ days: number;
355
+ }): string {
356
+ const window = `in the last ${days} days`;
357
+ if (!query) return `No single-name CDS trades ${window}.`;
358
+ const name = issuer && issuer.toUpperCase() !== query.toUpperCase() ? `${issuer} (${query})` : issuer ?? query;
359
+ return `No CDS trades for ${name} ${window}.`;
360
+ }
361
+
362
+ /**
363
+ * Listed companies whose CDS references another entity than the one their
364
+ * shares trade as, usually the subsidiary or holding company that issues the
365
+ * debt. The tape never names the listed parent, so its name would match no
366
+ * trade. Every name here matches the entity's own spellings on the tape.
367
+ */
368
+ const CDS_REFERENCE_ENTITIES: Readonly<Record<string, string>> = {
369
+ CHTR: "CCO Holdings, LLC",
370
+ GNW: "Genworth Holdings, Inc.",
371
+ HLT: "Hilton Domestic Operating Company Inc.",
372
+ HRB: "Block Financial LLC",
373
+ HTZ: "The Hertz Corporation",
374
+ IHRT: "iHeartCommunications, Inc.",
375
+ MPW: "MPT Operating Partnership, LP",
376
+ NCLH: "NCL Corporation Ltd.",
377
+ NXST: "Nexstar Media Inc.",
378
+ OMF: "OneMain Finance Corporation",
379
+ PARA: "Paramount Global",
380
+ PSKY: "Paramount Global",
381
+ SIRI: "Sirius XM Radio LLC",
382
+ TMUS: "T-Mobile USA, Inc.",
383
+ };
384
+
385
+ /** The reference entity a ticker's CDS trades under, when it is not the listed company. */
386
+ export function cdsReferenceEntity(symbol: string): string | null {
387
+ return CDS_REFERENCE_ENTITIES[symbol.trim().toUpperCase()] ?? null;
388
+ }
389
+
249
390
  /**
250
391
  * What the pane asks for. A tracked ticker already carries its company name; an
251
- * untracked one yields the bare symbol, which the loader expands through
252
- * instrument search before it reaches the backend.
392
+ * untracked one, or one whose CDS references another entity, yields the bare
393
+ * symbol, which the loader expands before it reaches the backend.
253
394
  */
254
395
  export function resolveIssuerQuery(
255
396
  symbol: string | null,
256
397
  ticker: TickerRecord | null,
257
398
  ): string | null {
258
- return ticker?.metadata.name?.trim() || symbol?.trim().toUpperCase() || null;
399
+ const bare = symbol?.trim().toUpperCase() || null;
400
+ if (bare && cdsReferenceEntity(bare)) return bare;
401
+ return ticker?.metadata.name?.trim() || bare;
259
402
  }
260
403
 
261
404
  export function formatBp(value: number | null): string {
@@ -268,26 +411,29 @@ export function formatNotional(trade: Pick<CdsTrade, "notional" | "notionalCappe
268
411
  return `${formatCompact(trade.notional)}${trade.notionalCapped ? "+" : ""}`;
269
412
  }
270
413
 
414
+ /**
415
+ * DTCC publishes the upfront without a direction, and who paid it is not
416
+ * public, so it is an absolute amount: never signed, and labelled `abs`
417
+ * where it is shown.
418
+ */
271
419
  export function formatUpfront(trade: Pick<CdsTrade, "upfront" | "upfrontCurrency">): string {
272
420
  if (trade.upfront == null) return "--";
273
- const sign = trade.upfront > 0 ? "+" : "";
274
- return `${sign}${formatCompact(trade.upfront)}${trade.upfrontCurrency ? ` ${trade.upfrontCurrency}` : ""}`;
275
- }
276
-
277
- function pad(value: number): string {
278
- return String(value).padStart(2, "0");
421
+ return `${formatCompact(Math.abs(trade.upfront))}${trade.upfrontCurrency ? ` ${trade.upfrontCurrency}` : ""}`;
279
422
  }
280
423
 
281
- /** UTC, because DTCC disseminates in UTC and a guessed local zone misdates prints. */
424
+ /**
425
+ * `2026-10-09 13:21`, in UTC: DTCC disseminates in UTC, a guessed local zone
426
+ * misdates prints, and `10/09` reads as 10 September to most of the world.
427
+ */
282
428
  export function formatEventTime(eventAt: number): string {
283
- const date = new Date(eventAt);
284
- return `${pad(date.getUTCMonth() + 1)}/${pad(date.getUTCDate())} ${pad(date.getUTCHours())}:${pad(date.getUTCMinutes())}`;
429
+ if (!Number.isFinite(eventAt)) return "--";
430
+ return new Date(eventAt).toISOString().slice(0, 16).replace("T", " ");
285
431
  }
286
432
 
287
433
  export function formatAsOf(asOf: string | null): string | null {
288
434
  if (!asOf) return null;
289
435
  const parsed = Date.parse(asOf);
290
- return Number.isFinite(parsed) ? `${formatEventTime(parsed)}Z` : asOf;
436
+ return Number.isFinite(parsed) ? `${formatEventTime(parsed)} UTC` : asOf;
291
437
  }
292
438
 
293
439
  export function formatMaturity(maturity: string | null): string {
@@ -307,8 +453,8 @@ export function buildIssuerColumns(): IssuerColumn[] {
307
453
  return [
308
454
  { id: "issuer", label: "ISSUER", width: 16, align: "left", flexGrow: 1 },
309
455
  { id: "trades", label: "TRADES", width: 7, align: "right" },
310
- { id: "last", label: "LAST UTC", width: 12, align: "left" },
311
- { id: "spread", label: "SPREAD", width: 10, align: "right" },
456
+ { id: "last", label: "LAST UTC", width: 16, align: "left" },
457
+ { id: "spread", label: "5Y SPREAD", width: 10, align: "right" },
312
458
  ];
313
459
  }
314
460
 
@@ -321,7 +467,7 @@ function issuerSortValue(columnId: IssuerColumnId, row: CdsIssuerSummary): strin
321
467
  case "last":
322
468
  return row.lastTradeAt;
323
469
  case "spread":
324
- return row.latestSpreadBp;
470
+ return row.spread5yBp;
325
471
  }
326
472
  }
327
473
 
@@ -357,15 +503,15 @@ export const TRADE_SORT_COLUMN_IDS: readonly TradeColumnId[] = [
357
503
  export const DEFAULT_TRADE_SORT: TradeSortPreference = { columnId: "time", direction: "desc" };
358
504
 
359
505
  export function buildTradeColumns(width: number): TradeColumn[] {
360
- const maturityWidth = Math.max(10, Math.min(12, width - 55));
506
+ const maturityWidth = Math.max(10, Math.min(12, width - 59));
361
507
  return [
362
- { id: "time", label: "TIME UTC", width: 12, align: "left" },
508
+ { id: "time", label: "TIME UTC", width: 16, align: "left" },
363
509
  { id: "maturity", label: "MATURITY", width: maturityWidth, align: "left" },
364
510
  { id: "notional", label: "NOTIONAL", width: 11, align: "right" },
365
511
  { id: "currency", label: "CCY", width: 5, align: "left" },
366
512
  { id: "coupon", label: "COUPON", width: 9, align: "right" },
367
513
  { id: "spread", label: "SPREAD", width: 10, align: "right" },
368
- { id: "upfront", label: "UPFRONT", width: 13, align: "right" },
514
+ { id: "upfront", label: "ABS UPFRONT", width: 13, align: "right" },
369
515
  ];
370
516
  }
371
517
 
@@ -423,35 +569,71 @@ export function spreadChartPoints(points: readonly CloudCdsHistoryPointPayload[]
423
569
  return out;
424
570
  }
425
571
 
426
- function formatSpreadChange(value: number): string {
572
+ /** The 1M move as the pane shows it: whole basis points, signed. */
573
+ export function formatSpreadChange(value: number): string {
427
574
  const rounded = Math.round(value);
428
575
  return `${rounded > 0 ? "+" : ""}${rounded}bp`;
429
576
  }
430
577
 
578
+ function dayTime(date: string): number {
579
+ return Date.parse(`${date}T00:00:00Z`);
580
+ }
581
+
582
+ /** The figures of an issuer's 5Y line, the ones the pane heads its chart with and a report carries. */
583
+ export interface CdsSpreadSummary {
584
+ /** The latest level, bp, and the New York trade date it is from. */
585
+ spreadBp: number;
586
+ date: string;
587
+ /** The move over a month on the same contract; null across a roll or a gap. */
588
+ change1mBp: number | null;
589
+ /** Lowest and highest level since the first date charted; null with a single level. */
590
+ range: { lowBp: number; highBp: number; since: string } | null;
591
+ }
592
+
431
593
  /**
432
594
  * The latest level, its move over a month, and the range of what the chart
433
595
  * shows. The month compares against the last level 30 to 45 days older on the
434
596
  * same contract, so neither a gap nor a roll to the next contract, which
435
597
  * trades wider, passes for a move.
436
598
  */
437
- export function spreadFigures(points: readonly CloudCdsHistoryPointPayload[]): StatItem[] {
599
+ export function spreadSummary(points: readonly CloudCdsHistoryPointPayload[]): CdsSpreadSummary | null {
438
600
  const latest = points.at(-1);
439
- if (!latest) return [];
440
- const latestTime = Date.parse(`${latest.date}T00:00:00Z`);
601
+ if (!latest) return null;
602
+ const latestTime = dayTime(latest.date);
441
603
  const monthAgo = points.findLast((point) => {
442
604
  if (point.maturity !== latest.maturity) return false;
443
- const age = latestTime - Date.parse(`${point.date}T00:00:00Z`);
605
+ const age = latestTime - dayTime(point.date);
444
606
  return age >= 30 * DAY_MS && age <= 45 * DAY_MS;
445
607
  });
446
608
  const levels = points.map((point) => point.spreadBp);
609
+ return {
610
+ spreadBp: latest.spreadBp,
611
+ date: latest.date,
612
+ // A tenth of a basis point is the line's own precision; the rest is float noise.
613
+ change1mBp: monthAgo ? Math.round((latest.spreadBp - monthAgo.spreadBp) * 10) / 10 : null,
614
+ range: points.length >= 2
615
+ ? { lowBp: Math.min(...levels), highBp: Math.max(...levels), since: points[0]!.date }
616
+ : null,
617
+ };
618
+ }
619
+
620
+ /** `129 to 276bp`: the low keeps the level's precision, so the level never falls outside it. */
621
+ export function formatSpreadRange(range: NonNullable<CdsSpreadSummary["range"]>): string {
622
+ return `${formatBp(range.lowBp).slice(0, -2)} to ${formatBp(range.highBp)}`;
623
+ }
624
+
625
+ /** The pane's figures over its 5Y chart, from `spreadSummary`. */
626
+ export function spreadFigures(points: readonly CloudCdsHistoryPointPayload[]): StatItem[] {
627
+ const summary = spreadSummary(points);
628
+ if (!summary) return [];
447
629
  return [
448
- { id: "spread", label: "5Y spread", value: formatBp(latest.spreadBp), detail: latest.date },
449
- ...(monthAgo ? [{ id: "change", label: "1M", value: formatSpreadChange(latest.spreadBp - monthAgo.spreadBp) }] : []),
450
- ...(points.length >= 2 ? [{
630
+ { id: "spread", label: "5Y spread", value: formatBp(summary.spreadBp), detail: summary.date },
631
+ ...(summary.change1mBp != null ? [{ id: "change", label: "1M", value: formatSpreadChange(summary.change1mBp) }] : []),
632
+ ...(summary.range ? [{
451
633
  id: "range",
452
634
  label: "Range",
453
- value: `${formatBp(Math.min(...levels)).slice(0, -2)} to ${formatBp(Math.max(...levels))}`,
454
- detail: `since ${points[0]!.date}`,
635
+ value: formatSpreadRange(summary.range),
636
+ detail: `since ${summary.range.since}`,
455
637
  }] : []),
456
638
  ];
457
639
  }
@@ -23,11 +23,15 @@ import { usePluginPaneState } from "../../runtime";
23
23
  import { useAutoRefresh } from "../../../react/auto-refresh";
24
24
  import { usePaneStatusFooter } from "../../../components/layout/pane/status-footer";
25
25
  import { usePaneRefreshKey } from "../../../components/data-table/table-pane";
26
+ import { deriveHeadlessFreshness, paneStatusLineVariants } from "../../../cli/pane-functions/freshness";
26
27
  import {
28
+ CDS_TRADE_DAYS,
27
29
  loadCdsActivity,
28
30
  loadCdsSpreadHistory,
31
+ loadCdsSpreadLevels,
29
32
  type CdsActivityLoader,
30
33
  type CdsSpreadHistoryLoader,
34
+ type CdsSpreadLevelsLoader,
31
35
  } from "./client";
32
36
  import {
33
37
  DEFAULT_ISSUER_SORT,
@@ -36,12 +40,14 @@ import {
36
40
  TRADE_SORT_COLUMN_IDS,
37
41
  buildIssuerColumns,
38
42
  buildTradeColumns,
39
- formatAsOf,
43
+ cdsFreshness,
40
44
  formatBp,
41
45
  formatEventTime,
42
46
  formatMaturity,
43
47
  formatNotional,
44
48
  formatUpfront,
49
+ lastTradeOf,
50
+ noTradesMessage,
45
51
  resolveIssuerQuery,
46
52
  sortIssuers,
47
53
  sortTrades,
@@ -49,6 +55,7 @@ import {
49
55
  spreadFigures,
50
56
  summarizeIssuers,
51
57
  tradesForIssuer,
58
+ withSpreadLevels,
52
59
  type CdsIssuerSummary,
53
60
  type CdsTrade,
54
61
  type IssuerColumn,
@@ -77,8 +84,8 @@ function renderIssuerCell(
77
84
  return { text: formatEventTime(row.lastTradeAt), color: colors.textMuted };
78
85
  case "spread":
79
86
  return {
80
- text: formatBp(row.latestSpreadBp),
81
- color: row.latestSpreadBp == null ? colors.textDim : colors.text,
87
+ text: formatBp(row.spread5yBp),
88
+ color: row.spread5yBp == null ? colors.textDim : colors.text,
82
89
  };
83
90
  }
84
91
  }
@@ -129,6 +136,7 @@ function CdsTradeTable({
129
136
  onKeyDown,
130
137
  before,
131
138
  lineMaturity = null,
139
+ emptyMessage,
132
140
  }: {
133
141
  trades: CdsTrade[];
134
142
  focused: boolean;
@@ -142,6 +150,8 @@ function CdsTradeTable({
142
150
  before?: ReactNode;
143
151
  /** The contract the 5Y line follows today. */
144
152
  lineMaturity?: string | null;
153
+ /** What an empty table says: the window and the name searched. */
154
+ emptyMessage: string;
145
155
  }) {
146
156
  const columns = useMemo(() => buildTradeColumns(width), [width]);
147
157
  const renderTradeRow = useCallback((trade: CdsTrade, column: TradeColumn) => (
@@ -168,12 +178,13 @@ function CdsTradeTable({
168
178
  getItemKey={tradeKey}
169
179
  renderCell={renderTradeRow}
170
180
  selectedTextOverridesCellColor
171
- emptyStateTitle="No reported trades."
181
+ emptyStateTitle={emptyMessage}
172
182
  />
173
183
  );
174
184
  }
175
185
 
176
186
  const NO_TRADES: CdsTrade[] = [];
187
+ const NO_ISSUERS: CdsIssuerSummary[] = [];
177
188
  const NO_POINTS: CloudCdsHistoryPointPayload[] = [];
178
189
  /**
179
190
  * The 5Y line has one point per New York trade date, dated at UTC midnight, so
@@ -231,6 +242,18 @@ interface CdsPaneProps extends PaneProps {
231
242
  /** Injected by tests so the pane renders without the cloud backend. */
232
243
  loadActivity?: CdsActivityLoader;
233
244
  loadHistory?: CdsSpreadHistoryLoader;
245
+ loadLevels?: CdsSpreadLevelsLoader;
246
+ }
247
+
248
+ /**
249
+ * The line `fn CDS` and `shot CDS` end with, from the same declaration:
250
+ * `Source: DTCC · last trade 2026-10-09 · lag 2 days`.
251
+ */
252
+ function cdsStatusSegments(lastTrade: number | string | null): PaneFooterSegment[] {
253
+ if (lastTrade == null) return [];
254
+ const freshness = deriveHeadlessFreshness({ shape: "rows" }, { rows: [], freshness: cdsFreshness(lastTrade) });
255
+ const [line, ...shorter] = paneStatusLineVariants(freshness).map((text) => [{ text, tone: "muted" as const }]);
256
+ return [{ id: "cds-freshness", asOf: true, parts: line!, variants: shorter }];
234
257
  }
235
258
 
236
259
  export function CdsPane({
@@ -240,6 +263,7 @@ export function CdsPane({
240
263
  height,
241
264
  loadActivity = loadCdsActivity,
242
265
  loadHistory = loadCdsSpreadHistory,
266
+ loadLevels = loadCdsSpreadLevels,
243
267
  }: CdsPaneProps) {
244
268
  const { symbol, ticker } = usePaneTickerIdentity();
245
269
  const issuerQuery = useMemo(() => resolveIssuerQuery(symbol, ticker), [symbol, ticker]);
@@ -260,9 +284,16 @@ export function CdsPane({
260
284
  useAutoRefresh(fetchedAt, load);
261
285
 
262
286
  const trades = activity?.trades ?? NO_TRADES;
287
+ const summaries = useMemo(() => (issuerQuery ? NO_ISSUERS : summarizeIssuers(trades)), [issuerQuery, trades]);
288
+ // Every listed issuer's latest 5Y level, one request beside the trades, so the list ranks by it as `fn CDS` does.
289
+ const loadLevelsRef = useRef(loadLevels);
290
+ loadLevelsRef.current = loadLevels;
291
+ const levelsRequest = useCallback(() => loadLevelsRef.current(), []);
292
+ const levels = useAsyncResource(issuerQuery ? null : levelsRequest);
293
+ useAutoRefresh(levels.updatedAt, levels.load);
263
294
  const issuers = useMemo(
264
- () => (issuerQuery ? [] : sortIssuers(summarizeIssuers(trades), issuerSort)),
265
- [issuerQuery, issuerSort, trades],
295
+ () => (issuerQuery ? [] : sortIssuers(withSpreadLevels(summaries, levels.data), issuerSort)),
296
+ [issuerQuery, issuerSort, levels.data, summaries],
266
297
  );
267
298
  const visibleTrades = useMemo(() => sortTrades(
268
299
  issuerQuery ? trades : selectedIssuerKey ? tradesForIssuer(trades, selectedIssuerKey) : [],
@@ -288,7 +319,10 @@ export function CdsPane({
288
319
  usePaneNoticeFooter({
289
320
  registrationId: `${paneId}:cds-history`,
290
321
  focused,
291
- notices: historyIssuer && history.error && !history.data ? ["5Y spread history unavailable."] : [],
322
+ notices: [
323
+ ...(historyIssuer && history.error && !history.data ? ["5Y spread history unavailable."] : []),
324
+ ...(summaries.length && levels.error && !levels.data ? ["5Y spreads unavailable."] : []),
325
+ ],
292
326
  });
293
327
 
294
328
  useEffect(() => {
@@ -313,6 +347,7 @@ export function CdsPane({
313
347
 
314
348
  usePaneRefreshKey(() => {
315
349
  load();
350
+ if (!issuerQuery) levels.load();
316
351
  if (historyIssuer) history.load();
317
352
  }, { focused });
318
353
 
@@ -343,17 +378,24 @@ export function CdsPane({
343
378
  onSelect: () => (tradesInFront ? cycleTradeSort : cycleIssuerSort)(-1) },
344
379
  ], [cycleIssuerSort, cycleTradeSort, hasActivity, tradesInFront]);
345
380
 
346
- const asOfLabel = formatAsOf(activity?.asOf ?? null);
347
- const footerInfo = useMemo<PaneFooterSegment[]>(() => [
348
- ...(asOfLabel ? [{ id: "as-of", parts: [{ text: `as of ${asOfLabel}`, tone: "muted" as const }] }] : []),
349
- ...(activity ? [{ id: "delayed", parts: [{ text: "delayed", tone: "muted" as const }] }] : []),
350
- ], [activity, asOfLabel]);
381
+ // Dated by the last trade of what is in front: the issuer's, or the whole tape's.
382
+ const lastTrade = tradesInFront
383
+ ? lastTradeOf(visibleTrades, spreadPoints)
384
+ : activity ? lastTradeOf(trades) : null;
385
+ const footerInfo = useMemo(() => cdsStatusSegments(lastTrade), [lastTrade]);
351
386
  usePaneStatusFooter({
352
387
  registrationId: paneId,
353
- loading: status === "loading" || (!!historyIssuer && history.loading && !history.data),
388
+ loading: status === "loading"
389
+ || (!!historyIssuer && history.loading && !history.data)
390
+ || (!issuerQuery && levels.loading && !levels.data),
354
391
  error,
355
392
  info: footerInfo,
356
393
  });
394
+ const emptyMessage = noTradesMessage({
395
+ query: issuerQuery ? activity?.query ?? issuerQuery : selectedSummary?.issuer ?? null,
396
+ issuer: issuerQuery ? activity?.issuer ?? null : selectedSummary?.issuer ?? null,
397
+ days: activity?.days ?? CDS_TRADE_DAYS,
398
+ });
357
399
 
358
400
  if (status === "loading" && !activity) {
359
401
  return (
@@ -387,6 +429,7 @@ export function CdsPane({
387
429
  onKeyDown={handleTradeKey}
388
430
  before={header}
389
431
  lineMaturity={lineMaturity}
432
+ emptyMessage={emptyMessage}
390
433
  />
391
434
  );
392
435
  }
@@ -414,6 +457,7 @@ export function CdsPane({
414
457
  onSelect={setSelectedTradeId}
415
458
  onKeyDown={handleTradeKey}
416
459
  lineMaturity={lineMaturity}
460
+ emptyMessage={emptyMessage}
417
461
  />
418
462
  ) : null}
419
463
  onDetailKeyDown={handleTradeKey}
@@ -441,7 +485,7 @@ export function CdsPane({
441
485
  getItemKey={issuerKey}
442
486
  renderCell={renderIssuerCell}
443
487
  selectedTextOverridesCellColor
444
- emptyStateTitle={error ? "CDS activity unavailable." : "No reported single-name CDS trades."}
488
+ emptyStateTitle={error ? "CDS activity unavailable." : emptyMessage}
445
489
  />
446
490
  );
447
491
  }
@@ -0,0 +1,19 @@
1
+ import { apiClient } from "../../../api-client";
2
+ import type { SeriesDefinition } from "../../../series/types";
3
+ import { loadCdsSpreadHistory, resolveIssuerName } from "./client";
4
+
5
+ /** A company's on-the-run 5Y CDS spread, by its ticker, as the CDS pane charts it. */
6
+ export const SINGLE_NAME_CDS_SERIES: readonly SeriesDefinition[] = [{
7
+ id: "cds:single-name-5y",
8
+ name: "5Y CDS spread",
9
+ unit: "bp",
10
+ frequency: "daily",
11
+ group: "Credit",
12
+ tags: ["CDS", "single name", "credit default swap", "spread"],
13
+ input: "ticker",
14
+ load: async ({ ticker }) => {
15
+ const issuer = await resolveIssuerName(ticker!, (query, limit) => apiClient.searchInstruments(query, limit));
16
+ const history = await loadCdsSpreadHistory(issuer);
17
+ return history.points.map((point) => ({ date: point.date, value: point.spreadBp }));
18
+ },
19
+ }];
@@ -45,6 +45,10 @@ export function validateCentralBankRates(payload: CentralBankRatesPayload): Cent
45
45
  if (row.nextMeeting !== null && (!row.nextMeeting || row.nextMeeting.date == null || !dateOrNull(row.nextMeeting.date)
46
46
  || !urlOrNull(row.nextMeeting.sourceUrl) || row.nextMeeting.sourceUrl == null
47
47
  || !Number.isFinite(Date.parse(row.nextMeeting.verifiedAt)))) return invalid();
48
+ // Fields a newer server adds are read only when they hold what this app expects.
49
+ if (row.nextMeeting && row.nextMeeting.kind !== undefined && row.nextMeeting.kind !== "decision" && row.nextMeeting.kind !== "fixing") delete row.nextMeeting.kind;
50
+ if (row.nextMeetingStatus !== undefined && !["scheduled", "not-published", "not-verified", "no-policy-rate"].includes(row.nextMeetingStatus)) delete row.nextMeetingStatus;
51
+ if (row.seriesNotes !== undefined && !strings(row.seriesNotes)) delete row.seriesNotes;
48
52
  }
49
53
  return payload;
50
54
  }