gloomberb 0.18.3 → 0.18.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (886) hide show
  1. package/README.md +8 -8
  2. package/README.zh-CN.md +11 -11
  3. package/bin/{gloomberb → gloom} +3 -1
  4. package/package.json +6 -2
  5. package/src/account/checkout-handoff.tsx +225 -0
  6. package/src/account/device-signin-dialog.tsx +2 -2
  7. package/src/account/device-signin.ts +2 -2
  8. package/src/account/upgrade-dialog.tsx +1 -1
  9. package/src/api-client/askg.ts +2 -2
  10. package/src/api-client/auth.ts +2 -2
  11. package/src/api-client/central-bank-rates.ts +6 -0
  12. package/src/api-client/collections.ts +5 -1
  13. package/src/api-client/cot.ts +2 -0
  14. package/src/api-client/crypto-etf-flows.ts +37 -0
  15. package/src/api-client/crypto-markets.ts +60 -0
  16. package/src/api-client/data.ts +84 -5
  17. package/src/api-client/doe.ts +15 -0
  18. package/src/api-client/equity-screener.ts +28 -0
  19. package/src/api-client/exchange-announcements.ts +38 -0
  20. package/src/api-client/fund-facts.ts +39 -0
  21. package/src/api-client/futures-curve.ts +9 -1
  22. package/src/api-client/hiring.ts +301 -0
  23. package/src/api-client/index.ts +22 -5
  24. package/src/api-client/market-discovery.ts +14 -0
  25. package/src/api-client/members.ts +6 -0
  26. package/src/api-client/mna.ts +6 -0
  27. package/src/api-client/paths.ts +18 -1
  28. package/src/api-client/request.ts +21 -4
  29. package/src/api-client/short-side-publications.ts +37 -0
  30. package/src/api-client/socket.ts +64 -4
  31. package/src/api-client/swap-curve.ts +35 -0
  32. package/src/api-client/themes.ts +7 -1
  33. package/src/api-client/types.ts +90 -2
  34. package/src/app/pane-runtime/plugin-bindings.ts +9 -2
  35. package/src/app/runtime/desktop-deeplink.ts +5 -5
  36. package/src/app/runtime/plugin-bindings.ts +2 -2
  37. package/src/app/runtime/startup.ts +13 -0
  38. package/src/app/star-prompt/status-line.tsx +2 -2
  39. package/src/architecture/core-builtin-allowlist.json +5 -2
  40. package/src/architecture/ui-literals-allowlist.json +3 -3
  41. package/src/architecture/ui-tokens-allowlist.json +1 -1
  42. package/src/brokers/broker-portfolio-sync.ts +37 -0
  43. package/src/brokers/directory.ts +11 -0
  44. package/src/brokers/logos.ts +3 -1
  45. package/src/brokers/signed-in/adapter.ts +304 -26
  46. package/src/brokers/signed-in/client.ts +14 -2
  47. package/src/brokers/signed-in/connect.ts +10 -2
  48. package/src/brokers/sync-broker-instance.ts +9 -1
  49. package/src/capabilities/chart-series.ts +22 -6
  50. package/src/cli/bank-section.ts +1 -1
  51. package/src/cli/base-converter.ts +23 -14
  52. package/src/cli/central-bank-events.ts +1 -1
  53. package/src/cli/command-options.ts +59 -4
  54. package/src/cli/commands/api.ts +9 -6
  55. package/src/cli/commands/broker.ts +2 -2
  56. package/src/cli/commands/command-utils.ts +2 -2
  57. package/src/cli/commands/crypto-hints.ts +7 -20
  58. package/src/cli/commands/fred-series.ts +4 -2
  59. package/src/cli/commands/keybindings.ts +2 -2
  60. package/src/cli/commands/market.ts +1117 -264
  61. package/src/cli/commands/news-hints.ts +2 -2
  62. package/src/cli/commands/news-search.ts +59 -6
  63. package/src/cli/commands/options-leaps.ts +41 -26
  64. package/src/cli/commands/overview.ts +121 -48
  65. package/src/cli/commands/plugins.ts +9 -9
  66. package/src/cli/commands/remote.ts +13 -10
  67. package/src/cli/commands/search.ts +64 -44
  68. package/src/cli/commands/system.ts +27 -19
  69. package/src/cli/commands/themes.ts +1 -1
  70. package/src/cli/commands/ticker.ts +192 -47
  71. package/src/cli/context.ts +3 -2
  72. package/src/cli/desktop-pane-shot-view.ts +2 -2
  73. package/src/cli/desktop-pane-shot.ts +1 -1
  74. package/src/cli/earnings-calendar.ts +4 -4
  75. package/src/cli/entry.ts +18 -1
  76. package/src/cli/errors.ts +20 -2
  77. package/src/cli/exit-codes.ts +1 -1
  78. package/src/cli/export-source.ts +10 -4
  79. package/src/cli/freshness.ts +2 -8
  80. package/src/cli/fx-forward.ts +130 -0
  81. package/src/cli/fx-pair.ts +10 -9
  82. package/src/cli/glossary.ts +64 -20
  83. package/src/cli/help.ts +19 -13
  84. package/src/cli/history-export.ts +126 -0
  85. package/src/cli/history-rows.ts +196 -43
  86. package/src/cli/index-roots.ts +5 -45
  87. package/src/cli/index.ts +24 -18
  88. package/src/cli/known-gaps.ts +118 -25
  89. package/src/cli/listing-arg.ts +300 -41
  90. package/src/cli/name-entries.ts +30 -18
  91. package/src/cli/native-smoke.ts +2 -0
  92. package/src/cli/not-a-ticker.ts +19 -9
  93. package/src/cli/opentui-libc.ts +5 -0
  94. package/src/cli/options.ts +12 -0
  95. package/src/cli/pane-functions/capabilities.ts +75 -20
  96. package/src/cli/pane-functions/catalog.ts +24 -23
  97. package/src/cli/pane-functions/discovery.ts +1 -1
  98. package/src/cli/pane-functions/dom.ts +10 -7
  99. package/src/cli/pane-functions/financial-ratio-shot.ts +2 -2
  100. package/src/cli/pane-functions/freshness.ts +174 -23
  101. package/src/cli/pane-functions/function-help.ts +66 -27
  102. package/src/cli/pane-functions/headless.ts +24 -11
  103. package/src/cli/pane-functions/index.ts +18 -16
  104. package/src/cli/pane-functions/options.ts +22 -2
  105. package/src/cli/pane-functions/report-notices.ts +12 -4
  106. package/src/cli/pane-functions/report.ts +5 -5
  107. package/src/cli/pane-functions/resolver.ts +47 -10
  108. package/src/cli/pane-functions/screenshot-assessment.ts +322 -0
  109. package/src/cli/pane-functions/screenshot-bridge.ts +152 -0
  110. package/src/cli/pane-functions/screenshot-chart-evidence.ts +396 -0
  111. package/src/cli/pane-functions/screenshot-data-evidence.ts +383 -0
  112. package/src/cli/pane-functions/screenshot-evidence.ts +1 -1
  113. package/src/cli/pane-functions/screenshot-payload.ts +453 -0
  114. package/src/cli/pane-functions/screenshot-render.ts +316 -0
  115. package/src/cli/pane-functions/screenshot-types.ts +162 -0
  116. package/src/cli/pane-functions/shot-options.ts +8 -3
  117. package/src/cli/peso-dollar-rates.ts +79 -0
  118. package/src/cli/quote-answer.ts +38 -3
  119. package/src/cli/report-tables.ts +61 -16
  120. package/src/cli/restore-plugins.ts +29 -14
  121. package/src/cli/result.ts +111 -22
  122. package/src/cli/series-search.ts +5 -5
  123. package/src/cli/statement-filings.ts +19 -0
  124. package/src/cli/suffixed-listing-rows.ts +49 -0
  125. package/src/cli/symbol-args.ts +50 -15
  126. package/src/cli/symbol-cells.ts +120 -0
  127. package/src/cli/symbol-list.ts +198 -68
  128. package/src/cli/symbol-rows.ts +131 -25
  129. package/src/cli/ticker-resolution.ts +108 -11
  130. package/src/cli/treasury-yields.ts +5 -5
  131. package/src/cli/types.ts +2 -0
  132. package/src/cli/uncovered-instrument.ts +3 -3
  133. package/src/cli/unknown-command.ts +6 -6
  134. package/src/components/chart/composite/chart-layout.ts +131 -0
  135. package/src/components/chart/composite/composite-chart.tsx +373 -16
  136. package/src/components/chart/composite/interactions.ts +7 -2
  137. package/src/components/chart/composite/legend.tsx +75 -3
  138. package/src/components/chart/composite/levels.ts +5 -0
  139. package/src/components/chart/composite/panel-gestures.ts +41 -0
  140. package/src/components/chart/composite/panel-labels.ts +2 -1
  141. package/src/components/chart/composite/panel-surface.tsx +305 -11
  142. package/src/components/chart/composite/price-axis-labels.tsx +27 -3
  143. package/src/components/chart/composite/rasterizer.ts +44 -19
  144. package/src/components/chart/composite/scene.ts +16 -4
  145. package/src/components/chart/composite/text-renderer.ts +48 -21
  146. package/src/components/chart/composite/toolbar.tsx +52 -5
  147. package/src/components/chart/composite/types.ts +13 -0
  148. package/src/components/chart/composite/use-composite-chart-keyboard.ts +120 -13
  149. package/src/components/chart/composite/use-composite-value-scales.ts +44 -0
  150. package/src/components/chart/composite/use-composite-viewport.ts +12 -3
  151. package/src/components/chart/composite/value-scale.ts +149 -0
  152. package/src/components/chart/composite/volume-profile-paint.ts +6 -3
  153. package/src/components/chart/core/pointer.ts +2 -0
  154. package/src/components/chart-table/index.ts +2 -0
  155. package/src/components/chart-table/read.tsx +74 -0
  156. package/src/components/command-bar/commands/collection-list.ts +41 -19
  157. package/src/components/command-bar/commands/collection.ts +9 -3
  158. package/src/components/command-bar/commands/direct/index.ts +1 -1
  159. package/src/components/command-bar/commands/direct/runtime.ts +3 -2
  160. package/src/components/command-bar/pane-templates/items.ts +59 -6
  161. package/src/components/command-bar/pane-templates/workflow.ts +10 -1
  162. package/src/components/command-bar/routes/root/plugin-install.ts +1 -1
  163. package/src/components/command-bar/routes/root/provider-search.ts +42 -11
  164. package/src/components/command-bar/routes/root/results.ts +18 -4
  165. package/src/components/command-bar/routes/root/runtime.ts +15 -3
  166. package/src/components/command-bar/routes/root/search-providers.ts +25 -2
  167. package/src/components/command-bar/routes/root/selection.ts +6 -1
  168. package/src/components/command-bar/routes/root/shortcut-feedback.ts +4 -1
  169. package/src/components/command-bar/routes/root/shortcuts.ts +30 -3
  170. package/src/components/command-bar/routes/ticker-search/results.ts +73 -4
  171. package/src/components/command-bar/selection-runtime.ts +50 -10
  172. package/src/components/command-bar/surface/index.tsx +24 -2
  173. package/src/components/command-bar/view-model.ts +7 -0
  174. package/src/components/command-bar/workflow/broker.ts +2 -2
  175. package/src/components/command-bar/workflow/collection-actions.ts +46 -7
  176. package/src/components/command-bar/workflow/collection-ticker.ts +32 -4
  177. package/src/components/command-bar/workflow/fields.ts +8 -2
  178. package/src/components/command-bar/workflow/ops.ts +18 -4
  179. package/src/components/command-bar/workflow/portfolio-position.ts +53 -4
  180. package/src/components/command-bar/workflow/submit.ts +3 -2
  181. package/src/components/command-bar/workflow/tickers.ts +5 -1
  182. package/src/components/company-logo.tsx +39 -0
  183. package/src/components/data-table/sections.ts +4 -2
  184. package/src/components/form-modal/confirm.tsx +2 -1
  185. package/src/components/form-modal/request.ts +5 -0
  186. package/src/components/form-modal/routes.ts +4 -1
  187. package/src/components/index.ts +12 -6
  188. package/src/components/layout/header.tsx +7 -6
  189. package/src/components/layout/market-summary.ts +9 -6
  190. package/src/components/layout/pane/capture-status.ts +1 -1
  191. package/src/components/layout/pane/footer/model.ts +11 -5
  192. package/src/components/layout/shell/chrome.ts +19 -6
  193. package/src/components/layout/shell/index.tsx +2 -1
  194. package/src/components/layout/shell/pane/layers.tsx +19 -1
  195. package/src/components/layout/status-bar.tsx +2 -2
  196. package/src/components/market-board/index.tsx +11 -3
  197. package/src/components/onboarding/onboarding-wizard.tsx +1 -0
  198. package/src/components/onboarding/portfolio-step/broker-setup-panel.tsx +2 -2
  199. package/src/components/onboarding/wizard-broker-sync.ts +4 -1
  200. package/src/components/pane-settings-dialog/desktop.tsx +20 -7
  201. package/src/components/pane-settings-dialog/tui.tsx +17 -9
  202. package/src/components/pane-settings-dialog/value.ts +8 -1
  203. package/src/components/pane-settings-dialog.tsx +44 -13
  204. package/src/components/sign-in-code-panel.tsx +27 -19
  205. package/src/components/ui/column-grid.tsx +48 -4
  206. package/src/components/ui/country-flag-art.tsx +180 -0
  207. package/src/components/ui/country-flag.tsx +118 -12
  208. package/src/components/ui/data-table/opentui/index.tsx +61 -2
  209. package/src/components/ui/data-table/opentui/model.ts +109 -2
  210. package/src/components/ui/data-table/types.ts +1 -1
  211. package/src/components/ui/display.tsx +5 -1
  212. package/src/components/ui/index.ts +3 -1
  213. package/src/components/ui/logo-mark.tsx +11 -2
  214. package/src/components/ui/query-bar.tsx +1 -1
  215. package/src/components/ui/row-notes.ts +79 -0
  216. package/src/core/state/app/layout.ts +4 -4
  217. package/src/data/cached-query.ts +8 -1
  218. package/src/data/config/chart-settings.ts +3 -3
  219. package/src/data/config/home.ts +10 -2
  220. package/src/data/config/layout.ts +4 -1
  221. package/src/data/config/store/node.ts +4 -0
  222. package/src/data/config/store/normalize.ts +13 -3
  223. package/src/data/config/store/portfolio-as-of-column.ts +2 -2
  224. package/src/data/json-storage.ts +2 -0
  225. package/src/data/saved-copies.ts +84 -0
  226. package/src/docs/snapshot.json +65 -32
  227. package/src/i18n/es.ts +29 -12
  228. package/src/i18n/ja.ts +29 -12
  229. package/src/i18n/ko.ts +29 -12
  230. package/src/i18n/zh-cn.ts +29 -12
  231. package/src/i18n/zh-tw.ts +29 -12
  232. package/src/layout/desks.ts +1 -1
  233. package/src/layout/launch-layout.ts +1 -1
  234. package/src/layout/pane-manager/floating-actions.ts +5 -3
  235. package/src/layout/pane-manager/floating.ts +43 -1
  236. package/src/layout/pane-manager/index.ts +2 -0
  237. package/src/layout/selected-ticker.ts +74 -0
  238. package/src/market-data/depositary-pair.ts +251 -0
  239. package/src/market-data/futures-board.ts +1 -1
  240. package/src/market-data/futures-contract.ts +124 -40
  241. package/src/market-data/fx-closes.ts +17 -2
  242. package/src/market-data/hooks.tsx +19 -11
  243. package/src/market-data/market/change-basis.ts +49 -7
  244. package/src/market-data/market/freshness.ts +34 -5
  245. package/src/market-data/market/period-return.ts +163 -0
  246. package/src/market-data/market/trading-sessions.ts +13 -0
  247. package/src/market-data/market/year-to-date.ts +8 -13
  248. package/src/market-data/performance.ts +20 -14
  249. package/src/market-data/perpetual-premium.ts +32 -0
  250. package/src/market-data/published-apac-sessions.ts +2 -1
  251. package/src/market-data/published-futures-sessions.ts +69 -0
  252. package/src/market-data/quotes/contributions.ts +5 -1
  253. package/src/market-data/quotes/freshness.ts +42 -0
  254. package/src/market-data/quotes/intraday-bar.ts +37 -0
  255. package/src/market-data/quotes/regular-session-valuation.ts +13 -8
  256. package/src/market-data/quotes/resolution.ts +4 -2
  257. package/src/market-data/tax-equivalent.ts +1 -1
  258. package/src/market-data/ticker-price-returns.ts +3 -1
  259. package/src/news/aggregator.ts +5 -1
  260. package/src/news/news-model.ts +4 -0
  261. package/src/news/types.ts +11 -0
  262. package/src/notifications/app-notifier.ts +1 -1
  263. package/src/plugins/auto-update.ts +2 -2
  264. package/src/plugins/builtin/account-management/index.tsx +1 -0
  265. package/src/plugins/builtin/account-management/pane.tsx +9 -8
  266. package/src/plugins/builtin/alerts/alert-engine.ts +29 -19
  267. package/src/plugins/builtin/alerts/calendar-events.ts +378 -0
  268. package/src/plugins/builtin/alerts/cli.ts +485 -76
  269. package/src/plugins/builtin/alerts/command.ts +5 -10
  270. package/src/plugins/builtin/alerts/event-rows.ts +9 -5
  271. package/src/plugins/builtin/alerts/events-pane.tsx +71 -56
  272. package/src/plugins/builtin/alerts/events.ts +107 -5
  273. package/src/plugins/builtin/alerts/fired-log.ts +78 -0
  274. package/src/plugins/builtin/alerts/format.ts +2 -1
  275. package/src/plugins/builtin/alerts/headless.ts +100 -39
  276. package/src/plugins/builtin/alerts/history-pane.tsx +105 -62
  277. package/src/plugins/builtin/alerts/history-rows.ts +89 -0
  278. package/src/plugins/builtin/alerts/index.tsx +45 -18
  279. package/src/plugins/builtin/alerts/iv-level.ts +365 -0
  280. package/src/plugins/builtin/alerts/levels.ts +3 -3
  281. package/src/plugins/builtin/alerts/pane.tsx +97 -29
  282. package/src/plugins/builtin/alerts/price.ts +35 -0
  283. package/src/plugins/builtin/alerts/quotes.ts +24 -0
  284. package/src/plugins/builtin/alerts/research-builder.ts +84 -11
  285. package/src/plugins/builtin/alerts/research-rules.ts +76 -3
  286. package/src/plugins/builtin/alerts/scheduled-check.ts +206 -32
  287. package/src/plugins/builtin/alerts/scheduled-sources.ts +26 -3
  288. package/src/plugins/builtin/alerts/scheduled.ts +188 -29
  289. package/src/plugins/builtin/alerts/storage.ts +13 -10
  290. package/src/plugins/builtin/alerts/targets.ts +12 -3
  291. package/src/plugins/builtin/analytics/index.tsx +8 -2
  292. package/src/plugins/builtin/analytics/metrics.ts +1 -1
  293. package/src/plugins/builtin/analytics/risk-book.ts +215 -0
  294. package/src/plugins/builtin/analytics/risk-client.ts +13 -6
  295. package/src/plugins/builtin/analytics/risk-headless.ts +55 -21
  296. package/src/plugins/builtin/analytics/risk-math.ts +6 -3
  297. package/src/plugins/builtin/analytics/risk-model.ts +297 -104
  298. package/src/plugins/builtin/analytics/risk-options.ts +17 -2
  299. package/src/plugins/builtin/analytics/risk-pane.tsx +97 -36
  300. package/src/plugins/builtin/attention/pane.tsx +6 -2
  301. package/src/plugins/builtin/awards/headless.ts +7 -3
  302. package/src/plugins/builtin/awards/model.ts +18 -0
  303. package/src/plugins/builtin/awards/pane.tsx +6 -3
  304. package/src/plugins/builtin/backtest/headless.ts +3 -3
  305. package/src/plugins/builtin/backtest/rules.ts +41 -5
  306. package/src/plugins/builtin/broker-manager/add-flow.tsx +12 -7
  307. package/src/plugins/builtin/broker-manager/detail.tsx +47 -19
  308. package/src/plugins/builtin/broker-manager/footer.ts +27 -11
  309. package/src/plugins/builtin/broker-manager/index.tsx +21 -12
  310. package/src/plugins/builtin/broker-manager/keyboard.ts +1 -1
  311. package/src/plugins/builtin/broker-manager/model.ts +12 -2
  312. package/src/plugins/builtin/broker-manager/pane-actions.tsx +183 -57
  313. package/src/plugins/builtin/broker-manager/table.ts +28 -12
  314. package/src/plugins/builtin/broker-trading/account-picker.tsx +2 -1
  315. package/src/plugins/builtin/broker-trading/chart-levels.ts +82 -13
  316. package/src/plugins/builtin/broker-trading/controller.ts +45 -13
  317. package/src/plugins/builtin/broker-trading/dock.tsx +22 -4
  318. package/src/plugins/builtin/broker-trading/headless.ts +2 -1
  319. package/src/plugins/builtin/broker-trading/index.tsx +7 -1
  320. package/src/plugins/builtin/broker-trading/linked-orders.ts +148 -0
  321. package/src/plugins/builtin/broker-trading/order-feed.ts +75 -7
  322. package/src/plugins/builtin/broker-trading/orders.tsx +109 -31
  323. package/src/plugins/builtin/broker-trading/overview-orders.tsx +9 -3
  324. package/src/plugins/builtin/broker-trading/pane-model.ts +30 -2
  325. package/src/plugins/builtin/broker-trading/pane.tsx +110 -23
  326. package/src/plugins/builtin/broker-trading/ticket-parts.tsx +36 -7
  327. package/src/plugins/builtin/broker-trading/ticket.tsx +112 -31
  328. package/src/plugins/builtin/buildout/cells.tsx +4 -0
  329. package/src/plugins/builtin/buildout/detail/index.tsx +5 -1
  330. package/src/plugins/builtin/buildout/detail/ui.tsx +7 -4
  331. package/src/plugins/builtin/buildout/pane/index.tsx +25 -12
  332. package/src/plugins/builtin/buildout/pane/status.tsx +0 -4
  333. package/src/plugins/builtin/builtin-plugin-meta.ts +1 -1
  334. package/src/plugins/builtin/catalysts/detail.tsx +3 -2
  335. package/src/plugins/builtin/catalysts/index.tsx +1 -1
  336. package/src/plugins/builtin/catalysts/model.ts +49 -4
  337. package/src/plugins/builtin/catalysts/pane.tsx +6 -8
  338. package/src/plugins/builtin/central-bank-rates/client.ts +5 -0
  339. package/src/plugins/builtin/central-bank-rates/headless.ts +36 -10
  340. package/src/plugins/builtin/central-bank-rates/model.ts +33 -8
  341. package/src/plugins/builtin/changelog/index.tsx +1 -0
  342. package/src/plugins/builtin/chart-composer/catalog-inventory.ts +1 -0
  343. package/src/plugins/builtin/chart-composer/chart-spec-edit.ts +2 -1
  344. package/src/plugins/builtin/chart-composer/chart-spec.ts +7 -0
  345. package/src/plugins/builtin/chart-composer/cli-options.ts +2 -5
  346. package/src/plugins/builtin/chart-composer/data-catalog-pane.tsx +2 -1
  347. package/src/plugins/builtin/chart-composer/editor/controller.ts +2 -0
  348. package/src/plugins/builtin/chart-composer/editor.tsx +4 -1
  349. package/src/plugins/builtin/chart-composer/headless-schema.ts +28 -26
  350. package/src/plugins/builtin/chart-composer/headless.ts +253 -35
  351. package/src/plugins/builtin/chart-composer/index.tsx +12 -2
  352. package/src/plugins/builtin/chart-composer/leverage-overlay.ts +142 -0
  353. package/src/plugins/builtin/chart-composer/pane.tsx +127 -28
  354. package/src/plugins/builtin/chart-composer/series-catalog.ts +1 -0
  355. package/src/plugins/builtin/chart-composer/series-expression.ts +65 -6
  356. package/src/plugins/builtin/chart-composer/session-history.ts +15 -21
  357. package/src/plugins/builtin/chart-composer/session-range.ts +4 -2
  358. package/src/plugins/builtin/chart-composer/settings.ts +31 -19
  359. package/src/plugins/builtin/chart-composer/use-series-catalog.ts +5 -6
  360. package/src/plugins/builtin/chart-composer/viewport-labels.ts +18 -8
  361. package/src/plugins/builtin/chat/attachments/model.ts +3 -1
  362. package/src/plugins/builtin/chat/content/index.tsx +1 -1
  363. package/src/plugins/builtin/chat/pane-links/open.ts +1 -1
  364. package/src/plugins/builtin/chat/people.ts +1 -1
  365. package/src/plugins/builtin/clinical-trials/client.ts +5 -2
  366. package/src/plugins/builtin/clinical-trials/model.ts +13 -4
  367. package/src/plugins/builtin/clinical-trials/pane.tsx +32 -12
  368. package/src/plugins/builtin/clinical-trials/ticker-sponsor.ts +17 -0
  369. package/src/plugins/builtin/cloud/askg/controller.ts +1 -1
  370. package/src/plugins/builtin/cloud/askg/lock-note.ts +1 -1
  371. package/src/plugins/builtin/cloud/askg/tool-display.ts +1 -1
  372. package/src/plugins/builtin/cloud/auth-commands.ts +3 -3
  373. package/src/plugins/builtin/cloud/team/pane-sections.tsx +105 -47
  374. package/src/plugins/builtin/cloud/team/pane-ui.tsx +42 -4
  375. package/src/plugins/builtin/cloud/team/pane.tsx +204 -64
  376. package/src/plugins/builtin/cloud/thesis/store.ts +45 -22
  377. package/src/plugins/builtin/cloud-tweets/registration.ts +1 -0
  378. package/src/plugins/builtin/commodities-energy/index.tsx +29 -2
  379. package/src/plugins/builtin/commodities-energy/view-state.ts +2 -0
  380. package/src/plugins/builtin/commodity-balances/pane.tsx +11 -4
  381. package/src/plugins/builtin/company-attention/app-rank.tsx +7 -5
  382. package/src/plugins/builtin/company-attention/building-model.ts +222 -0
  383. package/src/plugins/builtin/company-attention/building.tsx +172 -0
  384. package/src/plugins/builtin/company-attention/client.ts +117 -1
  385. package/src/plugins/builtin/company-attention/evidence.ts +16 -3
  386. package/src/plugins/builtin/company-attention/headless.ts +101 -5
  387. package/src/plugins/builtin/company-attention/index.tsx +6 -3
  388. package/src/plugins/builtin/company-attention/model.ts +33 -7
  389. package/src/plugins/builtin/company-attention/moves-model.ts +253 -0
  390. package/src/plugins/builtin/company-attention/moves.tsx +159 -0
  391. package/src/plugins/builtin/company-attention/pane.tsx +79 -23
  392. package/src/plugins/builtin/company-attention/signals-model.ts +229 -0
  393. package/src/plugins/builtin/company-attention/signals.tsx +160 -0
  394. package/src/plugins/builtin/company-kpis/headless.ts +3 -2
  395. package/src/plugins/builtin/company-kpis/model.ts +2 -2
  396. package/src/plugins/builtin/company-kpis/pane.tsx +1 -1
  397. package/src/plugins/builtin/composite-plugins.ts +2 -1
  398. package/src/plugins/builtin/congress-trades/headless.ts +1 -1
  399. package/src/plugins/builtin/connections/index.ts +1 -0
  400. package/src/plugins/builtin/correlation/headless-schema.ts +3 -2
  401. package/src/plugins/builtin/correlation/headless.ts +5 -3
  402. package/src/plugins/builtin/cot/headless.ts +28 -6
  403. package/src/plugins/builtin/cot/model.ts +12 -0
  404. package/src/plugins/builtin/cot/pane.tsx +3 -2
  405. package/src/plugins/builtin/cpi/headless.ts +5 -1
  406. package/src/plugins/builtin/cpi/pane.tsx +11 -9
  407. package/src/plugins/builtin/credit-boards/model.ts +2 -0
  408. package/src/plugins/builtin/credit-documents/headless.ts +1 -1
  409. package/src/plugins/builtin/crypto-board/client.ts +86 -0
  410. package/src/plugins/builtin/crypto-board/defi-view.tsx +218 -0
  411. package/src/plugins/builtin/crypto-board/defi.ts +239 -0
  412. package/src/plugins/builtin/crypto-board/headless.ts +117 -6
  413. package/src/plugins/builtin/crypto-board/index.tsx +8 -3
  414. package/src/plugins/builtin/crypto-board/model.ts +40 -8
  415. package/src/plugins/builtin/crypto-board/pane.tsx +55 -21
  416. package/src/plugins/builtin/crypto-board/series.ts +19 -1
  417. package/src/plugins/builtin/crypto-etf-flows/client.ts +60 -0
  418. package/src/plugins/builtin/crypto-etf-flows/headless.ts +132 -0
  419. package/src/plugins/builtin/crypto-etf-flows/index.tsx +44 -0
  420. package/src/plugins/builtin/crypto-etf-flows/model.ts +121 -0
  421. package/src/plugins/builtin/crypto-etf-flows/pane.tsx +193 -0
  422. package/src/plugins/builtin/debug/index.tsx +1 -0
  423. package/src/plugins/builtin/dividend-yield/index.tsx +1 -1
  424. package/src/plugins/builtin/docs/index.tsx +1 -1
  425. package/src/plugins/builtin/docs/pane.tsx +2 -2
  426. package/src/plugins/builtin/docs/targets.ts +1 -1
  427. package/src/plugins/builtin/doe/client.ts +5 -1
  428. package/src/plugins/builtin/doe/headless.ts +12 -6
  429. package/src/plugins/builtin/doe/model.ts +43 -6
  430. package/src/plugins/builtin/doe/pane.tsx +18 -11
  431. package/src/plugins/builtin/earnings/board-model.ts +13 -6
  432. package/src/plugins/builtin/earnings/board-table.ts +4 -1
  433. package/src/plugins/builtin/earnings/board.tsx +253 -50
  434. package/src/plugins/builtin/earnings/calendar-model.ts +188 -0
  435. package/src/plugins/builtin/earnings/calendar.tsx +338 -0
  436. package/src/plugins/builtin/earnings/client.ts +4 -3
  437. package/src/plugins/builtin/earnings/headless.ts +53 -15
  438. package/src/plugins/builtin/earnings/history-model.ts +53 -36
  439. package/src/plugins/builtin/earnings/index.tsx +15 -22
  440. package/src/plugins/builtin/earnings/model.ts +17 -12
  441. package/src/plugins/builtin/earnings/scope.ts +89 -0
  442. package/src/plugins/builtin/earnings-calls/calendar.tsx +310 -0
  443. package/src/plugins/builtin/earnings-calls/data.ts +146 -2
  444. package/src/plugins/builtin/earnings-calls/headless.ts +151 -9
  445. package/src/plugins/builtin/earnings-calls/index.tsx +3 -3
  446. package/src/plugins/builtin/earnings-calls/lock-note.ts +1 -1
  447. package/src/plugins/builtin/earnings-calls/pane.tsx +149 -31
  448. package/src/plugins/builtin/earnings-calls/upcoming.ts +195 -0
  449. package/src/plugins/builtin/earnings-ripple/pane.tsx +10 -5
  450. package/src/plugins/builtin/econ/calendar-model.ts +132 -20
  451. package/src/plugins/builtin/econ/detail-view.tsx +48 -10
  452. package/src/plugins/builtin/econ/fred-catalog.ts +23 -6
  453. package/src/plugins/builtin/econ/fred-series-map.ts +4 -0
  454. package/src/plugins/builtin/econ/index.tsx +112 -25
  455. package/src/plugins/builtin/econ/print-watch.ts +2 -1
  456. package/src/plugins/builtin/econ/types.ts +32 -1
  457. package/src/plugins/builtin/econ-statistics/client.ts +16 -3
  458. package/src/plugins/builtin/econ-statistics/defs.ts +4 -0
  459. package/src/plugins/builtin/econ-statistics/detail.tsx +2 -2
  460. package/src/plugins/builtin/econ-statistics/headless.ts +13 -2
  461. package/src/plugins/builtin/econ-statistics/index.tsx +3 -3
  462. package/src/plugins/builtin/econ-statistics/pane.tsx +2 -1
  463. package/src/plugins/builtin/econ-statistics/stats.ts +103 -0
  464. package/src/plugins/builtin/econ-statistics/view.ts +16 -1
  465. package/src/plugins/builtin/equity-screener/client.ts +21 -3
  466. package/src/plugins/builtin/equity-screener/headless.ts +68 -6
  467. package/src/plugins/builtin/equity-screener/live.ts +1 -1
  468. package/src/plugins/builtin/equity-screener/model.ts +6 -0
  469. package/src/plugins/builtin/equity-screener/pane.tsx +45 -10
  470. package/src/plugins/builtin/equity-screener/screen-check.ts +90 -0
  471. package/src/plugins/builtin/equity-screener/ticker-check.tsx +148 -0
  472. package/src/plugins/builtin/estimate-revisions/headless.ts +3 -1
  473. package/src/plugins/builtin/estimate-revisions/lock-note.ts +3 -3
  474. package/src/plugins/builtin/estimate-revisions/model.ts +8 -10
  475. package/src/plugins/builtin/exposure/headless.ts +51 -6
  476. package/src/plugins/builtin/exposure/index.tsx +28 -2
  477. package/src/plugins/builtin/exposure/model.ts +7 -0
  478. package/src/plugins/builtin/exposure/pane.tsx +6 -1
  479. package/src/plugins/builtin/fear-greed/index.tsx +1 -1
  480. package/src/plugins/builtin/filing-events/index.tsx +1 -1
  481. package/src/plugins/builtin/futures/model.ts +10 -9
  482. package/src/plugins/builtin/futures/returns.ts +8 -36
  483. package/src/plugins/builtin/futures/table.tsx +1 -1
  484. package/src/plugins/builtin/futures-curve/client.ts +40 -9
  485. package/src/plugins/builtin/futures-curve/headless.ts +39 -17
  486. package/src/plugins/builtin/futures-curve/model.ts +258 -69
  487. package/src/plugins/builtin/futures-curve/pane.tsx +46 -17
  488. package/src/plugins/builtin/fx-matrix/client.ts +15 -8
  489. package/src/plugins/builtin/fx-matrix/headless.ts +32 -14
  490. package/src/plugins/builtin/fx-matrix/index.tsx +13 -11
  491. package/src/plugins/builtin/fx-matrix/live-legs.ts +22 -0
  492. package/src/plugins/builtin/fx-matrix/settings.ts +2 -1
  493. package/src/plugins/builtin/gpu/headless.ts +9 -4
  494. package/src/plugins/builtin/help/index.tsx +13 -3
  495. package/src/plugins/builtin/holders/beneficial-model.ts +8 -11
  496. package/src/plugins/builtin/holders/beneficial-report.ts +6 -5
  497. package/src/plugins/builtin/holders/beneficial-view.tsx +7 -3
  498. package/src/plugins/builtin/holders/client.ts +13 -1
  499. package/src/plugins/builtin/holders/format.ts +28 -17
  500. package/src/plugins/builtin/holders/headless.ts +46 -7
  501. package/src/plugins/builtin/holders/index-holders.ts +264 -0
  502. package/src/plugins/builtin/holders/pane.tsx +79 -15
  503. package/src/plugins/builtin/holders/report-rows.ts +35 -7
  504. package/src/plugins/builtin/holders/table-model.ts +2 -1
  505. package/src/plugins/builtin/holders/treemap.tsx +2 -2
  506. package/src/plugins/builtin/insider/headless.ts +1 -1
  507. package/src/plugins/builtin/insider/signals-client.ts +1 -1
  508. package/src/plugins/builtin/insider/signals.tsx +1 -1
  509. package/src/plugins/builtin/ipo-calendar/pane.tsx +7 -4
  510. package/src/plugins/builtin/iv-history/client.ts +20 -0
  511. package/src/plugins/builtin/iv-history/headless.ts +4 -4
  512. package/src/plugins/builtin/iv-history/index.tsx +1 -1
  513. package/src/plugins/builtin/iv-history/model.ts +13 -4
  514. package/src/plugins/builtin/iv-history/series.ts +3 -1
  515. package/src/plugins/builtin/jobs/lock-note.ts +1 -1
  516. package/src/plugins/builtin/jobs/model.ts +4 -15
  517. package/src/plugins/builtin/jobs/pane.tsx +7 -5
  518. package/src/plugins/builtin/jobs/share-bars.tsx +11 -5
  519. package/src/plugins/builtin/jodi/pane.tsx +10 -4
  520. package/src/plugins/builtin/layout-manager/index.tsx +1 -0
  521. package/src/plugins/builtin/macro-day/headless.ts +20 -7
  522. package/src/plugins/builtin/macro-day/index.tsx +3 -2
  523. package/src/plugins/builtin/macro-day/model.ts +29 -8
  524. package/src/plugins/builtin/macro-day/pane.tsx +46 -10
  525. package/src/plugins/builtin/macro-day/releases.ts +55 -13
  526. package/src/plugins/builtin/market-heatmap/data.ts +9 -2
  527. package/src/plugins/builtin/market-heatmap/evidence.ts +1 -1
  528. package/src/plugins/builtin/market-heatmap/headless.ts +9 -6
  529. package/src/plugins/builtin/market-heatmap/index.tsx +3 -3
  530. package/src/plugins/builtin/market-heatmap/model.ts +10 -7
  531. package/src/plugins/builtin/market-movers/client.ts +33 -19
  532. package/src/plugins/builtin/market-movers/headless.ts +8 -2
  533. package/src/plugins/builtin/market-movers/index.tsx +16 -10
  534. package/src/plugins/builtin/market-movers/screener.ts +29 -8
  535. package/src/plugins/builtin/market-movers/session-body.tsx +4 -2
  536. package/src/plugins/builtin/market-movers/session-table.ts +4 -2
  537. package/src/plugins/builtin/market-movers/table.ts +4 -1
  538. package/src/plugins/builtin/market-valuation/headless.ts +2 -0
  539. package/src/plugins/builtin/market-valuation/view.ts +5 -0
  540. package/src/plugins/builtin/members/headless.ts +6 -5
  541. package/src/plugins/builtin/members/pane.tsx +11 -4
  542. package/src/plugins/builtin/mna/client.ts +1 -0
  543. package/src/plugins/builtin/mna/detail.tsx +20 -32
  544. package/src/plugins/builtin/mna/distress/detail.tsx +16 -4
  545. package/src/plugins/builtin/mna/distress/model.ts +3 -2
  546. package/src/plugins/builtin/mna/distress/pane.tsx +7 -4
  547. package/src/plugins/builtin/mna/headless.ts +6 -13
  548. package/src/plugins/builtin/mna/model.ts +93 -15
  549. package/src/plugins/builtin/mna/pane.tsx +5 -4
  550. package/src/plugins/builtin/news/headless.ts +12 -6
  551. package/src/plugins/builtin/news/index.tsx +10 -1
  552. package/src/plugins/builtin/news/wire/index.tsx +3 -2
  553. package/src/plugins/builtin/news/wire/news/command-bar-search.ts +26 -10
  554. package/src/plugins/builtin/news/wire/news/query-presets.ts +6 -2
  555. package/src/plugins/builtin/news/wire/rss/cli.ts +3 -3
  556. package/src/plugins/builtin/notes/cli.ts +49 -14
  557. package/src/plugins/builtin/openfda/pane.tsx +1 -1
  558. package/src/plugins/builtin/options/carry.ts +2 -2
  559. package/src/plugins/builtin/options/index.tsx +1 -1
  560. package/src/plugins/builtin/options/view.tsx +10 -10
  561. package/src/plugins/builtin/options-calculator/headless.ts +46 -7
  562. package/src/plugins/builtin/options-scenario/client.ts +123 -28
  563. package/src/plugins/builtin/options-scenario/collar.ts +8 -6
  564. package/src/plugins/builtin/options-scenario/csp-screen-headless.ts +127 -0
  565. package/src/plugins/builtin/options-scenario/csp-screen-pane.tsx +165 -0
  566. package/src/plugins/builtin/options-scenario/csp-screen.ts +258 -0
  567. package/src/plugins/builtin/options-scenario/csp.ts +101 -21
  568. package/src/plugins/builtin/options-scenario/headless.ts +36 -15
  569. package/src/plugins/builtin/options-scenario/hedge.ts +20 -14
  570. package/src/plugins/builtin/options-scenario/index.tsx +28 -3
  571. package/src/plugins/builtin/options-scenario/model.ts +13 -0
  572. package/src/plugins/builtin/options-scenario/pane.tsx +9 -5
  573. package/src/plugins/builtin/perps/equity-row.tsx +11 -3
  574. package/src/plugins/builtin/perps/freshness.ts +8 -5
  575. package/src/plugins/builtin/perps/headless.ts +3 -1
  576. package/src/plugins/builtin/perps/list-perpetuals.ts +25 -4
  577. package/src/plugins/builtin/perps/live-rows.ts +161 -0
  578. package/src/plugins/builtin/perps/markets-section.tsx +154 -0
  579. package/src/plugins/builtin/perps/pane.tsx +36 -17
  580. package/src/plugins/builtin/perps/venue-markets.ts +96 -0
  581. package/src/plugins/builtin/plugin-marketplace/index.tsx +2 -1
  582. package/src/plugins/builtin/plugin-marketplace/pane.tsx +143 -59
  583. package/src/plugins/builtin/portfolio-list/cli/bulk-symbols.ts +72 -24
  584. package/src/plugins/builtin/portfolio-list/cli/portfolio-command.ts +158 -141
  585. package/src/plugins/builtin/portfolio-list/cli/render.ts +49 -20
  586. package/src/plugins/builtin/portfolio-list/cli/shared.ts +3 -3
  587. package/src/plugins/builtin/portfolio-list/cli/watchlist-command.ts +29 -24
  588. package/src/plugins/builtin/portfolio-list/headless.ts +6 -3
  589. package/src/plugins/builtin/portfolio-list/income.ts +13 -2
  590. package/src/plugins/builtin/portfolio-list/index.tsx +9 -2
  591. package/src/plugins/builtin/portfolio-list/pane/index.tsx +21 -8
  592. package/src/plugins/builtin/portfolio-list/pane/purchase-date-fx.ts +46 -0
  593. package/src/plugins/builtin/portfolio-list/summary/live-accounts.ts +16 -9
  594. package/src/plugins/builtin/portfolio-list/summary/totals.ts +2 -15
  595. package/src/plugins/builtin/power/client.ts +4 -1
  596. package/src/plugins/builtin/power/evidence.ts +22 -7
  597. package/src/plugins/builtin/power/gas.tsx +5 -1
  598. package/src/plugins/builtin/power/pane.tsx +8 -1
  599. package/src/plugins/builtin/power/prices.tsx +10 -3
  600. package/src/plugins/builtin/research/analyst-headless.ts +25 -8
  601. package/src/plugins/builtin/research/analyst-model.ts +68 -3
  602. package/src/plugins/builtin/research/corporate-actions-pane.tsx +63 -14
  603. package/src/plugins/builtin/research/event-model.ts +3 -1
  604. package/src/plugins/builtin/research/event-sources.ts +12 -4
  605. package/src/plugins/builtin/research/index.tsx +2 -1
  606. package/src/plugins/builtin/research/relative-valuation-basis.ts +58 -0
  607. package/src/plugins/builtin/research/relative-valuation-columns.ts +31 -2
  608. package/src/plugins/builtin/research/relative-valuation-currency.ts +12 -5
  609. package/src/plugins/builtin/research/relative-valuation-headless.ts +84 -26
  610. package/src/plugins/builtin/research/relative-valuation-model.ts +88 -19
  611. package/src/plugins/builtin/research/relative-valuation-pane.tsx +76 -9
  612. package/src/plugins/builtin/research/relative-valuation-peers.ts +1 -1
  613. package/src/plugins/builtin/reverse-dcf/model.ts +6 -2
  614. package/src/plugins/builtin/risk-factors/index.tsx +2 -2
  615. package/src/plugins/builtin/scanner/lock-note.ts +1 -1
  616. package/src/plugins/builtin/sec/forms.ts +13 -0
  617. package/src/plugins/builtin/sec/fund-abroad.ts +32 -0
  618. package/src/plugins/builtin/sec/fund-facts.ts +68 -8
  619. package/src/plugins/builtin/sec/headless.ts +85 -8
  620. package/src/plugins/builtin/sec/index.tsx +58 -12
  621. package/src/plugins/builtin/sectors/client.ts +2 -1
  622. package/src/plugins/builtin/sectors/sector-model.ts +11 -15
  623. package/src/plugins/builtin/series-inventory.ts +2 -0
  624. package/src/plugins/builtin/shared/broker-reconnect.ts +107 -22
  625. package/src/plugins/builtin/shared/cloud-upgrade.ts +34 -6
  626. package/src/plugins/builtin/shared/earnings-calendar.ts +375 -0
  627. package/src/plugins/builtin/{earnings/estimate-basis.ts → shared/earnings-estimate-basis.ts} +1 -1
  628. package/src/plugins/builtin/shared/earnings-report.ts +3 -3
  629. package/src/plugins/builtin/shared/fx-rate-freshness.ts +23 -1
  630. package/src/plugins/builtin/shared/job-posting.ts +129 -0
  631. package/src/plugins/builtin/shared/pro-lock-note.ts +3 -3
  632. package/src/plugins/builtin/shared/report-freshness.ts +3 -0
  633. package/src/plugins/builtin/shared/research-trading.tsx +21 -0
  634. package/src/plugins/builtin/shared/series-cache.ts +2 -0
  635. package/src/plugins/builtin/shared/ticker-surface.ts +2 -1
  636. package/src/plugins/builtin/short-interest/client.ts +2 -0
  637. package/src/plugins/builtin/short-interest/headless.ts +41 -12
  638. package/src/plugins/builtin/short-interest/index.tsx +23 -1
  639. package/src/plugins/builtin/short-interest/model.ts +70 -19
  640. package/src/plugins/builtin/short-interest/pane.tsx +19 -2
  641. package/src/plugins/builtin/short-interest/publications-client.ts +82 -0
  642. package/src/plugins/builtin/short-interest/publications-headless.ts +29 -0
  643. package/src/plugins/builtin/short-interest/publications-model.ts +50 -0
  644. package/src/plugins/builtin/short-interest/publications-pane.tsx +66 -0
  645. package/src/plugins/builtin/short-interest/schedule.ts +35 -2
  646. package/src/plugins/builtin/short-interest/surface.tsx +11 -4
  647. package/src/plugins/builtin/short-interest/types.ts +9 -0
  648. package/src/plugins/builtin/short-interest/watch-client.ts +14 -8
  649. package/src/plugins/builtin/short-interest/watch-model.ts +12 -25
  650. package/src/plugins/builtin/short-interest/watch-pane.tsx +5 -1
  651. package/src/plugins/builtin/supply-chain/flow.tsx +33 -9
  652. package/src/plugins/builtin/supply-chain/model.ts +51 -3
  653. package/src/plugins/builtin/supply-chain/pane.tsx +78 -39
  654. package/src/plugins/builtin/supply-chain/row-evidence.tsx +1 -1
  655. package/src/plugins/builtin/themes/headless.ts +8 -5
  656. package/src/plugins/builtin/themes/model.ts +14 -4
  657. package/src/plugins/builtin/themes/pane.tsx +24 -5
  658. package/src/plugins/builtin/thirteenf/headless.ts +5 -5
  659. package/src/plugins/builtin/thirteenf/signals.ts +3 -1
  660. package/src/plugins/builtin/ticker-detail/adr-pair/headless.ts +123 -0
  661. package/src/plugins/builtin/ticker-detail/adr-pair/model.ts +132 -0
  662. package/src/plugins/builtin/ticker-detail/adr-pair/tab.tsx +87 -0
  663. package/src/plugins/builtin/ticker-detail/data-panes/historical-prices.tsx +40 -26
  664. package/src/plugins/builtin/ticker-detail/data-panes/history-bars.ts +8 -4
  665. package/src/plugins/builtin/ticker-detail/data-panes/returns-history.ts +67 -3
  666. package/src/plugins/builtin/ticker-detail/data-panes/returns-model.ts +112 -5
  667. package/src/plugins/builtin/ticker-detail/data-panes/returns-pane.tsx +17 -2
  668. package/src/plugins/builtin/ticker-detail/financials/aggregation.ts +21 -7
  669. package/src/plugins/builtin/ticker-detail/financials/model.ts +36 -1
  670. package/src/plugins/builtin/ticker-detail/financials/offerings.ts +56 -0
  671. package/src/plugins/builtin/ticker-detail/financials/ratios.ts +62 -13
  672. package/src/plugins/builtin/ticker-detail/financials/tab.tsx +30 -4
  673. package/src/plugins/builtin/ticker-detail/headless-schema.ts +14 -2
  674. package/src/plugins/builtin/ticker-detail/headless.ts +148 -35
  675. package/src/plugins/builtin/ticker-detail/index.tsx +37 -5
  676. package/src/plugins/builtin/ticker-detail/overview/model.ts +65 -10
  677. package/src/plugins/builtin/ticker-detail/overview/pane.tsx +9 -1
  678. package/src/plugins/builtin/ticker-detail/overview-tab.tsx +68 -11
  679. package/src/plugins/builtin/ticker-detail/pane.tsx +11 -0
  680. package/src/plugins/builtin/ticker-detail/quote-footer.ts +8 -3
  681. package/src/plugins/builtin/ticker-detail/research-tabs.ts +11 -0
  682. package/src/plugins/builtin/vol-surface/client.ts +5 -4
  683. package/src/plugins/builtin/vol-surface/headless.ts +12 -3
  684. package/src/plugins/builtin/vol-surface/model.ts +4 -2
  685. package/src/plugins/builtin/volatility/model.ts +5 -10
  686. package/src/plugins/builtin/world-venue-map/basemap-layer.tsx +4 -3
  687. package/src/plugins/builtin/world-venue-map/basemap.ts +3 -1
  688. package/src/plugins/builtin/world-venue-map/chokepoint-chart.ts +40 -0
  689. package/src/plugins/builtin/world-venue-map/evidence.ts +1 -1
  690. package/src/plugins/builtin/world-venue-map/geo-series.ts +90 -11
  691. package/src/plugins/builtin/world-venue-map/headless.ts +1 -1
  692. package/src/plugins/builtin/world-venue-map/index.ts +3 -26
  693. package/src/plugins/builtin/world-venue-map/layers.ts +1 -1
  694. package/src/plugins/builtin/world-venue-map/map.tsx +2 -1
  695. package/src/plugins/builtin/world-venue-map/pane.tsx +4 -2
  696. package/src/plugins/builtin/world-venue-map/venue-header.tsx +15 -4
  697. package/src/plugins/builtin/yield-curve/client.ts +25 -0
  698. package/src/plugins/builtin/yield-curve/curves.ts +7 -4
  699. package/src/plugins/builtin/yield-curve/headless.ts +38 -4
  700. package/src/plugins/builtin/yield-curve/history.ts +4 -3
  701. package/src/plugins/builtin/yield-curve/index.tsx +12 -6
  702. package/src/plugins/builtin/yield-curve/swaps-model.ts +93 -0
  703. package/src/plugins/builtin/yield-curve/swaps.tsx +99 -0
  704. package/src/plugins/bundle.ts +1 -1
  705. package/src/plugins/catalog-browser.ts +2 -1
  706. package/src/plugins/compat.ts +3 -3
  707. package/src/plugins/dependencies.ts +75 -14
  708. package/src/plugins/extracted-plugins.ts +132 -34
  709. package/src/plugins/host-link.ts +149 -34
  710. package/src/plugins/installer.ts +35 -10
  711. package/src/plugins/loader.ts +206 -38
  712. package/src/plugins/manager-node.ts +2 -2
  713. package/src/plugins/marketplace/deactivation.ts +22 -0
  714. package/src/plugins/marketplace/model.ts +2 -2
  715. package/src/plugins/marketplace/packs.ts +1 -1
  716. package/src/plugins/ownership.ts +1 -1
  717. package/src/plugins/peer-retry.ts +155 -0
  718. package/src/plugins/registry/contributions.ts +3 -1
  719. package/src/plugins/registry/index.ts +4 -3
  720. package/src/plugins/registry/plugin-state.ts +3 -0
  721. package/src/plugins/seed-notice.ts +20 -0
  722. package/src/plugins/shortcut-argument.ts +39 -0
  723. package/src/portfolio/allocation.ts +1 -1
  724. package/src/portfolio/collection-name.ts +31 -0
  725. package/src/portfolio/column-values.ts +10 -8
  726. package/src/portfolio/cost-fx.ts +296 -19
  727. package/src/portfolio/manual-lots.ts +75 -0
  728. package/src/portfolio/mutations.ts +60 -22
  729. package/src/portfolio/suffixed-listings.ts +209 -0
  730. package/src/portfolio/totals-currency.ts +24 -0
  731. package/src/public/__snapshots__/public-api.test.ts.snap +14 -0
  732. package/src/public/time-series.ts +11 -8
  733. package/src/remote/schema.ts +1 -1
  734. package/src/renderers/browser/config-host.ts +3 -0
  735. package/src/renderers/browser/main.tsx +23 -3
  736. package/src/renderers/dom/boot-frame-page.ts +187 -0
  737. package/src/renderers/dom/boot-frame.ts +237 -0
  738. package/src/renderers/dom/build-assets.ts +46 -8
  739. package/src/renderers/dom/dom-ui-host.tsx +4 -29
  740. package/src/renderers/dom/host/ascii-text.ts +16 -2
  741. package/src/renderers/dom/host/box.tsx +43 -2
  742. package/src/renderers/dom/host/chart-surface.tsx +2 -0
  743. package/src/renderers/dom/host/hls.chunk.ts +3 -0
  744. package/src/renderers/dom/host/image-surface.tsx +49 -0
  745. package/src/renderers/dom/host/media-surface.tsx +24 -18
  746. package/src/renderers/dom/host/mouse.ts +30 -0
  747. package/src/renderers/dom/host/size-observer.ts +1 -1
  748. package/src/renderers/dom/host/style.ts +1 -1
  749. package/src/renderers/dom/styles.css +76 -0
  750. package/src/renderers/dom/test-utils.tsx +2 -1
  751. package/src/renderers/electrobun/bun/application-menu/index.ts +3 -3
  752. package/src/renderers/electrobun/bun/desktop/backend-requests.ts +3 -0
  753. package/src/renderers/electrobun/bun/desktop/backend.ts +46 -3
  754. package/src/renderers/electrobun/bun/desktop/detached-windows.ts +1 -1
  755. package/src/renderers/electrobun/bun/desktop/host-requests.ts +9 -3
  756. package/src/renderers/electrobun/bun/desktop/initialization.ts +81 -18
  757. package/src/renderers/electrobun/bun/external-plugins.ts +29 -7
  758. package/src/renderers/electrobun/bun/index.ts +11 -1
  759. package/src/renderers/electrobun/bun/window/boot-frame.ts +67 -0
  760. package/src/renderers/electrobun/bun/window/create.ts +4 -1
  761. package/src/renderers/electrobun/shared/boot-frame.ts +7 -0
  762. package/src/renderers/electrobun/shared/protocol.ts +6 -1
  763. package/src/renderers/electrobun/view/cli-pane-shot-entry.tsx +1 -1
  764. package/src/renderers/electrobun/view/config-host.ts +3 -0
  765. package/src/renderers/electrobun/view/fatal-screen.tsx +1 -1
  766. package/src/renderers/electrobun/view/main.tsx +30 -4
  767. package/src/renderers/electrobun/view/news-source.ts +5 -5
  768. package/src/renderers/electrobun/view/remote/asset-data-client.ts +1 -1
  769. package/src/renderers/electrobun/view/ui-host.tsx +1 -1
  770. package/src/renderers/opentui/browser-open.ts +88 -0
  771. package/src/renderers/opentui/host.tsx +5 -14
  772. package/src/renderers/opentui/image/loader.ts +3 -2
  773. package/src/renderers/opentui/native-smoke.ts +10 -1
  774. package/src/renderers/opentui/pane-image/index.ts +2 -1
  775. package/src/renderers/opentui/render-lib.ts +253 -0
  776. package/src/renderers/opentui/render-timing-smoke.ts +1 -1
  777. package/src/renderers/opentui/start.tsx +1 -1
  778. package/src/renderers/share/layout-view.tsx +2 -2
  779. package/src/renderers/share/main.tsx +4 -4
  780. package/src/renderers/share/view.tsx +1 -1
  781. package/src/series/resolve.ts +22 -6
  782. package/src/series/standalone.ts +30 -2
  783. package/src/series/types.ts +8 -1
  784. package/src/shares/api.ts +4 -1
  785. package/src/shares/pane.ts +1 -1
  786. package/src/sources/gloomberb-cloud/fred-series.ts +46 -1
  787. package/src/sources/gloomberb-cloud/index.ts +32 -16
  788. package/src/sources/gloomberb-cloud/news.ts +39 -0
  789. package/src/sources/gloomberb-cloud/normalizers.ts +14 -1
  790. package/src/sources/gloomberb-cloud/perpetuals.ts +49 -1
  791. package/src/sources/listing-symbols.ts +37 -0
  792. package/src/sources/provider-errors.ts +16 -2
  793. package/src/sources/provider-router/financial-routes.ts +21 -3
  794. package/src/sources/provider-router/financials.ts +15 -2
  795. package/src/sources/provider-router/history.ts +30 -8
  796. package/src/sources/provider-router/primary.ts +1 -1
  797. package/src/state/app/bootstrap.ts +23 -0
  798. package/src/state/hooks/inline-tickers.ts +30 -5
  799. package/src/sync/controller.ts +1 -1
  800. package/src/sync/core-contributors.ts +46 -14
  801. package/src/team/collections-sync.ts +2 -1
  802. package/src/team/collections.ts +178 -17
  803. package/src/telemetry/crash-reports.ts +17 -4
  804. package/src/test-support/builtin-panes.ts +1 -1
  805. package/src/theme/colors.ts +3 -30
  806. package/src/theme/ui-tokens.ts +37 -1
  807. package/src/tickers/company-name-listing.ts +210 -33
  808. package/src/tickers/index-roots.ts +47 -0
  809. package/src/tickers/instrument-label.ts +5 -1
  810. package/src/tickers/metadata.ts +10 -0
  811. package/src/tickers/perpetual-listing.ts +5 -2
  812. package/src/tickers/search/home-listing.ts +75 -0
  813. package/src/tickers/search/index.ts +76 -27
  814. package/src/tickers/search/ranking.ts +54 -4
  815. package/src/tickers/search/upsert.ts +29 -0
  816. package/src/tickers/terminal-codes.ts +416 -40
  817. package/src/time-series/bar-aggregation.ts +243 -0
  818. package/src/time-series/base-series.ts +307 -0
  819. package/src/time-series/chart-bounds.ts +349 -0
  820. package/src/time-series/chart-seed.ts +142 -0
  821. package/src/time-series/economic.ts +5 -0
  822. package/src/time-series/fundamentals.ts +18 -3
  823. package/src/time-series/history-acquisition.ts +499 -0
  824. package/src/time-series/leverage.ts +100 -0
  825. package/src/time-series/market-resolution.ts +4 -2
  826. package/src/time-series/market.ts +2 -1
  827. package/src/time-series/price-comparison.ts +175 -30
  828. package/src/time-series/range.ts +9 -1
  829. package/src/time-series/resolution.ts +174 -16
  830. package/src/time-series/resolve-context.ts +157 -0
  831. package/src/time-series/resolve.ts +126 -1577
  832. package/src/time-series/series-name.ts +38 -0
  833. package/src/time-series/series-presentation.ts +208 -0
  834. package/src/time-series/spec.ts +11 -6
  835. package/src/time-series/studies.ts +109 -12
  836. package/src/time-series/tail-reconcile.ts +121 -0
  837. package/src/time-series/types.ts +29 -2
  838. package/src/time-series/use-chart-resolution.ts +4 -5
  839. package/src/types/broker.ts +10 -0
  840. package/src/types/config.ts +14 -0
  841. package/src/types/data-provider.ts +14 -0
  842. package/src/types/exchange-rate.ts +6 -0
  843. package/src/types/financials.ts +104 -7
  844. package/src/types/headless.ts +76 -6
  845. package/src/types/instrument.ts +3 -0
  846. package/src/types/plugin.ts +65 -8
  847. package/src/types/price-history.ts +2 -0
  848. package/src/types/ticker.ts +13 -0
  849. package/src/types/trading.ts +59 -1
  850. package/src/ui/ascii-font.ts +13 -1
  851. package/src/ui/host.tsx +6 -1
  852. package/src/updater/command-names.ts +175 -0
  853. package/src/updater/index.ts +10 -5
  854. package/src/utils/calendar-date.ts +32 -15
  855. package/src/utils/cash-runway.ts +241 -0
  856. package/src/utils/central-banks.ts +42 -0
  857. package/src/utils/cli-output.ts +259 -80
  858. package/src/utils/contract-month.ts +16 -0
  859. package/src/utils/crypto-pair.ts +61 -3
  860. package/src/utils/currency-units.ts +29 -0
  861. package/src/utils/datetime-format.ts +10 -0
  862. package/src/utils/debug-log.ts +1 -1
  863. package/src/utils/decimal-comma.ts +39 -6
  864. package/src/utils/exchange-announcements.ts +71 -0
  865. package/src/utils/exchange-rate-snapshot.ts +10 -0
  866. package/src/utils/financial-statements.ts +83 -4
  867. package/src/utils/format.ts +34 -16
  868. package/src/utils/fundamentals.ts +150 -34
  869. package/src/utils/fx-market-hours.ts +10 -1
  870. package/src/utils/latest-financial-period.ts +8 -0
  871. package/src/utils/linux-libc.ts +54 -0
  872. package/src/utils/market-capitalization.ts +111 -15
  873. package/src/utils/max-drawdown.ts +64 -0
  874. package/src/utils/network-failure.ts +83 -0
  875. package/src/utils/option-expiry.ts +139 -7
  876. package/src/utils/price-earnings.ts +11 -5
  877. package/src/utils/price-history.ts +18 -8
  878. package/src/utils/price-window.ts +131 -0
  879. package/src/utils/release-date.ts +47 -0
  880. package/src/utils/sec.ts +3 -0
  881. package/src/utils/throttled-fetch.ts +11 -4
  882. package/src/utils/trailing-eps.ts +67 -0
  883. package/src/utils/typed-text.ts +21 -0
  884. package/src/utils/utc-time.ts +24 -1
  885. package/src/version.ts +6 -0
  886. package/src/cli/pane-functions/screenshot.ts +0 -2122
