gloomberb 0.15.8 → 0.16.0

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 (473) hide show
  1. package/README.md +10 -2
  2. package/package.json +1 -1
  3. package/src/api-client/app-attention.ts +147 -0
  4. package/src/api-client/attention.ts +26 -0
  5. package/src/api-client/awards.ts +215 -0
  6. package/src/api-client/catalysts.ts +160 -0
  7. package/src/api-client/chat.ts +137 -14
  8. package/src/api-client/company-kpis.ts +153 -0
  9. package/src/api-client/cpi.ts +52 -0
  10. package/src/api-client/credit-documents.ts +107 -0
  11. package/src/api-client/data.ts +187 -3
  12. package/src/api-client/distress.ts +164 -0
  13. package/src/api-client/equity-screener.ts +11 -0
  14. package/src/api-client/exposure.ts +202 -0
  15. package/src/api-client/gpu.ts +93 -0
  16. package/src/api-client/hiring.ts +110 -0
  17. package/src/api-client/index.ts +77 -3
  18. package/src/api-client/normalizers.ts +31 -1
  19. package/src/api-client/perps.ts +127 -0
  20. package/src/api-client/power.ts +148 -0
  21. package/src/api-client/request.ts +58 -1
  22. package/src/api-client/research-activity.ts +172 -13
  23. package/src/api-client/socket.ts +75 -27
  24. package/src/api-client/supply-chain-graph.ts +40 -0
  25. package/src/api-client/supply-chain.ts +98 -0
  26. package/src/api-client/telemetry.ts +29 -0
  27. package/src/api-client/themes.ts +28 -0
  28. package/src/api-client/types.ts +31 -1
  29. package/src/api-client/wall-experiments.ts +100 -0
  30. package/src/api-client/wall-summary.ts +49 -0
  31. package/src/api-client/web-experiments.ts +136 -0
  32. package/src/app/pane-runtime/plugin-bindings.ts +5 -0
  33. package/src/app/pane-runtime/ticker-open-runtime.ts +8 -2
  34. package/src/app/runtime/update.ts +13 -1
  35. package/src/cli/commands/system.ts +2 -0
  36. package/src/cli/desktop-pane-shot.ts +3 -4
  37. package/src/cli/pane-functions/data.ts +78 -0
  38. package/src/cli/pane-functions/financial-ratio-shot.ts +160 -0
  39. package/src/cli/pane-functions/function-help.ts +205 -8
  40. package/src/cli/pane-functions/headless.ts +4 -0
  41. package/src/cli/pane-functions/screenshot-evidence.ts +21 -0
  42. package/src/cli/pane-functions/screenshot.ts +49 -5
  43. package/src/components/chart-table/index.ts +1 -0
  44. package/src/components/chart-table/layout.ts +15 -0
  45. package/src/components/command-bar/action-runtime.ts +1 -0
  46. package/src/components/command-bar/commands/direct/index.ts +32 -0
  47. package/src/components/command-bar/commands/registry.ts +7 -0
  48. package/src/components/command-bar/pane-templates/items.ts +11 -0
  49. package/src/components/command-bar/pane-templates/workflow.ts +19 -4
  50. package/src/components/command-bar/routes/root/command-items.ts +6 -0
  51. package/src/components/command-bar/routes/root/provider-search.ts +2 -0
  52. package/src/components/command-bar/routes/root/results.ts +64 -0
  53. package/src/components/command-bar/routes/root/runtime.ts +8 -0
  54. package/src/components/command-bar/routes/ticker-search/results.ts +89 -24
  55. package/src/components/command-bar/routes/ticker-search/route.ts +2 -0
  56. package/src/components/command-bar/surface/index.tsx +15 -0
  57. package/src/components/command-bar/view-model.ts +3 -0
  58. package/src/components/command-bar/workflow/ops.ts +19 -0
  59. package/src/components/command-bar/workflow/tickers.ts +5 -0
  60. package/src/components/company-logo.tsx +15 -2
  61. package/src/components/data-table/table-pane.ts +2 -1
  62. package/src/components/index.ts +1 -0
  63. package/src/components/layout/detached-pane-shell.tsx +12 -1
  64. package/src/components/layout/missing-pane.tsx +87 -23
  65. package/src/components/layout/pane/footer/index.tsx +64 -18
  66. package/src/components/layout/pane/footer/model.ts +85 -0
  67. package/src/components/layout/pane/sidebar.tsx +19 -1
  68. package/src/components/layout/shell/pane/management-shortcuts.ts +13 -1
  69. package/src/components/layout/status-bar.tsx +93 -28
  70. package/src/components/layout/status-widget-space.ts +72 -0
  71. package/src/components/onboarding/first-run-workspace.ts +8 -2
  72. package/src/components/onboarding/onboarding-wizard.tsx +35 -16
  73. package/src/components/price-performance.tsx +31 -34
  74. package/src/components/ui/data-table/index.tsx +11 -8
  75. package/src/components/ui/display.tsx +9 -3
  76. package/src/components/ui/figure.tsx +94 -0
  77. package/src/components/ui/icon.tsx +3 -1
  78. package/src/components/ui/message-composer.tsx +8 -1
  79. package/src/components/ui/ratio-bar.tsx +84 -0
  80. package/src/components/ui/toggle.tsx +3 -1
  81. package/src/components/use-scrollbox-layout.ts +17 -0
  82. package/src/core/state/app/layout.ts +35 -1
  83. package/src/core/state/app/state.ts +15 -0
  84. package/src/core/state/app/types.ts +1 -0
  85. package/src/data/config/store/normalize.ts +24 -0
  86. package/src/i18n/es.ts +1 -0
  87. package/src/i18n/ja.ts +1 -0
  88. package/src/i18n/ko.ts +1 -0
  89. package/src/i18n/zh-cn.ts +1 -0
  90. package/src/i18n/zh-tw.ts +1 -0
  91. package/src/layout-marketplace/pane-imagery.ts +1 -0
  92. package/src/market-data/coordinator/entries.ts +13 -0
  93. package/src/market-data/coordinator/financials.ts +33 -8
  94. package/src/market-data/market/freshness.ts +16 -5
  95. package/src/market-data/published-cn-sessions.ts +25 -0
  96. package/src/market-data/published-nse-sessions.ts +20 -0
  97. package/src/news/aggregator.ts +4 -0
  98. package/src/plugins/builtin/account-management/model.ts +6 -1
  99. package/src/plugins/builtin/account-management/pane.tsx +36 -25
  100. package/src/plugins/builtin/alerts/catalysts.ts +77 -0
  101. package/src/plugins/builtin/alerts/events-pane.tsx +3 -0
  102. package/src/plugins/builtin/alerts/events.ts +10 -4
  103. package/src/plugins/builtin/alerts/history-pane.tsx +1 -1
  104. package/src/plugins/builtin/alerts/history.ts +1 -0
  105. package/src/plugins/builtin/alerts/index.tsx +6 -0
  106. package/src/plugins/builtin/alerts/research-builder.ts +10 -3
  107. package/src/plugins/builtin/alerts/research-rules.ts +15 -1
  108. package/src/plugins/builtin/analytics/risk-client.ts +15 -3
  109. package/src/plugins/builtin/analytics/risk-headless.ts +123 -18
  110. package/src/plugins/builtin/attention/client.ts +80 -0
  111. package/src/plugins/builtin/attention/evidence.ts +30 -0
  112. package/src/plugins/builtin/attention/headless.ts +33 -0
  113. package/src/plugins/builtin/attention/index.tsx +18 -0
  114. package/src/plugins/builtin/attention/model.ts +59 -0
  115. package/src/plugins/builtin/attention/pane.tsx +211 -0
  116. package/src/plugins/builtin/attention/trending.tsx +59 -0
  117. package/src/plugins/builtin/awards/alerts.ts +32 -0
  118. package/src/plugins/builtin/awards/client.ts +82 -0
  119. package/src/plugins/builtin/awards/detail.tsx +107 -0
  120. package/src/plugins/builtin/awards/evidence.ts +36 -0
  121. package/src/plugins/builtin/awards/headless.ts +55 -0
  122. package/src/plugins/builtin/awards/index.tsx +20 -0
  123. package/src/plugins/builtin/awards/model.ts +42 -0
  124. package/src/plugins/builtin/awards/pane.tsx +263 -0
  125. package/src/plugins/builtin/catalysts/client.ts +28 -0
  126. package/src/plugins/builtin/catalysts/detail.tsx +88 -0
  127. package/src/plugins/builtin/catalysts/evidence.ts +47 -0
  128. package/src/plugins/builtin/catalysts/headless.ts +42 -0
  129. package/src/plugins/builtin/catalysts/history.ts +26 -0
  130. package/src/plugins/builtin/catalysts/index.tsx +29 -0
  131. package/src/plugins/builtin/catalysts/model.ts +135 -0
  132. package/src/plugins/builtin/catalysts/pane.tsx +159 -0
  133. package/src/plugins/builtin/chart-composer/index.tsx +8 -1
  134. package/src/plugins/builtin/chat/attachments/desktop.tsx +610 -0
  135. package/src/plugins/builtin/chat/attachments/files.ts +45 -0
  136. package/src/plugins/builtin/chat/attachments/model.ts +164 -0
  137. package/src/plugins/builtin/chat/attachments/terminal.tsx +72 -0
  138. package/src/plugins/builtin/chat/attachments/transfer.ts +165 -0
  139. package/src/plugins/builtin/chat/content/channel-navigation.ts +13 -12
  140. package/src/plugins/builtin/chat/content/composer-runtime.ts +25 -4
  141. package/src/plugins/builtin/chat/content/composer.tsx +46 -4
  142. package/src/plugins/builtin/chat/content/footer.tsx +46 -8
  143. package/src/plugins/builtin/chat/content/index.tsx +263 -62
  144. package/src/plugins/builtin/chat/content/layout-metrics.ts +10 -2
  145. package/src/plugins/builtin/chat/content/open-targets.ts +17 -3
  146. package/src/plugins/builtin/chat/content/scroll.ts +7 -1
  147. package/src/plugins/builtin/chat/content/shortcuts.ts +36 -11
  148. package/src/plugins/builtin/chat/content/snapshot.ts +3 -0
  149. package/src/plugins/builtin/chat/content/transcript.tsx +17 -1
  150. package/src/plugins/builtin/chat/content/types.ts +7 -0
  151. package/src/plugins/builtin/chat/controller/attachments.ts +213 -0
  152. package/src/plugins/builtin/chat/controller/connections.ts +3 -1
  153. package/src/plugins/builtin/chat/controller/index.ts +114 -2
  154. package/src/plugins/builtin/chat/controller/lifecycle.ts +9 -0
  155. package/src/plugins/builtin/chat/controller/messages.ts +35 -2
  156. package/src/plugins/builtin/chat/controller/send.ts +128 -25
  157. package/src/plugins/builtin/chat/controller/state.ts +12 -1
  158. package/src/plugins/builtin/chat/controller/utils.ts +7 -5
  159. package/src/plugins/builtin/chat/controller/view.ts +2 -0
  160. package/src/plugins/builtin/chat/index.tsx +21 -0
  161. package/src/plugins/builtin/chat/layout.ts +9 -4
  162. package/src/plugins/builtin/chat/message/desktop.tsx +55 -20
  163. package/src/plugins/builtin/chat/message/header.tsx +30 -5
  164. package/src/plugins/builtin/chat/message/inline-tokens.tsx +9 -0
  165. package/src/plugins/builtin/chat/message/pending-send.ts +35 -0
  166. package/src/plugins/builtin/chat/message/profile-popover.tsx +5 -1
  167. package/src/plugins/builtin/chat/message/render-state.ts +12 -2
  168. package/src/plugins/builtin/chat/message/terminal.tsx +51 -4
  169. package/src/plugins/builtin/chat/message/types.ts +6 -1
  170. package/src/plugins/builtin/chat/pane-state.ts +59 -1
  171. package/src/plugins/builtin/chat/profile-popover.ts +50 -1
  172. package/src/plugins/builtin/chat/sidebar.tsx +8 -3
  173. package/src/plugins/builtin/chat/status-widget.tsx +29 -12
  174. package/src/plugins/builtin/chat/unread-inbox-pane.tsx +143 -0
  175. package/src/plugins/builtin/chat/unread-inbox.ts +91 -0
  176. package/src/plugins/builtin/clinical-trials/client.ts +237 -0
  177. package/src/plugins/builtin/clinical-trials/index.tsx +74 -0
  178. package/src/plugins/builtin/clinical-trials/pane.tsx +225 -0
  179. package/src/plugins/builtin/clinical-trials/types.ts +2 -0
  180. package/src/plugins/builtin/cloud/askg/controller.ts +37 -6
  181. package/src/plugins/builtin/cloud/askg/executor.ts +59 -44
  182. package/src/plugins/builtin/cloud/askg/host.ts +8 -1
  183. package/src/plugins/builtin/cloud/askg/manifest.ts +29 -2
  184. package/src/plugins/builtin/cloud/askg/model.ts +47 -13
  185. package/src/plugins/builtin/cloud/askg/notes.ts +100 -0
  186. package/src/plugins/builtin/cloud/askg/pane.tsx +50 -14
  187. package/src/plugins/builtin/cloud/askg/protocol.ts +39 -1
  188. package/src/plugins/builtin/cloud/askg/result-budget.ts +156 -0
  189. package/src/plugins/builtin/cloud/askg/user-data.ts +89 -0
  190. package/src/plugins/builtin/cloud/auth-actions.tsx +55 -31
  191. package/src/plugins/builtin/cloud/plugin.tsx +4 -1
  192. package/src/plugins/builtin/cloud/team/pane-sections.tsx +10 -1
  193. package/src/plugins/builtin/cloud/team/pane.tsx +3 -2
  194. package/src/plugins/builtin/cloud/thesis/board-pane.tsx +2 -2
  195. package/src/plugins/builtin/cloud/thesis/detail.tsx +1 -1
  196. package/src/plugins/builtin/cloud/thesis/ticker-tab.tsx +2 -2
  197. package/src/plugins/builtin/cloud/trial-offer-status-widget.tsx +202 -0
  198. package/src/plugins/builtin/cloud/upgrade-command.ts +1 -1
  199. package/src/plugins/builtin/cloud/upgrade-dialog.tsx +29 -3
  200. package/src/plugins/builtin/cloud/upgrade-status-widget.tsx +1 -1
  201. package/src/plugins/builtin/cloud-tweets/table.tsx +1 -1
  202. package/src/plugins/builtin/comment-letters/client.ts +342 -0
  203. package/src/plugins/builtin/comment-letters/index.tsx +74 -0
  204. package/src/plugins/builtin/comment-letters/pane.tsx +295 -0
  205. package/src/plugins/builtin/comment-letters/types.ts +43 -0
  206. package/src/plugins/builtin/company-attention/app-rank.tsx +79 -0
  207. package/src/plugins/builtin/company-attention/client.ts +69 -0
  208. package/src/plugins/builtin/company-attention/evidence.ts +45 -0
  209. package/src/plugins/builtin/company-attention/headless.ts +47 -0
  210. package/src/plugins/builtin/company-attention/index.tsx +30 -0
  211. package/src/plugins/builtin/company-attention/model.ts +129 -0
  212. package/src/plugins/builtin/company-attention/pane.tsx +183 -0
  213. package/src/plugins/builtin/company-kpis/client.ts +92 -0
  214. package/src/plugins/builtin/company-kpis/headless.ts +32 -0
  215. package/src/plugins/builtin/company-kpis/index.tsx +26 -0
  216. package/src/plugins/builtin/company-kpis/model.ts +124 -0
  217. package/src/plugins/builtin/company-kpis/pane.tsx +226 -0
  218. package/src/plugins/builtin/company-kpis/related.ts +11 -0
  219. package/src/plugins/builtin/company-kpis/screenshot-evidence.ts +44 -0
  220. package/src/plugins/builtin/composite-plugins.ts +32 -0
  221. package/src/plugins/builtin/correlation/history.ts +4 -1
  222. package/src/plugins/builtin/correlation/index.tsx +139 -80
  223. package/src/plugins/builtin/correlation/matrix/pair-chart.tsx +48 -0
  224. package/src/plugins/builtin/correlation/matrix/selection.ts +77 -0
  225. package/src/plugins/builtin/correlation/relationship/model.ts +2 -2
  226. package/src/plugins/builtin/cpi/client.ts +66 -0
  227. package/src/plugins/builtin/cpi/headless.ts +78 -0
  228. package/src/plugins/builtin/cpi/index.tsx +31 -0
  229. package/src/plugins/builtin/cpi/model.ts +198 -0
  230. package/src/plugins/builtin/cpi/pane.tsx +157 -0
  231. package/src/plugins/builtin/credit-documents/client.ts +99 -0
  232. package/src/plugins/builtin/credit-documents/detail.tsx +109 -0
  233. package/src/plugins/builtin/credit-documents/evidence.ts +64 -0
  234. package/src/plugins/builtin/credit-documents/gauge.tsx +55 -0
  235. package/src/plugins/builtin/credit-documents/headless.ts +40 -0
  236. package/src/plugins/builtin/credit-documents/index.tsx +19 -0
  237. package/src/plugins/builtin/credit-documents/model.ts +336 -0
  238. package/src/plugins/builtin/credit-documents/pane.tsx +185 -0
  239. package/src/plugins/builtin/custom-view/view-spec.ts +14 -2
  240. package/src/plugins/builtin/debt-maturities/pane.tsx +1 -0
  241. package/src/plugins/builtin/dividend-yield/pane.tsx +1 -1
  242. package/src/plugins/builtin/earnings/board.tsx +3 -0
  243. package/src/plugins/builtin/earnings/index.tsx +2 -0
  244. package/src/plugins/builtin/earnings-calls/pane.tsx +7 -1
  245. package/src/plugins/builtin/earnings-ripple/client.ts +60 -0
  246. package/src/plugins/builtin/earnings-ripple/headless.ts +35 -0
  247. package/src/plugins/builtin/earnings-ripple/index.tsx +35 -0
  248. package/src/plugins/builtin/earnings-ripple/model.ts +98 -0
  249. package/src/plugins/builtin/earnings-ripple/pane.tsx +103 -0
  250. package/src/plugins/builtin/equity-screener/client.ts +1 -1
  251. package/src/plugins/builtin/equity-screener/criterion-editor.tsx +1 -1
  252. package/src/plugins/builtin/equity-screener/model.ts +74 -9
  253. package/src/plugins/builtin/equity-screener/pane.tsx +2 -0
  254. package/src/plugins/builtin/estimate-revisions/pane.tsx +3 -0
  255. package/src/plugins/builtin/executives/pane.tsx +3 -1
  256. package/src/plugins/builtin/exposure/charts.tsx +66 -0
  257. package/src/plugins/builtin/exposure/client.ts +53 -0
  258. package/src/plugins/builtin/exposure/drivers.ts +29 -0
  259. package/src/plugins/builtin/exposure/editor.tsx +61 -0
  260. package/src/plugins/builtin/exposure/evidence.ts +39 -0
  261. package/src/plugins/builtin/exposure/headless.ts +51 -0
  262. package/src/plugins/builtin/exposure/holdings.ts +56 -0
  263. package/src/plugins/builtin/exposure/index.tsx +13 -0
  264. package/src/plugins/builtin/exposure/model.ts +104 -0
  265. package/src/plugins/builtin/exposure/pane.tsx +247 -0
  266. package/src/plugins/builtin/fear-greed/pane.tsx +2 -9
  267. package/src/plugins/builtin/filing-events/pane.tsx +2 -1
  268. package/src/plugins/builtin/gpu/board.tsx +163 -0
  269. package/src/plugins/builtin/gpu/changes.tsx +94 -0
  270. package/src/plugins/builtin/gpu/client.ts +130 -0
  271. package/src/plugins/builtin/gpu/equities.tsx +112 -0
  272. package/src/plugins/builtin/gpu/headless.ts +67 -0
  273. package/src/plugins/builtin/gpu/history.tsx +140 -0
  274. package/src/plugins/builtin/gpu/index.tsx +18 -0
  275. package/src/plugins/builtin/gpu/ladder.tsx +127 -0
  276. package/src/plugins/builtin/gpu/model.ts +317 -0
  277. package/src/plugins/builtin/gpu/pane.tsx +63 -0
  278. package/src/plugins/builtin/help/index.tsx +19 -2
  279. package/src/plugins/builtin/holders/pane.tsx +4 -8
  280. package/src/plugins/builtin/insider/detail.tsx +119 -0
  281. package/src/plugins/builtin/insider/display.ts +221 -0
  282. package/src/plugins/builtin/insider/headless.ts +24 -3
  283. package/src/plugins/builtin/insider/index.tsx +206 -108
  284. package/src/plugins/builtin/insider/insider-data.ts +31 -3
  285. package/src/plugins/builtin/insider/model.ts +53 -4
  286. package/src/plugins/builtin/insider/table-model.ts +226 -0
  287. package/src/plugins/builtin/insider/table.tsx +79 -0
  288. package/src/plugins/builtin/iv-history/screen-pane.tsx +1 -1
  289. package/src/plugins/builtin/jobs/pane.tsx +14 -7
  290. package/src/plugins/builtin/macro-day/client.ts +50 -0
  291. package/src/plugins/builtin/macro-day/headless.ts +51 -0
  292. package/src/plugins/builtin/macro-day/index.tsx +21 -0
  293. package/src/plugins/builtin/macro-day/model.ts +137 -0
  294. package/src/plugins/builtin/macro-day/pane.tsx +118 -0
  295. package/src/plugins/builtin/macro-day/releases.ts +58 -0
  296. package/src/plugins/builtin/market-halts/model.ts +30 -17
  297. package/src/plugins/builtin/market-halts/pane.tsx +15 -21
  298. package/src/plugins/builtin/market-heatmap/data.ts +1 -1
  299. package/src/plugins/builtin/market-heatmap/index.tsx +198 -50
  300. package/src/plugins/builtin/market-heatmap/portfolio.ts +220 -0
  301. package/src/plugins/builtin/market-movers/index.tsx +1 -0
  302. package/src/plugins/builtin/market-movers/session-body.tsx +5 -2
  303. package/src/plugins/builtin/mna/distress/client.ts +326 -0
  304. package/src/plugins/builtin/mna/distress/detail.tsx +247 -0
  305. package/src/plugins/builtin/mna/distress/headless.ts +257 -0
  306. package/src/plugins/builtin/mna/distress/model.ts +427 -0
  307. package/src/plugins/builtin/mna/distress/pane.tsx +606 -0
  308. package/src/plugins/builtin/mna/index.tsx +15 -0
  309. package/src/plugins/builtin/mna/pane.tsx +42 -1
  310. package/src/plugins/builtin/news/index.tsx +62 -16
  311. package/src/plugins/builtin/news/wire/filter-articles.ts +54 -0
  312. package/src/plugins/builtin/news/wire/index.tsx +37 -3
  313. package/src/plugins/builtin/news/wire/industry-pane.tsx +29 -13
  314. package/src/plugins/builtin/news/wire/mutes.ts +253 -0
  315. package/src/plugins/builtin/news/wire/news/command-bar-search.ts +117 -0
  316. package/src/plugins/builtin/news/wire/news/footer.ts +4 -0
  317. package/src/plugins/builtin/news/wire/news/list-search.ts +34 -0
  318. package/src/plugins/builtin/news/wire/news/pop-out.tsx +158 -0
  319. package/src/plugins/builtin/news/wire/news/preset-pane.tsx +64 -19
  320. package/src/plugins/builtin/openfda/client.ts +300 -0
  321. package/src/plugins/builtin/openfda/index.tsx +71 -0
  322. package/src/plugins/builtin/openfda/pane.tsx +382 -0
  323. package/src/plugins/builtin/openfda/types.ts +76 -0
  324. package/src/plugins/builtin/options/footer.ts +1 -0
  325. package/src/plugins/builtin/options-calculator/pane.tsx +0 -1
  326. package/src/plugins/builtin/options-positioning/index.tsx +4 -2
  327. package/src/plugins/builtin/options-positioning/pane.tsx +1 -1
  328. package/src/plugins/builtin/pe-band/client.ts +61 -0
  329. package/src/plugins/builtin/pe-band/headless.ts +51 -0
  330. package/src/plugins/builtin/pe-band/index.tsx +20 -0
  331. package/src/plugins/builtin/pe-band/model.ts +267 -0
  332. package/src/plugins/builtin/pe-band/pane.tsx +159 -0
  333. package/src/plugins/builtin/perps/client.ts +66 -0
  334. package/src/plugins/builtin/perps/equity-row.tsx +28 -0
  335. package/src/plugins/builtin/perps/headless.ts +34 -0
  336. package/src/plugins/builtin/perps/index.tsx +14 -0
  337. package/src/plugins/builtin/perps/model.ts +58 -0
  338. package/src/plugins/builtin/perps/pane.tsx +185 -0
  339. package/src/plugins/builtin/plugin-marketplace/pane.tsx +0 -1
  340. package/src/plugins/builtin/portfolio-list/cli/render.ts +177 -87
  341. package/src/plugins/builtin/portfolio-list/headless.ts +237 -0
  342. package/src/plugins/builtin/portfolio-list/index.tsx +2 -0
  343. package/src/plugins/builtin/portfolio-list/mutations.ts +17 -0
  344. package/src/plugins/builtin/portfolio-list/pane/data.ts +17 -0
  345. package/src/plugins/builtin/portfolio-list/pane/index.tsx +88 -5
  346. package/src/plugins/builtin/portfolio-list/pane/remove-ticker.ts +85 -0
  347. package/src/plugins/builtin/portfolio-list/pane/streaming.ts +18 -12
  348. package/src/plugins/builtin/portfolio-list/quick-add/index.tsx +6 -0
  349. package/src/plugins/builtin/power/client.ts +100 -0
  350. package/src/plugins/builtin/power/detail.tsx +82 -0
  351. package/src/plugins/builtin/power/evidence.ts +56 -0
  352. package/src/plugins/builtin/power/generation.tsx +37 -0
  353. package/src/plugins/builtin/power/headless.ts +43 -0
  354. package/src/plugins/builtin/power/index.tsx +16 -0
  355. package/src/plugins/builtin/power/model.ts +89 -0
  356. package/src/plugins/builtin/power/pane.tsx +209 -0
  357. package/src/plugins/builtin/power/query.ts +25 -0
  358. package/src/plugins/builtin/relative-rotation/pane.tsx +3 -3
  359. package/src/plugins/builtin/research/analyst-pane.tsx +1 -1
  360. package/src/plugins/builtin/research/corporate-actions-pane.tsx +13 -4
  361. package/src/plugins/builtin/research/equity-diagnostic-pane.tsx +5 -3
  362. package/src/plugins/builtin/research-search/pane.tsx +21 -7
  363. package/src/plugins/builtin/revenue-breakdown/pane.tsx +1 -1
  364. package/src/plugins/builtin/reverse-dcf/client.ts +35 -0
  365. package/src/plugins/builtin/reverse-dcf/headless.ts +44 -0
  366. package/src/plugins/builtin/reverse-dcf/index.tsx +20 -0
  367. package/src/plugins/builtin/reverse-dcf/model.ts +87 -0
  368. package/src/plugins/builtin/reverse-dcf/pane.tsx +107 -0
  369. package/src/plugins/builtin/risk-factors/pane.tsx +2 -1
  370. package/src/plugins/builtin/scanner/denied.tsx +4 -2
  371. package/src/plugins/builtin/scanner/feed.ts +1 -0
  372. package/src/plugins/builtin/scanner/flow-pane.tsx +3 -2
  373. package/src/plugins/builtin/scanner/hilo-pane.tsx +1 -1
  374. package/src/plugins/builtin/seasonality/client.ts +4 -1
  375. package/src/plugins/builtin/sec/command-bar-search.ts +217 -0
  376. package/src/plugins/builtin/sec/forms.ts +54 -0
  377. package/src/plugins/builtin/sec/headless.ts +31 -5
  378. package/src/plugins/builtin/sec/index.tsx +67 -11
  379. package/src/plugins/builtin/sec/model.ts +35 -5
  380. package/src/plugins/builtin/sectors/headless.ts +1 -0
  381. package/src/plugins/builtin/sectors/index.tsx +72 -26
  382. package/src/plugins/builtin/shared/cloud-upgrade.ts +143 -39
  383. package/src/plugins/builtin/shared/pro-feature-wall.tsx +8 -4
  384. package/src/plugins/builtin/shared/research-cells.tsx +107 -0
  385. package/src/plugins/builtin/shared/series-list-detail.tsx +5 -1
  386. package/src/plugins/builtin/shared/wall-teaser-catalog.ts +80 -0
  387. package/src/plugins/builtin/shared/wall-teaser.tsx +192 -0
  388. package/src/plugins/builtin/shared/wall-view-lifecycle.ts +43 -0
  389. package/src/plugins/builtin/short-interest/index.tsx +31 -0
  390. package/src/plugins/builtin/short-interest/watch-client.ts +70 -0
  391. package/src/plugins/builtin/short-interest/watch-headless.ts +49 -0
  392. package/src/plugins/builtin/short-interest/watch-model.ts +185 -0
  393. package/src/plugins/builtin/short-interest/watch-pane.tsx +169 -0
  394. package/src/plugins/builtin/short-volume/pane.tsx +1 -1
  395. package/src/plugins/builtin/social-mentions/pane.tsx +1 -1
  396. package/src/plugins/builtin/supply-chain/client.ts +104 -0
  397. package/src/plugins/builtin/supply-chain/disclosure-quote.tsx +17 -0
  398. package/src/plugins/builtin/supply-chain/evidence.ts +88 -0
  399. package/src/plugins/builtin/supply-chain/flow-layout.ts +133 -0
  400. package/src/plugins/builtin/supply-chain/flow.tsx +323 -0
  401. package/src/plugins/builtin/supply-chain/graph-client.ts +83 -0
  402. package/src/plugins/builtin/supply-chain/graph-evidence.ts +25 -0
  403. package/src/plugins/builtin/supply-chain/graph-model.ts +45 -0
  404. package/src/plugins/builtin/supply-chain/graph-pane.tsx +218 -0
  405. package/src/plugins/builtin/supply-chain/graph.tsx +163 -0
  406. package/src/plugins/builtin/supply-chain/headless.ts +105 -0
  407. package/src/plugins/builtin/supply-chain/index.tsx +17 -0
  408. package/src/plugins/builtin/supply-chain/model.ts +145 -0
  409. package/src/plugins/builtin/supply-chain/pane.tsx +276 -0
  410. package/src/plugins/builtin/supply-chain/row-evidence.tsx +96 -0
  411. package/src/plugins/builtin/supply-chain/trust.ts +34 -0
  412. package/src/plugins/builtin/themes/client.ts +39 -0
  413. package/src/plugins/builtin/themes/headless.ts +38 -0
  414. package/src/plugins/builtin/themes/model.ts +92 -0
  415. package/src/plugins/builtin/themes/pane.tsx +125 -0
  416. package/src/plugins/builtin/thirteenf/pane.tsx +6 -15
  417. package/src/plugins/builtin/ticker-detail/data-panes/historical-prices.tsx +5 -6
  418. package/src/plugins/builtin/ticker-detail/data-panes/returns-model.ts +201 -0
  419. package/src/plugins/builtin/ticker-detail/data-panes/returns-pane.tsx +327 -0
  420. package/src/plugins/builtin/ticker-detail/financials/period-end-history.ts +5 -2
  421. package/src/plugins/builtin/ticker-detail/financials/ratios.ts +18 -2
  422. package/src/plugins/builtin/ticker-detail/financials/tab.tsx +2 -1
  423. package/src/plugins/builtin/ticker-detail/headless.ts +7 -2
  424. package/src/plugins/builtin/ticker-detail/index.tsx +22 -0
  425. package/src/plugins/builtin/ticker-detail/overview/components.tsx +53 -30
  426. package/src/plugins/builtin/ticker-detail/overview/pane.tsx +2 -0
  427. package/src/plugins/builtin/ticker-detail/overview-tab.tsx +111 -46
  428. package/src/plugins/builtin/ticker-detail/pane.tsx +50 -6
  429. package/src/plugins/builtin/ticker-detail/quote-monitor/card.tsx +20 -41
  430. package/src/plugins/builtin/ticker-detail/quote-monitor/index.tsx +3 -0
  431. package/src/plugins/builtin/time-sales/pane.tsx +1 -1
  432. package/src/plugins/builtin/world-indices/indices.ts +1 -0
  433. package/src/plugins/catalog-browser.ts +38 -0
  434. package/src/plugins/catalog-manifest.ts +3 -0
  435. package/src/plugins/catalog-ui.ts +6 -0
  436. package/src/plugins/current-target.ts +0 -9
  437. package/src/public/__snapshots__/public-api.test.ts.snap +1 -0
  438. package/src/renderers/browser/cloud-transport.ts +66 -1
  439. package/src/renderers/browser/main.tsx +2 -0
  440. package/src/renderers/dom/data-table/row.tsx +2 -0
  441. package/src/renderers/dom/desktop/controls.tsx +38 -25
  442. package/src/renderers/dom/desktop/icons.tsx +8 -0
  443. package/src/renderers/dom/host/chart-surface.tsx +36 -2
  444. package/src/renderers/dom/host/focus-scope.ts +11 -1
  445. package/src/renderers/dom/styles.css +28 -0
  446. package/src/renderers/electrobun/view/backend-rpc.ts +3 -2
  447. package/src/renderers/electrobun/view/cli-pane-shot-entry.tsx +1 -1
  448. package/src/renderers/electrobun/view/http-fetch.ts +2 -0
  449. package/src/renderers/electrobun/view/main.tsx +3 -1
  450. package/src/renderers/electrobun/view/rpc-timeout.ts +59 -0
  451. package/src/renderers/opentui/start.tsx +3 -0
  452. package/src/shares/api.ts +3 -1
  453. package/src/sources/sec-edgar/identity.ts +36 -0
  454. package/src/sources/sec-edgar.ts +1 -34
  455. package/src/state/app/context/index.tsx +8 -0
  456. package/src/sync/core-contributors.ts +2 -0
  457. package/src/telemetry/attention-counts.ts +164 -0
  458. package/src/telemetry/live-config.ts +7 -0
  459. package/src/test-support/rpc-loopback.ts +7 -3
  460. package/src/test-support/shell-pane-keys.tsx +34 -0
  461. package/src/tickers/instrument-kind.ts +12 -6
  462. package/src/tickers/search/asset-classes.ts +91 -0
  463. package/src/tickers/search/index.ts +18 -4
  464. package/src/tickers/search/ranking.ts +22 -3
  465. package/src/types/config.ts +23 -1
  466. package/src/types/headless.ts +17 -0
  467. package/src/ui/host.tsx +6 -0
  468. package/src/utils/double-escape-close.ts +20 -0
  469. package/src/utils/html-entities.ts +15 -0
  470. package/src/utils/http-proxy-response.ts +44 -7
  471. package/src/utils/plugin-proxy-hosts.json +3 -0
  472. package/src/utils/sec.ts +19 -1
  473. package/src/utils/text-wrap.ts +13 -8
