gloomberb 0.16.3 → 0.16.5

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 (820) hide show
  1. package/README.md +14 -91
  2. package/package.json +7 -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 +42 -17
  11. package/src/account/upgrade-personalization.ts +57 -0
  12. package/src/account/upgrade-tickers.ts +124 -0
  13. package/src/{plugins/builtin/cloud → account}/verification-panel.tsx +6 -6
  14. package/src/api-client/askg.ts +43 -0
  15. package/src/api-client/auth.ts +15 -0
  16. package/src/api-client/beneficial-owners.ts +4 -0
  17. package/src/api-client/chat.ts +19 -0
  18. package/src/api-client/company-kpis.ts +14 -2
  19. package/src/api-client/data.ts +58 -18
  20. package/src/api-client/earnings.ts +6 -0
  21. package/src/api-client/futures-curve.ts +56 -0
  22. package/src/api-client/index.ts +16 -1
  23. package/src/api-client/market-discovery.ts +10 -1
  24. package/src/api-client/normalizers.ts +27 -0
  25. package/src/api-client/paths.ts +95 -23
  26. package/src/api-client/request.ts +2 -1
  27. package/src/api-client/research-activity.ts +46 -10
  28. package/src/api-client/socket.ts +39 -8
  29. package/src/api-client/types.ts +74 -2
  30. package/src/api-client/upgrade-experiment.ts +90 -0
  31. package/src/api-client/yield-curves.ts +8 -0
  32. package/src/app/global-shortcuts.ts +26 -2
  33. package/src/app/keybindings/actions.ts +10 -0
  34. package/src/app/pane-runtime/index.tsx +8 -0
  35. package/src/app/pane-runtime/pane-template-runtime.ts +5 -0
  36. package/src/app/pane-runtime/plugin-bindings.ts +65 -25
  37. package/src/app/pane-runtime/ticker-inspector-runtime.ts +12 -0
  38. package/src/app/pane-runtime/ticker-open-runtime.ts +25 -4
  39. package/src/app/runtime/desktop-deeplink.ts +5 -0
  40. package/src/app/star-prompt/model.ts +98 -0
  41. package/src/app/star-prompt/runtime.ts +41 -0
  42. package/src/app/star-prompt/status-line.tsx +190 -0
  43. package/src/app.tsx +13 -7
  44. package/src/architecture/core-builtin-allowlist.json +61 -0
  45. package/src/brokers/signed-in/adapter.ts +33 -2
  46. package/src/brokers/signed-in/client.ts +10 -0
  47. package/src/brokers/signed-in/sign-in-dialog.tsx +34 -14
  48. package/src/brokers/signed-in/sign-in.ts +62 -5
  49. package/src/capabilities/chart-series.ts +11 -1
  50. package/src/capabilities/registry.ts +8 -1
  51. package/src/capabilities/types.ts +2 -0
  52. package/src/cli/commands/crypto-hints.ts +19 -4
  53. package/src/cli/commands/fred-series.ts +61 -0
  54. package/src/cli/commands/market.ts +744 -181
  55. package/src/cli/commands/news-hints.ts +62 -0
  56. package/src/cli/commands/news-search.ts +53 -0
  57. package/src/cli/commands/options-chain.ts +172 -0
  58. package/src/cli/commands/options-leaps.ts +425 -0
  59. package/src/cli/commands/overview.ts +251 -40
  60. package/src/cli/commands/remote.ts +2 -1
  61. package/src/cli/commands/search.ts +109 -15
  62. package/src/cli/commands/system.ts +151 -24
  63. package/src/cli/commands/themes.ts +64 -0
  64. package/src/cli/commands/ticker.ts +149 -40
  65. package/src/cli/context.ts +45 -14
  66. package/src/cli/desktop-pane-shot.ts +150 -17
  67. package/src/cli/earnings-calendar.ts +71 -0
  68. package/src/cli/errors.ts +25 -2
  69. package/src/cli/freshness.ts +22 -8
  70. package/src/cli/fx-pair.ts +57 -0
  71. package/src/cli/glossary.ts +429 -0
  72. package/src/cli/help.ts +14 -1
  73. package/src/cli/history-rows.ts +48 -7
  74. package/src/cli/index-roots.ts +58 -0
  75. package/src/cli/index.ts +29 -12
  76. package/src/cli/known-gaps.ts +27 -0
  77. package/src/cli/listing-arg.ts +595 -26
  78. package/src/cli/not-a-ticker.ts +44 -0
  79. package/src/cli/options.ts +50 -6
  80. package/src/cli/pane-functions/access-gate.ts +5 -0
  81. package/src/cli/pane-functions/capabilities.ts +11 -4
  82. package/src/cli/pane-functions/catalog.ts +48 -7
  83. package/src/cli/pane-functions/data.ts +48 -13
  84. package/src/cli/pane-functions/discovery.ts +1 -0
  85. package/src/cli/pane-functions/dom.ts +41 -19
  86. package/src/cli/pane-functions/freshness.ts +531 -32
  87. package/src/cli/pane-functions/function-help.ts +77 -25
  88. package/src/cli/pane-functions/headless.ts +50 -21
  89. package/src/cli/pane-functions/index.ts +66 -10
  90. package/src/cli/pane-functions/market-session.ts +147 -0
  91. package/src/cli/pane-functions/options.ts +77 -25
  92. package/src/cli/pane-functions/report-notices.ts +81 -0
  93. package/src/cli/pane-functions/report.ts +19 -8
  94. package/src/cli/pane-functions/resolver.ts +53 -18
  95. package/src/cli/pane-functions/screenshot-evidence.ts +2 -0
  96. package/src/cli/pane-functions/screenshot.ts +199 -30
  97. package/src/cli/registry.ts +2 -1
  98. package/src/cli/report-tables.ts +3 -0
  99. package/src/cli/result.ts +53 -13
  100. package/src/cli/row-window.ts +76 -0
  101. package/src/cli/scroll-truncation.ts +34 -0
  102. package/src/cli/staged-tickers.ts +52 -0
  103. package/src/cli/symbol-args.ts +9 -0
  104. package/src/cli/symbol-list.ts +172 -0
  105. package/src/cli/ticker-resolution.ts +223 -30
  106. package/src/cli/types.ts +5 -0
  107. package/src/components/chart/composite/axis-overlays.tsx +6 -2
  108. package/src/components/chart/composite/composite-chart.tsx +83 -10
  109. package/src/components/chart/composite/legend.tsx +88 -8
  110. package/src/components/chart/composite/panel-surface.tsx +44 -17
  111. package/src/components/chart/composite/price-axis-labels.tsx +3 -1
  112. package/src/components/chart/composite/rasterizer.ts +64 -4
  113. package/src/components/chart/composite/series-cues.ts +71 -0
  114. package/src/components/chart/composite/text-renderer.ts +16 -8
  115. package/src/components/chart/composite/types.ts +3 -0
  116. package/src/components/command-bar/commands/direct/index.ts +9 -1
  117. package/src/components/command-bar/commands/plugin/items.ts +3 -1
  118. package/src/components/command-bar/commands/registry.ts +7 -0
  119. package/src/components/command-bar/layout-items/focused-pane.ts +38 -0
  120. package/src/components/command-bar/pane-templates/workflow.ts +5 -0
  121. package/src/components/command-bar/panel/index.tsx +11 -3
  122. package/src/components/command-bar/panel/runtime.ts +3 -0
  123. package/src/components/command-bar/panel/types.ts +2 -0
  124. package/src/components/command-bar/routes/root/command-items.ts +2 -0
  125. package/src/components/command-bar/routes/root/plugin-turn-on.ts +92 -0
  126. package/src/components/command-bar/routes/root/provider-search.ts +4 -3
  127. package/src/components/command-bar/routes/root/results.ts +40 -10
  128. package/src/components/command-bar/routes/root/runtime.ts +8 -0
  129. package/src/components/command-bar/routes/root/search-providers.ts +97 -14
  130. package/src/components/command-bar/routes/ticker-search/results.ts +12 -11
  131. package/src/components/command-bar/routes/ticker-search/route.ts +4 -3
  132. package/src/components/command-bar/surface/index.tsx +18 -4
  133. package/src/components/command-bar/theme-picker.tsx +48 -13
  134. package/src/components/command-bar/workflow/ops.ts +5 -3
  135. package/src/components/command-bar/workflow/tickers.ts +23 -4
  136. package/src/components/data-table/view.tsx +28 -9
  137. package/src/components/layout/detached-pane-shell.tsx +9 -0
  138. package/src/components/layout/floating-pane.tsx +9 -2
  139. package/src/components/layout/header.tsx +20 -5
  140. package/src/components/layout/market-summary.ts +23 -9
  141. package/src/components/layout/pane/content.tsx +40 -29
  142. package/src/components/layout/pane/cycle-order.ts +2 -11
  143. package/src/components/layout/pane/footer/index.tsx +6 -2
  144. package/src/components/layout/pane/footer/model.ts +35 -1
  145. package/src/components/layout/pane/header.tsx +26 -2
  146. package/src/components/layout/pane/index.tsx +12 -2
  147. package/src/components/layout/pane/sidebar.tsx +78 -10
  148. package/src/components/layout/pane/title.ts +1 -1
  149. package/src/components/layout/presentation.ts +22 -0
  150. package/src/components/layout/shell/active-drag.ts +21 -5
  151. package/src/components/layout/shell/drag/index.ts +43 -9
  152. package/src/components/layout/shell/drag/live.ts +87 -6
  153. package/src/components/layout/shell/drag/runtime.ts +62 -20
  154. package/src/components/layout/shell/index.tsx +71 -12
  155. package/src/components/layout/shell/layout-state.ts +5 -11
  156. package/src/components/layout/shell/menu.ts +33 -1
  157. package/src/components/layout/shell/native/pointer-runtime.ts +3 -1
  158. package/src/components/layout/shell/pane/actions.ts +2 -1
  159. package/src/components/layout/shell/pane/layers.tsx +216 -28
  160. package/src/components/layout/shell/pane/management-shortcuts.ts +5 -0
  161. package/src/components/layout/shell/pane/new-layout.ts +116 -0
  162. package/src/components/layout/shell/shortcuts.ts +5 -2
  163. package/src/components/layout/shell/terminal-pointer-runtime.ts +24 -0
  164. package/src/components/layout/shell/visible-layout.ts +44 -1
  165. package/src/components/layout/status-bar.tsx +4 -1
  166. package/src/components/markdown-text.tsx +69 -23
  167. package/src/components/metric-treemap/heat-surface.tsx +37 -9
  168. package/src/components/metric-treemap/heat-tiles.ts +48 -17
  169. package/src/components/onboarding/account-step/form-panel.tsx +1 -1
  170. package/src/components/onboarding/account-step/index.tsx +1 -1
  171. package/src/components/onboarding/account-step/qr-panel.tsx +1 -1
  172. package/src/components/onboarding/account-step/signed-in-panel.tsx +1 -1
  173. package/src/components/onboarding/onboarding-frame.tsx +33 -10
  174. package/src/components/onboarding/onboarding-keyboard.ts +1 -1
  175. package/src/components/onboarding/onboarding-wizard.tsx +50 -41
  176. package/src/components/onboarding/portfolio-step/positions-panel.tsx +5 -2
  177. package/src/components/onboarding/pro-step-layout.ts +86 -0
  178. package/src/components/onboarding/use-onboarding-upgrade.ts +8 -4
  179. package/src/components/onboarding/wizard-account.ts +2 -2
  180. package/src/components/pane-template-wizard.tsx +9 -1
  181. package/src/components/price-selector-dialog.tsx +11 -2
  182. package/src/components/sign-in-gate.tsx +3 -3
  183. package/src/components/ticker/list-table-view.tsx +24 -1
  184. package/src/components/ui/action-row.tsx +2 -1
  185. package/src/components/ui/button.tsx +17 -1
  186. package/src/components/ui/choice-dialog.tsx +6 -4
  187. package/src/components/ui/confirm-dialog.tsx +28 -18
  188. package/src/components/ui/data-table/index.tsx +49 -0
  189. package/src/components/ui/data-table/opentui/index.tsx +37 -6
  190. package/src/components/ui/data-table/types.ts +20 -1
  191. package/src/components/ui/data-table/visible-range.ts +2 -0
  192. package/src/components/ui/dialog-actions.tsx +64 -0
  193. package/src/components/ui/display.tsx +17 -3
  194. package/src/components/ui/frame.tsx +35 -2
  195. package/src/components/ui/icon.tsx +13 -2
  196. package/src/components/ui/index.ts +1 -1
  197. package/src/components/ui/text-prompt-dialog.tsx +11 -9
  198. package/src/core/connection-health.ts +1 -1
  199. package/src/core/state/app/layout-reducer.ts +89 -3
  200. package/src/core/state/app/state.ts +8 -5
  201. package/src/core/state/app/types.ts +13 -2
  202. package/src/data/cached-query.ts +2 -0
  203. package/src/data/config/layout.ts +55 -21
  204. package/src/data/config/store/fold-panes.ts +149 -0
  205. package/src/data/config/store/migrations.ts +7 -0
  206. package/src/data/config/store/node.ts +27 -6
  207. package/src/data/config/store/normalize.ts +44 -5
  208. package/src/data/ticker-repository.ts +5 -0
  209. package/src/data/ticker-store.ts +15 -0
  210. package/src/docs/content.ts +215 -0
  211. package/src/docs/load.ts +139 -0
  212. package/src/docs/requests.ts +39 -0
  213. package/src/docs/snapshot.chunk.ts +8 -0
  214. package/src/docs/snapshot.json +7416 -0
  215. package/src/docs/topics.ts +216 -0
  216. package/src/i18n/es.ts +75 -5
  217. package/src/i18n/ja.ts +75 -5
  218. package/src/i18n/ko.ts +75 -5
  219. package/src/i18n/zh-cn.ts +75 -5
  220. package/src/i18n/zh-tw.ts +75 -5
  221. package/src/layout/desks.ts +2 -3
  222. package/src/layout/pane-layout-move.ts +264 -0
  223. package/src/layout/pane-manager/dock-tree.ts +18 -0
  224. package/src/layout/pane-manager/hidden-panes.ts +160 -0
  225. package/src/layout/pane-manager/index.ts +2 -0
  226. package/src/market-data/coordinator/chart.ts +10 -4
  227. package/src/market-data/coordinator/entries.ts +7 -1
  228. package/src/market-data/coordinator/index.ts +6 -3
  229. package/src/market-data/coordinator/quotes.ts +2 -2
  230. package/src/{plugins/builtin/futures/contracts.ts → market-data/futures-board.ts} +81 -28
  231. package/src/market-data/futures-contract.ts +151 -0
  232. package/src/market-data/hooks.tsx +10 -2
  233. package/src/market-data/market/format.ts +39 -21
  234. package/src/market-data/market/freshness.ts +193 -30
  235. package/src/market-data/market/status.ts +59 -23
  236. package/src/market-data/options-alternatives.ts +69 -0
  237. package/src/market-data/published-apac-sessions.ts +23 -1
  238. package/src/market-data/quotes/contributions.ts +22 -2
  239. package/src/market-data/quotes/metadata.ts +8 -9
  240. package/src/market-data/quotes/resolution.ts +2 -0
  241. package/src/market-data/quotes/screener-live-quotes.ts +61 -9
  242. package/src/market-data/result-types.ts +2 -0
  243. package/src/plugins/builtin/account-management/keyboard.ts +3 -0
  244. package/src/plugins/builtin/account-management/model.ts +2 -56
  245. package/src/plugins/builtin/account-management/navigation.ts +1 -1
  246. package/src/plugins/builtin/account-management/pane.tsx +37 -8
  247. package/src/plugins/builtin/account-management/password-dialog.tsx +1 -1
  248. package/src/plugins/builtin/alerts/cli.ts +313 -47
  249. package/src/plugins/builtin/alerts/events-pane.tsx +45 -7
  250. package/src/plugins/builtin/alerts/events.ts +23 -2
  251. package/src/plugins/builtin/alerts/history-pane.tsx +7 -2
  252. package/src/plugins/builtin/alerts/history.ts +2 -0
  253. package/src/plugins/builtin/alerts/index.tsx +41 -9
  254. package/src/plugins/builtin/alerts/pane.tsx +8 -0
  255. package/src/plugins/builtin/alerts/quotes.ts +3 -0
  256. package/src/plugins/builtin/alerts/research-builder.ts +8 -3
  257. package/src/plugins/builtin/alerts/research-rules.ts +18 -2
  258. package/src/plugins/builtin/alerts/scheduled-check.ts +122 -0
  259. package/src/plugins/builtin/alerts/scheduled-sources.ts +25 -0
  260. package/src/plugins/builtin/alerts/scheduled.ts +254 -0
  261. package/src/plugins/builtin/alerts/targets.ts +92 -0
  262. package/src/plugins/builtin/analytics/index.tsx +4 -2
  263. package/src/plugins/builtin/analytics/risk-headless.ts +33 -13
  264. package/src/plugins/builtin/analytics/risk-math.ts +91 -27
  265. package/src/plugins/builtin/analytics/risk-model.ts +71 -12
  266. package/src/plugins/builtin/analytics/risk-pane.tsx +23 -12
  267. package/src/plugins/builtin/attention/index.tsx +2 -0
  268. package/src/plugins/builtin/attention/pane.tsx +3 -1
  269. package/src/plugins/builtin/attention/series.ts +26 -0
  270. package/src/plugins/builtin/awards/index.tsx +2 -0
  271. package/src/plugins/builtin/awards/pane.tsx +3 -1
  272. package/src/plugins/builtin/awards/series.ts +29 -0
  273. package/src/plugins/builtin/backtest/pane.tsx +1 -1
  274. package/src/plugins/builtin/bond-calculator/model.ts +2 -1
  275. package/src/plugins/builtin/broker-manager/detail.tsx +4 -0
  276. package/src/plugins/builtin/broker-manager/index.tsx +7 -3
  277. package/src/plugins/builtin/broker-manager/model.ts +8 -0
  278. package/src/plugins/builtin/broker-manager/pane-actions.tsx +8 -2
  279. package/src/plugins/builtin/broker-manager/sign-in-end.ts +82 -0
  280. package/src/plugins/builtin/broker-manager/table.ts +5 -0
  281. package/src/plugins/builtin/builtin-plugin-meta.ts +121 -11
  282. package/src/plugins/builtin/catalysts/pane.tsx +3 -1
  283. package/src/plugins/builtin/cds/client.ts +70 -13
  284. package/src/plugins/builtin/cds/headless.ts +116 -19
  285. package/src/plugins/builtin/cds/index.tsx +3 -1
  286. package/src/plugins/builtin/cds/model.ts +193 -31
  287. package/src/plugins/builtin/cds/pane.tsx +56 -14
  288. package/src/plugins/builtin/cds/series.ts +19 -0
  289. package/src/plugins/builtin/central-bank-rates/index.tsx +2 -0
  290. package/src/plugins/builtin/central-bank-rates/series.ts +42 -0
  291. package/src/plugins/builtin/chart-composer/catalog-inventory.ts +192 -255
  292. package/src/plugins/builtin/chart-composer/data-catalog-pane.tsx +84 -46
  293. package/src/plugins/builtin/chart-composer/editor.tsx +5 -4
  294. package/src/plugins/builtin/chart-composer/field-series.ts +40 -0
  295. package/src/plugins/builtin/chart-composer/headless.ts +8 -3
  296. package/src/plugins/builtin/chart-composer/index.tsx +9 -2
  297. package/src/plugins/builtin/chart-composer/pane.tsx +1 -1
  298. package/src/plugins/builtin/chart-composer/series-catalog.ts +58 -50
  299. package/src/plugins/builtin/chart-composer/series-expression.ts +18 -10
  300. package/src/plugins/builtin/chart-composer/use-series-catalog.ts +59 -3
  301. package/src/plugins/builtin/chart-composer/user-series.ts +84 -0
  302. package/src/plugins/builtin/chat/channels.ts +34 -36
  303. package/src/plugins/builtin/chat/command-bar.ts +138 -0
  304. package/src/plugins/builtin/chat/composer-commands.ts +21 -1
  305. package/src/plugins/builtin/chat/content/composer-runtime.ts +11 -1
  306. package/src/plugins/builtin/chat/content/footer.tsx +5 -3
  307. package/src/plugins/builtin/chat/content/index.tsx +21 -1
  308. package/src/plugins/builtin/chat/content/mentions.ts +2 -1
  309. package/src/plugins/builtin/chat/content/new-dm-dialog.tsx +10 -2
  310. package/src/plugins/builtin/chat/content/user-map.ts +3 -1
  311. package/src/plugins/builtin/chat/controller/index.ts +50 -0
  312. package/src/plugins/builtin/chat/conversations.ts +256 -0
  313. package/src/plugins/builtin/chat/discord-command.ts +91 -0
  314. package/src/plugins/builtin/chat/edit-window.ts +12 -6
  315. package/src/plugins/builtin/chat/ghost-user.ts +14 -0
  316. package/src/plugins/builtin/chat/index.tsx +40 -2
  317. package/src/plugins/builtin/chat/layout.ts +2 -0
  318. package/src/plugins/builtin/chat/message/desktop.tsx +2 -1
  319. package/src/plugins/builtin/chat/message/header.tsx +24 -15
  320. package/src/plugins/builtin/chat/message/profile-popover.tsx +2 -1
  321. package/src/plugins/builtin/chat/message/render-state.ts +3 -0
  322. package/src/plugins/builtin/chat/pane-requests.ts +60 -0
  323. package/src/plugins/builtin/chat/pane-state.ts +32 -2
  324. package/src/plugins/builtin/chat/pane.tsx +8 -0
  325. package/src/plugins/builtin/cloud/askg/controller.ts +223 -23
  326. package/src/plugins/builtin/cloud/askg/conversation-store.ts +21 -0
  327. package/src/plugins/builtin/cloud/askg/executor.ts +57 -3
  328. package/src/plugins/builtin/cloud/askg/manifest.ts +33 -7
  329. package/src/plugins/builtin/cloud/askg/model.ts +156 -78
  330. package/src/plugins/builtin/cloud/askg/pane.tsx +772 -377
  331. package/src/plugins/builtin/cloud/askg/protocol.ts +50 -3
  332. package/src/plugins/builtin/cloud/askg/tool-display.ts +440 -0
  333. package/src/plugins/builtin/cloud/askg/tool-timeline.tsx +403 -0
  334. package/src/plugins/builtin/cloud/askg/undo.ts +2 -0
  335. package/src/plugins/builtin/cloud/auth-actions.tsx +1 -1
  336. package/src/plugins/builtin/cloud/auth-commands.ts +1 -1
  337. package/src/plugins/builtin/cloud/auth-dialog.tsx +3 -3
  338. package/src/plugins/builtin/cloud/company-picker.tsx +1 -9
  339. package/src/plugins/builtin/cloud/mcp-connect/command.ts +24 -0
  340. package/src/plugins/builtin/cloud/mcp-connect/dialog.tsx +363 -0
  341. package/src/plugins/builtin/cloud/mcp-connect/model.ts +135 -0
  342. package/src/plugins/builtin/cloud/mcp-connect/sections.ts +62 -0
  343. package/src/plugins/builtin/cloud/plugin.tsx +36 -1
  344. package/src/plugins/builtin/cloud/terminal-relay/acm-tab.tsx +89 -0
  345. package/src/plugins/builtin/cloud/terminal-relay/client.ts +97 -0
  346. package/src/plugins/builtin/cloud/terminal-relay/connect-section.tsx +57 -0
  347. package/src/plugins/builtin/cloud/terminal-relay/engine.ts +734 -0
  348. package/src/plugins/builtin/cloud/terminal-relay/grants.ts +137 -0
  349. package/src/plugins/builtin/cloud/terminal-relay/host.tsx +81 -0
  350. package/src/plugins/builtin/cloud/terminal-relay/indicator.tsx +82 -0
  351. package/src/plugins/builtin/cloud/terminal-relay/manifest.ts +239 -0
  352. package/src/plugins/builtin/cloud/terminal-relay/policy.ts +162 -0
  353. package/src/plugins/builtin/cloud/terminal-relay/prompts.tsx +192 -0
  354. package/src/plugins/builtin/cloud/terminal-relay/redact.ts +73 -0
  355. package/src/plugins/builtin/cloud/terminal-relay/summary.ts +62 -0
  356. package/src/plugins/builtin/cloud/thesis/exposure.ts +1 -1
  357. package/src/plugins/builtin/cloud/thesis/prompts.tsx +2 -1
  358. package/src/plugins/builtin/comment-letters/client.ts +1 -3
  359. package/src/plugins/builtin/company-attention/app-rank.tsx +1 -1
  360. package/src/plugins/builtin/company-attention/headless.ts +19 -5
  361. package/src/plugins/builtin/company-attention/index.tsx +2 -0
  362. package/src/plugins/builtin/company-attention/model.ts +26 -7
  363. package/src/plugins/builtin/company-attention/pane.tsx +12 -9
  364. package/src/plugins/builtin/company-attention/series.ts +52 -0
  365. package/src/plugins/builtin/company-kpis/client.ts +23 -8
  366. package/src/plugins/builtin/company-kpis/headless.ts +3 -1
  367. package/src/plugins/builtin/company-kpis/pane.tsx +19 -9
  368. package/src/plugins/builtin/company-kpis/screenshot-evidence.ts +10 -3
  369. package/src/plugins/builtin/composite-plugins.ts +116 -67
  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/credit-boards/cdx-pane.tsx +4 -4
  374. package/src/plugins/builtin/credit-boards/index.tsx +23 -21
  375. package/src/plugins/builtin/credit-boards/model.ts +0 -1
  376. package/src/plugins/builtin/credit-boards/pane.tsx +30 -0
  377. package/src/plugins/builtin/credit-boards/series.ts +66 -0
  378. package/src/plugins/builtin/credit-boards/sovr-pane.tsx +4 -4
  379. package/src/plugins/builtin/credit-conditions/index.tsx +2 -0
  380. package/src/plugins/builtin/credit-conditions/series.ts +26 -0
  381. package/src/plugins/builtin/credit-documents/headless.ts +31 -1
  382. package/src/plugins/builtin/credit-documents/pane.tsx +3 -1
  383. package/src/plugins/builtin/crypto-board/headless.ts +2 -3
  384. package/src/plugins/builtin/crypto-board/index.tsx +2 -0
  385. package/src/plugins/builtin/crypto-board/model.ts +12 -0
  386. package/src/plugins/builtin/crypto-board/pane.tsx +19 -12
  387. package/src/plugins/builtin/crypto-board/series.ts +48 -0
  388. package/src/plugins/builtin/custom-view/live-quotes.ts +2 -2
  389. package/src/plugins/builtin/debt-maturities/client.ts +37 -9
  390. package/src/plugins/builtin/debt-maturities/headless.ts +3 -1
  391. package/src/plugins/builtin/debt-maturities/index.tsx +2 -0
  392. package/src/plugins/builtin/debt-maturities/pane.tsx +5 -4
  393. package/src/plugins/builtin/debt-maturities/series.ts +45 -0
  394. package/src/plugins/builtin/dividend-yield/headless.ts +2 -2
  395. package/src/plugins/builtin/dividend-yield/index.tsx +3 -1
  396. package/src/plugins/builtin/dividend-yield/pane.tsx +1 -1
  397. package/src/plugins/builtin/dividend-yield/series.ts +20 -0
  398. package/src/plugins/builtin/docs/blocks.tsx +181 -0
  399. package/src/plugins/builtin/docs/index.tsx +68 -0
  400. package/src/plugins/builtin/docs/pane.tsx +426 -0
  401. package/src/plugins/builtin/docs/targets.ts +72 -0
  402. package/src/plugins/builtin/docs/use-docs.ts +60 -0
  403. package/src/plugins/builtin/doe/index.tsx +2 -0
  404. package/src/plugins/builtin/doe/series.ts +62 -0
  405. package/src/plugins/builtin/earnings/client.ts +3 -2
  406. package/src/plugins/builtin/earnings/format.ts +1 -5
  407. package/src/plugins/builtin/earnings/headless.ts +58 -6
  408. package/src/plugins/builtin/earnings/history-model.ts +15 -1
  409. package/src/plugins/builtin/earnings/history-table.ts +13 -2
  410. package/src/plugins/builtin/earnings/history.tsx +7 -3
  411. package/src/plugins/builtin/earnings-calls/data.ts +28 -7
  412. package/src/plugins/builtin/earnings-calls/headless.ts +3 -2
  413. package/src/plugins/builtin/earnings-calls/pane.tsx +10 -5
  414. package/src/plugins/builtin/econ/calendar-model.ts +42 -17
  415. package/src/plugins/builtin/econ/detail-view.tsx +2 -2
  416. package/src/plugins/builtin/econ/fred-catalog.ts +189 -0
  417. package/src/plugins/builtin/econ/fred-series-map.ts +0 -46
  418. package/src/plugins/builtin/econ/index.tsx +70 -22
  419. package/src/plugins/builtin/econ-statistics/defs.ts +5 -0
  420. package/src/plugins/builtin/econ-statistics/headless.ts +30 -5
  421. package/src/plugins/builtin/econ-statistics/pane.tsx +1 -1
  422. package/src/plugins/builtin/econ-statistics/stats.ts +1 -0
  423. package/src/plugins/builtin/econ-statistics/view.ts +17 -0
  424. package/src/plugins/builtin/equity-screener/pane.tsx +4 -11
  425. package/src/plugins/builtin/executives/data.ts +17 -6
  426. package/src/plugins/builtin/executives/pane.tsx +16 -7
  427. package/src/plugins/builtin/exposure/holdings.ts +1 -1
  428. package/src/plugins/builtin/exposure/pane.tsx +3 -1
  429. package/src/plugins/builtin/fear-greed/index.tsx +4 -0
  430. package/src/plugins/builtin/fear-greed/series.ts +52 -0
  431. package/src/plugins/builtin/filing-events/pane.tsx +22 -5
  432. package/src/plugins/builtin/futures/index.tsx +43 -3
  433. package/src/plugins/builtin/futures/model.ts +1 -1
  434. package/src/plugins/builtin/futures/returns.ts +1 -1
  435. package/src/plugins/builtin/futures/series.ts +13 -0
  436. package/src/plugins/builtin/futures/table.tsx +1 -1
  437. package/src/plugins/builtin/futures/use-front-returns.ts +1 -1
  438. package/src/plugins/builtin/futures-curve/client.ts +12 -3
  439. package/src/plugins/builtin/futures-curve/headless.ts +70 -9
  440. package/src/plugins/builtin/futures-curve/index.tsx +1 -1
  441. package/src/plugins/builtin/futures-curve/model.ts +66 -11
  442. package/src/plugins/builtin/futures-curve/pane.tsx +52 -18
  443. package/src/plugins/builtin/fx-matrix/index.tsx +22 -1
  444. package/src/plugins/builtin/fx-matrix/pairs.ts +1 -1
  445. package/src/plugins/builtin/fx-matrix/settings.ts +42 -2
  446. package/src/plugins/builtin/gpu/board.tsx +13 -10
  447. package/src/plugins/builtin/gpu/changes.tsx +4 -4
  448. package/src/plugins/builtin/gpu/client.ts +19 -1
  449. package/src/plugins/builtin/gpu/equities.tsx +14 -10
  450. package/src/plugins/builtin/gpu/headless.ts +64 -27
  451. package/src/plugins/builtin/gpu/history.tsx +3 -3
  452. package/src/plugins/builtin/gpu/index.tsx +2 -0
  453. package/src/plugins/builtin/gpu/model.ts +114 -20
  454. package/src/plugins/builtin/gpu/pane.tsx +28 -12
  455. package/src/plugins/builtin/gpu/series.ts +38 -0
  456. package/src/plugins/builtin/help/function-card.tsx +25 -6
  457. package/src/plugins/builtin/help/index.tsx +18 -8
  458. package/src/plugins/builtin/holders/beneficial-client.ts +29 -7
  459. package/src/plugins/builtin/holders/beneficial-model.ts +90 -3
  460. package/src/plugins/builtin/holders/beneficial-report.ts +57 -5
  461. package/src/plugins/builtin/holders/beneficial-view.tsx +62 -14
  462. package/src/plugins/builtin/holders/client.ts +22 -3
  463. package/src/plugins/builtin/holders/format.ts +18 -3
  464. package/src/plugins/builtin/holders/headless.ts +42 -134
  465. package/src/plugins/builtin/holders/pane.tsx +14 -4
  466. package/src/plugins/builtin/holders/report-header.ts +40 -5
  467. package/src/plugins/builtin/holders/report-rows.ts +240 -0
  468. package/src/plugins/builtin/insider/client.ts +35 -20
  469. package/src/plugins/builtin/insider/headless.ts +41 -11
  470. package/src/plugins/builtin/insider/index.tsx +27 -10
  471. package/src/plugins/builtin/insider/insider-data.ts +10 -0
  472. package/src/plugins/builtin/insider/issuer.ts +49 -0
  473. package/src/plugins/builtin/insider/model.ts +3 -0
  474. package/src/plugins/builtin/iv-history/charts.tsx +21 -7
  475. package/src/plugins/builtin/iv-history/client.ts +26 -6
  476. package/src/plugins/builtin/iv-history/format.ts +33 -2
  477. package/src/plugins/builtin/iv-history/headless.ts +27 -12
  478. package/src/plugins/builtin/iv-history/index.tsx +5 -3
  479. package/src/plugins/builtin/iv-history/model.ts +172 -20
  480. package/src/plugins/builtin/iv-history/pane.tsx +11 -3
  481. package/src/plugins/builtin/iv-history/screen-pane.tsx +45 -25
  482. package/src/plugins/builtin/iv-history/series.ts +29 -0
  483. package/src/plugins/builtin/jobs/headless.ts +28 -3
  484. package/src/plugins/builtin/jobs/index.tsx +3 -1
  485. package/src/plugins/builtin/jobs/pane.tsx +1 -1
  486. package/src/plugins/builtin/jobs/series.ts +19 -0
  487. package/src/plugins/builtin/kelly-sizer/headless.ts +149 -0
  488. package/src/plugins/builtin/kelly-sizer/history.ts +80 -0
  489. package/src/plugins/builtin/kelly-sizer/index.tsx +2 -0
  490. package/src/plugins/builtin/kelly-sizer/pane.tsx +111 -40
  491. package/src/plugins/builtin/kelly-sizer/portfolio.ts +0 -39
  492. package/src/plugins/builtin/kelly-sizer/sections.tsx +14 -0
  493. package/src/plugins/builtin/kelly-sizer/types.ts +9 -1
  494. package/src/plugins/builtin/layout-manager/index.tsx +9 -1
  495. package/src/plugins/builtin/macro-day/client.ts +68 -3
  496. package/src/plugins/builtin/macro-day/headless.ts +18 -12
  497. package/src/plugins/builtin/macro-day/index.tsx +3 -0
  498. package/src/plugins/builtin/macro-day/model.ts +66 -15
  499. package/src/plugins/builtin/macro-day/pane.tsx +34 -20
  500. package/src/plugins/builtin/macro-day/release-table.ts +40 -0
  501. package/src/plugins/builtin/macro-day/releases.ts +62 -44
  502. package/src/plugins/builtin/market-heatmap/data.ts +25 -5
  503. package/src/plugins/builtin/market-heatmap/evidence.ts +90 -0
  504. package/src/plugins/builtin/market-heatmap/index.tsx +144 -63
  505. package/src/plugins/builtin/market-heatmap/model.ts +102 -3
  506. package/src/plugins/builtin/market-heatmap/portfolio.ts +12 -2
  507. package/src/plugins/builtin/market-movers/client.ts +7 -5
  508. package/src/plugins/builtin/market-movers/headless.ts +31 -4
  509. package/src/plugins/builtin/market-movers/index.tsx +11 -3
  510. package/src/plugins/builtin/market-movers/model.ts +101 -17
  511. package/src/plugins/builtin/market-movers/screener.ts +31 -0
  512. package/src/plugins/builtin/market-movers/table.ts +50 -23
  513. package/src/plugins/builtin/market-valuation/chart-series.ts +29 -69
  514. package/src/plugins/builtin/market-valuation/index.tsx +3 -3
  515. package/src/plugins/builtin/market-valuation/indicators.ts +0 -5
  516. package/src/plugins/builtin/members/headless.ts +7 -2
  517. package/src/plugins/builtin/members/model.ts +31 -3
  518. package/src/plugins/builtin/members/pane.tsx +3 -6
  519. package/src/plugins/builtin/mna/headless.ts +15 -3
  520. package/src/plugins/builtin/money-markets/index.tsx +2 -0
  521. package/src/plugins/builtin/money-markets/series.ts +41 -0
  522. package/src/plugins/builtin/news/headless.ts +9 -2
  523. package/src/plugins/builtin/news/wire/news/footer.ts +10 -0
  524. package/src/plugins/builtin/notes/cli.ts +12 -7
  525. package/src/plugins/builtin/openfda/client.ts +1 -1
  526. package/src/plugins/builtin/options/carry.ts +95 -0
  527. package/src/plugins/builtin/options/index.tsx +58 -5
  528. package/src/plugins/builtin/options/strike-window.ts +183 -0
  529. package/src/plugins/builtin/options/table.ts +55 -3
  530. package/src/plugins/builtin/options/types.ts +8 -1
  531. package/src/plugins/builtin/options/view.tsx +162 -13
  532. package/src/plugins/builtin/options-calculator/inputs.ts +2 -1
  533. package/src/plugins/builtin/options-positioning/client.ts +7 -3
  534. package/src/plugins/builtin/options-positioning/headless.ts +5 -2
  535. package/src/plugins/builtin/options-positioning/pane.tsx +2 -2
  536. package/src/plugins/builtin/options-scenario/charts.tsx +2 -2
  537. package/src/plugins/builtin/options-scenario/client.ts +75 -18
  538. package/src/plugins/builtin/options-scenario/headless.ts +72 -24
  539. package/src/plugins/builtin/options-scenario/hedge.ts +285 -0
  540. package/src/plugins/builtin/options-scenario/index.tsx +9 -2
  541. package/src/plugins/builtin/options-scenario/model.ts +33 -0
  542. package/src/plugins/builtin/options-scenario/pane.tsx +40 -16
  543. package/src/plugins/builtin/pe-band/model.ts +2 -2
  544. package/src/plugins/builtin/pe-band/report-dates.ts +11 -7
  545. package/src/plugins/builtin/perps/client.ts +40 -6
  546. package/src/plugins/builtin/perps/equity-row.tsx +33 -8
  547. package/src/plugins/builtin/perps/freshness.ts +66 -0
  548. package/src/plugins/builtin/perps/headless.ts +45 -30
  549. package/src/plugins/builtin/perps/index.tsx +18 -1
  550. package/src/plugins/builtin/perps/model.ts +32 -6
  551. package/src/plugins/builtin/perps/pane.tsx +76 -20
  552. package/src/plugins/builtin/perps/series.ts +76 -0
  553. package/src/plugins/builtin/plugin-marketplace/model.ts +64 -21
  554. package/src/plugins/builtin/plugin-marketplace/packs.ts +118 -0
  555. package/src/plugins/builtin/plugin-marketplace/pane.tsx +357 -39
  556. package/src/plugins/builtin/plugin-marketplace/store.ts +7 -1
  557. package/src/plugins/builtin/plugin-module.ts +90 -4
  558. package/src/plugins/builtin/portfolio-list/account-metrics.ts +1 -1
  559. package/src/plugins/builtin/portfolio-list/cli/bulk-symbols.ts +273 -0
  560. package/src/plugins/builtin/portfolio-list/cli/import-13f.ts +109 -0
  561. package/src/plugins/builtin/portfolio-list/cli/portfolio-command.ts +400 -99
  562. package/src/plugins/builtin/portfolio-list/cli/render.ts +281 -43
  563. package/src/plugins/builtin/portfolio-list/cli/shared.ts +26 -16
  564. package/src/plugins/builtin/portfolio-list/cli/watchlist-command.ts +120 -47
  565. package/src/plugins/builtin/portfolio-list/column-values.ts +1 -1
  566. package/src/plugins/builtin/portfolio-list/grid.tsx +1 -1
  567. package/src/plugins/builtin/portfolio-list/headless.ts +70 -9
  568. package/src/plugins/builtin/portfolio-list/imported-from.ts +8 -0
  569. package/src/plugins/builtin/portfolio-list/live-valuation.ts +6 -2
  570. package/src/plugins/builtin/portfolio-list/pane/index.tsx +6 -1
  571. package/src/plugins/builtin/portfolio-list/quick-add/index.tsx +17 -1
  572. package/src/plugins/builtin/portfolio-list/summary/totals.ts +1 -1
  573. package/src/plugins/builtin/portfolio-list/table.tsx +7 -1
  574. package/src/plugins/builtin/power/client.ts +16 -0
  575. package/src/plugins/builtin/power/evidence.ts +6 -2
  576. package/src/plugins/builtin/power/headless.ts +71 -7
  577. package/src/plugins/builtin/power/index.tsx +4 -1
  578. package/src/plugins/builtin/power/model.ts +72 -1
  579. package/src/plugins/builtin/power/pane.tsx +32 -9
  580. package/src/plugins/builtin/rate-path/headless.ts +11 -3
  581. package/src/plugins/builtin/realized-vol/headless.ts +8 -0
  582. package/src/plugins/builtin/realized-vol/pane.tsx +1 -1
  583. package/src/plugins/builtin/research/corporate-actions-pane.tsx +7 -4
  584. package/src/plugins/builtin/research/equity-diagnostic-pane.tsx +1 -1
  585. package/src/plugins/builtin/research/event-model.ts +68 -24
  586. package/src/plugins/builtin/research/events-headless.ts +2 -1
  587. package/src/plugins/builtin/research/headless.ts +2 -1
  588. package/src/plugins/builtin/revenue-breakdown/client.ts +13 -6
  589. package/src/plugins/builtin/revenue-breakdown/headless.ts +4 -1
  590. package/src/plugins/builtin/revenue-breakdown/pane.tsx +7 -4
  591. package/src/plugins/builtin/reverse-dcf/headless.ts +5 -1
  592. package/src/plugins/builtin/reverse-dcf/pane.tsx +1 -1
  593. package/src/plugins/builtin/risk-factors/data.ts +23 -9
  594. package/src/plugins/builtin/risk-factors/headless.ts +5 -2
  595. package/src/plugins/builtin/risk-factors/pane.tsx +6 -5
  596. package/src/plugins/builtin/seasonality/client.ts +15 -7
  597. package/src/plugins/builtin/seasonality/headless.ts +36 -12
  598. package/src/plugins/builtin/seasonality/index.tsx +2 -2
  599. package/src/plugins/builtin/seasonality/model.ts +119 -0
  600. package/src/plugins/builtin/seasonality/pane.tsx +108 -37
  601. package/src/plugins/builtin/sec/index.tsx +5 -5
  602. package/src/plugins/builtin/sectors/client.ts +10 -2
  603. package/src/plugins/builtin/sectors/headless.ts +35 -6
  604. package/src/plugins/builtin/sectors/index.tsx +18 -1
  605. package/src/plugins/builtin/sectors/sector-model.ts +150 -41
  606. package/src/plugins/builtin/series-inventory.ts +91 -0
  607. package/src/plugins/builtin/shared/cloud-upgrade.ts +1 -1
  608. package/src/plugins/builtin/shared/command-tab.ts +69 -0
  609. package/src/plugins/builtin/shared/earnings-report.ts +55 -0
  610. package/src/plugins/builtin/shared/fred-points.ts +20 -0
  611. package/src/plugins/builtin/shared/fx-rate-freshness.ts +101 -0
  612. package/src/plugins/builtin/shared/headless-market-data.ts +33 -1
  613. package/src/plugins/builtin/shared/members-menu.tsx +4 -4
  614. package/src/plugins/builtin/shared/open-description.ts +29 -0
  615. package/src/plugins/builtin/shared/report-freshness.ts +59 -2
  616. package/src/plugins/builtin/shared/series-warning.ts +5 -0
  617. package/src/plugins/builtin/shared/ticker-request.ts +25 -1
  618. package/src/plugins/builtin/shared/use-quote-board.ts +25 -5
  619. package/src/plugins/builtin/shared/volatility/options.ts +1 -46
  620. package/src/plugins/builtin/short-interest/headless.ts +1 -0
  621. package/src/plugins/builtin/short-interest/index.tsx +21 -4
  622. package/src/plugins/builtin/short-interest/series.ts +36 -0
  623. package/src/plugins/builtin/short-interest/surface.tsx +4 -4
  624. package/src/plugins/builtin/short-interest/watch-headless.ts +1 -0
  625. package/src/plugins/builtin/short-interest/watch-model.ts +9 -5
  626. package/src/plugins/builtin/short-volume/headless.ts +1 -0
  627. package/src/plugins/builtin/short-volume/index.tsx +3 -10
  628. package/src/plugins/builtin/short-volume/series.ts +23 -0
  629. package/src/plugins/builtin/social-mentions/index.tsx +2 -0
  630. package/src/plugins/builtin/social-mentions/series.ts +23 -0
  631. package/src/plugins/builtin/supply-chain/graph-pane.tsx +3 -2
  632. package/src/plugins/builtin/supply-chain/model.ts +1 -1
  633. package/src/plugins/builtin/supply-chain/pane.tsx +3 -1
  634. package/src/plugins/builtin/thirteenf/api.ts +1 -0
  635. package/src/plugins/builtin/thirteenf/data.ts +6 -4
  636. package/src/plugins/builtin/thirteenf/headless.ts +217 -36
  637. package/src/plugins/builtin/thirteenf/model.ts +39 -1
  638. package/src/plugins/builtin/thirteenf/overlap.ts +75 -0
  639. package/src/plugins/builtin/thirteenf/pane.tsx +10 -1
  640. package/src/plugins/builtin/thirteenf/report-notes.ts +103 -1
  641. package/src/plugins/builtin/thirteenf/types.ts +2 -0
  642. package/src/plugins/builtin/ticker-detail/headless.ts +43 -21
  643. package/src/plugins/builtin/ticker-detail/index.tsx +3 -0
  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 +48 -4
  649. package/src/plugins/builtin/ticker-detail/pane.tsx +4 -5
  650. package/src/plugins/builtin/ticker-detail/quote-monitor/card.tsx +94 -6
  651. package/src/plugins/builtin/ticker-detail/quote-monitor/index.tsx +13 -3
  652. package/src/plugins/builtin/time-sales/headless.ts +1 -0
  653. package/src/plugins/builtin/treasury-auctions/cache.ts +5 -2
  654. package/src/plugins/builtin/treasury-auctions/client.ts +22 -8
  655. package/src/plugins/builtin/treasury-auctions/headless.ts +56 -6
  656. package/src/plugins/builtin/treasury-auctions/index.tsx +12 -9
  657. package/src/plugins/builtin/treasury-auctions/model.ts +205 -30
  658. package/src/plugins/builtin/treasury-auctions/pane.tsx +35 -11
  659. package/src/plugins/builtin/treasury-auctions/types.ts +11 -1
  660. package/src/plugins/builtin/vol-surface/charts.tsx +1 -3
  661. package/src/plugins/builtin/vol-surface/client.ts +6 -2
  662. package/src/plugins/builtin/vol-surface/evidence.ts +11 -6
  663. package/src/plugins/builtin/vol-surface/headless.ts +125 -20
  664. package/src/plugins/builtin/vol-surface/model.ts +23 -11
  665. package/src/plugins/builtin/vol-surface/pane.tsx +38 -27
  666. package/src/plugins/builtin/vol-surface/tables.ts +124 -0
  667. package/src/plugins/builtin/volatility/index.tsx +2 -0
  668. package/src/plugins/builtin/volatility/series.ts +84 -0
  669. package/src/plugins/builtin/world-indices/client.ts +22 -4
  670. package/src/plugins/builtin/world-indices/headless.ts +54 -27
  671. package/src/plugins/builtin/world-indices/model.ts +4 -2
  672. package/src/plugins/builtin/world-indices/table.tsx +13 -2
  673. package/src/plugins/builtin/world-venue-map/geo-series.ts +27 -2
  674. package/src/plugins/builtin/world-venue-map/headless.ts +4 -1
  675. package/src/plugins/builtin/world-venue-map/index.ts +3 -2
  676. package/src/plugins/builtin/world-venue-map/layered-pane.tsx +8 -4
  677. package/src/plugins/builtin/world-venue-map/layers.ts +29 -0
  678. package/src/plugins/builtin/yield-curve/chart.ts +2 -2
  679. package/src/plugins/builtin/yield-curve/curves.ts +21 -8
  680. package/src/plugins/builtin/yield-curve/headless.ts +71 -18
  681. package/src/plugins/builtin/yield-curve/index.tsx +4 -2
  682. package/src/plugins/builtin/yield-curve/series.ts +86 -0
  683. package/src/plugins/builtin-editorial.ts +126 -0
  684. package/src/plugins/catalog-backend.ts +16 -9
  685. package/src/plugins/catalog-browser.ts +129 -64
  686. package/src/plugins/catalog-manifest.ts +73 -40
  687. package/src/plugins/catalog-ui.ts +26 -6
  688. package/src/plugins/extracted-plugins.ts +7 -1
  689. package/src/plugins/ownership.ts +150 -7
  690. package/src/plugins/plugin-functions.ts +54 -0
  691. package/src/plugins/plugin-off.ts +36 -0
  692. package/src/plugins/registry/host-actions.ts +16 -0
  693. package/src/plugins/registry/index.ts +173 -28
  694. package/src/plugins/registry/plugin-state.ts +25 -1
  695. package/src/plugins/runtime/context.tsx +29 -0
  696. package/src/{plugins/builtin/portfolio-list → portfolio}/position-metrics.ts +6 -6
  697. package/src/portfolio/position-value.ts +40 -0
  698. package/src/public/__snapshots__/public-api.test.ts.snap +7 -0
  699. package/src/public/time-series.ts +17 -0
  700. package/src/react/auto-refresh.ts +13 -3
  701. package/src/react/input.ts +48 -1
  702. package/src/remote/app-host.tsx +25 -4
  703. package/src/remote/confirm-change.tsx +85 -0
  704. package/src/remote/controller-utils.ts +8 -1
  705. package/src/remote/controller.ts +126 -59
  706. package/src/remote/matching.ts +69 -0
  707. package/src/remote/pane-screenshot.ts +47 -0
  708. package/src/remote/schema.ts +63 -1
  709. package/src/remote/semantic-tree.tsx +14 -0
  710. package/src/remote/types.ts +32 -0
  711. package/src/remote/watchlist.ts +306 -0
  712. package/src/renderers/browser/main.tsx +3 -2
  713. package/src/renderers/cloudflare/worker.ts +1 -1
  714. package/src/renderers/dom/data-table/frozen-column.ts +3 -1
  715. package/src/renderers/dom/data-table/index.tsx +33 -6
  716. package/src/renderers/dom/data-table/row.tsx +27 -1
  717. package/src/renderers/dom/desktop/control-styles.ts +63 -1
  718. package/src/renderers/dom/desktop/controls.tsx +30 -23
  719. package/src/renderers/dom/desktop/dialog-actions.tsx +170 -0
  720. package/src/renderers/dom/desktop/icons.tsx +21 -0
  721. package/src/renderers/dom/desktop/query-bar.tsx +59 -32
  722. package/src/renderers/dom/dom-ui-host.tsx +3 -0
  723. package/src/renderers/dom/host/box.tsx +4 -1
  724. package/src/renderers/dom/host/chart-surface.tsx +6 -2
  725. package/src/renderers/dom/host/drag-shield.ts +17 -6
  726. package/src/renderers/dom/host/live-frame.ts +14 -2
  727. package/src/renderers/dom/host/overflow-fade.ts +14 -1
  728. package/src/renderers/dom/host/size-observer.ts +26 -0
  729. package/src/renderers/dom/host/surface-3d.tsx +7 -2
  730. package/src/renderers/dom/host/text.tsx +1 -1
  731. package/src/renderers/dom/input-host.tsx +6 -1
  732. package/src/renderers/dom/styles.css +74 -0
  733. package/src/renderers/electrobun/bun/desktop/backend.ts +5 -1
  734. package/src/renderers/electrobun/bun/desktop/detached-windows.ts +12 -1
  735. package/src/renderers/electrobun/bun/desktop/initialization.ts +2 -1
  736. package/src/renderers/electrobun/shared/protocol.ts +2 -0
  737. package/src/renderers/electrobun/view/cli-pane-shot-entry.tsx +18 -3
  738. package/src/renderers/electrobun/view/cli-pane-shot-frame.tsx +109 -5
  739. package/src/renderers/electrobun/view/cli-pane-shot-health.ts +10 -26
  740. package/src/renderers/electrobun/view/main.tsx +6 -1
  741. package/src/renderers/opentui/input-host.tsx +6 -1
  742. package/src/renderers/opentui/start.tsx +9 -0
  743. package/src/series/capability.ts +75 -0
  744. package/src/series/csv.ts +160 -0
  745. package/src/series/files.ts +107 -0
  746. package/src/series/registry.ts +198 -0
  747. package/src/series/resolve.ts +107 -0
  748. package/src/series/standalone.ts +48 -0
  749. package/src/series/types.ts +145 -0
  750. package/src/series/validate.ts +171 -0
  751. package/src/shares/portable-layout.ts +16 -6
  752. package/src/sources/gloomberb-cloud/index.ts +26 -17
  753. package/src/sources/gloomberb-cloud/normalizers.ts +5 -1
  754. package/src/sources/history-result.ts +1 -0
  755. package/src/sources/listing-symbols.ts +14 -5
  756. package/src/sources/provider-errors.ts +88 -3
  757. package/src/sources/provider-router/batches.ts +4 -1
  758. package/src/sources/provider-router/cache.ts +4 -2
  759. package/src/sources/provider-router/cached-routes.ts +9 -5
  760. package/src/sources/provider-router/financial-routes.ts +12 -5
  761. package/src/sources/provider-router/financials.ts +55 -15
  762. package/src/sources/provider-router/history.ts +68 -34
  763. package/src/sources/provider-router/index.ts +1 -1
  764. package/src/sources/provider-router/primary.ts +23 -5
  765. package/src/sources/provider-router/search.ts +1 -0
  766. package/src/sources/sec-edgar.ts +68 -8
  767. package/src/sync/core-contributors.ts +5 -3
  768. package/src/test-support/cli-context.ts +2 -1
  769. package/src/test-support/data-provider.ts +34 -0
  770. package/src/test-support/shell-pane-keys.tsx +1 -0
  771. package/src/theme/series-colors.ts +46 -0
  772. package/src/theme/themes.ts +149 -0
  773. package/src/tickers/company-name.ts +75 -0
  774. package/src/tickers/instrument-kind.ts +25 -0
  775. package/src/tickers/open-target.ts +3 -2
  776. package/src/tickers/search/index.ts +67 -9
  777. package/src/tickers/search/ranking.ts +78 -18
  778. package/src/tickers/search/types.ts +10 -2
  779. package/src/tickers/starter-symbols.ts +8 -0
  780. package/src/tickers/us-listing.ts +34 -0
  781. package/src/time-series/hooks.ts +9 -0
  782. package/src/time-series/resolve.ts +96 -30
  783. package/src/time-series/types.ts +4 -2
  784. package/src/time-series/use-chart-resolution.ts +32 -0
  785. package/src/types/config.ts +67 -1
  786. package/src/types/data-provider.ts +5 -0
  787. package/src/types/financials.ts +52 -1
  788. package/src/types/headless.ts +72 -0
  789. package/src/types/instrument.ts +8 -0
  790. package/src/types/plugin.ts +68 -3
  791. package/src/types/price-history.ts +7 -0
  792. package/src/types/ticker.ts +14 -0
  793. package/src/ui/host.tsx +26 -4
  794. package/src/ui/index.tsx +2 -0
  795. package/src/ui/live-resize.ts +81 -0
  796. package/src/ui/live-stretch.ts +121 -0
  797. package/src/ui/measured-cells.ts +58 -0
  798. package/src/ui/pane-fill.ts +11 -0
  799. package/src/utils/basis-points.ts +17 -0
  800. package/src/utils/cli-output.ts +21 -2
  801. package/src/utils/concurrency.ts +25 -0
  802. package/src/utils/crypto-pair.ts +20 -0
  803. package/src/utils/currency-pair.ts +19 -0
  804. package/src/utils/decimal-comma.ts +19 -0
  805. package/src/utils/dom-screenshot-css.ts +265 -0
  806. package/src/utils/dom-screenshot-rasters.ts +276 -0
  807. package/src/utils/dom-screenshot.ts +437 -52
  808. package/src/utils/exchange-rate-snapshot.ts +6 -2
  809. package/src/utils/exchanges.ts +120 -1
  810. package/src/utils/format.ts +17 -3
  811. package/src/utils/fundamentals.ts +66 -0
  812. package/src/utils/futures-generic.ts +6 -12
  813. package/src/utils/fx-market-hours.ts +44 -0
  814. package/src/utils/option-expiry.ts +126 -0
  815. package/src/utils/price-history.ts +130 -40
  816. package/src/utils/rpc-timeout-error.ts +6 -2
  817. package/src/utils/sec-eps-basis.ts +178 -36
  818. package/src/utils/sec.ts +98 -40
  819. package/src/utils/throttled-fetch.ts +51 -22
  820. package/src/utils/utc-time.ts +51 -4
