gloomberb 0.9.9 → 0.10.0

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 (519) hide show
  1. package/README.md +41 -3
  2. package/README.zh-CN.md +294 -0
  3. package/package.json +10 -4
  4. package/patches/@opentui%2Fcore@0.3.2.patch +26 -69
  5. package/src/api-client/auth.ts +2 -0
  6. package/src/api-client/index.test.ts +4 -0
  7. package/src/api-client/types.ts +3 -0
  8. package/src/app/pane-runtime/pane-settings-runtime.tsx +1 -0
  9. package/src/app/pane-template-dialog-wizard.test.tsx +36 -0
  10. package/src/app/pane-template-dialog-wizard.tsx +10 -3
  11. package/src/app/runtime/desktop-deeplink.test.ts +15 -0
  12. package/src/app/runtime/desktop-deeplink.ts +21 -6
  13. package/src/app.tsx +40 -33
  14. package/src/capabilities/service-capabilities.ts +7 -2
  15. package/src/cli/commands/automation.test.ts +202 -0
  16. package/src/cli/commands/automation.ts +153 -36
  17. package/src/cli/commands/market.ts +1 -14
  18. package/src/cli/commands/system.ts +4 -1
  19. package/src/cli/context.ts +1 -1
  20. package/src/cli/desktop-pane-shot.ts +65 -4
  21. package/src/cli/entry.ts +1 -1
  22. package/src/cli/pane-functions/capabilities.ts +532 -0
  23. package/src/cli/pane-functions/catalog.ts +39 -4
  24. package/src/cli/pane-functions/data.test.ts +17 -0
  25. package/src/cli/pane-functions/data.ts +55 -13
  26. package/src/cli/pane-functions/discovery.ts +36 -9
  27. package/src/cli/pane-functions/index.test.ts +104 -1
  28. package/src/cli/pane-functions/index.ts +64 -5
  29. package/src/cli/pane-functions/options.ts +21 -6
  30. package/src/cli/pane-functions/report.ts +735 -72
  31. package/src/cli/pane-functions/resolver.ts +70 -6
  32. package/src/cli/pane-functions/screenshot.test.ts +431 -0
  33. package/src/cli/pane-functions/screenshot.ts +952 -8
  34. package/src/components/chart/composite/column-layout.ts +215 -0
  35. package/src/components/chart/composite/composite-chart.test.tsx +630 -0
  36. package/src/components/chart/composite/composite-chart.tsx +1148 -0
  37. package/src/components/chart/composite/format.test.ts +137 -0
  38. package/src/components/chart/composite/format.ts +135 -0
  39. package/src/components/chart/composite/index.ts +38 -0
  40. package/src/components/chart/composite/interactions.test.ts +109 -0
  41. package/src/components/chart/composite/interactions.ts +247 -0
  42. package/src/components/chart/composite/price-series.test.ts +39 -0
  43. package/src/components/chart/composite/price-series.ts +78 -0
  44. package/src/components/chart/composite/rasterizer.ts +359 -0
  45. package/src/components/chart/composite/renderers.test.ts +610 -0
  46. package/src/components/chart/composite/scene.test.ts +464 -0
  47. package/src/components/chart/composite/scene.ts +553 -0
  48. package/src/components/chart/composite/text-renderer.ts +285 -0
  49. package/src/components/chart/composite/time-scale.test.ts +88 -0
  50. package/src/components/chart/composite/time-scale.ts +217 -0
  51. package/src/components/chart/composite/types.ts +141 -0
  52. package/src/components/chart/core/data.ts +81 -5
  53. package/src/components/chart/core/index.test.ts +128 -43
  54. package/src/components/chart/core/resolution.ts +0 -6
  55. package/src/components/chart/native/chart-rasterizer.ts +1 -3
  56. package/src/components/chart/native/kitty/index.test.ts +99 -120
  57. package/src/components/chart/native/kitty/manager.ts +3 -0
  58. package/src/components/chart/native/kitty/protocol.ts +4 -1
  59. package/src/components/chart/native/raster/crosshair.ts +79 -46
  60. package/src/components/chart/native/raster/types.ts +2 -11
  61. package/src/components/chart/native/surface/manager.ts +48 -3
  62. package/src/components/chart/price-axis-labels.tsx +18 -4
  63. package/src/components/command-bar/commands/direct/index.ts +25 -0
  64. package/src/components/command-bar/commands/registry.ts +9 -0
  65. package/src/components/command-bar/helpers.test.ts +4 -1
  66. package/src/components/command-bar/list/view.tsx +18 -6
  67. package/src/components/command-bar/multi-select-picker.tsx +6 -5
  68. package/src/components/command-bar/pane-settings.test.ts +141 -0
  69. package/src/components/command-bar/pane-settings.ts +61 -1
  70. package/src/components/command-bar/panel/body.tsx +7 -6
  71. package/src/components/command-bar/routes/root/command-items.ts +4 -4
  72. package/src/components/command-bar/routes/root/results.ts +10 -1
  73. package/src/components/command-bar/routes/root/selection.test.ts +54 -0
  74. package/src/components/command-bar/routes/root/selection.ts +13 -0
  75. package/src/components/command-bar/routing/actions.ts +18 -2
  76. package/src/components/command-bar/routing/list-state.ts +2 -1
  77. package/src/components/command-bar/surface/index.test.tsx +36 -4
  78. package/src/components/command-bar/surface/pane.test.tsx +93 -0
  79. package/src/components/command-bar/theme-picker.tsx +2 -1
  80. package/src/components/command-bar/view-model.ts +19 -20
  81. package/src/components/command-bar/workflow/body.tsx +2 -1
  82. package/src/components/command-bar/workflow/field-row.tsx +3 -2
  83. package/src/components/command-bar/workflow/fields.ts +4 -2
  84. package/src/components/command-bar/workflow/ops.test.ts +161 -0
  85. package/src/components/command-bar/workflow/ops.ts +20 -50
  86. package/src/components/command-bar/workflow/route-actions.test.ts +34 -0
  87. package/src/components/command-bar/workflow/route-actions.ts +4 -0
  88. package/src/components/command-bar/workflow/types.ts +1 -0
  89. package/src/components/feed-data-table/stack-view.tsx +6 -5
  90. package/src/components/index.ts +13 -1
  91. package/src/components/layout/detached-pane-shell.tsx +2 -1
  92. package/src/components/layout/floating-pane.tsx +3 -0
  93. package/src/components/layout/header.tsx +15 -8
  94. package/src/components/layout/pane/footer/index.test.tsx +22 -3
  95. package/src/components/layout/pane/footer/index.tsx +3 -1
  96. package/src/components/layout/pane/footer/model.ts +9 -2
  97. package/src/components/layout/pane/header.tsx +4 -6
  98. package/src/components/layout/pane/index.tsx +3 -0
  99. package/src/components/layout/pane/sidebar.test.tsx +100 -0
  100. package/src/components/layout/pane/sidebar.tsx +239 -0
  101. package/src/components/layout/pane/title.ts +4 -3
  102. package/src/components/layout/shell/action-menu-overlay.tsx +5 -3
  103. package/src/components/layout/shell/drag/runtime.ts +2 -0
  104. package/src/components/layout/shell/menu.test.ts +19 -0
  105. package/src/components/layout/shell/menu.ts +8 -5
  106. package/src/components/layout/shell/native/pointer-runtime.ts +4 -1
  107. package/src/components/layout/shell/pane/layers.tsx +2 -2
  108. package/src/components/layout/status-bar.tsx +8 -7
  109. package/src/components/layout/window-controls.tsx +4 -3
  110. package/src/components/metric-treemap/index.tsx +3 -2
  111. package/src/components/onboarding/onboarding-steps.tsx +30 -29
  112. package/src/components/onboarding/onboarding-wizard.tsx +5 -4
  113. package/src/components/onboarding/portfolio-step/broker-fields-panel.tsx +15 -12
  114. package/src/components/onboarding/portfolio-step/broker-setup-panel.tsx +17 -16
  115. package/src/components/onboarding/portfolio-step/broker-sync-panel.tsx +6 -5
  116. package/src/components/onboarding/portfolio-step/choose-panel.tsx +5 -4
  117. package/src/components/pane-settings-dialog/desktop.tsx +25 -3
  118. package/src/components/pane-settings-dialog/field-dialogs.tsx +5 -4
  119. package/src/components/pane-settings-dialog/tui.tsx +11 -9
  120. package/src/components/pane-settings-dialog/value.ts +8 -5
  121. package/src/components/pane-settings-dialog.test.tsx +235 -0
  122. package/src/components/pane-settings-dialog.tsx +24 -0
  123. package/src/components/pane-template-wizard.tsx +6 -2
  124. package/src/components/ticker/list-table-view.tsx +3 -2
  125. package/src/components/ui/button.tsx +3 -1
  126. package/src/components/ui/choice-dialog.tsx +6 -1
  127. package/src/components/ui/confirm-dialog.tsx +3 -2
  128. package/src/components/ui/fields.tsx +10 -1
  129. package/src/components/ui/frame.tsx +4 -1
  130. package/src/components/ui/index.ts +5 -0
  131. package/src/components/ui/inline-quick-add.tsx +104 -0
  132. package/src/components/ui/list-view.tsx +5 -4
  133. package/src/components/ui/loading.tsx +2 -1
  134. package/src/components/ui/multi-select/dialog.tsx +188 -44
  135. package/src/components/ui/popover.tsx +10 -0
  136. package/src/components/ui/shortcut-hint.tsx +2 -0
  137. package/src/components/ui/status.tsx +4 -3
  138. package/src/components/ui/tabs.tsx +19 -8
  139. package/src/components/ui/toggle.tsx +44 -3
  140. package/src/components/ui/ui.test.tsx +67 -5
  141. package/src/core/app-services.ts +4 -6
  142. package/src/core/state/session-persistence.ts +3 -2
  143. package/src/data/config/chart-settings.ts +712 -0
  144. package/src/data/config/layout.ts +24 -5
  145. package/src/data/config/store/index.test.ts +377 -14
  146. package/src/data/config/store/normalize.ts +79 -65
  147. package/src/data/fred-series.ts +137 -0
  148. package/src/i18n/index.test.ts +114 -0
  149. package/src/i18n/index.ts +147 -0
  150. package/src/i18n/ja.ts +1013 -0
  151. package/src/i18n/ko.ts +1011 -0
  152. package/src/i18n/languages.test.ts +31 -0
  153. package/src/i18n/languages.ts +72 -0
  154. package/src/i18n/zh-cn.ts +1013 -0
  155. package/src/i18n/zh-tw.ts +1013 -0
  156. package/src/plugins/builtin/account-management/footer.ts +3 -2
  157. package/src/plugins/builtin/account-management/form-components.tsx +3 -2
  158. package/src/plugins/builtin/account-management/keyboard.ts +6 -0
  159. package/src/plugins/builtin/account-management/model.ts +25 -21
  160. package/src/plugins/builtin/account-management/navigation.test.ts +27 -0
  161. package/src/plugins/builtin/account-management/navigation.ts +24 -0
  162. package/src/plugins/builtin/account-management/pane.tsx +120 -85
  163. package/src/plugins/builtin/account-management/password-dialog.tsx +10 -9
  164. package/src/plugins/builtin/ai/agent-history.ts +139 -0
  165. package/src/plugins/builtin/ai/ask-ai-detail-tab.tsx +133 -51
  166. package/src/plugins/builtin/ai/ask-ai.test.tsx +83 -22
  167. package/src/plugins/builtin/ai/index.test.ts +302 -0
  168. package/src/plugins/builtin/ai/index.tsx +374 -40
  169. package/src/plugins/builtin/ai/pane-settings.test.ts +155 -0
  170. package/src/plugins/builtin/ai/pane-settings.ts +319 -0
  171. package/src/plugins/builtin/ai/pi/credential-store.test.ts +80 -0
  172. package/src/plugins/builtin/ai/pi/credential-store.ts +138 -0
  173. package/src/plugins/builtin/ai/pi/file-store.ts +138 -0
  174. package/src/plugins/builtin/ai/pi/host.test.ts +500 -0
  175. package/src/plugins/builtin/ai/pi/host.ts +564 -0
  176. package/src/plugins/builtin/ai/pi/index.ts +5 -0
  177. package/src/plugins/builtin/ai/pi/models-store.test.ts +44 -0
  178. package/src/plugins/builtin/ai/pi/models-store.ts +141 -0
  179. package/src/plugins/builtin/ai/pi/providers.ts +68 -0
  180. package/src/plugins/builtin/ai/pi/runtime.test.ts +240 -0
  181. package/src/plugins/builtin/ai/pi/runtime.ts +635 -0
  182. package/src/plugins/builtin/ai/providers.test.ts +68 -0
  183. package/src/plugins/builtin/ai/providers.ts +163 -38
  184. package/src/plugins/builtin/ai/runner-selection.test.ts +174 -0
  185. package/src/plugins/builtin/ai/runner-selection.ts +193 -0
  186. package/src/plugins/builtin/ai/runner-selector.tsx +153 -0
  187. package/src/plugins/builtin/ai/runner.test.ts +198 -0
  188. package/src/plugins/builtin/ai/runner.ts +276 -73
  189. package/src/plugins/builtin/ai/screener/contract.test.ts +26 -73
  190. package/src/plugins/builtin/ai/screener/contract.ts +14 -52
  191. package/src/plugins/builtin/ai/screener/editor-runtime.ts +55 -5
  192. package/src/plugins/builtin/ai/screener/editor.tsx +42 -36
  193. package/src/plugins/builtin/ai/screener/footer.ts +82 -67
  194. package/src/plugins/builtin/ai/screener/keyboard.ts +27 -11
  195. package/src/plugins/builtin/ai/screener/model.test.ts +24 -0
  196. package/src/plugins/builtin/ai/screener/model.ts +9 -3
  197. package/src/plugins/builtin/ai/screener/pane.test.tsx +142 -55
  198. package/src/plugins/builtin/ai/screener/pane.tsx +95 -97
  199. package/src/plugins/builtin/ai/screener/results-view.tsx +8 -41
  200. package/src/plugins/builtin/ai/screener/runner.ts +41 -25
  201. package/src/plugins/builtin/ai/screener/tabs-bar.tsx +2 -2
  202. package/src/plugins/builtin/ai/use-runtime-providers.ts +28 -0
  203. package/src/plugins/builtin/ai/workspace/model.test.ts +227 -0
  204. package/src/plugins/builtin/ai/workspace/model.ts +308 -0
  205. package/src/plugins/builtin/ai/workspace/pane.test.tsx +197 -0
  206. package/src/plugins/builtin/ai/workspace/pane.tsx +896 -0
  207. package/src/plugins/builtin/analytics/index.test.tsx +3 -3
  208. package/src/plugins/builtin/analytics/index.tsx +3 -8
  209. package/src/plugins/builtin/broker-manager/detail.tsx +25 -24
  210. package/src/plugins/builtin/broker-manager/index.test.tsx +1 -1
  211. package/src/plugins/builtin/broker-manager/index.tsx +9 -11
  212. package/src/plugins/builtin/broker-manager/model.ts +11 -10
  213. package/src/plugins/builtin/broker-manager/pane-actions.tsx +22 -21
  214. package/src/plugins/builtin/broker-manager/table.ts +9 -8
  215. package/src/plugins/builtin/changelog/index.tsx +3 -8
  216. package/src/plugins/builtin/chart-composer/chart-spec.ts +89 -0
  217. package/src/plugins/builtin/chart-composer/cli-options.ts +98 -0
  218. package/src/plugins/builtin/chart-composer/date-window-dialog.tsx +120 -0
  219. package/src/plugins/builtin/chart-composer/editor.test.tsx +332 -0
  220. package/src/plugins/builtin/chart-composer/editor.tsx +1107 -0
  221. package/src/plugins/builtin/chart-composer/index.tsx +228 -0
  222. package/src/plugins/builtin/chart-composer/pane.tsx +645 -0
  223. package/src/plugins/builtin/chart-composer/presets.test.ts +561 -0
  224. package/src/plugins/builtin/chart-composer/presets.ts +759 -0
  225. package/src/plugins/builtin/chart-composer/quick-add.test.tsx +245 -0
  226. package/src/plugins/builtin/chart-composer/quick-add.tsx +409 -0
  227. package/src/plugins/builtin/chart-composer/semantic.ts +86 -0
  228. package/src/plugins/builtin/chart-composer/series-catalog.test.ts +65 -0
  229. package/src/plugins/builtin/chart-composer/series-catalog.ts +295 -0
  230. package/src/plugins/builtin/chart-composer/settings.test.ts +163 -0
  231. package/src/plugins/builtin/chart-composer/settings.ts +397 -0
  232. package/src/plugins/builtin/chart-composer/shortcuts.test.ts +44 -0
  233. package/src/plugins/builtin/chart-composer/shortcuts.ts +35 -0
  234. package/src/plugins/builtin/chart-composer/use-series-catalog.ts +103 -0
  235. package/src/plugins/builtin/chat/channel-labels.ts +5 -4
  236. package/src/plugins/builtin/chat/channels.ts +12 -11
  237. package/src/plugins/builtin/chat/chat.test.tsx +32 -0
  238. package/src/plugins/builtin/chat/content/composer-runtime.ts +6 -1
  239. package/src/plugins/builtin/chat/content/composer.tsx +9 -8
  240. package/src/plugins/builtin/chat/content/index.tsx +36 -1
  241. package/src/plugins/builtin/chat/content/new-dm-dialog.tsx +8 -7
  242. package/src/plugins/builtin/chat/content/transcript.tsx +9 -3
  243. package/src/plugins/builtin/chat/controller/utils.ts +10 -9
  244. package/src/plugins/builtin/chat/message/desktop.tsx +17 -10
  245. package/src/plugins/builtin/chat/message/profile-popover.test.tsx +122 -3
  246. package/src/plugins/builtin/chat/message/profile-popover.tsx +38 -1
  247. package/src/plugins/builtin/chat/message/terminal.tsx +19 -10
  248. package/src/plugins/builtin/chat/pane-state.test.ts +31 -0
  249. package/src/plugins/builtin/chat/pane-state.ts +30 -0
  250. package/src/plugins/builtin/chat/pane.tsx +27 -4
  251. package/src/plugins/builtin/chat/profile-popover.ts +62 -5
  252. package/src/plugins/builtin/chat/sidebar.test.tsx +4 -7
  253. package/src/plugins/builtin/chat/sidebar.tsx +107 -168
  254. package/src/plugins/builtin/chat/test-harness.tsx +6 -0
  255. package/src/plugins/builtin/cloud/auth-actions.tsx +5 -4
  256. package/src/plugins/builtin/cloud/plugin.tsx +150 -127
  257. package/src/plugins/builtin/composite-plugins.ts +71 -0
  258. package/src/plugins/builtin/correlation/index.test.tsx +4 -4
  259. package/src/plugins/builtin/correlation/index.tsx +3 -8
  260. package/src/plugins/builtin/earnings/index.tsx +37 -21
  261. package/src/plugins/builtin/earnings/model.test.ts +52 -0
  262. package/src/plugins/builtin/earnings/model.ts +32 -0
  263. package/src/plugins/builtin/econ/detail-view.tsx +17 -4
  264. package/src/plugins/builtin/econ/fred-cache.test.ts +57 -11
  265. package/src/plugins/builtin/econ/index.tsx +16 -20
  266. package/src/plugins/builtin/fear-greed/index.tsx +2 -8
  267. package/src/plugins/builtin/fx-matrix/index.tsx +3 -8
  268. package/src/plugins/builtin/help/components.tsx +5 -4
  269. package/src/plugins/builtin/help/index.tsx +14 -17
  270. package/src/plugins/builtin/holders/index.tsx +2 -8
  271. package/src/plugins/builtin/insider/index.tsx +2 -7
  272. package/src/plugins/builtin/kelly-sizer/index.test.tsx +2 -2
  273. package/src/plugins/builtin/kelly-sizer/index.tsx +3 -7
  274. package/src/plugins/builtin/kelly-sizer/test-support.tsx +3 -3
  275. package/src/plugins/builtin/layout-manager/index.tsx +3 -7
  276. package/src/plugins/builtin/market-heatmap/index.tsx +3 -8
  277. package/src/plugins/builtin/market-movers/index.tsx +3 -8
  278. package/src/plugins/builtin/news/index.tsx +12 -16
  279. package/src/plugins/builtin/news/wire/breaking/pane.test.tsx +3 -3
  280. package/src/plugins/builtin/news/wire/index.tsx +83 -73
  281. package/src/plugins/builtin/options/index.tsx +2 -8
  282. package/src/plugins/builtin/plugin-module.test.ts +89 -0
  283. package/src/plugins/builtin/plugin-module.ts +116 -0
  284. package/src/plugins/builtin/portfolio-list/header.tsx +4 -3
  285. package/src/plugins/builtin/portfolio-list/index.test.ts +17 -0
  286. package/src/plugins/builtin/portfolio-list/index.tsx +3 -5
  287. package/src/plugins/builtin/portfolio-list/pane/index.test.tsx +3 -3
  288. package/src/plugins/builtin/portfolio-list/quick-add/index.tsx +53 -53
  289. package/src/plugins/builtin/portfolio-list/settings.ts +5 -3
  290. package/src/plugins/builtin/portfolio-list/summary/index.tsx +4 -3
  291. package/src/plugins/builtin/research/index.tsx +2 -8
  292. package/src/plugins/builtin/sec/index.tsx +2 -8
  293. package/src/plugins/builtin/sectors/index.tsx +3 -8
  294. package/src/plugins/builtin/thirteenf/index.tsx +3 -8
  295. package/src/plugins/builtin/thirteenf/pane.test.tsx +1 -1
  296. package/src/plugins/builtin/ticker-detail/chart-tab-switch.test.tsx +49 -23
  297. package/src/plugins/builtin/ticker-detail/index.test.tsx +15 -136
  298. package/src/plugins/builtin/ticker-detail/index.tsx +2 -93
  299. package/src/plugins/builtin/ticker-detail/overview/components.tsx +6 -5
  300. package/src/plugins/builtin/ticker-detail/overview-tab.tsx +41 -17
  301. package/src/plugins/builtin/ticker-detail/pane.tsx +4 -3
  302. package/src/plugins/builtin/ticker-detail/quote-monitor/index.test.tsx +1 -1
  303. package/src/plugins/builtin/ticker-detail/settings.ts +3 -50
  304. package/src/plugins/builtin/ticker-research-backend-plugin.ts +17 -0
  305. package/src/plugins/builtin/ticker-research-plugin.ts +27 -0
  306. package/src/plugins/builtin/tv/channels.ts +27 -0
  307. package/src/plugins/builtin/tv/index.tsx +40 -0
  308. package/src/plugins/builtin/tv/pane.tsx +286 -0
  309. package/src/plugins/builtin/tv/youtube-stream.ts +100 -0
  310. package/src/plugins/builtin/world-indices/index.tsx +3 -8
  311. package/src/plugins/builtin/yield-curve/index.tsx +8 -8
  312. package/src/plugins/catalog-backend.test.ts +21 -0
  313. package/src/plugins/catalog-backend.ts +42 -0
  314. package/src/plugins/catalog-ui.ts +6 -14
  315. package/src/plugins/ibkr/instance-selection.test.ts +0 -1
  316. package/src/plugins/ownership.ts +143 -0
  317. package/src/plugins/prediction-markets/backend-plugin.ts +19 -0
  318. package/src/plugins/prediction-markets/chart.test.tsx +7 -5
  319. package/src/plugins/prediction-markets/chart.tsx +25 -7
  320. package/src/plugins/registry/index.test.ts +51 -0
  321. package/src/plugins/registry/index.ts +8 -0
  322. package/src/plugins/registry/pane-settings.ts +1 -1
  323. package/src/plugins/runtime/index.test.tsx +2 -2
  324. package/src/remote/app-host.tsx +16 -3
  325. package/src/remote/controller.test.ts +102 -1
  326. package/src/remote/controller.ts +122 -0
  327. package/src/remote/types.ts +11 -0
  328. package/src/renderers/electrobun/bun/core-capabilities.ts +123 -27
  329. package/src/renderers/electrobun/bun/desktop/backend-requests.ts +5 -1
  330. package/src/renderers/electrobun/bun/desktop/initialization.ts +5 -1
  331. package/src/renderers/electrobun/bun/desktop/media.ts +15 -0
  332. package/src/renderers/electrobun/bun/desktop/window-style.ts +4 -1
  333. package/src/renderers/electrobun/bun/desktop/workspace/index.test.ts +32 -1
  334. package/src/renderers/electrobun/bun/desktop/workspace/index.ts +10 -0
  335. package/src/renderers/electrobun/bun/index.ts +5 -0
  336. package/src/renderers/electrobun/bun/tui-entry.ts +1 -6
  337. package/src/renderers/electrobun/view/ai-host.ts +124 -19
  338. package/src/renderers/electrobun/view/backend-rpc.ts +4 -0
  339. package/src/renderers/electrobun/view/cli-pane-shot-entry.tsx +151 -39
  340. package/src/renderers/electrobun/view/desktop/popover.tsx +166 -0
  341. package/src/renderers/electrobun/view/dialog-host.test.ts +25 -0
  342. package/src/renderers/electrobun/view/dialog-host.tsx +75 -12
  343. package/src/renderers/electrobun/view/host/box.tsx +5 -0
  344. package/src/renderers/electrobun/view/host/chart-surface.tsx +10 -9
  345. package/src/renderers/electrobun/view/host/input.tsx +9 -19
  346. package/src/renderers/electrobun/view/host/media-surface.tsx +170 -0
  347. package/src/renderers/electrobun/view/host/mouse.ts +1 -0
  348. package/src/renderers/electrobun/view/host/style.ts +1 -1
  349. package/src/renderers/electrobun/view/host/tabs.tsx +4 -3
  350. package/src/renderers/electrobun/view/main.tsx +10 -3
  351. package/src/renderers/electrobun/view/styles.css +17 -0
  352. package/src/renderers/electrobun/view/ui-host.tsx +7 -0
  353. package/src/renderers/opentui/chart-surface.test.tsx +52 -6
  354. package/src/renderers/opentui/chart-surface.tsx +95 -11
  355. package/src/renderers/opentui/dialog-host.tsx +36 -5
  356. package/src/renderers/opentui/host.tsx +39 -0
  357. package/src/renderers/opentui/start.tsx +30 -0
  358. package/src/renderers/opentui/ui-host.tsx +2 -0
  359. package/src/sources/provider-router/index.test.ts +43 -0
  360. package/src/sources/provider-router/index.ts +4 -0
  361. package/src/sources/provider-router/supplemental.ts +46 -0
  362. package/src/sources/sec-edgar.test.ts +203 -2
  363. package/src/sources/sec-edgar.ts +70 -15
  364. package/src/state/app/context/index.tsx +13 -1
  365. package/src/state/app/context/selector.test.tsx +62 -1
  366. package/src/state/session-persistence.test.ts +13 -2
  367. package/src/sync/controller.test.ts +190 -3
  368. package/src/sync/controller.ts +76 -45
  369. package/src/sync/core-contributors.test.ts +121 -0
  370. package/src/sync/core-contributors.ts +104 -27
  371. package/src/sync/react.ts +6 -8
  372. package/src/sync/types.ts +3 -0
  373. package/src/time-series/alignment.ts +158 -0
  374. package/src/time-series/economic.ts +49 -0
  375. package/src/time-series/field-catalog.ts +306 -0
  376. package/src/time-series/fundamentals.test.ts +505 -0
  377. package/src/time-series/fundamentals.ts +842 -0
  378. package/src/time-series/hooks.ts +45 -0
  379. package/src/time-series/index.ts +14 -0
  380. package/src/time-series/live-quotes.test.ts +219 -0
  381. package/src/time-series/live-quotes.ts +203 -0
  382. package/src/time-series/market-resolution.ts +53 -0
  383. package/src/time-series/market.ts +125 -0
  384. package/src/time-series/reporting.ts +98 -0
  385. package/src/time-series/resolve.test.ts +1281 -0
  386. package/src/time-series/resolve.ts +783 -0
  387. package/src/time-series/spec-studies.test.ts +400 -0
  388. package/src/time-series/spec.ts +487 -0
  389. package/src/time-series/studies.ts +563 -0
  390. package/src/time-series/transforms.test.ts +105 -0
  391. package/src/time-series/transforms.ts +152 -0
  392. package/src/time-series/types.ts +162 -0
  393. package/src/time-series/use-chart-resolution.ts +166 -0
  394. package/src/types/config.ts +9 -11
  395. package/src/types/desktop-window.ts +1 -0
  396. package/src/types/financials.ts +4 -0
  397. package/src/types/media.ts +17 -0
  398. package/src/types/plugin.ts +32 -1
  399. package/src/ui/context-menu.tsx +15 -3
  400. package/src/ui/dialog.tsx +14 -2
  401. package/src/ui/host.tsx +40 -1
  402. package/src/ui/index.tsx +9 -0
  403. package/src/utils/exchanges.test.ts +13 -1
  404. package/src/utils/exchanges.ts +10 -0
  405. package/src/utils/financial-statements.test.ts +138 -0
  406. package/src/utils/financial-statements.ts +115 -8
  407. package/src/utils/format.test.ts +11 -1
  408. package/src/utils/format.ts +7 -0
  409. package/src/version.ts +1 -1
  410. package/src/components/chart/bar-chart-renderer.test.ts +0 -233
  411. package/src/components/chart/bar-chart-renderer.ts +0 -445
  412. package/src/components/chart/comparison/data.test.ts +0 -159
  413. package/src/components/chart/comparison/data.ts +0 -302
  414. package/src/components/chart/comparison/renderer.test.ts +0 -187
  415. package/src/components/chart/comparison/renderer.ts +0 -282
  416. package/src/components/chart/comparison/scene.ts +0 -178
  417. package/src/components/chart/comparison-stock-chart/axis-width.ts +0 -99
  418. package/src/components/chart/comparison-stock-chart/canvas.ts +0 -148
  419. package/src/components/chart/comparison-stock-chart/controls.ts +0 -252
  420. package/src/components/chart/comparison-stock-chart/helpers.ts +0 -101
  421. package/src/components/chart/comparison-stock-chart/interactions.ts +0 -208
  422. package/src/components/chart/comparison-stock-chart/layout-metrics.ts +0 -62
  423. package/src/components/chart/comparison-stock-chart/layout.tsx +0 -155
  424. package/src/components/chart/comparison-stock-chart/legend.tsx +0 -74
  425. package/src/components/chart/comparison-stock-chart/native-surfaces.ts +0 -89
  426. package/src/components/chart/comparison-stock-chart/render-data.ts +0 -227
  427. package/src/components/chart/comparison-stock-chart/render-output.ts +0 -140
  428. package/src/components/chart/comparison-stock-chart/selection-runtime.ts +0 -128
  429. package/src/components/chart/comparison-stock-chart/sources.ts +0 -51
  430. package/src/components/chart/comparison-stock-chart/surface-runtime.ts +0 -159
  431. package/src/components/chart/comparison-stock-chart/toolbar.tsx +0 -117
  432. package/src/components/chart/comparison-stock-chart/types.ts +0 -22
  433. package/src/components/chart/comparison-stock-chart/view.tsx +0 -572
  434. package/src/components/chart/comparison-stock-chart/viewport-runtime.ts +0 -239
  435. package/src/components/chart/comparison-stock-chart.tsx +0 -24
  436. package/src/components/chart/core/axis-measure.ts +0 -33
  437. package/src/components/chart/core/controller.test.ts +0 -157
  438. package/src/components/chart/core/controller.ts +0 -349
  439. package/src/components/chart/core/indicator-selector.tsx +0 -75
  440. package/src/components/chart/core/keyboard.ts +0 -24
  441. package/src/components/chart/core/pane-settings.test.ts +0 -52
  442. package/src/components/chart/core/pane-settings.ts +0 -141
  443. package/src/components/chart/core/scroll.test.ts +0 -64
  444. package/src/components/chart/core/scroll.ts +0 -82
  445. package/src/components/chart/core/window-viewport.test.ts +0 -69
  446. package/src/components/chart/core/window-viewport.ts +0 -162
  447. package/src/components/chart/display-cursor.ts +0 -153
  448. package/src/components/chart/indicators/bands.test.ts +0 -36
  449. package/src/components/chart/indicators/bands.ts +0 -29
  450. package/src/components/chart/indicators/moving-averages.test.ts +0 -39
  451. package/src/components/chart/indicators/moving-averages.ts +0 -42
  452. package/src/components/chart/indicators/options.test.ts +0 -32
  453. package/src/components/chart/indicators/options.ts +0 -107
  454. package/src/components/chart/indicators/oscillators.test.ts +0 -58
  455. package/src/components/chart/indicators/oscillators.ts +0 -92
  456. package/src/components/chart/native/canvas-bitmaps.ts +0 -140
  457. package/src/components/chart/native/raster/comparison-chart.ts +0 -162
  458. package/src/components/chart/native/surface/hooks.ts +0 -144
  459. package/src/components/chart/native/surface/rendering.ts +0 -211
  460. package/src/components/chart/static/bar-chart-surface.test.tsx +0 -101
  461. package/src/components/chart/static/bar-chart-surface.tsx +0 -292
  462. package/src/components/chart/stock-chart/auto.ts +0 -216
  463. package/src/components/chart/stock-chart/axis-width.ts +0 -146
  464. package/src/components/chart/stock-chart/bitmaps.ts +0 -22
  465. package/src/components/chart/stock-chart/canvas.ts +0 -202
  466. package/src/components/chart/stock-chart/controls.tsx +0 -149
  467. package/src/components/chart/stock-chart/cursor.ts +0 -60
  468. package/src/components/chart/stock-chart/data-runtime.ts +0 -128
  469. package/src/components/chart/stock-chart/footer.test.ts +0 -65
  470. package/src/components/chart/stock-chart/footer.ts +0 -303
  471. package/src/components/chart/stock-chart/geometry.ts +0 -160
  472. package/src/components/chart/stock-chart/index.test.ts +0 -532
  473. package/src/components/chart/stock-chart/index.tsx +0 -29
  474. package/src/components/chart/stock-chart/indicators.ts +0 -226
  475. package/src/components/chart/stock-chart/interaction-runtime.ts +0 -44
  476. package/src/components/chart/stock-chart/interactions.ts +0 -300
  477. package/src/components/chart/stock-chart/keyboard.ts +0 -373
  478. package/src/components/chart/stock-chart/layout-metrics.ts +0 -62
  479. package/src/components/chart/stock-chart/layout.tsx +0 -177
  480. package/src/components/chart/stock-chart/native-surfaces.ts +0 -121
  481. package/src/components/chart/stock-chart/presentation.ts +0 -67
  482. package/src/components/chart/stock-chart/renderer-switch.test.tsx +0 -263
  483. package/src/components/chart/stock-chart/rendering/bounds.ts +0 -116
  484. package/src/components/chart/stock-chart/rendering/candidates.ts +0 -145
  485. package/src/components/chart/stock-chart/rendering/data.ts +0 -370
  486. package/src/components/chart/stock-chart/rendering/invalidation.ts +0 -68
  487. package/src/components/chart/stock-chart/rendering/output.ts +0 -304
  488. package/src/components/chart/stock-chart/rendering/planning.ts +0 -122
  489. package/src/components/chart/stock-chart/rendering/projection.test.tsx +0 -98
  490. package/src/components/chart/stock-chart/rendering/projection.ts +0 -112
  491. package/src/components/chart/stock-chart/rendering/state.test.ts +0 -70
  492. package/src/components/chart/stock-chart/rendering/state.ts +0 -283
  493. package/src/components/chart/stock-chart/requests.ts +0 -337
  494. package/src/components/chart/stock-chart/resolution-support.ts +0 -96
  495. package/src/components/chart/stock-chart/resolved/runtime.ts +0 -289
  496. package/src/components/chart/stock-chart/resolved.tsx +0 -359
  497. package/src/components/chart/stock-chart/settings.ts +0 -81
  498. package/src/components/chart/stock-chart/surface-runtime.ts +0 -62
  499. package/src/components/chart/stock-chart/types.ts +0 -25
  500. package/src/components/chart/stock-chart/view.tsx +0 -155
  501. package/src/components/chart/stock-chart/viewport/effects.ts +0 -293
  502. package/src/components/chart/stock-chart/viewport/index.ts +0 -144
  503. package/src/components/chart/stock-chart/viewport/runtime.ts +0 -375
  504. package/src/components/chart/time-axis-label.tsx +0 -175
  505. package/src/plugins/builtin/ai/gloomberb-cli.ts +0 -71
  506. package/src/plugins/builtin/ai/screener/action-bar.tsx +0 -58
  507. package/src/plugins/builtin/comparison-chart/index.test.tsx +0 -848
  508. package/src/plugins/builtin/comparison-chart/index.tsx +0 -194
  509. package/src/plugins/builtin/econ/fred-cache.ts +0 -106
  510. package/src/plugins/builtin/plugin-groups.ts +0 -130
  511. package/src/plugins/builtin/ticker-detail/chart-pane.tsx +0 -91
  512. package/src/plugins/builtin/ticker-detail/chart-tab.tsx +0 -100
  513. package/src/plugins/builtin/ticker-detail/data-panes/fundamental-graph/content.tsx +0 -296
  514. package/src/plugins/builtin/ticker-detail/data-panes/fundamental-graph/data.ts +0 -62
  515. package/src/plugins/builtin/ticker-detail/data-panes/fundamental-graph/model.ts +0 -608
  516. package/src/plugins/builtin/ticker-detail/data-panes/fundamental-graph/settings.ts +0 -65
  517. package/src/plugins/builtin/ticker-detail/data-panes/fundamental-graph/types.ts +0 -58
  518. package/src/plugins/builtin/ticker-detail/data-panes/fundamental-graph.tsx +0 -138
  519. package/src/plugins/builtin/ticker-detail/data-panes.test.ts +0 -220
