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
@@ -2,16 +2,15 @@
2
2
  "src/api-client/askg.ts": ["cloud"],
3
3
  "src/app.tsx": ["cloud"],
4
4
  "src/app/global-shortcuts.ts": ["help"],
5
- "src/app/pane-runtime/plugin-bindings.ts": ["broker-manager","layout-manager","plugin-marketplace"],
5
+ "src/app/pane-runtime/plugin-bindings.ts": ["broker-manager","layout-manager"],
6
6
  "src/app/runtime/broker-import.ts": ["portfolio-list"],
7
7
  "src/app/runtime/desktop-deeplink.ts": ["account-management","chat","cloud"],
8
- "src/app/runtime/startup.ts": ["chat","plugin-marketplace"],
9
- "src/brokers/signed-in/sign-in-dialog.tsx": ["cloud"],
10
- "src/cli/commands/market.ts": ["holders","research","sec"],
8
+ "src/app/runtime/startup.ts": ["chat"],
9
+ "src/cli/commands/market.ts": ["holders","insider","research","sec"],
11
10
  "src/cli/commands/options-chain.ts": ["options","options-calculator"],
12
11
  "src/cli/commands/options-leaps.ts": ["options","vol-surface"],
13
12
  "src/cli/commands/overview.ts": ["correlation","econ","market-movers","sectors","world-indices"],
14
- "src/cli/commands/ticker.ts": ["notes","portfolio-list"],
13
+ "src/cli/commands/ticker.ts": ["notes"],
15
14
  "src/cli/desktop-pane-shot.ts": ["market-valuation","time-sales"],
16
15
  "src/cli/pane-functions/data.ts": ["chart-composer","correlation","seasonality","ticker-detail"],
17
16
  "src/cli/pane-functions/financial-ratio-shot.ts": ["ticker-detail"],
@@ -24,7 +23,6 @@
24
23
  "src/components/command-bar/commands/direct/index.ts": ["broker-manager","portfolio-list"],
25
24
  "src/components/command-bar/routes/root/command-items.ts": ["portfolio-list"],
26
25
  "src/components/command-bar/routes/root/help-items.ts": ["help"],
27
- "src/components/command-bar/routes/root/plugin-install.ts": ["plugin-marketplace"],
28
26
  "src/components/command-bar/routes/root/shortcut-items.ts": ["portfolio-list"],
29
27
  "src/components/command-bar/workflow/builtin.ts": ["cloud","portfolio-list"],
30
28
  "src/components/command-bar/workflow/collection-actions.ts": ["cloud","portfolio-list"],
@@ -33,38 +31,22 @@
33
31
  "src/components/feedback-dialog.tsx": ["cloud"],
34
32
  "src/components/form-modal/routes.ts": ["portfolio-list"],
35
33
  "src/components/index.ts": ["portfolio-list"],
36
- "src/components/layout/missing-pane.tsx": ["plugin-marketplace"],
37
34
  "src/components/layout/shell/index.tsx": ["cloud"],
38
35
  "src/components/layout/status-bar-groups.ts": ["cloud"],
39
36
  "src/components/layout/status-bar.tsx": ["cloud"],
40
- "src/components/onboarding/account-step/form-panel.tsx": ["cloud"],
41
- "src/components/onboarding/account-step/index.tsx": ["cloud"],
42
- "src/components/onboarding/account-step/qr-panel.tsx": ["cloud"],
43
- "src/components/onboarding/account-step/signed-in-panel.tsx": ["cloud"],
44
- "src/components/onboarding/onboarding-keyboard.ts": ["account-management"],
45
- "src/components/onboarding/onboarding-wizard.tsx": ["account-management","cloud"],
46
- "src/components/onboarding/use-onboarding-upgrade.ts": ["account-management","chat","cloud"],
47
- "src/components/onboarding/wizard-account.ts": ["cloud"],
37
+ "src/components/onboarding/use-onboarding-upgrade.ts": ["chat"],
48
38
  "src/components/onboarding/wizard-model.ts": ["portfolio-list"],
49
39
  "src/components/onboarding/wizard-positions.ts": ["portfolio-list"],
50
- "src/components/sign-in-gate.tsx": ["cloud"],
51
- "src/layout-marketplace/gallery.tsx": ["cloud","plugin-marketplace"],
40
+ "src/layout-marketplace/gallery.tsx": ["cloud"],
52
41
  "src/layout-marketplace/linked-sync.ts": ["cloud"],
53
42
  "src/layout/desks.ts": ["chart-composer"],
