@gloom-sh/terminal 0.18.5 → 0.19.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 (570) hide show
  1. package/README.md +1 -1
  2. package/README.zh-CN.md +1 -1
  3. package/package.json +1 -1
  4. package/patches/electrobun@1.18.1.patch +163 -8
  5. package/src/api-client/app-attention.ts +3 -0
  6. package/src/api-client/beneficial-owners.ts +3 -0
  7. package/src/api-client/company-kpis.ts +3 -0
  8. package/src/api-client/cot.ts +6 -2
  9. package/src/api-client/credit-documents.ts +6 -0
  10. package/src/api-client/data.ts +19 -7
  11. package/src/api-client/equity-screener.ts +24 -0
  12. package/src/api-client/fund-facts.ts +45 -4
  13. package/src/api-client/hiring.ts +3 -0
  14. package/src/api-client/index.ts +15 -0
  15. package/src/api-client/ipo.ts +24 -1
  16. package/src/api-client/market-discovery.ts +10 -0
  17. package/src/api-client/market-movers.ts +7 -0
  18. package/src/api-client/members.ts +1 -1
  19. package/src/api-client/mna.ts +3 -0
  20. package/src/api-client/paths.ts +9 -1
  21. package/src/api-client/perps.ts +43 -0
  22. package/src/api-client/research-activity.ts +3 -2
  23. package/src/api-client/roadmap.ts +85 -0
  24. package/src/api-client/types.ts +82 -2
  25. package/src/app/pane-runtime/plugin-bindings.ts +9 -5
  26. package/src/app/runtime/broker-import.ts +0 -2
  27. package/src/app/runtime/plugin-bindings.ts +73 -56
  28. package/src/architecture/core-builtin-allowlist.json +2 -2
  29. package/src/architecture/pane-tabs-allowlist.json +3 -0
  30. package/src/architecture/ttl-caches-allowlist.json +19 -0
  31. package/src/brokers/sync-broker-instance.ts +2 -8
  32. package/src/capabilities/chart-series.ts +1 -1
  33. package/src/cli/commands/crypto-hints.ts +40 -24
  34. package/src/cli/commands/market.ts +107 -38
  35. package/src/cli/commands/news-search.ts +22 -0
  36. package/src/cli/commands/options-chain.ts +48 -7
  37. package/src/cli/commands/options-leaps.ts +9 -3
  38. package/src/cli/commands/overview.ts +147 -32
  39. package/src/cli/commands/search.ts +21 -1
  40. package/src/cli/commands/themes.ts +11 -2
  41. package/src/cli/commands/ticker.ts +87 -36
  42. package/src/cli/company-name-hint.ts +41 -0
  43. package/src/cli/earnings-calendar.ts +1 -1
  44. package/src/cli/errors.ts +25 -2
  45. package/src/cli/glossary.ts +31 -2
  46. package/src/cli/history-rows.ts +57 -9
  47. package/src/cli/index-roots.ts +0 -7
  48. package/src/cli/index.ts +2 -0
  49. package/src/cli/listing-arg.ts +235 -60
  50. package/src/cli/output-file.ts +68 -0
  51. package/src/cli/pane-functions/capabilities.ts +4 -0
  52. package/src/cli/pane-functions/catalog.ts +80 -7
  53. package/src/cli/pane-functions/discovery.ts +21 -1
  54. package/src/cli/pane-functions/dom.ts +13 -3
  55. package/src/cli/pane-functions/freshness.ts +93 -4
  56. package/src/cli/pane-functions/function-help.ts +20 -10
  57. package/src/cli/pane-functions/headless.ts +17 -7
  58. package/src/cli/pane-functions/index.ts +54 -16
  59. package/src/cli/pane-functions/market-session.ts +66 -4
  60. package/src/cli/pane-functions/options.ts +19 -1
  61. package/src/cli/pane-functions/resolver.ts +19 -8
  62. package/src/cli/pane-functions/screenshot-assessment.ts +6 -4
  63. package/src/cli/pane-functions/screenshot-types.ts +5 -0
  64. package/src/cli/quote-answer.ts +22 -11
  65. package/src/cli/saved-copy-persistence.ts +88 -0
  66. package/src/cli/ticker-resolution.ts +3 -2
  67. package/src/components/chart/composite/composite-chart.tsx +4 -0
  68. package/src/components/chart/composite/interactions.ts +6 -0
  69. package/src/components/chart/composite/legend.tsx +45 -7
  70. package/src/components/chart/composite/panel-gestures.ts +33 -0
  71. package/src/components/chart/composite/panel-surface.tsx +52 -3
  72. package/src/components/chart/composite/rasterizer.ts +24 -13
  73. package/src/components/chart/composite/scene.ts +39 -4
  74. package/src/components/chart/composite/series-cues.ts +14 -0
  75. package/src/components/chart/composite/text-renderer.ts +9 -2
  76. package/src/components/chart/composite/tool-catalog.ts +36 -0
  77. package/src/components/chart/composite/tools.ts +203 -44
  78. package/src/components/chart/composite/use-composite-chart-keyboard.ts +11 -4
  79. package/src/components/command-bar/assist/inventory.ts +2 -1
  80. package/src/components/command-bar/commands/direct/index.ts +28 -13
  81. package/src/components/command-bar/list/model.ts +5 -0
  82. package/src/components/command-bar/pane-templates/items.ts +3 -2
  83. package/src/components/command-bar/routes/root/runtime.ts +6 -7
  84. package/src/components/command-bar/selection-runtime.ts +52 -3
  85. package/src/components/command-bar/surface/index.tsx +2 -0
  86. package/src/components/command-bar/workflow/collection-actions.ts +3 -3
  87. package/src/components/layout/pane/capture-stamp.ts +2 -2
  88. package/src/components/layout/pane/footer/index.tsx +22 -6
  89. package/src/components/layout/pane/footer/model.ts +83 -15
  90. package/src/components/layout/pane/status-footer.ts +35 -2
  91. package/src/components/layout/status-widget-space.ts +9 -0
  92. package/src/components/onboarding/onboarding-wizard.tsx +4 -1
  93. package/src/components/onboarding/portfolio-step/positions-panel.tsx +12 -7
  94. package/src/components/onboarding/wizard-broker-sync.ts +0 -1
  95. package/src/components/onboarding/wizard-positions.ts +3 -3
  96. package/src/components/ticker/list-table-view.tsx +8 -21
  97. package/src/components/ui/choice-dialog.tsx +23 -18
  98. package/src/components/ui/choice-groups.ts +18 -0
  99. package/src/components/ui/data-table/opentui/index.tsx +9 -7
  100. package/src/components/ui/data-table/opentui/model.ts +26 -1
  101. package/src/components/ui/data-table/types.ts +2 -0
  102. package/src/components/ui/display.tsx +18 -3
  103. package/src/components/ui/icon.tsx +4 -1
  104. package/src/components/ui/list-view.tsx +8 -4
  105. package/src/components/ui/query-bar-keys.tsx +2 -0
  106. package/src/components/ui/query-bar.tsx +1 -0
  107. package/src/components/ui/select-button.tsx +5 -1
  108. package/src/components/ui/select-field.tsx +1 -0
  109. package/src/components/ui/table-layout.ts +8 -5
  110. package/src/core/app-runtime.ts +2 -0
  111. package/src/core/app-services.ts +2 -2
  112. package/src/data/config/chart-settings.ts +1 -1
  113. package/src/data/json-ticker-repository.ts +17 -8
  114. package/src/data/plugin-cache.ts +5 -3
  115. package/src/data/saved-copies.ts +8 -0
  116. package/src/data/ticker-repository.ts +16 -9
  117. package/src/data/ticker-writes.ts +81 -0
  118. package/src/data/ttl-cache.ts +165 -0
  119. package/src/docs/snapshot.json +103 -142
  120. package/src/i18n/es.ts +20 -6
  121. package/src/i18n/ja.ts +20 -6
  122. package/src/i18n/ko.ts +20 -6
  123. package/src/i18n/zh-cn.ts +20 -6
  124. package/src/i18n/zh-tw.ts +20 -6
  125. package/src/market-data/depositary-pair.ts +27 -3
  126. package/src/market-data/fund-facts.ts +50 -0
  127. package/src/market-data/market/change-basis.ts +16 -3
  128. package/src/market-data/market/format.ts +25 -0
  129. package/src/market-data/market/freshness.ts +2 -1
  130. package/src/market-data/options-alternatives.ts +81 -4
  131. package/src/market-data/quotes/metadata.ts +7 -0
  132. package/src/news/aggregator.ts +119 -9
  133. package/src/news/cloud-session.ts +21 -0
  134. package/src/news/hooks.ts +1 -0
  135. package/src/news/news-model.ts +1 -0
  136. package/src/news/types.ts +17 -0
  137. package/src/plugins/builtin/alerts/alert-engine.ts +20 -1
  138. package/src/plugins/builtin/alerts/alert-log.ts +33 -0
  139. package/src/plugins/builtin/alerts/calendar-events.ts +10 -4
  140. package/src/plugins/builtin/alerts/cli-forms.ts +216 -0
  141. package/src/plugins/builtin/alerts/cli.ts +362 -80
  142. package/src/plugins/builtin/alerts/command.ts +25 -1
  143. package/src/plugins/builtin/alerts/event-rows.ts +24 -3
  144. package/src/plugins/builtin/alerts/events-pane.tsx +34 -10
  145. package/src/plugins/builtin/alerts/fired-log.ts +73 -9
  146. package/src/plugins/builtin/alerts/format.ts +75 -5
  147. package/src/plugins/builtin/alerts/headless.ts +34 -12
  148. package/src/plugins/builtin/alerts/history-rows.ts +3 -2
  149. package/src/plugins/builtin/alerts/history.ts +1 -1
  150. package/src/plugins/builtin/alerts/index.tsx +79 -16
  151. package/src/plugins/builtin/alerts/metric-command.ts +77 -4
  152. package/src/plugins/builtin/alerts/metric-data.ts +54 -13
  153. package/src/plugins/builtin/alerts/metric-model.ts +163 -14
  154. package/src/plugins/builtin/alerts/metric-parity-fixture.json +1 -1
  155. package/src/plugins/builtin/alerts/pane.tsx +61 -23
  156. package/src/plugins/builtin/alerts/quotes.ts +6 -0
  157. package/src/plugins/builtin/alerts/storage.ts +12 -8
  158. package/src/plugins/builtin/alerts/types.ts +4 -0
  159. package/src/plugins/builtin/analytics/index.tsx +2 -1
  160. package/src/plugins/builtin/analytics/risk-client.ts +16 -5
  161. package/src/plugins/builtin/analytics/risk-fx.ts +70 -15
  162. package/src/plugins/builtin/analytics/risk-headless.ts +27 -0
  163. package/src/plugins/builtin/analytics/risk-model.ts +55 -9
  164. package/src/plugins/builtin/analytics/risk-pane.tsx +8 -2
  165. package/src/plugins/builtin/attention/index.tsx +2 -1
  166. package/src/plugins/builtin/attention/listing.ts +14 -0
  167. package/src/plugins/builtin/broker-manager/index.tsx +7 -3
  168. package/src/plugins/builtin/buildout/cells.tsx +12 -4
  169. package/src/plugins/builtin/buildout/format.ts +38 -0
  170. package/src/plugins/builtin/buildout/model/normalizers.ts +36 -1
  171. package/src/plugins/builtin/buildout/pane/index.tsx +4 -1
  172. package/src/plugins/builtin/buildout/table-model.ts +23 -2
  173. package/src/plugins/builtin/builtin-plugin-meta.ts +6 -2
  174. package/src/plugins/builtin/cds/client.ts +142 -30
  175. package/src/plugins/builtin/cds/headless.ts +35 -8
  176. package/src/plugins/builtin/cds/model.ts +145 -18
  177. package/src/plugins/builtin/cds/pane.tsx +16 -5
  178. package/src/plugins/builtin/changelog/index.tsx +9 -6
  179. package/src/plugins/builtin/chart-composer/catalog-inventory.ts +3 -0
  180. package/src/plugins/builtin/chart-composer/cli-options.ts +4 -0
  181. package/src/plugins/builtin/chart-composer/data-catalog-pane.tsx +7 -0
  182. package/src/plugins/builtin/chart-composer/editor/controller.ts +2 -2
  183. package/src/plugins/builtin/chart-composer/follow-binding.ts +14 -2
  184. package/src/plugins/builtin/chart-composer/headless-schema.ts +7 -1
  185. package/src/plugins/builtin/chart-composer/headless.ts +6 -1
  186. package/src/plugins/builtin/chart-composer/index.tsx +5 -6
  187. package/src/plugins/builtin/chart-composer/pane.tsx +37 -8
  188. package/src/plugins/builtin/chart-composer/settings.ts +27 -0
  189. package/src/plugins/builtin/chat/content/command-suggestions.ts +1 -0
  190. package/src/plugins/builtin/chat/controller/index.ts +5 -1
  191. package/src/plugins/builtin/chat/controller/notifications.ts +33 -3
  192. package/src/plugins/builtin/chat/controller/state.ts +25 -2
  193. package/src/plugins/builtin/chat/controller/unread-people.ts +89 -23
  194. package/src/plugins/builtin/chat/controller/utils.ts +7 -2
  195. package/src/plugins/builtin/chat/pane-links/commands.ts +7 -1
  196. package/src/plugins/builtin/chat/status-preview.ts +79 -0
  197. package/src/plugins/builtin/chat/status-widget.tsx +147 -10
  198. package/src/plugins/builtin/chat/unread-badge.ts +51 -10
  199. package/src/plugins/builtin/clinical-trials/client.ts +49 -4
  200. package/src/plugins/builtin/clinical-trials/model.ts +86 -31
  201. package/src/plugins/builtin/clinical-trials/pane.tsx +61 -49
  202. package/src/plugins/builtin/clinical-trials/sponsor-listing.ts +90 -0
  203. package/src/plugins/builtin/clinical-trials/sponsor-tickers.ts +95 -15
  204. package/src/plugins/builtin/clinical-trials/trial-pages.ts +50 -0
  205. package/src/plugins/builtin/cloud/askg/manifest.ts +2 -0
  206. package/src/plugins/builtin/company-attention/building.tsx +5 -1
  207. package/src/plugins/builtin/company-attention/client.ts +8 -9
  208. package/src/plugins/builtin/company-attention/evidence.ts +4 -1
  209. package/src/plugins/builtin/company-attention/headless.ts +2 -1
  210. package/src/plugins/builtin/company-attention/moves.tsx +5 -1
  211. package/src/plugins/builtin/company-attention/pane.tsx +12 -2
  212. package/src/plugins/builtin/company-attention/signals.tsx +5 -1
  213. package/src/plugins/builtin/company-kpis/headless.ts +8 -3
  214. package/src/plugins/builtin/company-kpis/model.ts +73 -5
  215. package/src/plugins/builtin/company-kpis/pane.tsx +15 -7
  216. package/src/plugins/builtin/composite-plugins.ts +2 -1
  217. package/src/plugins/builtin/correlation/headless.ts +13 -5
  218. package/src/plugins/builtin/correlation/history.ts +22 -0
  219. package/src/plugins/builtin/cot/client.ts +22 -18
  220. package/src/plugins/builtin/cot/headless.ts +15 -10
  221. package/src/plugins/builtin/cot/model.ts +14 -1
  222. package/src/plugins/builtin/cot/pane.tsx +22 -14
  223. package/src/plugins/builtin/credit-boards/client.ts +6 -10
  224. package/src/plugins/builtin/credit-conditions/headless.ts +8 -2
  225. package/src/plugins/builtin/credit-conditions/index.tsx +5 -1
  226. package/src/plugins/builtin/credit-conditions/model.ts +4 -0
  227. package/src/plugins/builtin/credit-conditions/series.ts +3 -1
  228. package/src/plugins/builtin/credit-documents/detail.tsx +2 -2
  229. package/src/plugins/builtin/credit-documents/export.ts +173 -0
  230. package/src/plugins/builtin/credit-documents/headless.ts +10 -10
  231. package/src/plugins/builtin/credit-documents/model.ts +104 -14
  232. package/src/plugins/builtin/credit-documents/pane.tsx +12 -5
  233. package/src/plugins/builtin/custom-view/sources.ts +2 -0
  234. package/src/plugins/builtin/dividend-yield/client.ts +131 -23
  235. package/src/plugins/builtin/dividend-yield/headless.ts +44 -16
  236. package/src/plugins/builtin/dividend-yield/model.ts +8 -5
  237. package/src/plugins/builtin/dividend-yield/pane.tsx +38 -13
  238. package/src/plugins/builtin/dividend-yield/ranking.ts +37 -14
  239. package/src/plugins/builtin/dividend-yield/types.ts +20 -2
  240. package/src/plugins/builtin/dividend-yield/view.ts +30 -2
  241. package/src/plugins/builtin/docs/targets.ts +5 -1
  242. package/src/plugins/builtin/doe/headless.ts +3 -2
  243. package/src/plugins/builtin/doe/pane.tsx +13 -3
  244. package/src/plugins/builtin/earnings/board-model.ts +16 -15
  245. package/src/plugins/builtin/earnings/board.tsx +62 -71
  246. package/src/plugins/builtin/earnings/headless.ts +40 -4
  247. package/src/plugins/builtin/earnings/scope.ts +31 -43
  248. package/src/plugins/builtin/earnings-calls/calendar.tsx +2 -2
  249. package/src/plugins/builtin/earnings-calls/data.ts +18 -6
  250. package/src/plugins/builtin/earnings-calls/format.ts +31 -2
  251. package/src/plugins/builtin/earnings-calls/headless.ts +20 -5
  252. package/src/plugins/builtin/earnings-calls/model.ts +6 -1
  253. package/src/plugins/builtin/earnings-calls/pane.tsx +12 -4
  254. package/src/plugins/builtin/econ/calendar-model.ts +48 -1
  255. package/src/plugins/builtin/econ/calendar-source.ts +4 -2
  256. package/src/plugins/builtin/econ/detail-view.tsx +2 -2
  257. package/src/plugins/builtin/econ/figures.ts +48 -0
  258. package/src/plugins/builtin/econ/index.tsx +14 -5
  259. package/src/plugins/builtin/econ/print-watch.ts +3 -1
  260. package/src/plugins/builtin/econ/types.ts +2 -0
  261. package/src/plugins/builtin/econ-statistics/client.ts +11 -0
  262. package/src/plugins/builtin/econ-statistics/defs.ts +6 -0
  263. package/src/plugins/builtin/econ-statistics/headless.ts +16 -6
  264. package/src/plugins/builtin/econ-statistics/pane.tsx +8 -4
  265. package/src/plugins/builtin/econ-statistics/stats.ts +39 -9
  266. package/src/plugins/builtin/equity-screener/categories.ts +179 -0
  267. package/src/plugins/builtin/equity-screener/client.ts +4 -2
  268. package/src/plugins/builtin/equity-screener/headless.ts +144 -13
  269. package/src/plugins/builtin/equity-screener/ideas.ts +49 -0
  270. package/src/plugins/builtin/equity-screener/model.ts +99 -10
  271. package/src/plugins/builtin/equity-screener/pane.tsx +68 -13
  272. package/src/plugins/builtin/fixed-income/pane.tsx +2 -1
  273. package/src/plugins/builtin/futures/use-board-terms.ts +42 -28
  274. package/src/plugins/builtin/futures/use-front-returns.ts +45 -28
  275. package/src/plugins/builtin/fx-matrix/client.ts +6 -3
  276. package/src/plugins/builtin/fx-matrix/headless.ts +1 -1
  277. package/src/plugins/builtin/fx-matrix/index.tsx +4 -2
  278. package/src/plugins/builtin/fx-matrix/live-legs.ts +42 -3
  279. package/src/plugins/builtin/gpu/headless.ts +8 -2
  280. package/src/plugins/builtin/help/function-index.ts +4 -1
  281. package/src/plugins/builtin/help/index.tsx +62 -59
  282. package/src/plugins/builtin/help/shortcut-model.ts +1 -1
  283. package/src/plugins/builtin/help/shortcut-table.tsx +5 -6
  284. package/src/plugins/builtin/help/table-cells.tsx +13 -2
  285. package/src/plugins/builtin/holders/beneficial-client.ts +5 -1
  286. package/src/plugins/builtin/holders/beneficial-view.tsx +3 -0
  287. package/src/plugins/builtin/holders/fund-holders.ts +51 -0
  288. package/src/plugins/builtin/holders/headless.ts +22 -3
  289. package/src/plugins/builtin/holders/pane.tsx +3 -0
  290. package/src/plugins/builtin/holders/report-rows.ts +4 -1
  291. package/src/plugins/builtin/insider/headless.ts +2 -2
  292. package/src/plugins/builtin/ipo-calendar/client.ts +18 -2
  293. package/src/plugins/builtin/ipo-calendar/headless.ts +75 -11
  294. package/src/plugins/builtin/ipo-calendar/listing-ipo.ts +160 -0
  295. package/src/plugins/builtin/ipo-calendar/model.ts +98 -2
  296. package/src/plugins/builtin/iv-history/client.ts +52 -11
  297. package/src/plugins/builtin/iv-history/format.ts +36 -23
  298. package/src/plugins/builtin/iv-history/headless.ts +33 -18
  299. package/src/plugins/builtin/iv-history/index.tsx +2 -2
  300. package/src/plugins/builtin/iv-history/model.ts +163 -27
  301. package/src/plugins/builtin/iv-history/pane.tsx +10 -6
  302. package/src/plugins/builtin/iv-history/screen-pane.tsx +22 -15
  303. package/src/plugins/builtin/iv-history/universe.ts +5 -1
  304. package/src/plugins/builtin/jobs/client.ts +25 -29
  305. package/src/plugins/builtin/kelly-sizer/model.ts +12 -8
  306. package/src/plugins/builtin/kelly-sizer/pane.tsx +9 -9
  307. package/src/plugins/builtin/kelly-sizer/sections.tsx +19 -10
  308. package/src/plugins/builtin/kelly-sizer/types.ts +10 -4
  309. package/src/plugins/builtin/macro-day/headless.ts +12 -5
  310. package/src/plugins/builtin/macro-day/index.tsx +1 -1
  311. package/src/plugins/builtin/macro-day/model.ts +39 -5
  312. package/src/plugins/builtin/macro-day/pane.tsx +27 -19
  313. package/src/plugins/builtin/macro-day/release-table.ts +2 -2
  314. package/src/plugins/builtin/market-heatmap/data.ts +8 -33
  315. package/src/plugins/builtin/market-movers/client.ts +27 -7
  316. package/src/plugins/builtin/market-movers/headless.ts +34 -12
  317. package/src/plugins/builtin/market-movers/index.tsx +26 -14
  318. package/src/plugins/builtin/market-movers/min-float.ts +74 -0
  319. package/src/plugins/builtin/market-movers/model.ts +4 -1
  320. package/src/plugins/builtin/market-movers/screener.ts +22 -4
  321. package/src/plugins/builtin/market-movers/session-body.tsx +13 -8
  322. package/src/plugins/builtin/market-movers/session-table.ts +4 -3
  323. package/src/plugins/builtin/market-movers/table.ts +17 -5
  324. package/src/plugins/builtin/members/breadth-pane.tsx +2 -1
  325. package/src/plugins/builtin/mna/headless.ts +2 -0
  326. package/src/plugins/builtin/mna/pane.tsx +3 -1
  327. package/src/plugins/builtin/news/headless.ts +3 -1
  328. package/src/plugins/builtin/news/index.tsx +4 -0
  329. package/src/plugins/builtin/news/wire/categories.ts +19 -3
  330. package/src/plugins/builtin/news/wire/industry-pane.tsx +1 -0
  331. package/src/plugins/builtin/news/wire/news/footer.ts +31 -5
  332. package/src/plugins/builtin/news/wire/news/preset-pane.tsx +6 -1
  333. package/src/plugins/builtin/news/wire/news/table.tsx +2 -2
  334. package/src/plugins/builtin/openfda/client.ts +14 -2
  335. package/src/plugins/builtin/openfda/index.tsx +3 -2
  336. package/src/plugins/builtin/openfda/model.ts +9 -0
  337. package/src/plugins/builtin/openfda/pane.tsx +42 -6
  338. package/src/plugins/builtin/options/analytics.ts +29 -5
  339. package/src/plugins/builtin/options/enrichment.ts +17 -5
  340. package/src/plugins/builtin/options/table.ts +5 -2
  341. package/src/plugins/builtin/options/types.ts +2 -0
  342. package/src/plugins/builtin/options/view.tsx +17 -4
  343. package/src/plugins/builtin/options-positioning/client.ts +11 -0
  344. package/src/plugins/builtin/options-positioning/headless.ts +21 -8
  345. package/src/plugins/builtin/options-positioning/index.tsx +1 -1
  346. package/src/plugins/builtin/options-positioning/model.ts +78 -9
  347. package/src/plugins/builtin/options-positioning/pane.tsx +21 -6
  348. package/src/plugins/builtin/options-scenario/client.ts +116 -47
  349. package/src/plugins/builtin/options-scenario/csp-screen-headless.ts +142 -10
  350. package/src/plugins/builtin/options-scenario/csp-screen-pane.tsx +206 -55
  351. package/src/plugins/builtin/options-scenario/csp-screen.ts +63 -23
  352. package/src/plugins/builtin/options-scenario/csp.ts +8 -2
  353. package/src/plugins/builtin/options-scenario/index.tsx +9 -7
  354. package/src/plugins/builtin/options-scenario/strategy-screen.ts +532 -0
  355. package/src/plugins/builtin/pe-band/model.ts +12 -49
  356. package/src/plugins/builtin/perps/cascade-tabs.tsx +161 -0
  357. package/src/plugins/builtin/perps/cascade.ts +236 -0
  358. package/src/plugins/builtin/perps/client.ts +56 -2
  359. package/src/plugins/builtin/perps/headless.ts +65 -9
  360. package/src/plugins/builtin/perps/index.tsx +7 -5
  361. package/src/plugins/builtin/perps/model.ts +18 -4
  362. package/src/plugins/builtin/perps/pane.tsx +19 -22
  363. package/src/plugins/builtin/perps/status-line.ts +25 -0
  364. package/src/plugins/builtin/plugin-module.ts +5 -1
  365. package/src/plugins/builtin/portfolio-list/cached-account.ts +3 -1
  366. package/src/plugins/builtin/portfolio-list/cli/bulk-symbols.ts +2 -8
  367. package/src/plugins/builtin/portfolio-list/cli/portfolio-command.ts +4 -4
  368. package/src/plugins/builtin/portfolio-list/cli/render.ts +7 -5
  369. package/src/plugins/builtin/portfolio-list/pane/futures-front.ts +40 -0
  370. package/src/plugins/builtin/portfolio-list/pane/index.tsx +6 -7
  371. package/src/plugins/builtin/portfolio-list/pane/streaming.ts +5 -2
  372. package/src/plugins/builtin/portfolio-list/pane/supplemental.ts +3 -2
  373. package/src/plugins/builtin/portfolio-list/quick-add/index.tsx +0 -14
  374. package/src/plugins/builtin/portfolio-list/quick-add/resolution.ts +5 -2
  375. package/src/plugins/builtin/portfolio-list/table.tsx +15 -9
  376. package/src/plugins/builtin/primary-dealers/client.ts +13 -38
  377. package/src/plugins/builtin/realized-vol/client.ts +13 -5
  378. package/src/plugins/builtin/realized-vol/evidence.ts +29 -4
  379. package/src/plugins/builtin/realized-vol/headless.ts +8 -4
  380. package/src/plugins/builtin/realized-vol/index.tsx +2 -2
  381. package/src/plugins/builtin/realized-vol/model.ts +37 -6
  382. package/src/plugins/builtin/realized-vol/pane.tsx +11 -9
  383. package/src/plugins/builtin/relative-rotation/client.ts +18 -4
  384. package/src/plugins/builtin/relative-rotation/headless.ts +3 -3
  385. package/src/plugins/builtin/relative-rotation/index.tsx +2 -1
  386. package/src/plugins/builtin/relative-rotation/model.ts +16 -40
  387. package/src/plugins/builtin/relative-rotation/pane.tsx +3 -2
  388. package/src/plugins/builtin/research/corporate-actions-pane.tsx +3 -2
  389. package/src/plugins/builtin/research/event-model.ts +40 -12
  390. package/src/plugins/builtin/research/headless.ts +1 -1
  391. package/src/plugins/builtin/research/index.tsx +7 -3
  392. package/src/plugins/builtin/research/relative-valuation-headless.ts +13 -26
  393. package/src/plugins/builtin/research/relative-valuation-model.ts +31 -3
  394. package/src/plugins/builtin/research/relative-valuation-pane.tsx +59 -20
  395. package/src/plugins/builtin/research/relative-valuation-peers.ts +217 -20
  396. package/src/plugins/builtin/research/relative-valuation-settings.ts +44 -0
  397. package/src/plugins/builtin/reverse-dcf/headless.ts +5 -3
  398. package/src/plugins/builtin/reverse-dcf/model.ts +61 -6
  399. package/src/plugins/builtin/reverse-dcf/pane.tsx +7 -4
  400. package/src/plugins/builtin/risk-factors/data.ts +4 -2
  401. package/src/plugins/builtin/risk-factors/headless.ts +5 -2
  402. package/src/plugins/builtin/roadmap/index.tsx +28 -0
  403. package/src/plugins/builtin/roadmap/model.ts +67 -0
  404. package/src/plugins/builtin/roadmap/pane.tsx +244 -0
  405. package/src/plugins/builtin/scanner/flow-model.ts +50 -4
  406. package/src/plugins/builtin/scanner/flow-pane.tsx +367 -65
  407. package/src/plugins/builtin/scanner/flow-session.ts +146 -0
  408. package/src/plugins/builtin/scanner/headless.ts +204 -35
  409. package/src/plugins/builtin/scanner/index.ts +16 -5
  410. package/src/plugins/builtin/scanner/live-headless.ts +48 -5
  411. package/src/plugins/builtin/scanner/live-model.ts +11 -0
  412. package/src/plugins/builtin/scanner/live-pane.tsx +3 -3
  413. package/src/plugins/builtin/scanner/lock-note.ts +3 -2
  414. package/src/plugins/builtin/seasonality/headless.ts +10 -1
  415. package/src/plugins/builtin/sec/fund-facts-view.tsx +5 -2
  416. package/src/plugins/builtin/sec/fund-facts.ts +116 -34
  417. package/src/plugins/builtin/sec/headless.ts +4 -2
  418. package/src/plugins/builtin/sec/index.tsx +3 -0
  419. package/src/plugins/builtin/series-inventory.ts +2 -0
  420. package/src/plugins/builtin/shared/cloud-resource.ts +16 -7
  421. package/src/plugins/builtin/shared/cloud-upgrade.ts +4 -3
  422. package/src/plugins/builtin/shared/earnings-calendar.ts +6 -2
  423. package/src/plugins/builtin/shared/earnings-report.ts +2 -2
  424. package/src/plugins/builtin/shared/headless-market-data.ts +2 -2
  425. package/src/plugins/builtin/shared/job-posting.ts +1 -0
  426. package/src/plugins/builtin/shared/members-menu.tsx +3 -2
  427. package/src/plugins/builtin/shared/pro-lock-note.ts +12 -12
  428. package/src/plugins/builtin/shared/report-freshness.ts +11 -2
  429. package/src/plugins/builtin/shared/research-cells.tsx +1 -1
  430. package/src/plugins/builtin/shared/series-cache.ts +4 -4
  431. package/src/plugins/builtin/shared/ticker-choice.tsx +2 -1
  432. package/src/plugins/builtin/shared/ticker-company.ts +77 -0
  433. package/src/plugins/builtin/shared/use-quote-board.ts +2 -1
  434. package/src/plugins/builtin/shared/volatility/live-session.ts +34 -8
  435. package/src/plugins/builtin/shared/volatility/pricing.ts +19 -0
  436. package/src/plugins/builtin/shared/wall-view-lifecycle.ts +3 -1
  437. package/src/plugins/builtin/themes/model.ts +16 -7
  438. package/src/plugins/builtin/themes/pane.tsx +5 -5
  439. package/src/plugins/builtin/thirteenf/api.ts +12 -1
  440. package/src/plugins/builtin/thirteenf/data.ts +7 -7
  441. package/src/plugins/builtin/thirteenf/headless.ts +31 -4
  442. package/src/plugins/builtin/ticker-detail/data-panes/historical-prices.tsx +43 -18
  443. package/src/plugins/builtin/ticker-detail/data-panes/returns-history.ts +3 -2
  444. package/src/plugins/builtin/ticker-detail/data-panes/returns-model.ts +62 -0
  445. package/src/plugins/builtin/ticker-detail/data-panes/returns-pane.tsx +83 -46
  446. package/src/plugins/builtin/ticker-detail/headless.ts +31 -16
  447. package/src/plugins/builtin/ticker-detail/overview/model.ts +11 -3
  448. package/src/plugins/builtin/ticker-detail/overview-tab.tsx +2 -1
  449. package/src/plugins/builtin/ticker-detail/pane.tsx +14 -8
  450. package/src/plugins/builtin/ticker-detail/quote-monitor/index.tsx +2 -1
  451. package/src/plugins/builtin/ticker-detail/settings.ts +1 -0
  452. package/src/plugins/builtin/time-sales/pane.tsx +31 -19
  453. package/src/plugins/builtin/treasury-auctions/headless.ts +21 -12
  454. package/src/plugins/builtin/treasury-auctions/pane.tsx +9 -3
  455. package/src/plugins/builtin/treasury-daily/client.ts +41 -5
  456. package/src/plugins/builtin/treasury-daily/headless.ts +2 -2
  457. package/src/plugins/builtin/treasury-daily/index.tsx +1 -1
  458. package/src/plugins/builtin/treasury-daily/model.ts +50 -3
  459. package/src/plugins/builtin/treasury-daily/pane.tsx +81 -2
  460. package/src/plugins/builtin/vol-surface/client.ts +3 -13
  461. package/src/plugins/builtin/vol-surface/headless.ts +3 -3
  462. package/src/plugins/builtin/vol-surface/index.tsx +1 -1
  463. package/src/plugins/builtin/vol-surface/pane.tsx +7 -5
  464. package/src/plugins/builtin/volatility/index.tsx +2 -2
  465. package/src/plugins/builtin/volatility/pane.tsx +7 -4
  466. package/src/plugins/builtin/world-venue-map/headless.ts +3 -3
  467. package/src/plugins/builtin/yield-curve/client.ts +61 -1
  468. package/src/plugins/builtin/yield-curve/headless.ts +9 -6
  469. package/src/plugins/builtin/yield-curve/index.tsx +34 -10
  470. package/src/plugins/builtin/yield-curve/swaps.tsx +9 -5
  471. package/src/plugins/catalog-browser.ts +2 -1
  472. package/src/plugins/catalog-manifest.ts +2 -1
  473. package/src/plugins/host-link.ts +1 -1
  474. package/src/plugins/marketplace/model.ts +18 -5
  475. package/src/portfolio/column-values.ts +11 -7
  476. package/src/portfolio/futures-positions.ts +6 -3
  477. package/src/portfolio/position-quantity.ts +15 -9
  478. package/src/remote/resources.ts +2 -1
  479. package/src/renderers/dom/data-table/row.tsx +26 -0
  480. package/src/renderers/dom/desktop/icons.tsx +7 -0
  481. package/src/renderers/dom/desktop/list-view.tsx +13 -10
  482. package/src/renderers/dom/desktop/query-bar.tsx +4 -2
  483. package/src/renderers/dom/desktop/select-field.tsx +4 -2
  484. package/src/renderers/dom/host/chart-surface.tsx +21 -0
  485. package/src/renderers/electrobun/bun/desktop/app-name.ts +3 -3
  486. package/src/renderers/electrobun/bun/desktop/backend.ts +21 -10
  487. package/src/renderers/electrobun/bun/desktop/host-requests.ts +15 -0
  488. package/src/renderers/electrobun/bun/desktop/initialization.ts +2 -0
  489. package/src/renderers/electrobun/bun/desktop/installer-folder.ts +731 -0
  490. package/src/renderers/electrobun/bun/desktop/relaunch.ts +102 -10
  491. package/src/renderers/electrobun/bun/desktop/update.ts +115 -14
  492. package/src/renderers/electrobun/bun/desktop/view-ids.ts +52 -0
  493. package/src/renderers/electrobun/bun/desktop/windows-script.ts +92 -0
  494. package/src/renderers/electrobun/bun/index.ts +26 -2
  495. package/src/renderers/electrobun/bun/window/create.ts +43 -4
  496. package/src/renderers/electrobun/bun/window/events.ts +20 -0
  497. package/src/renderers/electrobun/bun/window/windows-custom-chrome.ts +9 -2
  498. package/src/renderers/electrobun/bun/window/windows-native.ts +78 -0
  499. package/src/renderers/electrobun/bun/window/windows-quit.ts +57 -0
  500. package/src/renderers/electrobun/shared/app-name.ts +13 -0
  501. package/src/renderers/electrobun/shared/protocol.ts +12 -0
  502. package/src/renderers/electrobun/view/backend-rpc.ts +6 -0
  503. package/src/renderers/electrobun/view/main.tsx +24 -1
  504. package/src/renderers/electrobun/view/news-source.ts +5 -1
  505. package/src/renderers/electrobun/view/remote/ticker-repository.ts +14 -7
  506. package/src/renderers/electrobun/view/ui-host.tsx +8 -0
  507. package/src/renderers/electrobun/view/view-ids.ts +85 -0
  508. package/src/renderers/opentui/start.tsx +5 -0
  509. package/src/series/registry.ts +1 -0
  510. package/src/series/types.ts +6 -0
  511. package/src/series/validate.ts +1 -0
  512. package/src/sources/gloomberb-cloud/fred-series.ts +3 -1
  513. package/src/sources/gloomberb-cloud/index.ts +43 -8
  514. package/src/sources/gloomberb-cloud/news.ts +47 -7
  515. package/src/sources/provider-router/financials.ts +15 -3
  516. package/src/sources/provider-router/index.ts +8 -5
  517. package/src/state/ticker-cleanup.ts +50 -0
  518. package/src/sync/controller.ts +4 -3
  519. package/src/sync/core-contributors.ts +90 -31
  520. package/src/telemetry/stall-reports-dom.ts +38 -0
  521. package/src/telemetry/stall-reports-node.ts +75 -0
  522. package/src/telemetry/stall-reports.ts +214 -0
  523. package/src/test-support/preload.ts +14 -0
  524. package/src/theme/themes.ts +10 -0
  525. package/src/tickers/company-name-listing.ts +53 -13
  526. package/src/tickers/company-name.ts +50 -4
  527. package/src/tickers/index-roots.ts +7 -0
  528. package/src/tickers/listing-fate.ts +2 -2
  529. package/src/tickers/listing-venues.ts +15 -3
  530. package/src/tickers/search/index.ts +6 -2
  531. package/src/tickers/search/ranking.ts +5 -1
  532. package/src/tickers/search/upsert.ts +13 -0
  533. package/src/tickers/terminal-codes.ts +19 -0
  534. package/src/tickers/ticker-changes.ts +8 -4
  535. package/src/time-series/alignment.ts +1 -1
  536. package/src/time-series/economic.ts +18 -4
  537. package/src/time-series/field-catalog.ts +1 -1
  538. package/src/time-series/filed-trailing-eps.ts +197 -0
  539. package/src/time-series/fundamentals.ts +44 -1
  540. package/src/time-series/ice-credit.ts +3 -0
  541. package/src/time-series/price-comparison.ts +30 -2
  542. package/src/time-series/resolve-context.ts +3 -1
  543. package/src/time-series/resolve.ts +56 -4
  544. package/src/time-series/session-bar.ts +11 -0
  545. package/src/time-series/spec.ts +3 -2
  546. package/src/time-series/studies.ts +8 -2
  547. package/src/time-series/total-return.ts +160 -0
  548. package/src/time-series/transforms.ts +2 -3
  549. package/src/time-series/types.ts +22 -1
  550. package/src/types/company-from.ts +40 -0
  551. package/src/types/data-provider.ts +7 -0
  552. package/src/types/financials.ts +59 -1
  553. package/src/types/headless.ts +27 -3
  554. package/src/types/news-source.ts +1 -0
  555. package/src/types/plugin.ts +9 -0
  556. package/src/ui/host.tsx +3 -0
  557. package/src/updater/failure.ts +4 -1
  558. package/src/utils/cli-output.ts +42 -1
  559. package/src/utils/crypto-pair.ts +165 -7
  560. package/src/utils/declared-dividends.ts +1 -1
  561. package/src/utils/forward-dividend.ts +2 -0
  562. package/src/utils/fundamentals.ts +60 -8
  563. package/src/utils/fx-market-hours.ts +26 -3
  564. package/src/utils/main-thread-stall.ts +35 -2
  565. package/src/utils/market-capitalization.ts +24 -1
  566. package/src/utils/price-history.ts +7 -1
  567. package/src/utils/shell-word.ts +8 -0
  568. package/src/utils/trailing-dividend.ts +53 -4
  569. package/src/version.ts +2 -2
  570. package/src/plugins/builtin/clinical-trials/ticker-sponsor.ts +0 -17
