gloomberb 0.16.2 → 0.16.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (527) hide show
  1. package/package.json +4 -1
  2. package/src/api-client/askg.ts +43 -0
  3. package/src/api-client/auth.ts +15 -0
  4. package/src/api-client/beneficial-owners.ts +4 -0
  5. package/src/api-client/chat.ts +19 -0
  6. package/src/api-client/company-kpis.ts +14 -2
  7. package/src/api-client/data.ts +34 -16
  8. package/src/api-client/index.ts +12 -0
  9. package/src/api-client/normalizers.ts +27 -0
  10. package/src/api-client/paths.ts +88 -23
  11. package/src/api-client/request.ts +2 -1
  12. package/src/api-client/research-activity.ts +31 -0
  13. package/src/api-client/socket.ts +39 -8
  14. package/src/api-client/types.ts +57 -1
  15. package/src/api-client/upgrade-experiment.ts +90 -0
  16. package/src/app/global-shortcuts.ts +11 -1
  17. package/src/app/keybindings/actions.ts +10 -0
  18. package/src/app/pane-runtime/index.tsx +8 -0
  19. package/src/app/pane-runtime/pane-template-runtime.ts +5 -0
  20. package/src/app/pane-runtime/plugin-bindings.ts +65 -25
  21. package/src/app/pane-runtime/ticker-inspector-runtime.ts +12 -0
  22. package/src/app/pane-runtime/ticker-open-runtime.ts +18 -1
  23. package/src/app/runtime/desktop-deeplink.ts +5 -0
  24. package/src/app/star-prompt/model.ts +98 -0
  25. package/src/app/star-prompt/runtime.ts +41 -0
  26. package/src/app/star-prompt/status-line.tsx +190 -0
  27. package/src/app.tsx +13 -7
  28. package/src/architecture/core-builtin-allowlist.json +70 -0
  29. package/src/brokers/account-cache.ts +45 -0
  30. package/src/brokers/signed-in/adapter.ts +33 -2
  31. package/src/brokers/signed-in/client.ts +10 -0
  32. package/src/brokers/signed-in/sign-in-dialog.tsx +23 -9
  33. package/src/brokers/signed-in/sign-in.ts +62 -5
  34. package/src/capabilities/registry.ts +8 -1
  35. package/src/capabilities/types.ts +2 -0
  36. package/src/cli/command-options.ts +74 -0
  37. package/src/cli/commands/command-utils.ts +29 -0
  38. package/src/cli/commands/crypto-hints.ts +12 -4
  39. package/src/cli/commands/market.ts +524 -148
  40. package/src/cli/commands/options-chain.ts +172 -0
  41. package/src/cli/commands/options-leaps.ts +422 -0
  42. package/src/cli/commands/overview.ts +223 -42
  43. package/src/cli/commands/search.ts +29 -8
  44. package/src/cli/commands/system.ts +99 -19
  45. package/src/cli/commands/themes.ts +64 -0
  46. package/src/cli/commands/ticker.ts +200 -73
  47. package/src/cli/desktop-pane-shot.ts +100 -16
  48. package/src/cli/errors.ts +25 -2
  49. package/src/cli/freshness.ts +7 -4
  50. package/src/cli/fx-pair.ts +57 -0
  51. package/src/cli/help.ts +40 -7
  52. package/src/cli/history-rows.ts +187 -15
  53. package/src/cli/index-roots.ts +51 -0
  54. package/src/cli/index.ts +21 -13
  55. package/src/cli/listing-arg.ts +211 -3
  56. package/src/cli/not-a-ticker.ts +37 -0
  57. package/src/cli/options.ts +55 -7
  58. package/src/cli/pane-functions/capabilities.ts +13 -2
  59. package/src/cli/pane-functions/catalog.ts +13 -2
  60. package/src/cli/pane-functions/data.ts +36 -5
  61. package/src/cli/pane-functions/dom.ts +89 -28
  62. package/src/cli/pane-functions/freshness.ts +205 -26
  63. package/src/cli/pane-functions/function-help.ts +71 -24
  64. package/src/cli/pane-functions/headless.ts +168 -35
  65. package/src/cli/pane-functions/index.ts +12 -2
  66. package/src/cli/pane-functions/market-session.ts +133 -0
  67. package/src/cli/pane-functions/options.ts +15 -4
  68. package/src/cli/pane-functions/report-notices.ts +63 -0
  69. package/src/cli/pane-functions/report.ts +12 -1
  70. package/src/cli/pane-functions/resolver.ts +32 -8
  71. package/src/cli/pane-functions/screenshot-evidence.ts +2 -0
  72. package/src/cli/pane-functions/screenshot.ts +109 -23
  73. package/src/cli/registry.ts +8 -4
  74. package/src/cli/report-tables.ts +460 -0
  75. package/src/cli/result.ts +63 -16
  76. package/src/cli/row-window.ts +76 -0
  77. package/src/cli/scroll-truncation.ts +34 -0
  78. package/src/components/chart/composite/composite-chart.tsx +43 -4
  79. package/src/components/chart/composite/legend.tsx +39 -6
  80. package/src/components/chart/composite/rasterizer.ts +64 -4
  81. package/src/components/chart/composite/series-cues.ts +71 -0
  82. package/src/components/chart/composite/text-renderer.ts +16 -8
  83. package/src/components/chart/composite/types.ts +3 -0
  84. package/src/components/command-bar/commands/direct/index.ts +9 -1
  85. package/src/components/command-bar/commands/plugin/items.ts +3 -1
  86. package/src/components/command-bar/commands/registry.ts +7 -0
  87. package/src/components/command-bar/layout-items/focused-pane.ts +38 -0
  88. package/src/components/command-bar/pane-templates/workflow.ts +5 -0
  89. package/src/components/command-bar/routes/root/command-items.ts +2 -0
  90. package/src/components/command-bar/routes/root/plugin-turn-on.ts +92 -0
  91. package/src/components/command-bar/routes/root/results.ts +40 -10
  92. package/src/components/command-bar/routes/root/runtime.ts +8 -0
  93. package/src/components/command-bar/routes/root/search-providers.ts +97 -14
  94. package/src/components/command-bar/surface/index.tsx +18 -4
  95. package/src/components/command-bar/theme-picker.tsx +48 -13
  96. package/src/components/command-bar/workflow/ops.ts +5 -3
  97. package/src/components/data-table/export.ts +6 -51
  98. package/src/components/data-table/view.tsx +31 -10
  99. package/src/components/layout/floating-pane.tsx +6 -2
  100. package/src/components/layout/market-summary.ts +23 -9
  101. package/src/components/layout/pane/content.tsx +46 -29
  102. package/src/components/layout/pane/cycle-order.ts +2 -11
  103. package/src/components/layout/pane/header.tsx +2 -1
  104. package/src/components/layout/pane/title.ts +1 -1
  105. package/src/components/layout/presentation.ts +22 -0
  106. package/src/components/layout/shell/active-drag.ts +67 -35
  107. package/src/components/layout/shell/cursor-occlusion.ts +6 -5
  108. package/src/components/layout/shell/drag/index.ts +16 -7
  109. package/src/components/layout/shell/drag/live.ts +193 -0
  110. package/src/components/layout/shell/drag/overlays.tsx +179 -35
  111. package/src/components/layout/shell/drag/runtime.ts +62 -50
  112. package/src/components/layout/shell/drag/slide.ts +10 -0
  113. package/src/components/layout/shell/index.tsx +84 -57
  114. package/src/components/layout/shell/layout-state.ts +5 -11
  115. package/src/components/layout/shell/menu.ts +28 -1
  116. package/src/components/layout/shell/native/pointer-runtime.ts +13 -13
  117. package/src/components/layout/shell/native/surfaces.ts +30 -14
  118. package/src/components/layout/shell/pane/actions.ts +2 -1
  119. package/src/components/layout/shell/pane/layers.tsx +461 -180
  120. package/src/components/layout/shell/pane/management-shortcuts.ts +5 -0
  121. package/src/components/layout/shell/pane/new-layout.ts +116 -0
  122. package/src/components/layout/shell/shortcuts.ts +5 -2
  123. package/src/components/layout/shell/terminal-pointer-runtime.ts +18 -18
  124. package/src/components/layout/shell/visible-layout.ts +44 -1
  125. package/src/components/layout/shell/window-mode/overlays.tsx +12 -4
  126. package/src/components/layout/status-bar.tsx +4 -1
  127. package/src/components/markdown-text.tsx +9 -5
  128. package/src/components/metric-treemap/heat-surface.tsx +27 -8
  129. package/src/components/metric-treemap/heat-tiles.ts +48 -17
  130. package/src/components/onboarding/onboarding-frame.tsx +33 -10
  131. package/src/components/onboarding/onboarding-wizard.tsx +49 -40
  132. package/src/components/onboarding/portfolio-step/positions-panel.tsx +5 -2
  133. package/src/components/onboarding/pro-step-layout.ts +86 -0
  134. package/src/components/onboarding/use-onboarding-upgrade.ts +6 -2
  135. package/src/components/ui/button.tsx +10 -0
  136. package/src/components/ui/data-table/index.tsx +38 -0
  137. package/src/components/ui/data-table/types.ts +8 -1
  138. package/src/components/ui/data-table/visible-range.ts +2 -0
  139. package/src/components/ui/icon.tsx +11 -2
  140. package/src/components/ui/index.ts +1 -1
  141. package/src/core/connection-health.ts +1 -1
  142. package/src/core/state/app/layout-reducer.ts +89 -3
  143. package/src/core/state/app/state.ts +8 -5
  144. package/src/core/state/app/types.ts +13 -2
  145. package/src/data/config/layout.ts +55 -21
  146. package/src/data/config/store/fold-panes.ts +149 -0
  147. package/src/data/config/store/migrations.ts +7 -0
  148. package/src/data/config/store/node.ts +27 -6
  149. package/src/data/config/store/normalize.ts +37 -3
  150. package/src/data/json-persistence.ts +17 -3
  151. package/src/data/json-storage.ts +2 -0
  152. package/src/data/memory-resource-store.ts +46 -0
  153. package/src/i18n/es.ts +14 -1
  154. package/src/i18n/ja.ts +14 -1
  155. package/src/i18n/ko.ts +14 -1
  156. package/src/i18n/zh-cn.ts +14 -1
  157. package/src/i18n/zh-tw.ts +14 -1
  158. package/src/layout/desks.ts +1 -2
  159. package/src/layout/pane-layout-move.ts +264 -0
  160. package/src/layout/pane-manager/hidden-panes.ts +160 -0
  161. package/src/layout/pane-manager/index.ts +1 -0
  162. package/src/market-data/coordinator/entries.ts +7 -1
  163. package/src/market-data/coordinator/quotes.ts +2 -2
  164. package/src/market-data/market/freshness.ts +156 -11
  165. package/src/market-data/market/status.ts +40 -0
  166. package/src/market-data/options-alternatives.ts +69 -0
  167. package/src/market-data/quotes/contributions.ts +19 -2
  168. package/src/market-data/quotes/freshness.ts +5 -0
  169. package/src/market-data/quotes/metadata.ts +16 -0
  170. package/src/market-data/quotes/screener-live-quotes.ts +56 -5
  171. package/src/plugins/builtin/account-management/keyboard.ts +3 -0
  172. package/src/plugins/builtin/account-management/model.ts +1 -0
  173. package/src/plugins/builtin/account-management/navigation.ts +1 -1
  174. package/src/plugins/builtin/account-management/pane.tsx +31 -4
  175. package/src/plugins/builtin/alerts/quotes.ts +3 -0
  176. package/src/plugins/builtin/analytics/pane-model.ts +10 -6
  177. package/src/plugins/builtin/analytics/risk-headless.ts +3 -1
  178. package/src/plugins/builtin/analytics/risk-model.ts +37 -8
  179. package/src/plugins/builtin/analytics/risk-pane.tsx +8 -4
  180. package/src/plugins/builtin/attention/pane.tsx +1 -1
  181. package/src/plugins/builtin/backtest/pane.tsx +1 -1
  182. package/src/plugins/builtin/broker-manager/detail.tsx +4 -0
  183. package/src/plugins/builtin/broker-manager/index.tsx +7 -3
  184. package/src/plugins/builtin/broker-manager/model.ts +8 -0
  185. package/src/plugins/builtin/broker-manager/pane-actions.tsx +8 -2
  186. package/src/plugins/builtin/broker-manager/sign-in-end.ts +82 -0
  187. package/src/plugins/builtin/broker-manager/table.ts +5 -0
  188. package/src/plugins/builtin/builtin-plugin-meta.ts +121 -11
  189. package/src/plugins/builtin/catalysts/detail.tsx +1 -1
  190. package/src/plugins/builtin/chart-composer/pane.tsx +1 -1
  191. package/src/plugins/builtin/chat/channels.ts +34 -36
  192. package/src/plugins/builtin/chat/command-bar.ts +138 -0
  193. package/src/plugins/builtin/chat/composer-commands.ts +21 -1
  194. package/src/plugins/builtin/chat/content/composer-runtime.ts +11 -1
  195. package/src/plugins/builtin/chat/content/footer.tsx +5 -3
  196. package/src/plugins/builtin/chat/content/index.tsx +21 -1
  197. package/src/plugins/builtin/chat/content/mentions.ts +2 -1
  198. package/src/plugins/builtin/chat/content/user-map.ts +3 -1
  199. package/src/plugins/builtin/chat/controller/index.ts +48 -0
  200. package/src/plugins/builtin/chat/conversations.ts +256 -0
  201. package/src/plugins/builtin/chat/discord-command.ts +91 -0
  202. package/src/plugins/builtin/chat/edit-window.ts +12 -6
  203. package/src/plugins/builtin/chat/ghost-user.ts +14 -0
  204. package/src/plugins/builtin/chat/index.tsx +40 -2
  205. package/src/plugins/builtin/chat/layout.ts +2 -0
  206. package/src/plugins/builtin/chat/message/desktop.tsx +2 -1
  207. package/src/plugins/builtin/chat/message/header.tsx +24 -15
  208. package/src/plugins/builtin/chat/message/profile-popover.tsx +2 -1
  209. package/src/plugins/builtin/chat/message/render-state.ts +3 -0
  210. package/src/plugins/builtin/chat/pane-requests.ts +60 -0
  211. package/src/plugins/builtin/chat/pane-state.ts +32 -2
  212. package/src/plugins/builtin/chat/pane.tsx +8 -0
  213. package/src/plugins/builtin/cloud/askg/controller.ts +112 -4
  214. package/src/plugins/builtin/cloud/askg/conversation-store.ts +21 -0
  215. package/src/plugins/builtin/cloud/askg/manifest.ts +1 -0
  216. package/src/plugins/builtin/cloud/askg/model.ts +129 -70
  217. package/src/plugins/builtin/cloud/askg/pane.tsx +772 -377
  218. package/src/plugins/builtin/cloud/askg/protocol.ts +40 -2
  219. package/src/plugins/builtin/cloud/askg/tool-display.ts +437 -0
  220. package/src/plugins/builtin/cloud/askg/tool-timeline.tsx +403 -0
  221. package/src/plugins/builtin/cloud/company-picker.tsx +1 -9
  222. package/src/plugins/builtin/cloud/mcp-connect/command.ts +24 -0
  223. package/src/plugins/builtin/cloud/mcp-connect/dialog.tsx +360 -0
  224. package/src/plugins/builtin/cloud/mcp-connect/model.ts +135 -0
  225. package/src/plugins/builtin/cloud/mcp-connect/sections.ts +62 -0
  226. package/src/plugins/builtin/cloud/plugin.tsx +36 -1
  227. package/src/plugins/builtin/cloud/starter-symbols.ts +8 -0
  228. package/src/plugins/builtin/cloud/terminal-relay/acm-tab.tsx +89 -0
  229. package/src/plugins/builtin/cloud/terminal-relay/client.ts +97 -0
  230. package/src/plugins/builtin/cloud/terminal-relay/connect-section.tsx +57 -0
  231. package/src/plugins/builtin/cloud/terminal-relay/engine.ts +666 -0
  232. package/src/plugins/builtin/cloud/terminal-relay/grants.ts +137 -0
  233. package/src/plugins/builtin/cloud/terminal-relay/host.tsx +81 -0
  234. package/src/plugins/builtin/cloud/terminal-relay/indicator.tsx +82 -0
  235. package/src/plugins/builtin/cloud/terminal-relay/manifest.ts +234 -0
  236. package/src/plugins/builtin/cloud/terminal-relay/policy.ts +153 -0
  237. package/src/plugins/builtin/cloud/terminal-relay/prompts.tsx +168 -0
  238. package/src/plugins/builtin/cloud/terminal-relay/redact.ts +73 -0
  239. package/src/plugins/builtin/cloud/terminal-relay/summary.ts +62 -0
  240. package/src/plugins/builtin/cloud/upgrade-dialog.tsx +26 -2
  241. package/src/plugins/builtin/cloud/upgrade-personalization.ts +57 -0
  242. package/src/plugins/builtin/cloud/upgrade-tickers.ts +124 -0
  243. package/src/plugins/builtin/comment-letters/client.ts +1 -3
  244. package/src/plugins/builtin/company-attention/pane.tsx +1 -1
  245. package/src/plugins/builtin/company-kpis/client.ts +23 -8
  246. package/src/plugins/builtin/company-kpis/headless.ts +3 -1
  247. package/src/plugins/builtin/company-kpis/pane.tsx +15 -7
  248. package/src/plugins/builtin/company-kpis/screenshot-evidence.ts +10 -3
  249. package/src/plugins/builtin/composite-plugins.ts +107 -64
  250. package/src/plugins/builtin/credit-boards/cdx-pane.tsx +4 -4
  251. package/src/plugins/builtin/credit-boards/index.tsx +21 -21
  252. package/src/plugins/builtin/credit-boards/model.ts +0 -1
  253. package/src/plugins/builtin/credit-boards/pane.tsx +30 -0
  254. package/src/plugins/builtin/credit-boards/sovr-pane.tsx +4 -4
  255. package/src/plugins/builtin/debt-maturities/client.ts +37 -9
  256. package/src/plugins/builtin/debt-maturities/headless.ts +3 -1
  257. package/src/plugins/builtin/debt-maturities/pane.tsx +5 -4
  258. package/src/plugins/builtin/dividend-yield/index.tsx +1 -1
  259. package/src/plugins/builtin/dividend-yield/pane.tsx +1 -1
  260. package/src/plugins/builtin/earnings-calls/data.ts +28 -7
  261. package/src/plugins/builtin/earnings-calls/headless.ts +3 -2
  262. package/src/plugins/builtin/earnings-calls/pane.tsx +10 -5
  263. package/src/plugins/builtin/econ/calendar-model.ts +42 -17
  264. package/src/plugins/builtin/econ/detail-view.tsx +2 -2
  265. package/src/plugins/builtin/econ/index.tsx +68 -22
  266. package/src/plugins/builtin/econ-statistics/headless.ts +12 -2
  267. package/src/plugins/builtin/econ-statistics/pane.tsx +1 -1
  268. package/src/plugins/builtin/econ-statistics/view.ts +17 -0
  269. package/src/plugins/builtin/executives/data.ts +17 -6
  270. package/src/plugins/builtin/executives/pane.tsx +16 -7
  271. package/src/plugins/builtin/filing-events/pane.tsx +22 -5
  272. package/src/plugins/builtin/fx-matrix/freshness.ts +65 -0
  273. package/src/plugins/builtin/fx-matrix/index.tsx +22 -1
  274. package/src/plugins/builtin/fx-matrix/pairs.ts +1 -1
  275. package/src/plugins/builtin/fx-matrix/settings.ts +42 -2
  276. package/src/plugins/builtin/gpu/headless.ts +9 -3
  277. package/src/plugins/builtin/gpu/model.ts +14 -5
  278. package/src/plugins/builtin/help/index.tsx +1 -0
  279. package/src/plugins/builtin/holders/beneficial-client.ts +29 -7
  280. package/src/plugins/builtin/holders/beneficial-view.tsx +7 -3
  281. package/src/plugins/builtin/holders/client.ts +3 -6
  282. package/src/plugins/builtin/holders/format.ts +31 -1
  283. package/src/plugins/builtin/holders/headless.ts +32 -6
  284. package/src/plugins/builtin/holders/pane.tsx +25 -13
  285. package/src/plugins/builtin/holders/report-header.ts +46 -5
  286. package/src/plugins/builtin/insider/index.tsx +4 -4
  287. package/src/plugins/builtin/iv-history/charts.tsx +21 -7
  288. package/src/plugins/builtin/iv-history/client.ts +12 -2
  289. package/src/plugins/builtin/iv-history/format.ts +33 -2
  290. package/src/plugins/builtin/iv-history/headless.ts +22 -10
  291. package/src/plugins/builtin/iv-history/index.tsx +3 -3
  292. package/src/plugins/builtin/iv-history/model.ts +61 -13
  293. package/src/plugins/builtin/iv-history/pane.tsx +11 -3
  294. package/src/plugins/builtin/iv-history/screen-pane.tsx +42 -18
  295. package/src/plugins/builtin/jobs/pane.tsx +1 -1
  296. package/src/plugins/builtin/kelly-sizer/headless.ts +149 -0
  297. package/src/plugins/builtin/kelly-sizer/history.ts +80 -0
  298. package/src/plugins/builtin/kelly-sizer/index.tsx +2 -0
  299. package/src/plugins/builtin/kelly-sizer/pane.tsx +121 -45
  300. package/src/plugins/builtin/kelly-sizer/portfolio.ts +25 -0
  301. package/src/plugins/builtin/kelly-sizer/sections.tsx +14 -0
  302. package/src/plugins/builtin/kelly-sizer/types.ts +9 -1
  303. package/src/plugins/builtin/layout-manager/index.tsx +9 -1
  304. package/src/plugins/builtin/macro-day/client.ts +24 -0
  305. package/src/plugins/builtin/macro-day/headless.ts +11 -8
  306. package/src/plugins/builtin/macro-day/index.tsx +3 -0
  307. package/src/plugins/builtin/macro-day/model.ts +11 -6
  308. package/src/plugins/builtin/macro-day/pane.tsx +12 -8
  309. package/src/plugins/builtin/macro-day/release-table.ts +40 -0
  310. package/src/plugins/builtin/macro-day/releases.ts +62 -44
  311. package/src/plugins/builtin/market-heatmap/data.ts +25 -5
  312. package/src/plugins/builtin/market-heatmap/evidence.ts +90 -0
  313. package/src/plugins/builtin/market-heatmap/index.tsx +144 -63
  314. package/src/plugins/builtin/market-heatmap/model.ts +94 -3
  315. package/src/plugins/builtin/market-heatmap/portfolio.ts +12 -2
  316. package/src/plugins/builtin/market-movers/headless.ts +31 -4
  317. package/src/plugins/builtin/market-movers/index.tsx +8 -1
  318. package/src/plugins/builtin/market-movers/model.ts +71 -17
  319. package/src/plugins/builtin/market-movers/table.ts +50 -23
  320. package/src/plugins/builtin/members/pane.tsx +10 -0
  321. package/src/plugins/builtin/news/headless.ts +9 -2
  322. package/src/plugins/builtin/news/wire/news/footer.ts +10 -0
  323. package/src/plugins/builtin/openfda/client.ts +1 -1
  324. package/src/plugins/builtin/options/carry.ts +95 -0
  325. package/src/plugins/builtin/options/index.tsx +58 -5
  326. package/src/plugins/builtin/options/strike-window.ts +183 -0
  327. package/src/plugins/builtin/options/table.ts +55 -3
  328. package/src/plugins/builtin/options/types.ts +8 -1
  329. package/src/plugins/builtin/options/view.tsx +161 -12
  330. package/src/plugins/builtin/options-positioning/headless.ts +4 -2
  331. package/src/plugins/builtin/options-scenario/charts.tsx +2 -2
  332. package/src/plugins/builtin/options-scenario/client.ts +73 -17
  333. package/src/plugins/builtin/options-scenario/headless.ts +71 -24
  334. package/src/plugins/builtin/options-scenario/hedge.ts +284 -0
  335. package/src/plugins/builtin/options-scenario/index.tsx +9 -2
  336. package/src/plugins/builtin/options-scenario/model.ts +33 -0
  337. package/src/plugins/builtin/options-scenario/pane.tsx +40 -16
  338. package/src/plugins/builtin/pe-band/model.ts +2 -2
  339. package/src/plugins/builtin/pe-band/report-dates.ts +11 -7
  340. package/src/plugins/builtin/perps/equity-row.tsx +8 -5
  341. package/src/plugins/builtin/perps/model.ts +16 -5
  342. package/src/plugins/builtin/perps/pane.tsx +1 -1
  343. package/src/plugins/builtin/plugin-marketplace/model.ts +64 -21
  344. package/src/plugins/builtin/plugin-marketplace/packs.ts +118 -0
  345. package/src/plugins/builtin/plugin-marketplace/pane.tsx +344 -32
  346. package/src/plugins/builtin/plugin-marketplace/store.ts +7 -1
  347. package/src/plugins/builtin/plugin-module.ts +87 -4
  348. package/src/plugins/builtin/portfolio-list/account-metrics.ts +16 -1
  349. package/src/plugins/builtin/portfolio-list/allocation.ts +3 -0
  350. package/src/plugins/builtin/portfolio-list/cached-account.ts +18 -9
  351. package/src/plugins/builtin/portfolio-list/cli/portfolio-command.ts +71 -36
  352. package/src/plugins/builtin/portfolio-list/cli/render.ts +89 -18
  353. package/src/plugins/builtin/portfolio-list/cli/shared.ts +2 -16
  354. package/src/plugins/builtin/portfolio-list/headless.ts +40 -7
  355. package/src/plugins/builtin/portfolio-list/pane/index.tsx +7 -4
  356. package/src/plugins/builtin/portfolio-list/summary/index.tsx +22 -4
  357. package/src/plugins/builtin/portfolio-list/summary/live-accounts.ts +11 -1
  358. package/src/plugins/builtin/realized-vol/headless.ts +3 -0
  359. package/src/plugins/builtin/realized-vol/pane.tsx +1 -1
  360. package/src/plugins/builtin/research/corporate-actions-pane.tsx +2 -2
  361. package/src/plugins/builtin/research/equity-diagnostic-pane.tsx +1 -1
  362. package/src/plugins/builtin/research/relative-valuation-model.ts +7 -3
  363. package/src/plugins/builtin/revenue-breakdown/client.ts +13 -6
  364. package/src/plugins/builtin/revenue-breakdown/headless.ts +4 -1
  365. package/src/plugins/builtin/revenue-breakdown/pane.tsx +7 -4
  366. package/src/plugins/builtin/reverse-dcf/headless.ts +5 -1
  367. package/src/plugins/builtin/reverse-dcf/model.ts +2 -1
  368. package/src/plugins/builtin/reverse-dcf/pane.tsx +1 -1
  369. package/src/plugins/builtin/risk-factors/data.ts +23 -9
  370. package/src/plugins/builtin/risk-factors/headless.ts +5 -2
  371. package/src/plugins/builtin/risk-factors/pane.tsx +6 -5
  372. package/src/plugins/builtin/seasonality/pane.tsx +1 -1
  373. package/src/plugins/builtin/sec/index.tsx +5 -5
  374. package/src/plugins/builtin/sectors/client.ts +10 -2
  375. package/src/plugins/builtin/sectors/headless.ts +35 -6
  376. package/src/plugins/builtin/sectors/index.tsx +18 -1
  377. package/src/plugins/builtin/sectors/sector-model.ts +150 -41
  378. package/src/plugins/builtin/shared/command-tab.ts +51 -0
  379. package/src/plugins/builtin/shared/headless-market-data.ts +33 -1
  380. package/src/plugins/builtin/shared/members-menu.tsx +260 -0
  381. package/src/plugins/builtin/shared/report-freshness.ts +50 -2
  382. package/src/plugins/builtin/shared/ticker-request.ts +25 -1
  383. package/src/plugins/builtin/shared/use-quote-board.ts +25 -5
  384. package/src/plugins/builtin/shared/volatility/options.ts +1 -46
  385. package/src/plugins/builtin/short-interest/index.tsx +19 -4
  386. package/src/plugins/builtin/short-interest/surface.tsx +4 -4
  387. package/src/plugins/builtin/short-volume/index.tsx +1 -10
  388. package/src/plugins/builtin/short-volume/pane.tsx +1 -1
  389. package/src/plugins/builtin/social-mentions/pane.tsx +1 -1
  390. package/src/plugins/builtin/supply-chain/model.ts +1 -1
  391. package/src/plugins/builtin/themes/pane.tsx +3 -0
  392. package/src/plugins/builtin/ticker-detail/financials/aggregation.ts +4 -0
  393. package/src/plugins/builtin/ticker-detail/financials/model.ts +25 -2
  394. package/src/plugins/builtin/ticker-detail/headless.ts +63 -25
  395. package/src/plugins/builtin/ticker-detail/overview/model.ts +9 -4
  396. package/src/plugins/builtin/ticker-detail/overview-tab.tsx +3 -2
  397. package/src/plugins/builtin/ticker-detail/pane.tsx +4 -5
  398. package/src/plugins/builtin/ticker-detail/quote-monitor/card.tsx +94 -6
  399. package/src/plugins/builtin/treasury-auctions/cache.ts +5 -2
  400. package/src/plugins/builtin/treasury-auctions/client.ts +22 -8
  401. package/src/plugins/builtin/treasury-auctions/headless.ts +40 -4
  402. package/src/plugins/builtin/treasury-auctions/index.tsx +11 -9
  403. package/src/plugins/builtin/treasury-auctions/model.ts +197 -30
  404. package/src/plugins/builtin/treasury-auctions/pane.tsx +35 -11
  405. package/src/plugins/builtin/treasury-auctions/types.ts +11 -1
  406. package/src/plugins/builtin/vol-surface/charts.tsx +1 -3
  407. package/src/plugins/builtin/vol-surface/client.ts +6 -2
  408. package/src/plugins/builtin/vol-surface/evidence.ts +11 -6
  409. package/src/plugins/builtin/vol-surface/headless.ts +124 -20
  410. package/src/plugins/builtin/vol-surface/model.ts +23 -11
  411. package/src/plugins/builtin/vol-surface/pane.tsx +38 -27
  412. package/src/plugins/builtin/vol-surface/tables.ts +124 -0
  413. package/src/plugins/builtin/world-indices/client.ts +22 -4
  414. package/src/plugins/builtin/world-indices/headless.ts +54 -27
  415. package/src/plugins/builtin/world-indices/model.ts +4 -2
  416. package/src/plugins/builtin/world-indices/table.tsx +13 -2
  417. package/src/plugins/builtin/world-venue-map/basemap-layer.tsx +2 -0
  418. package/src/plugins/builtin/world-venue-map/basemap.ts +18 -0
  419. package/src/plugins/builtin/world-venue-map/country-labels.ts +78 -0
  420. package/src/plugins/builtin/world-venue-map/geo-series.ts +1 -1
  421. package/src/plugins/builtin/world-venue-map/geo-svg.tsx +2 -1
  422. package/src/plugins/builtin/world-venue-map/index.ts +6 -6
  423. package/src/plugins/builtin/world-venue-map/layered-pane.tsx +27 -14
  424. package/src/plugins/builtin/world-venue-map/layers.ts +68 -10
  425. package/src/plugins/builtin/world-venue-map/map.tsx +198 -62
  426. package/src/plugins/builtin/world-venue-map/model.ts +16 -0
  427. package/src/plugins/builtin/world-venue-map/natural-earth/index.chunk.ts +3 -0
  428. package/src/plugins/builtin/world-venue-map/natural-earth/labels.chunk.ts +244 -0
  429. package/src/plugins/builtin/world-venue-map/pane.tsx +16 -10
  430. package/src/plugins/builtin/yield-curve/index.tsx +1 -1
  431. package/src/plugins/builtin-editorial.ts +126 -0
  432. package/src/plugins/catalog-backend.ts +16 -9
  433. package/src/plugins/catalog-browser.ts +127 -63
  434. package/src/plugins/catalog-manifest.ts +73 -40
  435. package/src/plugins/catalog-ui.ts +26 -6
  436. package/src/plugins/extracted-plugins.ts +7 -1
  437. package/src/plugins/ownership.ts +150 -7
  438. package/src/plugins/plugin-functions.ts +54 -0
  439. package/src/plugins/plugin-off.ts +36 -0
  440. package/src/plugins/registry/host-actions.ts +16 -0
  441. package/src/plugins/registry/index.ts +84 -24
  442. package/src/plugins/registry/plugin-state.ts +25 -1
  443. package/src/plugins/runtime/context.tsx +29 -0
  444. package/src/react/input.ts +48 -1
  445. package/src/remote/app-host.tsx +5 -0
  446. package/src/remote/controller.ts +3 -53
  447. package/src/remote/matching.ts +69 -0
  448. package/src/remote/schema.ts +1 -1
  449. package/src/remote/semantic-tree.tsx +14 -0
  450. package/src/remote/types.ts +2 -0
  451. package/src/renderers/browser/app-services.ts +3 -1
  452. package/src/renderers/dom/data-table/dom.ts +31 -0
  453. package/src/renderers/dom/data-table/index.tsx +5 -0
  454. package/src/renderers/dom/desktop/icons.tsx +14 -0
  455. package/src/renderers/dom/desktop/query-bar.tsx +59 -32
  456. package/src/renderers/dom/host/box.tsx +113 -17
  457. package/src/renderers/dom/host/drag-shield.ts +35 -0
  458. package/src/renderers/dom/host/live-frame.ts +62 -0
  459. package/src/renderers/dom/host/mouse.ts +8 -1
  460. package/src/renderers/dom/host/scroll-box.tsx +6 -5
  461. package/src/renderers/dom/host/tabs.tsx +3 -2
  462. package/src/renderers/dom/input-host.tsx +6 -1
  463. package/src/renderers/dom/styles.css +26 -5
  464. package/src/renderers/electrobun/bun/desktop/backend-requests.ts +7 -0
  465. package/src/renderers/electrobun/bun/desktop/backend.ts +7 -1
  466. package/src/renderers/electrobun/bun/desktop/detached-windows.ts +12 -1
  467. package/src/renderers/electrobun/bun/desktop/initialization.ts +15 -1
  468. package/src/renderers/electrobun/shared/protocol.ts +12 -1
  469. package/src/renderers/electrobun/view/cli-pane-shot-entry.tsx +4 -1
  470. package/src/renderers/electrobun/view/cli-pane-shot-frame.tsx +101 -5
  471. package/src/renderers/electrobun/view/host/native.ts +0 -10
  472. package/src/renderers/electrobun/view/host/window-move.ts +28 -0
  473. package/src/renderers/electrobun/view/main.tsx +4 -1
  474. package/src/renderers/electrobun/view/remote/persistence.ts +15 -2
  475. package/src/renderers/electrobun/view/ui-host.tsx +2 -5
  476. package/src/renderers/opentui/input-host.tsx +6 -1
  477. package/src/renderers/opentui/start.tsx +9 -0
  478. package/src/renderers/opentui/ui-host.tsx +7 -1
  479. package/src/shares/portable-layout.ts +16 -6
  480. package/src/sources/gloomberb-cloud/index.ts +19 -10
  481. package/src/sources/gloomberb-cloud/normalizers.ts +20 -21
  482. package/src/sources/listing-symbols.ts +11 -5
  483. package/src/sources/provider-errors.ts +88 -3
  484. package/src/sources/provider-router/batches.ts +3 -3
  485. package/src/sources/provider-router/cached-routes.ts +8 -4
  486. package/src/sources/provider-router/financial-routes.ts +13 -7
  487. package/src/sources/provider-router/financials.ts +106 -16
  488. package/src/sources/provider-router/history.ts +27 -11
  489. package/src/sources/provider-router/index.ts +1 -1
  490. package/src/sources/provider-router/primary.ts +24 -6
  491. package/src/sources/sec-edgar.ts +68 -8
  492. package/src/state/pane-scroll-registry.tsx +67 -35
  493. package/src/sync/core-contributors.ts +4 -3
  494. package/src/test-support/cli-context.ts +2 -1
  495. package/src/test-support/data-provider.ts +34 -0
  496. package/src/test-support/margin-account.ts +108 -0
  497. package/src/test-support/shell-pane-keys.tsx +1 -0
  498. package/src/theme/series-colors.ts +46 -0
  499. package/src/theme/themes.ts +149 -0
  500. package/src/tickers/search/index.ts +22 -2
  501. package/src/tickers/search/ranking.ts +45 -1
  502. package/src/tickers/search/types.ts +3 -1
  503. package/src/time-series/resolution.ts +15 -0
  504. package/src/time-series/resolve.ts +1 -14
  505. package/src/types/config.ts +61 -1
  506. package/src/types/financials.ts +32 -3
  507. package/src/types/headless.ts +11 -0
  508. package/src/types/instrument.ts +8 -0
  509. package/src/types/plugin.ts +49 -3
  510. package/src/ui/host.tsx +16 -0
  511. package/src/ui/index.tsx +10 -3
  512. package/src/ui/scroll-box-axis.ts +26 -0
  513. package/src/utils/cli-output.ts +14 -1
  514. package/src/utils/currency-units.ts +8 -3
  515. package/src/utils/depositary-receipt.ts +54 -10
  516. package/src/utils/display-number.ts +63 -0
  517. package/src/utils/exchanges.ts +13 -0
  518. package/src/utils/format.ts +2 -1
  519. package/src/utils/fundamentals.ts +17 -1
  520. package/src/utils/fx-market-hours.ts +34 -0
  521. package/src/utils/option-expiry.ts +126 -0
  522. package/src/utils/price-history-integrity.ts +19 -6
  523. package/src/utils/price-history.ts +39 -6
  524. package/src/utils/rpc-timeout-error.ts +6 -2
  525. package/src/utils/sec-eps-basis.ts +159 -30
  526. package/src/utils/sec.ts +38 -34
  527. package/src/utils/throttled-fetch.ts +51 -22
