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
@@ -16,18 +16,20 @@ import { publicTickerKey } from "../../../utils/exchanges";
16
16
  import { truncateToDisplayWidth } from "../../../utils/format";
17
17
  import { SignInWall } from "../cloud/auth-actions";
18
18
  import { CLOUD_PLAN_KEY, useCloudUpgradeAction } from "../shared/cloud-upgrade";
19
+ import { useOpenDescription } from "../shared/open-description";
19
20
  import { Blurred, LockedOverlay, UpgradeLabel } from "../shared/locked-rows";
20
21
  import { isCloudSessionRequired, useResearchCloudSession } from "../shared/research-cloud-session";
21
22
  import { AwardDetail } from "./detail";
22
23
  import { useAwardAlerts } from "./alerts";
23
24
  import { AWARDS_UNAVAILABLE, fetchAwards, loadAward, loadAwards, validateAwards } from "./client";
24
25
  import { useAwardsEvidence } from "./evidence";
25
- import { AWARD_TABS, aggregateId, awardHistorySeries, awardPercent, awardPeriod, awardScope, awardTab, awardTypeLabel, money, rankedAggregates } from "./model";
26
+ import { AWARD_TABS, aggregateId, awardHistorySeries, awardPercent, awardPeriod, awardScope, awardsPreviewNote, awardTab, awardTypeLabel, futureAwardDatesNote, money,
27
+ rankedAggregates } from "./model";
26
28
 
27
29
  type Item = { kind: "award"; row: AwardRow } | { kind: "aggregate"; row: AwardAggregate } | { kind: "leader"; row: AwardCompanyLeader } | { kind: "locked"; id: string }
28
- | { kind: "section"; id: string; label: string; count: number };
29
- const itemId = (item: Item) => item.kind === "locked" || item.kind === "section" ? item.id : item.kind === "award" ? item.row.id : item.kind === "leader" ? `${aggregateId(item.row)}:${item.row.sector}` : aggregateId(item.row);
30
- const isRowItem = (item: Item) => item.kind !== "section";
30
+ | { kind: "section"; id: string; label: string; count: number } | { kind: "note"; id: string; text: string };
31
+ const itemId = (item: Item) => item.kind === "locked" || item.kind === "section" || item.kind === "note" ? item.id : item.kind === "award" ? item.row.id : item.kind === "leader" ? `${aggregateId(item.row)}:${item.row.sector}` : aggregateId(item.row);
32
+ const isRowItem = (item: Item) => item.kind !== "section" && item.kind !== "note";
31
33
  /** Shares only compare inside one scope and currency, so each pair is its own section. */
