gloomberb 0.16.3 → 0.16.5

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 (820) hide show
  1. package/README.md +14 -91
  2. package/package.json +7 -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 +42 -17
  11. package/src/account/upgrade-personalization.ts +57 -0
  12. package/src/account/upgrade-tickers.ts +124 -0
  13. package/src/{plugins/builtin/cloud → account}/verification-panel.tsx +6 -6
  14. package/src/api-client/askg.ts +43 -0
  15. package/src/api-client/auth.ts +15 -0
  16. package/src/api-client/beneficial-owners.ts +4 -0
  17. package/src/api-client/chat.ts +19 -0
  18. package/src/api-client/company-kpis.ts +14 -2
  19. package/src/api-client/data.ts +58 -18
  20. package/src/api-client/earnings.ts +6 -0
  21. package/src/api-client/futures-curve.ts +56 -0
  22. package/src/api-client/index.ts +16 -1
  23. package/src/api-client/market-discovery.ts +10 -1
  24. package/src/api-client/normalizers.ts +27 -0
  25. package/src/api-client/paths.ts +95 -23
  26. package/src/api-client/request.ts +2 -1
  27. package/src/api-client/research-activity.ts +46 -10
  28. package/src/api-client/socket.ts +39 -8
  29. package/src/api-client/types.ts +74 -2
  30. package/src/api-client/upgrade-experiment.ts +90 -0
  31. package/src/api-client/yield-curves.ts +8 -0
  32. package/src/app/global-shortcuts.ts +26 -2
  33. package/src/app/keybindings/actions.ts +10 -0
  34. package/src/app/pane-runtime/index.tsx +8 -0
  35. package/src/app/pane-runtime/pane-template-runtime.ts +5 -0
  36. package/src/app/pane-runtime/plugin-bindings.ts +65 -25
  37. package/src/app/pane-runtime/ticker-inspector-runtime.ts +12 -0
  38. package/src/app/pane-runtime/ticker-open-runtime.ts +25 -4
  39. package/src/app/runtime/desktop-deeplink.ts +5 -0
  40. package/src/app/star-prompt/model.ts +98 -0
  41. package/src/app/star-prompt/runtime.ts +41 -0
  42. package/src/app/star-prompt/status-line.tsx +190 -0
  43. package/src/app.tsx +13 -7
  44. package/src/architecture/core-builtin-allowlist.json +61 -0
  45. package/src/brokers/signed-in/adapter.ts +33 -2
  46. package/src/brokers/signed-in/client.ts +10 -0
  47. package/src/brokers/signed-in/sign-in-dialog.tsx +34 -14
  48. package/src/brokers/signed-in/sign-in.ts +62 -5
  49. package/src/capabilities/chart-series.ts +11 -1
  50. package/src/capabilities/registry.ts +8 -1
  51. package/src/capabilities/types.ts +2 -0
  52. package/src/cli/commands/crypto-hints.ts +19 -4
  53. package/src/cli/commands/fred-series.ts +61 -0
  54. package/src/cli/commands/market.ts +744 -181
  55. package/src/cli/commands/news-hints.ts +62 -0
  56. package/src/cli/commands/news-search.ts +53 -0
  57. package/src/cli/commands/options-chain.ts +172 -0
  58. package/src/cli/commands/options-leaps.ts +425 -0
  59. package/src/cli/commands/overview.ts +251 -40
  60. package/src/cli/commands/remote.ts +2 -1
  61. package/src/cli/commands/search.ts +109 -15
  62. package/src/cli/commands/system.ts +151 -24
  63. package/src/cli/commands/themes.ts +64 -0
  64. package/src/cli/commands/ticker.ts +149 -40
  65. package/src/cli/context.ts +45 -14
  66. package/src/cli/desktop-pane-shot.ts +150 -17
  67. package/src/cli/earnings-calendar.ts +71 -0
  68. package/src/cli/errors.ts +25 -2
  69. package/src/cli/freshness.ts +22 -8
  70. package/src/cli/fx-pair.ts +57 -0
  71. package/src/cli/glossary.ts +429 -0
  72. package/src/cli/help.ts +14 -1
  73. package/src/cli/history-rows.ts +48 -7
  74. package/src/cli/index-roots.ts +58 -0
  75. package/src/cli/index.ts +29 -12
  76. package/src/cli/known-gaps.ts +27 -0
  77. package/src/cli/listing-arg.ts +595 -26
  78. package/src/cli/not-a-ticker.ts +44 -0
  79. package/src/cli/options.ts +50 -6
  80. package/src/cli/pane-functions/access-gate.ts +5 -0
  81. package/src/cli/pane-functions/capabilities.ts +11 -4
  82. package/src/cli/pane-functions/catalog.ts +48 -7
  83. package/src/cli/pane-functions/data.ts +48 -13
  84. package/src/cli/pane-functions/discovery.ts +1 -0
  85. package/src/cli/pane-functions/dom.ts +41 -19
  86. package/src/cli/pane-functions/freshness.ts +531 -32
  87. package/src/cli/pane-functions/function-help.ts +77 -25
  88. package/src/cli/pane-functions/headless.ts +50 -21
  89. package/src/cli/pane-functions/index.ts +66 -10
  90. package/src/cli/pane-functions/market-session.ts +147 -0
  91. package/src/cli/pane-functions/options.ts +77 -25
  92. package/src/cli/pane-functions/report-notices.ts +81 -0
  93. package/src/cli/pane-functions/report.ts +19 -8
  94. package/src/cli/pane-functions/resolver.ts +53 -18
  95. package/src/cli/pane-functions/screenshot-evidence.ts +2 -0
  96. package/src/cli/pane-functions/screenshot.ts +199 -30
  97. package/src/cli/registry.ts +2 -1
  98. package/src/cli/report-tables.ts +3 -0
  99. package/src/cli/result.ts +53 -13
  100. package/src/cli/row-window.ts +76 -0
  101. package/src/cli/scroll-truncation.ts +34 -0
  102. package/src/cli/staged-tickers.ts +52 -0
  103. package/src/cli/symbol-args.ts +9 -0
  104. package/src/cli/symbol-list.ts +172 -0
  105. package/src/cli/ticker-resolution.ts +223 -30
  106. package/src/cli/types.ts +5 -0
  107. package/src/components/chart/composite/axis-overlays.tsx +6 -2
  108. package/src/components/chart/composite/composite-chart.tsx +83 -10
  109. package/src/components/chart/composite/legend.tsx +88 -8
  110. package/src/components/chart/composite/panel-surface.tsx +44 -17
  111. package/src/components/chart/composite/price-axis-labels.tsx +3 -1
  112. package/src/components/chart/composite/rasterizer.ts +64 -4
  113. package/src/components/chart/composite/series-cues.ts +71 -0
  114. package/src/components/chart/composite/text-renderer.ts +16 -8
  115. package/src/components/chart/composite/types.ts +3 -0
  116. package/src/components/command-bar/commands/direct/index.ts +9 -1
  117. package/src/components/command-bar/commands/plugin/items.ts +3 -1
  118. package/src/components/command-bar/commands/registry.ts +7 -0
  119. package/src/components/command-bar/layout-items/focused-pane.ts +38 -0
  120. package/src/components/command-bar/pane-templates/workflow.ts +5 -0
  121. package/src/components/command-bar/panel/index.tsx +11 -3
  122. package/src/components/command-bar/panel/runtime.ts +3 -0
  123. package/src/components/command-bar/panel/types.ts +2 -0
  124. package/src/components/command-bar/routes/root/command-items.ts +2 -0
  125. package/src/components/command-bar/routes/root/plugin-turn-on.ts +92 -0
  126. package/src/components/command-bar/routes/root/provider-search.ts +4 -3
  127. package/src/components/command-bar/routes/root/results.ts +40 -10
  128. package/src/components/command-bar/routes/root/runtime.ts +8 -0
  129. package/src/components/command-bar/routes/root/search-providers.ts +97 -14
  130. package/src/components/command-bar/routes/ticker-search/results.ts +12 -11
  131. package/src/components/command-bar/routes/ticker-search/route.ts +4 -3
  132. package/src/components/command-bar/surface/index.tsx +18 -4
  133. package/src/components/command-bar/theme-picker.tsx +48 -13
  134. package/src/components/command-bar/workflow/ops.ts +5 -3
  135. package/src/components/command-bar/workflow/tickers.ts +23 -4
  136. package/src/components/data-table/view.tsx +28 -9
  137. package/src/components/layout/detached-pane-shell.tsx +9 -0
  138. package/src/components/layout/floating-pane.tsx +9 -2
  139. package/src/components/layout/header.tsx +20 -5
  140. package/src/components/layout/market-summary.ts +23 -9
  141. package/src/components/layout/pane/content.tsx +40 -29
  142. package/src/components/layout/pane/cycle-order.ts +2 -11
  143. package/src/components/layout/pane/footer/index.tsx +6 -2
  144. package/src/components/layout/pane/footer/model.ts +35 -1
  145. package/src/components/layout/pane/header.tsx +26 -2
  146. package/src/components/layout/pane/index.tsx +12 -2
  147. package/src/components/layout/pane/sidebar.tsx +78 -10
  148. package/src/components/layout/pane/title.ts +1 -1
  149. package/src/components/layout/presentation.ts +22 -0
  150. package/src/components/layout/shell/active-drag.ts +21 -5
  151. package/src/components/layout/shell/drag/index.ts +43 -9
  152. package/src/components/layout/shell/drag/live.ts +87 -6
  153. package/src/components/layout/shell/drag/runtime.ts +62 -20
  154. package/src/components/layout/shell/index.tsx +71 -12
  155. package/src/components/layout/shell/layout-state.ts +5 -11
  156. package/src/components/layout/shell/menu.ts +33 -1
  157. package/src/components/layout/shell/native/pointer-runtime.ts +3 -1
  158. package/src/components/layout/shell/pane/actions.ts +2 -1
  159. package/src/components/layout/shell/pane/layers.tsx +216 -28
  160. package/src/components/layout/shell/pane/management-shortcuts.ts +5 -0
  161. package/src/components/layout/shell/pane/new-layout.ts +116 -0
  162. package/src/components/layout/shell/shortcuts.ts +5 -2
  163. package/src/components/layout/shell/terminal-pointer-runtime.ts +24 -0
  164. package/src/components/layout/shell/visible-layout.ts +44 -1
  165. package/src/components/layout/status-bar.tsx +4 -1
  166. package/src/components/markdown-text.tsx +69 -23
  167. package/src/components/metric-treemap/heat-surface.tsx +37 -9
  168. package/src/components/metric-treemap/heat-tiles.ts +48 -17
  169. package/src/components/onboarding/account-step/form-panel.tsx +1 -1
  170. package/src/components/onboarding/account-step/index.tsx +1 -1
  171. package/src/components/onboarding/account-step/qr-panel.tsx +1 -1
  172. package/src/components/onboarding/account-step/signed-in-panel.tsx +1 -1
  173. package/src/components/onboarding/onboarding-frame.tsx +33 -10
  174. package/src/components/onboarding/onboarding-keyboard.ts +1 -1
  175. package/src/components/onboarding/onboarding-wizard.tsx +50 -41
  176. package/src/components/onboarding/portfolio-step/positions-panel.tsx +5 -2
  177. package/src/components/onboarding/pro-step-layout.ts +86 -0
  178. package/src/components/onboarding/use-onboarding-upgrade.ts +8 -4
  179. package/src/components/onboarding/wizard-account.ts +2 -2
  180. package/src/components/pane-template-wizard.tsx +9 -1
  181. package/src/components/price-selector-dialog.tsx +11 -2
  182. package/src/components/sign-in-gate.tsx +3 -3
  183. package/src/components/ticker/list-table-view.tsx +24 -1
  184. package/src/components/ui/action-row.tsx +2 -1
  185. package/src/components/ui/button.tsx +17 -1
  186. package/src/components/ui/choice-dialog.tsx +6 -4
  187. package/src/components/ui/confirm-dialog.tsx +28 -18
  188. package/src/components/ui/data-table/index.tsx +49 -0
  189. package/src/components/ui/data-table/opentui/index.tsx +37 -6
  190. package/src/components/ui/data-table/types.ts +20 -1
  191. package/src/components/ui/data-table/visible-range.ts +2 -0
  192. package/src/components/ui/dialog-actions.tsx +64 -0
  193. package/src/components/ui/display.tsx +17 -3
  194. package/src/components/ui/frame.tsx +35 -2
  195. package/src/components/ui/icon.tsx +13 -2
  196. package/src/components/ui/index.ts +1 -1
  197. package/src/components/ui/text-prompt-dialog.tsx +11 -9
  198. package/src/core/connection-health.ts +1 -1
  199. package/src/core/state/app/layout-reducer.ts +89 -3
  200. package/src/core/state/app/state.ts +8 -5
  201. package/src/core/state/app/types.ts +13 -2
  202. package/src/data/cached-query.ts +2 -0
  203. package/src/data/config/layout.ts +55 -21
  204. package/src/data/config/store/fold-panes.ts +149 -0
  205. package/src/data/config/store/migrations.ts +7 -0
  206. package/src/data/config/store/node.ts +27 -6
  207. package/src/data/config/store/normalize.ts +44 -5
  208. package/src/data/ticker-repository.ts +5 -0
  209. package/src/data/ticker-store.ts +15 -0
  210. package/src/docs/content.ts +215 -0
  211. package/src/docs/load.ts +139 -0
  212. package/src/docs/requests.ts +39 -0
  213. package/src/docs/snapshot.chunk.ts +8 -0
  214. package/src/docs/snapshot.json +7416 -0
  215. package/src/docs/topics.ts +216 -0
  216. package/src/i18n/es.ts +75 -5
  217. package/src/i18n/ja.ts +75 -5
  218. package/src/i18n/ko.ts +75 -5
  219. package/src/i18n/zh-cn.ts +75 -5
  220. package/src/i18n/zh-tw.ts +75 -5
  221. package/src/layout/desks.ts +2 -3
  222. package/src/layout/pane-layout-move.ts +264 -0
  223. package/src/layout/pane-manager/dock-tree.ts +18 -0
  224. package/src/layout/pane-manager/hidden-panes.ts +160 -0
  225. package/src/layout/pane-manager/index.ts +2 -0
  226. package/src/market-data/coordinator/chart.ts +10 -4
  227. package/src/market-data/coordinator/entries.ts +7 -1
  228. package/src/market-data/coordinator/index.ts +6 -3
  229. package/src/market-data/coordinator/quotes.ts +2 -2
  230. package/src/{plugins/builtin/futures/contracts.ts → market-data/futures-board.ts} +81 -28
  231. package/src/market-data/futures-contract.ts +151 -0
  232. package/src/market-data/hooks.tsx +10 -2
  233. package/src/market-data/market/format.ts +39 -21
  234. package/src/market-data/market/freshness.ts +193 -30
  235. package/src/market-data/market/status.ts +59 -23
  236. package/src/market-data/options-alternatives.ts +69 -0
  237. package/src/market-data/published-apac-sessions.ts +23 -1
  238. package/src/market-data/quotes/contributions.ts +22 -2
  239. package/src/market-data/quotes/metadata.ts +8 -9
  240. package/src/market-data/quotes/resolution.ts +2 -0
  241. package/src/market-data/quotes/screener-live-quotes.ts +61 -9
  242. package/src/market-data/result-types.ts +2 -0
  243. package/src/plugins/builtin/account-management/keyboard.ts +3 -0
  244. package/src/plugins/builtin/account-management/model.ts +2 -56
  245. package/src/plugins/builtin/account-management/navigation.ts +1 -1
  246. package/src/plugins/builtin/account-management/pane.tsx +37 -8
  247. package/src/plugins/builtin/account-management/password-dialog.tsx +1 -1
  248. package/src/plugins/builtin/alerts/cli.ts +313 -47
  249. package/src/plugins/builtin/alerts/events-pane.tsx +45 -7
  250. package/src/plugins/builtin/alerts/events.ts +23 -2
  251. package/src/plugins/builtin/alerts/history-pane.tsx +7 -2
  252. package/src/plugins/builtin/alerts/history.ts +2 -0
  253. package/src/plugins/builtin/alerts/index.tsx +41 -9
  254. package/src/plugins/builtin/alerts/pane.tsx +8 -0
  255. package/src/plugins/builtin/alerts/quotes.ts +3 -0
  256. package/src/plugins/builtin/alerts/research-builder.ts +8 -3
  257. package/src/plugins/builtin/alerts/research-rules.ts +18 -2
  258. package/src/plugins/builtin/alerts/scheduled-check.ts +122 -0
  259. package/src/plugins/builtin/alerts/scheduled-sources.ts +25 -0
  260. package/src/plugins/builtin/alerts/scheduled.ts +254 -0
  261. package/src/plugins/builtin/alerts/targets.ts +92 -0
  262. package/src/plugins/builtin/analytics/index.tsx +4 -2
  263. package/src/plugins/builtin/analytics/risk-headless.ts +33 -13
  264. package/src/plugins/builtin/analytics/risk-math.ts +91 -27
  265. package/src/plugins/builtin/analytics/risk-model.ts +71 -12
  266. package/src/plugins/builtin/analytics/risk-pane.tsx +23 -12
  267. package/src/plugins/builtin/attention/index.tsx +2 -0
  268. package/src/plugins/builtin/attention/pane.tsx +3 -1
  269. package/src/plugins/builtin/attention/series.ts +26 -0
  270. package/src/plugins/builtin/awards/index.tsx +2 -0
  271. package/src/plugins/builtin/awards/pane.tsx +3 -1
  272. package/src/plugins/builtin/awards/series.ts +29 -0
  273. package/src/plugins/builtin/backtest/pane.tsx +1 -1
  274. package/src/plugins/builtin/bond-calculator/model.ts +2 -1
  275. package/src/plugins/builtin/broker-manager/detail.tsx +4 -0
  276. package/src/plugins/builtin/broker-manager/index.tsx +7 -3
  277. package/src/plugins/builtin/broker-manager/model.ts +8 -0
  278. package/src/plugins/builtin/broker-manager/pane-actions.tsx +8 -2
  279. package/src/plugins/builtin/broker-manager/sign-in-end.ts +82 -0
  280. package/src/plugins/builtin/broker-manager/table.ts +5 -0
  281. package/src/plugins/builtin/builtin-plugin-meta.ts +121 -11
  282. package/src/plugins/builtin/catalysts/pane.tsx +3 -1
  283. package/src/plugins/builtin/cds/client.ts +70 -13
  284. package/src/plugins/builtin/cds/headless.ts +116 -19
  285. package/src/plugins/builtin/cds/index.tsx +3 -1
  286. package/src/plugins/builtin/cds/model.ts +193 -31
  287. package/src/plugins/builtin/cds/pane.tsx +56 -14
  288. package/src/plugins/builtin/cds/series.ts +19 -0
  289. package/src/plugins/builtin/central-bank-rates/index.tsx +2 -0
  290. package/src/plugins/builtin/central-bank-rates/series.ts +42 -0
  291. package/src/plugins/builtin/chart-composer/catalog-inventory.ts +192 -255
  292. package/src/plugins/builtin/chart-composer/data-catalog-pane.tsx +84 -46
  293. package/src/plugins/builtin/chart-composer/editor.tsx +5 -4
  294. package/src/plugins/builtin/chart-composer/field-series.ts +40 -0
  295. package/src/plugins/builtin/chart-composer/headless.ts +8 -3
  296. package/src/plugins/builtin/chart-composer/index.tsx +9 -2
  297. package/src/plugins/builtin/chart-composer/pane.tsx +1 -1
  298. package/src/plugins/builtin/chart-composer/series-catalog.ts +58 -50
  299. package/src/plugins/builtin/chart-composer/series-expression.ts +18 -10
  300. package/src/plugins/builtin/chart-composer/use-series-catalog.ts +59 -3
  301. package/src/plugins/builtin/chart-composer/user-series.ts +84 -0
  302. package/src/plugins/builtin/chat/channels.ts +34 -36
  303. package/src/plugins/builtin/chat/command-bar.ts +138 -0
  304. package/src/plugins/builtin/chat/composer-commands.ts +21 -1
  305. package/src/plugins/builtin/chat/content/composer-runtime.ts +11 -1
  306. package/src/plugins/builtin/chat/content/footer.tsx +5 -3
  307. package/src/plugins/builtin/chat/content/index.tsx +21 -1
  308. package/src/plugins/builtin/chat/content/mentions.ts +2 -1
  309. package/src/plugins/builtin/chat/content/new-dm-dialog.tsx +10 -2
  310. package/src/plugins/builtin/chat/content/user-map.ts +3 -1
  311. package/src/plugins/builtin/chat/controller/index.ts +50 -0
  312. package/src/plugins/builtin/chat/conversations.ts +256 -0
  313. package/src/plugins/builtin/chat/discord-command.ts +91 -0
  314. package/src/plugins/builtin/chat/edit-window.ts +12 -6
  315. package/src/plugins/builtin/chat/ghost-user.ts +14 -0
  316. package/src/plugins/builtin/chat/index.tsx +40 -2
  317. package/src/plugins/builtin/chat/layout.ts +2 -0
  318. package/src/plugins/builtin/chat/message/desktop.tsx +2 -1
  319. package/src/plugins/builtin/chat/message/header.tsx +24 -15
  320. package/src/plugins/builtin/chat/message/profile-popover.tsx +2 -1
  321. package/src/plugins/builtin/chat/message/render-state.ts +3 -0
  322. package/src/plugins/builtin/chat/pane-requests.ts +60 -0
  323. package/src/plugins/builtin/chat/pane-state.ts +32 -2
  324. package/src/plugins/builtin/chat/pane.tsx +8 -0
  325. package/src/plugins/builtin/cloud/askg/controller.ts +223 -23
  326. package/src/plugins/builtin/cloud/askg/conversation-store.ts +21 -0
  327. package/src/plugins/builtin/cloud/askg/executor.ts +57 -3
  328. package/src/plugins/builtin/cloud/askg/manifest.ts +33 -7
  329. package/src/plugins/builtin/cloud/askg/model.ts +156 -78
  330. package/src/plugins/builtin/cloud/askg/pane.tsx +772 -377
  331. package/src/plugins/builtin/cloud/askg/protocol.ts +50 -3
  332. package/src/plugins/builtin/cloud/askg/tool-display.ts +440 -0
  333. package/src/plugins/builtin/cloud/askg/tool-timeline.tsx +403 -0
  334. package/src/plugins/builtin/cloud/askg/undo.ts +2 -0
  335. package/src/plugins/builtin/cloud/auth-actions.tsx +1 -1
  336. package/src/plugins/builtin/cloud/auth-commands.ts +1 -1
  337. package/src/plugins/builtin/cloud/auth-dialog.tsx +3 -3
  338. package/src/plugins/builtin/cloud/company-picker.tsx +1 -9
  339. package/src/plugins/builtin/cloud/mcp-connect/command.ts +24 -0
  340. package/src/plugins/builtin/cloud/mcp-connect/dialog.tsx +363 -0
  341. package/src/plugins/builtin/cloud/mcp-connect/model.ts +135 -0
  342. package/src/plugins/builtin/cloud/mcp-connect/sections.ts +62 -0
  343. package/src/plugins/builtin/cloud/plugin.tsx +36 -1
  344. package/src/plugins/builtin/cloud/terminal-relay/acm-tab.tsx +89 -0
  345. package/src/plugins/builtin/cloud/terminal-relay/client.ts +97 -0
  346. package/src/plugins/builtin/cloud/terminal-relay/connect-section.tsx +57 -0
  347. package/src/plugins/builtin/cloud/terminal-relay/engine.ts +734 -0
  348. package/src/plugins/builtin/cloud/terminal-relay/grants.ts +137 -0
  349. package/src/plugins/builtin/cloud/terminal-relay/host.tsx +81 -0
  350. package/src/plugins/builtin/cloud/terminal-relay/indicator.tsx +82 -0
  351. package/src/plugins/builtin/cloud/terminal-relay/manifest.ts +239 -0
  352. package/src/plugins/builtin/cloud/terminal-relay/policy.ts +162 -0
  353. package/src/plugins/builtin/cloud/terminal-relay/prompts.tsx +192 -0
  354. package/src/plugins/builtin/cloud/terminal-relay/redact.ts +73 -0
  355. package/src/plugins/builtin/cloud/terminal-relay/summary.ts +62 -0
  356. package/src/plugins/builtin/cloud/thesis/exposure.ts +1 -1
  357. package/src/plugins/builtin/cloud/thesis/prompts.tsx +2 -1
  358. package/src/plugins/builtin/comment-letters/client.ts +1 -3
  359. package/src/plugins/builtin/company-attention/app-rank.tsx +1 -1
  360. package/src/plugins/builtin/company-attention/headless.ts +19 -5
  361. package/src/plugins/builtin/company-attention/index.tsx +2 -0
  362. package/src/plugins/builtin/company-attention/model.ts +26 -7
  363. package/src/plugins/builtin/company-attention/pane.tsx +12 -9
  364. package/src/plugins/builtin/company-attention/series.ts +52 -0
  365. package/src/plugins/builtin/company-kpis/client.ts +23 -8
  366. package/src/plugins/builtin/company-kpis/headless.ts +3 -1
  367. package/src/plugins/builtin/company-kpis/pane.tsx +19 -9
  368. package/src/plugins/builtin/company-kpis/screenshot-evidence.ts +10 -3
  369. package/src/plugins/builtin/composite-plugins.ts +116 -67
  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/credit-boards/cdx-pane.tsx +4 -4
  374. package/src/plugins/builtin/credit-boards/index.tsx +23 -21
  375. package/src/plugins/builtin/credit-boards/model.ts +0 -1
  376. package/src/plugins/builtin/credit-boards/pane.tsx +30 -0
  377. package/src/plugins/builtin/credit-boards/series.ts +66 -0
  378. package/src/plugins/builtin/credit-boards/sovr-pane.tsx +4 -4
  379. package/src/plugins/builtin/credit-conditions/index.tsx +2 -0
  380. package/src/plugins/builtin/credit-conditions/series.ts +26 -0
  381. package/src/plugins/builtin/credit-documents/headless.ts +31 -1
  382. package/src/plugins/builtin/credit-documents/pane.tsx +3 -1
  383. package/src/plugins/builtin/crypto-board/headless.ts +2 -3
  384. package/src/plugins/builtin/crypto-board/index.tsx +2 -0
  385. package/src/plugins/builtin/crypto-board/model.ts +12 -0
  386. package/src/plugins/builtin/crypto-board/pane.tsx +19 -12
  387. package/src/plugins/builtin/crypto-board/series.ts +48 -0
  388. package/src/plugins/builtin/custom-view/live-quotes.ts +2 -2
  389. package/src/plugins/builtin/debt-maturities/client.ts +37 -9
  390. package/src/plugins/builtin/debt-maturities/headless.ts +3 -1
  391. package/src/plugins/builtin/debt-maturities/index.tsx +2 -0
  392. package/src/plugins/builtin/debt-maturities/pane.tsx +5 -4
  393. package/src/plugins/builtin/debt-maturities/series.ts +45 -0
  394. package/src/plugins/builtin/dividend-yield/headless.ts +2 -2
  395. package/src/plugins/builtin/dividend-yield/index.tsx +3 -1
  396. package/src/plugins/builtin/dividend-yield/pane.tsx +1 -1
  397. package/src/plugins/builtin/dividend-yield/series.ts +20 -0
  398. package/src/plugins/builtin/docs/blocks.tsx +181 -0
  399. package/src/plugins/builtin/docs/index.tsx +68 -0
  400. package/src/plugins/builtin/docs/pane.tsx +426 -0
  401. package/src/plugins/builtin/docs/targets.ts +72 -0
  402. package/src/plugins/builtin/docs/use-docs.ts +60 -0
  403. package/src/plugins/builtin/doe/index.tsx +2 -0
  404. package/src/plugins/builtin/doe/series.ts +62 -0
  405. package/src/plugins/builtin/earnings/client.ts +3 -2
  406. package/src/plugins/builtin/earnings/format.ts +1 -5
  407. package/src/plugins/builtin/earnings/headless.ts +58 -6
  408. package/src/plugins/builtin/earnings/history-model.ts +15 -1
  409. package/src/plugins/builtin/earnings/history-table.ts +13 -2
  410. package/src/plugins/builtin/earnings/history.tsx +7 -3
  411. package/src/plugins/builtin/earnings-calls/data.ts +28 -7
  412. package/src/plugins/builtin/earnings-calls/headless.ts +3 -2
  413. package/src/plugins/builtin/earnings-calls/pane.tsx +10 -5
  414. package/src/plugins/builtin/econ/calendar-model.ts +42 -17
  415. package/src/plugins/builtin/econ/detail-view.tsx +2 -2
  416. package/src/plugins/builtin/econ/fred-catalog.ts +189 -0
  417. package/src/plugins/builtin/econ/fred-series-map.ts +0 -46
  418. package/src/plugins/builtin/econ/index.tsx +70 -22
  419. package/src/plugins/builtin/econ-statistics/defs.ts +5 -0
  420. package/src/plugins/builtin/econ-statistics/headless.ts +30 -5
  421. package/src/plugins/builtin/econ-statistics/pane.tsx +1 -1
  422. package/src/plugins/builtin/econ-statistics/stats.ts +1 -0
  423. package/src/plugins/builtin/econ-statistics/view.ts +17 -0
  424. package/src/plugins/builtin/equity-screener/pane.tsx +4 -11
  425. package/src/plugins/builtin/executives/data.ts +17 -6
  426. package/src/plugins/builtin/executives/pane.tsx +16 -7
  427. package/src/plugins/builtin/exposure/holdings.ts +1 -1
  428. package/src/plugins/builtin/exposure/pane.tsx +3 -1
  429. package/src/plugins/builtin/fear-greed/index.tsx +4 -0
  430. package/src/plugins/builtin/fear-greed/series.ts +52 -0
  431. package/src/plugins/builtin/filing-events/pane.tsx +22 -5
  432. package/src/plugins/builtin/futures/index.tsx +43 -3
  433. package/src/plugins/builtin/futures/model.ts +1 -1
  434. package/src/plugins/builtin/futures/returns.ts +1 -1
  435. package/src/plugins/builtin/futures/series.ts +13 -0
  436. package/src/plugins/builtin/futures/table.tsx +1 -1
  437. package/src/plugins/builtin/futures/use-front-returns.ts +1 -1
  438. package/src/plugins/builtin/futures-curve/client.ts +12 -3
  439. package/src/plugins/builtin/futures-curve/headless.ts +70 -9
  440. package/src/plugins/builtin/futures-curve/index.tsx +1 -1
  441. package/src/plugins/builtin/futures-curve/model.ts +66 -11
  442. package/src/plugins/builtin/futures-curve/pane.tsx +52 -18
  443. package/src/plugins/builtin/fx-matrix/index.tsx +22 -1
  444. package/src/plugins/builtin/fx-matrix/pairs.ts +1 -1
  445. package/src/plugins/builtin/fx-matrix/settings.ts +42 -2
  446. package/src/plugins/builtin/gpu/board.tsx +13 -10
  447. package/src/plugins/builtin/gpu/changes.tsx +4 -4
  448. package/src/plugins/builtin/gpu/client.ts +19 -1
  449. package/src/plugins/builtin/gpu/equities.tsx +14 -10
  450. package/src/plugins/builtin/gpu/headless.ts +64 -27
  451. package/src/plugins/builtin/gpu/history.tsx +3 -3
  452. package/src/plugins/builtin/gpu/index.tsx +2 -0
  453. package/src/plugins/builtin/gpu/model.ts +114 -20
  454. package/src/plugins/builtin/gpu/pane.tsx +28 -12
  455. package/src/plugins/builtin/gpu/series.ts +38 -0
  456. package/src/plugins/builtin/help/function-card.tsx +25 -6
  457. package/src/plugins/builtin/help/index.tsx +18 -8
  458. package/src/plugins/builtin/holders/beneficial-client.ts +29 -7
  459. package/src/plugins/builtin/holders/beneficial-model.ts +90 -3
  460. package/src/plugins/builtin/holders/beneficial-report.ts +57 -5
  461. package/src/plugins/builtin/holders/beneficial-view.tsx +62 -14
  462. package/src/plugins/builtin/holders/client.ts +22 -3
  463. package/src/plugins/builtin/holders/format.ts +18 -3
  464. package/src/plugins/builtin/holders/headless.ts +42 -134
  465. package/src/plugins/builtin/holders/pane.tsx +14 -4
  466. package/src/plugins/builtin/holders/report-header.ts +40 -5
  467. package/src/plugins/builtin/holders/report-rows.ts +240 -0
  468. package/src/plugins/builtin/insider/client.ts +35 -20
  469. package/src/plugins/builtin/insider/headless.ts +41 -11
  470. package/src/plugins/builtin/insider/index.tsx +27 -10
  471. package/src/plugins/builtin/insider/insider-data.ts +10 -0
  472. package/src/plugins/builtin/insider/issuer.ts +49 -0
  473. package/src/plugins/builtin/insider/model.ts +3 -0
  474. package/src/plugins/builtin/iv-history/charts.tsx +21 -7
  475. package/src/plugins/builtin/iv-history/client.ts +26 -6
  476. package/src/plugins/builtin/iv-history/format.ts +33 -2
  477. package/src/plugins/builtin/iv-history/headless.ts +27 -12
  478. package/src/plugins/builtin/iv-history/index.tsx +5 -3
  479. package/src/plugins/builtin/iv-history/model.ts +172 -20
  480. package/src/plugins/builtin/iv-history/pane.tsx +11 -3
  481. package/src/plugins/builtin/iv-history/screen-pane.tsx +45 -25
  482. package/src/plugins/builtin/iv-history/series.ts +29 -0
  483. package/src/plugins/builtin/jobs/headless.ts +28 -3
  484. package/src/plugins/builtin/jobs/index.tsx +3 -1
  485. package/src/plugins/builtin/jobs/pane.tsx +1 -1
  486. package/src/plugins/builtin/jobs/series.ts +19 -0
  487. package/src/plugins/builtin/kelly-sizer/headless.ts +149 -0
  488. package/src/plugins/builtin/kelly-sizer/history.ts +80 -0
  489. package/src/plugins/builtin/kelly-sizer/index.tsx +2 -0
  490. package/src/plugins/builtin/kelly-sizer/pane.tsx +111 -40
  491. package/src/plugins/builtin/kelly-sizer/portfolio.ts +0 -39
  492. package/src/plugins/builtin/kelly-sizer/sections.tsx +14 -0
  493. package/src/plugins/builtin/kelly-sizer/types.ts +9 -1
  494. package/src/plugins/builtin/layout-manager/index.tsx +9 -1
  495. package/src/plugins/builtin/macro-day/client.ts +68 -3
  496. package/src/plugins/builtin/macro-day/headless.ts +18 -12
  497. package/src/plugins/builtin/macro-day/index.tsx +3 -0
  498. package/src/plugins/builtin/macro-day/model.ts +66 -15
  499. package/src/plugins/builtin/macro-day/pane.tsx +34 -20
  500. package/src/plugins/builtin/macro-day/release-table.ts +40 -0
  501. package/src/plugins/builtin/macro-day/releases.ts +62 -44
  502. package/src/plugins/builtin/market-heatmap/data.ts +25 -5
  503. package/src/plugins/builtin/market-heatmap/evidence.ts +90 -0
  504. package/src/plugins/builtin/market-heatmap/index.tsx +144 -63
  505. package/src/plugins/builtin/market-heatmap/model.ts +102 -3
  506. package/src/plugins/builtin/market-heatmap/portfolio.ts +12 -2
  507. package/src/plugins/builtin/market-movers/client.ts +7 -5
  508. package/src/plugins/builtin/market-movers/headless.ts +31 -4
  509. package/src/plugins/builtin/market-movers/index.tsx +11 -3
  510. package/src/plugins/builtin/market-movers/model.ts +101 -17
  511. package/src/plugins/builtin/market-movers/screener.ts +31 -0
  512. package/src/plugins/builtin/market-movers/table.ts +50 -23
  513. package/src/plugins/builtin/market-valuation/chart-series.ts +29 -69
  514. package/src/plugins/builtin/market-valuation/index.tsx +3 -3
  515. package/src/plugins/builtin/market-valuation/indicators.ts +0 -5
  516. package/src/plugins/builtin/members/headless.ts +7 -2
  517. package/src/plugins/builtin/members/model.ts +31 -3
  518. package/src/plugins/builtin/members/pane.tsx +3 -6
  519. package/src/plugins/builtin/mna/headless.ts +15 -3
  520. package/src/plugins/builtin/money-markets/index.tsx +2 -0
  521. package/src/plugins/builtin/money-markets/series.ts +41 -0
  522. package/src/plugins/builtin/news/headless.ts +9 -2
  523. package/src/plugins/builtin/news/wire/news/footer.ts +10 -0
  524. package/src/plugins/builtin/notes/cli.ts +12 -7
  525. package/src/plugins/builtin/openfda/client.ts +1 -1
  526. package/src/plugins/builtin/options/carry.ts +95 -0
  527. package/src/plugins/builtin/options/index.tsx +58 -5
  528. package/src/plugins/builtin/options/strike-window.ts +183 -0
  529. package/src/plugins/builtin/options/table.ts +55 -3
  530. package/src/plugins/builtin/options/types.ts +8 -1
  531. package/src/plugins/builtin/options/view.tsx +162 -13
  532. package/src/plugins/builtin/options-calculator/inputs.ts +2 -1
  533. package/src/plugins/builtin/options-positioning/client.ts +7 -3
  534. package/src/plugins/builtin/options-positioning/headless.ts +5 -2
  535. package/src/plugins/builtin/options-positioning/pane.tsx +2 -2
  536. package/src/plugins/builtin/options-scenario/charts.tsx +2 -2
  537. package/src/plugins/builtin/options-scenario/client.ts +75 -18
  538. package/src/plugins/builtin/options-scenario/headless.ts +72 -24
  539. package/src/plugins/builtin/options-scenario/hedge.ts +285 -0
  540. package/src/plugins/builtin/options-scenario/index.tsx +9 -2
  541. package/src/plugins/builtin/options-scenario/model.ts +33 -0
  542. package/src/plugins/builtin/options-scenario/pane.tsx +40 -16
  543. package/src/plugins/builtin/pe-band/model.ts +2 -2
  544. package/src/plugins/builtin/pe-band/report-dates.ts +11 -7
  545. package/src/plugins/builtin/perps/client.ts +40 -6
  546. package/src/plugins/builtin/perps/equity-row.tsx +33 -8
  547. package/src/plugins/builtin/perps/freshness.ts +66 -0
  548. package/src/plugins/builtin/perps/headless.ts +45 -30
  549. package/src/plugins/builtin/perps/index.tsx +18 -1
  550. package/src/plugins/builtin/perps/model.ts +32 -6
  551. package/src/plugins/builtin/perps/pane.tsx +76 -20
  552. package/src/plugins/builtin/perps/series.ts +76 -0
  553. package/src/plugins/builtin/plugin-marketplace/model.ts +64 -21
  554. package/src/plugins/builtin/plugin-marketplace/packs.ts +118 -0
  555. package/src/plugins/builtin/plugin-marketplace/pane.tsx +357 -39
  556. package/src/plugins/builtin/plugin-marketplace/store.ts +7 -1
  557. package/src/plugins/builtin/plugin-module.ts +90 -4
  558. package/src/plugins/builtin/portfolio-list/account-metrics.ts +1 -1
  559. package/src/plugins/builtin/portfolio-list/cli/bulk-symbols.ts +273 -0
  560. package/src/plugins/builtin/portfolio-list/cli/import-13f.ts +109 -0
  561. package/src/plugins/builtin/portfolio-list/cli/portfolio-command.ts +400 -99
  562. package/src/plugins/builtin/portfolio-list/cli/render.ts +281 -43
  563. package/src/plugins/builtin/portfolio-list/cli/shared.ts +26 -16
  564. package/src/plugins/builtin/portfolio-list/cli/watchlist-command.ts +120 -47
  565. package/src/plugins/builtin/portfolio-list/column-values.ts +1 -1
  566. package/src/plugins/builtin/portfolio-list/grid.tsx +1 -1
  567. package/src/plugins/builtin/portfolio-list/headless.ts +70 -9
  568. package/src/plugins/builtin/portfolio-list/imported-from.ts +8 -0
  569. package/src/plugins/builtin/portfolio-list/live-valuation.ts +6 -2
  570. package/src/plugins/builtin/portfolio-list/pane/index.tsx +6 -1
  571. package/src/plugins/builtin/portfolio-list/quick-add/index.tsx +17 -1
  572. package/src/plugins/builtin/portfolio-list/summary/totals.ts +1 -1
  573. package/src/plugins/builtin/portfolio-list/table.tsx +7 -1
  574. package/src/plugins/builtin/power/client.ts +16 -0
  575. package/src/plugins/builtin/power/evidence.ts +6 -2
  576. package/src/plugins/builtin/power/headless.ts +71 -7
  577. package/src/plugins/builtin/power/index.tsx +4 -1
  578. package/src/plugins/builtin/power/model.ts +72 -1
  579. package/src/plugins/builtin/power/pane.tsx +32 -9
  580. package/src/plugins/builtin/rate-path/headless.ts +11 -3
  581. package/src/plugins/builtin/realized-vol/headless.ts +8 -0
  582. package/src/plugins/builtin/realized-vol/pane.tsx +1 -1
  583. package/src/plugins/builtin/research/corporate-actions-pane.tsx +7 -4
  584. package/src/plugins/builtin/research/equity-diagnostic-pane.tsx +1 -1
  585. package/src/plugins/builtin/research/event-model.ts +68 -24
  586. package/src/plugins/builtin/research/events-headless.ts +2 -1
  587. package/src/plugins/builtin/research/headless.ts +2 -1
  588. package/src/plugins/builtin/revenue-breakdown/client.ts +13 -6
  589. package/src/plugins/builtin/revenue-breakdown/headless.ts +4 -1
  590. package/src/plugins/builtin/revenue-breakdown/pane.tsx +7 -4
  591. package/src/plugins/builtin/reverse-dcf/headless.ts +5 -1
  592. package/src/plugins/builtin/reverse-dcf/pane.tsx +1 -1
  593. package/src/plugins/builtin/risk-factors/data.ts +23 -9
  594. package/src/plugins/builtin/risk-factors/headless.ts +5 -2
  595. package/src/plugins/builtin/risk-factors/pane.tsx +6 -5
  596. package/src/plugins/builtin/seasonality/client.ts +15 -7
  597. package/src/plugins/builtin/seasonality/headless.ts +36 -12
  598. package/src/plugins/builtin/seasonality/index.tsx +2 -2
  599. package/src/plugins/builtin/seasonality/model.ts +119 -0
  600. package/src/plugins/builtin/seasonality/pane.tsx +108 -37
  601. package/src/plugins/builtin/sec/index.tsx +5 -5
  602. package/src/plugins/builtin/sectors/client.ts +10 -2
  603. package/src/plugins/builtin/sectors/headless.ts +35 -6
  604. package/src/plugins/builtin/sectors/index.tsx +18 -1
  605. package/src/plugins/builtin/sectors/sector-model.ts +150 -41
  606. package/src/plugins/builtin/series-inventory.ts +91 -0
  607. package/src/plugins/builtin/shared/cloud-upgrade.ts +1 -1
  608. package/src/plugins/builtin/shared/command-tab.ts +69 -0
  609. package/src/plugins/builtin/shared/earnings-report.ts +55 -0
  610. package/src/plugins/builtin/shared/fred-points.ts +20 -0
  611. package/src/plugins/builtin/shared/fx-rate-freshness.ts +101 -0
  612. package/src/plugins/builtin/shared/headless-market-data.ts +33 -1
  613. package/src/plugins/builtin/shared/members-menu.tsx +4 -4
  614. package/src/plugins/builtin/shared/open-description.ts +29 -0
  615. package/src/plugins/builtin/shared/report-freshness.ts +59 -2
  616. package/src/plugins/builtin/shared/series-warning.ts +5 -0
  617. package/src/plugins/builtin/shared/ticker-request.ts +25 -1
  618. package/src/plugins/builtin/shared/use-quote-board.ts +25 -5
  619. package/src/plugins/builtin/shared/volatility/options.ts +1 -46
  620. package/src/plugins/builtin/short-interest/headless.ts +1 -0
  621. package/src/plugins/builtin/short-interest/index.tsx +21 -4
  622. package/src/plugins/builtin/short-interest/series.ts +36 -0
  623. package/src/plugins/builtin/short-interest/surface.tsx +4 -4
  624. package/src/plugins/builtin/short-interest/watch-headless.ts +1 -0
  625. package/src/plugins/builtin/short-interest/watch-model.ts +9 -5
  626. package/src/plugins/builtin/short-volume/headless.ts +1 -0
  627. package/src/plugins/builtin/short-volume/index.tsx +3 -10
  628. package/src/plugins/builtin/short-volume/series.ts +23 -0
  629. package/src/plugins/builtin/social-mentions/index.tsx +2 -0
  630. package/src/plugins/builtin/social-mentions/series.ts +23 -0
  631. package/src/plugins/builtin/supply-chain/graph-pane.tsx +3 -2
  632. package/src/plugins/builtin/supply-chain/model.ts +1 -1
  633. package/src/plugins/builtin/supply-chain/pane.tsx +3 -1
  634. package/src/plugins/builtin/thirteenf/api.ts +1 -0
  635. package/src/plugins/builtin/thirteenf/data.ts +6 -4
  636. package/src/plugins/builtin/thirteenf/headless.ts +217 -36
  637. package/src/plugins/builtin/thirteenf/model.ts +39 -1
  638. package/src/plugins/builtin/thirteenf/overlap.ts +75 -0
  639. package/src/plugins/builtin/thirteenf/pane.tsx +10 -1
  640. package/src/plugins/builtin/thirteenf/report-notes.ts +103 -1
  641. package/src/plugins/builtin/thirteenf/types.ts +2 -0
  642. package/src/plugins/builtin/ticker-detail/headless.ts +43 -21
  643. package/src/plugins/builtin/ticker-detail/index.tsx +3 -0
  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 +48 -4
  649. package/src/plugins/builtin/ticker-detail/pane.tsx +4 -5
  650. package/src/plugins/builtin/ticker-detail/quote-monitor/card.tsx +94 -6
  651. package/src/plugins/builtin/ticker-detail/quote-monitor/index.tsx +13 -3
  652. package/src/plugins/builtin/time-sales/headless.ts +1 -0
  653. package/src/plugins/builtin/treasury-auctions/cache.ts +5 -2
  654. package/src/plugins/builtin/treasury-auctions/client.ts +22 -8
  655. package/src/plugins/builtin/treasury-auctions/headless.ts +56 -6
  656. package/src/plugins/builtin/treasury-auctions/index.tsx +12 -9
  657. package/src/plugins/builtin/treasury-auctions/model.ts +205 -30
  658. package/src/plugins/builtin/treasury-auctions/pane.tsx +35 -11
  659. package/src/plugins/builtin/treasury-auctions/types.ts +11 -1
  660. package/src/plugins/builtin/vol-surface/charts.tsx +1 -3
  661. package/src/plugins/builtin/vol-surface/client.ts +6 -2
  662. package/src/plugins/builtin/vol-surface/evidence.ts +11 -6
  663. package/src/plugins/builtin/vol-surface/headless.ts +125 -20
  664. package/src/plugins/builtin/vol-surface/model.ts +23 -11
  665. package/src/plugins/builtin/vol-surface/pane.tsx +38 -27
  666. package/src/plugins/builtin/vol-surface/tables.ts +124 -0
  667. package/src/plugins/builtin/volatility/index.tsx +2 -0
  668. package/src/plugins/builtin/volatility/series.ts +84 -0
  669. package/src/plugins/builtin/world-indices/client.ts +22 -4
  670. package/src/plugins/builtin/world-indices/headless.ts +54 -27
  671. package/src/plugins/builtin/world-indices/model.ts +4 -2
  672. package/src/plugins/builtin/world-indices/table.tsx +13 -2
  673. package/src/plugins/builtin/world-venue-map/geo-series.ts +27 -2
  674. package/src/plugins/builtin/world-venue-map/headless.ts +4 -1
  675. package/src/plugins/builtin/world-venue-map/index.ts +3 -2
  676. package/src/plugins/builtin/world-venue-map/layered-pane.tsx +8 -4
  677. package/src/plugins/builtin/world-venue-map/layers.ts +29 -0
  678. package/src/plugins/builtin/yield-curve/chart.ts +2 -2
  679. package/src/plugins/builtin/yield-curve/curves.ts +21 -8
  680. package/src/plugins/builtin/yield-curve/headless.ts +71 -18
  681. package/src/plugins/builtin/yield-curve/index.tsx +4 -2
  682. package/src/plugins/builtin/yield-curve/series.ts +86 -0
  683. package/src/plugins/builtin-editorial.ts +126 -0
  684. package/src/plugins/catalog-backend.ts +16 -9
  685. package/src/plugins/catalog-browser.ts +129 -64
  686. package/src/plugins/catalog-manifest.ts +73 -40
  687. package/src/plugins/catalog-ui.ts +26 -6
  688. package/src/plugins/extracted-plugins.ts +7 -1
  689. package/src/plugins/ownership.ts +150 -7
  690. package/src/plugins/plugin-functions.ts +54 -0
  691. package/src/plugins/plugin-off.ts +36 -0
  692. package/src/plugins/registry/host-actions.ts +16 -0
  693. package/src/plugins/registry/index.ts +173 -28
  694. package/src/plugins/registry/plugin-state.ts +25 -1
  695. package/src/plugins/runtime/context.tsx +29 -0
  696. package/src/{plugins/builtin/portfolio-list → portfolio}/position-metrics.ts +6 -6
  697. package/src/portfolio/position-value.ts +40 -0
  698. package/src/public/__snapshots__/public-api.test.ts.snap +7 -0
  699. package/src/public/time-series.ts +17 -0
  700. package/src/react/auto-refresh.ts +13 -3
  701. package/src/react/input.ts +48 -1
  702. package/src/remote/app-host.tsx +25 -4
  703. package/src/remote/confirm-change.tsx +85 -0
  704. package/src/remote/controller-utils.ts +8 -1
  705. package/src/remote/controller.ts +126 -59
  706. package/src/remote/matching.ts +69 -0
  707. package/src/remote/pane-screenshot.ts +47 -0
  708. package/src/remote/schema.ts +63 -1
  709. package/src/remote/semantic-tree.tsx +14 -0
  710. package/src/remote/types.ts +32 -0
  711. package/src/remote/watchlist.ts +306 -0
  712. package/src/renderers/browser/main.tsx +3 -2
  713. package/src/renderers/cloudflare/worker.ts +1 -1
  714. package/src/renderers/dom/data-table/frozen-column.ts +3 -1
  715. package/src/renderers/dom/data-table/index.tsx +33 -6
  716. package/src/renderers/dom/data-table/row.tsx +27 -1
  717. package/src/renderers/dom/desktop/control-styles.ts +63 -1
  718. package/src/renderers/dom/desktop/controls.tsx +30 -23
  719. package/src/renderers/dom/desktop/dialog-actions.tsx +170 -0
  720. package/src/renderers/dom/desktop/icons.tsx +21 -0
  721. package/src/renderers/dom/desktop/query-bar.tsx +59 -32
  722. package/src/renderers/dom/dom-ui-host.tsx +3 -0
  723. package/src/renderers/dom/host/box.tsx +4 -1
  724. package/src/renderers/dom/host/chart-surface.tsx +6 -2
  725. package/src/renderers/dom/host/drag-shield.ts +17 -6
  726. package/src/renderers/dom/host/live-frame.ts +14 -2
  727. package/src/renderers/dom/host/overflow-fade.ts +14 -1
  728. package/src/renderers/dom/host/size-observer.ts +26 -0
  729. package/src/renderers/dom/host/surface-3d.tsx +7 -2
  730. package/src/renderers/dom/host/text.tsx +1 -1
  731. package/src/renderers/dom/input-host.tsx +6 -1
  732. package/src/renderers/dom/styles.css +74 -0
  733. package/src/renderers/electrobun/bun/desktop/backend.ts +5 -1
  734. package/src/renderers/electrobun/bun/desktop/detached-windows.ts +12 -1
  735. package/src/renderers/electrobun/bun/desktop/initialization.ts +2 -1
  736. package/src/renderers/electrobun/shared/protocol.ts +2 -0
  737. package/src/renderers/electrobun/view/cli-pane-shot-entry.tsx +18 -3
  738. package/src/renderers/electrobun/view/cli-pane-shot-frame.tsx +109 -5
  739. package/src/renderers/electrobun/view/cli-pane-shot-health.ts +10 -26
  740. package/src/renderers/electrobun/view/main.tsx +6 -1
  741. package/src/renderers/opentui/input-host.tsx +6 -1
  742. package/src/renderers/opentui/start.tsx +9 -0
  743. package/src/series/capability.ts +75 -0
  744. package/src/series/csv.ts +160 -0
  745. package/src/series/files.ts +107 -0
  746. package/src/series/registry.ts +198 -0
  747. package/src/series/resolve.ts +107 -0
  748. package/src/series/standalone.ts +48 -0
  749. package/src/series/types.ts +145 -0
  750. package/src/series/validate.ts +171 -0
  751. package/src/shares/portable-layout.ts +16 -6
  752. package/src/sources/gloomberb-cloud/index.ts +26 -17
  753. package/src/sources/gloomberb-cloud/normalizers.ts +5 -1
  754. package/src/sources/history-result.ts +1 -0
  755. package/src/sources/listing-symbols.ts +14 -5
  756. package/src/sources/provider-errors.ts +88 -3
  757. package/src/sources/provider-router/batches.ts +4 -1
  758. package/src/sources/provider-router/cache.ts +4 -2
  759. package/src/sources/provider-router/cached-routes.ts +9 -5
  760. package/src/sources/provider-router/financial-routes.ts +12 -5
  761. package/src/sources/provider-router/financials.ts +55 -15
  762. package/src/sources/provider-router/history.ts +68 -34
  763. package/src/sources/provider-router/index.ts +1 -1
  764. package/src/sources/provider-router/primary.ts +23 -5
  765. package/src/sources/provider-router/search.ts +1 -0
  766. package/src/sources/sec-edgar.ts +68 -8
  767. package/src/sync/core-contributors.ts +5 -3
  768. package/src/test-support/cli-context.ts +2 -1
  769. package/src/test-support/data-provider.ts +34 -0
  770. package/src/test-support/shell-pane-keys.tsx +1 -0
  771. package/src/theme/series-colors.ts +46 -0
  772. package/src/theme/themes.ts +149 -0
  773. package/src/tickers/company-name.ts +75 -0
  774. package/src/tickers/instrument-kind.ts +25 -0
  775. package/src/tickers/open-target.ts +3 -2
  776. package/src/tickers/search/index.ts +67 -9
  777. package/src/tickers/search/ranking.ts +78 -18
  778. package/src/tickers/search/types.ts +10 -2
  779. package/src/tickers/starter-symbols.ts +8 -0
  780. package/src/tickers/us-listing.ts +34 -0
  781. package/src/time-series/hooks.ts +9 -0
  782. package/src/time-series/resolve.ts +96 -30
  783. package/src/time-series/types.ts +4 -2
  784. package/src/time-series/use-chart-resolution.ts +32 -0
  785. package/src/types/config.ts +67 -1
  786. package/src/types/data-provider.ts +5 -0
  787. package/src/types/financials.ts +52 -1
  788. package/src/types/headless.ts +72 -0
  789. package/src/types/instrument.ts +8 -0
  790. package/src/types/plugin.ts +68 -3
  791. package/src/types/price-history.ts +7 -0
  792. package/src/types/ticker.ts +14 -0
  793. package/src/ui/host.tsx +26 -4
  794. package/src/ui/index.tsx +2 -0
  795. package/src/ui/live-resize.ts +81 -0
  796. package/src/ui/live-stretch.ts +121 -0
  797. package/src/ui/measured-cells.ts +58 -0
  798. package/src/ui/pane-fill.ts +11 -0
  799. package/src/utils/basis-points.ts +17 -0
  800. package/src/utils/cli-output.ts +21 -2
  801. package/src/utils/concurrency.ts +25 -0
  802. package/src/utils/crypto-pair.ts +20 -0
  803. package/src/utils/currency-pair.ts +19 -0
  804. package/src/utils/decimal-comma.ts +19 -0
  805. package/src/utils/dom-screenshot-css.ts +265 -0
  806. package/src/utils/dom-screenshot-rasters.ts +276 -0
  807. package/src/utils/dom-screenshot.ts +437 -52
  808. package/src/utils/exchange-rate-snapshot.ts +6 -2
  809. package/src/utils/exchanges.ts +120 -1
  810. package/src/utils/format.ts +17 -3
  811. package/src/utils/fundamentals.ts +66 -0
  812. package/src/utils/futures-generic.ts +6 -12
  813. package/src/utils/fx-market-hours.ts +44 -0
  814. package/src/utils/option-expiry.ts +126 -0
  815. package/src/utils/price-history.ts +130 -40
  816. package/src/utils/rpc-timeout-error.ts +6 -2
  817. package/src/utils/sec-eps-basis.ts +178 -36
  818. package/src/utils/sec.ts +98 -40
  819. package/src/utils/throttled-fetch.ts +51 -22
  820. package/src/utils/utc-time.ts +51 -4