@@ -1,5 +1,6 @@
1
1
  import type { HeadlessPaneEntry } from "../../../types/headless";
2
2
  import type { PricePoint } from "../../../types/financials";
3
+ import { cleanFloat32Price } from "../../../cli/history-rows";
3
4
  import { exportNumber } from "../../../cli/report-tables";
4
5
  import { publicTickerKey } from "../../../utils/exchanges";
5
6
  import { formatUtcTime } from "../../../utils/utc-time";
@@ -64,8 +65,9 @@ export function sessionRangeReport(windows: readonly SessionRangeWindow[]): Sess
64
65
  const listing = publicTickerKey(window.symbol, window.exchange);
65
66
  const span = (window.sessionDates?.length ?? 1) > 1 ? "" : "session ";
66
67
  const currency = window.quote?.currency?.trim();
67
- const low = exportNumber(range.low.price);
68
- const high = exportNumber(range.high.price);
68
+ // As the bars export them: the decimal the feed's float stands for (85.1, not 85.099998).
69
+ const low = cleanFloat32Price(exportNumber(range.low.price));
70
+ const high = cleanFloat32Price(exportNumber(range.high.price));
69
71
  const entry = (side: "low" | "high", price: number, at: Date): HeadlessPaneEntry => ({
70
72
  key: side === "low" ? "sessionLow" : "sessionHigh",
71
73
  label: `${listing} ${span}${side}`,
@@ -1,6 +1,9 @@
1
1
  import type { ChartResolution, TimeRange } from "../../../components/chart/core/types";
2
2
  import { CHART_RESOLUTIONS, TIME_RANGES as CHART_RANGES } from "../../../time-series/range";
3
3
  import { formatChartResolution } from "./viewport-labels";
4
+ import { CHART_BAR_SIZE_PRESETS, parseChartResolution, sortChartBarSizes, type ChartBarSize } from "../../../time-series/resolution";
5
+
6
+ export { CHART_BAR_SIZE_PRESETS };
4
7
  import type {
5
8
  PaneSettingField,
6
9
  PaneSettingOption,
@@ -32,6 +35,7 @@ import {
32
35
  type BuiltinStudySelection,
33
36
  type PairStudySelection,
34
37
  } from "./studies";
38
+ import { dateOptionError, readCalendarDate } from "../../../utils/calendar-date";
35
39
  import { buildCustomChartPreset, buildEmptyChartPreset, buildPriceChartPreset } from "./presets";
36
40
  import {
37
41
  CHART_SPEC_SETTING_KEY,
@@ -40,6 +44,11 @@ import {
40
44
 
41
45
  export { CHART_RANGES, CHART_RESOLUTIONS };
42
46
 
47
+ /** `sizes` with `current` among them in order of length, when the chart is set to one they lack. */
48
+ export function withChartBarSize<T extends ChartBarSize>(sizes: readonly T[], current: ChartResolution): Array<T | ChartBarSize> {
49
+ return current === "auto" || sizes.includes(current as T) ? [...sizes] : sortChartBarSizes([...sizes, current]);
50
+ }
51
+
43
52
  /** Full name and short form for each builtin indicator; the label adds its period. */
44
53
  const CHART_STUDY_NAMES: Record<BuiltinStudySelection, { name: string; short?: string; description: string }> = {
45
54
  volume: { name: "Volume", description: "Volume columns in a lower panel." },
@@ -220,27 +229,30 @@ function formatDateWindow(spec: ChartSpec): string {
220
229
  }
221
230
 
222
231
  function parseDate(value: string): string {
223
- if (!/^\d{4}-\d{2}-\d{2}$/.test(value)) {
224
- throw new Error("Use YYYY-MM-DD dates.");
225
- }
226
- const date = new Date(`${value}T00:00:00.000Z`);
227
- if (!Number.isFinite(date.getTime()) || date.toISOString().slice(0, 10) !== value) {
228
- throw new Error(`"${value}" is not a valid date.`);
229
- }
230
- return value;
232
+ const date = readCalendarDate(value);
233
+ if (!date) throw new Error(dateOptionError(value.trim(), "", { subject: "a date" }));
234
+ return date;
235
+ }
236
+
237
+ const WINDOW_SEPARATOR = /\s+(?:to|through)\s+|\s*(?:\.\.|–|—)\s*/i;
238
+
239
+ /** The two dates of a window: around "to", "through", ".." or a dash, or around a comma between dates that have none of their own (2026-10-01, 2026-10-20). */
240
+ function splitDateWindow(text: string): string[] | null {
241
+ const words = text.split(WINDOW_SEPARATOR);
242
+ if (words.length === 2 && words.every(Boolean)) return words;
243
+ const commas = text.split(/\s*,\s*/);
244
+ return commas.length === 2 && commas.every((part) => readCalendarDate(part) != null) ? commas : null;
231
245
  }
232
246
 
233
247
  function parseDateWindow(value: string): { start: string; end: string } | undefined {
234
248
  const trimmed = value.trim();
235
249
  if (!trimmed) return undefined;
236
- const match = trimmed.match(
237
- /^(\d{4}-\d{2}-\d{2})\s*(?:to|through|\.\.|,|–|—)\s*(\d{4}-\d{2}-\d{2})$/i,
238
- );
239
- if (!match) {
240
- throw new Error("Use YYYY-MM-DD to YYYY-MM-DD, or leave blank for the preset range.");
250
+ const parts = splitDateWindow(trimmed);
251
+ if (!parts) {
252
+ throw new Error("Use two dates as YYYY-MM-DD to YYYY-MM-DD, or leave blank for the preset range.");
241
253
  }
242
- const start = parseDate(match[1]!);
243
- const end = parseDate(match[2]!);
254
+ const start = parseDate(parts[0]!);
255
+ const end = parseDate(parts[1]!);
244
256
  if (start > end) throw new Error("The start date must be before the end date.");
245
257
  return { start, end };
246
258
  }
@@ -355,8 +367,8 @@ export function applyChartComposerPaneSetting(
355
367
  break;
356
368
  }
357
369
  case CHART_SETTING_KEYS.resolution: {
358
- const resolution = requireString(value, "Resolution") as ChartResolution;
359
- if (!CHART_RESOLUTIONS.includes(resolution)) throw new Error("Choose a valid chart resolution.");
370
+ const resolution = parseChartResolution(requireString(value, "Resolution"));
371
+ if (!resolution) throw new Error("Choose a valid chart resolution.");
360
372
  nextSpec = { ...spec, viewport: { ...spec.viewport, resolution } };
361
373
  break;
362
374
  }
@@ -452,7 +464,7 @@ export function buildChartComposerPaneSettingsDef(
452
464
  {
453
465
  key: CHART_SETTING_KEYS.dateWindow,
454
466
  label: "Date Window",
455
- description: "Enter YYYY-MM-DD to YYYY-MM-DD. Leave blank to use the preset range.",
467
+ description: "Enter two dates, such as 2026-10-01 to 2026-10-20. Leave blank to use the preset range.",
456
468
  type: "text",
457
469
  placeholder: "2025-01-01 to 2026-01-01",
458
470
  },
@@ -468,7 +480,7 @@ export function buildChartComposerPaneSettingsDef(
468
480
  label: "Resolution",
469
481
  description: "Choose the observation interval, or let the chart select it automatically.",
470
482
  type: "select",
471
- options: CHART_RESOLUTIONS.map((resolution) => ({
483
+ options: ["auto" as const, ...withChartBarSize(CHART_BAR_SIZE_PRESETS, spec.viewport.resolution)].map((resolution) => ({
472
484
  value: resolution,
473
485
  label: formatChartResolution(resolution),
474
486
  })),
@@ -1,3 +1,4 @@
1
+ import { logFailure } from "../../../utils/log-failure";
1
2
  import { useEffect, useMemo, useState, useSyncExternalStore } from "react";
2
3
  import {
3
4
  buildTickerSearchCandidates,
@@ -5,7 +6,7 @@ import {
5
6
  } from "../../../tickers/search";
6
7
  import { useOptionalAppSelector } from "../../../state/app/context";
7
8
  import type { TickerRecord } from "../../../types/ticker";
8
- import { searchChartSeriesCapabilities } from "../../../capabilities";
9
+ import { searchChartSeriesCatalogs } from "../../../capabilities/chart-series";
9
10
  import { SERIES_CATALOG_CAPABILITY_ID } from "../../../series/capability";
10
11
  import type { SeriesCatalogEntry } from "../../../series/types";
11
12
  import { getSharedRegistry } from "../../registry";
@@ -105,9 +106,7 @@ export function useRegisteredSeries(): readonly SeriesCatalogEntry[] {
105
106
  .then((result) => {
106
107
  if (!cancelled && Array.isArray(result?.entries)) setRemote(result.entries);
107
108
  })
108
- .catch(() => {
109
- // The view's own series still list; only the Bun process's extras are missing.
110
- });
109
+ .catch(logFailure("chart-composer.use-series-catalog", "Load remote chart series catalog failed"));
111
110
  return () => { cancelled = true; };
112
111
  }, [registry, series]);
113
112
 
@@ -274,12 +273,12 @@ export function useSeriesCatalogSuggestions({
274
273
  const controller = new AbortController();
275
274
  setProviderSearch({ query: normalizedQuery, suggestions: [], loading: true, error: null });
276
275
  const timer = setTimeout(() => {
277
- void searchChartSeriesCapabilities(registry, normalizedQuery, MAX_SERIES_SUGGESTIONS, controller.signal).then((items) => {
276
+ void searchChartSeriesCatalogs(registry, normalizedQuery, MAX_SERIES_SUGGESTIONS, controller.signal).then(({ items, errors }) => {
278
277
  if (!cancelled) setProviderSearch({
279
278
  query: normalizedQuery,
280
279
  suggestions: buildCapabilitySeriesSuggestions(items),
281
280
  loading: false,
282
- error: null,
281
+ error: errors.join(" ") || null,
283
282
  });
284
283
  }).catch((error: unknown) => {
285
284
  if (controller.signal.aborted || cancelled) return;
@@ -1,6 +1,7 @@
1
1
  import type { ChartResolution } from "../../../components/chart/core/types";
2
+ import { chartBarSizeParts, isManualChartResolution, type ManualChartResolution } from "../../../time-series/resolution";
2
3
 
3
- const RESOLUTION_LABELS: Record<ChartResolution, string> = {
4
+ const RESOLUTION_LABELS: Record<ManualChartResolution | "auto", string> = {
4
5
  auto: "Auto",
5
6
  "1m": "1m",
6
7
  "5m": "5m",
@@ -13,7 +14,7 @@ const RESOLUTION_LABELS: Record<ChartResolution, string> = {
13
14
  "1mo": "M",
14
15
  };
15
16
 
16
- const RESOLUTION_NAMES: Record<Exclude<ChartResolution, "auto">, string> = {
17
+ const RESOLUTION_NAMES: Record<ManualChartResolution, string> = {
17
18
  "1m": "1-minute",
18
19
  "5m": "5-minute",
19
20
  "15m": "15-minute",
@@ -25,19 +26,27 @@ const RESOLUTION_NAMES: Record<Exclude<ChartResolution, "auto">, string> = {
25
26
  "1mo": "monthly",
26
27
  };
27
28
 
29
+ // Months take MO beyond one (3MO), as 3M and 6M are ranges in the same bar.
30
+ const BUILT_UNIT_LABELS = { m: "m", h: "h", d: "D", wk: "W", mo: "MO" } as const;
31
+ const BUILT_UNIT_NAMES = { m: "minute", h: "hour", d: "day", wk: "week", mo: "month" } as const;
32
+
28
33
  /**
29
34
  * The one way chart intervals are labelled. Intraday reads in lowercase units
30
- * (1m, 1h) and daily and longer as D W M, so an interval never collides with
31
- * a range such as 1M (one month) in the same bar.
35
+ * (1m, 1h, 4h) and daily and longer as D W M, with a count when there are
36
+ * several (2D, 2W), so an interval never collides with a range such as 1M
37
+ * (one month) in the same bar.
32
38
  */
33
39
  export function formatChartResolution(resolution: ChartResolution): string {
34
- return RESOLUTION_LABELS[resolution] ?? resolution;
40
+ if (resolution === "auto" || isManualChartResolution(resolution)) return RESOLUTION_LABELS[resolution];
41
+ const parts = chartBarSizeParts(resolution);
42
+ return parts ? `${parts.count}${BUILT_UNIT_LABELS[parts.unit]}` : resolution;
35
43
  }
36
44
 
37
45
  export function describeChartResolution(resolution: ChartResolution): string {
38
- return resolution === "auto"
39
- ? "Choose an interval automatically for the active range."
40
- : `Use ${RESOLUTION_NAMES[resolution] ?? resolution} observations.`;
46
+ if (resolution === "auto") return "Choose an interval automatically for the active range.";
47
+ if (isManualChartResolution(resolution)) return `Use ${RESOLUTION_NAMES[resolution]} observations.`;
48
+ const parts = chartBarSizeParts(resolution);
49
+ return parts ? `Use ${parts.count}-${BUILT_UNIT_NAMES[parts.unit]} observations.` : `Use ${resolution} observations.`;
41
50
  }
42
51
 
43
52
  function calendarParts(date: Date, timeZone: string): { key: string; year: number; label: string } {
@@ -72,6 +81,7 @@ export function formatChartDateWindow(
72
81
  try {
73
82
  new Intl.DateTimeFormat("en-US", { timeZone: zone });
74
83
  } catch {
84
+ // Intentional ignore: unsupported exchange time zones use UTC so the date label remains readable.
75
85
  zone = "UTC";
76
86
  }
77
87
  const first = calendarParts(start, zone);
@@ -1,6 +1,7 @@
1
1
  import { ApiRequestError } from "../../../../api-client/errors";
2
2
  import type { ChatAttachment, ChatMessage } from "../../../../api-client";
3
3
  import { chatPlainText } from "../markdown";
4
+ import { isNetworkFailure } from "../../../../utils/network-failure";
4
5
 
5
6
  /** What the server takes: four images a message, each up to 5 MB, as PNG, JPEG, WebP or GIF. */
6
7
  export const MAX_CHAT_IMAGES = 4;
@@ -152,7 +153,8 @@ export function describeChatImageError(error: unknown, fallback = "The image cou
152
153
  if (error.status === 429) return UPLOAD_ERROR_SENTENCES.upload_rate_limited!;
153
154
  return fallback;
154
155
  }
155
- if (error instanceof TypeError) return `${fallback.replace(/\.$/, "")}. Check your connection and try again.`;
156
+ // No answer at all: a browser's TypeError, or the Cloud client's own word for it.
157
+ if (error instanceof TypeError || isNetworkFailure(error)) return `${fallback.replace(/\.$/, "")}. Check your connection and try again.`;
156
158
  if (error instanceof Error && error.message.trim()) return error.message.trim();
157
159
  return fallback;
158
160
  }
@@ -578,7 +578,7 @@ export function ChatContent({
578
578
  }, [createPaneFromTemplate, notify, rendererHost]);
579
579
 
580
580
  const handleDiscordCommand = useCallback((command: DiscordComposerCommand) => {
581
- void runDiscordCommand(command, { openUrl: (url) => rendererHost.openExternal(url) }).then(notify);
581
+ void runDiscordCommand(command, { openUrl: async (url) => { await rendererHost.openExternal(url); } }).then(notify);
582
582
  }, [notify, rendererHost]);
583
583
 
584
584
  // The terminal: a pasted or dropped path to an image file attaches the file
@@ -22,7 +22,7 @@ export function openChatPaneLink(link: ChatMessagePaneLink, actions: PaneLinkAct
22
22
  }
23
23
  const target = wirePaneTarget(link.link);
24
24
  if (!chatPaneLinkPane(target.paneId)) {
25
- actions.notify({ body: "That pane is not available in this version of Gloomberb.", type: "info" });
25
+ actions.notify({ body: "That pane is not available in this version of Gloom.", type: "info" });
26
26
  return;
27
27
  }
28
28
  actions.createPaneFromTemplate(target.templateId, target.arg ? { arg: target.arg } : undefined);
@@ -8,7 +8,7 @@ import { isManagedBot } from "./ghost-user";
8
8
  /**
9
9
  * Who someone is in chat, at a glance: a bot's own colour, the icons their
10
10
  * account earns, their local time and what they trade. The server derives
11
- * each from the account (GLO-646); a field it leaves out shows nothing.
11
+ * each from the account; a field it leaves out shows nothing.
12
12
  */
13
13
 
14
14
  type ChatPersonIconId = "bot" | "team" | "pro";
@@ -62,6 +62,8 @@ export interface ClinicalTrial {
62
62
  firstSubmitDate: Date | null;
63
63
  /** When the registry first posted the study. */
64
64
  firstPostDate: Date | null;
65
+ /** When the registry last posted a change to the study; the list is newest first by it. */
66
+ lastUpdatePostDate: Date | null;
65
67
  /** Deep link to the study page for [o]pen. */
66
68
  url: string;
67
69
  }
@@ -173,6 +175,7 @@ export function parseClinicalTrial(raw: unknown): ClinicalTrial | null {
173
175
  completionDateType: completion.type,
174
176
  firstSubmitDate: asDate(statusModule.studyFirstSubmitDate),
175
177
  firstPostDate: asDate(moduleOf(statusModule, "studyFirstPostDateStruct").date),
178
+ lastUpdatePostDate: asDate(moduleOf(statusModule, "lastUpdatePostDateStruct").date),
176
179
  url: `${CLINICAL_TRIALS_STUDY_BASE_URL}/${nctId}`,
177
180
  };
178
181
  }
@@ -221,7 +224,7 @@ function areaClause(area: string, values: string[]): string | null {
221
224
 
222
225
  /**
223
226
  * Build the v2 studies URL. Pure: no network, no API key. The most recently
224
- * posted studies come first, the order the pane lists them in, so each page
227
+ * updated studies come first, the order the pane lists them in, so each page
225
228
  * continues the one before it. Filters go to the registry with the search, so
226
229
  * every page it returns already matches them.
227
230
  */
@@ -229,7 +232,7 @@ export function buildStudiesUrl(query: StudiesQuery = {}): string {
229
232
  const params = new URLSearchParams();
230
233
  params.set("format", "json");
231
234
  params.set("pageSize", String(query.pageSize ?? DEFAULT_PAGE_SIZE));
232
- params.set("sort", "StudyFirstPostDate:desc");
235
+ params.set("sort", "LastUpdatePostDate:desc");
233
236
  params.set("fields", STUDY_FIELDS);
234
237
  const term = query.term?.trim();
235
238
  if (term) params.set("query.term", term);
@@ -228,7 +228,7 @@ export const TRIAL_REPORT_OPTIONS: readonly PaneReportOptionDef[] = [
228
228
  },
229
229
  ];
230
230
 
231
- type TrialColumnId = "time" | "phase" | "status" | "title" | "sponsor" | "ticker";
231
+ type TrialColumnId = "updated" | "phase" | "status" | "title" | "sponsor" | "ticker";
232
232
  export type TrialColumn = DataTableColumn & { id: TrialColumnId };
233
233
 
234
234
  export interface TrialLayout {
@@ -251,12 +251,12 @@ const TABLE_CHROME = 1 + 2;
251
251
  export function trialLayout(width: number): TrialLayout {
252
252
  const compact = width < 90;
253
253
  const wide = width >= 140;
254
- // Narrower than a terminal, the posting age gives way to the title: the list
254
+ // Narrower than a terminal, the update date gives way to the title: the list
255
255
  // is newest first and the detail has the date.
256
256
  const timed = width >= 76;
257
257
  const fixed: TrialColumn[] = [
258
- // "10/15/26" once a study is a week old.
259
- ...(timed ? [{ id: "time" as const, label: "Time", width: 8, align: "left" as const }] : []),
258
+ // An ISO day, as every date column reads.
259
+ ...(timed ? [{ id: "updated" as const, label: "Updated", width: 10, align: "left" as const }] : []),
260
260
  { id: "phase", label: "Phase", width: compact ? 7 : 9, align: "left" },
261
261
  { id: "status", label: "Status", width: wide ? 23 : 11, align: "left" },
262
262
  { id: "sponsor", label: "Sponsor", width: wide ? 30 : compact ? 15 : 22, align: "left" },
@@ -267,3 +267,12 @@ export function trialLayout(width: number): TrialLayout {
267
267
  const statusAt = fixed.findIndex((column) => column.id === "status") + 1;
268
268
  return { compact, showVenue: wide, columns: [...fixed.slice(0, statusAt), title, ...fixed.slice(statusAt)] };
269
269
  }
270
+
271
+ /**
272
+ * A search typed as a ticker (`TRIAL VKTX`): one to five letters, with a
273
+ * share class. The registry knows sponsors by name, so a symbol no study
274
+ * mentions is looked up as its company.
275
+ */
276
+ export function looksLikeTicker(term: string): boolean {
277
+ return /^[A-Za-z]{1,5}(?:[.-][A-Za-z])?$/.test(term.trim());
278
+ }
@@ -1,4 +1,4 @@
1
- import { useCallback, useEffect, useMemo, useRef } from "react";
1
+ import { useCallback, useEffect, useMemo, useRef, useState } from "react";
2
2
  import {
3
3
  DataTableStackView,
4
4
  PaneLinkMenu,
@@ -22,6 +22,7 @@ import { usePaneRefreshKey } from "../../../components/data-table/table-pane";
22
22
  import { DetailReader, type DetailFact } from "../../../components/reader/detail-reader";
23
23
  import { tf } from "../../../i18n";
24
24
  import {
25
+ useAssetData,
25
26
  useDebouncedPluginPaneState,
26
27
  usePaneSettingValue,
27
28
  usePluginPaneState,
@@ -30,7 +31,6 @@ import { useThemeColors } from "../../../theme/theme-context";
30
31
  import type { ThemeColors } from "../../../theme/colors";
31
32
  import type { PaneProps } from "../../../types/plugin";
32
33
  import { Box, Text, TextAttributes, type ScrollBoxRenderable } from "../../../ui";
33
- import { formatTimeAgo } from "../../../utils/datetime-format";
34
34
  import { isPlainArrowUp, stopSearchFocusNavigation } from "../../../utils/search-focus-navigation";
35
35
  import { useOpenDescription } from "../shared/open-description";
36
36
  import { useResearchCloudSession } from "../shared/research-cloud-session";
@@ -41,6 +41,7 @@ import {
41
41
  SPONSOR_FILTER_OPTIONS,
42
42
  STATUS_FILTER_OPTIONS,
43
43
  keepsToneWhenSelected,
44
+ looksLikeTicker,
44
45
  normalizeTrialFilters,
45
46
  sponsorClassLabel,
46
47
  trialFiltersNarrow,
@@ -56,6 +57,7 @@ import {
56
57
  type TrialFilters,
57
58
  } from "./model";
58
59
  import { useSponsorTickers, type SponsorTicker } from "./sponsor-tickers";
60
+ import { tickerSponsorName } from "./ticker-sponsor";
59
61
  import { CLINICAL_TRIALS_PANE_ID } from "./types";
60
62
 
61
63
  const SEARCH_DEBOUNCE_MS = 250;
@@ -68,8 +70,8 @@ function formatDate(date: Date | null, precision: DatePrecision = "day", type?:
68
70
  return type === "ESTIMATED" ? `${text} (est.)` : text;
69
71
  }
70
72
 
71
- /** When the study was posted: always past, so the list's time column can read it as an age. */
72
- function trialTimestamp(trial: ClinicalTrial): Date | null {
73
+ /** When the study was posted. */
74
+ function trialPosted(trial: ClinicalTrial): Date | null {
73
75
  return trial.firstPostDate ?? trial.firstSubmitDate;
74
76
  }
75
77
 
@@ -123,7 +125,8 @@ function trialFacts(trial: ClinicalTrial, ticker: SponsorTicker | undefined, col
123
125
  { label: "Enrollment", value: trial.enrollment != null ? trial.enrollment.toLocaleString("en-US") : "-" },
124
126
  { label: "Registry ID", value: trial.nctId },
125
127
  { label: "Start", value: formatDate(trial.startDate, trial.startDatePrecision, trial.startDateType) },
126
- { label: "Posted", value: formatDate(trialTimestamp(trial)) },
128
+ { label: "Posted", value: formatDate(trialPosted(trial)) },
129
+ { label: "Updated", value: formatDate(trial.lastUpdatePostDate) },
127
130
  { label: "Primary completion", value: formatDate(trial.primaryCompletionDate, trial.primaryCompletionDatePrecision, trial.primaryCompletionDateType) },
128
131
  { label: "Completion", value: formatDate(trial.completionDate, trial.completionDatePrecision, trial.completionDateType) },
129
132
  { label: "Conditions", value: trial.conditions.length > 0 ? trial.conditions.join(", ") : "None listed" },
@@ -137,6 +140,7 @@ function filterOptions(options: readonly TrialFilterOption[], colors: ThemeColor
137
140
  export function TrialsPane({ width, height, focused }: PaneProps) {
138
141
  const colors = useThemeColors();
139
142
  const client = useMemo(() => new ClinicalTrialsClient(), []);
143
+ const dataProvider = useAssetData();
140
144
  const openDescription = useOpenDescription();
141
145
  const session = useResearchCloudSession();
142
146
 
@@ -156,7 +160,7 @@ export function TrialsPane({ width, height, focused }: PaneProps) {
156
160
 
157
161
  const [selectedId, setSelectedId] = useDebouncedPluginPaneState<string | null>("selectedId", null);
158
162
  // The open study is what the pane shows, so a reload or a shared layout opens it again.
159
- // `open` (a share, `gloomberb shot TRIAL obesity --open NCT07868939`) opens one study first.
163
+ // `open` (a share, `gloom shot TRIAL obesity --open NCT07868939`) opens one study first.
160
164
  const [initialOpen] = usePaneSettingValue("open", "");
161
165
  const [openItemId, setOpenItemId] = usePluginPaneState<string | null>("openItemId", String(initialOpen ?? "").trim() || null);
162
166
  const { active: searchFocused, focus: focusSearch, searchProps } = useQueryBarSearch();
@@ -230,7 +234,24 @@ export function TrialsPane({ width, height, focused }: PaneProps) {
230
234
  studies.reload();
231
235
  sponsorTickers.retry();
232
236
  }, [sponsorTickers, studies]);
233
- const loading = studies.loading && trials.length === 0;
237
+ // `TRIAL VKTX`: no study names a symbol, so one that finds nothing is
238
+ // searched as its company's name, quoted so the registry matches the whole
239
+ // name as a sponsor files it, and the search box then shows it. Each term
240
+ // is looked up once.
241
+ const [looked, setLooked] = useState<ReadonlySet<string>>(() => new Set());
242
+ const resolvingTicker = studies.status === "loaded" && trials.length === 0 && !studies.error
243
+ && looksLikeTicker(term) && !looked.has(term.toUpperCase());
244
+ useEffect(() => {
245
+ if (!resolvingTicker) return;
246
+ let live = true;
247
+ void tickerSponsorName(dataProvider, term).catch(() => null).then((name) => {
248
+ if (!live) return;
249
+ setLooked((current) => new Set([...current, term.toUpperCase()]));
250
+ if (name) updateQuery(`"${name}"`);
251
+ });
252
+ return () => { live = false; };
253
+ }, [dataProvider, resolvingTicker, term, updateQuery]);
254
+ const loading = (studies.loading && trials.length === 0) || resolvingTicker;
234
255
  usePaneRefreshKey(reload, { focused, enabled: !searchFocused && !openItemId });
235
256
 
236
257
  const detailTicker = detailTrial ? tickerOf(detailTrial) : undefined;
@@ -291,10 +312,9 @@ export function TrialsPane({ width, height, focused }: PaneProps) {
291
312
  const layout = useMemo(() => trialLayout(width), [width]);
292
313
  const renderCell = useCallback((trial: ClinicalTrial, column: TrialColumn, _index: number, rowState: { selected: boolean }): DataTableCell => {
293
314
  switch (column.id) {
294
- case "time": {
295
- const posted = trialTimestamp(trial);
296
- // Exported as the ISO day, not an instant: when a study was posted does not date the search.
297
- return { text: posted ? formatTimeAgo(posted) : "", value: posted ? posted.toISOString().slice(0, 10) : null, color: colors.textDim };
315
+ case "updated": {
316
+ const updated = formatDate(trial.lastUpdatePostDate);
317
+ return trial.lastUpdatePostDate ? { text: updated, value: updated, color: colors.textDim } : { text: "--", value: null, color: colors.textMuted };
298
318
  }
299
319
  case "phase": {
300
320
  const text = trialPhaseLabel(trial.phases, layout.compact);
@@ -404,7 +424,7 @@ export function TrialsPane({ width, height, focused }: PaneProps) {
404
424
  emptyStateTitle={term
405
425
  ? `No trials match ${term}${narrowed ? " with these filters" : ""}.`
406
426
  : narrowed ? "No trials match these filters." : "No trials loaded."}
407
- emptyStateHint={narrowed ? "Clear a filter to see more…" : "Press / to search…"}
427
+ emptyStateHint={narrowed ? "Clear a filter to see more…" : term ? "Try the company or drug name…" : "Press / to search…"}
408
428
  />
409
429
  );
410
430
  }
@@ -0,0 +1,17 @@
1
+ import type { DataProvider } from "../../../types/data-provider";
2
+ import { shortCompanyName } from "../../../tickers/company-name";
3
+ import { classifyInstrumentKind } from "../../../tickers/search/ranking";
4
+
5
+ /**
6
+ * The company a ticker is, by the name a registry files its studies under:
7
+ * VKTX is "Viking Therapeutics". Read from the listing's quote, which names
8
+ * it; a fund or a contract is no sponsor. Null when no share trades under it.
9
+ */
10
+ export async function tickerSponsorName(dataProvider: Pick<DataProvider, "getQuote"> | null, ticker: string): Promise<string | null> {
11
+ const symbol = ticker.trim().toUpperCase();
12
+ if (!dataProvider || !symbol) return null;
13
+ const quote = await dataProvider.getQuote(symbol).catch(() => null);
14
+ const name = quote?.name?.trim();
15
+ const kind = classifyInstrumentKind(quote?.instrumentType);
16
+ return name && kind !== "fund" && kind !== "derivative" ? shortCompanyName(name) : null;
17
+ }
@@ -460,7 +460,7 @@ export class ASKGSessionController {
460
460
  this.manifest = manifest;
461
461
  const executor = this.options.getExecutor(manifest);
462
462
  if (!executor) {
463
- await this.deliver(failure("This window cannot run Gloomberb tools."));
463
+ await this.deliver(failure("This window cannot run Gloom tools."));
464
464
  return;
465
465
  }
466
466
  const payload = await executor.execute(call, {
@@ -11,6 +11,6 @@ export function askgLockNote({ verifyEmail }: PaneLock): string {
11
11
  : "log in or sign up free in the app (Ctrl+P, Log In or Sign Up)";
12
12
  return [
13
13
  `Ask Gloom (ASKG in the app) needs only a free, verified Gloom account: ${account}.`,
14
- "Without AI: `gloomberb catalog <topic>` finds the function for a question, e.g. `gloomberb catalog dividends`.",
14
+ "Without AI: `gloom catalog <topic>` finds the function for a question, e.g. `gloom catalog dividends`.",
15
15
  ].join("\n");
16
16
  }
@@ -198,7 +198,7 @@ function countText(count: number | undefined): string {
198
198
  /** Words Gloom needs and the reader does not: field paths and pointers for the model. */
199
199
  const INTERNAL_CLAUSE = /\bmetadata\.[a-z_]+|\blists each with its reason\b|\bsee (?:the )?(?:result|payload|rows)\b/i;
200
200
  /** A service the app already worked around. Never a warning, only a detail. */
201
- const SERVICE_FAILURE = /internal server error|server error|bad gateway|service unavailable|gateway time-?out|\b(?:http|status)\s*\d{3}\b|\b50[0-9]\b|econn\w+|etimedout|fetch failed|network error|socket hang up|too many requests|rate.?limit|request failed|unexpected token|not valid json|cannot read propert|is not a function|undefined is not/i;
201
+ const SERVICE_FAILURE = /internal server error|server error|bad gateway|service unavailable|gateway time-?out|\b(?:http|status)\s*\d{3}\b|\b50[0-9]\b|econn\w+|etimedout|fetch failed|network error|couldn't reach its data service|socket hang up|too many requests|rate.?limit|request failed|unexpected token|not valid json|cannot read propert|is not a function|undefined is not/i;
202
202
  /** What the client did to fit the result through the wire. Gloom's business. */
203
203
  const TRANSPORT_CLAUSE = /^(?:trimmed to fit|result exceeded the client payload limit|result was too large)/i;
204
204
  /** Text that is not for people: payloads, identifiers, URIs, stack frames. */
@@ -25,7 +25,7 @@ export function registerCloudAuthCommands(ctx: GloomPluginContext): void {
25
25
  ctx.registerCommand({
26
26
  id: "auth-login",
27
27
  label: "Log In",
28
- description: "Log in to your Gloomberb account",
28
+ description: "Log in to your Gloom account",
29
29
  keywords: ["login", "sign in", "auth", "account"],
30
30
  category: "config",
31
31
  hidden: () => apiClient.isSignedIn(),
@@ -43,7 +43,7 @@ export function registerCloudAuthCommands(ctx: GloomPluginContext): void {
43
43
  ctx.registerCommand({
44
44
  id: "auth-signup",
45
45
  label: "Sign Up",
46
- description: "Create a Gloomberb account",
46
+ description: "Create a Gloom account",
47
47
  keywords: ["signup", "register", "create account"],
48
48
  category: "config",
49
49
  hidden: () => apiClient.isSignedIn(),
@@ -77,7 +77,7 @@ export function registerCloudAuthCommands(ctx: GloomPluginContext): void {
77
77
  ctx.registerCommand({
78
78
  id: "auth-logout",
79
79
  label: "Logout",
80
- description: "Log out of your Gloomberb account",
80
+ description: "Log out of your Gloom account",
81
81
  keywords: ["logout", "sign out"],
82
82
  category: "config",
83
83
  execute: async () => {