@@ -1,5 +1,5 @@
1
1
  diff --git a/index-218h9p3f.js b/index-218h9p3f.js
2
- index b9445d2cca9477dfe06026da451b6d19268fcbdd..da790c31da185325405227329dad2ac12f5329e7 100644
2
+ index b9445d2cca9477dfe06026da451b6d19268fcbdd..8734376ebd706056791f8b59ad0992ac6c440d3c 100644
3
3
  --- a/index-218h9p3f.js
4
4
  +++ b/index-218h9p3f.js
5
5
  @@ -6487,17 +6487,27 @@ class MouseParser {
@@ -166,51 +166,8 @@ index b9445d2cca9477dfe06026da451b6d19268fcbdd..da790c31da185325405227329dad2ac1
166
166
  this.events.push({
167
167
  type: "mouse",
168
168
  raw: decodeLatin1(rawBytes),
169
- @@ -12538,34 +12572,35 @@ function validateLinuxLibcOverride() {
170
- throw new Error(`OPENTUI_LIBC must be "glibc" or "musl", got "${libc}"`);
171
- }
172
- async function resolveNativePackage() {
173
- + const loadNativePackage = async (packageName) => await import(packageName);
174
- if (process.platform === "darwin") {
175
- if (process.arch === "x64")
176
- - return await import("@opentui/core-darwin-x64");
177
- + return await loadNativePackage("@opentui/core-darwin-x64");
178
- if (process.arch === "arm64")
179
- - return await import("@opentui/core-darwin-arm64");
180
- + return await loadNativePackage("@opentui/core-darwin-arm64");
181
- }
182
- if (process.platform === "linux") {
183
- validateLinuxLibcOverride();
184
- if (process.arch === "x64") {
185
- if (process.env.OPENTUI_LIBC === "musl") {
186
- - return await import("@opentui/core-linux-x64-musl");
187
- + return await loadNativePackage("@opentui/core-linux-x64-musl");
188
- } else {
189
- - return await import("@opentui/core-linux-x64");
190
- + return await loadNativePackage("@opentui/core-linux-x64");
191
- }
192
- }
193
- if (process.arch === "arm64") {
194
- if (process.env.OPENTUI_LIBC === "musl") {
195
- - return await import("@opentui/core-linux-arm64-musl");
196
- + return await loadNativePackage("@opentui/core-linux-arm64-musl");
197
- } else {
198
- - return await import("@opentui/core-linux-arm64");
199
- + return await loadNativePackage("@opentui/core-linux-arm64");
200
- }
201
- }
202
- }
203
- if (process.platform === "win32") {
204
- if (process.arch === "x64")
205
- - return await import("@opentui/core-win32-x64");
206
- + return await loadNativePackage("@opentui/core-win32-x64");
207
- if (process.arch === "arm64")
208
- - return await import("@opentui/core-win32-arm64");
209
- + return await loadNativePackage("@opentui/core-win32-arm64");
210
- }
211
- throw new Error(`opentui is not supported on the current platform: ${process.platform}-${process.arch}`);
212
- }
213
- @@ -17996,5 +18031,7 @@ function isGapType(value) {
169
+ @@ -17995,6 +18029,8 @@ function isGapType(value) {
170
+
214
171
  class BoxRenderable extends Renderable {
215
172
  _backgroundColor;
216
173
  + _hoverBackgroundColor;
@@ -218,7 +175,7 @@ index b9445d2cca9477dfe06026da451b6d19268fcbdd..da790c31da185325405227329dad2ac1
218
175
  _border;
219
176
  _borderStyle;
220
177
  _borderColor;
221
- @@ -18023,6 +18060,7 @@ class BoxRenderable extends Renderable {
178
+ @@ -18023,6 +18059,7 @@ class BoxRenderable extends Renderable {
222
179
  this._focusable = true;
223
180
  }
224
181
  this._backgroundColor = parseColor(options.backgroundColor || this._defaultOptions.backgroundColor);
@@ -226,7 +183,7 @@ index b9445d2cca9477dfe06026da451b6d19268fcbdd..da790c31da185325405227329dad2ac1
226
183
  this._border = options.border ?? this._defaultOptions.border;
227
184
  if (!options.border && (options.borderStyle || options.borderColor || options.focusedBorderColor || options.customBorderChars)) {
228
185
  this._border = true;
229
- @@ -18064,11 +18102,26 @@ class BoxRenderable extends Renderable {
186
+ @@ -18064,11 +18101,26 @@ class BoxRenderable extends Renderable {
230
187
  }
231
188
  set backgroundColor(value) {
232
189
  const newColor = parseColor(value ?? this._defaultOptions.backgroundColor);
@@ -254,7 +211,7 @@ index b9445d2cca9477dfe06026da451b6d19268fcbdd..da790c31da185325405227329dad2ac1
254
211
  get border() {
255
212
  return this._border;
256
213
  }
257
- @@ -18152,9 +18205,39 @@ class BoxRenderable extends Renderable {
214
+ @@ -18152,9 +18204,39 @@ class BoxRenderable extends Renderable {
258
215
  this.requestRender();
259
216
  }
260
217
  }
@@ -295,7 +252,7 @@ index b9445d2cca9477dfe06026da451b6d19268fcbdd..da790c31da185325405227329dad2ac1
295
252
  if (!hasBorder && !hasVisibleFill) {
296
253
  return;
297
254
  }
298
- @@ -18171,7 +18254,7 @@ class BoxRenderable extends Renderable {
255
+ @@ -18171,7 +18253,7 @@ class BoxRenderable extends Renderable {
299
256
  customBorderChars: this._customBorderChars,
300
257
  border: this._border,
301
258
  borderColor: currentBorderColor,
@@ -304,7 +261,7 @@ index b9445d2cca9477dfe06026da451b6d19268fcbdd..da790c31da185325405227329dad2ac1
304
261
  shouldFill: this.shouldFill,
305
262
  title: this._title,
306
263
  titleAlignment: this._titleAlignment,
307
- @@ -22288,6 +22371,8 @@ class MouseEvent {
264
+ @@ -22288,6 +22370,8 @@ class MouseEvent {
308
265
  button;
309
266
  x;
310
267
  y;
@@ -313,7 +270,7 @@ index b9445d2cca9477dfe06026da451b6d19268fcbdd..da790c31da185325405227329dad2ac1
313
270
  source;
314
271
  modifiers;
315
272
  scroll;
316
- @@ -22307,6 +22392,8 @@ class MouseEvent {
273
+ @@ -22307,6 +22391,8 @@ class MouseEvent {
317
274
  this.button = attributes.button;
318
275
  this.x = attributes.x;
319
276
  this.y = attributes.y;
@@ -322,7 +279,7 @@ index b9445d2cca9477dfe06026da451b6d19268fcbdd..da790c31da185325405227329dad2ac1
322
279
  this.modifiers = attributes.modifiers;
323
280
  this.scroll = attributes.scroll;
324
281
  this.source = attributes.source;
325
- @@ -22457,6 +22544,10 @@ class CliRenderer extends EventEmitter9 {
282
+ @@ -22457,6 +22543,10 @@ class CliRenderer extends EventEmitter9 {
326
283
  resizeDebounceDelay = 100;
327
284
  enableMouseMovement = false;
328
285
  _useMouse = true;
@@ -333,7 +290,7 @@ index b9445d2cca9477dfe06026da451b6d19268fcbdd..da790c31da185325405227329dad2ac1
333
290
  autoFocus = true;
334
291
  _screenMode = "alternate-screen";
335
292
  _footerHeight = DEFAULT_FOOTER_HEIGHT;
336
- @@ -22491,7 +22582,7 @@ class CliRenderer extends EventEmitter9 {
293
+ @@ -22491,7 +22581,7 @@ class CliRenderer extends EventEmitter9 {
337
294
  this.handleResize(width, height);
338
295
  }).bind(this);
339
296
  _capabilities = null;
@@ -342,7 +299,7 @@ index b9445d2cca9477dfe06026da451b6d19268fcbdd..da790c31da185325405227329dad2ac1
342
299
  _hasPointer = false;
343
300
  _lastPointerModifiers = {
344
301
  shift: false,
345
- @@ -22738,7 +22829,13 @@ Captured external output:
302
+ @@ -22738,7 +22828,13 @@ Captured external output:
346
303
  privateCapabilityRepliesActive: false,
347
304
  pixelResolutionQueryActive: false,
348
305
  explicitWidthCprActive: false,
@@ -357,7 +314,7 @@ index b9445d2cca9477dfe06026da451b6d19268fcbdd..da790c31da185325405227329dad2ac1
357
314
  },
358
315
  clock: this.clock
359
316
  });
360
- @@ -24021,12 +24118,14 @@ Captured external output:
317
+ @@ -24021,12 +24117,14 @@ Captured external output:
361
318
  enableMouse() {
362
319
  this._useMouse = true;
363
320
  this.lib.enableMouse(this.rendererPtr, this.enableMouseMovement);
@@ -372,7 +329,7 @@ index b9445d2cca9477dfe06026da451b6d19268fcbdd..da790c31da185325405227329dad2ac1
372
329
  }
373
330
  enableKittyKeyboard(flags = 3) {
374
331
  this.lib.enableKittyKeyboard(this.rendererPtr, flags);
375
- @@ -24036,6 +24135,52 @@ Captured external output:
332
+ @@ -24036,6 +24134,52 @@ Captured external output:
376
333
  this.lib.disableKittyKeyboard(this.rendererPtr);
377
334
  this.updateStdinParserProtocolContext({ kittyKeyboardEnabled: false }, true);
378
335
  }
@@ -425,7 +382,7 @@ index b9445d2cca9477dfe06026da451b6d19268fcbdd..da790c31da185325405227329dad2ac1
425
382
  set useThread(useThread) {
426
383
  this._useThread = useThread;
427
384
  this.lib.setUseThread(this.rendererPtr, useThread);
428
- @@ -24141,6 +24286,7 @@ Captured external output:
385
+ @@ -24141,6 +24285,7 @@ Captured external output:
429
386
  }
430
387
  this.lib.processCapabilityResponse(this.rendererPtr, sequence);
431
388
  this._capabilities = this.lib.getTerminalCapabilities(this.rendererPtr);
@@ -433,7 +390,7 @@ index b9445d2cca9477dfe06026da451b6d19268fcbdd..da790c31da185325405227329dad2ac1
433
390
  if (this._capabilities?.terminal?.from_xtversion) {
434
391
  this.resolveXtVersionWaiters();
435
392
  }
436
- @@ -24170,6 +24316,7 @@ Captured external output:
393
+ @@ -24170,6 +24315,7 @@ Captured external output:
437
394
  if (sequence === "\x1B[I") {
438
395
  if (this.shouldRestoreModesOnNextFocus) {
439
396
  this.lib.restoreTerminalModes(this.rendererPtr);
@@ -441,7 +398,7 @@ index b9445d2cca9477dfe06026da451b6d19268fcbdd..da790c31da185325405227329dad2ac1
441
398
  this.shouldRestoreModesOnNextFocus = false;
442
399
  }
443
400
  if (this._terminalFocusState !== true) {
444
- @@ -24218,7 +24365,7 @@ Captured external output:
401
+ @@ -24218,7 +24364,7 @@ Captured external output:
445
402
  this._keyHandler.processParsedKey(event.key);
446
403
  return;
447
404
  case "mouse":
@@ -450,7 +407,7 @@ index b9445d2cca9477dfe06026da451b6d19268fcbdd..da790c31da185325405227329dad2ac1
450
407
  return;
451
408
  }
452
409
  this.dispatchSequenceHandlers(event.raw);
453
- @@ -24264,6 +24411,7 @@ Captured external output:
410
+ @@ -24264,6 +24410,7 @@ Captured external output:
454
411
  }
455
412
  this.waitingForPixelResolution = false;
456
413
  this.updateStdinParserProtocolContext({ pixelResolutionQueryActive: false }, true);
@@ -458,7 +415,7 @@ index b9445d2cca9477dfe06026da451b6d19268fcbdd..da790c31da185325405227329dad2ac1
458
415
  return true;
459
416
  }
460
417
  return false;
461
- @@ -24292,15 +24440,62 @@ Captured external output:
418
+ @@ -24292,15 +24439,62 @@ Captured external output:
462
419
  }
463
420
  return event;
464
421
  }
@@ -485,7 +442,7 @@ index b9445d2cca9477dfe06026da451b6d19268fcbdd..da790c31da185325405227329dad2ac1
485
442
  + if (this._pendingMouseMoveTimer !== null || this._isDestroyed) {
486
443
  + return;
487
444
  + }
488
- + const delay = Math.max(100, Math.floor(this.targetFrameTime));
445
+ + const delay = Math.max(8, Math.floor(this.minTargetFrameTime));
489
446
  + this._pendingMouseMoveTimer = this.clock.setTimeout(() => {
490
447
  + this._pendingMouseMoveTimer = null;
491
448
  + this.flushPendingMouseMove();
@@ -521,7 +478,7 @@ index b9445d2cca9477dfe06026da451b6d19268fcbdd..da790c31da185325405227329dad2ac1
521
478
  this._hasPointer = true;
522
479
  this._lastPointerModifiers = mouseEvent.modifiers;
523
480
  if (this._console.visible) {
524
- @@ -24437,6 +24632,8 @@ Captured external output:
481
+ @@ -24437,6 +24631,8 @@ Captured external output:
525
482
  return;
526
483
  }
527
484
  const baseEvent = {
@@ -530,7 +487,7 @@ index b9445d2cca9477dfe06026da451b6d19268fcbdd..da790c31da185325405227329dad2ac1
530
487
  type: "move",
531
488
  button: 0,
532
489
  x: this._latestPointer.x,
533
- @@ -24527,6 +24724,7 @@ Captured external output:
490
+ @@ -24527,6 +24723,7 @@ Captured external output:
534
491
  const pendingSplitFooterTransition = this.pendingSplitFooterTransition;
535
492
  const previousGeometry = calculateRenderGeometry(this._screenMode, this._terminalWidth, this._terminalHeight, this._footerHeight);
536
493
  const prevWidth = this._terminalWidth;
@@ -538,7 +495,7 @@ index b9445d2cca9477dfe06026da451b6d19268fcbdd..da790c31da185325405227329dad2ac1
538
495
  const previousTerminalHeight = this._terminalHeight;
539
496
  const visiblePreviousSplitHeight = pendingSplitFooterTransition?.sourceHeight ?? previousGeometry.effectiveFooterHeight;
540
497
  this._terminalWidth = width;
541
- @@ -24832,6 +25030,11 @@ Captured external output:
498
+ @@ -24832,6 +25029,11 @@ Captured external output:
542
499
  this.clock.clearTimeout(this.resizeTimeoutId);
543
500
  this.resizeTimeoutId = null;
544
501
  }
@@ -550,14 +507,14 @@ index b9445d2cca9477dfe06026da451b6d19268fcbdd..da790c31da185325405227329dad2ac1
550
507
  if (this.capabilityTimeoutId !== null) {
551
508
  this.clock.clearTimeout(this.capabilityTimeoutId);
552
509
  this.capabilityTimeoutId = null;
553
- @@ -24847,6 +25050,7 @@ Captured external output:
554
- this.renderTimeout = null;
510
+ @@ -24847,6 +25049,7 @@ Captured external output:
555
511
  }
556
512
  this.themeModeState.cancelRefresh();
557
- + this.disablePixelMouseMode();
558
513
  this._isRunning = false;
514
+ + this.disablePixelMouseMode();
559
515
  this.waitingForPixelResolution = false;
560
516
  this.updateStdinParserProtocolContext({
517
+ privateCapabilityRepliesActive: false,
561
518
  diff --git a/lib/parse.mouse.d.ts b/lib/parse.mouse.d.ts
562
519
  index c29f953fde0b78f09d2ec7a830e5a72452c1fe7e..04613b921bd9b4a9a7a1a4fbd0234d4012df67a1 100644
563
520
  --- a/lib/parse.mouse.d.ts
@@ -41,6 +41,7 @@ export class CloudAuthApi {
41
41
  syncEnabled: user.syncEnabled === false ? false : true,
42
42
  weeklyRoundupEnabled: user.weeklyRoundupEnabled === false ? false : true,
43
43
  positionAlertsEnabled: user.positionAlertsEnabled === false ? false : true,
44
+ chatEmailNotificationsEnabled: user.chatEmailNotificationsEnabled === false ? false : true,
44
45
  lastSyncAt: typeof user.lastSyncAt === "string" ? user.lastSyncAt : null,
45
46
  lastRoundupEmailAt: typeof user.lastRoundupEmailAt === "string" ? user.lastRoundupEmailAt : null,
46
47
  createdAt: typeof user.createdAt === "string" ? user.createdAt : "",
@@ -153,6 +154,7 @@ export class CloudAuthApi {
153
154
  xAccount: profile.xAccount,
154
155
  sharedPortfolioId: profile.sharedPortfolioId,
155
156
  acceptUnknownDms: profile.acceptUnknownDms,
157
+ chatEmailNotificationsEnabled: profile.chatEmailNotificationsEnabled,
156
158
  portfolioAnalytics: profile.portfolioAnalytics,
157
159
  syncEnabled: profile.syncEnabled,
158
160
  weeklyRoundupEnabled: profile.weeklyRoundupEnabled,
@@ -587,6 +587,7 @@ describe("apiClient account profile", () => {
587
587
  xAccount: "vincelwt",
588
588
  sharedPortfolioId: "main",
589
589
  acceptUnknownDms: true,
590
+ chatEmailNotificationsEnabled: false,
590
591
  updatedAt: "2026-04-01T00:00:00.000Z",
591
592
  },
592
593
  });
@@ -598,6 +599,7 @@ describe("apiClient account profile", () => {
598
599
  profilePublic: true,
599
600
  sharedPortfolioId: "main",
600
601
  acceptUnknownDms: true,
602
+ chatEmailNotificationsEnabled: false,
601
603
  });
602
604
 
603
605
  expect(new URL(requestedUrl).pathname).toBe("/account/profile");
@@ -607,10 +609,12 @@ describe("apiClient account profile", () => {
607
609
  profilePublic: true,
608
610
  sharedPortfolioId: "main",
609
611
  acceptUnknownDms: true,
612
+ chatEmailNotificationsEnabled: false,
610
613
  });
611
614
  expect(profile.username).toBe("renamed");
612
615
  expect(apiClient.getCurrentUser()?.username).toBe("renamed");
613
616
  expect(apiClient.getCurrentUser()?.plan).toBe("pro");
617
+ expect(apiClient.getCurrentUser()?.chatEmailNotificationsEnabled).toBe(false);
614
618
  });
615
619
 
616
620
  test("changes password through Better Auth", async () => {
@@ -83,6 +83,7 @@ export interface AuthUser {
83
83
  xAccount?: string | null;
84
84
  sharedPortfolioId?: string | null;
85
85
  acceptUnknownDms?: boolean;
86
+ chatEmailNotificationsEnabled?: boolean;
86
87
  portfolioAnalytics?: PublicPortfolioAnalytics | null;
87
88
  syncEnabled?: boolean;
88
89
  weeklyRoundupEnabled?: boolean;
@@ -110,6 +111,7 @@ export interface AccountProfile {
110
111
  xAccount: string | null;
111
112
  sharedPortfolioId: string | null;
112
113
  acceptUnknownDms: boolean;
114
+ chatEmailNotificationsEnabled: boolean;
113
115
  portfolioAnalytics?: PublicPortfolioAnalytics | null;
114
116
  syncEnabled: boolean;
115
117
  weeklyRoundupEnabled: boolean;
@@ -168,6 +170,7 @@ export type AccountProfileUpdate = Partial<{
168
170
  xAccount: string | null;
169
171
  sharedPortfolioId: string | null;
170
172
  acceptUnknownDms: boolean;
173
+ chatEmailNotificationsEnabled: boolean;
171
174
  portfolioAnalytics: PublicPortfolioAnalytics | null;
172
175
  syncEnabled: boolean;
173
176
  weeklyRoundupEnabled: boolean;
@@ -52,6 +52,7 @@ export function useAppPaneSettingsRuntime({
52
52
  };
53
53
 
54
54
  await dialog.alert({
55
+ closeOnClickOutside: true,
55
56
  content: (ctx: AlertContext) => (
56
57
  <PaneSettingsDialogContent
57
58
  {...ctx}
@@ -0,0 +1,36 @@
1
+ import { expect, test } from "bun:test";
2
+ import type { ReactElement } from "react";
3
+ import { runPaneTemplateDialogWizard } from "./pane-template-dialog-wizard";
4
+
5
+ test("changing a sequential wizard selector clears a later default", async () => {
6
+ const defaults: Array<string | undefined> = [];
7
+ const answers = ["codex", ""];
8
+ const dialog = {
9
+ prompt: async ({ content }: { content: (context: unknown) => ReactElement }) => {
10
+ const element = content({});
11
+ defaults.push((element.props as { step?: { defaultValue?: string } }).step?.defaultValue);
12
+ return answers.shift();
13
+ },
14
+ };
15
+
16
+ const values = await runPaneTemplateDialogWizard(dialog as never, [{
17
+ key: "providerId",
18
+ label: "Provider",
19
+ type: "select",
20
+ defaultValue: "claude",
21
+ clearOnChange: ["modelId"],
22
+ options: [
23
+ { label: "Claude", value: "claude" },
24
+ { label: "OpenAI", value: "codex" },
25
+ ],
26
+ }, {
27
+ key: "modelId",
28
+ label: "Model",
29
+ type: "text",
30
+ required: false,
31
+ defaultValue: "claude-opus-4-8",
32
+ }]);
33
+
34
+ expect(defaults).toEqual(["claude", undefined]);
35
+ expect(values).toEqual({ providerId: "codex", modelId: "" });
36
+ });
@@ -16,6 +16,7 @@ export async function runPaneTemplateDialogWizard(
16
16
  steps: WizardStep[],
17
17
  ): Promise<Record<string, string> | null> {
18
18
  const values: Record<string, string> = {};
19
+ const clearedKeys = new Set<string>();
19
20
 
20
21
  for (const step of steps) {
21
22
  if (step.dependsOn && values[step.dependsOn.key] !== step.dependsOn.value) {
@@ -29,16 +30,19 @@ export async function runPaneTemplateDialogWizard(
29
30
  continue;
30
31
  }
31
32
 
33
+ const activeStep = clearedKeys.has(step.key)
34
+ ? { ...step, defaultValue: undefined }
35
+ : step;
32
36
  const result = step.type === "select"
33
37
  ? await dialog.prompt<string>({
34
- content: (ctx: PromptContext<string>) => <PaneTemplateSelectStep {...ctx} step={step} />,
38
+ content: (ctx: PromptContext<string>) => <PaneTemplateSelectStep {...ctx} step={activeStep} />,
35
39
  })
36
40
  : step.type === "textarea"
37
41
  ? await dialog.prompt<string>({
38
- content: (ctx: PromptContext<string>) => <PaneTemplateTextareaStep {...ctx} step={step} />,
42
+ content: (ctx: PromptContext<string>) => <PaneTemplateTextareaStep {...ctx} step={activeStep} />,
39
43
  })
40
44
  : await dialog.prompt<string>({
41
- content: (ctx: PromptContext<string>) => <PaneTemplateInputStep {...ctx} step={step} />,
45
+ content: (ctx: PromptContext<string>) => <PaneTemplateInputStep {...ctx} step={activeStep} />,
42
46
  });
43
47
 
44
48
  if (result === undefined || ((step.type === "select" || step.type === "textarea") && !result)) {
@@ -46,6 +50,9 @@ export async function runPaneTemplateDialogWizard(
46
50
  }
47
51
 
48
52
  values[step.key] = result;
53
+ if (!Object.is(result, step.defaultValue ?? "")) {
54
+ for (const key of step.clearOnChange ?? []) clearedKeys.add(key);
55
+ }
49
56
  }
50
57
 
51
58
  return values;
@@ -54,8 +54,15 @@ describe("desktop deeplinks", () => {
54
54
  expect(resolveDesktopDeepLinkAction("gloomberb://chat/channel/everyone")).toEqual({
55
55
  type: "open-chat-channel",
56
56
  channelId: "everyone",
57
+ messageId: null,
57
58
  message: "Opened chat everyone.",
58
59
  });
60
+ expect(resolveDesktopDeepLinkAction("gloomberb://chat/channel/dm%3Aabc?message=m%3A2")).toEqual({
61
+ type: "open-chat-channel",
62
+ channelId: "dm:abc",
63
+ messageId: "m:2",
64
+ message: "Opened chat dm:abc.",
65
+ });
59
66
  expect(resolveDesktopDeepLinkAction("gloomberb://chat/dm?users=@vince,@alex")).toEqual({
60
67
  type: "open-chat-dm",
61
68
  participants: "@vince,@alex",
@@ -63,6 +70,14 @@ describe("desktop deeplinks", () => {
63
70
  });
64
71
  });
65
72
 
73
+ test("routes email preference links to account management", () => {
74
+ expect(resolveDesktopDeepLinkAction("gloomberb://cloud/emails")).toEqual({
75
+ type: "open-account-management",
76
+ route: { kind: "cloud-emails", week: null },
77
+ message: "Opened email settings.",
78
+ });
79
+ });
80
+
66
81
  test("routes news links", () => {
67
82
  expect(resolveDesktopDeepLinkAction("gloomberb://news?ticker=7203.T")).toEqual({
68
83
  type: "open-news",
@@ -9,9 +9,10 @@ import {
9
9
  } from "../../types/config";
10
10
  import type { DesktopDeepLinkBridge } from "../../types/desktop-deeplink";
11
11
  import type { DesktopWindowBridge } from "../../types/desktop-window";
12
+ import { requestAccountManagementTab } from "../../plugins/builtin/account-management/navigation";
12
13
 
13
14
  type CloudDeepLinkRoute = {
14
- kind: "cloud-alerts" | "cloud-roundup";
15
+ kind: "cloud-alerts" | "cloud-emails" | "cloud-roundup";
15
16
  week: string | null;
16
17
  };
17
18
 
@@ -28,7 +29,7 @@ export type DesktopDeepLinkAction =
28
29
  values: { symbol: string; condition: AlertDeepLinkCondition; price: string };
29
30
  message: string;
30
31
  }
31
- | { type: "open-chat-channel"; channelId: string; message: string }
32
+ | { type: "open-chat-channel"; channelId: string; messageId: string | null; message: string }
32
33
  | { type: "open-chat-dm"; participants: string; message: string }
33
34
  | { type: "open-news"; kind: NewsDeepLinkKind; symbol: string | null; message: string }
34
35
  | { type: "unsupported"; message: string };
@@ -151,6 +152,13 @@ function parseCloudDeepLink(parsed: ParsedGloomUrl): DesktopDeepLinkAction {
151
152
  message: `Opened portfolio alert settings${weekSuffix(week)}.`,
152
153
  };
153
154
  }
155
+ if (route === "emails") {
156
+ return {
157
+ type: "open-account-management",
158
+ route: { kind: "cloud-emails", week: null },
159
+ message: "Opened email settings.",
160
+ };
161
+ }
154
162
  return { type: "unsupported", message: "Unsupported Gloomberb cloud link." };
155
163
  }
156
164
 
@@ -194,7 +202,8 @@ function parseChatDeepLink(parsed: ParsedGloomUrl): DesktopDeepLinkAction {
194
202
  if (route === "channel") {
195
203
  const channelId = parsed.segments[1] ?? param(parsed.url, "id", "channel");
196
204
  if (!channelId) return { type: "unsupported", message: "Chat channel links need a channel id." };
197
- return { type: "open-chat-channel", channelId, message: `Opened chat ${channelId}.` };
205
+ const messageId = param(parsed.url, "message", "messageId");
206
+ return { type: "open-chat-channel", channelId, messageId, message: `Opened chat ${channelId}.` };
198
207
  }
199
208
  if (route === "dm") {
200
209
  const participants = param(parsed.url, "users", "participants", "user") ?? parsed.segments.slice(1).join(",");
@@ -202,9 +211,9 @@ function parseChatDeepLink(parsed: ParsedGloomUrl): DesktopDeepLinkAction {
202
211
  return { type: "open-chat-dm", participants, message: "Opened DM." };
203
212
  }
204
213
  if (route === "default") {
205
- return { type: "open-chat-channel", channelId: "", message: "Opened chat." };
214
+ return { type: "open-chat-channel", channelId: "", messageId: null, message: "Opened chat." };
206
215
  }
207
- return { type: "open-chat-channel", channelId: route, message: `Opened chat ${route}.` };
216
+ return { type: "open-chat-channel", channelId: route, messageId: null, message: `Opened chat ${route}.` };
208
217
  }
209
218
 
210
219
  function parseNewsDeepLink(parsed: ParsedGloomUrl): DesktopDeepLinkAction {
@@ -389,7 +398,12 @@ function handleOpenChatChannel(
389
398
  notifyError(pluginRegistry, "Chat is unavailable.");
390
399
  return;
391
400
  }
392
- const options = action.channelId ? { arg: action.channelId } : undefined;
401
+ const options = action.channelId
402
+ ? {
403
+ arg: action.channelId,
404
+ ...(action.messageId ? { values: { messageId: action.messageId } } : {}),
405
+ }
406
+ : undefined;
393
407
  void pluginRegistry.createPaneFromTemplateAsyncFn("new-chat-pane", options).then(() => {
394
408
  notifySuccess(pluginRegistry, action.message);
395
409
  }).catch((error) => {
@@ -450,6 +464,7 @@ export function handleDesktopDeepLink(rawUrl: string, options: DesktopDeepLinkHa
450
464
  switch (action.type) {
451
465
  case "open-account-management":
452
466
  if (!requirePane(options.pluginRegistry, "account-management", "Account management is unavailable.")) return;
467
+ if (action.route.kind === "cloud-emails") requestAccountManagementTab("emails");
453
468
  options.pluginRegistry.showPane("account-management");
454
469
  notifySuccess(options.pluginRegistry, action.message);
455
470
  return;
package/src/app.tsx CHANGED
@@ -32,6 +32,7 @@ import type { AppSessionSnapshot } from "./core/state/session-persistence";
32
32
  import type { MarketDataCoordinator } from "./market-data/coordinator";
33
33
  import { createAppNotifier } from "./notifications/app-notifier";
34
34
  import { createAppServices } from "./core/app-services";
35
+ import { getLoadablePlugins } from "./plugins/catalog";
35
36
  import { useBrokerImportRuntime } from "./app/runtime/broker-import";
36
37
  import { useDesktopDeepLinkRuntime } from "./app/runtime/desktop-deeplink";
37
38
  import { useDesktopApplicationMenuRuntime } from "./app/runtime/desktop-menu";
@@ -268,6 +269,7 @@ function AppInner({
268
269
 
269
270
  useCloudSyncRuntime({
270
271
  state,
272
+ getState: getRemoteState,
271
273
  dispatch,
272
274
  tickerRepository,
273
275
  pluginRegistry,
@@ -330,14 +332,15 @@ function AppInner({
330
332
  getState={getRemoteState}
331
333
  pluginRegistry={pluginRegistry}
332
334
  desktopWindowBridge={desktopWindowBridge}
333
- />
334
- <ThemedAppRoot>
335
- <DetachedPaneShell
336
- pluginRegistry={pluginRegistry}
337
- desktopWindowBridge={{ ...desktopWindowBridge, kind: "detached", paneId: desktopWindowBridge.paneId }}
338
- />
339
- <ToastViewport position="bottom-right" />
340
- </ThemedAppRoot>
335
+ >
336
+ <ThemedAppRoot>
337
+ <DetachedPaneShell
338
+ pluginRegistry={pluginRegistry}
339
+ desktopWindowBridge={{ ...desktopWindowBridge, kind: "detached", paneId: desktopWindowBridge.paneId }}
340
+ />
341
+ <ToastViewport position="bottom-right" />
342
+ </ThemedAppRoot>
343
+ </RemoteControlHost>
341
344
  </ContextMenuProvider>
342
345
  );
343
346
  }
@@ -350,30 +353,31 @@ function AppInner({
350
353
  getState={getRemoteState}
351
354
  pluginRegistry={pluginRegistry}
352
355
  desktopWindowBridge={desktopWindowBridge}
353
- />
354
- <ThemedAppRoot>
355
- <Header />
356
- <TransientLayoutProvider>
357
- <Shell
358
- pluginRegistry={pluginRegistry}
359
- desktopWindowBridge={desktopWindowBridge}
360
- desktopDockPreview={desktopDockPreview}
361
- commandBarNativeOccluder={commandBarNativeOccluder}
362
- />
363
- <StatusBar />
364
- </TransientLayoutProvider>
365
- {state.commandBarOpen && (
366
- <CommandBar
367
- dataProvider={dataProvider}
368
- tickerRepository={tickerRepository}
369
- pluginRegistry={pluginRegistry}
370
- quitApp={() => rendererHost.requestExit()}
371
- onCheckForUpdates={() => runUpdateCheck(true)}
372
- onNativeOccluderChange={setCommandBarNativeOccluder}
373
- />
374
- )}
375
- <ToastViewport position="bottom-right" />
376
- </ThemedAppRoot>
356
+ >
357
+ <ThemedAppRoot>
358
+ <Header />
359
+ <TransientLayoutProvider>
360
+ <Shell
361
+ pluginRegistry={pluginRegistry}
362
+ desktopWindowBridge={desktopWindowBridge}
363
+ desktopDockPreview={desktopDockPreview}
364
+ commandBarNativeOccluder={commandBarNativeOccluder}
365
+ />
366
+ <StatusBar />
367
+ </TransientLayoutProvider>
368
+ {state.commandBarOpen && (
369
+ <CommandBar
370
+ dataProvider={dataProvider}
371
+ tickerRepository={tickerRepository}
372
+ pluginRegistry={pluginRegistry}
373
+ quitApp={() => rendererHost.requestExit()}
374
+ onCheckForUpdates={() => runUpdateCheck(true)}
375
+ onNativeOccluderChange={setCommandBarNativeOccluder}
376
+ />
377
+ )}
378
+ <ToastViewport position="bottom-right" />
379
+ </ThemedAppRoot>
380
+ </RemoteControlHost>
377
381
  </ContextMenuProvider>
378
382
  );
379
383
  }
@@ -428,7 +432,10 @@ export function App({
428
432
 
429
433
  const services = useMemo(() => {
430
434
  return measurePerf("startup.app.create-services", () => (
431
- createAppServices({ config, externalPlugins })
435
+ createAppServices({
436
+ config,
437
+ plugins: getLoadablePlugins(externalPlugins),
438
+ })
432
439
  ), {
433
440
  externalPluginCount: externalPlugins.length,
434
441
  disabledPluginCount: config.disabledPlugins.length,
@@ -1,6 +1,8 @@
1
1
  import type { BrokerConnectionStatus } from "../types/broker";
2
2
  import type { QuoteSubscriptionTarget } from "../types/data-provider";
3
3
  import type { Quote } from "../types/financials";
4
+ import type { AiAuthProgressEvent } from "../plugins/builtin/ai/runner";
5
+ import type { AiAgentHistoryMessage } from "../plugins/builtin/ai/agent-history";
4
6
 
5
7
  export const BROKER_CAPABILITY_ID = "broker.core";
6
8
  export const NOTES_FILES_CAPABILITY_ID = "notes.files";
@@ -22,6 +24,9 @@ export type BrokerRemoteEvent = BrokerStatusEvent | BrokerQuoteEvent;
22
24
 
23
25
  export type AiRunnerEvent =
24
26
  | { kind: "chunk"; output: string }
25
- | { kind: "done"; output: string }
27
+ | { kind: "done"; output: string; agentMessages?: AiAgentHistoryMessage[] }
26
28
  | { kind: "cancelled" }
27
- | { kind: "error"; error: string };
29
+ | { kind: "error"; error: string }
30
+ | { kind: "account-auth"; event: AiAuthProgressEvent }
31
+ | { kind: "account-connected"; catalog: unknown }
32
+ | { kind: "account-error"; error: string };