gloomberb 0.15.8 → 0.16.1

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 (582) 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 +204 -5
  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 +80 -3
  18. package/src/api-client/members.ts +26 -0
  19. package/src/api-client/normalizers.ts +31 -1
  20. package/src/api-client/perps.ts +131 -0
  21. package/src/api-client/power.ts +148 -0
  22. package/src/api-client/request.ts +58 -1
  23. package/src/api-client/research-activity.ts +172 -13
  24. package/src/api-client/socket.ts +75 -27
  25. package/src/api-client/supply-chain-graph.ts +40 -0
  26. package/src/api-client/supply-chain.ts +98 -0
  27. package/src/api-client/telemetry.ts +29 -0
  28. package/src/api-client/themes.ts +28 -0
  29. package/src/api-client/types.ts +38 -2
  30. package/src/api-client/wall-experiments.ts +100 -0
  31. package/src/api-client/wall-summary.ts +49 -0
  32. package/src/api-client/web-experiments.ts +136 -0
  33. package/src/app/global-shortcuts.ts +14 -6
  34. package/src/app/keybindings/actions.ts +1 -1
  35. package/src/app/pane-runtime/plugin-bindings.ts +5 -0
  36. package/src/app/pane-runtime/ticker-open-runtime.ts +8 -2
  37. package/src/app/runtime/update.ts +51 -3
  38. package/src/app.tsx +10 -6
  39. package/src/cli/commands/system.ts +2 -0
  40. package/src/cli/desktop-pane-shot.ts +3 -4
  41. package/src/cli/pane-functions/data.ts +78 -0
  42. package/src/cli/pane-functions/financial-ratio-shot.ts +160 -0
  43. package/src/cli/pane-functions/function-help.ts +214 -10
  44. package/src/cli/pane-functions/headless.ts +4 -0
  45. package/src/cli/pane-functions/screenshot-evidence.ts +21 -0
  46. package/src/cli/pane-functions/screenshot.ts +49 -5
  47. package/src/components/chart-table/index.ts +1 -0
  48. package/src/components/chart-table/layout.ts +15 -0
  49. package/src/components/command-bar/action-runtime.ts +1 -0
  50. package/src/components/command-bar/commands/collection.ts +5 -1
  51. package/src/components/command-bar/commands/direct/index.ts +32 -0
  52. package/src/components/command-bar/commands/registry.ts +7 -0
  53. package/src/components/command-bar/pane-templates/items.ts +11 -0
  54. package/src/components/command-bar/pane-templates/workflow.ts +19 -4
  55. package/src/components/command-bar/routes/root/command-items.ts +15 -2
  56. package/src/components/command-bar/routes/root/plugin-install.ts +2 -2
  57. package/src/components/command-bar/routes/root/provider-search.ts +21 -5
  58. package/src/components/command-bar/routes/root/results.ts +64 -0
  59. package/src/components/command-bar/routes/root/runtime.ts +22 -5
  60. package/src/components/command-bar/routes/ticker-search/results.ts +116 -25
  61. package/src/components/command-bar/routes/ticker-search/route.ts +4 -2
  62. package/src/components/command-bar/routing/actions.ts +2 -0
  63. package/src/components/command-bar/selection-runtime.ts +38 -0
  64. package/src/components/command-bar/surface/index.tsx +22 -2
  65. package/src/components/command-bar/view-model.ts +3 -0
  66. package/src/components/command-bar/workflow/ops.ts +19 -0
  67. package/src/components/command-bar/workflow/tickers.ts +5 -0
  68. package/src/components/company-logo.tsx +15 -2
  69. package/src/components/data-table/table-pane.ts +2 -1
  70. package/src/components/index.ts +3 -2
  71. package/src/components/layout/detached-pane-shell.tsx +12 -1
  72. package/src/components/layout/floating-pane.tsx +6 -0
  73. package/src/components/layout/header.tsx +24 -7
  74. package/src/components/layout/missing-pane.tsx +87 -23
  75. package/src/components/layout/pane/footer/index.tsx +64 -18
  76. package/src/components/layout/pane/footer/model.ts +85 -0
  77. package/src/components/layout/pane/header.tsx +63 -30
  78. package/src/components/layout/pane/index.tsx +6 -0
  79. package/src/components/layout/pane/sidebar.tsx +19 -1
  80. package/src/components/layout/pane/title.ts +31 -7
  81. package/src/components/layout/shell/drag/index.ts +6 -5
  82. package/src/components/layout/shell/drag/runtime.ts +3 -0
  83. package/src/components/layout/shell/index.tsx +6 -0
  84. package/src/components/layout/shell/pane/layers.tsx +15 -7
  85. package/src/components/layout/shell/pane/management-shortcuts.ts +13 -1
  86. package/src/components/layout/shell/terminal-pointer-runtime.ts +24 -3
  87. package/src/components/layout/shell/ticker-link-menu.ts +23 -9
  88. package/src/components/layout/status-bar.tsx +93 -28
  89. package/src/components/layout/status-widget-space.ts +72 -0
  90. package/src/components/metric-treemap/heat-surface.tsx +718 -0
  91. package/src/components/metric-treemap/heat-tiles.ts +210 -0
  92. package/src/components/metric-treemap/index.tsx +2 -0
  93. package/src/components/metric-treemap/layout.ts +6 -0
  94. package/src/components/metric-treemap/scene.ts +432 -0
  95. package/src/components/onboarding/first-run-workspace.ts +8 -2
  96. package/src/components/onboarding/onboarding-wizard.tsx +35 -16
  97. package/src/components/pane-settings-dialog/field-dialogs.tsx +1 -0
  98. package/src/components/price-performance.tsx +31 -34
  99. package/src/components/toggle-list.tsx +38 -12
  100. package/src/components/ui/country-flag-art.tsx +449 -0
  101. package/src/components/ui/country-flag.tsx +41 -0
  102. package/src/components/ui/data-table/index.tsx +11 -8
  103. package/src/components/ui/data-table/types.ts +13 -0
  104. package/src/components/ui/display.tsx +9 -3
  105. package/src/components/ui/figure.tsx +94 -0
  106. package/src/components/ui/icon.tsx +5 -1
  107. package/src/components/ui/index.ts +4 -0
  108. package/src/components/ui/message-composer.tsx +8 -1
  109. package/src/components/ui/multi-select/dialog.tsx +108 -22
  110. package/src/components/ui/range-track.tsx +46 -0
  111. package/src/components/ui/ratio-bar.tsx +84 -0
  112. package/src/components/ui/tabs.tsx +4 -0
  113. package/src/components/ui/toggle.tsx +3 -1
  114. package/src/components/use-scrollbox-layout.ts +17 -0
  115. package/src/core/state/app/layout.ts +35 -1
  116. package/src/core/state/app/state.ts +15 -0
  117. package/src/core/state/app/types.ts +11 -1
  118. package/src/data/config/store/normalize.ts +24 -0
  119. package/src/i18n/es.ts +6 -3
  120. package/src/i18n/ja.ts +6 -3
  121. package/src/i18n/ko.ts +6 -3
  122. package/src/i18n/zh-cn.ts +6 -3
  123. package/src/i18n/zh-tw.ts +6 -3
  124. package/src/layout/ticker-navigation.ts +28 -2
  125. package/src/layout-marketplace/pane-imagery.ts +1 -0
  126. package/src/market-data/coordinator/entries.ts +13 -0
  127. package/src/market-data/coordinator/financials.ts +33 -8
  128. package/src/market-data/market/freshness.ts +16 -5
  129. package/src/market-data/published-cn-sessions.ts +25 -0
  130. package/src/market-data/published-nse-sessions.ts +20 -0
  131. package/src/market-data/quotes/contributions.ts +6 -0
  132. package/src/market-data/quotes/freshness.ts +36 -0
  133. package/src/market-data/quotes/resolution.ts +22 -8
  134. package/src/market-data/quotes/time.ts +16 -0
  135. package/src/news/aggregator.ts +4 -0
  136. package/src/plugins/builtin/account-management/model.ts +6 -1
  137. package/src/plugins/builtin/account-management/pane.tsx +36 -25
  138. package/src/plugins/builtin/alerts/catalysts.ts +77 -0
  139. package/src/plugins/builtin/alerts/events-pane.tsx +3 -0
  140. package/src/plugins/builtin/alerts/events.ts +10 -4
  141. package/src/plugins/builtin/alerts/history-pane.tsx +1 -1
  142. package/src/plugins/builtin/alerts/history.ts +1 -0
  143. package/src/plugins/builtin/alerts/index.tsx +6 -0
  144. package/src/plugins/builtin/alerts/research-builder.ts +10 -3
  145. package/src/plugins/builtin/alerts/research-rules.ts +15 -1
  146. package/src/plugins/builtin/analytics/risk-client.ts +197 -59
  147. package/src/plugins/builtin/analytics/risk-headless.ts +141 -30
  148. package/src/plugins/builtin/analytics/risk-math.ts +33 -13
  149. package/src/plugins/builtin/analytics/risk-model.ts +250 -60
  150. package/src/plugins/builtin/analytics/risk-pane.tsx +61 -30
  151. package/src/plugins/builtin/analytics/risk-test-data.ts +182 -0
  152. package/src/plugins/builtin/attention/client.ts +80 -0
  153. package/src/plugins/builtin/attention/evidence.ts +30 -0
  154. package/src/plugins/builtin/attention/headless.ts +33 -0
  155. package/src/plugins/builtin/attention/index.tsx +18 -0
  156. package/src/plugins/builtin/attention/model.ts +59 -0
  157. package/src/plugins/builtin/attention/pane.tsx +211 -0
  158. package/src/plugins/builtin/attention/trending.tsx +59 -0
  159. package/src/plugins/builtin/awards/alerts.ts +32 -0
  160. package/src/plugins/builtin/awards/client.ts +82 -0
  161. package/src/plugins/builtin/awards/detail.tsx +107 -0
  162. package/src/plugins/builtin/awards/evidence.ts +36 -0
  163. package/src/plugins/builtin/awards/headless.ts +55 -0
  164. package/src/plugins/builtin/awards/index.tsx +20 -0
  165. package/src/plugins/builtin/awards/model.ts +42 -0
  166. package/src/plugins/builtin/awards/pane.tsx +263 -0
  167. package/src/plugins/builtin/buildout/cells.tsx +15 -12
  168. package/src/plugins/builtin/buildout/detail/company.tsx +3 -3
  169. package/src/plugins/builtin/buildout/detail/index.tsx +0 -1
  170. package/src/plugins/builtin/buildout/detail/intel.tsx +6 -6
  171. package/src/plugins/builtin/buildout/detail/site.tsx +4 -7
  172. package/src/plugins/builtin/buildout/detail/ui.tsx +0 -19
  173. package/src/plugins/builtin/catalysts/client.ts +28 -0
  174. package/src/plugins/builtin/catalysts/detail.tsx +88 -0
  175. package/src/plugins/builtin/catalysts/evidence.ts +47 -0
  176. package/src/plugins/builtin/catalysts/headless.ts +42 -0
  177. package/src/plugins/builtin/catalysts/history.ts +26 -0
  178. package/src/plugins/builtin/catalysts/index.tsx +29 -0
  179. package/src/plugins/builtin/catalysts/model.ts +135 -0
  180. package/src/plugins/builtin/catalysts/pane.tsx +161 -0
  181. package/src/plugins/builtin/cds/index.tsx +1 -0
  182. package/src/plugins/builtin/chart-composer/index.tsx +8 -1
  183. package/src/plugins/builtin/chat/attachments/desktop.tsx +610 -0
  184. package/src/plugins/builtin/chat/attachments/files.ts +45 -0
  185. package/src/plugins/builtin/chat/attachments/model.ts +164 -0
  186. package/src/plugins/builtin/chat/attachments/terminal.tsx +72 -0
  187. package/src/plugins/builtin/chat/attachments/transfer.ts +165 -0
  188. package/src/plugins/builtin/chat/content/channel-navigation.ts +13 -12
  189. package/src/plugins/builtin/chat/content/composer-runtime.ts +25 -4
  190. package/src/plugins/builtin/chat/content/composer.tsx +46 -4
  191. package/src/plugins/builtin/chat/content/footer.tsx +46 -8
  192. package/src/plugins/builtin/chat/content/index.tsx +263 -62
  193. package/src/plugins/builtin/chat/content/layout-metrics.ts +10 -2
  194. package/src/plugins/builtin/chat/content/open-targets.ts +17 -3
  195. package/src/plugins/builtin/chat/content/scroll.ts +7 -1
  196. package/src/plugins/builtin/chat/content/shortcuts.ts +36 -11
  197. package/src/plugins/builtin/chat/content/snapshot.ts +3 -0
  198. package/src/plugins/builtin/chat/content/transcript.tsx +17 -1
  199. package/src/plugins/builtin/chat/content/types.ts +7 -0
  200. package/src/plugins/builtin/chat/controller/attachments.ts +213 -0
  201. package/src/plugins/builtin/chat/controller/connections.ts +3 -1
  202. package/src/plugins/builtin/chat/controller/index.ts +114 -2
  203. package/src/plugins/builtin/chat/controller/lifecycle.ts +9 -0
  204. package/src/plugins/builtin/chat/controller/messages.ts +35 -2
  205. package/src/plugins/builtin/chat/controller/send.ts +128 -25
  206. package/src/plugins/builtin/chat/controller/state.ts +12 -1
  207. package/src/plugins/builtin/chat/controller/utils.ts +7 -5
  208. package/src/plugins/builtin/chat/controller/view.ts +2 -0
  209. package/src/plugins/builtin/chat/index.tsx +21 -0
  210. package/src/plugins/builtin/chat/layout.ts +9 -4
  211. package/src/plugins/builtin/chat/message/desktop.tsx +55 -20
  212. package/src/plugins/builtin/chat/message/header.tsx +30 -5
  213. package/src/plugins/builtin/chat/message/inline-tokens.tsx +9 -0
  214. package/src/plugins/builtin/chat/message/pending-send.ts +35 -0
  215. package/src/plugins/builtin/chat/message/profile-popover.tsx +5 -1
  216. package/src/plugins/builtin/chat/message/render-state.ts +12 -2
  217. package/src/plugins/builtin/chat/message/terminal.tsx +51 -4
  218. package/src/plugins/builtin/chat/message/types.ts +6 -1
  219. package/src/plugins/builtin/chat/pane-state.ts +59 -1
  220. package/src/plugins/builtin/chat/profile-popover.ts +50 -1
  221. package/src/plugins/builtin/chat/sidebar.tsx +8 -3
  222. package/src/plugins/builtin/chat/status-widget.tsx +29 -12
  223. package/src/plugins/builtin/chat/unread-inbox-pane.tsx +143 -0
  224. package/src/plugins/builtin/chat/unread-inbox.ts +91 -0
  225. package/src/plugins/builtin/clinical-trials/client.ts +237 -0
  226. package/src/plugins/builtin/clinical-trials/index.tsx +74 -0
  227. package/src/plugins/builtin/clinical-trials/pane.tsx +225 -0
  228. package/src/plugins/builtin/clinical-trials/types.ts +2 -0
  229. package/src/plugins/builtin/cloud/askg/controller.ts +37 -6
  230. package/src/plugins/builtin/cloud/askg/executor.ts +59 -44
  231. package/src/plugins/builtin/cloud/askg/host.ts +8 -1
  232. package/src/plugins/builtin/cloud/askg/manifest.ts +29 -2
  233. package/src/plugins/builtin/cloud/askg/model.ts +47 -13
  234. package/src/plugins/builtin/cloud/askg/notes.ts +100 -0
  235. package/src/plugins/builtin/cloud/askg/pane.tsx +50 -14
  236. package/src/plugins/builtin/cloud/askg/protocol.ts +39 -1
  237. package/src/plugins/builtin/cloud/askg/result-budget.ts +156 -0
  238. package/src/plugins/builtin/cloud/askg/user-data.ts +89 -0
  239. package/src/plugins/builtin/cloud/auth-actions.tsx +55 -31
  240. package/src/plugins/builtin/cloud/plugin.tsx +4 -1
  241. package/src/plugins/builtin/cloud/team/pane-sections.tsx +10 -1
  242. package/src/plugins/builtin/cloud/team/pane.tsx +3 -2
  243. package/src/plugins/builtin/cloud/thesis/board-pane.tsx +2 -2
  244. package/src/plugins/builtin/cloud/thesis/detail.tsx +1 -1
  245. package/src/plugins/builtin/cloud/thesis/ticker-tab.tsx +2 -2
  246. package/src/plugins/builtin/cloud/trial-offer-status-widget.tsx +202 -0
  247. package/src/plugins/builtin/cloud/upgrade-command.ts +1 -1
  248. package/src/plugins/builtin/cloud/upgrade-dialog.tsx +29 -3
  249. package/src/plugins/builtin/cloud/upgrade-status-widget.tsx +1 -1
  250. package/src/plugins/builtin/cloud-tweets/table.tsx +1 -1
  251. package/src/plugins/builtin/comment-letters/client.ts +342 -0
  252. package/src/plugins/builtin/comment-letters/index.tsx +74 -0
  253. package/src/plugins/builtin/comment-letters/pane.tsx +295 -0
  254. package/src/plugins/builtin/comment-letters/types.ts +43 -0
  255. package/src/plugins/builtin/company-attention/app-rank.tsx +79 -0
  256. package/src/plugins/builtin/company-attention/client.ts +69 -0
  257. package/src/plugins/builtin/company-attention/evidence.ts +45 -0
  258. package/src/plugins/builtin/company-attention/headless.ts +47 -0
  259. package/src/plugins/builtin/company-attention/index.tsx +30 -0
  260. package/src/plugins/builtin/company-attention/model.ts +129 -0
  261. package/src/plugins/builtin/company-attention/pane.tsx +183 -0
  262. package/src/plugins/builtin/company-kpis/client.ts +92 -0
  263. package/src/plugins/builtin/company-kpis/headless.ts +32 -0
  264. package/src/plugins/builtin/company-kpis/index.tsx +26 -0
  265. package/src/plugins/builtin/company-kpis/model.ts +124 -0
  266. package/src/plugins/builtin/company-kpis/pane.tsx +226 -0
  267. package/src/plugins/builtin/company-kpis/related.ts +11 -0
  268. package/src/plugins/builtin/company-kpis/screenshot-evidence.ts +44 -0
  269. package/src/plugins/builtin/composite-plugins.ts +32 -0
  270. package/src/plugins/builtin/correlation/history.ts +4 -1
  271. package/src/plugins/builtin/correlation/index.tsx +139 -80
  272. package/src/plugins/builtin/correlation/matrix/pair-chart.tsx +48 -0
  273. package/src/plugins/builtin/correlation/matrix/selection.ts +77 -0
  274. package/src/plugins/builtin/correlation/relationship/model.ts +2 -2
  275. package/src/plugins/builtin/cpi/client.ts +66 -0
  276. package/src/plugins/builtin/cpi/headless.ts +78 -0
  277. package/src/plugins/builtin/cpi/index.tsx +31 -0
  278. package/src/plugins/builtin/cpi/model.ts +198 -0
  279. package/src/plugins/builtin/cpi/pane.tsx +157 -0
  280. package/src/plugins/builtin/credit-documents/client.ts +99 -0
  281. package/src/plugins/builtin/credit-documents/detail.tsx +109 -0
  282. package/src/plugins/builtin/credit-documents/evidence.ts +64 -0
  283. package/src/plugins/builtin/credit-documents/gauge.tsx +55 -0
  284. package/src/plugins/builtin/credit-documents/headless.ts +40 -0
  285. package/src/plugins/builtin/credit-documents/index.tsx +19 -0
  286. package/src/plugins/builtin/credit-documents/model.ts +336 -0
  287. package/src/plugins/builtin/credit-documents/pane.tsx +185 -0
  288. package/src/plugins/builtin/custom-view/view-spec.ts +14 -2
  289. package/src/plugins/builtin/debt-maturities/pane.tsx +1 -0
  290. package/src/plugins/builtin/debt-maturities/wall-bar.tsx +14 -41
  291. package/src/plugins/builtin/dividend-yield/client.ts +4 -2
  292. package/src/plugins/builtin/dividend-yield/pane.tsx +1 -1
  293. package/src/plugins/builtin/earnings/board.tsx +3 -0
  294. package/src/plugins/builtin/earnings/client.ts +2 -2
  295. package/src/plugins/builtin/earnings/index.tsx +2 -0
  296. package/src/plugins/builtin/earnings-calls/index.tsx +1 -0
  297. package/src/plugins/builtin/earnings-calls/pane.tsx +7 -1
  298. package/src/plugins/builtin/earnings-ripple/client.ts +60 -0
  299. package/src/plugins/builtin/earnings-ripple/headless.ts +35 -0
  300. package/src/plugins/builtin/earnings-ripple/index.tsx +35 -0
  301. package/src/plugins/builtin/earnings-ripple/model.ts +98 -0
  302. package/src/plugins/builtin/earnings-ripple/pane.tsx +103 -0
  303. package/src/plugins/builtin/equity-screener/client.ts +1 -1
  304. package/src/plugins/builtin/equity-screener/criterion-editor.tsx +1 -1
  305. package/src/plugins/builtin/equity-screener/model.ts +74 -9
  306. package/src/plugins/builtin/equity-screener/pane.tsx +2 -0
  307. package/src/plugins/builtin/estimate-revisions/pane.tsx +3 -0
  308. package/src/plugins/builtin/executives/pane.tsx +3 -1
  309. package/src/plugins/builtin/exposure/charts.tsx +66 -0
  310. package/src/plugins/builtin/exposure/client.ts +53 -0
  311. package/src/plugins/builtin/exposure/drivers.ts +29 -0
  312. package/src/plugins/builtin/exposure/editor.tsx +61 -0
  313. package/src/plugins/builtin/exposure/evidence.ts +39 -0
  314. package/src/plugins/builtin/exposure/headless.ts +51 -0
  315. package/src/plugins/builtin/exposure/holdings.ts +56 -0
  316. package/src/plugins/builtin/exposure/index.tsx +13 -0
  317. package/src/plugins/builtin/exposure/model.ts +104 -0
  318. package/src/plugins/builtin/exposure/pane.tsx +247 -0
  319. package/src/plugins/builtin/fear-greed/pane.tsx +2 -9
  320. package/src/plugins/builtin/filing-events/pane.tsx +2 -1
  321. package/src/plugins/builtin/fx-matrix/direction.ts +81 -0
  322. package/src/plugins/builtin/fx-matrix/index.tsx +71 -33
  323. package/src/plugins/builtin/fx-matrix/live-legs.ts +17 -0
  324. package/src/plugins/builtin/fx-matrix/pairs.ts +68 -14
  325. package/src/plugins/builtin/fx-matrix/settings.ts +62 -0
  326. package/src/plugins/builtin/gpu/board.tsx +163 -0
  327. package/src/plugins/builtin/gpu/changes.tsx +94 -0
  328. package/src/plugins/builtin/gpu/client.ts +130 -0
  329. package/src/plugins/builtin/gpu/equities.tsx +112 -0
  330. package/src/plugins/builtin/gpu/headless.ts +67 -0
  331. package/src/plugins/builtin/gpu/history.tsx +140 -0
  332. package/src/plugins/builtin/gpu/index.tsx +18 -0
  333. package/src/plugins/builtin/gpu/ladder.tsx +127 -0
  334. package/src/plugins/builtin/gpu/model.ts +317 -0
  335. package/src/plugins/builtin/gpu/pane.tsx +63 -0
  336. package/src/plugins/builtin/help/index.tsx +19 -2
  337. package/src/plugins/builtin/holders/pane.tsx +4 -8
  338. package/src/plugins/builtin/insider/detail.tsx +119 -0
  339. package/src/plugins/builtin/insider/display.ts +221 -0
  340. package/src/plugins/builtin/insider/headless.ts +24 -3
  341. package/src/plugins/builtin/insider/index.tsx +206 -108
  342. package/src/plugins/builtin/insider/insider-data.ts +31 -3
  343. package/src/plugins/builtin/insider/model.ts +53 -4
  344. package/src/plugins/builtin/insider/table-model.ts +226 -0
  345. package/src/plugins/builtin/insider/table.tsx +79 -0
  346. package/src/plugins/builtin/iv-history/screen-pane.tsx +1 -1
  347. package/src/plugins/builtin/jobs/index.tsx +1 -0
  348. package/src/plugins/builtin/jobs/pane.tsx +14 -7
  349. package/src/plugins/builtin/jobs/share-bars.tsx +5 -28
  350. package/src/plugins/builtin/macro-day/client.ts +50 -0
  351. package/src/plugins/builtin/macro-day/headless.ts +51 -0
  352. package/src/plugins/builtin/macro-day/index.tsx +21 -0
  353. package/src/plugins/builtin/macro-day/model.ts +137 -0
  354. package/src/plugins/builtin/macro-day/pane.tsx +118 -0
  355. package/src/plugins/builtin/macro-day/releases.ts +58 -0
  356. package/src/plugins/builtin/market-halts/model.ts +30 -17
  357. package/src/plugins/builtin/market-halts/pane.tsx +15 -21
  358. package/src/plugins/builtin/market-heatmap/data.ts +29 -3
  359. package/src/plugins/builtin/market-heatmap/index.tsx +438 -119
  360. package/src/plugins/builtin/market-heatmap/live.ts +88 -0
  361. package/src/plugins/builtin/market-heatmap/portfolio.ts +240 -0
  362. package/src/plugins/builtin/market-movers/client.ts +3 -2
  363. package/src/plugins/builtin/market-movers/headless.ts +8 -1
  364. package/src/plugins/builtin/market-movers/index.tsx +1 -0
  365. package/src/plugins/builtin/market-movers/screener.ts +18 -5
  366. package/src/plugins/builtin/market-movers/session-body.tsx +5 -2
  367. package/src/plugins/builtin/members/client.ts +36 -0
  368. package/src/plugins/builtin/members/headless.ts +33 -0
  369. package/src/plugins/builtin/members/index.tsx +20 -0
  370. package/src/plugins/builtin/members/model.ts +60 -0
  371. package/src/plugins/builtin/members/pane.tsx +168 -0
  372. package/src/plugins/builtin/mna/distress/client.ts +326 -0
  373. package/src/plugins/builtin/mna/distress/detail.tsx +247 -0
  374. package/src/plugins/builtin/mna/distress/headless.ts +257 -0
  375. package/src/plugins/builtin/mna/distress/model.ts +427 -0
  376. package/src/plugins/builtin/mna/distress/pane.tsx +606 -0
  377. package/src/plugins/builtin/mna/index.tsx +17 -1
  378. package/src/plugins/builtin/mna/pane.tsx +47 -3
  379. package/src/plugins/builtin/news/index.tsx +62 -16
  380. package/src/plugins/builtin/news/wire/filter-articles.ts +54 -0
  381. package/src/plugins/builtin/news/wire/index.tsx +37 -3
  382. package/src/plugins/builtin/news/wire/industry-pane.tsx +29 -13
  383. package/src/plugins/builtin/news/wire/mutes.ts +253 -0
  384. package/src/plugins/builtin/news/wire/news/command-bar-search.ts +117 -0
  385. package/src/plugins/builtin/news/wire/news/footer.ts +4 -0
  386. package/src/plugins/builtin/news/wire/news/list-search.ts +34 -0
  387. package/src/plugins/builtin/news/wire/news/pop-out.tsx +158 -0
  388. package/src/plugins/builtin/news/wire/news/preset-pane.tsx +64 -19
  389. package/src/plugins/builtin/openfda/client.ts +300 -0
  390. package/src/plugins/builtin/openfda/index.tsx +71 -0
  391. package/src/plugins/builtin/openfda/pane.tsx +382 -0
  392. package/src/plugins/builtin/openfda/types.ts +76 -0
  393. package/src/plugins/builtin/options/footer.ts +1 -0
  394. package/src/plugins/builtin/options/index.tsx +2 -1
  395. package/src/plugins/builtin/options-calculator/pane.tsx +0 -1
  396. package/src/plugins/builtin/options-positioning/index.tsx +4 -2
  397. package/src/plugins/builtin/options-positioning/pane.tsx +1 -1
  398. package/src/plugins/builtin/pe-band/client.ts +88 -0
  399. package/src/plugins/builtin/pe-band/headless.ts +51 -0
  400. package/src/plugins/builtin/pe-band/index.tsx +20 -0
  401. package/src/plugins/builtin/pe-band/model.ts +271 -0
  402. package/src/plugins/builtin/pe-band/pane.tsx +160 -0
  403. package/src/plugins/builtin/pe-band/report-dates.ts +78 -0
  404. package/src/plugins/builtin/perps/client.ts +80 -0
  405. package/src/plugins/builtin/perps/equity-identity.ts +16 -0
  406. package/src/plugins/builtin/perps/equity-row.tsx +30 -0
  407. package/src/plugins/builtin/perps/headless.ts +34 -0
  408. package/src/plugins/builtin/perps/index.tsx +14 -0
  409. package/src/plugins/builtin/perps/model.ts +58 -0
  410. package/src/plugins/builtin/perps/pane.tsx +185 -0
  411. package/src/plugins/builtin/plugin-marketplace/activation.ts +19 -0
  412. package/src/plugins/builtin/plugin-marketplace/pane.tsx +2 -3
  413. package/src/plugins/builtin/plugin-marketplace/store.ts +2 -0
  414. package/src/plugins/builtin/portfolio-list/cli/render.ts +177 -87
  415. package/src/plugins/builtin/portfolio-list/headless.ts +237 -0
  416. package/src/plugins/builtin/portfolio-list/index.tsx +2 -0
  417. package/src/plugins/builtin/portfolio-list/mutations.ts +17 -0
  418. package/src/plugins/builtin/portfolio-list/pane/data.ts +17 -0
  419. package/src/plugins/builtin/portfolio-list/pane/index.tsx +88 -5
  420. package/src/plugins/builtin/portfolio-list/pane/remove-ticker.ts +85 -0
  421. package/src/plugins/builtin/portfolio-list/pane/streaming.ts +18 -12
  422. package/src/plugins/builtin/portfolio-list/quick-add/index.tsx +49 -2
  423. package/src/plugins/builtin/portfolio-list/quick-add/resolution.ts +48 -5
  424. package/src/plugins/builtin/power/client.ts +100 -0
  425. package/src/plugins/builtin/power/detail.tsx +82 -0
  426. package/src/plugins/builtin/power/evidence.ts +56 -0
  427. package/src/plugins/builtin/power/generation.tsx +37 -0
  428. package/src/plugins/builtin/power/headless.ts +43 -0
  429. package/src/plugins/builtin/power/index.tsx +16 -0
  430. package/src/plugins/builtin/power/model.ts +89 -0
  431. package/src/plugins/builtin/power/pane.tsx +209 -0
  432. package/src/plugins/builtin/power/query.ts +25 -0
  433. package/src/plugins/builtin/relative-rotation/pane.tsx +3 -3
  434. package/src/plugins/builtin/research/analyst-pane.tsx +1 -1
  435. package/src/plugins/builtin/research/corporate-actions-pane.tsx +13 -4
  436. package/src/plugins/builtin/research/equity-diagnostic-pane.tsx +5 -3
  437. package/src/plugins/builtin/research-search/pane.tsx +21 -7
  438. package/src/plugins/builtin/revenue-breakdown/pane.tsx +1 -1
  439. package/src/plugins/builtin/reverse-dcf/client.ts +35 -0
  440. package/src/plugins/builtin/reverse-dcf/headless.ts +44 -0
  441. package/src/plugins/builtin/reverse-dcf/index.tsx +20 -0
  442. package/src/plugins/builtin/reverse-dcf/model.ts +87 -0
  443. package/src/plugins/builtin/reverse-dcf/pane.tsx +107 -0
  444. package/src/plugins/builtin/risk-factors/pane.tsx +2 -1
  445. package/src/plugins/builtin/scanner/denied.tsx +4 -2
  446. package/src/plugins/builtin/scanner/feed.ts +1 -0
  447. package/src/plugins/builtin/scanner/flow-pane.tsx +3 -2
  448. package/src/plugins/builtin/scanner/hilo-bars.tsx +12 -70
  449. package/src/plugins/builtin/scanner/hilo-model.ts +0 -18
  450. package/src/plugins/builtin/scanner/hilo-pane.tsx +1 -1
  451. package/src/plugins/builtin/seasonality/client.ts +4 -1
  452. package/src/plugins/builtin/sec/command-bar-search.ts +217 -0
  453. package/src/plugins/builtin/sec/forms.ts +54 -0
  454. package/src/plugins/builtin/sec/headless.ts +31 -5
  455. package/src/plugins/builtin/sec/index.tsx +67 -11
  456. package/src/plugins/builtin/sec/model.ts +35 -5
  457. package/src/plugins/builtin/sectors/headless.ts +1 -0
  458. package/src/plugins/builtin/sectors/index.tsx +72 -26
  459. package/src/plugins/builtin/sectors/move-bar.tsx +10 -32
  460. package/src/plugins/builtin/shared/cloud-upgrade.ts +143 -39
  461. package/src/plugins/builtin/shared/pro-feature-wall.tsx +8 -4
  462. package/src/plugins/builtin/shared/research-cells.tsx +107 -0
  463. package/src/plugins/builtin/shared/series-list-detail.tsx +5 -1
  464. package/src/plugins/builtin/shared/wall-teaser-catalog.ts +80 -0
  465. package/src/plugins/builtin/shared/wall-teaser.tsx +192 -0
  466. package/src/plugins/builtin/shared/wall-view-lifecycle.ts +43 -0
  467. package/src/plugins/builtin/short-interest/index.tsx +31 -0
  468. package/src/plugins/builtin/short-interest/watch-client.ts +70 -0
  469. package/src/plugins/builtin/short-interest/watch-headless.ts +49 -0
  470. package/src/plugins/builtin/short-interest/watch-model.ts +185 -0
  471. package/src/plugins/builtin/short-interest/watch-pane.tsx +169 -0
  472. package/src/plugins/builtin/short-volume/pane.tsx +1 -1
  473. package/src/plugins/builtin/social-mentions/index.tsx +1 -1
  474. package/src/plugins/builtin/social-mentions/pane.tsx +1 -1
  475. package/src/plugins/builtin/supply-chain/client.ts +104 -0
  476. package/src/plugins/builtin/supply-chain/disclosure-quote.tsx +17 -0
  477. package/src/plugins/builtin/supply-chain/evidence.ts +88 -0
  478. package/src/plugins/builtin/supply-chain/flow-layout.ts +133 -0
  479. package/src/plugins/builtin/supply-chain/flow.tsx +323 -0
  480. package/src/plugins/builtin/supply-chain/graph-client.ts +83 -0
  481. package/src/plugins/builtin/supply-chain/graph-evidence.ts +25 -0
  482. package/src/plugins/builtin/supply-chain/graph-model.ts +45 -0
  483. package/src/plugins/builtin/supply-chain/graph-pane.tsx +218 -0
  484. package/src/plugins/builtin/supply-chain/graph.tsx +163 -0
  485. package/src/plugins/builtin/supply-chain/headless.ts +105 -0
  486. package/src/plugins/builtin/supply-chain/index.tsx +17 -0
  487. package/src/plugins/builtin/supply-chain/model.ts +145 -0
  488. package/src/plugins/builtin/supply-chain/pane.tsx +276 -0
  489. package/src/plugins/builtin/supply-chain/row-evidence.tsx +96 -0
  490. package/src/plugins/builtin/supply-chain/trust.ts +34 -0
  491. package/src/plugins/builtin/themes/client.ts +39 -0
  492. package/src/plugins/builtin/themes/headless.ts +38 -0
  493. package/src/plugins/builtin/themes/model.ts +92 -0
  494. package/src/plugins/builtin/themes/pane.tsx +125 -0
  495. package/src/plugins/builtin/thirteenf/index.tsx +2 -1
  496. package/src/plugins/builtin/thirteenf/pane.tsx +6 -15
  497. package/src/plugins/builtin/ticker-detail/data-panes/historical-prices.tsx +5 -6
  498. package/src/plugins/builtin/ticker-detail/data-panes/returns-model.ts +201 -0
  499. package/src/plugins/builtin/ticker-detail/data-panes/returns-pane.tsx +327 -0
  500. package/src/plugins/builtin/ticker-detail/financials/period-end-history.ts +5 -2
  501. package/src/plugins/builtin/ticker-detail/financials/ratios.ts +18 -2
  502. package/src/plugins/builtin/ticker-detail/financials/tab.tsx +2 -1
  503. package/src/plugins/builtin/ticker-detail/headless.ts +7 -2
  504. package/src/plugins/builtin/ticker-detail/index.tsx +22 -0
  505. package/src/plugins/builtin/ticker-detail/overview/components.tsx +49 -81
  506. package/src/plugins/builtin/ticker-detail/overview/pane.tsx +2 -0
  507. package/src/plugins/builtin/ticker-detail/overview-tab.tsx +111 -46
  508. package/src/plugins/builtin/ticker-detail/pane.tsx +51 -7
  509. package/src/plugins/builtin/ticker-detail/quote-footer.ts +7 -1
  510. package/src/plugins/builtin/ticker-detail/quote-monitor/card.tsx +40 -45
  511. package/src/plugins/builtin/ticker-detail/quote-monitor/index.tsx +3 -0
  512. package/src/plugins/builtin/time-sales/pane.tsx +1 -1
  513. package/src/plugins/builtin/vol-surface/index.tsx +1 -1
  514. package/src/plugins/builtin/world-indices/indices.ts +1 -0
  515. package/src/plugins/catalog-browser.ts +40 -0
  516. package/src/plugins/catalog-manifest.ts +4 -0
  517. package/src/plugins/catalog-ui.ts +9 -1
  518. package/src/plugins/catalog.ts +1 -1
  519. package/src/plugins/current-target.ts +0 -9
  520. package/src/plugins/host-link.ts +33 -1
  521. package/src/plugins/installer.ts +48 -12
  522. package/src/plugins/loader.ts +18 -3
  523. package/src/plugins/manager-node.ts +15 -5
  524. package/src/plugins/registry/index.ts +1 -1
  525. package/src/plugins/registry/pane-settings.ts +25 -7
  526. package/src/public/__snapshots__/public-api.test.ts.snap +3 -0
  527. package/src/renderers/browser/cloud-transport.ts +66 -1
  528. package/src/renderers/browser/main.tsx +2 -0
  529. package/src/renderers/dom/data-table/row.tsx +52 -16
  530. package/src/renderers/dom/desktop/controls.tsx +38 -25
  531. package/src/renderers/dom/desktop/icons.tsx +9 -0
  532. package/src/renderers/dom/host/box.tsx +69 -26
  533. package/src/renderers/dom/host/chart-surface.tsx +36 -2
  534. package/src/renderers/dom/host/focus-scope.ts +11 -1
  535. package/src/renderers/dom/host/tabs.tsx +37 -1
  536. package/src/renderers/dom/styles.css +68 -5
  537. package/src/renderers/electrobun/bun/desktop/backend-requests.ts +11 -6
  538. package/src/renderers/electrobun/bun/desktop/backend.ts +1 -0
  539. package/src/renderers/electrobun/bun/desktop/update.ts +181 -87
  540. package/src/renderers/electrobun/bun/index.ts +73 -6
  541. package/src/renderers/electrobun/bun/window/remembered-frame.ts +122 -0
  542. package/src/renderers/electrobun/shared/protocol.ts +3 -0
  543. package/src/renderers/electrobun/view/backend-rpc.ts +3 -2
  544. package/src/renderers/electrobun/view/cli-pane-shot-entry.tsx +2 -1
  545. package/src/renderers/electrobun/view/http-fetch.ts +2 -0
  546. package/src/renderers/electrobun/view/main.tsx +10 -2
  547. package/src/renderers/electrobun/view/renderer-window-error.ts +18 -0
  548. package/src/renderers/electrobun/view/rpc-timeout.ts +59 -0
  549. package/src/renderers/electrobun/view/update-host.ts +45 -21
  550. package/src/renderers/opentui/start.tsx +3 -0
  551. package/src/shares/api.ts +3 -1
  552. package/src/sources/gloomberb-cloud/normalizers.ts +9 -2
  553. package/src/sources/provider-router/financials.ts +3 -1
  554. package/src/sources/sec-edgar/identity.ts +36 -0
  555. package/src/sources/sec-edgar.ts +1 -34
  556. package/src/state/app/context/index.tsx +8 -0
  557. package/src/sync/core-contributors.ts +2 -0
  558. package/src/telemetry/attention-counts.ts +164 -0
  559. package/src/telemetry/benign-window-error.ts +7 -0
  560. package/src/telemetry/crash-reports-dom.ts +2 -0
  561. package/src/telemetry/live-config.ts +7 -0
  562. package/src/test-support/daily-nav.ts +25 -0
  563. package/src/test-support/rpc-loopback.ts +7 -3
  564. package/src/test-support/shell-pane-keys.tsx +34 -0
  565. package/src/theme/heat-colors.ts +174 -1
  566. package/src/tickers/instrument-kind.ts +46 -13
  567. package/src/tickers/search/asset-classes.ts +106 -0
  568. package/src/tickers/search/index.ts +62 -15
  569. package/src/tickers/search/ranking.ts +42 -3
  570. package/src/types/config.ts +23 -1
  571. package/src/types/financials.ts +2 -0
  572. package/src/types/headless.ts +17 -0
  573. package/src/types/plugin.ts +18 -5
  574. package/src/ui/context-menu.tsx +1 -0
  575. package/src/ui/host.tsx +8 -0
  576. package/src/updater/index.ts +29 -2
  577. package/src/utils/double-escape-close.ts +20 -0
  578. package/src/utils/html-entities.ts +15 -0
  579. package/src/utils/http-proxy-response.ts +44 -7
  580. package/src/utils/plugin-proxy-hosts.json +3 -0
  581. package/src/utils/sec.ts +19 -1
  582. package/src/utils/text-wrap.ts +13 -8
