gloomberb 0.16.4 → 0.16.6

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 (852) hide show
  1. package/README.md +14 -91
  2. package/package.json +5 -1
  3. package/src/{plugins/builtin/cloud → account}/auth-form.tsx +9 -9
  4. package/src/{plugins/builtin/cloud → account}/auth-model.ts +4 -4
  5. package/src/account/billing.ts +57 -0
  6. package/src/{plugins/builtin/cloud → account}/device-signin-dialog.tsx +18 -12
  7. package/src/{plugins/builtin/cloud → account}/device-signin.ts +2 -2
  8. package/src/{plugins/builtin/cloud → account}/email-auth-attempt.ts +2 -2
  9. package/src/account/session.ts +16 -0
  10. package/src/{plugins/builtin/cloud → account}/upgrade-dialog.tsx +16 -15
  11. package/src/{plugins/builtin/cloud → account}/upgrade-personalization.ts +7 -7
  12. package/src/{plugins/builtin/cloud → account}/upgrade-tickers.ts +6 -6
  13. package/src/{plugins/builtin/cloud → account}/verification-panel.tsx +6 -6
  14. package/src/api-client/central-bank-rates.ts +6 -1
  15. package/src/api-client/chat.ts +26 -0
  16. package/src/api-client/credit-boards.ts +2 -0
  17. package/src/api-client/data.ts +73 -3
  18. package/src/api-client/earnings.ts +6 -0
  19. package/src/api-client/europe-energy.ts +106 -0
  20. package/src/api-client/futures-curve.ts +56 -0
  21. package/src/api-client/index.ts +13 -1
  22. package/src/api-client/market-discovery.ts +13 -1
  23. package/src/api-client/normalizers.ts +32 -0
  24. package/src/api-client/paths.ts +7 -0
  25. package/src/api-client/perps.ts +8 -0
  26. package/src/api-client/request.ts +9 -2
  27. package/src/api-client/research-activity.ts +15 -10
  28. package/src/api-client/socket.ts +29 -0
  29. package/src/api-client/themes.ts +22 -1
  30. package/src/api-client/types.ts +78 -2
  31. package/src/api-client/yield-curves.ts +8 -0
  32. package/src/app/global-shortcuts.ts +50 -2
  33. package/src/app/keybindings/actions.ts +12 -1
  34. package/src/app/pane-runtime/plugin-bindings.ts +2 -2
  35. package/src/app/pane-runtime/ticker-open-runtime.ts +16 -6
  36. package/src/app/runtime/desktop-deeplink.ts +10 -5
  37. package/src/app/runtime/startup.ts +1 -1
  38. package/src/app.tsx +6 -0
  39. package/src/architecture/core-builtin-allowlist.json +8 -26
  40. package/src/ask-gloom/pane-context.ts +114 -0
  41. package/src/ask-gloom/pane-request.ts +70 -0
  42. package/src/ask-gloom/pane-text.ts +201 -0
  43. package/src/brokers/signed-in/sign-in-dialog.tsx +11 -5
  44. package/src/capabilities/chart-series.ts +19 -2
  45. package/src/capabilities/factories.ts +1 -0
  46. package/src/cli/central-bank-events.ts +23 -0
  47. package/src/cli/command-options.ts +17 -5
  48. package/src/cli/commands/crypto-hints.ts +35 -2
  49. package/src/cli/commands/fred-series.ts +146 -0
  50. package/src/cli/commands/market.ts +501 -115
  51. package/src/cli/commands/news-hints.ts +62 -0
  52. package/src/cli/commands/news-search.ts +53 -0
  53. package/src/cli/commands/options-leaps.ts +5 -2
  54. package/src/cli/commands/overview.ts +132 -26
  55. package/src/cli/commands/remote.ts +2 -1
  56. package/src/cli/commands/search.ts +317 -13
  57. package/src/cli/commands/system.ts +55 -8
  58. package/src/cli/commands/ticker.ts +155 -18
  59. package/src/cli/context.ts +45 -14
  60. package/src/cli/desktop-pane-shot.ts +76 -7
  61. package/src/cli/earnings-calendar.ts +71 -0
  62. package/src/cli/errors.ts +7 -5
  63. package/src/cli/exit-codes.ts +8 -0
  64. package/src/cli/export-source.ts +58 -0
  65. package/src/cli/freshness.ts +18 -7
  66. package/src/cli/glossary.ts +483 -0
  67. package/src/cli/help.ts +10 -0
  68. package/src/cli/helpers.ts +2 -5
  69. package/src/cli/history-rows.ts +118 -7
  70. package/src/cli/index-roots.ts +7 -0
  71. package/src/cli/index.ts +29 -9
  72. package/src/cli/known-gaps.ts +84 -0
  73. package/src/cli/listing-arg.ts +551 -97
  74. package/src/cli/not-a-ticker.ts +24 -9
  75. package/src/cli/pane-functions/access-gate.ts +13 -2
  76. package/src/cli/pane-functions/capabilities.ts +4 -3
  77. package/src/cli/pane-functions/catalog.ts +214 -40
  78. package/src/cli/pane-functions/data.ts +42 -8
  79. package/src/cli/pane-functions/discovery.ts +1 -0
  80. package/src/cli/pane-functions/dom.ts +37 -8
  81. package/src/cli/pane-functions/freshness.ts +393 -49
  82. package/src/cli/pane-functions/function-help.ts +31 -15
  83. package/src/cli/pane-functions/headless.ts +98 -30
  84. package/src/cli/pane-functions/index.ts +101 -19
  85. package/src/cli/pane-functions/market-session.ts +22 -8
  86. package/src/cli/pane-functions/options.ts +71 -22
  87. package/src/cli/pane-functions/report-notices.ts +25 -7
  88. package/src/cli/pane-functions/report.ts +15 -8
  89. package/src/cli/pane-functions/resolver.ts +74 -19
  90. package/src/cli/pane-functions/screenshot.ts +250 -27
  91. package/src/cli/perpetual-contract.ts +60 -0
  92. package/src/cli/registry.ts +3 -1
  93. package/src/cli/report-tables.ts +26 -7
  94. package/src/cli/result.ts +45 -11
  95. package/src/cli/series-search.ts +111 -0
  96. package/src/cli/staged-tickers.ts +52 -0
  97. package/src/cli/symbol-args.ts +27 -0
  98. package/src/cli/symbol-list.ts +154 -0
  99. package/src/cli/symbol-rows.ts +154 -0
  100. package/src/cli/ticker-resolution.ts +311 -27
  101. package/src/cli/types.ts +5 -0
  102. package/src/components/chart/composite/axis-overlays.tsx +14 -3
  103. package/src/components/chart/composite/composite-chart.tsx +71 -11
  104. package/src/components/chart/composite/crosshair-readout.tsx +150 -0
  105. package/src/components/chart/composite/downsample.ts +1 -1
  106. package/src/components/chart/composite/format.ts +29 -0
  107. package/src/components/chart/composite/interactions.ts +9 -2
  108. package/src/components/chart/composite/legend.tsx +100 -33
  109. package/src/components/chart/composite/panel-bitmap.ts +70 -35
  110. package/src/components/chart/composite/panel-labels.ts +18 -17
  111. package/src/components/chart/composite/panel-series.ts +1 -0
  112. package/src/components/chart/composite/panel-surface.tsx +46 -21
  113. package/src/components/chart/composite/price-axis-labels.tsx +3 -1
  114. package/src/components/chart/composite/rasterizer.ts +50 -8
  115. package/src/components/chart/composite/scene.ts +2 -1
  116. package/src/components/chart/composite/time-scale.ts +26 -9
  117. package/src/components/chart/composite/types.ts +18 -0
  118. package/src/components/chart/composite/use-composite-viewport.ts +30 -2
  119. package/src/components/chart/native/raster/crosshair.ts +8 -3
  120. package/src/components/chart/native/raster/primitives.ts +85 -21
  121. package/src/components/chart/native/surface/manager.ts +33 -8
  122. package/src/components/chart/surface3d/chart.tsx +1 -1
  123. package/src/components/command-bar/action-runtime.ts +1 -1
  124. package/src/components/command-bar/commands/collection-list.ts +210 -0
  125. package/src/components/command-bar/commands/collection.ts +40 -1
  126. package/src/components/command-bar/commands/direct/index.ts +4 -0
  127. package/src/components/command-bar/commands/registry.ts +8 -0
  128. package/src/components/command-bar/panel/index.tsx +11 -3
  129. package/src/components/command-bar/panel/runtime.ts +3 -0
  130. package/src/components/command-bar/panel/types.ts +2 -0
  131. package/src/components/command-bar/routes/root/plugin-install.ts +4 -4
  132. package/src/components/command-bar/routes/root/provider-search.ts +4 -3
  133. package/src/components/command-bar/routes/ticker-search/results.ts +12 -11
  134. package/src/components/command-bar/routes/ticker-search/route.ts +4 -3
  135. package/src/components/command-bar/routing/actions.ts +1 -1
  136. package/src/components/command-bar/workflow/tickers.ts +42 -17
  137. package/src/components/layout/detached-pane-shell.tsx +68 -39
  138. package/src/components/layout/floating-pane.tsx +10 -1
  139. package/src/components/layout/header.tsx +25 -5
  140. package/src/components/layout/missing-pane.tsx +3 -3
  141. package/src/components/layout/pane/capture-stamp.ts +41 -0
  142. package/src/components/layout/pane/capture-status.ts +12 -0
  143. package/src/components/layout/pane/content.tsx +7 -13
  144. package/src/components/layout/pane/footer/index.tsx +6 -2
  145. package/src/components/layout/pane/footer/keyboard.ts +3 -0
  146. package/src/components/layout/pane/footer/model.ts +41 -1
  147. package/src/components/layout/pane/header.tsx +50 -1
  148. package/src/components/layout/pane/index.tsx +21 -3
  149. package/src/components/layout/pane/sidebar.tsx +88 -21
  150. package/src/components/layout/shell/active-drag.ts +21 -5
  151. package/src/components/layout/shell/cursor-occlusion.ts +2 -1
  152. package/src/components/layout/shell/drag/index.ts +39 -9
  153. package/src/components/layout/shell/drag/live.ts +61 -51
  154. package/src/components/layout/shell/drag/runtime.ts +54 -12
  155. package/src/components/layout/shell/index.tsx +84 -65
  156. package/src/components/layout/shell/menu.ts +14 -1
  157. package/src/components/layout/shell/native/pointer-runtime.ts +3 -1
  158. package/src/components/layout/shell/pane/actions.ts +32 -10
  159. package/src/components/layout/shell/pane/ask.ts +131 -0
  160. package/src/components/layout/shell/pane/capture.ts +162 -0
  161. package/src/components/layout/shell/pane/layers.tsx +218 -50
  162. package/src/components/layout/shell/pane/management-shortcuts.ts +46 -1
  163. package/src/components/layout/shell/shortcuts.ts +21 -4
  164. package/src/components/layout/shell/terminal-pointer-runtime.ts +24 -0
  165. package/src/components/markdown-text.tsx +62 -20
  166. package/src/components/metric-treemap/heat-surface.tsx +8 -1
  167. package/src/components/onboarding/account-step/form-panel.tsx +1 -1
  168. package/src/components/onboarding/account-step/index.tsx +1 -1
  169. package/src/components/onboarding/account-step/qr-panel.tsx +1 -1
  170. package/src/components/onboarding/account-step/signed-in-panel.tsx +1 -1
  171. package/src/components/onboarding/onboarding-keyboard.ts +1 -1
  172. package/src/components/onboarding/onboarding-wizard.tsx +2 -2
  173. package/src/components/onboarding/use-onboarding-upgrade.ts +3 -3
  174. package/src/components/onboarding/wizard-account.ts +2 -2
  175. package/src/components/pane-template-wizard.tsx +9 -1
  176. package/src/components/price-selector-dialog.tsx +11 -2
  177. package/src/components/reader/article-reader.tsx +642 -0
  178. package/src/components/reader/article-text.ts +527 -0
  179. package/src/components/sign-in-gate.tsx +3 -3
  180. package/src/components/ticker/list-table-view.tsx +43 -2
  181. package/src/components/ui/action-row.tsx +2 -1
  182. package/src/components/ui/button.tsx +7 -1
  183. package/src/components/ui/choice-dialog.tsx +6 -4
  184. package/src/components/ui/confirm-dialog.tsx +28 -18
  185. package/src/components/ui/data-table/index.tsx +18 -6
  186. package/src/components/ui/data-table/opentui/index.tsx +37 -6
  187. package/src/components/ui/data-table/types.ts +12 -0
  188. package/src/components/ui/dialog-actions.tsx +64 -0
  189. package/src/components/ui/display.tsx +17 -3
  190. package/src/components/ui/frame.tsx +35 -2
  191. package/src/components/ui/icon.tsx +6 -1
  192. package/src/components/ui/query-bar.tsx +10 -1
  193. package/src/components/ui/text-prompt-dialog.tsx +11 -9
  194. package/src/data/cached-query.ts +2 -0
  195. package/src/data/config/store/migrations.ts +7 -0
  196. package/src/data/config/store/normalize.ts +7 -2
  197. package/src/data/config/store/portfolio-as-of-column.ts +57 -0
  198. package/src/data/ticker-repository.ts +5 -0
  199. package/src/data/ticker-store.ts +15 -0
  200. package/src/docs/content.ts +215 -0
  201. package/src/docs/load.ts +139 -0
  202. package/src/docs/requests.ts +39 -0
  203. package/src/docs/snapshot.chunk.ts +8 -0
  204. package/src/docs/snapshot.json +7555 -0
  205. package/src/docs/topics.ts +216 -0
  206. package/src/i18n/es.ts +65 -5
  207. package/src/i18n/ja.ts +65 -5
  208. package/src/i18n/ko.ts +65 -5
  209. package/src/i18n/zh-cn.ts +65 -5
  210. package/src/i18n/zh-tw.ts +65 -5
  211. package/src/layout/desks.ts +1 -1
  212. package/src/layout/pane-manager/dock-tree.ts +18 -0
  213. package/src/layout/pane-manager/index.ts +1 -0
  214. package/src/layout-marketplace/gallery.tsx +1 -1
  215. package/src/market-data/coordinator/chart.ts +10 -4
  216. package/src/market-data/coordinator/index.ts +6 -3
  217. package/src/{plugins/builtin/futures/contracts.ts → market-data/futures-board.ts} +81 -28
  218. package/src/market-data/futures-contract.ts +151 -0
  219. package/src/market-data/hooks.tsx +10 -2
  220. package/src/market-data/market/format.ts +39 -21
  221. package/src/market-data/market/freshness.ts +84 -20
  222. package/src/market-data/market/session-close-note.ts +3 -2
  223. package/src/market-data/market/status.ts +19 -23
  224. package/src/market-data/published-apac-sessions.ts +23 -1
  225. package/src/market-data/quotes/contributions.ts +5 -0
  226. package/src/market-data/quotes/metadata.ts +19 -24
  227. package/src/market-data/quotes/resolution.ts +5 -0
  228. package/src/market-data/quotes/screener-live-quotes.ts +5 -4
  229. package/src/market-data/result-types.ts +2 -0
  230. package/src/notifications/app-notifier.ts +17 -1
  231. package/src/notifications/notification-log.ts +180 -0
  232. package/src/plugins/auto-update-node.ts +2 -2
  233. package/src/plugins/auto-update.ts +2 -2
  234. package/src/plugins/builtin/account-management/index.tsx +1 -0
  235. package/src/plugins/builtin/account-management/model.ts +1 -56
  236. package/src/plugins/builtin/account-management/pane.tsx +6 -4
  237. package/src/plugins/builtin/account-management/password-dialog.tsx +1 -1
  238. package/src/plugins/builtin/alerts/catalysts.ts +1 -1
  239. package/src/plugins/builtin/alerts/cli.ts +313 -47
  240. package/src/plugins/builtin/alerts/events-pane.tsx +45 -7
  241. package/src/plugins/builtin/alerts/events.ts +23 -2
  242. package/src/plugins/builtin/alerts/focus.ts +27 -0
  243. package/src/plugins/builtin/alerts/history-pane.tsx +7 -2
  244. package/src/plugins/builtin/alerts/history.ts +2 -0
  245. package/src/plugins/builtin/alerts/index.tsx +47 -11
  246. package/src/plugins/builtin/alerts/pane.tsx +27 -1
  247. package/src/plugins/builtin/alerts/research-builder.ts +8 -3
  248. package/src/plugins/builtin/alerts/research-rules.ts +18 -2
  249. package/src/plugins/builtin/alerts/scheduled-check.ts +122 -0
  250. package/src/plugins/builtin/alerts/scheduled-sources.ts +25 -0
  251. package/src/plugins/builtin/alerts/scheduled.ts +254 -0
  252. package/src/plugins/builtin/alerts/targets.ts +92 -0
  253. package/src/plugins/builtin/analytics/index.tsx +8 -3
  254. package/src/plugins/builtin/analytics/risk-headless.ts +60 -27
  255. package/src/plugins/builtin/analytics/risk-math.ts +91 -27
  256. package/src/plugins/builtin/analytics/risk-model.ts +35 -5
  257. package/src/plugins/builtin/analytics/risk-pane.tsx +15 -8
  258. package/src/plugins/builtin/attention/headless.ts +1 -1
  259. package/src/plugins/builtin/attention/index.tsx +2 -0
  260. package/src/plugins/builtin/attention/pane.tsx +3 -1
  261. package/src/plugins/builtin/attention/series.ts +26 -0
  262. package/src/plugins/builtin/awards/headless.ts +88 -18
  263. package/src/plugins/builtin/awards/index.tsx +2 -0
  264. package/src/plugins/builtin/awards/model.ts +41 -1
  265. package/src/plugins/builtin/awards/pane.tsx +22 -13
  266. package/src/plugins/builtin/awards/series.ts +29 -0
  267. package/src/plugins/builtin/backtest/headless.ts +2 -2
  268. package/src/plugins/builtin/bond-calculator/model.ts +2 -1
  269. package/src/plugins/builtin/broker-manager/index.tsx +1 -0
  270. package/src/plugins/builtin/catalysts/headless.ts +1 -1
  271. package/src/plugins/builtin/catalysts/pane.tsx +3 -1
  272. package/src/plugins/builtin/cds/client.ts +49 -12
  273. package/src/plugins/builtin/cds/headless.ts +119 -19
  274. package/src/plugins/builtin/cds/index.tsx +3 -1
  275. package/src/plugins/builtin/cds/model.ts +214 -32
  276. package/src/plugins/builtin/cds/pane.tsx +58 -14
  277. package/src/plugins/builtin/cds/series.ts +19 -0
  278. package/src/plugins/builtin/central-bank-rates/client.ts +4 -0
  279. package/src/plugins/builtin/central-bank-rates/headless.ts +46 -16
  280. package/src/plugins/builtin/central-bank-rates/index.tsx +3 -1
  281. package/src/plugins/builtin/central-bank-rates/model.ts +99 -0
  282. package/src/plugins/builtin/central-bank-rates/pane.tsx +1 -1
  283. package/src/plugins/builtin/central-bank-rates/series.ts +36 -0
  284. package/src/plugins/builtin/chart-composer/catalog-inventory.ts +193 -255
  285. package/src/plugins/builtin/chart-composer/data-catalog-pane.tsx +84 -46
  286. package/src/plugins/builtin/chart-composer/editor.tsx +5 -4
  287. package/src/plugins/builtin/chart-composer/field-series.ts +40 -0
  288. package/src/plugins/builtin/chart-composer/headless-schema.ts +1 -1
  289. package/src/plugins/builtin/chart-composer/headless.ts +70 -5
  290. package/src/plugins/builtin/chart-composer/index.tsx +15 -3
  291. package/src/plugins/builtin/chart-composer/pane.tsx +81 -38
  292. package/src/plugins/builtin/chart-composer/series-catalog.ts +58 -50
  293. package/src/plugins/builtin/chart-composer/series-expression.ts +18 -10
  294. package/src/plugins/builtin/chart-composer/use-series-catalog.ts +59 -3
  295. package/src/plugins/builtin/chart-composer/user-series.ts +84 -0
  296. package/src/plugins/builtin/chat/content/composer-runtime.ts +6 -1
  297. package/src/plugins/builtin/chat/content/composer.tsx +5 -1
  298. package/src/plugins/builtin/chat/content/footer.tsx +12 -0
  299. package/src/plugins/builtin/chat/content/index.tsx +89 -5
  300. package/src/plugins/builtin/chat/content/new-dm-dialog.tsx +10 -2
  301. package/src/plugins/builtin/chat/content/new-messages.tsx +89 -0
  302. package/src/plugins/builtin/chat/content/row-activity.ts +132 -0
  303. package/src/plugins/builtin/chat/content/scroll.ts +127 -27
  304. package/src/plugins/builtin/chat/content/shortcuts.ts +2 -2
  305. package/src/plugins/builtin/chat/content/transcript.tsx +145 -78
  306. package/src/plugins/builtin/chat/content/types.ts +1 -0
  307. package/src/plugins/builtin/chat/controller/fetch.ts +8 -2
  308. package/src/plugins/builtin/chat/controller/index.ts +123 -1
  309. package/src/plugins/builtin/chat/controller/message-loading.ts +3 -0
  310. package/src/plugins/builtin/chat/controller/messages.ts +7 -2
  311. package/src/plugins/builtin/chat/controller/realtime.ts +10 -1
  312. package/src/plugins/builtin/chat/controller/send.ts +61 -1
  313. package/src/plugins/builtin/chat/controller/state.ts +8 -0
  314. package/src/plugins/builtin/chat/ghost-user.ts +20 -0
  315. package/src/plugins/builtin/chat/index.tsx +23 -5
  316. package/src/plugins/builtin/chat/layout.ts +78 -5
  317. package/src/plugins/builtin/chat/message/ai-badge.tsx +18 -0
  318. package/src/plugins/builtin/chat/message/desktop.tsx +55 -6
  319. package/src/plugins/builtin/chat/message/header.tsx +16 -4
  320. package/src/plugins/builtin/chat/message/profile-popover.tsx +5 -1
  321. package/src/plugins/builtin/chat/message/reactions.tsx +210 -0
  322. package/src/plugins/builtin/chat/message/render-state.ts +18 -2
  323. package/src/plugins/builtin/chat/message/terminal.tsx +43 -4
  324. package/src/plugins/builtin/chat/message/types.ts +12 -0
  325. package/src/plugins/builtin/chat/reactions.ts +197 -0
  326. package/src/plugins/builtin/chat/share/flow.tsx +87 -0
  327. package/src/plugins/builtin/chat/share/targets.ts +27 -0
  328. package/src/plugins/builtin/chat/status-widget.tsx +6 -3
  329. package/src/plugins/builtin/chat/unread-inbox-pane.tsx +148 -27
  330. package/src/plugins/builtin/chat/unread-inbox.ts +22 -0
  331. package/src/plugins/builtin/cloud/askg/attached-pane.tsx +69 -0
  332. package/src/plugins/builtin/cloud/askg/controller.ts +111 -19
  333. package/src/plugins/builtin/cloud/askg/executor.ts +57 -3
  334. package/src/plugins/builtin/cloud/askg/manifest.ts +32 -7
  335. package/src/plugins/builtin/cloud/askg/model.ts +27 -8
  336. package/src/plugins/builtin/cloud/askg/pane-attachment.ts +94 -0
  337. package/src/plugins/builtin/cloud/askg/pane.tsx +141 -12
  338. package/src/plugins/builtin/cloud/askg/pending-question.ts +11 -0
  339. package/src/plugins/builtin/cloud/askg/protocol.ts +10 -1
  340. package/src/plugins/builtin/cloud/askg/tool-display.ts +3 -0
  341. package/src/plugins/builtin/cloud/askg/undo.ts +2 -0
  342. package/src/plugins/builtin/cloud/auth-actions.tsx +1 -1
  343. package/src/plugins/builtin/cloud/auth-commands.ts +1 -1
  344. package/src/plugins/builtin/cloud/auth-dialog.tsx +3 -3
  345. package/src/plugins/builtin/cloud/company-picker.tsx +1 -1
  346. package/src/plugins/builtin/cloud/mcp-connect/dialog.tsx +3 -0
  347. package/src/plugins/builtin/cloud/plugin.tsx +19 -2
  348. package/src/plugins/builtin/cloud/team/model.ts +5 -0
  349. package/src/plugins/builtin/cloud/team/module.tsx +1 -0
  350. package/src/plugins/builtin/cloud/team/store.ts +8 -3
  351. package/src/plugins/builtin/cloud/terminal-relay/engine.ts +77 -9
  352. package/src/plugins/builtin/cloud/terminal-relay/manifest.ts +6 -1
  353. package/src/plugins/builtin/cloud/terminal-relay/policy.ts +9 -0
  354. package/src/plugins/builtin/cloud/terminal-relay/prompts.tsx +35 -11
  355. package/src/plugins/builtin/cloud/thesis/exposure.ts +1 -1
  356. package/src/plugins/builtin/cloud/thesis/module.tsx +1 -0
  357. package/src/plugins/builtin/cloud/thesis/prompts.tsx +2 -1
  358. package/src/plugins/builtin/company-attention/app-rank.tsx +1 -1
  359. package/src/plugins/builtin/company-attention/headless.ts +21 -7
  360. package/src/plugins/builtin/company-attention/index.tsx +2 -0
  361. package/src/plugins/builtin/company-attention/model.ts +26 -7
  362. package/src/plugins/builtin/company-attention/pane.tsx +12 -9
  363. package/src/plugins/builtin/company-attention/series.ts +52 -0
  364. package/src/plugins/builtin/company-kpis/headless.ts +97 -10
  365. package/src/plugins/builtin/company-kpis/model.ts +24 -2
  366. package/src/plugins/builtin/company-kpis/pane.tsx +17 -16
  367. package/src/plugins/builtin/composite-plugins.ts +19 -13
  368. package/src/plugins/builtin/connections/index.ts +1 -0
  369. package/src/plugins/builtin/cot/headless.ts +1 -1
  370. package/src/plugins/builtin/cot/index.tsx +3 -1
  371. package/src/plugins/builtin/cot/model.ts +40 -11
  372. package/src/plugins/builtin/cot/series.ts +27 -0
  373. package/src/plugins/builtin/cpi/headless.ts +3 -3
  374. package/src/plugins/builtin/credit-boards/cdx-pane.tsx +10 -1
  375. package/src/plugins/builtin/credit-boards/client.ts +6 -2
  376. package/src/plugins/builtin/credit-boards/headless.ts +108 -31
  377. package/src/plugins/builtin/credit-boards/index.tsx +2 -0
  378. package/src/plugins/builtin/credit-boards/model.ts +11 -1
  379. package/src/plugins/builtin/credit-boards/series.ts +66 -0
  380. package/src/plugins/builtin/credit-conditions/client.ts +12 -9
  381. package/src/plugins/builtin/credit-conditions/headless.ts +13 -2
  382. package/src/plugins/builtin/credit-conditions/index.tsx +18 -9
  383. package/src/plugins/builtin/credit-conditions/model.ts +19 -11
  384. package/src/plugins/builtin/credit-conditions/series.ts +16 -0
  385. package/src/plugins/builtin/credit-documents/headless.ts +33 -3
  386. package/src/plugins/builtin/credit-documents/pane.tsx +3 -1
  387. package/src/plugins/builtin/crypto-board/headless.ts +2 -3
  388. package/src/plugins/builtin/crypto-board/index.tsx +2 -0
  389. package/src/plugins/builtin/crypto-board/model.ts +12 -0
  390. package/src/plugins/builtin/crypto-board/pane.tsx +19 -12
  391. package/src/plugins/builtin/crypto-board/series.ts +48 -0
  392. package/src/plugins/builtin/custom-view/live-quotes.ts +2 -2
  393. package/src/plugins/builtin/debt-maturities/headless.ts +17 -11
  394. package/src/plugins/builtin/debt-maturities/index.tsx +2 -0
  395. package/src/plugins/builtin/debt-maturities/series.ts +45 -0
  396. package/src/plugins/builtin/dividend-yield/client.ts +3 -0
  397. package/src/plugins/builtin/dividend-yield/headless.ts +7 -4
  398. package/src/plugins/builtin/dividend-yield/index.tsx +3 -1
  399. package/src/plugins/builtin/dividend-yield/pane.tsx +3 -1
  400. package/src/plugins/builtin/dividend-yield/series.ts +20 -0
  401. package/src/plugins/builtin/dividend-yield/types.ts +2 -0
  402. package/src/plugins/builtin/docs/blocks.tsx +181 -0
  403. package/src/plugins/builtin/docs/index.tsx +68 -0
  404. package/src/plugins/builtin/docs/pane.tsx +426 -0
  405. package/src/plugins/builtin/docs/targets.ts +72 -0
  406. package/src/plugins/builtin/docs/use-docs.ts +60 -0
  407. package/src/plugins/builtin/doe/headless.ts +12 -8
  408. package/src/plugins/builtin/doe/index.tsx +2 -0
  409. package/src/plugins/builtin/doe/series.ts +62 -0
  410. package/src/plugins/builtin/earnings/client.ts +3 -2
  411. package/src/plugins/builtin/earnings/format.ts +1 -5
  412. package/src/plugins/builtin/earnings/headless.ts +58 -6
  413. package/src/plugins/builtin/earnings/history-model.ts +15 -1
  414. package/src/plugins/builtin/earnings/history-table.ts +13 -2
  415. package/src/plugins/builtin/earnings/history.tsx +7 -3
  416. package/src/plugins/builtin/earnings/index.tsx +9 -0
  417. package/src/plugins/builtin/earnings-calls/headless.ts +28 -2
  418. package/src/plugins/builtin/earnings-calls/index.tsx +1 -1
  419. package/src/plugins/builtin/earnings-ripple/index.tsx +2 -0
  420. package/src/plugins/builtin/econ/fred-catalog.ts +198 -0
  421. package/src/plugins/builtin/econ/fred-series-map.ts +0 -46
  422. package/src/plugins/builtin/econ/index.tsx +2 -0
  423. package/src/plugins/builtin/econ-statistics/defs.ts +5 -0
  424. package/src/plugins/builtin/econ-statistics/headless.ts +19 -4
  425. package/src/plugins/builtin/econ-statistics/stats.ts +1 -0
  426. package/src/plugins/builtin/equity-screener/headless.ts +3 -3
  427. package/src/plugins/builtin/equity-screener/pane.tsx +4 -11
  428. package/src/plugins/builtin/estimate-revisions/headless.ts +3 -3
  429. package/src/plugins/builtin/exposure/drivers.ts +13 -0
  430. package/src/plugins/builtin/exposure/headless.ts +205 -13
  431. package/src/plugins/builtin/exposure/holdings.ts +1 -1
  432. package/src/plugins/builtin/exposure/index.tsx +1 -0
  433. package/src/plugins/builtin/exposure/model.ts +23 -3
  434. package/src/plugins/builtin/exposure/pane.tsx +14 -12
  435. package/src/plugins/builtin/fear-greed/index.tsx +18 -10
  436. package/src/plugins/builtin/fear-greed/series.ts +52 -0
  437. package/src/plugins/builtin/futures/index.tsx +43 -3
  438. package/src/plugins/builtin/futures/model.ts +1 -1
  439. package/src/plugins/builtin/futures/returns.ts +1 -1
  440. package/src/plugins/builtin/futures/series.ts +13 -0
  441. package/src/plugins/builtin/futures/table.tsx +1 -1
  442. package/src/plugins/builtin/futures/use-front-returns.ts +1 -1
  443. package/src/plugins/builtin/futures-curve/client.ts +12 -3
  444. package/src/plugins/builtin/futures-curve/headless.ts +71 -10
  445. package/src/plugins/builtin/futures-curve/index.tsx +1 -1
  446. package/src/plugins/builtin/futures-curve/model.ts +66 -11
  447. package/src/plugins/builtin/futures-curve/pane.tsx +52 -18
  448. package/src/plugins/builtin/fx-matrix/client.ts +63 -0
  449. package/src/plugins/builtin/fx-matrix/export.ts +2 -1
  450. package/src/plugins/builtin/fx-matrix/headless.ts +154 -0
  451. package/src/plugins/builtin/fx-matrix/index.tsx +4 -4
  452. package/src/plugins/builtin/gpu/board.tsx +13 -10
  453. package/src/plugins/builtin/gpu/changes.tsx +4 -4
  454. package/src/plugins/builtin/gpu/client.ts +19 -1
  455. package/src/plugins/builtin/gpu/equities.tsx +14 -10
  456. package/src/plugins/builtin/gpu/headless.ts +58 -27
  457. package/src/plugins/builtin/gpu/history.tsx +3 -3
  458. package/src/plugins/builtin/gpu/index.tsx +2 -0
  459. package/src/plugins/builtin/gpu/model.ts +101 -16
  460. package/src/plugins/builtin/gpu/pane.tsx +28 -12
  461. package/src/plugins/builtin/gpu/series.ts +38 -0
  462. package/src/plugins/builtin/help/function-card.tsx +25 -6
  463. package/src/plugins/builtin/help/function-index.ts +2 -0
  464. package/src/plugins/builtin/help/index.tsx +31 -9
  465. package/src/plugins/builtin/holders/beneficial-model.ts +90 -3
  466. package/src/plugins/builtin/holders/beneficial-report.ts +57 -5
  467. package/src/plugins/builtin/holders/beneficial-view.tsx +55 -11
  468. package/src/plugins/builtin/holders/client.ts +22 -3
  469. package/src/plugins/builtin/holders/format.ts +18 -3
  470. package/src/plugins/builtin/holders/headless.ts +36 -133
  471. package/src/plugins/builtin/holders/pane.tsx +11 -4
  472. package/src/plugins/builtin/holders/report-header.ts +40 -5
  473. package/src/plugins/builtin/holders/report-rows.ts +240 -0
  474. package/src/plugins/builtin/insider/client.ts +35 -20
  475. package/src/plugins/builtin/insider/headless.ts +41 -11
  476. package/src/plugins/builtin/insider/index.tsx +26 -9
  477. package/src/plugins/builtin/insider/insider-data.ts +10 -0
  478. package/src/plugins/builtin/insider/issuer.ts +49 -0
  479. package/src/plugins/builtin/insider/model.ts +3 -0
  480. package/src/plugins/builtin/ipo-calendar/headless.ts +1 -1
  481. package/src/plugins/builtin/iv-history/client.ts +20 -6
  482. package/src/plugins/builtin/iv-history/format.ts +9 -0
  483. package/src/plugins/builtin/iv-history/headless.ts +56 -21
  484. package/src/plugins/builtin/iv-history/index.tsx +2 -0
  485. package/src/plugins/builtin/iv-history/model.ts +143 -8
  486. package/src/plugins/builtin/iv-history/screen-pane.tsx +5 -9
  487. package/src/plugins/builtin/iv-history/series.ts +29 -0
  488. package/src/plugins/builtin/jobs/headless.ts +26 -3
  489. package/src/plugins/builtin/jobs/index.tsx +3 -1
  490. package/src/plugins/builtin/jobs/series.ts +19 -0
  491. package/src/plugins/builtin/kelly-sizer/index.tsx +2 -0
  492. package/src/plugins/builtin/kelly-sizer/pane.tsx +2 -1
  493. package/src/plugins/builtin/kelly-sizer/portfolio.ts +0 -39
  494. package/src/plugins/builtin/macro-day/client.ts +44 -3
  495. package/src/plugins/builtin/macro-day/headless.ts +13 -10
  496. package/src/plugins/builtin/macro-day/model.ts +56 -10
  497. package/src/plugins/builtin/macro-day/pane.tsx +30 -20
  498. package/src/plugins/builtin/market-heatmap/headless.ts +20 -5
  499. package/src/plugins/builtin/market-heatmap/index.tsx +6 -0
  500. package/src/plugins/builtin/market-heatmap/model.ts +19 -11
  501. package/src/plugins/builtin/market-heatmap/portfolio.ts +2 -2
  502. package/src/plugins/builtin/market-movers/client.ts +7 -5
  503. package/src/plugins/builtin/market-movers/index.tsx +3 -2
  504. package/src/plugins/builtin/market-movers/model.ts +30 -0
  505. package/src/plugins/builtin/market-movers/screener.ts +31 -0
  506. package/src/plugins/builtin/market-valuation/chart-series.ts +29 -69
  507. package/src/plugins/builtin/market-valuation/index.tsx +3 -3
  508. package/src/plugins/builtin/market-valuation/indicators.ts +0 -5
  509. package/src/plugins/builtin/members/headless.ts +8 -3
  510. package/src/plugins/builtin/members/model.ts +31 -3
  511. package/src/plugins/builtin/members/pane.tsx +6 -8
  512. package/src/plugins/builtin/mna/distress/headless.ts +4 -4
  513. package/src/plugins/builtin/mna/headless.ts +18 -6
  514. package/src/plugins/builtin/money-markets/headless.ts +5 -4
  515. package/src/plugins/builtin/money-markets/index.tsx +2 -0
  516. package/src/plugins/builtin/money-markets/series.ts +41 -0
  517. package/src/plugins/builtin/news/index.tsx +0 -2
  518. package/src/plugins/builtin/news/wire/news/detail-view.tsx +53 -104
  519. package/src/plugins/builtin/news/wire/news/footer.ts +2 -25
  520. package/src/plugins/builtin/news/wire/news/preset-pane.tsx +0 -2
  521. package/src/plugins/builtin/notes/cli.ts +12 -7
  522. package/src/plugins/builtin/notes/index.tsx +1 -0
  523. package/src/plugins/builtin/options/index.tsx +3 -0
  524. package/src/plugins/builtin/options/view.tsx +1 -1
  525. package/src/plugins/builtin/options-calculator/inputs.ts +2 -1
  526. package/src/plugins/builtin/options-positioning/client.ts +7 -3
  527. package/src/plugins/builtin/options-positioning/headless.ts +4 -3
  528. package/src/plugins/builtin/options-positioning/pane.tsx +2 -2
  529. package/src/plugins/builtin/options-scenario/client.ts +2 -1
  530. package/src/plugins/builtin/options-scenario/headless.ts +1 -0
  531. package/src/plugins/builtin/options-scenario/hedge.ts +2 -1
  532. package/src/plugins/builtin/perps/client.ts +90 -16
  533. package/src/plugins/builtin/perps/equity-row.tsx +52 -17
  534. package/src/plugins/builtin/perps/freshness.ts +66 -0
  535. package/src/plugins/builtin/perps/headless.ts +47 -32
  536. package/src/plugins/builtin/perps/index.tsx +23 -4
  537. package/src/plugins/builtin/perps/list-perpetuals.ts +118 -0
  538. package/src/plugins/builtin/perps/model.ts +20 -5
  539. package/src/plugins/builtin/perps/open-market.ts +15 -0
  540. package/src/plugins/builtin/perps/pane.tsx +76 -20
  541. package/src/plugins/builtin/perps/series.ts +76 -0
  542. package/src/plugins/builtin/plugin-marketplace/index.tsx +1 -1
  543. package/src/plugins/builtin/plugin-marketplace/pane.tsx +73 -67
  544. package/src/plugins/builtin/plugin-module.ts +3 -0
  545. package/src/plugins/builtin/portfolio-list/account-metrics.ts +1 -1
  546. package/src/plugins/builtin/portfolio-list/allocation.ts +5 -4
  547. package/src/plugins/builtin/portfolio-list/cell-version.ts +8 -1
  548. package/src/plugins/builtin/portfolio-list/cli/bulk-symbols.ts +161 -0
  549. package/src/plugins/builtin/portfolio-list/cli/import-13f.ts +109 -0
  550. package/src/plugins/builtin/portfolio-list/cli/portfolio-command.ts +384 -74
  551. package/src/plugins/builtin/portfolio-list/cli/render.ts +437 -71
  552. package/src/plugins/builtin/portfolio-list/cli/shared.ts +21 -4
  553. package/src/plugins/builtin/portfolio-list/cli/watchlist-command.ts +121 -47
  554. package/src/plugins/builtin/portfolio-list/column-values.ts +104 -26
  555. package/src/plugins/builtin/portfolio-list/grid.tsx +1 -1
  556. package/src/plugins/builtin/portfolio-list/headless.ts +84 -18
  557. package/src/plugins/builtin/portfolio-list/imported-from.ts +8 -0
  558. package/src/plugins/builtin/portfolio-list/index.tsx +5 -1
  559. package/src/plugins/builtin/portfolio-list/live-valuation.ts +6 -2
  560. package/src/plugins/builtin/portfolio-list/mutations.ts +2 -9
  561. package/src/plugins/builtin/portfolio-list/pane/data.ts +5 -1
  562. package/src/plugins/builtin/portfolio-list/pane/index.tsx +52 -9
  563. package/src/plugins/builtin/portfolio-list/quick-add/index.tsx +33 -11
  564. package/src/plugins/builtin/portfolio-list/quick-add/resolution.ts +21 -1
  565. package/src/plugins/builtin/portfolio-list/settings.ts +17 -0
  566. package/src/plugins/builtin/portfolio-list/summary/index.tsx +12 -0
  567. package/src/plugins/builtin/portfolio-list/summary/totals.ts +9 -4
  568. package/src/plugins/builtin/portfolio-list/table.tsx +37 -7
  569. package/src/plugins/builtin/power/client.ts +16 -0
  570. package/src/plugins/builtin/power/evidence.ts +63 -10
  571. package/src/plugins/builtin/power/headless.ts +77 -9
  572. package/src/plugins/builtin/power/index.tsx +28 -3
  573. package/src/plugins/builtin/power/model.ts +73 -2
  574. package/src/plugins/builtin/power/pane.tsx +37 -9
  575. package/src/plugins/builtin/power/prices-client.ts +139 -0
  576. package/src/plugins/builtin/power/prices-headless.ts +137 -0
  577. package/src/plugins/builtin/power/prices-model.ts +103 -0
  578. package/src/plugins/builtin/power/prices.tsx +179 -0
  579. package/src/plugins/builtin/rate-path/headless.ts +46 -18
  580. package/src/plugins/builtin/realized-vol/headless.ts +5 -0
  581. package/src/plugins/builtin/relative-rotation/headless.ts +3 -3
  582. package/src/plugins/builtin/research/corporate-actions-pane.tsx +5 -2
  583. package/src/plugins/builtin/research/event-model.ts +68 -24
  584. package/src/plugins/builtin/research/events-headless.ts +2 -1
  585. package/src/plugins/builtin/research/headless.ts +2 -1
  586. package/src/plugins/builtin/research/index.tsx +2 -0
  587. package/src/plugins/builtin/research-search/article.ts +65 -0
  588. package/src/plugins/builtin/research-search/document-view.tsx +33 -215
  589. package/src/plugins/builtin/research-search/model.ts +0 -9
  590. package/src/plugins/builtin/research-search/pane.tsx +41 -30
  591. package/src/plugins/builtin/research-search/snippet.ts +0 -29
  592. package/src/plugins/builtin/revenue-breakdown/headless.ts +18 -6
  593. package/src/plugins/builtin/seasonality/client.ts +15 -7
  594. package/src/plugins/builtin/seasonality/headless.ts +36 -12
  595. package/src/plugins/builtin/seasonality/index.tsx +2 -2
  596. package/src/plugins/builtin/seasonality/model.ts +119 -0
  597. package/src/plugins/builtin/seasonality/pane.tsx +108 -37
  598. package/src/plugins/builtin/sec/headless.ts +25 -3
  599. package/src/plugins/builtin/sec/index.tsx +2 -1
  600. package/src/plugins/builtin/series-inventory.ts +93 -0
  601. package/src/plugins/builtin/shared/cloud-denied.ts +15 -0
  602. package/src/plugins/builtin/shared/cloud-upgrade.ts +1 -1
  603. package/src/plugins/builtin/shared/command-tab.ts +30 -12
  604. package/src/plugins/builtin/shared/earnings-report.ts +55 -0
  605. package/src/plugins/builtin/shared/fred-points.ts +20 -0
  606. package/src/plugins/builtin/shared/free-preview.ts +47 -0
  607. package/src/plugins/builtin/shared/fx-rate-freshness.ts +101 -0
  608. package/src/plugins/builtin/shared/open-description.ts +29 -0
  609. package/src/plugins/builtin/shared/report-freshness.ts +12 -1
  610. package/src/plugins/builtin/shared/series-warning.ts +5 -0
  611. package/src/plugins/builtin/shared/volatility/options.ts +4 -1
  612. package/src/plugins/builtin/short-interest/headless.ts +1 -0
  613. package/src/plugins/builtin/short-interest/index.tsx +2 -0
  614. package/src/plugins/builtin/short-interest/series.ts +36 -0
  615. package/src/plugins/builtin/short-interest/watch-headless.ts +3 -2
  616. package/src/plugins/builtin/short-interest/watch-model.ts +9 -5
  617. package/src/plugins/builtin/short-volume/headless.ts +2 -1
  618. package/src/plugins/builtin/short-volume/index.tsx +2 -0
  619. package/src/plugins/builtin/short-volume/series.ts +23 -0
  620. package/src/plugins/builtin/social-mentions/headless.ts +1 -1
  621. package/src/plugins/builtin/social-mentions/index.tsx +2 -0
  622. package/src/plugins/builtin/social-mentions/series.ts +23 -0
  623. package/src/plugins/builtin/supply-chain/graph-pane.tsx +3 -2
  624. package/src/plugins/builtin/supply-chain/headless.ts +43 -11
  625. package/src/plugins/builtin/supply-chain/model.ts +13 -0
  626. package/src/plugins/builtin/supply-chain/pane.tsx +8 -6
  627. package/src/plugins/builtin/themes/headless.ts +74 -10
  628. package/src/plugins/builtin/themes/model.ts +71 -4
  629. package/src/plugins/builtin/themes/pane.tsx +22 -5
  630. package/src/plugins/builtin/thirteenf/api.ts +1 -0
  631. package/src/plugins/builtin/thirteenf/data.ts +6 -4
  632. package/src/plugins/builtin/thirteenf/headless.ts +217 -36
  633. package/src/plugins/builtin/thirteenf/model.ts +39 -1
  634. package/src/plugins/builtin/thirteenf/overlap.ts +75 -0
  635. package/src/plugins/builtin/thirteenf/pane.tsx +10 -1
  636. package/src/plugins/builtin/thirteenf/report-notes.ts +103 -1
  637. package/src/plugins/builtin/thirteenf/types.ts +2 -0
  638. package/src/plugins/builtin/ticker-detail/data-panes/returns-history.ts +114 -0
  639. package/src/plugins/builtin/ticker-detail/data-panes/returns-model.ts +57 -2
  640. package/src/plugins/builtin/ticker-detail/data-panes/returns-pane.tsx +19 -55
  641. package/src/plugins/builtin/ticker-detail/headless-schema.ts +30 -0
  642. package/src/plugins/builtin/ticker-detail/headless.ts +86 -0
  643. package/src/plugins/builtin/ticker-detail/index.tsx +26 -11
  644. package/src/plugins/builtin/ticker-detail/overview/components.tsx +1 -1
  645. package/src/plugins/builtin/ticker-detail/overview/futures-contract.ts +31 -0
  646. package/src/plugins/builtin/ticker-detail/overview/model.ts +3 -3
  647. package/src/plugins/builtin/ticker-detail/overview/pane.tsx +2 -1
  648. package/src/plugins/builtin/ticker-detail/overview-tab.tsx +49 -5
  649. package/src/plugins/builtin/ticker-detail/quote-monitor/index.tsx +13 -3
  650. package/src/plugins/builtin/time-sales/headless.ts +2 -1
  651. package/src/plugins/builtin/time-sales/index.tsx +2 -1
  652. package/src/plugins/builtin/treasury-auctions/headless.ts +16 -2
  653. package/src/plugins/builtin/treasury-auctions/index.tsx +1 -0
  654. package/src/plugins/builtin/treasury-auctions/model.ts +8 -0
  655. package/src/plugins/builtin/vol-surface/evidence.ts +7 -1
  656. package/src/plugins/builtin/vol-surface/headless.ts +51 -17
  657. package/src/plugins/builtin/vol-surface/heat-grid.tsx +113 -0
  658. package/src/plugins/builtin/vol-surface/model.ts +39 -6
  659. package/src/plugins/builtin/vol-surface/pane.tsx +14 -13
  660. package/src/plugins/builtin/vol-surface/stored.ts +63 -3
  661. package/src/plugins/builtin/vol-surface/surface.tsx +30 -2
  662. package/src/plugins/builtin/volatility/index.tsx +2 -0
  663. package/src/plugins/builtin/volatility/series.ts +84 -0
  664. package/src/plugins/builtin/world-venue-map/basemap-layer.tsx +6 -5
  665. package/src/plugins/builtin/world-venue-map/basemap.ts +6 -3
  666. package/src/plugins/builtin/world-venue-map/geo-draw.tsx +2 -1
  667. package/src/plugins/builtin/world-venue-map/geo-series.ts +26 -1
  668. package/src/plugins/builtin/world-venue-map/geo-svg.tsx +6 -6
  669. package/src/plugins/builtin/world-venue-map/headless.ts +4 -1
  670. package/src/plugins/builtin/world-venue-map/index.ts +2 -1
  671. package/src/plugins/builtin/world-venue-map/layered-pane.tsx +24 -13
  672. package/src/plugins/builtin/world-venue-map/layers.ts +29 -0
  673. package/src/plugins/builtin/world-venue-map/map.tsx +144 -13
  674. package/src/plugins/builtin/world-venue-map/model.ts +56 -19
  675. package/src/plugins/builtin/world-venue-map/pane.tsx +5 -2
  676. package/src/plugins/builtin/yield-curve/chart.ts +2 -2
  677. package/src/plugins/builtin/yield-curve/curves.ts +21 -8
  678. package/src/plugins/builtin/yield-curve/headless.ts +71 -18
  679. package/src/plugins/builtin/yield-curve/index.tsx +4 -2
  680. package/src/plugins/builtin/yield-curve/series.ts +86 -0
  681. package/src/plugins/catalog-browser.ts +2 -1
  682. package/src/plugins/installer.ts +2 -2
  683. package/src/plugins/loader.ts +15 -0
  684. package/src/plugins/manager-node.ts +1 -1
  685. package/src/plugins/{builtin/plugin-marketplace → marketplace}/feed.ts +2 -2
  686. package/src/plugins/{builtin/plugin-marketplace → marketplace}/model.ts +6 -6
  687. package/src/plugins/{builtin/plugin-marketplace → marketplace}/store.ts +1 -1
  688. package/src/plugins/registry/host-actions.ts +11 -0
  689. package/src/plugins/registry/index.ts +89 -4
  690. package/src/portfolio/collection-name.ts +31 -0
  691. package/src/{plugins/builtin/portfolio-list → portfolio}/position-metrics.ts +6 -6
  692. package/src/portfolio/position-value.ts +40 -0
  693. package/src/portfolio/valuation-basis.ts +79 -0
  694. package/src/public/__snapshots__/public-api.test.ts.snap +7 -0
  695. package/src/public/time-series.ts +17 -0
  696. package/src/react/auto-refresh.ts +13 -3
  697. package/src/react/input.ts +33 -1
  698. package/src/react/key-repeat.ts +86 -0
  699. package/src/remote/app-host.tsx +20 -4
  700. package/src/remote/confirm-change.tsx +85 -0
  701. package/src/remote/controller-utils.ts +8 -1
  702. package/src/remote/controller.ts +144 -7
  703. package/src/remote/pane-screenshot.ts +47 -0
  704. package/src/remote/schema.ts +65 -2
  705. package/src/remote/types.ts +30 -0
  706. package/src/remote/watchlist.ts +306 -0
  707. package/src/renderers/browser/main.tsx +4 -3
  708. package/src/renderers/browser/research-entry.ts +4 -2
  709. package/src/renderers/cloudflare/worker.ts +1 -1
  710. package/src/renderers/dom/data-table/frozen-column.ts +3 -1
  711. package/src/renderers/dom/data-table/index.tsx +33 -6
  712. package/src/renderers/dom/data-table/row.tsx +30 -1
  713. package/src/renderers/dom/desktop/control-styles.ts +63 -1
  714. package/src/renderers/dom/desktop/controls.tsx +30 -23
  715. package/src/renderers/dom/desktop/dialog-actions.tsx +170 -0
  716. package/src/renderers/dom/desktop/icons.tsx +16 -0
  717. package/src/renderers/dom/dom-ui-host.tsx +3 -0
  718. package/src/renderers/dom/host/block-glyph-canvas.tsx +6 -3
  719. package/src/renderers/dom/host/box.tsx +8 -0
  720. package/src/renderers/dom/host/chart-surface.tsx +33 -2
  721. package/src/renderers/dom/host/live-frame.ts +6 -2
  722. package/src/renderers/dom/host/overflow-fade.ts +14 -1
  723. package/src/renderers/dom/host/scroll-box.tsx +32 -0
  724. package/src/renderers/dom/host/size-observer.ts +41 -0
  725. package/src/renderers/dom/host/sticky-scroll.ts +128 -0
  726. package/src/renderers/dom/host/style.ts +1 -1
  727. package/src/renderers/dom/host/surface-3d.tsx +19 -7
  728. package/src/renderers/dom/host/surface-fit.ts +406 -0
  729. package/src/renderers/dom/host/text.tsx +1 -1
  730. package/src/renderers/dom/input-host.tsx +1 -0
  731. package/src/renderers/dom/styles.css +102 -5
  732. package/src/renderers/electrobun/bun/application-menu/click.ts +18 -0
  733. package/src/renderers/electrobun/bun/index.ts +3 -2
  734. package/src/renderers/electrobun/shared/protocol.ts +1 -1
  735. package/src/renderers/electrobun/view/cli-pane-shot-entry.tsx +29 -2
  736. package/src/renderers/electrobun/view/cli-pane-shot-frame.tsx +63 -20
  737. package/src/renderers/electrobun/view/cli-pane-shot-health.ts +10 -26
  738. package/src/renderers/electrobun/view/main.tsx +5 -3
  739. package/src/renderers/electrobun/view/remote/asset-data-client.ts +2 -0
  740. package/src/renderers/opentui/chart-surface.tsx +1 -0
  741. package/src/renderers/opentui/frame-capture.ts +33 -0
  742. package/src/renderers/opentui/host.tsx +10 -13
  743. package/src/renderers/opentui/pane-image/glyphs-license.txt +107 -0
  744. package/src/renderers/opentui/pane-image/glyphs.json +1 -0
  745. package/src/renderers/opentui/pane-image/index.ts +107 -0
  746. package/src/renderers/opentui/pane-image/raster.ts +428 -0
  747. package/src/renderers/opentui/start.tsx +3 -3
  748. package/src/renderers/opentui/test-utils.tsx +3 -0
  749. package/src/renderers/opentui/ui-host.tsx +29 -1
  750. package/src/series/capability.ts +75 -0
  751. package/src/series/csv.ts +160 -0
  752. package/src/series/files.ts +107 -0
  753. package/src/series/registry.ts +198 -0
  754. package/src/series/resolve.ts +108 -0
  755. package/src/series/standalone.ts +48 -0
  756. package/src/series/types.ts +153 -0
  757. package/src/series/validate.ts +171 -0
  758. package/src/shares/chat.ts +34 -0
  759. package/src/shares/dialog.tsx +295 -0
  760. package/src/shares/flow.tsx +56 -0
  761. package/src/shares/live.ts +14 -22
  762. package/src/shares/pane-image.ts +152 -0
  763. package/src/shares/personal-pane.ts +64 -0
  764. package/src/shares/portable-layout.ts +4 -2
  765. package/src/shares/prepare.ts +20 -0
  766. package/src/sources/gloomberb-cloud/index.ts +109 -10
  767. package/src/sources/gloomberb-cloud/normalizers.ts +3 -0
  768. package/src/sources/gloomberb-cloud/perpetuals.ts +249 -0
  769. package/src/sources/history-result.ts +1 -0
  770. package/src/sources/history-retention.ts +11 -0
  771. package/src/sources/listing-symbols.ts +4 -1
  772. package/src/sources/listing-target.ts +4 -0
  773. package/src/sources/provider-router/batches.ts +4 -1
  774. package/src/sources/provider-router/cache.ts +4 -2
  775. package/src/sources/provider-router/cached-routes.ts +1 -1
  776. package/src/sources/provider-router/financial-routes.ts +1 -0
  777. package/src/sources/provider-router/financials.ts +13 -0
  778. package/src/sources/provider-router/history.ts +43 -25
  779. package/src/sources/provider-router/index.ts +14 -0
  780. package/src/sources/provider-router/search.ts +1 -0
  781. package/src/state/hooks/inline-tickers.ts +49 -11
  782. package/src/sync/core-contributors.ts +1 -0
  783. package/src/test-support/shell-pane-keys.tsx +1 -0
  784. package/src/theme/theme-context.tsx +15 -1
  785. package/src/tickers/company-name.ts +75 -0
  786. package/src/tickers/instrument-kind.ts +34 -1
  787. package/src/tickers/listing-name.ts +34 -0
  788. package/src/tickers/listing-venues.ts +132 -0
  789. package/src/tickers/open-target.ts +13 -4
  790. package/src/tickers/perpetual-listing.ts +151 -0
  791. package/src/tickers/prediction-listing.ts +26 -0
  792. package/src/tickers/search/index.ts +72 -11
  793. package/src/tickers/search/ranking.ts +98 -20
  794. package/src/tickers/search/types.ts +7 -1
  795. package/src/tickers/ticker-changes.ts +213 -0
  796. package/src/tickers/us-listing.ts +34 -0
  797. package/src/time-series/economic.ts +2 -6
  798. package/src/time-series/hooks.ts +9 -0
  799. package/src/time-series/ice-credit.ts +39 -0
  800. package/src/time-series/resolve.ts +211 -29
  801. package/src/time-series/studies.ts +1 -0
  802. package/src/time-series/types.ts +12 -2
  803. package/src/time-series/use-chart-resolution.ts +32 -0
  804. package/src/types/config.ts +10 -2
  805. package/src/types/data-provider.ts +11 -0
  806. package/src/types/financials.ts +62 -1
  807. package/src/types/headless.ts +113 -0
  808. package/src/types/instrument.ts +4 -0
  809. package/src/types/plugin.ts +52 -2
  810. package/src/types/price-history.ts +7 -0
  811. package/src/types/ticker-changes.ts +26 -0
  812. package/src/types/ticker.ts +14 -0
  813. package/src/ui/context-menu.tsx +13 -1
  814. package/src/ui/host.tsx +57 -3
  815. package/src/ui/live-resize.ts +91 -0
  816. package/src/ui/live-stretch.ts +153 -0
  817. package/src/ui/measured-cells.ts +58 -0
  818. package/src/ui/sticky-scroll.ts +7 -0
  819. package/src/utils/basis-points.ts +17 -0
  820. package/src/utils/central-banks.ts +76 -0
  821. package/src/utils/cli-output.ts +131 -15
  822. package/src/utils/concurrency.ts +25 -0
  823. package/src/utils/crypto-pair.ts +20 -0
  824. package/src/utils/currency-pair.ts +19 -0
  825. package/src/utils/currency-units.ts +11 -0
  826. package/src/utils/datetime-format.ts +27 -6
  827. package/src/utils/decimal-comma.ts +19 -0
  828. package/src/utils/dom-screenshot-css.ts +265 -0
  829. package/src/utils/dom-screenshot-rasters.ts +276 -0
  830. package/src/utils/dom-screenshot.ts +439 -52
  831. package/src/utils/double-escape-close.ts +15 -1
  832. package/src/utils/exchange-rate-snapshot.ts +6 -2
  833. package/src/utils/exchanges.ts +143 -1
  834. package/src/utils/format.ts +35 -5
  835. package/src/utils/forward-dividend.ts +14 -0
  836. package/src/utils/fundamentals.ts +66 -0
  837. package/src/utils/futures-generic.ts +6 -12
  838. package/src/utils/fx-market-hours.ts +15 -5
  839. package/src/utils/fx-status.ts +6 -1
  840. package/src/utils/inline-content-tokenizer.ts +22 -3
  841. package/src/utils/market-capitalization.ts +8 -0
  842. package/src/utils/one-shot.ts +73 -0
  843. package/src/utils/options.ts +37 -8
  844. package/src/utils/price-history.ts +99 -42
  845. package/src/utils/sec-eps-basis.ts +24 -11
  846. package/src/utils/sec.ts +61 -7
  847. package/src/utils/utc-time.ts +63 -4
  848. package/src/plugins/builtin/fx-matrix/freshness.ts +0 -65
  849. /package/src/plugins/{builtin/plugin-marketplace → marketplace}/activation.ts +0 -0
  850. /package/src/plugins/{builtin/plugin-marketplace → marketplace}/ids.ts +0 -0
  851. /package/src/plugins/{builtin/plugin-marketplace → marketplace}/packs.ts +0 -0
  852. /package/src/{plugins/builtin/cloud → tickers}/starter-symbols.ts +0 -0