32
34
  function groupedAggregates<T extends AwardAggregate>(rows: readonly T[], toItem: (row: T) => Item): Item[] {
33
35
  const groups = new Map<string, T[]>();
@@ -72,6 +74,7 @@ function AwardsView({ width, height, focused, symbol }: PaneProps & { symbol: st
72
74
  const accessKey = `${session.requestKey}:${access.hasProAccess ? "full" : "preview"}`;
73
75
  const openUpgrade = useCloudUpgradeAction("awards");
74
76
  const { createPaneFromTemplate } = usePluginAppActions();
77
+ const openDescription = useOpenDescription();
75
78
  const [initialTab] = usePaneSettingValue("tab", symbol ? "company" : "feed");
76
79
  const [savedTab, setTab] = usePluginPaneState<string>("awards:tab", initialTab);
77
80
  const tab = awardTab(savedTab);
@@ -131,10 +134,13 @@ function AwardsView({ width, height, focused, symbol }: PaneProps & { symbol: st
131
134
  const aggregates = useMemo(() => rankedAggregates(tab === "agencies" ? data?.agencies ?? [] : data?.sectors ?? [], currency, awardType), [data, tab, currency, awardType]);
132
135
  const aggregated = tab === "agencies" || tab === "sectors";
133
136
  const showLeaders = tab === "sectors" && leaderView === "companies";
137
+ // A preview is the same latest awards whatever the filters say, so its award rows open with what they are.
138
+ const previewNote = data && (tab === "feed" || tab === "company") ? awardsPreviewNote(data, filter) : null;
134
139
  const items = useMemo<Item[]>(() => [
140
+ ...(previewNote ? [{ kind: "note" as const, id: "note:preview", text: previewNote }] : []),
135
141
  ...(showLeaders ? groupedAggregates(data?.leaders ?? [], (row): Item => ({ kind: "leader", row })) : aggregated ? groupedAggregates(aggregates, (row): Item => ({ kind: "aggregate", row })) : rows.map((row): Item => ({ kind: "award", row }))),
136
142
  ...(data?.locked ? Array.from({ length: 3 }, (_, i): Item => ({ kind: "locked", id: `locked:${i}` })) : []),
137
- ], [showLeaders, aggregated, aggregates, rows, data?.leaders, data?.locked]);
143
+ ], [previewNote, showLeaders, aggregated, aggregates, rows, data?.leaders, data?.locked]);
138
144
  const selected = tab === "company" && !ticker ? null
139
145
  : items.find((item) => itemId(item) === selectedId && isRowItem(item)) ?? items.find(isRowItem) ?? null;
140
146
  const current = openRow ?? (selected?.kind === "award" ? selected.row : null);
@@ -157,7 +163,7 @@ function AwardsView({ width, height, focused, symbol }: PaneProps & { symbol: st
157
163
  ...(current ? [{ id: "source", key: "o", label: "pen source", onPress: () => void host.openExternal(current.sourceUrl) }] : []),
158
164
  ...(current && !openId ? [{ id: "evidence", key: "e", label: "vidence", onPress: () => setOpen(current.id) }] : []),
159
165
  ...(selectedEntity ? [
160
- { id: "description", key: "d", label: "es", onPress: () => navigate("new-ticker-detail-pane") },
166
+ { id: "description", key: "d", label: "es", onPress: () => openDescription(selectedEntity.ticker, selectedEntity.exchange ?? undefined) },
161
167
  { id: "financials", key: "f", label: "a", onPress: () => navigate("financial-analysis-pane") },
162
168
  { id: "graph", key: "g", label: "raph", onPress: () => navigate("chart-composer-pane") },
163
169
  { id: "supply", key: "s", label: "plc", onPress: () => navigate("supply-chain-pane") },
@@ -174,6 +180,7 @@ function AwardsView({ width, height, focused, symbol }: PaneProps & { symbol: st
174
180
  ...(data?.truncated && Object.values(data.truncated).some(Boolean) ? ["Some aggregate history exceeds this response's limit. Narrow the date range or scope."] : []),
175
181
  ...(tab === "company" && currencies.length > 1 && !currency ? [`Chart in ${chartCurrency}; select a currency to inspect other obligations.`] : []),
176
182
  ...(tab === "company" && scopes.length > 1 && !source ? [`Chart covers ${awardScope(chartSource).toLowerCase()}; select a scope to inspect other contracts.`] : []),
183
+ ...(data && (tab === "feed" || tab === "company") ? [futureAwardDatesNote(rows, data.generatedAt)].filter((note): note is string => !!note) : []),
177
184
  ] });
178
185
  const { strip, rows: tabRows } = usePaneTabs(!denied ? { tabs: [...AWARD_TABS], activeValue: tab, onSelect: (value) => { setTab(value); setOpen(null); }, focused, dense: true } : null);
179
186
  const bodyHeight = Math.max(3, height - tabRows);
@@ -194,10 +201,12 @@ function AwardsView({ width, height, focused, symbol }: PaneProps & { symbol: st
194
201
  : aggregated ? AGG_COLUMNS.filter((column) => column.id !== "scope" && column.id !== "currency").map((column) => column.id === "label" ? { ...column, label: tab === "agencies" ? "Agency" : "Sector" } : column)
195
202
  : tab === "events" ? EVENT_COLUMNS : FEED_COLUMNS;
196
203
  const maxShare = Math.max(0, ...items.map((item) => item.kind === "aggregate" || item.kind === "leader" ? item.row.sharePercent ?? 0 : 0));
197
- const latest = data?.history.filter((row) => row.source === chartSource && row.currency === chartCurrency && row.awardType === awardType).at(-1);
198
- const chart = tab === "company" && ticker ? { series, formatValue: (value: number) => `${chartCurrency} ${money(value)}`, formatAxisValue: formatCompactAxis, ...chartSelection,
199
- remoteKind: "award-obligations", empty: series.length ? undefined : data?.locked ? "Full award history requires Pro." : "History is accumulating for this company." } : null;
200
- useAwardsEvidence(data, tab, tab === "company" && !ticker ? 0 : items.filter((item) => item.kind !== "locked").length);
204
+ // A preview's cohorts are the latest of any company, so they never chart as the ticker's.
205
+ const charted = data?.locked ? [] : series;
206
+ const latest = data?.locked ? undefined : data?.history.filter((row) => row.source === chartSource && row.currency === chartCurrency && row.awardType === awardType).at(-1);
207
+ const chart = tab === "company" && ticker ? { series: charted, formatValue: (value: number) => `${chartCurrency} ${money(value)}`, formatAxisValue: formatCompactAxis, ...chartSelection,
208
+ remoteKind: "award-obligations", empty: charted.length ? undefined : data?.locked ? "Full award history requires Pro." : "History is accumulating for this company." } : null;
209
+ useAwardsEvidence(data, tab, tab === "company" && !ticker ? 0 : items.filter((item) => item.kind !== "locked" && item.kind !== "note").length);
201
210
  if (denied || !data && isCloudSessionRequired(failed?.message)) return <SignInWall placement="awards-signin" action="view government awards" needsVerification={session.needsVerification} />;
202
211
  return <Box width={width} height={height} flexDirection="column">
203
212
  {strip}
@@ -213,15 +222,15 @@ function AwardsView({ width, height, focused, symbol }: PaneProps & { symbol: st
213
222
  figures={tab === "company" && ticker && latest ? [{ id: "total", label: `Obligated ${chartCurrency}`, value: money(latest.cumulativeObligatedAmount) },
214
223
  { id: "period", label: "Latest cohort", value: latest.month.slice(0, 7), detail: awardScope(chartSource) }] : undefined} />}
215
224
  selection={{ kind: "id", selectedId: selected ? itemId(selected) : null, getId: itemId, onChange: setSelected }} getItemKey={itemId}
216
- isNavigable={isRowItem} renderSectionHeader={(item) => item.kind === "section" ? { text: `${item.label} (${item.count})` } : null}
217
- onActivate={(item) => { if (item.kind === "section") return; if (item.kind === "locked") openUpgrade(); else if (item.kind === "award") setOpen(item.row.id);
225
+ isNavigable={isRowItem} renderSectionHeader={(item) => item.kind === "section" ? { text: `${item.label} (${item.count})` } : item.kind === "note" ? { text: item.text } : null}
226
+ onActivate={(item) => { if (item.kind === "section" || item.kind === "note") return; if (item.kind === "locked") openUpgrade(); else if (item.kind === "award") setOpen(item.row.id);
218
227
  else if (item.kind === "leader") { setCurrency(item.row.currency); setSource(item.row.source); setSector(item.row.sector);
219
228
  if (item.row.ticker) { setTicker(publicTickerKey(item.row.ticker, item.row.exchange ?? undefined)); setTab("company"); } else { setQuery(item.row.label); setTab("feed"); } }
220
229
  else { setCurrency(item.row.currency); setSource(item.row.source);
221
230
  if (tab === "agencies") { setAgency(item.row.key); setTab("feed"); } else { setSector(item.row.key); setLeaderView("companies"); } } }}
222
231
  sortColumnId={null} sortDirection="desc" selectedTextOverridesCellColor showHorizontalScrollbar resetScrollKey={JSON.stringify([tab, filter])}
223
232
  renderCell={(item, column, _index, state) => {
224
- if (item.kind === "section") return { text: "" };
233
+ if (item.kind === "section" || item.kind === "note") return { text: "" };
225
234
  if (item.kind === "locked") {
226
235
  if (!desktop && ["recipient", "label"].includes(column.id) && item.id === "locked:0") return { text: "Upgrade for full awards", content: <UpgradeLabel text="Upgrade for full awards" onPress={openUpgrade} />, onMouseDown: openUpgrade };
227
236
  return desktop ? { text: "", content: <Blurred><Text fg={colors.textDim}>{["recipient", "label"].includes(column.id) ? "Additional award" : "Hidden"}</Text></Blurred> }
@@ -0,0 +1,29 @@
1
+ import type { SeriesDefinition } from "../../../series/types";
2
+ import { fetchAwards } from "./client";
3
+
4
+ /** The scope AWARDS calls "US federal contracts": one source, one currency and prime awards, so no total counts a contract twice. */
5
+ const US_FEDERAL = { source: "usaspending", currency: "USD", awardType: "prime" } as const;
6
+
7
+ /**
8
+ * A company's US federal contract obligations by month, as AWARDS charts its
9
+ * company history. Pro: the free preview is one shared view, not the
10
+ * company's history, so it fails with the pane's own words.
11
+ */
12
+ export const AWARD_SERIES: readonly SeriesDefinition[] = [{
13
+ id: "awards:us-federal-obligations",
14
+ name: "US federal contract obligations",
15
+ unit: "USD",
16
+ frequency: "monthly",
17
+ group: "Alternative data",
18
+ tags: ["government awards", "contracts", "procurement", "defense", "obligations"],
19
+ description: "Obligated dollars on US federal prime contracts awarded to the company, by award month, as AWARDS charts them. Needs Pro.",
20
+ input: "ticker",
21
+ style: "columns",
22
+ load: async ({ ticker, signal }) => {
23
+ const data = await fetchAwards({ ticker: ticker!, ...US_FEDERAL, limit: 1 }, undefined, signal);
24
+ if (data.locked || data.access === "preview") throw new Error("Full award history requires Pro.");
25
+ const rows = data.history.filter((row) => row.source === US_FEDERAL.source && row.currency === US_FEDERAL.currency && row.awardType === US_FEDERAL.awardType);
26
+ if (!rows.length) throw new Error(`No US federal contracts awarded to ${ticker}.`);
27
+ return rows.map((row) => ({ date: `${row.month.slice(0, 7)}-01`, value: row.obligatedAmount === null ? null : Number(row.obligatedAmount) }));
28
+ },
29
+ }];
@@ -15,8 +15,8 @@ export const backtestHeadless: HeadlessPaneDefinition<"bundle"> = {
15
15
  aliases: ["BT", "BTST"],
16
16
  screenshotReadiness: "live-dom",
17
17
  limitations: [
18
- "Long-only, one instrument, daily bars; signals fill at the next session's open",
19
- "Price returns: dividends, borrow and cash interest are not modelled",
18
+ "Long-only, one instrument, daily bars; signals fill at the next session's open.",
19
+ "Price returns: dividends, borrow and cash interest are not modelled.",
20
20
  ],
21
21
  },
22
22
  options: [
@@ -1,3 +1,4 @@
1
+ import { numberErrorMessage } from "../../../utils/decimal-comma";
1
2
  import { priceBond, solveBondYield, treasurySpread, type BondTerms, type TreasuryBenchmarkPoint } from "./math";
2
3
 
3
4
  export interface BondDraft {
@@ -20,7 +21,7 @@ export function defaultBondDraft(now = new Date()): BondDraft {
20
21
  }
21
22
 
22
23
  function inputNumber(value: string, label: string): number {
23
- if (!value.trim() || !/^[+-]?(?:\d+(?:\.\d*)?|\.\d+)$/.test(value.trim())) throw new Error(`${label} must be a number`);
24
+ if (!value.trim() || !/^[+-]?(?:\d+(?:\.\d*)?|\.\d+)$/.test(value.trim())) throw new Error(numberErrorMessage(`${label} must be a number`, value));
24
25
  const number = Number(value);
25
26
  if (!Number.isFinite(number)) throw new Error(`${label} must be finite`);
26
27
  return number;
@@ -338,6 +338,7 @@ export const brokerManagerModule: PluginModule = {
338
338
  {
339
339
  id: "brokers",
340
340
  name: "Brokers",
341
+ personalData: "account",
341
342
  icon: "B",
342
343
  component: BrokersPane,
343
344
  defaultPosition: "right",
@@ -19,7 +19,7 @@ function definition(litigation: boolean): HeadlessPaneDefinition<"bundle"> {
19
19
  { key: "detailTab", type: "enum", values: [{ value: "evidence" }, { value: "history" }], defaultValue: "evidence", description: "Detail section for screenshots." },
20
20
  { key: "event", type: "string", settingKey: "open", description: "Event ID for evidence and revision history." },
21
21
  ],
22
- discovery: { aliases: [litigation ? "LITI" : "CATL"], dataRequirements: ["Gloom Cloud catalyst records"], limitations: ["Pro; free preview includes three events", "Only published dates and confidently resolved corporate parties are linked", "Coverage varies by jurisdiction and source; absence is not proof of no event"] },
22
+ discovery: { aliases: [litigation ? "LITI" : "CATL"], dataRequirements: ["Gloom Cloud catalyst records"], limitations: ["Pro; free preview includes three events.", "Only published dates and confidently resolved corporate parties are linked.", "Coverage varies by jurisdiction and source; absence is not proof of no event."] },
23
23
  describe: litigation ? "Company litigation, enforcement and antitrust dockets with evidence" : "Regulatory, clinical, legal and trade-policy catalyst calendar with provenance",
24
24
  async load(args, ctx) {
25
25
  if (typeof args.options.event === "string" && args.options.event) {
@@ -14,6 +14,7 @@ import type { PaneProps } from "../../../types/plugin";
14
14
  import { Box, Text, useUiCapabilities, type ScrollBoxRenderable } from "../../../ui";
15
15
  import { SignInWall } from "../cloud/auth-actions";
16
16
  import { CLOUD_PLAN_KEY, useCloudUpgradeAction } from "../shared/cloud-upgrade";
17
+ import { useOpenDescription } from "../shared/open-description";
17
18
  import { Blurred, LockedOverlay, UpgradeLabel } from "../shared/locked-rows";
18
19
  import { listingCell } from "../shared/research-cells";
19
20
  import { isCloudSessionRequired, useResearchCloudSession } from "../shared/research-cloud-session";
@@ -47,6 +48,7 @@ export function CatalystView({ width, height, focused, symbol, litigation = fals
47
48
  const access = usePlanAccess();
48
49
  const accessKey = `${session.requestKey}:${access.hasProAccess ? "full" : "preview"}`;
49
50
  const { createPaneFromTemplate, openPluginCommandWorkflow } = usePluginAppActions();
51
+ const openDescription = useOpenDescription();
50
52
  const openUpgrade = useCloudUpgradeAction("catl");
51
53
  const [initialTab] = usePaneSettingValue("tab", "calendar");
52
54
  const [savedTab, setTab] = usePluginPaneState("catalyst:tab", initialTab);
@@ -100,7 +102,7 @@ export function CatalystView({ width, height, focused, symbol, litigation = fals
100
102
  const { strip, rows: tabRows } = usePaneTabs(!openId ? { tabs: [...CATALYST_TABS].map((item) => litigation && item.value === "calendar" ? { ...item, label: "Dockets" } : item), activeValue: tab, onSelect: (value) => { setTab(value); setSelectedId(null); }, focused, dense: true } : null);
101
103
  const selectedSymbol = selected ? catalystSymbol(selected) : symbol;
102
104
  const hints: PaneHint[] = [
103
- ...(!openId && selectedSymbol ? [{ id: "description", key: "d", label: "es", onPress: () => createPaneFromTemplate("new-ticker-detail-pane", { symbol: selectedSymbol }) },
105
+ ...(!openId && selectedSymbol ? [{ id: "description", key: "d", label: "es", onPress: () => openDescription(selectedSymbol) },
104
106
  { id: "financials", key: "f", label: "a", onPress: () => createPaneFromTemplate("financial-analysis-pane", { symbol: selectedSymbol }) },
105
107
  { id: "chart", key: "g", label: "raph", onPress: () => createPaneFromTemplate("chart-composer-pane", { arg: selectedSymbol }) },
106
108
  { id: "related", key: "t", label: litigation ? "o calendar" : "o litigation", onPress: () => createPaneFromTemplate(litigation ? "catalysts-pane" : "litigation-pane", { symbol: selectedSymbol }) }] : []),
@@ -2,21 +2,33 @@ import {
2
2
  apiClient,
3
3
  type CloudCdsHistoryPointPayload,
4
4
  type CloudCdsHistoryResponse,
5
+ type CloudCdsLevelsResponse,
5
6
  type CloudCdsResponse,
6
7
  } from "../../../api-client";
7
8
  import type { CloudCdsHistoryParams } from "../../../api-client/paths";
8
9
  import type { InstrumentSearchResult } from "../../../types/instrument";
9
- import { normalizeCdsTrades, type CdsTrade } from "./model";
10
+ import {
11
+ cdsReferenceEntity,
12
+ issuerNameOf,
13
+ normalizeCdsTrades,
14
+ spreadLevelsOf,
15
+ type CdsSpreadLevels,
16
+ type CdsTrade,
17
+ } from "./model";
10
18
 
11
19
  /** One trading week of public dissemination is what "recent activity" means here. */
12
- const CDS_HISTORY_DAYS = 5;
20
+ export const CDS_TRADE_DAYS = 5;
13
21
  const CDS_TRADE_LIMIT = 500;
14
22
 
15
23
  export interface CdsActivity {
16
24
  source: string;
17
25
  asOf: string | null;
26
+ /** What was asked for, as typed: a ticker or a name. Null for the market-wide view. */
27
+ query: string | null;
18
28
  /** The issuer name actually sent, after any symbol lookup. */
19
29
  issuer: string | null;
30
+ /** How many days of the tape the trades cover. */
31
+ days: number;
20
32
  trades: CdsTrade[];
21
33
  }
22
34
 
@@ -27,7 +39,8 @@ export type InstrumentSearch = (query: string, limit?: number) => Promise<Instru
27
39
 
28
40
  /**
29
41
  * A bare ticker with normal symbol punctuation and no spaces. Anything longer or
30
- * containing a space is already a company name and is sent to the backend as-is.
42
+ * containing a space is already a company name and is sent as the tape would
43
+ * name it.
31
44
  */
32
45
  const TICKER_LIKE = /^[A-Za-z0-9][A-Za-z0-9.^:-]{0,11}$/;
33
46
  const US_PRIMARY_EXCHANGES = new Set(["AMEX", "NASDAQ", "NYSE", "NYSEAMERICAN", "NYSEARCA"]);
@@ -42,22 +55,28 @@ function isPrimaryUsCommonStock(result: InstrumentSearchResult): boolean {
42
55
 
43
56
  /**
44
57
  * The backend matches DTCC issuer names, so a ticker has to become a company
45
- * name first. An untracked symbol has no local metadata to expand it, and its
46
- * quote name never arrives for a fixed binding, so the shared instrument search
47
- * is the only reliable expansion. A search outage falls back to the raw input
48
- * rather than taking the CDS request down with it.
58
+ * name first: its reference entity when the debt sits with another entity,
59
+ * else the listed company's name without its share class ("Alphabet Inc.",
60
+ * not "Alphabet Inc. Class A Common Stock"). An untracked symbol has no local
61
+ * metadata to expand it, and its quote name never arrives for a fixed
62
+ * binding, so the shared instrument search is the only reliable expansion. A
63
+ * search outage falls back to the raw input rather than taking the CDS
64
+ * request down with it.
49
65
  */
50
- async function resolveIssuerName(
66
+ export async function resolveIssuerName(
51
67
  issuer: string,
52
68
  searchInstruments: InstrumentSearch,
53
69
  ): Promise<string> {
54
- if (!TICKER_LIKE.test(issuer)) return issuer;
70
+ if (!TICKER_LIKE.test(issuer)) return issuerNameOf(issuer);
71
+ const referenceEntity = cdsReferenceEntity(issuer);
72
+ if (referenceEntity) return referenceEntity;
55
73
  try {
56
74
  const results = await searchInstruments(issuer);
57
75
  const symbol = issuer.toUpperCase();
58
76
  const exactMatches = results.filter((result) => result.symbol.toUpperCase() === symbol);
59
77
  const match = exactMatches.find(isPrimaryUsCommonStock) ?? exactMatches[0] ?? results[0];
60
- return match?.name?.trim() || issuer;
78
+ const name = match?.name?.trim();
79
+ return name ? issuerNameOf(name) : issuer;
61
80
  } catch {
62
81
  return issuer;
63
82
  }
@@ -68,16 +87,19 @@ export async function loadCdsActivity(
68
87
  fetchCds: CdsFetch = (params) => apiClient.getCloudCds(params),
69
88
  searchInstruments: InstrumentSearch = (query, limit) => apiClient.searchInstruments(query, limit),
70
89
  ): Promise<CdsActivity> {
71
- const resolved = issuer ? await resolveIssuerName(issuer, searchInstruments) : null;
90
+ const query = issuer?.trim() || null;
91
+ const resolved = query ? await resolveIssuerName(query, searchInstruments) : null;
72
92
  const response = await fetchCds({
73
93
  ...(resolved ? { issuer: resolved } : {}),
74
- days: CDS_HISTORY_DAYS,
94
+ days: CDS_TRADE_DAYS,
75
95
  limit: CDS_TRADE_LIMIT,
76
96
  });
77
97
  return {
78
98
  source: response.source,
79
99
  asOf: response.asOf,
100
+ query,
80
101
  issuer: resolved,
102
+ days: CDS_TRADE_DAYS,
81
103
  trades: normalizeCdsTrades(response.trades ?? []),
82
104
  };
83
105
  }
@@ -107,3 +129,18 @@ export async function loadCdsSpreadHistory(
107
129
  .toSorted((left, right) => left.date.localeCompare(right.date));
108
130
  return { issuer: response.issuer, points };
109
131
  }
132
+
133
+ export type CdsLevelsFetch = () => Promise<CloudCdsLevelsResponse>;
134
+ export type CdsSpreadLevelsLoader = () => Promise<CdsSpreadLevels>;
135
+
136
+ /**
137
+ * Every listed issuer's latest 5Y level, in one request: the last point of
138
+ * each name's line over the last month, the line the pane charts, so the list
139
+ * can be ranked by it. A name without one is not in the response.
140
+ */
141
+ export async function loadCdsSpreadLevels(
142
+ fetchLevels: CdsLevelsFetch = () => apiClient.getCloudCdsLevels(),
143
+ ): Promise<CdsSpreadLevels> {
144
+ const response = await fetchLevels();
145
+ return spreadLevelsOf(response.levels ?? []);
146
+ }
@@ -1,32 +1,50 @@
1
1
  import type {
2
+ HeadlessBundleResult,
3
+ HeadlessBundleSection,
2
4
  HeadlessPaneDefinition,
5
+ HeadlessPaneEntry,
3
6
  HeadlessPaneLoadArgs,
4
- HeadlessRowsResult,
5
7
  } from "../../../types/plugin";
6
8
  import {
9
+ CDS_TRADE_DAYS,
7
10
  loadCdsActivity,
11
+ loadCdsSpreadHistory,
12
+ loadCdsSpreadLevels,
8
13
  type CdsActivity,
9
14
  type CdsFetch,
15
+ type CdsHistoryFetch,
16
+ type CdsLevelsFetch,
17
+ type CdsSpreadHistory,
10
18
  type InstrumentSearch,
11
19
  } from "./client";
12
20
  import {
13
21
  DEFAULT_ISSUER_SORT,
14
22
  DEFAULT_TRADE_SORT,
23
+ cdsFreshness,
24
+ displayIssuerName,
15
25
  formatBp,
16
26
  formatEventTime,
17
27
  formatNotional,
28
+ formatSpreadChange,
29
+ formatSpreadRange,
18
30
  formatUpfront,
31
+ lastTradeOf,
32
+ noTradesMessage,
19
33
  sortIssuers,
20
34
  sortTrades,
35
+ spreadSummary,
21
36
  summarizeIssuers,
37
+ withSpreadLevels,
38
+ type CdsSpreadLevels,
22
39
  type CdsTrade,
23
40
  } from "./model";
24
41
 
25
42
  const ISSUER_COLUMNS = [
26
43
  { key: "issuer", header: "Issuer" },
27
44
  { key: "trades", header: "Trades", align: "right" as const },
28
- { key: "lastTradeAt", header: "Last UTC", format: (value: unknown) => formatEventTime(Number(value)) },
29
- { key: "latestSpreadBp", header: "Spread", align: "right" as const, format: (value: unknown) => formatBp(value as number | null) },
45
+ { key: "lastTradeAt", header: "Last UTC", shrink: false, format: (value: unknown) => formatEventTime(Number(value)) },
46
+ { key: "spread5yBp", header: "5Y spread", align: "right" as const, format: (value: unknown) => formatBp(value as number | null) },
47
+ { key: "spread5yDate", header: "5Y date", shrink: false, format: (value: unknown) => (typeof value === "string" ? value : "--") },
30
48
  ];
31
49
 
32
50
  function tradeForFormatting(row: Record<string, unknown>): CdsTrade {
@@ -34,7 +52,7 @@ function tradeForFormatting(row: Record<string, unknown>): CdsTrade {
34
52
  }
35
53
 
36
54
  const TRADE_COLUMNS = [
37
- { key: "eventAt", header: "Time UTC", format: (value: unknown) => formatEventTime(Number(value)) },
55
+ { key: "eventAt", header: "Time UTC", shrink: false, format: (value: unknown) => formatEventTime(Number(value)) },
38
56
  { key: "issuer", header: "Issuer" },
39
57
  { key: "maturity", header: "Maturity" },
40
58
  {
@@ -48,27 +66,94 @@ const TRADE_COLUMNS = [
48
66
  { key: "spreadBp", header: "Spread", align: "right" as const, format: (value: unknown) => formatBp(value as number | null) },
49
67
  {
50
68
  key: "upfront",
51
- header: "Upfront",
69
+ header: "Abs upfront",
52
70
  align: "right" as const,
53
71
  format: (_value: unknown, row: Record<string, unknown>) => formatUpfront(tradeForFormatting(row)),
54
72
  },
55
73
  ];
56
74
 
57
- function projectCdsHeadless(activity: CdsActivity, issuer: string | null): HeadlessRowsResult {
58
- if (issuer) {
75
+ /**
76
+ * The pane's figures over its 5Y chart, as label and value lines: the level,
77
+ * its date, the 1M move on the same contract (`--` across a roll) and the
78
+ * range charted. JSON keeps the numbers; text and CSV read as the pane does.
79
+ */
80
+ function spreadEntries(history: CdsSpreadHistory): HeadlessPaneEntry[] {
81
+ const summary = spreadSummary(history.points);
82
+ if (!summary) return [];
83
+ return [
84
+ { key: "spreadBp", label: "5Y spread", value: summary.spreadBp, formatted: formatBp(summary.spreadBp) },
85
+ { key: "date", label: "Date", value: summary.date },
86
+ {
87
+ key: "change1mBp",
88
+ label: "1M change",
89
+ value: summary.change1mBp,
90
+ formatted: summary.change1mBp == null ? "--" : formatSpreadChange(summary.change1mBp),
91
+ },
92
+ ...(summary.range ? [{
93
+ key: "range",
94
+ label: "Range",
95
+ value: summary.range,
96
+ formatted: `${formatSpreadRange(summary.range)} since ${summary.range.since}`,
97
+ }] : []),
98
+ ];
99
+ }
100
+
101
+ interface CdsReportInputs {
102
+ activity: CdsActivity;
103
+ /** The issuer's 5Y line, or the error that kept it out. */
104
+ history?: CdsSpreadHistory | Error | null;
105
+ /** Each listed issuer's 5Y level, or the error that kept them out. */
106
+ levels?: CdsSpreadLevels | Error | null;
107
+ }
108
+
109
+ function projectCdsHeadless({ activity, history, levels }: CdsReportInputs): HeadlessBundleResult {
110
+ const errors: string[] = [];
111
+ const notes: string[] = [];
112
+ const empty = noTradesMessage({ query: activity.query, issuer: activity.issuer, days: activity.days });
113
+ const metadata = { issuer: activity.issuer, days: activity.days };
114
+ if (activity.query) {
115
+ const line = history instanceof Error || !history ? null : history;
116
+ if (history instanceof Error) errors.push("5Y spread history unavailable.");
117
+ const entries = line ? spreadEntries(line) : [];
118
+ // The name the tape was queried for heads the figures, as in the pane, so a ticker says what it became.
119
+ const name = displayIssuerName(activity.issuer ?? line?.issuer ?? activity.query);
120
+ if (line && entries.length === 0) notes.push(`No 5Y spread level for ${name} in the last two years.`);
121
+ const sections: HeadlessBundleSection[] = [
122
+ ...(entries.length ? [{ title: name, entries }] : []),
123
+ {
124
+ title: "Trades",
125
+ columns: TRADE_COLUMNS,
126
+ rows: sortTrades(activity.trades, DEFAULT_TRADE_SORT).map((trade) => ({ ...trade })),
127
+ empty,
128
+ },
129
+ ];
59
130
  return {
60
- columns: TRADE_COLUMNS,
61
- rows: sortTrades(activity.trades, DEFAULT_TRADE_SORT).map((trade) => ({ ...trade })),
62
- metadata: { source: activity.source, asOf: activity.asOf, issuer: activity.issuer },
131
+ sections,
132
+ metadata,
133
+ freshness: cdsFreshness(lastTradeOf(activity.trades, line?.points)),
134
+ ...(errors.length ? { errors } : {}),
135
+ ...(notes.length ? { notes } : {}),
63
136
  };
64
137
  }
138
+ if (levels instanceof Error) errors.push("5Y spreads unavailable.");
139
+ const issuers = withSpreadLevels(summarizeIssuers(activity.trades), levels instanceof Error ? null : levels ?? null);
65
140
  return {
66
- columns: ISSUER_COLUMNS,
67
- rows: sortIssuers(summarizeIssuers(activity.trades), DEFAULT_ISSUER_SORT).map((issuerRow) => ({ ...issuerRow })),
68
- metadata: { source: activity.source, asOf: activity.asOf, issuer: null },
141
+ sections: [{
142
+ title: "Issuers",
143
+ columns: ISSUER_COLUMNS,
144
+ rows: sortIssuers(issuers, DEFAULT_ISSUER_SORT).map((issuerRow) => ({ ...issuerRow })),
145
+ empty,
146
+ }],
147
+ metadata,
148
+ freshness: cdsFreshness(lastTradeOf(activity.trades)),
149
+ ...(errors.length ? { errors } : {}),
69
150
  };
70
151
  }
71
152
 
153
+ function settled<T>(pending: Promise<T>): Promise<T | Error> {
154
+ return pending.catch((error: unknown) => (error instanceof Error ? error : new Error(String(error))));
155
+ }
156
+
72
157
  export interface CdsHeadlessDependencies {
73
158
  load(
74
159
  args: HeadlessPaneLoadArgs,
@@ -76,38 +161,53 @@ export interface CdsHeadlessDependencies {
76
161
  fetchCds: CdsFetch,
77
162
  searchInstruments: InstrumentSearch,
78
163
  ): Promise<CdsActivity>;
164
+ loadHistory?(issuer: string, fetchHistory: CdsHistoryFetch): Promise<CdsSpreadHistory>;
165
+ loadLevels?: typeof loadCdsSpreadLevels;
79
166
  }
80
167
 
81
168
  const defaultDependencies: CdsHeadlessDependencies = {
82
169
  load: (_args, issuer, fetchCds, searchInstruments) => (
83
170
  loadCdsActivity(issuer, fetchCds, searchInstruments)
84
171
  ),
172
+ loadHistory: (issuer, fetchHistory) => loadCdsSpreadHistory(issuer, fetchHistory),
173
+ loadLevels: loadCdsSpreadLevels,
85
174
  };
86
175
 
87
176
  export function createCdsHeadless(
88
177
  dependencies: CdsHeadlessDependencies = defaultDependencies,
89
- ): HeadlessPaneDefinition<"rows"> {
178
+ ): HeadlessPaneDefinition<"bundle"> {
179
+ const loadHistory = dependencies.loadHistory ?? defaultDependencies.loadHistory!;
180
+ const loadLevels = dependencies.loadLevels ?? defaultDependencies.loadLevels!;
90
181
  return {
91
- shape: "rows",
92
- // Public dissemination of swap trades, held back by rule for some trades.
93
- freshness: { source: "DTCC", status: "delayed" },
182
+ shape: "bundle",
183
+ description: `Single-name CDS from DTCC public dissemination. With no argument: the issuers traded in the last ${CDS_TRADE_DAYS} days, most active first, with trade count, last trade and 5Y spread. With a ticker or issuer: its 5Y spread (level, date, 1M change, range) and its trades.`,
184
+ freshness: cdsFreshness(null),
94
185
  argument: {
95
186
  kind: "free-text",
96
187
  placeholder: "ticker or issuer",
97
- description: "Optional ticker or issuer. Omit for the most-active issuer view.",
188
+ description: "Optional ticker or issuer. Omit to list the most-active issuers with their 5Y spread.",
98
189
  optional: true,
99
190
  },
100
191
  options: [],
101
192
  describe: (args) => typeof args.argument === "string" ? `CDS | ${args.argument}` : "Single-Name CDS",
102
193
  async load(args, ctx) {
103
194
  const issuer = typeof args.argument === "string" ? args.argument : null;
195
+ const fetchHistory: CdsHistoryFetch = (params) => ctx.apiClient.getCloudCdsHistory(params);
196
+ const fetchLevels: CdsLevelsFetch = () => ctx.apiClient.getCloudCdsLevels();
197
+ // The list's levels are one request for every issuer, read beside its trades.
198
+ const levels = issuer?.trim() ? null : settled(loadLevels(fetchLevels));
104
199
  const activity = await dependencies.load(
105
200
  args,
106
201
  issuer,
107
202
  (params) => ctx.apiClient.getCloudCds(params),
108
203
  (query, limit) => ctx.apiClient.searchInstruments(query, limit),
109
204
  );
110
- return projectCdsHeadless(activity, issuer);
205
+ if (activity.query) {
206
+ // The line follows the name the tape was queried for, as the pane's does.
207
+ const history = activity.issuer ? await settled(loadHistory(activity.issuer, fetchHistory)) : null;
208
+ return projectCdsHeadless({ activity, history });
209
+ }
210
+ return projectCdsHeadless({ activity, levels: await levels });
111
211
  },
112
212
  };
113
213
  }
@@ -1,5 +1,6 @@
1
1
  import type { PaneTemplateCreateOptions } from "../../../types/plugin";
2
2
  import type { PluginModule } from "../plugin-module";
3
+ import { SINGLE_NAME_CDS_SERIES } from "./series";
3
4
  import { CDS_PANE_ID } from "./model";
4
5
  import { CdsPane } from "./pane";
5
6
  import { cdsHeadless } from "./headless";
@@ -12,6 +13,7 @@ function explicitSymbol(options?: PaneTemplateCreateOptions): string | null {
12
13
  }
13
14
 
14
15
  export const cdsModule: PluginModule = {
16
+ series: SINGLE_NAME_CDS_SERIES,
15
17
  panes: [{
16
18
  id: CDS_PANE_ID,
17
19
  name: "Single-Name CDS",
@@ -27,7 +29,7 @@ export const cdsModule: PluginModule = {
27
29
  id: "cds-pane",
28
30
  paneId: CDS_PANE_ID,
29
31
  label: "Single-Name CDS",
30
- description: "Single-name corporate CDS trades and 5Y spread history from DTCC public dissemination.",
32
+ description: "Single-name corporate CDS from DTCC public dissemination: with no argument, the issuers traded in the last 5 days with their 5Y spread; with a ticker or issuer, its 5Y spread history and trades.",
31
33
  keywords: ["cds", "credit", "default", "swap", "spread", "single name", "issuer", "dtcc", "protection"],
32
34
  shortcut: { prefix: "CDS", argPlaceholder: "ticker", argKind: "ticker", argOptional: true },
33
35
  headless: cdsHeadless,