@@ -32,12 +32,13 @@ import { cotModule } from "./cot";
32
32
  import { doeModule } from "./doe";
33
33
  import { gpuModule } from "./gpu";
34
34
  import { fxMatrixModule } from "./fx-matrix";
35
+ import { docsModule } from "./docs";
35
36
  import { helpModule } from "./help";
36
37
  import { positionSizerModule } from "./kelly-sizer";
37
38
  import { layoutManagerModule } from "./layout-manager";
38
39
  import { marketMoversModule } from "./market-movers";
39
40
  import { volatilityModule } from "./volatility";
40
- import { composeBuiltinPlugin } from "./plugin-module";
41
+ import { composeBuiltinPlugin, type PluginModule } from "./plugin-module";
41
42
  import { portfolioListModule } from "./portfolio-list";
42
43
  import { scannerModule } from "./scanner";
43
44
  import { sectorsModule } from "./sectors";
@@ -57,6 +58,7 @@ import { socialMentionsModule } from "./social-mentions";
57
58
  import { timeSalesModule } from "./time-sales";
58
59
  import { estimateRevisionsModule } from "./estimate-revisions";
59
60
  import { chartComposerModule } from "./chart-composer";
61
+ import { userSeriesModule } from "./chart-composer/user-series";
60
62
  import { congressResearchModule } from "./congress-trades";
