gloomberb 0.5.1 → 0.6.1

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 (506) hide show
  1. package/README.md +91 -11
  2. package/package.json +13 -5
  3. package/src/app.tsx +414 -191
  4. package/src/architecture/import-boundaries.test.ts +118 -0
  5. package/src/assets/gloomberb-logo.png +0 -0
  6. package/src/assets/gloomberb-logo.svg +73 -0
  7. package/src/brokers/account-cache.ts +157 -0
  8. package/src/brokers/profile-form.test.ts +73 -0
  9. package/src/brokers/profile-form.ts +109 -0
  10. package/src/brokers/remote-broker-adapter.ts +91 -0
  11. package/src/brokers/sync-broker-instance.test.ts +124 -1
  12. package/src/brokers/sync-broker-instance.ts +113 -17
  13. package/src/capabilities/factories.ts +100 -0
  14. package/src/capabilities/index.ts +4 -0
  15. package/src/capabilities/registry.test.ts +137 -0
  16. package/src/capabilities/registry.ts +131 -0
  17. package/src/capabilities/service-capabilities.ts +27 -0
  18. package/src/capabilities/types.ts +84 -0
  19. package/src/cli/commands/ticker.ts +11 -3
  20. package/src/cli/context.ts +19 -13
  21. package/src/cli/helpers.ts +1 -0
  22. package/src/cli/types.ts +2 -2
  23. package/src/components/chart/chart-controller.ts +4 -24
  24. package/src/components/chart/chart-data.ts +3 -14
  25. package/src/components/chart/chart-indicator-selector.tsx +28 -6
  26. package/src/components/chart/chart-pane-settings.ts +15 -28
  27. package/src/components/chart/chart-renderer.ts +74 -99
  28. package/src/components/chart/chart-resolution.ts +10 -10
  29. package/src/components/chart/chart-scroll.test.ts +6 -5
  30. package/src/components/chart/chart-scroll.ts +2 -2
  31. package/src/components/chart/chart-types.ts +0 -1
  32. package/src/components/chart/chart-viewport.ts +2 -1
  33. package/src/components/chart/chart.test.ts +37 -0
  34. package/src/components/chart/comparison-chart-data.ts +3 -17
  35. package/src/components/chart/comparison-chart-renderer.test.ts +27 -4
  36. package/src/components/chart/comparison-chart-renderer.ts +1 -1
  37. package/src/components/chart/comparison-stock-chart.tsx +318 -158
  38. package/src/components/chart/cursor-motion.ts +3 -2
  39. package/src/components/chart/indicators/bands.test.ts +0 -14
  40. package/src/components/chart/indicators/moving-averages.test.ts +0 -15
  41. package/src/components/chart/indicators/options.ts +3 -3
  42. package/src/components/chart/indicators/oscillators.test.ts +0 -21
  43. package/src/components/chart/indicators/types.ts +1 -2
  44. package/src/components/chart/native/chart-rasterizer.ts +37 -44
  45. package/src/components/chart/native/kitty-adapter.ts +2 -5
  46. package/src/components/chart/native/kitty-manager.ts +1 -1
  47. package/src/components/chart/native/kitty-protocol.ts +0 -1
  48. package/src/components/chart/native/kitty-support.ts +1 -1
  49. package/src/components/chart/native/kitty.test.ts +53 -13
  50. package/src/components/chart/native/renderer-selection.ts +1 -1
  51. package/src/components/chart/native/surface-manager.ts +1 -1
  52. package/src/components/chart/native/surface-visibility.ts +48 -0
  53. package/src/components/chart/static-chart-surface.test.tsx +51 -0
  54. package/src/components/chart/static-chart-surface.tsx +191 -0
  55. package/src/components/chart/stock-chart-renderer-switch.test.tsx +242 -35
  56. package/src/components/chart/stock-chart.tsx +452 -191
  57. package/src/components/command-bar/__snapshots__/command-bar.test.tsx.snap +4 -4
  58. package/src/components/command-bar/command-bar.test.tsx +269 -20
  59. package/src/components/command-bar/command-bar.tsx +830 -353
  60. package/src/components/command-bar/command-registry.ts +10 -20
  61. package/src/components/command-bar/helpers.test.ts +1 -1
  62. package/src/components/command-bar/helpers.ts +9 -11
  63. package/src/components/command-bar/pane-template-display.ts +4 -8
  64. package/src/components/command-bar/root-shortcuts.ts +12 -11
  65. package/src/components/command-bar/view-model.test.ts +8 -42
  66. package/src/components/command-bar/view-model.ts +8 -36
  67. package/src/components/command-bar/workflow-ops.test.ts +76 -2
  68. package/src/components/command-bar/workflow-ops.ts +40 -9
  69. package/src/components/command-bar/workflow-types.ts +2 -1
  70. package/src/components/data-table-stack-view.test.tsx +206 -0
  71. package/src/components/data-table-stack-view.tsx +152 -0
  72. package/src/components/data-table-view.test.tsx +188 -0
  73. package/src/components/data-table-view.tsx +279 -0
  74. package/src/components/feed-data-table-stack-view.test.tsx +225 -0
  75. package/src/components/feed-data-table-stack-view.tsx +365 -0
  76. package/src/components/index.ts +26 -31
  77. package/src/components/layout/detached-pane-shell.tsx +185 -0
  78. package/src/components/layout/floating-pane.tsx +87 -14
  79. package/src/components/layout/header.tsx +139 -49
  80. package/src/components/layout/pane-content.tsx +42 -0
  81. package/src/components/layout/pane-footer.test.tsx +195 -0
  82. package/src/components/layout/pane-footer.tsx +425 -0
  83. package/src/components/layout/pane-header.test.tsx +39 -0
  84. package/src/components/layout/pane-header.tsx +192 -14
  85. package/src/components/layout/pane-keyboard-scroll.test.tsx +226 -0
  86. package/src/components/layout/pane-sizing.ts +9 -10
  87. package/src/components/layout/pane-title.ts +35 -0
  88. package/src/components/layout/pane.tsx +52 -11
  89. package/src/components/layout/shell.test.tsx +315 -107
  90. package/src/components/layout/shell.tsx +1010 -368
  91. package/src/components/layout/status-bar.test.tsx +17 -10
  92. package/src/components/layout/status-bar.tsx +367 -100
  93. package/src/components/layout/titlebar-overlay.ts +2 -0
  94. package/src/components/markdown-editor.tsx +29 -14
  95. package/src/components/markdown-text.tsx +25 -24
  96. package/src/components/onboarding/onboarding-wizard.test.tsx +8 -3
  97. package/src/components/onboarding/onboarding-wizard.tsx +347 -473
  98. package/src/components/pane-settings-dialog.tsx +521 -89
  99. package/src/components/pane-template-wizard.test.tsx +1 -1
  100. package/src/components/pane-template-wizard.tsx +38 -37
  101. package/src/components/price-selector-dialog.tsx +22 -21
  102. package/src/components/ticker-badge-list.tsx +53 -0
  103. package/src/components/ticker-badge-text.test.tsx +44 -1
  104. package/src/components/ticker-badge-text.tsx +78 -38
  105. package/src/components/ticker-badge.tsx +28 -7
  106. package/src/components/ticker-list-table-view.tsx +248 -0
  107. package/src/components/ticker-list-table.test.tsx +47 -1
  108. package/src/components/ticker-list-table.tsx +212 -41
  109. package/src/components/toggle-list.tsx +114 -8
  110. package/src/components/ui/button.tsx +24 -16
  111. package/src/components/ui/choice-dialog.tsx +89 -0
  112. package/src/components/ui/data-table.tsx +313 -114
  113. package/src/components/ui/external-link.tsx +52 -13
  114. package/src/components/ui/fields.tsx +44 -30
  115. package/src/components/ui/frame.tsx +24 -57
  116. package/src/components/ui/index.ts +15 -50
  117. package/src/components/ui/list-view.tsx +65 -25
  118. package/src/components/ui/loading.tsx +5 -60
  119. package/src/components/ui/message-composer.test.tsx +81 -0
  120. package/src/components/ui/message-composer.tsx +139 -0
  121. package/src/components/ui/multi-select-dialog.tsx +100 -32
  122. package/src/components/ui/multi-select.ts +112 -0
  123. package/src/components/ui/native-select.tsx +120 -0
  124. package/src/components/ui/page-stack-view.tsx +49 -19
  125. package/src/components/ui/remote-image.tsx +50 -0
  126. package/src/components/ui/row-value-cache.test.ts +17 -0
  127. package/src/components/ui/row-value-cache.ts +41 -0
  128. package/src/components/ui/shortcut-hint.tsx +55 -0
  129. package/src/components/ui/status.tsx +12 -67
  130. package/src/components/ui/table-layout.ts +59 -0
  131. package/src/components/ui/tabs.tsx +249 -27
  132. package/src/components/ui/toggle.tsx +19 -127
  133. package/src/components/ui/ui.test.tsx +266 -53
  134. package/src/components/use-double-click-activation.ts +7 -2
  135. package/src/components/use-external-link-footer.ts +79 -0
  136. package/src/core/app-services.ts +95 -0
  137. package/src/core/state/app-state.ts +886 -0
  138. package/src/{state → core/state}/session-persistence.ts +7 -6
  139. package/src/data/config-layout.ts +225 -0
  140. package/src/data/config-store-node.ts +390 -0
  141. package/src/data/config-store.test.ts +72 -0
  142. package/src/data/config-store.ts +35 -478
  143. package/src/data/sqlite-json.ts +2 -5
  144. package/src/data/sqlite-retry.ts +1 -0
  145. package/src/index.tsx +2 -68
  146. package/src/market-data/coordinator-subscriptions.test.ts +125 -0
  147. package/src/market-data/coordinator.test.ts +73 -4
  148. package/src/market-data/coordinator.ts +190 -24
  149. package/src/market-data/hooks.test.tsx +1 -1
  150. package/src/market-data/hooks.tsx +109 -87
  151. package/src/market-data/query-store.ts +3 -3
  152. package/src/market-data/request-types.test.ts +0 -14
  153. package/src/market-data/result-types.ts +1 -0
  154. package/src/news/aggregator.test.ts +267 -0
  155. package/src/news/aggregator.ts +452 -0
  156. package/src/news/hooks.ts +39 -0
  157. package/src/news/ticker-symbols.ts +21 -0
  158. package/src/news/types.ts +77 -0
  159. package/src/notifications/app-notifier.ts +21 -10
  160. package/src/pane-settings.test.ts +0 -2
  161. package/src/plugins/builtin/ai/ask-ai-detail-tab.tsx +124 -134
  162. package/src/plugins/builtin/ai/gloomberb-cli.ts +14 -13
  163. package/src/plugins/builtin/ai/providers.ts +1 -9
  164. package/src/plugins/builtin/ai/runner.ts +41 -5
  165. package/src/plugins/builtin/ai/screener-pane.test.tsx +37 -55
  166. package/src/plugins/builtin/ai/screener-pane.tsx +231 -276
  167. package/src/plugins/builtin/ai/settings.ts +0 -1
  168. package/src/plugins/builtin/ai/utils.ts +1 -71
  169. package/src/plugins/builtin/alerts/alert-engine.test.ts +1 -38
  170. package/src/plugins/builtin/alerts/index.test.tsx +61 -82
  171. package/src/plugins/builtin/alerts/index.tsx +263 -155
  172. package/src/plugins/builtin/alerts/types.ts +7 -0
  173. package/src/plugins/builtin/analytics/index.test.tsx +13 -8
  174. package/src/plugins/builtin/analytics/index.tsx +78 -120
  175. package/src/plugins/builtin/analytics/metrics.test.ts +0 -4
  176. package/src/plugins/builtin/ask-ai.test.tsx +55 -54
  177. package/src/plugins/builtin/broker-manager/index.test.tsx +168 -0
  178. package/src/plugins/builtin/broker-manager/index.tsx +759 -0
  179. package/src/plugins/builtin/broker-manager/model.test.ts +107 -0
  180. package/src/plugins/builtin/broker-manager/model.ts +142 -0
  181. package/src/plugins/builtin/chat-controller.test.ts +129 -0
  182. package/src/plugins/builtin/chat-controller.ts +85 -14
  183. package/src/plugins/builtin/chat.test.tsx +283 -36
  184. package/src/plugins/builtin/chat.tsx +363 -170
  185. package/src/plugins/builtin/cloud-auth-actions.tsx +72 -0
  186. package/src/plugins/builtin/cloud-tweets.tsx +896 -0
  187. package/src/plugins/builtin/comparison-chart.test.tsx +46 -57
  188. package/src/plugins/builtin/comparison-chart.tsx +11 -11
  189. package/src/plugins/builtin/correlation/compute.test.ts +0 -17
  190. package/src/plugins/builtin/correlation/index.tsx +51 -46
  191. package/src/plugins/builtin/correlation/settings.ts +1 -2
  192. package/src/plugins/builtin/debug.tsx +99 -70
  193. package/src/plugins/builtin/earnings/earnings-cache.test.ts +2 -2
  194. package/src/plugins/builtin/earnings/earnings-cache.ts +12 -3
  195. package/src/plugins/builtin/earnings/earnings-data.test.ts +42 -11
  196. package/src/plugins/builtin/earnings/earnings-data.ts +70 -5
  197. package/src/plugins/builtin/earnings/index.tsx +187 -94
  198. package/src/plugins/builtin/econ/calendar-source.ts +9 -116
  199. package/src/plugins/builtin/econ/fred-client.test.ts +1 -14
  200. package/src/plugins/builtin/econ/fred-series-map.ts +1 -0
  201. package/src/plugins/builtin/econ/index.tsx +236 -421
  202. package/src/plugins/builtin/econ/types.ts +1 -0
  203. package/src/plugins/builtin/fx-matrix/index.tsx +43 -45
  204. package/src/plugins/builtin/fx-matrix/pairs.ts +1 -0
  205. package/src/plugins/builtin/help.test.tsx +120 -60
  206. package/src/plugins/builtin/help.tsx +266 -82
  207. package/src/plugins/builtin/holders/index.test.ts +45 -0
  208. package/src/plugins/builtin/holders/index.tsx +949 -0
  209. package/src/plugins/builtin/insider/index.tsx +207 -253
  210. package/src/plugins/builtin/insider/insider-data.test.ts +1 -11
  211. package/src/plugins/builtin/insider/insider-data.ts +1 -0
  212. package/src/plugins/builtin/layout-manager.tsx +12 -40
  213. package/src/plugins/builtin/market-movers/index.tsx +70 -144
  214. package/src/plugins/builtin/market-movers/screener.test.ts +0 -18
  215. package/src/plugins/builtin/news-wire/breaking-notifications.test.ts +98 -0
  216. package/src/plugins/builtin/news-wire/breaking-notifications.ts +110 -0
  217. package/src/plugins/builtin/news-wire/breaking-pane.tsx +157 -0
  218. package/src/plugins/builtin/news-wire/categories.ts +114 -0
  219. package/src/plugins/builtin/news-wire/default-feeds.ts +3 -0
  220. package/src/plugins/builtin/news-wire/digest-store.ts +44 -0
  221. package/src/plugins/builtin/news-wire/feed-config.test.ts +90 -0
  222. package/src/plugins/builtin/news-wire/feed-config.ts +216 -0
  223. package/src/plugins/builtin/news-wire/feed-pane.tsx +21 -0
  224. package/src/plugins/builtin/news-wire/hash.ts +9 -0
  225. package/src/plugins/builtin/news-wire/index.tsx +92 -0
  226. package/src/plugins/builtin/news-wire/industry-pane.tsx +140 -0
  227. package/src/plugins/builtin/news-wire/news-detail-view.tsx +256 -0
  228. package/src/plugins/builtin/news-wire/news-footer.ts +28 -0
  229. package/src/plugins/builtin/news-wire/news-preset-pane.tsx +94 -0
  230. package/src/plugins/builtin/news-wire/news-query-presets.ts +40 -0
  231. package/src/plugins/builtin/news-wire/news-table.test.tsx +206 -0
  232. package/src/plugins/builtin/news-wire/news-table.tsx +296 -0
  233. package/src/plugins/builtin/news-wire/persisted-articles.ts +92 -0
  234. package/src/plugins/builtin/news-wire/read-state.test.ts +30 -0
  235. package/src/plugins/builtin/news-wire/read-state.ts +76 -0
  236. package/src/plugins/builtin/news-wire/rss-parser.test.ts +184 -0
  237. package/src/plugins/builtin/news-wire/rss-parser.ts +213 -0
  238. package/src/plugins/builtin/news-wire/rss-source.test.ts +159 -0
  239. package/src/plugins/builtin/news-wire/rss-source.ts +181 -0
  240. package/src/plugins/builtin/news-wire/top-pane.tsx +21 -0
  241. package/src/plugins/builtin/news.tsx +98 -25
  242. package/src/plugins/builtin/notes-files.ts +51 -10
  243. package/src/plugins/builtin/notes.tsx +332 -131
  244. package/src/plugins/builtin/options.test.tsx +185 -0
  245. package/src/plugins/builtin/options.tsx +346 -206
  246. package/src/plugins/builtin/plugin-groups.ts +92 -0
  247. package/src/plugins/builtin/portfolio-list/header.tsx +72 -37
  248. package/src/plugins/builtin/portfolio-list/index.tsx +25 -42
  249. package/src/plugins/builtin/portfolio-list/metrics.ts +1 -1
  250. package/src/plugins/builtin/portfolio-list/pane.tsx +246 -164
  251. package/src/plugins/builtin/portfolio-list/settings.ts +19 -51
  252. package/src/plugins/builtin/portfolio-list/summary.tsx +21 -16
  253. package/src/plugins/builtin/portfolio-list/table.tsx +66 -25
  254. package/src/plugins/builtin/portfolio-list/use-throttled-cursor-symbol.test.tsx +1 -1
  255. package/src/plugins/builtin/portfolio-list/use-throttled-cursor-symbol.ts +1 -1
  256. package/src/plugins/builtin/portfolio-list.test.ts +60 -1
  257. package/src/plugins/builtin/portfolio-list.test.tsx +122 -55
  258. package/src/plugins/builtin/quote-monitor.test.tsx +2 -27
  259. package/src/plugins/builtin/research/index.tsx +724 -0
  260. package/src/plugins/builtin/sec.tsx +67 -19
  261. package/src/plugins/builtin/sectors/index.tsx +42 -80
  262. package/src/plugins/builtin/sectors/sector-data.ts +1 -0
  263. package/src/plugins/builtin/ticker-detail/chart-tab.tsx +25 -39
  264. package/src/plugins/builtin/ticker-detail/financials-tab.tsx +108 -58
  265. package/src/plugins/builtin/ticker-detail/overview-tab.tsx +383 -271
  266. package/src/plugins/builtin/ticker-detail/pane.tsx +143 -49
  267. package/src/plugins/builtin/ticker-detail/quote-monitor.tsx +43 -27
  268. package/src/plugins/builtin/ticker-detail/settings.ts +3 -6
  269. package/src/plugins/builtin/ticker-detail-chart-tab-switch.test.tsx +82 -10
  270. package/src/plugins/builtin/ticker-detail.test.tsx +258 -33
  271. package/src/plugins/builtin/ticker-surface.ts +68 -0
  272. package/src/plugins/builtin/world-indices/index.tsx +44 -82
  273. package/src/plugins/builtin/world-indices/indices.ts +1 -0
  274. package/src/plugins/builtin/yahoo.ts +55 -1
  275. package/src/plugins/builtin/yield-curve/index.tsx +87 -145
  276. package/src/plugins/builtin/yield-curve/treasury-data.ts +6 -77
  277. package/src/plugins/catalog-ui.test.ts +24 -0
  278. package/src/plugins/catalog-ui.ts +44 -0
  279. package/src/plugins/catalog.ts +2 -50
  280. package/src/plugins/ibkr/__snapshots__/trade-tab.test.tsx.snap +5 -5
  281. package/src/plugins/ibkr/account-cache.test.ts +15 -14
  282. package/src/plugins/ibkr/account-cache.ts +15 -120
  283. package/src/plugins/ibkr/broker-adapter.ts +67 -0
  284. package/src/plugins/ibkr/config.test.ts +0 -18
  285. package/src/plugins/ibkr/dialogs.tsx +14 -56
  286. package/src/plugins/ibkr/flex.test.ts +57 -2
  287. package/src/plugins/ibkr/flex.ts +116 -12
  288. package/src/plugins/ibkr/gateway-helpers.ts +8 -3
  289. package/src/plugins/ibkr/gateway-service-native.ts +2381 -0
  290. package/src/plugins/ibkr/gateway-service.test.ts +47 -9
  291. package/src/plugins/ibkr/gateway-service.ts +264 -2235
  292. package/src/plugins/ibkr/gateway-types.ts +27 -0
  293. package/src/plugins/ibkr/index.test.tsx +3 -11
  294. package/src/plugins/ibkr/index.tsx +1 -0
  295. package/src/plugins/ibkr/price-normalization.test.ts +1 -6
  296. package/src/plugins/ibkr/price-normalization.ts +1 -0
  297. package/src/plugins/ibkr/trade-badge.tsx +6 -5
  298. package/src/plugins/ibkr/trade-tab.test.tsx +55 -3
  299. package/src/plugins/ibkr/trade-tab.tsx +166 -117
  300. package/src/plugins/ibkr/trading-pane.tsx +117 -83
  301. package/src/plugins/pane-manager.test.ts +3 -1
  302. package/src/plugins/pane-manager.ts +93 -19
  303. package/src/plugins/plugin-runtime.test.tsx +176 -74
  304. package/src/plugins/plugin-runtime.tsx +228 -10
  305. package/src/plugins/prediction-markets/cache.ts +49 -0
  306. package/src/plugins/prediction-markets/categories.ts +0 -10
  307. package/src/plugins/prediction-markets/chart.test.tsx +1 -1
  308. package/src/plugins/prediction-markets/chart.tsx +21 -20
  309. package/src/plugins/prediction-markets/cli.ts +1 -0
  310. package/src/plugins/prediction-markets/controller-data.ts +135 -89
  311. package/src/plugins/prediction-markets/controller.ts +37 -108
  312. package/src/plugins/prediction-markets/detail/book.tsx +23 -22
  313. package/src/plugins/prediction-markets/detail/outcomes.tsx +33 -32
  314. package/src/plugins/prediction-markets/detail/overview.tsx +17 -12
  315. package/src/plugins/prediction-markets/detail/pane.tsx +59 -45
  316. package/src/plugins/prediction-markets/detail/rules.tsx +22 -7
  317. package/src/plugins/prediction-markets/detail/shared.tsx +3 -2
  318. package/src/plugins/prediction-markets/detail/trades.tsx +12 -11
  319. package/src/plugins/prediction-markets/detail.test.tsx +1 -1
  320. package/src/plugins/prediction-markets/keyboard.ts +1 -0
  321. package/src/plugins/prediction-markets/launch.test.ts +1 -1
  322. package/src/plugins/prediction-markets/launch.ts +1 -1
  323. package/src/plugins/prediction-markets/metrics.ts +25 -12
  324. package/src/plugins/prediction-markets/pane.test.tsx +16 -7
  325. package/src/plugins/prediction-markets/pane.tsx +180 -82
  326. package/src/plugins/prediction-markets/plugin.test.tsx +37 -45
  327. package/src/plugins/prediction-markets/services/fetch.ts +27 -10
  328. package/src/plugins/prediction-markets/services/kalshi-adapter.ts +20 -3
  329. package/src/plugins/prediction-markets/services/polymarket-adapter.ts +29 -11
  330. package/src/plugins/prediction-markets/settings.ts +0 -5
  331. package/src/plugins/prediction-markets/test-helpers.tsx +19 -44
  332. package/src/plugins/registry.test.ts +307 -0
  333. package/src/plugins/registry.ts +293 -82
  334. package/src/react/input.ts +61 -0
  335. package/src/react/plugins/plugin-slot.tsx +21 -0
  336. package/src/react/use-raf-callback.ts +44 -0
  337. package/src/renderers/electrobun/bun/application-menu-click.test.ts +41 -0
  338. package/src/renderers/electrobun/bun/application-menu-click.ts +55 -0
  339. package/src/renderers/electrobun/bun/application-menu.ts +118 -0
  340. package/src/renderers/electrobun/bun/context-menu-click.test.ts +67 -0
  341. package/src/renderers/electrobun/bun/context-menu-click.ts +61 -0
  342. package/src/renderers/electrobun/bun/context-menu-normalize.test.ts +52 -0
  343. package/src/renderers/electrobun/bun/context-menu-normalize.ts +67 -0
  344. package/src/renderers/electrobun/bun/core-capabilities.ts +328 -0
  345. package/src/renderers/electrobun/bun/desktop-workspace.test.ts +63 -0
  346. package/src/renderers/electrobun/bun/desktop-workspace.ts +162 -0
  347. package/src/renderers/electrobun/bun/index.ts +1149 -0
  348. package/src/renderers/electrobun/bun/window-frame.test.ts +40 -0
  349. package/src/renderers/electrobun/bun/window-frame.ts +46 -0
  350. package/src/renderers/electrobun/shared/protocol.ts +72 -0
  351. package/src/renderers/electrobun/view/ai-host.ts +93 -0
  352. package/src/renderers/electrobun/view/app-services.ts +348 -0
  353. package/src/renderers/electrobun/view/application-menu-bridge.ts +12 -0
  354. package/src/renderers/electrobun/view/backend-rpc.ts +173 -0
  355. package/src/renderers/electrobun/view/broker-remote-client.ts +154 -0
  356. package/src/renderers/electrobun/view/config-host.ts +35 -0
  357. package/src/renderers/electrobun/view/context-menu.test.ts +140 -0
  358. package/src/renderers/electrobun/view/context-menu.ts +164 -0
  359. package/src/renderers/electrobun/view/data-table.tsx +773 -0
  360. package/src/renderers/electrobun/view/desktop-controls.tsx +651 -0
  361. package/src/renderers/electrobun/view/desktop-window-bridge.ts +59 -0
  362. package/src/renderers/electrobun/view/desktop-window-snapshot.test.ts +57 -0
  363. package/src/renderers/electrobun/view/desktop-window-snapshot.ts +41 -0
  364. package/src/renderers/electrobun/view/dialog-host.tsx +62 -0
  365. package/src/renderers/electrobun/view/http-fetch.ts +113 -0
  366. package/src/renderers/electrobun/view/input-host.tsx +112 -0
  367. package/src/renderers/electrobun/view/key-event.test.ts +34 -0
  368. package/src/renderers/electrobun/view/key-event.ts +134 -0
  369. package/src/renderers/electrobun/view/main.tsx +104 -0
  370. package/src/renderers/electrobun/view/native-renderer.ts +110 -0
  371. package/src/renderers/electrobun/view/native-stubs/chart-kitty-support.ts +9 -0
  372. package/src/renderers/electrobun/view/native-stubs/chart-surface-manager.ts +25 -0
  373. package/src/renderers/electrobun/view/native-stubs/chart-surface-sync.ts +1 -0
  374. package/src/renderers/electrobun/view/notes-files.ts +56 -0
  375. package/src/renderers/electrobun/view/resource-store.test.ts +44 -0
  376. package/src/renderers/electrobun/view/resource-store.ts +106 -0
  377. package/src/renderers/electrobun/view/rpc-codec.ts +42 -0
  378. package/src/renderers/electrobun/view/scrollbar-activity.ts +23 -0
  379. package/src/renderers/electrobun/view/toast-host.tsx +65 -0
  380. package/src/renderers/electrobun/view/ui-host.tsx +1509 -0
  381. package/src/renderers/electrobun/view/update-host.ts +38 -0
  382. package/src/renderers/opentui/dialog-host.test.tsx +44 -0
  383. package/src/renderers/opentui/dialog-host.tsx +56 -0
  384. package/src/renderers/opentui/host.tsx +140 -0
  385. package/src/renderers/opentui/image-loader.test.ts +25 -0
  386. package/src/renderers/opentui/image-loader.ts +105 -0
  387. package/src/renderers/opentui/image-surface.tsx +266 -0
  388. package/src/renderers/opentui/input-host.tsx +63 -0
  389. package/src/renderers/opentui/start.tsx +71 -0
  390. package/src/renderers/opentui/test-utils.tsx +76 -0
  391. package/src/renderers/opentui/toast-host.tsx +10 -0
  392. package/src/renderers/opentui/ui-host.tsx +98 -0
  393. package/src/sources/gloomberb-cloud.test.ts +288 -17
  394. package/src/sources/gloomberb-cloud.ts +176 -9
  395. package/src/sources/provider-errors.ts +1 -0
  396. package/src/sources/provider-router.test.ts +220 -81
  397. package/src/sources/provider-router.ts +294 -111
  398. package/src/sources/sec-edgar.ts +19 -6
  399. package/src/sources/yahoo-finance.test.ts +0 -5
  400. package/src/sources/yahoo-finance.ts +420 -11
  401. package/src/state/app-activity.ts +7 -7
  402. package/src/state/app-bootstrap.ts +114 -40
  403. package/src/state/app-context-selector.test.tsx +70 -1
  404. package/src/state/app-context.test.ts +71 -3
  405. package/src/state/app-context.test.tsx +14 -7
  406. package/src/state/app-context.tsx +209 -869
  407. package/src/state/config-save-scheduler.ts +35 -0
  408. package/src/state/pane-scroll-registry.tsx +254 -0
  409. package/src/state/persist-scheduler.test.ts +67 -0
  410. package/src/state/persist-scheduler.ts +69 -0
  411. package/src/state/selectors-ui.ts +55 -0
  412. package/src/state/selectors.ts +15 -71
  413. package/src/state/session-persistence.test.ts +1 -1
  414. package/src/state/ticker-refresh-queue.ts +52 -3
  415. package/src/state/use-inline-tickers.ts +18 -16
  416. package/src/state/use-quote-streaming.test.ts +0 -6
  417. package/src/state/use-quote-streaming.test.tsx +1 -1
  418. package/src/state/use-quote-streaming.ts +3 -2
  419. package/src/state/use-session-snapshot.ts +32 -17
  420. package/src/test-support/plugin-runtime.ts +149 -0
  421. package/src/theme/color-utils.ts +1 -0
  422. package/src/theme/colors.ts +16 -0
  423. package/src/types/broker.ts +16 -1
  424. package/src/types/capability-route-source.ts +23 -0
  425. package/src/types/config.test.ts +23 -0
  426. package/src/types/config.ts +145 -10
  427. package/src/types/context-menu.ts +95 -0
  428. package/src/types/data-provider.ts +34 -3
  429. package/src/types/desktop-menu.ts +13 -0
  430. package/src/types/desktop-window.ts +29 -0
  431. package/src/types/financials.ts +123 -2
  432. package/src/types/instrument.ts +1 -0
  433. package/src/types/news-source.ts +9 -0
  434. package/src/types/persistence.ts +1 -0
  435. package/src/types/plugin.ts +32 -8
  436. package/src/ui/ascii-font.ts +85 -0
  437. package/src/ui/context-menu.test.ts +94 -0
  438. package/src/ui/context-menu.tsx +433 -0
  439. package/src/ui/dialog.tsx +55 -0
  440. package/src/ui/host.tsx +364 -0
  441. package/src/ui/index.tsx +134 -0
  442. package/src/ui/toast.tsx +40 -0
  443. package/src/updater.test.ts +69 -0
  444. package/src/updater.ts +61 -18
  445. package/src/utils/api-client.test.ts +99 -9
  446. package/src/utils/api-client.ts +378 -18
  447. package/src/utils/back-navigation.ts +6 -0
  448. package/src/utils/cli-output.ts +1 -0
  449. package/src/utils/currency-units.test.ts +1 -6
  450. package/src/utils/currency-units.ts +1 -0
  451. package/src/utils/debug-log.ts +68 -0
  452. package/src/utils/dom-screenshot.ts +326 -0
  453. package/src/utils/exchange-rate-map.ts +1 -0
  454. package/src/utils/exchanges.ts +214 -0
  455. package/src/utils/format.test.ts +7 -0
  456. package/src/utils/format.ts +1 -0
  457. package/src/utils/fuzzy-search.ts +1 -0
  458. package/src/utils/html-entities.test.ts +8 -0
  459. package/src/utils/html-entities.ts +32 -0
  460. package/src/utils/http-transport.ts +11 -0
  461. package/src/utils/main-thread-monitor.ts +127 -0
  462. package/src/utils/perf-marks.ts +54 -0
  463. package/src/utils/quote-freshness.ts +27 -50
  464. package/src/utils/quote-resolution.test.ts +5 -5
  465. package/src/utils/quote-resolution.ts +0 -1
  466. package/src/utils/quote-time.ts +1 -5
  467. package/src/utils/sec.test.ts +0 -12
  468. package/src/utils/selection-clipboard.ts +14 -6
  469. package/src/utils/shortcut-labels.test.ts +20 -0
  470. package/src/utils/shortcut-labels.ts +67 -0
  471. package/src/utils/slugify.ts +1 -0
  472. package/src/utils/terminal-input-reset.ts +1 -0
  473. package/src/utils/text-wrap.ts +82 -0
  474. package/src/utils/throttled-fetch.test.ts +19 -0
  475. package/src/utils/throttled-fetch.ts +11 -9
  476. package/src/utils/ticker-list.test.ts +1 -7
  477. package/src/utils/ticker-list.ts +1 -0
  478. package/src/utils/timestamp.ts +29 -0
  479. package/src/utils/tweet-text.test.ts +13 -0
  480. package/src/utils/tweet-text.ts +18 -0
  481. package/src/utils/url.ts +11 -0
  482. package/src/version.ts +1 -1
  483. package/src/components/chart/chart-control-hint.tsx +0 -39
  484. package/src/components/detail-feed-view.test.tsx +0 -180
  485. package/src/components/detail-feed-view.tsx +0 -531
  486. package/src/components/layout/pixel-mouse-mode.test.ts +0 -122
  487. package/src/components/layout/pixel-mouse.test.ts +0 -40
  488. package/src/components/spinner.tsx +0 -2
  489. package/src/components/tab-bar.tsx +0 -17
  490. package/src/components/ui/multi-select-chips.tsx +0 -69
  491. package/src/plugins/builtin/ai/index.test.tsx +0 -139
  492. package/src/plugins/builtin/ask-ai.tsx +0 -9
  493. package/src/plugins/builtin/correlation/plugin.test.ts +0 -44
  494. package/src/plugins/builtin/correlation/settings.test.ts +0 -34
  495. package/src/plugins/builtin/econ/calendar-source.test.ts +0 -219
  496. package/src/plugins/builtin/econ/fred-client.ts +0 -79
  497. package/src/plugins/builtin/fred-settings.ts +0 -10
  498. package/src/plugins/builtin/options-availability.test.tsx +0 -179
  499. package/src/plugins/builtin/options-availability.ts +0 -158
  500. package/src/plugins/builtin/portfolio-list/metrics.test.ts +0 -61
  501. package/src/plugins/builtin/yield-curve/treasury-data.test.ts +0 -212
  502. package/src/plugins/prediction-markets/status.ts +0 -24
  503. package/src/plugins/prediction-markets/table.tsx +0 -87
  504. package/src/utils/quote-time.test.ts +0 -22
  505. package/src/utils/selection-clipboard.test.ts +0 -43
  506. package/src/utils/terminal-input-reset.test.ts +0 -50
