gloomberb 0.18.3 → 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 (886) 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/src/account/checkout-handoff.tsx +225 -0
  6. package/src/account/device-signin-dialog.tsx +2 -2
  7. package/src/account/device-signin.ts +2 -2
  8. package/src/account/upgrade-dialog.tsx +1 -1
  9. package/src/api-client/askg.ts +2 -2
  10. package/src/api-client/auth.ts +2 -2
  11. package/src/api-client/central-bank-rates.ts +6 -0
  12. package/src/api-client/collections.ts +5 -1
  13. package/src/api-client/cot.ts +2 -0
  14. package/src/api-client/crypto-etf-flows.ts +37 -0
  15. package/src/api-client/crypto-markets.ts +60 -0
  16. package/src/api-client/data.ts +84 -5
  17. package/src/api-client/doe.ts +15 -0
  18. package/src/api-client/equity-screener.ts +28 -0
  19. package/src/api-client/exchange-announcements.ts +38 -0
  20. package/src/api-client/fund-facts.ts +39 -0
  21. package/src/api-client/futures-curve.ts +9 -1
  22. package/src/api-client/hiring.ts +301 -0
  23. package/src/api-client/index.ts +22 -5
  24. package/src/api-client/market-discovery.ts +14 -0
  25. package/src/api-client/members.ts +6 -0
  26. package/src/api-client/mna.ts +6 -0
  27. package/src/api-client/paths.ts +18 -1
  28. package/src/api-client/request.ts +21 -4
  29. package/src/api-client/short-side-publications.ts +37 -0
  30. package/src/api-client/socket.ts +64 -4
  31. package/src/api-client/swap-curve.ts +35 -0
  32. package/src/api-client/themes.ts +7 -1
  33. package/src/api-client/types.ts +90 -2
  34. package/src/app/pane-runtime/plugin-bindings.ts +9 -2
  35. package/src/app/runtime/desktop-deeplink.ts +5 -5
  36. package/src/app/runtime/plugin-bindings.ts +2 -2
  37. package/src/app/runtime/startup.ts +13 -0
  38. package/src/app/star-prompt/status-line.tsx +2 -2
  39. package/src/architecture/core-builtin-allowlist.json +5 -2
  40. package/src/architecture/ui-literals-allowlist.json +3 -3
  41. package/src/architecture/ui-tokens-allowlist.json +1 -1
  42. package/src/brokers/broker-portfolio-sync.ts +37 -0
  43. package/src/brokers/directory.ts +11 -0
  44. package/src/brokers/logos.ts +3 -1
  45. package/src/brokers/signed-in/adapter.ts +304 -26
  46. package/src/brokers/signed-in/client.ts +14 -2
  47. package/src/brokers/signed-in/connect.ts +10 -2
  48. package/src/brokers/sync-broker-instance.ts +9 -1
  49. package/src/capabilities/chart-series.ts +22 -6
  50. package/src/cli/bank-section.ts +1 -1
  51. package/src/cli/base-converter.ts +23 -14
  52. package/src/cli/central-bank-events.ts +1 -1
  53. package/src/cli/command-options.ts +59 -4
  54. package/src/cli/commands/api.ts +9 -6
  55. package/src/cli/commands/broker.ts +2 -2
  56. package/src/cli/commands/command-utils.ts +2 -2
  57. package/src/cli/commands/crypto-hints.ts +7 -20
  58. package/src/cli/commands/fred-series.ts +4 -2
  59. package/src/cli/commands/keybindings.ts +2 -2
  60. package/src/cli/commands/market.ts +1117 -264
  61. package/src/cli/commands/news-hints.ts +2 -2
  62. package/src/cli/commands/news-search.ts +59 -6
  63. package/src/cli/commands/options-leaps.ts +41 -26
  64. package/src/cli/commands/overview.ts +121 -48
  65. package/src/cli/commands/plugins.ts +9 -9
  66. package/src/cli/commands/remote.ts +13 -10
  67. package/src/cli/commands/search.ts +64 -44
  68. package/src/cli/commands/system.ts +27 -19
  69. package/src/cli/commands/themes.ts +1 -1
  70. package/src/cli/commands/ticker.ts +192 -47
  71. package/src/cli/context.ts +3 -2
  72. package/src/cli/desktop-pane-shot-view.ts +2 -2
  73. package/src/cli/desktop-pane-shot.ts +1 -1
  74. package/src/cli/earnings-calendar.ts +4 -4
  75. package/src/cli/entry.ts +18 -1
  76. package/src/cli/errors.ts +20 -2
  77. package/src/cli/exit-codes.ts +1 -1
  78. package/src/cli/export-source.ts +10 -4
  79. package/src/cli/freshness.ts +2 -8
  80. package/src/cli/fx-forward.ts +130 -0
  81. package/src/cli/fx-pair.ts +10 -9
  82. package/src/cli/glossary.ts +64 -20
  83. package/src/cli/help.ts +19 -13
  84. package/src/cli/history-export.ts +126 -0
  85. package/src/cli/history-rows.ts +196 -43
  86. package/src/cli/index-roots.ts +5 -45
  87. package/src/cli/index.ts +24 -18
  88. package/src/cli/known-gaps.ts +118 -25
  89. package/src/cli/listing-arg.ts +300 -41
  90. package/src/cli/name-entries.ts +30 -18
  91. package/src/cli/native-smoke.ts +2 -0
  92. package/src/cli/not-a-ticker.ts +19 -9
  93. package/src/cli/opentui-libc.ts +5 -0
  94. package/src/cli/options.ts +12 -0
  95. package/src/cli/pane-functions/capabilities.ts +75 -20
  96. package/src/cli/pane-functions/catalog.ts +24 -23
  97. package/src/cli/pane-functions/discovery.ts +1 -1
  98. package/src/cli/pane-functions/dom.ts +10 -7
  99. package/src/cli/pane-functions/financial-ratio-shot.ts +2 -2
  100. package/src/cli/pane-functions/freshness.ts +174 -23
  101. package/src/cli/pane-functions/function-help.ts +66 -27
  102. package/src/cli/pane-functions/headless.ts +24 -11
  103. package/src/cli/pane-functions/index.ts +18 -16
  104. package/src/cli/pane-functions/options.ts +22 -2
  105. package/src/cli/pane-functions/report-notices.ts +12 -4
  106. package/src/cli/pane-functions/report.ts +5 -5
  107. package/src/cli/pane-functions/resolver.ts +47 -10
  108. package/src/cli/pane-functions/screenshot-assessment.ts +322 -0
  109. package/src/cli/pane-functions/screenshot-bridge.ts +152 -0
  110. package/src/cli/pane-functions/screenshot-chart-evidence.ts +396 -0
  111. package/src/cli/pane-functions/screenshot-data-evidence.ts +383 -0
  112. package/src/cli/pane-functions/screenshot-evidence.ts +1 -1
  113. package/src/cli/pane-functions/screenshot-payload.ts +453 -0
  114. package/src/cli/pane-functions/screenshot-render.ts +316 -0
  115. package/src/cli/pane-functions/screenshot-types.ts +162 -0
  116. package/src/cli/pane-functions/shot-options.ts +8 -3
  117. package/src/cli/peso-dollar-rates.ts +79 -0
  118. package/src/cli/quote-answer.ts +38 -3
  119. package/src/cli/report-tables.ts +61 -16
  120. package/src/cli/restore-plugins.ts +29 -14
  121. package/src/cli/result.ts +111 -22
  122. package/src/cli/series-search.ts +5 -5
  123. package/src/cli/statement-filings.ts +19 -0
  124. package/src/cli/suffixed-listing-rows.ts +49 -0
  125. package/src/cli/symbol-args.ts +50 -15
  126. package/src/cli/symbol-cells.ts +120 -0
  127. package/src/cli/symbol-list.ts +198 -68
  128. package/src/cli/symbol-rows.ts +131 -25
  129. package/src/cli/ticker-resolution.ts +108 -11
  130. package/src/cli/treasury-yields.ts +5 -5
  131. package/src/cli/types.ts +2 -0
  132. package/src/cli/uncovered-instrument.ts +3 -3
  133. package/src/cli/unknown-command.ts +6 -6
  134. package/src/components/chart/composite/chart-layout.ts +131 -0
  135. package/src/components/chart/composite/composite-chart.tsx +373 -16
  136. package/src/components/chart/composite/interactions.ts +7 -2
  137. package/src/components/chart/composite/legend.tsx +75 -3
  138. package/src/components/chart/composite/levels.ts +5 -0
  139. package/src/components/chart/composite/panel-gestures.ts +41 -0
  140. package/src/components/chart/composite/panel-labels.ts +2 -1
  141. package/src/components/chart/composite/panel-surface.tsx +305 -11
  142. package/src/components/chart/composite/price-axis-labels.tsx +27 -3
  143. package/src/components/chart/composite/rasterizer.ts +44 -19
  144. package/src/components/chart/composite/scene.ts +16 -4
  145. package/src/components/chart/composite/text-renderer.ts +48 -21
  146. package/src/components/chart/composite/toolbar.tsx +52 -5
  147. package/src/components/chart/composite/types.ts +13 -0
  148. package/src/components/chart/composite/use-composite-chart-keyboard.ts +120 -13
  149. package/src/components/chart/composite/use-composite-value-scales.ts +44 -0
  150. package/src/components/chart/composite/use-composite-viewport.ts +12 -3
  151. package/src/components/chart/composite/value-scale.ts +149 -0
  152. package/src/components/chart/composite/volume-profile-paint.ts +6 -3
  153. package/src/components/chart/core/pointer.ts +2 -0
  154. package/src/components/chart-table/index.ts +2 -0
  155. package/src/components/chart-table/read.tsx +74 -0
  156. package/src/components/command-bar/commands/collection-list.ts +41 -19
  157. package/src/components/command-bar/commands/collection.ts +9 -3
  158. package/src/components/command-bar/commands/direct/index.ts +1 -1
  159. package/src/components/command-bar/commands/direct/runtime.ts +3 -2
  160. package/src/components/command-bar/pane-templates/items.ts +59 -6
  161. package/src/components/command-bar/pane-templates/workflow.ts +10 -1
  162. package/src/components/command-bar/routes/root/plugin-install.ts +1 -1
  163. package/src/components/command-bar/routes/root/provider-search.ts +42 -11
  164. package/src/components/command-bar/routes/root/results.ts +18 -4
  165. package/src/components/command-bar/routes/root/runtime.ts +15 -3
  166. package/src/components/command-bar/routes/root/search-providers.ts +25 -2
  167. package/src/components/command-bar/routes/root/selection.ts +6 -1
  168. package/src/components/command-bar/routes/root/shortcut-feedback.ts +4 -1
  169. package/src/components/command-bar/routes/root/shortcuts.ts +30 -3
  170. package/src/components/command-bar/routes/ticker-search/results.ts +73 -4
  171. package/src/components/command-bar/selection-runtime.ts +50 -10
  172. package/src/components/command-bar/surface/index.tsx +24 -2
  173. package/src/components/command-bar/view-model.ts +7 -0
  174. package/src/components/command-bar/workflow/broker.ts +2 -2
  175. package/src/components/command-bar/workflow/collection-actions.ts +46 -7
  176. package/src/components/command-bar/workflow/collection-ticker.ts +32 -4
  177. package/src/components/command-bar/workflow/fields.ts +8 -2
  178. package/src/components/command-bar/workflow/ops.ts +18 -4
  179. package/src/components/command-bar/workflow/portfolio-position.ts +53 -4
  180. package/src/components/command-bar/workflow/submit.ts +3 -2
  181. package/src/components/command-bar/workflow/tickers.ts +5 -1
  182. package/src/components/company-logo.tsx +39 -0
  183. package/src/components/data-table/sections.ts +4 -2
  184. package/src/components/form-modal/confirm.tsx +2 -1
  185. package/src/components/form-modal/request.ts +5 -0
  186. package/src/components/form-modal/routes.ts +4 -1
  187. package/src/components/index.ts +12 -6
  188. package/src/components/layout/header.tsx +7 -6
  189. package/src/components/layout/market-summary.ts +9 -6
  190. package/src/components/layout/pane/capture-status.ts +1 -1
  191. package/src/components/layout/pane/footer/model.ts +11 -5
  192. package/src/components/layout/shell/chrome.ts +19 -6
  193. package/src/components/layout/shell/index.tsx +2 -1
  194. package/src/components/layout/shell/pane/layers.tsx +19 -1
  195. package/src/components/layout/status-bar.tsx +2 -2
  196. package/src/components/market-board/index.tsx +11 -3
  197. package/src/components/onboarding/onboarding-wizard.tsx +1 -0
  198. package/src/components/onboarding/portfolio-step/broker-setup-panel.tsx +2 -2
  199. package/src/components/onboarding/wizard-broker-sync.ts +4 -1
  200. package/src/components/pane-settings-dialog/desktop.tsx +20 -7
  201. package/src/components/pane-settings-dialog/tui.tsx +17 -9
  202. package/src/components/pane-settings-dialog/value.ts +8 -1
  203. package/src/components/pane-settings-dialog.tsx +44 -13
  204. package/src/components/sign-in-code-panel.tsx +27 -19
  205. package/src/components/ui/column-grid.tsx +48 -4
  206. package/src/components/ui/country-flag-art.tsx +180 -0
  207. package/src/components/ui/country-flag.tsx +118 -12
  208. package/src/components/ui/data-table/opentui/index.tsx +61 -2
  209. package/src/components/ui/data-table/opentui/model.ts +109 -2
  210. package/src/components/ui/data-table/types.ts +1 -1
  211. package/src/components/ui/display.tsx +5 -1
  212. package/src/components/ui/index.ts +3 -1
  213. package/src/components/ui/logo-mark.tsx +11 -2
  214. package/src/components/ui/query-bar.tsx +1 -1
  215. package/src/components/ui/row-notes.ts +79 -0
  216. package/src/core/state/app/layout.ts +4 -4
  217. package/src/data/cached-query.ts +8 -1
  218. package/src/data/config/chart-settings.ts +3 -3
  219. package/src/data/config/home.ts +10 -2
  220. package/src/data/config/layout.ts +4 -1
  221. package/src/data/config/store/node.ts +4 -0
  222. package/src/data/config/store/normalize.ts +13 -3
  223. package/src/data/config/store/portfolio-as-of-column.ts +2 -2
  224. package/src/data/json-storage.ts +2 -0
  225. package/src/data/saved-copies.ts +84 -0
  226. package/src/docs/snapshot.json +65 -32
  227. package/src/i18n/es.ts +29 -12
  228. package/src/i18n/ja.ts +29 -12
  229. package/src/i18n/ko.ts +29 -12
  230. package/src/i18n/zh-cn.ts +29 -12
  231. package/src/i18n/zh-tw.ts +29 -12
  232. package/src/layout/desks.ts +1 -1
  233. package/src/layout/launch-layout.ts +1 -1
  234. package/src/layout/pane-manager/floating-actions.ts +5 -3
  235. package/src/layout/pane-manager/floating.ts +43 -1
  236. package/src/layout/pane-manager/index.ts +2 -0
  237. package/src/layout/selected-ticker.ts +74 -0
  238. package/src/market-data/depositary-pair.ts +251 -0
  239. package/src/market-data/futures-board.ts +1 -1
  240. package/src/market-data/futures-contract.ts +124 -40
  241. package/src/market-data/fx-closes.ts +17 -2
  242. package/src/market-data/hooks.tsx +19 -11
  243. package/src/market-data/market/change-basis.ts +49 -7
  244. package/src/market-data/market/freshness.ts +34 -5
  245. package/src/market-data/market/period-return.ts +163 -0
  246. package/src/market-data/market/trading-sessions.ts +13 -0
  247. package/src/market-data/market/year-to-date.ts +8 -13
  248. package/src/market-data/performance.ts +20 -14
  249. package/src/market-data/perpetual-premium.ts +32 -0
  250. package/src/market-data/published-apac-sessions.ts +2 -1
  251. package/src/market-data/published-futures-sessions.ts +69 -0
  252. package/src/market-data/quotes/contributions.ts +5 -1
  253. package/src/market-data/quotes/freshness.ts +42 -0
  254. package/src/market-data/quotes/intraday-bar.ts +37 -0
  255. package/src/market-data/quotes/regular-session-valuation.ts +13 -8
  256. package/src/market-data/quotes/resolution.ts +4 -2
  257. package/src/market-data/tax-equivalent.ts +1 -1
  258. package/src/market-data/ticker-price-returns.ts +3 -1
  259. package/src/news/aggregator.ts +5 -1
  260. package/src/news/news-model.ts +4 -0
  261. package/src/news/types.ts +11 -0
  262. package/src/notifications/app-notifier.ts +1 -1
  263. package/src/plugins/auto-update.ts +2 -2
  264. package/src/plugins/builtin/account-management/index.tsx +1 -0
  265. package/src/plugins/builtin/account-management/pane.tsx +9 -8
  266. package/src/plugins/builtin/alerts/alert-engine.ts +29 -19
  267. package/src/plugins/builtin/alerts/calendar-events.ts +378 -0
  268. package/src/plugins/builtin/alerts/cli.ts +485 -76
  269. package/src/plugins/builtin/alerts/command.ts +5 -10
  270. package/src/plugins/builtin/alerts/event-rows.ts +9 -5
  271. package/src/plugins/builtin/alerts/events-pane.tsx +71 -56
  272. package/src/plugins/builtin/alerts/events.ts +107 -5
  273. package/src/plugins/builtin/alerts/fired-log.ts +78 -0
  274. package/src/plugins/builtin/alerts/format.ts +2 -1
  275. package/src/plugins/builtin/alerts/headless.ts +100 -39
  276. package/src/plugins/builtin/alerts/history-pane.tsx +105 -62
  277. package/src/plugins/builtin/alerts/history-rows.ts +89 -0
  278. package/src/plugins/builtin/alerts/index.tsx +45 -18
  279. package/src/plugins/builtin/alerts/iv-level.ts +365 -0
  280. package/src/plugins/builtin/alerts/levels.ts +3 -3
  281. package/src/plugins/builtin/alerts/pane.tsx +97 -29
  282. package/src/plugins/builtin/alerts/price.ts +35 -0
  283. package/src/plugins/builtin/alerts/quotes.ts +24 -0
  284. package/src/plugins/builtin/alerts/research-builder.ts +84 -11
  285. package/src/plugins/builtin/alerts/research-rules.ts +76 -3
  286. package/src/plugins/builtin/alerts/scheduled-check.ts +206 -32
  287. package/src/plugins/builtin/alerts/scheduled-sources.ts +26 -3
  288. package/src/plugins/builtin/alerts/scheduled.ts +188 -29
  289. package/src/plugins/builtin/alerts/storage.ts +13 -10
  290. package/src/plugins/builtin/alerts/targets.ts +12 -3
  291. package/src/plugins/builtin/analytics/index.tsx +8 -2
  292. package/src/plugins/builtin/analytics/metrics.ts +1 -1
  293. package/src/plugins/builtin/analytics/risk-book.ts +215 -0
  294. package/src/plugins/builtin/analytics/risk-client.ts +13 -6
  295. package/src/plugins/builtin/analytics/risk-headless.ts +55 -21
  296. package/src/plugins/builtin/analytics/risk-math.ts +6 -3
  297. package/src/plugins/builtin/analytics/risk-model.ts +297 -104
  298. package/src/plugins/builtin/analytics/risk-options.ts +17 -2
  299. package/src/plugins/builtin/analytics/risk-pane.tsx +97 -36
  300. package/src/plugins/builtin/attention/pane.tsx +6 -2
  301. package/src/plugins/builtin/awards/headless.ts +7 -3
  302. package/src/plugins/builtin/awards/model.ts +18 -0
  303. package/src/plugins/builtin/awards/pane.tsx +6 -3
  304. package/src/plugins/builtin/backtest/headless.ts +3 -3
  305. package/src/plugins/builtin/backtest/rules.ts +41 -5
  306. package/src/plugins/builtin/broker-manager/add-flow.tsx +12 -7
  307. package/src/plugins/builtin/broker-manager/detail.tsx +47 -19
  308. package/src/plugins/builtin/broker-manager/footer.ts +27 -11
  309. package/src/plugins/builtin/broker-manager/index.tsx +21 -12
  310. package/src/plugins/builtin/broker-manager/keyboard.ts +1 -1
  311. package/src/plugins/builtin/broker-manager/model.ts +12 -2
  312. package/src/plugins/builtin/broker-manager/pane-actions.tsx +183 -57
  313. package/src/plugins/builtin/broker-manager/table.ts +28 -12
  314. package/src/plugins/builtin/broker-trading/account-picker.tsx +2 -1
  315. package/src/plugins/builtin/broker-trading/chart-levels.ts +82 -13
  316. package/src/plugins/builtin/broker-trading/controller.ts +45 -13
  317. package/src/plugins/builtin/broker-trading/dock.tsx +22 -4
  318. package/src/plugins/builtin/broker-trading/headless.ts +2 -1
  319. package/src/plugins/builtin/broker-trading/index.tsx +7 -1
  320. package/src/plugins/builtin/broker-trading/linked-orders.ts +148 -0
  321. package/src/plugins/builtin/broker-trading/order-feed.ts +75 -7
  322. package/src/plugins/builtin/broker-trading/orders.tsx +109 -31
  323. package/src/plugins/builtin/broker-trading/overview-orders.tsx +9 -3
  324. package/src/plugins/builtin/broker-trading/pane-model.ts +30 -2
  325. package/src/plugins/builtin/broker-trading/pane.tsx +110 -23
  326. package/src/plugins/builtin/broker-trading/ticket-parts.tsx +36 -7
  327. package/src/plugins/builtin/broker-trading/ticket.tsx +112 -31
  328. package/src/plugins/builtin/buildout/cells.tsx +4 -0
  329. package/src/plugins/builtin/buildout/detail/index.tsx +5 -1
  330. package/src/plugins/builtin/buildout/detail/ui.tsx +7 -4
  331. package/src/plugins/builtin/buildout/pane/index.tsx +25 -12
  332. package/src/plugins/builtin/buildout/pane/status.tsx +0 -4
  333. package/src/plugins/builtin/builtin-plugin-meta.ts +1 -1
  334. package/src/plugins/builtin/catalysts/detail.tsx +3 -2
  335. package/src/plugins/builtin/catalysts/index.tsx +1 -1
  336. package/src/plugins/builtin/catalysts/model.ts +49 -4
  337. package/src/plugins/builtin/catalysts/pane.tsx +6 -8
  338. package/src/plugins/builtin/central-bank-rates/client.ts +5 -0
  339. package/src/plugins/builtin/central-bank-rates/headless.ts +36 -10
  340. package/src/plugins/builtin/central-bank-rates/model.ts +33 -8
  341. package/src/plugins/builtin/changelog/index.tsx +1 -0
  342. package/src/plugins/builtin/chart-composer/catalog-inventory.ts +1 -0
  343. package/src/plugins/builtin/chart-composer/chart-spec-edit.ts +2 -1
  344. package/src/plugins/builtin/chart-composer/chart-spec.ts +7 -0
  345. package/src/plugins/builtin/chart-composer/cli-options.ts +2 -5
  346. package/src/plugins/builtin/chart-composer/data-catalog-pane.tsx +2 -1
  347. package/src/plugins/builtin/chart-composer/editor/controller.ts +2 -0
  348. package/src/plugins/builtin/chart-composer/editor.tsx +4 -1
  349. package/src/plugins/builtin/chart-composer/headless-schema.ts +28 -26
  350. package/src/plugins/builtin/chart-composer/headless.ts +253 -35
  351. package/src/plugins/builtin/chart-composer/index.tsx +12 -2
  352. package/src/plugins/builtin/chart-composer/leverage-overlay.ts +142 -0
  353. package/src/plugins/builtin/chart-composer/pane.tsx +127 -28
  354. package/src/plugins/builtin/chart-composer/series-catalog.ts +1 -0
  355. package/src/plugins/builtin/chart-composer/series-expression.ts +65 -6
  356. package/src/plugins/builtin/chart-composer/session-history.ts +15 -21
  357. package/src/plugins/builtin/chart-composer/session-range.ts +4 -2
  358. package/src/plugins/builtin/chart-composer/settings.ts +31 -19
  359. package/src/plugins/builtin/chart-composer/use-series-catalog.ts +5 -6
  360. package/src/plugins/builtin/chart-composer/viewport-labels.ts +18 -8
  361. package/src/plugins/builtin/chat/attachments/model.ts +3 -1
  362. package/src/plugins/builtin/chat/content/index.tsx +1 -1
  363. package/src/plugins/builtin/chat/pane-links/open.ts +1 -1
  364. package/src/plugins/builtin/chat/people.ts +1 -1
  365. package/src/plugins/builtin/clinical-trials/client.ts +5 -2
  366. package/src/plugins/builtin/clinical-trials/model.ts +13 -4
  367. package/src/plugins/builtin/clinical-trials/pane.tsx +32 -12
  368. package/src/plugins/builtin/clinical-trials/ticker-sponsor.ts +17 -0
  369. package/src/plugins/builtin/cloud/askg/controller.ts +1 -1
  370. package/src/plugins/builtin/cloud/askg/lock-note.ts +1 -1
  371. package/src/plugins/builtin/cloud/askg/tool-display.ts +1 -1
  372. package/src/plugins/builtin/cloud/auth-commands.ts +3 -3
  373. package/src/plugins/builtin/cloud/team/pane-sections.tsx +105 -47
  374. package/src/plugins/builtin/cloud/team/pane-ui.tsx +42 -4
  375. package/src/plugins/builtin/cloud/team/pane.tsx +204 -64
  376. package/src/plugins/builtin/cloud/thesis/store.ts +45 -22
  377. package/src/plugins/builtin/cloud-tweets/registration.ts +1 -0
  378. package/src/plugins/builtin/commodities-energy/index.tsx +29 -2
  379. package/src/plugins/builtin/commodities-energy/view-state.ts +2 -0
  380. package/src/plugins/builtin/commodity-balances/pane.tsx +11 -4
  381. package/src/plugins/builtin/company-attention/app-rank.tsx +7 -5
  382. package/src/plugins/builtin/company-attention/building-model.ts +222 -0
  383. package/src/plugins/builtin/company-attention/building.tsx +172 -0
  384. package/src/plugins/builtin/company-attention/client.ts +117 -1
  385. package/src/plugins/builtin/company-attention/evidence.ts +16 -3
  386. package/src/plugins/builtin/company-attention/headless.ts +101 -5
  387. package/src/plugins/builtin/company-attention/index.tsx +6 -3
  388. package/src/plugins/builtin/company-attention/model.ts +33 -7
  389. package/src/plugins/builtin/company-attention/moves-model.ts +253 -0
  390. package/src/plugins/builtin/company-attention/moves.tsx +159 -0
  391. package/src/plugins/builtin/company-attention/pane.tsx +79 -23
  392. package/src/plugins/builtin/company-attention/signals-model.ts +229 -0
  393. package/src/plugins/builtin/company-attention/signals.tsx +160 -0
  394. package/src/plugins/builtin/company-kpis/headless.ts +3 -2
  395. package/src/plugins/builtin/company-kpis/model.ts +2 -2
  396. package/src/plugins/builtin/company-kpis/pane.tsx +1 -1
  397. package/src/plugins/builtin/composite-plugins.ts +2 -1
  398. package/src/plugins/builtin/congress-trades/headless.ts +1 -1
  399. package/src/plugins/builtin/connections/index.ts +1 -0
  400. package/src/plugins/builtin/correlation/headless-schema.ts +3 -2
  401. package/src/plugins/builtin/correlation/headless.ts +5 -3
  402. package/src/plugins/builtin/cot/headless.ts +28 -6
  403. package/src/plugins/builtin/cot/model.ts +12 -0
  404. package/src/plugins/builtin/cot/pane.tsx +3 -2
  405. package/src/plugins/builtin/cpi/headless.ts +5 -1
  406. package/src/plugins/builtin/cpi/pane.tsx +11 -9
  407. package/src/plugins/builtin/credit-boards/model.ts +2 -0
  408. package/src/plugins/builtin/credit-documents/headless.ts +1 -1
  409. package/src/plugins/builtin/crypto-board/client.ts +86 -0
  410. package/src/plugins/builtin/crypto-board/defi-view.tsx +218 -0
  411. package/src/plugins/builtin/crypto-board/defi.ts +239 -0
  412. package/src/plugins/builtin/crypto-board/headless.ts +117 -6
  413. package/src/plugins/builtin/crypto-board/index.tsx +8 -3
  414. package/src/plugins/builtin/crypto-board/model.ts +40 -8
  415. package/src/plugins/builtin/crypto-board/pane.tsx +55 -21
  416. package/src/plugins/builtin/crypto-board/series.ts +19 -1
  417. package/src/plugins/builtin/crypto-etf-flows/client.ts +60 -0
  418. package/src/plugins/builtin/crypto-etf-flows/headless.ts +132 -0
  419. package/src/plugins/builtin/crypto-etf-flows/index.tsx +44 -0
  420. package/src/plugins/builtin/crypto-etf-flows/model.ts +121 -0
  421. package/src/plugins/builtin/crypto-etf-flows/pane.tsx +193 -0
  422. package/src/plugins/builtin/debug/index.tsx +1 -0
  423. package/src/plugins/builtin/dividend-yield/index.tsx +1 -1
  424. package/src/plugins/builtin/docs/index.tsx +1 -1
  425. package/src/plugins/builtin/docs/pane.tsx +2 -2
  426. package/src/plugins/builtin/docs/targets.ts +1 -1
  427. package/src/plugins/builtin/doe/client.ts +5 -1
  428. package/src/plugins/builtin/doe/headless.ts +12 -6
  429. package/src/plugins/builtin/doe/model.ts +43 -6
  430. package/src/plugins/builtin/doe/pane.tsx +18 -11
  431. package/src/plugins/builtin/earnings/board-model.ts +13 -6
  432. package/src/plugins/builtin/earnings/board-table.ts +4 -1
  433. package/src/plugins/builtin/earnings/board.tsx +253 -50
  434. package/src/plugins/builtin/earnings/calendar-model.ts +188 -0
  435. package/src/plugins/builtin/earnings/calendar.tsx +338 -0
  436. package/src/plugins/builtin/earnings/client.ts +4 -3
  437. package/src/plugins/builtin/earnings/headless.ts +53 -15
  438. package/src/plugins/builtin/earnings/history-model.ts +53 -36
  439. package/src/plugins/builtin/earnings/index.tsx +15 -22
  440. package/src/plugins/builtin/earnings/model.ts +17 -12
  441. package/src/plugins/builtin/earnings/scope.ts +89 -0
  442. package/src/plugins/builtin/earnings-calls/calendar.tsx +310 -0
  443. package/src/plugins/builtin/earnings-calls/data.ts +146 -2
  444. package/src/plugins/builtin/earnings-calls/headless.ts +151 -9
  445. package/src/plugins/builtin/earnings-calls/index.tsx +3 -3
  446. package/src/plugins/builtin/earnings-calls/lock-note.ts +1 -1
  447. package/src/plugins/builtin/earnings-calls/pane.tsx +149 -31
  448. package/src/plugins/builtin/earnings-calls/upcoming.ts +195 -0
  449. package/src/plugins/builtin/earnings-ripple/pane.tsx +10 -5
  450. package/src/plugins/builtin/econ/calendar-model.ts +132 -20
  451. package/src/plugins/builtin/econ/detail-view.tsx +48 -10
  452. package/src/plugins/builtin/econ/fred-catalog.ts +23 -6
  453. package/src/plugins/builtin/econ/fred-series-map.ts +4 -0
  454. package/src/plugins/builtin/econ/index.tsx +112 -25
  455. package/src/plugins/builtin/econ/print-watch.ts +2 -1
  456. package/src/plugins/builtin/econ/types.ts +32 -1
  457. package/src/plugins/builtin/econ-statistics/client.ts +16 -3
  458. package/src/plugins/builtin/econ-statistics/defs.ts +4 -0
  459. package/src/plugins/builtin/econ-statistics/detail.tsx +2 -2
  460. package/src/plugins/builtin/econ-statistics/headless.ts +13 -2
  461. package/src/plugins/builtin/econ-statistics/index.tsx +3 -3
  462. package/src/plugins/builtin/econ-statistics/pane.tsx +2 -1
  463. package/src/plugins/builtin/econ-statistics/stats.ts +103 -0
  464. package/src/plugins/builtin/econ-statistics/view.ts +16 -1
  465. package/src/plugins/builtin/equity-screener/client.ts +21 -3
  466. package/src/plugins/builtin/equity-screener/headless.ts +68 -6
  467. package/src/plugins/builtin/equity-screener/live.ts +1 -1
  468. package/src/plugins/builtin/equity-screener/model.ts +6 -0
  469. package/src/plugins/builtin/equity-screener/pane.tsx +45 -10
  470. package/src/plugins/builtin/equity-screener/screen-check.ts +90 -0
  471. package/src/plugins/builtin/equity-screener/ticker-check.tsx +148 -0
  472. package/src/plugins/builtin/estimate-revisions/headless.ts +3 -1
  473. package/src/plugins/builtin/estimate-revisions/lock-note.ts +3 -3
  474. package/src/plugins/builtin/estimate-revisions/model.ts +8 -10
  475. package/src/plugins/builtin/exposure/headless.ts +51 -6
  476. package/src/plugins/builtin/exposure/index.tsx +28 -2
  477. package/src/plugins/builtin/exposure/model.ts +7 -0
  478. package/src/plugins/builtin/exposure/pane.tsx +6 -1
  479. package/src/plugins/builtin/fear-greed/index.tsx +1 -1
  480. package/src/plugins/builtin/filing-events/index.tsx +1 -1
  481. package/src/plugins/builtin/futures/model.ts +10 -9
  482. package/src/plugins/builtin/futures/returns.ts +8 -36
  483. package/src/plugins/builtin/futures/table.tsx +1 -1
  484. package/src/plugins/builtin/futures-curve/client.ts +40 -9
  485. package/src/plugins/builtin/futures-curve/headless.ts +39 -17
  486. package/src/plugins/builtin/futures-curve/model.ts +258 -69
  487. package/src/plugins/builtin/futures-curve/pane.tsx +46 -17
  488. package/src/plugins/builtin/fx-matrix/client.ts +15 -8
  489. package/src/plugins/builtin/fx-matrix/headless.ts +32 -14
  490. package/src/plugins/builtin/fx-matrix/index.tsx +13 -11
  491. package/src/plugins/builtin/fx-matrix/live-legs.ts +22 -0
  492. package/src/plugins/builtin/fx-matrix/settings.ts +2 -1
  493. package/src/plugins/builtin/gpu/headless.ts +9 -4
  494. package/src/plugins/builtin/help/index.tsx +13 -3
  495. package/src/plugins/builtin/holders/beneficial-model.ts +8 -11
  496. package/src/plugins/builtin/holders/beneficial-report.ts +6 -5
  497. package/src/plugins/builtin/holders/beneficial-view.tsx +7 -3
  498. package/src/plugins/builtin/holders/client.ts +13 -1
  499. package/src/plugins/builtin/holders/format.ts +28 -17
  500. package/src/plugins/builtin/holders/headless.ts +46 -7
  501. package/src/plugins/builtin/holders/index-holders.ts +264 -0
  502. package/src/plugins/builtin/holders/pane.tsx +79 -15
  503. package/src/plugins/builtin/holders/report-rows.ts +35 -7
  504. package/src/plugins/builtin/holders/table-model.ts +2 -1
  505. package/src/plugins/builtin/holders/treemap.tsx +2 -2
  506. package/src/plugins/builtin/insider/headless.ts +1 -1
  507. package/src/plugins/builtin/insider/signals-client.ts +1 -1
  508. package/src/plugins/builtin/insider/signals.tsx +1 -1
  509. package/src/plugins/builtin/ipo-calendar/pane.tsx +7 -4
  510. package/src/plugins/builtin/iv-history/client.ts +20 -0
  511. package/src/plugins/builtin/iv-history/headless.ts +4 -4
  512. package/src/plugins/builtin/iv-history/index.tsx +1 -1
  513. package/src/plugins/builtin/iv-history/model.ts +13 -4
  514. package/src/plugins/builtin/iv-history/series.ts +3 -1
  515. package/src/plugins/builtin/jobs/lock-note.ts +1 -1
  516. package/src/plugins/builtin/jobs/model.ts +4 -15
  517. package/src/plugins/builtin/jobs/pane.tsx +7 -5
  518. package/src/plugins/builtin/jobs/share-bars.tsx +11 -5
  519. package/src/plugins/builtin/jodi/pane.tsx +10 -4
  520. package/src/plugins/builtin/layout-manager/index.tsx +1 -0
  521. package/src/plugins/builtin/macro-day/headless.ts +20 -7
  522. package/src/plugins/builtin/macro-day/index.tsx +3 -2
  523. package/src/plugins/builtin/macro-day/model.ts +29 -8
  524. package/src/plugins/builtin/macro-day/pane.tsx +46 -10
  525. package/src/plugins/builtin/macro-day/releases.ts +55 -13
  526. package/src/plugins/builtin/market-heatmap/data.ts +9 -2
  527. package/src/plugins/builtin/market-heatmap/evidence.ts +1 -1
  528. package/src/plugins/builtin/market-heatmap/headless.ts +9 -6
  529. package/src/plugins/builtin/market-heatmap/index.tsx +3 -3
  530. package/src/plugins/builtin/market-heatmap/model.ts +10 -7
  531. package/src/plugins/builtin/market-movers/client.ts +33 -19
  532. package/src/plugins/builtin/market-movers/headless.ts +8 -2
  533. package/src/plugins/builtin/market-movers/index.tsx +16 -10
  534. package/src/plugins/builtin/market-movers/screener.ts +29 -8
  535. package/src/plugins/builtin/market-movers/session-body.tsx +4 -2
  536. package/src/plugins/builtin/market-movers/session-table.ts +4 -2
  537. package/src/plugins/builtin/market-movers/table.ts +4 -1
  538. package/src/plugins/builtin/market-valuation/headless.ts +2 -0
  539. package/src/plugins/builtin/market-valuation/view.ts +5 -0
  540. package/src/plugins/builtin/members/headless.ts +6 -5
  541. package/src/plugins/builtin/members/pane.tsx +11 -4
  542. package/src/plugins/builtin/mna/client.ts +1 -0
  543. package/src/plugins/builtin/mna/detail.tsx +20 -32
  544. package/src/plugins/builtin/mna/distress/detail.tsx +16 -4
  545. package/src/plugins/builtin/mna/distress/model.ts +3 -2
  546. package/src/plugins/builtin/mna/distress/pane.tsx +7 -4
  547. package/src/plugins/builtin/mna/headless.ts +6 -13
  548. package/src/plugins/builtin/mna/model.ts +93 -15
  549. package/src/plugins/builtin/mna/pane.tsx +5 -4
  550. package/src/plugins/builtin/news/headless.ts +12 -6
  551. package/src/plugins/builtin/news/index.tsx +10 -1
  552. package/src/plugins/builtin/news/wire/index.tsx +3 -2
  553. package/src/plugins/builtin/news/wire/news/command-bar-search.ts +26 -10
  554. package/src/plugins/builtin/news/wire/news/query-presets.ts +6 -2
  555. package/src/plugins/builtin/news/wire/rss/cli.ts +3 -3
  556. package/src/plugins/builtin/notes/cli.ts +49 -14
  557. package/src/plugins/builtin/openfda/pane.tsx +1 -1
  558. package/src/plugins/builtin/options/carry.ts +2 -2
  559. package/src/plugins/builtin/options/index.tsx +1 -1
  560. package/src/plugins/builtin/options/view.tsx +10 -10
  561. package/src/plugins/builtin/options-calculator/headless.ts +46 -7
  562. package/src/plugins/builtin/options-scenario/client.ts +123 -28
  563. package/src/plugins/builtin/options-scenario/collar.ts +8 -6
  564. package/src/plugins/builtin/options-scenario/csp-screen-headless.ts +127 -0
  565. package/src/plugins/builtin/options-scenario/csp-screen-pane.tsx +165 -0
  566. package/src/plugins/builtin/options-scenario/csp-screen.ts +258 -0
  567. package/src/plugins/builtin/options-scenario/csp.ts +101 -21
  568. package/src/plugins/builtin/options-scenario/headless.ts +36 -15
  569. package/src/plugins/builtin/options-scenario/hedge.ts +20 -14
  570. package/src/plugins/builtin/options-scenario/index.tsx +28 -3
  571. package/src/plugins/builtin/options-scenario/model.ts +13 -0
  572. package/src/plugins/builtin/options-scenario/pane.tsx +9 -5
  573. package/src/plugins/builtin/perps/equity-row.tsx +11 -3
  574. package/src/plugins/builtin/perps/freshness.ts +8 -5
  575. package/src/plugins/builtin/perps/headless.ts +3 -1
  576. package/src/plugins/builtin/perps/list-perpetuals.ts +25 -4
  577. package/src/plugins/builtin/perps/live-rows.ts +161 -0
  578. package/src/plugins/builtin/perps/markets-section.tsx +154 -0
  579. package/src/plugins/builtin/perps/pane.tsx +36 -17
  580. package/src/plugins/builtin/perps/venue-markets.ts +96 -0
  581. package/src/plugins/builtin/plugin-marketplace/index.tsx +2 -1
  582. package/src/plugins/builtin/plugin-marketplace/pane.tsx +143 -59
  583. package/src/plugins/builtin/portfolio-list/cli/bulk-symbols.ts +72 -24
  584. package/src/plugins/builtin/portfolio-list/cli/portfolio-command.ts +158 -141
  585. package/src/plugins/builtin/portfolio-list/cli/render.ts +49 -20
  586. package/src/plugins/builtin/portfolio-list/cli/shared.ts +3 -3
  587. package/src/plugins/builtin/portfolio-list/cli/watchlist-command.ts +29 -24
  588. package/src/plugins/builtin/portfolio-list/headless.ts +6 -3
  589. package/src/plugins/builtin/portfolio-list/income.ts +13 -2
  590. package/src/plugins/builtin/portfolio-list/index.tsx +9 -2
  591. package/src/plugins/builtin/portfolio-list/pane/index.tsx +21 -8
  592. package/src/plugins/builtin/portfolio-list/pane/purchase-date-fx.ts +46 -0
  593. package/src/plugins/builtin/portfolio-list/summary/live-accounts.ts +16 -9
  594. package/src/plugins/builtin/portfolio-list/summary/totals.ts +2 -15
  595. package/src/plugins/builtin/power/client.ts +4 -1
  596. package/src/plugins/builtin/power/evidence.ts +22 -7
  597. package/src/plugins/builtin/power/gas.tsx +5 -1
  598. package/src/plugins/builtin/power/pane.tsx +8 -1
  599. package/src/plugins/builtin/power/prices.tsx +10 -3
  600. package/src/plugins/builtin/research/analyst-headless.ts +25 -8
  601. package/src/plugins/builtin/research/analyst-model.ts +68 -3
  602. package/src/plugins/builtin/research/corporate-actions-pane.tsx +63 -14
  603. package/src/plugins/builtin/research/event-model.ts +3 -1
  604. package/src/plugins/builtin/research/event-sources.ts +12 -4
  605. package/src/plugins/builtin/research/index.tsx +2 -1
  606. package/src/plugins/builtin/research/relative-valuation-basis.ts +58 -0
  607. package/src/plugins/builtin/research/relative-valuation-columns.ts +31 -2
  608. package/src/plugins/builtin/research/relative-valuation-currency.ts +12 -5
  609. package/src/plugins/builtin/research/relative-valuation-headless.ts +84 -26
  610. package/src/plugins/builtin/research/relative-valuation-model.ts +88 -19
  611. package/src/plugins/builtin/research/relative-valuation-pane.tsx +76 -9
  612. package/src/plugins/builtin/research/relative-valuation-peers.ts +1 -1
  613. package/src/plugins/builtin/reverse-dcf/model.ts +6 -2
  614. package/src/plugins/builtin/risk-factors/index.tsx +2 -2
  615. package/src/plugins/builtin/scanner/lock-note.ts +1 -1
  616. package/src/plugins/builtin/sec/forms.ts +13 -0
  617. package/src/plugins/builtin/sec/fund-abroad.ts +32 -0
  618. package/src/plugins/builtin/sec/fund-facts.ts +68 -8
  619. package/src/plugins/builtin/sec/headless.ts +85 -8
  620. package/src/plugins/builtin/sec/index.tsx +58 -12
  621. package/src/plugins/builtin/sectors/client.ts +2 -1
  622. package/src/plugins/builtin/sectors/sector-model.ts +11 -15
  623. package/src/plugins/builtin/series-inventory.ts +2 -0
  624. package/src/plugins/builtin/shared/broker-reconnect.ts +107 -22
  625. package/src/plugins/builtin/shared/cloud-upgrade.ts +34 -6
  626. package/src/plugins/builtin/shared/earnings-calendar.ts +375 -0
  627. package/src/plugins/builtin/{earnings/estimate-basis.ts → shared/earnings-estimate-basis.ts} +1 -1
  628. package/src/plugins/builtin/shared/earnings-report.ts +3 -3
  629. package/src/plugins/builtin/shared/fx-rate-freshness.ts +23 -1
  630. package/src/plugins/builtin/shared/job-posting.ts +129 -0
  631. package/src/plugins/builtin/shared/pro-lock-note.ts +3 -3
  632. package/src/plugins/builtin/shared/report-freshness.ts +3 -0
  633. package/src/plugins/builtin/shared/research-trading.tsx +21 -0
  634. package/src/plugins/builtin/shared/series-cache.ts +2 -0
  635. package/src/plugins/builtin/shared/ticker-surface.ts +2 -1
  636. package/src/plugins/builtin/short-interest/client.ts +2 -0
  637. package/src/plugins/builtin/short-interest/headless.ts +41 -12
  638. package/src/plugins/builtin/short-interest/index.tsx +23 -1
  639. package/src/plugins/builtin/short-interest/model.ts +70 -19
  640. package/src/plugins/builtin/short-interest/pane.tsx +19 -2
  641. package/src/plugins/builtin/short-interest/publications-client.ts +82 -0
  642. package/src/plugins/builtin/short-interest/publications-headless.ts +29 -0
  643. package/src/plugins/builtin/short-interest/publications-model.ts +50 -0
  644. package/src/plugins/builtin/short-interest/publications-pane.tsx +66 -0
  645. package/src/plugins/builtin/short-interest/schedule.ts +35 -2
  646. package/src/plugins/builtin/short-interest/surface.tsx +11 -4
  647. package/src/plugins/builtin/short-interest/types.ts +9 -0
  648. package/src/plugins/builtin/short-interest/watch-client.ts +14 -8
  649. package/src/plugins/builtin/short-interest/watch-model.ts +12 -25
  650. package/src/plugins/builtin/short-interest/watch-pane.tsx +5 -1
  651. package/src/plugins/builtin/supply-chain/flow.tsx +33 -9
  652. package/src/plugins/builtin/supply-chain/model.ts +51 -3
  653. package/src/plugins/builtin/supply-chain/pane.tsx +78 -39
  654. package/src/plugins/builtin/supply-chain/row-evidence.tsx +1 -1
  655. package/src/plugins/builtin/themes/headless.ts +8 -5
  656. package/src/plugins/builtin/themes/model.ts +14 -4
  657. package/src/plugins/builtin/themes/pane.tsx +24 -5
  658. package/src/plugins/builtin/thirteenf/headless.ts +5 -5
  659. package/src/plugins/builtin/thirteenf/signals.ts +3 -1
  660. package/src/plugins/builtin/ticker-detail/adr-pair/headless.ts +123 -0
  661. package/src/plugins/builtin/ticker-detail/adr-pair/model.ts +132 -0
  662. package/src/plugins/builtin/ticker-detail/adr-pair/tab.tsx +87 -0
  663. package/src/plugins/builtin/ticker-detail/data-panes/historical-prices.tsx +40 -26
  664. package/src/plugins/builtin/ticker-detail/data-panes/history-bars.ts +8 -4
  665. package/src/plugins/builtin/ticker-detail/data-panes/returns-history.ts +67 -3
  666. package/src/plugins/builtin/ticker-detail/data-panes/returns-model.ts +112 -5
  667. package/src/plugins/builtin/ticker-detail/data-panes/returns-pane.tsx +17 -2
  668. package/src/plugins/builtin/ticker-detail/financials/aggregation.ts +21 -7
  669. package/src/plugins/builtin/ticker-detail/financials/model.ts +36 -1
  670. package/src/plugins/builtin/ticker-detail/financials/offerings.ts +56 -0
  671. package/src/plugins/builtin/ticker-detail/financials/ratios.ts +62 -13
  672. package/src/plugins/builtin/ticker-detail/financials/tab.tsx +30 -4
  673. package/src/plugins/builtin/ticker-detail/headless-schema.ts +14 -2
  674. package/src/plugins/builtin/ticker-detail/headless.ts +148 -35
  675. package/src/plugins/builtin/ticker-detail/index.tsx +37 -5
  676. package/src/plugins/builtin/ticker-detail/overview/model.ts +65 -10
  677. package/src/plugins/builtin/ticker-detail/overview/pane.tsx +9 -1
  678. package/src/plugins/builtin/ticker-detail/overview-tab.tsx +68 -11
  679. package/src/plugins/builtin/ticker-detail/pane.tsx +11 -0
  680. package/src/plugins/builtin/ticker-detail/quote-footer.ts +8 -3
  681. package/src/plugins/builtin/ticker-detail/research-tabs.ts +11 -0
  682. package/src/plugins/builtin/vol-surface/client.ts +5 -4
  683. package/src/plugins/builtin/vol-surface/headless.ts +12 -3
  684. package/src/plugins/builtin/vol-surface/model.ts +4 -2
  685. package/src/plugins/builtin/volatility/model.ts +5 -10
  686. package/src/plugins/builtin/world-venue-map/basemap-layer.tsx +4 -3
  687. package/src/plugins/builtin/world-venue-map/basemap.ts +3 -1
  688. package/src/plugins/builtin/world-venue-map/chokepoint-chart.ts +40 -0
  689. package/src/plugins/builtin/world-venue-map/evidence.ts +1 -1
  690. package/src/plugins/builtin/world-venue-map/geo-series.ts +90 -11
  691. package/src/plugins/builtin/world-venue-map/headless.ts +1 -1
  692. package/src/plugins/builtin/world-venue-map/index.ts +3 -26
  693. package/src/plugins/builtin/world-venue-map/layers.ts +1 -1
  694. package/src/plugins/builtin/world-venue-map/map.tsx +2 -1
  695. package/src/plugins/builtin/world-venue-map/pane.tsx +4 -2
  696. package/src/plugins/builtin/world-venue-map/venue-header.tsx +15 -4
  697. package/src/plugins/builtin/yield-curve/client.ts +25 -0
  698. package/src/plugins/builtin/yield-curve/curves.ts +7 -4
  699. package/src/plugins/builtin/yield-curve/headless.ts +38 -4
  700. package/src/plugins/builtin/yield-curve/history.ts +4 -3
  701. package/src/plugins/builtin/yield-curve/index.tsx +12 -6
  702. package/src/plugins/builtin/yield-curve/swaps-model.ts +93 -0
  703. package/src/plugins/builtin/yield-curve/swaps.tsx +99 -0
  704. package/src/plugins/bundle.ts +1 -1
  705. package/src/plugins/catalog-browser.ts +2 -1
  706. package/src/plugins/compat.ts +3 -3
  707. package/src/plugins/dependencies.ts +75 -14
  708. package/src/plugins/extracted-plugins.ts +132 -34
  709. package/src/plugins/host-link.ts +149 -34
  710. package/src/plugins/installer.ts +35 -10
  711. package/src/plugins/loader.ts +206 -38
  712. package/src/plugins/manager-node.ts +2 -2
  713. package/src/plugins/marketplace/deactivation.ts +22 -0
  714. package/src/plugins/marketplace/model.ts +2 -2
  715. package/src/plugins/marketplace/packs.ts +1 -1
  716. package/src/plugins/ownership.ts +1 -1
  717. package/src/plugins/peer-retry.ts +155 -0
  718. package/src/plugins/registry/contributions.ts +3 -1
  719. package/src/plugins/registry/index.ts +4 -3
  720. package/src/plugins/registry/plugin-state.ts +3 -0
  721. package/src/plugins/seed-notice.ts +20 -0
  722. package/src/plugins/shortcut-argument.ts +39 -0
  723. package/src/portfolio/allocation.ts +1 -1
  724. package/src/portfolio/collection-name.ts +31 -0
  725. package/src/portfolio/column-values.ts +10 -8
  726. package/src/portfolio/cost-fx.ts +296 -19
  727. package/src/portfolio/manual-lots.ts +75 -0
  728. package/src/portfolio/mutations.ts +60 -22
  729. package/src/portfolio/suffixed-listings.ts +209 -0
  730. package/src/portfolio/totals-currency.ts +24 -0
  731. package/src/public/__snapshots__/public-api.test.ts.snap +14 -0
  732. package/src/public/time-series.ts +11 -8
  733. package/src/remote/schema.ts +1 -1
  734. package/src/renderers/browser/config-host.ts +3 -0
  735. package/src/renderers/browser/main.tsx +23 -3
  736. package/src/renderers/dom/boot-frame-page.ts +187 -0
  737. package/src/renderers/dom/boot-frame.ts +237 -0
  738. package/src/renderers/dom/build-assets.ts +46 -8
  739. package/src/renderers/dom/dom-ui-host.tsx +4 -29
  740. package/src/renderers/dom/host/ascii-text.ts +16 -2
  741. package/src/renderers/dom/host/box.tsx +43 -2
  742. package/src/renderers/dom/host/chart-surface.tsx +2 -0
  743. package/src/renderers/dom/host/hls.chunk.ts +3 -0
  744. package/src/renderers/dom/host/image-surface.tsx +49 -0
  745. package/src/renderers/dom/host/media-surface.tsx +24 -18
  746. package/src/renderers/dom/host/mouse.ts +30 -0
  747. package/src/renderers/dom/host/size-observer.ts +1 -1
  748. package/src/renderers/dom/host/style.ts +1 -1
  749. package/src/renderers/dom/styles.css +76 -0
  750. package/src/renderers/dom/test-utils.tsx +2 -1
  751. package/src/renderers/electrobun/bun/application-menu/index.ts +3 -3
  752. package/src/renderers/electrobun/bun/desktop/backend-requests.ts +3 -0
  753. package/src/renderers/electrobun/bun/desktop/backend.ts +46 -3
  754. package/src/renderers/electrobun/bun/desktop/detached-windows.ts +1 -1
  755. package/src/renderers/electrobun/bun/desktop/host-requests.ts +9 -3
  756. package/src/renderers/electrobun/bun/desktop/initialization.ts +81 -18
  757. package/src/renderers/electrobun/bun/external-plugins.ts +29 -7
  758. package/src/renderers/electrobun/bun/index.ts +11 -1
  759. package/src/renderers/electrobun/bun/window/boot-frame.ts +67 -0
  760. package/src/renderers/electrobun/bun/window/create.ts +4 -1
  761. package/src/renderers/electrobun/shared/boot-frame.ts +7 -0
  762. package/src/renderers/electrobun/shared/protocol.ts +6 -1
  763. package/src/renderers/electrobun/view/cli-pane-shot-entry.tsx +1 -1
  764. package/src/renderers/electrobun/view/config-host.ts +3 -0
  765. package/src/renderers/electrobun/view/fatal-screen.tsx +1 -1
  766. package/src/renderers/electrobun/view/main.tsx +30 -4
  767. package/src/renderers/electrobun/view/news-source.ts +5 -5
  768. package/src/renderers/electrobun/view/remote/asset-data-client.ts +1 -1
  769. package/src/renderers/electrobun/view/ui-host.tsx +1 -1
  770. package/src/renderers/opentui/browser-open.ts +88 -0
  771. package/src/renderers/opentui/host.tsx +5 -14
  772. package/src/renderers/opentui/image/loader.ts +3 -2
  773. package/src/renderers/opentui/native-smoke.ts +10 -1
  774. package/src/renderers/opentui/pane-image/index.ts +2 -1
  775. package/src/renderers/opentui/render-lib.ts +253 -0
  776. package/src/renderers/opentui/render-timing-smoke.ts +1 -1
  777. package/src/renderers/opentui/start.tsx +1 -1
  778. package/src/renderers/share/layout-view.tsx +2 -2
  779. package/src/renderers/share/main.tsx +4 -4
  780. package/src/renderers/share/view.tsx +1 -1
  781. package/src/series/resolve.ts +22 -6
  782. package/src/series/standalone.ts +30 -2
  783. package/src/series/types.ts +8 -1
  784. package/src/shares/api.ts +4 -1
  785. package/src/shares/pane.ts +1 -1
  786. package/src/sources/gloomberb-cloud/fred-series.ts +46 -1
  787. package/src/sources/gloomberb-cloud/index.ts +32 -16
  788. package/src/sources/gloomberb-cloud/news.ts +39 -0
  789. package/src/sources/gloomberb-cloud/normalizers.ts +14 -1
  790. package/src/sources/gloomberb-cloud/perpetuals.ts +49 -1
  791. package/src/sources/listing-symbols.ts +37 -0
  792. package/src/sources/provider-errors.ts +16 -2
  793. package/src/sources/provider-router/financial-routes.ts +21 -3
  794. package/src/sources/provider-router/financials.ts +15 -2
  795. package/src/sources/provider-router/history.ts +30 -8
  796. package/src/sources/provider-router/primary.ts +1 -1
  797. package/src/state/app/bootstrap.ts +23 -0
  798. package/src/state/hooks/inline-tickers.ts +30 -5
  799. package/src/sync/controller.ts +1 -1
  800. package/src/sync/core-contributors.ts +46 -14
  801. package/src/team/collections-sync.ts +2 -1
  802. package/src/team/collections.ts +178 -17
  803. package/src/telemetry/crash-reports.ts +17 -4
  804. package/src/test-support/builtin-panes.ts +1 -1
  805. package/src/theme/colors.ts +3 -30
  806. package/src/theme/ui-tokens.ts +37 -1
  807. package/src/tickers/company-name-listing.ts +210 -33
  808. package/src/tickers/index-roots.ts +47 -0
  809. package/src/tickers/instrument-label.ts +5 -1
  810. package/src/tickers/metadata.ts +10 -0
  811. package/src/tickers/perpetual-listing.ts +5 -2
  812. package/src/tickers/search/home-listing.ts +75 -0
  813. package/src/tickers/search/index.ts +76 -27
  814. package/src/tickers/search/ranking.ts +54 -4
  815. package/src/tickers/search/upsert.ts +29 -0
  816. package/src/tickers/terminal-codes.ts +416 -40
  817. package/src/time-series/bar-aggregation.ts +243 -0
  818. package/src/time-series/base-series.ts +307 -0
  819. package/src/time-series/chart-bounds.ts +349 -0
  820. package/src/time-series/chart-seed.ts +142 -0
  821. package/src/time-series/economic.ts +5 -0
  822. package/src/time-series/fundamentals.ts +18 -3
  823. package/src/time-series/history-acquisition.ts +499 -0
  824. package/src/time-series/leverage.ts +100 -0
  825. package/src/time-series/market-resolution.ts +4 -2
  826. package/src/time-series/market.ts +2 -1
  827. package/src/time-series/price-comparison.ts +175 -30
  828. package/src/time-series/range.ts +9 -1
  829. package/src/time-series/resolution.ts +174 -16
  830. package/src/time-series/resolve-context.ts +157 -0
  831. package/src/time-series/resolve.ts +126 -1577
  832. package/src/time-series/series-name.ts +38 -0
  833. package/src/time-series/series-presentation.ts +208 -0
  834. package/src/time-series/spec.ts +11 -6
  835. package/src/time-series/studies.ts +109 -12
  836. package/src/time-series/tail-reconcile.ts +121 -0
  837. package/src/time-series/types.ts +29 -2
  838. package/src/time-series/use-chart-resolution.ts +4 -5
  839. package/src/types/broker.ts +10 -0
  840. package/src/types/config.ts +14 -0
  841. package/src/types/data-provider.ts +14 -0
  842. package/src/types/exchange-rate.ts +6 -0
  843. package/src/types/financials.ts +104 -7
  844. package/src/types/headless.ts +76 -6
  845. package/src/types/instrument.ts +3 -0
  846. package/src/types/plugin.ts +65 -8
  847. package/src/types/price-history.ts +2 -0
  848. package/src/types/ticker.ts +13 -0
  849. package/src/types/trading.ts +59 -1
  850. package/src/ui/ascii-font.ts +13 -1
  851. package/src/ui/host.tsx +6 -1
  852. package/src/updater/command-names.ts +175 -0
  853. package/src/updater/index.ts +10 -5
  854. package/src/utils/calendar-date.ts +32 -15
  855. package/src/utils/cash-runway.ts +241 -0
  856. package/src/utils/central-banks.ts +42 -0
  857. package/src/utils/cli-output.ts +259 -80
  858. package/src/utils/contract-month.ts +16 -0
  859. package/src/utils/crypto-pair.ts +61 -3
  860. package/src/utils/currency-units.ts +29 -0
  861. package/src/utils/datetime-format.ts +10 -0
  862. package/src/utils/debug-log.ts +1 -1
  863. package/src/utils/decimal-comma.ts +39 -6
  864. package/src/utils/exchange-announcements.ts +71 -0
  865. package/src/utils/exchange-rate-snapshot.ts +10 -0
  866. package/src/utils/financial-statements.ts +83 -4
  867. package/src/utils/format.ts +34 -16
  868. package/src/utils/fundamentals.ts +150 -34
  869. package/src/utils/fx-market-hours.ts +10 -1
  870. package/src/utils/latest-financial-period.ts +8 -0
  871. package/src/utils/linux-libc.ts +54 -0
  872. package/src/utils/market-capitalization.ts +111 -15
  873. package/src/utils/max-drawdown.ts +64 -0
  874. package/src/utils/network-failure.ts +83 -0
  875. package/src/utils/option-expiry.ts +139 -7
  876. package/src/utils/price-earnings.ts +11 -5
  877. package/src/utils/price-history.ts +18 -8
  878. package/src/utils/price-window.ts +131 -0
  879. package/src/utils/release-date.ts +47 -0
  880. package/src/utils/sec.ts +3 -0
  881. package/src/utils/throttled-fetch.ts +11 -4
  882. package/src/utils/trailing-eps.ts +67 -0
  883. package/src/utils/typed-text.ts +21 -0
  884. package/src/utils/utc-time.ts +24 -1
  885. package/src/version.ts +6 -0
  886. package/src/cli/pane-functions/screenshot.ts +0 -2122