54
- "src/plugins/auto-update-node.ts": ["plugin-marketplace"],
55
- "src/plugins/auto-update.ts": ["plugin-marketplace"],
56
- "src/plugins/catalog-browser.ts": ["alerts","analytics","attention","awards","backtest","bond-calculator","catalysts","cds","central-bank-rates","changelog","chart-composer","clinical-trials","cloud","comment-letters","company-attention","company-kpis","connections","correlation","cot","cpi","credit-boards","credit-conditions","credit-documents","crypto-board","debt-maturities","dividend-yield","doe","earnings-calls","earnings-ripple","econ","econ-statistics","equity-screener","estimate-revisions","executives","exposure","fear-greed","filing-events","futures","futures-curve","fx-matrix","gpu","help","insider","ipo-calendar","iv-history","jobs","kelly-sizer","layout-manager","macro-day","market-halts","market-heatmap","market-valuation","members","mna","money-markets","news","openfda","options","options-calculator","options-positioning","options-scenario","pe-band","perps","portfolio-list","power","rate-path","realized-vol","relative-rotation","research","research-search","revenue-breakdown","reverse-dcf","risk-factors","scanner","seasonality","sec","sectors","short-interest","short-volume","social-mentions","supply-chain","ticker-detail","time-sales","treasury-auctions","vol-surface","volatility","world-indices","world-venue-map","yield-curve"],
43
+ "src/plugins/catalog-browser.ts": ["alerts","analytics","attention","awards","backtest","bond-calculator","catalysts","cds","central-bank-rates","changelog","chart-composer","clinical-trials","cloud","comment-letters","company-attention","company-kpis","connections","correlation","cot","cpi","credit-boards","credit-conditions","credit-documents","crypto-board","debt-maturities","dividend-yield","docs","doe","earnings-calls","earnings-ripple","econ","econ-statistics","equity-screener","estimate-revisions","executives","exposure","fear-greed","filing-events","futures","futures-curve","fx-matrix","gpu","help","insider","ipo-calendar","iv-history","jobs","kelly-sizer","layout-manager","macro-day","market-halts","market-heatmap","market-valuation","members","mna","money-markets","news","openfda","options","options-calculator","options-positioning","options-scenario","pe-band","perps","portfolio-list","power","rate-path","realized-vol","relative-rotation","research","research-search","revenue-breakdown","reverse-dcf","risk-factors","scanner","seasonality","sec","sectors","short-interest","short-volume","social-mentions","supply-chain","ticker-detail","time-sales","treasury-auctions","vol-surface","volatility","world-indices","world-venue-map","yield-curve"],
57
44
  "src/plugins/catalog-ui.ts": ["alerts","clinical-trials","cloud","comment-letters","custom-view","fear-greed","ipo-calendar","market-halts","market-heatmap","members","news","notes","openfda","research-search"],
58
45
  "src/plugins/catalog.ts": ["debug"],
59
- "src/plugins/installer.ts": ["plugin-marketplace"],
60
- "src/plugins/manager-node.ts": ["plugin-marketplace"],
61
46
  "src/remote/controller.ts": ["custom-view"],
62
- "src/renderers/browser/main.tsx": ["plugin-marketplace"],
63
47
  "src/renderers/electrobun/bun/core-capabilities.ts": ["notes"],
64
- "src/renderers/electrobun/shared/protocol.ts": ["plugin-marketplace"],
65
48
  "src/renderers/electrobun/view/cli-pane-shot-entry.tsx": ["econ-statistics","market-valuation","time-sales"],
66
- "src/renderers/electrobun/view/main.tsx": ["notes","plugin-marketplace"],
49
+ "src/renderers/electrobun/view/main.tsx": ["notes"],
67
50
  "src/renderers/electrobun/view/remote/connection-health.ts": ["connections"],
68
- "src/renderers/opentui/start.tsx": ["plugin-marketplace"],
69
51
  "src/sync/core-contributors.ts": ["analytics","portfolio-list"]
70
52
  }
