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
@@ -108,3 +108,304 @@ export interface HiringBoard {
108
108
  locked: number
109
109
  companies: HiringSummary[]
110
110
  }
111
+
112
+ /**
113
+ * Why a company's week is not measured: the collection changed, so its new
114
+ * roles say nothing about hiring (docs/hiring-app-attention.md, Moves).
115
+ */
116
+ export type HiringMoveExclusion =
117
+ | "first_read" | "source_added" | "identity_reset" | "catch_up" | "retired" | "truncated" | "rediscovered"
118
+ | "recipe_restored" | "careers_url_dropped" | "read_gap" | "collapsed" | "no_read" | "vendor_wide"
119
+
120
+ export interface HiringMoveWeek {
121
+ week: string
122
+ newRoles: number | null
123
+ closedRoles: number | null
124
+ openRoles: number | null
125
+ reads: number
126
+ measured: boolean
127
+ excluded: HiringMoveExclusion[]
128
+ }
129
+
130
+ /**
131
+ * Why a move is held from alerts and ranked after the others: one day carried
132
+ * most of its new roles, its boards were read too seldom to tell a steady
133
+ * rise from a batch, or it is more roles than the boards ever held open.
134
+ */
135
+ export type HiringMoveFlag = "one_day_batch" | "few_reads" | "outsized"
136
+
137
+ /** A company's new roles in one UTC week against its own measured weeks before and its peers'. */
138
+ export interface HiringMove {
139
+ symbol: string
140
+ name: string
141
+ sector: string | null
142
+ industry: string | null
143
+ sourceTickers: string[]
144
+ week: string
145
+ newRoles: number
146
+ closedRoles: number
147
+ openRoles: number
148
+ /** `values` is empty in a free read: the weeks are history. */
149
+ baseline: { weeks: number; mean: number; sd: number; values: Array<{ week: string; newRoles: number }> }
150
+ ratio: number | null
151
+ zScore: number
152
+ peers: { group: "industry" | "sector" | "universe"; label: string; companies: number; medianRatio: number | null }
153
+ peerRelative: number | null
154
+ direction: "accelerating" | "slowing" | null
155
+ /** `with_peers`: the company moved, and so did its peers. */
156
+ signal: "accelerating" | "slowing" | "with_peers" | null
157
+ /** Role families behind the move, each scaled to the week's measured new roles. */
158
+ drivers: Array<{ id: string; label: string; newRoles: number; baselineMean: number }>
159
+ topTitles: Array<{ title: string; count: number }>
160
+ /** Absent from a server before flags. */
161
+ flags?: HiringMoveFlag[]
162
+ /** The day with the most new roles that week, and how many. */
163
+ peakDay?: { day: string; newRoles: number } | null
164
+ /** A board that cannot place its new roles on a day: its reads that week and the days they counted. */
165
+ unplacedRead?: { reads: number; days: number | null } | null
166
+ /** The most roles the company's boards held open in a week before. */
167
+ priorMaxOpen?: number | null
168
+ why: string
169
+ firstComputedAt: string
170
+ computedAt: string
171
+ /** Since when the current signal has held; it alerts once a pass 12 hours on keeps it. */
172
+ signalSince?: string
173
+ confirmed?: boolean
174
+ }
175
+
176
+ export interface HiringMovePosting {
177
+ id: string
178
+ title: string
179
+ url: string | null
180
+ location: string | null
181
+ country: string | null
182
+ jobFunction: string | null
183
+ seniority: string | null
184
+ firstSeenAt: string
185
+ closedAt: string | null
186
+ sourceTicker: string
187
+ }
188
+
189
+ export type HiringMovesFilter = "all" | "moves" | "accelerating" | "slowing"
190
+
191
+ export interface HiringMovesBoard {
192
+ generatedAt: string
193
+ proRequired: true
194
+ preview: boolean
195
+ week: string | null
196
+ /** A free read is always the own moves, whatever was asked. */
197
+ filter?: HiringMovesFilter
198
+ total: number
199
+ locked: number
200
+ coverage: {
201
+ measured: number
202
+ signals: { accelerating: number; slowing: number; withPeers: number }
203
+ unmeasured: number
204
+ unmeasuredReasons: Partial<Record<HiringMoveExclusion, number>>
205
+ computedAt: string | null
206
+ baselineWeeks: number
207
+ }
208
+ moves: HiringMove[]
209
+ }
210
+
211
+ export interface HiringCompanyMoves {
212
+ generatedAt: string
213
+ proRequired: true
214
+ preview: boolean
215
+ symbol: string
216
+ requestedSymbol?: string
217
+ name: string | null
218
+ latest: HiringMove | null
219
+ /** The latest week, measured or not. */
220
+ week: HiringMoveWeek | null
221
+ weeks: HiringMoveWeek[]
222
+ history: Array<Pick<HiringMove, "week" | "newRoles" | "ratio" | "zScore" | "peerRelative" | "direction" | "signal" | "computedAt">>
223
+ evidence: { added: HiringMovePosting[]; closed: HiringMovePosting[] }
224
+ evidenceTotals: { added: number; closed: number }
225
+ /** `move`: a free read of a company off the free board keeps its week, not its move. */
226
+ locked: { history: number; added: number; closed: number; move?: number }
227
+ }
228
+
229
+ /**
230
+ * HIRE's Expansion and Anomalies tabs: a company's first roles in a country
231
+ * or city, one place or role family far above its own weeks, and role
232
+ * families it never posted, in the latest complete week.
233
+ */
234
+ export type HiringSignalGroup = "expansion" | "anomalies"
235
+ export type HiringSignalKind = "new_country" | "new_city" | "location_spike" | "function_spike" | "new_role_type"
236
+ export type HiringSignalsFilter = "all" | HiringSignalKind
237
+ /** Why a company's week gives no signal at all. */
238
+ export type HiringSignalHold = "unmeasured" | "short_watch" | "recounted"
239
+ /** Why a kind was not looked for at a company, or a first or a spike was dropped. */
240
+ export type HiringSignalSkip = "thin_history" | "unplaced_history" | "unplaced_cities" | "unclassified_history" | "reformatted" | "posted_before_watch" | "similar_city" | "one_day"
241
+ /** A spike shown last: a seldom-read board, or a week Moves flagged. */
242
+ export type HiringSignalFlag = "few_reads" | "one_day_batch"
243
+
244
+ export interface HiringWeekSignal {
245
+ symbol: string
246
+ name: string
247
+ sector: string | null
248
+ industry: string | null
249
+ sourceTickers: string[]
250
+ week: string
251
+ kind: HiringSignalKind
252
+ group: HiringSignalGroup
253
+ dimension: "country" | "city" | "function"
254
+ /** `MX`, `austin|US`, `data_ai`. */
255
+ key: string
256
+ /** `Mexico`, `Austin, TX, US`, `Data & AI`. */
257
+ label: string
258
+ country: string | null
259
+ newRoles: number
260
+ titles: number
261
+ /** How far back "never" goes: every board read since `watchedSince`, and the postings seen before the week. */
262
+ history: { watchedSince: string; priorPostings: number; priorShare: number | null }
263
+ /** A spike's weeks before; `values` is empty in a free read. */
264
+ baseline: { weeks: number; mean: number; values: Array<{ week: string; newRoles: number }> } | null
265
+ ratio: number | null
266
+ zScore: number | null
267
+ /** The company's own pace in the same terms, for a spike. */
268
+ companyRatio: number | null
269
+ flags: HiringSignalFlag[]
270
+ reads: number | null
271
+ topTitles: Array<{ title: string; count: number }>
272
+ places: Array<{ label: string; count: number }>
273
+ postings: HiringMovePosting[]
274
+ why: string
275
+ firstComputedAt: string
276
+ computedAt: string
277
+ }
278
+
279
+ export interface HiringSignalsBoard {
280
+ generatedAt: string
281
+ proRequired: true
282
+ preview: boolean
283
+ group: HiringSignalGroup
284
+ /** A free read is always the group's first three, whatever was asked. */
285
+ filter: HiringSignalsFilter
286
+ week: string | null
287
+ total: number
288
+ locked: number
289
+ coverage: {
290
+ measured: number
291
+ counts: Partial<Record<HiringSignalKind, number>>
292
+ held: Partial<Record<HiringSignalHold, number>>
293
+ skipped: Partial<Record<HiringSignalSkip, number>>
294
+ /** The earliest and latest first read of a measured company: how far back "never" goes. */
295
+ watchedFrom: string | null
296
+ watchedTo: string | null
297
+ computedAt: string | null
298
+ }
299
+ signals: HiringWeekSignal[]
300
+ }
301
+
302
+ export interface HiringCompanySignals {
303
+ generatedAt: string
304
+ proRequired: true
305
+ preview: boolean
306
+ symbol: string
307
+ requestedSymbol?: string
308
+ name: string | null
309
+ week: string | null
310
+ watchedSince: string | null
311
+ held: HiringSignalHold | null
312
+ skipped: HiringSignalSkip[]
313
+ /** The latest week's signals, both groups. */
314
+ signals: HiringWeekSignal[]
315
+ history: HiringWeekSignal[]
316
+ /** What a free read holds back: this week's, earlier weeks', and both by tab. Absent by tab from a server before it. */
317
+ locked: { signals: number; history: number } & Partial<Record<HiringSignalGroup, number>>
318
+ }
319
+
320
+ /**
321
+ * HIRE's Building tab: the role families and themes whose share of a
322
+ * company's new roles rose against its own weeks before, and each company's
323
+ * whole mix, recent weeks against the weeks before.
324
+ */
325
+ type HiringBuildingDimension = "function" | "theme"
326
+ export type HiringBuildingFilter = "all" | HiringBuildingDimension
327
+ /** Why a company has no mix to compare. */
328
+ export type HiringBuildingHold = "shared_board" | "unmeasured" | "recounted" | "rescoped" | "short_watch" | "thin"
329
+ /** Compared in part: no family mix, or some themes not yet read. */
330
+ export type HiringBuildingSkip = "unclassified" | "unread_titles"
331
+
332
+ export interface HiringMixRow {
333
+ dimension: HiringBuildingDimension
334
+ /** `sales`, `ai_ml`. */
335
+ key: string
336
+ /** `Sales`, `AI & machine learning`. */
337
+ label: string
338
+ recentRoles: number
339
+ /** Of the recent weeks' roles with a role family (a family), or of all of them (a theme). */
340
+ recentShare: number
341
+ beforeRoles: number
342
+ beforeShare: number
343
+ change: number
344
+ /** A theme whose titles have all been read; a family always is. */
345
+ read: boolean
346
+ }
347
+
348
+ interface HiringBuildingWeek { week: string; roles: number; classified: number }
349
+
350
+ export interface HiringBuildingShift {
351
+ symbol: string
352
+ name: string
353
+ sector: string | null
354
+ industry: string | null
355
+ sourceTickers: string[]
356
+ week: string
357
+ dimension: HiringBuildingDimension
358
+ key: string
359
+ label: string
360
+ /** `values` is empty in a free read. */
361
+ recent: { weeks: number; roles: number; total: number; share: number; values: Array<{ week: string; roles: number; total: number }> }
362
+ before: { weeks: number; roles: number; total: number; share: number; values: Array<{ week: string; roles: number; total: number }> }
363
+ change: number
364
+ ratio: number | null
365
+ zScore: number
366
+ titles: number
367
+ topTitles: Array<{ title: string; count: number }>
368
+ postings: HiringMovePosting[]
369
+ why: string
370
+ firstComputedAt: string
371
+ computedAt: string
372
+ }
373
+
374
+ export interface HiringBuildingBoard {
375
+ generatedAt: string
376
+ proRequired: true
377
+ preview: boolean
378
+ /** A free read is always the first three, whatever was asked. */
379
+ filter: HiringBuildingFilter
380
+ week: string | null
381
+ total: number
382
+ locked: number
383
+ coverage: {
384
+ measured: number
385
+ counts: Partial<Record<HiringBuildingDimension, number>>
386
+ held: Partial<Record<HiringBuildingHold, number>>
387
+ skipped: Partial<Record<HiringBuildingSkip, number>>
388
+ /** Theme titles in the weeks compared, and how many the model has read. */
389
+ themeTitles: { titles: number; read: number }
390
+ computedAt: string | null
391
+ }
392
+ shifts: HiringBuildingShift[]
393
+ }
394
+
395
+ export interface HiringCompanyBuilding {
396
+ generatedAt: string
397
+ proRequired: true
398
+ preview: boolean
399
+ symbol: string
400
+ requestedSymbol?: string
401
+ name: string | null
402
+ week: string | null
403
+ held: HiringBuildingHold | null
404
+ skipped: HiringBuildingSkip[]
405
+ window: { recent: HiringBuildingWeek[]; before: HiringBuildingWeek[] } | null
406
+ functions: HiringMixRow[]
407
+ themes: HiringMixRow[]
408
+ shifts: HiringBuildingShift[]
409
+ history: HiringBuildingShift[]
410
+ locked: { functions: number; themes: number; shifts: number; history: number }
411
+ }
@@ -62,11 +62,13 @@ export type {
62
62
  /** Server-side caps for `/assist/command`; enforced here so a 422 is never sent. */
63
63
  const ASSIST_QUERY_MAX_LENGTH = 200;
64
64
  const ASSIST_COMMAND_LIMIT = 150;
65
- /** The futures curve's root list is the longest a command sends: 76 since GLO-783. */
65
+ /** The futures curve's root list is the longest a command sends: 76. */
66
66
  export const ASSIST_ARG_OPTION_LIMIT = 128;
67
67
  const ASSIST_ARG_OPTION_VALUE_MAX_LENGTH = 40;
68
68
  const ASSIST_ARG_OPTION_LABEL_MAX_LENGTH = 60;
69
69
  const ASSIST_REQUEST_TIMEOUT_MS = 6_000;
70
+ const SESSION_REVALIDATION_INITIAL_MS = 1_000;
71
+ const SESSION_REVALIDATION_MAX_MS = 30_000;
70
72
 
71
73
  /**
72
74
  * Fits a command's argument values inside the server caps. The value is what
@@ -94,8 +96,15 @@ interface PendingSessionRequest {
94
96
 
95
97
  class GloomApiClient {
96
98
  private currentUser: AuthUser | null = null;
97
- /** Local identity of a verified user/credential pair, never serialized. */
99
+ /** Local user/credential binding, masked until verified and never serialized. */
98
100
  private verifiedSessionIdentity: object | null = null;
101
+ private verifiedSessionCredential: string | null = null;
102
+ private sessionTransitions = 0;
103
+ private sessionTransition: Promise<void> | null = null;
104
+ /** Device adoption and external session installs supersede pending email auth. */
105
+ private sessionInstallationGeneration = 0;
106
+ private sessionRevalidationGeneration = 0;
107
+ private sessionRevalidationTimer: ReturnType<typeof setTimeout> | null = null;
99
108
  private sessionChecked = false;
100
109
  /** Last few session transitions, content-free, for app://auth. */
101
110
  private authTrace: Array<{ at: number; event: string; token: boolean; user: string }> = [];
@@ -110,7 +119,7 @@ class GloomApiClient {
110
119
  request: (path, options, canApplySession) => this.request(path, options, canApplySession),
111
120
  requireCapturedSession: (message) => this.requireCapturedSession(message),
112
121
  setCurrentUser: (user) => this.setCurrentUser(user),
113
- setSessionToken: (token) => this.setSessionToken(token),
122
+ setSessionToken: (token) => this.installSessionToken(token),
114
123
  updateCurrentUser: (updater) => this.updateCurrentUser(updater),
115
124
  });
