gloomberb 0.10.0 → 0.10.2

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 (353) hide show
  1. package/package.json +8 -1
  2. package/src/api-client/auth.ts +1 -0
  3. package/src/api-client/index.test.ts +359 -108
  4. package/src/api-client/index.ts +24 -13
  5. package/src/api-client/socket.ts +70 -35
  6. package/src/api-client/types.ts +1 -1
  7. package/src/app/language-observer.test.tsx +82 -0
  8. package/src/app/language-observer.tsx +13 -0
  9. package/src/app/pane-runtime/index.tsx +2 -2
  10. package/src/app/pane-runtime/pane-settings-runtime.tsx +2 -2
  11. package/src/app/pane-runtime/pane-template-runtime.ts +2 -2
  12. package/src/app/pane-runtime/plugin-bindings.ts +2 -2
  13. package/src/app/pane-runtime/ticker-open-runtime.ts +2 -2
  14. package/src/app/runtime/broker-import.ts +2 -2
  15. package/src/app/runtime/plugin-bindings.ts +2 -2
  16. package/src/app/runtime/startup.ts +2 -2
  17. package/src/app.tsx +16 -7
  18. package/src/brokers/account-cache.ts +6 -6
  19. package/src/brokers/broker-ticker-sync.ts +3 -3
  20. package/src/brokers/remote-broker-adapter.ts +2 -2
  21. package/src/brokers/sync-broker-instance.ts +5 -6
  22. package/src/cli/commands/api.ts +3 -6
  23. package/src/cli/commands/automation.ts +7 -15
  24. package/src/cli/commands/market.ts +26 -61
  25. package/src/cli/commands/overview.ts +34 -45
  26. package/src/cli/commands/search.ts +25 -27
  27. package/src/cli/commands/system.ts +27 -57
  28. package/src/cli/commands/ticker.ts +62 -63
  29. package/src/cli/context.test.ts +63 -0
  30. package/src/cli/context.ts +15 -1
  31. package/src/cli/index.ts +1 -1
  32. package/src/cli/pane-functions/data.ts +2 -19
  33. package/src/cli/pane-functions/index.ts +26 -25
  34. package/src/cli/pane-functions/report.ts +1 -1
  35. package/src/cli/pane-functions/screenshot.ts +3 -3
  36. package/src/cli/scoped-context.ts +41 -0
  37. package/src/components/chart/composite/composite-chart.test.tsx +615 -18
  38. package/src/components/chart/composite/composite-chart.tsx +179 -79
  39. package/src/components/chart/composite/format.test.ts +20 -7
  40. package/src/components/chart/composite/index.ts +0 -21
  41. package/src/components/chart/composite/interactions.test.ts +90 -3
  42. package/src/components/chart/composite/interactions.ts +189 -24
  43. package/src/components/chart/composite/price-series.ts +0 -2
  44. package/src/components/chart/composite/rasterizer.ts +10 -9
  45. package/src/components/chart/composite/renderers.test.ts +108 -2
  46. package/src/components/chart/composite/scene.test.ts +36 -0
  47. package/src/components/chart/composite/scene.ts +5 -2
  48. package/src/components/chart/composite/text-renderer.ts +37 -25
  49. package/src/components/chart/composite/time-axis.test.ts +243 -0
  50. package/src/components/chart/composite/time-axis.ts +608 -0
  51. package/src/components/chart/composite/types.ts +12 -1
  52. package/src/components/chart/core/data.ts +2 -159
  53. package/src/components/chart/core/date-window.ts +6 -225
  54. package/src/components/chart/core/palette.ts +1 -12
  55. package/src/components/chart/core/pointer.ts +0 -142
  56. package/src/components/chart/core/types.ts +1 -58
  57. package/src/components/chart/cursor-motion.ts +2 -4
  58. package/src/components/chart/indicators/types.ts +0 -9
  59. package/src/components/chart/market-session.ts +0 -11
  60. package/src/components/chart/native/kitty/protocol.ts +1 -1
  61. package/src/components/chart/native/raster/layout.ts +3 -10
  62. package/src/components/chart/static/chart/axis-overlays.test.tsx +64 -0
  63. package/src/components/chart/static/chart/axis-overlays.tsx +59 -14
  64. package/src/components/chart/static/chart/surface.tsx +1 -2
  65. package/src/components/command-bar/action-runtime.ts +2 -2
  66. package/src/components/command-bar/commands/direct/index.ts +1 -1
  67. package/src/components/command-bar/panel/body.tsx +2 -2
  68. package/src/components/command-bar/panel/index.tsx +11 -9
  69. package/src/components/command-bar/routes/ticker-search/actions.ts +2 -2
  70. package/src/components/command-bar/surface/index.tsx +2 -2
  71. package/src/components/command-bar/workflow/body.tsx +3 -3
  72. package/src/components/command-bar/workflow/collection-actions.ts +2 -2
  73. package/src/components/command-bar/workflow/coordinator.ts +2 -2
  74. package/src/components/command-bar/workflow/field-row.tsx +25 -11
  75. package/src/components/command-bar/workflow/tickers.ts +2 -2
  76. package/src/components/feed-data-table/stack-view.test.tsx +28 -36
  77. package/src/components/feed-data-table/stack-view.tsx +3 -1
  78. package/src/components/layout/detached-pane-shell.tsx +6 -6
  79. package/src/components/layout/header.tsx +13 -9
  80. package/src/components/layout/pane/content.test.tsx +42 -3
  81. package/src/components/layout/pane/content.tsx +3 -1
  82. package/src/components/layout/pane/footer/index.test.tsx +45 -2
  83. package/src/components/layout/pane/footer/registration.tsx +3 -1
  84. package/src/components/layout/shell/index.tsx +1 -2
  85. package/src/components/layout/shell/native/surfaces.ts +1 -1
  86. package/src/components/layout/shell/native/window-state.ts +1 -1
  87. package/src/components/layout/status-bar.tsx +12 -8
  88. package/src/components/layout/window-controls.tsx +8 -6
  89. package/src/components/onboarding/onboarding-wizard.tsx +3 -1
  90. package/src/components/pane-settings-dialog/desktop.tsx +0 -2
  91. package/src/components/pane-settings-dialog.tsx +0 -2
  92. package/src/components/pane-template-wizard.tsx +10 -9
  93. package/src/components/price-performance.tsx +2 -113
  94. package/src/components/price-sparkline/model.ts +15 -17
  95. package/src/components/price-sparkline/view.tsx +8 -7
  96. package/src/components/speedometer-gauge/desktop.tsx +2 -1
  97. package/src/components/speedometer-gauge/index.tsx +0 -2
  98. package/src/components/speedometer-gauge/terminal.tsx +24 -5
  99. package/src/components/ticker/badge/index.tsx +1 -18
  100. package/src/components/ui/data-table/opentui/index.tsx +3 -3
  101. package/src/components/ui/frame.tsx +1 -2
  102. package/src/components/ui/page-stack-view.test.tsx +126 -0
  103. package/src/components/ui/page-stack-view.tsx +24 -12
  104. package/src/components/ui/tabs.tsx +7 -3
  105. package/src/components/ui/ui.test.tsx +23 -2
  106. package/src/components/use-external-link-footer.ts +4 -2
  107. package/src/core/app-service-ports.ts +46 -0
  108. package/src/core/app-services.test.ts +66 -0
  109. package/src/core/app-services.ts +17 -15
  110. package/src/data/config/chart-settings.ts +3 -10
  111. package/src/data/config/store/index.test.ts +99 -2
  112. package/src/data/config/store/migrations.ts +278 -0
  113. package/src/data/config/store/normalize.ts +44 -186
  114. package/src/data/resource-store.ts +73 -12
  115. package/src/data/sqlite/cache.test.ts +104 -15
  116. package/src/i18n/index.test.ts +17 -0
  117. package/src/i18n/index.ts +23 -6
  118. package/src/i18n/ja.ts +13 -0
  119. package/src/i18n/ko.ts +13 -0
  120. package/src/i18n/react.ts +6 -0
  121. package/src/i18n/zh-cn.ts +13 -0
  122. package/src/i18n/zh-tw.ts +13 -0
  123. package/src/market-data/coordinator/auxiliary.ts +7 -3
  124. package/src/market-data/coordinator/chart.ts +1 -1
  125. package/src/market-data/coordinator/index.test.ts +26 -0
  126. package/src/market-data/coordinator/index.ts +11 -5
  127. package/src/market-data/coordinator/quotes.ts +4 -40
  128. package/src/market-data/coordinator/subscriptions.test.ts +89 -1
  129. package/src/market-data/hooks.tsx +47 -1
  130. package/src/market-data/market/status.ts +6 -6
  131. package/src/market-data/performance.ts +1 -1
  132. package/src/market-data/quote-subscription-target.test.ts +37 -0
  133. package/src/market-data/quote-subscription-target.ts +60 -0
  134. package/src/market-data/quotes/freshness.ts +1 -0
  135. package/src/market-data/quotes/resolution.ts +4 -0
  136. package/src/market-data/request-types.ts +3 -3
  137. package/src/news/aggregator.test.ts +97 -1
  138. package/src/news/aggregator.ts +100 -57
  139. package/src/news/hooks.test.tsx +64 -0
  140. package/src/news/hooks.ts +18 -25
  141. package/src/plugins/builtin/account-management/footer.ts +4 -2
  142. package/src/plugins/builtin/account-management/pane.tsx +9 -4
  143. package/src/plugins/builtin/ai/agent-history.ts +11 -7
  144. package/src/plugins/builtin/ai/ask-ai-detail-tab.tsx +0 -5
  145. package/src/plugins/builtin/ai/ask-ai.test.tsx +3 -4
  146. package/src/plugins/builtin/ai/index.test.ts +2 -2
  147. package/src/plugins/builtin/ai/index.tsx +10 -11
  148. package/src/plugins/builtin/ai/pane-settings.ts +1 -1
  149. package/src/plugins/builtin/ai/pi/runtime.ts +6 -5
  150. package/src/plugins/builtin/ai/providers.ts +1 -9
  151. package/src/plugins/builtin/ai/runner.ts +0 -6
  152. package/src/plugins/builtin/ai/screener/footer.ts +4 -1
  153. package/src/plugins/builtin/ai/screener/pane.test.tsx +9 -9
  154. package/src/plugins/builtin/ai/workspace/model.ts +2 -27
  155. package/src/plugins/builtin/ai/workspace/pane.tsx +2 -2
  156. package/src/plugins/builtin/analytics/metrics.ts +1 -7
  157. package/src/plugins/builtin/broker-manager/detail.tsx +3 -2
  158. package/src/plugins/builtin/broker-manager/index.tsx +4 -2
  159. package/src/plugins/builtin/chart-composer/editor/controller.ts +643 -0
  160. package/src/plugins/builtin/chart-composer/editor/desktop-view.tsx +134 -0
  161. package/src/plugins/builtin/chart-composer/editor/model.test.ts +85 -0
  162. package/src/plugins/builtin/chart-composer/editor/model.ts +292 -0
  163. package/src/plugins/builtin/chart-composer/editor/opentui-view.tsx +108 -0
  164. package/src/plugins/builtin/chart-composer/editor.tsx +65 -947
  165. package/src/plugins/builtin/chart-composer/index.tsx +0 -6
  166. package/src/plugins/builtin/chart-composer/pane.tsx +69 -36
  167. package/src/plugins/builtin/chart-composer/presets.ts +1 -19
  168. package/src/plugins/builtin/chart-composer/settings.ts +1 -1
  169. package/src/plugins/builtin/chat/content/composer-runtime.ts +1 -1
  170. package/src/plugins/builtin/chat/content/shortcuts.ts +0 -1
  171. package/src/plugins/builtin/chat/controller/fetch.ts +8 -2
  172. package/src/plugins/builtin/chat/controller/persistence.ts +2 -0
  173. package/src/plugins/builtin/chat/controller/session.test.ts +25 -0
  174. package/src/plugins/builtin/chat/controller/session.ts +2 -0
  175. package/src/plugins/builtin/chat/controller/state.ts +7 -0
  176. package/src/plugins/builtin/chat/controller.test.ts +73 -20
  177. package/src/plugins/builtin/chat/message/desktop.tsx +2 -0
  178. package/src/plugins/builtin/cloud-tweets/footer.ts +9 -28
  179. package/src/plugins/builtin/cloud-tweets/pane.tsx +0 -5
  180. package/src/plugins/builtin/cloud-tweets/table.tsx +12 -17
  181. package/src/plugins/builtin/correlation/compute.ts +4 -10
  182. package/src/plugins/builtin/econ/index.tsx +17 -19
  183. package/src/plugins/builtin/holders/types.ts +0 -1
  184. package/src/plugins/builtin/insider/index.tsx +6 -31
  185. package/src/plugins/builtin/news/index.tsx +5 -7
  186. package/src/plugins/builtin/news/wire/breaking/pane.test.tsx +6 -8
  187. package/src/plugins/builtin/news/wire/news/footer.ts +10 -11
  188. package/src/plugins/builtin/news/wire/read-state.test.ts +7 -0
  189. package/src/plugins/builtin/news/wire/read-state.ts +18 -28
  190. package/src/plugins/builtin/news/wire/rss/parser.ts +1 -11
  191. package/src/plugins/builtin/options/footer.test.ts +115 -0
  192. package/src/plugins/builtin/options/footer.ts +110 -0
  193. package/src/plugins/builtin/options/live-quotes.test.ts +238 -0
  194. package/src/plugins/builtin/options/live-quotes.ts +147 -0
  195. package/src/plugins/builtin/options/view.test.tsx +71 -1
  196. package/src/plugins/builtin/options/view.tsx +39 -24
  197. package/src/plugins/builtin/portfolio-list/cli/portfolio-command.ts +103 -117
  198. package/src/plugins/builtin/portfolio-list/cli/render.ts +11 -5
  199. package/src/plugins/builtin/portfolio-list/cli/watchlist-command.ts +120 -135
  200. package/src/plugins/builtin/portfolio-list/header.tsx +9 -4
  201. package/src/plugins/builtin/portfolio-list/quick-add/index.tsx +6 -1
  202. package/src/plugins/builtin/portfolio-list/quick-add/resolution.ts +4 -2
  203. package/src/plugins/builtin/research/corporate-actions-pane.tsx +24 -52
  204. package/src/plugins/builtin/sec/filing-content.test.ts +41 -0
  205. package/src/plugins/builtin/sec/filing-content.ts +94 -0
  206. package/src/plugins/builtin/sec/index.tsx +21 -104
  207. package/src/plugins/builtin/sectors/sector-model.ts +1 -7
  208. package/src/plugins/builtin/shared/cloud-upgrade.ts +1 -0
  209. package/src/plugins/builtin/shared/pane-footer.ts +82 -0
  210. package/src/plugins/builtin/shared/read-state.ts +64 -3
  211. package/src/plugins/builtin/substack/read-state.ts +16 -41
  212. package/src/plugins/builtin/thirteenf/pane.tsx +24 -73
  213. package/src/plugins/builtin/ticker-detail/quote-monitor/index.tsx +10 -10
  214. package/src/plugins/builtin/yield-curve/index.tsx +11 -9
  215. package/src/plugins/ibkr/dialogs.tsx +3 -3
  216. package/src/plugins/ibkr/gateway/fundamentals.ts +1 -1
  217. package/src/plugins/ibkr/gateway/history-requests.ts +2 -2
  218. package/src/plugins/ibkr/gateway/history.ts +2 -2
  219. package/src/plugins/ibkr/gateway/selection.ts +2 -2
  220. package/src/plugins/ibkr/gateway/service/index.ts +2 -2
  221. package/src/plugins/ibkr/gateway/service/native.ts +2 -2
  222. package/src/plugins/plugin-persistence.ts +3 -4
  223. package/src/plugins/prediction-markets/controller/keyboard.ts +1 -1
  224. package/src/plugins/prediction-markets/controller/live-updates.ts +6 -5
  225. package/src/plugins/prediction-markets/detail/book.tsx +2 -2
  226. package/src/plugins/prediction-markets/detail/outcomes.tsx +3 -1
  227. package/src/plugins/prediction-markets/detail/pane.tsx +3 -1
  228. package/src/plugins/prediction-markets/detail/trades.tsx +3 -3
  229. package/src/plugins/registry/context.ts +3 -4
  230. package/src/plugins/registry/index.ts +5 -6
  231. package/src/react/input.test.ts +126 -3
  232. package/src/react/input.ts +120 -1
  233. package/src/remote/app-host.tsx +2 -13
  234. package/src/renderers/electrobun/bun/desktop/backend-requests.ts +44 -60
  235. package/src/renderers/electrobun/bun/desktop/capability-bridge.ts +15 -13
  236. package/src/renderers/electrobun/bun/desktop/host-requests.ts +26 -22
  237. package/src/renderers/electrobun/bun/desktop/http-fetch.ts +5 -1
  238. package/src/renderers/electrobun/bun/desktop/initialization.ts +11 -6
  239. package/src/renderers/electrobun/bun/desktop/media.ts +5 -3
  240. package/src/renderers/electrobun/bun/desktop/plugin-state.ts +21 -22
  241. package/src/renderers/electrobun/bun/desktop/window-controls.ts +3 -1
  242. package/src/renderers/electrobun/bun/desktop/workspace/requests.ts +18 -18
  243. package/src/renderers/electrobun/bun/index.ts +123 -83
  244. package/src/renderers/electrobun/shared/protocol.ts +146 -7
  245. package/src/renderers/electrobun/view/app-services.ts +5 -8
  246. package/src/renderers/electrobun/view/backend-rpc.ts +18 -8
  247. package/src/renderers/electrobun/view/broker-remote-client.ts +2 -2
  248. package/src/renderers/electrobun/view/cli-pane-shot-entry.tsx +5 -22
  249. package/src/renderers/electrobun/view/config-host.ts +1 -1
  250. package/src/renderers/electrobun/view/context-menu.ts +1 -17
  251. package/src/renderers/electrobun/view/data-table/index.tsx +0 -1
  252. package/src/renderers/electrobun/view/data-table/row.tsx +0 -4
  253. package/src/renderers/electrobun/view/desktop/control-styles.ts +37 -34
  254. package/src/renderers/electrobun/view/desktop/controls.tsx +36 -33
  255. package/src/renderers/electrobun/view/desktop/list-view.tsx +15 -12
  256. package/src/renderers/electrobun/view/desktop/popover.tsx +2 -3
  257. package/src/renderers/electrobun/view/dialog-host.tsx +2 -3
  258. package/src/renderers/electrobun/view/fatal-screen.tsx +0 -1
  259. package/src/renderers/electrobun/view/host/box.tsx +0 -1
  260. package/src/renderers/electrobun/view/host/chart-surface.tsx +0 -1
  261. package/src/renderers/electrobun/view/host/input.tsx +0 -1
  262. package/src/renderers/electrobun/view/host/media-surface.tsx +0 -1
  263. package/src/renderers/electrobun/view/host/native.ts +0 -1
  264. package/src/renderers/electrobun/view/host/scroll-box.tsx +0 -1
  265. package/src/renderers/electrobun/view/host/tabs.tsx +0 -1
  266. package/src/renderers/electrobun/view/host/text.tsx +0 -1
  267. package/src/renderers/electrobun/view/http-fetch.ts +3 -11
  268. package/src/renderers/electrobun/view/input-host.tsx +10 -53
  269. package/src/renderers/electrobun/view/key-event.ts +0 -1
  270. package/src/renderers/electrobun/view/main.tsx +3 -3
  271. package/src/renderers/electrobun/view/native-renderer.ts +0 -1
  272. package/src/renderers/electrobun/view/native-stubs/backend-rpc.ts +13 -1
  273. package/src/renderers/electrobun/view/native-stubs/chart/surface-manager.ts +11 -0
  274. package/src/renderers/electrobun/view/native-stubs/native-stubs.test.ts +47 -0
  275. package/src/renderers/electrobun/view/remote/asset-data-client.ts +6 -44
  276. package/src/renderers/electrobun/view/remote/persistence.ts +6 -2
  277. package/src/renderers/electrobun/view/remote/quote-subscription-registry.test.ts +86 -0
  278. package/src/renderers/electrobun/view/remote/quote-subscription-registry.ts +72 -0
  279. package/src/renderers/electrobun/view/remote/ticker-repository.ts +2 -2
  280. package/src/renderers/electrobun/view/toast-host.tsx +0 -1
  281. package/src/renderers/electrobun/view/ui-host.tsx +1 -2
  282. package/src/renderers/electrobun/view/update-host.ts +1 -1
  283. package/src/renderers/opentui/chart-surface.tsx +2 -1
  284. package/src/renderers/opentui/dialog-host.tsx +20 -4
  285. package/src/renderers/opentui/image/loader.ts +12 -2
  286. package/src/renderers/opentui/input-host.tsx +7 -49
  287. package/src/renderers/opentui/start.tsx +2 -0
  288. package/src/sources/gloomberb-cloud/history-quality.ts +44 -0
  289. package/src/sources/gloomberb-cloud/index.test.ts +173 -0
  290. package/src/sources/gloomberb-cloud/index.ts +42 -20
  291. package/src/sources/gloomberb-cloud/normalizers.ts +9 -3
  292. package/src/sources/provider-router/cache.ts +1 -1
  293. package/src/sources/provider-router/document-routes.ts +10 -5
  294. package/src/sources/provider-router/financials.test.ts +14 -0
  295. package/src/sources/provider-router/financials.ts +6 -1
  296. package/src/sources/provider-router/history.test.ts +163 -1
  297. package/src/sources/provider-router/history.ts +278 -347
  298. package/src/sources/provider-router/index.ts +2 -2
  299. package/src/sources/provider-router/routing.test.ts +39 -0
  300. package/src/sources/provider-router/routing.ts +24 -11
  301. package/src/sources/provider-router/supplemental.ts +37 -17
  302. package/src/sources/sec-edgar/content.ts +2 -12
  303. package/src/sources/sec-edgar.ts +2 -13
  304. package/src/sources/yahoo-finance/history.ts +2 -2
  305. package/src/sources/yahoo-finance/options.ts +5 -0
  306. package/src/sources/yahoo-finance.ts +2 -2
  307. package/src/state/app/bootstrap.ts +2 -2
  308. package/src/state/app/context/index.tsx +2 -2
  309. package/src/state/hooks/quote-streaming.ts +66 -1
  310. package/src/state/hooks/session-snapshot.ts +2 -2
  311. package/src/state/selectors.ts +0 -9
  312. package/src/sync/controller.test.ts +98 -0
  313. package/src/sync/controller.ts +29 -5
  314. package/src/sync/react.ts +2 -2
  315. package/src/sync/types.ts +2 -2
  316. package/src/theme/colors.test.ts +10 -0
  317. package/src/theme/colors.ts +75 -78
  318. package/src/theme/theme-context.test.tsx +67 -0
  319. package/src/theme/theme-context.tsx +9 -5
  320. package/src/tickers/open-target.ts +2 -2
  321. package/src/tickers/search/upsert.ts +2 -2
  322. package/src/time-series/alignment.ts +0 -7
  323. package/src/time-series/chart-data.ts +145 -0
  324. package/src/time-series/date-window.ts +44 -0
  325. package/src/time-series/history-window.ts +21 -0
  326. package/src/time-series/hooks.test.ts +59 -0
  327. package/src/time-series/hooks.ts +33 -12
  328. package/src/time-series/market-resolution.ts +2 -2
  329. package/src/time-series/market.ts +1 -1
  330. package/src/time-series/range.ts +9 -0
  331. package/src/{components/chart/core → time-series}/resolution.ts +3 -102
  332. package/src/time-series/resolve.test.ts +203 -1
  333. package/src/time-series/resolve.ts +96 -18
  334. package/src/time-series/spec-studies.test.ts +15 -0
  335. package/src/time-series/spec.ts +2 -2
  336. package/src/time-series/studies.ts +5 -2
  337. package/src/time-series/types.ts +3 -1
  338. package/src/time-series/use-chart-resolution.test.tsx +358 -0
  339. package/src/time-series/use-chart-resolution.ts +46 -4
  340. package/src/types/broker.ts +2 -2
  341. package/src/types/data-provider.ts +3 -3
  342. package/src/types/financials.ts +12 -0
  343. package/src/types/plugin.ts +2 -2
  344. package/src/ui/context-menu.tsx +3 -2
  345. package/src/ui/dialog.tsx +2 -2
  346. package/src/utils/html-entities.ts +3 -5
  347. package/src/utils/main-thread-monitor.ts +1 -1
  348. package/src/utils/price-history.ts +5 -5
  349. package/src/version.ts +3 -1
  350. package/src/components/chart/core/viewport.test.ts +0 -8
  351. package/src/components/chart/core/viewport.ts +0 -24
  352. package/src/time-series/index.ts +0 -14
  353. /package/src/{components/chart/core → time-series}/resolution.test.ts +0 -0
