gloomberb 0.15.7 → 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 (524) hide show
  1. package/README.md +11 -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 +192 -3
  12. package/src/api-client/distress.ts +164 -0
  13. package/src/api-client/doe.ts +75 -0
  14. package/src/api-client/equity-screener.ts +11 -0
  15. package/src/api-client/exposure.ts +202 -0
  16. package/src/api-client/gpu.ts +93 -0
  17. package/src/api-client/hiring.ts +110 -0
  18. package/src/api-client/index.ts +78 -3
  19. package/src/api-client/normalizers.ts +31 -1
  20. package/src/api-client/paths.ts +3 -0
  21. package/src/api-client/perps.ts +127 -0
  22. package/src/api-client/power.ts +148 -0
  23. package/src/api-client/request.ts +58 -1
  24. package/src/api-client/research-activity.ts +172 -13
  25. package/src/api-client/socket.ts +75 -27
  26. package/src/api-client/supply-chain-graph.ts +40 -0
  27. package/src/api-client/supply-chain.ts +98 -0
  28. package/src/api-client/telemetry.ts +29 -0
  29. package/src/api-client/themes.ts +28 -0
  30. package/src/api-client/types.ts +33 -1
  31. package/src/api-client/wall-experiments.ts +100 -0
  32. package/src/api-client/wall-summary.ts +49 -0
  33. package/src/api-client/web-experiments.ts +136 -0
  34. package/src/app/pane-runtime/plugin-bindings.ts +5 -0
  35. package/src/app/pane-runtime/ticker-open-runtime.ts +8 -2
  36. package/src/app/runtime/update.ts +13 -1
  37. package/src/cli/commands/system.ts +2 -0
  38. package/src/cli/desktop-pane-shot.ts +3 -4
  39. package/src/cli/pane-functions/data.ts +78 -0
  40. package/src/cli/pane-functions/financial-ratio-shot.ts +160 -0
  41. package/src/cli/pane-functions/function-help.ts +220 -8
  42. package/src/cli/pane-functions/headless.ts +4 -0
  43. package/src/cli/pane-functions/screenshot-evidence.ts +21 -0
  44. package/src/cli/pane-functions/screenshot.ts +49 -5
  45. package/src/components/chart/composite/composite-chart.tsx +15 -2
  46. package/src/components/chart/composite/format.ts +24 -11
  47. package/src/components/chart/composite/rasterizer.ts +67 -16
  48. package/src/components/chart/composite/scene.ts +53 -2
  49. package/src/components/chart/composite/session-shading.ts +3 -2
  50. package/src/components/chart/composite/text-renderer.ts +52 -1
  51. package/src/components/chart/composite/time-axis.ts +100 -30
  52. package/src/components/chart/composite/tools.ts +2 -1
  53. package/src/components/chart/composite/types.ts +4 -0
  54. package/src/components/chart-table/index.ts +1 -0
  55. package/src/components/chart-table/layout.ts +15 -0
  56. package/src/components/command-bar/action-runtime.ts +1 -0
  57. package/src/components/command-bar/commands/direct/index.ts +32 -0
  58. package/src/components/command-bar/commands/registry.ts +7 -0
  59. package/src/components/command-bar/pane-templates/items.ts +11 -0
  60. package/src/components/command-bar/pane-templates/workflow.ts +19 -4
  61. package/src/components/command-bar/routes/root/command-items.ts +6 -0
  62. package/src/components/command-bar/routes/root/provider-search.ts +2 -0
  63. package/src/components/command-bar/routes/root/results.ts +64 -0
  64. package/src/components/command-bar/routes/root/runtime.ts +8 -0
  65. package/src/components/command-bar/routes/ticker-search/results.ts +89 -24
  66. package/src/components/command-bar/routes/ticker-search/route.ts +2 -0
  67. package/src/components/command-bar/surface/index.tsx +15 -0
  68. package/src/components/command-bar/view-model.ts +3 -0
  69. package/src/components/command-bar/workflow/collection-actions.ts +9 -7
  70. package/src/components/command-bar/workflow/ops.ts +19 -0
  71. package/src/components/command-bar/workflow/tickers.ts +5 -0
  72. package/src/components/company-logo.tsx +15 -2
  73. package/src/components/data-table/table-pane.ts +2 -1
  74. package/src/components/index.ts +1 -0
  75. package/src/components/layout/detached-pane-shell.tsx +12 -1
  76. package/src/components/layout/missing-pane.tsx +87 -23
  77. package/src/components/layout/pane/footer/index.tsx +64 -18
  78. package/src/components/layout/pane/footer/model.ts +85 -0
  79. package/src/components/layout/pane/sidebar.tsx +19 -1
  80. package/src/components/layout/shell/index.tsx +38 -28
  81. package/src/components/layout/shell/pane/management-shortcuts.ts +13 -1
  82. package/src/components/layout/status-bar.tsx +93 -28
  83. package/src/components/layout/status-widget-space.ts +72 -0
  84. package/src/components/onboarding/first-run-workspace.ts +8 -2
  85. package/src/components/onboarding/onboarding-wizard.tsx +35 -16
  86. package/src/components/onboarding/portfolio-step/positions-panel.tsx +14 -5
  87. package/src/components/onboarding/wizard-model.ts +13 -5
  88. package/src/components/onboarding/wizard-positions.ts +56 -7
  89. package/src/components/price-performance.tsx +31 -34
  90. package/src/components/ui/data-table/index.tsx +11 -8
  91. package/src/components/ui/display.tsx +15 -6
  92. package/src/components/ui/fields.tsx +5 -0
  93. package/src/components/ui/figure.tsx +94 -0
  94. package/src/components/ui/header-case.ts +25 -3
  95. package/src/components/ui/icon.tsx +3 -1
  96. package/src/components/ui/message-composer.tsx +8 -1
  97. package/src/components/ui/query-bar.tsx +8 -1
  98. package/src/components/ui/ratio-bar.tsx +84 -0
  99. package/src/components/ui/toggle.tsx +3 -1
  100. package/src/components/use-scrollbox-layout.ts +17 -0
  101. package/src/core/state/app/layout.ts +35 -1
  102. package/src/core/state/app/state.ts +15 -0
  103. package/src/core/state/app/types.ts +1 -0
  104. package/src/data/config/store/normalize.ts +24 -0
  105. package/src/i18n/es.ts +2 -0
  106. package/src/i18n/ja.ts +2 -0
  107. package/src/i18n/ko.ts +2 -0
  108. package/src/i18n/zh-cn.ts +2 -0
  109. package/src/i18n/zh-tw.ts +2 -0
  110. package/src/layout-marketplace/pane-imagery.ts +1 -0
  111. package/src/market-data/coordinator/entries.ts +13 -0
  112. package/src/market-data/coordinator/financials.ts +33 -8
  113. package/src/market-data/market/freshness.ts +16 -5
  114. package/src/market-data/market/trading-sessions.ts +65 -1
  115. package/src/market-data/published-cn-sessions.ts +25 -0
  116. package/src/market-data/published-nse-sessions.ts +20 -0
  117. package/src/news/aggregator.ts +4 -0
  118. package/src/plugins/builtin/account-management/model.ts +6 -1
  119. package/src/plugins/builtin/account-management/pane.tsx +36 -25
  120. package/src/plugins/builtin/alerts/catalysts.ts +77 -0
  121. package/src/plugins/builtin/alerts/events-pane.tsx +3 -0
  122. package/src/plugins/builtin/alerts/events.ts +10 -4
  123. package/src/plugins/builtin/alerts/history-pane.tsx +1 -1
  124. package/src/plugins/builtin/alerts/history.ts +1 -0
  125. package/src/plugins/builtin/alerts/index.tsx +6 -0
  126. package/src/plugins/builtin/alerts/research-builder.ts +10 -3
  127. package/src/plugins/builtin/alerts/research-rules.ts +15 -1
  128. package/src/plugins/builtin/analytics/risk-client.ts +15 -3
  129. package/src/plugins/builtin/analytics/risk-headless.ts +123 -18
  130. package/src/plugins/builtin/attention/client.ts +80 -0
  131. package/src/plugins/builtin/attention/evidence.ts +30 -0
  132. package/src/plugins/builtin/attention/headless.ts +33 -0
  133. package/src/plugins/builtin/attention/index.tsx +18 -0
  134. package/src/plugins/builtin/attention/model.ts +59 -0
  135. package/src/plugins/builtin/attention/pane.tsx +211 -0
  136. package/src/plugins/builtin/attention/trending.tsx +59 -0
  137. package/src/plugins/builtin/awards/alerts.ts +32 -0
  138. package/src/plugins/builtin/awards/client.ts +82 -0
  139. package/src/plugins/builtin/awards/detail.tsx +107 -0
  140. package/src/plugins/builtin/awards/evidence.ts +36 -0
  141. package/src/plugins/builtin/awards/headless.ts +55 -0
  142. package/src/plugins/builtin/awards/index.tsx +20 -0
  143. package/src/plugins/builtin/awards/model.ts +42 -0
  144. package/src/plugins/builtin/awards/pane.tsx +263 -0
  145. package/src/plugins/builtin/catalysts/client.ts +28 -0
  146. package/src/plugins/builtin/catalysts/detail.tsx +88 -0
  147. package/src/plugins/builtin/catalysts/evidence.ts +47 -0
  148. package/src/plugins/builtin/catalysts/headless.ts +42 -0
  149. package/src/plugins/builtin/catalysts/history.ts +26 -0
  150. package/src/plugins/builtin/catalysts/index.tsx +29 -0
  151. package/src/plugins/builtin/catalysts/model.ts +135 -0
  152. package/src/plugins/builtin/catalysts/pane.tsx +159 -0
  153. package/src/plugins/builtin/chart-composer/cli-options.ts +4 -0
  154. package/src/plugins/builtin/chart-composer/headless-schema.ts +6 -0
  155. package/src/plugins/builtin/chart-composer/index.tsx +8 -1
  156. package/src/plugins/builtin/chart-composer/pane.tsx +28 -1
  157. package/src/plugins/builtin/chat/attachments/desktop.tsx +610 -0
  158. package/src/plugins/builtin/chat/attachments/files.ts +45 -0
  159. package/src/plugins/builtin/chat/attachments/model.ts +164 -0
  160. package/src/plugins/builtin/chat/attachments/terminal.tsx +72 -0
  161. package/src/plugins/builtin/chat/attachments/transfer.ts +165 -0
  162. package/src/plugins/builtin/chat/content/channel-navigation.ts +13 -12
  163. package/src/plugins/builtin/chat/content/composer-runtime.ts +25 -4
  164. package/src/plugins/builtin/chat/content/composer.tsx +46 -4
  165. package/src/plugins/builtin/chat/content/footer.tsx +46 -8
  166. package/src/plugins/builtin/chat/content/index.tsx +263 -62
  167. package/src/plugins/builtin/chat/content/layout-metrics.ts +10 -2
  168. package/src/plugins/builtin/chat/content/open-targets.ts +17 -3
  169. package/src/plugins/builtin/chat/content/scroll.ts +7 -1
  170. package/src/plugins/builtin/chat/content/shortcuts.ts +36 -11
  171. package/src/plugins/builtin/chat/content/snapshot.ts +3 -0
  172. package/src/plugins/builtin/chat/content/transcript.tsx +17 -1
  173. package/src/plugins/builtin/chat/content/types.ts +7 -0
  174. package/src/plugins/builtin/chat/controller/attachments.ts +213 -0
  175. package/src/plugins/builtin/chat/controller/connections.ts +3 -1
  176. package/src/plugins/builtin/chat/controller/index.ts +114 -2
  177. package/src/plugins/builtin/chat/controller/lifecycle.ts +9 -0
  178. package/src/plugins/builtin/chat/controller/messages.ts +35 -2
  179. package/src/plugins/builtin/chat/controller/send.ts +128 -25
  180. package/src/plugins/builtin/chat/controller/state.ts +12 -1
  181. package/src/plugins/builtin/chat/controller/utils.ts +7 -5
  182. package/src/plugins/builtin/chat/controller/view.ts +2 -0
  183. package/src/plugins/builtin/chat/index.tsx +21 -0
  184. package/src/plugins/builtin/chat/layout.ts +9 -4
  185. package/src/plugins/builtin/chat/message/desktop.tsx +55 -20
  186. package/src/plugins/builtin/chat/message/header.tsx +30 -5
  187. package/src/plugins/builtin/chat/message/inline-tokens.tsx +9 -0
  188. package/src/plugins/builtin/chat/message/pending-send.ts +35 -0
  189. package/src/plugins/builtin/chat/message/profile-popover.tsx +5 -1
  190. package/src/plugins/builtin/chat/message/render-state.ts +12 -2
  191. package/src/plugins/builtin/chat/message/terminal.tsx +51 -4
  192. package/src/plugins/builtin/chat/message/types.ts +6 -1
  193. package/src/plugins/builtin/chat/pane-state.ts +59 -1
  194. package/src/plugins/builtin/chat/profile-popover.ts +50 -1
  195. package/src/plugins/builtin/chat/sidebar.tsx +8 -3
  196. package/src/plugins/builtin/chat/status-widget.tsx +29 -12
  197. package/src/plugins/builtin/chat/unread-inbox-pane.tsx +143 -0
  198. package/src/plugins/builtin/chat/unread-inbox.ts +91 -0
  199. package/src/plugins/builtin/clinical-trials/client.ts +237 -0
  200. package/src/plugins/builtin/clinical-trials/index.tsx +74 -0
  201. package/src/plugins/builtin/clinical-trials/pane.tsx +225 -0
  202. package/src/plugins/builtin/clinical-trials/types.ts +2 -0
  203. package/src/plugins/builtin/cloud/askg/controller.ts +37 -6
  204. package/src/plugins/builtin/cloud/askg/executor.ts +59 -44
  205. package/src/plugins/builtin/cloud/askg/host.ts +8 -1
  206. package/src/plugins/builtin/cloud/askg/manifest.ts +29 -2
  207. package/src/plugins/builtin/cloud/askg/model.ts +47 -13
  208. package/src/plugins/builtin/cloud/askg/notes.ts +100 -0
  209. package/src/plugins/builtin/cloud/askg/pane.tsx +50 -14
  210. package/src/plugins/builtin/cloud/askg/protocol.ts +39 -1
  211. package/src/plugins/builtin/cloud/askg/result-budget.ts +156 -0
  212. package/src/plugins/builtin/cloud/askg/user-data.ts +89 -0
  213. package/src/plugins/builtin/cloud/auth-actions.tsx +55 -31
  214. package/src/plugins/builtin/cloud/plugin.tsx +4 -1
  215. package/src/plugins/builtin/cloud/team/pane-sections.tsx +10 -1
  216. package/src/plugins/builtin/cloud/team/pane.tsx +3 -2
  217. package/src/plugins/builtin/cloud/thesis/board-pane.tsx +2 -2
  218. package/src/plugins/builtin/cloud/thesis/detail.tsx +1 -1
  219. package/src/plugins/builtin/cloud/thesis/ticker-tab.tsx +2 -2
  220. package/src/plugins/builtin/cloud/trial-offer-status-widget.tsx +202 -0
  221. package/src/plugins/builtin/cloud/upgrade-command.ts +1 -1
  222. package/src/plugins/builtin/cloud/upgrade-dialog.tsx +29 -3
  223. package/src/plugins/builtin/cloud/upgrade-status-widget.tsx +1 -1
  224. package/src/plugins/builtin/cloud-tweets/table.tsx +1 -1
  225. package/src/plugins/builtin/comment-letters/client.ts +342 -0
  226. package/src/plugins/builtin/comment-letters/index.tsx +74 -0
  227. package/src/plugins/builtin/comment-letters/pane.tsx +295 -0
  228. package/src/plugins/builtin/comment-letters/types.ts +43 -0
  229. package/src/plugins/builtin/company-attention/app-rank.tsx +79 -0
  230. package/src/plugins/builtin/company-attention/client.ts +69 -0
  231. package/src/plugins/builtin/company-attention/evidence.ts +45 -0
  232. package/src/plugins/builtin/company-attention/headless.ts +47 -0
  233. package/src/plugins/builtin/company-attention/index.tsx +30 -0
  234. package/src/plugins/builtin/company-attention/model.ts +129 -0
  235. package/src/plugins/builtin/company-attention/pane.tsx +183 -0
  236. package/src/plugins/builtin/company-kpis/client.ts +92 -0
  237. package/src/plugins/builtin/company-kpis/headless.ts +32 -0
  238. package/src/plugins/builtin/company-kpis/index.tsx +26 -0
  239. package/src/plugins/builtin/company-kpis/model.ts +124 -0
  240. package/src/plugins/builtin/company-kpis/pane.tsx +226 -0
  241. package/src/plugins/builtin/company-kpis/related.ts +11 -0
  242. package/src/plugins/builtin/company-kpis/screenshot-evidence.ts +44 -0
  243. package/src/plugins/builtin/composite-plugins.ts +34 -0
  244. package/src/plugins/builtin/correlation/history.ts +4 -1
  245. package/src/plugins/builtin/correlation/index.tsx +139 -80
  246. package/src/plugins/builtin/correlation/matrix/pair-chart.tsx +48 -0
  247. package/src/plugins/builtin/correlation/matrix/selection.ts +77 -0
  248. package/src/plugins/builtin/correlation/relationship/model.ts +2 -2
  249. package/src/plugins/builtin/cpi/client.ts +66 -0
  250. package/src/plugins/builtin/cpi/headless.ts +78 -0
  251. package/src/plugins/builtin/cpi/index.tsx +31 -0
  252. package/src/plugins/builtin/cpi/model.ts +198 -0
  253. package/src/plugins/builtin/cpi/pane.tsx +157 -0
  254. package/src/plugins/builtin/credit-documents/client.ts +99 -0
  255. package/src/plugins/builtin/credit-documents/detail.tsx +109 -0
  256. package/src/plugins/builtin/credit-documents/evidence.ts +64 -0
  257. package/src/plugins/builtin/credit-documents/gauge.tsx +55 -0
  258. package/src/plugins/builtin/credit-documents/headless.ts +40 -0
  259. package/src/plugins/builtin/credit-documents/index.tsx +19 -0
  260. package/src/plugins/builtin/credit-documents/model.ts +336 -0
  261. package/src/plugins/builtin/credit-documents/pane.tsx +185 -0
  262. package/src/plugins/builtin/custom-view/view-spec.ts +14 -2
  263. package/src/plugins/builtin/debt-maturities/pane.tsx +1 -0
  264. package/src/plugins/builtin/dividend-yield/pane.tsx +1 -1
  265. package/src/plugins/builtin/doe/client.ts +73 -0
  266. package/src/plugins/builtin/doe/headless.ts +93 -0
  267. package/src/plugins/builtin/doe/index.tsx +41 -0
  268. package/src/plugins/builtin/doe/model.ts +215 -0
  269. package/src/plugins/builtin/doe/pane.tsx +148 -0
  270. package/src/plugins/builtin/doe/range-bar.tsx +45 -0
  271. package/src/plugins/builtin/earnings/board.tsx +3 -0
  272. package/src/plugins/builtin/earnings/index.tsx +2 -0
  273. package/src/plugins/builtin/earnings-calls/pane.tsx +7 -1
  274. package/src/plugins/builtin/earnings-calls/transcript-view.tsx +7 -7
  275. package/src/plugins/builtin/earnings-ripple/client.ts +60 -0
  276. package/src/plugins/builtin/earnings-ripple/headless.ts +35 -0
  277. package/src/plugins/builtin/earnings-ripple/index.tsx +35 -0
  278. package/src/plugins/builtin/earnings-ripple/model.ts +98 -0
  279. package/src/plugins/builtin/earnings-ripple/pane.tsx +103 -0
  280. package/src/plugins/builtin/equity-screener/client.ts +1 -1
  281. package/src/plugins/builtin/equity-screener/criterion-editor.tsx +1 -1
  282. package/src/plugins/builtin/equity-screener/model.ts +74 -9
  283. package/src/plugins/builtin/equity-screener/pane.tsx +2 -0
  284. package/src/plugins/builtin/estimate-revisions/pane.tsx +3 -0
  285. package/src/plugins/builtin/executives/pane.tsx +7 -5
  286. package/src/plugins/builtin/exposure/charts.tsx +66 -0
  287. package/src/plugins/builtin/exposure/client.ts +53 -0
  288. package/src/plugins/builtin/exposure/drivers.ts +29 -0
  289. package/src/plugins/builtin/exposure/editor.tsx +61 -0
  290. package/src/plugins/builtin/exposure/evidence.ts +39 -0
  291. package/src/plugins/builtin/exposure/headless.ts +51 -0
  292. package/src/plugins/builtin/exposure/holdings.ts +56 -0
  293. package/src/plugins/builtin/exposure/index.tsx +13 -0
  294. package/src/plugins/builtin/exposure/model.ts +104 -0
  295. package/src/plugins/builtin/exposure/pane.tsx +247 -0
  296. package/src/plugins/builtin/fear-greed/charts.tsx +1 -1
  297. package/src/plugins/builtin/fear-greed/pane.tsx +2 -9
  298. package/src/plugins/builtin/filing-events/pane.tsx +2 -1
  299. package/src/plugins/builtin/gpu/board.tsx +163 -0
  300. package/src/plugins/builtin/gpu/changes.tsx +94 -0
  301. package/src/plugins/builtin/gpu/client.ts +130 -0
  302. package/src/plugins/builtin/gpu/equities.tsx +112 -0
  303. package/src/plugins/builtin/gpu/headless.ts +67 -0
  304. package/src/plugins/builtin/gpu/history.tsx +140 -0
  305. package/src/plugins/builtin/gpu/index.tsx +18 -0
  306. package/src/plugins/builtin/gpu/ladder.tsx +127 -0
  307. package/src/plugins/builtin/gpu/model.ts +317 -0
  308. package/src/plugins/builtin/gpu/pane.tsx +63 -0
  309. package/src/plugins/builtin/help/index.tsx +19 -2
  310. package/src/plugins/builtin/holders/pane.tsx +5 -9
  311. package/src/plugins/builtin/insider/detail.tsx +119 -0
  312. package/src/plugins/builtin/insider/display.ts +221 -0
  313. package/src/plugins/builtin/insider/headless.ts +24 -3
  314. package/src/plugins/builtin/insider/index.tsx +206 -108
  315. package/src/plugins/builtin/insider/insider-data.ts +31 -3
  316. package/src/plugins/builtin/insider/model.ts +53 -4
  317. package/src/plugins/builtin/insider/table-model.ts +226 -0
  318. package/src/plugins/builtin/insider/table.tsx +79 -0
  319. package/src/plugins/builtin/iv-history/screen-pane.tsx +1 -1
  320. package/src/plugins/builtin/jobs/pane.tsx +14 -7
  321. package/src/plugins/builtin/kelly-sizer/pane.tsx +1 -1
  322. package/src/plugins/builtin/macro-day/client.ts +50 -0
  323. package/src/plugins/builtin/macro-day/headless.ts +51 -0
  324. package/src/plugins/builtin/macro-day/index.tsx +21 -0
  325. package/src/plugins/builtin/macro-day/model.ts +137 -0
  326. package/src/plugins/builtin/macro-day/pane.tsx +118 -0
  327. package/src/plugins/builtin/macro-day/releases.ts +58 -0
  328. package/src/plugins/builtin/market-halts/model.ts +30 -17
  329. package/src/plugins/builtin/market-halts/pane.tsx +15 -21
  330. package/src/plugins/builtin/market-heatmap/data.ts +1 -1
  331. package/src/plugins/builtin/market-heatmap/index.tsx +198 -50
  332. package/src/plugins/builtin/market-heatmap/portfolio.ts +220 -0
  333. package/src/plugins/builtin/market-movers/index.tsx +1 -0
  334. package/src/plugins/builtin/market-movers/session-body.tsx +5 -2
  335. package/src/plugins/builtin/mna/distress/client.ts +326 -0
  336. package/src/plugins/builtin/mna/distress/detail.tsx +247 -0
  337. package/src/plugins/builtin/mna/distress/headless.ts +257 -0
  338. package/src/plugins/builtin/mna/distress/model.ts +427 -0
  339. package/src/plugins/builtin/mna/distress/pane.tsx +606 -0
  340. package/src/plugins/builtin/mna/index.tsx +15 -0
  341. package/src/plugins/builtin/mna/pane.tsx +42 -1
  342. package/src/plugins/builtin/news/index.tsx +62 -16
  343. package/src/plugins/builtin/news/wire/filter-articles.ts +54 -0
  344. package/src/plugins/builtin/news/wire/index.tsx +37 -3
  345. package/src/plugins/builtin/news/wire/industry-pane.tsx +29 -13
  346. package/src/plugins/builtin/news/wire/mutes.ts +253 -0
  347. package/src/plugins/builtin/news/wire/news/command-bar-search.ts +117 -0
  348. package/src/plugins/builtin/news/wire/news/footer.ts +4 -0
  349. package/src/plugins/builtin/news/wire/news/list-search.ts +34 -0
  350. package/src/plugins/builtin/news/wire/news/pop-out.tsx +158 -0
  351. package/src/plugins/builtin/news/wire/news/preset-pane.tsx +64 -19
  352. package/src/plugins/builtin/openfda/client.ts +300 -0
  353. package/src/plugins/builtin/openfda/index.tsx +71 -0
  354. package/src/plugins/builtin/openfda/pane.tsx +382 -0
  355. package/src/plugins/builtin/openfda/types.ts +76 -0
  356. package/src/plugins/builtin/options/footer.ts +1 -0
  357. package/src/plugins/builtin/options/view.tsx +1 -1
  358. package/src/plugins/builtin/options-calculator/pane.tsx +0 -1
  359. package/src/plugins/builtin/options-positioning/index.tsx +4 -2
  360. package/src/plugins/builtin/options-positioning/pane.tsx +1 -1
  361. package/src/plugins/builtin/pe-band/client.ts +61 -0
  362. package/src/plugins/builtin/pe-band/headless.ts +51 -0
  363. package/src/plugins/builtin/pe-band/index.tsx +20 -0
  364. package/src/plugins/builtin/pe-band/model.ts +267 -0
  365. package/src/plugins/builtin/pe-band/pane.tsx +159 -0
  366. package/src/plugins/builtin/perps/client.ts +66 -0
  367. package/src/plugins/builtin/perps/equity-row.tsx +28 -0
  368. package/src/plugins/builtin/perps/headless.ts +34 -0
  369. package/src/plugins/builtin/perps/index.tsx +14 -0
  370. package/src/plugins/builtin/perps/model.ts +58 -0
  371. package/src/plugins/builtin/perps/pane.tsx +185 -0
  372. package/src/plugins/builtin/plugin-marketplace/pane.tsx +0 -1
  373. package/src/plugins/builtin/portfolio-list/cli/render.ts +177 -87
  374. package/src/plugins/builtin/portfolio-list/cli/watchlist-command.ts +6 -20
  375. package/src/plugins/builtin/portfolio-list/command-bar.ts +6 -2
  376. package/src/plugins/builtin/portfolio-list/headless.ts +237 -0
  377. package/src/plugins/builtin/portfolio-list/index.tsx +2 -0
  378. package/src/plugins/builtin/portfolio-list/mutations.ts +70 -1
  379. package/src/plugins/builtin/portfolio-list/pane/data.ts +17 -0
  380. package/src/plugins/builtin/portfolio-list/pane/index.tsx +88 -5
  381. package/src/plugins/builtin/portfolio-list/pane/remove-ticker.ts +85 -0
  382. package/src/plugins/builtin/portfolio-list/pane/streaming.ts +18 -12
  383. package/src/plugins/builtin/portfolio-list/quick-add/index.tsx +6 -0
  384. package/src/plugins/builtin/power/client.ts +100 -0
  385. package/src/plugins/builtin/power/detail.tsx +82 -0
  386. package/src/plugins/builtin/power/evidence.ts +56 -0
  387. package/src/plugins/builtin/power/generation.tsx +37 -0
  388. package/src/plugins/builtin/power/headless.ts +43 -0
  389. package/src/plugins/builtin/power/index.tsx +16 -0
  390. package/src/plugins/builtin/power/model.ts +89 -0
  391. package/src/plugins/builtin/power/pane.tsx +209 -0
  392. package/src/plugins/builtin/power/query.ts +25 -0
  393. package/src/plugins/builtin/relative-rotation/pane.tsx +3 -3
  394. package/src/plugins/builtin/research/analyst-pane.tsx +1 -1
  395. package/src/plugins/builtin/research/corporate-actions-pane.tsx +13 -4
  396. package/src/plugins/builtin/research/equity-diagnostic-pane.tsx +11 -9
  397. package/src/plugins/builtin/research-search/pane.tsx +21 -7
  398. package/src/plugins/builtin/revenue-breakdown/pane.tsx +1 -1
  399. package/src/plugins/builtin/reverse-dcf/client.ts +35 -0
  400. package/src/plugins/builtin/reverse-dcf/headless.ts +44 -0
  401. package/src/plugins/builtin/reverse-dcf/index.tsx +20 -0
  402. package/src/plugins/builtin/reverse-dcf/model.ts +87 -0
  403. package/src/plugins/builtin/reverse-dcf/pane.tsx +107 -0
  404. package/src/plugins/builtin/risk-factors/pane.tsx +6 -5
  405. package/src/plugins/builtin/scanner/denied.tsx +4 -2
  406. package/src/plugins/builtin/scanner/feed.ts +1 -0
  407. package/src/plugins/builtin/scanner/flow-pane.tsx +3 -2
  408. package/src/plugins/builtin/scanner/hilo-pane.tsx +1 -1
  409. package/src/plugins/builtin/seasonality/client.ts +4 -1
  410. package/src/plugins/builtin/sec/command-bar-search.ts +217 -0
  411. package/src/plugins/builtin/sec/forms.ts +54 -0
  412. package/src/plugins/builtin/sec/headless.ts +31 -5
  413. package/src/plugins/builtin/sec/index.tsx +67 -11
  414. package/src/plugins/builtin/sec/model.ts +35 -5
  415. package/src/plugins/builtin/sectors/headless.ts +1 -0
  416. package/src/plugins/builtin/sectors/index.tsx +72 -26
  417. package/src/plugins/builtin/shared/cloud-upgrade.ts +143 -39
  418. package/src/plugins/builtin/shared/pro-feature-wall.tsx +8 -4
  419. package/src/plugins/builtin/shared/research-cells.tsx +107 -0
  420. package/src/plugins/builtin/shared/series-list-detail.tsx +5 -1
  421. package/src/plugins/builtin/shared/ticker-request.ts +1 -1
  422. package/src/plugins/builtin/shared/wall-teaser-catalog.ts +80 -0
  423. package/src/plugins/builtin/shared/wall-teaser.tsx +192 -0
  424. package/src/plugins/builtin/shared/wall-view-lifecycle.ts +43 -0
  425. package/src/plugins/builtin/short-interest/index.tsx +31 -0
  426. package/src/plugins/builtin/short-interest/watch-client.ts +70 -0
  427. package/src/plugins/builtin/short-interest/watch-headless.ts +49 -0
  428. package/src/plugins/builtin/short-interest/watch-model.ts +185 -0
  429. package/src/plugins/builtin/short-interest/watch-pane.tsx +169 -0
  430. package/src/plugins/builtin/short-volume/pane.tsx +1 -1
  431. package/src/plugins/builtin/social-mentions/pane.tsx +1 -1
  432. package/src/plugins/builtin/supply-chain/client.ts +104 -0
  433. package/src/plugins/builtin/supply-chain/disclosure-quote.tsx +17 -0
  434. package/src/plugins/builtin/supply-chain/evidence.ts +88 -0
  435. package/src/plugins/builtin/supply-chain/flow-layout.ts +133 -0
  436. package/src/plugins/builtin/supply-chain/flow.tsx +323 -0
  437. package/src/plugins/builtin/supply-chain/graph-client.ts +83 -0
  438. package/src/plugins/builtin/supply-chain/graph-evidence.ts +25 -0
  439. package/src/plugins/builtin/supply-chain/graph-model.ts +45 -0
  440. package/src/plugins/builtin/supply-chain/graph-pane.tsx +218 -0
  441. package/src/plugins/builtin/supply-chain/graph.tsx +163 -0
  442. package/src/plugins/builtin/supply-chain/headless.ts +105 -0
  443. package/src/plugins/builtin/supply-chain/index.tsx +17 -0
  444. package/src/plugins/builtin/supply-chain/model.ts +145 -0
  445. package/src/plugins/builtin/supply-chain/pane.tsx +276 -0
  446. package/src/plugins/builtin/supply-chain/row-evidence.tsx +96 -0
  447. package/src/plugins/builtin/supply-chain/trust.ts +34 -0
  448. package/src/plugins/builtin/themes/client.ts +39 -0
  449. package/src/plugins/builtin/themes/headless.ts +38 -0
  450. package/src/plugins/builtin/themes/model.ts +92 -0
  451. package/src/plugins/builtin/themes/pane.tsx +125 -0
  452. package/src/plugins/builtin/thirteenf/pane.tsx +6 -15
  453. package/src/plugins/builtin/ticker-detail/data-panes/historical-prices.tsx +5 -6
  454. package/src/plugins/builtin/ticker-detail/data-panes/returns-model.ts +201 -0
  455. package/src/plugins/builtin/ticker-detail/data-panes/returns-pane.tsx +327 -0
  456. package/src/plugins/builtin/ticker-detail/financials/period-end-history.ts +5 -2
  457. package/src/plugins/builtin/ticker-detail/financials/ratios.ts +60 -12
  458. package/src/plugins/builtin/ticker-detail/financials/tab.tsx +2 -1
  459. package/src/plugins/builtin/ticker-detail/headless.ts +7 -2
  460. package/src/plugins/builtin/ticker-detail/index.tsx +22 -0
  461. package/src/plugins/builtin/ticker-detail/overview/components.tsx +53 -30
  462. package/src/plugins/builtin/ticker-detail/overview/pane.tsx +2 -0
  463. package/src/plugins/builtin/ticker-detail/overview-tab.tsx +112 -47
  464. package/src/plugins/builtin/ticker-detail/pane.tsx +50 -6
  465. package/src/plugins/builtin/ticker-detail/quote-monitor/card.tsx +21 -42
  466. package/src/plugins/builtin/ticker-detail/quote-monitor/index.tsx +3 -0
  467. package/src/plugins/builtin/time-sales/pane.tsx +1 -1
  468. package/src/plugins/builtin/world-indices/indices.ts +1 -0
  469. package/src/plugins/catalog-browser.ts +40 -0
  470. package/src/plugins/catalog-manifest.ts +3 -0
  471. package/src/plugins/catalog-ui.ts +6 -0
  472. package/src/plugins/current-target.ts +0 -9
  473. package/src/public/__snapshots__/public-api.test.ts.snap +1 -0
  474. package/src/renderers/browser/cloud-transport.ts +66 -1
  475. package/src/renderers/browser/main.tsx +2 -0
  476. package/src/renderers/dom/data-table/row.tsx +2 -0
  477. package/src/renderers/dom/desktop/controls.tsx +38 -25
  478. package/src/renderers/dom/desktop/icons.tsx +8 -0
  479. package/src/renderers/dom/host/chart-surface.tsx +36 -2
  480. package/src/renderers/dom/host/focus-scope.ts +11 -1
  481. package/src/renderers/dom/styles.css +28 -0
  482. package/src/renderers/electrobun/view/backend-rpc.ts +3 -2
  483. package/src/renderers/electrobun/view/cli-pane-shot-entry.tsx +1 -1
  484. package/src/renderers/electrobun/view/http-fetch.ts +2 -0
  485. package/src/renderers/electrobun/view/main.tsx +3 -1
  486. package/src/renderers/electrobun/view/rpc-timeout.ts +59 -0
  487. package/src/renderers/opentui/start.tsx +3 -0
  488. package/src/shares/api.ts +3 -1
  489. package/src/sources/gloomberb-cloud/index.ts +47 -13
  490. package/src/sources/history-result.ts +1 -0
  491. package/src/sources/history-retention.ts +16 -0
  492. package/src/sources/provider-router/history.ts +4 -2
  493. package/src/sources/sec-edgar/identity.ts +36 -0
  494. package/src/sources/sec-edgar.ts +1 -34
  495. package/src/state/app/context/index.tsx +8 -0
  496. package/src/sync/core-contributors.ts +20 -2
  497. package/src/telemetry/attention-counts.ts +164 -0
  498. package/src/telemetry/live-config.ts +7 -0
  499. package/src/test-support/rpc-loopback.ts +7 -3
  500. package/src/test-support/shell-pane-keys.tsx +34 -0
  501. package/src/tickers/instrument-kind.ts +12 -6
  502. package/src/tickers/open-target.ts +1 -1
  503. package/src/tickers/search/asset-classes.ts +91 -0
  504. package/src/tickers/search/index.ts +62 -15
  505. package/src/tickers/search/ranking.ts +22 -3
  506. package/src/tickers/search/upsert.ts +4 -1
  507. package/src/time-series/live-bars.ts +8 -3
  508. package/src/time-series/resolve.ts +224 -17
  509. package/src/time-series/spec.ts +1 -0
  510. package/src/time-series/types.ts +9 -1
  511. package/src/types/config.ts +23 -1
  512. package/src/types/data-provider.ts +2 -0
  513. package/src/types/headless.ts +17 -0
  514. package/src/types/price-history.ts +2 -0
  515. package/src/ui/host.tsx +6 -0
  516. package/src/utils/double-escape-close.ts +20 -0
  517. package/src/utils/exchanges.ts +1 -0
  518. package/src/utils/html-entities.ts +15 -0
  519. package/src/utils/http-proxy-response.ts +44 -7
  520. package/src/utils/plugin-proxy-hosts.json +3 -0
  521. package/src/utils/price-history.ts +35 -1
  522. package/src/utils/sec.ts +21 -2
  523. package/src/utils/text-wrap.ts +13 -8
  524. package/src/utils/zoned-date-time.ts +67 -0