@@ -0,0 +1,93 @@
1
+ export type GpuBasis = "list" | "spot" | "ask" | "reserved" | "index" | "reference";
2
+
3
+ type GpuProvenance = "archive" | "official-history" | "live" | "reference";
4
+ interface GpuAccess { tier: "pro" | "preview"; preview: boolean; locked: boolean }
5
+
6
+ export interface GpuObservation {
7
+ source: string;
8
+ skuKey: string;
9
+ provider: string;
10
+ providerClass: "hyperscaler" | "neocloud" | "marketplace" | "aggregate";
11
+ region: string;
12
+ gpuModel: string;
13
+ gpuCount: number;
14
+ formFactor: string | null;
15
+ memoryGb: number | null;
16
+ basis: GpuBasis;
17
+ pricePerGpuHr: number;
18
+ priceNodeHr: number | null;
19
+ currency: "USD";
20
+ availability: string | null;
21
+ observedAt: string;
22
+ effectiveAt: string | null;
23
+ provenance?: GpuProvenance;
24
+ provenanceLabel?: string;
25
+ evidenceUrl?: string | null;
26
+ sourceUrl?: string | null;
27
+ stats?: {
28
+ n: number; min: number; max: number;
29
+ p25?: number; p75?: number;
30
+ constituents?: string[];
31
+ rawMedian?: number;
32
+ chainFactor?: number;
33
+ constituentPrices?: Record<string, number>;
34
+ };
35
+ }
36
+
37
+ export interface GpuBoardRow extends GpuObservation {
38
+ id: string;
39
+ label: string;
40
+ sourceLabel: string;
41
+ change1d: number | null;
42
+ change7d: number | null;
43
+ change30d: number | null;
44
+ stale: boolean;
45
+ lastError: string | null;
46
+ }
47
+
48
+ export interface GpuBoardPayload {
49
+ access?: GpuAccess;
50
+ generatedAt: string;
51
+ status: "available" | "partial" | "unavailable";
52
+ asOf: string | null;
53
+ stale: boolean;
54
+ gaps: string[];
55
+ rows: GpuBoardRow[];
56
+ }
57
+
58
+ export interface GpuHistoryPayload {
59
+ access?: GpuAccess;
60
+ generatedAt: string;
61
+ points: GpuObservation[];
62
+ /** Provider effective dates are separate from observations collected by Gloom. */
63
+ effectivePoints: GpuObservation[];
64
+ }
65
+
66
+ export interface GpuEvent {
67
+ id: string;
68
+ origin?: "published" | "observed";
69
+ kind: "price" | "membership" | "availability";
70
+ provenance?: GpuProvenance;
71
+ provenanceLabel?: string;
72
+ evidenceUrl?: string | null;
73
+ sourceUrl?: string | null;
74
+ oldAvailability?: string | null;
75
+ newAvailability?: string | null;
76
+ source: string;
77
+ skuKey: string;
78
+ provider: string;
79
+ gpuModel: string;
80
+ formFactor: string | null;
81
+ memoryGb: number | null;
82
+ basis: GpuBasis;
83
+ observedAt: string;
84
+ effectiveAt: string | null;
85
+ oldPrice: number;
86
+ newPrice: number;
87
+ changePct: number;
88
+ oldMembers: string[] | null;
89
+ newMembers: string[] | null;
90
+ }
91
+
92
+ export interface GpuEventsPayload { access?: GpuAccess; generatedAt: string; events: GpuEvent[] }
93
+ export interface GpuHistoryQuery { gpuModel?: string; basis?: GpuBasis; seriesId?: string; from?: string; to?: string; limit?: number }
@@ -0,0 +1,110 @@
1
+ /** HIRING is an observed requisition series, not headcount or job creation. */
2
+ interface HiringCompany {
3
+ entityId: string
4
+ symbol: string
5
+ name: string
6
+ sector: string | null
7
+ mappingConfidence: number
8
+ mappingSourceUrl: string | null
9
+ }
10
+
11
+ interface HiringPosting {
12
+ id: string
13
+ title: string
14
+ url: string | null
15
+ location: string | null
16
+ country: string | null
17
+ remote: boolean | null
18
+ jobFunction: string | null
19
+ seniority: string | null
20
+ tags: string[]
21
+ classifiedBy: string | null
22
+ evergreen: boolean | null
23
+ }
24
+
25
+ interface HiringBucket {
26
+ id: string
27
+ label: string
28
+ count: number
29
+ share: number
30
+ }
31
+
32
+ interface HiringPoint {
33
+ week: string
34
+ observedAt: string
35
+ openCount: number
36
+ added: number | null
37
+ removed: number | null
38
+ netChange: number | null
39
+ changePct: number | null
40
+ remoteShare: number | null
41
+ remoteKnown: number | null
42
+ evergreenCount: number
43
+ sourceCount: number
44
+ completeness: "complete" | "partial" | "unknown"
45
+ confidence: number
46
+ kind: "observed" | "legacy_daily" | "mixed"
47
+ }
48
+
49
+ interface HiringSignal {
50
+ type: "surge" | "freeze" | "new_location"
51
+ label: string
52
+ value: number
53
+ asOf: string
54
+ confidence: number
55
+ location: string | null
56
+ evidenceUrls: string[]
57
+ }
58
+
59
+ interface HiringEvidence extends HiringPosting {
60
+ sourceTicker: string
61
+ sourceUrl: string | null
62
+ observedAt: string
63
+ snapshotId: string
64
+ revision: number
65
+ confidence: number
66
+ }
67
+
68
+ export interface HiringSummary extends HiringCompany {
69
+ latest: HiringPoint | null
70
+ historyWeeks: number
71
+ zScore: number | null
72
+ signal: "surge" | "freeze" | null
73
+ status: "ok" | "collecting" | "stale" | "uncovered"
74
+ }
75
+
76
+ export interface HiringPayload extends HiringSummary {
77
+ generatedAt: string
78
+ requestedSymbol?: string
79
+ proRequired: true
80
+ preview: boolean
81
+ locked: { history: number; evidence: number; peers: number; signals: number; mix: number }
82
+ series: HiringPoint[]
83
+ functions: HiringBucket[]
84
+ seniority: HiringBucket[]
85
+ countries: HiringBucket[]
86
+ locations: HiringBucket[]
87
+ signals: HiringSignal[]
88
+ peers: HiringSummary[]
89
+ evidence: HiringEvidence[]
90
+ coverage: {
91
+ sourceTickers: string[]
92
+ sourceUrls: string[]
93
+ firstObservedAt: string | null
94
+ lastObservedAt: string | null
95
+ knownCountryShare: number | null
96
+ classifiedShare: number | null
97
+ remoteKnownShare: number | null
98
+ comparability: string
99
+ }
100
+ }
101
+
102
+ export interface HiringBoard {
103
+ generatedAt: string
104
+ requestedSymbol?: string
105
+ proRequired: true
106
+ preview: boolean
107
+ total: number
108
+ locked: number
109
+ companies: HiringSummary[]
110
+ }
@@ -38,7 +38,8 @@ import type {
38
38
  PersistedAuthUser
39
39
  } from "./types";