@@ -8,7 +8,6 @@ import {
8
8
  } from "./providers";
9
9
  import { AiScreenerPane } from "./screener/pane";
10
10
  import { buildAiScreenerPaneSettingsDef, getAiScreenerPaneSettings } from "./settings";
11
- import { t } from "../../../i18n";
12
11
  import {
13
12
  LOCAL_AGENT_WORKSPACE_SCHEMA_VERSION,
14
13
  LOCAL_AGENT_WORKSPACE_STATE_KEY,
@@ -185,7 +184,7 @@ export const aiPlugin: GloomPlugin = {
185
184
  id: "ai",
186
185
  name: "AI",
187
186
  version: "1.0.0",
188
- description: t("Use AI providers with your financial data."),
187
+ description: "Use AI providers with your financial data.",
189
188
  toggleable: true,
190
189
 
191
190
  setup(ctx) {
@@ -205,12 +204,12 @@ export const aiPlugin: GloomPlugin = {
205
204
  ...screenerRunnerWizard,
206
205
  {
207
206
  key: "prompt",
208
- label: t("Screener Prompt"),
207
+ label: "Screener Prompt",
209
208
  type: "textarea" as const,
210
- placeholder: t("Examples: humanoid robot suppliers, defense software compounders, EM payment rails, obesity-drug picks-and-shovels..."),
209
+ placeholder: "Examples: humanoid robot suppliers, defense software compounders, EM payment rails, obesity-drug picks-and-shovels...",
211
210
  body: [
212
- t("Describe the screening idea in plain English."),
213
- t("The AI will return validated ticker ideas with a short reason for each one."),
211
+ "Describe the screening idea in plain English.",
212
+ "The AI will return validated ticker ideas with a short reason for each one.",
214
213
  ],
215
214
  },
216
215
  ];
@@ -253,7 +252,7 @@ export const aiPlugin: GloomPlugin = {
253
252
 
254
253
  ctx.registerTickerResearchTab({
255
254
  id: "ai-chat",
256
- name: t("Ask AI"),
255
+ name: "Ask AI",
257
256
  order: 60,
258
257
  component: AskAiResearchTab,
259
258
  });
@@ -326,7 +325,7 @@ export const aiPlugin: GloomPlugin = {
326
325
 
327
326
  ctx.registerPane({
328
327
  id: "ai-screener",
329
- name: t("AI Screener"),
328
+ name: "AI Screener",
330
329
  icon: "A",
331
330
  component: AiScreenerPane,
332
331
  defaultPosition: "right",
@@ -377,8 +376,8 @@ export const aiPlugin: GloomPlugin = {
377
376
  ctx.registerPaneTemplate({
378
377
  id: "new-ai-screener-pane",
379
378
  paneId: "ai-screener",
380
- label: t("AI Screener"),
381
- description: t("Create a prompt-driven AI screener pane with reusable screening tabs."),
379
+ label: "AI Screener",
380
+ description: "Create a prompt-driven AI screener pane with reusable screening tabs.",
382
381
  keywords: ["ai", "screener", "screen", "watchlist", "prompt"],
383
382
  shortcut: { prefix: "AI", argPlaceholder: "prompt", argKind: "text" },
384
383
  wizard: screenerWizard,
@@ -406,7 +405,7 @@ export const aiPlugin: GloomPlugin = {
406
405
  providerId === readyDefaults.providerId ? readyDefaults.modelId : null,
407
406
  );
408
407
  return {
409
- title: t("AI Screener"),
408
+ title: "AI Screener",
410
409
  placement: "floating",
411
410
  params: {
412
411
  prompt,
@@ -10,7 +10,7 @@ export const AI_DEFAULT_PROVIDER_SETTING_KEY = "defaultProviderId";
10
10
  export const AI_DEFAULT_MODEL_SETTING_KEY = "defaultModelId";
11
11
  export const AI_PANE_PROVIDER_SETTING_KEY = "providerId";
12
12
  export const AI_PANE_MODEL_SETTING_KEY = "modelId";
13
- export const AI_INHERIT_SETTING_VALUE = "";
13
+ const AI_INHERIT_SETTING_VALUE = "";
14
14
 
15
15
  export interface AiSharedDefaults {
16
16
  providerId: string;
@@ -606,10 +606,15 @@ export class PiAiRuntime {
606
606
  const finalAssistant = resultMessages.findLast(isAssistantMessage);
607
607
  const finalText = finalAssistant ? assistantText(finalAssistant) : cumulativeText;
608
608
  if (finalText && finalText !== cumulativeText) request.onChunk?.(finalText);
609
+ const userMessage: AgentMessage = {
610
+ role: "user",
611
+ content: request.prompt,
612
+ timestamp: Date.now(),
613
+ };
609
614
  return {
610
615
  text: finalText,
611
616
  messages: [
612
- { role: "user", content: request.prompt, timestamp: Date.now() },
617
+ userMessage,
613
618
  ...resultMessages,
614
619
  ],
615
620
  };
@@ -629,7 +634,3 @@ export class PiAiRuntime {
629
634
  };
630
635
  }
631
636
  }
632
-
633
- export function createPiAiRuntime(options: PiAiRuntimeOptions): PiAiRuntime {
634
- return new PiAiRuntime(options);
635
- }
@@ -16,7 +16,7 @@ export type AiProviderId = (typeof AI_PROVIDER_IDS)[number];
16
16
  * These aliases exist only to migrate persisted pre-Pi selections. Runtime
17
17
  * catalogs and requests always use the canonical Pi provider ids above.
18
18
  */
19
- export const LEGACY_AI_PROVIDER_ID_ALIASES = {
19
+ const LEGACY_AI_PROVIDER_ID_ALIASES = {
20
20
  claude: "anthropic",
21
21
  codex: "openai-codex",
22
22
  gemini: "google",
@@ -158,12 +158,6 @@ export function detectProviders(): AiProvider[] {
158
158
  return detectedProviders;
159
159
  }
160
160
 
161
- export function getAvailableProviders(
162
- providers: readonly AiProvider[] = detectProviders(),
163
- ): AiProvider[] {
164
- return providers.filter((provider) => provider.available);
165
- }
166
-
167
161
  export function getAiProvider(
168
162
  providerId: string | null | undefined,
169
163
  providers: readonly AiProvider[] = detectProviders(),
@@ -195,5 +189,3 @@ export function setDetectedProviders(providers: AiProvider[] | null): void {
195
189
  outputModes: [...provider.outputModes],
196
190
  })) ?? null;
197
191
  }
198
-
199
- export const __setDetectedProvidersForTests = setDetectedProviders;
@@ -217,12 +217,6 @@ export function getAiRuntimeCatalog(): AiRuntimeCatalog {
217
217
  return cloneCatalog(runtimeCatalog);
218
218
  }
219
219
 
220
- export async function refreshAiRuntimeCatalog(): Promise<AiRuntimeCatalog> {
221
- if (!configuredHost?.getCatalog) return getAiRuntimeCatalog();
222
- publishCatalog(await configuredHost.getCatalog());
223
- return getAiRuntimeCatalog();
224
- }
225
-
226
220
  export async function connectAiRuntimeProvider(
227
221
  providerId: string,
228
222
  authType?: AiRuntimeAuthType,
@@ -1,5 +1,6 @@
1
1
  import { usePaneFooter } from "../../../../components";
2
2
  import { t } from "../../../../i18n";
3
+ import { useAppLanguage } from "../../../../i18n/react";
3
4
  import type { AiScreenerTab, RunState, ScreenerEditorState } from "./model";
4
5
 
5
6
  interface UseAiScreenerFooterOptions {
@@ -27,6 +28,7 @@ export function useAiScreenerFooter({
27
28
  onRefresh,
28
29
  onSaveEditor,
29
30
  }: UseAiScreenerFooterOptions) {
31
+ const language = useAppLanguage();
30
32
  usePaneFooter("ai-screener", () => ({
31
33
  info: isRunningActiveTab && runState
32
34
  ? [{
@@ -75,7 +77,7 @@ export function useAiScreenerFooter({
75
77
  {
76
78
  id: "new",
77
79
  key: "t",
78
- label: t("ab"),
80
+ label: t("new"),
79
81
  onPress: onAddTab,
80
82
  },
81
83
  {
@@ -97,6 +99,7 @@ export function useAiScreenerFooter({
97
99
  activeTab,
98
100
  editorState,
99
101
  isRunningActiveTab,
102
+ language,
100
103
  onAddTab,
101
104
  onCancelRun,
102
105
  onCloseEditor,
@@ -12,7 +12,7 @@ import { Box } from "../../../../ui";
12
12
  import { PluginRenderProvider, type PluginRuntimeAccess } from "../../../runtime";
13
13
  import { getSharedMarketData, setSharedMarketDataForTests, setSharedRegistryForTests } from "../../../registry";
14
14
  import { AiScreenerPane } from "./pane";
15
- import { __setDetectedProvidersForTests, type AiProvider } from "../providers";
15
+ import { setDetectedProviders, type AiProvider } from "../providers";
16
16
  import { setAiRunHost, setAiRuntimeCatalog, type AiRunHost } from "../runner";
17
17
 
18
18
  const PANE_ID = "ai-screener:test";
@@ -175,7 +175,7 @@ beforeEach(() => {
175
175
  afterEach(() => {
176
176
  setAiRunHost(null);
177
177
  setAiRuntimeCatalog({ providers: [], accounts: [], models: [] });
178
- __setDetectedProvidersForTests(null);
178
+ setDetectedProviders(null);
179
179
  setSharedRegistryForTests(undefined);
180
180
  setSharedMarketDataForTests(undefined);
181
181
  if (testSetup) {
@@ -187,7 +187,7 @@ afterEach(() => {
187
187
  describe("AiScreenerPane", () => {
188
188
  test("shows the account connection message before trying to run", async () => {
189
189
  const provider = makeProvider("anthropic", "Claude");
190
- __setDetectedProvidersForTests([provider]);
190
+ setDetectedProviders([provider]);
191
191
  setAiRunHost({
192
192
  run() {
193
193
  throw new Error("provider should not run before it is connected");
@@ -216,7 +216,7 @@ describe("AiScreenerPane", () => {
216
216
  '{"title":"Compounders","summary":"Initial pass","tickers":[{"symbol":"AAPL","exchange":"NASDAQ","reason":"Strong cash flow durability"}]}',
217
217
  '{"title":"Compounders","summary":"Second pass","tickers":[{"symbol":"MSFT","exchange":"NASDAQ","reason":"Fresh rerun result"}]}',
218
218
  );
219
- __setDetectedProvidersForTests([provider]);
219
+ setDetectedProviders([provider]);
220
220
 
221
221
  const dataProvider = createTestDataProvider();
222
222
  setSharedMarketDataForTests(dataProvider);
@@ -251,7 +251,7 @@ describe("AiScreenerPane", () => {
251
251
  });
252
252
 
253
253
  test("uses pane runner overrides without rewriting the seeded tab", async () => {
254
- __setDetectedProvidersForTests([
254
+ setDetectedProviders([
255
255
  makeProvider("anthropic", "Claude"),
256
256
  makeProvider("openai-codex", "OpenAI"),
257
257
  ]);
@@ -294,7 +294,7 @@ describe("AiScreenerPane", () => {
294
294
  '{"title":"Compounders","summary":"Initial pass","tickers":[{"symbol":"AAPL","exchange":"NASDAQ","reason":"Strong cash flow durability"}]}',
295
295
  '{"title":"Compounders","summary":"Second pass","tickers":[{"symbol":"MSFT","exchange":"NASDAQ","reason":"Fresh rerun result"}]}',
296
296
  );
297
- __setDetectedProvidersForTests([provider]);
297
+ setDetectedProviders([provider]);
298
298
 
299
299
  const dataProvider = createTestDataProvider();
300
300
  setSharedMarketDataForTests(dataProvider);
@@ -333,7 +333,7 @@ describe("AiScreenerPane", () => {
333
333
  '{"title":"Compounders","summary":"Initial pass","tickers":[{"symbol":"AAPL","exchange":"NASDAQ","reason":"Strong cash flow durability"}]}',
334
334
  '{"title":"Compounders","summary":"Second pass","tickers":[{"symbol":"MSFT","exchange":"NASDAQ","reason":"Fresh rerun result"}]}',
335
335
  );
336
- __setDetectedProvidersForTests([provider]);
336
+ setDetectedProviders([provider]);
337
337
 
338
338
  const dataProvider = createTestDataProvider();
339
339
  setSharedMarketDataForTests(dataProvider);
@@ -368,7 +368,7 @@ describe("AiScreenerPane", () => {
368
368
 
369
369
  test("does not show a stale prompt-changed status while a refresh is active", async () => {
370
370
  const provider = makeProvider("anthropic", "Claude");
371
- __setDetectedProvidersForTests([provider]);
371
+ setDetectedProviders([provider]);
372
372
  installHost(() => new Promise<string>(() => {}));
373
373
 
374
374
  const dataProvider = createTestDataProvider();
@@ -401,7 +401,7 @@ describe("AiScreenerPane", () => {
401
401
  '{"title":"Compounders","summary":"Initial pass","tickers":[{"symbol":"AAPL","exchange":"NASDAQ","reason":"Strong cash flow durability"}]}',
402
402
  "not-json",
403
403
  );
404
- __setDetectedProvidersForTests([provider]);
404
+ setDetectedProviders([provider]);
405
405
 
406
406
  const dataProvider = createTestDataProvider();
407
407
  setSharedMarketDataForTests(dataProvider);
@@ -173,15 +173,6 @@ export function createLocalAgentThread(
173
173
  };
174
174
  }
175
175
 
176
- export function selectLocalAgentThread(
177
- state: LocalAgentWorkspaceState,
178
- threadId: string,
179
- ): LocalAgentWorkspaceState {
180
- return state.threads.some((thread) => thread.id === threadId)
181
- ? { ...state, activeThreadId: threadId }
182
- : state;
183
- }
184
-
185
176
  export function updateLocalAgentThread(
186
177
  state: LocalAgentWorkspaceState,
187
178
  threadId: string,
@@ -220,22 +211,6 @@ export function appendLocalAgentMessages(
220
211
  });
221
212
  }
222
213
 
223
- export function replaceLocalAgentMessage(
224
- state: LocalAgentWorkspaceState,
225
- threadId: string,
226
- messageId: string,
227
- update: Pick<LocalAgentMessage, "content"> & Pick<Partial<LocalAgentMessage>, "status">,
228
- now = Date.now(),
229
- ): LocalAgentWorkspaceState {
230
- return updateLocalAgentThread(state, threadId, (thread) => ({
231
- ...thread,
232
- updatedAt: now,
233
- messages: thread.messages.map((message) => (
234
- message.id === messageId ? { ...message, ...update } : message
235
- )),
236
- }));
237
- }
238
-
239
214
  export function removeLocalAgentMessages(
240
215
  state: LocalAgentWorkspaceState,
241
216
  threadId: string,
@@ -267,9 +242,9 @@ export function buildLocalAgentTranscript(
267
242
  thread: LocalAgentThread,
268
243
  ): AiAgentHistoryMessage[] {
269
244
  if (thread.agentMessages.length > 0) return thread.agentMessages;
270
- return buildLocalAgentHistory(thread).map((message) => (
245
+ return buildLocalAgentHistory(thread).map((message): AiAgentHistoryMessage => (
271
246
  message.role === "user"
272
- ? message
247
+ ? { role: "user", content: message.content }
273
248
  : {
274
249
  role: "assistant",
275
250
  content: [{ type: "text", text: message.content }],
@@ -477,7 +477,7 @@ export function LocalAgentWorkspacePane({ paneId, focused, width, height }: Pane
477
477
  setStreamingOutput("");
478
478
 
479
479
  let streamedOutput = "";
480
- let completedAgentMessages: AiAgentHistoryMessage[] | null = null;
480
+ let completedAgentMessages: AiAgentHistoryMessage[] = [];
481
481
  try {
482
482
  const controller = runAiPrompt({
483
483
  providerId: provider.id,
@@ -499,7 +499,7 @@ export function LocalAgentWorkspacePane({ paneId, focused, width, height }: Pane
499
499
  if (!mountedRef.current) return;
500
500
  setRunningMessageId(null);
501
501
  setStreamingOutput("");
502
- const transcriptDelta = completedAgentMessages?.length
502
+ const transcriptDelta = completedAgentMessages.length
503
503
  ? completedAgentMessages
504
504
  : [
505
505
  { role: "user" as const, content: prompt },
@@ -1,5 +1,6 @@
1
1
  import type { PricePoint } from "../../../types/financials";
2
2
  import type { TickerRecord } from "../../../types/ticker";
3
+ import { getPricePointTimestamp } from "../../../utils/price-history";
3
4
 
4
5
  export interface DatedReturn {
5
6
  dateKey: string;
@@ -11,13 +12,6 @@ export interface WeightedReturnSeries {
11
12
  returns: DatedReturn[];
12
13
  }
13
14
 
14
- function getPricePointTimestamp(point: PricePoint): number {
15
- const value = point.date as Date | string | number | null | undefined;
16
- if (value instanceof Date) return value.getTime();
17
- if (value == null) return Number.NaN;
18
- return new Date(value).getTime();
19
- }
20
-
21
15
  function toDateKey(timestamp: number): string {
22
16
  const date = new Date(timestamp);
23
17
  const month = String(date.getMonth() + 1).padStart(2, "0");
@@ -131,6 +131,7 @@ export function BrokerDetailContent({
131
131
  if (!row) return <Box flexGrow={1} />;
132
132
 
133
133
  const detailStatusMessage = isBrokerErrorMessage(message) ? message : row.message || t("No status message.");
134
+ const editAdapter = row.adapter;
134
135
 
135
136
  return (
136
137
  <ScrollBox flexGrow={1} scrollY>
@@ -152,7 +153,7 @@ export function BrokerDetailContent({
152
153
  <Text fg={colors.textMuted}>{tf("Status updated {time}", { time: formatBrokerUpdatedAt(row.updatedAt) })}</Text>
153
154
  <Box height={1} />
154
155
 
155
- {editDraft && row.adapter ? (
156
+ {editDraft && editAdapter ? (
156
157
  <Box flexDirection="column" gap={1}>
157
158
  <Text fg={colors.textBright} attributes={TextAttributes.BOLD}>{t("Edit Profile")}</Text>
158
159
  <Box onMouseDown={() => onActiveEditKeyChange("label")}>
@@ -184,7 +185,7 @@ export function BrokerDetailContent({
184
185
  field={field}
185
186
  draft={editDraft}
186
187
  previous={row.instance}
187
- adapter={row.adapter}
188
+ adapter={editAdapter}
188
189
  focused={activeEditKey === field.key}
189
190
  onFocus={() => onActiveEditKeyChange(field.key)}
190
191
  onChange={onDraftValueChange}
@@ -11,6 +11,7 @@ import {
11
11
  } from "../../../state/app/context";
12
12
  import { colors } from "../../../theme/colors";
13
13
  import { t, tf } from "../../../i18n";
14
+ import { useAppLanguage } from "../../../i18n/react";
14
15
  import type { BrokerAdapter } from "../../../types/broker";
15
16
  import type { PaneProps } from "../../../types/plugin";
16
17
  import type { PluginModule } from "../plugin-module";
@@ -31,6 +32,7 @@ import {
31
32
  } from "./table";
32
33
 
33
34
  export function BrokersPane({ focused, width, height }: PaneProps) {
35
+ const language = useAppLanguage();
34
36
  const dispatch = useAppDispatch();
35
37
  const config = useAppSelector((state) => state.config);
36
38
  const brokerAccounts = useAppSelector((state) => state.brokerAccounts);
@@ -62,7 +64,7 @@ export function BrokersPane({ focused, width, height }: PaneProps) {
62
64
 
63
65
  const rows = useMemo(
64
66
  () => buildBrokerProfileRows(config, adapters, brokerAccounts),
65
- [adapters, brokerAccounts, config, statusVersion],
67
+ [adapters, brokerAccounts, config, language, statusVersion],
66
68
  );
67
69
  const selectedRow = rows[Math.min(selectedIndex, rows.length - 1)] ?? null;
68
70
  const selectedAccounts = selectedRow ? brokerAccounts[selectedRow.id] ?? [] : [];
@@ -175,7 +177,7 @@ export function BrokersPane({ focused, width, height }: PaneProps) {
175
177
  const errorCount = rows.filter((row) => row.state === "error" || row.state === "unavailable").length;
176
178
  const bodyHeight = Math.max(5, height - 4);
177
179
  const tableWidth = Math.max(24, width - 2);
178
- const columns = useMemo(() => buildBrokerColumns(tableWidth), [tableWidth]);
180
+ const columns = useMemo(() => buildBrokerColumns(tableWidth), [language, tableWidth]);
179
181
 
180
182
  const openSelectedDetail = useCallback((index: number, _row: BrokerProfileRow) => {
181
183
  setSelectedIndex(index);