@@ -0,0 +1,202 @@
1
+ type EvidenceTier = "structured" | "primary" | "secondary" | "imported";
2
+
3
+ export type ExposureRange = { low: number; high: number }
4
+ export type ExposureBasis =
5
+ | "revenue"
6
+ | "cost"
7
+ | "purchases"
8
+ | "receivables"
9
+ | "operating_income"
10
+ | "interest_expense"
11
+ | "debt"
12
+ type ExposureShockKind =
13
+ | "country"
14
+ | "commodity"
15
+ | "rate"
16
+ | "fx"
17
+ | "tariff"
18
+ | "supplier"
19
+ | "customer"
20
+ /** Percentages are percentage points. Weights alone are fractions of NAV. */
21
+ interface ExposureShock {
22
+ id: string
23
+ kind: ExposureShockKind
24
+ /** ISO country/currency code, commodity, or exact entity id/ticker/name. */
25
+ target: string
26
+ changePct?: number
27
+ changeBps?: number
28
+ /** Optional product restriction, e.g. a country export ban on semiconductors. */
29
+ products?: string[]
30
+ /** An explicit user assumption, never represented as a sourced disclosure. */
31
+ transmission?: {
32
+ basis: ExposureBasis
33
+ exposurePct: ExposureRange
34
+ /** Change in the denominator per unit change in the shock. */
35
+ factor: ExposureRange
36
+ direction?: 1 | -1
37
+ }
38
+ }
39
+ export interface ExposureScenario {
40
+ id?: string
41
+ label: string
42
+ shocks: ExposureShock[]
43
+ }
44
+ export interface ExposureHolding {
45
+ symbol: string
46
+ /** Signed fraction of NAV; 0.25 = 25%, -0.1 = 10% short. */
47
+ weight: number
48
+ }
49
+ export interface ExposureRequest {
50
+ holdings: ExposureHolding[]
51
+ scenario: ExposureScenario
52
+ depth?: number
53
+ /** Cash weight in NAV fractions, never used to renormalize holding weights. */
54
+ cashWeight?: number
55
+ }
56
+ export interface ExposureEvidence {
57
+ id: string
58
+ source: string
59
+ tier: EvidenceTier | "profile" | "user"
60
+ url: string | null
61
+ quote: string | null
62
+ asOf: string | null
63
+ period: string | null
64
+ units: string
65
+ currency: string | null
66
+ confidence: number | null
67
+ /** Corrections must supersede explicitly; adapters return the current revision. */
68
+ revision?: string | null
69
+ }
70
+ export interface ExposureExtensionObservation {
71
+ id: string
72
+ label: string
73
+ kind: "kpi" | "credit" | "guidance"
74
+ value: number | null
75
+ units: string
76
+ evidence: ExposureEvidence[]
77
+ currency?: string | null
78
+ period?: string | null
79
+ asOf?: string | null
80
+ basis?: string
81
+ dimensions?: Record<string, string>
82
+ qualifier?: string
83
+ range?: { low: number | null; high: number | null }
84
+ valueText?: string
85
+ status?: string
86
+ notes?: string[]
87
+ sensitivity?: {
88
+ kind: ExposureShockKind
89
+ target: string
90
+ basis: ExposureBasis
91
+ period: string
92
+ exposurePct: ExposureRange
93
+ factor: ExposureRange
94
+ direction: 1 | -1
95
+ } | null
96
+ }
97
+ interface ExposurePathHop {
98
+ from: { id: string; name: string; symbol: string | null; country: string | null }
99
+ to: { id: string; name: string; symbol: string | null; country: string | null }
100
+ evidence: ExposureEvidence[]
101
+ pct: number | null
102
+ basis: ExposureBasis | null
103
+ denominatorEntityId: string | null
104
+ }
105
+ export interface ExposureComponent {
106
+ id: string
107
+ shockId: string
108
+ label: string
109
+ channel: "geography" | "product" | "supplier" | "customer" | "profile" | "assumption" | "extension"
110
+ order: number
111
+ basis: ExposureBasis | null
112
+ period: string | null
113
+ classification: "disclosed" | "estimated" | "unknown"
114
+ exposurePct: ExposureRange | null
115
+ /** Estimated operating-denominator change; never a stock-return forecast. */
116
+ impactPct: ExposureRange | null
117
+ proportionalEstimatePct?: number | null
118
+ evidence: ExposureEvidence[]
119
+ path: ExposurePathHop[]
120
+ unknowns: string[]
121
+ /** Used only internally for validated disjoint revenue partitions. */
122
+ partition?: string | null
123
+ }
124
+ interface ExposureMeasure {
125
+ shockId: string
126
+ basis: ExposureBasis
127
+ period: string
128
+ exposurePct: ExposureRange
129
+ impactPct: ExposureRange | null
130
+ classification: "disclosed" | "estimated"
131
+ componentIds: string[]
132
+ /** True when an unquantified matching relationship prevents a complete bound. */
133
+ incomplete: boolean
134
+ }
135
+ interface ExposureHoldingResult {
136
+ symbol: string
137
+ name: string | null
138
+ weight: number
139
+ status: "quantified" | "partial" | "unknown"
140
+ measures: ExposureMeasure[]
141
+ components: ExposureComponent[]
142
+ extensions: ExposureExtensionObservation[]
143
+ unknowns: string[]
144
+ coverage: {
145
+ revenueRows: number
146
+ graphNodes: number
147
+ graphLinks: number
148
+ matchedPaths: number
149
+ quantifiedComponents: number
150
+ unknownComponents: number
151
+ graphComplete: boolean
152
+ oldestEvidenceAt: string | null
153
+ latestEvidenceAt: string | null
154
+ }
155
+ }
156
+ interface ExposurePortfolioMeasure {
157
+ shockId: string
158
+ basis: ExposureBasis
159
+ period: string
160
+ /** Holding-weighted operating exposure, in NAV-weighted percentage points. */
161
+ signedExposurePct: ExposureRange
162
+ grossExposurePct: ExposureRange
163
+ impactPct: ExposureRange | null
164
+ coveredGrossWeight: number
165
+ unknownGrossWeight: number
166
+ symbols: string[]
167
+ }
168
+ interface ExposureConcentration {
169
+ kind: "country" | "supplier" | "customer"
170
+ key: string
171
+ label: string
172
+ basis: ExposureBasis | null
173
+ period: string | null
174
+ grossExposurePct: ExposureRange | null
175
+ signedExposurePct: ExposureRange | null
176
+ grossHoldingWeight: number
177
+ symbols: string[]
178
+ evidence: ExposureEvidence[]
179
+ incomplete: boolean
180
+ }
181
+ export interface ExposurePayload {
182
+ version: 1
183
+ scenario: ExposureScenario
184
+ evaluatedAt: string
185
+ access: "full" | "preview"
186
+ depth: number
187
+ requestedHoldings: number
188
+ lockedHoldings: number
189
+ holdings: ExposureHoldingResult[]
190
+ portfolio: {
191
+ grossWeight: number
192
+ netWeight: number
193
+ cashWeight: number | null
194
+ /** 1 - net holding weights - explicit cash, financing/residual if not zero. */
195
+ residualWeight: number
196
+ measures: ExposurePortfolioMeasure[]
197
+ concentrations: ExposureConcentration[]
198
+ unknownGrossWeight: number
199
+ }
200
+ unknowns: string[]
201
+ methodology: string[]
202
+ }
@@ -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,6 +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);
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);
724
799
  getCloudTape = this.data.getCloudTape.bind(this.data);
725
800
  getCloudYieldCurve = this.data.getCloudYieldCurve.bind(this.data);
726
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[] {
@@ -13,6 +13,8 @@ export type CloudHistoryParams = {
13
13
  endDate?: string;
14
14
  rangeKey?: string;
15
15
  historyRecovery?: HistoryRetention;
16
+ /** Ask for pre-market and after-hours bars too. */
17
+ session?: "extended";
16
18
  };
17
19
 
18
20
  export type CloudFredSeriesParams = {
@@ -172,6 +174,7 @@ export function cloudHistoryPath(
172
174
  if (params.endDate) search.set("endDate", params.endDate);
173
175
  if (params.rangeKey) search.set("rangeKey", params.rangeKey);
174
176
  if (params.historyRecovery) search.set("historyRecovery", JSON.stringify(params.historyRecovery));
177
+ if (params.session) search.set("session", params.session);
175
178
  return appendQuery("/market/history", search);
176
179
  }
177
180