40
40
 
41
- export { setCloudApiFetchTransport } from "./request";
41
+ export { setCloudApiFetchTransport, setCloudApiUploadTransport } from "./request";
42
+ export type { ChatAttachmentUpload } from "./chat";
42
43
  export { NoteConflictError } from "./notes";
43
44
  export { ThesisConflictError, ThesisGoalpostError } from "./theses";
44
45
  export { TeamRevisionConflictError } from "./views";
@@ -89,6 +90,8 @@ interface PendingSessionRequest {
89
90
 
90
91
  class GloomApiClient {
91
92
  private currentUser: AuthUser | null = null;
93
+ /** Local identity of a verified user/credential pair, never serialized. */
94
+ private verifiedSessionIdentity: object | null = null;
92
95
  private sessionChecked = false;
93
96
  /** Last few session transitions, content-free, for app://auth. */
94
97
  private authTrace: Array<{ at: number; event: string; token: boolean; user: string }> = [];
@@ -116,6 +119,8 @@ class GloomApiClient {
116
119
  markCurrentUserUnverified: () => {
117
120
  if (this.currentUser) {
118
121
  this.currentUser = { ...this.currentUser, emailVerified: false };
122
+ this.verifiedSessionIdentity = null;
123
+ this.emitCurrentUserChange();
119
124
  }
120
125
  },
121
126
  updateCurrentUserFromSocket: (user) => {
@@ -127,6 +132,7 @@ class GloomApiClient {
127
132
  });
128
133
  private readonly chat: CloudChatApi = new CloudChatApi({
129
134
  request: (path, options) => this.request(path, options),
135
+ upload: (path, body, options) => this.transport.upload(path, body, options),
130
136
  socket: this.socket,
131
137
  });
132
138
  private readonly teams: CloudTeamsApi = new CloudTeamsApi({
@@ -156,16 +162,22 @@ class GloomApiClient {
156
162
 
157
163
  setCookieSessionMode(enabled: boolean): void {
158
164
  this.sessionChecked = false;
165
+ this.verifiedSessionIdentity = null;
159
166
  this.transport.setCookieSessionMode(enabled);
167
+ this.emitCurrentUserChange();
160
168
  }
161
169
 
162
170
  setSessionToken(token: string | null): void {
163
171
  const changed = this.transport.getSessionToken() !== token;
164
172
  this.sessionChecked = false;
165
173
  this.transport.setSessionToken(token);
174
+ if (changed) this.verifiedSessionIdentity = null;
166
175
  this.traceAuth(changed ? "setSessionToken:changed" : "setSessionToken:same");
167
176
  if (!token) {
168
177
  this.currentUser = null;
178
+ this.verifiedSessionIdentity = null;
179
+ }
180
+ if (changed || !token) {
169
181
  this.emitCurrentUserChange();
170
182
  }
171
183
  this.socket.syncAuthState({ reconnect: changed });
@@ -190,7 +202,7 @@ class GloomApiClient {
190
202
  return !!this.transport.getSessionToken() || !!this.currentUser;
191
203
  }
192
204
 
193
- /** Notifies when the signed-in user changes, including plan and trial entitlement. */
205
+ /** Notifies when the user or credential changes, including plan and trial entitlement. */
194
206
  subscribeCurrentUser(listener: () => void): () => void {
195
207
  this.currentUserListeners.add(listener);
196
208
  return () => {
@@ -206,6 +218,11 @@ class GloomApiClient {
206
218
  return this.transport.hasSessionCredential() && !!this.currentUser?.emailVerified;
207
219
  }
208
220
 
221
+ /** Null while a replacement credential still awaits its matching user. */
222
+ getVerifiedSessionIdentity(): object | null {
223
+ return this.isVerified() ? this.verifiedSessionIdentity : null;
224
+ }
225
+
209
226
  /**
210
227
  * What this client currently believes about its session, with no secrets.
211
228
  * Exposed over remote control so a "shows my username but not my
@@ -259,6 +276,7 @@ class GloomApiClient {
259
276
  const changed = this.socketEntitlementKey(this.currentUser) !== this.socketEntitlementKey(user);
260
277
  this.traceAuth("setCurrentUser", user);
261
278
  this.currentUser = user;
279
+ this.verifiedSessionIdentity = this.isVerified() ? {} : null;
262
280
  this.socket.syncAuthState({ reconnect: changed });
263
281
  this.emitCurrentUserChange();
264
282
  }
@@ -360,7 +378,8 @@ class GloomApiClient {
360
378
  event: import("./research-activity").ResearchActivity; eventId: string;
361
379
  surface: "web" | "desktop" | "tui" | "cli"; anonymousId?: string;
362
380
  attribution?: Record<string, string>; feature?: import("./research-activity").ResearchFeature;
363
- tab?: string; desks?: readonly string[];
381
+ tab?: string; desks?: readonly string[]; placement?: string; teaser_kind?: "summary" | "sample" | "none";
382
+ cta?: "login" | "signup";
364
383
  }): Promise<void> {
365
384
  await this.request("/activity/research", { method: "POST", body: JSON.stringify(payload) });
366
385
  }
@@ -399,6 +418,20 @@ class GloomApiClient {
399
418
  return this.request<{ url: string }>("/stripe/portal", { method: "POST", body: JSON.stringify({}) });
400
419
  }
401
420
 
421
+ /**
422
+ * Asks which arm of an app experiment this account or web visitor is in, at the
423
+ * moment it would show. The API counts the answer as the exposure.
424
+ */
425
+ async recordExperimentExposure(payload: {
426
+ eventId: string; surface: "web" | "desktop" | "tui" | "cli"; anonymousId?: string;
427
+ attribution?: Record<string, string>; experiment: string; variant?: string;
428
+ }, signal?: AbortSignal): Promise<import("./web-experiments").ExperimentAnswer> {
429
+ return this.request("/activity/research", {
430
+ method: "POST",
431
+ body: JSON.stringify({ event: "experiment_exposed", ...payload }),
432
+ ...(signal ? { signal } : {}),
433
+ });
434
+ }
402
435
  getAccountProfile = this.auth.getAccountProfile.bind(this.auth);
403
436
  getCloudPricing = this.auth.getCloudPricing.bind(this.auth);
404
437
  getCloudAccountPlan = this.auth.getCloudAccountPlan.bind(this.auth);
@@ -603,6 +636,9 @@ class GloomApiClient {
603
636
  openGroupChannel = this.chat.openGroupChannel.bind(this.chat);
604
637
  getMessages = this.chat.getMessages.bind(this.chat);
605
638
  sendMessage = this.chat.sendMessage.bind(this.chat);
639
+ uploadChatAttachment = this.chat.uploadAttachment.bind(this.chat);
640
+ chatAttachmentsSupported = this.chat.attachmentsSupported.bind(this.chat);
641
+ subscribeChatAttachmentSupport = this.chat.subscribeAttachmentSupport.bind(this.chat);
606
642
  editMessage = this.chat.editMessage.bind(this.chat);
607
643
  connectChannel = this.chat.connectChannel.bind(this.chat);
608
644
  subscribeChatNotifications = this.chat.subscribeNotifications.bind(this.chat);
@@ -639,6 +675,7 @@ class GloomApiClient {
639
675
  listFeedback = this.feedback.listFeedback.bind(this.feedback);
640
676
  reportCrashErrors = this.telemetry.reportCrashErrors.bind(this.telemetry);
641
677
  reportUsageCounts = this.telemetry.reportUsageCounts.bind(this.telemetry);
678
+ reportAttentionCounts = this.telemetry.reportAttentionCounts.bind(this.telemetry);
642
679
  deleteCloudNote = this.notes.deleteNote.bind(this.notes);
643
680
  listTheses = this.theses.listTheses.bind(this.theses);
644
681
  getThesis = this.theses.getThesis.bind(this.theses);
@@ -705,12 +742,18 @@ class GloomApiClient {
705
742
  getCloudEstimateRevisions = this.data.getCloudEstimateRevisions.bind(this.data);
706
743
  getCloudMoneyMarkets = this.data.getCloudMoneyMarkets.bind(this.data);
707
744
  equityScreener = this.data.equityScreener.bind(this.data);
745
+ getCloudThemes = this.data.getCloudThemes.bind(this.data);
746
+ getCloudThemeMembers = this.data.getCloudThemeMembers.bind(this.data);
708
747
  impliedVolatility = this.data.impliedVolatility.bind(this.data);
709
748
  optionsPositioning = this.data.optionsPositioning.bind(this.data);
710
749
  getCloudDebtMaturities = this.data.getCloudDebtMaturities.bind(this.data);
711
750
  getCloudRevenueBreakdown = this.data.getCloudRevenueBreakdown.bind(this.data);
712
751
  getCloudMnaDeals = this.data.getCloudMnaDeals.bind(this.data);
713
752
  getCloudMnaDeal = this.data.getCloudMnaDeal.bind(this.data);
753
+ getPublicDistressFilings = this.data.getPublicDistressFilings.bind(this.data);
754
+ getPublicGoingConcern = this.data.getPublicGoingConcern.bind(this.data);
755
+ getPublicDistressDesignations = this.data.getPublicDistressDesignations.bind(this.data);
756
+ getPublicInsolvencyNotices = this.data.getPublicInsolvencyNotices.bind(this.data);
714
757
  getCloudIpoCalendar = this.data.getCloudIpoCalendar.bind(this.data);
715
758
  getCloudShortVolume = this.data.getCloudShortVolume.bind(this.data);
716
759
  getCloudSocialMentions = this.data.getCloudSocialMentions.bind(this.data);
@@ -721,7 +764,38 @@ class GloomApiClient {
721
764
  getCloudShiller = this.data.getCloudShiller.bind(this.data);
722
765
  getCloudCotBoard = this.data.getCloudCotBoard.bind(this.data);
723
766
  getCloudCotContract = this.data.getCloudCotContract.bind(this.data);
767
+ creditDocuments = this.data.creditDocuments.bind(this.data);
768
+ getCloudHiring = this.data.getCloudHiring.bind(this.data);
769
+ getCloudAppRankHistory = this.data.getCloudAppRankHistory.bind(this.data);
770
+ getCloudAppAttention = this.data.getCloudAppAttention.bind(this.data);
771
+ getCloudCatalystChanges = this.data.getCloudCatalystChanges.bind(this.data);
772
+ getCloudCatalysts = this.data.getCloudCatalysts.bind(this.data);
773
+ getCloudCatalystEvent = this.data.getCloudCatalystEvent.bind(this.data);
774
+ getCloudCatalystStatus = this.data.getCloudCatalystStatus.bind(this.data);
775
+ getCloudCompanyKpis = this.data.getCloudCompanyKpis.bind(this.data);
776
+ getCloudCompanyGuidance = this.data.getCloudCompanyGuidance.bind(this.data);
777
+ getCloudPerpsBoard = this.data.getCloudPerpsBoard.bind(this.data);
778
+ getCloudPerpsHistory = this.data.getCloudPerpsHistory.bind(this.data);
779
+ getCloudPerpsRankings = this.data.getCloudPerpsRankings.bind(this.data);
780
+ getCloudPerpsCompare = this.data.getCloudPerpsCompare.bind(this.data);
781
+ getCloudPerpsEquity = this.data.getCloudPerpsEquity.bind(this.data);
782
+ getCloudPerpsMarket = this.data.getCloudPerpsMarket.bind(this.data);
783
+ analyzeCloudExposure = this.data.analyzeCloudExposure.bind(this.data);
784
+ getCloudExposureScenarios = this.data.getCloudExposureScenarios.bind(this.data);
785
+ getCloudSupplyGraph = this.data.getCloudSupplyGraph.bind(this.data);
786
+ getCloudSupplyPaths = this.data.getCloudSupplyPaths.bind(this.data);
787
+ getCloudSupplyChain = this.data.getCloudSupplyChain.bind(this.data);
788
+ getCloudAwards = this.data.getCloudAwards.bind(this.data);
789
+ getCloudAward = this.data.getCloudAward.bind(this.data);
724
790
  getCloudDoeBoard = this.data.getCloudDoeBoard.bind(this.data);
791
+ getCloudAttention = this.data.getCloudAttention.bind(this.data);
792
+ getCloudPowerBoard = this.data.getCloudPowerBoard.bind(this.data);
793
+ getCloudPowerHistory = this.data.getCloudPowerHistory.bind(this.data);
794
+ getCloudPowerProject = this.data.getCloudPowerProject.bind(this.data);
795
+ getCloudGpuBoard = this.data.getCloudGpuBoard.bind(this.data);
796
+ getCloudGpuHistory = this.data.getCloudGpuHistory.bind(this.data);
797
+ getCloudGpuEvents = this.data.getCloudGpuEvents.bind(this.data);
798
+ getCloudCpiBoard = this.data.getCloudCpiBoard.bind(this.data);
725
799
  getCloudTape = this.data.getCloudTape.bind(this.data);
726
800
  getCloudYieldCurve = this.data.getCloudYieldCurve.bind(this.data);
727
801
  getCloudCurve = this.data.getCloudCurve.bind(this.data);
@@ -1,4 +1,5 @@
1
1
  import type {
2
+ ChatAttachment,
2
3
  ChatChannel,
3
4
  ChatMessage,
4
5
  ChatNotification,
@@ -50,14 +51,43 @@ export function normalizeSearchResponse(
50
51
  return { ...response, hits: hits.map(normalizeSearchHit) };
51
52
  }
52
53
 
54
+ function finiteNumber(value: unknown): number {
55
+ const number = typeof value === "number" ? value : Number(value);
56
+ return Number.isFinite(number) && number > 0 ? number : 0;
57
+ }
58
+
59
+ /** The images a message can show: entries without an id or a link are dropped. */
60
+ export function normalizeChatAttachments(value: unknown): ChatAttachment[] {
61
+ if (!Array.isArray(value)) return [];
62
+ return value.flatMap((entry): ChatAttachment[] => {
63
+ if (!entry || typeof entry !== "object") return [];
64
+ const raw = entry as Record<string, unknown>;
65
+ if (typeof raw.id !== "string" || !raw.id || typeof raw.url !== "string" || !raw.url) return [];
66
+ return [{
67
+ id: raw.id,
68
+ mime: typeof raw.mime === "string" ? raw.mime : "",
69
+ width: finiteNumber(raw.width),
70
+ height: finiteNumber(raw.height),
71
+ size: finiteNumber(raw.size),
72
+ url: raw.url,
73
+ }];
74
+ });
75
+ }
76
+
53
77
  export function normalizeChatMessage(message: ChatMessage): ChatMessage {
54
- return {
78
+ const normalized: ChatMessage = {
55
79
  ...message,
80
+ content: typeof message.content === "string" ? message.content : "",
56
81
  createdAt: normalizeTimestamp(message.createdAt),
57
82
  ...(message.editedAt
58
83
  ? { editedAt: normalizeTimestamp(message.editedAt) }
59
84
  : {}),
60
85
  };
86
+ if ("attachments" in message) normalized.attachments = normalizeChatAttachments(message.attachments);
87
+ if (message.attachmentReview !== "pending" && message.attachmentReview !== "failed") {
88
+ delete normalized.attachmentReview;
89
+ }
90
+ return normalized;
61
91
  }
62
92
 
63
93
  export function normalizeChatMessages(messages: ChatMessage[]): ChatMessage[] {
@@ -0,0 +1,127 @@
1
+ const ASSET_CLASSES = ["stocks", "indices", "energy", "metals", "fx", "crypto", "other"] as const
2
+ type AssetClass = (typeof ASSET_CLASSES)[number]
3
+ type PerpVenue = "hyperliquid" | "binance" | "bybit" | "okx" | "deribit" | "coinbase" | "kraken" | "dydx"
4
+
5
+ /** Rates and premiums are fractions, timestamps UTC; null always means unavailable. */
6
+ interface PerpMarket {
7
+ marketId: string
8
+ venue: PerpVenue
9
+ dex: string
10
+ symbol: string
11
+ baseAsset: string
12
+ displayName: string
13
+ assetClass: AssetClass
14
+ underlyingSymbol: string | null
15
+ underlyingCurrency: string | null
16
+ quoteCurrency: string
17
+ marginCurrency: string
18
+ contractType: "linear" | "inverse" | "quanto"
19
+ priceMultiplier: number
20
+ markPrice: number | null
21
+ oraclePrice: number | null
22
+ lastPrice: number | null
23
+ previousDayPrice: number | null
24
+ priceChange24h: number | null
25
+ premium: number | null
26
+ venuePremium: number | null
27
+ fundingRate: number | null
28
+ fundingIntervalHours: number | null
29
+ fundingKind: "current" | "last-paid" | "continuous"
30
+ fundingRate8h: number | null
31
+ fundingApr: number | null
32
+ predictedFundingRate: number | null
33
+ predictedFundingIntervalHours: number | null
34
+ nextFundingAt: string | null
35
+ openInterestBase: number | null
36
+ openInterestUsd: number | null
37
+ volume24hUsd: number | null
38
+ maxLeverage: number | null
39
+ isolatedOnly: boolean | null
40
+ delisted: boolean
41
+ observedAt: string
42
+ sourceAsOf: string | null
43
+ sourceUrl: string
44
+ confidence: "high" | "medium" | "low"
45
+ qualityFlags: string[]
46
+ }
47
+
48
+ interface PerpFunding {
49
+ marketId: string
50
+ time: string
51
+ rate: number
52
+ intervalHours: number
53
+ premium: number | null
54
+ observedAt: string
55
+ sourceUrl: string
56
+ }
57
+
58
+ interface PerpCandle {
59
+ marketId: string
60
+ time: string
61
+ interval: "1h"
62
+ open: number
63
+ high: number
64
+ low: number
65
+ close: number
66
+ volumeBase: number | null
67
+ trades: number | null
68
+ observedAt: string
69
+ sourceUrl: string
70
+ }
71
+
72
+ interface UnderlyingReference {
73
+ symbol: string
74
+ price: number
75
+ currency: string
76
+ asOf: string
77
+ marketState: string | null
78
+ sourceUrl: string
79
+ }
80
+
81
+ export interface PerpBoardRow extends PerpMarket {
82
+ stale: boolean
83
+ oiChange1h: number | null
84
+ oiChange24h: number | null
85
+ oiUsdChange1h: number | null
86
+ oiUsdChange24h: number | null
87
+ underlying: UnderlyingReference | null
88
+ underlyingPremium: number | null
89
+ closedMarketPremium: number | null
90
+ }
91
+
92
+ type PerpHistoryPoint = {
93
+ time: string
94
+ resolution: "minute" | "hour" | "day"
95
+ markPrice: number | null
96
+ oraclePrice: number | null
97
+ premium: number | null
98
+ fundingRate: number | null
99
+ fundingIntervalHours: number | null
100
+ openInterestBase: number | null
101
+ openInterestUsd: number | null
102
+ sampleCount: number
103
+ firstObservedAt: string
104
+ lastObservedAt: string
105
+ }
106
+
107
+ export interface PerpBoardPayload {
108
+ status: string; asOf: string | null; rows: PerpBoardRow[]; total: number; locked: number;
109
+ access: "pro" | "preview"; sources?: unknown[];
110
+ }
111
+ export interface PerpHistoryPayload {
112
+ status: string; marketId: string; rows: PerpHistoryPoint[]; funding: PerpFunding[]; candles: PerpCandle[];
113
+ locked: boolean; access: "pro" | "preview"; asOf: string | null;
114
+ from?: string; to?: string; resolution?: "minute" | "hour" | "day"; truncated?: boolean;
115
+ }
116
+ export interface PerpRankingsPayload {
117
+ status: string; asOf: string | null; access: "pro" | "preview"; locked: boolean;
118
+ fundingPositive: PerpBoardRow[]; fundingNegative: PerpBoardRow[]; oiSurges: PerpBoardRow[];
119
+ premiumDislocations: PerpBoardRow[]; closedMarketDislocations: PerpBoardRow[];
120
+ }
121
+ export type PerpBoardQuery = { assetClass?: string; search?: string; sort?: string; includeDelisted?: boolean };
122
+ export type PerpHistoryQuery = { marketId: string; from?: string; to?: string; resolution?: "auto" | "minute" | "hour" | "day"; limit?: number };
123
+
124
+ export interface PerpMarketPayload extends PerpBoardPayload {
125
+ evidence: { kind: string; period_at: string; received_at: string; superseded_at: string | null; fingerprint: string; payload: PerpMarket | PerpFunding | PerpCandle }[];
126
+ methodologyUrl: string;
127
+ }