package/README.md CHANGED
@@ -50,7 +50,7 @@ The script downloads the prebuilt release from GitHub and checks its SHA-256 aga
50
50
  With [Bun](https://bun.sh), on any supported OS:
51
51
 
52
52
  ```bash
53
- bun install -g gloomberb
53
+ bun install -g @gloom-sh/terminal
54
54
  ```
55
55
 
56
56
  Then run `gloom`. The command was called `gloomberb` before 0.18.4, and that name still works. For chart graphics, use a Kitty-compatible terminal such as Ghostty, Kitty, or WezTerm. Windows Terminal draws charts as text; the desktop app draws them in full.
package/README.zh-CN.md CHANGED
@@ -62,7 +62,7 @@ curl -fsSL gloom.sh/install | bash
62
62
  也可在 macOS、Linux 或 Windows x64 上通过 [Bun](https://bun.sh) 安装:
63
63
 
64
64
  ```bash
65
- bun install -g gloomberb
65
+ bun install -g @gloom-sh/terminal
66
66
  ```
67
67
 
68
68
  运行 `gloom` 即可启动。0.18.4 之前命令名为 `gloomberb`,该名称仍可使用。要显示图形,请使用兼容 Kitty 图形协议的终端,例如 Ghostty、Kitty 或 WezTerm。直接下载、安装位置与更新方式详见[安装指南(英文)](docs/installation.md)。
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gloom-sh/terminal",
3
- "version": "0.18.5",
3
+ "version": "0.19.1",
4
4
  "packageManager": "bun@1.3.11",
5
5
  "description": "Market research and portfolio tracker for the terminal",
6
6
  "module": "src/public/index.ts",
@@ -1,3 +1,16 @@
1
+ diff --git a/dist/api/browser/index.ts b/dist/api/browser/index.ts
2
+ index 3e309b18fdbcec84a4a56f97df4debe7fb8246f8..03420222c1d9ba897835c5e7376c7153ede294fc 100644
3
+ --- a/dist/api/browser/index.ts
4
+ +++ b/dist/api/browser/index.ts
5
+ @@ -50,7 +50,7 @@ class Electroview<T extends RPCWithTransport> {
6
+ // Note: Using ws:// for localhost is intentional - all RPC messages are
7
+ // encrypted with per-webview AES-GCM keys, making TLS redundant
8
+ const socket = new WebSocket(
9
+ - `ws://localhost:${RPC_SOCKET_PORT}/socket?webviewId=${WEBVIEW_ID}`,
10
+ + `ws://127.0.0.1:${RPC_SOCKET_PORT}/socket?webviewId=${WEBVIEW_ID}`,
11
+ );
12
+
13
+ this.bunSocket = socket;
1
14
  diff --git a/dist/api/bun/core/BrowserWindow.ts b/dist/api/bun/core/BrowserWindow.ts
2
15
  index c26c2c977ee1fc25a8dc144b85bac8626a45f572..8920a2905380228c23cba66c20d9bfd19ee13e02 100644
3
16
  --- a/dist/api/bun/core/BrowserWindow.ts
@@ -54,7 +67,7 @@ index c26c2c977ee1fc25a8dc144b85bac8626a45f572..8920a2905380228c23cba66c20d9bfd1
54
67
  width: this.frame.width,
55
68
  height: this.frame.height,
56
69
  diff --git a/dist/api/bun/core/Socket.ts b/dist/api/bun/core/Socket.ts
57
- index cdaa2bca0fabe577cb667056aa6f8f84211189c2..3839e5232742c2467180c344f51a30f1ff3c797f 100644
70
+ index cdaa2bca0fabe577cb667056aa6f8f84211189c2..e9cdd82c934f6da58055dc8343ee3b953ec1ee81 100644
58
71
  --- a/dist/api/bun/core/Socket.ts
59
72
  +++ b/dist/api/bun/core/Socket.ts
60
73
  @@ -3,13 +3,8 @@ import { BrowserView } from "./BrowserView";
@@ -73,8 +86,17 @@ index cdaa2bca0fabe577cb667056aa6f8f84211189c2..3839e5232742c2467180c344f51a30f1
73
86
  }
74
87
 
75
88
  // Encrypt function
89
+ @@ -65,6 +60,8 @@ const startRPCServer = () => {
90
+ while (port <= endPort) {
91
+ try {
92
+ server = Bun.serve<{ webviewId: number }>({
93
+ + // Only this machine's webviews connect.
94
+ + hostname: "127.0.0.1",
95
+ port,
96
+ fetch(req: Request, server: Server<{ webviewId: number }>) {
97
+ const url = new URL(req.url);
76
98
  diff --git a/dist/api/bun/core/Updater.ts b/dist/api/bun/core/Updater.ts
77
- index 39daf6d341780af8e30c2c50327162863f5977ec..65677cd1d642ef832cf4f90a315d3ffc977909a3 100644
99
+ index 39daf6d341780af8e30c2c50327162863f5977ec..4f3d2bef8e4b41a13a5a522c0af8dd700879a5db 100644
78
100
  --- a/dist/api/bun/core/Updater.ts
79
101
  +++ b/dist/api/bun/core/Updater.ts
80
102
  @@ -132,6 +132,19 @@ let updateInfo: {
@@ -193,7 +215,52 @@ index 39daf6d341780af8e30c2c50327162863f5977ec..65677cd1d642ef832cf4f90a315d3ffc
193
215
  emitStatus(
194
216
  "fetching-patch",
195
217
  `Checking for patch: ${currentHash.slice(0, 8)}`,
196
- @@ -612,12 +679,12 @@ const Updater = {
218
+ @@ -498,11 +565,25 @@ const Updater = {
219
+ // - macOS/Windows: Resources/version.json (inside the app bundle directory)
220
+ // - Linux: metadata.json (alongside the app bundle)
221
+ const resourcesDir = "Resources";
222
+ - const patchedTarBytes = await Bun.file(
223
+ - tmpPatchedTarFilePath,
224
+ - ).arrayBuffer();
225
+ - const patchedArchive = new Bun.Archive(patchedTarBytes);
226
+ - const patchedFiles = await patchedArchive.files();
227
+ + let patchedFiles: Map<string, File>;
228
+ + try {
229
+ + const patchedTarBytes = await Bun.file(
230
+ + tmpPatchedTarFilePath,
231
+ + ).arrayBuffer();
232
+ + const patchedArchive = new Bun.Archive(patchedTarBytes);
233
+ + patchedFiles = await patchedArchive.files();
234
+ + } catch (error) {
235
+ + // bspatch does not check what it patches: from a damaged tar it
236
+ + // makes one that does not read, and would at every retry. The
237
+ + // full download replaces both.
238
+ + const message = error instanceof Error ? error.message : String(error);
239
+ + emitStatus("patch-failed", `Patched tar does not read: ${message}`, {
240
+ + currentHash,
241
+ + errorMessage: message,
242
+ + });
243
+ + console.error("patched tar does not read", error);
244
+ + break;
245
+ + }
246
+
247
+ for (const [filePath] of patchedFiles) {
248
+ if (
249
+ @@ -528,8 +609,11 @@ const Updater = {
250
+ }
251
+
252
+ const hashFile = patchedFiles.get(hashFilePath);
253
+ - const hashFileJson = JSON.parse(await hashFile!.text());
254
+ - const nextHash = hashFileJson.hash;
255
+ + // Unreadable, it has no hash below and the full download follows.
256
+ + const nextHash: string = await hashFile!
257
+ + .text()
258
+ + .then((text) => JSON.parse(text)?.hash)
259
+ + .catch(() => "");
260
+
261
+ if (seenHashes.includes(nextHash)) {
262
+ emitStatus(
263
+ @@ -612,12 +696,12 @@ const Updater = {
197
264
 
198
265
  const cacheBuster = Math.random().toString(36).substring(7);
199
266
  const platformPrefix = getPlatformPrefix(
@@ -208,7 +275,65 @@ index 39daf6d341780af8e30c2c50327162863f5977ec..65677cd1d642ef832cf4f90a315d3ffc
208
275
  const prevVersionCompressedTarballPath = join(
209
276
  appDataFolder,
210
277
  "self-extraction",
211
- @@ -760,7 +827,12 @@ const Updater = {
278
+ @@ -689,6 +773,13 @@ const Updater = {
279
+ emitStatus("error", updateInfo.error, { zstdPath });
280
+ console.error("zig-zstd not found:", zstdPath);
281
+ } else {
282
+ + // Into a name of its own, renamed once whole: zig-zstd writes as
283
+ + // it goes, and a run that failed (a download cut short) or never
284
+ + // finished (the app quit) left part of a tar under the update's
285
+ + // own name, which every later download took as done and every
286
+ + // install then failed to unpack.
287
+ + const partialTarPath = `${latestTarPath}.partial`;
288
+ + rmSync(partialTarPath, { force: true });
289
+ const decompressResult = Bun.spawnSync(
290
+ [
291
+ zstdPath,
292
+ @@ -696,7 +787,7 @@ const Updater = {
293
+ "-i",
294
+ prevVersionCompressedTarballPath,
295
+ "-o",
296
+ - latestTarPath,
297
+ + partialTarPath,
298
+ "--no-timing",
299
+ ],
300
+ {
301
+ @@ -706,6 +797,7 @@ const Updater = {
302
+ },
303
+ );
304
+ if (!decompressResult.success) {
305
+ + rmSync(partialTarPath, { force: true });
306
+ updateInfo.error = `zig-zstd failed with exit code ${decompressResult.exitCode}`;
307
+ emitStatus("error", updateInfo.error, {
308
+ zstdPath,
309
+ @@ -716,6 +808,7 @@ const Updater = {
310
+ zstdPath,
311
+ });
312
+ } else {
313
+ + renameSync(partialTarPath, latestTarPath);
314
+ emitStatus("decompressing", "Decompression complete");
315
+ }
316
+ }
317
+ @@ -731,6 +824,8 @@ const Updater = {
318
+ // check for patch from that tar and apply it, until it matches the latest version
319
+ // as a fallback it should just download and unpack the latest version
320
+ updateInfo.updateReady = true;
321
+ + // What failed on the way (a patch that did not apply) was recovered from.
322
+ + updateInfo.error = "";
323
+ emitStatus(
324
+ "download-complete",
325
+ `Update ready to install (used ${usedPatchPath ? "patch" : "full download"} path)`,
326
+ @@ -741,7 +836,8 @@ const Updater = {
327
+ },
328
+ );
329
+ } else {
330
+ - updateInfo.error = "Failed to download latest version";
331
+ + // Why it failed (zig-zstd's exit), when that is known.
332
+ + if (!updateInfo.error) updateInfo.error = "Failed to download latest version";
333
+ emitStatus("error", "Failed to download latest version", { latestHash });
334
+ }
335
+
336
+ @@ -760,7 +856,12 @@ const Updater = {
212
337
  mkdirSync(extractionFolder, { recursive: true });
213
338
  }
214
339
 
@@ -222,7 +347,37 @@ index 39daf6d341780af8e30c2c50327162863f5977ec..65677cd1d642ef832cf4f90a315d3ffc
222
347
  const latestTarPath = join(extractionFolder, `${latestHash}.tar`);
223
348
 
224
349
  let appBundleSubpath: string = "";
225
- @@ -894,14 +966,7 @@ const Updater = {
350
+ @@ -782,9 +883,26 @@ const Updater = {
351
+ mkdirSync(extractionDir, { recursive: true });
352
+ }
353
+
354
+ - const latestTarBytes = await Bun.file(latestTarPath).arrayBuffer();
355
+ - const latestArchive = new Bun.Archive(latestTarBytes);
356
+ - await latestArchive.extract(extractionDir);
357
+ + try {
358
+ + const latestTarBytes = await Bun.file(latestTarPath).arrayBuffer();
359
+ + const latestArchive = new Bun.Archive(latestTarBytes);
360
+ + await latestArchive.extract(extractionDir);
361
+ + } catch (error) {
362
+ + // The tar goes, with what it unpacked: left in place, every later
363
+ + // download took it as the update again and every install failed
364
+ + // here the same way. The next download fetches a fresh copy.
365
+ + const message = `Failed to extract update: ${error instanceof Error ? error.message : String(error)}`;
366
+ + try {
367
+ + rmSync(latestTarPath, { force: true });
368
+ + } catch (e) {
369
+ + // Best effort, like the cleanup below.
370
+ + }
371
+ + cleanupExtractionFolder(extractionFolder, latestHash);
372
+ + updateInfo.updateReady = false;
373
+ + emitStatus("error", message, { errorMessage: message });
374
+ + console.error("Failed to extract update", error);
375
+ + return;
376
+ + }
377
+
378
+ if (currentOS === "macos") {
379
+ // Find the .app bundle by scanning extracted directory
380
+ @@ -894,14 +1012,7 @@ const Updater = {
226
381
  emitStatus("replacing-app", "Removing old version...");
227
382
 
228
383
  if (currentOS === "macos") {
@@ -238,7 +393,7 @@ index 39daf6d341780af8e30c2c50327162863f5977ec..65677cd1d642ef832cf4f90a315d3ffc
238
393
 
239
394
  // Remove quarantine extended attributes to prevent "damaged" error
240
395
  // The inner bundle is already signed/notarized, but macOS applies
241
- @@ -918,14 +983,7 @@ const Updater = {
396
+ @@ -918,14 +1029,7 @@ const Updater = {
242
397
  // On Linux, we now have directory bundles instead of AppImage files
243
398
  // The app is stored in {appDataFolder}/app/
244
399
  const appBundleDir = join(appDataFolder, "app");
@@ -254,7 +409,7 @@ index 39daf6d341780af8e30c2c50327162863f5977ec..65677cd1d642ef832cf4f90a315d3ffc
254
409
 
255
410
  // Ensure launcher binary is executable
256
411
  const launcherPath = join(appBundleDir, "bin", "launcher");
257
- @@ -1071,14 +1129,18 @@ del "%~f0"
412
+ @@ -1071,14 +1175,18 @@ del "%~f0"
258
413
  // current process has exited first. The detached shell survives our
259
414
  // exit and polls until the process is gone.
260
415
  const pid = process.pid;
@@ -275,7 +430,7 @@ index 39daf6d341780af8e30c2c50327162863f5977ec..65677cd1d642ef832cf4f90a315d3ffc
275
430
  detached: true,
276
431
  stdio: ["ignore", "ignore", "ignore"],
277
432
  } as any,
278
- @@ -1087,7 +1149,8 @@ del "%~f0"
433
+ @@ -1087,7 +1195,8 @@ del "%~f0"
279
434
  // On Linux, launch the launcher binary inside the app directory
280
435
  const launcherPath = join(runningAppBundlePath, "bin", "launcher");
281
436
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
@@ -1,3 +1,4 @@
1
+ import type { CompanyFrom } from "../types/company-from"
1
2
  type AppStore = "app-store" | "google-play"
2
3
  export type AppChart = "free" | "paid" | "grossing" | "unranked"
3
4
 
@@ -97,6 +98,8 @@ interface AppSourceState {
97
98
  export interface AppAttentionPayload {
98
99
  generatedAt: string
99
100
  requestedSymbol?: string
101
+ /** The company's home line the data is read from, when not the listing asked (a receipt, a foreign line). */
102
+ companyFrom?: CompanyFrom
100
103
  page?: { offset: number; limit: number; total: number; nextOffset: number | null }
101
104
  symbol: string | null
102
105
  access: "pro" | "preview"
@@ -1,3 +1,4 @@
1
+ import type { CompanyFrom } from "../types/company-from";
1
2
  /**
2
3
  * Schedule 13D and 13G beneficial ownership reports about one issuer, as
3
4
  * `GET /cloud/sec/beneficial-owners` returns them. Percentages are percent
@@ -71,6 +72,8 @@ export interface BeneficialOwnersCoverage {
71
72
 
72
73
  export interface BeneficialOwnersPayload {
73
74
  ticker: string;
75
+ /** The company's home line the owners are read from, when not the listing asked (a foreign line). */
76
+ companyFrom?: CompanyFrom;
74
77
  cik: string;
75
78
  companyName: string;
76
79
  /** When the server assembled the list, an ISO time. */
@@ -1,3 +1,4 @@
1
+ import type { CompanyFrom } from "../types/company-from"
1
2
  import { listingAbroad, type IssuerListingParams } from "./paths";
2
3
 
3
4
  type QuoteMatchMode = "exact" | "whitespace" | "nfkc_whitespace";
@@ -132,6 +133,8 @@ export interface KpiSeries {
132
133
  }
133
134
  export interface KpisPayload {
134
135
  symbol: string
136
+ /** The company's home line the data is read from, when not the listing asked (a receipt, a foreign line). */
137
+ companyFrom?: CompanyFrom
135
138
  status: "available" | "unavailable"
136
139
  asOf: string | null
137
140
  coverage: KpiCoverage
@@ -1,5 +1,9 @@
1
- export type CotFamily = "legacy" | "disaggregated"
1
+ /** The CFTC report: Legacy, Disaggregated, or Traders in Financial Futures (TFF). */
2
+ export type CotFamily = "legacy" | "disaggregated" | "tff"
2
3
  export type CotClass = "noncommercial" | "commercial" | "producer" | "swap" | "managed-money" | "other-reportable" | "nonreportable"
4
+ | "dealer" | "asset-manager" | "leveraged-funds"
5
+ /** Futures positions alone, or futures and options combined (options delta-adjusted, as the CFTC reports them). */
6
+ export type CotPositions = "futures-only" | "combined"
3
7
  interface CotPosition { long: number | null; short: number | null; spreading: number | null }
4
8
  interface CotPercentile {
5
9
  value: number | null
@@ -34,7 +38,7 @@ interface CotMarket {
34
38
  }
35
39
  export interface CotPayloadBase {
36
40
  source: "CFTC"
37
- scope: "futures-only"
41
+ scope: CotPositions
38
42
  reportFamily: CotFamily
39
43
  generatedAt: string
40
44
  /** Tuesday position observation date, distinct from publication/download time. */
@@ -26,7 +26,10 @@ export interface CreditFact {
26
26
  status: "active" | "superseded" | "pending";
27
27
  supersedesId: string | null;
28
28
  }
29
+ /** The party an instrument, covenant or wall bucket is of, when the filing names one other than the issuer. */
30
+ export interface CreditObligor { name: string; role?: string | null }
29
31
  export interface CreditInstrument {
32
+ obligor?: CreditObligor | null;
30
33
  lifecycle?: string | null;
31
34
  id: string;
32
35
  key: string;
@@ -41,6 +44,7 @@ export interface CreditInstrument {
41
44
  history?: CreditFact[];
42
45
  }
43
46
  export interface CreditHeadroom {
47
+ obligor?: CreditObligor | null;
44
48
  id: string;
45
49
  instrumentId: string;
46
50
  instrumentName: string;
@@ -57,12 +61,14 @@ export interface CreditHeadroom {
57
61
  evidenceIds: string[];
58
62
  }
59
63
  export interface CreditMaturityBucket {
64
+ obligor?: CreditObligor | null;
60
65
  year: number;
61
66
  currency: string;
62
67
  principal: number;
63
68
  instruments: Array<{ id: string; name: string; principal: number; evidenceIds: string[] }>;
64
69
  }
65
70
  interface CreditControlExposure {
71
+ obligor?: CreditObligor | null;
66
72
  instrumentId: string;
67
73
  instrumentName: string;
68
74
  currency: string | null;
@@ -7,7 +7,7 @@ import { companyDisclosurePath } from "./company-kpis";
7
7
  import { cloudExchangeAnnouncementsPath } from "./exchange-announcements";
8
8
  import type { PowerBoard, PowerDetail, PowerFilter, PowerHistory } from "./power";
9
9
  import type { PerpBoardPayload, PerpEquitiesPayload, PerpEquityListing, PerpHistoryPayload, PerpRankingsPayload, PerpBoardQuery, PerpHistoryQuery,
10
- PerpMarketPayload } from "./perps";
10
+ PerpMarketPayload, PerpLiquidationsPayload, PerpDepthPayload } from "./perps";
11
11
  import type { ExposureRequest, ExposurePayload, ExposureScenario } from "./exposure";
12
12
  import type { SupplyChainPayload, SupplyOptions } from "./supply-chain";
13
13
  import { supplyGraphQuery, type GraphOptions, type GraphPayload } from "./supply-chain-graph";
@@ -44,7 +44,7 @@ import type { BeneficialOwnersPayload, CloudBeneficialOwnersParams } from "./ben
44
44
  import type { CloudInsiderSignalsParams, InsiderSignalsPayload } from "./insider-signals";
45
45
  import type { SocialMentionDayPosts, SocialMentionsPayload, SocialMentionsRange } from "./social-mentions";
46
46
  import type { FuturesContractTermsPayload, FuturesCurveAsOfPayload, FuturesCurvePayload } from "./futures-curve";
47
- import type { CotBoardPayload, CotContractPayload, CotFamily, CotClass } from "./cot";
47
+ import type { CotBoardPayload, CotContractPayload, CotFamily, CotClass, CotPositions } from "./cot";
48
48
  import type { DoeBoardPayload, DoePricesPayload } from "./doe";
49
49
  import type { JodiBoardPayload, PsdBoardPayload } from "./commodity-balances";
50
50
  import type { CarbonBoard, CarbonHistory, EuropePowerBoard, EuropePowerHistory, GasStorageBoard, GasStorageHistory, GasStorageSeasonal } from "./europe-energy";
@@ -180,6 +180,7 @@ import type {
180
180
  CloudWorldVenueMapPayload,
181
181
  CloudYieldPointPayload,
182
182
  ScannerFlowHistoryPage,
183
+ ScannerFlowSession,
183
184
  } from "./types";
184
185
  import type { CloudApiRequest } from "./request";
185
186
 
@@ -594,12 +595,15 @@ export class CloudDataApi {
594
595
  return this.request<CloudShillerPayload>(cloudShillerPath());
595
596
  }
596
597
 
597
- async getCloudCotBoard(report: CotFamily, traderClass: CotClass): Promise<CotBoardPayload> {
598
- return this.request<CotBoardPayload>(`/cloud/cot/board?${new URLSearchParams({ report, traderClass })}`);
598
+ /** Futures-only positions unless `positions` asks for futures and options combined; the default request is unchanged. */
599
+ async getCloudCotBoard(report: CotFamily, traderClass: CotClass, positions: CotPositions = "futures-only"): Promise<CotBoardPayload> {
600
+ const query = new URLSearchParams({ report, traderClass, ...(positions === "combined" ? { scope: positions } : {}) });
601
+ return this.request<CotBoardPayload>(`/cloud/cot/board?${query}`);
599
602
  }
600
603
 
601
- async getCloudCotContract(code: string, report: CotFamily): Promise<CotContractPayload> {
602
- return this.request<CotContractPayload>(`/cloud/cot/contracts/${encodeURIComponent(code)}?${new URLSearchParams({ report })}`);
604
+ async getCloudCotContract(code: string, report: CotFamily, positions: CotPositions = "futures-only"): Promise<CotContractPayload> {
605
+ const query = new URLSearchParams({ report, ...(positions === "combined" ? { scope: positions } : {}) });
606
+ return this.request<CotContractPayload>(`/cloud/cot/contracts/${encodeURIComponent(code)}?${query}`);
603
607
  }
604
608
 
605
609
  /** Geo layers (the map's layers, entities and series); one prefix-scoped method, like EQS. */
@@ -692,6 +696,8 @@ export class CloudDataApi {
692
696
  }
693
697
  async getCloudPerpsRankings(): Promise<PerpRankingsPayload> { return this.request("/cloud/perps/rankings"); }
694
698
  async getCloudPerpsCompare(baseAsset: string): Promise<PerpBoardPayload> { return this.request(`/cloud/perps/compare?${new URLSearchParams({ baseAsset })}`); }
699
+ async getCloudPerpsLiquidations(baseAsset: string): Promise<PerpLiquidationsPayload> { return this.request(`/cloud/perps/liquidations?${new URLSearchParams({ baseAsset })}`); }
700
+ async getCloudPerpsDepth(baseAsset: string): Promise<PerpDepthPayload> { return this.request(`/cloud/perps/depth?${new URLSearchParams({ baseAsset })}`); }
695
701
  async getCloudPerpsEquity(symbol: string, exchange?: string): Promise<PerpBoardPayload> {
696
702
  const query = exchange === undefined ? "" : `?${new URLSearchParams({ identity: "listing", exchange })}`;
697
703
  return this.request(`/cloud/perps/equity/${encodeURIComponent(symbol)}${query}`);
@@ -916,6 +922,11 @@ export class CloudDataApi {
916
922
  return this.request<ScannerFlowHistoryPage>(`/market/scanner/flow/history?${search}`, { signal });
917
923
  }
918
924
 
925
+ /** The latest session's recorded FLOW prints summed by side, by time and by strike (Pro); the plugin builds `search`. */
926
+ getScannerFlowSession(search: string, signal?: AbortSignal) {
927
+ return this.request<ScannerFlowSession>(`/market/scanner/flow/session?${search}`, { signal });
928
+ }
929
+
919
930
  getMobileAlertHistory<T>(offset = 0) {
920
931
  return this.request<T>(`/mobile/alerts/history?offset=${offset}`);
921
932
  }
@@ -1273,8 +1284,9 @@ export class CloudDataApi {
1273
1284
  query: string,
1274
1285
  limit?: number,
1275
1286
  topics?: readonly string[],
1287
+ options: { closest?: boolean; tickers?: readonly string[] } = {},
1276
1288
  ): Promise<CloudNewsListResponse> {
1277
- return this.request<CloudNewsListResponse>(cloudNewsSearchPath(query, limit, topics));
1289
+ return this.request<CloudNewsListResponse>(cloudNewsSearchPath(query, limit, topics, options));
1278
1290
  }
1279
1291
 
1280
1292
  async getCloudNewsStory(storyId: string): Promise<CloudNewsPayload> {
@@ -2,6 +2,27 @@
2
2
  export const KPI_FIELDS = ["kpiArr", "kpiNrrPercent", "kpiRpo", "kpiCrpo", "kpiSubscribers", "kpiDau", "kpiMau", "kpiGmv", "kpiTakeRatePercent", "kpiSameStoreSalesPercent", "kpiStores", "kpiBacklog", "kpiBookToBill", "kpiNimPercent", "kpiCet1Percent", "kpiCombinedRatioPercent", "kpiOccupancyPercent", "kpiLoadFactorPercent", "guideRevenueChangePercent", "guideEpsChangePercent"] as const;
3
3
  /** Payout ratio and dividend growth; listed only when asked (`include=dividends`), and omitted by a server from before them. */
4
4
  export const DIVIDEND_FIELDS = ["payoutRatioPercent", "dividendGrowth1YPercent", "dividendGrowth3YPercent"] as const;
5
+ /**
6
+ * Technical readings of the stored daily bars at the last completed session; listed only when asked
7
+ * (`include=technical`), and omitted by a server from before them.
8
+ */
9
+ export const TECHNICAL_FIELDS = [
10
+ "rsi14",
11
+ "priceVsSma20Percent", "priceVsSma50Percent", "priceVsSma200Percent",
12
+ "macdBullishCrossDays", "macdBearishCrossDays", "goldenCrossDays", "deathCrossDays",
13
+ "newHigh20dDays", "newLow20dDays", "newHigh52wDays", "newLow52wDays",
14
+ "bollingerWidthPercentile",
15
+ ] as const;
16
+ /**
17
+ * IV30, its 52-week percentile and its moves in volatility points, and 20-session realized volatility with its
18
+ * 52-week rank; listed only when asked (`include=option-volatility`), and omitted by a server from before them.
19
+ */
20
+ export const OPTION_VOLATILITY_FIELDS = ["iv30Percent", "ivPercentile", "iv30Change1d", "iv30Change5d", "hv20Percent", "hvRank"] as const;
21
+ /**
22
+ * Shares outstanding, float, short % of float and 13F institutional ownership, each with the day it describes;
23
+ * listed only when asked (`include=ownership`), and omitted by a server from before them.
24
+ */
25
+ export const OWNERSHIP_FIELDS = ["sharesOutstanding", "floatShares", "shortPercentOfFloat", "institutionalOwnershipPercent"] as const;
5
26
  export const NUMERIC_FIELDS = [
6
27
  ...KPI_FIELDS,
7
28
  "price",
@@ -42,6 +63,7 @@ export const NUMERIC_FIELDS = [
42
63
  "fromHigh52WPercent",
43
64
  "beta",
44
65
  "atrPercent",
66
+ ...TECHNICAL_FIELDS,
45
67
  "priceToBook",
46
68
  "evToEbitda",
47
69
  "roePercent",
@@ -49,6 +71,8 @@ export const NUMERIC_FIELDS = [
49
71
  "analystUpsidePercent",
50
72
  "ivRank",
51
73
  "ivToHv",
74
+ ...OPTION_VOLATILITY_FIELDS,
75
+ ...OWNERSHIP_FIELDS,
52
76
  "hiringOpenRoles", "hiringNetAddsWeek", "hiringRemotePercent", "hiringZScore",
53
77
  "appAttentionScore", "appRankVelocity7d", "appRatingDrift7d", "appRatingCountGrowth7d",
54
78
  ] as const;
@@ -6,7 +6,15 @@ interface FundFact<T> {
6
6
  url?: string;
7
7
  }
8
8
 
9
- type FundStructure = "registered" | "trust";
9
+ /**
10
+ * `registered`: a 1940 Act fund (an ETF or UIT). `trust`: an exchange-traded
11
+ * trust or pool outside the 1940 Act. `closed-end`: a registered closed-end
12
+ * fund (ECC, OXLC, PDI), found filing N-CEN, N-CSR, N-PORT or N-2. `bdc`: a
13
+ * business development company (ARCC, MAIN), found filing N-2 or its N-54A
14
+ * election beside its 10-Q and 10-K. Either's shares trade at their own
15
+ * premium or discount to NAV. Servers before them say null.
16
+ */
17
+ export type FundStructure = "registered" | "trust" | "closed-end" | "bdc";
10
18
  type ExpenseRatioKind = "net" | "gross" | "sponsor-fee";
11
19
  /**
12
20
  * A bond fund as its sponsor classes it: `municipal` when its interest is
@@ -67,6 +75,22 @@ export interface FundMetalHoldings {
67
75
  stale: boolean;
68
76
  }
69
77
 
78
+ /**
79
+ * The 1M change in an ETF's shares outstanding (creations less redemptions),
80
+ * from the sponsor's count on `from` to its count on `asOf`. `value` puts a
81
+ * dollar figure on it, each day's change at that day's NAV; null when a day
82
+ * in between had none.
83
+ */
84
+ export interface FundFlows {
85
+ period: "1M";
86
+ shares: number;
87
+ value: number | null;
88
+ from: string;
89
+ asOf: string;
90
+ source: string;
91
+ url?: string;
92
+ }
93
+
70
94
  /**
71
95
  * `not-collected-yet`: a source Gloom reads covers the fund, but it has no
72
96
  * figures yet. `not-published`: no source Gloom reads covers it. Servers
@@ -86,10 +110,23 @@ export interface FundFactsPayload {
86
110
  structure: FundStructure | null;
87
111
  /** `document`: read from the fund's prospectus filed with the SEC on `asOf`, not from its sponsor. */
88
112
  expenseRatio: (FundFact<number> & { kind: ExpenseRatioKind; document?: "prospectus" }) | null;
89
- nav: FundFact<number> | null;
113
+ /**
114
+ * `period`: a `day`'s NAV, or a `month-end`'s (a closed-end fund's monthly
115
+ * estimate, or the NAV per share its filing states), which is its normal
116
+ * cadence rather than a lag. `estimate`: the range the sponsor published,
117
+ * whose midpoint `value` is. Servers before them leave both out.
118
+ */
119
+ nav: (FundFact<number> & { period?: "day" | "month-end"; estimate?: { low: number; high: number } }) | null;
120
+ /** Why a covered fund has no NAV, in one line. Absent when it has one, and from servers before it. */
121
+ navReason?: string;
122
+ /** Dated by its own session: a month end on a weekend is priced at the Friday before it. */
90
123
  closingPrice: FundFact<number> | null;
91
- /** `published` by the sponsor, or `computed` from the closing price against the NAV. */
92
- premiumDiscount: (FundFact<number> & { basis: "published" | "computed" }) | null;
124
+ /**
125
+ * `published` by the sponsor, or `computed` from the closing price against
126
+ * the NAV, dated by the NAV. `estimate`: computed against the midpoint of a
127
+ * NAV estimate, so an estimate too; absent from servers before it.
128
+ */
129
+ premiumDiscount: (FundFact<number> & { basis: "published" | "computed"; estimate?: true }) | null;
93
130
  /**
94
131
  * `period`: a `day`'s figure, or the last `month-end`'s (Vanguard and ARK
95
132
  * ETFs, N-PORT), which is not today's. `document`: the fund's N-PORT report
@@ -105,6 +142,10 @@ export interface FundFactsPayload {
105
142
  bond?: FundBondFacts | null;
106
143
  /** A metal trust's metal in trust; absent for any other fund, until its first read, and from servers before it. */
107
144
  metalHoldings?: FundMetalHoldings | null;
145
+ /** Shares outstanding as the sponsor's file states them, dated. Servers before it leave it out. */
146
+ sharesOutstanding?: FundFact<number> | null;
147
+ /** The 1M change in shares outstanding; null until a month of counts is kept. Servers before it leave it out. */
148
+ flows?: FundFlows | null;
108
149
  /** The newest NAV is older than a few US trading days: every figure is older than it looks. */
109
150
  stale: boolean;
110
151
  fetchedAt: string | null;
@@ -1,3 +1,4 @@
1
+ import type { CompanyFrom } from "../types/company-from"
1
2
  /** HIRING is an observed requisition series, not headcount or job creation. */
2
3
  interface HiringCompany {
3
4
  entityId: string
@@ -76,6 +77,8 @@ export interface HiringSummary extends HiringCompany {
76
77
  export interface HiringPayload extends HiringSummary {
77
78
  generatedAt: string
78
79
  requestedSymbol?: string
80
+ /** The company's home line the data is read from, when not the listing asked (a receipt, a foreign line). */
81
+ companyFrom?: CompanyFrom
79
82
  proRequired: true
80
83
  preview: boolean
81
84
  locked: { history: number; evidence: number; peers: number; signals: number; mix: number }
@@ -24,6 +24,7 @@ import { CloudApiRequestTransport, putWithRevision } from "./request";
24
24
  import { CloudApiSocket } from "./socket";
25
25
  import { CloudCollectionsApi } from "./collections";
26
26
  import { CloudFeedbackApi } from "./feedback";
27
+ import { CloudRoadmapApi } from "./roadmap";
27
28
  import { CloudNotesApi } from "./notes";
28
29
  import { CloudTeamsApi } from "./teams";
29
30
  import { CloudTelemetryApi } from "./telemetry";
@@ -154,6 +155,7 @@ class GloomApiClient {
154
155
  private readonly data: CloudDataApi = new CloudDataApi((path, options) => this.request(path, options));
155
156
  private readonly notes: CloudNotesApi = new CloudNotesApi((path, options) => this.request(path, options));
156
157
  private readonly feedback: CloudFeedbackApi = new CloudFeedbackApi((path, options) => this.request(path, options));
158
+ private readonly roadmap: CloudRoadmapApi = new CloudRoadmapApi((path, options) => this.request(path, options));
157
159
  private readonly telemetry: CloudTelemetryApi = new CloudTelemetryApi((path, options) => this.request(path, options));
158
160
  private readonly theses: CloudThesesApi = new CloudThesesApi((path, options) => this.request(path, options));
159
161
  private readonly collections: CloudCollectionsApi = new CloudCollectionsApi((path, options) => this.request(path, options));
@@ -225,6 +227,14 @@ class GloomApiClient {
225
227
  return !!this.transport.getSessionToken() || !!this.currentUser;
226
228
  }
227
229
 
230
+ /**
231
+ * Whether a request sent now carries a session: the token this client
232
+ * holds, or, in the browser, the cookie it cannot see and assumes is there.
233
+ */
234
+ hasSessionCredential(): boolean {
235
+ return this.transport.hasSessionCredential();
236
+ }
237
+
228
238
  /** Notifies when the user or credential changes, including plan and trial entitlement. */
229
239
  subscribeCurrentUser(listener: () => void): () => void {
230
240
  this.currentUserListeners.add(listener);
@@ -866,6 +876,8 @@ class GloomApiClient {
866
876
  putCloudNote = this.notes.putNote.bind(this.notes);
867
877
  submitFeedback = this.feedback.submitFeedback.bind(this.feedback);
868
878
  listFeedback = this.feedback.listFeedback.bind(this.feedback);
879
+ getRoadmap = this.roadmap.getRoadmap.bind(this.roadmap);
880
+ setRoadmapVote = this.roadmap.setRoadmapVote.bind(this.roadmap);
869
881
  reportCrashErrors = this.telemetry.reportCrashErrors.bind(this.telemetry);
870
882
  reportUsageCounts = this.telemetry.reportUsageCounts.bind(this.telemetry);
871
883
  reportAttentionCounts = this.telemetry.reportAttentionCounts.bind(this.telemetry);
@@ -946,6 +958,7 @@ class GloomApiClient {
946
958
  getCloudCentralBankRates = this.data.getCloudCentralBankRates.bind(this.data);
947
959
  getMobileAlertHistory = this.data.getMobileAlertHistory.bind(this.data);
948
960
  getScannerFlowHistory = this.data.getScannerFlowHistory.bind(this.data);
961
+ getScannerFlowSession = this.data.getScannerFlowSession.bind(this.data);
949
962
  getLiveScan = this.data.getLiveScan.bind(this.data);
950
963
  getCloudEstimateRevisions = this.data.getCloudEstimateRevisions.bind(this.data);
951
964
  getCloudMoneyMarkets = this.data.getCloudMoneyMarkets.bind(this.data);
@@ -1004,6 +1017,8 @@ class GloomApiClient {
1004
1017
  getCloudPerpsHistory = this.data.getCloudPerpsHistory.bind(this.data);
1005
1018
  getCloudPerpsRankings = this.data.getCloudPerpsRankings.bind(this.data);
1006
1019
  getCloudPerpsCompare = this.data.getCloudPerpsCompare.bind(this.data);
1020
+ getCloudPerpsLiquidations = this.data.getCloudPerpsLiquidations.bind(this.data);
1021
+ getCloudPerpsDepth = this.data.getCloudPerpsDepth.bind(this.data);
1007
1022
  getCloudPerpsEquity = this.data.getCloudPerpsEquity.bind(this.data);
1008
1023
  getCloudPerpsEquities = this.data.getCloudPerpsEquities.bind(this.data);
1009
1024
  getCloudPerpsMarket = this.data.getCloudPerpsMarket.bind(this.data);