@@ -3,6 +3,7 @@ import type {
3
3
  AuthUser,
4
4
  ChatMessage,
5
5
  ChatNotification,
6
+ ChatReactionsUpdate,
6
7
  CloudQuotePayload,
7
8
  QuoteStreamTarget,
8
9
  ScannerFeedEvent,
@@ -12,6 +13,7 @@ import type {
12
13
  import {
13
14
  normalizeChatMessage,
14
15
  normalizeChatNotification,
16
+ normalizeChatReactions,
15
17
  normalizeTeamNotification,
16
18
  } from "./normalizers";
17
19
  import { debugLog } from "../utils/debug-log";
@@ -41,6 +43,7 @@ const cloudApiLog = debugLog.createLogger("cloud-api");
41
43
  type ChannelListener = (message: ChatMessage) => void;
42
44
  type ChatNotificationListener = (notification: ChatNotification) => void;
43
45
  type ChatPresenceListener = (onlineCount: number) => void;
46
+ type ChatReactionsListener = (update: ChatReactionsUpdate) => void;
44
47
  type TeamNotificationListener = (notification: TeamNotification) => void;
45
48
  type CloudEventListener = (data: unknown) => void;
46
49
  type QuoteListener = (
@@ -106,6 +109,7 @@ export class CloudApiSocket {
106
109
  private readonly chatNotificationListeners =
107
110
  new Set<ChatNotificationListener>();
108
111
  private readonly chatPresenceListeners = new Set<ChatPresenceListener>();
112
+ private readonly chatReactionsListeners = new Set<ChatReactionsListener>();
109
113
  private readonly teamNotificationListeners =
110
114
  new Set<TeamNotificationListener>();
111
115
  private readonly cloudEventListeners = new Map<
@@ -245,6 +249,14 @@ export class CloudApiSocket {
245
249
  };
246
250
  }
247
251
 
252
+ /** A message's reactions changed in a channel this socket reads. */
253
+ subscribeChatReactions(listener: ChatReactionsListener): () => void {
254
+ this.chatReactionsListeners.add(listener);
255
+ return () => {
256
+ this.chatReactionsListeners.delete(listener);
257
+ };
258
+ }
259
+
248
260
  subscribeChatPresence(listener: ChatPresenceListener): () => void {
249
261
  this.chatPresenceListeners.add(listener);
250
262
  return () => {
@@ -500,6 +512,7 @@ export class CloudApiSocket {
500
512
  this.connectionListeners.clear();
501
513
  this.chatNotificationListeners.clear();
502
514
  this.chatPresenceListeners.clear();
515
+ this.chatReactionsListeners.clear();
503
516
  this.teamNotificationListeners.clear();
504
517
  this.cloudEventListeners.clear();
505
518
  this.quoteSubscriptions.clear();
@@ -575,6 +588,22 @@ export class CloudApiSocket {
575
588
  return;
576
589
  }
577
590
 
591
+ if (
592
+ parsed?.type === "chat.reactions" &&
593
+ typeof parsed.channelId === "string" &&
594
+ typeof parsed.data?.messageId === "string"
595
+ ) {
596
+ const update: ChatReactionsUpdate = {
597
+ channelId: parsed.channelId,
598
+ messageId: parsed.data.messageId,
599
+ reactions: normalizeChatReactions(parsed.data.reactions),
600
+ };
601
+ for (const listener of this.chatReactionsListeners) {
602
+ listener(update);
603
+ }
604
+ return;
605
+ }
606
+
578
607
  if (parsed?.type === "chat.notification" && parsed.data) {
579
608
  const notification = normalizeChatNotification(
580
609
  parsed.data as ChatNotification,
@@ -15,6 +15,12 @@ export interface ThemeSummary {
15
15
  worst: { symbol: string; changePercent: number } | null;
16
16
  stale: boolean;
17
17
  }
18
+ /**
19
+ * A member's figures. `price`, `changePercent` and the returns are the regular
20
+ * session's: outside it, its close and that close's move. The extended fields
21
+ * are the pre-market or after-hours print measured from that close; a server
22
+ * sends them only when there is one, and older servers never do.
23
+ */
18
24
  export interface ThemeMember extends Record<ThemePeriod | "price", number | null> {
19
25
  symbol: string;
20
26
  name: string | null;
@@ -22,7 +28,22 @@ export interface ThemeMember extends Record<ThemePeriod | "price", number | null
22
28
  present: boolean;
23
29
  asOf: Record<ThemePeriod | "price", string | null>;
24
30
  stale: boolean;
31
+ extendedSession?: "PRE" | "POST" | null;
32
+ extendedPrice?: number | null;
33
+ extendedChange?: number | null;
34
+ extendedChangePercent?: number | null;
35
+ }
36
+ interface SnapshotMetadata {
37
+ /** When the server put the snapshot together, not a trade time. */
38
+ asOf: string;
39
+ snapshotId: string;
40
+ stale: boolean;
41
+ /** The US market as the server's delayed board reads it. Absent from older servers. */
42
+ session?: "PRE" | "REGULAR" | "POST" | "CLOSED" | null;
43
+ /** Outside the regular session, the completed session every figure describes; null while one trades. */
44
+ regularSessionDate?: string | null;
45
+ /** When that session closed, in epoch milliseconds (13:00 New York on an early close). */
46
+ regularSessionClosedAt?: number | null;
25
47
  }
26
- interface SnapshotMetadata { asOf: string; snapshotId: string; stale: boolean }
27
48
  export interface ThemesPayload extends SnapshotMetadata { themes: ThemeSummary[] }
28
49
  export interface ThemeMembersPayload extends SnapshotMetadata { theme: ThemeSummary; members: ThemeMember[] }
@@ -49,6 +49,33 @@ export interface ChatAttachment {
49
49
  url: string;
50
50
  }
51
51
 
52
+ /** Someone who reacted, as a reaction lists the first few. */
53
+ export interface ChatReactionUser {
54
+ id: string;
55
+ username: string | null;
56
+ displayName: string;
57
+ accountType?: ChatAccountType | null;
58
+ }
59
+
60
+ /**
61
+ * One emoji on a message: how many reacted, whether you did, and the first
62
+ * few who did, oldest first. `emoji` is the character, or `:name:` for a
63
+ * custom Discord server emoji.
64
+ */
65
+ export interface ChatReaction {
66
+ emoji: string;
67
+ count: number;
68
+ me: boolean;
69
+ users?: ChatReactionUser[];
70
+ }
71
+
72
+ /** A message's reactions as they stand after a change, from the `chat.reactions` frame or a reaction request. */
73
+ export interface ChatReactionsUpdate {
74
+ channelId: string;
75
+ messageId: string;
76
+ reactions: ChatReaction[];
77
+ }
78
+
52
79
  export interface ChatMessage {
53
80
  id: string;
54
81
  channelId: string;
@@ -66,6 +93,12 @@ export interface ChatMessage {
66
93
  } | null;
67
94
  /** Images in display order. A server that predates them leaves this out. */
68
95
  attachments?: ChatAttachment[];
96
+ /**
97
+ * Emoji reactions in the order they first appeared. Message lists from a
98
+ * server that knows reactions always carry it; a live copy of a message
99
+ * (an edit) leaves it out, and the reactions held stay.
100
+ */
101
+ reactions?: ChatReaction[];
69
102
  /**
70
103
  * Only on the author's copy of a public message whose images are still being
71
104
  * checked ("pending") or could not be checked ("failed"). Nobody else has the
@@ -402,6 +435,10 @@ export interface CloudPricePointPayload {
402
435
  low?: number;
403
436
  close: number;
404
437
  volume?: number;
438
+ /** A coin's daily bar for the UTC day still forming when served; it has no volume yet. */
439
+ partial?: boolean;
440
+ /** A coin's daily bar whose prices were rebuilt from hourly bars; a day the source left empty has no volume. */
441
+ filled?: boolean;
405
442
  }
406
443
 
407
444
  type CloudEconImpact = "high" | "medium" | "low";
@@ -432,6 +469,13 @@ export interface CloudMacroReleaseDaysPayload {
432
469
  export interface CloudFredObservationPayload {
433
470
  date: string;
434
471
  value: number | null;
472
+ /**
473
+ * Who published a value FRED does not list yet, such as a Treasury yield
474
+ * Gloom Cloud read from the Treasury first. Absent on FRED's own values.
475
+ */
476
+ publisher?: string;
477
+ /** When that publisher's value was first read, ISO in UTC. */
478
+ publishedAt?: string;
435
479
  }
436
480
 
437
481
  export interface CloudFredSeriesInfoPayload {
@@ -538,6 +582,22 @@ export interface CloudCdsHistoryResponse {
538
582
  points: CloudCdsHistoryPointPayload[];
539
583
  }
540
584
 
585
+ /** An issuer's latest 5Y level: the last point of its history over the last month. */
586
+ export interface CloudCdsLevelPayload {
587
+ /** The reference entity as the history response names it. */
588
+ issuer: string;
589
+ spreadBp: number;
590
+ date: string;
591
+ }
592
+
593
+ export interface CloudCdsLevelsResponse {
594
+ source: string;
595
+ tenor: string;
596
+ asOf: string | null;
597
+ /** Every issuer traded in the last month whose 5Y line has a level in it. */
598
+ levels: CloudCdsLevelPayload[];
599
+ }
600
+
541
601
  interface CloudShortInterestPointPayload {
542
602
  settlementDate: string;
543
603
  shortPercentFloat?: number | null;
@@ -1098,7 +1158,7 @@ export interface CloudSearchResponse {
1098
1158
  tookMs: number;
1099
1159
  }
1100
1160
 
1101
- export interface CloudSearchDocumentChunk {
1161
+ interface CloudSearchDocumentChunk {
1102
1162
  id: string;
1103
1163
  chunkIndex: number;
1104
1164
  body: string;
@@ -1383,6 +1443,8 @@ export interface CloudMarketResponse<T> {
1383
1443
  historySession?: unknown;
1384
1444
  /** "extended" when the history includes the pre-market and after-hours bars asked for. */
1385
1445
  session?: unknown;
1446
+ /** "1day" when daily bars answer an intraday range: the listing has no intraday bars. */
1447
+ servedResolution?: unknown;
1386
1448
  /** Untrusted until the history adapter validates its boundary dates. */
1387
1449
  coverage?: CloudHistoryCoverage;
1388
1450
  providerMeta?: {
@@ -1427,13 +1489,27 @@ export interface CloudMarketBatchPayload<T> {
1427
1489
 
1428
1490
  export type CloudMarketScreenerCategory = "gainers" | "losers" | "most-active";
1429
1491
 
1430
- export interface CloudMarketScreenerItem {
1492
+ /**
1493
+ * A movers row's quote sessions, under the quote's field names and meaning:
1494
+ * the session it was read in, the day its change is dated to, the last
1495
+ * completed regular session's close and move, and an open pre-market or
1496
+ * after-hours print with its move from that close. Older servers send none.
1497
+ */
1498
+ export type CloudMoverSessionFields = Partial<Pick<Quote,
1499
+ | "marketState" | "changeSessionDate"
1500
+ | "regularClose" | "regularCloseSessionDate" | "regularChange" | "regularChangePercent"
1501
+ | "preMarketPrice" | "preMarketChange" | "preMarketChangePercent"
1502
+ | "postMarketPrice" | "postMarketChange" | "postMarketChangePercent">>;
1503
+
1504
+ /** price, change and changePercent are the live print the list is ranked by; the session fields say how it reads. */
1505
+ export interface CloudMarketScreenerItem extends CloudMoverSessionFields {
1431
1506
  rank: number;
1432
1507
  symbol: string;
1433
1508
  name: string;
1434
1509
  price: number;
1435
1510
  change: number;
1436
1511
  changePercent: number;
1512
+ previousClose?: number;
1437
1513
  volume: number;
1438
1514
  /** Available average volume for this listing, independent of public ranking membership. */
1439
1515
  avgVolume?: number;
@@ -36,6 +36,14 @@ export interface CloudCurveView {
36
36
  checkedAt: string | null;
37
37
  }
38
38
 
39
+ /** One tenor of a stored curve over time, oldest first (`GET /cloud/econ/curves/:curve/history`). */
40
+ export interface CloudCurveHistory {
41
+ curve: CloudCurveHeader;
42
+ tenor: string;
43
+ points: Array<{ date: string; value: number }>;
44
+ checkedAt: string | null;
45
+ }
46
+
39
47
  export interface CloudWorldCurves {
40
48
  curves: Array<{
41
49
  curve: CloudCurveHeader;
@@ -1,4 +1,4 @@
1
- import { useEffect, useRef, type Dispatch } from "react";
1
+ import { useEffect, useRef, useState, type Dispatch } from "react";
2
2
  import { useShortcut } from "../react/input";
3
3
  import { useNativeRenderer, useRendererHost, useUiHost } from "../ui";
4
4
  import { useDialogState } from "../ui/dialog";
@@ -13,6 +13,9 @@ import { getVisiblePaneCycleOrder } from "../components/layout/pane/cycle-order"
13
13
  import { requestFunctionHelp, useFunctionHelpHost } from "../plugins/builtin/help/function-card";
14
14
  import { buildRegistryHelpIndex, helpFunctionForPane } from "../plugins/builtin/help/function-index";
15
15
  import { recordFunctionOpen } from "../telemetry/usage-counts";
16
+ import { createOneShots } from "../utils/one-shot";
17
+ import { DOCS_PANE_TEMPLATE_ID } from "../docs/content";
18
+ import { registerPaneDocsHandler } from "../docs/requests";
16
19
  import { isMoveDownShortcut, isMoveUpShortcut } from "../components/command-bar/keyboard-handlers";
17
20
  import { pressStarPromptKey } from "./star-prompt/runtime";
18
21
  import {
@@ -115,11 +118,27 @@ export function useAppGlobalShortcuts({
115
118
  const uiKind = useUiHost().kind;
116
119
  const toastHost = useToastHost();
117
120
  useKeybindingIssueNotice(keybindings, pluginRegistry, state.initialized);
121
+ // Every action here runs once per press: a held key, or a terminal that does
122
+ // not say it is a repeat, must not run it again. Only moving focus between
123
+ // panes (Tab) and switching layouts by number (idempotent) are left to repeat.
124
+ const [shots] = useState(createOneShots);
118
125
  useFunctionHelpHost({
119
126
  closeCommandBar: () => {
120
127
  if (state.commandBarOpen) dispatch({ type: "SET_COMMAND_BAR", open: false });
121
128
  },
122
129
  });
130
+ const layoutRef = useRef(state.config.layout);
131
+ layoutRef.current = state.config.layout;
132
+ // A pane's `?`: its entry in DOCS, or its help card where no pane can open.
133
+ useEffect(() => registerPaneDocsHandler((paneId) => {
134
+ if (!isDetachedWindow) {
135
+ pluginRegistry.createPaneFromTemplate(DOCS_PANE_TEMPLATE_ID, { values: { pane: paneId } });
136
+ return;
137
+ }
138
+ const instance = findPaneInstance(layoutRef.current, paneId);
139
+ const fn = instance ? helpFunctionForPane(buildRegistryHelpIndex(pluginRegistry), pluginRegistry, instance) : null;
140
+ if (fn) requestFunctionHelp({ kind: "function", fn, inAppDocs: false });
141
+ }), [isDetachedWindow, pluginRegistry]);
123
142
 
124
143
  useShortcut((event) => {
125
144
  if (isCopyShortcut(event) && copyActiveSelection(nativeRenderer)) {
@@ -135,6 +154,23 @@ export function useAppGlobalShortcuts({
135
154
 
136
155
  const match = matchKeybinding(keybindings, event);
137
156
  const action = match?.kind === "action" ? match.id : null;
157
+ /**
158
+ * Whether the action already ran for this press or hold. An action that
159
+ * takes the key (`claims`) swallows the refused ones as well; one that
160
+ * leaves it to the pane (R) does not, so a pane's own key keeps working.
161
+ */
162
+ const ranAlready = (id: string, claims = true): boolean => {
163
+ const shot = shots.get(id);
164
+ if (shot.refuses(event)) {
165
+ if (claims) {
166
+ event.preventDefault();
167
+ event.stopPropagation();
168
+ }
169
+ return true;
170
+ }
171
+ shot.end();
172
+ return false;
173
+ };
138
174
 
139
175
  // Terminals send Ctrl; the browser and the desktop webview send Cmd on
140
176
  // macOS, which the OpenTUI host also reports as `super` under the kitty
@@ -158,6 +194,7 @@ export function useAppGlobalShortcuts({
158
194
  // The status bar's star line answers the same keys once no toast does,
159
195
  // but only over the workspace itself.
160
196
  if (action === "notification-action" || action === "notification-dismiss") {
197
+ if (ranAlready(action)) return;
161
198
  const toastHandled = action === "notification-action"
162
199
  ? toastHost.activateNewest?.() === true
163
200
  : toastHost.dismissNewest?.() === true;
@@ -181,12 +218,14 @@ export function useAppGlobalShortcuts({
181
218
  // Ctrl+P and Ctrl+N move the open bar's selection, so a bar chord that
182
219
  // is one of them only opens it; Esc and the bar's other chords close it.
183
220
  if (state.commandBarOpen && (isMoveUpShortcut(event) || isMoveDownShortcut(event))) return;
221
+ if (ranAlready(action)) return;
184
222
  event.preventDefault();
185
223
  event.stopPropagation();
186
224
  dispatch({ type: "TOGGLE_COMMAND_BAR" });
187
225
  return;
188
226
  }
189
227
  if (!isDetachedWindow && action === "ticker-search" && !state.commandBarOpen) {
228
+ if (ranAlready(action)) return;
190
229
  event.preventDefault();
191
230
  event.stopPropagation();
192
231
  dispatch({
@@ -219,6 +258,7 @@ export function useAppGlobalShortcuts({
219
258
  // Command and function keys are never text, so they still fire.
220
259
  const editing = state.inputCaptured || event.targetEditable === true;
221
260
  if (editing && event.ctrl && !(event.meta || event.super)) return;
261
+ if (ranAlready(`command:${match.command.query}`)) return;
222
262
  event.preventDefault();
223
263
  event.stopPropagation();
224
264
  dispatch({
@@ -232,12 +272,13 @@ export function useAppGlobalShortcuts({
232
272
 
233
273
  // A function key is never text, so the card opens from a focused field too.
234
274
  if (action === "function-help") {
275
+ if (ranAlready(action)) return;
235
276
  event.preventDefault();
236
277
  event.stopPropagation();
237
278
  recordFunctionOpen({ shortcut: "HELP", externalPluginId: null });
238
279
  const instance = state.focusedPaneId ? findPaneInstance(state.config.layout, state.focusedPaneId) : undefined;
239
280
  const fn = instance ? helpFunctionForPane(buildRegistryHelpIndex(pluginRegistry), pluginRegistry, instance) : null;
240
- if (fn && requestFunctionHelp({ kind: "function", fn })) return;
281
+ if (fn && requestFunctionHelp({ kind: "function", fn, inAppDocs: !isDetachedWindow })) return;
241
282
  if (!isDetachedWindow) pluginRegistry.showPane("help");
242
283
  return;
243
284
  }
@@ -245,6 +286,7 @@ export function useAppGlobalShortcuts({
245
286
  if (state.inputCaptured) return;
246
287
 
247
288
  if (!isDetachedWindow && action === "help") {
289
+ if (ranAlready(action)) return;
248
290
  event.preventDefault();
249
291
  event.stopPropagation();
250
292
  pluginRegistry.showPane("help");
@@ -252,13 +294,16 @@ export function useAppGlobalShortcuts({
252
294
  }
253
295
 
254
296
  if (!isDetachedWindow && action === "quit") {
297
+ if (ranAlready(action, false)) return;
255
298
  if (uiKind === "opentui") rendererHost.requestExit();
256
299
  } else if (action === "refresh-ticker") {
300
+ if (ranAlready(action, false)) return;
257
301
  if (focusedTickerSymbol) {
258
302
  const ticker = state.tickers.get(focusedTickerSymbol);
259
303
  if (ticker) refreshTicker(ticker.metadata.ticker, ticker.metadata.exchange, ticker, 0);
260
304
  }
261
305
  } else if (action === "refresh-all") {
306
+ if (ranAlready(action, false)) return;
262
307
  for (const ticker of state.tickers.values()) {
263
308
  refreshTicker(ticker.metadata.ticker, ticker.metadata.exchange, ticker, 1);
264
309
  }
@@ -266,10 +311,12 @@ export function useAppGlobalShortcuts({
266
311
  // A release that can install itself downloads on its own, so the key is
267
312
  // for the one that waits for a restart and for the one that failed.
268
313
  if (!isDetachedWindow && canRestartToApply(state.updateProgress)) {
314
+ if (ranAlready(action)) return;
269
315
  event.preventDefault();
270
316
  event.stopPropagation();
271
317
  restartToApplyUpdate();
272
318
  } else if (canRetryUpdate(state)) {
319
+ if (ranAlready(action)) return;
273
320
  event.preventDefault();
274
321
  event.stopPropagation();
275
322
  startUpdate(state.updateAvailable!);
@@ -282,6 +329,7 @@ export function useAppGlobalShortcuts({
282
329
  if (ownerId && disabledPlugins.has(ownerId)) continue;
283
330
  const chords = resolvePluginShortcutChords(keybindingsConfig, shortcut);
284
331
  if (chords.some((chord) => matchesKeyChord(chord, event))) {
332
+ if (ranAlready(`plugin:${shortcut.id}`, false)) return;
285
333
  shortcut.execute();
286
334
  break;
287
335
  }
@@ -28,6 +28,7 @@ export type CoreKeybindingActionId =
28
28
  | "pane-screenshot"
29
29
  | "pane-export-csv"
30
30
  | "pane-share"
31
+ | "pane-ask"
31
32
  | "layout-gallery"
32
33
  | "tidy-windows"
33
34
  | "window-move-mode"
@@ -59,6 +60,7 @@ export const PANE_ACTION_IDS = new Set<CoreKeybindingActionId>([
59
60
  "pane-screenshot",
60
61
  "pane-export-csv",
61
62
  "pane-share",
63
+ "pane-ask",
62
64
  "layout-gallery",
63
65
  "tidy-windows",
64
66
  "window-move-mode",
@@ -225,9 +227,18 @@ export const KEYBINDING_ACTIONS: readonly KeybindingActionDef[] = [
225
227
  {
226
228
  id: "pane-share",
227
229
  category: "Pane Management",
228
- description: "Share the focused pane.",
230
+ description: "Share the focused pane: post a picture to chat or copy its link.",
229
231
  defaults: ["CmdOrCtrl+Shift+S"],
230
232
  },
233
+ {
234
+ id: "pane-ask",
235
+ category: "Pane Management",
236
+ description: "Ask Gloom about the focused pane, in a new conversation with the pane attached.",
237
+ // A for ask. Alt+A first, because it reaches most terminals, where
238
+ // Ctrl+Shift+A is often the terminal's own select all; the desktop app
239
+ // advertises the chord on its platform modifier.
240
+ defaults: ["Alt+A", "CmdOrCtrl+Shift+A"],
241
+ },
231
242
  {
232
243
  id: "layout-gallery",
233
244
  category: "Pane Management",
@@ -16,8 +16,8 @@ import {
16
16
  } from "../../components/layout/shell/visible-layout";
17
17
  import { applyPluginToggles } from "../../plugins/ownership";
18
18
  import { setLayoutManagerDispatch } from "../../plugins/builtin/layout-manager";
19
- import { setMarketplaceHost } from "../../plugins/builtin/plugin-marketplace/store";
20
- import type { InstalledPlugin } from "../../plugins/builtin/plugin-marketplace/model";
19
+ import { setMarketplaceHost } from "../../plugins/marketplace/store";
20
+ import type { InstalledPlugin } from "../../plugins/marketplace/model";
21
21
  import {
22
22
  listExternalPlugins,
23
23
  removeExternalPlugin,
@@ -111,11 +111,11 @@ export function useAppTickerOpenRuntime({
111
111
  return true;
112
112
  }, [pluginRegistry, stateRef]);
113
113
 
114
- const placePinnedTickerTarget = useCallback((target: TickerOpenTarget, options?: PinTickerOptions) => {
114
+ const placePinnedTickerTarget = useCallback((target: TickerOpenTarget, options?: PinTickerOptions, typed?: string) => {
115
115
  const paneType = normalizePaneId(options?.paneType ?? TICKER_RESEARCH_PANE_ID);
116
116
  const paneDef = pluginRegistry.panes.get(paneType);
117
117
  if (!paneDef) return;
118
- if (refuseWhileOwnerOff(target.symbol, options, () => placePinnedTickerTarget(target, options))) return;
118
+ if (refuseWhileOwnerOff(target.symbol, options, () => placePinnedTickerTarget(target, options, typed))) return;
119
119
 
120
120
  publishTickerOpenTarget(target);
121
121
  const symbol = target.symbol;
@@ -128,8 +128,18 @@ export function useAppTickerOpenRuntime({
128
128
  let existing = options?.forceNewPane
129
129
  ? null
130
130
  : findFixedTickerPaneForSymbol(currentLayout, paneType, symbol, instrument);
131
- if (!options?.forceNewPane && !existing && instrument === null && !target.ticker.metadata.broker_contracts?.length) {
132
- existing = findFixedTickerPaneForSymbol(currentLayout, paneType, symbol);
131
+ // A pane bound to the key as typed (the web terminal's first pane for ?ticker=7203:TSE) is the one the
132
+ // resolved listing (7203:JPX) settles.
133
+ const typedKey = typed?.trim().toUpperCase();
134
+ if (!options?.forceNewPane && !existing && typedKey && typedKey !== symbol) {
135
+ existing = findFixedTickerPaneForSymbol(currentLayout, paneType, typedKey, instrument);
136
+ }
137
+ // Without a broker route, the public listing and an unnamed route are the same security: a link that names
138
+ // neither still finds the DES the command bar opened on the public listing, and leaves its binding as it is.
139
+ let keepBinding = false;
140
+ if (!options?.forceNewPane && !existing && !instrument && !target.ticker.metadata.broker_contracts?.length) {
141
+ existing = findFixedTickerPaneForSymbol(currentLayout, paneType, symbol, instrument === null ? undefined : null);
142
+ keepBinding = !!existing && instrument === undefined;
133
143
  }
134
144
  if (!options?.forceNewPane && !existing && !instrument && (parsePublicTickerKey(symbol).exchange || tickerHasListingSuffix(symbol))) {
135
145
  existing = currentLayout.instances.find((instance) => {
@@ -145,7 +155,7 @@ export function useAppTickerOpenRuntime({
145
155
  // verified same listing, retaining its pane identity and its followers.
146
156
  const previousSymbol = existing.binding?.kind === "fixed" ? existing.binding.symbol : null;
147
157
  let nextLayout = currentLayout;
148
- if (previousSymbol && (previousSymbol !== symbol || JSON.stringify(existing.binding) !== JSON.stringify(binding))) {
158
+ if (previousSymbol && (previousSymbol !== symbol || (!keepBinding && JSON.stringify(existing.binding) !== JSON.stringify(binding)))) {
149
159
  const existingId = existing.instanceId;
150
160
  nextLayout = { ...currentLayout, instances: currentLayout.instances.map((instance) => (
151
161
  instance.instanceId === existingId ? {
@@ -209,7 +219,7 @@ export function useAppTickerOpenRuntime({
209
219
  ? { symbol: selectedTicker.metadata.ticker, ticker: selectedTicker, created: false, instrument: options?.instrument, listing: options?.listing }
210
220
  : await resolveOpenTickerTarget(rawSymbol, options?.instrument === null);
211
221
  if (!target) return;
212
- placePinnedTickerTarget(target, options);
222
+ placePinnedTickerTarget(target, options, rawSymbol);
213
223
  const action = attentionActionForPane(options?.paneType ?? TICKER_RESEARCH_PANE_ID);
214
224
  if (action && pluginRegistry.panes.has(options?.paneType ?? TICKER_RESEARCH_PANE_ID)) {
215
225
  recordAttention(publicTickerKey(target.symbol, target.listing?.exchange ?? target.ticker.metadata.exchange), action);
@@ -17,6 +17,7 @@ import { getShare } from "../../shares/api";
17
17
  import { openPaneShare } from "../../shares/pane";
18
18
  import { PluginOffError, notifyPluginOff } from "../../plugins/plugin-off";
19
19
  import { materializeMarketplaceLayout } from "../../shares/portable-layout";
20
+ import { settleTypedListingKey } from "../../tickers/listing-venues";
20
21
 
21
22
  type CloudDeepLinkRoute = {
22
23
  kind: "cloud-alerts" | "cloud-emails" | "cloud-roundup" | "cloud-success" | "cloud-teams";
@@ -475,11 +476,15 @@ function handleOpenNews(
475
476
  notifyError(pluginRegistry, "Ticker news is unavailable.");
476
477
  return;
477
478
  }
478
- void pluginRegistry.createPaneFromTemplateAsync("ticker-news-pane", { symbol: action.symbol }).then(() => {
479
- notifySuccess(pluginRegistry, action.message);
480
- }).catch((error) => {
481
- notifyError(pluginRegistry, error instanceof Error ? error.message : "Failed to open ticker news.");
482
- });
479
+ // A link's 7203:TSE is the venue its symbol trades on; ticker and alert links settle it where they open.
480
+ void settleTypedListingKey(action.symbol, { store: pluginRegistry.tickerRepository, dataProvider: pluginRegistry.marketData })
481
+ .then((symbol) => pluginRegistry.createPaneFromTemplateAsync("ticker-news-pane", { symbol: symbol.toUpperCase() }))
482
+ .then(() => {
483
+ notifySuccess(pluginRegistry, action.message);
484
+ })
485
+ .catch((error) => {
486
+ notifyError(pluginRegistry, error instanceof Error ? error.message : "Failed to open ticker news.");
487
+ });
483
488
  return;
484
489
  }
485
490
 
@@ -6,7 +6,7 @@ import type { MarketDataCoordinator } from "../../market-data/coordinator";
6
6
  import { instrumentFromTicker, type InstrumentRef } from "../../market-data/request-types";
7
7
  import { useSavedLayoutWarmup } from "./layout-warmup";
8
8
  import { chatController } from "../../plugins/builtin/chat/controller";
9
- import { PLUGIN_MARKETPLACE_PANE_ID } from "../../plugins/builtin/plugin-marketplace/ids";
9
+ import { PLUGIN_MARKETPLACE_PANE_ID } from "../../plugins/marketplace/ids";
10
10
  import type { LoadedExternalPlugin } from "../../plugins/loader";
11
11
  import type { PluginRegistry } from "../../plugins/registry";
12
12
  import type {
package/src/app.tsx CHANGED
@@ -38,6 +38,7 @@ import type { LayoutBounds } from "./layout/pane-manager";
38
38
  import type { AppSessionSnapshot } from "./core/state/session-persistence";
39
39
  import type { MarketDataCoordinator } from "./market-data/coordinator";
40
40
  import { createAppNotifier } from "./notifications/app-notifier";
41
+ import { attachNotificationLog } from "./notifications/notification-log";
41
42
  import { useBrokerImportRuntime } from "./app/runtime/broker-import";
42
43
  import { useDesktopDeepLinkRuntime } from "./app/runtime/desktop-deeplink";
43
44
  import { useDesktopApplicationMenuRuntime } from "./app/runtime/desktop-menu";
@@ -374,6 +375,11 @@ function AppInner({
374
375
 
375
376
  // Wire up app-level notifications.
376
377
  pluginRegistry.bindHost({ notify: appNotifier.notify });
378
+ // Missed alerts live in this device's state store. A detached window keeps
379
+ // its own in memory rather than overwrite the main window's.
380
+ useEffect(() => (
381
+ isDetachedWindow ? undefined : attachNotificationLog(pluginRegistry.persistence.pluginState)
382
+ ), [isDetachedWindow, pluginRegistry]);
377
383
 
378
384
  // Persist layout changes (switching, saving, deleting, renaming layouts).
379
385
  // The saved layouts also mirror live pane state and focus, so they change on