116
125
  private readonly socket: CloudApiSocket = new CloudApiSocket({
@@ -123,7 +132,6 @@ class GloomApiClient {
123
132
  markCurrentUserUnverified: () => {
124
133
  if (this.currentUser) {
125
134
  this.currentUser = { ...this.currentUser, emailVerified: false };
126
- this.verifiedSessionIdentity = null;
127
135
  this.emitCurrentUserChange();
128
136
  }
129
137
  },
@@ -165,6 +173,8 @@ class GloomApiClient {
165
173
  }
166
174
 
167
175
  setCookieSessionMode(enabled: boolean): void {
176
+ this.cancelSessionRevalidation();
177
+ this.sessionInstallationGeneration += 1;
168
178
  this.sessionChecked = false;
169
179
  this.verifiedSessionIdentity = null;
170
180
  this.transport.setCookieSessionMode(enabled);
@@ -172,12 +182,21 @@ class GloomApiClient {
172
182
  }
173
183
 
174
184
  setSessionToken(token: string | null): void {
185
+ if (this.transport.getSessionToken() !== token || !token) {
186
+ this.cancelSessionRevalidation();
187
+ this.sessionInstallationGeneration += 1;
188
+ }
189
+ this.installSessionToken(token);
190
+ }
191
+
192
+ private installSessionToken(token: string | null): void {
175
193
  const changed = this.transport.getSessionToken() !== token;
176
194
  this.sessionChecked = false;
177
195
  this.transport.setSessionToken(token);
178
196
  if (changed) this.verifiedSessionIdentity = null;
179
197
  this.traceAuth(changed ? "setSessionToken:changed" : "setSessionToken:same");
180
198
  if (!token) {
199
+ this.cancelSessionRevalidation();
181
200
  this.currentUser = null;
182
201
  this.verifiedSessionIdentity = null;
183
202
  }
@@ -224,7 +243,9 @@ class GloomApiClient {
224
243
 
225
244
  /** Null while a replacement credential still awaits its matching user. */
226
245
  getVerifiedSessionIdentity(): object | null {
227
- return this.isVerified() ? this.verifiedSessionIdentity : null;
246
+ return this.sessionTransitions === 0 && this.isVerified()
247
+ && this.verifiedSessionCredential === this.transport.getSessionToken()
248
+ ? this.verifiedSessionIdentity : null;
228
249
  }
229
250
 
230
251
  /**
@@ -276,11 +297,18 @@ class GloomApiClient {
276
297
  if (this.authTrace.length > 24) this.authTrace.shift();
277
298
  }
278
299
 
279
- private setCurrentUser(user: AuthUser | null): void {
300
+ private setCurrentUser(user: AuthUser | null, confirmSession = true): void {
301
+ const sameAccount = this.currentUser?.id === user?.id;
280
302
  const changed = this.socketEntitlementKey(this.currentUser) !== this.socketEntitlementKey(user);
281
303
  this.traceAuth("setCurrentUser", user);
282
304
  this.currentUser = user;
283
- this.verifiedSessionIdentity = this.isVerified() ? {} : null;
305
+ if (confirmSession) {
306
+ this.clearSessionRevalidationTimer();
307
+ this.verifiedSessionIdentity = user ? {} : null;
308
+ this.verifiedSessionCredential = this.transport.getSessionToken();
309
+ } else if (!sameAccount || !user) {
310
+ this.verifiedSessionIdentity = null;
311
+ }
284
312
  this.socket.syncAuthState({ reconnect: changed });
285
313
  this.emitCurrentUserChange();
286
314
  }
@@ -291,7 +319,9 @@ class GloomApiClient {
291
319
 
292
320
  private updateCurrentUser(updater: (user: AuthUser) => AuthUser): void {
293
321
  if (!this.currentUser) return;
294
- this.setCurrentUser(updater(this.currentUser));
322
+ // A socket/profile update is metadata, not proof that a replacement
323
+ // credential belongs to this user. Keep its existing binding, even null.
324
+ this.setCurrentUser(updater(this.currentUser), false);
295
325
  }
296
326
 
297
327
  private socketEntitlementKey(user: AuthUser | null): string {
@@ -326,11 +356,123 @@ class GloomApiClient {
326
356
  return this.currentUser?.emailVerified ? this.currentUser : null;
327
357
  }
328
358
 
329
- signUp = this.auth.signUp.bind(this.auth);
330
- signIn = this.auth.signIn.bind(this.auth);
359
+ signUp = (email: string, username: string, name: string, password: string) =>
360
+ this.withSessionTransition((isCurrent) => this.auth.signUp(email, username, name, password, isCurrent));
361
+ signIn = (email: string, password: string) =>
362
+ this.withSessionTransition((isCurrent) => this.auth.signIn(email, password, isCurrent));
331
363
  startDeviceSignIn = this.auth.startDeviceSignIn.bind(this.auth);
332
364
  pollDeviceSignIn = this.auth.pollDeviceSignIn.bind(this.auth);
333
- signOut = this.auth.signOut.bind(this.auth);
365
+ signOut = () => this.withSessionTransition((isCurrent) => this.auth.signOut(isCurrent), false);
366
+
367
+ /** Cookies can change before an auth response's body arrives, including ones the browser hides. */
368
+ private withSessionTransition<T>(run: (isCurrent: () => boolean) => Promise<T>, reconcileFailure = true): Promise<T> {
369
+ const previous = this.sessionTransition;
370
+ this.cancelSessionRevalidation();
371
+ let revalidationGeneration = this.sessionRevalidationGeneration;
372
+ const generation = this.sessionInstallationGeneration;
373
+ const isCurrent = () => generation === this.sessionInstallationGeneration;
374
+ this.sessionTransitions += 1;
375
+ this.sessionChecked = false;
376
+ this.verifiedSessionIdentity = null;
377
+ this.sessionRequestGeneration += 1;
378
+ this.emitCurrentUserChange();
379
+ let needsRevalidation = false;
380
+ const operation = (async () => {
381
+ // Serialize credential-changing requests so a late response cannot pair
382
+ // one account's user with another request's installed cookie.
383
+ if (previous) await previous;
384
+ try {
385
+ if (!isCurrent()) throw new Error("Another sign-in replaced this request.");
386
+ // An earlier queued sign-out may have retired retries while clearing its token.
387
+ revalidationGeneration = this.sessionRevalidationGeneration;
388
+ this.sessionRequestGeneration += 1;
389
+ const result = await run(isCurrent);
390
+ if (!isCurrent()) throw new Error("Another sign-in replaced this request.");
391
+ return result;
392
+ } catch (error) {
393
+ if (isCurrent()) {
394
+ this.verifiedSessionIdentity = null;
395
+ this.sessionChecked = false;
396
+ }
397
+ if (isCurrent() && reconcileFailure && this.transport.hasSessionCredential()) {
398
+ // A failed body may already have changed the cookie. A fresh session
399
+ // check is the only way to resume; retry if it cannot validate yet.
400
+ needsRevalidation = true;
401
+ this.sessionRequestGeneration += 1;
402
+ await this.revalidateSession(() => isCurrent()
403
+ && revalidationGeneration === this.sessionRevalidationGeneration).catch((failure) => {
404
+ if (!isCurrent()) return;
405
+ this.verifiedSessionIdentity = null;
406
+ logFailure("cloud.auth", "Restore session after failed sign-in failed")(failure);
407
+ });
408
+ }
409
+ throw error;
410
+ } finally {
411
+ if (isCurrent()) this.sessionRequestGeneration += 1;
412
+ this.sessionTransitions -= 1;
413
+ if (isCurrent() && needsRevalidation) this.scheduleSessionRevalidation(revalidationGeneration);
414
+ this.emitCurrentUserChange();
415
+ }
416
+ })();
417
+ const settled = operation.then(() => {}, () => {
418
+ // Intentional ignore: the caller receives the error while the auth queue continues.
419
+ });
420
+ this.sessionTransition = settled;
421
+ void settled.then(() => { if (this.sessionTransition === settled) this.sessionTransition = null; });
422
+ return operation;
423
+ }
424
+
425
+ private clearSessionRevalidationTimer(): void {
426
+ if (this.sessionRevalidationTimer !== null) clearTimeout(this.sessionRevalidationTimer);
427
+ this.sessionRevalidationTimer = null;
428
+ }
429
+
430
+ private cancelSessionRevalidation(): void {
431
+ this.sessionRevalidationGeneration += 1;
432
+ this.clearSessionRevalidationTimer();
433
+ }
434
+
435
+ /** A failed auth response can replace a cookie even when its recovery read is offline. */
436
+ private scheduleSessionRevalidation(generation: number, delay = SESSION_REVALIDATION_INITIAL_MS): void {
437
+ const isCurrent = () => generation === this.sessionRevalidationGeneration;
438
+ const needsRevalidation = () => isCurrent() && this.sessionTransitions === 0
439
+ && !this.sessionChecked && this.verifiedSessionIdentity === null && this.transport.hasSessionCredential();
440
+ if (!needsRevalidation() || this.sessionRevalidationTimer !== null) return;
441
+ this.sessionRevalidationTimer = setTimeout(() => {
442
+ this.sessionRevalidationTimer = null;
443
+ if (!needsRevalidation()) return;
444
+ void this.revalidateSession(isCurrent).catch((error) => {
445
+ if (isCurrent()) logFailure("cloud.auth", "Retry session validation failed")(error);
446
+ }).finally(() => {
447
+ this.scheduleSessionRevalidation(generation, Math.min(delay * 2, SESSION_REVALIDATION_MAX_MS));
448
+ });
449
+ }, delay);
450
+ this.sessionRevalidationTimer.unref?.();
451
+ }
452
+
453
+ private async revalidateSession(isCurrent: () => boolean): Promise<void> {
454
+ const user = await this.getSession(isCurrent);
455
+ const credential = this.getSessionToken();
456
+ if (user || !credential || !isCurrent()) return;
457
+ // A native null-session response can retain a usable token. Validate it
458
+ // through the account endpoint, without pairing it with a cached user.
459
+ this.sessionChecked = false;
460
+ const previousUser = this.currentUser;
461
+ const canApply = () => isCurrent() && this.getSessionToken() === credential && this.currentUser === previousUser;
462
+ try {
463
+ const profile = await this.auth.getAccountProfile(canApply);
464
+ if (!canApply()) return;
465
+ this.sessionChecked = true;
466
+ this.auth.restoreCachedUser({ ...profile, updatedAt: profile.updatedAt ?? undefined });
467
+ } catch (error) {
468
+ if (!canApply()) return;
469
+ if (error instanceof ApiRequestError && error.status === 401) {
470
+ this.installSessionToken(null);
471
+ return;
472
+ }
473
+ throw error;
474
+ }
475
+ }
334
476
 
335
477
  async getSession(isCurrent: () => boolean = () => true): Promise<AuthUser | null> {
336
478
  if (!isCurrent()) return this.currentUser;
@@ -353,7 +495,10 @@ class GloomApiClient {
353
495
  credential: this.getSessionToken(),
354
496
  promise: this.auth.getSession(canApply)
355
497
  .then(({ user, validated }) => {
356
- if (validated && canApply()) this.sessionChecked = true;
498
+ if (validated && canApply()) {
499
+ this.sessionChecked = true;
500
+ this.clearSessionRevalidationTimer();
501
+ }
357
502
  this.traceAuth(validated ? "getSession:done" : "getSession:retained", user);
358
503
  return user;
359
504
  })
@@ -373,9 +518,13 @@ class GloomApiClient {
373
518
  requestPasswordReset = this.auth.requestPasswordReset.bind(this.auth);
374
519
  createBrowserHandoff = this.auth.createBrowserHandoff.bind(this.auth);
375
520
 
376
- /** Creates a Stripe checkout session for Cloud Pro; the URL opens in a browser. */
377
- async createCloudCheckout(returnTo?: string, interval: "month" | "year" = "month"): Promise<{ url: string }> {
378
- return this.request<{ url: string }>("/stripe/checkout", { method: "POST", body: JSON.stringify({ returnTo, interval }) });
521
+ /**
522
+ * Creates a Stripe checkout session for Cloud Pro; the URL opens in a browser.
523
+ * `link` is a short link to the same checkout, to read or scan on another
524
+ * device. Older servers send none.
525
+ */
526
+ async createCloudCheckout(returnTo?: string, interval: "month" | "year" = "month"): Promise<{ url: string; link?: string }> {
527
+ return this.request<{ url: string; link?: string }>("/stripe/checkout", { method: "POST", body: JSON.stringify({ returnTo, interval }) });
379
528
  }
380
529
 
381
530
  async recordResearchActivity(payload: {
@@ -404,7 +553,7 @@ class GloomApiClient {
404
553
  async brokerRequest<T>(
405
554
  broker: string,
406
555
  path: string,
407
- options: { method?: "GET" | "POST" | "DELETE"; body?: unknown; signal?: AbortSignal } = {},
556
+ options: { method?: "GET" | "POST" | "PUT" | "DELETE"; body?: unknown; signal?: AbortSignal } = {},
408
557
  ): Promise<T> {
409
558
  if (!/^[a-z][a-z0-9-]{0,31}$/.test(broker)) throw new Error(`Invalid broker id "${broker}".`);
410
559
  if (path !== "" && (!/^\/[A-Za-z0-9/_.~%?=&-]*$/.test(path) || path.includes(".."))) {
@@ -749,6 +898,8 @@ class GloomApiClient {
749
898
  subscribeScanner = this.socket.subscribeScanner.bind(this.socket);
750
899
 
751
900
  dispose(): void {
901
+ this.cancelSessionRevalidation();
902
+ this.sessionInstallationGeneration += 1;
752
903
  this.sessionRequestGeneration += 1;
753
904
  this.sessionRequest = null;
754
905
  this.socket.dispose();
@@ -782,6 +933,7 @@ class GloomApiClient {
782
933
  getCloudEconomicCalendar = this.data.getCloudEconomicCalendar.bind(this.data);
783
934
  getCloudEconomicCalendarFrom = this.data.getCloudEconomicCalendarFrom.bind(this.data);
784
935
  getCloudMacroReleaseDays = this.data.getCloudMacroReleaseDays.bind(this.data);
936
+ getCloudShortRates = this.data.getCloudShortRates.bind(this.data);
785
937
  getCloudEquityDiagnostic = this.data.getCloudEquityDiagnostic.bind(this.data);
786
938
  getCloudEarningsCalendar = this.data.getCloudEarningsCalendar.bind(this.data);
787
939
  getCloudEarningsHistory = this.data.getCloudEarningsHistory.bind(this.data);
@@ -790,16 +942,20 @@ class GloomApiClient {
790
942
  getCloudCryptoMarkets = this.data.getCloudCryptoMarkets.bind(this.data);
791
943
  getCloudStablecoinSupply = this.data.getCloudStablecoinSupply.bind(this.data);
792
944
  getCloudStablecoinSupplyHistory = this.data.getCloudStablecoinSupplyHistory.bind(this.data);
945
+ getCloudDefiTvl = this.data.getCloudDefiTvl.bind(this.data);
793
946
  getCloudCentralBankRates = this.data.getCloudCentralBankRates.bind(this.data);
794
947
  getMobileAlertHistory = this.data.getMobileAlertHistory.bind(this.data);
795
948
  getScannerFlowHistory = this.data.getScannerFlowHistory.bind(this.data);
949
+ getLiveScan = this.data.getLiveScan.bind(this.data);
796
950
  getCloudEstimateRevisions = this.data.getCloudEstimateRevisions.bind(this.data);
797
951
  getCloudMoneyMarkets = this.data.getCloudMoneyMarkets.bind(this.data);
798
952
  equityScreener = this.data.equityScreener.bind(this.data);
799
953
  getMemberFunds = this.data.getMemberFunds.bind(this.data);
800
954
  getFundMembers = this.data.getFundMembers.bind(this.data);
955
+ getFundBreadth = this.data.getFundBreadth.bind(this.data);
801
956
  getFundChanges = this.data.getFundChanges.bind(this.data);
802
957
  getFundFacts = this.data.getFundFacts.bind(this.data);
958
+ getCloudExchangeAnnouncements = this.data.getCloudExchangeAnnouncements.bind(this.data);
803
959
  getCloudThemes = this.data.getCloudThemes.bind(this.data);
804
960
  getCloudThemeMembers = this.data.getCloudThemeMembers.bind(this.data);
805
961
  impliedVolatility = this.data.impliedVolatility.bind(this.data);
@@ -815,7 +971,10 @@ class GloomApiClient {
815
971
  getPublicInsolvencyNotices = this.data.getPublicInsolvencyNotices.bind(this.data);
816
972
  getPublicLetters = this.data.getPublicLetters.bind(this.data);
817
973
  getCloudIpoCalendar = this.data.getCloudIpoCalendar.bind(this.data);
974
+ getCloudFailsToDeliver = this.data.getCloudFailsToDeliver.bind(this.data);
975
+ getCloudOtcVolume = this.data.getCloudOtcVolume.bind(this.data);
818
976
  getCloudShortVolume = this.data.getCloudShortVolume.bind(this.data);
977
+ getCloudCryptoEtfFlows = this.data.getCloudCryptoEtfFlows.bind(this.data);
819
978
  getCloudSocialMentions = this.data.getCloudSocialMentions.bind(this.data);
820
979
  getCloudSocialMentionPosts = this.data.getCloudSocialMentionPosts.bind(this.data);
821
980
  getCloudFuturesCurve = this.data.getCloudFuturesCurve.bind(this.data);
@@ -828,6 +987,11 @@ class GloomApiClient {
828
987
  creditDocuments = this.data.creditDocuments.bind(this.data);
829
988
  geo = this.data.geo.bind(this.data);
830
989
  getCloudHiring = this.data.getCloudHiring.bind(this.data);
990
+ getCloudHiringMoves = this.data.getCloudHiringMoves.bind(this.data);
991
+ getCloudHiringSignals = this.data.getCloudHiringSignals.bind(this.data);
992
+ getCloudHiringCompanySignals = this.data.getCloudHiringCompanySignals.bind(this.data);
993
+ getCloudHiringBuilding = this.data.getCloudHiringBuilding.bind(this.data);
994
+ getCloudHiringCompanyBuilding = this.data.getCloudHiringCompanyBuilding.bind(this.data);
831
995
  getCloudAppRankHistory = this.data.getCloudAppRankHistory.bind(this.data);
832
996
  getCloudAppAttention = this.data.getCloudAppAttention.bind(this.data);
833
997
  getCloudCatalystChanges = this.data.getCloudCatalystChanges.bind(this.data);
@@ -872,6 +1036,7 @@ class GloomApiClient {
872
1036
  getCloudTape = this.data.getCloudTape.bind(this.data);
873
1037
  getCloudYieldCurve = this.data.getCloudYieldCurve.bind(this.data);
874
1038
  getCloudCurve = this.data.getCloudCurve.bind(this.data);
1039
+ getCloudSwapCurve = this.data.getCloudSwapCurve.bind(this.data);
875
1040
  getCloudCurveHistory = this.data.getCloudCurveHistory.bind(this.data);
876
1041
  getCloudWorldCurves = this.data.getCloudWorldCurves.bind(this.data);
877
1042
  getCloudCds = this.data.getCloudCds.bind(this.data);
@@ -882,6 +1047,7 @@ class GloomApiClient {
882
1047
  getCloudCongressHouse = this.data.getCloudCongressHouse.bind(this.data);
883
1048
  getCloudJobs = this.data.getCloudJobs.bind(this.data);
884
1049
  getCloudJobsPostings = this.data.getCloudJobsPostings.bind(this.data);
1050
+ getCloudJobsPosting = this.data.getCloudJobsPosting.bind(this.data);
885
1051
  getCloudJobsMovers = this.data.getCloudJobsMovers.bind(this.data);
886
1052
  getCloudEarningsCalls = this.data.getCloudEarningsCalls.bind(this.data);
887
1053
  getCloudEarningsTranscript = this.data.getCloudEarningsTranscript.bind(this.data);