gloomberb 0.18.3 → 0.18.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 (1018) hide show
  1. package/README.md +8 -8
  2. package/README.zh-CN.md +11 -11
  3. package/bin/{gloomberb → gloom} +3 -1
  4. package/package.json +6 -2
  5. package/patches/electrobun@1.18.1.patch +32 -1
  6. package/src/account/auth-model.ts +7 -3
  7. package/src/account/checkout-handoff.tsx +225 -0
  8. package/src/account/device-signin-dialog.tsx +2 -2
  9. package/src/account/device-signin.ts +2 -2
  10. package/src/account/upgrade-dialog.tsx +1 -1
  11. package/src/api-client/askg.ts +2 -2
  12. package/src/api-client/auth.ts +11 -6
  13. package/src/api-client/catalysts.ts +2 -1
  14. package/src/api-client/central-bank-rates.ts +6 -0
  15. package/src/api-client/collections.ts +5 -1
  16. package/src/api-client/cot.ts +2 -0
  17. package/src/api-client/crypto-etf-flows.ts +37 -0
  18. package/src/api-client/crypto-markets.ts +60 -0
  19. package/src/api-client/data.ts +98 -5
  20. package/src/api-client/doe.ts +15 -0
  21. package/src/api-client/equity-screener.ts +28 -0
  22. package/src/api-client/exchange-announcements.ts +38 -0
  23. package/src/api-client/fund-facts.ts +39 -0
  24. package/src/api-client/futures-curve.ts +9 -1
  25. package/src/api-client/hiring.ts +301 -0
  26. package/src/api-client/index.ts +182 -16
  27. package/src/api-client/live-scan.ts +91 -0
  28. package/src/api-client/market-discovery.ts +14 -0
  29. package/src/api-client/members.ts +18 -0
  30. package/src/api-client/mna.ts +6 -0
  31. package/src/api-client/paths.ts +18 -1
  32. package/src/api-client/request.ts +224 -26
  33. package/src/api-client/research-activity.ts +3 -10
  34. package/src/api-client/short-side-publications.ts +37 -0
  35. package/src/api-client/socket.ts +64 -4
  36. package/src/api-client/swap-curve.ts +35 -0
  37. package/src/api-client/themes.ts +7 -1
  38. package/src/api-client/types.ts +96 -2
  39. package/src/app/keybindings/index.ts +3 -0
  40. package/src/app/keybindings/labels.ts +18 -1
  41. package/src/app/keybindings/resolve.ts +14 -0
  42. package/src/app/pane-runtime/plugin-bindings.ts +9 -2
  43. package/src/app/runtime/broker-import.ts +43 -26
  44. package/src/app/runtime/desktop-deeplink.ts +5 -5
  45. package/src/app/runtime/plugin-bindings.ts +2 -2
  46. package/src/app/runtime/startup.ts +13 -0
  47. package/src/app/star-prompt/status-line.tsx +2 -2
  48. package/src/architecture/core-builtin-allowlist.json +5 -2
  49. package/src/architecture/ui-literals-allowlist.json +3 -3
  50. package/src/architecture/ui-tokens-allowlist.json +1 -1
  51. package/src/brokers/broker-portfolio-sync.ts +37 -0
  52. package/src/brokers/directory.ts +11 -0
  53. package/src/brokers/logos.ts +3 -1
  54. package/src/brokers/signed-in/adapter.ts +304 -26
  55. package/src/brokers/signed-in/client.ts +14 -2
  56. package/src/brokers/signed-in/connect.ts +10 -2
  57. package/src/brokers/sync-broker-instance.ts +9 -1
  58. package/src/capabilities/chart-series.ts +22 -6
  59. package/src/cli/bank-section.ts +1 -1
  60. package/src/cli/base-converter.ts +23 -14
  61. package/src/cli/central-bank-events.ts +1 -1
  62. package/src/cli/command-options.ts +59 -4
  63. package/src/cli/commands/api.ts +9 -6
  64. package/src/cli/commands/broker.ts +2 -2
  65. package/src/cli/commands/command-utils.ts +2 -2
  66. package/src/cli/commands/crypto-hints.ts +7 -20
  67. package/src/cli/commands/fred-series.ts +9 -2
  68. package/src/cli/commands/keybindings.ts +25 -2
  69. package/src/cli/commands/market.ts +1177 -278
  70. package/src/cli/commands/news-hints.ts +2 -2
  71. package/src/cli/commands/news-search.ts +59 -6
  72. package/src/cli/commands/options-chain.ts +59 -3
  73. package/src/cli/commands/options-leaps.ts +41 -26
  74. package/src/cli/commands/overview.ts +222 -61
  75. package/src/cli/commands/plugins.ts +9 -9
  76. package/src/cli/commands/remote.ts +13 -10
  77. package/src/cli/commands/search.ts +82 -46
  78. package/src/cli/commands/system.ts +27 -19
  79. package/src/cli/commands/themes.ts +1 -1
  80. package/src/cli/commands/ticker.ts +194 -48
  81. package/src/cli/context.ts +3 -2
  82. package/src/cli/desktop-pane-shot-view.ts +2 -2
  83. package/src/cli/desktop-pane-shot.ts +1 -1
  84. package/src/cli/earnings-calendar.ts +4 -4
  85. package/src/cli/entry.ts +18 -1
  86. package/src/cli/errors.ts +21 -3
  87. package/src/cli/exit-codes.ts +1 -1
  88. package/src/cli/export-source.ts +38 -4
  89. package/src/cli/freshness.ts +2 -8
  90. package/src/cli/fx-forward.ts +130 -0
  91. package/src/cli/fx-pair.ts +10 -9
  92. package/src/cli/glossary.ts +113 -20
  93. package/src/cli/help.ts +19 -13
  94. package/src/cli/history-export.ts +126 -0
  95. package/src/cli/history-rows.ts +226 -50
  96. package/src/cli/index-roots.ts +5 -45
  97. package/src/cli/index.ts +24 -18
  98. package/src/cli/known-gaps.ts +123 -27
  99. package/src/cli/listing-arg.ts +316 -46
  100. package/src/cli/name-entries.ts +30 -18
  101. package/src/cli/native-smoke.ts +2 -0
  102. package/src/cli/not-a-ticker.ts +19 -9
  103. package/src/cli/opentui-libc.ts +5 -0
  104. package/src/cli/options.ts +12 -0
  105. package/src/cli/pane-functions/capabilities.ts +75 -20
  106. package/src/cli/pane-functions/catalog.ts +24 -23
  107. package/src/cli/pane-functions/discovery.ts +1 -1
  108. package/src/cli/pane-functions/dom.ts +10 -7
  109. package/src/cli/pane-functions/financial-ratio-shot.ts +2 -2
  110. package/src/cli/pane-functions/freshness.ts +193 -30
  111. package/src/cli/pane-functions/function-help.ts +76 -30
  112. package/src/cli/pane-functions/headless.ts +59 -12
  113. package/src/cli/pane-functions/index.ts +28 -19
  114. package/src/cli/pane-functions/market-session.ts +15 -5
  115. package/src/cli/pane-functions/options.ts +22 -2
  116. package/src/cli/pane-functions/report-notices.ts +12 -4
  117. package/src/cli/pane-functions/report.ts +10 -6
  118. package/src/cli/pane-functions/resolver.ts +64 -11
  119. package/src/cli/pane-functions/screenshot-assessment.ts +322 -0
  120. package/src/cli/pane-functions/screenshot-bridge.ts +152 -0
  121. package/src/cli/pane-functions/screenshot-chart-evidence.ts +396 -0
  122. package/src/cli/pane-functions/screenshot-data-evidence.ts +383 -0
  123. package/src/cli/pane-functions/screenshot-evidence.ts +1 -1
  124. package/src/cli/pane-functions/screenshot-payload.ts +453 -0
  125. package/src/cli/pane-functions/screenshot-render.ts +316 -0
  126. package/src/cli/pane-functions/screenshot-types.ts +162 -0
  127. package/src/cli/pane-functions/shot-options.ts +8 -3
  128. package/src/cli/peso-dollar-rates.ts +79 -0
  129. package/src/cli/quote-answer.ts +45 -4
  130. package/src/cli/report-tables.ts +75 -19
  131. package/src/cli/restore-plugins.ts +42 -15
  132. package/src/cli/result.ts +164 -23
  133. package/src/cli/series-search.ts +5 -5
  134. package/src/cli/statement-filings.ts +19 -0
  135. package/src/cli/suffixed-listing-rows.ts +49 -0
  136. package/src/cli/symbol-args.ts +50 -15
  137. package/src/cli/symbol-cells.ts +120 -0
  138. package/src/cli/symbol-list.ts +198 -68
  139. package/src/cli/symbol-rows.ts +131 -25
  140. package/src/cli/ticker-resolution.ts +108 -11
  141. package/src/cli/treasury-yields.ts +5 -5
  142. package/src/cli/types.ts +2 -0
  143. package/src/cli/uncovered-instrument.ts +3 -3
  144. package/src/cli/unknown-command.ts +6 -6
  145. package/src/components/chart/composite/chart-layout.ts +131 -0
  146. package/src/components/chart/composite/composite-chart.tsx +395 -20
  147. package/src/components/chart/composite/format.ts +27 -0
  148. package/src/components/chart/composite/interactions.ts +7 -2
  149. package/src/components/chart/composite/legend.tsx +75 -3
  150. package/src/components/chart/composite/levels.ts +7 -0
  151. package/src/components/chart/composite/panel-gestures.ts +41 -0
  152. package/src/components/chart/composite/panel-labels.ts +2 -1
  153. package/src/components/chart/composite/panel-series.ts +1 -0
  154. package/src/components/chart/composite/panel-surface.tsx +314 -13
  155. package/src/components/chart/composite/price-axis-labels.tsx +27 -3
  156. package/src/components/chart/composite/range-statistics.ts +62 -0
  157. package/src/components/chart/composite/rasterizer.ts +44 -19
  158. package/src/components/chart/composite/scene.ts +20 -4
  159. package/src/components/chart/composite/series-axis-tags.tsx +16 -9
  160. package/src/components/chart/composite/text-renderer.ts +48 -21
  161. package/src/components/chart/composite/toolbar.tsx +52 -5
  162. package/src/components/chart/composite/types.ts +17 -0
  163. package/src/components/chart/composite/use-composite-chart-keyboard.ts +120 -13
  164. package/src/components/chart/composite/use-composite-value-scales.ts +44 -0
  165. package/src/components/chart/composite/use-composite-viewport.ts +12 -3
  166. package/src/components/chart/composite/value-scale.ts +149 -0
  167. package/src/components/chart/composite/volume-profile-paint.ts +6 -3
  168. package/src/components/chart/core/pointer.ts +2 -0
  169. package/src/components/chart-table/index.ts +2 -0
  170. package/src/components/chart-table/read.tsx +74 -0
  171. package/src/components/command-bar/commands/collection-list.ts +41 -19
  172. package/src/components/command-bar/commands/collection.ts +9 -3
  173. package/src/components/command-bar/commands/direct/index.ts +1 -1
  174. package/src/components/command-bar/commands/direct/runtime.ts +3 -2
  175. package/src/components/command-bar/pane-templates/items.ts +59 -6
  176. package/src/components/command-bar/pane-templates/workflow.ts +10 -1
  177. package/src/components/command-bar/panel/prompt-binding.ts +0 -8
  178. package/src/components/command-bar/routes/root/plugin-install.ts +1 -1
  179. package/src/components/command-bar/routes/root/provider-search.ts +42 -11
  180. package/src/components/command-bar/routes/root/results.ts +18 -4
  181. package/src/components/command-bar/routes/root/runtime.ts +15 -3
  182. package/src/components/command-bar/routes/root/search-providers.ts +25 -2
  183. package/src/components/command-bar/routes/root/selection.ts +6 -1
  184. package/src/components/command-bar/routes/root/shortcut-feedback.ts +4 -1
  185. package/src/components/command-bar/routes/root/shortcuts.ts +30 -3
  186. package/src/components/command-bar/routes/ticker-search/results.ts +73 -4
  187. package/src/components/command-bar/selection-runtime.ts +50 -10
  188. package/src/components/command-bar/surface/index.tsx +24 -2
  189. package/src/components/command-bar/view-model.ts +7 -0
  190. package/src/components/command-bar/workflow/alert.ts +1 -1
  191. package/src/components/command-bar/workflow/broker.ts +2 -2
  192. package/src/components/command-bar/workflow/collection-actions.ts +46 -7
  193. package/src/components/command-bar/workflow/collection-ticker.ts +32 -4
  194. package/src/components/command-bar/workflow/fields.ts +8 -2
  195. package/src/components/command-bar/workflow/ops.ts +18 -4
  196. package/src/components/command-bar/workflow/portfolio-position.ts +53 -4
  197. package/src/components/command-bar/workflow/submit.ts +3 -2
  198. package/src/components/command-bar/workflow/tickers.ts +5 -1
  199. package/src/components/company-logo.tsx +39 -0
  200. package/src/components/data-table/sections.ts +4 -2
  201. package/src/components/form-modal/confirm.tsx +2 -1
  202. package/src/components/form-modal/request.ts +5 -0
  203. package/src/components/form-modal/routes.ts +4 -1
  204. package/src/components/index.ts +12 -6
  205. package/src/components/layout/header.tsx +33 -46
  206. package/src/components/layout/market-summary.ts +9 -6
  207. package/src/components/layout/pane/capture-status.ts +1 -1
  208. package/src/components/layout/pane/footer/index.tsx +1 -0
  209. package/src/components/layout/pane/footer/model.ts +38 -5
  210. package/src/components/layout/shell/chrome.ts +19 -6
  211. package/src/components/layout/shell/index.tsx +2 -1
  212. package/src/components/layout/shell/pane/layers.tsx +19 -1
  213. package/src/components/layout/status-bar.tsx +2 -2
  214. package/src/components/market-board/index.tsx +11 -3
  215. package/src/components/onboarding/onboarding-frame.tsx +1 -1
  216. package/src/components/onboarding/onboarding-wizard.tsx +1 -0
  217. package/src/components/onboarding/portfolio-step/broker-setup-panel.tsx +2 -2
  218. package/src/components/onboarding/portfolio-step/positions-panel.tsx +2 -2
  219. package/src/components/onboarding/wizard-broker-sync.ts +4 -1
  220. package/src/components/pane-settings-dialog/desktop.tsx +20 -7
  221. package/src/components/pane-settings-dialog/tui.tsx +17 -9
  222. package/src/components/pane-settings-dialog/value.ts +8 -1
  223. package/src/components/pane-settings-dialog.tsx +44 -13
  224. package/src/components/sign-in-code-panel.tsx +27 -19
  225. package/src/components/ui/column-grid.tsx +48 -4
  226. package/src/components/ui/country-flag-art.tsx +180 -0
  227. package/src/components/ui/country-flag.tsx +118 -12
  228. package/src/components/ui/data-table/opentui/index.tsx +61 -2
  229. package/src/components/ui/data-table/opentui/model.ts +109 -2
  230. package/src/components/ui/data-table/types.ts +1 -1
  231. package/src/components/ui/display.tsx +10 -2
  232. package/src/components/ui/index.ts +3 -1
  233. package/src/components/ui/logo-mark.tsx +11 -2
  234. package/src/components/ui/query-bar.tsx +1 -1
  235. package/src/components/ui/row-notes.ts +79 -0
  236. package/src/core/state/app/layout.ts +6 -4
  237. package/src/core/state/app/state.ts +9 -0
  238. package/src/core/state/app/types.ts +3 -0
  239. package/src/data/cached-query.ts +8 -1
  240. package/src/data/config/chart-settings.ts +3 -3
  241. package/src/data/config/home.ts +10 -2
  242. package/src/data/config/layout.ts +4 -1
  243. package/src/data/config/store/node.ts +4 -0
  244. package/src/data/config/store/normalize.ts +13 -3
  245. package/src/data/config/store/portfolio-as-of-column.ts +2 -2
  246. package/src/data/json-storage.ts +2 -0
  247. package/src/data/saved-copies.ts +123 -0
  248. package/src/docs/snapshot.json +422 -112
  249. package/src/i18n/es.ts +30 -13
  250. package/src/i18n/ja.ts +30 -13
  251. package/src/i18n/ko.ts +30 -13
  252. package/src/i18n/zh-cn.ts +30 -13
  253. package/src/i18n/zh-tw.ts +30 -13
  254. package/src/layout/desks.ts +1 -1
  255. package/src/layout/launch-layout.ts +1 -1
  256. package/src/layout/pane-manager/floating-actions.ts +5 -3
  257. package/src/layout/pane-manager/floating.ts +43 -1
  258. package/src/layout/pane-manager/index.ts +2 -0
  259. package/src/layout/selected-ticker.ts +74 -0
  260. package/src/market-data/coordinator/financials.ts +10 -2
  261. package/src/market-data/coordinator/index.ts +3 -1
  262. package/src/market-data/coordinator/quotes.ts +4 -2
  263. package/src/market-data/depositary-pair.ts +251 -0
  264. package/src/market-data/futures-board.ts +1 -1
  265. package/src/market-data/futures-contract.ts +124 -40
  266. package/src/market-data/fx-closes.ts +17 -2
  267. package/src/market-data/hooks.tsx +19 -11
  268. package/src/market-data/market/change-basis.ts +81 -11
  269. package/src/market-data/market/dated-previous-close.ts +203 -0
  270. package/src/market-data/market/freshness.ts +34 -5
  271. package/src/market-data/market/futures-week.ts +68 -0
  272. package/src/market-data/market/period-return.ts +163 -0
  273. package/src/market-data/market/status.ts +16 -4
  274. package/src/market-data/market/trading-sessions.ts +13 -0
  275. package/src/market-data/market/year-to-date.ts +8 -13
  276. package/src/market-data/options-alternatives.ts +60 -0
  277. package/src/market-data/performance.ts +20 -14
  278. package/src/market-data/perpetual-premium.ts +32 -0
  279. package/src/market-data/published-apac-sessions.ts +2 -1
  280. package/src/market-data/published-futures-sessions.ts +69 -0
  281. package/src/market-data/quotes/contributions.ts +25 -3
  282. package/src/market-data/quotes/freshness.ts +42 -0
  283. package/src/market-data/quotes/intraday-bar.ts +37 -0
  284. package/src/market-data/quotes/regular-session-valuation.ts +13 -8
  285. package/src/market-data/quotes/resolution.ts +7 -2
  286. package/src/market-data/selectors.ts +3 -0
  287. package/src/market-data/tax-equivalent.ts +1 -1
  288. package/src/market-data/ticker-price-returns.ts +3 -1
  289. package/src/news/aggregator.ts +5 -1
  290. package/src/news/news-model.ts +4 -0
  291. package/src/news/types.ts +11 -0
  292. package/src/notifications/app-notifier.ts +1 -1
  293. package/src/notifications/notification-log.ts +6 -4
  294. package/src/plugins/auto-update.ts +2 -2
  295. package/src/plugins/builtin/account-management/index.tsx +1 -0
  296. package/src/plugins/builtin/account-management/pane.tsx +9 -8
  297. package/src/plugins/builtin/alerts/alert-engine.ts +34 -20
  298. package/src/plugins/builtin/alerts/calendar-events.ts +429 -0
  299. package/src/plugins/builtin/alerts/cli.ts +533 -85
  300. package/src/plugins/builtin/alerts/command.ts +12 -10
  301. package/src/plugins/builtin/alerts/constants.ts +1 -1
  302. package/src/plugins/builtin/alerts/event-rows.ts +9 -5
  303. package/src/plugins/builtin/alerts/events-pane.tsx +71 -56
  304. package/src/plugins/builtin/alerts/events.ts +107 -5
  305. package/src/plugins/builtin/alerts/fired-log.ts +119 -0
  306. package/src/plugins/builtin/alerts/format.ts +10 -3
  307. package/src/plugins/builtin/alerts/headless.ts +107 -41
  308. package/src/plugins/builtin/alerts/history-pane.tsx +105 -62
  309. package/src/plugins/builtin/alerts/history-rows.ts +92 -0
  310. package/src/plugins/builtin/alerts/history.ts +2 -0
  311. package/src/plugins/builtin/alerts/index.tsx +107 -30
  312. package/src/plugins/builtin/alerts/iv-level.ts +365 -0
  313. package/src/plugins/builtin/alerts/levels.ts +3 -3
  314. package/src/plugins/builtin/alerts/live.ts +3 -3
  315. package/src/plugins/builtin/alerts/metric-command.ts +61 -0
  316. package/src/plugins/builtin/alerts/metric-data.ts +70 -0
  317. package/src/plugins/builtin/alerts/metric-model.ts +175 -0
  318. package/src/plugins/builtin/alerts/metric-parity-fixture.json +725 -0
  319. package/src/plugins/builtin/alerts/pane.tsx +130 -49
  320. package/src/plugins/builtin/alerts/price.ts +35 -0
  321. package/src/plugins/builtin/alerts/quotes.ts +24 -0
  322. package/src/plugins/builtin/alerts/research-builder.ts +84 -11
  323. package/src/plugins/builtin/alerts/research-rules.ts +76 -3
  324. package/src/plugins/builtin/alerts/scheduled-check.ts +206 -32
  325. package/src/plugins/builtin/alerts/scheduled-sources.ts +26 -3
  326. package/src/plugins/builtin/alerts/scheduled.ts +188 -29
  327. package/src/plugins/builtin/alerts/storage.ts +38 -12
  328. package/src/plugins/builtin/alerts/targets.ts +12 -3
  329. package/src/plugins/builtin/alerts/types.ts +3 -0
  330. package/src/plugins/builtin/analytics/index.tsx +8 -2
  331. package/src/plugins/builtin/analytics/metrics.ts +1 -1
  332. package/src/plugins/builtin/analytics/risk-book.ts +215 -0
  333. package/src/plugins/builtin/analytics/risk-client.ts +13 -6
  334. package/src/plugins/builtin/analytics/risk-headless.ts +55 -21
  335. package/src/plugins/builtin/analytics/risk-math.ts +6 -3
  336. package/src/plugins/builtin/analytics/risk-model.ts +297 -104
  337. package/src/plugins/builtin/analytics/risk-options.ts +17 -2
  338. package/src/plugins/builtin/analytics/risk-pane.tsx +97 -36
  339. package/src/plugins/builtin/attention/pane.tsx +6 -2
  340. package/src/plugins/builtin/awards/headless.ts +7 -3
  341. package/src/plugins/builtin/awards/model.ts +18 -0
  342. package/src/plugins/builtin/awards/pane.tsx +6 -3
  343. package/src/plugins/builtin/backtest/headless.ts +13 -8
  344. package/src/plugins/builtin/backtest/pane.tsx +9 -4
  345. package/src/plugins/builtin/backtest/presets.ts +29 -3
  346. package/src/plugins/builtin/backtest/rules.ts +41 -5
  347. package/src/plugins/builtin/broker-manager/add-flow.tsx +12 -7
  348. package/src/plugins/builtin/broker-manager/detail.tsx +47 -19
  349. package/src/plugins/builtin/broker-manager/footer.ts +27 -11
  350. package/src/plugins/builtin/broker-manager/index.tsx +24 -14
  351. package/src/plugins/builtin/broker-manager/keyboard.ts +1 -1
  352. package/src/plugins/builtin/broker-manager/model.ts +18 -3
  353. package/src/plugins/builtin/broker-manager/pane-actions.tsx +183 -57
  354. package/src/plugins/builtin/broker-manager/table.ts +28 -12
  355. package/src/plugins/builtin/broker-trading/account-picker.tsx +2 -1
  356. package/src/plugins/builtin/broker-trading/chart-levels.ts +82 -13
  357. package/src/plugins/builtin/broker-trading/controller.ts +66 -24
  358. package/src/plugins/builtin/broker-trading/dock.tsx +22 -4
  359. package/src/plugins/builtin/broker-trading/headless.ts +2 -1
  360. package/src/plugins/builtin/broker-trading/index.tsx +19 -1
  361. package/src/plugins/builtin/broker-trading/linked-orders.ts +148 -0
  362. package/src/plugins/builtin/broker-trading/order-feed.ts +83 -10
  363. package/src/plugins/builtin/broker-trading/orders.tsx +109 -31
  364. package/src/plugins/builtin/broker-trading/overview-orders.tsx +9 -3
  365. package/src/plugins/builtin/broker-trading/pane-model.ts +30 -2
  366. package/src/plugins/builtin/broker-trading/pane.tsx +111 -24
  367. package/src/plugins/builtin/broker-trading/ticket-parts.tsx +36 -7
  368. package/src/plugins/builtin/broker-trading/ticket.tsx +112 -31
  369. package/src/plugins/builtin/buildout/cells.tsx +4 -0
  370. package/src/plugins/builtin/buildout/detail/index.tsx +5 -1
  371. package/src/plugins/builtin/buildout/detail/ui.tsx +7 -4
  372. package/src/plugins/builtin/buildout/pane/index.tsx +25 -12
  373. package/src/plugins/builtin/buildout/pane/status.tsx +0 -4
  374. package/src/plugins/builtin/builtin-plugin-meta.ts +2 -2
  375. package/src/plugins/builtin/catalysts/detail.tsx +3 -2
  376. package/src/plugins/builtin/catalysts/index.tsx +1 -1
  377. package/src/plugins/builtin/catalysts/model.ts +51 -5
  378. package/src/plugins/builtin/catalysts/pane.tsx +6 -8
  379. package/src/plugins/builtin/central-bank-rates/client.ts +5 -0
  380. package/src/plugins/builtin/central-bank-rates/headless.ts +36 -10
  381. package/src/plugins/builtin/central-bank-rates/model.ts +33 -8
  382. package/src/plugins/builtin/changelog/index.tsx +1 -0
  383. package/src/plugins/builtin/chart-composer/catalog-inventory.ts +4 -1
  384. package/src/plugins/builtin/chart-composer/chart-spec-edit.ts +3 -2
  385. package/src/plugins/builtin/chart-composer/chart-spec.ts +7 -0
  386. package/src/plugins/builtin/chart-composer/cli-options.ts +7 -10
  387. package/src/plugins/builtin/chart-composer/data-catalog-pane.tsx +7 -3
  388. package/src/plugins/builtin/chart-composer/editor/controller.ts +4 -0
  389. package/src/plugins/builtin/chart-composer/editor/model.ts +2 -0
  390. package/src/plugins/builtin/chart-composer/editor.tsx +9 -4
  391. package/src/plugins/builtin/chart-composer/formula.ts +71 -18
  392. package/src/plugins/builtin/chart-composer/headless-schema.ts +42 -29
  393. package/src/plugins/builtin/chart-composer/headless.ts +266 -37
  394. package/src/plugins/builtin/chart-composer/index.tsx +12 -2
  395. package/src/plugins/builtin/chart-composer/leverage-overlay.ts +142 -0
  396. package/src/plugins/builtin/chart-composer/pane.tsx +144 -30
  397. package/src/plugins/builtin/chart-composer/presets.ts +50 -15
  398. package/src/plugins/builtin/chart-composer/quick-add.tsx +40 -25
  399. package/src/plugins/builtin/chart-composer/series-catalog.ts +1 -0
  400. package/src/plugins/builtin/chart-composer/series-expression.ts +65 -6
  401. package/src/plugins/builtin/chart-composer/session-history.ts +31 -28
  402. package/src/plugins/builtin/chart-composer/session-range.ts +4 -2
  403. package/src/plugins/builtin/chart-composer/settings.ts +31 -19
  404. package/src/plugins/builtin/chart-composer/use-series-catalog.ts +44 -31
  405. package/src/plugins/builtin/chart-composer/viewport-labels.ts +18 -8
  406. package/src/plugins/builtin/chat/attachments/model.ts +3 -1
  407. package/src/plugins/builtin/chat/content/command-suggestions.ts +92 -0
  408. package/src/plugins/builtin/chat/content/composer.tsx +13 -6
  409. package/src/plugins/builtin/chat/content/footer.tsx +6 -3
  410. package/src/plugins/builtin/chat/content/index.tsx +51 -22
  411. package/src/plugins/builtin/chat/content/open-targets.ts +14 -3
  412. package/src/plugins/builtin/chat/controller/session-runtime.ts +4 -2
  413. package/src/plugins/builtin/chat/index.tsx +23 -0
  414. package/src/plugins/builtin/chat/message/desktop.tsx +1 -0
  415. package/src/plugins/builtin/chat/message/inline-tokens.tsx +23 -0
  416. package/src/plugins/builtin/chat/message/pane-chip.tsx +50 -20
  417. package/src/plugins/builtin/chat/pane-links/commands.ts +265 -0
  418. package/src/plugins/builtin/chat/pane-links/model.ts +12 -3
  419. package/src/plugins/builtin/chat/pane-links/open.ts +9 -2
  420. package/src/plugins/builtin/chat/people.ts +1 -1
  421. package/src/plugins/builtin/chat/unread-inbox-pane.tsx +10 -1
  422. package/src/plugins/builtin/clinical-trials/client.ts +5 -2
  423. package/src/plugins/builtin/clinical-trials/model.ts +13 -4
  424. package/src/plugins/builtin/clinical-trials/pane.tsx +32 -12
  425. package/src/plugins/builtin/clinical-trials/ticker-sponsor.ts +17 -0
  426. package/src/plugins/builtin/cloud/askg/controller.ts +1 -1
  427. package/src/plugins/builtin/cloud/askg/lock-note.ts +1 -1
  428. package/src/plugins/builtin/cloud/askg/tool-display.ts +1 -1
  429. package/src/plugins/builtin/cloud/auth-commands.ts +3 -3
  430. package/src/plugins/builtin/cloud/plugin.tsx +1 -1
  431. package/src/plugins/builtin/cloud/team/pane-sections.tsx +105 -47
  432. package/src/plugins/builtin/cloud/team/pane-ui.tsx +42 -4
  433. package/src/plugins/builtin/cloud/team/pane.tsx +204 -64
  434. package/src/plugins/builtin/cloud/thesis/store.ts +45 -22
  435. package/src/plugins/builtin/cloud-tweets/registration.ts +1 -0
  436. package/src/plugins/builtin/commodities-energy/index.tsx +29 -2
  437. package/src/plugins/builtin/commodities-energy/view-state.ts +2 -0
  438. package/src/plugins/builtin/commodity-balances/pane.tsx +11 -4
  439. package/src/plugins/builtin/company-attention/app-rank.tsx +7 -5
  440. package/src/plugins/builtin/company-attention/building-model.ts +222 -0
  441. package/src/plugins/builtin/company-attention/building.tsx +172 -0
  442. package/src/plugins/builtin/company-attention/client.ts +117 -1
  443. package/src/plugins/builtin/company-attention/evidence.ts +16 -3
  444. package/src/plugins/builtin/company-attention/headless.ts +101 -5
  445. package/src/plugins/builtin/company-attention/index.tsx +6 -3
  446. package/src/plugins/builtin/company-attention/model.ts +33 -7
  447. package/src/plugins/builtin/company-attention/moves-model.ts +253 -0
  448. package/src/plugins/builtin/company-attention/moves.tsx +159 -0
  449. package/src/plugins/builtin/company-attention/pane.tsx +79 -23
  450. package/src/plugins/builtin/company-attention/signals-model.ts +229 -0
  451. package/src/plugins/builtin/company-attention/signals.tsx +160 -0
  452. package/src/plugins/builtin/company-kpis/headless.ts +3 -2
  453. package/src/plugins/builtin/company-kpis/model.ts +2 -2
  454. package/src/plugins/builtin/company-kpis/pane.tsx +1 -1
  455. package/src/plugins/builtin/composite-plugins.ts +2 -1
  456. package/src/plugins/builtin/congress-trades/headless.ts +1 -1
  457. package/src/plugins/builtin/connections/index.ts +1 -0
  458. package/src/plugins/builtin/correlation/headless-schema.ts +3 -2
  459. package/src/plugins/builtin/correlation/headless.ts +5 -3
  460. package/src/plugins/builtin/cot/headless.ts +28 -6
  461. package/src/plugins/builtin/cot/model.ts +12 -0
  462. package/src/plugins/builtin/cot/pane.tsx +3 -2
  463. package/src/plugins/builtin/cpi/headless.ts +5 -1
  464. package/src/plugins/builtin/cpi/pane.tsx +11 -9
  465. package/src/plugins/builtin/credit-boards/model.ts +2 -0
  466. package/src/plugins/builtin/credit-documents/headless.ts +1 -1
  467. package/src/plugins/builtin/crypto-board/client.ts +86 -0
  468. package/src/plugins/builtin/crypto-board/defi-view.tsx +218 -0
  469. package/src/plugins/builtin/crypto-board/defi.ts +239 -0
  470. package/src/plugins/builtin/crypto-board/headless.ts +117 -6
  471. package/src/plugins/builtin/crypto-board/index.tsx +8 -3
  472. package/src/plugins/builtin/crypto-board/model.ts +40 -8
  473. package/src/plugins/builtin/crypto-board/pane.tsx +55 -21
  474. package/src/plugins/builtin/crypto-board/series.ts +19 -1
  475. package/src/plugins/builtin/crypto-etf-flows/client.ts +60 -0
  476. package/src/plugins/builtin/crypto-etf-flows/headless.ts +132 -0
  477. package/src/plugins/builtin/crypto-etf-flows/index.tsx +44 -0
  478. package/src/plugins/builtin/crypto-etf-flows/model.ts +121 -0
  479. package/src/plugins/builtin/crypto-etf-flows/pane.tsx +193 -0
  480. package/src/plugins/builtin/debug/index.tsx +1 -0
  481. package/src/plugins/builtin/dividend-yield/index.tsx +1 -1
  482. package/src/plugins/builtin/docs/index.tsx +1 -1
  483. package/src/plugins/builtin/docs/pane.tsx +2 -2
  484. package/src/plugins/builtin/docs/targets.ts +1 -1
  485. package/src/plugins/builtin/doe/client.ts +5 -1
  486. package/src/plugins/builtin/doe/headless.ts +12 -6
  487. package/src/plugins/builtin/doe/model.ts +43 -6
  488. package/src/plugins/builtin/doe/pane.tsx +18 -11
  489. package/src/plugins/builtin/earnings/board-model.ts +13 -6
  490. package/src/plugins/builtin/earnings/board-table.ts +4 -1
  491. package/src/plugins/builtin/earnings/board.tsx +253 -50
  492. package/src/plugins/builtin/earnings/calendar-model.ts +188 -0
  493. package/src/plugins/builtin/earnings/calendar.tsx +338 -0
  494. package/src/plugins/builtin/earnings/client.ts +4 -3
  495. package/src/plugins/builtin/earnings/headless.ts +53 -15
  496. package/src/plugins/builtin/earnings/history-model.ts +53 -36
  497. package/src/plugins/builtin/earnings/index.tsx +15 -22
  498. package/src/plugins/builtin/earnings/model.ts +17 -12
  499. package/src/plugins/builtin/earnings/scope.ts +89 -0
  500. package/src/plugins/builtin/earnings-calls/calendar.tsx +310 -0
  501. package/src/plugins/builtin/earnings-calls/data.ts +146 -2
  502. package/src/plugins/builtin/earnings-calls/headless.ts +151 -9
  503. package/src/plugins/builtin/earnings-calls/index.tsx +3 -3
  504. package/src/plugins/builtin/earnings-calls/lock-note.ts +1 -1
  505. package/src/plugins/builtin/earnings-calls/pane.tsx +149 -31
  506. package/src/plugins/builtin/earnings-calls/upcoming.ts +195 -0
  507. package/src/plugins/builtin/earnings-ripple/pane.tsx +10 -5
  508. package/src/plugins/builtin/econ/calendar-model.ts +144 -27
  509. package/src/plugins/builtin/econ/detail-view.tsx +48 -10
  510. package/src/plugins/builtin/econ/figures.ts +72 -0
  511. package/src/plugins/builtin/econ/fred-catalog.ts +23 -6
  512. package/src/plugins/builtin/econ/fred-series-map.ts +4 -0
  513. package/src/plugins/builtin/econ/index.tsx +144 -27
  514. package/src/plugins/builtin/econ/print-watch.ts +2 -1
  515. package/src/plugins/builtin/econ/types.ts +34 -1
  516. package/src/plugins/builtin/econ-statistics/client.ts +16 -3
  517. package/src/plugins/builtin/econ-statistics/defs.ts +4 -0
  518. package/src/plugins/builtin/econ-statistics/detail.tsx +2 -2
  519. package/src/plugins/builtin/econ-statistics/headless.ts +87 -28
  520. package/src/plugins/builtin/econ-statistics/index.tsx +3 -3
  521. package/src/plugins/builtin/econ-statistics/pane.tsx +2 -1
  522. package/src/plugins/builtin/econ-statistics/stats.ts +104 -0
  523. package/src/plugins/builtin/econ-statistics/view.ts +19 -1
  524. package/src/plugins/builtin/equity-screener/client.ts +21 -3
  525. package/src/plugins/builtin/equity-screener/headless.ts +68 -6
  526. package/src/plugins/builtin/equity-screener/live.ts +1 -1
  527. package/src/plugins/builtin/equity-screener/model.ts +6 -0
  528. package/src/plugins/builtin/equity-screener/pane.tsx +47 -12
  529. package/src/plugins/builtin/equity-screener/screen-check.ts +90 -0
  530. package/src/plugins/builtin/equity-screener/ticker-check.tsx +148 -0
  531. package/src/plugins/builtin/estimate-revisions/headless.ts +3 -1
  532. package/src/plugins/builtin/estimate-revisions/lock-note.ts +3 -3
  533. package/src/plugins/builtin/estimate-revisions/model.ts +8 -10
  534. package/src/plugins/builtin/exposure/charts.tsx +2 -2
  535. package/src/plugins/builtin/exposure/headless.ts +51 -6
  536. package/src/plugins/builtin/exposure/index.tsx +28 -2
  537. package/src/plugins/builtin/exposure/model.ts +20 -1
  538. package/src/plugins/builtin/exposure/pane.tsx +10 -5
  539. package/src/plugins/builtin/fear-greed/index.tsx +1 -1
  540. package/src/plugins/builtin/filing-events/index.tsx +1 -1
  541. package/src/plugins/builtin/futures/index.tsx +1 -0
  542. package/src/plugins/builtin/futures/model.ts +12 -10
  543. package/src/plugins/builtin/futures/returns.ts +8 -36
  544. package/src/plugins/builtin/futures/table.tsx +3 -3
  545. package/src/plugins/builtin/futures-curve/client.ts +40 -9
  546. package/src/plugins/builtin/futures-curve/headless.ts +39 -17
  547. package/src/plugins/builtin/futures-curve/model.ts +258 -69
  548. package/src/plugins/builtin/futures-curve/pane.tsx +46 -17
  549. package/src/plugins/builtin/fx-matrix/client.ts +20 -8
  550. package/src/plugins/builtin/fx-matrix/headless.ts +37 -16
  551. package/src/plugins/builtin/fx-matrix/index.tsx +25 -13
  552. package/src/plugins/builtin/fx-matrix/live-legs.ts +34 -0
  553. package/src/plugins/builtin/fx-matrix/settings.ts +2 -1
  554. package/src/plugins/builtin/gpu/headless.ts +9 -4
  555. package/src/plugins/builtin/help/index.tsx +13 -3
  556. package/src/plugins/builtin/help/keybindings-editor.tsx +18 -14
  557. package/src/plugins/builtin/holders/beneficial-model.ts +8 -11
  558. package/src/plugins/builtin/holders/beneficial-report.ts +6 -5
  559. package/src/plugins/builtin/holders/beneficial-view.tsx +7 -3
  560. package/src/plugins/builtin/holders/client.ts +13 -1
  561. package/src/plugins/builtin/holders/format.ts +28 -17
  562. package/src/plugins/builtin/holders/headless.ts +46 -7
  563. package/src/plugins/builtin/holders/index-holders.ts +264 -0
  564. package/src/plugins/builtin/holders/pane.tsx +79 -15
  565. package/src/plugins/builtin/holders/report-rows.ts +35 -7
  566. package/src/plugins/builtin/holders/table-model.ts +2 -1
  567. package/src/plugins/builtin/holders/treemap.tsx +2 -2
  568. package/src/plugins/builtin/insider/headless.ts +1 -1
  569. package/src/plugins/builtin/insider/signals-client.ts +1 -1
  570. package/src/plugins/builtin/insider/signals.tsx +1 -1
  571. package/src/plugins/builtin/ipo-calendar/pane.tsx +7 -4
  572. package/src/plugins/builtin/iv-history/client.ts +20 -0
  573. package/src/plugins/builtin/iv-history/headless.ts +7 -4
  574. package/src/plugins/builtin/iv-history/index.tsx +1 -1
  575. package/src/plugins/builtin/iv-history/model.ts +13 -4
  576. package/src/plugins/builtin/iv-history/series.ts +3 -1
  577. package/src/plugins/builtin/jobs/lock-note.ts +1 -1
  578. package/src/plugins/builtin/jobs/model.ts +4 -15
  579. package/src/plugins/builtin/jobs/pane.tsx +7 -5
  580. package/src/plugins/builtin/jobs/share-bars.tsx +11 -5
  581. package/src/plugins/builtin/jodi/pane.tsx +10 -4
  582. package/src/plugins/builtin/layout-manager/index.tsx +1 -0
  583. package/src/plugins/builtin/macro-day/headless.ts +20 -7
  584. package/src/plugins/builtin/macro-day/index.tsx +3 -2
  585. package/src/plugins/builtin/macro-day/model.ts +29 -8
  586. package/src/plugins/builtin/macro-day/pane.tsx +51 -13
  587. package/src/plugins/builtin/macro-day/releases.ts +55 -13
  588. package/src/plugins/builtin/market-heatmap/data.ts +9 -2
  589. package/src/plugins/builtin/market-heatmap/evidence.ts +1 -1
  590. package/src/plugins/builtin/market-heatmap/headless.ts +9 -6
  591. package/src/plugins/builtin/market-heatmap/index.tsx +3 -3
  592. package/src/plugins/builtin/market-heatmap/model.ts +10 -7
  593. package/src/plugins/builtin/market-movers/client.ts +33 -19
  594. package/src/plugins/builtin/market-movers/footer.ts +2 -2
  595. package/src/plugins/builtin/market-movers/headless.ts +8 -2
  596. package/src/plugins/builtin/market-movers/index.tsx +16 -10
  597. package/src/plugins/builtin/market-movers/screener.ts +29 -8
  598. package/src/plugins/builtin/market-movers/session-body.tsx +4 -2
  599. package/src/plugins/builtin/market-movers/session-table.ts +4 -2
  600. package/src/plugins/builtin/market-movers/table.ts +4 -1
  601. package/src/plugins/builtin/market-valuation/headless.ts +2 -0
  602. package/src/plugins/builtin/market-valuation/view.ts +5 -0
  603. package/src/plugins/builtin/members/breadth-pane.tsx +81 -0
  604. package/src/plugins/builtin/members/client.ts +19 -4
  605. package/src/plugins/builtin/members/headless.ts +24 -10
  606. package/src/plugins/builtin/members/index.tsx +9 -9
  607. package/src/plugins/builtin/members/model.ts +23 -4
  608. package/src/plugins/builtin/members/pane.tsx +31 -14
  609. package/src/plugins/builtin/mna/client.ts +1 -0
  610. package/src/plugins/builtin/mna/detail.tsx +20 -32
  611. package/src/plugins/builtin/mna/distress/detail.tsx +16 -4
  612. package/src/plugins/builtin/mna/distress/model.ts +3 -2
  613. package/src/plugins/builtin/mna/distress/pane.tsx +7 -4
  614. package/src/plugins/builtin/mna/headless.ts +6 -13
  615. package/src/plugins/builtin/mna/model.ts +93 -15
  616. package/src/plugins/builtin/mna/pane.tsx +5 -4
  617. package/src/plugins/builtin/news/headless.ts +12 -6
  618. package/src/plugins/builtin/news/index.tsx +10 -1
  619. package/src/plugins/builtin/news/wire/index.tsx +3 -2
  620. package/src/plugins/builtin/news/wire/news/command-bar-search.ts +26 -10
  621. package/src/plugins/builtin/news/wire/news/query-presets.ts +6 -2
  622. package/src/plugins/builtin/news/wire/rss/cli.ts +3 -3
  623. package/src/plugins/builtin/notes/cli.ts +49 -14
  624. package/src/plugins/builtin/openfda/pane.tsx +1 -1
  625. package/src/plugins/builtin/options/analytics.ts +26 -2
  626. package/src/plugins/builtin/options/carry.ts +2 -2
  627. package/src/plugins/builtin/options/index.tsx +1 -1
  628. package/src/plugins/builtin/options/model-spot.ts +5 -2
  629. package/src/plugins/builtin/options/strike-window.ts +2 -1
  630. package/src/plugins/builtin/options/table.ts +1 -7
  631. package/src/plugins/builtin/options/view.tsx +30 -13
  632. package/src/plugins/builtin/options-calculator/headless.ts +46 -7
  633. package/src/plugins/builtin/options-positioning/client.ts +19 -0
  634. package/src/plugins/builtin/options-positioning/headless.ts +54 -14
  635. package/src/plugins/builtin/options-positioning/index.tsx +3 -3
  636. package/src/plugins/builtin/options-positioning/model.ts +47 -8
  637. package/src/plugins/builtin/options-positioning/pane.tsx +68 -38
  638. package/src/plugins/builtin/options-scenario/client.ts +123 -28
  639. package/src/plugins/builtin/options-scenario/collar.ts +8 -6
  640. package/src/plugins/builtin/options-scenario/csp-screen-headless.ts +127 -0
  641. package/src/plugins/builtin/options-scenario/csp-screen-pane.tsx +165 -0
  642. package/src/plugins/builtin/options-scenario/csp-screen.ts +258 -0
  643. package/src/plugins/builtin/options-scenario/csp.ts +101 -21
  644. package/src/plugins/builtin/options-scenario/headless.ts +36 -15
  645. package/src/plugins/builtin/options-scenario/hedge.ts +20 -14
  646. package/src/plugins/builtin/options-scenario/index.tsx +28 -3
  647. package/src/plugins/builtin/options-scenario/model.ts +13 -0
  648. package/src/plugins/builtin/options-scenario/pane.tsx +9 -5
  649. package/src/plugins/builtin/perps/equity-row.tsx +11 -3
  650. package/src/plugins/builtin/perps/freshness.ts +14 -9
  651. package/src/plugins/builtin/perps/headless.ts +3 -1
  652. package/src/plugins/builtin/perps/list-perpetuals.ts +25 -4
  653. package/src/plugins/builtin/perps/live-rows.ts +168 -0
  654. package/src/plugins/builtin/perps/markets-section.tsx +154 -0
  655. package/src/plugins/builtin/perps/pane.tsx +49 -26
  656. package/src/plugins/builtin/perps/venue-markets.ts +96 -0
  657. package/src/plugins/builtin/plugin-marketplace/index.tsx +2 -1
  658. package/src/plugins/builtin/plugin-marketplace/pane.tsx +143 -59
  659. package/src/plugins/builtin/portfolio-list/cli/bulk-symbols.ts +72 -24
  660. package/src/plugins/builtin/portfolio-list/cli/portfolio-command.ts +158 -141
  661. package/src/plugins/builtin/portfolio-list/cli/render.ts +54 -22
  662. package/src/plugins/builtin/portfolio-list/cli/shared.ts +3 -3
  663. package/src/plugins/builtin/portfolio-list/cli/watchlist-command.ts +29 -24
  664. package/src/plugins/builtin/portfolio-list/headless.ts +7 -4
  665. package/src/plugins/builtin/portfolio-list/income.ts +13 -2
  666. package/src/plugins/builtin/portfolio-list/index.tsx +9 -2
  667. package/src/plugins/builtin/portfolio-list/pane/index.tsx +21 -8
  668. package/src/plugins/builtin/portfolio-list/pane/purchase-date-fx.ts +46 -0
  669. package/src/plugins/builtin/portfolio-list/summary/index.tsx +11 -8
  670. package/src/plugins/builtin/portfolio-list/summary/live-accounts.ts +16 -9
  671. package/src/plugins/builtin/portfolio-list/summary/totals.ts +2 -15
  672. package/src/plugins/builtin/power/client.ts +4 -1
  673. package/src/plugins/builtin/power/evidence.ts +22 -7
  674. package/src/plugins/builtin/power/gas.tsx +5 -1
  675. package/src/plugins/builtin/power/pane.tsx +8 -1
  676. package/src/plugins/builtin/power/prices.tsx +10 -3
  677. package/src/plugins/builtin/rate-path/pane.tsx +2 -2
  678. package/src/plugins/builtin/research/analyst-headless.ts +25 -8
  679. package/src/plugins/builtin/research/analyst-model.ts +68 -3
  680. package/src/plugins/builtin/research/corporate-actions-pane.tsx +63 -14
  681. package/src/plugins/builtin/research/event-model.ts +3 -1
  682. package/src/plugins/builtin/research/event-sources.ts +12 -4
  683. package/src/plugins/builtin/research/index.tsx +2 -1
  684. package/src/plugins/builtin/research/relative-valuation-basis.ts +58 -0
  685. package/src/plugins/builtin/research/relative-valuation-columns.ts +31 -2
  686. package/src/plugins/builtin/research/relative-valuation-currency.ts +12 -5
  687. package/src/plugins/builtin/research/relative-valuation-headless.ts +84 -26
  688. package/src/plugins/builtin/research/relative-valuation-model.ts +88 -19
  689. package/src/plugins/builtin/research/relative-valuation-pane.tsx +80 -13
  690. package/src/plugins/builtin/research/relative-valuation-peers.ts +1 -1
  691. package/src/plugins/builtin/reverse-dcf/model.ts +6 -2
  692. package/src/plugins/builtin/risk-factors/index.tsx +2 -2
  693. package/src/plugins/builtin/scanner/feed.ts +2 -2
  694. package/src/plugins/builtin/scanner/index.ts +24 -1
  695. package/src/plugins/builtin/scanner/live-condition-editor.tsx +222 -0
  696. package/src/plugins/builtin/scanner/live-feed.ts +168 -0
  697. package/src/plugins/builtin/scanner/live-headless.ts +114 -0
  698. package/src/plugins/builtin/scanner/live-model.ts +351 -0
  699. package/src/plugins/builtin/scanner/live-pane.tsx +677 -0
  700. package/src/plugins/builtin/scanner/live-track.ts +186 -0
  701. package/src/plugins/builtin/scanner/lock-note.ts +1 -1
  702. package/src/plugins/builtin/sec/forms.ts +13 -0
  703. package/src/plugins/builtin/sec/fund-abroad.ts +32 -0
  704. package/src/plugins/builtin/sec/fund-facts.ts +68 -8
  705. package/src/plugins/builtin/sec/headless.ts +85 -8
  706. package/src/plugins/builtin/sec/index.tsx +58 -12
  707. package/src/plugins/builtin/sectors/client.ts +2 -1
  708. package/src/plugins/builtin/sectors/sector-model.ts +11 -15
  709. package/src/plugins/builtin/series-inventory.ts +3 -0
  710. package/src/plugins/builtin/shared/broker-reconnect.ts +107 -22
  711. package/src/plugins/builtin/shared/cloud-upgrade.ts +34 -6
  712. package/src/plugins/builtin/shared/earnings-calendar.ts +375 -0
  713. package/src/plugins/builtin/{earnings/estimate-basis.ts → shared/earnings-estimate-basis.ts} +1 -1
  714. package/src/plugins/builtin/shared/earnings-report.ts +3 -3
  715. package/src/plugins/builtin/shared/fx-rate-freshness.ts +23 -1
  716. package/src/plugins/builtin/shared/job-posting.ts +129 -0
  717. package/src/plugins/builtin/shared/macro-releases.ts +65 -0
  718. package/src/plugins/builtin/shared/pro-lock-note.ts +3 -3
  719. package/src/plugins/builtin/shared/report-freshness.ts +3 -0
  720. package/src/plugins/builtin/shared/research-trading.tsx +21 -0
  721. package/src/plugins/builtin/shared/scanner-capture.ts +3 -0
  722. package/src/plugins/builtin/shared/series-cache.ts +2 -0
  723. package/src/plugins/builtin/shared/ticker-surface.ts +2 -1
  724. package/src/plugins/builtin/shared/use-quote-board.ts +8 -2
  725. package/src/plugins/builtin/shared/volatility/pricing.ts +7 -1
  726. package/src/plugins/builtin/short-interest/client.ts +2 -0
  727. package/src/plugins/builtin/short-interest/headless.ts +41 -12
  728. package/src/plugins/builtin/short-interest/index.tsx +23 -1
  729. package/src/plugins/builtin/short-interest/model.ts +70 -19
  730. package/src/plugins/builtin/short-interest/pane.tsx +19 -2
  731. package/src/plugins/builtin/short-interest/publications-client.ts +82 -0
  732. package/src/plugins/builtin/short-interest/publications-headless.ts +29 -0
  733. package/src/plugins/builtin/short-interest/publications-model.ts +50 -0
  734. package/src/plugins/builtin/short-interest/publications-pane.tsx +66 -0
  735. package/src/plugins/builtin/short-interest/schedule.ts +35 -2
  736. package/src/plugins/builtin/short-interest/surface.tsx +11 -4
  737. package/src/plugins/builtin/short-interest/types.ts +9 -0
  738. package/src/plugins/builtin/short-interest/watch-client.ts +14 -8
  739. package/src/plugins/builtin/short-interest/watch-model.ts +12 -25
  740. package/src/plugins/builtin/short-interest/watch-pane.tsx +5 -1
  741. package/src/plugins/builtin/supply-chain/flow.tsx +33 -9
  742. package/src/plugins/builtin/supply-chain/model.ts +51 -3
  743. package/src/plugins/builtin/supply-chain/pane.tsx +78 -39
  744. package/src/plugins/builtin/supply-chain/row-evidence.tsx +1 -1
  745. package/src/plugins/builtin/themes/headless.ts +11 -6
  746. package/src/plugins/builtin/themes/model.ts +15 -5
  747. package/src/plugins/builtin/themes/pane.tsx +27 -8
  748. package/src/plugins/builtin/thirteenf/headless.ts +5 -5
  749. package/src/plugins/builtin/thirteenf/signals.ts +3 -1
  750. package/src/plugins/builtin/ticker-detail/adr-pair/headless.ts +123 -0
  751. package/src/plugins/builtin/ticker-detail/adr-pair/model.ts +132 -0
  752. package/src/plugins/builtin/ticker-detail/adr-pair/tab.tsx +87 -0
  753. package/src/plugins/builtin/ticker-detail/data-panes/historical-prices.tsx +40 -26
  754. package/src/plugins/builtin/ticker-detail/data-panes/history-bars.ts +8 -4
  755. package/src/plugins/builtin/ticker-detail/data-panes/returns-history.ts +67 -3
  756. package/src/plugins/builtin/ticker-detail/data-panes/returns-model.ts +112 -5
  757. package/src/plugins/builtin/ticker-detail/data-panes/returns-pane.tsx +17 -2
  758. package/src/plugins/builtin/ticker-detail/financials/aggregation.ts +21 -7
  759. package/src/plugins/builtin/ticker-detail/financials/model.ts +36 -1
  760. package/src/plugins/builtin/ticker-detail/financials/offerings.ts +56 -0
  761. package/src/plugins/builtin/ticker-detail/financials/ratios.ts +62 -13
  762. package/src/plugins/builtin/ticker-detail/financials/tab.tsx +30 -4
  763. package/src/plugins/builtin/ticker-detail/headless-schema.ts +14 -2
  764. package/src/plugins/builtin/ticker-detail/headless.ts +148 -35
  765. package/src/plugins/builtin/ticker-detail/index.tsx +37 -5
  766. package/src/plugins/builtin/ticker-detail/overview/model.ts +65 -10
  767. package/src/plugins/builtin/ticker-detail/overview/pane.tsx +9 -1
  768. package/src/plugins/builtin/ticker-detail/overview-tab.tsx +68 -11
  769. package/src/plugins/builtin/ticker-detail/pane.tsx +11 -0
  770. package/src/plugins/builtin/ticker-detail/quote-footer.ts +14 -4
  771. package/src/plugins/builtin/ticker-detail/research-tabs.ts +11 -0
  772. package/src/plugins/builtin/vol-surface/charts.tsx +9 -4
  773. package/src/plugins/builtin/vol-surface/client.ts +7 -4
  774. package/src/plugins/builtin/vol-surface/headless.ts +71 -13
  775. package/src/plugins/builtin/vol-surface/index.tsx +2 -2
  776. package/src/plugins/builtin/vol-surface/model.ts +26 -9
  777. package/src/plugins/builtin/vol-surface/pane.tsx +44 -7
  778. package/src/plugins/builtin/vol-surface/tables.ts +31 -3
  779. package/src/plugins/builtin/volatility/dvol.ts +46 -0
  780. package/src/plugins/builtin/volatility/model.ts +5 -10
  781. package/src/plugins/builtin/volatility/pane.tsx +2 -2
  782. package/src/plugins/builtin/volatility/series.ts +26 -0
  783. package/src/plugins/builtin/world-indices/footer.ts +1 -1
  784. package/src/plugins/builtin/world-venue-map/basemap-layer.tsx +4 -3
  785. package/src/plugins/builtin/world-venue-map/basemap.ts +3 -1
  786. package/src/plugins/builtin/world-venue-map/chokepoint-chart.ts +40 -0
  787. package/src/plugins/builtin/world-venue-map/evidence.ts +1 -1
  788. package/src/plugins/builtin/world-venue-map/geo-series.ts +90 -11
  789. package/src/plugins/builtin/world-venue-map/headless.ts +1 -1
  790. package/src/plugins/builtin/world-venue-map/index.ts +3 -26
  791. package/src/plugins/builtin/world-venue-map/layers.ts +1 -1
  792. package/src/plugins/builtin/world-venue-map/map.tsx +2 -1
  793. package/src/plugins/builtin/world-venue-map/pane.tsx +4 -2
  794. package/src/plugins/builtin/world-venue-map/venue-header.tsx +15 -4
  795. package/src/plugins/builtin/yield-curve/client.ts +25 -0
  796. package/src/plugins/builtin/yield-curve/curves.ts +7 -4
  797. package/src/plugins/builtin/yield-curve/headless.ts +38 -4
  798. package/src/plugins/builtin/yield-curve/history.ts +4 -3
  799. package/src/plugins/builtin/yield-curve/index.tsx +12 -6
  800. package/src/plugins/builtin/yield-curve/swaps-model.ts +93 -0
  801. package/src/plugins/builtin/yield-curve/swaps.tsx +99 -0
  802. package/src/plugins/bundle.ts +1 -1
  803. package/src/plugins/catalog-browser.ts +15 -9
  804. package/src/plugins/compat.ts +3 -3
  805. package/src/plugins/dependencies.ts +75 -14
  806. package/src/plugins/extracted-plugins.ts +132 -34
  807. package/src/plugins/host-link.ts +149 -34
  808. package/src/plugins/installer.ts +35 -10
  809. package/src/plugins/loader.ts +206 -38
  810. package/src/plugins/manager-node.ts +2 -2
  811. package/src/plugins/marketplace/deactivation.ts +22 -0
  812. package/src/plugins/marketplace/model.ts +2 -2
  813. package/src/plugins/marketplace/packs.ts +1 -1
  814. package/src/plugins/ownership.ts +1 -1
  815. package/src/plugins/peer-retry.ts +155 -0
  816. package/src/plugins/registry/contributions.ts +3 -1
  817. package/src/plugins/registry/index.ts +4 -3
  818. package/src/plugins/registry/plugin-state.ts +3 -0
  819. package/src/plugins/seed-notice.ts +20 -0
  820. package/src/plugins/shortcut-argument.ts +39 -0
  821. package/src/portfolio/allocation.ts +1 -1
  822. package/src/portfolio/collection-name.ts +31 -0
  823. package/src/portfolio/column-values.ts +15 -13
  824. package/src/portfolio/cost-fx.ts +296 -19
  825. package/src/portfolio/manual-lots.ts +75 -0
  826. package/src/portfolio/mutations.ts +60 -22
  827. package/src/portfolio/suffixed-listings.ts +209 -0
  828. package/src/portfolio/totals-currency.ts +24 -0
  829. package/src/public/__snapshots__/public-api.test.ts.snap +15 -0
  830. package/src/public/time-series.ts +11 -8
  831. package/src/remote/schema.ts +1 -1
  832. package/src/renderers/browser/app-services.ts +1 -7
  833. package/src/renderers/browser/config-host.ts +5 -55
  834. package/src/renderers/browser/main.tsx +30 -60
  835. package/src/renderers/dom/boot-frame-page.ts +187 -0
  836. package/src/renderers/dom/boot-frame.ts +237 -0
  837. package/src/renderers/dom/build-assets.ts +46 -8
  838. package/src/renderers/dom/dom-ui-host.tsx +4 -29
  839. package/src/renderers/dom/host/ascii-text.ts +16 -2
  840. package/src/renderers/dom/host/box.tsx +43 -2
  841. package/src/renderers/dom/host/chart-surface.tsx +2 -0
  842. package/src/renderers/dom/host/hls.chunk.ts +3 -0
  843. package/src/renderers/dom/host/image-surface.tsx +49 -0
  844. package/src/renderers/dom/host/media-surface.tsx +24 -18
  845. package/src/renderers/dom/host/mouse.ts +30 -0
  846. package/src/renderers/dom/host/size-observer.ts +1 -1
  847. package/src/renderers/dom/host/style.ts +1 -1
  848. package/src/renderers/dom/styles.css +76 -0
  849. package/src/renderers/dom/test-utils.tsx +2 -1
  850. package/src/renderers/electrobun/bun/application-menu/index.ts +3 -3
  851. package/src/renderers/electrobun/bun/desktop/app-name.ts +222 -0
  852. package/src/renderers/electrobun/bun/desktop/backend-requests.ts +3 -0
  853. package/src/renderers/electrobun/bun/desktop/backend.ts +56 -3
  854. package/src/renderers/electrobun/bun/desktop/detached-windows.ts +1 -1
  855. package/src/renderers/electrobun/bun/desktop/host-requests.ts +9 -3
  856. package/src/renderers/electrobun/bun/desktop/initialization.ts +81 -18
  857. package/src/renderers/electrobun/bun/desktop/relaunch.ts +74 -25
  858. package/src/renderers/electrobun/bun/desktop/state-broadcaster.ts +1 -0
  859. package/src/renderers/electrobun/bun/desktop/update.ts +70 -3
  860. package/src/renderers/electrobun/bun/desktop/workspace/index.ts +2 -0
  861. package/src/renderers/electrobun/bun/external-plugins.ts +29 -7
  862. package/src/renderers/electrobun/bun/index.ts +36 -2
  863. package/src/renderers/electrobun/bun/window/boot-frame.ts +67 -0
  864. package/src/renderers/electrobun/bun/window/create.ts +4 -1
  865. package/src/renderers/electrobun/shared/app-name.ts +17 -0
  866. package/src/renderers/electrobun/shared/boot-frame.ts +7 -0
  867. package/src/renderers/electrobun/shared/protocol.ts +6 -1
  868. package/src/renderers/electrobun/view/cli-pane-shot-entry.tsx +1 -1
  869. package/src/renderers/electrobun/view/cli-pane-shot-frame.tsx +3 -3
  870. package/src/renderers/electrobun/view/config-host.ts +3 -0
  871. package/src/renderers/electrobun/view/desktop/window/snapshot.ts +1 -0
  872. package/src/renderers/electrobun/view/fatal-screen.tsx +1 -1
  873. package/src/renderers/electrobun/view/main.tsx +30 -4
  874. package/src/renderers/electrobun/view/news-source.ts +5 -5
  875. package/src/renderers/electrobun/view/remote/asset-data-client.ts +1 -1
  876. package/src/renderers/electrobun/view/ui-host.tsx +1 -1
  877. package/src/renderers/opentui/browser-open.ts +88 -0
  878. package/src/renderers/opentui/host.tsx +5 -14
  879. package/src/renderers/opentui/image/loader.ts +3 -2
  880. package/src/renderers/opentui/native-smoke.ts +10 -1
  881. package/src/renderers/opentui/pane-image/index.ts +2 -1
  882. package/src/renderers/opentui/render-lib.ts +253 -0
  883. package/src/renderers/opentui/render-timing-smoke.ts +1 -1
  884. package/src/renderers/opentui/start.tsx +1 -1
  885. package/src/renderers/opentui/toast-host.tsx +71 -43
  886. package/src/renderers/share/layout-view.tsx +2 -2
  887. package/src/renderers/share/main.tsx +4 -4
  888. package/src/renderers/share/view.tsx +1 -1
  889. package/src/series/resolve.ts +22 -6
  890. package/src/series/standalone.ts +30 -2
  891. package/src/series/types.ts +8 -1
  892. package/src/shares/api.ts +4 -1
  893. package/src/shares/pane.ts +1 -1
  894. package/src/sources/gloomberb-cloud/fred-series.ts +46 -1
  895. package/src/sources/gloomberb-cloud/index.ts +32 -16
  896. package/src/sources/gloomberb-cloud/news.ts +39 -0
  897. package/src/sources/gloomberb-cloud/normalizers.ts +16 -1
  898. package/src/sources/gloomberb-cloud/perpetuals.ts +49 -1
  899. package/src/sources/listing-symbols.ts +37 -0
  900. package/src/sources/provider-errors.ts +16 -2
  901. package/src/sources/provider-router/batches.ts +10 -2
  902. package/src/sources/provider-router/financial-routes.ts +21 -3
  903. package/src/sources/provider-router/financials.ts +15 -2
  904. package/src/sources/provider-router/history.ts +58 -15
  905. package/src/sources/provider-router/index.ts +146 -10
  906. package/src/sources/provider-router/primary.ts +1 -1
  907. package/src/sources/provider-router/search.ts +13 -2
  908. package/src/state/app/bootstrap.ts +23 -0
  909. package/src/state/app/context/index.tsx +3 -0
  910. package/src/state/hooks/inline-tickers.ts +30 -5
  911. package/src/sync/auth-transition.ts +19 -9
  912. package/src/sync/baseline.ts +10 -4
  913. package/src/sync/controller.ts +67 -17
  914. package/src/sync/core-contributors.ts +46 -14
  915. package/src/sync/react.ts +4 -1
  916. package/src/sync/types.ts +3 -0
  917. package/src/team/collections-sync.ts +2 -1
  918. package/src/team/collections.ts +178 -17
  919. package/src/telemetry/crash-reports.ts +17 -4
  920. package/src/telemetry/usage-counts.ts +0 -18
  921. package/src/test-support/builtin-panes.ts +1 -1
  922. package/src/theme/colors.ts +11 -30
  923. package/src/theme/ui-tokens.ts +37 -1
  924. package/src/tickers/company-name-listing.ts +210 -33
  925. package/src/tickers/company-name.ts +59 -0
  926. package/src/tickers/index-roots.ts +47 -0
  927. package/src/tickers/instrument-label.ts +5 -1
  928. package/src/tickers/listing-venues.ts +23 -0
  929. package/src/tickers/metadata.ts +10 -0
  930. package/src/tickers/perpetual-listing.ts +5 -2
  931. package/src/tickers/search/bare-symbol.ts +36 -0
  932. package/src/tickers/search/home-listing.ts +75 -0
  933. package/src/tickers/search/index.ts +111 -33
  934. package/src/tickers/search/ranking.ts +64 -5
  935. package/src/tickers/search/types.ts +5 -0
  936. package/src/tickers/search/upsert.ts +29 -0
  937. package/src/tickers/terminal-codes.ts +416 -40
  938. package/src/time-series/bar-aggregation.ts +243 -0
  939. package/src/time-series/base-series.ts +315 -0
  940. package/src/time-series/chart-bounds.ts +349 -0
  941. package/src/time-series/chart-seed.ts +142 -0
  942. package/src/time-series/daily-valuation.ts +62 -0
  943. package/src/time-series/economic.ts +5 -0
  944. package/src/time-series/field-catalog.ts +1 -3
  945. package/src/time-series/forward-valuation.ts +32 -0
  946. package/src/time-series/fundamentals.ts +173 -10
  947. package/src/time-series/history-acquisition.ts +499 -0
  948. package/src/time-series/hooks.ts +1 -0
  949. package/src/time-series/leverage.ts +100 -0
  950. package/src/time-series/market-resolution.ts +4 -2
  951. package/src/time-series/market.ts +2 -1
  952. package/src/time-series/price-comparison.ts +175 -30
  953. package/src/time-series/price-units.ts +72 -2
  954. package/src/time-series/range.ts +9 -1
  955. package/src/time-series/resolution.ts +174 -16
  956. package/src/time-series/resolve-context.ts +161 -0
  957. package/src/time-series/resolve.ts +185 -1587
  958. package/src/time-series/series-name.ts +38 -0
  959. package/src/time-series/series-presentation.ts +242 -0
  960. package/src/time-series/spec.ts +13 -7
  961. package/src/time-series/studies.ts +377 -82
  962. package/src/time-series/tail-reconcile.ts +121 -0
  963. package/src/time-series/transforms.ts +1 -0
  964. package/src/time-series/types.ts +34 -2
  965. package/src/time-series/use-chart-resolution.ts +4 -5
  966. package/src/time-series/valuation-releases.ts +39 -0
  967. package/src/types/broker.ts +10 -0
  968. package/src/types/config.ts +14 -0
  969. package/src/types/data-provider.ts +23 -1
  970. package/src/types/desktop-window.ts +2 -0
  971. package/src/types/exchange-rate.ts +6 -0
  972. package/src/types/financials.ts +145 -8
  973. package/src/types/headless.ts +117 -9
  974. package/src/types/instrument.ts +6 -0
  975. package/src/types/plugin.ts +66 -9
  976. package/src/types/price-history.ts +2 -0
  977. package/src/types/ticker.ts +13 -0
  978. package/src/types/trading.ts +59 -1
  979. package/src/ui/ascii-font.ts +13 -1
  980. package/src/ui/host.tsx +6 -1
  981. package/src/updater/command-names.ts +180 -0
  982. package/src/updater/index.ts +10 -5
  983. package/src/utils/calendar-date.ts +32 -15
  984. package/src/utils/cash-runway.ts +241 -0
  985. package/src/utils/central-banks.ts +42 -0
  986. package/src/utils/cli-output.ts +259 -80
  987. package/src/utils/contract-month.ts +16 -0
  988. package/src/utils/crypto-pair.ts +61 -3
  989. package/src/utils/currency-units.ts +29 -0
  990. package/src/utils/datetime-format.ts +10 -0
  991. package/src/utils/debug-log.ts +1 -1
  992. package/src/utils/decimal-comma.ts +39 -6
  993. package/src/utils/exchange-announcements.ts +71 -0
  994. package/src/utils/exchange-rate-snapshot.ts +10 -0
  995. package/src/utils/financial-statements.ts +89 -5
  996. package/src/utils/format.ts +34 -16
  997. package/src/utils/fundamentals.ts +150 -34
  998. package/src/utils/fx-market-hours.ts +10 -1
  999. package/src/utils/latest-financial-period.ts +8 -0
  1000. package/src/utils/linux-libc.ts +54 -0
  1001. package/src/utils/market-capitalization.ts +111 -15
  1002. package/src/utils/max-drawdown.ts +64 -0
  1003. package/src/utils/network-failure.ts +86 -0
  1004. package/src/utils/option-expiry.ts +186 -7
  1005. package/src/utils/options.ts +10 -0
  1006. package/src/utils/plugin-proxy-hosts.json +1 -0
  1007. package/src/utils/price-earnings.ts +11 -5
  1008. package/src/utils/price-history.ts +23 -8
  1009. package/src/utils/price-window.ts +131 -0
  1010. package/src/utils/release-date.ts +47 -0
  1011. package/src/utils/sec.ts +3 -0
  1012. package/src/utils/throttled-fetch.ts +11 -4
  1013. package/src/utils/trailing-eps.ts +67 -0
  1014. package/src/utils/typed-text.ts +21 -0
  1015. package/src/utils/utc-time.ts +24 -1
  1016. package/src/version.ts +6 -0
  1017. package/src/cli/pane-functions/screenshot.ts +0 -2122
  1018. package/src/renderers/browser/first-screen.ts +0 -193
