gloomberb 0.9.10 → 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 (516) 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 +39 -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 +67 -0
  368. package/src/sync/core-contributors.test.ts +121 -0
  369. package/src/sync/core-contributors.ts +67 -14
  370. package/src/time-series/alignment.ts +158 -0
  371. package/src/time-series/economic.ts +49 -0
  372. package/src/time-series/field-catalog.ts +306 -0
  373. package/src/time-series/fundamentals.test.ts +505 -0
  374. package/src/time-series/fundamentals.ts +842 -0
  375. package/src/time-series/hooks.ts +45 -0
  376. package/src/time-series/index.ts +14 -0
  377. package/src/time-series/live-quotes.test.ts +219 -0
  378. package/src/time-series/live-quotes.ts +203 -0
  379. package/src/time-series/market-resolution.ts +53 -0
  380. package/src/time-series/market.ts +125 -0
  381. package/src/time-series/reporting.ts +98 -0
  382. package/src/time-series/resolve.test.ts +1281 -0
  383. package/src/time-series/resolve.ts +783 -0
  384. package/src/time-series/spec-studies.test.ts +400 -0
  385. package/src/time-series/spec.ts +487 -0
  386. package/src/time-series/studies.ts +563 -0
  387. package/src/time-series/transforms.test.ts +105 -0
  388. package/src/time-series/transforms.ts +152 -0
  389. package/src/time-series/types.ts +162 -0
  390. package/src/time-series/use-chart-resolution.ts +166 -0
  391. package/src/types/config.ts +9 -11
  392. package/src/types/desktop-window.ts +1 -0
  393. package/src/types/financials.ts +4 -0
  394. package/src/types/media.ts +17 -0
  395. package/src/types/plugin.ts +32 -1
  396. package/src/ui/context-menu.tsx +15 -3
  397. package/src/ui/dialog.tsx +14 -2
  398. package/src/ui/host.tsx +40 -1
  399. package/src/ui/index.tsx +9 -0
  400. package/src/utils/exchanges.test.ts +13 -1
  401. package/src/utils/exchanges.ts +10 -0
  402. package/src/utils/financial-statements.test.ts +138 -0
  403. package/src/utils/financial-statements.ts +115 -8
  404. package/src/utils/format.test.ts +11 -1
  405. package/src/utils/format.ts +7 -0
  406. package/src/version.ts +1 -1
  407. package/src/components/chart/bar-chart-renderer.test.ts +0 -233
  408. package/src/components/chart/bar-chart-renderer.ts +0 -445
  409. package/src/components/chart/comparison/data.test.ts +0 -159
  410. package/src/components/chart/comparison/data.ts +0 -302
  411. package/src/components/chart/comparison/renderer.test.ts +0 -187
  412. package/src/components/chart/comparison/renderer.ts +0 -282
  413. package/src/components/chart/comparison/scene.ts +0 -178
  414. package/src/components/chart/comparison-stock-chart/axis-width.ts +0 -99
  415. package/src/components/chart/comparison-stock-chart/canvas.ts +0 -148
  416. package/src/components/chart/comparison-stock-chart/controls.ts +0 -252
  417. package/src/components/chart/comparison-stock-chart/helpers.ts +0 -101
  418. package/src/components/chart/comparison-stock-chart/interactions.ts +0 -208
  419. package/src/components/chart/comparison-stock-chart/layout-metrics.ts +0 -62
  420. package/src/components/chart/comparison-stock-chart/layout.tsx +0 -155
  421. package/src/components/chart/comparison-stock-chart/legend.tsx +0 -74
  422. package/src/components/chart/comparison-stock-chart/native-surfaces.ts +0 -89
  423. package/src/components/chart/comparison-stock-chart/render-data.ts +0 -227
  424. package/src/components/chart/comparison-stock-chart/render-output.ts +0 -140
  425. package/src/components/chart/comparison-stock-chart/selection-runtime.ts +0 -128
  426. package/src/components/chart/comparison-stock-chart/sources.ts +0 -51
  427. package/src/components/chart/comparison-stock-chart/surface-runtime.ts +0 -159
  428. package/src/components/chart/comparison-stock-chart/toolbar.tsx +0 -117
  429. package/src/components/chart/comparison-stock-chart/types.ts +0 -22
  430. package/src/components/chart/comparison-stock-chart/view.tsx +0 -572
  431. package/src/components/chart/comparison-stock-chart/viewport-runtime.ts +0 -239
  432. package/src/components/chart/comparison-stock-chart.tsx +0 -24
  433. package/src/components/chart/core/axis-measure.ts +0 -33
  434. package/src/components/chart/core/controller.test.ts +0 -157
  435. package/src/components/chart/core/controller.ts +0 -349
  436. package/src/components/chart/core/indicator-selector.tsx +0 -75
  437. package/src/components/chart/core/keyboard.ts +0 -24
  438. package/src/components/chart/core/pane-settings.test.ts +0 -52
  439. package/src/components/chart/core/pane-settings.ts +0 -141
  440. package/src/components/chart/core/scroll.test.ts +0 -64
  441. package/src/components/chart/core/scroll.ts +0 -82
  442. package/src/components/chart/core/window-viewport.test.ts +0 -69
  443. package/src/components/chart/core/window-viewport.ts +0 -162
  444. package/src/components/chart/display-cursor.ts +0 -153
  445. package/src/components/chart/indicators/bands.test.ts +0 -36
  446. package/src/components/chart/indicators/bands.ts +0 -29
  447. package/src/components/chart/indicators/moving-averages.test.ts +0 -39
  448. package/src/components/chart/indicators/moving-averages.ts +0 -42
  449. package/src/components/chart/indicators/options.test.ts +0 -32
  450. package/src/components/chart/indicators/options.ts +0 -107
  451. package/src/components/chart/indicators/oscillators.test.ts +0 -58
  452. package/src/components/chart/indicators/oscillators.ts +0 -92
  453. package/src/components/chart/native/canvas-bitmaps.ts +0 -140
  454. package/src/components/chart/native/raster/comparison-chart.ts +0 -162
  455. package/src/components/chart/native/surface/hooks.ts +0 -144
  456. package/src/components/chart/native/surface/rendering.ts +0 -211
  457. package/src/components/chart/static/bar-chart-surface.test.tsx +0 -101
  458. package/src/components/chart/static/bar-chart-surface.tsx +0 -292
  459. package/src/components/chart/stock-chart/auto.ts +0 -216
  460. package/src/components/chart/stock-chart/axis-width.ts +0 -146
  461. package/src/components/chart/stock-chart/bitmaps.ts +0 -22
  462. package/src/components/chart/stock-chart/canvas.ts +0 -202
  463. package/src/components/chart/stock-chart/controls.tsx +0 -149
  464. package/src/components/chart/stock-chart/cursor.ts +0 -60
  465. package/src/components/chart/stock-chart/data-runtime.ts +0 -128
  466. package/src/components/chart/stock-chart/footer.test.ts +0 -65
  467. package/src/components/chart/stock-chart/footer.ts +0 -303
  468. package/src/components/chart/stock-chart/geometry.ts +0 -160
  469. package/src/components/chart/stock-chart/index.test.ts +0 -532
  470. package/src/components/chart/stock-chart/index.tsx +0 -29
  471. package/src/components/chart/stock-chart/indicators.ts +0 -226
  472. package/src/components/chart/stock-chart/interaction-runtime.ts +0 -44
  473. package/src/components/chart/stock-chart/interactions.ts +0 -300
  474. package/src/components/chart/stock-chart/keyboard.ts +0 -373
  475. package/src/components/chart/stock-chart/layout-metrics.ts +0 -62
  476. package/src/components/chart/stock-chart/layout.tsx +0 -177
  477. package/src/components/chart/stock-chart/native-surfaces.ts +0 -121
  478. package/src/components/chart/stock-chart/presentation.ts +0 -67
  479. package/src/components/chart/stock-chart/renderer-switch.test.tsx +0 -263
  480. package/src/components/chart/stock-chart/rendering/bounds.ts +0 -116
  481. package/src/components/chart/stock-chart/rendering/candidates.ts +0 -145
  482. package/src/components/chart/stock-chart/rendering/data.ts +0 -370
  483. package/src/components/chart/stock-chart/rendering/invalidation.ts +0 -68
  484. package/src/components/chart/stock-chart/rendering/output.ts +0 -304
  485. package/src/components/chart/stock-chart/rendering/planning.ts +0 -122
  486. package/src/components/chart/stock-chart/rendering/projection.test.tsx +0 -98
  487. package/src/components/chart/stock-chart/rendering/projection.ts +0 -112
  488. package/src/components/chart/stock-chart/rendering/state.test.ts +0 -70
  489. package/src/components/chart/stock-chart/rendering/state.ts +0 -283
  490. package/src/components/chart/stock-chart/requests.ts +0 -337
  491. package/src/components/chart/stock-chart/resolution-support.ts +0 -96
  492. package/src/components/chart/stock-chart/resolved/runtime.ts +0 -289
  493. package/src/components/chart/stock-chart/resolved.tsx +0 -359
  494. package/src/components/chart/stock-chart/settings.ts +0 -81
  495. package/src/components/chart/stock-chart/surface-runtime.ts +0 -62
  496. package/src/components/chart/stock-chart/types.ts +0 -25
  497. package/src/components/chart/stock-chart/view.tsx +0 -155
  498. package/src/components/chart/stock-chart/viewport/effects.ts +0 -293
  499. package/src/components/chart/stock-chart/viewport/index.ts +0 -144
  500. package/src/components/chart/stock-chart/viewport/runtime.ts +0 -375
  501. package/src/components/chart/time-axis-label.tsx +0 -175
  502. package/src/plugins/builtin/ai/gloomberb-cli.ts +0 -71
  503. package/src/plugins/builtin/ai/screener/action-bar.tsx +0 -58
  504. package/src/plugins/builtin/comparison-chart/index.test.tsx +0 -848
  505. package/src/plugins/builtin/comparison-chart/index.tsx +0 -194
  506. package/src/plugins/builtin/econ/fred-cache.ts +0 -106
  507. package/src/plugins/builtin/plugin-groups.ts +0 -130
  508. package/src/plugins/builtin/ticker-detail/chart-pane.tsx +0 -91
  509. package/src/plugins/builtin/ticker-detail/chart-tab.tsx +0 -100
  510. package/src/plugins/builtin/ticker-detail/data-panes/fundamental-graph/content.tsx +0 -296
  511. package/src/plugins/builtin/ticker-detail/data-panes/fundamental-graph/data.ts +0 -62
  512. package/src/plugins/builtin/ticker-detail/data-panes/fundamental-graph/model.ts +0 -608
  513. package/src/plugins/builtin/ticker-detail/data-panes/fundamental-graph/settings.ts +0 -65
  514. package/src/plugins/builtin/ticker-detail/data-panes/fundamental-graph/types.ts +0 -58
  515. package/src/plugins/builtin/ticker-detail/data-panes/fundamental-graph.tsx +0 -138
  516. 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";