61
63
  import { dividendYieldModule } from "./dividend-yield";
62
64
  import { executivesModule } from "./executives";
@@ -85,16 +87,26 @@ import { thirteenFModule } from "./thirteenf";
85
87
  import { tickerDetailModule } from "./ticker-detail";
86
88
  import { macroSharedResourcesModule } from "./macro-resources";
87
89
  import {
90
+ altDataPluginMeta,
88
91
  applicationPluginMeta,
89
- macroPluginMeta,
90
- marketOverviewPluginMeta,
92
+ creditPluginMeta,
93
+ cryptoPluginMeta,
94
+ earningsPluginMeta,
95
+ futuresCommoditiesPluginMeta,
96
+ globalMarketsPluginMeta,
91
97
  portfolioPluginMeta,
92
- tickerResearchPluginMeta,
98
+ filingsPluginMeta,
99
+ optionsVolatilityPluginMeta,
100
+ ownershipPluginMeta,
101
+ quantPluginMeta,
102
+ ratesMacroPluginMeta,
103
+ screenersPluginMeta,
104
+ tickerCorePluginMeta,
93
105
  } from "./builtin-plugin-meta";
94
106
 
95
107
  export const applicationPlugin = composeBuiltinPlugin({
96
108
  ...applicationPluginMeta,
97
- modules: [layoutManagerModule, pluginMarketplaceModule, helpModule, changelogModule, connectionsModule],
109
+ modules: [layoutManagerModule, pluginMarketplaceModule, helpModule, changelogModule, connectionsModule, docsModule],
98
110
  });