@@ -0,0 +1,114 @@
1
+ import type { PluginRegistry } from "../plugins/registry";
2
+ import { paneShowsPersonalData } from "../shares/personal-pane";
3
+ import type { AppConfig, PaneInstanceConfig } from "../types/config";
4
+ import type { PaneSharePrivateFields } from "../types/plugin";
5
+ import type { TickerRecord } from "../types/ticker";
6
+ import type { AskGloomPaneAttachment } from "./pane-request";
7
+
8
+ /** A handful of the pane's own settings is enough to say how it is set up. */
9
+ const MAX_ARGS = 8;
10
+ const MAX_ARG_KEY_LENGTH = 32;
11
+ const MAX_ARG_VALUE_LENGTH = 48;
12
+ /** Layout and view bookkeeping, not what the pane shows. */
13
+ const BOOKKEEPING_KEYS = [
14
+ /scroll|width|height|offset|index|expanded|collapsed|focus|hover|sidebar|column|sort|order|version|draft/i,
15
+ // The cursor's position, but not the symbol it is on.
16
+ /^cursor(?!Symbol)/,
17
+ // Timestamps such as `updatedAt`.
18
+ /[a-z]At$/,
19
+ ];
20
+
21
+ type ArgSource = Readonly<Record<string, unknown>> | undefined;
22
+
23
+ function isPrivate(fields: PaneSharePrivateFields | undefined, key: string): boolean {
24
+ return fields === true || (Array.isArray(fields) && fields.includes(key));
25
+ }
26
+
27
+ function scalarArgs(source: ArgSource, privateFields: PaneSharePrivateFields | undefined): Array<[string, string]> {
28
+ if (!source || privateFields === true) return [];
29
+ return Object.entries(source).flatMap(([key, value]): Array<[string, string]> => {
30
+ if (key.length > MAX_ARG_KEY_LENGTH || BOOKKEEPING_KEYS.some((pattern) => pattern.test(key)) || isPrivate(privateFields, key)) return [];
31
+ if (typeof value === "number" && Number.isFinite(value)) return [[key, String(value)]];
32
+ if (typeof value !== "string") return [];
33
+ const trimmed = value.trim();
34
+ return trimmed && trimmed.length <= MAX_ARG_VALUE_LENGTH ? [[key, trimmed]] : [];
35
+ });
36
+ }
37
+
38
+ /**
39
+ * The function code a pane is opened by: the one its title starts with when
40
+ * that opens this pane (a chart opened with `GP` stays `GP`), else the first
41
+ * template that opens it.
42
+ */
43
+ function functionCode(registry: Pick<PluginRegistry, "paneTemplates">, paneType: string, title: string): string | null {
44
+ const prefixes = [...registry.paneTemplates.values()]
45
+ .filter((template) => template.paneId === paneType && template.shortcut?.prefix)
46
+ .map((template) => template.shortcut!.prefix.toUpperCase());
47
+ const token = title.trim().split(/\s+/)[0]?.toUpperCase() ?? "";
48
+ if (token && prefixes.includes(token)) return token;
49
+ return prefixes[0] ?? null;
50
+ }
51
+
52
+ export interface PaneAttachmentSource {
53
+ registry: Pick<PluginRegistry, "panes" | "paneTemplates" | "brokers" | "getPanePluginId" | "getBrokerPluginId">;
54
+ instance: PaneInstanceConfig;
55
+ /** What the header calls it. */
56
+ title: string;
57
+ symbol: string | null;
58
+ paneState?: Readonly<Record<string, unknown>>;
59
+ config: Pick<AppConfig, "portfolios" | "brokerInstances">;
60
+ tickers?: ReadonlyMap<string, TickerRecord>;
61
+ /** The tab each of its tab strips has open, outermost first. */
62
+ activeTabs?: readonly string[];
63
+ visibleText: string | null;
64
+ }
65
+
66
+ /**
67
+ * What Ask Gloom is told about a pane: its function and arguments as the
68
+ * user set them, and its text as drawn. Fields the pane keeps to itself when
69
+ * shared (`portableShare.private`) stay out of its arguments.
70
+ */
71
+ export function buildAskGloomPaneAttachment({
72
+ registry,
73
+ instance,
74
+ title,
75
+ symbol,
76
+ paneState,
77
+ config,
78
+ tickers,
79
+ activeTabs = [],
80
+ visibleText,
81
+ }: PaneAttachmentSource): AskGloomPaneAttachment {
82
+ const privateFields = registry.panes.get(instance.paneId)?.portableShare?.private;
83
+ const args: Record<string, string> = {};
84
+ const tabs = activeTabs.map((tab) => tab.trim()).filter(Boolean);
85
+ if (tabs.length > 0) args.tab = tabs.join(" > ").slice(0, MAX_ARG_VALUE_LENGTH);
86
+ for (const [key, value] of [
87
+ ...scalarArgs(instance.params, privateFields?.params),
88
+ ...scalarArgs(instance.settings, privateFields?.settings),
89
+ ...scalarArgs(paneState, privateFields?.state),
90
+ ]) {
91
+ if (Object.keys(args).length >= MAX_ARGS) break;
92
+ if (key in args || value === symbol) continue;
93
+ args[key] = value;
94
+ }
95
+ return {
96
+ paneId: instance.instanceId,
97
+ paneType: instance.paneId,
98
+ title,
99
+ code: functionCode(registry, instance.paneId, title),
100
+ symbol,
101
+ args,
102
+ visibleText,
103
+ personal: showsPersonalData({ registry, instance, paneState, symbol, config, tickers }),
104
+ };
105
+ }
106
+
107
+ /** A pane that cannot be read for it counts as personal: its contents then wait for a yes. */
108
+ function showsPersonalData(source: Parameters<typeof paneShowsPersonalData>[0]): boolean {
109
+ try {
110
+ return paneShowsPersonalData(source);
111
+ } catch {
112
+ return true;
113
+ }
114
+ }
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Asking Ask Gloom about a pane. Every pane offers it the same way, with no
3
+ * code of its own: the button beside the `?` in a desktop pane header, Ask
4
+ * Gloom in the pane menu, and the pane-ask key. The shell describes the pane
5
+ * here, and Ask Gloom, while its plugin is on, opens a new conversation with
6
+ * the pane attached.
7
+ */
8
+
9
+ /** A pane as Ask Gloom receives it: what it is and what it showed when asked. */
10
+ export interface AskGloomPaneAttachment {
11
+ /** The pane instance. */
12
+ paneId: string;
13
+ /** Its pane type. */
14
+ paneType: string;
15
+ /** What its header calls it, such as `DES AAPL`. */
16
+ title: string;
17
+ /** The function code that opens it, such as `DES`, when one does. */
18
+ code: string | null;
19
+ /** The ticker it shows, when it shows one. */
20
+ symbol: string | null;
21
+ /** How it is set up as the user sees it: its tab, range or view. Short values only. */
22
+ args: Readonly<Record<string, string>>;
23
+ /** Its text as drawn when asked, bounded; null when none could be read. */
24
+ visibleText: string | null;
25
+ /**
26
+ * It shows holdings, balances or account data, so Ask Gloom asks before
27
+ * anything it shows leaves the device.
28
+ */
29
+ personal: boolean;
30
+ }
31
+
32
+ type AskGloomPaneHandler = (attachment: AskGloomPaneAttachment) => void;
33
+
34
+ const handlers = new Set<AskGloomPaneHandler>();
35
+ const listeners = new Set<() => void>();
36
+
37
+ function changed(): void {
38
+ for (const listener of [...listeners]) listener();
39
+ }
40
+
41
+ /**
42
+ * Ask Gloom takes pane questions while it is registered. The shell offers the
43
+ * button, the menu entry and the key only then, so a profile with the cloud
44
+ * plugin off shows none of them.
45
+ */
46
+ export function registerAskGloomPaneHandler(handler: AskGloomPaneHandler): () => void {
47
+ handlers.add(handler);
48
+ changed();
49
+ return () => {
50
+ if (handlers.delete(handler)) changed();
51
+ };
52
+ }
53
+
54
+ export function canAskGloomAboutPanes(): boolean {
55
+ return handlers.size > 0;
56
+ }
57
+
58
+ export function subscribeAskGloomAboutPanes(listener: () => void): () => void {
59
+ listeners.add(listener);
60
+ return () => {
61
+ listeners.delete(listener);
62
+ };
63
+ }
64
+
65
+ /** Hands the pane to Ask Gloom. False when nothing takes it. */
66
+ export function askGloomAboutPane(attachment: AskGloomPaneAttachment): boolean {
67
+ if (handlers.size === 0) return false;
68
+ for (const handler of [...handlers]) handler(attachment);
69
+ return true;
70
+ }
@@ -0,0 +1,201 @@
1
+ import type { NativeFrameCapture } from "../ui/host";
2
+ import { displayWidth } from "../utils/format";
3
+
4
+ /**
5
+ * At most this much of a pane's text goes with a question: a summary of what
6
+ * it shows, not a dump. It leaves room in the terminal context Gloom reads,
7
+ * which keeps 2,000 characters of it.
8
+ */
9
+ export const PANE_TEXT_MAX_CHARS = 1_500;
10
+ const PANE_TEXT_MAX_LINES = 50;
11
+
12
+ export interface CellRect {
13
+ x: number;
14
+ y: number;
15
+ width: number;
16
+ height: number;
17
+ }
18
+
19
+ /** The frame's sides and rules: lines of them say nothing, and an edge cell is not content. */
20
+ const RULE_LINE = /^[\s│┃║┆┊╎─━═┄┈╌┌┐└┘├┤┬┴┼╭╮╯╰▏▕█▐▌░▒▓]*$/u;
21
+ const LEADING_EDGE = /^[│┃║▏▕]\s?/u;
22
+ const TRAILING_EDGE = /\s?[│┃║▏▕█▐▌░▒▓]+$/u;
23
+
24
+ /**
25
+ * A pane's text, trimmed to what it says: no frame edges, rules or trailing
26
+ * blanks, runs of padding cut to two spaces so columns stay apart, blank
27
+ * lines folded, and the whole bounded. Null when nothing is left.
28
+ */
29
+ export function normalizePaneText(raw: string): string | null {
30
+ const lines: string[] = [];
31
+ let blank = false;
32
+ for (const rawLine of raw.split(/\r?\n/)) {
33
+ if (RULE_LINE.test(rawLine)) {
34
+ blank = lines.length > 0;
35
+ continue;
36
+ }
37
+ const line = rawLine
38
+ .replace(LEADING_EDGE, "")
39
+ .replace(TRAILING_EDGE, "")
40
+ .replace(/\s+$/u, "")
41
+ .replace(/\s{3,}/gu, " ");
42
+ if (!line.trim()) {
43
+ blank = lines.length > 0;
44
+ continue;
45
+ }
46
+ if (blank) lines.push("");
47
+ blank = false;
48
+ lines.push(line);
49
+ }
50
+ if (lines.length === 0) return null;
51
+
52
+ const kept: string[] = [];
53
+ let used = 0;
54
+ for (const line of lines.slice(0, PANE_TEXT_MAX_LINES)) {
55
+ if (used + line.length + 1 > PANE_TEXT_MAX_CHARS) break;
56
+ kept.push(line);
57
+ used += line.length + 1;
58
+ }
59
+ if (kept.length === 0) kept.push(lines[0]!.slice(0, PANE_TEXT_MAX_CHARS - 1));
60
+ const cut = kept.length < lines.length || kept[0] !== lines[0];
61
+ return cut ? `${kept.join("\n")}\n…` : kept.join("\n");
62
+ }
63
+
64
+ function covers(rect: CellRect, x: number, y: number): boolean {
65
+ return x >= rect.x && x < rect.x + rect.width && y >= rect.y && y < rect.y + rect.height;
66
+ }
67
+
68
+ /**
69
+ * A terminal pane's text from the frame on screen: the rows under its header,
70
+ * the columns it spans. Cells another surface covers (a floating pane above
71
+ * it, the menu it was asked from) are left blank, so only this pane's own
72
+ * text goes. `rect` and `covered` are in the pane area's cells, which starts
73
+ * `offsetX` columns and `offsetY` rows into the screen (under the app header).
74
+ */
75
+ export function terminalPaneText(
76
+ frame: NativeFrameCapture,
77
+ rect: CellRect,
78
+ { offsetX = 0, offsetY = 0, covered = [] }: { offsetX?: number; offsetY?: number; covered?: readonly CellRect[] } = {},
79
+ ): string | null {
80
+ const rows: string[] = [];
81
+ const left = Math.max(0, Math.floor(rect.x + offsetX));
82
+ const right = Math.floor(rect.x + offsetX + rect.width);
83
+ const top = Math.floor(rect.y) + 1;
84
+ const bottom = Math.floor(rect.y + rect.height);
85
+ for (let row = top; row < bottom; row += 1) {
86
+ const spans = frame.lines[row + offsetY];
87
+ if (!spans) continue;
88
+ let column = 0;
89
+ let text = "";
90
+ for (const span of spans) {
91
+ // One code point per cell; a wide one is followed by an empty continuation cell.
92
+ for (const char of span.text) {
93
+ const start = column;
94
+ const width = displayWidth(char) >= 2 ? 2 : 1;
95
+ column += width;
96
+ if (start < left || start >= right) continue;
97
+ text += covered.some((other) => covers(other, start - offsetX, row)) ? " ".repeat(width) : char;
98
+ }
99
+ if (column >= right) break;
100
+ }
101
+ rows.push(text);
102
+ }
103
+ return normalizePaneText(rows.join("\n"));
104
+ }
105
+
106
+ function attributeValue(value: string): string {
107
+ return value.replace(/\\/g, "\\\\").replace(/"/g, "\\\"");
108
+ }
109
+
110
+ interface PixelRect {
111
+ left: number;
112
+ top: number;
113
+ right: number;
114
+ bottom: number;
115
+ }
116
+
117
+ function intersect(a: PixelRect, b: PixelRect): PixelRect | null {
118
+ const rect = {
119
+ left: Math.max(a.left, b.left),
120
+ top: Math.max(a.top, b.top),
121
+ right: Math.min(a.right, b.right),
122
+ bottom: Math.min(a.bottom, b.bottom),
123
+ };
124
+ return rect.right > rect.left && rect.bottom > rect.top ? rect : null;
125
+ }
126
+
127
+ /**
128
+ * Where an element's content can be seen: the pane body cut down by every box
129
+ * between them that clips (a scrolled list, a table body), or null when one
130
+ * of them hides it.
131
+ */
132
+ function visibleArea(element: Element, body: HTMLElement, cache: Map<Element, PixelRect | null>): PixelRect | null {
133
+ const cached = cache.get(element);
134
+ if (cached !== undefined) return cached;
135
+ let area: PixelRect | null;
136
+ if (element === body) {
137
+ area = body.getBoundingClientRect();
138
+ } else {
139
+ const parent = element.parentElement;
140
+ area = parent ? visibleArea(parent, body, cache) : null;
141
+ const view = element.ownerDocument.defaultView;
142
+ const style = view?.getComputedStyle(element);
143
+ if (area && style) {
144
+ if (style.visibility === "hidden" || style.display === "none" || style.opacity === "0") area = null;
145
+ else if (style.overflowX !== "visible" || style.overflowY !== "visible") area = intersect(area, element.getBoundingClientRect());
146
+ }
147
+ }
148
+ cache.set(element, area);
149
+ return area;
150
+ }
151
+
152
+ /**
153
+ * A desktop or web pane's text as it is on screen: its body, without the
154
+ * header or footer, and only what can be seen, so rows scrolled out of a list
155
+ * and anything clipped stay out. Text on one line is joined in reading order.
156
+ */
157
+ export function domPaneText(paneId: string): string | null {
158
+ const doc = (globalThis as { document?: Document }).document;
159
+ if (!doc) return null;
160
+ const pane = doc.querySelector<HTMLElement>(`[data-gloom-pane-id="${attributeValue(paneId)}"]`);
161
+ const body = pane?.querySelector<HTMLElement>("[data-gloom-role=pane-body]") ?? pane;
162
+ if (!body) return null;
163
+
164
+ const areas = new Map<Element, PixelRect | null>();
165
+ const pieces: Array<{ top: number; bottom: number; left: number; right: number; text: string }> = [];
166
+ const range = doc.createRange();
167
+ const walker = doc.createTreeWalker(body, 4 /* NodeFilter.SHOW_TEXT */);
168
+ for (let node = walker.nextNode(); node; node = walker.nextNode()) {
169
+ const text = node.textContent?.replace(/\s+/g, " ").trim();
170
+ const parent = node.parentElement;
171
+ if (!text || !parent) continue;
172
+ const area = visibleArea(parent, body, areas);
173
+ if (!area) continue;
174
+ range.selectNodeContents(node);
175
+ const rects = Array.from(range.getClientRects()).filter((rect) => rect.width > 0 && intersect(area, rect));
176
+ const first = rects[0];
177
+ if (!first) continue;
178
+ pieces.push({ top: first.top, bottom: first.bottom, left: first.left, right: first.right, text });
179
+ }
180
+ range.detach?.();
181
+
182
+ // Pieces whose middles share a line read as one, left to right, with a
183
+ // gap where the pane leaves one between them.
184
+ pieces.sort((a, b) => (a.top + a.bottom) / 2 - (b.top + b.bottom) / 2 || a.left - b.left);
185
+ const lines: Array<{ middle: number; height: number; parts: typeof pieces }> = [];
186
+ for (const piece of pieces) {
187
+ const middle = (piece.top + piece.bottom) / 2;
188
+ const line = lines[lines.length - 1];
189
+ if (line && Math.abs(line.middle - middle) < Math.max(4, line.height / 2)) line.parts.push(piece);
190
+ else lines.push({ middle, height: piece.bottom - piece.top, parts: [piece] });
191
+ }
192
+ const text = lines.map((line) => {
193
+ const parts = [...line.parts].sort((a, b) => a.left - b.left);
194
+ return parts.reduce((out, part, index) => {
195
+ if (index === 0) return part.text;
196
+ const gap = part.left - parts[index - 1]!.right;
197
+ return `${out}${gap > 6 ? " " : gap > 0.5 ? " " : ""}${part.text}`;
198
+ }, "");
199
+ }).join("\n");
200
+ return normalizePaneText(text);
201
+ }
@@ -13,10 +13,11 @@ import { t, tf } from "../../i18n";
13
13
  import { useAppLanguage } from "../../i18n/react";