@@ -331,14 +332,15 @@ function AppInner({
331
332
  getState={getRemoteState}
332
333
  pluginRegistry={pluginRegistry}
333
334
  desktopWindowBridge={desktopWindowBridge}
334
- />
335
- <ThemedAppRoot>
336
- <DetachedPaneShell
337
- pluginRegistry={pluginRegistry}
338
- desktopWindowBridge={{ ...desktopWindowBridge, kind: "detached", paneId: desktopWindowBridge.paneId }}
339
- />
340
- <ToastViewport position="bottom-right" />
341
- </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>
342
344
  </ContextMenuProvider>
343
345
  );
344
346
  }
@@ -351,30 +353,31 @@ function AppInner({
351
353
  getState={getRemoteState}
352
354
  pluginRegistry={pluginRegistry}
353
355
  desktopWindowBridge={desktopWindowBridge}
354
- />
355
- <ThemedAppRoot>
356
- <Header />
357
- <TransientLayoutProvider>
358
- <Shell
359
- pluginRegistry={pluginRegistry}
360
- desktopWindowBridge={desktopWindowBridge}
361
- desktopDockPreview={desktopDockPreview}
362
- commandBarNativeOccluder={commandBarNativeOccluder}
363
- />
364
- <StatusBar />
365
- </TransientLayoutProvider>
366
- {state.commandBarOpen && (
367
- <CommandBar
368
- dataProvider={dataProvider}
369
- tickerRepository={tickerRepository}
370
- pluginRegistry={pluginRegistry}
371
- quitApp={() => rendererHost.requestExit()}
372
- onCheckForUpdates={() => runUpdateCheck(true)}
373
- onNativeOccluderChange={setCommandBarNativeOccluder}
374
- />
375
- )}
376
- <ToastViewport position="bottom-right" />
377
- </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>
378
381
  </ContextMenuProvider>
379
382
  );
380
383
  }
@@ -429,7 +432,10 @@ export function App({
429
432
 
430
433
  const services = useMemo(() => {
431
434
  return measurePerf("startup.app.create-services", () => (
432
- createAppServices({ config, externalPlugins })
435
+ createAppServices({
436
+ config,
437
+ plugins: getLoadablePlugins(externalPlugins),
438
+ })
433
439
  ), {
434
440
  externalPluginCount: externalPlugins.length,
435
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 };