@@ -33,6 +33,7 @@ interface ShellPaneManagementShortcutOptions {
33
33
  startWindowMode(paneId?: string, mode?: WindowEditMode): void;
34
34
  toggleFocusedPaneFullscreen(): boolean;
35
35
  toggleFocusedPaneFloating(): boolean;
36
+ toggleFocusedPaneNewLayout(): boolean;
36
37
  }
37
38
 
38
39
  export function useShellPaneManagementShortcuts({
@@ -54,6 +55,7 @@ export function useShellPaneManagementShortcuts({
54
55
  startWindowMode,
55
56
  toggleFocusedPaneFullscreen,
56
57
  toggleFocusedPaneFloating,
58
+ toggleFocusedPaneNewLayout,
57
59
  }: ShellPaneManagementShortcutOptions): void {
58
60
  const doubleEscapeCloseRef = useRef(createDoubleEscapeCloseState());
59
61
  const keybindings = useKeybindings();
@@ -153,6 +155,9 @@ export function useShellPaneManagementShortcuts({
153
155
  case "toggle-floating":
154
156
  handled = toggleFocusedPaneFloating();
155
157
  break;
158
+ case "new-layout":
159
+ handled = toggleFocusedPaneNewLayout();
160
+ break;
156
161
  case "pop-out":
157
162
  handled = popOutFocusedPane();
158
163
  break;
@@ -0,0 +1,116 @@
1
+ import { useCallback, type Dispatch } from "react";
2
+ import { formatAdvertisedChord, type ResolvedKeybindings } from "../../../../app/keybindings";
3
+ import { tf } from "../../../../i18n";
4
+ import {
5
+ createSavedLayoutId,
6
+ paneMoveBackTarget,
7
+ paneNewLayoutBlock,
8
+ type PaneMoveBackTarget,
9
+ type PaneNewLayoutBlock,
10
+ } from "../../../../layout/pane-layout-move";
11
+ import type { PluginRegistry } from "../../../../plugins/registry";
12
+ import { resolveTickerForPane, type AppAction, type AppState } from "../../../../state/app/context";
13
+ import { findPaneInstance } from "../../../../types/config";
14
+ import type { ShortcutDisplayMode } from "../../../../utils/shortcut-labels";
15
+ import { getBasePaneDisplayTitle } from "../../pane/title";
16
+ import type { PaneMenuLayoutMove } from "../menu";
17
+
18
+ const BLOCK_MESSAGES: Partial<Record<PaneNewLayoutBlock, string>> = {
19
+ "only-pane": "Already the only pane in this layout",
20
+ "no-ticker": "Select a ticker in the list this pane follows first",
21
+ };
22
+
23
+ // The first move of a session says how to undo it; after that the layout tab is enough.
24
+ let moveBackHintShown = false;
25
+
26
+ interface UseShellPaneLayoutMovesOptions {
27
+ closePaneMenu: () => void;
28
+ dispatch: Dispatch<AppAction>;
29
+ keybindings: ResolvedKeybindings;
30
+ /** Leaves anything that shows this pane over the layout, such as fullscreen, before it moves. */
31
+ leavePane: (paneId: string) => void;
32
+ pluginRegistry: PluginRegistry;
33
+ shortcutDisplayMode: ShortcutDisplayMode;
34
+ stateRef: { current: AppState };
35
+ }
36
+
37
+ /**
38
+ * Move to New Layout and Move Back for the shell's pane menu, its shortcut
39
+ * and the command bar. The layout work is in `layout/pane-layout-move`.
40
+ */
41
+ export function useShellPaneLayoutMoves({
42
+ closePaneMenu,
43
+ dispatch,
44
+ keybindings,
45
+ leavePane,
46
+ pluginRegistry,
47
+ shortcutDisplayMode,
48
+ stateRef,
49
+ }: UseShellPaneLayoutMovesOptions) {
50
+ const blockFor = useCallback((paneId: string): PaneNewLayoutBlock | null => {
51
+ const state = stateRef.current;
52
+ return paneNewLayoutBlock(state.config.layout, paneId, (instanceId) => resolveTickerForPane(state, instanceId));
53
+ }, [stateRef]);
54
+
55
+ const moveBackTargetFor = useCallback(
56
+ (paneId: string): PaneMoveBackTarget | null => paneMoveBackTarget(stateRef.current.config, paneId),
57
+ [stateRef],
58
+ );
59
+
60
+ const movePaneToNewLayout = useCallback((paneId: string): boolean => {
61
+ const block = blockFor(paneId);
62
+ if (block === "missing" || block === "detached") return false;
63
+ const blockMessage = block ? BLOCK_MESSAGES[block] : undefined;
64
+ if (blockMessage) {
65
+ pluginRegistry.notify({ body: blockMessage, type: "info" });
66
+ return true;
67
+ }
68
+ const state = stateRef.current;
69
+ const instance = findPaneInstance(state.config.layout, paneId);
70
+ if (!instance) return false;
71
+ const def = pluginRegistry.panes.get(instance.paneId);
72
+ const name = (def ? getBasePaneDisplayTitle(state, instance, def, pluginRegistry.panes) : instance.title)?.trim()
73
+ || instance.paneId;
74
+ closePaneMenu();
75
+ leavePane(paneId);
76
+ dispatch({ type: "MOVE_PANE_TO_NEW_LAYOUT", paneId, name, sourceLayoutId: createSavedLayoutId() });
77
+ if (!moveBackHintShown) {
78
+ moveBackHintShown = true;
79
+ const shortcut = formatAdvertisedChord(keybindings, "pane-new-layout", shortcutDisplayMode);
80
+ pluginRegistry.notify({
81
+ body: shortcut
82
+ ? tf("Moved to a layout of its own. {shortcut} moves it back.", { shortcut })
83
+ : "Moved to a layout of its own. Move Back in its menu returns it.",
84
+ type: "info",
85
+ });
86
+ }
87
+ return true;
88
+ }, [blockFor, closePaneMenu, dispatch, keybindings, leavePane, pluginRegistry, shortcutDisplayMode, stateRef]);
89
+
90
+ const movePaneBack = useCallback((paneId: string): boolean => {
91
+ if (!moveBackTargetFor(paneId)) return false;
92
+ closePaneMenu();
93
+ leavePane(paneId);
94
+ dispatch({ type: "MOVE_PANE_BACK", paneId });
95
+ return true;
96
+ }, [closePaneMenu, dispatch, leavePane, moveBackTargetFor]);
97
+
98
+ /** The shortcut: a pane alone in the layout it was moved to goes back, any other gets a layout of its own. */
99
+ const togglePaneNewLayout = useCallback((paneId: string | null): boolean => {
100
+ if (!paneId) return false;
101
+ if (blockFor(paneId) === "only-pane" && movePaneBack(paneId)) return true;
102
+ return movePaneToNewLayout(paneId);
103
+ }, [blockFor, movePaneBack, movePaneToNewLayout]);
104
+
105
+ /** What the pane menu offers: Move to New Layout unless the pane is alone, Move Back when it came from elsewhere. */
106
+ const paneLayoutMoveMenu = useCallback((paneId: string): PaneMenuLayoutMove => {
107
+ const block = blockFor(paneId);
108
+ const back = moveBackTargetFor(paneId);
109
+ return {
110
+ ...(block === null || block === "no-ticker" ? { moveToNewLayout: () => { movePaneToNewLayout(paneId); } } : {}),
111
+ ...(back ? { moveBack: { layoutName: back.name, onSelect: () => { movePaneBack(paneId); } } } : {}),
112
+ };
113
+ }, [blockFor, moveBackTargetFor, movePaneBack, movePaneToNewLayout]);
114
+
115
+ return { movePaneBack, movePaneToNewLayout, paneLayoutMoveMenu, togglePaneNewLayout };
116
+ }
@@ -12,6 +12,7 @@ export type PaneManagementShortcut =
12
12
  | "menu"
13
13
  | "settings"
14
14
  | "toggle-fullscreen"
15
+ | "new-layout"
15
16
  | "toggle-floating"
16
17
  | "pop-out"
17
18
  | "copy-screenshot"
@@ -28,6 +29,7 @@ const PANE_ACTION_TO_SHORTCUT: Partial<Record<CoreKeybindingActionId, PaneManage
28
29
  "pane-menu": "menu",
29
30
  "pane-settings": "settings",
30
31
  "pane-fullscreen": "toggle-fullscreen",
32
+ "pane-new-layout": "new-layout",
31
33
  "pane-float": "toggle-floating",
32
34
  "pane-pop-out": "pop-out",
33
35
  "pane-screenshot": "copy-screenshot",
@@ -42,7 +44,7 @@ const PANE_ACTION_TO_SHORTCUT: Partial<Record<CoreKeybindingActionId, PaneManage
42
44
  };
43
45
 
44
46
  export type PaneManagementAccelerators = Record<
45
- "menu" | "settings" | "fullscreen" | "toggleFloating" | "popOut" | "copyScreenshot" | "exportCsv" | "share" | "close"
47
+ "menu" | "settings" | "fullscreen" | "newLayout" | "toggleFloating" | "popOut" | "copyScreenshot" | "exportCsv" | "share" | "close"
46
48
  | "closeAllFloating" | "layoutGallery" | "gridlockAll" | "windowMode" | "windowResizeMode",
47
49
  string | undefined
48
50
  >;
@@ -53,6 +55,7 @@ export function paneManagementAccelerators(keybindings: ResolvedKeybindings): Pa
53
55
  menu: menuAcceleratorFor(keybindings, "pane-menu"),
54
56
  settings: menuAcceleratorFor(keybindings, "pane-settings"),
55
57
  fullscreen: menuAcceleratorFor(keybindings, "pane-fullscreen"),
58
+ newLayout: menuAcceleratorFor(keybindings, "pane-new-layout"),
56
59
  toggleFloating: menuAcceleratorFor(keybindings, "pane-float"),
57
60
  popOut: menuAcceleratorFor(keybindings, "pane-pop-out"),
58
61
  copyScreenshot: menuAcceleratorFor(keybindings, "pane-screenshot"),
@@ -98,7 +101,7 @@ export function inputCaptureAllowsPaneManagementShortcut(
98
101
  // A screenshot does not edit the field that captured input. Keep it available
99
102
  // from composers (ASKG, chat, etc.) on both desktop modifier layouts.
100
103
  if (shortcut === "copy-screenshot") return event.ctrl || event.meta || event.super === true;
101
- if (shortcut === "toggle-fullscreen") return event.meta || event.super === true;
104
+ if (shortcut === "toggle-fullscreen" || shortcut === "new-layout") return event.meta || event.super === true;
102
105
  if (shortcut !== "close" && shortcut !== "close-all-floating") return false;
103
106
  return event.meta || event.super || event.targetEditable !== true;
104
107
  }
@@ -87,8 +87,8 @@ export function useShellTerminalPointerRuntime({
87
87
  windowMode,
88
88
  }: UseShellTerminalPointerRuntimeOptions) {
89
89
  const {
90
- dragFloatingRect,
91
- dragRef,
90
+ live,
91
+ startDrag,
92
92
  updateDividerPreview,
93
93
  updateDragFloatingRect,
94
94
  } = dragRuntime;
@@ -112,7 +112,7 @@ export function useShellTerminalPointerRuntime({
112
112
 
113
113
  for (const { pane, rect: visibleRect } of sortedFloatingPanes(visibleFloatingPanes)) {
114
114
  const paneId = pane.instance.instanceId;
115
- const rect = getVisibleFloatingRect(visibleRect, paneId, dragFloatingRect, width, contentHeight);
115
+ const rect = getVisibleFloatingRect(visibleRect, paneId, live.get().floating, width, contentHeight);
116
116
  if (!pointInRect({ x: rect.x, y: rect.y, width: rect.width, height: rect.height }, event.x, shellY)) continue;
117
117
 
118
118
  const relativeX = event.x - rect.x;
@@ -120,13 +120,13 @@ export function useShellTerminalPointerRuntime({
120
120
  selectWindowModePane(paneId);
121
121
 
122
122
  if (relativeX >= rect.width - 2 && relativeY >= rect.height - 1) {
123
- dragRef.current = {
123
+ startDrag({
124
124
  type: "float-resize",
125
125
  paneId,
126
126
  startX: preciseX,
127
127
  startY: preciseShellY,
128
128
  origRect: { x: rect.x, y: rect.y, width: rect.width, height: rect.height },
129
- };
129
+ });
130
130
  updateDragFloatingRect({ paneId, rect: { x: rect.x, y: rect.y, width: rect.width, height: rect.height } });
131
131
  }
132
132
 
@@ -138,7 +138,7 @@ export function useShellTerminalPointerRuntime({
138
138
  if (!transientFocusActive) {
139
139
  for (const divider of dockDividerLayouts) {
140
140
  if (!pointInRect(divider.rect, event.x, shellY)) continue;
141
- dragRef.current = {
141
+ startDrag({
142
142
  type: "divider",
143
143
  path: divider.path,
144
144
  axis: divider.axis,
@@ -146,7 +146,7 @@ export function useShellTerminalPointerRuntime({
146
146
  startY: preciseShellY,
147
147
  startRatio: divider.ratio,
148
148
  bounds: divider.bounds,
149
- };
149
+ });
150
150
  updateDividerPreview({
151
151
  pathKey: divider.path.join("."),
152
152
  rect: divider.rect,
@@ -179,7 +179,7 @@ export function useShellTerminalPointerRuntime({
179
179
 
180
180
  for (const { pane, rect: visibleRect } of sortedFloatingPanes(visibleFloatingPanes)) {
181
181
  const paneId = pane.instance.instanceId;
182
- const rect = getVisibleFloatingRect(visibleRect, paneId, dragFloatingRect, width, contentHeight);
182
+ const rect = getVisibleFloatingRect(visibleRect, paneId, live.get().floating, width, contentHeight);
183
183
  if (!pointInRect({ x: rect.x, y: rect.y, width: rect.width, height: rect.height }, event.x, shellY)) continue;
184
184
  const relativeX = event.x - rect.x;
185
185
  const relativeY = shellY - rect.y;
@@ -212,13 +212,13 @@ export function useShellTerminalPointerRuntime({
212
212
  return;
213
213
  }
214
214
  if (!transientFocusActive && relativeX >= rect.width - 2 && relativeY >= rect.height - 1) {
215
- dragRef.current = {
215
+ startDrag({
216
216
  type: "float-resize",
217
217
  paneId,
218
218
  startX: preciseX,
219
219
  startY: preciseShellY,
220
220
  origRect: { x: rect.x, y: rect.y, width: rect.width, height: rect.height },
221
- };
221
+ });
222
222
  updateDragFloatingRect({ paneId, rect: { x: rect.x, y: rect.y, width: rect.width, height: rect.height } });
223
223
  event.stopPropagation();
224
224
  event.preventDefault();
@@ -230,14 +230,14 @@ export function useShellTerminalPointerRuntime({
230
230
  return;
231
231
  }
232
232
  if (relativeY === 0) {
233
- dragRef.current = {
233
+ startDrag({
234
234
  type: "pane-drag",
235
235
  paneId,
236
236
  mode: "floating",
237
237
  startX: preciseX,
238
238
  startY: preciseShellY,
239
239
  origRect: { x: rect.x, y: rect.y, width: rect.width, height: rect.height },
240
- };
240
+ });
241
241
  updateDragFloatingRect({ paneId, rect: { x: rect.x, y: rect.y, width: rect.width, height: rect.height } });
242
242
  event.stopPropagation();
243
243
  event.preventDefault();
@@ -248,7 +248,7 @@ export function useShellTerminalPointerRuntime({
248
248
 
249
249
  for (const divider of dockDividerLayouts) {
250
250
  if (!pointInRect(divider.rect, event.x, shellY)) continue;
251
- dragRef.current = {
251
+ startDrag({
252
252
  type: "divider",
253
253
  path: divider.path,
254
254
  axis: divider.axis,
@@ -256,7 +256,7 @@ export function useShellTerminalPointerRuntime({
256
256
  startY: preciseShellY,
257
257
  startRatio: divider.ratio,
258
258
  bounds: divider.bounds,
259
- };
259
+ });
260
260
  updateDividerPreview({
261
261
  pathKey: divider.path.join("."),
262
262
  rect: divider.rect,
@@ -308,14 +308,14 @@ export function useShellTerminalPointerRuntime({
308
308
  return;
309
309
  }
310
310
  if (relativeY === 0) {
311
- dragRef.current = {
311
+ startDrag({
312
312
  type: "pane-drag",
313
313
  paneId: leaf.instanceId,
314
314
  mode: "docked",
315
315
  startX: preciseX,
316
316
  startY: preciseShellY,
317
317
  origRect: { x: leaf.rect.x, y: leaf.rect.y, width: leaf.rect.width, height: leaf.rect.height },
318
- };
318
+ });
319
319
  event.stopPropagation();
320
320
  event.preventDefault();
321
321
  return;
@@ -333,12 +333,11 @@ export function useShellTerminalPointerRuntime({
333
333
  contentHeight,
334
334
  dockDividerLayouts,
335
335
  dockLeafLayouts,
336
- dragFloatingRect,
337
- dragRef,
338
336
  focusPane,
339
337
  focusedPaneId,
340
338
  handleActiveDrag,
341
339
  handleFloatingClose,
340
+ live,
342
341
  restoreFullscreen,
343
342
  menuState,
344
343
  openPaneMenu,
@@ -346,6 +345,7 @@ export function useShellTerminalPointerRuntime({
346
345
  selectWindowModePane,
347
346
  setHoveredMenuItemId,
348
347
  setMenuState,
348
+ startDrag,
349
349
  transientFocusActive,
350
350
  updateDividerPreview,
351
351
  updateDragFloatingRect,
@@ -1,8 +1,22 @@
1
1
  import {
2
2
  removeUnavailablePaneTypes,
3
+ restoreHiddenPanes,
3
4
  type PaneTypeAvailability,
4
5
  } from "../../../layout/pane-manager";
5
- import type { LayoutConfig } from "../../../types/config";
6
+ import type { PluginRegistry } from "../../../plugins/registry";
7
+ import type { LayoutConfig, PaneInstanceConfig } from "../../../types/config";
8
+
9
+ /** The pane types of every plugin that is switched off. */
10
+ export function collectDisabledPaneIds(
11
+ pluginRegistry: Pick<PluginRegistry, "getPluginPaneIds">,
12
+ disabledPlugins: readonly string[],
13
+ ): Set<string> {
14
+ const paneIds = new Set<string>();
15
+ for (const pluginId of new Set(disabledPlugins)) {
16
+ for (const paneId of pluginRegistry.getPluginPaneIds(pluginId)) paneIds.add(paneId);
17
+ }
18
+ return paneIds;
19
+ }
6
20
 
7
21
  export function resolveShellVisibleLayout(
8
22
  layout: LayoutConfig,
@@ -15,3 +29,32 @@ export function resolveShellVisibleLayout(
15
29
  { disabledPaneIds },
16
30
  );
17
31
  }
32
+
33
+ /** A pane the shell leaves off screen: its plugin is off, or nothing registered its type. */
34
+ function isShellHiddenPane(
35
+ instance: PaneInstanceConfig,
36
+ disabledPaneIds: ReadonlySet<string>,
37
+ registeredPaneIds: PaneTypeAvailability,
38
+ ): boolean {
39
+ const registered = typeof registeredPaneIds === "function"
40
+ ? !!registeredPaneIds(instance.paneId)
41
+ : registeredPaneIds.has(instance.paneId);
42
+ return !registered || disabledPaneIds.has(instance.paneId);
43
+ }
44
+
45
+ /**
46
+ * What to save after an edit made on the visible layout: the edit, with every
47
+ * pane the shell hid put back from the saved layout.
48
+ */
49
+ export function restoreShellHiddenPanes(
50
+ saved: LayoutConfig,
51
+ edited: LayoutConfig,
52
+ disabledPaneIds: ReadonlySet<string>,
53
+ registeredPaneIds: PaneTypeAvailability,
54
+ ): LayoutConfig {
55
+ return restoreHiddenPanes(
56
+ saved,
57
+ edited,
58
+ (instance) => isShellHiddenPane(instance, disabledPaneIds, registeredPaneIds),
59
+ );
60
+ }
@@ -1,3 +1,4 @@
1
+ import { useCallback } from "react";
1
2
  import { Box, Text } from "../../../../ui";
2
3
  import type {
3
4
  DockGeometryOptions,
@@ -8,6 +9,7 @@ import type {
8
9
  } from "../../../../layout/pane-manager";
9
10
  import { colors } from "../../../../theme/colors";
10
11
  import { constrainFloatingRectToBounds } from "../drag";
12
+ import { useLiveDrag, type LiveDragGeometry, type LiveDragStore } from "../drag/live";
11
13
  import {
12
14
  getFloatingResizeCornerPosition,
13
15
  type WindowEditDockMovePreview,
@@ -27,9 +29,9 @@ interface ShellWindowModeOverlaysProps {
27
29
  contentHeight: number;
28
30
  dockGeometryOptions: DockGeometryOptions;
29
31
  dockLeafLayouts: DockLeafLayout[];
30
- dragFloatingRect: { paneId: string; rect: FloatingRect } | null;
31
32
  focusedPaneId: string | null;
32
33
  getPaneTitle: (pane: ResolvedPane) => string;
34
+ live: LiveDragStore;
33
35
  menuOpen: boolean;
34
36
  nativePaneChrome: boolean;
35
37
  nativeWindowModePanelRect: LayoutBounds | null;
@@ -64,9 +66,9 @@ export function ShellWindowModeOverlays({
64
66
  contentHeight,
65
67
  dockGeometryOptions,
66
68
  dockLeafLayouts,
67
- dragFloatingRect,
68
69
  focusedPaneId,
69
70
  getPaneTitle,
71
+ live,
70
72
  menuOpen,
71
73
  nativePaneChrome,
72
74
  nativeWindowModePanelRect,
@@ -84,9 +86,15 @@ export function ShellWindowModeOverlays({
84
86
  const highlightedDockedLeaf = highlightedPaneId && !highlightedFloatingPane
85
87
  ? dockLeafLayouts.find((leaf) => leaf.instanceId === highlightedPaneId)
86
88
  : null;
89
+ // The terminal frame follows a floating pane while it moves; desktop panes draw their own.
90
+ const followedPaneId = !nativePaneChrome && highlightedFloatingPane ? highlightedFloatingPane.pane.instance.instanceId : null;
91
+ const selectDragRect = useCallback((geometry: LiveDragGeometry) => (
92
+ followedPaneId && geometry.floating?.paneId === followedPaneId ? geometry.floating.rect : null
93
+ ), [followedPaneId]);
94
+ const dragRect = useLiveDrag(live, selectDragRect);
87
95
  const highlightedRect = highlightedFloatingPane
88
- ? dragFloatingRect?.paneId === highlightedFloatingPane.pane.instance.instanceId
89
- ? constrainFloatingRectToBounds(dragFloatingRect.rect, width, contentHeight)
96
+ ? dragRect
97
+ ? constrainFloatingRectToBounds(dragRect, width, contentHeight)
90
98
  : highlightedFloatingPane.rect
91
99
  : highlightedDockedLeaf?.rect ?? null;
92
100
  const highlightedZIndex = highlightedFloatingPane
@@ -13,6 +13,7 @@ import { blendHex, hoverBg } from "../../theme/colors";
13
13
  import { t, tf } from "../../i18n";
14
14
  import { useThemeColors } from "../../theme/theme-context";
15
15
  import { useAppDispatch, useAppSelector } from "../../state/app/context";
16
+ import { useAppChromeShown } from "./presentation";
16
17
  import { useViewport } from "../../react/input";
17
18
  import {
18
19
  advertisedChord,
@@ -53,6 +54,7 @@ import {
53
54
  useClaimedStatusWidgetColumns,
54
55
  usePublishStatusWidgetRoom,
55
56
  } from "./status-widget-space";
57
+ import { StarPromptStatusLine } from "../../app/star-prompt/status-line";
56
58
 
57
59
  type StatusBarEvent = { stopPropagation?: () => void; preventDefault?: () => void };
58
60
  type HoveredControl = string | null;
@@ -145,7 +147,7 @@ export function StatusBar({ onOpenChangelog }: { onOpenChangelog?: (version: str
145
147
  const { width: termWidth } = useViewport();
146
148
  const layouts = useAppSelector((state) => state.config.layouts);
147
149
  const activeLayoutIdx = useAppSelector((state) => state.config.activeLayoutIndex);
148
- const statusBarVisible = useAppSelector((state) => state.statusBarVisible);
150
+ const statusBarVisible = useAppChromeShown().statusBar;
149
151
  const layout = useAppSelector((state) => state.config.layout);
150
152
  const { transientLayout } = useTransientLayout();
151
153
  const [hoveredControl, setHoveredControl] = useState<string | null>(null);
@@ -498,6 +500,7 @@ function TerminalStatusBar({
498
500
  {showTidyWindows && <TerminalTidyWindows {...props} />}
499
501
  <Box flexGrow={1} minWidth={0} />
500
502
  <StatusBarSummary nativePaneChrome={false} {...props} />
503
+ <StarPromptStatusLine />
501
504
  <PluginSlot name="status:widget" />
502
505
  <StatusBarFeedback nativePaneChrome={false} {...props} />
503
506
  </Box>
@@ -30,23 +30,27 @@ interface ParsedLine {
30
30
  indent?: number;
31
31
  }
32
32
 
33
+ // A backslash escapes the punctuation markdown would read ("\\*" is a star), and
34
+ // an italic span may hold a bold one ("*covers **96%** of value*").
33
35
  const INLINE_RE =
34
- /(\*\*(?<bold>[^*]+)\*\*|(?<!\*)\*(?!\*)(?<italic>[^*]+)\*(?!\*)|`(?<code>[^`]+)`|~~(?<strike>[^~]+)~~)/g;
36
+ /(\\(?<escaped>[\\`*_~#>[\]()-])|\*\*(?<bold>[^*]+)\*\*|(?<!\*)\*(?!\*)(?<italic>(?:[^*]|\*\*[^*]+\*\*)+?)\*(?!\*)|`(?<code>[^`]+)`|~~(?<strike>[^~]+)~~)/g;
35
37
 
36
38
  function parseInlineMarkdown(text: string): StyledSegment[] {
37
39
  const segments: StyledSegment[] = [];
38
40
  let cursor = 0;
39
41
 
40
- INLINE_RE.lastIndex = 0;
42
+ const pattern = new RegExp(INLINE_RE.source, "g");
41
43
  let match: RegExpExecArray | null;
42
- while ((match = INLINE_RE.exec(text)) !== null) {
44
+ while ((match = pattern.exec(text)) !== null) {
43
45
  if (match.index > cursor) {
44
46
  segments.push({ text: text.slice(cursor, match.index) });
45
47
  }
46
- if (match.groups?.bold != null) {
48
+ if (match.groups?.escaped != null) {
49
+ segments.push({ text: match.groups.escaped });
50
+ } else if (match.groups?.bold != null) {
47
51
  segments.push({ text: match.groups.bold, bold: true });
48
52
  } else if (match.groups?.italic != null) {
49
- segments.push({ text: match.groups.italic, italic: true });
53
+ for (const inner of parseInlineMarkdown(match.groups.italic)) segments.push({ ...inner, italic: true });
50
54
  } else if (match.groups?.code != null) {
51
55
  segments.push({ text: match.groups.code, code: true });
52
56
  } else if (match.groups?.strike != null) {
@@ -209,6 +209,17 @@ function useItemsById<T>(scene: MetricTreemapScene<T>, items: readonly MetricTre
209
209
 
210
210
  const VISIBLE_FADE_DISTANCE = 0.03;
211
211
 
212
+ /** Text up a tall tile reads bottom to top, as a chart's vertical axis title does; the move sits right of the ticker. */
213
+ const VERTICAL_LABEL_STYLE: CSSProperties = {
214
+ position: "relative",
215
+ display: "block",
216
+ flexShrink: 0,
217
+ maxHeight: "100%",
218
+ overflow: "hidden",
219
+ writingMode: "vertical-rl",
220
+ transform: "rotate(180deg)",
221
+ };
222
+
212
223
  const DomHeatTile = memo(function DomHeatTile({
213
224
  id, rect, canvasWidth, canvasHeight, gap, label, value, valueSuffix, background, foreground,
214
225
  selected, reducedMotion, glide, pulseCount, events,
@@ -230,7 +241,10 @@ const DomHeatTile = memo(function DomHeatTile({
230
241
  events: SurfaceEvents;
231
242
  }) {
232
243
  const text = heatTileLabelPx(rect.width - gap * 2, rect.height - gap * 2, label, value);
233
- const shownValue = heatTileValueWithSuffix(value, valueSuffix, { width: rect.width - gap * 2, valuePx: text.valuePx });
244
+ const shownValue = heatTileValueWithSuffix(value, valueSuffix, {
245
+ width: (text.vertical ? rect.height : rect.width) - gap * 2,
246
+ valuePx: text.valuePx,
247
+ });
234
248
  // Where this tile sat before the last relayout, kept to slide it from there.
235
249
  const placedRef = useRef(rect);
236
250
  const glideRef = useRef<{ dx: number; dy: number; count: number }>({ dx: 0, dy: 0, count: 0 });
@@ -305,13 +319,23 @@ const DomHeatTile = memo(function DomHeatTile({
305
319
  const lineStyle: CSSProperties = {
306
320
  position: "relative",
307
321
  display: "block",
308
- maxWidth: "100%",
322
+ maxWidth: text.vertical ? undefined : "100%",
309
323
  overflow: "hidden",
310
324
  whiteSpace: "nowrap",
311
325
  textAlign: "center",
312
326
  letterSpacing: 0,
313
327
  color: foreground,
314
328
  };
329
+ const lines = (
330
+ <>
331
+ {text.tier !== "none" && (
332
+ <Text style={{ ...lineStyle, fontSize: text.tickerPx, fontWeight: 700, lineHeight: 1.12 }}>{label}</Text>
333
+ )}
334
+ {text.tier === "full" && value && (
335
+ <Text style={{ ...lineStyle, fontSize: text.valuePx, fontWeight: 500, lineHeight: 1.12 }}>{shownValue}</Text>
336
+ )}
337
+ </>
338
+ );
315
339
  return (
316
340
  <Box
317
341
  data-gloom-role="heat-tile"
@@ -347,12 +371,7 @@ const DomHeatTile = memo(function DomHeatTile({
347
371
  }}
348
372
  />
349
373
  )}
350
- {text.tier !== "none" && (
351
- <Text style={{ ...lineStyle, fontSize: text.tickerPx, fontWeight: 700, lineHeight: 1.12 }}>{label}</Text>
352
- )}
353
- {text.tier === "full" && value && (
354
- <Text style={{ ...lineStyle, fontSize: text.valuePx, fontWeight: 500, lineHeight: 1.12 }}>{shownValue}</Text>
355
- )}
374
+ {text.vertical ? <Box style={VERTICAL_LABEL_STYLE}>{lines}</Box> : lines}
356
375
  </Box>
357
376
  );
358
377
  });