@@ -23,7 +23,7 @@ export const catalystsModule: PluginModule = {
23
23
  instruments: ["equity", "fund"], tableExport: true, headless: litigationHeadless },
24
24
  ],
25
25
  paneTemplates: [
26
- { id: "catalysts-pane", paneId: "catalysts", label: "Catalysts", description: "Pro regulatory, clinical, legal and trade-policy calendar with source evidence and revision history.", keywords: ["catalysts", "calendar", "FDA", "clinical", "regulatory", "deadlines", "antitrust", "sanctions"],
26
+ { id: "catalysts-pane", paneId: "catalysts", label: "Catalysts", description: "Pro regulatory, clinical, legal and trade-policy calendar with source evidence and revision history.", keywords: ["catalysts", "calendar", "FDA", "clinical", "regulatory", "deadlines", "antitrust", "sanctions", "PDUFA", "FDA decision", "approval", "approvals"],
27
27
  shortcut: { prefix: "CATL", argKind: "ticker", argPlaceholder: "ticker", argOptional: true, openWithoutArg: true }, headless: catalystsHeadless,
28
28
  createInstance: (_context, options) => { const symbol = (options?.symbol ?? options?.arg ?? "").trim().toUpperCase(); const event = options?.values?.event; const open = event && /^[a-zA-Z0-9:_-]{1,160}$/.test(event) ? event : undefined; return { title: symbol ? `CATL ${symbol}` : "Catalysts", placement: "floating", ...(symbol ? { binding: { kind: "fixed" as const, symbol } } : {}), settings: { symbol, ...(open ? { open } : {}) } }; } },
29
29
  { ...createTickerSurfacePaneTemplate({ id: "litigation-pane", paneId: "litigation", label: "Litigation", description: "Pro company litigation, enforcement and antitrust dockets with dated source evidence.", keywords: ["litigation", "legal", "docket", "court", "enforcement", "antitrust"], shortcut: "LITI" }), headless: litigationHeadless },
@@ -1,5 +1,5 @@
1
1
  import type { CatalystEvent, CatalystFilters, CatalystResponse, CatalystType } from "../../../api-client/catalysts";
2
- import type { DataTableColumn } from "../../../components";
2
+ import type { DataTableColumn, TableSection } from "../../../components";
3
3
  import { publicTickerKey } from "../../../utils/exchanges";
4
4
  import { humanLabel, type StateTone } from "../shared/research-cells";
5
5
 
@@ -13,8 +13,17 @@ export const catalystSymbol = (event: CatalystEvent): string | null => {
13
13
  return party?.ticker ? publicTickerKey(party.ticker, party.exchange ?? undefined) : null;
14
14
  };
15
15
  export const catalystTickers = (event: CatalystEvent) => [...new Set(event.parties.filter((p) => p.ticker).map((p) => publicTickerKey(p.ticker!, p.exchange ?? undefined)))].join(", ");
16
+ /**
17
+ * A source named the event but withheld its date (a company's PDUFA target
18
+ * without the day). The filing's date is when it was said, so the row has no
19
+ * date of its own; only the announcement and observation dates stand.
20
+ */
21
+ export const catalystDateWithheld = (event: Pick<CatalystEvent, "metadata">, field: CatalystFilters["dateField"] = "any") =>
22
+ event.metadata?.dateWithheld === true && field !== "announced" && field !== "observed";
23
+ export const CATALYST_DATE_WITHHELD = "Date not disclosed";
16
24
  export const catalystDate = (event: CatalystEvent, field: CatalystFilters["dateField"] = "any"): string => {
17
25
  if (field === "observed") return event.observedAt.slice(0, 16).replace("T", " ");
26
+ if (catalystDateWithheld(event, field)) return "--";
18
27
  const key = field === "announced" || field === "effective" || field === "deadline" ? field
19
28
  : event.deadlineDate ? "deadline" : event.effectiveDate ? "effective" : "announced";
20
29
  const value = event[`${key}Date`];
@@ -35,15 +44,22 @@ function fitColumns(columns: FitColumn[], width: number): DataTableColumn[] {
35
44
  let kept = columns;
36
45
  const drop = (id: string) => { if (tableNeed(kept) > width) kept = kept.filter((column) => column.id !== id); };
37
46
  for (const id of ["country", "agency", "type"]) drop(id);
47
+ // A long date basis gives up only the cells the table lacks before every column shrinks.
48
+ const over = tableNeed(kept) - width;
49
+ if (over > 0) kept = kept.map((column) => column.id === "basis" ? { ...column, width: Math.max(column.min ?? column.width, column.width - over) } : column);
38
50
  if (tableNeed(kept) > width) kept = kept.map((column) => ({ ...column, width: column.min ?? column.width }));
39
51
  for (const id of ["basis", "parties"]) drop(id);
40
52
  return kept.map(({ min: _min, ...column }) => column);
41
53
  }
42
54
 
43
- export function catalystColumns(width: number, changes: boolean, litigation: boolean): DataTableColumn[] {
55
+ /** The date basis column as wide as its longest label on screen ("Primary completion (actual)"), never narrower than its heading. */
56
+ export const catalystBasisWidth = (events: readonly CatalystEvent[], field: CatalystFilters["dateField"]) =>
57
+ Math.min(27, events.reduce((widest, event) => Math.max(widest, catalystDateBasis(event, field).length), 10));
58
+
59
+ export function catalystColumns(width: number, changes: boolean, litigation: boolean, basisWidth = 10): DataTableColumn[] {
44
60
  return fitColumns([
45
61
  { id: "date", label: changes ? "Observed (UTC)" : "Date", width: changes ? 16 : 10, align: "left" },
46
- ...(!changes ? [{ id: "basis", label: "Date basis", width: 10, align: "left" as const }] : []),
62
+ ...(!changes ? [{ id: "basis", label: "Date basis", width: basisWidth, min: 10, align: "left" as const }] : []),
47
63
  ...(!litigation ? [{ id: "ticker", label: "Ticker", width: width < 110 ? 12 : 14, min: 10, align: "left" as const }] : []),
48
64
  // The entity the event is about, which the title alone buries.
49
65
  { id: "parties", label: "Parties", width: Math.max(16, Math.min(28, Math.round(width * 0.16))), min: 14, align: "left" },
@@ -106,11 +122,12 @@ export function catalystStatusTone(status: string): StateTone {
106
122
  return STATUS_TONES.find(([pattern]) => pattern.test(text))?.[1] ?? "text";
107
123
  }
108
124
 
109
- /** Event types: the adverse ones amber, the binary decisions in the accent, routine rulemaking quiet. */
125
+ /** Event types: the adverse ones amber, the binary decisions in the accent, routine rulemaking quiet, a company's own dates plain. */
110
126
  const TYPE_TONES: Record<CatalystType, StateTone> = {
111
127
  litigation: "warning", antitrust: "warning", recall: "warning", sanctions: "warning", export_control: "warning", tariff: "warning",
112
128
  pdufa: "accent", advisory: "accent", approval: "accent", clinical: "text",
113
129
  regulatory: "muted", rulemaking: "muted",
130
+ results: "text", shareholder_meeting: "text", merger_vote: "text", deal_closing: "text", investor_day: "text",
114
131
  };
115
132
  export const catalystTypeTone = (type: CatalystType): StateTone => TYPE_TONES[type] ?? "text";
116
133
  function changeValue(value: unknown): string {
@@ -151,9 +168,30 @@ export function catalystChangeText(change: CatalystEvent["changes"][number]): st
151
168
  return `${field}: ${changeValue(change.before)} → ${changeValue(change.after)}`;
152
169
  }
153
170
  const MONTHS = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
171
+ /**
172
+ * Rows under their section headings in the order the server sends them:
173
+ * upcoming dates first, then past ones. A heading starts wherever the label
174
+ * changes, so a month today falls in heads its upcoming days and again its
175
+ * past days, after the later months, never pulling a past day ahead of them.
176
+ */
177
+ export function catalystSections(rows: readonly CatalystEvent[], field: CatalystFilters["dateField"], changes: boolean): TableSection<CatalystEvent>[] {
178
+ const sections: TableSection<CatalystEvent>[] = [];
179
+ const seen = new Map<string, number>();
180
+ for (const event of rows) {
181
+ const label = catalystSection(event, field, changes);
182
+ const last = sections.at(-1);
183
+ if (last?.label === label) { last.items.push(event); continue; }
184
+ const repeat = seen.get(label) ?? 0;
185
+ seen.set(label, repeat + 1);
186
+ sections.push({ label, key: repeat ? `${label}:${repeat}` : label, items: [event] });
187
+ }
188
+ return sections;
189
+ }
190
+
154
191
  /** The calendar groups by the month of the date it shows; the change feed by the day a change was observed. */
155
192
  export function catalystSection(event: CatalystEvent, field: CatalystFilters["dateField"], changes: boolean): string {
156
193
  if (changes) return event.observedAt.slice(0, 10);
194
+ if (catalystDateWithheld(event, field)) return CATALYST_DATE_WITHHELD;
157
195
  const date = catalystDate(event, field);
158
196
  if (date === "--") return "Undated";
159
197
  return /^\d{4}-\d{2}/.test(date) ? `${MONTHS[Number(date.slice(5, 7)) - 1]} ${date.slice(0, 4)}` : date;
@@ -206,10 +244,18 @@ export function catalystEmptyTitle(data: Pick<CatalystResponse, "coverage"> | nu
206
244
  return `No cases linked to ${query.symbol}.${courts.length ? ` ${courts.join(" and ")} are not collected yet, so only agency and regulator actions show.` : ""}`;
207
245
  }
208
246
 
247
+ /** "Primary completion (est.)" or "(actual)", as the registry types the date; never a bare "Completion". */
248
+ function primaryCompletionLabel(event: Pick<CatalystEvent, "metadata">): string {
249
+ const completion = event.metadata?.primaryCompletion;
250
+ const type = completion && typeof completion === "object" && "type" in completion ? String(completion.type).toUpperCase() : "";
251
+ return type === "ESTIMATED" ? "Primary completion (est.)" : type === "ACTUAL" ? "Primary completion (actual)" : "Primary completion";
252
+ }
253
+
209
254
  export function catalystDateBasis(event: CatalystEvent, field: CatalystFilters["dateField"] = "any"): string {
255
+ if (catalystDateWithheld(event, field)) return CATALYST_DATE_WITHHELD;
210
256
  const basis = field === "any" || !field ? event.deadlineDate ? "deadline" : event.effectiveDate ? "effective" : event.announcedDate ? "announced" : "undated" : field;
211
257
  const meaning = String(event.metadata?.[`${basis}Meaning`] ?? event.metadata?.[`${basis}DateMeaning`] ?? "");
212
- if (/primary completion/i.test(meaning)) return "Completion";
258
+ if (/primary completion/i.test(meaning)) return primaryCompletionLabel(event);
213
259
  if (/comment/i.test(meaning)) return "Comments";
214
260
  if (/meeting/i.test(meaning)) return "Meeting";
215
261
  return catalystLabel(basis);
@@ -12,6 +12,7 @@ import { usePaneTickerIdentity } from "../../../state/hooks/pane-ticker";
12
12
  import { useThemeColors } from "../../../theme/theme-context";
13
13
  import type { PaneProps } from "../../../types/plugin";
14
14
  import { Box, Text, useUiCapabilities, type ScrollBoxRenderable } from "../../../ui";
15
+ import { withCountryFlag } from "../../../components/ui/country-flag";
15
16
  import { SignInWall } from "../cloud/auth-actions";
16
17
  import { CLOUD_PLAN_KEY, useCloudUpgradeAction } from "../shared/cloud-upgrade";
17
18
  import { useOpenDescription } from "../shared/open-description";
@@ -20,7 +21,7 @@ import { listingCell, toneColor } from "../shared/research-cells";
20
21
  import { isCloudSessionRequired, useResearchCloudSession } from "../shared/research-cloud-session";
21
22
  import { loadCatalystDetail, loadCatalysts, validateCatalysts } from "./client";
22
23
  import { CatalystEventDetail } from "./detail";
23
- import { catalystAgency, catalystCell, catalystColumns, catalystEmptyTitle, catalystLabel, catalystQuery, catalystSection, catalystStatusTone, catalystSymbol, catalystTab, catalystTypeTone, CATALYST_TABS } from "./model";
24
+ import { catalystAgency, catalystBasisWidth, catalystCell, catalystColumns, catalystEmptyTitle, catalystLabel, catalystQuery, catalystSections, catalystStatusTone, catalystSymbol, catalystTab, catalystTypeTone, CATALYST_TABS } from "./model";
24
25
 
25
26
  type Row = SectionedRow<CatalystEvent> | { kind: "locked"; key: string };
26
27
  const rowKey = (row: Row) => row.key;
@@ -81,12 +82,7 @@ export function CatalystView({ width, height, focused, symbol, litigation = fals
81
82
  const lockedRows = Math.min(3, data?.access?.lockedRows ?? 0);
82
83
  // Grouped by month on the calendar and by day in the change feed, in the order the server sends them.
83
84
  const items = useMemo<Row[]>(() => {
84
- const groups = new Map<string, CatalystEvent[]>();
85
- for (const event of rows) {
86
- const label = catalystSection(event, query.dateField, tab === "changes");
87
- groups.set(label, [...(groups.get(label) ?? []), event]);
88
- }
89
- return [...buildSectionedRows([...groups].map(([label, events]) => ({ label, items: events })), (event) => event.id),
85
+ return [...buildSectionedRows(catalystSections(rows, query.dateField, tab === "changes"), (event) => event.id),
90
86
  ...Array.from({ length: lockedRows }, (_, index): Row => ({ kind: "locked", key: `locked:${index}` }))];
91
87
  }, [rows, query.dateField, tab, lockedRows]);
92
88
  const listedOpen = rows.find((event) => event.id === openId) ?? null;
@@ -124,7 +120,7 @@ export function CatalystView({ width, height, focused, symbol, litigation = fals
124
120
  ...(tab === "calendar" ? [{ id: "upcoming", kind: "toggle" as const, label: "Upcoming", value: filters.upcoming === true, onChange: (value: boolean) => changeFilter("upcoming", value) },
125
121
  { id: "date", label: "Date", value: String(filters.dateField ?? "any"), options: [{ value: "any", label: "Any date" }, { value: "announced", label: "Announced" }, { value: "effective", label: "Effective" }, { value: "deadline", label: "Deadlines" }], onChange: (value: string) => changeFilter("dateField", value) }] : []),
126
122
  ]} />;
127
- const columns = catalystColumns(width, tab === "changes", litigation);
123
+ const columns = catalystColumns(width, tab === "changes", litigation, catalystBasisWidth(rows, query.dateField));
128
124
  const renderCell = (row: Row, column: (typeof columns)[number], _index: number, state: { selected: boolean }): DataTableCell => {
129
125
  if (row.kind === "locked") {
130
126
  if (!desktop && column.id === "title" && row.key === "locked:0") return { text: "Upgrade for every catalyst and its history", content: <UpgradeLabel text="Upgrade for every catalyst and its history" onPress={openUpgrade} role="catalysts-upgrade" />, onMouseDown: openUpgrade };
@@ -141,6 +137,8 @@ export function CatalystView({ width, height, focused, symbol, litigation = fals
141
137
  }
142
138
  if (column.id === "parties") return { text, color: text === "--" ? colors.textMuted : colors.textBright };
143
139
  if (column.id === "type") return { text, color: toneColor(catalystTypeTone(event.type), colors) };
140
+ // The column has room for the flag beside a code.
141
+ if (column.id === "country") return withCountryFlag({ text, color: colors.textDim }, text, desktop);
144
142
  if (column.id === "status") return { text, color: tab === "changes" ? colors.text : toneColor(catalystStatusTone(event.status), colors) };
145
143
  return { text, color: column.id === "title" || column.id === "date" ? colors.text : colors.textDim };
146
144
  };
@@ -49,6 +49,11 @@ export function validateCentralBankRates(payload: CentralBankRatesPayload): Cent
49
49
  if (row.nextMeeting && row.nextMeeting.kind !== undefined && row.nextMeeting.kind !== "decision" && row.nextMeeting.kind !== "fixing") delete row.nextMeeting.kind;
50
50
  if (row.nextMeetingStatus !== undefined && !["scheduled", "not-published", "not-verified", "no-policy-rate"].includes(row.nextMeetingStatus)) delete row.nextMeetingStatus;
51
51
  if (row.seriesNotes !== undefined && !strings(row.seriesNotes)) delete row.seriesNotes;
52
+ // A decision date is a citation: one that is not a real day on or before the change it is for, from an https page, is left out.
53
+ const decision = row.lastDecision;
54
+ if (decision !== undefined && decision !== null && (typeof decision !== "object" || decision.date == null || !dateOrNull(decision.date)
55
+ || row.lastChangeDate == null || decision.date > row.lastChangeDate || decision.sourceUrl == null || !urlOrNull(decision.sourceUrl)
56
+ || !Number.isFinite(Date.parse(decision.verifiedAt)) || decision.kind !== undefined && decision.kind !== "decision" && decision.kind !== "fixing")) delete row.lastDecision;
52
57
  }
53
58
  return payload;
54
59
  }
@@ -1,10 +1,17 @@
1
1
  import type { HeadlessPaneColumn, HeadlessPaneDefinition } from "../../../types/plugin";
2
+ import { CENTRAL_BANKS, centralBankNames } from "../../../utils/central-banks";
2
3
  import { fetchCentralBankRates } from "./client";
3
- import { hasNoPolicyRate, policyExportRow, policyNextMeetingText, policyNotices } from "./model";
4
+ import {
5
+ hasNoPolicyRate, policyExportRow, policyLastDecisionText, policyNextMeetingText, policyNotices, policyRate, policyUnlistedNote,
6
+ } from "./model";
4
7
 
5
- /** The citation block every export row carries, headed as a journalist's spreadsheet names it. */
8
+ /**
9
+ * The citation block every export row carries, headed as a journalist's
10
+ * spreadsheet names it. `source` and `as_of` are the row's own, so the
11
+ * export's fixed columns of the same names are not added again.
12
+ */
6
13
  const CITATION_FIELDS = [
7
- "central_bank", "source", "series_id", "source_url", "as_of",
14
+ "central_bank", "source", "series_id", "source_url", "as_of", "last_decision",
8
15
  "next_meeting", "next_meeting_kind", "next_meeting_source_url", "next_meeting_verified_at", "citation",
9
16
  ];
10
17
 
@@ -16,8 +23,22 @@ const BOARD_COLUMNS: HeadlessPaneColumn[] = [
16
23
  { key: "asOf", header: "As of", shrink: false }, { key: "status", header: "Status", stackPriority: 2 }, { key: "instrument", header: "Instrument", stackPriority: 3 },
17
24
  ];
18
25
 
26
+ const percentCell = (value: unknown) => policyRate(typeof value === "number" ? value : null);
27
+
28
+ /**
29
+ * The board's columns as CSV and NDJSON write them: the rate as a number (a
30
+ * target range's midpoint, which the board ranks and charts) with the range's
31
+ * bounds beside it, where the text draws "3.75-4.00%".
32
+ */
33
+ const EXPORT_BOARD_COLUMNS: HeadlessPaneColumn[] = BOARD_COLUMNS.flatMap((column): HeadlessPaneColumn[] => column.key !== "valueText" ? [column] : [
34
+ { key: "value", header: "Rate", align: "right", format: percentCell },
35
+ { key: "rangeLower", header: "Range lower", align: "right", format: percentCell },
36
+ { key: "rangeUpper", header: "Range upper", align: "right", format: percentCell },
37
+ ]);
38
+
19
39
  export const centralBankRatesHeadless: HeadlessPaneDefinition<"bundle"> = {
20
- discovery: { aliases: ["CBR", "CBRT"], dataRequirements: ["Gloom Cloud central-bank-rates endpoint"],
40
+ // A bank's name or short form typed as a function (`fn ECB`, `fn BOJ`) points here, unless a function owns the word (FOMC is WIRP).
41
+ discovery: { aliases: ["CBR", "CBRT"], suggestFor: CENTRAL_BANKS.flatMap(centralBankNames), dataRequirements: ["Gloom Cloud central-bank-rates endpoint"],
21
42
  limitations: ["Published policy observations with individual dates.", "Policy instruments differ.",
22
43
  "Next meetings come from each bank's published calendar; SAMA publishes none, and China's date is the monthly LPR fixing."] },
23
44
  shape: "bundle",
@@ -33,19 +54,24 @@ export const centralBankRatesHeadless: HeadlessPaneDefinition<"bundle"> = {
33
54
  // A row says "stale" in its status, not in a `stale` flag: hand the report its rows' staleness so its status line and a capture count them.
34
55
  const observations = data.rows.filter((row) => row.status !== "unavailable")
35
56
  .map((row) => ({ asOf: row.asOf, stale: row.status === "stale" }));
36
- const exported = data.rows.map(policyExportRow);
57
+ // Members with no policy rate stay off the board, as the pane keeps them, so every output counts the same rows; a note says why.
58
+ const listed = data.rows.filter((row) => !hasNoPolicyRate(row));
59
+ const exported = listed.map(policyExportRow);
37
60
  // A caveat on most rows ("Change date is the first observed new level...") is said once for the report.
38
61
  const shared = [...new Set(exported.flatMap((row) => row.notes))]
39
62
  .filter((note) => exported.filter((row) => row.notes.includes(note)).length > 1);
40
63
  const rows = exported.map((row) => ({ ...row, notes: row.notes.filter((note) => !shared.includes(note)) }));
41
- return { complete, freshness: { observations }, ...(shared.length ? { notes: shared } : {}), sections: [{ title: "Policy rates",
42
- columns: [...BOARD_COLUMNS, ...CITATION_FIELDS.map((key): HeadlessPaneColumn => ({ key, header: key, literalHeader: true }))],
64
+ const notes = [...shared, ...data.rows.filter(hasNoPolicyRate).map(policyUnlistedNote)];
65
+ return { complete, freshness: { observations }, ...(notes.length ? { notes } : {}), sections: [{ title: "Policy rates",
66
+ columns: [...EXPORT_BOARD_COLUMNS, ...CITATION_FIELDS.map((key): HeadlessPaneColumn => ({ key, header: key, literalHeader: true })),
67
+ { key: "notes", header: "notes", literalHeader: true, format: (value) => Array.isArray(value) ? value.join(" ") : "" }],
43
68
  rows,
44
- // The text keeps the board's table; each row's bank, next meeting and citation go under it.
69
+ // The text keeps the board's table; each row's bank, last and next decision, citation and own caveats go under it.
45
70
  textColumns: [...BOARD_COLUMNS, { key: "detail", header: "Detail", underRow: true }],
46
71
  textRows: rows.map((row, index) => {
47
- const source = data.rows[index]!;
48
- return { ...row, detail: `${row.central_bank ?? "No central bank"} · ${policyNextMeetingText(source)}\n${row.citation}` };
72
+ const source = listed[index]!;
73
+ const detail = [`${row.central_bank ?? "No central bank"} · ${policyLastDecisionText(source)}${policyNextMeetingText(source)}`, row.citation];
74
+ return { ...row, detail: [...detail, ...(row.notes.length ? [row.notes.join(" ")] : [])].join("\n") };
49
75
  }),
50
76
  }], errors, unavailableSymbols: data.rows.filter((row) => row.status === "unavailable" && !hasNoPolicyRate(row)).map((row) => row.id),
51
77
  // A year of daily history per row is most of the payload, so JSON carries it only on request.
@@ -20,7 +20,9 @@ export function policyHistory(row: CentralBankRow) {
20
20
  }
21
21
  export interface PolicyBoardRow extends MarketBoardRow { observation: CentralBankRow }
22
22
  export function policyBoardRow(row: CentralBankRow): PolicyBoardRow {
23
- return { id: row.id, label: row.label, labelDetail: row.instrument, value: row.value, valueText: policyLevel(row),
23
+ // One country's bank leads with its flag; the euro area's with the EU's.
24
+ const country = row.countryCodes.length === 1 ? row.countryCodes[0]! : row.label;
25
+ return { id: row.id, label: row.label, labelDetail: row.instrument, country, value: row.value, valueText: policyLevel(row),
24
26
  change: row.changeBps, changeText: policyChange(row), changeAsOf: row.lastChangeDate,
25
27
  percentile: row.percentile.value, asOf: row.asOf, status: row.status, observation: row,
26
28
  history: policyHistory(row).flatMap((point) => point.value == null ? [] : [{ date: new Date(point.date), close: point.value }]) };
@@ -97,27 +99,50 @@ export function policyNextMeetingText(row: CentralBankRow): string {
97
99
  }
98
100
 
99
101
  /**
100
- * What an export says about one row, history aside: the board's figures and
101
- * a citation block, `central_bank` to `citation`, named as CSV heads them.
102
- * Notes keep the caveats on the latest rate; the BIS series definition goes
103
- * with the history (`--history`).
102
+ * `last decision 2026-09-18 · ` (or `last LPR fixing`) before the next
103
+ * meeting on a row's detail line; nothing when the server gives no date.
104
+ */
105
+ export function policyLastDecisionText(row: CentralBankRow): string {
106
+ const decision = row.lastDecision;
107
+ if (!decision) return "";
108
+ return `last ${decision.kind === "fixing" ? "LPR fixing" : "decision"} ${decision.date} · `;
109
+ }
110
+
111
+ /**
112
+ * What an export says about one row, history aside: the board's figures, a
113
+ * target range's bounds as numbers (`rangeLower`, `rangeUpper`; the rate is
114
+ * its midpoint) and a citation block, `central_bank` to `citation`, named as
115
+ * CSV heads them. `last_decision` is the bank's latest kept decision on or
116
+ * before the observed change. Notes keep the caveats on the latest rate; the
117
+ * BIS series definition goes with the history (`--history`).
104
118
  */
105
119
  export function policyExportRow(row: CentralBankRow) {
106
120
  const board = policyBoardRow({ ...row, history: [] });
107
121
  const meeting = policyNextMeeting(row);
108
122
  return {
109
123
  id: row.id, label: row.label, instrument: row.instrument, central_bank: row.centralBank,
110
- value: row.value, unit: row.unit, range: row.range, valueText: board.valueText,
111
- changeBps: row.changeBps, changeText: board.changeText, lastChangeDate: row.lastChangeDate,
124
+ value: row.value, unit: row.unit, range: row.range, rangeLower: row.range?.lower ?? null, rangeUpper: row.range?.upper ?? null,
125
+ valueText: board.valueText, changeBps: row.changeBps, changeText: board.changeText, lastChangeDate: row.lastChangeDate,
112
126
  previousValue: row.previousValue, percentileValue: row.percentile.value,
113
127
  asOf: row.asOf, lagDays: row.lagDays, status: row.status, unavailableReason: row.unavailableReason,
114
128
  source: policySource(row), series_id: row.sourceSeriesIds.join(", ") || null, source_url: policySeriesUrls(row).join(" ") || null,
115
- as_of: row.asOf, next_meeting: meeting.text, next_meeting_kind: meeting.kind,
129
+ as_of: row.asOf, last_decision: row.lastDecision?.date ?? null, next_meeting: meeting.text, next_meeting_kind: meeting.kind,
116
130
  next_meeting_source_url: meeting.sourceUrl, next_meeting_verified_at: meeting.verifiedAt,
117
131
  citation: policyCitation(row), notes: row.notes.filter((note) => !row.seriesNotes?.includes(note)),
118
132
  };
119
133
  }
120
134
 
135
+ /**
136
+ * Why a member with no policy rate is left off the board and its exports:
137
+ * `Argentina is not listed: no adopted policy rate (BIS series D.AR, https://...).`
138
+ */
139
+ export function policyUnlistedNote(row: CentralBankRow): string {
140
+ const source = policySource(row);
141
+ const urls = policySeriesUrls(row);
142
+ const series = source && row.sourceSeriesIds.length > 0 ? `${source} series ${row.sourceSeriesIds.join(" and ")}${urls.length ? `, ${urls.join(" ")}` : ""}` : null;
143
+ return `${row.label} is not listed: ${row.instrument.toLowerCase()}${series ? ` (${series})` : ""}.`;
144
+ }
145
+
121
146
  /** Who a chart of the row's series cites: `FRED series ECBDFR`, published by the European Central Bank. */
122
147
  export function policySeriesAttribution(row: CentralBankRow): { source: string; publisher?: string } | null {
123
148
  const source = policySource(row);
@@ -286,6 +286,7 @@ export const changelogModule: PluginModule = {
286
286
  name: "Changelog",
287
287
  icon: "L",
288
288
  component: ChangelogPane,
289
+ reportFreshness: { status: "not-a-feed", basis: "release notes" },
289
290
  defaultPosition: "right",
290
291
  defaultMode: "floating",
291
292
  defaultFloatingSize: { width: 100, height: 32 },
@@ -6,6 +6,7 @@ import {
6
6
  import type { SeriesCatalogEntry, SeriesFrequency, SeriesInput, SeriesPlacement } from "../../../series/types";
7
7
  import { parseOptionSymbol } from "../../../utils/options";
8
8
  import type { SeriesCatalogInstrument } from "./series-catalog";
9
+ import { macroReleaseTopic } from "../shared/macro-releases";
9
10
 
10
11
  export const CHART_COMPOSER_TEMPLATE_ID = "chart-composer-pane";
11
12
  export const DATA_CATALOG_PANE_ID = "data-catalog";
@@ -59,6 +60,7 @@ const GROUP_ORDER = [
59
60
  "Inflation",
60
61
  "FX",
61
62
  "Energy",
63
+ "Commodities",
62
64
  "Volatility",
63
65
  "Sentiment",
64
66
  "Positioning",
@@ -357,6 +359,7 @@ export function catalogEmptyCopy(
357
359
  ): { title: string; hint?: string } {
358
360
  if (loading) return { title: "Loading catalog…" };
359
361
  const query = searchQuery.trim();
360
- if (query) return { title: `No series matching "${query}"`, hint: "Press / to search." };
362
+ // A PMI or a nowcast is a calendar release, not a series: say where it is rather than search again.
363
+ if (query) return { title: `No series matching "${query}"`, hint: macroReleaseTopic(query)?.paneHint ?? "Press / to search." };
361
364
  return { title: "No series", hint: "Press / to search." };
362
365
  }
@@ -210,7 +210,7 @@ function effectiveSeriesUnitGroup(series: ChartSeriesSpec): string {
210
210
  : getTimeSeriesField(series.source.fieldId)?.unitGroup ?? series.source.fieldId;
211
211
  }
212
212
 
213
- function nextGeneratedPanelId(
213
+ export function nextGeneratedPanelId(
214
214
  spec: Pick<ChartSpec, "panels" | "series" | "studies">,
215
215
  prefix = "panel",
216
216
  ): string {
@@ -416,6 +416,7 @@ export function panelsForSeries(series: readonly ChartSeriesSpec[], studies: rea
416
416
  ...(id === "rsi" || id === "macd" || id === "atr" ? { label: id.toUpperCase(), height: 0.28 } : {}),
417
417
  ...(id === "formula" ? { label: "Formula", height: 0.3 } : {}),
418
418
  ...(id === "correlation" ? { label: "Correlation", height: 0.3 } : {}),
419
+ ...(id === "decay" ? { label: "Decay", height: 0.3 } : {}),
419
420
  ...(id === "realized-vol" ? { label: "Realized Volatility", height: 0.3 } : {}),
420
421
  ...(/^panel-\d+$/.test(id) ? { label: `Panel ${id.slice("panel-".length)}`, height: 0.35 } : {}),
421
422
  }));
@@ -495,7 +496,7 @@ export function reconcilePanels(
495
496
  ): ChartPanelSpec[] {
496
497
  const defaults = panelsForSeries(series, studies);
497
498
  const requiredIds = new Set(defaults.map((panel) => panel.id));
498
- const managedStudyPanelIds = new Set(["volume", "rsi", "macd", "atr", "formula", "correlation", "realized-vol"]);
499
+ const managedStudyPanelIds = new Set(["volume", "rsi", "macd", "atr", "formula", "correlation", "realized-vol", "decay"]);
499
500
  const retained = existing.filter((panel) => (
500
501
  requiredIds.has(panel.id) || !managedStudyPanelIds.has(panel.id)
501
502
  ));
@@ -10,6 +10,12 @@ import { isRecord } from "../../../utils/guards";
10
10
 
11
11
  export const CHART_SPEC_SETTING_KEY = "chartSpec";
12
12
  export const CHART_INTERACTION_VIEWPORT_SETTING_KEY = "chartInteractionViewport";
13
+ /**
14
+ * Set on a comparison CMP opens until its funds' facts have been read: the
15
+ * pane then draws each leveraged or inverse fund's daily objective once, and
16
+ * drops the flag, so a line the researcher removes stays removed.
17
+ */
18
+ export const CHART_LEVERAGE_PENDING_SETTING_KEY = "leverageObjectivesPending";
13
19
  /** A shared link's pinned crosshair: the chart pins its tab there once on open, then drops it. */
14
20
  export const CHART_PINNED_MOMENT_SETTING_KEY = "chartPinnedMoment";
15
21
  /** The earliest history a chart reads (FRED series from 1900), and how far ahead one runs. */
@@ -105,6 +111,7 @@ function decodeSpec(value: unknown): unknown {
105
111
  try {
106
112
  return JSON.parse(trimmed);
107
113
  } catch {
114
+ // Intentional ignore: malformed serialized specifications fail validation with null for the caller.
108
115
  return null;
109
116
  }
110
117
  }
@@ -1,10 +1,10 @@
1
1
  import type { HeadlessPaneOptionValues } from "../../../types/headless";
2
2
  import {
3
- CHART_RESOLUTIONS,
4
3
  TIME_RANGES,
5
4
  type ChartResolution,
6
5
  type TimeRange,
7
6
  } from "../../../time-series/range";
7
+ import { parseChartResolution } from "../../../time-series/resolution";
8
8
  import {
9
9
  coerceSeriesTransformForStyle,
10
10
  normalizeChartSpec,
@@ -36,14 +36,11 @@ export function yearToDateWindow(spec: ChartSpec, now = Date.now()): { start: st
36
36
  }
37
37
 
38
38
  function chartResolution(options: HeadlessPaneOptionValues): ChartResolution | null {
39
- const value = options.chartResolution ?? options.resolution;
40
- return typeof value === "string" && (CHART_RESOLUTIONS as readonly string[]).includes(value)
41
- ? value as ChartResolution
42
- : null;
39
+ return parseChartResolution(options.chartResolution ?? options.resolution);
43
40
  }
44
41
 
45
- function financialPeriod(value: unknown): SeriesPeriod | null {
46
- return value === "annual" || value === "quarterly" || value === "ttm" ? value : null;
42
+ function financialPeriod(value: unknown, valuation: boolean): SeriesPeriod | null {
43
+ return value === "annual" || value === "quarterly" || value === "ttm" || (valuation && value === "daily") ? value : null;
47
44
  }
48
45
 
49
46
  function mapSecuritySeries(
@@ -98,15 +95,15 @@ export function applyChartComposerCapabilityOptions(
98
95
  const graphKind = capabilityId === "fundamental-series"
99
96
  ? "fundamental"
100
97
  : capabilityId === "valuation-series" ? "valuation" : null;
101
- if (graphKind && typeof options.metric === "string") {
102
- const period = financialPeriod(options.period);
98
+ if (graphKind) {
99
+ const period = financialPeriod(options.period, graphKind === "valuation");
103
100
  next = {
104
101
  ...next,
105
102
  series: mapSecuritySeries(next.series, (entry) => ({
106
103
  ...entry,
107
104
  source: entry.source.kind === "security" ? {
108
105
  ...entry.source,
109
- fieldId: `${graphKind}.${options.metric}`,
106
+ ...(typeof options.metric === "string" ? { fieldId: `${graphKind}.${options.metric}` } : {}),
110
107
  ...(period ? { period } : {}),
111
108
  } : entry.source,
112
109
  })),
@@ -1,3 +1,4 @@
1
+ import { logFailure } from "../../../utils/log-failure";
1
2
  import { useCallback, useEffect, useMemo, useState } from "react";
2
3
  import { Box } from "../../../ui";
3
4
  import {
@@ -10,6 +11,7 @@ import {
10
11
  type DataTableKeyEvent,
11
12
  type DataTableRootKeyContext,
12
13
  } from "../../../components";
14
+ import { usePaneRefreshKey } from "../../../components/data-table/table-pane";
13
15
  import type { PaneProps } from "../../../types/plugin";
14
16
  import { colors } from "../../../theme/colors";
15
17
  import { nextHeaderSort, type SortDirection } from "../../../utils/sort-values";
@@ -117,14 +119,15 @@ export function DataCatalogPane({ focused, width, height }: PaneProps) {
117
119
  const [sortPreference, setSortPreference] = useState<CatalogSortPreference>(DEFAULT_SORT);
118
120
  const { active: searchFocused, focus: focusSearch, searchProps } = useQueryBarSearch();
119
121
 
120
- const entries = useRegisteredSeries();
122
+ const { entries, loading: catalogLoading, error: catalogError, retry } = useRegisteredSeries();
123
+ usePaneRefreshKey(() => { void retry(); }, { focused, enabled: !searchFocused });
121
124
  const catalogRows = useMemo(() => catalogRowsFromEntries(entries), [entries]);
122
125
  const filter = normalizeCatalogFilter(savedFilter, catalogRows);
123
126
  const tickerQuery = looksLikeCatalogTickerQuery(searchQuery);
124
127
  const { instruments, loading: universeLoading } = useCatalogUniverse(
125
128
  tickerQuery ? searchQuery : "",
126
129
  );
127
- const loading = tickerQuery && universeLoading;
130
+ const loading = catalogLoading || (tickerQuery && universeLoading);
128
131
  const emptyCopy = catalogEmptyCopy(loading, searchQuery);
129
132
 
130
133
  const listedCrypto = useMemo(
@@ -194,7 +197,7 @@ export function DataCatalogPane({ focused, width, height }: PaneProps) {
194
197
  }}
195
198
  />
196
199
  ),
197
- }).catch(() => undefined);
200
+ }).catch(logFailure("chart-composer.data-catalog-pane", "Open chart ticker prompt failed"));
198
201
  if (chartPlacedSeries(row, ticker)) return;
199
202
  const expression = catalogExpressionForRow(row, ticker);
200
203
  if (!expression) return;
@@ -246,6 +249,7 @@ export function DataCatalogPane({ focused, width, height }: PaneProps) {
246
249
  source: selectedUrl ? selectedRow?.publisher : null,
247
250
  label: "source",
248
251
  loading,
252
+ error: catalogError,
249
253
  hints: [
250
254
  { id: "graph", key: "g", label: "raph", onPress: () => chartSelected(selectedRow), disabled: !selectedRow },
251
255
  { id: "search", key: "/", label: "search", onPress: focusSearch },
@@ -189,6 +189,8 @@ export function useSeriesEditorController({
189
189
  const {
190
190
  suggestions: quickAddSuggestions,
191
191
  loading: quickAddLoading,
192
+ error: quickAddError,
193
+ retry: retryQuickAdd,
192
194
  } = useSeriesCatalogSuggestions({
193
195
  query: quickAddQuery,
194
196
  defaultInstrument,
@@ -636,6 +638,8 @@ export function useSeriesEditorController({
636
638
  quickAddActive,
637
639
  quickAddItems,
638
640
  quickAddLoading,
641
+ quickAddError,
642
+ retryQuickAdd,
639
643
  quickAddQuery,
640
644
  quickAddRef,
641
645
  quickAddSelection,
@@ -74,12 +74,14 @@ function seriesFieldId(series: ChartSeriesSpec): string {
74
74
 
75
75
  function compatiblePeriods(series: ChartSeriesSpec): SeriesPeriod[] {
76
76
  if (series.source.kind !== "security") return [];
77
+ if (series.source.fieldId.startsWith("valuation.") && series.source.fieldId !== "valuation.realizedNtmPE") return ["daily", ...FINANCIAL_PERIODS];
77
78
  return series.source.fieldId.startsWith("market.") ? MARKET_PERIODS : FINANCIAL_PERIODS;
78
79
  }
79
80
 
80
81
  export function supportsSeriesTimestampMode(series: ChartSeriesSpec | null): boolean {
81
82
  return !!series
82
83
  && series.source.kind === "security"
84
+ && series.source.period !== "daily"
83
85
  && isFundamentalFieldId(series.source.fieldId);
84
86
  }
85
87
 
@@ -1,5 +1,5 @@
1
1
  import { Box, Text, useNativeRenderer, useUiCapabilities } from "../../../ui";
2
- import { DialogFrame, ListView, TextField } from "../../../components/ui";
2
+ import { EmptyState, DialogFrame, ListView, TextField } from "../../../components/ui";
3
3
  import type { PromptContext } from "../../../ui/dialog";
4
4
  import { colors } from "../../../theme/colors";
5
5
  import type { ChartSpec } from "../../../time-series/types";
@@ -49,6 +49,8 @@ export function SeriesEditorDialog({ dialogId, resolve, initialSpec }: SeriesEdi
49
49
  quickAddActive,
50
50
  quickAddItems,
51
51
  quickAddLoading,
52
+ quickAddError,
53
+ retryQuickAdd,
52
54
  quickAddQuery,
53
55
  quickAddRef,
54
56
  quickAddSelection,
@@ -122,7 +124,7 @@ export function SeriesEditorDialog({ dialogId, resolve, initialSpec }: SeriesEdi
122
124
  onBlur={deactivateQuickAdd}
123
125
  />
124
126
 
125
- {quickAddActive && quickAddQuery.trim() && (
127
+ {(quickAddActive || quickAddError) && quickAddQuery.trim() && (
126
128
  quickAddItems.length > 0 ? (
127
129
  <Box width={contentWidth} overflow="hidden">
128
130
  <ListView
@@ -137,11 +139,14 @@ export function SeriesEditorDialog({ dialogId, resolve, initialSpec }: SeriesEdi
137
139
  onActivate={(_, index) => { beginQuickAdd(); addCatalogSuggestion(quickAddSuggestions[index]); }}
138
140
  />
139
141
  </Box>
140
- ) : (
142
+ ) : !quickAddError ? (
141
143
  <Text fg={colors.textMuted}>
142
144
  {quickAddLoading ? "Searching instruments…" : "No matching security or metric."}
143
145
  </Text>
144
- )
146
+ ) : null
147
+ )}
148
+ {quickAddQuery.trim() && quickAddError && (
149
+ <EmptyState title={quickAddError} status="error" retry={{ onRetry: () => { beginQuickAdd(); return retryQuickAdd(); } }} />
145
150
  )}
146
151
 
147
152
  {items.length > 0 ? (