@@ -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,
@@ -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
  : [];
@@ -10,7 +10,8 @@ import { matchPrefix, type Command } from "../../commands/registry";
10
10
  import type { ResultItem } from "../../list/model";
11
11
  import type { CommandBarCategoryPriorities } from "../../view-model";
12
12
  import type { CommandBarRoute } from "../../workflow/types";
13
- import { normalizeCommandTickerSearchText } from "../ticker-search/results";
13
+ import { normalizeCommandTickerSearchText, readRootTickerQuery } from "../ticker-search/results";
14
+ import { endsInLegalForm, readNearMissListing, readTerminalListingCode } from "../../../../tickers/terminal-codes";
14
15
  import { useTickerSearchRouteResults } from "../ticker-search/route";
15
16
  import { buildRootResultModel, type RootResultModel } from "./results";
16
17
  import { useRootProviderSearch } from "./provider-search";
@@ -52,6 +53,7 @@ interface UseCommandBarRootRuntimeOptions {
52
53
  ): void | Promise<void>;
53
54
  getAvailablePaneShortcutTemplates(query: string): PaneTemplateDef[];
54
55
  getRecentPaneTemplate?: (id: string, arg?: string) => PaneTemplateDef | undefined;
56
+ leadingShortcutCode?: string | null;
55
57
  getTickers(): AppState["tickers"];