@@ -1,11 +1,13 @@
1
1
  import {
2
+ normalizeChatAttachments,
2
3
  normalizeChatChannel,
3
4
  normalizeChatMessage,
4
5
  normalizeChatMessages,
5
6
  normalizeChatState,
6
7
  } from "./normalizers";
7
- import type { CloudApiSocket } from "./socket";
8
+ import { CHAT_ATTACHMENTS_FEATURE, type CloudApiSocket } from "./socket";
8
9
  import type {
10
+ ChatAttachment,
9
11
  ChatChannel,
10
12
  ChatChannelState,
11
13
  ChatMessage,
@@ -16,26 +18,114 @@ import type { CloudApiRequest } from "./request";
16
18
  type ChatNotificationListener = (notification: ChatNotification) => void;
17
19
  type ChatPresenceListener = (onlineCount: number) => void;
18
20
 
21
+ /** REST requests list the protocol features this client reads, comma separated. */
22
+ const CHAT_FEATURES_HEADER = "X-Gloom-Features";
23
+
24
+ /** The bytes of one image to upload, with the type and name the picker or clipboard gave it. */
25
+ export interface ChatAttachmentUpload {
26
+ name: string;
27
+ type: string;
28
+ data: Blob | Uint8Array;
29
+ }
30
+
31
+ export interface ChatAttachmentUploadOptions {
32
+ signal?: AbortSignal;
33
+ /** The fraction of the body sent, where the transport can tell. */
34
+ onProgress?: (fraction: number) => void;
35
+ }
36
+
37
+ type CloudChatUpload = <T>(
38
+ path: string,
39
+ body: Blob | Uint8Array,
40
+ options: {
41
+ contentType: string;
42
+ headers?: HeadersInit;
43
+ signal?: AbortSignal;
44
+ onProgress?: (fraction: number) => void;
45
+ },
46
+ ) => Promise<T>;
47
+
19
48
  interface CloudChatApiOptions {
20
49
  request: CloudApiRequest;
50
+ upload: CloudChatUpload;
21
51
  socket: CloudApiSocket;
22
52
  }
23
53
 
54
+ function withChatFeatures(options: RequestInit = {}): RequestInit {
55
+ const headers = new Headers(options.headers);
56
+ headers.set(CHAT_FEATURES_HEADER, CHAT_ATTACHMENTS_FEATURE);
57
+ return { ...options, headers };
58
+ }
59
+
60
+ /** A server that knows images sends `attachments` on every message, empty or not. */
61
+ function carriesAttachments(messages: readonly unknown[]): boolean {
62
+ return messages.some((message) => (
63
+ !!message && typeof message === "object" && Array.isArray((message as { attachments?: unknown }).attachments)
64
+ ));
65
+ }
66
+
24
67
  export class CloudChatApi {
68
+ /** Set once a REST answer showed the server knows images, whatever the socket said. */
69
+ private restAttachmentSupport = false;
70
+ private readonly attachmentSupportListeners = new Set<() => void>();
71
+ private unsubscribeServerFeatures: (() => void) | null = null;
72
+ private announcedSupport = false;
73
+
25
74
  constructor(private readonly options: CloudChatApiOptions) {}
26
75
 
76
+ private request<T>(path: string, options?: RequestInit): Promise<T> {
77
+ return this.options.request<T>(path, withChatFeatures(options));
78
+ }
79
+
80
+ /**
81
+ * Whether the server takes images: its socket "ready" frame offered
82
+ * chat.attachments, or a REST answer carried them. Until then the client
83
+ * keeps to text, so an older server never sees an upload.
84
+ */
85
+ attachmentsSupported(): boolean {
86
+ return this.restAttachmentSupport || this.options.socket.serverOffers(CHAT_ATTACHMENTS_FEATURE);
87
+ }
88
+
89
+ subscribeAttachmentSupport(listener: () => void): () => void {
90
+ if (this.attachmentSupportListeners.size === 0) this.announcedSupport = this.attachmentsSupported();
91
+ this.attachmentSupportListeners.add(listener);
92
+ this.unsubscribeServerFeatures ??= this.options.socket.subscribeServerFeatures(() => {
93
+ this.emitAttachmentSupport();
94
+ });
95
+ return () => {
96
+ this.attachmentSupportListeners.delete(listener);
97
+ if (this.attachmentSupportListeners.size > 0) return;
98
+ this.unsubscribeServerFeatures?.();
99
+ this.unsubscribeServerFeatures = null;
100
+ };
101
+ }
102
+
103
+ private emitAttachmentSupport(): void {
104
+ const supported = this.attachmentsSupported();
105
+ if (supported === this.announcedSupport) return;
106
+ this.announcedSupport = supported;
107
+ for (const listener of this.attachmentSupportListeners) listener();
108
+ }
109
+
110
+ private noteMessages(messages: readonly unknown[]): void {
111
+ if (this.restAttachmentSupport || !carriesAttachments(messages)) return;
112
+ this.restAttachmentSupport = true;
113
+ this.emitAttachmentSupport();
114
+ }
115
+
27
116
  async getChannels(): Promise<ChatChannel[]> {
28
117
  const channels =
29
- await this.options.request<ChatChannel[]>("/chat/channels");
118
+ await this.request<ChatChannel[]>("/chat/channels");
30
119
  return channels.map((channel) => normalizeChatChannel(channel));
31
120
  }
32
121
 
33
122
  async getPresence(): Promise<{ onlineCount: number }> {
34
- return this.options.request<{ onlineCount: number }>("/chat/presence");
123
+ return this.request<{ onlineCount: number }>("/chat/presence");
35
124
  }
36
125
 
37
126
  async getState(): Promise<ChatStateResponse> {
38
- const state = await this.options.request<ChatStateResponse>("/chat/state");
127
+ const state = await this.request<ChatStateResponse>("/chat/state");
128
+ this.noteMessages((state.notifications ?? []).map((notification) => notification?.message));
39
129
  return normalizeChatState(state);
40
130
  }
41
131
 
@@ -43,7 +133,7 @@ export class CloudChatApi {
43
133
  channelId: string,
44
134
  body: { notificationsEnabled?: boolean; readThroughMessageId?: string },
45
135
  ): Promise<ChatChannelState> {
46
- return this.options.request<ChatChannelState>(
136
+ return this.request<ChatChannelState>(
47
137
  `/chat/channels/${channelId}/state`,
48
138
  {
49
139
  method: "PATCH",
@@ -55,7 +145,7 @@ export class CloudChatApi {
55
145
  async markNotificationsDelivered(
56
146
  notificationIds: string[],
57
147
  ): Promise<{ delivered: number }> {
58
- return this.options.request<{ delivered: number }>(
148
+ return this.request<{ delivered: number }>(
59
149
  "/chat/notifications/delivered",
60
150
  {
61
151
  method: "POST",
@@ -68,7 +158,7 @@ export class CloudChatApi {
68
158
  userId?: string;
69
159
  username?: string;
70
160
  }): Promise<ChatChannel> {
71
- const channel = await this.options.request<ChatChannel>("/chat/direct", {
161
+ const channel = await this.request<ChatChannel>("/chat/direct", {
72
162
  method: "POST",
73
163
  body: JSON.stringify(target),
74
164
  });
@@ -80,7 +170,7 @@ export class CloudChatApi {
80
170
  usernames?: string[];
81
171
  name?: string;
82
172
  }): Promise<ChatChannel> {
83
- const channel = await this.options.request<ChatChannel>("/chat/groups", {
173
+ const channel = await this.request<ChatChannel>("/chat/groups", {
84
174
  method: "POST",
85
175
  body: JSON.stringify(body),
86
176
  });
@@ -96,25 +186,58 @@ export class CloudChatApi {
96
186
  if (opts?.before) params.set("before", opts.before);
97
187
  if (opts?.limit) params.set("limit", String(opts.limit));
98
188
  const qs = params.toString();
99
- const messages = await this.options.request<ChatMessage[]>(
189
+ const messages = await this.request<ChatMessage[]>(
100
190
  `/chat/channels/${channelId}/messages${qs ? `?${qs}` : ""}`,
101
191
  );
192
+ this.noteMessages(messages);
102
193
  return normalizeChatMessages(messages);
103
194
  }
104
195
 
196
+ /**
197
+ * Uploads one image to a channel ahead of the message that shows it. The
198
+ * answer describes the stored copy (it may be smaller, or WebP) and its `id`
199
+ * goes into `sendMessage`'s `attachmentIds`.
200
+ */
201
+ async uploadAttachment(
202
+ channelId: string,
203
+ upload: ChatAttachmentUpload,
204
+ options: ChatAttachmentUploadOptions = {},
205
+ ): Promise<ChatAttachment> {
206
+ const stored = await this.options.upload<ChatAttachment>(
207
+ `/chat/channels/${channelId}/attachments`,
208
+ upload.data,
209
+ {
210
+ contentType: upload.type || "application/octet-stream",
211
+ headers: { [CHAT_FEATURES_HEADER]: CHAT_ATTACHMENTS_FEATURE },
212
+ signal: options.signal,
213
+ onProgress: options.onProgress,
214
+ },
215
+ );
216
+ const [attachment] = normalizeChatAttachments([stored]);
217
+ if (!attachment) throw new Error("The upload answer had no image.");
218
+ return attachment;
219
+ }
220
+
105
221
  async sendMessage(
106
222
  channelId: string,
107
223
  content: string,
108
224
  replyToId?: string,
109
225
  clientMessageId?: string,
226
+ attachmentIds?: string[],
110
227
  ): Promise<ChatMessage> {
111
- const message = await this.options.request<ChatMessage>(
228
+ const message = await this.request<ChatMessage>(
112
229
  `/chat/channels/${channelId}/messages`,
113
230
  {
114
231
  method: "POST",
115
- body: JSON.stringify({ content, replyToId, clientMessageId }),
232
+ body: JSON.stringify({
233
+ content,
234
+ replyToId,
235
+ clientMessageId,
236
+ ...(attachmentIds?.length ? { attachmentIds } : {}),
237
+ }),
116
238
  },
117
239
  );
240
+ this.noteMessages([message]);
118
241
  return normalizeChatMessage(message);
119
242
  }
120
243
 
@@ -123,7 +246,7 @@ export class CloudChatApi {
123
246
  messageId: string,
124
247
  content: string,
125
248
  ): Promise<ChatMessage> {
126
- const message = await this.options.request<ChatMessage>(
249
+ const message = await this.request<ChatMessage>(
127
250
  `/chat/channels/${channelId}/messages/${messageId}`,
128
251
  {
129
252
  method: "PATCH",
@@ -142,8 +265,8 @@ export class CloudChatApi {
142
265
  channelId,
143
266
  onMessage,
144
267
  onError,
145
- (content, replyToId, clientMessageId) =>
146
- this.sendMessage(channelId, content, replyToId, clientMessageId),
268
+ (content, replyToId, clientMessageId, attachmentIds) =>
269
+ this.sendMessage(channelId, content, replyToId, clientMessageId, attachmentIds),
147
270
  );
148
271
  }
149
272
 
@@ -0,0 +1,153 @@
1
+ type QuoteMatchMode = "exact" | "whitespace" | "nfkc_whitespace";
2
+
3
+ type KpiBasis = "reported" | "adjusted" | "constant_currency" | "organic"
4
+ export type KpiUnit = "currency" | "currency_per_share" | "currency_per_unit" | "percent" | "basis_points" | "count" | "ratio" | "volume"
5
+ type KpiSourceKind = "press_release" | "filing" | "transcript" | "opendart" | "ir" | "esef" | "edinet"
6
+ type GuidanceDirection = "raised" | "cut" | "reiterated" | "mixed" | "initiated" | "withdrawn" | "not_comparable"
7
+ type GuidanceHedge = "exact" | "approximately" | "at_least" | "at_most" | "greater_than" | "less_than" | "qualitative" | "withdrawn"
8
+
9
+ export interface KpiPeriod {
10
+ /** ISO dates; a quarter's dates must never be inferred from its fiscal label. */
11
+ start: string | null
12
+ end: string | null
13
+ kind: "quarter" | "half" | "year" | "ytd" | "instant" | "other"
14
+ fiscalYear: number | null
15
+ fiscalQuarter: number | null
16
+ label: string
17
+ }
18
+ interface KpiMetric {
19
+ id: string
20
+ name: string
21
+ sector: string
22
+ unit: KpiUnit
23
+ definition: string
24
+ aliases: Record<string, string[]>
25
+ /** Economic preference, independent of whether the numeric guide was raised. */
26
+ favorable: "higher" | "lower" | "neutral"
27
+ }
28
+ export interface KpiEvidence {
29
+ id: string
30
+ documentId: string
31
+ sourceId: string
32
+ sourceKind: KpiSourceKind
33
+ url: string
34
+ title: string
35
+ publishedAt: string
36
+ country: string
37
+ language: string
38
+ quote: string
39
+ quoteOffset: number
40
+ quoteSourceLength: number
41
+ quoteMatchMode: QuoteMatchMode
42
+ confidence: number
43
+ }
44
+ interface KpiObservationInput {
45
+ metricId: string
46
+ period: KpiPeriod
47
+ value: number
48
+ valueQualifier?: "exact" | "approximately" | "at_least" | "at_most" | "greater_than" | "less_than"
49
+ unit: KpiUnit
50
+ currency: string | null
51
+ /** Scale of the supplied numeric value (1e6 means millions). Stored values use scale 1. */
52
+ scale?: number
53
+ basis: KpiBasis
54
+ /** Named segment, geography, product, cohort, denominator or physical volume unit. */
55
+ dimensions: Record<string, string>
56
+ quote: string
57
+ confidence: number
58
+ /** Required when an actual explicitly restates a prior disclosed observation. */
59
+ revisionReason?: string | null
60
+ }
61
+ interface KpiGuidanceInput extends Omit<KpiObservationInput, "value" | "valueQualifier"> {
62
+ issuedDate: string
63
+ low: number | null
64
+ high: number | null
65
+ point: number | null
66
+ hedge: GuidanceHedge
67
+ /** Exact source phrasing, including qualitative ranges and conditions. */
68
+ rangeText: string
69
+ conditions?: string | null
70
+ status: "active" | "withdrawn"
71
+ }
72
+ export interface KpiObservation extends Omit<KpiObservationInput, "quote" | "scale"> {
73
+ id: string
74
+ symbol: string
75
+ metric: KpiMetric
76
+ seriesKey: string
77
+ asOf: string
78
+ supersedesId: string | null
79
+ revision: number
80
+ current: boolean
81
+ conflict: boolean
82
+ contested?: boolean
83
+ evidence: KpiEvidence[]
84
+ }
85
+ export interface KpiGuidance extends Omit<KpiGuidanceInput, "quote" | "scale"> {
86
+ id: string
87
+ symbol: string
88
+ metric: KpiMetric
89
+ seriesKey: string
90
+ asOf: string
91
+ supersedesId: string | null
92
+ revision: number
93
+ current: boolean
94
+ evidence: KpiEvidence[]
95
+ direction: GuidanceDirection
96
+ previousId: string | null
97
+ midpointChangePct: number | null
98
+ actual: { observationId: string; value: number; outcome: "above" | "below" | "within"; favorable: "beat" | "miss" | "in_line" | "neutral"; difference: number; differencePct: number | null } | null
99
+ }
100
+ interface KpiCoverage {
101
+ country: string | null
102
+ languages: string[]
103
+ documents: number
104
+ observations: number
105
+ guidance: number
106
+ firstPeriod: string | null
107
+ lastPeriod: string | null
108
+ lastPublishedAt: string | null
109
+ sourceKinds: KpiSourceKind[]
110
+ conflicts: number
111
+ }
112
+ export interface KpiSeries {
113
+ key: string
114
+ metric: KpiMetric
115
+ unit: KpiUnit
116
+ currency: string | null
117
+ basis: KpiBasis
118
+ dimensions: Record<string, string>
119
+ latest: KpiObservation
120
+ observations: KpiObservation[]
121
+ }
122
+ export interface KpisPayload {
123
+ symbol: string
124
+ status: "available" | "unavailable"
125
+ asOf: string | null
126
+ coverage: KpiCoverage
127
+ series: KpiSeries[]
128
+ /** Immutable prior actuals, including unresolved conflicting disclosures. */
129
+ revisions: KpiObservation[]
130
+ dictionary: KpiMetric[]
131
+ access: "full" | "preview"
132
+ lockedRows: number
133
+ totalRows: number
134
+ truncated: boolean
135
+ previewRows: number | null
136
+ methodology: string
137
+ }
138
+ export interface GuidancePayload extends Omit<KpisPayload, "series" | "revisions"> {
139
+ guidance: KpiGuidance[]
140
+ history: KpiGuidance[]
141
+ }
142
+ export interface KpiQueryOptions {
143
+ metric?: string
144
+ basis?: KpiBasis
145
+ from?: string
146
+ to?: string
147
+ /** Point-in-time publication cutoff; excludes later restatements and actuals. */
148
+ asOf?: string
149
+ }
150
+ export function companyDisclosurePath(section: "kpis" | "guidance", symbol: string, options: KpiQueryOptions): string {
151
+ const query = new URLSearchParams(Object.entries(options).filter((entry): entry is [string, string] => entry[1] != null));
152
+ return `/cloud/company-${section}/${encodeURIComponent(symbol)}?${query}`;
153
+ }
@@ -0,0 +1,52 @@
1
+ /** US consumer prices by component, as GET /cloud/cpi/board serves them. */
2
+
3
+ export interface CpiRow {
4
+ id: string;
5
+ /** BLS item code; null for a row computed from two published ones (services ex shelter). */
6
+ code: string | null;
7
+ label: string;
8
+ /** 0 at the top level. */
9
+ depth: number;
10
+ parent: string | null;
11
+ /** All items and core, which stay on top whatever the sort. */
12
+ pinned: boolean;
13
+ derived: boolean;
14
+ /** Relative importance of the month before, percent of all items. */
15
+ weight: number | null;
16
+ /** Seasonally adjusted change on the month, percent. */
17
+ change: number | null;
18
+ /** Seasonally adjusted change over three and six months, annualised, percent. */
19
+ annualized3m: number | null;
20
+ annualized6m: number | null;
21
+ /** Unadjusted change over twelve months, percent. */
22
+ yoy: number | null;
23
+ /** Effect on the headline's monthly change, percentage points. */
24
+ contribution: number | null;
25
+ /** Effect on the headline's twelve-month change, percentage points. */
26
+ contributionYoy: number | null;
27
+ /** One plain sentence worked out from the numbers. */
28
+ read: string | null;
29
+ /** [YYYY-MM, change on the month, change over twelve months], oldest first. */
30
+ history: Array<[string, number | null, number | null]>;
31
+ }
32
+
33
+ export interface CpiReleaseStatus {
34
+ /** The month the board covers, YYYY-MM. */
35
+ period: string | null;
36
+ releasedAt: string | null;
37
+ /** The month the weights refer to, YYYY-MM. */
38
+ weightsPeriod: string | null;
39
+ nextPeriod: string | null;
40
+ nextReleaseAt: string | null;
41
+ }
42
+
43
+ export interface CpiBoardPayload {
44
+ source: "BLS";
45
+ generatedAt: string;
46
+ /** When the index levels were last retrieved. */
47
+ retrievedAt: string | null;
48
+ status: "available" | "partial" | "unavailable";
49
+ gaps: string[];
50
+ release: CpiReleaseStatus;
51
+ rows: CpiRow[];
52
+ }
@@ -0,0 +1,107 @@
1
+ export type CreditValue = string | number | boolean | null | CreditValue[] | { [key: string]: CreditValue };
2
+ export interface CreditFact {
3
+ id: string;
4
+ instrumentId: string;
5
+ documentId: string;
6
+ instrumentKey: string;
7
+ instrumentName: string;
8
+ field: string;
9
+ factKey: string;
10
+ value: CreditValue;
11
+ unit: string | null;
12
+ currency: string | null;
13
+ asOf: string;
14
+ confidence: number;
15
+ quote: string;
16
+ source: string;
17
+ filingUrl: string;
18
+ form: string;
19
+ filedAt: string;
20
+ periodEnd: string | null;
21
+ effectiveDate?: string | null;
22
+ language: string;
23
+ quoteOffset: number;
24
+ quoteSourceLength: number;
25
+ quoteMatchMode: string;
26
+ status: "active" | "superseded" | "pending";
27
+ supersedesId: string | null;
28
+ }
29
+ export interface CreditInstrument {
30
+ lifecycle?: string | null;
31
+ id: string;
32
+ key: string;
33
+ name: string;
34
+ currency: string | null;
35
+ facilityType: string | null;
36
+ principal: number | null;
37
+ commitment: number | null;
38
+ drawn: number | null;
39
+ maturity: string | null;
40
+ facts: CreditFact[];
41
+ history?: CreditFact[];
42
+ }
43
+ export interface CreditHeadroom {
44
+ id: string;
45
+ instrumentId: string;
46
+ instrumentName: string;
47
+ metric: string;
48
+ comparator: "maximum" | "minimum";
49
+ inclusive?: boolean;
50
+ threshold: number;
51
+ current: number | null;
52
+ headroomPercent: number | null;
53
+ asOf: string;
54
+ testDate: string | null;
55
+ status: "compliant" | "breach" | "uncomputable" | "stale" | "conditional";
56
+ reason: string | null;
57
+ evidenceIds: string[];
58
+ }
59
+ export interface CreditMaturityBucket {
60
+ year: number;
61
+ currency: string;
62
+ principal: number;
63
+ instruments: Array<{ id: string; name: string; principal: number; evidenceIds: string[] }>;
64
+ }
65
+ interface CreditControlExposure {
66
+ instrumentId: string;
67
+ instrumentName: string;
68
+ currency: string | null;
69
+ principal: number | null;
70
+ trigger: string;
71
+ putPercent: number | null;
72
+ evidenceIds: string[];
73
+ }
74
+ export interface CreditDocumentsPayload {
75
+ version: 1;
76
+ symbol: string;
77
+ issuer: { id: string; name: string; jurisdiction: string } | null;
78
+ status: "available" | "partial" | "unavailable";
79
+ asOf: string | null;
80
+ access: "full" | "preview";
81
+ lockedRows: number;
82
+ instruments: CreditInstrument[];
83
+ covenants: CreditHeadroom[];
84
+ maturities: CreditMaturityBucket[];
85
+ changeOfControl: CreditControlExposure[];
86
+ warnings: string[];
87
+ }
88
+ export interface CreditScreenRow {
89
+ symbol: string;
90
+ issuerName: string;
91
+ instrumentId: string;
92
+ instrumentName: string;
93
+ kind: "headroom" | "springing_maturity";
94
+ value: number | null;
95
+ date: string | null;
96
+ currency: string | null;
97
+ reason: string;
98
+ evidence: CreditFact[];
99
+ }
100
+ export interface CreditScreenPayload {
101
+ truncated: boolean;
102
+ rows: CreditScreenRow[];
103
+ access: "full" | "preview";
104
+ lockedRows: number;
105
+ asOf: string | null;
106
+ }
107
+ export interface CreditScreenQuery { headroomBelow?: number; springingWithinMonths?: number; limit?: number }