@@ -77,9 +77,12 @@ import {
77
77
  resolveExchangeTimeZone,
78
78
  } from "../utils/exchanges";
79
79
  import { getPricePointTimestamp, isPriceHistoryStaleForCurrentWindow } from "../utils/price-history";
80
+ import { timeZoneLabel, zonedDateKey, zonedWallClockMs } from "../utils/zoned-date-time";
81
+ import { formatShortDate } from "../utils/datetime-format";
80
82
  import { latestSessionStart, latestTradingSessionOpen, listingTimeZone, priorSessionClose } from "../market-data/market/trading-sessions";
81
83
  import { futuresGenericCaption, futuresGenericListing, futuresGenericPriceBasis } from "../utils/futures-generic";
82
84
  import { isOhlcSeriesStyle } from "./spec";
85
+ import { SERIES_COLORS } from "../theme/series-colors";
83
86
  import type {
84
87
  ChartResolutionResult,
85
88
  ChartSeriesSpec,
@@ -88,20 +91,6 @@ import type {
88
91
  TimeSeriesPoint,
89
92
  } from "./types";
90
93
 
91
- /** Colours for series told apart by name (compared tickers, markets). */
92
- export const SERIES_COLORS = [
93
- "#4dabf7",
94
- "#63e6be",
95
- "#f6c85f",
96
- "#b197fc",
97
- "#ff8787",
98
- "#ffa94d",
99
- "#74c0fc",
100
- "#e599f7",
101
- "#8ce99a",
102
- "#ffd43b",
103
- ] as const;
104
-
105
94
  export interface ChartResolveSources {
106
95
  dataProvider: DataProvider | null;
107
96
  loadFredSeries: (request: FredSeriesRequest) => Promise<FredSeriesLoadResult>;
@@ -115,6 +104,11 @@ export interface ChartResolveSources {
115
104
  liveSince?: number;
116
105
  /** Capture the resolved inputs, including the calculation buffer, for an export. */
117
106
  onSecurityData?: (series: ChartSeriesSpec, data: TickerFinancials, includesHistory: boolean) => void;
107
+ /**
108
+ * How often, in milliseconds, a plugin-owned series is loaded again while
109
+ * it is charted; nothing for a series that keeps what it loaded.
110
+ */
111
+ capabilityRefreshMs?: (source: Extract<ChartSeriesSpec["source"], { kind: "capability" }>) => number | undefined;
118
112
  /** Provider-neutral boundary for plugin-owned chart series. */
119
113
  resolveCapabilitySeries?: (
120
114
  source: Extract<ChartSeriesSpec["source"], { kind: "capability" }>,
@@ -277,6 +271,24 @@ function instrumentLabel(spec: Extract<ChartSeriesSpec["source"], { kind: "secur
277
271
  return publicTickerKey(spec.instrument.symbol, spec.instrument.exchange);
278
272
  }
279
273
 
274
+ /**
275
+ * Shown while a current chart draws a saved copy that no refetch brought up
276
+ * to date: the last saved bar on the venue's clock, as the axis reads it.
277
+ */
278
+ function behindHistoryNotice(
279
+ source: Extract<ChartSeriesSpec["source"], { kind: "security" }>,
280
+ points: TickerFinancials["priceHistory"],
281
+ now: number,
282
+ ): string | null {
283
+ const latest = points.findLast((point) => Number.isFinite(point.close) && Number.isFinite(getPricePointTimestamp(point)));
284
+ if (!latest) return null;
285
+ const zone = listingTimeZone(source.instrument.symbol, source.instrument.exchange) ?? "UTC";
286
+ const wall = new Date(zonedWallClockMs(getPricePointTimestamp(latest), zone)).toISOString();
287
+ const sameYear = wall.slice(0, 4) === zonedDateKey(now, zone).slice(0, 4);
288
+ const day = formatShortDate(wall.slice(0, 10), { utc: true, year: sameYear ? false : "numeric" });
289
+ return `${instrumentLabel(source)}: newer bars are unavailable; showing saved bars as of ${day} ${wall.slice(11, 16)} ${timeZoneLabel(zone)}.`;
290
+ }
291
+
280
292
  // A series that fails to load keeps its place with no observations. Dropping it
281
293
  // made a series the user had added disappear from the legend while it still sat
282
294
  // in the series editor, with nothing on screen to explain the difference.
@@ -555,6 +567,25 @@ function followLatestMarketObservation(
555
567
  };
556
568
  }
557
569
 
570
+ /**
571
+ * A chart of capability series alone (CHOKE's vessel transits) ends at its
572
+ * newest observation, not today: such data is published days late, and an
573
+ * axis running on to today would read as days with nothing in them. The
574
+ * start stays where the range put it, so no empty span opens on the left.
575
+ */
576
+ function endAtNewestObservation(bounds: DateBounds, series: readonly ResolvedSeries[]): DateBounds {
577
+ if (bounds.end === null) return bounds;
578
+ let newest = Number.NEGATIVE_INFINITY;
579
+ for (const entry of series) {
580
+ for (const point of entry.points) {
581
+ const timestamp = point.date.getTime();
582
+ if (point.value !== null && Number.isFinite(timestamp) && timestamp > newest) newest = timestamp;
583
+ }
584
+ }
585
+ if (!Number.isFinite(newest) || newest >= bounds.end || (bounds.start !== null && newest <= bounds.start)) return bounds;
586
+ return { start: bounds.start, end: newest };
587
+ }
588
+
558
589
  /**
559
590
  * 1D shows the latest trading session of the chart's first market listing,
560
591
  * from its open to the newest bar, with the close before it as a reference.
@@ -1138,6 +1169,7 @@ function baseCapabilitySeries(
1138
1169
  axis: spec.axis === "right" ? "right" : spec.axis === "left" ? "left" : loaded.axis,
1139
1170
  panelId: spec.panelId,
1140
1171
  interpolation: spec.interpolation,
1172
+ observationKind: loaded.observationKind ?? "dataset",
1141
1173
  points,
1142
1174
  };
1143
1175
  }
@@ -1641,33 +1673,63 @@ async function resolveChartSpecPass(
1641
1673
  return next;
1642
1674
  };
1643
1675
  pending ??= acquire();
1644
- let loaded = await pending;
1676
+ let loaded: LoadedPriceHistory;
1677
+ try {
1678
+ loaded = await pending;
1679
+ } catch (error) {
1680
+ // Another series' refetch failed and put the saved copy back below.
1681
+ const restored = cache.priceHistoryByRequest.get(key);
1682
+ if (!restored || restored === pending) throw error;
1683
+ pending = restored;
1684
+ loaded = await pending;
1685
+ }
1645
1686
  const now = () => referenceNow.getTime() + Math.max(0, Date.now() - resolutionStartedAt);
1646
1687
  const currentWindow = () => !request.explicitWindow
1647
1688
  || (request.bounds.end !== null && now() - (request.bounds.end + 1) < 60 * 60_000);
1648
- const staleCurrent = (value: LoadedPriceHistory) => currentWindow() && !!value.session
1649
- && isPriceHistoryStaleForCurrentWindow(value.points, now(), {
1689
+ // A copy with a session record is judged here; any other says so itself,
1690
+ // when the router answered it from a saved copy short of the latest session.
1691
+ const staleCurrent = (value: LoadedPriceHistory) => currentWindow() && (value.savedCopyBehind === true
1692
+ || (!!value.session && isPriceHistoryStaleForCurrentWindow(value.points, now(), {
1650
1693
  symbol: source.instrument.symbol, exchange: source.instrument.exchange, session: value.session,
1651
1694
  ...(value.resolution ? { intervalMs: CHART_RESOLUTION_STEP_MS[value.resolution] } : {}),
1652
- });
1695
+ })));
1696
+ // A copy behind the current session is fetched again at most every 30 s.
1697
+ // Until a fetch answers a current one, the saved copy is drawn with a
1698
+ // notice, as every other history path does, rather than an error.
1699
+ let behind = false;
1653
1700
  if (staleCurrent(loaded)) {
1701
+ const saved = pending;
1702
+ const savedValue = loaded;
1703
+ const latest = cache.priceHistoryByRequest.get(key);
1704
+ let refresh: Promise<LoadedPriceHistory> | undefined;
1654
1705
  if (reused && (cache.priceHistoryRefreshAfter.get(key) ?? 0) <= Date.now()) {
1655
1706
  // Claim the refresh before awaiting it so price/volume/studies share one attempt.
1656
1707
  cache.priceHistoryRefreshAfter.set(key, Date.now() + 30_000);
1657
- if (cache.priceHistoryByRequest.get(key) === pending) pending = acquire();
1658
- else pending = cache.priceHistoryByRequest.get(key)!;
1659
- loaded = await pending;
1660
- } else if (cache.priceHistoryByRequest.get(key) !== pending) {
1661
- loaded = await cache.priceHistoryByRequest.get(key)!;
1708
+ refresh = latest && latest !== pending ? latest : acquire();
1709
+ } else if (latest && latest !== pending) {
1710
+ refresh = latest;
1711
+ }
1712
+ if (refresh) {
1713
+ const attempt = refresh;
1714
+ loaded = await attempt.catch(() => {
1715
+ // A failed refetch leaves the saved copy in place until the next one is due.
1716
+ if (cache.priceHistoryByRequest.get(key) === attempt) {
1717
+ cache.priceHistoryByRequest.set(key, saved);
1718
+ if (savedValue.expiresAt !== undefined) cache.priceHistoryExpiryByRequest.set(key, savedValue.expiresAt);
1719
+ else cache.priceHistoryExpiryByRequest.delete(key);
1720
+ }
1721
+ return savedValue;
1722
+ });
1662
1723
  }
1663
- if (staleCurrent(loaded)) {
1724
+ behind = staleCurrent(loaded);
1725
+ if (behind) {
1664
1726
  const previousDeadline = cache.priceHistoryRefreshAfter.get(key) ?? 0;
1665
- const retryAt = previousDeadline > Date.now() ? previousDeadline : Date.now() + 30_000;
1666
- cache.priceHistoryRefreshAfter.set(key, retryAt);
1667
- throw new PriceHistoryAcquisitionError(`Current price history is unavailable for ${instrumentLabel(source)}.`, retryAt);
1727
+ cache.priceHistoryRefreshAfter.set(key, previousDeadline > Date.now() ? previousDeadline : Date.now() + 30_000);
1728
+ const notice = behindHistoryNotice(source, loaded.points, now());
1729
+ if (notice) priorityWarnings.push(notice);
1668
1730
  }
1669
1731
  }
1670
- cache.priceHistoryRefreshAfter.delete(key);
1732
+ if (!behind) cache.priceHistoryRefreshAfter.delete(key);
1671
1733
  const history = loaded.points;
1672
1734
  const coverageNotice = historyCoverageNotice(loaded.coverageStart, request.visibleBounds.start);
1673
1735
  if (coverageNotice) priorityWarnings.push(coverageNotice);
@@ -1926,9 +1988,12 @@ async function resolveChartSpecPass(
1926
1988
  ? latestSessionView(primaryRaw, rawSeries.filter((entry) => entry.observationKind === "market"),
1927
1989
  extendedHistories.has(primaryRaw?.id ?? ""), quoteReferences.get(primaryRaw?.id ?? ""))
1928
1990
  : null;
1991
+ const capabilityOnly = spec.series.length > 0 && spec.series.every(({ source }) => source.kind === "capability");
1929
1992
  const bounds = hasExplicitWindow
1930
1993
  ? requestVisibleBounds
1931
- : sessionView?.bounds ?? followLatestMarketObservation(initialVisibleBounds, rawSeries);
1994
+ : sessionView?.bounds ?? (capabilityOnly
1995
+ ? endAtNewestObservation(initialVisibleBounds, rawSeries)
1996
+ : followLatestMarketObservation(initialVisibleBounds, rawSeries));
1932
1997
  if (sessionView?.priorClose != null && primaryRaw?.transform === "raw"
1933
1998
  && primaryRaw.unitGroup.startsWith("price") && primaryRaw.unitGroup !== "price:unknown") {
1934
1999
  const index = rawSeries.indexOf(primaryRaw);
@@ -2146,8 +2211,9 @@ export function reconcileChartTail(
2146
2211
  const refreshed = mergePriceHistoryWindows(loaded.points, points, tail.resolution);
2147
2212
  if (samePricePoints(refreshed, loaded.points)) return false;
2148
2213
  const acquisition = priceHistoryTailAcquisition(loaded, result);
2214
+ // The merged bars are as current as the newer acquisition says.
2149
2215
  cache.priceHistoryByRequest.set(key, Promise.resolve({ ...loaded, points: refreshed,
2150
- session: acquisition.session, sourceKey: acquisition.sourceKey }));
2216
+ session: acquisition.session, sourceKey: acquisition.sourceKey, savedCopyBehind: acquisition.savedCopyBehind }));
2151
2217
  if (accumulated) {
2152
2218
  const accumulatedAcquisition = priceHistoryTailAcquisition(accumulated, result);
2153
2219
  cache.accumulatedPriceHistory.set(tail.accumulationKey, { ...accumulated,
@@ -178,8 +178,10 @@ export interface ResolvedSeries {
178
178
  */
179
179
  listing?: { symbol: string; exchange: string };
180
180
  /** Price/volume observations and their derived studies, including 24/7
181
- * markets. Independent of whether the chart compresses exchange sessions. */
182
- observationKind?: "market";
181
+ * markets. Independent of whether the chart compresses exchange sessions.
182
+ * `dataset`: a capability's published observations (vessel transits),
183
+ * whose values the legend dates because they arrive days late. */
184
+ observationKind?: "market" | "dataset";
183
185
  /** Regular-session move supplied with the latest market quote. */
184
186
  latestChangePercent?: number;
185
187
  /** The previous session's close, set on a one-day chart's price series and drawn as its reference line. */
@@ -457,6 +457,38 @@ export function useChartResolution(
457
457
  };
458
458
  }, [coordinator, liveFrameMs, liveKey, sources]);
459
459
 
460
+ // A plugin series that changes through the day asks to be loaded again on
461
+ // its own cadence; only its entries leave the cache, so nothing else refetches.
462
+ const capabilityRefreshMs = sources.capabilityRefreshMs;
463
+ const seriesRefreshMs = useMemo(() => {
464
+ if (snapshot || !capabilityRefreshMs) return 0;
465
+ let shortest = 0;
466
+ for (const series of spec.series) {
467
+ if (series.source.kind !== "capability" || series.visible === false) continue;
468
+ const refreshMs = capabilityRefreshMs(series.source) ?? 0;
469
+ if (refreshMs > 0 && (shortest === 0 || refreshMs < shortest)) shortest = refreshMs;
470
+ }
471
+ return shortest;
472
+ // The spec key is the series' identity; a new spec object alone must not restart the timer.
473
+ }, [capabilityRefreshMs, snapshot, specKey]);
474
+ useEffect(() => {
475
+ if (!seriesRefreshMs || !paneVisible || !capabilityRefreshMs) return;
476
+ const timer = setInterval(() => {
477
+ const cache = resolveCacheRef.current;
478
+ let dropped = false;
479
+ for (const key of [...cache.capabilitySeriesByRequest.keys()]) {
480
+ const [, capabilityId, seriesId] = JSON.parse(key) as [string, string, string];
481
+ if (!capabilityRefreshMs({ kind: "capability", capabilityId, seriesId })) continue;
482
+ cache.capabilitySeriesByRequest.delete(key);
483
+ dropped = true;
484
+ }
485
+ if (!dropped) return;
486
+ cache.revision += 1;
487
+ setSupportRevision((current) => current + 1);
488
+ }, seriesRefreshMs);
489
+ return () => clearInterval(timer);
490
+ }, [capabilityRefreshMs, paneVisible, seriesRefreshMs]);
491
+
460
492
  useEffect(() => {
461
493
  if (snapshot) return;
462
494
  generationRef.current += 1;
@@ -2,7 +2,7 @@ import type { Portfolio, Watchlist } from "./ticker";
2
2
  import type { BrokerContractRef, TickerListingRef } from "./instrument";
3
3
  import type { LanguagePreference } from "../i18n/languages";
4
4
 
5
- export const CURRENT_CONFIG_VERSION = 24;
5
+ export const CURRENT_CONFIG_VERSION = 25;
6
6
 
7
7
  type ChartRendererPreference = "auto" | "kitty" | "braille";
8
8
 
@@ -59,6 +59,30 @@ export interface PanePlacementMemory {
59
59
  detached?: DetachedPlacementMemory;
60
60
  }
61
61
 
62
+ /**
63
+ * A ticker link Move to New Layout had to cut: the pane followed another one
64
+ * that stayed behind (or left with the moved pane) and was pinned on `symbol`.
65
+ * Move Back links it again while it is still pinned there.
66
+ */
67
+ export interface PaneMovedLink {
68
+ instanceId: string;
69
+ sourceInstanceId: string;
70
+ symbol: string;
71
+ /** The title before the pin renamed it ("OPX" for "OPX NVDA"), when it did. */
72
+ title?: string;
73
+ }
74
+
75
+ /** Where Move to New Layout took a pane from, so Move Back can return it. */
76
+ export interface PaneMovedFrom {
77
+ /** `SavedLayout.id` of the layout it left. */
78
+ layoutId: string;
79
+ /** Set when it was docked there: its place in the tree and its share of the split. */
80
+ docked?: DockedPlacementMemory & { ratio?: number };
81
+ /** Set when it was floating there. */
82
+ floating?: FloatingPlacementMemory;
83
+ links?: PaneMovedLink[];
84
+ }
85
+
62
86
  export interface PaneInstanceConfig {
63
87
  instanceId: string;
64
88
  paneId: string;
@@ -69,6 +93,8 @@ export interface PaneInstanceConfig {
69
93
  placementMemory?: PanePlacementMemory;
70
94
  /** Pinned by the user: the keyboard close shortcuts leave this pane alone. */
71
95
  locked?: boolean;
96
+ /** Set by Move to New Layout and cleared by Move Back; never published. */
97
+ movedFrom?: PaneMovedFrom;
72
98
  }
73
99
 
74
100
  interface DockPaneNode {
@@ -203,6 +229,21 @@ export interface TelemetryConfig {
203
229
  attention?: boolean;
204
230
  }
205
231
 
232
+ /**
233
+ * The one-time line in the terminal's status bar asking to star Gloomberb on
234
+ * GitHub. Absent means on and not shown yet. Kept on this machine only.
235
+ */
236
+ export interface StarPromptConfig {
237
+ /** `false` turns the line off; absent means on. */
238
+ enabled?: boolean;
239
+ /** Local days (`YYYY-MM-DD`) the terminal app was opened on, oldest first, until the line shows. */
240
+ days?: string[];
241
+ /** When the line showed. Once set it never shows again. */
242
+ shownAt?: string;
243
+ /** How it ended: the repository was opened, the line was dismissed, or it timed out. */
244
+ outcome?: "opened" | "dismissed" | "expired";
245
+ }
246
+
206
247
  /**
207
248
  * One recent command-bar run: `id` is `pane-template:<templateId>`, `label`
208
249
  * its name when it ran, and `arg` a ticker it ran with (never free text).
@@ -255,6 +296,18 @@ export interface AppConfig {
255
296
  /** Key overrides for this machine. Absent means every default applies. */
256
297
  keybindings?: KeybindingsConfig;
257
298
  telemetry?: TelemetryConfig;
299
+ starPrompt?: StarPromptConfig;
300
+ /**
301
+ * The IANA zone (`Asia/Tokyo`) the CLI and function reports show a local
302
+ * time in, beside every UTC time. Absent prints UTC alone. Trading-day dates
303
+ * are never shifted by it.
304
+ */
305
+ timezone?: string;
306
+ /**
307
+ * Presentation mode: the panes fill the window, without the header or the
308
+ * status bar, for a screen that is shown rather than worked at. Absent is off.
309
+ */
310
+ presentationMode?: boolean;
258
311
  }
259
312
 
260
313
  export const TICKER_RESEARCH_PANE_ID = "ticker-research";
@@ -582,6 +635,17 @@ export function clonePlacementMemory(memory: PanePlacementMemory | undefined): P
582
635
  };
583
636
  }
584
637
 
638
+ function clonePaneMovedFrom(movedFrom: PaneMovedFrom): PaneMovedFrom {
639
+ return {
640
+ layoutId: movedFrom.layoutId,
641
+ ...(movedFrom.docked ? {
642
+ docked: { ...movedFrom.docked, ...(movedFrom.docked.path ? { path: [...movedFrom.docked.path] } : {}) },
643
+ } : {}),
644
+ ...(movedFrom.floating ? { floating: { ...movedFrom.floating } } : {}),
645
+ ...(movedFrom.links ? { links: movedFrom.links.map((link) => ({ ...link })) } : {}),
646
+ };
647
+ }
648
+
585
649
  function cloneUnknownValue<T>(value: T): T {
586
650
  if (Array.isArray(value)) {
587
651
  return value.map((entry) => cloneUnknownValue(entry)) as T;
@@ -816,6 +880,7 @@ export function normalizePaneLayout(
816
880
  params: instance.params ? { ...instance.params } : undefined,
817
881
  settings: clonePaneSettings(instance.settings),
818
882
  placementMemory: clonePlacementMemory(instance.placementMemory),
883
+ ...(instance.movedFrom ? { movedFrom: clonePaneMovedFrom(instance.movedFrom) } : {}),
819
884
  })),
820
885
  floating: nextLayout.floating
821
886
  .filter((entry) => (
@@ -838,6 +903,7 @@ export function cloneLayout(layout: LayoutConfig): LayoutConfig {
838
903
  params: instance.params ? { ...instance.params } : undefined,
839
904
  settings: clonePaneSettings(instance.settings),
840
905
  placementMemory: clonePlacementMemory(instance.placementMemory),
906
+ ...(instance.movedFrom ? { movedFrom: clonePaneMovedFrom(instance.movedFrom) } : {}),
841
907
  })),
842
908
  floating: layout.floating.map((entry) => ({ ...entry })),
843
909
  detached: detached.map((entry) => ({ ...entry })),
@@ -138,6 +138,11 @@ export interface SearchRequestContext {
138
138
  * well under a second rather than given the batch budget.
139
139
  */
140
140
  interactive?: boolean;
141
+ /**
142
+ * Rows to ask a catalogue for. Every listing of a symbol several companies
143
+ * use (CAR: Avis, Carrefour, CAR Group) takes more than a keystroke's ten.
144
+ */
145
+ limit?: number;
141
146
  /**
142
147
  * Called when a later source improves the result the search already returned,
143
148
  * typically a broker adding contract detail to a symbol the cloud found
@@ -100,6 +100,14 @@ export interface Quote extends DepositaryReceiptFacts {
100
100
  postMarketPrice?: number;
101
101
  postMarketChange?: number;
102
102
  postMarketChangePercent?: number;
103
+ /**
104
+ * Whether the quote holds a trade from the pre-market or after-hours
105
+ * session in progress (marketState PRE or POST). False when nothing has
106
+ * traded in it yet: the extended fields, or the price, are then the regular
107
+ * price carried forward, and their flat move is no move. Absent in the other
108
+ * sessions and when the source does not say.
109
+ */
110
+ extendedSessionPrint?: boolean;
103
111
  bid?: number;
104
112
  ask?: number;
105
113
  bidSize?: number;
@@ -123,6 +131,26 @@ export interface QuoteContribution extends Quote {
123
131
 
124
132
  export type QuoteContributionMap = Record<string, QuoteContribution>;
125
133
 
134
+ /** How a fundamentals block's trailing figures were converted from the currency the company reports in. */
135
+ export interface TtmConversion {
136
+ /** The reporting currency the figures were converted from. */
137
+ from: string;
138
+ /** Units of `financialCurrency` per unit of `from` for revenue, income and cash flow; absent when not measured. */
139
+ rate?: number;
140
+ /** YYYY-MM-DD the converted figures were fetched. */
141
+ asOf?: string;
142
+ /** EPS is converted at the rate of each report date, so a P/E on it divides a spot price by EPS at older rates. */
143
+ eps?: "report_date";
144
+ }
145
+
146
+ /** How a trailing P/E converts the EPS it divides by, when that EPS is in another currency than the price. */
147
+ export interface TrailingPEConversion {
148
+ /** The currency of the trailing EPS. */
149
+ from: string;
150
+ /** Units of the quote's (major) currency per unit of `from`. */
151
+ rate: number;
152
+ }
153
+
126
154
  export interface Fundamentals extends DepositaryReceiptFacts {
127
155
  /** Every share count here is on this basis, the basis of the listing's price and market cap; absent when unproven. */
128
156
  shareBasis?: ShareBasis;
@@ -131,8 +159,14 @@ export interface Fundamentals extends DepositaryReceiptFacts {
131
159
  source?: "gloom";
132
160
  fetchedAt?: string;
133
161
  stale?: boolean;
134
- /** Currency of reported revenue, income, and cash flows; may differ from the listing. */
162
+ /** Currency of the trailing revenue, income, cash flows and EPS (EPS unless `epsCurrency` says otherwise); may differ from the listing and the statements. */
135
163
  financialCurrency?: string;
164
+ /** Set when the trailing figures were converted from the reporting currency into `financialCurrency`. */
165
+ ttmConversion?: TtmConversion;
166
+ /** Set when the trailing EPS is in another currency than `financialCurrency`: the listing's, converted from the reporting currency at each report date's rate. */
167
+ epsCurrency?: string;
168
+ /** Set when `trailingPE` divides the price by the trailing EPS converted from another currency. */
169
+ trailingPEConversion?: TrailingPEConversion;
136
170
  /** Provider-reported issuer market cap; marketCapCurrency identifies its units when known. */
137
171
  marketCap?: number;
138
172
  marketCapCurrency?: string;
@@ -302,6 +336,16 @@ export interface SplitAction {
302
336
  toFactor?: number;
303
337
  }
304
338
 
339
+ /**
340
+ * How a reported EPS relates to the company's statements: `gaap` is the
341
+ * quarter's diluted EPS as the statements report it; `adjusted` is the
342
+ * consensus-basis figure, which leaves out items the statements include.
343
+ */
344
+ export type EarningsEpsBasis = "gaap" | "adjusted";
345
+
346
+ /** A report that is out, a date the company announced, or a date projected from its past reports. */
347
+ export type EarningsDateStatus = "reported" | "confirmed" | "projected";
348
+
305
349
  export interface EarningsAction {
306
350
  date: string;
307
351
  dateType?: "announcement" | "fiscal-period-end";
@@ -311,6 +355,13 @@ export interface EarningsAction {
311
355
  epsActual?: number;
312
356
  difference?: number;
313
357
  surprisePercent?: number;
358
+ /** Fiscal quarter end month, YYYY-MM, when the report's quarter is known. */
359
+ fiscalPeriod?: string;
360
+ /** Analysts behind `epsEstimate`, when known. */
361
+ epsAnalysts?: number;
362
+ /** Null when the basis cannot be determined; absent from sources that do not say. */
363
+ epsBasis?: EarningsEpsBasis | null;
364
+ dateStatus?: EarningsDateStatus;
314
365
  }
315
366
 
316
367
  export interface CorporateActionsData {
@@ -51,6 +51,15 @@ export interface HeadlessPaneOptionDef {
51
51
  pluginId: string;
52
52
  key?: string;
53
53
  };
54
+ /** The value's name in the catalog's flag, `--expiration <YYYY-MM-DD|unix>`; the type when absent. */
55
+ placeholder?: string;
56
+ /** The option in use as typed after the function, such as `--expiration 2028-01-21`; the catalog shows it as an example. */
57
+ example?: string;
58
+ /**
59
+ * Checks a typed value and returns it as the pane reads it, in place of the
60
+ * type's own check; throws an Error that names what is wrong.
61
+ */
62
+ normalize?(value: string): string | number | boolean;
54
63
  }
55
64
 
56
65
  export interface HeadlessPaneLoadArgs {
@@ -90,8 +99,18 @@ export interface HeadlessPaneColumn {
90
99
  header: string;
91
100
  align?: "left" | "right" | "center";
92
101
  width?: number;
102
+ /** False keeps the column whole when the text table is fitted to a narrow width, so a time or an id is never cut. */
103
+ shrink?: boolean;
93
104
  description?: string;
94
105
  format?: (value: unknown, row: HeadlessPaneRow) => string;
106
+ /** What the text report prints when it can say more than an export should (a unit word beside a number); CSV and NDJSON keep `format`. */
107
+ textFormat?: (value: unknown, row: HeadlessPaneRow) => string;
108
+ /**
109
+ * The text report prints the value on its own lines under the row instead
110
+ * of in a column, for a footnote that belongs to that row; an empty value
111
+ * prints nothing. Exports keep it as a column.
112
+ */
113
+ underRow?: boolean;
95
114
  }
96
115
 
97
116
  export interface HeadlessPaneEntry {
@@ -142,6 +161,12 @@ export interface HeadlessPaneFreshness {
142
161
  delayMinutes?: number;
143
162
  /** What not-a-feed data is, in a few words: "filed data", "monthly release", "your inputs". */
144
163
  basis?: string;
164
+ /**
165
+ * How often the data is published, when its dates mark the start of a period
166
+ * (a monthly statistic is dated the 1st). The report then names the month,
167
+ * quarter or year, not a day it was never observed on.
168
+ */
169
+ periodicity?: "monthly" | "quarterly" | "annual";
145
170
  /** The newest observation is stale once it is older than this many minutes. */
146
171
  maxAgeMinutes?: number;
147
172
  /**
@@ -155,8 +180,44 @@ export interface HeadlessPaneFreshness {
155
180
  * completed session has passed after the newest (a day's lag is allowed).
156
181
  */
157
182
  cadence?: "daily";
183
+ /** The venue whose trading days a `daily` cadence counts instead, when the app knows its sessions. */
184
+ cadenceExchange?: string;
185
+ /**
186
+ * Whose trading day a dated (`YYYY-MM-DD`) as-of is, as a reader names the
187
+ * market: `US` for a US trading or business day. The report then reads
188
+ * `US trading day Fri 9 Oct 2026`, so a reader whose day is already Saturday
189
+ * does not take the US Friday for theirs. Leave it out when the dates are not
190
+ * one market's.
191
+ */
192
+ tradingDayMarket?: string;
158
193
  /** The newest observation is stale once this time (the next scheduled release) has passed by a day. */
159
194
  nextExpectedAt?: string | number | Date | null;
195
+ /**
196
+ * Observations of the world collected and published some days after they
197
+ * happen (vessel transits, job postings, rental prices, grid queues), not
198
+ * quotes. A screenshot then cites the source, the newest observation's date
199
+ * and its lag in days (`Source: Gloom Cloud · observed Sun 4 Oct · lag 6d`),
200
+ * never a market's session. Rows that are quotes keep the market line.
201
+ */
202
+ dataset?: boolean;
203
+ /**
204
+ * What a dataset's newest observation is, when its every line names it:
205
+ * `last trade` makes the `fn` footer, the pane footer and a screenshot read
206
+ * the same, `Source: DTCC · last trade 2026-10-09 · lag 2 days`, dated as
207
+ * the report's rows are, by ISO date.
208
+ */
209
+ observation?: string;
210
+ /**
211
+ * Each source's own newest observation, for data drawn from several venues
212
+ * polled apart (a perpetuals board). The line then dates every source and
213
+ * says how old the oldest of them is (`Binance 02:15 · Bybit 02:24 UTC ·
214
+ * oldest 9 min`), and `asOf` is the newest of them unless declared.
215
+ */
216
+ sources?: Array<{ source: string; asOf: string | number | Date }>;
217
+ /** Say how old the oldest observation is (`oldest 4 min`): rows polled apart from one source. */
218
+ oldestAge?: boolean;
219
+ /** What the figures are, said after the status: `funding = current estimate, pays 08:00 UTC`. */
220
+ note?: string;
160
221
  }
161
222
 
162
223
  interface HeadlessPaneResultBase {
@@ -182,6 +243,8 @@ interface HeadlessPaneResultBase {
182
243
  export interface HeadlessRowsResult extends HeadlessPaneResultBase {
183
244
  columns?: HeadlessPaneColumn[];
184
245
  rows: HeadlessPaneRow[];
246
+ /** What the report says when `rows` is empty, in place of "No data.": why there are none. */
247
+ empty?: string;
185
248
  }
186
249
 
187
250
  export type HeadlessBundleSection =
@@ -189,6 +252,8 @@ export type HeadlessBundleSection =
189
252
  title: string;
190
253
  columns?: HeadlessPaneColumn[];
191
254
  rows: HeadlessPaneRow[];
255
+ /** What the report says when `rows` is empty, in place of "No data.": why there are none, and what to run instead. */
256
+ empty?: string;
192
257
  entries?: never;
193
258
  }
194
259
  | {
@@ -255,6 +320,13 @@ export interface HeadlessPaneDefinition<Shape extends HeadlessPaneShape = Headle
255
320
  */
256
321
  description?: string;
257
322
  argument: HeadlessPaneArgumentDef;
323
+ /**
324
+ * The data covers US listings only, named as a sentence starts ("Time and
325
+ * sales"). `fn` and `shot` answer a listing abroad with that and the
326
+ * company's US listing instead of loading, so a symbol another company uses
327
+ * in the US never shows that company's numbers.
328
+ */
329
+ usListingsOnly?: string;
258
330
  options: HeadlessPaneOptionDef[];
259
331
  /** What is true of every load: its source, and whether it is a feed. */
260
332
  freshness?: HeadlessPaneFreshness;
@@ -59,4 +59,12 @@ export interface InstrumentSearchResult {
59
59
  /** How often the listing is searched, higher is more (the search service score,
60
60
  * sent by newer cloud servers). Only comparable within one response. */
61
61
  popularity?: number;
62
+ /** Trade names the row answers to ("Aramco" for Saudi Arabian Oil Co.), sent by
63
+ * newer cloud servers on a row a trade-name query added. The legal name does not
64
+ * contain them, so search matches the query against them too. */
65
+ searchAliases?: string[];
66
+ /** A theme the row answers to without its name saying so ("lithium" on
67
+ * Albemarle, which the lithium funds hold), sent by newer cloud servers on a
68
+ * row a theme query added. Matched like the name, ranked after name matches. */
69
+ searchKeywords?: string[];
62
70
  }