56
58
  hasPaneSettings(paneId: string): boolean;
57
59
  localTickerSearchResultItems(query?: string, options?: { category?: string; limit?: number }): ResultItem[];
@@ -114,6 +116,7 @@ export function useCommandBarRootRuntime({
114
116
  executeCollectionCommand,
115
117
  getAvailablePaneShortcutTemplates,
116
118
  getRecentPaneTemplate,
119
+ leadingShortcutCode,
117
120
  getTickers,
118
121
  hasPaneSettings,
119
122
  localTickerSearchResultItems,
@@ -196,6 +199,7 @@ export function useCommandBarRootRuntime({
196
199
  getAvailablePaneShortcutTemplates,
197
200
  getRecentPaneTemplate,
198
201
  hasPaneSettings,
202
+ leadingShortcutCode,
199
203
  localTickerSearchResultItems,
200
204
  nonShortcutPaneTemplateItems,
201
205
  openModeRoute,
@@ -229,6 +233,7 @@ export function useCommandBarRootRuntime({
229
233
  getAvailablePaneShortcutTemplates,
230
234
  getRecentPaneTemplate,
231
235
  hasPaneSettings,
236
+ leadingShortcutCode,
232
237
  localTickerSearchResultItems,
233
238
  nonShortcutPaneTemplateItems,
234
239
  openModeRoute,
@@ -246,8 +251,9 @@ export function useCommandBarRootRuntime({
246
251
  tickerActionItems,
247
252
  ]);
248
253
 
254
+ // `DES VOD LN` searches the listing the code names, as Enter opens it; `DES SAP SE` the company.
249
255
  const rootSecurityDescriptionArg = activeMatch?.command.id === "security-description" && activeMatch.arg.length >= 1
250
- ? activeMatch.arg
256
+ ? (endsInLegalForm(activeMatch.arg) ? null : readTerminalListingCode(activeMatch.arg)?.key) ?? readNearMissListing(activeMatch.arg)?.symbol ?? activeMatch.arg
251
257
  : null;
252
258
  // Free text that no prefix claims also goes to symbol search, so "nvidia"
253
259
  // finds NVDA without the backtick. Skipped when a local row already carries
@@ -257,10 +263,15 @@ export function useCommandBarRootRuntime({
257
263
  if (currentRoute || activeMatch || rootShortcutIntent.kind !== "none") return null;
258
264
  return listingChoiceQuery(rootQuery);
259
265
  }, [activeMatch, currentRoute, rootQuery, rootShortcutIntent.kind]);
266
+ // `VOD LN`, `AAPL GP` and `700.HK` search the symbol they are read as, and the rows say which listing they name.
267
+ const rootTickerReading = useMemo(() => (
268
+ currentRoute || activeMatch || rootShortcutIntent.kind !== "none" || rootListingChoice ? null : readRootTickerQuery(rootQuery)
269
+ ), [activeMatch, currentRoute, rootListingChoice, rootQuery, rootShortcutIntent.kind]);
260
270
  const rootPlainTickerSearchArg = useMemo(() => {
261
271
  if (currentRoute || activeMatch || rootShortcutIntent.kind !== "none") return null;
262
272
  // An explicit venue choice also searches one-letter symbols and names shared with local actions.
263
273
  if (rootListingChoice) return rootListingChoice.symbol;
274
+ if (rootTickerReading) return rootTickerReading.search;
264
275
  const trimmed = rootQuery.trim();
265
276
  const symbolQuery = symbolSearchQuery(trimmed);
266
277
  if (symbolQuery.length < 2) return null;
@@ -277,7 +288,7 @@ export function useCommandBarRootRuntime({
277
288
  && normalizeCommandTickerSearchText(item.label) === normalizedQuery
278
289
  ));
279
290
  return hasExactLocalRow ? null : symbolQuery;
280
- }, [activeMatch, currentRoute, pluginInstallItem, rootListingChoice, rootQuery, rootResultModel.items, rootShortcutIntent.kind]);
291
+ }, [activeMatch, currentRoute, pluginInstallItem, rootListingChoice, rootQuery, rootResultModel.items, rootShortcutIntent.kind, rootTickerReading]);
281
292
  const rootTickerSearchArg = rootSecurityDescriptionArg ?? rootPlainTickerSearchArg;
282
293
 
283
294
  const {
@@ -297,6 +308,7 @@ export function useCommandBarRootRuntime({
297
308
  readTickerSearchCache,
298
309
  rootPlainTickerSearchArg,
299
310
  listingSuffix: rootPlainTickerSearchArg && rootListingChoice ? rootListingChoice.suffix : null,
311
+ reading: rootPlainTickerSearchArg ? rootTickerReading : null,
300
312
  rootResultItems: rootResultModel.items,
301
313
  rootTickerSearchArg,
302
314
  tickers: state.tickers,
@@ -9,6 +9,8 @@ import type { ResultItem } from "../../list/model";
9
9
 
10
10
  const DEFAULT_MIN_QUERY_LENGTH = 3;
11
11
  const DEFAULT_DEBOUNCE_MS = 300;
12
+ /** The corpus answers in well under a second; past this a provider is stuck, not slow. */
13
+ const DEFAULT_PROVIDER_TIMEOUT_MS = 8_000;
12
14
  const PROVIDER_ROW_PREFIX = "search-provider:";
13
15
 
14
16
  /** A row a plugin search provider contributed, as opposed to one the bar resolved itself. */
@@ -135,7 +137,9 @@ function useProviderMatchItems({
135
137
  * Runs plugin search providers for the root list. Each provider debounces and
136
138
  * aborts on its own, answers are memoized for the life of the bar, and rows are
137
139
  * only ever added to the static list: a provider that fails, hangs, or answers
138
- * late leaves what the command bar already resolved exactly as it was.
140
+ * late leaves what the command bar already resolved exactly as it was. Every
141
+ * provider settles: one that has not answered within its `timeoutMs` is
142
+ * aborted and counts as empty, so the bar never keeps searching for it.
139
143
  * Providers that answer from memory skip all of that and come back as
140
144
  * `providerMatchItems`, for the bar to rank with its own matches.
141
145
  */
@@ -235,9 +239,27 @@ export function useCommandBarSearchProviders({
235
239
  const controller = new AbortController();
236
240
  abortsRef.current.set(provider.id, controller);
237
241
  void (async () => {
242
+ let deadline: ReturnType<typeof setTimeout> | undefined;
243
+ // Ends the wait on the deadline, and on an abort, so a provider that
244
+ // ignores its signal does not hold the request for the full deadline.
245
+ const timedOut = new Promise<null>((resolve) => {
246
+ deadline = setTimeout(() => resolve(null), provider.timeoutMs ?? DEFAULT_PROVIDER_TIMEOUT_MS);
247
+ controller.signal.addEventListener("abort", () => resolve(null), { once: true });
248
+ });
238
249
  try {
239
- const results = await provider.provide(trimmed, contextRef.current, controller.signal);
250
+ const results = await Promise.race([
251
+ provider.provide(trimmed, contextRef.current, controller.signal),
252
+ timedOut,
253
+ ]);
240
254
  if (controller.signal.aborted) return;
255
+ if (!results) {
256
+ // A provider that never answers is a provider with nothing to
257
+ // say: the bar stops searching for it, and what it sends later is
258
+ // dropped. Nothing is memoized, so a later visit to the text asks again.
259
+ controller.abort();
260
+ publish(provider, trimmed, []);
261
+ return;
262
+ }
241
263
  cacheRef.current.set(`${provider.id}\n${trimmed}`, results);
242
264
  publish(provider, trimmed, results);
243
265
  } catch {
@@ -246,6 +268,7 @@ export function useCommandBarSearchProviders({
246
268
  if (controller.signal.aborted) return;
247
269
  publish(provider, trimmed, []);
248
270
  } finally {
271
+ clearTimeout(deadline);
249
272
  if (abortsRef.current.get(provider.id) === controller) {
250
273
  abortsRef.current.delete(provider.id);
251
274
  setLoading(provider.id, false);
@@ -26,6 +26,7 @@ interface PaneTemplateItemOptions {
26
26
 
27
27
  interface RootSelectionCommandOptions {
28
28
  activeTickerSymbol: string | null;
29
+ promptTickerSymbol?: string | null;
29
30
  availableCommands: Command[];
30
31
  createPaneTemplateItem: (template: PaneTemplateDef, options?: PaneTemplateItemOptions) => ResultItem;
31
32
  createPluginCommandItem: (command: CommandDef, options?: { shortcutArg?: string }) => ResultItem;
@@ -40,7 +41,7 @@ interface RootSelectionCommandOptions {
40
41
  openPaneTemplateWorkflow: (template: PaneTemplateDef, options?: { arg?: string }) => void;
41
42
  pluginCommandResultItems: (command: CommandDef, shortcutArg: string) => ResultItem[];
42
43
  runDirectCommand: (command: Command, arg: string) => void;
43
- runSecurityDescriptionShortcut: (query?: string) => void | Promise<void>;
44
+ runSecurityDescriptionShortcut: (query?: string, options?: { forceNewPane?: boolean }) => void | Promise<void>;
44
45
  setRootQuery: (query: string) => void;
45
46
  startThemePicker: (arg: string) => void;
46
47
  }
@@ -54,6 +55,7 @@ export function acceptRootShortcutTabAction(options: RootSelectionCommandOptions
54
55
  pluginCommands: options.getAvailablePluginCommands(),
55
56
  paneTemplates: options.getAvailablePaneShortcutTemplates(options.query),
56
57
  activeTicker: options.activeTickerSymbol,
58
+ promptTicker: options.promptTickerSymbol,
57
59
  });
58
60
  if (intent.kind === "none") return false;
59
61
  if (intent.kind === "inferred-complete" && intent.completionQuery) {
@@ -103,6 +105,7 @@ export function buildImmediateRootSelection(options: RootSelectionCommandOptions
103
105
  pluginCommands: options.getAvailablePluginCommands(),
104
106
  paneTemplates: options.getAvailablePaneShortcutTemplates(options.query),
105
107
  activeTicker: options.activeTickerSymbol,
108
+ promptTicker: options.promptTickerSymbol,
106
109
  });
107
110
  if (intent.kind !== "none" && intent.source === "pane-template") {
108
111
  return options.createPaneTemplateItem(intent.template, {
@@ -139,6 +142,7 @@ export function buildImmediateRootSelection(options: RootSelectionCommandOptions
139
142
  right: match.command.prefix,
140
143
  shortcutQuery: match.command.prefix,
141
144
  action: () => { void options.runSecurityDescriptionShortcut(inferredTicker); },
145
+ secondaryAction: () => { void options.runSecurityDescriptionShortcut(inferredTicker, { forceNewPane: true }); },
142
146
  };
143
147
  }
144
148
  return {
@@ -159,6 +163,7 @@ export function buildImmediateRootSelection(options: RootSelectionCommandOptions
159
163
  right: match.command.prefix,
160
164
  shortcutQuery: match.command.prefix,
161
165
  action: () => { void options.runSecurityDescriptionShortcut(match.arg); },
166
+ secondaryAction: () => { void options.runSecurityDescriptionShortcut(match.arg, { forceNewPane: true }); },
162
167
  };
163
168
  }
164
169
 
@@ -1,4 +1,5 @@
1
1
  import type { AppState } from "../../../../state/app/context";
2
+ import { commandPromptTicker } from "../../../../layout/selected-ticker";
2
3
  import { normalizeTickerInput } from "../../../../tickers/search";
3
4
  import {
4
5
  getCollectionCommandAction,
@@ -37,7 +38,9 @@ export function buildRootShortcutFeedback({
37
38
  if (rootShortcutIntent.template.shortcut?.argOptional && !rootShortcutIntent.argText) {
38
39
  return `Shortcut: ${rootShortcutIntent.label}`;
39
40
  }
40
- const symbol = normalizeTickerInput(activeTickerSymbol, rootShortcutIntent.argText);
41
+ // Same ticker the intent inferred: the prompt's, so a linked desk counts.
42
+ const inferFrom = commandPromptTicker(state)?.symbol ?? activeTickerSymbol;
43
+ const symbol = normalizeTickerInput(inferFrom, rootShortcutIntent.argText);
41
44
  if (symbol) {
42
45
  return rootShortcutIntent.kind === "inferred-complete"
43
46
  ? `Shortcut: ${rootShortcutIntent.label} for ${symbol} · Tab to accept`
@@ -121,18 +121,42 @@ function buildShortcutCandidates(
121
121
  ].sort((a, b) => b.prefix.length - a.prefix.length);
122
122
  }
123
123
 
124
+ /**
125
+ * The function code the text starts with, whatever follows it: `MOST foo`
126
+ * leads with MOST though MOST takes no argument. Null for any other text.
127
+ */
128
+ export function leadingShortcutCode({
129
+ query,
130
+ commands,
131
+ pluginCommands = [],
132
+ paneTemplates,
133
+ }: {
134
+ query: string;
135
+ commands: Command[];
136
+ pluginCommands?: CommandDef[];
137
+ paneTemplates: PaneTemplateDef[];
138
+ }): string | null {
139
+ const first = query.trim().split(/\s+/)[0]?.toUpperCase();
140
+ if (!first) return null;
141
+ return buildShortcutCandidates(commands, pluginCommands, paneTemplates)
142
+ .find((candidate) => candidate.prefix === first)?.prefix ?? null;
143
+ }
144
+
124
145
  export function parseRootShortcutIntent({
125
146
  query,
126
147
  commands,
127
148
  pluginCommands = [],
128
149
  paneTemplates,
129
150
  activeTicker,
151
+ promptTicker = null,
130
152
  }: {
131
153
  query: string;
132
154
  commands: Command[];
133
155
  pluginCommands?: CommandDef[];
134
156
  paneTemplates: PaneTemplateDef[];
135
157
  activeTicker: string | null;
158
+ /** The command prompt's instrument, used when a pane requires a ticker and the focused pane has none. */
159
+ promptTicker?: string | null;
136
160
  }): ShortcutIntent {
137
161
  const trimmed = query.trim();
138
162
  if (!trimmed) return { kind: "none" };
@@ -145,9 +169,12 @@ export function parseRootShortcutIntent({
145
169
  if (!match) return { kind: "none" };
146
170
 
147
171
  const argText = trimmed.slice(match.prefix.length).trim();
148
- const inferredArg = match.source === "pane-template" && match.template?.shortcut?.argOptional
149
- ? null
150
- : inferShortcutArg(match.argKind, activeTicker);
172
+ // A pane that requires a ticker takes the one already in the prompt. An
173
+ // optional ticker stays unbound, and other commands keep the focused ticker.
174
+ const inferFrom = match.source === "pane-template"
175
+ ? (match.template?.shortcut?.argOptional ? null : (promptTicker ?? activeTicker))
176
+ : activeTicker;
177
+ const inferredArg = inferShortcutArg(match.argKind, inferFrom);
151
178
  const completionQuery = inferredArg ? `${match.prefix} ${inferredArg}` : null;
152
179
 
153
180
  let kind: Exclude<ShortcutIntentKind, "none">;