gloomberb 0.18.2 → 0.18.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (954) hide show
  1. package/README.md +8 -8
  2. package/README.zh-CN.md +11 -11
  3. package/bin/{gloomberb → gloom} +3 -1
  4. package/package.json +6 -2
  5. package/patches/electrobun@1.18.1.patch +106 -5
  6. package/src/account/checkout-handoff.tsx +225 -0
  7. package/src/account/device-signin-dialog.tsx +2 -2
  8. package/src/account/device-signin.ts +2 -2
  9. package/src/account/upgrade-dialog.tsx +1 -1
  10. package/src/api-client/askg.ts +2 -2
  11. package/src/api-client/auth.ts +2 -2
  12. package/src/api-client/central-bank-rates.ts +6 -0
  13. package/src/api-client/collections.ts +5 -1
  14. package/src/api-client/cot.ts +2 -0
  15. package/src/api-client/crypto-etf-flows.ts +37 -0
  16. package/src/api-client/crypto-markets.ts +60 -0
  17. package/src/api-client/data.ts +99 -5
  18. package/src/api-client/doe.ts +15 -0
  19. package/src/api-client/equity-screener.ts +28 -0
  20. package/src/api-client/exchange-announcements.ts +38 -0
  21. package/src/api-client/fund-facts.ts +39 -0
  22. package/src/api-client/futures-curve.ts +9 -1
  23. package/src/api-client/hiring.ts +301 -0
  24. package/src/api-client/index.ts +24 -5
  25. package/src/api-client/market-discovery.ts +14 -0
  26. package/src/api-client/members.ts +6 -0
  27. package/src/api-client/mna.ts +6 -0
  28. package/src/api-client/paths.ts +18 -1
  29. package/src/api-client/request.ts +26 -7
  30. package/src/api-client/short-side-publications.ts +37 -0
  31. package/src/api-client/socket.ts +64 -4
  32. package/src/api-client/swap-curve.ts +35 -0
  33. package/src/api-client/telemetry.ts +17 -0
  34. package/src/api-client/themes.ts +7 -1
  35. package/src/api-client/types.ts +90 -2
  36. package/src/app/global-shortcuts.ts +1 -16
  37. package/src/app/pane-runtime/plugin-bindings.ts +9 -2
  38. package/src/app/runtime/desktop-deeplink.ts +5 -5
  39. package/src/app/runtime/plugin-bindings.ts +2 -2
  40. package/src/app/runtime/startup.ts +13 -0
  41. package/src/app/runtime/update.ts +28 -8
  42. package/src/app/star-prompt/status-line.tsx +2 -2
  43. package/src/architecture/core-builtin-allowlist.json +5 -2
  44. package/src/architecture/pane-tabs-allowlist.json +65 -0
  45. package/src/architecture/ui-literals-allowlist.json +3 -3
  46. package/src/architecture/ui-tokens-allowlist.json +1 -1
  47. package/src/brokers/broker-portfolio-sync.ts +37 -0
  48. package/src/brokers/directory.ts +11 -0
  49. package/src/brokers/logos.ts +3 -1
  50. package/src/brokers/signed-in/adapter.ts +304 -26
  51. package/src/brokers/signed-in/client.ts +14 -2
  52. package/src/brokers/signed-in/connect.ts +10 -2
  53. package/src/brokers/sync-broker-instance.ts +9 -1
  54. package/src/capabilities/chart-series.ts +22 -6
  55. package/src/cli/bank-section.ts +1 -1
  56. package/src/cli/base-converter.ts +23 -14
  57. package/src/cli/central-bank-events.ts +1 -1
  58. package/src/cli/command-options.ts +59 -4
  59. package/src/cli/commands/api.ts +9 -6
  60. package/src/cli/commands/broker.ts +2 -2
  61. package/src/cli/commands/command-utils.ts +2 -2
  62. package/src/cli/commands/crypto-hints.ts +7 -20
  63. package/src/cli/commands/fred-series.ts +4 -2
  64. package/src/cli/commands/keybindings.ts +2 -2
  65. package/src/cli/commands/market.ts +1189 -296
  66. package/src/cli/commands/news-hints.ts +2 -2
  67. package/src/cli/commands/news-search.ts +59 -6
  68. package/src/cli/commands/options-leaps.ts +41 -26
  69. package/src/cli/commands/overview.ts +121 -48
  70. package/src/cli/commands/plugins.ts +9 -9
  71. package/src/cli/commands/remote.ts +13 -10
  72. package/src/cli/commands/search.ts +64 -44
  73. package/src/cli/commands/system.ts +27 -19
  74. package/src/cli/commands/themes.ts +1 -1
  75. package/src/cli/commands/ticker.ts +272 -70
  76. package/src/cli/context.ts +3 -2
  77. package/src/cli/desktop-pane-shot-view.ts +2 -2
  78. package/src/cli/desktop-pane-shot.ts +1 -1
  79. package/src/cli/earnings-calendar.ts +4 -4
  80. package/src/cli/entry.ts +18 -1
  81. package/src/cli/errors.ts +20 -2
  82. package/src/cli/exit-codes.ts +1 -1
  83. package/src/cli/export-source.ts +10 -4
  84. package/src/cli/freshness.ts +2 -8
  85. package/src/cli/fx-forward.ts +130 -0
  86. package/src/cli/fx-pair.ts +10 -9
  87. package/src/cli/glossary.ts +64 -20
  88. package/src/cli/help.ts +20 -14
  89. package/src/cli/history-export.ts +126 -0
  90. package/src/cli/history-rows.ts +196 -43
  91. package/src/cli/index-roots.ts +5 -45
  92. package/src/cli/index.ts +32 -18
  93. package/src/cli/issuer-membership.ts +103 -0
  94. package/src/cli/known-gaps.ts +118 -25
  95. package/src/cli/listing-arg.ts +315 -43
  96. package/src/cli/name-entries.ts +73 -22
  97. package/src/cli/native-smoke.ts +2 -0
  98. package/src/cli/not-a-ticker.ts +19 -9
  99. package/src/cli/opentui-libc.ts +5 -0
  100. package/src/cli/options.ts +12 -0
  101. package/src/cli/pane-functions/capabilities.ts +77 -20
  102. package/src/cli/pane-functions/catalog.ts +40 -23
  103. package/src/cli/pane-functions/discovery.ts +1 -1
  104. package/src/cli/pane-functions/dom.ts +12 -8
  105. package/src/cli/pane-functions/financial-ratio-shot.ts +2 -2
  106. package/src/cli/pane-functions/freshness.ts +174 -23
  107. package/src/cli/pane-functions/function-help.ts +66 -27
  108. package/src/cli/pane-functions/headless.ts +48 -16
  109. package/src/cli/pane-functions/index.ts +82 -21
  110. package/src/cli/pane-functions/options.ts +22 -2
  111. package/src/cli/pane-functions/report-notices.ts +12 -4
  112. package/src/cli/pane-functions/report.ts +5 -5
  113. package/src/cli/pane-functions/resolver.ts +65 -14
  114. package/src/cli/pane-functions/screenshot-assessment.ts +322 -0
  115. package/src/cli/pane-functions/screenshot-bridge.ts +152 -0
  116. package/src/cli/pane-functions/screenshot-chart-evidence.ts +396 -0
  117. package/src/cli/pane-functions/screenshot-data-evidence.ts +383 -0
  118. package/src/cli/pane-functions/screenshot-evidence.ts +1 -1
  119. package/src/cli/pane-functions/screenshot-payload.ts +453 -0
  120. package/src/cli/pane-functions/screenshot-render.ts +316 -0
  121. package/src/cli/pane-functions/screenshot-types.ts +162 -0
  122. package/src/cli/pane-functions/shot-options.ts +8 -3
  123. package/src/cli/peso-dollar-rates.ts +79 -0
  124. package/src/cli/quote-answer.ts +38 -3
  125. package/src/cli/report-tables.ts +190 -27
  126. package/src/cli/restore-plugins.ts +29 -14
  127. package/src/cli/result.ts +122 -25
  128. package/src/cli/series-search.ts +5 -5
  129. package/src/cli/statement-filings.ts +19 -0
  130. package/src/cli/suffixed-listing-rows.ts +49 -0
  131. package/src/cli/symbol-args.ts +50 -15
  132. package/src/cli/symbol-cells.ts +120 -0
  133. package/src/cli/symbol-list.ts +226 -60
  134. package/src/cli/symbol-rows.ts +131 -25
  135. package/src/cli/ticker-resolution.ts +108 -11
  136. package/src/cli/treasury-yields.ts +5 -5
  137. package/src/cli/types.ts +2 -0
  138. package/src/cli/uncovered-instrument.ts +3 -3
  139. package/src/cli/unknown-command.ts +6 -6
  140. package/src/components/chart/composite/chart-layout.ts +131 -0
  141. package/src/components/chart/composite/composite-chart.tsx +387 -21
  142. package/src/components/chart/composite/drawing-store.ts +26 -6
  143. package/src/components/chart/composite/interactions.ts +9 -3
  144. package/src/components/chart/composite/legend.tsx +75 -3
  145. package/src/components/chart/composite/levels.ts +5 -0
  146. package/src/components/chart/composite/panel-gestures.ts +41 -0
  147. package/src/components/chart/composite/panel-labels.ts +2 -1
  148. package/src/components/chart/composite/panel-surface.tsx +316 -11
  149. package/src/components/chart/composite/price-axis-labels.tsx +27 -3
  150. package/src/components/chart/composite/rasterizer.ts +44 -19
  151. package/src/components/chart/composite/scene.ts +16 -4
  152. package/src/components/chart/composite/text-renderer.ts +48 -21
  153. package/src/components/chart/composite/toolbar.tsx +52 -5
  154. package/src/components/chart/composite/types.ts +19 -0
  155. package/src/components/chart/composite/use-composite-chart-keyboard.ts +120 -13
  156. package/src/components/chart/composite/use-composite-value-scales.ts +44 -0
  157. package/src/components/chart/composite/use-composite-viewport.ts +12 -3
  158. package/src/components/chart/composite/value-scale.ts +149 -0
  159. package/src/components/chart/composite/volume-profile-paint.ts +6 -3
  160. package/src/components/chart/core/pointer.ts +2 -0
  161. package/src/components/chart-table/index.ts +2 -0
  162. package/src/components/chart-table/read.tsx +74 -0
  163. package/src/components/command-bar/commands/collection-list.ts +41 -19
  164. package/src/components/command-bar/commands/collection.ts +9 -3
  165. package/src/components/command-bar/commands/direct/index.ts +1 -1
  166. package/src/components/command-bar/commands/direct/runtime.ts +3 -2
  167. package/src/components/command-bar/pane-templates/items.ts +59 -6
  168. package/src/components/command-bar/pane-templates/workflow.ts +10 -1
  169. package/src/components/command-bar/routes/root/command-items.ts +32 -6
  170. package/src/components/command-bar/routes/root/plugin-install.ts +1 -1
  171. package/src/components/command-bar/routes/root/provider-search.ts +42 -11
  172. package/src/components/command-bar/routes/root/results.ts +18 -4
  173. package/src/components/command-bar/routes/root/runtime.ts +15 -3
  174. package/src/components/command-bar/routes/root/search-providers.ts +25 -2
  175. package/src/components/command-bar/routes/root/selection.ts +6 -1
  176. package/src/components/command-bar/routes/root/shortcut-feedback.ts +4 -1
  177. package/src/components/command-bar/routes/root/shortcuts.ts +30 -3
  178. package/src/components/command-bar/routes/ticker-search/results.ts +73 -4
  179. package/src/components/command-bar/selection-runtime.ts +50 -10
  180. package/src/components/command-bar/surface/index.tsx +24 -2
  181. package/src/components/command-bar/view-model.ts +7 -0
  182. package/src/components/command-bar/workflow/broker.ts +2 -2
  183. package/src/components/command-bar/workflow/collection-actions.ts +46 -7
  184. package/src/components/command-bar/workflow/collection-ticker.ts +32 -4
  185. package/src/components/command-bar/workflow/fields.ts +8 -2
  186. package/src/components/command-bar/workflow/ops.ts +18 -4
  187. package/src/components/command-bar/workflow/portfolio-position.ts +53 -4
  188. package/src/components/command-bar/workflow/submit.ts +3 -2
  189. package/src/components/command-bar/workflow/tickers.ts +5 -1
  190. package/src/components/company-logo.tsx +39 -0
  191. package/src/components/data-table/sections.ts +4 -2
  192. package/src/components/data-table/view.tsx +23 -3
  193. package/src/components/form-modal/confirm.tsx +2 -1
  194. package/src/components/form-modal/request.ts +5 -0
  195. package/src/components/form-modal/routes.ts +4 -1
  196. package/src/components/index.ts +13 -6
  197. package/src/components/layout/detached-pane-shell.tsx +1 -0
  198. package/src/components/layout/floating-pane.tsx +1 -0
  199. package/src/components/layout/header.tsx +234 -60
  200. package/src/components/layout/market-summary.ts +9 -6
  201. package/src/components/layout/pane/capture-status.ts +1 -1
  202. package/src/components/layout/pane/footer/model.ts +11 -5
  203. package/src/components/layout/pane/header.tsx +10 -3
  204. package/src/components/layout/pane/index.tsx +1 -0
  205. package/src/components/layout/pane/pane-tabs.tsx +9 -1
  206. package/src/components/layout/shell/chrome.ts +19 -6
  207. package/src/components/layout/shell/index.tsx +2 -1
  208. package/src/components/layout/shell/pane/layers.tsx +19 -1
  209. package/src/components/layout/status-bar.tsx +2 -2
  210. package/src/components/market-board/index.tsx +11 -3
  211. package/src/components/onboarding/onboarding-wizard.tsx +1 -0
  212. package/src/components/onboarding/portfolio-step/broker-setup-panel.tsx +2 -2
  213. package/src/components/onboarding/wizard-broker-sync.ts +4 -1
  214. package/src/components/pane-settings-dialog/desktop.tsx +20 -7
  215. package/src/components/pane-settings-dialog/tui.tsx +17 -9
  216. package/src/components/pane-settings-dialog/value.ts +8 -1
  217. package/src/components/pane-settings-dialog.tsx +44 -13
  218. package/src/components/sign-in-code-panel.tsx +27 -19
  219. package/src/components/ui/column-grid.tsx +48 -4
  220. package/src/components/ui/country-flag-art.tsx +180 -0
  221. package/src/components/ui/country-flag.tsx +118 -12
  222. package/src/components/ui/data-table/opentui/index.tsx +61 -2
  223. package/src/components/ui/data-table/opentui/model.ts +109 -2
  224. package/src/components/ui/data-table/types.ts +1 -1
  225. package/src/components/ui/display.tsx +5 -1
  226. package/src/components/ui/index.ts +3 -1
  227. package/src/components/ui/logo-mark.tsx +11 -2
  228. package/src/components/ui/query-bar.tsx +1 -1
  229. package/src/components/ui/row-notes.ts +79 -0
  230. package/src/components/ui/stat-grid.tsx +28 -3
  231. package/src/components/ui/status.tsx +3 -1
  232. package/src/core/app-services.ts +4 -0
  233. package/src/core/state/app/layout.ts +4 -4
  234. package/src/data/cached-query.ts +8 -1
  235. package/src/data/config/chart-settings.ts +3 -3
  236. package/src/data/config/home.ts +10 -2
  237. package/src/data/config/layout.ts +4 -1
  238. package/src/data/config/store/node.ts +4 -0
  239. package/src/data/config/store/normalize.ts +13 -3
  240. package/src/data/config/store/portfolio-as-of-column.ts +2 -2
  241. package/src/data/json-storage.ts +2 -0
  242. package/src/data/saved-copies.ts +84 -0
  243. package/src/docs/snapshot.json +65 -32
  244. package/src/i18n/es.ts +51 -12
  245. package/src/i18n/ja.ts +51 -12
  246. package/src/i18n/ko.ts +51 -12
  247. package/src/i18n/zh-cn.ts +51 -12
  248. package/src/i18n/zh-tw.ts +51 -12
  249. package/src/layout/desks.ts +1 -1
  250. package/src/layout/launch-layout.ts +1 -1
  251. package/src/layout/pane-manager/floating-actions.ts +5 -3
  252. package/src/layout/pane-manager/floating.ts +43 -1
  253. package/src/layout/pane-manager/index.ts +2 -0
  254. package/src/layout/selected-ticker.ts +74 -0
  255. package/src/market-data/depositary-pair.ts +251 -0
  256. package/src/market-data/futures-board.ts +1 -1
  257. package/src/market-data/futures-contract.ts +124 -40
  258. package/src/market-data/fx-closes.ts +17 -2
  259. package/src/market-data/hooks.tsx +19 -11
  260. package/src/market-data/market/change-basis.ts +49 -7
  261. package/src/market-data/market/freshness.ts +34 -5
  262. package/src/market-data/market/period-return.ts +163 -0
  263. package/src/market-data/market/trading-sessions.ts +13 -0
  264. package/src/market-data/market/year-to-date.ts +8 -13
  265. package/src/market-data/performance.ts +20 -14
  266. package/src/market-data/perpetual-premium.ts +32 -0
  267. package/src/market-data/published-apac-sessions.ts +2 -1
  268. package/src/market-data/published-futures-sessions.ts +69 -0
  269. package/src/market-data/quotes/contributions.ts +5 -1
  270. package/src/market-data/quotes/freshness.ts +42 -0
  271. package/src/market-data/quotes/intraday-bar.ts +37 -0
  272. package/src/market-data/quotes/regular-session-valuation.ts +13 -8
  273. package/src/market-data/quotes/resolution.ts +4 -2
  274. package/src/market-data/tax-equivalent.ts +1 -1
  275. package/src/market-data/ticker-price-returns.ts +3 -1
  276. package/src/news/aggregator.ts +5 -1
  277. package/src/news/news-model.ts +4 -0
  278. package/src/news/types.ts +11 -0
  279. package/src/notifications/app-notifier.ts +1 -1
  280. package/src/plugins/auto-update.ts +2 -2
  281. package/src/plugins/builtin/account-management/index.tsx +1 -0
  282. package/src/plugins/builtin/account-management/pane.tsx +9 -8
  283. package/src/plugins/builtin/alerts/alert-engine.ts +30 -18
  284. package/src/plugins/builtin/alerts/calendar-events.ts +378 -0
  285. package/src/plugins/builtin/alerts/cli.ts +485 -76
  286. package/src/plugins/builtin/alerts/command.ts +5 -10
  287. package/src/plugins/builtin/alerts/event-rows.ts +9 -5
  288. package/src/plugins/builtin/alerts/events-pane.tsx +71 -56
  289. package/src/plugins/builtin/alerts/events.ts +108 -5
  290. package/src/plugins/builtin/alerts/fired-log.ts +78 -0
  291. package/src/plugins/builtin/alerts/format.ts +2 -1
  292. package/src/plugins/builtin/alerts/headless.ts +100 -39
  293. package/src/plugins/builtin/alerts/history-pane.tsx +105 -62
  294. package/src/plugins/builtin/alerts/history-rows.ts +89 -0
  295. package/src/plugins/builtin/alerts/index.tsx +45 -18
  296. package/src/plugins/builtin/alerts/iv-level.ts +365 -0
  297. package/src/plugins/builtin/alerts/levels.ts +3 -3
  298. package/src/plugins/builtin/alerts/pane.tsx +97 -29
  299. package/src/plugins/builtin/alerts/price.ts +35 -0
  300. package/src/plugins/builtin/alerts/quotes.ts +24 -0
  301. package/src/plugins/builtin/alerts/research-builder.ts +84 -11
  302. package/src/plugins/builtin/alerts/research-rules.ts +77 -3
  303. package/src/plugins/builtin/alerts/scheduled-check.ts +206 -32
  304. package/src/plugins/builtin/alerts/scheduled-sources.ts +26 -3
  305. package/src/plugins/builtin/alerts/scheduled.ts +188 -29
  306. package/src/plugins/builtin/alerts/storage.ts +13 -10
  307. package/src/plugins/builtin/alerts/targets.ts +12 -3
  308. package/src/plugins/builtin/analytics/index.tsx +8 -2
  309. package/src/plugins/builtin/analytics/metrics.ts +1 -1
  310. package/src/plugins/builtin/analytics/risk-book.ts +215 -0
  311. package/src/plugins/builtin/analytics/risk-client.ts +13 -6
  312. package/src/plugins/builtin/analytics/risk-headless.ts +55 -21
  313. package/src/plugins/builtin/analytics/risk-math.ts +6 -3
  314. package/src/plugins/builtin/analytics/risk-model.ts +297 -104
  315. package/src/plugins/builtin/analytics/risk-options.ts +17 -2
  316. package/src/plugins/builtin/analytics/risk-pane.tsx +107 -43
  317. package/src/plugins/builtin/attention/pane.tsx +22 -16
  318. package/src/plugins/builtin/awards/headless.ts +7 -3
  319. package/src/plugins/builtin/awards/model.ts +18 -0
  320. package/src/plugins/builtin/awards/pane.tsx +12 -9
  321. package/src/plugins/builtin/backtest/export.ts +1 -1
  322. package/src/plugins/builtin/backtest/headless.ts +3 -3
  323. package/src/plugins/builtin/backtest/rules.ts +41 -5
  324. package/src/plugins/builtin/broker-manager/add-flow.tsx +12 -7
  325. package/src/plugins/builtin/broker-manager/detail.tsx +47 -19
  326. package/src/plugins/builtin/broker-manager/footer.ts +27 -11
  327. package/src/plugins/builtin/broker-manager/index.tsx +21 -12
  328. package/src/plugins/builtin/broker-manager/keyboard.ts +1 -1
  329. package/src/plugins/builtin/broker-manager/model.ts +12 -2
  330. package/src/plugins/builtin/broker-manager/pane-actions.tsx +183 -57
  331. package/src/plugins/builtin/broker-manager/table.ts +28 -12
  332. package/src/plugins/builtin/broker-trading/account-picker.tsx +2 -1
  333. package/src/plugins/builtin/broker-trading/chart-levels.ts +82 -13
  334. package/src/plugins/builtin/broker-trading/controller.ts +45 -13
  335. package/src/plugins/builtin/broker-trading/dock.tsx +24 -4
  336. package/src/plugins/builtin/broker-trading/headless.ts +2 -1
  337. package/src/plugins/builtin/broker-trading/index.tsx +7 -1
  338. package/src/plugins/builtin/broker-trading/linked-orders.ts +148 -0
  339. package/src/plugins/builtin/broker-trading/order-feed.ts +75 -7
  340. package/src/plugins/builtin/broker-trading/orders.tsx +109 -31
  341. package/src/plugins/builtin/broker-trading/overview-orders.tsx +9 -3
  342. package/src/plugins/builtin/broker-trading/pane-model.ts +30 -2
  343. package/src/plugins/builtin/broker-trading/pane.tsx +115 -26
  344. package/src/plugins/builtin/broker-trading/ticket-parts.tsx +36 -7
  345. package/src/plugins/builtin/broker-trading/ticket.tsx +122 -36
  346. package/src/plugins/builtin/buildout/cells.tsx +4 -0
  347. package/src/plugins/builtin/buildout/detail/index.tsx +5 -1
  348. package/src/plugins/builtin/buildout/detail/ui.tsx +7 -4
  349. package/src/plugins/builtin/buildout/pane/index.tsx +34 -18
  350. package/src/plugins/builtin/buildout/pane/status.tsx +0 -4
  351. package/src/plugins/builtin/builtin-plugin-meta.ts +1 -1
  352. package/src/plugins/builtin/catalysts/client.ts +2 -2
  353. package/src/plugins/builtin/catalysts/detail.tsx +3 -2
  354. package/src/plugins/builtin/catalysts/index.tsx +1 -1
  355. package/src/plugins/builtin/catalysts/model.ts +49 -4
  356. package/src/plugins/builtin/catalysts/pane.tsx +9 -11
  357. package/src/plugins/builtin/central-bank-rates/client.ts +5 -0
  358. package/src/plugins/builtin/central-bank-rates/headless.ts +36 -10
  359. package/src/plugins/builtin/central-bank-rates/model.ts +33 -8
  360. package/src/plugins/builtin/changelog/index.tsx +1 -0
  361. package/src/plugins/builtin/chart-composer/catalog-inventory.ts +1 -0
  362. package/src/plugins/builtin/chart-composer/chart-spec-edit.ts +2 -1
  363. package/src/plugins/builtin/chart-composer/chart-spec.ts +7 -0
  364. package/src/plugins/builtin/chart-composer/cli-options.ts +2 -5
  365. package/src/plugins/builtin/chart-composer/data-catalog-pane.tsx +2 -1
  366. package/src/plugins/builtin/chart-composer/editor/controller.ts +2 -0
  367. package/src/plugins/builtin/chart-composer/editor.tsx +4 -1
  368. package/src/plugins/builtin/chart-composer/headless-schema.ts +28 -26
  369. package/src/plugins/builtin/chart-composer/headless.ts +253 -35
  370. package/src/plugins/builtin/chart-composer/index.tsx +12 -2
  371. package/src/plugins/builtin/chart-composer/leverage-overlay.ts +142 -0
  372. package/src/plugins/builtin/chart-composer/pane.tsx +128 -28
  373. package/src/plugins/builtin/chart-composer/series-catalog.ts +1 -0
  374. package/src/plugins/builtin/chart-composer/series-expression.ts +65 -6
  375. package/src/plugins/builtin/chart-composer/session-history.ts +15 -21
  376. package/src/plugins/builtin/chart-composer/session-range.ts +4 -2
  377. package/src/plugins/builtin/chart-composer/settings.ts +31 -19
  378. package/src/plugins/builtin/chart-composer/use-series-catalog.ts +5 -6
  379. package/src/plugins/builtin/chart-composer/viewport-labels.ts +18 -8
  380. package/src/plugins/builtin/chat/attachments/model.ts +3 -1
  381. package/src/plugins/builtin/chat/content/index.tsx +1 -1
  382. package/src/plugins/builtin/chat/pane-links/open.ts +1 -1
  383. package/src/plugins/builtin/chat/people.ts +1 -1
  384. package/src/plugins/builtin/clinical-trials/client.ts +5 -2
  385. package/src/plugins/builtin/clinical-trials/model.ts +13 -4
  386. package/src/plugins/builtin/clinical-trials/pane.tsx +32 -12
  387. package/src/plugins/builtin/clinical-trials/ticker-sponsor.ts +17 -0
  388. package/src/plugins/builtin/cloud/askg/controller.ts +1 -1
  389. package/src/plugins/builtin/cloud/askg/lock-note.ts +1 -1
  390. package/src/plugins/builtin/cloud/askg/tool-display.ts +1 -1
  391. package/src/plugins/builtin/cloud/auth-commands.ts +3 -3
  392. package/src/plugins/builtin/cloud/team/pane-sections.tsx +105 -47
  393. package/src/plugins/builtin/cloud/team/pane-ui.tsx +42 -4
  394. package/src/plugins/builtin/cloud/team/pane.tsx +204 -64
  395. package/src/plugins/builtin/cloud/thesis/store.ts +45 -22
  396. package/src/plugins/builtin/cloud-tweets/registration.ts +1 -0
  397. package/src/plugins/builtin/commodities-energy/index.tsx +29 -2
  398. package/src/plugins/builtin/commodities-energy/view-state.ts +2 -0
  399. package/src/plugins/builtin/commodity-balances/pane.tsx +14 -8
  400. package/src/plugins/builtin/company-attention/app-rank.tsx +11 -10
  401. package/src/plugins/builtin/company-attention/building-model.ts +222 -0
  402. package/src/plugins/builtin/company-attention/building.tsx +172 -0
  403. package/src/plugins/builtin/company-attention/client.ts +117 -1
  404. package/src/plugins/builtin/company-attention/evidence.ts +16 -3
  405. package/src/plugins/builtin/company-attention/headless.ts +101 -5
  406. package/src/plugins/builtin/company-attention/index.tsx +6 -3
  407. package/src/plugins/builtin/company-attention/model.ts +33 -7
  408. package/src/plugins/builtin/company-attention/moves-model.ts +253 -0
  409. package/src/plugins/builtin/company-attention/moves.tsx +159 -0
  410. package/src/plugins/builtin/company-attention/pane.tsx +89 -31
  411. package/src/plugins/builtin/company-attention/signals-model.ts +229 -0
  412. package/src/plugins/builtin/company-attention/signals.tsx +160 -0
  413. package/src/plugins/builtin/company-kpis/headless.ts +3 -2
  414. package/src/plugins/builtin/company-kpis/model.ts +2 -2
  415. package/src/plugins/builtin/company-kpis/pane.tsx +5 -4
  416. package/src/plugins/builtin/composite-plugins.ts +2 -1
  417. package/src/plugins/builtin/congress-trades/headless.ts +1 -1
  418. package/src/plugins/builtin/connections/index.ts +1 -0
  419. package/src/plugins/builtin/correlation/headless-schema.ts +3 -2
  420. package/src/plugins/builtin/correlation/headless.ts +7 -4
  421. package/src/plugins/builtin/correlation/relationship/model.ts +1 -0
  422. package/src/plugins/builtin/correlation/settings.ts +1 -0
  423. package/src/plugins/builtin/cot/headless.ts +28 -6
  424. package/src/plugins/builtin/cot/model.ts +12 -0
  425. package/src/plugins/builtin/cot/pane.tsx +7 -5
  426. package/src/plugins/builtin/cpi/headless.ts +5 -1
  427. package/src/plugins/builtin/cpi/pane.tsx +11 -9
  428. package/src/plugins/builtin/credit-boards/model.ts +2 -0
  429. package/src/plugins/builtin/credit-documents/headless.ts +1 -1
  430. package/src/plugins/builtin/credit-documents/pane.tsx +8 -7
  431. package/src/plugins/builtin/crypto-board/client.ts +86 -0
  432. package/src/plugins/builtin/crypto-board/defi-view.tsx +218 -0
  433. package/src/plugins/builtin/crypto-board/defi.ts +239 -0
  434. package/src/plugins/builtin/crypto-board/headless.ts +117 -6
  435. package/src/plugins/builtin/crypto-board/index.tsx +8 -3
  436. package/src/plugins/builtin/crypto-board/model.ts +40 -8
  437. package/src/plugins/builtin/crypto-board/pane.tsx +55 -21
  438. package/src/plugins/builtin/crypto-board/series.ts +19 -1
  439. package/src/plugins/builtin/crypto-etf-flows/client.ts +60 -0
  440. package/src/plugins/builtin/crypto-etf-flows/headless.ts +132 -0
  441. package/src/plugins/builtin/crypto-etf-flows/index.tsx +44 -0
  442. package/src/plugins/builtin/crypto-etf-flows/model.ts +121 -0
  443. package/src/plugins/builtin/crypto-etf-flows/pane.tsx +193 -0
  444. package/src/plugins/builtin/debt-maturities/pane.tsx +4 -3
  445. package/src/plugins/builtin/debug/index.tsx +1 -0
  446. package/src/plugins/builtin/dividend-yield/index.tsx +1 -1
  447. package/src/plugins/builtin/docs/index.tsx +1 -1
  448. package/src/plugins/builtin/docs/pane.tsx +2 -2
  449. package/src/plugins/builtin/docs/targets.ts +1 -1
  450. package/src/plugins/builtin/doe/client.ts +5 -1
  451. package/src/plugins/builtin/doe/headless.ts +12 -6
  452. package/src/plugins/builtin/doe/model.ts +43 -6
  453. package/src/plugins/builtin/doe/pane.tsx +19 -12
  454. package/src/plugins/builtin/earnings/board-model.ts +13 -6
  455. package/src/plugins/builtin/earnings/board-table.ts +4 -1
  456. package/src/plugins/builtin/earnings/board.tsx +253 -50
  457. package/src/plugins/builtin/earnings/calendar-model.ts +188 -0
  458. package/src/plugins/builtin/earnings/calendar.tsx +338 -0
  459. package/src/plugins/builtin/earnings/client.ts +4 -3
  460. package/src/plugins/builtin/earnings/headless.ts +53 -15
  461. package/src/plugins/builtin/earnings/history-model.ts +53 -36
  462. package/src/plugins/builtin/earnings/index.tsx +15 -22
  463. package/src/plugins/builtin/earnings/model.ts +17 -12
  464. package/src/plugins/builtin/earnings/scope.ts +89 -0
  465. package/src/plugins/builtin/earnings-calls/calendar.tsx +310 -0
  466. package/src/plugins/builtin/earnings-calls/data.ts +146 -2
  467. package/src/plugins/builtin/earnings-calls/headless.ts +151 -9
  468. package/src/plugins/builtin/earnings-calls/index.tsx +3 -3
  469. package/src/plugins/builtin/earnings-calls/lock-note.ts +1 -1
  470. package/src/plugins/builtin/earnings-calls/pane.tsx +149 -31
  471. package/src/plugins/builtin/earnings-calls/upcoming.ts +195 -0
  472. package/src/plugins/builtin/earnings-ripple/pane.tsx +10 -5
  473. package/src/plugins/builtin/econ/calendar-model.ts +132 -20
  474. package/src/plugins/builtin/econ/detail-view.tsx +48 -10
  475. package/src/plugins/builtin/econ/fred-catalog.ts +23 -6
  476. package/src/plugins/builtin/econ/fred-series-map.ts +4 -0
  477. package/src/plugins/builtin/econ/index.tsx +112 -25
  478. package/src/plugins/builtin/econ/print-watch.ts +2 -1
  479. package/src/plugins/builtin/econ/types.ts +32 -1
  480. package/src/plugins/builtin/econ-statistics/client.ts +16 -3
  481. package/src/plugins/builtin/econ-statistics/defs.ts +4 -0
  482. package/src/plugins/builtin/econ-statistics/detail.tsx +2 -2
  483. package/src/plugins/builtin/econ-statistics/headless.ts +13 -2
  484. package/src/plugins/builtin/econ-statistics/index.tsx +3 -3
  485. package/src/plugins/builtin/econ-statistics/pane.tsx +2 -1
  486. package/src/plugins/builtin/econ-statistics/stats.ts +103 -0
  487. package/src/plugins/builtin/econ-statistics/view.ts +16 -1
  488. package/src/plugins/builtin/equity-screener/client.ts +21 -3
  489. package/src/plugins/builtin/equity-screener/headless.ts +77 -5
  490. package/src/plugins/builtin/equity-screener/live.ts +1 -1
  491. package/src/plugins/builtin/equity-screener/model.ts +34 -0
  492. package/src/plugins/builtin/equity-screener/pane.tsx +148 -106
  493. package/src/plugins/builtin/equity-screener/screen-check.ts +90 -0
  494. package/src/plugins/builtin/equity-screener/ticker-check.tsx +148 -0
  495. package/src/plugins/builtin/estimate-revisions/headless.ts +3 -1
  496. package/src/plugins/builtin/estimate-revisions/lock-note.ts +3 -3
  497. package/src/plugins/builtin/estimate-revisions/model.ts +8 -10
  498. package/src/plugins/builtin/exposure/headless.ts +51 -6
  499. package/src/plugins/builtin/exposure/index.tsx +28 -2
  500. package/src/plugins/builtin/exposure/model.ts +7 -0
  501. package/src/plugins/builtin/exposure/pane.tsx +16 -10
  502. package/src/plugins/builtin/fear-greed/index.tsx +1 -1
  503. package/src/plugins/builtin/filing-events/index.tsx +1 -1
  504. package/src/plugins/builtin/futures/model.ts +10 -9
  505. package/src/plugins/builtin/futures/returns.ts +8 -36
  506. package/src/plugins/builtin/futures/table.tsx +1 -1
  507. package/src/plugins/builtin/futures-curve/client.ts +40 -9
  508. package/src/plugins/builtin/futures-curve/headless.ts +39 -17
  509. package/src/plugins/builtin/futures-curve/model.ts +258 -69
  510. package/src/plugins/builtin/futures-curve/pane.tsx +46 -17
  511. package/src/plugins/builtin/fx-matrix/client.ts +15 -8
  512. package/src/plugins/builtin/fx-matrix/headless.ts +32 -14
  513. package/src/plugins/builtin/fx-matrix/index.tsx +13 -11
  514. package/src/plugins/builtin/fx-matrix/live-legs.ts +22 -0
  515. package/src/plugins/builtin/fx-matrix/settings.ts +2 -1
  516. package/src/plugins/builtin/gpu/board.tsx +4 -1
  517. package/src/plugins/builtin/gpu/changes.tsx +10 -10
  518. package/src/plugins/builtin/gpu/equities.tsx +4 -1
  519. package/src/plugins/builtin/gpu/headless.ts +9 -4
  520. package/src/plugins/builtin/gpu/history.tsx +4 -2
  521. package/src/plugins/builtin/gpu/pane.tsx +5 -3
  522. package/src/plugins/builtin/help/index.tsx +13 -3
  523. package/src/plugins/builtin/holders/beneficial-model.ts +8 -11
  524. package/src/plugins/builtin/holders/beneficial-report.ts +6 -5
  525. package/src/plugins/builtin/holders/beneficial-view.tsx +7 -3
  526. package/src/plugins/builtin/holders/client.ts +15 -2
  527. package/src/plugins/builtin/holders/format.ts +28 -17
  528. package/src/plugins/builtin/holders/headless.ts +48 -8
  529. package/src/plugins/builtin/holders/index-holders.ts +264 -0
  530. package/src/plugins/builtin/holders/pane.tsx +79 -15
  531. package/src/plugins/builtin/holders/report-rows.ts +35 -7
  532. package/src/plugins/builtin/holders/table-model.ts +2 -1
  533. package/src/plugins/builtin/holders/thirteenf-match.ts +3 -1
  534. package/src/plugins/builtin/holders/treemap.tsx +2 -2
  535. package/src/plugins/builtin/insider/base-values.ts +11 -7
  536. package/src/plugins/builtin/insider/client.ts +3 -0
  537. package/src/plugins/builtin/insider/headless.ts +20 -7
  538. package/src/plugins/builtin/insider/index.tsx +17 -8
  539. package/src/plugins/builtin/insider/issuer.ts +34 -4
  540. package/src/plugins/builtin/insider/signals-client.ts +3 -3
  541. package/src/plugins/builtin/insider/signals.tsx +1 -1
  542. package/src/plugins/builtin/insider/table-model.ts +35 -13
  543. package/src/plugins/builtin/insider/table.tsx +5 -2
  544. package/src/plugins/builtin/ipo-calendar/pane.tsx +7 -4
  545. package/src/plugins/builtin/iv-history/client.ts +20 -0
  546. package/src/plugins/builtin/iv-history/events.ts +145 -0
  547. package/src/plugins/builtin/iv-history/format.ts +3 -0
  548. package/src/plugins/builtin/iv-history/headless.ts +91 -7
  549. package/src/plugins/builtin/iv-history/index.tsx +1 -1
  550. package/src/plugins/builtin/iv-history/model.ts +13 -4
  551. package/src/plugins/builtin/iv-history/series.ts +3 -1
  552. package/src/plugins/builtin/jobs/lock-note.ts +1 -1
  553. package/src/plugins/builtin/jobs/model.ts +4 -15
  554. package/src/plugins/builtin/jobs/pane.tsx +7 -5
  555. package/src/plugins/builtin/jobs/share-bars.tsx +11 -5
  556. package/src/plugins/builtin/jodi/pane.tsx +14 -8
  557. package/src/plugins/builtin/layout-manager/index.tsx +1 -0
  558. package/src/plugins/builtin/macro-day/headless.ts +20 -7
  559. package/src/plugins/builtin/macro-day/index.tsx +3 -2
  560. package/src/plugins/builtin/macro-day/model.ts +29 -8
  561. package/src/plugins/builtin/macro-day/pane.tsx +46 -10
  562. package/src/plugins/builtin/macro-day/releases.ts +55 -13
  563. package/src/plugins/builtin/market-heatmap/data.ts +9 -2
  564. package/src/plugins/builtin/market-heatmap/evidence.ts +1 -1
  565. package/src/plugins/builtin/market-heatmap/headless.ts +9 -6
  566. package/src/plugins/builtin/market-heatmap/index.tsx +3 -3
  567. package/src/plugins/builtin/market-heatmap/model.ts +10 -7
  568. package/src/plugins/builtin/market-movers/client.ts +36 -21
  569. package/src/plugins/builtin/market-movers/headless.ts +8 -2
  570. package/src/plugins/builtin/market-movers/index.tsx +16 -10
  571. package/src/plugins/builtin/market-movers/screener.ts +33 -11
  572. package/src/plugins/builtin/market-movers/session-body.tsx +4 -2
  573. package/src/plugins/builtin/market-movers/session-table.ts +4 -2
  574. package/src/plugins/builtin/market-movers/table.ts +4 -1
  575. package/src/plugins/builtin/market-valuation/headless.ts +2 -0
  576. package/src/plugins/builtin/market-valuation/view.ts +5 -0
  577. package/src/plugins/builtin/members/headless.ts +6 -5
  578. package/src/plugins/builtin/members/pane.tsx +11 -4
  579. package/src/plugins/builtin/mna/client.ts +1 -0
  580. package/src/plugins/builtin/mna/detail.tsx +20 -32
  581. package/src/plugins/builtin/mna/distress/detail.tsx +16 -4
  582. package/src/plugins/builtin/mna/distress/model.ts +3 -2
  583. package/src/plugins/builtin/mna/distress/pane.tsx +7 -4
  584. package/src/plugins/builtin/mna/headless.ts +6 -13
  585. package/src/plugins/builtin/mna/model.ts +93 -15
  586. package/src/plugins/builtin/mna/pane.tsx +5 -4
  587. package/src/plugins/builtin/news/headless.ts +12 -6
  588. package/src/plugins/builtin/news/index.tsx +10 -1
  589. package/src/plugins/builtin/news/wire/index.tsx +3 -2
  590. package/src/plugins/builtin/news/wire/news/command-bar-search.ts +26 -10
  591. package/src/plugins/builtin/news/wire/news/query-presets.ts +6 -2
  592. package/src/plugins/builtin/news/wire/rss/cli.ts +3 -3
  593. package/src/plugins/builtin/notes/cli.ts +50 -15
  594. package/src/plugins/builtin/notes/export.ts +17 -6
  595. package/src/plugins/builtin/notes/files.ts +16 -5
  596. package/src/plugins/builtin/openfda/pane.tsx +1 -1
  597. package/src/plugins/builtin/options/carry.ts +2 -2
  598. package/src/plugins/builtin/options/enrichment-model.ts +10 -9
  599. package/src/plugins/builtin/options/index.tsx +1 -1
  600. package/src/plugins/builtin/options/model-spot.ts +70 -4
  601. package/src/plugins/builtin/options/view.tsx +51 -23
  602. package/src/plugins/builtin/options-calculator/headless.ts +46 -7
  603. package/src/plugins/builtin/options-calculator/pane.tsx +3 -2
  604. package/src/plugins/builtin/options-positioning/headless.ts +11 -3
  605. package/src/plugins/builtin/options-positioning/model.ts +24 -0
  606. package/src/plugins/builtin/options-positioning/pane.tsx +10 -12
  607. package/src/plugins/builtin/options-scenario/client.ts +142 -29
  608. package/src/plugins/builtin/options-scenario/collar.ts +8 -6
  609. package/src/plugins/builtin/options-scenario/csp-screen-headless.ts +127 -0
  610. package/src/plugins/builtin/options-scenario/csp-screen-pane.tsx +165 -0
  611. package/src/plugins/builtin/options-scenario/csp-screen.ts +258 -0
  612. package/src/plugins/builtin/options-scenario/csp.ts +101 -21
  613. package/src/plugins/builtin/options-scenario/headless.ts +49 -21
  614. package/src/plugins/builtin/options-scenario/hedge.ts +20 -14
  615. package/src/plugins/builtin/options-scenario/index.tsx +28 -3
  616. package/src/plugins/builtin/options-scenario/model.ts +13 -0
  617. package/src/plugins/builtin/options-scenario/pane.tsx +22 -10
  618. package/src/plugins/builtin/perps/equity-row.tsx +11 -3
  619. package/src/plugins/builtin/perps/freshness.ts +8 -5
  620. package/src/plugins/builtin/perps/headless.ts +3 -1
  621. package/src/plugins/builtin/perps/list-perpetuals.ts +25 -4
  622. package/src/plugins/builtin/perps/live-rows.ts +161 -0
  623. package/src/plugins/builtin/perps/markets-section.tsx +154 -0
  624. package/src/plugins/builtin/perps/pane.tsx +36 -17
  625. package/src/plugins/builtin/perps/venue-markets.ts +96 -0
  626. package/src/plugins/builtin/plugin-marketplace/index.tsx +2 -1
  627. package/src/plugins/builtin/plugin-marketplace/pane.tsx +145 -60
  628. package/src/plugins/builtin/portfolio-list/cli/bulk-symbols.ts +78 -27
  629. package/src/plugins/builtin/portfolio-list/cli/portfolio-command.ts +158 -141
  630. package/src/plugins/builtin/portfolio-list/cli/render.ts +49 -20
  631. package/src/plugins/builtin/portfolio-list/cli/shared.ts +3 -3
  632. package/src/plugins/builtin/portfolio-list/cli/watchlist-command.ts +29 -24
  633. package/src/plugins/builtin/portfolio-list/headless.ts +6 -3
  634. package/src/plugins/builtin/portfolio-list/income.ts +13 -2
  635. package/src/plugins/builtin/portfolio-list/index.tsx +9 -2
  636. package/src/plugins/builtin/portfolio-list/pane/index.tsx +21 -8
  637. package/src/plugins/builtin/portfolio-list/pane/purchase-date-fx.ts +46 -0
  638. package/src/plugins/builtin/portfolio-list/summary/live-accounts.ts +16 -9
  639. package/src/plugins/builtin/portfolio-list/summary/totals.ts +2 -15
  640. package/src/plugins/builtin/power/client.ts +6 -3
  641. package/src/plugins/builtin/power/evidence.ts +22 -7
  642. package/src/plugins/builtin/power/gas.tsx +5 -1
  643. package/src/plugins/builtin/power/pane.tsx +44 -32
  644. package/src/plugins/builtin/power/prices.tsx +10 -3
  645. package/src/plugins/builtin/research/analyst-headless.ts +25 -8
  646. package/src/plugins/builtin/research/analyst-model.ts +68 -3
  647. package/src/plugins/builtin/research/corporate-actions-pane.tsx +63 -14
  648. package/src/plugins/builtin/research/event-model.ts +3 -1
  649. package/src/plugins/builtin/research/event-sources.ts +12 -4
  650. package/src/plugins/builtin/research/index.tsx +2 -1
  651. package/src/plugins/builtin/research/relative-valuation-basis.ts +58 -0
  652. package/src/plugins/builtin/research/relative-valuation-columns.ts +31 -2
  653. package/src/plugins/builtin/research/relative-valuation-currency.ts +12 -5
  654. package/src/plugins/builtin/research/relative-valuation-headless.ts +84 -26
  655. package/src/plugins/builtin/research/relative-valuation-model.ts +88 -19
  656. package/src/plugins/builtin/research/relative-valuation-pane.tsx +76 -9
  657. package/src/plugins/builtin/research/relative-valuation-peers.ts +1 -1
  658. package/src/plugins/builtin/reverse-dcf/client.ts +2 -1
  659. package/src/plugins/builtin/reverse-dcf/model.ts +10 -5
  660. package/src/plugins/builtin/risk-factors/index.tsx +2 -2
  661. package/src/plugins/builtin/scanner/lock-note.ts +1 -1
  662. package/src/plugins/builtin/seasonality/client.ts +2 -1
  663. package/src/plugins/builtin/sec/forms.ts +13 -0
  664. package/src/plugins/builtin/sec/fund-abroad.ts +32 -0
  665. package/src/plugins/builtin/sec/fund-facts.ts +68 -8
  666. package/src/plugins/builtin/sec/headless.ts +85 -8
  667. package/src/plugins/builtin/sec/index.tsx +58 -12
  668. package/src/plugins/builtin/sectors/client.ts +6 -4
  669. package/src/plugins/builtin/sectors/sector-model.ts +11 -15
  670. package/src/plugins/builtin/series-inventory.ts +2 -0
  671. package/src/plugins/builtin/shared/broker-reconnect.ts +107 -22
  672. package/src/plugins/builtin/shared/cloud-resource.ts +15 -2
  673. package/src/plugins/builtin/shared/cloud-upgrade.ts +34 -6
  674. package/src/plugins/builtin/shared/earnings-calendar.ts +375 -0
  675. package/src/plugins/builtin/{earnings/estimate-basis.ts → shared/earnings-estimate-basis.ts} +1 -1
  676. package/src/plugins/builtin/shared/earnings-report.ts +3 -3
  677. package/src/plugins/builtin/shared/fx-rate-freshness.ts +23 -1
  678. package/src/plugins/builtin/shared/job-posting.ts +129 -0
  679. package/src/plugins/builtin/shared/pro-lock-note.ts +3 -3
  680. package/src/plugins/builtin/shared/report-freshness.ts +3 -0
  681. package/src/plugins/builtin/shared/research-trading.tsx +23 -0
  682. package/src/plugins/builtin/shared/series-cache.ts +2 -0
  683. package/src/plugins/builtin/shared/series-list-detail.tsx +3 -1
  684. package/src/plugins/builtin/shared/ticker-surface.ts +2 -1
  685. package/src/plugins/builtin/shared/volatility/options.ts +2 -1
  686. package/src/plugins/builtin/short-interest/client.ts +2 -0
  687. package/src/plugins/builtin/short-interest/headless.ts +41 -12
  688. package/src/plugins/builtin/short-interest/index.tsx +23 -1
  689. package/src/plugins/builtin/short-interest/model.ts +70 -19
  690. package/src/plugins/builtin/short-interest/pane.tsx +19 -2
  691. package/src/plugins/builtin/short-interest/publications-client.ts +82 -0
  692. package/src/plugins/builtin/short-interest/publications-headless.ts +29 -0
  693. package/src/plugins/builtin/short-interest/publications-model.ts +50 -0
  694. package/src/plugins/builtin/short-interest/publications-pane.tsx +66 -0
  695. package/src/plugins/builtin/short-interest/schedule.ts +35 -2
  696. package/src/plugins/builtin/short-interest/surface.tsx +11 -4
  697. package/src/plugins/builtin/short-interest/types.ts +9 -0
  698. package/src/plugins/builtin/short-interest/watch-client.ts +14 -8
  699. package/src/plugins/builtin/short-interest/watch-model.ts +12 -25
  700. package/src/plugins/builtin/short-interest/watch-pane.tsx +5 -1
  701. package/src/plugins/builtin/social-mentions/client.ts +2 -1
  702. package/src/plugins/builtin/supply-chain/flow.tsx +33 -9
  703. package/src/plugins/builtin/supply-chain/model.ts +51 -3
  704. package/src/plugins/builtin/supply-chain/pane.tsx +78 -39
  705. package/src/plugins/builtin/supply-chain/row-evidence.tsx +1 -1
  706. package/src/plugins/builtin/themes/headless.ts +8 -5
  707. package/src/plugins/builtin/themes/model.ts +14 -4
  708. package/src/plugins/builtin/themes/pane.tsx +24 -5
  709. package/src/plugins/builtin/thirteenf/headless.ts +5 -5
  710. package/src/plugins/builtin/thirteenf/signals.ts +3 -1
  711. package/src/plugins/builtin/ticker-detail/adr-pair/headless.ts +123 -0
  712. package/src/plugins/builtin/ticker-detail/adr-pair/model.ts +132 -0
  713. package/src/plugins/builtin/ticker-detail/adr-pair/tab.tsx +87 -0
  714. package/src/plugins/builtin/ticker-detail/data-panes/historical-prices.tsx +40 -26
  715. package/src/plugins/builtin/ticker-detail/data-panes/history-bars.ts +8 -4
  716. package/src/plugins/builtin/ticker-detail/data-panes/returns-history.ts +67 -3
  717. package/src/plugins/builtin/ticker-detail/data-panes/returns-model.ts +112 -5
  718. package/src/plugins/builtin/ticker-detail/data-panes/returns-pane.tsx +17 -2
  719. package/src/plugins/builtin/ticker-detail/financials/aggregation.ts +21 -7
  720. package/src/plugins/builtin/ticker-detail/financials/model.ts +36 -1
  721. package/src/plugins/builtin/ticker-detail/financials/offerings.ts +56 -0
  722. package/src/plugins/builtin/ticker-detail/financials/ratios.ts +62 -13
  723. package/src/plugins/builtin/ticker-detail/financials/tab.tsx +30 -4
  724. package/src/plugins/builtin/ticker-detail/headless-schema.ts +14 -2
  725. package/src/plugins/builtin/ticker-detail/headless.ts +148 -35
  726. package/src/plugins/builtin/ticker-detail/index.tsx +37 -5
  727. package/src/plugins/builtin/ticker-detail/overview/model.ts +65 -10
  728. package/src/plugins/builtin/ticker-detail/overview/pane.tsx +9 -1
  729. package/src/plugins/builtin/ticker-detail/overview-tab.tsx +68 -11
  730. package/src/plugins/builtin/ticker-detail/pane.tsx +11 -0
  731. package/src/plugins/builtin/ticker-detail/quote-footer.ts +8 -3
  732. package/src/plugins/builtin/ticker-detail/research-tabs.ts +11 -0
  733. package/src/plugins/builtin/vol-surface/client.ts +28 -7
  734. package/src/plugins/builtin/vol-surface/headless.ts +43 -15
  735. package/src/plugins/builtin/vol-surface/model.ts +34 -12
  736. package/src/plugins/builtin/vol-surface/pane.tsx +33 -13
  737. package/src/plugins/builtin/vol-surface/stored.ts +34 -3
  738. package/src/plugins/builtin/vol-surface/tables.ts +14 -0
  739. package/src/plugins/builtin/volatility/model.ts +5 -10
  740. package/src/plugins/builtin/world-venue-map/basemap-layer.tsx +4 -3
  741. package/src/plugins/builtin/world-venue-map/basemap.ts +3 -1
  742. package/src/plugins/builtin/world-venue-map/chokepoint-chart.ts +40 -0
  743. package/src/plugins/builtin/world-venue-map/evidence.ts +1 -1
  744. package/src/plugins/builtin/world-venue-map/geo-series.ts +90 -11
  745. package/src/plugins/builtin/world-venue-map/headless.ts +1 -1
  746. package/src/plugins/builtin/world-venue-map/index.ts +3 -26
  747. package/src/plugins/builtin/world-venue-map/layers.ts +1 -1
  748. package/src/plugins/builtin/world-venue-map/map.tsx +2 -1
  749. package/src/plugins/builtin/world-venue-map/pane.tsx +4 -2
  750. package/src/plugins/builtin/world-venue-map/venue-header.tsx +15 -4
  751. package/src/plugins/builtin/yield-curve/client.ts +25 -0
  752. package/src/plugins/builtin/yield-curve/curves.ts +7 -4
  753. package/src/plugins/builtin/yield-curve/headless.ts +38 -4
  754. package/src/plugins/builtin/yield-curve/history.ts +4 -3
  755. package/src/plugins/builtin/yield-curve/index.tsx +12 -6
  756. package/src/plugins/builtin/yield-curve/swaps-model.ts +93 -0
  757. package/src/plugins/builtin/yield-curve/swaps.tsx +99 -0
  758. package/src/plugins/bundle.ts +1 -1
  759. package/src/plugins/catalog-browser.ts +2 -1
  760. package/src/plugins/compat.ts +3 -3
  761. package/src/plugins/dependencies.ts +75 -14
  762. package/src/plugins/extracted-plugins.ts +132 -34
  763. package/src/plugins/host-link.ts +149 -34
  764. package/src/plugins/installer.ts +35 -10
  765. package/src/plugins/loader.ts +206 -38
  766. package/src/plugins/manager-node.ts +2 -2
  767. package/src/plugins/marketplace/deactivation.ts +22 -0
  768. package/src/plugins/marketplace/model.ts +2 -2
  769. package/src/plugins/marketplace/packs.ts +1 -1
  770. package/src/plugins/ownership.ts +1 -1
  771. package/src/plugins/peer-retry.ts +155 -0
  772. package/src/plugins/registry/contributions.ts +3 -1
  773. package/src/plugins/registry/index.ts +4 -3
  774. package/src/plugins/registry/plugin-state.ts +3 -0
  775. package/src/plugins/seed-notice.ts +20 -0
  776. package/src/plugins/shortcut-argument.ts +39 -0
  777. package/src/portfolio/allocation.ts +1 -1
  778. package/src/portfolio/collection-name.ts +31 -0
  779. package/src/portfolio/column-values.ts +10 -8
  780. package/src/portfolio/cost-fx.ts +296 -19
  781. package/src/portfolio/manual-lots.ts +75 -0
  782. package/src/portfolio/mutations.ts +60 -22
  783. package/src/portfolio/suffixed-listings.ts +209 -0
  784. package/src/portfolio/totals-currency.ts +24 -0
  785. package/src/public/__snapshots__/public-api.test.ts.snap +14 -0
  786. package/src/public/time-series.ts +11 -8
  787. package/src/remote/schema.ts +1 -1
  788. package/src/renderers/browser/config-host.ts +3 -0
  789. package/src/renderers/browser/main.tsx +23 -3
  790. package/src/renderers/dom/boot-frame-page.ts +187 -0
  791. package/src/renderers/dom/boot-frame.ts +237 -0
  792. package/src/renderers/dom/build-assets.ts +46 -8
  793. package/src/renderers/dom/desktop/controls.tsx +1 -1
  794. package/src/renderers/dom/desktop/query-bar.tsx +2 -0
  795. package/src/renderers/dom/dom-ui-host.tsx +4 -29
  796. package/src/renderers/dom/host/ascii-text.ts +16 -2
  797. package/src/renderers/dom/host/box.tsx +43 -2
  798. package/src/renderers/dom/host/chart-surface.tsx +2 -0
  799. package/src/renderers/dom/host/hls.chunk.ts +3 -0
  800. package/src/renderers/dom/host/image-surface.tsx +49 -0
  801. package/src/renderers/dom/host/media-surface.tsx +24 -18
  802. package/src/renderers/dom/host/mouse.ts +30 -0
  803. package/src/renderers/dom/host/size-observer.ts +1 -1
  804. package/src/renderers/dom/host/style.ts +1 -1
  805. package/src/renderers/dom/host/tabs.tsx +16 -5
  806. package/src/renderers/dom/host/top-surface.ts +127 -0
  807. package/src/renderers/dom/styles.css +115 -0
  808. package/src/renderers/dom/test-utils.tsx +2 -1
  809. package/src/renderers/electrobun/bun/application-menu/index.ts +3 -3
  810. package/src/renderers/electrobun/bun/core-capabilities.ts +9 -1
  811. package/src/renderers/electrobun/bun/desktop/backend-requests.ts +3 -0
  812. package/src/renderers/electrobun/bun/desktop/backend.ts +56 -3
  813. package/src/renderers/electrobun/bun/desktop/detached-windows.ts +1 -1
  814. package/src/renderers/electrobun/bun/desktop/host-requests.ts +9 -3
  815. package/src/renderers/electrobun/bun/desktop/initialization.ts +81 -18
  816. package/src/renderers/electrobun/bun/desktop/update.ts +210 -30
  817. package/src/renderers/electrobun/bun/external-plugins.ts +29 -7
  818. package/src/renderers/electrobun/bun/index.ts +11 -1
  819. package/src/renderers/electrobun/bun/window/boot-frame.ts +67 -0
  820. package/src/renderers/electrobun/bun/window/create.ts +4 -1
  821. package/src/renderers/electrobun/shared/boot-frame.ts +7 -0
  822. package/src/renderers/electrobun/shared/protocol.ts +6 -1
  823. package/src/renderers/electrobun/view/cli-pane-shot-entry.tsx +1 -1
  824. package/src/renderers/electrobun/view/config-host.ts +3 -0
  825. package/src/renderers/electrobun/view/fatal-screen.tsx +1 -1
  826. package/src/renderers/electrobun/view/main.tsx +30 -4
  827. package/src/renderers/electrobun/view/news-source.ts +9 -7
  828. package/src/renderers/electrobun/view/remote/asset-data-client.ts +9 -2
  829. package/src/renderers/electrobun/view/ui-host.tsx +1 -1
  830. package/src/renderers/opentui/browser-open.ts +88 -0
  831. package/src/renderers/opentui/host.tsx +5 -14
  832. package/src/renderers/opentui/image/loader.ts +3 -2
  833. package/src/renderers/opentui/native-smoke.ts +10 -1
  834. package/src/renderers/opentui/pane-image/index.ts +2 -1
  835. package/src/renderers/opentui/render-lib.ts +253 -0
  836. package/src/renderers/opentui/render-timing-smoke.ts +1 -1
  837. package/src/renderers/opentui/start.tsx +8 -1
  838. package/src/renderers/share/layout-view.tsx +2 -2
  839. package/src/renderers/share/main.tsx +4 -4
  840. package/src/renderers/share/view.tsx +1 -1
  841. package/src/series/resolve.ts +22 -6
  842. package/src/series/standalone.ts +30 -2
  843. package/src/series/types.ts +8 -1
  844. package/src/shares/api.ts +4 -1
  845. package/src/shares/pane.ts +1 -1
  846. package/src/sources/gloomberb-cloud/fred-series.ts +46 -1
  847. package/src/sources/gloomberb-cloud/index.ts +39 -16
  848. package/src/sources/gloomberb-cloud/news.ts +39 -0
  849. package/src/sources/gloomberb-cloud/normalizers.ts +14 -1
  850. package/src/sources/gloomberb-cloud/perpetuals.ts +49 -1
  851. package/src/sources/listing-symbols.ts +37 -0
  852. package/src/sources/provider-errors.ts +16 -2
  853. package/src/sources/provider-router/financial-routes.ts +21 -3
  854. package/src/sources/provider-router/financials.ts +15 -2
  855. package/src/sources/provider-router/history.ts +30 -8
  856. package/src/sources/provider-router/index.ts +16 -0
  857. package/src/sources/provider-router/primary.ts +1 -1
  858. package/src/state/app/bootstrap.ts +23 -0
  859. package/src/state/hooks/inline-tickers.ts +30 -5
  860. package/src/sync/controller.ts +1 -1
  861. package/src/sync/core-contributors.ts +46 -14
  862. package/src/team/collections-sync.ts +2 -1
  863. package/src/team/collections.ts +178 -17
  864. package/src/telemetry/crash-reports.ts +21 -4
  865. package/src/telemetry/update-failures-node.ts +59 -0
  866. package/src/telemetry/update-failures.ts +307 -0
  867. package/src/test-support/builtin-panes.ts +1 -1
  868. package/src/theme/colors.ts +3 -30
  869. package/src/theme/ui-tokens.ts +37 -1
  870. package/src/tickers/company-name-listing.ts +215 -36
  871. package/src/tickers/company-name.ts +43 -0
  872. package/src/tickers/index-roots.ts +47 -0
  873. package/src/tickers/instrument-label.ts +5 -1
  874. package/src/tickers/listing-fate.ts +30 -0
  875. package/src/tickers/metadata.ts +10 -0
  876. package/src/tickers/perpetual-listing.ts +5 -2
  877. package/src/tickers/search/home-listing.ts +75 -0
  878. package/src/tickers/search/index.ts +76 -27
  879. package/src/tickers/search/ranking.ts +54 -4
  880. package/src/tickers/search/upsert.ts +29 -0
  881. package/src/tickers/terminal-codes.ts +416 -40
  882. package/src/time-series/bar-aggregation.ts +243 -0
  883. package/src/time-series/base-series.ts +307 -0
  884. package/src/time-series/chart-bounds.ts +349 -0
  885. package/src/time-series/chart-seed.ts +142 -0
  886. package/src/time-series/economic.ts +5 -0
  887. package/src/time-series/fundamentals.ts +18 -3
  888. package/src/time-series/history-acquisition.ts +499 -0
  889. package/src/time-series/leverage.ts +100 -0
  890. package/src/time-series/market-resolution.ts +4 -2
  891. package/src/time-series/market.ts +2 -1
  892. package/src/time-series/price-comparison.ts +175 -30
  893. package/src/time-series/range.ts +9 -1
  894. package/src/time-series/resolution.ts +174 -16
  895. package/src/time-series/resolve-context.ts +157 -0
  896. package/src/time-series/resolve.ts +126 -1577
  897. package/src/time-series/series-name.ts +38 -0
  898. package/src/time-series/series-presentation.ts +208 -0
  899. package/src/time-series/spec.ts +11 -6
  900. package/src/time-series/studies.ts +109 -12
  901. package/src/time-series/tail-reconcile.ts +121 -0
  902. package/src/time-series/types.ts +29 -2
  903. package/src/time-series/use-chart-resolution.ts +4 -5
  904. package/src/types/broker.ts +10 -0
  905. package/src/types/config.ts +14 -0
  906. package/src/types/data-provider.ts +20 -0
  907. package/src/types/exchange-rate.ts +6 -0
  908. package/src/types/financials.ts +104 -7
  909. package/src/types/headless.ts +83 -6
  910. package/src/types/instrument.ts +3 -0
  911. package/src/types/issuer-listings.ts +28 -0
  912. package/src/types/plugin.ts +65 -8
  913. package/src/types/price-history.ts +2 -0
  914. package/src/types/ticker.ts +13 -0
  915. package/src/types/trading.ts +59 -1
  916. package/src/ui/ascii-font.ts +13 -1
  917. package/src/ui/host.tsx +6 -1
  918. package/src/updater/command-names.ts +175 -0
  919. package/src/updater/failure.ts +163 -0
  920. package/src/updater/index.ts +97 -28
  921. package/src/utils/calendar-date.ts +32 -15
  922. package/src/utils/cash-runway.ts +241 -0
  923. package/src/utils/central-banks.ts +42 -0
  924. package/src/utils/cli-output.ts +259 -80
  925. package/src/utils/contract-month.ts +16 -0
  926. package/src/utils/crypto-pair.ts +61 -3
  927. package/src/utils/currency-pair.ts +26 -0
  928. package/src/utils/currency-units.ts +29 -0
  929. package/src/utils/datetime-format.ts +10 -0
  930. package/src/utils/debug-log.ts +1 -1
  931. package/src/utils/decimal-comma.ts +39 -6
  932. package/src/utils/exchange-announcements.ts +71 -0
  933. package/src/utils/exchange-rate-snapshot.ts +10 -0
  934. package/src/utils/financial-statements.ts +83 -4
  935. package/src/utils/format.ts +34 -16
  936. package/src/utils/fundamentals.ts +150 -34
  937. package/src/utils/fx-market-hours.ts +10 -1
  938. package/src/utils/latest-financial-period.ts +8 -0
  939. package/src/utils/linux-libc.ts +54 -0
  940. package/src/utils/market-capitalization.ts +111 -15
  941. package/src/utils/max-drawdown.ts +64 -0
  942. package/src/utils/network-failure.ts +83 -0
  943. package/src/utils/option-expiry.ts +139 -7
  944. package/src/utils/price-earnings.ts +11 -5
  945. package/src/utils/price-history.ts +18 -8
  946. package/src/utils/price-window.ts +131 -0
  947. package/src/utils/release-date.ts +47 -0
  948. package/src/utils/sec.ts +71 -0
  949. package/src/utils/throttled-fetch.ts +11 -4
  950. package/src/utils/trailing-eps.ts +67 -0
  951. package/src/utils/typed-text.ts +21 -0
  952. package/src/utils/utc-time.ts +24 -1
  953. package/src/version.ts +6 -0
  954. package/src/cli/pane-functions/screenshot.ts +0 -2122