14
14
  import { useViewport } from "../../react/input";
15
15
  import { colors } from "../../theme/colors";
16
- import { Box, Text, TextAttributes } from "../../ui";
16
+ import { Box, Text, TextAttributes, useUiCapabilities } from "../../ui";
17
+ import { DialogHints } from "../../components/ui/dialog-actions";
17
18
  import { useDialog, useDialogKeyboard, type DialogApi, type PromptContext } from "../../ui/dialog";
18
19
  import { isPlainKey } from "../../utils/keyboard";
19
- import { DeviceSignInDialog } from "../../plugins/builtin/cloud/device-signin-dialog";
20
+ import { DeviceSignInDialog } from "../../account/device-signin-dialog";
20
21
  import type { SignedInBroker } from "./client";
21
22
  import {
22
23
  BrokerSignInController,
@@ -115,6 +116,7 @@ function BrokerSignInDialog({
115
116
  renew,
116
117
  }: PromptContext<BrokerSignInOutcome> & { broker: SignedInBroker; write: boolean; renew: boolean }) {
117
118
  useAppLanguage();
119
+ const { nativePaneChrome } = useUiCapabilities();
118
120
  const { height: termHeight } = useViewport();
119
121
  // Close after a beat so "Connected" is visible; enter skips the wait. Signed
120
122
  // out closes at once, for the host to sign in to Gloom.
@@ -162,9 +164,13 @@ function BrokerSignInDialog({
162
164
  </>
163
165
  )}
164
166
  <Box height={1} />
165
- <Box height={1}>
166
- <Text fg={colors.textMuted}>{t("r for a new code · esc to cancel")}</Text>
167
- </Box>
167
+ {nativePaneChrome ? (
168
+ <DialogHints keys={[{ key: "r", label: "new code" }, { key: "Esc", label: "cancel" }]} />
169
+ ) : (
170
+ <Box height={1}>
171
+ <Text fg={colors.textMuted}>{t("r for a new code · esc to cancel")}</Text>
172
+ </Box>
173
+ )}
168
174
  </Box>
169
175
  );
170
176
  }