99
111
 
100
112
  export const portfolioPlugin = composeBuiltinPlugin({
@@ -102,51 +114,63 @@ export const portfolioPlugin = composeBuiltinPlugin({
102
114
  modules: [portfolioListModule, portfolioAnalyticsModule, positionSizerModule],
103
115
  });
104
116
 
105
- export const tickerResearchPlugin = composeBuiltinPlugin({
106
- ...tickerResearchPluginMeta,
117
+ // Ticker Research's modules are drawn in the renderer: the desktop backend
118
+ // process runs none of them, and keeps only the identity of the plugins that
119
+ // hold nothing else.
120
+ const rendererOnly = (module: PluginModule) => ({ module, rendererOnly: true });
121
+ const tickerResearchModule = (module: PluginModule) => ({ module, stateId: "ticker-research", rendererOnly: true });
122
+
123
+ export const tickerCorePlugin = composeBuiltinPlugin({
124
+ ...tickerCorePluginMeta,
125
+ modules: [
126
+ ...[
127
+ tickerDetailModule,
128
+ chartComposerModule,
129
+ researchModule,
130
+ estimateRevisionsModule,
131
+ companyKpisModule,
132
+ revenueBreakdownModule,
133
+ dividendYieldModule,
134
+ reverseDcfModule,
135
+ peBandModule,
136
+ executivesModule,
137
+ timeSalesModule,
138
+ ].map(rendererOnly),
139
+ // Reads the profile's series folder, so it runs where the disk is: the desktop backend too.
140
+ userSeriesModule,
141
+ ],
142
+ });
143
+
144
+ export const optionsVolatilityPlugin = composeBuiltinPlugin({
145
+ ...optionsVolatilityPluginMeta,
107
146
  modules: [
108
- tickerDetailModule,
109
- chartComposerModule,
110
- congressResearchModule,
111
147
  optionsModule,
112
148
  optionsPositioningModule,
113
149
  optionsCalculatorModule,
114
150
  optionsScenarioModule,
115
151
  volSurfaceModule,
116
152
  realizedVolModule,
117
- seasonalityModule,
118
- earningsRippleModule,
119
- reverseDcfModule,
120
- peBandModule,
121
- macroDayModule,
122
153
  ivHistoryModule,
123
- backtestModule,
124
- estimateRevisionsModule,
125
- researchModule,
126
- shortVolumeModule,
127
- socialMentionsModule,
128
- debtMaturitiesModule,
129
- revenueBreakdownModule,
130
- supplyChainModule,
131
- creditDocumentsModule,
132
- companyAttentionModule,
133
- catalystsModule,
134
- companyKpisModule,
135
- awardsModule,
136
- exposureModule,
137
- mnaModule,
138
- dividendYieldModule,
154
+ ].map(rendererOnly),
155
+ });
156
+
157
+ export const ownershipPlugin = composeBuiltinPlugin({
158
+ ...ownershipPluginMeta,
159
+ description: "Holders, 13F funds, insider trades, short interest and volume, and congressional trades.",
160
+ modules: [
139
161
  holdersModule,
140
- shortInterestModule,
141
- timeSalesModule,
142
162
  thirteenFModule,
143
- secModule,
144
163
  insiderModule,
145
- jobsModule,
146
- executivesModule,
147
- riskFactorsModule,
148
- filingEventsModule,
149
- ],
164
+ shortInterestModule,
165
+ shortVolumeModule,
166
+ // The Congress research tab; the CONG pane is Gloom Cloud's.
167
+ congressResearchModule,
168
+ ].map(rendererOnly),
169
+ });
170
+
171
+ export const filingsPlugin = composeBuiltinPlugin({
172
+ ...filingsPluginMeta,
173
+ modules: [secModule, riskFactorsModule, filingEventsModule, catalystsModule, mnaModule].map(rendererOnly),
150
174
  });
151
175
 
152
176
  export const brokerPlugin = composeBuiltinPlugin({
@@ -158,35 +182,48 @@ export const brokerPlugin = composeBuiltinPlugin({
158
182
  modules: [brokerManagerModule],
159
183
  });
160
184
 
161
- export const marketOverviewPlugin = composeBuiltinPlugin({
162
- ...marketOverviewPluginMeta,
163
- description: "Global indices, movers, scanners, sectors, FX, futures, and correlations.",
185
+ export const globalMarketsPlugin = composeBuiltinPlugin({
186
+ ...globalMarketsPluginMeta,
187
+ modules: [worldIndicesModule, worldVenueMapModule, sectorsModule, fxMatrixModule, relativeRotationModule],
188
+ });
189
+
190
+ export const screenersPlugin = composeBuiltinPlugin({
191
+ ...screenersPluginMeta,
192
+ description: "Equity screener, top movers, session highs and lows, and unusual options flow.",
193
+ modules: [equityScreenerModule, marketMoversModule, scannerModule],
194
+ });
195
+
196
+ export const futuresCommoditiesPlugin = composeBuiltinPlugin({
197
+ ...futuresCommoditiesPluginMeta,
198
+ modules: [futuresModule, futuresCurveModule, cotModule, doeModule],
199
+ });
200
+
201
+ export const cryptoPlugin = composeBuiltinPlugin({
202
+ ...cryptoPluginMeta,
203
+ modules: [cryptoBoardModule, perpsModule],
204
+ });
205
+
206
+ export const altDataPlugin = composeBuiltinPlugin({
207
+ ...altDataPluginMeta,
164
208
  modules: [
165
- correlationModule,
166
- relativeRotationModule,
167
- equityScreenerModule,
168
- worldIndicesModule,
169
- worldVenueMapModule,
170
- marketMoversModule,
171
- scannerModule,
172
- sectorsModule,
173
- fxMatrixModule,
174
- futuresModule,
175
- futuresCurveModule,
176
- cotModule,
177
- doeModule,
178
- gpuModule,
179
- attentionModule,
180
- powerModule,
181
- cryptoBoardModule,
182
- perpsModule,
209
+ ...[attentionModule, gpuModule, powerModule].map((module) => ({ module, stateId: "market-overview" })),
210
+ ...[supplyChainModule, exposureModule, awardsModule, companyAttentionModule, jobsModule, socialMentionsModule].map(rendererOnly),
183
211
  ],
184
212
  });
185
213
 
186
- export const macroPlugin = composeBuiltinPlugin({
187
- ...macroPluginMeta,
188
- description: "Economic calendar, rates, volatility, credit spreads, single-name, index and sovereign CDS, Treasury auctions, and earnings.",
214
+ export const quantPlugin = composeBuiltinPlugin({
215
+ ...quantPluginMeta,
189
216
  modules: [
217
+ { module: correlationModule, stateId: "market-overview" },
218
+ ...[backtestModule, seasonalityModule, macroDayModule].map(rendererOnly),
219
+ ],
220
+ });
221
+
222
+ export const ratesMacroPlugin = composeBuiltinPlugin({
223
+ ...ratesMacroPluginMeta,
224
+ modules: [
225
+ // The FRED cache the other panes and the chart composer read too. Every
226
+ // plugin is set up whether or not it is switched on, so it stays attached.
190
227
  macroSharedResourcesModule,
191
228
  economicCalendarModule,
192
229
  econStatisticsModule,
@@ -194,15 +231,27 @@ export const macroPlugin = composeBuiltinPlugin({
194
231
  yieldCurveModule,
195
232
  ratePathModule,
196
233
  moneyMarketsModule,
197
- bondCalculatorModule,
198
234
  centralBankRatesModule,
199
235
  volatilityModule,
200
- creditConditionsModule,
201
236
  marketValuationModule,
237
+ ],
238
+ });
239
+
240
+ export const creditPlugin = composeBuiltinPlugin({
241
+ ...creditPluginMeta,
242
+ modules: [
202
243
  cdsModule,
203
244
  creditBoardsModule,
245
+ creditConditionsModule,
204
246
  treasuryAuctionsModule,
205
- earningsModule,
206
- earningsCallsModule,
247
+ bondCalculatorModule,
248
+ tickerResearchModule(creditDocumentsModule),
249
+ tickerResearchModule(debtMaturitiesModule),
207
250
  ],
208
251
  });
252
+
253
+ export const earningsPlugin = composeBuiltinPlugin({
254
+ ...earningsPluginMeta,
255
+ description: "Earnings calendar with surprises and implied moves, call transcripts, and the earnings ripple through customers and suppliers.",
256
+ modules: [earningsModule, earningsCallsModule, tickerResearchModule(earningsRippleModule)],
257
+ });
@@ -3,14 +3,16 @@ import { cotBoardCache } from "./client";
3
3
  import { cotHeadless } from "./headless";
4
4
  import { COT_ROOT_OPTIONS, cotContractCode, cotContractCodeForTicker, cotRoot, cotUnknownMarketMessage } from "./model";
5
5
  import { CotPane } from "./pane";
6
+ import { COT_SERIES } from "./series";
6
7
 
7
8
  export const cotModule: PluginModule = {
9
+ series: COT_SERIES,
8
10
  panes: [{ id: "cot", name: "CFTC Positioning", icon: "P", component: CotPane,
9
11
  defaultPosition: "right", defaultMode: "floating", defaultFloatingSize: { width: 106, height: 30 },
10
12
  tableExport: true, headless: cotHeadless }],
11
13
  paneTemplates: [{ id: "cot-cot", paneId: "cot", label: "CFTC Positioning",
12
14
  description: "Weekly futures positioning, changes, historical percentiles and cross-market extremes.",
13
- keywords: ["cot", "cftc", "positioning", "commitments", "managed money", "net spec"],
15
+ keywords: ["cot", "cftc", "positioning", "commitments", "managed money", "net spec", "crude oil", "natural gas"],
14
16
  shortcut: { prefix: "COT", aliases: ["CFTC"], argKind: "text" as const, argPlaceholder: "code or root", argOptional: true,
15
17
  argOptions: () => COT_ROOT_OPTIONS }, headless: cotHeadless,
16
18
  createInstance: (context, options) => {
@@ -5,6 +5,7 @@ import type { PricePoint } from "../../../types/financials";
5
5
  import { formatPriceObservation } from "../../../market-data/market/format";
6
6
  import { cleanFloat32Price } from "../../../cli/history-rows";
7
7
  import { cryptoPairCoin, isFuturesSymbol } from "../shared/crypto-pair";
8
+ import { FUTURES_CONTRACTS, futuresBoardContract, futuresBoardContractForTicker, type FuturesContract } from "../../../market-data/futures-board";
8
9
 
9
10
  export const COT_CLASSES: Record<CotFamily, Array<{ value: CotClass; label: string }>> = {
10
11
  legacy: [{ value: "noncommercial", label: "Noncommercial" }, { value: "commercial", label: "Commercial" }, { value: "nonreportable", label: "Nonreportable" }],
@@ -29,7 +30,7 @@ const ROOTS: Record<string, { code: string; exchange: string; priceSymbol: strin
29
30
  SOL: { code: "177741", exchange: "CME", priceSymbol: null, name: "Solana", crypto: true },
30
31
  XRP: { code: "176740", exchange: "CME", priceSymbol: null, name: "XRP", crypto: true },
31
32
  };
32
- /** The roots `cotContractCode` accepts, labeled "ZQ 30-Day Fed Funds". */
33
+ /** The verified root aliases, labeled "ZQ 30-Day Fed Funds"; `cotContractCode` also takes every FUT board root the CFTC reports. */
33
34
  export const COT_ROOT_OPTIONS = Object.entries(ROOTS).map(([root, row]) => ({ value: root, label: root === row.name ? root : `${root} ${row.name}` }));
34
35
  /** The crypto roots named for a coin, which a coin pair (BTC-USD) can stand for. The micros have no pair. */
35
36
  const COIN_PAIR_ROOTS: ReadonlySet<string> = new Set(["BTC", "ETH", "SOL", "XRP"]);
@@ -37,9 +38,12 @@ const COIN_PAIR_ROOTS: ReadonlySet<string> = new Set(["BTC", "ETH", "SOL", "XRP"
37
38
  * Front-month price overlays for major markets without a root alias, each
38
39
  * checked to return five years of daily history (2026-09-24). Keyed by CFTC
39
40
  * code, never added to ROOTS: an alias would also claim the equity ticker under
40
- * the cursor (ZM, ZS, PL). No cash index stands in, so the dollar index has none.
41
- * Bitcoin and ether are in ROOTS, where `cotContractCodeForTicker` keeps the
42
- * same guard for their aliases.
41
+ * the cursor (ZM, ZS, PL). A FUT board root typed as an argument finds its
42
+ * market here through its price symbol (NG is NG=F, so 023651). No cash index
43
+ * stands in, so the dollar index has none. Orange juice and lumber were added
44
+ * on 2026-10-11 so their board roots open a market; lumber's contract (LBR)
45
+ * started in August 2022, so its price begins there. Bitcoin and ether are in
46
+ * ROOTS, where `cotContractCodeForTicker` keeps the same guard for their aliases.
43
47
  */
44
48
  const PRICE_OVERLAYS: Record<string, { exchange: string; priceSymbol: string }> = {
45
49
  "209742": { exchange: "CME", priceSymbol: "NQ=F" }, "239742": { exchange: "CME", priceSymbol: "RTY=F" },
@@ -60,9 +64,16 @@ const PRICE_OVERLAYS: Record<string, { exchange: string; priceSymbol: string }>
60
64
  "007601": { exchange: "CBT", priceSymbol: "ZL=F" }, "026603": { exchange: "CBT", priceSymbol: "ZM=F" },
61
65
  "083731": { exchange: "NYB", priceSymbol: "KC=F" }, "080732": { exchange: "NYB", priceSymbol: "SB=F" },
62
66
  "033661": { exchange: "NYB", priceSymbol: "CT=F" }, "073732": { exchange: "NYB", priceSymbol: "CC=F" },
67
+ "040701": { exchange: "NYB", priceSymbol: "OJ=F" }, "058644": { exchange: "CME", priceSymbol: "LBR=F" },
63
68
  "057642": { exchange: "CME", priceSymbol: "LE=F" }, "054642": { exchange: "CME", priceSymbol: "HE=F" },
64
69
  "061641": { exchange: "CME", priceSymbol: "GF=F" },
65
70
  };
71
+ /** The CFTC market a FUT board root reports under, by its price symbol; null for one the CFTC does not report (TTF). */
72
+ function boardMarketCode(contract: FuturesContract): string | null {
73
+ return Object.values(ROOTS).find((row) => row.priceSymbol === contract.symbol)?.code
74
+ ?? Object.entries(PRICE_OVERLAYS).find(([, row]) => row.priceSymbol === contract.symbol)?.[0]
75
+ ?? null;
76
+ }
66
77
  /**
67
78
  * The markets most readers mean by "positioning", verified against the live
68
79
  * CFTC boards on 2026-09-22. A code missing from a report family simply does
@@ -90,14 +101,26 @@ export const COT_SCOPES = [{ value: "major", label: "Major markets" }, { value:
90
101
  export type CotScope = typeof COT_SCOPES[number]["value"];
91
102
  export function cotScope(value: unknown): CotScope { return value === "all" ? "all" : "major"; }
92
103
 
93
- /** A CFTC code or root typed as an argument or stored in a pane: every alias, crypto included. */
104
+ const rootAlias = (input: string) => ROOTS[input === "VIX" ? "VX" : input]?.code ?? null;
105
+ const marketCode = (input: string) => /^[0-9A-Z]{5}[0-9A-Z+]$/.test(input) ? input : null;
106
+ /**
107
+ * A CFTC code or root typed as an argument or stored in a pane: every alias,
108
+ * crypto included, and every FUT board root the CFTC reports. A typed root is
109
+ * always the future, so ZM here is soybean meal, never Zoom.
110
+ */
94
111
  export function cotContractCode(value: unknown): string | null {
95
112
  if (typeof value !== "string") return null;
96
113
  const input = value.trim().toUpperCase().replace(/=F$/, "");
97
- return ROOTS[input === "VIX" ? "VX" : input]?.code ?? (/^[0-9A-Z]{5}[0-9A-Z+]$/.test(input) ? input : null);
114
+ const board = futuresBoardContract(value);
115
+ return rootAlias(input) ?? (board ? boardMarketCode(board) : null) ?? marketCode(input);
98
116
  }
99
- /** What a market that is neither a root nor a CFTC code is told, with ones that work. */
117
+ /**
118
+ * What a market `cotContractCode` does not know is told: a FUT board root the
119
+ * CFTC does not report says so; anything else gets roots and a code that work.
120
+ */
100
121
  export function cotUnknownMarketMessage(value: unknown): string {
122
+ const board = futuresBoardContract(value);
123
+ if (board) return `${board.code} (${board.name}) is not reported in the CFTC COT.`;
101
124
  const roots = ["ES", "CL", "GC", "ZN"].filter((root) => ROOTS[root]);
102
125
  return `Unknown market "${String(value)}". Try ${roots.join(", ")} or a CFTC market code such as ${ROOTS.GC!.code}.`;
103
126
  }
@@ -106,18 +129,24 @@ export function cotUnknownMarketMessage(value: unknown): string {
106
129
  * argument. The crypto aliases are also US ticker symbols (Grayscale's mini
107
130
  * trusts are BTC and ETH, MetLife is MET), so a bare one is the equity's and
108
131
  * never claims the market: only a futures symbol (BTC=F) or a coin pair
109
- * (BTC-USD) does.
132
+ * (BTC-USD) does. A FUT board root claims it the same way: as its futures
133
+ * symbol (NG=F) or a code no security uses (ZW), never a bare code a security
134
+ * keeps (ZM is Zoom).
110
135
  */
111
136
  export function cotContractCodeForTicker(ticker: unknown): string | null {
112
137
  if (typeof ticker !== "string") return null;
113
138
  const coin = cryptoPairCoin(ticker);
114
139
  if (coin) return COIN_PAIR_ROOTS.has(coin) ? ROOTS[coin]!.code : null;
115
140
  const input = ticker.trim().toUpperCase().replace(/=F$/, "");
116
- return ROOTS[input]?.crypto && !isFuturesSymbol(ticker) ? null : cotContractCode(ticker);
141
+ if (ROOTS[input]?.crypto && !isFuturesSymbol(ticker)) return null;
142
+ const board = futuresBoardContractForTicker(ticker);
143
+ return rootAlias(input) ?? (board ? boardMarketCode(board) : null) ?? marketCode(input);
117
144
  }
118
- /** The verified futures root a CFTC code belongs to, for titles readers recognize. */
145
+ /** The futures root a CFTC code belongs to, for titles readers recognize: a verified alias, else its FUT board root. */
119
146
  export function cotRoot(code: string): string | null {
120
- return Object.entries(ROOTS).find(([, row]) => row.code === code)?.[0] ?? null;
147
+ return Object.entries(ROOTS).find(([, row]) => row.code === code)?.[0]
148
+ ?? FUTURES_CONTRACTS.find((contract) => boardMarketCode(contract) === code)?.code
149
+ ?? null;
121
150
  }
122
151
  export function cotPriceMapping(code: string) { return Object.values(ROOTS).find((row) => row.code === code) ?? PRICE_OVERLAYS[code] ?? null; }
123
152
  export function cotClass(family: CotFamily, value: unknown): CotClass {
@@ -0,0 +1,27 @@
1
+ import type { SeriesDefinition } from "../../../series/types";
2
+ import { fetchCotContract } from "./client";
3
+ import { COT_ROOT_OPTIONS, cotContractCode, cotNetPoints } from "./model";
4
+
5
+ /**
6
+ * Speculative (noncommercial) net positioning for each market the COT pane
7
+ * names by root, from the legacy report every market is in. The pane's other
8
+ * trader classes and markets stay in the pane.
9
+ */
10
+ export const COT_SERIES: readonly SeriesDefinition[] = COT_ROOT_OPTIONS.flatMap((option): SeriesDefinition[] => {
11
+ const code = cotContractCode(option.value);
12
+ if (!code) return [];
13
+ const market = option.label.startsWith(`${option.value} `) ? option.label.slice(option.value.length + 1) : option.label;
14
+ return [{
15
+ id: `cot:${option.value.toLowerCase()}-noncommercial-net`,
16
+ name: `${market}: noncommercial net position`,
17
+ unit: "contracts",
18
+ frequency: "weekly",
19
+ group: "Positioning",
20
+ tags: ["COT", "commitments of traders", "speculators", "net spec", option.value],
21
+ publisher: "CFTC",
22
+ load: async () => {
23
+ const payload = await fetchCotContract(code, "legacy");
24
+ return { points: cotNetPoints(payload.history, "noncommercial").map((point) => ({ date: point.date, value: point.value })) };
25
+ },
26
+ }];
27
+ });
@@ -76,14 +76,14 @@ function IndexDetail({ row, width, height, focused }: { row: CdxRow; width: numb
76
76
  );
77
77
  }
78
78
 
79
- export function CdxPane({ paneId, focused, width, height }: PaneProps) {
79
+ export function CdxPane({ focused, width, height }: PaneProps) {
80
80
  const theme = useThemeColors();
81
81
  const resource = useAsyncResource(loadCdxBoard, { initialData: getCachedCdxBoard });
82
82
  const { loading, load: refresh, reload } = resource;
83
83
  const payload = resource.data?.payload ?? null;
84
84
  const rows = useMemo(() => payload ? cdxRows(payload.indexes, payload.asOf) : EMPTY_ROWS, [payload]);
85
- const [selectedId, setSelectedId] = usePluginPaneState<string | null>("selected", null);
86
- const [openId, setOpenId] = usePluginPaneState<string | null>("open", null);
85
+ const [selectedId, setSelectedId] = usePluginPaneState<string | null>("cdx:selected", null);
86
+ const [openId, setOpenId] = usePluginPaneState<string | null>("cdx:open", null);
87
87
  useAutoRefresh(resource.updatedAt, refresh);
88
88
  usePaneRefreshKey(reload, { focused, enabled: !loading });
89
89
 
@@ -94,7 +94,7 @@ export function CdxPane({ paneId, focused, width, height }: PaneProps) {
94
94
  ...(resource.data?.stale ? [{ id: "stale", parts: [{ text: "STALE", tone: "warning" as const }] }] : []),
95
95
  ], [asOf, payload, resource.data?.stale]);
96
96
  usePaneStatusFooter({
97
- registrationId: paneId,
97
+ registrationId: "cdx",
98
98
  loading,
99
99
  error: resource.error ?? resource.data?.refreshError ?? null,
100
100
  info,
@@ -1,34 +1,34 @@
1
+ import type { PaneTemplateContext, PaneTemplateInstanceConfig } from "../../../types/plugin";
2
+ import { commandTabParams } from "../shared/command-tab";
1
3
  import type { PluginModule } from "../plugin-module";
2
- import { CdxPane } from "./cdx-pane";
3
4
  import { cdxBoardCache, sovrBoardCache } from "./client";
4
5
  import { cdxHeadless, sovrHeadless } from "./headless";
5
- import { CDX_PANE_ID, SOVR_PANE_ID } from "./model";
6
- import { SovrPane } from "./sovr-pane";
6
+ import { CDX_PANE_ID } from "./model";
7
+ import { CreditBoardsPane } from "./pane";
8
+ import { CREDIT_BOARD_SERIES } from "./series";
9
+
10
+ /** One board. A later command retargets this instance; a fresh id would open a second window. */
11
+ function openCreditBoard(context: PaneTemplateContext, tab: "index" | "sovereign"): PaneTemplateInstanceConfig {
12
+ const existing = context.layout.instances.find((instance) => instance.paneId === CDX_PANE_ID);
13
+ return {
14
+ instanceId: existing?.instanceId ?? CDX_PANE_ID,
15
+ params: commandTabParams(tab),
16
+ };
17
+ }
7
18
 
8
19
  export const creditBoardsModule: PluginModule = {
20
+ series: CREDIT_BOARD_SERIES,
9
21
  panes: [
10
22
  {
11
23
  id: CDX_PANE_ID,
12
- name: "Index CDS",
24
+ // The single-name pane already opens titled "CDS".
25
+ name: "CDS Boards",
13
26
  icon: "X",
14
- component: CdxPane,
15
- defaultPosition: "right",
16
- defaultMode: "floating",
17
- // Five indexes under their history, like Credit Spreads.
18
- defaultFloatingSize: { width: 92, height: 20 },
19
- tableExport: true,
20
- headless: cdxHeadless,
21
- },
22
- {
23
- id: SOVR_PANE_ID,
24
- name: "Sovereign CDS",
25
- icon: "S",
26
- component: SovrPane,
27
+ component: CreditBoardsPane,
27
28
  defaultPosition: "right",
28
29
  defaultMode: "floating",
29
30
  defaultFloatingSize: { width: 96, height: 28 },
30
31
  tableExport: true,
31
- headless: sovrHeadless,
32
32
  },
33
33
  ],
34
34
  paneTemplates: [
@@ -36,19 +36,21 @@ export const creditBoardsModule: PluginModule = {
36
36
  id: "cdx-pane",
37
37
  paneId: CDX_PANE_ID,
38
38
  label: "Index CDS",
39
- description: "CDX IG, HY, EM, iTraxx Main and Crossover on the run from DTCC public dissemination: level, 1D and 1W moves, 1Y rank.",
39
+ description: "CDX IG, HY, EM, iTraxx Main and Crossover on the run from DTCC public dissemination: level, 1D and 1W moves, 1Y rank. Sovereign CDS is the other tab.",
40
40
  keywords: ["cdx", "itraxx", "crossover", "xover", "index", "cds", "credit", "ig", "hy", "em", "spread", "dtcc"],
41
41
  shortcut: { prefix: "CDX" },
42
42
  headless: cdxHeadless,
43
+ createInstance: (context) => openCreditBoard(context, "index"),
43
44
  },
44
45
  {
45
46
  id: "sovr-pane",
46
- paneId: SOVR_PANE_ID,
47
+ paneId: CDX_PANE_ID,
47
48
  label: "Sovereign CDS",
48
- description: "Sovereign 5Y CDS from DTCC public dissemination, ranked by the month's move, beside each local currency's month.",
49
+ description: "The CDS pane on Sovereign: 5Y CDS from DTCC public dissemination, ranked by the month's move, beside each local currency's month.",
49
50
  keywords: ["sovr", "wcds", "sovereign", "country", "cds", "credit", "em", "emerging", "spread", "dtcc"],
50
51
  shortcut: { prefix: "SOVR", aliases: ["WCDS"] },
51
52
  headless: sovrHeadless,
53
+ createInstance: (context) => openCreditBoard(context, "sovereign"),
52
54
  },
53
55
  ],
54
56
  setup(ctx) {
@@ -10,7 +10,6 @@ import type { MarketBoardRow } from "../../../components/market-board";
10
10
  import type { PricePoint } from "../../../types/financials";
11
11
 
12
12
  export const CDX_PANE_ID = "cdx-board";
13
- export const SOVR_PANE_ID = "sovr-board";
14
13
 
15
14
  const YEAR_DAYS = 365;
16
15
  /** A level older than this is not the current market. */
@@ -0,0 +1,30 @@
1
+ import { useEffect, useState } from "react";
2
+ import { PaneFooterScope, usePaneTabs } from "../../../components";
3
+ import type { PaneProps } from "../../../types/plugin";
4
+ import { Box } from "../../../ui";
5
+ import { useCommandTab } from "../shared/command-tab";
6
+ import { CdxPane } from "./cdx-pane";
7
+ import { CDX_PANE_ID } from "./model";
8
+ import { SovrPane } from "./sovr-pane";
9
+
10
+ const TABS = [{ value: "index", label: "Index" }, { value: "sovereign", label: "Sovereign" }];
11
+
12
+ export function CreditBoardsPane(props: PaneProps) {
13
+ const [tab, setTab] = useCommandTab(CDX_PANE_ID, "credit-boards:tab", ["index", "sovereign"], "index");
14
+ const [mounted, setMounted] = useState<Set<string>>(() => new Set([tab]));
15
+ useEffect(() => { setMounted((current) => current.has(tab) ? current : new Set([...current, tab])); }, [tab]);
16
+ const { strip: tabStrip, rows: tabRows } = usePaneTabs({
17
+ tabs: TABS, activeValue: tab, onSelect: (value) => setTab(value === "sovereign" ? "sovereign" : "index"), focused: props.focused, dense: true,
18
+ });
19
+ const height = Math.max(1, props.height - tabRows);
20
+ return <Box width={props.width} height={props.height} flexDirection="column">
21
+ {tabStrip}
22
+ {TABS.map(({ value }) => mounted.has(value) || value === tab ? <Box key={value} visible={value === tab} height={height} flexGrow={1} flexBasis={0} overflow="hidden">
23
+ <PaneFooterScope active={value === tab}>
24
+ {value === "sovereign"
25
+ ? <SovrPane {...props} height={height} focused={props.focused && value === tab} />
26
+ : <CdxPane {...props} height={height} focused={props.focused && value === tab} />}
27
+ </PaneFooterScope>
28
+ </Box> : null)}
29
+ </Box>;
30
+ }
@@ -0,0 +1,66 @@
1
+ import type { CreditBoardPoint } from "../../../api-client/credit-boards";
2
+ import type { SeriesDefinition, SeriesLoadResult } from "../../../series/types";
3
+ import { cachedSeriesWarning } from "../shared/series-warning";
4
+ import { loadCdxBoard, loadSovrBoard } from "./client";
5
+
6
+ /** The five on-the-run 5Y index contracts the CDX tab lists; IG and iTraxx quote spread, HY and EM price. */
7
+ const INDEXES = [
8
+ { code: "IG", name: "CDX IG 5Y", quote: "spread" },
9
+ { code: "HY", name: "CDX HY 5Y", quote: "price" },
10
+ { code: "EM", name: "CDX EM 5Y", quote: "price" },
11
+ { code: "MAIN", name: "iTraxx Main 5Y", quote: "spread" },
12
+ { code: "XOVER", name: "iTraxx Crossover 5Y", quote: "spread" },
13
+ ] as const;
14
+
15
+ /** The sovereigns the SOVR tab follows, by ISO code. */
16
+ const SOVEREIGNS: ReadonlyArray<readonly [code: string, name: string]> = [
17
+ ["BR", "Brazil"], ["MX", "Mexico"], ["CO", "Colombia"], ["TR", "Turkey"], ["ZA", "South Africa"],
18
+ ["CN", "China"], ["ID", "Indonesia"], ["CL", "Chile"], ["PE", "Peru"], ["PH", "Philippines"],
19
+ ["AR", "Argentina"], ["PA", "Panama"], ["SA", "Saudi Arabia"], ["MY", "Malaysia"], ["EG", "Egypt"],
20
+ ["KR", "Korea"], ["IT", "Italy"], ["FR", "France"], ["ES", "Spain"], ["GR", "Greece"],
21
+ ["IE", "Ireland"], ["JP", "Japan"], ["IL", "Israel"], ["PL", "Poland"], ["QA", "Qatar"],
22
+ ["AD", "Abu Dhabi"], ["BH", "Bahrain"], ["OM", "Oman"], ["MA", "Morocco"], ["NG", "Nigeria"],
23
+ ["DO", "Dominican Republic"], ["CI", "Ivory Coast"],
24
+ ];
25
+
26
+ function boardPoints(
27
+ rows: ReadonlyArray<{ id: string; points: readonly CreditBoardPoint[] }>,
28
+ id: string,
29
+ label: string,
30
+ resource: { stale?: boolean; refreshError?: string | null },
31
+ ): SeriesLoadResult {
32
+ const row = rows.find((entry) => entry.id === id);
33
+ if (!row) throw new Error(`${label} is not on the board right now.`);
34
+ const warning = cachedSeriesWarning(resource);
35
+ return {
36
+ points: row.points.map((point) => ({ date: point.date, value: point.level })),
37
+ ...(warning ? { warning } : {}),
38
+ };
39
+ }
40
+
41
+ export const CREDIT_BOARD_SERIES: readonly SeriesDefinition[] = [
42
+ ...INDEXES.map((index): SeriesDefinition => ({
43
+ id: `cdx:${index.code.toLowerCase()}`,
44
+ name: index.name,
45
+ unit: index.quote === "spread" ? "bp" : "points",
46
+ frequency: "daily",
47
+ group: "Credit",
48
+ tags: ["CDS", "index CDS", index.quote, "credit default swap"],
49
+ load: async () => {
50
+ const resource = await loadCdxBoard();
51
+ return boardPoints(resource.payload.indexes, index.code, index.name, resource);
52
+ },
53
+ })),
54
+ ...SOVEREIGNS.map(([code, name]): SeriesDefinition => ({
55
+ id: `sovereign-cds:${code.toLowerCase()}`,
56
+ name: `${name} 5Y sovereign CDS`,
57
+ unit: "bp",
58
+ frequency: "daily",
59
+ group: "Credit",
60
+ tags: ["CDS", "sovereign", code, "credit default swap"],
61
+ load: async () => {
62
+ const resource = await loadSovrBoard();
63
+ return boardPoints(resource.payload.sovereigns, code, name, resource);
64
+ },
65
+ })),
66
+ ];
@@ -76,14 +76,14 @@ function SovereignDetail({ row, width, height, focused }: { row: SovrRow; width:
76
76
  );
77
77
  }
78
78
 
79
- export function SovrPane({ paneId, focused, width, height }: PaneProps) {
79
+ export function SovrPane({ focused, width, height }: PaneProps) {
80
80
  const theme = useThemeColors();
81
81
  const provider = useAssetData();
82
82
  const resource = useAsyncResource(loadSovrBoard, { initialData: getCachedSovrBoard });
83
83
  const { loading, load: refresh, reload } = resource;
84
84
  const payload = resource.data?.payload ?? null;
85
- const [selectedId, setSelectedId] = usePluginPaneState<string | null>("selected", null);
86
- const [openId, setOpenId] = usePluginPaneState<string | null>("open", null);
85
+ const [selectedId, setSelectedId] = usePluginPaneState<string | null>("sovr:selected", null);
86
+ const [openId, setOpenId] = usePluginPaneState<string | null>("sovr:open", null);
87
87
  useAutoRefresh(resource.updatedAt, refresh);
88
88
 
89
89
  // Each currency's month against the dollar, from the same daily closes the FX panes use.
@@ -107,7 +107,7 @@ export function SovrPane({ paneId, focused, width, height }: PaneProps) {
107
107
  ...(resource.data?.stale ? [{ id: "stale", parts: [{ text: "STALE", tone: "warning" as const }] }] : []),
108
108
  ], [asOf, payload, resource.data?.stale]);
109
109
  usePaneStatusFooter({
110
- registrationId: paneId,
110
+ registrationId: "sovr",
111
111
  loading: loading || moves.loading,
112
112
  error: resource.error ?? resource.data?.refreshError ?? null,
113
113
  info,