@@ -3,17 +3,18 @@ import { existsSync, rmSync } from "fs";
3
3
  import { tmpdir } from "os";
4
4
  import { join } from "path";
5
5
  import { act, useReducer } from "react";
6
- import { testRender } from "@opentui/react/test-utils";
6
+ import { testRender } from "../../renderers/opentui/test-utils";
7
7
  import { AppPersistence } from "../../data/app-persistence";
8
8
  import { AppContext, appReducer, createInitialState, PaneInstanceProvider, type AppAction } from "../../state/app-context";
9
- import { ProviderRouter } from "../../sources/provider-router";
9
+ import { AssetDataRouter } from "../../sources/provider-router";
10
10
  import { cloneLayout, createDefaultConfig, type AppConfig, type BrokerInstanceConfig } from "../../types/config";
11
11
  import type { DataProvider } from "../../types/data-provider";
12
12
  import type { Quote } from "../../types/financials";
13
13
  import type { TickerRecord } from "../../types/ticker";
14
14
  import { MarketDataCoordinator, setSharedMarketDataCoordinator } from "../../market-data/coordinator";
15
- import { setSharedRegistryForTests } from "../registry";
16
- import { ibkrGatewayManager } from "../ibkr/gateway-service";
15
+ import { createTestPluginRuntime } from "../../test-support/plugin-runtime";
16
+ import { PluginRenderProvider, type PluginRuntimeAccess } from "../plugin-runtime";
17
+ import type { BrokerAdapter } from "../../types/broker";
17
18
  import { portfolioListPlugin } from "./portfolio-list";