@@ -202,7 +202,7 @@ function resolvedOutput(value: unknown): ResolvedSeries {
202
202
  const input = object(value, "resolve output");
203
203
  onlyKeys(input, "resolve output", [
204
204
  "id", "label", "color", "unit", "unitGroup", "nativeFrequency", "timestampMode", "dataShape", "style", "transform",
205
- "axis", "panelId", "interpolation", "timeBasis", "latestChangePercent", "points", "warning", "hidden",
205
+ "axis", "panelId", "interpolation", "timeBasis", "latestChangePercent", "points", "warning", "hidden", "attribution",
206
206
  ]);
207
207
  if (!Array.isArray(input.points)) fail("resolve output points", "expected an array.");
208
208
  if (input.points.length > MAX_CHART_SERIES_POINTS) {
@@ -212,6 +212,9 @@ function resolvedOutput(value: unknown): ResolvedSeries {
212
212
  if (timeBasis) onlyKeys(timeBasis, "resolve output time basis", ["kind", "timeZone", "cadenceMs"]);
213
213
  const kind = timeBasis?.kind === undefined ? undefined : enumValue<"market">(timeBasis.kind, "time basis kind", new Set(["market"]));
214
214
  const warning = optionalString(input.warning, "resolve output warning", 500);
215
+ const attribution = input.attribution === undefined ? undefined : object(input.attribution, "resolve output attribution");
216
+ if (attribution) onlyKeys(attribution, "resolve output attribution", ["source", "publisher"]);
217
+ const publisher = attribution ? optionalString(attribution.publisher, "resolve output publisher", 160) : undefined;
215
218
  return {
216
219
  id: boundedString(input.id, "resolve output ID", 160),
217
220
  label: boundedString(input.label, "resolve output label", 160),
@@ -242,6 +245,10 @@ function resolvedOutput(value: unknown): ResolvedSeries {
242
245
  : {}),
243
246
  points: input.points.map(point),
244
247
  ...(warning !== undefined ? { warning } : {}),
248
+ ...(attribution ? { attribution: {
249
+ source: boundedString(attribution.source, "resolve output source", 160),
250
+ ...(publisher !== undefined ? { publisher } : {}),
251
+ } } : {}),
245
252
  ...(input.hidden !== undefined
246
253
  ? typeof input.hidden === "boolean" ? { hidden: input.hidden } : fail("resolve output hidden", "expected a boolean.")
247
254
  : {}),
@@ -253,17 +260,27 @@ export const chartSeriesCatalogOutputSchema: CapabilitySchema<ChartSeriesCatalog
253
260
  export const chartSeriesResolveRequestSchema: CapabilitySchema<ChartSeriesResolveRequest> = { parse: resolveRequest };
254
261
  export const chartSeriesResolveOutputSchema: CapabilitySchema<ResolvedSeries> = { parse: resolvedOutput };
255
262
 
263
+ /**
264
+ * Set on the capabilities registered series resolve through. The composer
265
+ * searches those series in the series registry, so capability search skips them.
266
+ */
267
+ export const REGISTERED_SERIES_SOURCE_ID = "registered-series";
268
+
256
269
  export function chartSeriesCapabilityManifests(invoker: CapabilityInvoker) {
257
270
  return invoker.capabilityManifests(CHART_SERIES_CAPABILITY_KIND);
258
271
  }
259
272
 
273
+ function searchableChartSeriesManifests(invoker: CapabilityInvoker) {
274
+ return chartSeriesCapabilityManifests(invoker).filter((manifest) => manifest.sourceId !== REGISTERED_SERIES_SOURCE_ID);
275
+ }
276
+
260
277
  export async function searchChartSeriesCapabilities(
261
278
  invoker: CapabilityInvoker,
262
279
  query: string,
263
280
  limit = 8,
264
281
  signal?: AbortSignal,
265
282
  ): Promise<Array<ChartSeriesCatalogItem & { capabilityId: string; capabilityName: string }>> {
266
- const manifests = chartSeriesCapabilityManifests(invoker);
283
+ const manifests = searchableChartSeriesManifests(invoker);
267
284
  const results = await Promise.allSettled(manifests.map(async (manifest) => {
268
285
  const items = await invoker.invokeCapability<ChartSeriesCatalogItem[]>(
269
286
  manifest.id,
@@ -61,6 +61,7 @@ export function assetDataProvider(provider: AssetDataProvider): AssetDataCapabil
61
61
  if (!provider.getCorporateActions) throw new Error(`${provider.name} does not provide corporate actions.`);
62
62
  return provider.getCorporateActions(input.ticker, input.exchange, input.context);
63
63
  }, "query"),
64
+ getTickerChanges: op((input: any) => provider.getTickerChanges?.(input.symbol) ?? Promise.resolve(null), "query"),
64
65
  getEarningsCalendar: op((input: any) => {
65
66
  if (!provider.getEarningsCalendar) throw new Error(`${provider.name} does not provide earnings calendar.`);
66
67
  return provider.getEarningsCalendar(input.symbols ?? [], input.context);
@@ -0,0 +1,23 @@
1
+ import { centralBankNamed } from "../utils/central-banks";
2
+
3
+ /**
4
+ * Central bank acronyms that are also the symbol of a listing people ask
5
+ * about (BOE is a NYSE fund, RBI Raiffeisen Bank in Vienna), so `events BOE`
6
+ * stays that listing's. ECB S.A. in Warsaw is reached as ECB:WSE.
7
+ */
8
+ const LISTED_SYMBOLS = new Set(["BOE", "BOC", "RBA", "PBOC", "RBI", "BOK"]);
9
+
10
+ /**
11
+ * What `events` says for a central bank named on its own ("ECB", "Norges
12
+ * Bank"): its meetings are no company's corporate events, and CBR has its
13
+ * rate and the next decision from the bank's own calendar (China's next LPR
14
+ * fixing; SAMA publishes none). Null for anything else, a symbol with a venue
15
+ * included.
16
+ */
17
+ export function centralBankEventsMessage(typed: string): string | null {
18
+ const bank = centralBankNamed(typed);
19
+ if (!bank || LISTED_SYMBOLS.has(typed.trim().replace(/^\$/, "").toUpperCase())) return null;
20
+ const next = bank.id === "US" ? " and the next FOMC date" : bank.id === "CN" ? " and the next LPR fixing"
21
+ : bank.id === "SA" ? "" : " and the next decision";
22
+ return `${bank.id === "US" ? "Fed" : bank.short} meetings are not listed; CBR shows the rate${next} (gloomberb fn CBR).`;
23
+ }
@@ -4,8 +4,11 @@ import { suggestCliOption } from "./help";
4
4
 
5
5
  /** A built-in command, which may say more about an option it does not take than the list of those it does. */
6
6
  export interface BuiltinCliCommandDef extends CliCommandDef {
7
- /** A sentence for an unknown option people reach for, such as `--from` on `history`; null for the rest. */
8
- unknownOptionHint?(flag: string): string | null;
7
+ /**
8
+ * A sentence for an unknown option people reach for, such as `--from` on
9
+ * `history`; null for the rest. `args` are the command's, to name what it was given.
10
+ */
11
+ unknownOptionHint?(flag: string, args: readonly string[]): string | null;
9
12
  }
10
13
 
11
14
  interface DeclaredOption {
@@ -34,12 +37,21 @@ function declaredOptions(command: CliCommandDef): Map<string, DeclaredOption> |
34
37
  return declared;
35
38
  }
36
39
 
37
- function failUnknownOption(command: BuiltinCliCommandDef, flag: string, declared: Map<string, DeclaredOption>): never {
40
+ /** `--explain` on a command that has no glossary of its own points at the commands that do, and at the glossary. */
41
+ const EXPLAIN_HINT = "--explain follows the reports of fn <function> and portfolio show. "
42
+ + "gloomberb catalog explain <term> prints what one term means; gloomberb catalog glossary lists every term.";
43
+
44
+ function failUnknownOption(
45
+ command: BuiltinCliCommandDef,
46
+ flag: string,
47
+ declared: Map<string, DeclaredOption>,
48
+ args: readonly string[],
49
+ ): never {
38
50
  const flags = [...declared.keys()];
39
51
  const suggestion = suggestCliOption(flag, flags);
40
52
  const help = `See gloomberb help ${command.name}.`;
41
53
  fail(`Unknown option ${flag} for ${command.name}.`, [
42
- command.unknownOptionHint?.(flag) ?? "",
54
+ command.unknownOptionHint?.(flag, args) ?? (flag === "--explain" ? EXPLAIN_HINT : ""),
43
55
  suggestion ? `Did you mean ${suggestion}?` : "",
44
56
  flags.length > 0 ? `Options: ${flags.join(", ")}. ${help}` : `${command.name} takes no options. ${help}`,
45
57
  ].filter(Boolean).join("\n"));
@@ -65,7 +77,7 @@ export function checkCliCommandOptions(
65
77
  const equals = arg.indexOf("=");
66
78
  const flag = equals >= 0 ? arg.slice(0, equals) : arg;
67
79
  const option = declared.get(flag);
68
- if (!option) failUnknownOption(command, flag, declared);
80
+ if (!option) failUnknownOption(command, flag, declared, args);
69
81
  if (!option.takesValue && equals >= 0) {
70
82
  fail(`${flag} takes no value.`, `Write it alone, as ${flag}. See gloomberb help ${command.name}.`);
71
83
  }