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
@@ -10,10 +10,20 @@ import type {
10
10
  } from "../types/financials";
11
11
  import type { SyncSettings, SyncSnapshot } from "../sync/types";
12
12
 
13
+ /**
14
+ * What stands behind a chat account. `discord` is a person on the Gloom
15
+ * Discord who has not linked a Gloom account: a ghost with no profile, no DMs.
16
+ * A server that predates the field leaves it out, which reads as a human.
17
+ */
18
+ export type ChatAccountType = "human" | "managed_llm" | "discord";
19
+
20
+ /** Where a message was written. A message without one came from the app. */
21
+ export type ChatMessageOrigin = "app" | "discord";
22
+
13
23
  export interface ChatUserSummary {
14
24
  id: string;
15
25
  /** A person, a managed assistant (Gloombot), or a Discord user bridged into public channels. */
16
- accountType?: "human" | "managed_llm" | "discord";
26
+ accountType?: ChatAccountType;
17
27
  username: string | null;
18
28
  displayName: string;
19
29
  bio?: string | null;
@@ -47,6 +57,7 @@ export interface ChatMessage {
47
57
  createdAt: string;
48
58
  editedAt?: string | null;
49
59
  user: ChatUserSummary;
60
+ origin?: ChatMessageOrigin;
50
61
  replyTo?: {
51
62
  content: string;
52
63
  user: { id?: string; username: string };
@@ -67,6 +78,15 @@ export interface ChatMessage {
67
78
  clientMessageId?: string;
68
79
  }
69
80
 
81
+ /** Whether this account is tied to a person on the Gloom Discord, and whether its public messages go there. */
82
+ export interface ChatDiscordLink {
83
+ linked: boolean;
84
+ discordUsername?: string;
85
+ mirror: boolean;
86
+ /** False when the server has linking switched off. A server that predates the field is available. */
87
+ available: boolean;
88
+ }
89
+
70
90
  export interface ChatChannel {
71
91
  id: string;
72
92
  name: string;
@@ -225,6 +245,22 @@ export interface CloudPricing {
225
245
  yearly: CloudPricingTier;
226
246
  }
227
247
 
248
+ /**
249
+ * What an MCP key reaches beyond market data: `data` is market and filing
250
+ * tools only, `read` adds notes, teams and collections, `write` lets the agent
251
+ * save notes and change collection items.
252
+ */
253
+ export type McpKeyScope = "data" | "read" | "write";
254
+
255
+ /**
256
+ * A key just created with `POST /account/mcp/keys`. `token` is the secret,
257
+ * which the server never returns again: show it once, never store it.
258
+ */
259
+ export interface CreatedMcpKey {
260
+ token: string;
261
+ apiKey: { id: string; name: string; scope: McpKeyScope };
262
+ }
263
+
228
264
  /** The account's private calendar feed link (`/account/calendar-feed`). */
229
265
  export interface CalendarFeed {
230
266
  url: string;
@@ -382,6 +418,17 @@ export interface CloudEconEventPayload {
382
418
  impact: CloudEconImpact;
383
419
  }
384
420
 
421
+ /** CPI, payrolls and FOMC statement days as published, as GET /cloud/econ/release-days serves them. */
422
+ export interface CloudMacroReleaseDaysPayload {
423
+ /** When the publishers' pages were read, ISO. */
424
+ checkedAt: string;
425
+ /** The last New York day the lists are complete for. */
426
+ coveredThrough: string;
427
+ sources: string[];
428
+ /** New York dates, oldest first. */
429
+ releases: Record<"cpi" | "jobs" | "fomc", string[]>;
430
+ }
431
+
385
432
  export interface CloudFredObservationPayload {
386
433
  date: string;
387
434
  value: number | null;
@@ -408,6 +455,11 @@ export interface CloudFredSeriesPayload {
408
455
  coverage?: { observations: "available"; info: "available" | "unavailable" };
409
456
  }
410
457
 
458
+ /** The FRED series Gloom Cloud serves, from `GET /cloud/econ/series`; any other id is refused. */
459
+ export interface CloudFredSeriesCatalogPayload {
460
+ series: Array<{ id: string; title?: string | null; group?: string | null }>;
461
+ }
462
+
411
463
  /**
412
464
  * One month of Robert Shiller's dataset. FRED carries no long-run S&P earnings,
413
465
  * so this is what every earnings-based valuation ratio is built from.
@@ -1319,6 +1371,8 @@ export interface CloudMarketResponse<T> {
1319
1371
  status: CloudMarketStatus;
1320
1372
  data: T | null;
1321
1373
  reasonCode?: string;
1374
+ /** Untrusted, human-readable reason the answer is empty. Cleaned before it is shown. */
1375
+ message?: string;
1322
1376
  asOf?: string;
1323
1377
  staleAt?: string;
1324
1378
  stale?: boolean;
@@ -1329,6 +1383,8 @@ export interface CloudMarketResponse<T> {
1329
1383
  historySession?: unknown;
1330
1384
  /** "extended" when the history includes the pre-market and after-hours bars asked for. */
1331
1385
  session?: unknown;
1386
+ /** "1day" when daily bars answer an intraday range: the listing has no intraday bars. */
1387
+ servedResolution?: unknown;
1332
1388
  /** Untrusted until the history adapter validates its boundary dates. */
1333
1389
  coverage?: CloudHistoryCoverage;
1334
1390
  providerMeta?: {
@@ -1362,6 +1418,8 @@ export interface CloudMarketBatchItem<T> {
1362
1418
  status: CloudMarketStatus;
1363
1419
  data: T | null;
1364
1420
  reasonCode?: string;
1421
+ /** Untrusted, human-readable reason this item is empty. Cleaned before it is shown. */
1422
+ message?: string;
1365
1423
  stale?: boolean;
1366
1424
  }
1367
1425
 
@@ -1371,13 +1429,27 @@ export interface CloudMarketBatchPayload<T> {
1371
1429
 
1372
1430
  export type CloudMarketScreenerCategory = "gainers" | "losers" | "most-active";
1373
1431
 
1374
- export interface CloudMarketScreenerItem {
1432
+ /**
1433
+ * A movers row's quote sessions, under the quote's field names and meaning:
1434
+ * the session it was read in, the day its change is dated to, the last
1435
+ * completed regular session's close and move, and an open pre-market or
1436
+ * after-hours print with its move from that close. Older servers send none.
1437
+ */
1438
+ export type CloudMoverSessionFields = Partial<Pick<Quote,
1439
+ | "marketState" | "changeSessionDate"
1440
+ | "regularClose" | "regularCloseSessionDate" | "regularChange" | "regularChangePercent"
1441
+ | "preMarketPrice" | "preMarketChange" | "preMarketChangePercent"
1442
+ | "postMarketPrice" | "postMarketChange" | "postMarketChangePercent">>;
1443
+
1444
+ /** price, change and changePercent are the live print the list is ranked by; the session fields say how it reads. */
1445
+ export interface CloudMarketScreenerItem extends CloudMoverSessionFields {
1375
1446
  rank: number;
1376
1447
  symbol: string;
1377
1448
  name: string;
1378
1449
  price: number;
1379
1450
  change: number;
1380
1451
  changePercent: number;
1452
+ previousClose?: number;
1381
1453
  volume: number;
1382
1454
  /** Available average volume for this listing, independent of public ranking membership. */
1383
1455
  avgVolume?: number;
@@ -0,0 +1,90 @@
1
+ import type { ExperimentAnswer, StorageLike } from "./web-experiments";
2
+
3
+ /**
4
+ * `upgrade_personalized`: the upgrade sheet and onboarding's Pro step name
5
+ * the account's own holdings, or the tickers it watches, instead of the
6
+ * generic line. The registry, the arm and the stop
7
+ * switch live with the API (gloomberb-platform `shared/experiments.ts`); the
8
+ * unit is the signed-in free account, so the same person gets the same arm in
9
+ * the terminal, the desktop app, the web terminal and on gloom.sh/cloud.
10
+ *
11
+ * The tickers never leave the device: the exposure carries the experiment and
12
+ * where it was shown, nothing about the holdings.
13
+ */
14
+ export const UPGRADE_PERSONALIZED = "upgrade_personalized";
15
+
16
+ export type UpgradePersonalizedVariant = "control" | "personalized";
17
+
18
+ export interface UpgradeExperimentContext {
19
+ accountId?: string;
20
+ pro: boolean;
21
+ optedOut: boolean;
22
+ automated: boolean;
23
+ /** Keeps this session's answer across reloads where there is one (web, desktop). */
24
+ session?: StorageLike;
25
+ }
26
+
27
+ const SESSION_PREFIX = "gloomberb.upgrade-personalized.exposed:";
28
+
29
+ function unit(context: UpgradeExperimentContext): string | undefined {
30
+ if (!context.accountId || context.pro || context.optedOut || context.automated) return undefined;
31
+ return `account:${context.accountId}`;
32
+ }
33
+
34
+ function isVariant(value: unknown): value is UpgradePersonalizedVariant {
35
+ return value === "control" || value === "personalized";
36
+ }
37
+
38
+ function read(storage: StorageLike | undefined, key: string): string | null {
39
+ try { return storage?.getItem(key) ?? null; } catch { return null; }
40
+ }
41
+
42
+ function write(storage: StorageLike | undefined, key: string, value: string): void {
43
+ try { storage?.setItem(key, value); } catch { /* Storage is optional in private browsing. */ }
44
+ }
45
+
46
+ /**
47
+ * One exposure per account and session. An accepted arm, or the API's "not in
48
+ * the experiment", is kept for the session; a failed request (offline, an API
49
+ * that does not know the experiment yet, a timeout) is not an exposure and is
50
+ * asked again by the next surface.
51
+ */
52
+ export function createUpgradeExperimentSession() {
53
+ const answers = new Map<string, UpgradePersonalizedVariant | null>();
54
+ const pending = new Map<string, Promise<UpgradePersonalizedVariant | null>>();
55
+
56
+ function known(context: UpgradeExperimentContext): UpgradePersonalizedVariant | null | undefined {
57
+ const identity = unit(context);
58
+ if (!identity) return null;
59
+ if (answers.has(identity)) return answers.get(identity);
60
+ const saved = read(context.session, `${SESSION_PREFIX}${identity}`);
61
+ if (saved === "excluded") return null;
62
+ return isVariant(saved) ? saved : undefined;
63
+ }
64
+
65
+ return {
66
+ /** The arm already answered in this session, null outside it, undefined when not asked yet. */
67
+ known,
68
+ expose(
69
+ context: UpgradeExperimentContext,
70
+ ask: () => Promise<ExperimentAnswer>,
71
+ ): Promise<UpgradePersonalizedVariant | null> {
72
+ const identity = unit(context);
73
+ if (!identity) return Promise.resolve(null);
74
+ const previous = known(context);
75
+ if (previous !== undefined) return Promise.resolve(previous);
76
+ const inFlight = pending.get(identity);
77
+ if (inFlight) return inFlight;
78
+ const request = (async () => {
79
+ let answer: ExperimentAnswer;
80
+ try { answer = await ask(); } catch { return null; }
81
+ const variant = answer.accepted && isVariant(answer.variant) ? answer.variant : null;
82
+ answers.set(identity, variant);
83
+ write(context.session, `${SESSION_PREFIX}${identity}`, variant ?? "excluded");
84
+ return variant;
85
+ })().finally(() => pending.delete(identity));
86
+ pending.set(identity, request);
87
+ return request;
88
+ },
89
+ };
90
+ }
@@ -36,6 +36,14 @@ export interface CloudCurveView {
36
36
  checkedAt: string | null;
37
37
  }
38
38
 
39
+ /** One tenor of a stored curve over time, oldest first (`GET /cloud/econ/curves/:curve/history`). */
40
+ export interface CloudCurveHistory {
41
+ curve: CloudCurveHeader;
42
+ tenor: string;
43
+ points: Array<{ date: string; value: number }>;
44
+ checkedAt: string | null;
45
+ }
46
+
39
47
  export interface CloudWorldCurves {
40
48
  curves: Array<{
41
49
  curve: CloudCurveHeader;
@@ -13,7 +13,10 @@ import { getVisiblePaneCycleOrder } from "../components/layout/pane/cycle-order"
13
13
  import { requestFunctionHelp, useFunctionHelpHost } from "../plugins/builtin/help/function-card";
14
14
  import { buildRegistryHelpIndex, helpFunctionForPane } from "../plugins/builtin/help/function-index";
15
15
  import { recordFunctionOpen } from "../telemetry/usage-counts";
16
+ import { DOCS_PANE_TEMPLATE_ID } from "../docs/content";
17
+ import { registerPaneDocsHandler } from "../docs/requests";
16
18
  import { isMoveDownShortcut, isMoveUpShortcut } from "../components/command-bar/keyboard-handlers";
19
+ import { pressStarPromptKey } from "./star-prompt/runtime";
17
20
  import {
18
21
  copyActiveSelection,
19
22
  isCopyShortcut,
@@ -119,6 +122,18 @@ export function useAppGlobalShortcuts({
119
122
  if (state.commandBarOpen) dispatch({ type: "SET_COMMAND_BAR", open: false });
120
123
  },
121
124
  });
125
+ const layoutRef = useRef(state.config.layout);
126
+ layoutRef.current = state.config.layout;
127
+ // A pane's `?`: its entry in DOCS, or its help card where no pane can open.
128
+ useEffect(() => registerPaneDocsHandler((paneId) => {
129
+ if (!isDetachedWindow) {
130
+ pluginRegistry.createPaneFromTemplate(DOCS_PANE_TEMPLATE_ID, { values: { pane: paneId } });
131
+ return;
132
+ }
133
+ const instance = findPaneInstance(layoutRef.current, paneId);
134
+ const fn = instance ? helpFunctionForPane(buildRegistryHelpIndex(pluginRegistry), pluginRegistry, instance) : null;
135
+ if (fn) requestFunctionHelp({ kind: "function", fn, inAppDocs: false });
136
+ }), [isDetachedWindow, pluginRegistry]);
122
137
 
123
138
  useShortcut((event) => {
124
139
  if (isCopyShortcut(event) && copyActiveSelection(nativeRenderer)) {
@@ -154,10 +169,19 @@ export function useAppGlobalShortcuts({
154
169
  }
155
170
 
156
171
  // Toasts float above everything, so their keys work over a dialog too.
172
+ // The status bar's star line answers the same keys once no toast does,
173
+ // but only over the workspace itself.
157
174
  if (action === "notification-action" || action === "notification-dismiss") {
158
- const handled = action === "notification-action"
175
+ const toastHandled = action === "notification-action"
159
176
  ? toastHost.activateNewest?.() === true
160
177
  : toastHost.dismissNewest?.() === true;
178
+ const handled = toastHandled || (
179
+ !dialogOpen
180
+ && !state.commandBarOpen
181
+ && !state.inputCaptured
182
+ && !isDetachedWindow
183
+ && pressStarPromptKey(action === "notification-action" ? "open" : "dismiss")
184
+ );
161
185
  if (handled) {
162
186
  event.preventDefault();
163
187
  event.stopPropagation();
@@ -227,7 +251,7 @@ export function useAppGlobalShortcuts({
227
251
  recordFunctionOpen({ shortcut: "HELP", externalPluginId: null });
228
252
  const instance = state.focusedPaneId ? findPaneInstance(state.config.layout, state.focusedPaneId) : undefined;
229
253
  const fn = instance ? helpFunctionForPane(buildRegistryHelpIndex(pluginRegistry), pluginRegistry, instance) : null;
230
- if (fn && requestFunctionHelp({ kind: "function", fn })) return;
254
+ if (fn && requestFunctionHelp({ kind: "function", fn, inAppDocs: !isDetachedWindow })) return;
231
255
  if (!isDetachedWindow) pluginRegistry.showPane("help");
232
256
  return;
233
257
  }
@@ -22,6 +22,7 @@ export type CoreKeybindingActionId =
22
22
  | "close-floating-panes"
23
23
  | "pane-settings"
24
24
  | "pane-fullscreen"
25
+ | "pane-new-layout"
25
26
  | "pane-float"
26
27
  | "pane-pop-out"
27
28
  | "pane-screenshot"
@@ -52,6 +53,7 @@ export const PANE_ACTION_IDS = new Set<CoreKeybindingActionId>([
52
53
  "close-floating-panes",
53
54
  "pane-settings",
54
55
  "pane-fullscreen",
56
+ "pane-new-layout",
55
57
  "pane-float",
56
58
  "pane-pop-out",
57
59
  "pane-screenshot",
@@ -186,6 +188,14 @@ export const KEYBINDING_ACTIONS: readonly KeybindingActionDef[] = [
186
188
  description: "Fill the window with the focused pane, or restore it.",
187
189
  defaults: ["CmdOrCtrl+Shift+F"],
188
190
  },
191
+ {
192
+ id: "pane-new-layout",
193
+ category: "Pane Management",
194
+ description: "Move the focused pane to a new layout of its own, or back to the layout it came from.",
195
+ // N for new, and no app chord had it. Browsers keep Ctrl/Cmd+Shift+N for a
196
+ // private window, so on the web the pane menu and command bar carry it.
197
+ defaults: ["CmdOrCtrl+Shift+N"],
198
+ },
189
199
  {
190
200
  id: "pane-float",
191
201
  category: "Pane Management",
@@ -10,6 +10,7 @@ import {
10
10
  isPaneInLayout,
11
11
  } from "../../layout/pane-manager";
12
12
  import type { PluginRegistry } from "../../plugins/registry";
13
+ import { PluginOffError, notifyPluginOff } from "../../plugins/plugin-off";
13
14
  import type { LoadedExternalPlugin } from "../../plugins/loader";
14
15
  import {
15
16
  getFocusedCollectionId,
@@ -215,6 +216,12 @@ export function useAppPaneRuntime({
215
216
  const target = resolvePaneShowTarget(state.config.layout, paneId);
216
217
  const paneDef = pluginRegistry.panes.get(target.paneType);
217
218
  if (!paneDef) return;
219
+ // Its pane would be added, or focused, hidden.
220
+ const owner = pluginRegistry.getDisabledPaneOwner(target.paneType, stateRef.current.config.disabledPlugins);
221
+ if (owner) {
222
+ notifyPluginOff(pluginRegistry, new PluginOffError(owner, paneDef.name), () => pluginRegistry.showPane(paneId));
223
+ return;
224
+ }
218
225
 
219
226
  if (target.paneType === TICKER_RESEARCH_PANE_ID) {
220
227
  showTickerResearchPane();
@@ -241,6 +248,7 @@ export function useAppPaneRuntime({
241
248
  pluginRegistry,
242
249
  showTickerResearchPane,
243
250
  state.config.layout,
251
+ stateRef,
244
252
  ]);
245
253
 
246
254
  const { createPaneFromTemplate } = useAppPaneTemplateRuntime({
@@ -4,6 +4,7 @@ import { createPaneTemplateOrThrow } from "../../components/command-bar/workflow
4
4
  import { openFormModal } from "../../components/form-modal";
5
5
  import type { AppTickerRepositoryPort } from "../../core/app-service-ports";
6
6
  import type { PluginRegistry } from "../../plugins/registry";
7
+ import { PluginOffError, notifyPluginOff } from "../../plugins/plugin-off";
7
8
  import type { AppAction, AppState } from "../../state/app/context";
8
9
  import type { PaneBinding, PaneInstanceConfig } from "../../types/config";
9
10
  import type { DataProvider } from "../../types/data-provider";
@@ -70,6 +71,10 @@ export function useAppPaneTemplateRuntime({
70
71
  placePaneInstance,
71
72
  });
72
73
  } catch (error) {
74
+ if (error instanceof PluginOffError) {
75
+ notifyPluginOff(pluginRegistry, error, () => { void createPaneFromTemplate(templateId, options); });
76
+ return;
77
+ }
73
78
  notify(
74
79
  error instanceof Error ? error.message : `Could not create ${getPaneTemplateDisplayLabel(template).toLowerCase()}.`,
75
80
  { type: "info" },
@@ -8,6 +8,13 @@ import { openFormModal } from "../../components/form-modal";
8
8
  import { t } from "../../i18n";
9
9
  import { openBrokerAddFlow } from "../../plugins/builtin/broker-manager/add-request";
10
10
  import { getPanelFocusTarget } from "../../core/state/app/layout";
11
+ import { getVisiblePaneCycleOrder } from "../../components/layout/pane/cycle-order";
12
+ import {
13
+ collectDisabledPaneIds,
14
+ resolveShellVisibleLayout,
15
+ restoreShellHiddenPanes,
16
+ } from "../../components/layout/shell/visible-layout";
17
+ import { applyPluginToggles } from "../../plugins/ownership";
11
18
  import { setLayoutManagerDispatch } from "../../plugins/builtin/layout-manager";
12
19
  import { setMarketplaceHost } from "../../plugins/builtin/plugin-marketplace/store";
13
20
  import type { InstalledPlugin } from "../../plugins/builtin/plugin-marketplace/model";
@@ -25,6 +32,7 @@ import {
25
32
  removePane,
26
33
  } from "../../layout/pane-manager";
27
34
  import type { PluginRegistry } from "../../plugins/registry";
35
+ import { PluginOffError, notifyPluginOff } from "../../plugins/plugin-off";
28
36
  import { reportCrash } from "../../telemetry/crash-reports";
29
37
  import { recordFunctionOpen, usageFunctionForPane } from "../../telemetry/usage-counts";
30
38
  import { captureAttentionAction } from "../../telemetry/attention-counts";
@@ -33,15 +41,16 @@ import {
33
41
  resolveTickerNavigationReplacementPane,
34
42
  shouldFocusTickerNavigationTarget,
35
43
  } from "../../layout/ticker-navigation";
36
- import type {
37
- AppAction,
38
- AppState,
44
+ import {
45
+ resolveTickerForPane,
46
+ type AppAction,
47
+ type AppState,
39
48
  } from "../../state/app/context";
40
49
  import type {
41
50
  LayoutConfig,
42
51
  PaneInstanceConfig,
43
52
  } from "../../types/config";
44
- import { TICKER_RESEARCH_PANE_ID } from "../../types/config";
53
+ import { findPaneInstance, TICKER_RESEARCH_PANE_ID } from "../../types/config";
45
54
  import type { DataProvider } from "../../types/data-provider";
46
55
  import type {
47
56
  PaneDef,
@@ -129,7 +138,33 @@ export function bindAppPanePluginRegistry({
129
138
  switchTickerResearchTab,
130
139
  tickerRepository,
131
140
  }: BindAppPanePluginRegistryOptions): void {
141
+ // Switching plugins never edits the layout: the shell hides a switched-off
142
+ // plugin's panes where they are and shows them again when it comes back.
143
+ // Only focus moves, off a pane that just went hidden.
144
+ const setPluginsEnabled = (changes: Readonly<Record<string, boolean>>) => {
145
+ const current = stateRef.current;
146
+ // Setting a state, not flipping it, so a second "Turn on" from an older
147
+ // toast cannot switch the plugin back off.
148
+ const disabledPlugins = applyPluginToggles(current.config.disabledPlugins ?? [], changes);
149
+ if (!disabledPlugins) return;
150
+ const focused = current.focusedPaneId ? findPaneInstance(current.config.layout, current.focusedPaneId) : undefined;
151
+ const focusHidden = !!focused && collectDisabledPaneIds(pluginRegistry, disabledPlugins).has(focused.paneId);
152
+ dispatch(focusHidden
153
+ ? {
154
+ type: "SET_DISABLED_PLUGINS",
155
+ disabledPlugins,
156
+ focusedPaneId: getVisiblePaneCycleOrder(current.config.layout, pluginRegistry, disabledPlugins)[0] ?? null,
157
+ }
158
+ : { type: "SET_DISABLED_PLUGINS", disabledPlugins });
159
+ const nextConfig = { ...current.config, disabledPlugins };
160
+ persistConfig(nextConfig);
161
+ pluginRegistry.events.emit("config:changed", { config: nextConfig });
162
+ };
163
+ const setPluginEnabled = (pluginId: string, enabled: boolean) => setPluginsEnabled({ [pluginId]: enabled });
164
+
132
165
  pluginRegistry.bindHost({
166
+ setPluginEnabled,
167
+ setPluginsEnabled,
133
168
  selectTicker: (symbol, paneId) => selectTickerInPane(symbol, paneId),
134
169
  switchPanel: (panel) => {
135
170
  if (isDetachedWindow) return;
@@ -196,10 +231,9 @@ export function bindAppPanePluginRegistry({
196
231
  const sharedPane = materialized.layout.instances[0];
197
232
  if (!sharedPane) throw new Error("This shared pane is invalid.");
198
233
  const paneDef = pluginRegistry.panes.get(sharedPane.paneId);
199
- const ownerId = pluginRegistry.getPanePluginId(sharedPane.paneId);
200
- if (!paneDef || (ownerId && stateRef.current.config.disabledPlugins.includes(ownerId))) {
201
- throw new Error("This shared pane is unavailable in this version of Gloomberb.");
202
- }
234
+ if (!paneDef) throw new Error("This shared pane is unavailable in this version of Gloomberb.");
235
+ const owner = pluginRegistry.getDisabledPaneOwner(sharedPane.paneId, stateRef.current.config.disabledPlugins);
236
+ if (owner) throw new PluginOffError(owner, "this shared pane");
203
237
  const instance = buildPaneInstance(sharedPane.paneId, sharedPane);
204
238
  if (!instance) throw new Error("This shared pane could not be created.");
205
239
  dispatch({
@@ -242,6 +276,15 @@ export function bindAppPanePluginRegistry({
242
276
  showPane(paneId);
243
277
  return;
244
278
  }
279
+ // In the layout but hidden with its plugin, as the research pane that
280
+ // follows a list is while Ticker Research is off.
281
+ const paneType = findPaneInstance(stateRef.current.config.layout, instanceId)?.paneId;
282
+ const owner = paneType ? pluginRegistry.getDisabledPaneOwner(paneType, stateRef.current.config.disabledPlugins) : null;
283
+ if (owner) {
284
+ const what = resolveTickerForPane(stateRef.current, instanceId) ?? pluginRegistry.panes.get(paneType!)?.name ?? paneType!;
285
+ notifyPluginOff(pluginRegistry, new PluginOffError(owner, what), () => pluginRegistry.focusPane(paneId, layout));
286
+ return;
287
+ }
245
288
 
246
289
  focusVisiblePane(instanceId, layout);
247
290
  },
@@ -254,6 +297,12 @@ export function bindAppPanePluginRegistry({
254
297
  },
255
298
  navigateTicker: (rawSymbol, options) => {
256
299
  if (isDetachedWindow) return;
300
+ // Navigation lands in a research pane, which stays hidden while its plugin is off.
301
+ const researchOwner = pluginRegistry.getDisabledPaneOwner(TICKER_RESEARCH_PANE_ID, stateRef.current.config.disabledPlugins);
302
+ if (researchOwner) {
303
+ notifyPluginOff(pluginRegistry, new PluginOffError(researchOwner, rawSymbol), () => pluginRegistry.navigateTicker(rawSymbol, options));
304
+ return;
305
+ }
257
306
  const recordAttention = captureAttentionAction();
258
307
  recordFunctionOpen(usageFunctionForPane(pluginRegistry, TICKER_RESEARCH_PANE_ID));
259
308
  const sourcePaneId = options?.sourcePaneId ?? stateRef.current.focusedPaneId;
@@ -334,12 +383,15 @@ export function bindAppPanePluginRegistry({
334
383
  },
335
384
  });
336
385
 
386
+ // Layout commands (Tidy, Swap, Float, Close) act on what is on screen, as
387
+ // the shell's own menus do, and leave a switched-off plugin's panes alone.
388
+ const disabledPaneIds = () => collectDisabledPaneIds(pluginRegistry, stateRef.current.config.disabledPlugins);
337
389
  setLayoutManagerDispatch(dispatch, () => ({
338
- layout: state.config.layout,
390
+ layout: resolveShellVisibleLayout(state.config.layout, disabledPaneIds(), pluginRegistry.panes),
339
391
  termWidth: pluginRegistry.getTermSize().width,
340
392
  termHeight: pluginRegistry.getTermSize().height,
341
393
  focusedPaneId: state.focusedPaneId,
342
- }));
394
+ }), (edited) => restoreShellHiddenPanes(stateRef.current.config.layout, edited, disabledPaneIds(), pluginRegistry.panes));
343
395
 
344
396
  setExternalPlugins(externalPlugins);
345
397
 
@@ -457,7 +509,7 @@ export function bindAppPanePluginRegistry({
457
509
  });
458
510
  const commands = [...pluginRegistry.commands.entries()]
459
511
  .filter(([id]) => pluginRegistry.getCommandPluginId(id) === pluginId && !id.endsWith(":setup"))
460
- .map(([id, command]) => ({ id, label: command.label }));
512
+ .map(([id, command]) => ({ id, label: command.label, ...(command.shortcut ? { shortcut: command.shortcut } : {}) }));
461
513
  const capabilities = pluginRegistry.capabilities.manifests()
462
514
  .filter((manifest) => pluginRegistry.getCapabilityPluginId(manifest.id) === pluginId).length;
463
515
  const broker = [...pluginRegistry.brokers.keys()].some((type) => pluginRegistry.getBrokerPluginId(type) === pluginId);
@@ -466,19 +518,7 @@ export function bindAppPanePluginRegistry({
466
518
  notify: (notification) => {
467
519
  pluginRegistry.notify(notification);
468
520
  },
469
- setPluginEnabled: (pluginId, enabled) => {
470
- const current = stateRef.current.config;
471
- if (!enabled) {
472
- for (const paneId of pluginRegistry.getPluginPaneIds(pluginId)) pluginRegistry.hidePane(paneId);
473
- }
474
- dispatch({ type: "TOGGLE_PLUGIN", pluginId });
475
- const disabled = current.disabledPlugins ?? [];
476
- persistConfig({
477
- ...current,
478
- disabledPlugins: enabled
479
- ? disabled.filter((entry) => entry !== pluginId)
480
- : [...disabled, pluginId],
481
- });
482
- },
521
+ setPluginEnabled,
522
+ setPluginsEnabled,
483
523
  });
484
524
  }
@@ -5,6 +5,7 @@ import {
5
5
  findDockLeaf,
6
6
  } from "../../layout/pane-manager";
7
7
  import type { PluginRegistry } from "../../plugins/registry";
8
+ import { PluginOffError, notifyPluginOff } from "../../plugins/plugin-off";
8
9
  import {
9
10
  findTickerResearchFollower,
10
11
  listVisibleTickerSourcePanes,
@@ -110,6 +111,15 @@ export function useAppTickerInspectorRuntime({
110
111
  }, [pluginRegistry, resolveInspectorPane, state.config.layout]);
111
112
 
112
113
  const switchTickerResearchTab = useCallback((tabId: string, preferredPaneId?: string | null) => {
114
+ // The tab lives in a research pane, which stays hidden while its plugin is
115
+ // off, and the tab itself is hidden while its own plugin is.
116
+ const owner = pluginRegistry.getDisabledPaneOwner(TICKER_RESEARCH_PANE_ID, state.config.disabledPlugins)
117
+ ?? pluginRegistry.getDisabledTickerResearchTabOwner(tabId, state.config.disabledPlugins);
118
+ if (owner) {
119
+ const tabName = pluginRegistry.tickerResearchTabs.get(tabId)?.name ?? "this tab";
120
+ notifyPluginOff(pluginRegistry, new PluginOffError(owner, tabName), () => pluginRegistry.switchTab(tabId, preferredPaneId ?? undefined));
121
+ return;
122
+ }
113
123
  const targetPaneId = (() => {
114
124
  const target = preferredPaneId ? resolvePaneInstance(state.config.layout, preferredPaneId) : null;
115
125
  if (target?.paneId === TICKER_RESEARCH_PANE_ID) return target.instanceId;
@@ -131,7 +141,9 @@ export function useAppTickerInspectorRuntime({
131
141
  dispatch,
132
142
  ensureInspectorPane,
133
143
  persistLayout,
144
+ pluginRegistry,
134
145
  resolveTickerSourcePaneId,
146
+ state.config.disabledPlugins,
135
147
  state.config.layout,
136
148
  state.focusedPaneId,
137
149
  ]);