@@ -1,6 +1,8 @@
1
1
  import type { AppState } from "../../../state/app/context";
2
2
  import type { TickerRecord } from "../../../types/ticker";
3
3
  import { splitSymbolArgs, splitSymbolWords, symbolInputKey, uniqueSymbols } from "../../../cli/symbol-args";
4
+ import { protectFigureCommas } from "../../../cli/symbol-cells";
5
+ import { readSymbolList } from "../../../cli/symbol-list";
4
6
  import { readNameEntries } from "../../../cli/name-entries";
5
7
  import {
6
8
  addSymbols,
@@ -42,17 +44,17 @@ export interface PastedSymbolList {
42
44
  }
43
45
 
44
46
  /**
45
- * The entries of text typed or pasted after `AW`, split as `gloomberb quote`
47
+ * The entries of text typed or pasted after `AW`, split as `gloom quote`
46
48
  * splits its arguments (`splitSymbolArgs`): on commas, semicolons, tabs and
47
49
  * lines when it has them, where an entry with spaces may be a company's name
48
- * or several symbols, else on spaces. Null for one word or none, which keep
49
- * the single add. Spaces alone also separate a company's name (`Palo Alto
50
- * Networks`), which is why `separated` says when the text left no doubt it is
51
- * a list.
50
+ * or several symbols, else on spaces. A decimal comma (`2.582,52`) splits
51
+ * nothing. Null for one word or none, which keep the single add. Spaces alone
52
+ * also separate a company's name (`Palo Alto Networks`), which is why
53
+ * `separated` says when the text left no doubt it is a list.
52
54
  */
53
55
  export function pastedSymbolList(raw: string | undefined): PastedSymbolList | null {
54
56
  if (!raw || splitSymbolWords([raw]).length < 2) return null;
55
- return { ...uniqueSymbols(splitSymbolArgs([raw])), separated: /[,;\t\r\n]/.test(raw) };
57
+ return { ...uniqueSymbols(splitSymbolArgs([raw])), separated: /[,;\t\r\n]/.test(protectFigureCommas(raw)) };
56
58
  }
57
59
 
58
60
  /**
@@ -86,30 +88,45 @@ function reasonLine(row: SymbolRow): string | null {
86
88
  if (row.hint && row.status === "added") return row.hint;
87
89
  // Another company had the symbol: say which, beside the listing added.
88
90
  if (row.changeNote && row.status === "added") return row.changeNote;
91
+ // Listed only abroad: the venue and currency it was added on.
92
+ if (row.abroad && row.status === "added") return row.abroad;
89
93
  if (row.readAs && (row.status === "added" || row.status === "already_listed")) return row.readAs;
90
94
  // Why the match was left out, and the symbol it trades as now when there is one.
91
95
  if (row.status === "needs_choice") return row.message ?? typed;
96
+ // Not a symbol, or not looked up: the summary names them, and the notice says what to do about the second.
92
97
  if (row.status !== "failed" && !(row.status === "not_found" && row.message && !NO_MATCH.test(row.message))) return null;
93
98
  const text = reason(row.message ?? "", typed);
94
99
  return text.includes(typed) ? text : `${typed}: ${text}`;
95
100
  }
96
101
 
102
+ /** Rows that did not join the watchlist and say why, which keep the report up longer. */
103
+ const UNRESOLVED = new Set<SymbolRow["status"]>(["not_found", "needs_choice", "failed", "not_a_symbol", "not_looked_up"]);
104
+
97
105
  /**
98
106
  * What a list add says, in the words the CLI's summary uses: the counts, the
99
107
  * symbols that found nothing or were not added, and under it the reason for
100
- * each that has one. Skipped symbols keep the report up longer.
108
+ * each that has one, what the reader left out (the prices beside the
109
+ * symbols, in one line), and one line for the symbols Gloom Cloud did not
110
+ * answer for. Skipped symbols keep the report up longer.
101
111
  */
102
112
  function describeListAdd(
103
113
  rows: readonly SymbolRow[],
104
114
  watchlistName: string,
105
115
  repeated: number,
116
+ notes: readonly string[] = [],
106
117
  ): { body: string; type: "success" | "info" | "error"; duration?: number } {
107
118
  const summary = `Watchlist "${watchlistName}": ${summarizeSymbolRows(rows, "add", repeated)}`;
108
119
  const reasons = rows.map(reasonLine).filter((line): line is string => !!line);
120
+ const unanswered = rows.filter((row) => row.status === "not_looked_up").length;
109
121
  const added = rows.some((row) => row.status === "added");
110
- const unresolved = rows.some((row) => row.status === "not_found" || row.status === "needs_choice" || row.status === "failed");
122
+ const unresolved = rows.some((row) => UNRESOLVED.has(row.status));
111
123
  return {
112
- body: [summary, ...reasons].join("\n"),
124
+ body: [
125
+ summary,
126
+ ...reasons,
127
+ ...notes,
128
+ ...unanswered > 0 ? [`Gloom Cloud did not answer for ${unanswered === 1 ? "one symbol" : `${unanswered} symbols`}; add ${unanswered === 1 ? "it" : "them"} again in a minute.`] : [],
129
+ ].join("\n"),
113
130
  type: added && !unresolved ? "success" : unresolved && !added ? "error" : "info",
114
131
  duration: unresolved ? SKIPPED_REPORT_MS : undefined,
115
132
  };
@@ -118,12 +135,14 @@ function describeListAdd(
118
135
  /**
119
136
  * A symbol typed to add on its own that a pasted list would leave for a
120
137
  * choice (`typedSymbolChoice`: its company moved or merged away, the match is
121
- * abroad or stopped trading) is not added either. The notice says why, and
122
- * what to add instead or to keep the match. Resolves true when it said so.
138
+ * abroad while the symbol names a US listing, or it stopped trading) is not
139
+ * added either. The notice says why, and what to add instead or to keep the
140
+ * match; `refused` says it did. One listed only abroad is added, and `abroad`
141
+ * is the line naming its venue and currency, for the add to say.
123
142
  */
124
- export async function refuseTypedChoice(rawInput: string, deps: SharedWorkflowDeps, notify: Notify): Promise<boolean> {
143
+ export async function refuseTypedChoice(rawInput: string, deps: SharedWorkflowDeps, notify: Notify): Promise<{ refused: boolean; abroad: string | null }> {
125
144
  const row = await typedSymbolChoice(rawInput, deps.tickerRepository, deps.dataProvider);
126
- if (!row) return false;
145
+ if (row?.status !== "needs_choice") return { refused: false, abroad: row?.abroad ?? null };
127
146
  const message = row.message ?? symbolInputKey(row.input);
128
147
  const offers = [
129
148
  ...row.tradesAs ? [`${row.tradesAs} for what it trades as now`] : [],
@@ -131,12 +150,12 @@ export async function refuseTypedChoice(rawInput: string, deps: SharedWorkflowDe
131
150
  ];
132
151
  notify([/[.!?]$/.test(message) ? message : `${message}.`, ...offers.length > 0 ? [`Add ${offers.join(", or ")}.`] : []].join("\n"),
133
152
  { type: "error", duration: SKIPPED_REPORT_MS });
134
- return true;
153
+ return { refused: true, abroad: null };
135
154
  }
136
155
 
137
156
  /**
138
157
  * Adds every symbol of a pasted list to a watchlist in one step. Each symbol
139
- * resolves as `gloomberb watchlist add` resolves it (Gloom Cloud search and
158
+ * resolves as `gloom watchlist add` resolves it (Gloom Cloud search and
140
159
  * quote, the venue its own quote is on), except that a symbol several listings
141
160
  * carry is never given the first: it is left out and named, for the single add
142
161
  * to ask which. One that is unknown or already listed does not stop the rest.
@@ -159,10 +178,13 @@ export async function addPastedListToWatchlist(options: {
159
178
  const deps = options.buildWorkflowDeps();
160
179
  // Spaces alone also separate the words of a name, which belongs to search.
161
180
  if (!list.separated && await namesOneCompany(list.symbols, deps.dataProvider)) return false;
162
- // An entry with spaces is a company's name search finds, or the symbols it holds.
163
- const read = uniqueSymbols(await readNameEntries(list.symbols, deps.dataProvider));
181
+ // Read as `watchlist add` reads a list: an entry with spaces is a company's name search finds, or the symbols it
182
+ // holds, and a price beside a symbol (`ED 2.582,52`) is left out and named.
183
+ const read = await readSymbolList({
184
+ args: [options.rawInput], stdinPiped: false, readEntries: (entries) => readNameEntries(entries, deps.dataProvider),
185
+ });
164
186
  const symbols = read.symbols;
165
- const repeated = list.repeated + read.repeated;
187
+ const repeated = read.repeated;
166
188
  const state = options.getState();
167
189
  const known = options.explicitTargetId && state.config.watchlists.some((entry) => entry.id === options.explicitTargetId)
168
190
  ? options.explicitTargetId
@@ -233,7 +255,7 @@ export async function addPastedListToWatchlist(options: {
233
255
  recordAttention(publicTickerKey(ticker.metadata.ticker, ticker.metadata.exchange), "watchlist_add");
234
256
  }
235
257
  }
236
- const report = describeListAdd(rows, watchlistName, repeated);
258
+ const report = describeListAdd(rows, watchlistName, repeated, read.notes);
237
259
  notify(report.body, { type: report.type, duration: report.duration });
238
260
  options.closeAll({ revertThemePreview: false });
239
261
  return true;
@@ -62,8 +62,10 @@ export async function executeCollectionCommandAction(options: {
62
62
  });
63
63
  if (list?.separated && await addList(list)) return;
64
64
  // One typed symbol is decided as a symbol of a pasted list is: a match the list would leave for a choice is not added.
65
- if (action === "add" && !options.selectedTicker && !list && options.rawInput?.trim()
66
- && await refuseTypedChoice(options.rawInput, deps, options.notify)) {
65
+ const typed = action === "add" && !options.selectedTicker && !list && options.rawInput?.trim()
66
+ ? await refuseTypedChoice(options.rawInput, deps, options.notify)
67
+ : null;
68
+ if (typed?.refused) {
67
69
  options.closeAll({ revertThemePreview: false });
68
70
  return;
69
71
  }
@@ -246,7 +248,11 @@ export async function executeCollectionCommandAction(options: {
246
248
  `${action === "add" ? "Added" : "Removed"} ${resolvedTicker.symbol} ${action === "add" ? "to" : "from"} "${targetName}".`,
247
249
  { type: "success" },
248
250
  );
249
- if (action === "add") notifyTickerChange(deps.dataProvider, resolvedTicker.ticker, options.notify);
251
+ if (action === "add") {
252
+ // Listed only abroad: the venue and currency it went to, as `watchlist add` says it.
253
+ if (typed?.abroad) options.notify(typed.abroad, { type: "info" });
254
+ notifyTickerChange(deps.dataProvider, resolvedTicker.ticker, options.notify);
255
+ }
250
256
  } else {
251
257
  options.notify(
252
258
  action === "add"
@@ -220,7 +220,7 @@ export function runDirectCommandAction(options: {
220
220
  title: "Reset All Data",
221
221
  body: [
222
222
  "This will permanently delete all portfolios, tickers, notes, broker credentials, and settings.",
223
- "Gloomberb will quit and show the setup wizard on next launch.",
223
+ "Gloom will quit and show the setup wizard on next launch.",
224
224
  ],
225
225
  confirmLabel: "Reset Everything",
226
226
  cancelLabel: "Back",
@@ -81,12 +81,12 @@ export function useCommandBarDirectCommandRuntime({
81
81
  // A confirm it opens (Reset All Data) runs after the bar closed.
82
82
  const getState = useAppGetState();
83
83
  const rendererHost = useRendererHost();
84
- const runSecurityDescriptionShortcut = useCallback(async (query?: string) => {
84
+ const runSecurityDescriptionShortcut = useCallback(async (query?: string, options?: { forceNewPane?: boolean }) => {
85
85
  const trimmed = query?.trim() || "";
86
86
  if (!trimmed) {
87
87
  const inferred = normalizeTickerInput(activeTickerSymbol, query);
88
88
  if (inferred) {
89
- focusTicker(inferred);
89
+ focusTicker(inferred, options);
90
90
  closeAll({ revertThemePreview: false });
91
91
  return;
92
92
  }
@@ -103,6 +103,7 @@ export function useCommandBarDirectCommandRuntime({
103
103
  );
104
104
  if (resolvedTicker) {
105
105
  focusTicker(resolvedTicker.symbol, {
106
+ ...options,
106
107
  instrument: resolvedTicker.instrument,
107
108
  listing: resolvedTicker.listing,
108
109
  });
@@ -3,6 +3,7 @@ import type {
3
3
  PaneTemplateContext,
4
4
  PaneTemplateCreateOptions,
5
5
  PaneTemplateDef,
6
+ ShortcutArgError,
6
7
  } from "../../../types/plugin";
7
8
  import { fuzzyFilter } from "../../../utils/fuzzy-search";
8
9
  import { summarizeError } from "../helpers";
@@ -38,6 +39,16 @@ export function recentPaneTemplateArg(template: PaneTemplateDef, arg: string | u
38
39
  return arg?.trim().toUpperCase() || undefined;
39
40
  }
40
41
 
42
+ /** Why a typed argument opens nothing for the template (`PF Nope`), or null. */
43
+ export function paneTemplateArgError(
44
+ template: PaneTemplateDef,
45
+ arg: string | undefined,
46
+ context: PaneTemplateContext,
47
+ ): ShortcutArgError | null {
48
+ const trimmed = arg?.trim();
49
+ return trimmed ? template.shortcut?.argError?.(trimmed, context) ?? null : null;
50
+ }
51
+
41
52
  export function canPromptForPaneTemplateArg(template: PaneTemplateDef): boolean {
42
53
  const argKind = getPaneTemplateArgKind(template);
43
54
  return argKind === "ticker"
@@ -95,6 +106,22 @@ export function getAvailablePaneTemplatesForState(options: {
95
106
  });
96
107
  }
97
108
 
109
+ /**
110
+ * "ETF flows" spells out ETFF (Crypto ETF Flows), not ETF for a ticker called
111
+ * FLOWS: a query that is word for word a keyword of a template whose own code
112
+ * extends the typed one is no ticker argument, and is left to the search,
113
+ * which ranks that template first. "JOBS DAY" stays Jobs for Dayforce, since
114
+ * the template that lists "jobs day" (MDAY) does not extend JOBS.
115
+ */
116
+ function spellsOutLongerCode(query: string, code: string, templates: readonly PaneTemplateDef[]): boolean {
117
+ const phrase = query.toLowerCase().replace(/\s+/g, " ");
118
+ return templates.some((template) => {
119
+ const longer = template.shortcut?.prefix?.trim().toUpperCase() ?? "";
120
+ return longer.length > code.length && longer.startsWith(code)
121
+ && !!template.keywords?.some((keyword) => keyword.toLowerCase() === phrase);
122
+ });
123
+ }
124
+
98
125
  export function getAvailablePaneShortcutTemplatesForQuery(options: {
99
126
  pluginRegistry: PluginRegistry;
100
127
  disabledPlugins: readonly string[];
@@ -105,9 +132,11 @@ export function getAvailablePaneShortcutTemplatesForQuery(options: {
105
132
  const trimmed = options.query.trim();
106
133
  const upper = trimmed.toUpperCase();
107
134
  const disabledPluginIds = new Set(options.disabledPlugins);
108
- return [...options.pluginRegistry.paneTemplates.values()].filter((template) => {
135
+ const enabled = [...options.pluginRegistry.paneTemplates.values()].filter((template) => {
109
136
  const pluginId = options.pluginRegistry.getPaneTemplatePluginId(template.id);
110
- if (pluginId && disabledPluginIds.has(pluginId)) return false;
137
+ return !pluginId || !disabledPluginIds.has(pluginId);
138
+ });
139
+ return enabled.filter((template) => {
111
140
  const argKind = getPaneTemplateArgKind(template);
112
141
  // The longest matching mnemonic wins, so an alias sharing a stem cannot shadow the typed one.
113
142
  const prefix = paneTemplateShortcutPrefixes(template).map((value) => value.toUpperCase())
@@ -115,14 +144,16 @@ export function getAvailablePaneShortcutTemplatesForQuery(options: {
115
144
  .sort((a, b) => b.length - a.length)[0];
116
145
  if (!prefix) return false;
117
146
  const arg = trimmed.slice(prefix.length).trim();
147
+ if (argKind === "ticker" && arg && spellsOutLongerCode(trimmed, prefix, enabled)) return false;
118
148
  if (!template.canCreate) return true;
119
149
  try {
120
150
  const canCreate = template.canCreate(options.context, arg ? { arg } : undefined);
121
151
  if (canCreate) return true;
122
- if (!arg && !options.context.activeTicker && canPromptForPaneTemplateArg(template)) {
123
- return true;
124
- }
125
- return false;
152
+ // A code typed with an argument it cannot open (`CMP AAPL` compares two
153
+ // or more) is still that function: its row opens the form or says why,
154
+ // where dropping it would leave the text to search and Ask AI.
155
+ if (arg) return canPromptForPaneTemplateArg(template);
156
+ return !options.context.activeTicker && canPromptForPaneTemplateArg(template);
126
157
  } catch (error) {
127
158
  options.logError?.("Pane shortcut canCreate failed", {
128
159
  templateId: template.id,
@@ -141,6 +172,8 @@ export function buildPaneTemplateItem(options: {
141
172
  createOptions?: PaneTemplateCreateOptions;
142
173
  showShortcut?: boolean;
143
174
  shortcutExecution?: boolean;
175
+ /** Why `createOptions.arg` opens nothing; the row then says so instead of opening the pane. */
176
+ argError?: ShortcutArgError | null;
144
177
  runPaneTemplateShortcut: (template: PaneTemplateDef, rawArg?: string) => void;
145
178
  shouldOpenTemplateConfig: (template: PaneTemplateDef, arg?: string) => boolean;
146
179
  openPaneTemplateWorkflow: (template: PaneTemplateDef, options?: { arg?: string }) => void;
@@ -169,6 +202,26 @@ export function buildPaneTemplateItem(options: {
169
202
  pluginName || "",
170
203
  ].filter(Boolean).join(" ");
171
204
 
205
+ if (options.argError) {
206
+ return {
207
+ id: `pane-template-arg-error:${options.template.id}:${arg || ""}`,
208
+ label: options.argError.message,
209
+ detail: options.argError.detail ?? "",
210
+ // Under the label, where the bar shows a row's second line: what to type instead.
211
+ ...(options.argError.detail ? { lines: [{ segments: [{ text: options.argError.detail }] }] } : {}),
212
+ category: options.category ?? (pluginName ? `${pluginName} Panes` : "Panes"),
213
+ // The function's own row, disabled: its code sits in the code column as on
214
+ // the row that opens it, where an info row would carry it on the right.
215
+ kind: "action",
216
+ right: options.showShortcut ? options.template.shortcut?.prefix : undefined,
217
+ shortcutQuery: options.template.shortcut?.prefix,
218
+ searchText,
219
+ defaultSelectable: false,
220
+ disabled: true,
221
+ action: () => {},
222
+ };
223
+ }
224
+
172
225
  const action = () => {
173
226
  if (
174
227
  options.template.shortcut
@@ -6,6 +6,7 @@ import type {
6
6
  PaneTemplateDef,
7
7
  } from "../../../types/plugin";
8
8
  import { normalizeTickerInput } from "../../../tickers/search";
9
+ import { commandPromptTicker } from "../../../layout/selected-ticker";
9
10
  import { debugLog } from "../../../utils/debug-log";
10
11
  import {
11
12
  isCollectionCommand,
@@ -20,6 +21,7 @@ import {
20
21
  getAvailablePaneShortcutTemplatesForQuery,
21
22
  getAvailablePaneTemplatesForState,
22
23
  getPaneTemplateDisplayLabel,
24
+ paneTemplateArgError,
23
25
  recentPaneTemplateArg,
24
26
  } from "./items";
25
27
  import type { FormModalRequest } from "../../form-modal";
@@ -126,13 +128,18 @@ export function useCommandBarPaneTemplateActions({
126
128
  ) => {
127
129
  const trimmedArg = rawArg?.trim() || "";
128
130
  const argKind = template.shortcut?.argKind ?? template.shortcut?.argPlaceholder;
131
+ // Required ticker panes use the instrument already in the command prompt
132
+ // when nothing was typed. Optional panes stay unbound.
133
+ const promptSymbol = template.shortcut?.argOptional
134
+ ? null
135
+ : commandPromptTicker(buildWorkflowDeps().getState())?.symbol ?? null;
129
136
  if (argKind === "ticker") {
130
137
  if (!trimmedArg && template.shortcut?.argOptional) {
131
138
  await openPaneTemplateDirect(template);
132
139
  return;
133
140
  }
134
141
  const resolvedTicker = await resolveTickerInput(
135
- trimmedArg || undefined,
142
+ trimmedArg || promptSymbol || undefined,
136
143
  activeTickerSymbol,
137
144
  activeCollectionId,
138
145
  buildWorkflowDeps(),
@@ -285,6 +292,7 @@ export function useCommandBarPaneTemplateActions({
285
292
  shortcutExecution?: boolean;
286
293
  },
287
294
  ): ResultItem => buildPaneTemplateItem({
295
+ argError: paneTemplateArgError(template, options?.createOptions?.arg, getPaneTemplateContext()),
288
296
  category: options?.category,
289
297
  createOptions: options?.createOptions,
290
298
  openPaneTemplateDirect,
@@ -296,6 +304,7 @@ export function useCommandBarPaneTemplateActions({
296
304
  showShortcut: options?.showShortcut,
297
305
  template,
298
306
  }), [
307
+ getPaneTemplateContext,
299
308
  openPaneTemplateDirect,
300
309
  openPaneTemplateWorkflow,
301
310
  pluginRegistry,
@@ -3,11 +3,26 @@ import type { TickerRecord } from "../../../../types/ticker";
3
3
  import { isManualPortfolio } from "../../../../portfolio/mutations";
4
4
  import type { Command } from "../../commands/registry";
5
5
  import type { ResultItem } from "../../list/model";
6
- import { canRestartToApply } from "../../../../updater";
6
+ import { canRestartToApply, type UpdateProgress } from "../../../../updater";
7
7
  import { NIGHTLY_CHANNEL_SUMMARY, resolveUpdateChannel } from "../../../../updater/channel";
8
+ import { updateFailureReason } from "../../../../updater/failure";
9
+ import { t, tf } from "../../../../i18n";
8
10
  import { isPrereleaseVersion } from "../../../../utils/semver";
9
11
  import { VERSION } from "../../../../version";
10
12
 
13
+ /** "Update failed: download interrupted", as the header says it. */
14
+ function failedUpdateLabel(progress: UpdateProgress): string {
15
+ const reason = progress.failure ? t(updateFailureReason(progress.failure)) : (progress.error ?? "").replace(/\s+/g, " ").trim();
16
+ return tf("Update failed: {error}", { error: reason });
17
+ }
18
+
19
+ /** The whole error under the failed update's row, unless the label already says all of it. */
20
+ function failedUpdateLines(progress: UpdateProgress): ResultItem["lines"] {
21
+ const error = (progress.error ?? "").replace(/\s+/g, " ").trim();
22
+ if (!progress.failure || !error) return undefined;
23
+ return [{ segments: [{ text: error, emphasis: "muted" }] }];
24
+ }
25
+
11
26
  interface RootCommandItemBuilderOptions {
12
27
  activeCollectionId: string | null;
13
28
  activeTickerData: TickerRecord | null | undefined;
@@ -88,9 +103,12 @@ export function createRootCommandItemBuilder({
88
103
  return activeTickerSymbol ? `Remove ${activeTickerSymbol} from Portfolio` : command.label;
89
104
  case "set-portfolio-position":
90
105
  return activeTickerSymbol ? `Set Position for ${activeTickerSymbol}` : command.label;
91
- // The row only shows its label, so a downloaded update is announced there.
106
+ // The row only shows its label, so a downloaded update is announced there,
107
+ // and a failed one with its reason; Enter restarts into the one and retries the other.
92
108
  case "check-for-updates":
93
- return state.updateProgress?.phase === "ready" ? "Update ready, restart to apply" : command.label;
109
+ if (state.updateProgress?.phase === "ready") return "Update ready, restart to apply";
110
+ if (state.updateProgress?.phase === "error") return failedUpdateLabel(state.updateProgress);
111
+ return command.label;
94
112
  default:
95
113
  return command.label;
96
114
  }
@@ -140,7 +158,7 @@ export function createRootCommandItemBuilder({
140
158
  return state.updateProgress.message ?? "Update ready, restart to apply";
141
159
  }
142
160
  if (state.updateProgress?.phase === "error") {
143
- return `Update failed: ${state.updateProgress.error}`;
161
+ return `${failedUpdateLabel(state.updateProgress)}. ${state.updateProgress.error ?? ""}`.trim();
144
162
  }
145
163
  if (state.updateCheckInProgress) return "Checking releases now";
146
164
  if (state.updateAvailable) {
@@ -198,8 +216,11 @@ export function createRootCommandItemBuilder({
198
216
  // "update" is a whole word here so it lands on this command before Set
199
217
  // Portfolio Position (whose keywords say "update position") and Release
200
218
  // Channel, which keeps the word further back.
219
+ // Ready and failed rename the row; its own name still finds it.
201
220
  case "check-for-updates":
202
- return state.updateProgress?.phase === "ready" ? "update check for updates restart relaunch" : "update";
221
+ if (state.updateProgress?.phase === "ready") return "update check for updates restart relaunch";
222
+ if (state.updateProgress?.phase === "error") return "update check for updates retry";
223
+ return "update";
203
224
  case "release-channel":
204
225
  return "nightly stable beta prerelease update updates channel";
205
226
  default:
@@ -218,9 +239,14 @@ export function createRootCommandItemBuilder({
218
239
  right: smartRight(command, arg),
219
240
  shortcutQuery: command.prefix || undefined,
220
241
  searchText: smartSearchText(command),
242
+ ...(command.id === "check-for-updates" && state.updateProgress?.phase === "error"
243
+ ? { lines: failedUpdateLines(state.updateProgress) }
244
+ : {}),
245
+ // Busy while it checks, downloads or installs; a failed update is retried from here.
221
246
  disabled:
222
247
  command.id === "check-for-updates" &&
223
- (state.updateCheckInProgress || (!!state.updateProgress && !canRestartToApply(state.updateProgress))),
248
+ (state.updateCheckInProgress
249
+ || (!!state.updateProgress && !canRestartToApply(state.updateProgress) && state.updateProgress.phase !== "error")),
224
250
  action: () => runDirectCommand(command, arg),
225
251
  };
226
252
  };
@@ -195,7 +195,7 @@ function buildPluginInstallItem(
195
195
  const actionLine = !installable
196
196
  ? `Get it in ${whereItRuns(plugin)}: ${pageUrl.replace(/^https:\/\//, "")}`
197
197
  : required
198
- ? `Needs Gloomberb ${required}. Update Gloomberb first.`
198
+ ? `Needs Gloom ${required}. Update Gloom first.`
199
199
  : `Install ${plugin.name}`;
200
200
 
201
201
  const install = () => {
@@ -9,11 +9,34 @@ import {
9
9
  QUICK_LOOK_TICKER_SEARCH_OPTIONS,
10
10
  tickerSearchFailureItems,
11
11
  venueDropdownResults,
12
+ type RootTickerReading,
12
13
  } from "../ticker-search/results";
14
+ import { ProviderBusyError, SEARCH_BUSY_MESSAGE } from "../../../../sources/provider-errors";
15
+ import { OperationTimeoutError, withDeadline } from "../../../../utils/async-deadline";
13
16
  import { orderListResults, type ResultItem } from "../../list/model";
14
17
  import type { CommandBarCategoryPriorities, CommandBarSectionOrder } from "../../view-model";
15
18
  import type { CommandBarRoute } from "../../workflow/types";
16
19
 
20
+ /**
21
+ * How long the root symbol search may take. Gloom Cloud gives up after ten
22
+ * seconds, so a search still going at this point is stuck on something else (a
23
+ * broker that never answers) and the bar stops searching for it.
24
+ */
25
+ const ROOT_SEARCH_TIMEOUT_MS = 15_000;
26
+
27
+ /**
28
+ * The search's answer, or a busy service once `timeoutMs` passes: the same row a
29
+ * rate-limited search gets, since nothing was found and a retry may find it.
30
+ */
31
+ export async function searchWithinDeadline<T>(search: Promise<T>, timeoutMs = ROOT_SEARCH_TIMEOUT_MS): Promise<T> {
32
+ try {
33
+ return await withDeadline(search, timeoutMs, "Symbol search timed out");
34
+ } catch (error) {
35
+ if (error instanceof OperationTimeoutError) throw new ProviderBusyError(SEARCH_BUSY_MESSAGE, { cause: error });
36
+ throw error;
37
+ }
38
+ }
39
+
17
40
  export function useRootProviderSearch(options: {
18
41
  activeCollectionId: string | null;
19
42
  buildTickerSearchResultItems: (candidates: TickerSearchCandidate[], query: string) => ResultItem[];
@@ -30,6 +53,8 @@ export function useRootProviderSearch(options: {
30
53
  rootPlainTickerSearchArg: string | null;
31
54
  /** Set when the query is `NET:` or `NET:N`. Empty string lists every venue. */
32
55
  listingSuffix: string | null;
56
+ /** What a plain query written as a terminal's code or a near miss reads as (`VOD LN`, `700.HK`). */
57
+ reading?: RootTickerReading | null;
33
58
  rootResultItems: ResultItem[];
34
59
  rootTickerSearchArg: string | null;
35
60
  tickers: AppState["tickers"];
@@ -58,6 +83,7 @@ export function useRootProviderSearch(options: {
58
83
  readTickerSearchCache,
59
84
  rootPlainTickerSearchArg,
60
85
  listingSuffix,
86
+ reading = null,
61
87
  rootResultItems,
62
88
  rootTickerSearchArg,
63
89
  tickers,
@@ -116,16 +142,18 @@ export function useRootProviderSearch(options: {
116
142
 
117
143
  const requestId = ++rootSearchRequestIdRef.current;
118
144
  rootSearchTimerRef.current = setTimeout(async () => {
145
+ let published = false;
146
+ const publish = (candidates: TickerSearchCandidate[]) => {
147
+ published = true;
148
+ setRootProviderResults(mergeTickerSearchResultItems(
149
+ searchQuery,
150
+ buildTickerSearchResultItems(candidates, searchQuery),
151
+ localTickerSearchResultItems(searchQuery, { limit: 6 }),
152
+ ));
153
+ setRootProviderResultsQuery(searchQuery);
154
+ };
119
155
  try {
120
- const publish = (candidates: TickerSearchCandidate[]) => {
121
- setRootProviderResults(mergeTickerSearchResultItems(
122
- searchQuery,
123
- buildTickerSearchResultItems(candidates, searchQuery),
124
- localTickerSearchResultItems(searchQuery, { limit: 6 }),
125
- ));
126
- setRootProviderResultsQuery(searchQuery);
127
- };
128
- const combined = await searchTickerCandidates({
156
+ const combined = await searchWithinDeadline(searchTickerCandidates({
129
157
  query: searchQuery,
130
158
  tickers,
131
159
  dataProvider,
@@ -145,7 +173,7 @@ export function useRootProviderSearch(options: {
145
173
  // The rows the CLI reads a symbol's listings from, so `CAR:` offers CAR Group on ASX (its eleventh).
146
174
  totalLimit: LISTING_SEARCH_LIMIT,
147
175
  ...QUICK_LOOK_TICKER_SEARCH_OPTIONS,
148
- });
176
+ }));
149
177
  if (requestId !== rootSearchRequestIdRef.current) return;
150
178
  writeTickerSearchCache(
151
179
  searchQuery,
@@ -156,6 +184,8 @@ export function useRootProviderSearch(options: {
156
184
  publish(combined);
157
185
  } catch (error) {
158
186
  if (requestId !== rootSearchRequestIdRef.current) return;
187
+ // Rows a faster source already put up are the answer a search that went quiet leaves.
188
+ if (published && error instanceof ProviderBusyError && error.cause instanceof OperationTimeoutError) return;
159
189
  setRootProviderResults(tickerSearchFailureItems(error, searchQuery, localTickerSearchResultItems(searchQuery, { limit: 6 })));
160
190
  setRootProviderResultsQuery(searchQuery);
161
191
  } finally {
@@ -191,13 +221,14 @@ export function useRootProviderSearch(options: {
191
221
  }
192
222
  if (rootTickerSearchArg && rootProviderResultsQuery === rootTickerSearchArg && rootProviderResults) {
193
223
  if (rootPlainTickerSearchArg) {
194
- return mergePlainRootTickerResults(rootPlainTickerSearchArg, rootProviderResults, rootResultItems);
224
+ return mergePlainRootTickerResults(rootPlainTickerSearchArg, rootProviderResults, rootResultItems, reading);
195
225
  }
196
226
  return rootProviderResults;
197
227
  }
198
228
  return rootResultItems;
199
229
  }, [
200
230
  listingSuffix,
231
+ reading,
201
232
  rootPlainTickerSearchArg,
202
233
  rootProviderResults,
203
234
  rootProviderResultsQuery,
@@ -8,6 +8,7 @@ import type { TickerRecord } from "../../../../types/ticker";
8
8
  import { fuzzyFilter } from "../../../../utils/fuzzy-search";
9
9
  import {
10
10
  buildAssistResultItems,
11
+ isQuestionLike,
11
12
  shouldShowAssistRow,
12
13
  type AssistRowHandlers,
13
14
  } from "../../assist/model";
@@ -66,6 +67,8 @@ export interface RootResultModelOptions {
66
67
  rawInput?: string,
67
68
  ) => void | Promise<void>;
68
69
  getAvailablePaneShortcutTemplates: (query: string) => PaneTemplateDef[];
70
+ /** The function code the query starts with, claimed by the parser or not (`leadingShortcutCode`). */
71
+ leadingShortcutCode?: string | null;
69
72
  /** Looks a recorded `pane-template:<id>` entry back up among the templates the bar offers now. */
70
73
  getRecentPaneTemplate?: (id: string, arg?: string) => PaneTemplateDef | undefined;
71
74
  hasPaneSettings: (paneId: string) => boolean;
@@ -106,15 +109,21 @@ function isAssistSectionVisible(
106
109
  query: string,
107
110
  resultCount: number,
108
111
  hasShortcutIntent: boolean,
112
+ leadingCode: string | null,
109
113
  ): boolean {
110
114
  if (!query.trim()) return false;
111
115
  if (assist.state.status !== "idle" && assist.state.query === query.trim()) return true;
112
116
  // A resolved shortcut is the user speaking the command language, so nothing is
113
117
  // asked of the AI, and a sign-up offer must not outrank that exact match.
114
118
  if (hasShortcutIntent) return false;
115
- // Signed out there is nothing to wait for, so the older heuristic still picks
116
- // the queries worth offering a sign-up row for.
117
- if (!assist.enabled) return shouldShowAssistRow({ query, resultCount });
119
+ if (!assist.enabled) {
120
+ // Text led by a function code (`MOST foo`) is a command gone wrong, not a
121
+ // question, so the sign-up offer would be the only row and take Enter.
122
+ if (leadingCode && !isQuestionLike(query)) return false;
123
+ // Signed out there is nothing to wait for, so the older heuristic still picks
124
+ // the queries worth offering a sign-up row for.
125
+ return shouldShowAssistRow({ query, resultCount });
126
+ }
118
127
  return assist.auto;
119
128
  }
120
129
 
@@ -235,6 +244,7 @@ export function buildRootResultModel(options: RootResultModelOptions): RootResul
235
244
  getAvailablePaneShortcutTemplates,
236
245
  getRecentPaneTemplate,
237
246
  hasPaneSettings,
247
+ leadingShortcutCode = null,
238
248
  localTickerSearchResultItems,
239
249
  nonShortcutPaneTemplateItems,
240
250
  openModeRoute,
@@ -268,6 +278,8 @@ export function buildRootResultModel(options: RootResultModelOptions): RootResul
268
278
  const items: ResultItem[] = [];
269
279
  const match = matchPrefix(rootQuery, availableCommands);
270
280
  let initialIdx = 0;
281
+ // Off when the code's own rows only say why the argument opens nothing (`PF Nope`).
282
+ let shortcutRuns = true;
271
283
  const shortcutItem = buildRootShortcutItem({
272
284
  activeCollectionId,
273
285
  activeTickerSymbol,
@@ -289,6 +301,7 @@ export function buildRootResultModel(options: RootResultModelOptions): RootResul
289
301
  shortcutExecution: true,
290
302
  }))
291
303
  : [shortcutItem];
304
+ shortcutRuns = templateItems.some((item) => !item.disabled);
292
305
  const relatedTemplateItems = rootQuery.trim().toUpperCase() === rootShortcutIntent.prefix
293
306
  ? paneShortcutItems({
294
307
  filterQuery: rootQuery,
@@ -393,7 +406,7 @@ export function buildRootResultModel(options: RootResultModelOptions): RootResul
393
406
  // Text the parser can run is text a key can run, so the offer sits under the
394
407
  // match it would replay. Never the default selection: Enter still runs the
395
408
  // command itself.
396
- if (bindKey && shortcutClaimedQuery && rootShortcutIntent.kind !== "ambiguous") {
409
+ if (bindKey && shortcutClaimedQuery && shortcutRuns && rootShortcutIntent.kind !== "ambiguous") {
397
410
  items.push(buildBindKeyItem(rootShortcutIntent, bindKey));
398
411
  }
399
412
  // A resolved prefix means the user is speaking the command language, so
@@ -414,6 +427,7 @@ export function buildRootResultModel(options: RootResultModelOptions): RootResul
414
427
  rootQuery,
415
428
  matchCount,
416
429
  shortcutClaimedQuery,
430
+ leadingShortcutCode,
417
431
  )
418
432
  ? buildAssistResultItems({ ...assist, query: rootQuery })
419
433
  : [];