18
19
 
19
20
  const TEST_PANE_ID = "portfolio-list:test";
@@ -191,6 +192,7 @@ function PortfolioHarness({
191
192
  quote,
192
193
  exchangeRates,
193
194
  stateMutator,
195
+ runtime = createTestPluginRuntime(),
194
196
  }: {
195
197
  config: AppConfig;
196
198
  collectionId: string;
@@ -200,6 +202,7 @@ function PortfolioHarness({
200
202
  quote?: Quote;
201
203
  exchangeRates?: Map<string, number>;
202
204
  stateMutator?: (state: ReturnType<typeof createInitialState>) => void;
205
+ runtime?: PluginRuntimeAccess;
203
206
  }) {
204
207
  const initialState = createPortfolioState(config, collectionId, expanded, {
205
208
  ticker,
@@ -215,13 +218,15 @@ function PortfolioHarness({
215
218
  return (
216
219
  <AppContext value={{ state, dispatch }}>
217
220
  <PaneInstanceProvider paneId={TEST_PANE_ID}>
218
- <PortfolioPane
219
- paneId={TEST_PANE_ID}
220
- paneType="portfolio-list"
221
- focused
222
- width={100}
223
- height={24}
224
- />
221
+ <PluginRenderProvider pluginId="portfolio-list" runtime={runtime}>
222
+ <PortfolioPane
223
+ paneId={TEST_PANE_ID}
224
+ paneType="portfolio-list"
225
+ focused
226
+ width={100}
227
+ height={24}
228
+ />
229
+ </PluginRenderProvider>
225
230
  </PaneInstanceProvider>
226
231
  </AppContext>
227
232
  );
@@ -229,6 +234,9 @@ function PortfolioHarness({
229
234
 
230
235
  async function flushFrame() {
231
236
  await act(async () => {
237
+ await Promise.resolve();
238
+ await testSetup!.renderOnce();
239
+ await Promise.resolve();
232
240
  await testSetup!.renderOnce();
233
241
  });
234
242
  }
@@ -242,18 +250,45 @@ afterEach(async () => {
242
250
  sharedCoordinator = null;
243
251
  setSharedMarketDataCoordinator(null);
244
252
  harnessState = null;
245
- setSharedRegistryForTests(undefined);
246
- await ibkrGatewayManager.removeInstance("ibkr-live");
247
253
  for (const path of tempPaths.splice(0)) {
248
254
  if (existsSync(path)) rmSync(path, { force: true });
249
255
  }
250
256
  });
251
257
 
252
258
  describe("PortfolioListPane cash and margin UI", () => {
253
- test("defaults new portfolio panes to floating", () => {
254
- const paneDef = portfolioListPlugin.panes?.find((entry) => entry.id === "portfolio-list");
259
+ test("opens the selected ticker on a second row click", async () => {
260
+ const portfolioId = "broker:ibkr-flex:DU12345";
261
+ const config = createPortfolioConfig(portfolioId, [createBrokerInstance("flex")]);
262
+ const pinned: Array<{ symbol: string; options: { floating?: boolean; paneType?: string } | undefined }> = [];
263
+ const runtime = createTestPluginRuntime({
264
+ navigateTicker: () => {
265
+ throw new Error("portfolio rows should open fixed floating panes directly");
266
+ },
267
+ pinTicker: (symbol, options) => {
268
+ pinned.push({ symbol, options });
269
+ },
270
+ });
271
+
272
+ testSetup = await testRender(
273
+ <PortfolioHarness config={config} collectionId={portfolioId} runtime={runtime} />,
274
+ { width: 100, height: 24 },
275
+ );
276
+
277
+ await flushFrame();
278
+ const rowY = testSetup.captureCharFrame().split("\n").findIndex((line) => line.includes("AAPL"));
279
+ expect(rowY).toBeGreaterThanOrEqual(0);
280
+
281
+ await act(async () => {
282
+ await testSetup!.mockMouse.click(2, rowY);
283
+ await testSetup!.renderOnce();
284
+ });
285
+ expect(pinned).toEqual([]);
255
286
 
256
- expect(paneDef?.defaultMode).toBe("floating");
287
+ await act(async () => {
288
+ await testSetup!.mockMouse.click(2, rowY);
289
+ await testSetup!.renderOnce();
290
+ });
291
+ expect(pinned).toEqual([{ symbol: "AAPL", options: { floating: true, paneType: "ticker-detail" } }]);
257
292
  });
258
293
 
259
294
  test("keeps non-broker portfolios unchanged", async () => {
@@ -284,7 +319,11 @@ describe("PortfolioListPane cash and margin UI", () => {
284
319
 
285
320
  test("keeps native price and avg cost while converting market value and pnl to base currency", async () => {
286
321
  const portfolioId = "broker:ibkr-flex:DU12345";
287
- const config = createPortfolioConfig(portfolioId, [createBrokerInstance("flex")]);
322
+ const config = createPortfolioConfigWithColumns(
323
+ portfolioId,
324
+ ["ticker", "price", "change_pct", "shares", "avg_cost", "cost_basis", "mkt_value", "pnl"],
325
+ [createBrokerInstance("flex")],
326
+ );
288
327
 
289
328
  testSetup = await testRender(
290
329
  <PortfolioHarness
@@ -368,7 +407,7 @@ describe("PortfolioListPane cash and margin UI", () => {
368
407
  await flushFrame();
369
408
 
370
409
  const frame = testSetup.captureCharFrame();
371
- expect(frame).toContain("Val 1.3k");
410
+ expect(frame).toContain("1.3k");
372
411
  expect(frame).toContain("125");
373
412
  expect(frame).toContain("+250");
374
413
  expect(frame).toContain("25.00%");
@@ -486,34 +525,45 @@ describe("PortfolioListPane cash and margin UI", () => {
486
525
 
487
526
  test("shows a live gateway badge in the header and drawer preview", async () => {
488
527
  const config = createPortfolioConfig("broker:ibkr-live:DU12345", [createBrokerInstance("gateway", "ibkr-live")]);
489
- const service = ibkrGatewayManager.getService("ibkr-live") as any;
490
- service.updateSnapshot({
491
- status: { state: "connected", updatedAt: Date.now(), mode: "gateway" },
492
- accounts: [{
493
- accountId: "DU12345",
494
- name: "DU12345",
495
- currency: "USD",
496
- source: "gateway",
497
- updatedAt: Date.now(),
498
- totalCashValue: -75000,
499
- settledCash: -70000,
500
- availableFunds: 15000,
501
- excessLiquidity: 12000,
502
- buyingPower: 30000,
503
- netLiquidation: 200000,
504
- cashBalances: [
505
- { currency: "USD", quantity: -75000, baseValue: -75000, baseCurrency: "USD" },
506
- { currency: "EUR", quantity: -10000, baseValue: undefined, baseCurrency: "USD" },
507
- ],
508
- }],
509
- openOrders: [],
510
- executions: [],
528
+ const liveAccount = {
529
+ accountId: "DU12345",
530
+ name: "DU12345",
531
+ currency: "USD",
532
+ source: "gateway" as const,
533
+ updatedAt: Date.now(),
534
+ totalCashValue: -75000,
535
+ settledCash: -70000,
536
+ availableFunds: 15000,
537
+ excessLiquidity: 12000,
538
+ buyingPower: 30000,
539
+ netLiquidation: 200000,
540
+ cashBalances: [
541
+ { currency: "USD", quantity: -75000, baseValue: -75000, baseCurrency: "USD" },
542
+ { currency: "EUR", quantity: -10000, baseValue: undefined, baseCurrency: "USD" },
543
+ ],
544
+ };
545
+ const liveBroker: BrokerAdapter = {
546
+ id: "ibkr",
547
+ name: "Interactive Brokers",
548
+ configSchema: [],
549
+ validate: async () => true,
550
+ importPositions: async () => [],
551
+ getStatus: () => ({ state: "connected", updatedAt: Date.now(), mode: "gateway" }),
552
+ subscribeStatus: (_instance, listener) => {
553
+ listener();
554
+ return () => {};
555
+ },
556
+ listAccounts: async () => [liveAccount],
557
+ };
558
+ const runtime = createTestPluginRuntime({
559
+ getBrokerAdapter: (brokerType) => brokerType === "ibkr" ? liveBroker : null,
511
560
  });
512
561
 
513
562
  testSetup = await testRender(
514
563
  <PortfolioHarness
515
564
  config={config}
516
565
  collectionId="broker:ibkr-live:DU12345"
566
+ runtime={runtime}
517
567
  brokerAccounts={{
518
568
  "ibkr-live": [{
519
569
  accountId: "DU12345",
@@ -593,7 +643,7 @@ describe("PortfolioListPane cash and margin UI", () => {
593
643
  expect(harnessState?.paneState[TEST_PANE_ID]?.cashDrawerExpanded).toBe(true);
594
644
  });
595
645
 
596
- test("renders the summary on its own row below the tabs", async () => {
646
+ test("renders the table directly below tabs when the footer owns the summary", async () => {
597
647
  const config = {
598
648
  ...createPortfolioConfig("broker:ibkr-flex:DU12345", [createBrokerInstance("flex")]),
599
649
  watchlists: [
@@ -629,11 +679,34 @@ describe("PortfolioListPane cash and margin UI", () => {
629
679
 
630
680
  const lines = testSetup.captureCharFrame().split("\n");
631
681
  const tabsRow = lines.findIndex((line) => line.includes("Main Portfolio"));
632
- const summaryRow = lines.findIndex((line) => line.includes("Net Liq 125k Val 1.3k Cash -50k"));
682
+ const tableHeaderRow = lines.findIndex((line) => line.includes("TICKER"));
633
683
 
634
684
  expect(tabsRow).toBeGreaterThanOrEqual(0);
635
- expect(summaryRow).toBeGreaterThan(tabsRow);
636
- expect(lines[summaryRow + 1]).toContain("TICKER");
685
+ expect(tableHeaderRow).toBe(tabsRow + 1);
686
+ });
687
+
688
+ test("hides collection tabs when there is only one visible collection", async () => {
689
+ const config = createPortfolioConfig("main");
690
+ config.portfolios = [{ id: "main", name: "Main Portfolio", currency: "USD" }];
691
+ config.watchlists = [];
692
+
693
+ testSetup = await testRender(
694
+ <PortfolioHarness
695
+ config={config}
696
+ collectionId="main"
697
+ ticker={makeTicker({ portfolios: ["main"], positions: [] })}
698
+ />,
699
+ { width: 100, height: 12 },
700
+ );
701
+
702
+ await flushFrame();
703
+
704
+ const lines = testSetup.captureCharFrame().split("\n");
705
+ const tabsRow = lines.findIndex((line) => line.includes("Main Portfolio"));
706
+ const tableHeaderRow = lines.findIndex((line) => line.includes("TICKER"));
707
+
708
+ expect(tabsRow).toBe(-1);
709
+ expect(tableHeaderRow).toBe(0);
637
710
  });
638
711
 
639
712
  test("renders bid ask and spread when those columns are enabled", async () => {
@@ -698,9 +771,6 @@ describe("PortfolioListPane cash and margin UI", () => {
698
771
  async search() {
699
772
  return [];
700
773
  },
701
- async getNews() {
702
- return [];
703
- },
704
774
  async getArticleSummary() {
705
775
  return null;
706
776
  },
@@ -720,6 +790,9 @@ describe("PortfolioListPane cash and margin UI", () => {
720
790
  );
721
791
 
722
792
  await flushFrame();
793
+ await act(async () => {
794
+ await new Promise((resolve) => setTimeout(resolve, 380));
795
+ });
723
796
  await act(async () => {
724
797
  resolveFinancials({
725
798
  annualStatements: [],
@@ -791,9 +864,6 @@ describe("PortfolioListPane cash and margin UI", () => {
791
864
  async search() {
792
865
  return [];
793
866
  },
794
- async getNews() {
795
- return [];
796
- },
797
867
  async getArticleSummary() {
798
868
  return null;
799
869
  },
@@ -826,7 +896,7 @@ describe("PortfolioListPane cash and margin UI", () => {
826
896
  },
827
897
  };
828
898
 
829
- const seedRouter = new ProviderRouter(yahooProvider, [cloudProvider], persistence.resources);
899
+ const seedRouter = new AssetDataRouter(yahooProvider, [cloudProvider], persistence.resources);
830
900
  await seedRouter.getTickerFinancials("AAPL", "NASDAQ", {
831
901
  brokerId: "ibkr",
832
902
  brokerInstanceId: "ibkr-live",
@@ -834,7 +904,7 @@ describe("PortfolioListPane cash and margin UI", () => {
834
904
  });
835
905
 
836
906
  let liveCalls = 0;
837
- const cachedRouter = new ProviderRouter({
907
+ const cachedRouter = new AssetDataRouter({
838
908
  ...yahooProvider,
839
909
  async getTickerFinancials() {
840
910
  liveCalls += 1;
@@ -982,9 +1052,6 @@ describe("PortfolioListPane cash and margin UI", () => {
982
1052
  async search() {
983
1053
  return [];
984
1054
  },
985
- async getNews() {
986
- return [];
987
- },
988
1055
  async getArticleSummary() {
989
1056
  return null;
990
1057
  },
@@ -1,10 +1,10 @@
1
1
  import { afterEach, describe, expect, test } from "bun:test";
2
- import { testRender } from "@opentui/react/test-utils";
2
+ import { testRender } from "../../renderers/opentui/test-utils";
3
3
  import type { TickerFinancials } from "../../types/financials";
4
4
  import type { TickerRecord } from "../../types/ticker";
5
5
  import { createDefaultConfig } from "../../types/config";
6
6
  import { AppContext, createInitialState, PaneInstanceProvider } from "../../state/app-context";
7
- import { QuoteMonitorPane, tickerDetailPlugin } from "./ticker-detail";
7
+ import { QuoteMonitorPane } from "./ticker-detail";
8
8
 
9
9
  let testSetup: Awaited<ReturnType<typeof testRender>> | undefined;
10
10
 
@@ -86,29 +86,4 @@ describe("QuoteMonitorPane", () => {
86
86
  expect(frame).toContain("-9.82");
87
87
  });
88
88
 
89
- test("registers a quote monitor pane template bound to the active ticker", () => {
90
- const template = tickerDetailPlugin.paneTemplates?.find((entry) => entry.id === "quote-monitor-pane");
91
-
92
- expect(template).toBeDefined();
93
- expect(template?.label).toBe("Quote Monitor");
94
- expect(template?.canCreate?.({
95
- config: createDefaultConfig("/tmp/gloomberb-test"),
96
- layout: createDefaultConfig("/tmp/gloomberb-test").layout,
97
- focusedPaneId: "ticker-detail:main",
98
- activeTicker: "MSFT",
99
- activeCollectionId: null,
100
- })).toBe(true);
101
- expect(template?.createInstance?.({
102
- config: createDefaultConfig("/tmp/gloomberb-test"),
103
- layout: createDefaultConfig("/tmp/gloomberb-test").layout,
104
- focusedPaneId: "ticker-detail:main",
105
- activeTicker: "MSFT",
106
- activeCollectionId: null,
107
- })).toEqual({
108
- title: "MSFT",
109
- binding: { kind: "fixed", symbol: "MSFT" },
110
- settings: { symbol: "MSFT" },
111
- placement: "floating",
112
- });
113
- });
114
89
  });