gloomberb 0.17.6 → 0.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (768) hide show
  1. package/README.md +2 -0
  2. package/README.zh-CN.md +2 -0
  3. package/package.json +6 -1
  4. package/patches/electrobun@1.18.1.patch +74 -0
  5. package/src/account/auth-model.ts +3 -2
  6. package/src/account/device-signin-dialog.tsx +38 -13
  7. package/src/account/device-signin.ts +2 -1
  8. package/src/account/upgrade-dialog.tsx +6 -2
  9. package/src/api-client/askg.ts +5 -3
  10. package/src/api-client/bank-figures.ts +73 -0
  11. package/src/api-client/credit-boards.ts +21 -1
  12. package/src/api-client/crypto-markets.ts +88 -1
  13. package/src/api-client/data.ts +104 -4
  14. package/src/api-client/debt-maturities.ts +18 -0
  15. package/src/api-client/equity-screener.ts +3 -0
  16. package/src/api-client/errors.ts +13 -0
  17. package/src/api-client/fund-facts.ts +72 -0
  18. package/src/api-client/futures-curve.ts +26 -3
  19. package/src/api-client/geo.ts +11 -1
  20. package/src/api-client/index.ts +25 -2
  21. package/src/api-client/insider-signals.ts +95 -11
  22. package/src/api-client/normalizers.ts +1 -0
  23. package/src/api-client/paths.ts +20 -1
  24. package/src/api-client/request.ts +11 -3
  25. package/src/api-client/research-activity.ts +15 -8
  26. package/src/api-client/socket.ts +6 -3
  27. package/src/api-client/supply-chain-graph.ts +2 -2
  28. package/src/api-client/supply-chain.ts +8 -0
  29. package/src/api-client/tape.ts +12 -0
  30. package/src/api-client/types.ts +66 -2
  31. package/src/api-client/upgrade-experiment.ts +4 -3
  32. package/src/api-client/wall-experiments.ts +5 -3
  33. package/src/api-client/wall-summary.ts +3 -1
  34. package/src/api-client/web-experiments.ts +5 -2
  35. package/src/api-client/yield-curves.ts +17 -0
  36. package/src/app/command-bar-intro.ts +38 -0
  37. package/src/app/keybindings/actions.ts +1 -1
  38. package/src/app/pane-runtime/pane-template-runtime.ts +35 -7
  39. package/src/app/pane-runtime/plugin-bindings.ts +4 -0
  40. package/src/app/pane-runtime/ticker-open-runtime.ts +4 -14
  41. package/src/app/pane-runtime/ticker-open-target.ts +31 -0
  42. package/src/app/runtime/desktop-deeplink.ts +3 -4
  43. package/src/app/runtime/plugin-bindings.ts +3 -2
  44. package/src/app/runtime/startup.ts +3 -4
  45. package/src/app/runtime/ticker-refresh.ts +13 -12
  46. package/src/app/runtime/update.ts +3 -2
  47. package/src/architecture/core-builtin-allowlist.json +0 -3
  48. package/src/architecture/silent-catch-allowlist.json +3 -0
  49. package/src/architecture/ui-literals-allowlist.json +186 -0
  50. package/src/architecture/ui-tokens-allowlist.json +40 -0
  51. package/src/ask-gloom/pane-context.ts +3 -1
  52. package/src/brokers/signed-in/catalog.ts +2 -1
  53. package/src/brokers/signed-in/client.ts +7 -2
  54. package/src/brokers/signed-in/sign-in-dialog.tsx +120 -26
  55. package/src/brokers/signed-in/sign-in.ts +22 -20
  56. package/src/brokers/sync-broker-instance.ts +2 -1
  57. package/src/capabilities/chart-series.ts +2 -0
  58. package/src/capabilities/registry.ts +1 -3
  59. package/src/cli/bank-section.ts +147 -0
  60. package/src/cli/base-converter.ts +5 -2
  61. package/src/cli/board-coins.ts +70 -0
  62. package/src/cli/commands/fred-series.ts +90 -0
  63. package/src/cli/commands/market.ts +340 -69
  64. package/src/cli/commands/news-search.ts +35 -2
  65. package/src/cli/commands/options-chain.ts +7 -5
  66. package/src/cli/commands/options-leaps.ts +3 -3
  67. package/src/cli/commands/overview.ts +78 -29
  68. package/src/cli/commands/plugins.ts +1 -0
  69. package/src/cli/commands/search.ts +87 -24
  70. package/src/cli/commands/system.ts +5 -2
  71. package/src/cli/commands/ticker.ts +337 -60
  72. package/src/cli/context.ts +2 -1
  73. package/src/cli/desktop-pane-shot.ts +11 -3
  74. package/src/cli/earnings-calendar.ts +2 -1
  75. package/src/cli/errors.ts +10 -0
  76. package/src/cli/export-source.ts +18 -3
  77. package/src/cli/glossary.ts +196 -14
  78. package/src/cli/history-rows.ts +60 -9
  79. package/src/cli/index-roots.ts +26 -0
  80. package/src/cli/index.ts +34 -9
  81. package/src/cli/known-gaps.ts +156 -22
  82. package/src/cli/listing-arg.ts +156 -12
  83. package/src/cli/listing-suggestion.ts +4 -2
  84. package/src/cli/name-entries.ts +76 -0
  85. package/src/cli/not-a-ticker.ts +15 -6
  86. package/src/cli/pane-functions/access-gate.ts +22 -0
  87. package/src/cli/pane-functions/capabilities.ts +62 -4
  88. package/src/cli/pane-functions/catalog.ts +94 -39
  89. package/src/cli/pane-functions/data.ts +6 -5
  90. package/src/cli/pane-functions/discovery.ts +1 -1
  91. package/src/cli/pane-functions/dom.ts +3 -3
  92. package/src/cli/pane-functions/freshness.ts +49 -8
  93. package/src/cli/pane-functions/function-help.ts +13 -10
  94. package/src/cli/pane-functions/headless.ts +177 -42
  95. package/src/cli/pane-functions/index.ts +64 -8
  96. package/src/cli/pane-functions/options.ts +17 -3
  97. package/src/cli/pane-functions/report-notices.ts +17 -3
  98. package/src/cli/pane-functions/resolver.ts +48 -13
  99. package/src/cli/pane-functions/screenshot.ts +124 -23
  100. package/src/cli/pane-functions/shot-options.ts +68 -0
  101. package/src/cli/perpetual-contract.ts +3 -1
  102. package/src/cli/report-tables.ts +10 -2
  103. package/src/cli/staged-tickers.ts +5 -0
  104. package/src/cli/statement-filings.ts +261 -0
  105. package/src/cli/symbol-args.ts +47 -8
  106. package/src/cli/symbol-list.ts +9 -2
  107. package/src/cli/symbol-rows.ts +269 -29
  108. package/src/cli/ticker-resolution.ts +148 -34
  109. package/src/cli/treasury-yields.ts +86 -0
  110. package/src/cli/types.ts +3 -0
  111. package/src/cli/uncovered-instrument.ts +20 -0
  112. package/src/components/chart/composite/axis-overlays.tsx +16 -9
  113. package/src/components/chart/composite/composite-chart.tsx +85 -6
  114. package/src/components/chart/composite/downsample.ts +19 -3
  115. package/src/components/chart/composite/format.ts +3 -0
  116. package/src/components/chart/composite/legend.tsx +155 -76
  117. package/src/components/chart/composite/panel-bitmap.ts +8 -2
  118. package/src/components/chart/composite/panel-surface.tsx +3 -3
  119. package/src/components/chart/composite/toolbar.tsx +12 -7
  120. package/src/components/chart/composite/types.ts +6 -0
  121. package/src/components/chart/composite/use-composite-chart-keyboard.ts +28 -1
  122. package/src/components/chart/curve/curve-surface.tsx +1 -1
  123. package/src/components/chart/static/series.ts +39 -0
  124. package/src/components/chart/static/trail-chart-surface.tsx +2 -1
  125. package/src/components/command-bar/commands/collection-list.ts +45 -15
  126. package/src/components/command-bar/commands/collection.ts +10 -3
  127. package/src/components/command-bar/commands/registry.ts +2 -2
  128. package/src/components/command-bar/list/badge.ts +4 -3
  129. package/src/components/command-bar/list/model.ts +5 -0
  130. package/src/components/command-bar/list/view.tsx +1 -1
  131. package/src/components/command-bar/panel/index.tsx +19 -8
  132. package/src/components/command-bar/panel/native-surface.ts +6 -4
  133. package/src/components/command-bar/panel/prompt-example.ts +22 -0
  134. package/src/components/command-bar/routes/root/provider-search.ts +3 -9
  135. package/src/components/command-bar/routes/root/results.ts +13 -0
  136. package/src/components/command-bar/routes/root/start-here.ts +90 -0
  137. package/src/components/command-bar/routes/ticker-search/results.ts +42 -3
  138. package/src/components/command-bar/routes/ticker-search/route.ts +3 -10
  139. package/src/components/command-bar/theme-picker.tsx +3 -1
  140. package/src/components/command-bar/workflow/builtin.ts +5 -1
  141. package/src/components/command-bar/workflow/collection-actions.ts +21 -12
  142. package/src/components/command-bar/workflow/ops.ts +21 -1
  143. package/src/{plugins/builtin/portfolio-list/command-bar.ts → components/command-bar/workflow/portfolio-position.ts} +42 -9
  144. package/src/components/command-bar/workflow/tickers.ts +6 -4
  145. package/src/components/feedback-dialog.tsx +1 -1
  146. package/src/components/form-modal/broker-step.tsx +7 -63
  147. package/src/components/form-modal/content.tsx +7 -2
  148. package/src/components/form-modal/field-row.tsx +6 -8
  149. package/src/components/form-modal/host.tsx +3 -3
  150. package/src/components/form-modal/model.ts +3 -0
  151. package/src/components/form-modal/routes.ts +17 -2
  152. package/src/components/index.ts +6 -6
  153. package/src/components/input-search-bar.tsx +43 -6
  154. package/src/components/layout/detached-pane-shell.tsx +0 -1
  155. package/src/components/layout/floating-pane.tsx +0 -1
  156. package/src/components/layout/header.tsx +8 -7
  157. package/src/components/layout/pane/footer/index.tsx +7 -4
  158. package/src/components/layout/pane/footer/model.ts +28 -2
  159. package/src/components/layout/pane/header.tsx +9 -19
  160. package/src/components/layout/pane/index.tsx +0 -1
  161. package/src/components/layout/pane/instrument-coverage-gate.tsx +57 -0
  162. package/src/components/layout/pane/pane-tabs.tsx +4 -3
  163. package/src/components/layout/pane/sizing.ts +9 -0
  164. package/src/components/layout/pane/ticker-fate-gate.tsx +8 -2
  165. package/src/components/layout/shell/pane/capture.ts +44 -20
  166. package/src/components/layout/status-bar.tsx +3 -6
  167. package/src/components/markdown-text.tsx +17 -2
  168. package/src/components/market-board/index.tsx +19 -8
  169. package/src/components/metric-treemap/heat-surface.tsx +2 -7
  170. package/src/components/onboarding/account-step/qr-panel.tsx +5 -2
  171. package/src/components/onboarding/onboarding-frame.tsx +24 -21
  172. package/src/components/onboarding/portfolio-step/positions-panel.tsx +20 -10
  173. package/src/components/onboarding/wizard-positions.ts +40 -11
  174. package/src/components/pane-settings-dialog/desktop.tsx +12 -50
  175. package/src/components/pane-settings-dialog/field-dialogs.tsx +1 -1
  176. package/src/components/price-performance.tsx +18 -2
  177. package/src/components/reader/article-reader.tsx +11 -10
  178. package/src/components/reader/detail-reader.tsx +9 -5
  179. package/src/components/reader/reader-text.tsx +51 -24
  180. package/src/components/sign-in-code-panel.tsx +129 -75
  181. package/src/components/ticker/badge/index.tsx +2 -1
  182. package/src/components/ui/action-row.tsx +5 -2
  183. package/src/components/ui/audio-player.tsx +70 -0
  184. package/src/components/ui/card.tsx +75 -0
  185. package/src/components/ui/data-table/index.tsx +4 -2
  186. package/src/components/ui/data-table/types.ts +11 -0
  187. package/src/components/ui/detail-scroll-body.tsx +1 -1
  188. package/src/components/ui/dialog-actions.tsx +1 -21
  189. package/src/components/ui/display.tsx +13 -5
  190. package/src/components/ui/external-link.tsx +4 -2
  191. package/src/components/ui/fields.tsx +12 -0
  192. package/src/components/ui/figure.tsx +5 -3
  193. package/src/components/ui/frame.tsx +40 -6
  194. package/src/components/ui/icon.tsx +4 -0
  195. package/src/components/ui/index.ts +4 -1
  196. package/src/components/ui/list-view.tsx +8 -0
  197. package/src/components/ui/prose.tsx +97 -25
  198. package/src/components/ui/query-bar-keys.tsx +3 -1
  199. package/src/components/ui/query-bar.tsx +6 -0
  200. package/src/components/ui/quote.ts +42 -0
  201. package/src/components/ui/range-track.tsx +15 -2
  202. package/src/components/ui/reveal-in-scroll-box.ts +21 -3
  203. package/src/components/ui/select-button.tsx +38 -3
  204. package/src/components/ui/status.tsx +73 -4
  205. package/src/components/ui/table-layout.ts +20 -0
  206. package/src/components/use-pinned-moment.ts +19 -0
  207. package/src/core/app-runtime.ts +2 -2
  208. package/src/core/state/app/instrument.ts +18 -1
  209. package/src/core/state/app/layout.ts +6 -0
  210. package/src/core/state/app/state.ts +14 -2
  211. package/src/data/cached-query.ts +1 -1
  212. package/src/data/config/chart-settings.ts +3 -1
  213. package/src/data/config/home.ts +4 -1
  214. package/src/data/config/store/node.ts +9 -4
  215. package/src/data/config/store/normalize.ts +9 -0
  216. package/src/data/json-storage.ts +6 -3
  217. package/src/data/json-ticker-repository.ts +3 -1
  218. package/src/data/plugin-cache.ts +5 -1
  219. package/src/data/sqlite/json.ts +3 -1
  220. package/src/data/ticker-repository.ts +5 -2
  221. package/src/feedback/diagnostics.ts +2 -6
  222. package/src/i18n/es.ts +86 -6
  223. package/src/i18n/index.ts +3 -9
  224. package/src/i18n/ja.ts +86 -6
  225. package/src/i18n/ko.ts +86 -6
  226. package/src/i18n/zh-cn.ts +86 -6
  227. package/src/i18n/zh-tw.ts +86 -6
  228. package/src/layout-marketplace/gallery-desktop.tsx +8 -4
  229. package/src/market-data/bars-per-year.ts +43 -0
  230. package/src/market-data/bond-funds.ts +85 -0
  231. package/src/market-data/coordinator/auxiliary.ts +5 -2
  232. package/src/market-data/coordinator/index.ts +6 -5
  233. package/src/market-data/futures-contract.ts +102 -5
  234. package/src/market-data/hooks.tsx +20 -11
  235. package/src/market-data/market/bar-period.ts +36 -0
  236. package/src/market-data/market/format.ts +5 -13
  237. package/src/market-data/market/freshness.ts +1 -3
  238. package/src/market-data/market/index-level.ts +51 -0
  239. package/src/market-data/model-dividend-yield.ts +57 -16
  240. package/src/market-data/quotes/live-valuation.ts +48 -2
  241. package/src/market-data/realized-volatility.ts +16 -7
  242. package/src/market-data/tax-equivalent.ts +344 -0
  243. package/src/news/aggregator.ts +4 -2
  244. package/src/notifications/notification-log.ts +5 -3
  245. package/src/plugins/auto-update-node.ts +1 -0
  246. package/src/plugins/builtin/account-management/footer.ts +1 -1
  247. package/src/plugins/builtin/account-management/keyboard.ts +3 -0
  248. package/src/plugins/builtin/account-management/model.ts +1 -0
  249. package/src/plugins/builtin/account-management/pane.tsx +71 -19
  250. package/src/plugins/builtin/account-management/trial-cancel.ts +40 -0
  251. package/src/plugins/builtin/alerts/cli.ts +7 -18
  252. package/src/plugins/builtin/alerts/constants.ts +8 -0
  253. package/src/plugins/builtin/alerts/event-rows.ts +16 -0
  254. package/src/plugins/builtin/alerts/events-pane.tsx +2 -14
  255. package/src/plugins/builtin/alerts/headless.ts +182 -0
  256. package/src/plugins/builtin/alerts/index.tsx +3 -0
  257. package/src/plugins/builtin/alerts/pane.tsx +1 -7
  258. package/src/plugins/builtin/alerts/storage.ts +17 -1
  259. package/src/plugins/builtin/analytics/index.tsx +6 -1
  260. package/src/plugins/builtin/analytics/metrics.ts +47 -9
  261. package/src/plugins/builtin/analytics/risk-headless.ts +14 -2
  262. package/src/plugins/builtin/analytics/risk-math.ts +83 -0
  263. package/src/plugins/builtin/analytics/risk-model.ts +97 -4
  264. package/src/plugins/builtin/analytics/risk-pane.tsx +11 -6
  265. package/src/plugins/builtin/analytics/sector-model.ts +14 -3
  266. package/src/plugins/builtin/awards/headless.ts +6 -5
  267. package/src/plugins/builtin/awards/index.tsx +1 -1
  268. package/src/plugins/builtin/backtest/client.ts +38 -8
  269. package/src/plugins/builtin/backtest/engine.ts +25 -13
  270. package/src/plugins/builtin/backtest/export.ts +27 -0
  271. package/src/plugins/builtin/backtest/format.ts +19 -3
  272. package/src/plugins/builtin/backtest/headless.ts +42 -28
  273. package/src/plugins/builtin/backtest/index.tsx +3 -0
  274. package/src/plugins/builtin/backtest/pane.tsx +39 -10
  275. package/src/plugins/builtin/backtest/report.ts +160 -0
  276. package/src/plugins/builtin/backtest/rules.ts +2 -0
  277. package/src/plugins/builtin/backtest/window.ts +112 -0
  278. package/src/plugins/builtin/bond-calculator/headless.ts +3 -2
  279. package/src/plugins/builtin/broker-manager/add-flow.tsx +4 -4
  280. package/src/plugins/builtin/catalysts/headless.ts +24 -13
  281. package/src/plugins/builtin/catalysts/index.tsx +4 -2
  282. package/src/plugins/builtin/catalysts/model.ts +18 -1
  283. package/src/plugins/builtin/catalysts/pane.tsx +2 -2
  284. package/src/plugins/builtin/cds/client.ts +28 -5
  285. package/src/plugins/builtin/cds/headless.ts +183 -31
  286. package/src/plugins/builtin/cds/index.tsx +1 -1
  287. package/src/plugins/builtin/cds/model.ts +229 -53
  288. package/src/plugins/builtin/cds/pane.tsx +82 -26
  289. package/src/plugins/builtin/central-bank-rates/headless.ts +1 -1
  290. package/src/plugins/builtin/chart-composer/catalog-inventory.ts +39 -1
  291. package/src/plugins/builtin/chart-composer/chart-spec-edit.ts +77 -0
  292. package/src/plugins/builtin/chart-composer/chart-spec.ts +15 -0
  293. package/src/plugins/builtin/chart-composer/data-catalog-pane.tsx +22 -2
  294. package/src/plugins/builtin/chart-composer/editor/desktop-view.tsx +2 -2
  295. package/src/plugins/builtin/chart-composer/headless-schema.ts +10 -2
  296. package/src/plugins/builtin/chart-composer/headless.ts +99 -21
  297. package/src/plugins/builtin/chart-composer/index.tsx +70 -13
  298. package/src/plugins/builtin/chart-composer/pane.tsx +65 -15
  299. package/src/plugins/builtin/chart-composer/presets.ts +79 -11
  300. package/src/plugins/builtin/chart-composer/series-catalog.ts +50 -14
  301. package/src/plugins/builtin/chart-composer/series-expression.ts +9 -7
  302. package/src/plugins/builtin/chart-composer/series-listings.ts +178 -0
  303. package/src/plugins/builtin/chart-composer/session-range.ts +87 -0
  304. package/src/plugins/builtin/chat/attachments/desktop.tsx +4 -1
  305. package/src/plugins/builtin/chat/content/composer-runtime.ts +49 -14
  306. package/src/plugins/builtin/chat/content/composer.tsx +22 -1
  307. package/src/plugins/builtin/chat/content/index.tsx +35 -5
  308. package/src/plugins/builtin/chat/content/layout-metrics.ts +3 -0
  309. package/src/plugins/builtin/chat/content/shortcuts.ts +32 -13
  310. package/src/plugins/builtin/chat/content/snapshot.ts +29 -6
  311. package/src/plugins/builtin/chat/ghost-user.ts +11 -3
  312. package/src/plugins/builtin/chat/layout.ts +2 -0
  313. package/src/plugins/builtin/chat/message/desktop.tsx +13 -5
  314. package/src/plugins/builtin/chat/message/header.tsx +26 -4
  315. package/src/plugins/builtin/chat/message/pane-chip.tsx +131 -35
  316. package/src/plugins/builtin/chat/message/render-state.ts +28 -1
  317. package/src/plugins/builtin/chat/message/terminal.tsx +9 -3
  318. package/src/plugins/builtin/chat/pane-links/composer.ts +87 -0
  319. package/src/plugins/builtin/chat/pane-links/model.ts +1 -1
  320. package/src/plugins/builtin/chat/share/flow.tsx +9 -73
  321. package/src/plugins/builtin/cloud/askg/controller.ts +5 -3
  322. package/src/plugins/builtin/cloud/askg/executor.ts +3 -1
  323. package/src/plugins/builtin/cloud/askg/lock-note.ts +16 -0
  324. package/src/plugins/builtin/cloud/askg/pane.tsx +6 -2
  325. package/src/plugins/builtin/cloud/auth-actions.tsx +4 -2
  326. package/src/plugins/builtin/cloud/company-picker.tsx +21 -26
  327. package/src/plugins/builtin/cloud/mcp-connect/dialog.tsx +5 -3
  328. package/src/plugins/builtin/cloud/plugin.tsx +2 -0
  329. package/src/plugins/builtin/cloud/team/module.tsx +5 -1
  330. package/src/plugins/builtin/cloud/team/pane.tsx +11 -4
  331. package/src/plugins/builtin/cloud/team/views.ts +11 -4
  332. package/src/plugins/builtin/cloud/terminal-relay/engine.ts +9 -4
  333. package/src/plugins/builtin/cloud/terminal-relay/prompts.tsx +3 -2
  334. package/src/plugins/builtin/cloud/thesis/detail.tsx +2 -1
  335. package/src/plugins/builtin/cloud/thesis/exposure.ts +3 -0
  336. package/src/plugins/builtin/cloud/thesis/prompts.tsx +3 -2
  337. package/src/plugins/builtin/cloud/thesis/ticker-tab.tsx +2 -1
  338. package/src/plugins/builtin/cloud/trial-offer-status-widget.tsx +2 -1
  339. package/src/plugins/builtin/cloud/verification-status-widget.tsx +2 -1
  340. package/src/plugins/builtin/commodities-energy/index.tsx +8 -5
  341. package/src/plugins/builtin/commodities-energy/view-state.ts +11 -0
  342. package/src/plugins/builtin/company-attention/headless.ts +15 -7
  343. package/src/plugins/builtin/company-attention/index.tsx +1 -1
  344. package/src/plugins/builtin/company-attention/model.ts +49 -4
  345. package/src/plugins/builtin/company-attention/pane.tsx +11 -9
  346. package/src/plugins/builtin/company-kpis/headless.ts +4 -3
  347. package/src/plugins/builtin/company-kpis/index.tsx +2 -2
  348. package/src/plugins/builtin/company-kpis/pane.tsx +9 -3
  349. package/src/plugins/builtin/congress-trades/headless.ts +23 -2
  350. package/src/plugins/builtin/correlation/relationship/pane.tsx +18 -46
  351. package/src/plugins/builtin/cot/headless.ts +5 -2
  352. package/src/plugins/builtin/credit-boards/cdx-pane.tsx +41 -13
  353. package/src/plugins/builtin/credit-boards/client.ts +9 -2
  354. package/src/plugins/builtin/credit-boards/headless.ts +93 -27
  355. package/src/plugins/builtin/credit-boards/index.tsx +15 -4
  356. package/src/plugins/builtin/credit-boards/model.ts +105 -6
  357. package/src/plugins/builtin/credit-boards/sovr-pane.tsx +14 -3
  358. package/src/plugins/builtin/credit-documents/detail.tsx +2 -1
  359. package/src/plugins/builtin/credit-documents/index.tsx +3 -0
  360. package/src/plugins/builtin/credit-documents/model.ts +3 -10
  361. package/src/plugins/builtin/crypto-board/client.ts +152 -2
  362. package/src/plugins/builtin/crypto-board/headless.ts +138 -19
  363. package/src/plugins/builtin/crypto-board/index.tsx +5 -3
  364. package/src/plugins/builtin/crypto-board/model.ts +210 -12
  365. package/src/plugins/builtin/crypto-board/pane.tsx +148 -9
  366. package/src/plugins/builtin/crypto-board/series.ts +52 -1
  367. package/src/plugins/builtin/crypto-board/supply.ts +123 -0
  368. package/src/plugins/builtin/debt-maturities/client.ts +54 -1
  369. package/src/plugins/builtin/debt-maturities/headless.ts +27 -3
  370. package/src/plugins/builtin/debt-maturities/index.tsx +2 -0
  371. package/src/plugins/builtin/debt-maturities/model.ts +58 -13
  372. package/src/plugins/builtin/debt-maturities/pane.tsx +47 -7
  373. package/src/plugins/builtin/dividend-yield/client.ts +42 -36
  374. package/src/plugins/builtin/dividend-yield/headless.ts +113 -18
  375. package/src/plugins/builtin/dividend-yield/index.tsx +5 -2
  376. package/src/plugins/builtin/dividend-yield/pane.tsx +37 -13
  377. package/src/plugins/builtin/dividend-yield/provider-client.ts +7 -3
  378. package/src/plugins/builtin/dividend-yield/ranking.ts +187 -0
  379. package/src/plugins/builtin/dividend-yield/reference-price.ts +28 -5
  380. package/src/plugins/builtin/dividend-yield/types.ts +6 -1
  381. package/src/plugins/builtin/dividend-yield/view.ts +1 -1
  382. package/src/plugins/builtin/docs/blocks.tsx +54 -8
  383. package/src/plugins/builtin/docs/pane.tsx +8 -13
  384. package/src/plugins/builtin/earnings/headless.ts +3 -2
  385. package/src/plugins/builtin/earnings-calls/data.ts +51 -0
  386. package/src/plugins/builtin/earnings-calls/headless.ts +7 -0
  387. package/src/plugins/builtin/earnings-calls/index.tsx +1 -0
  388. package/src/plugins/builtin/earnings-calls/model.ts +97 -0
  389. package/src/plugins/builtin/earnings-calls/pane.tsx +107 -7
  390. package/src/plugins/builtin/earnings-calls/transcript-view.tsx +140 -22
  391. package/src/plugins/builtin/earnings-calls/use-call-playback.ts +194 -0
  392. package/src/plugins/builtin/econ/calendar-model.ts +22 -0
  393. package/src/plugins/builtin/econ/calendar-source.ts +35 -0
  394. package/src/plugins/builtin/econ/index.tsx +40 -8
  395. package/src/plugins/builtin/econ-statistics/defs.ts +7 -0
  396. package/src/plugins/builtin/econ-statistics/detail.tsx +8 -1
  397. package/src/plugins/builtin/econ-statistics/headless.ts +26 -5
  398. package/src/plugins/builtin/econ-statistics/pane.tsx +4 -2
  399. package/src/plugins/builtin/econ-statistics/stats.ts +10 -0
  400. package/src/plugins/builtin/econ-statistics/view.ts +19 -0
  401. package/src/plugins/builtin/equity-screener/client.ts +1 -1
  402. package/src/plugins/builtin/equity-screener/model.ts +46 -4
  403. package/src/plugins/builtin/equity-screener/pane.tsx +3 -0
  404. package/src/plugins/builtin/estimate-revisions/client.ts +32 -22
  405. package/src/plugins/builtin/estimate-revisions/headless.ts +1 -0
  406. package/src/plugins/builtin/estimate-revisions/index.tsx +1 -0
  407. package/src/plugins/builtin/estimate-revisions/pane.tsx +5 -3
  408. package/src/plugins/builtin/executives/index.tsx +1 -0
  409. package/src/plugins/builtin/exposure/editor.tsx +3 -3
  410. package/src/plugins/builtin/fear-greed/index.tsx +9 -0
  411. package/src/plugins/builtin/filing-events/index.tsx +1 -0
  412. package/src/plugins/builtin/futures/index.tsx +2 -2
  413. package/src/plugins/builtin/futures/model.ts +34 -21
  414. package/src/plugins/builtin/futures/table.tsx +1 -1
  415. package/src/plugins/builtin/futures/use-board-terms.ts +2 -2
  416. package/src/plugins/builtin/futures-curve/headless.ts +4 -2
  417. package/src/plugins/builtin/futures-curve/model.ts +5 -7
  418. package/src/plugins/builtin/help/index.tsx +55 -8
  419. package/src/plugins/builtin/help/shortcut-table.tsx +15 -2
  420. package/src/plugins/builtin/holders/headless.ts +12 -0
  421. package/src/plugins/builtin/insider/headless.ts +311 -41
  422. package/src/plugins/builtin/insider/index.tsx +280 -106
  423. package/src/plugins/builtin/insider/insiders.tsx +224 -0
  424. package/src/plugins/builtin/insider/signals-cells.tsx +52 -0
  425. package/src/plugins/builtin/insider/signals-client.ts +135 -11
  426. package/src/plugins/builtin/insider/signals-model.ts +628 -56
  427. package/src/plugins/builtin/insider/signals.tsx +283 -83
  428. package/src/plugins/builtin/ipo-calendar/headless.ts +17 -7
  429. package/src/plugins/builtin/ipo-calendar/index.tsx +23 -3
  430. package/src/plugins/builtin/ipo-calendar/model.ts +84 -36
  431. package/src/plugins/builtin/ipo-calendar/pane.tsx +20 -8
  432. package/src/plugins/builtin/iv-history/headless.ts +2 -0
  433. package/src/plugins/builtin/jobs/headless.ts +1 -0
  434. package/src/plugins/builtin/jobs/index.tsx +1 -0
  435. package/src/plugins/builtin/jodi/headless.ts +2 -0
  436. package/src/plugins/builtin/kelly-sizer/pane.tsx +1 -1
  437. package/src/plugins/builtin/kelly-sizer/portfolio.ts +1 -1
  438. package/src/plugins/builtin/market-heatmap/headless.ts +1 -0
  439. package/src/plugins/builtin/market-heatmap/portfolio.ts +3 -1
  440. package/src/plugins/builtin/market-valuation/pane.tsx +1 -1
  441. package/src/plugins/builtin/market-valuation/zone-scale/desktop.tsx +31 -57
  442. package/src/plugins/builtin/mna/distress/headless.ts +2 -1
  443. package/src/plugins/builtin/mna/headless.ts +14 -2
  444. package/src/plugins/builtin/mna/index.tsx +1 -0
  445. package/src/plugins/builtin/news/headless.ts +4 -0
  446. package/src/plugins/builtin/news/wire/news/footer.ts +5 -3
  447. package/src/plugins/builtin/news/wire/news/table.tsx +57 -11
  448. package/src/plugins/builtin/notes/cli.ts +8 -4
  449. package/src/plugins/builtin/notes/files.ts +66 -20
  450. package/src/plugins/builtin/notes/migration.ts +18 -6
  451. package/src/plugins/builtin/notes/owner.tsx +3 -2
  452. package/src/plugins/builtin/notes/quick-notes-pane.tsx +3 -2
  453. package/src/plugins/builtin/options-scenario/client.ts +7 -4
  454. package/src/plugins/builtin/options-scenario/headless.ts +5 -3
  455. package/src/plugins/builtin/pe-band/index.tsx +1 -1
  456. package/src/plugins/builtin/pe-band/model.ts +1 -15
  457. package/src/plugins/builtin/perps/headless.ts +30 -13
  458. package/src/plugins/builtin/perps/model.ts +45 -3
  459. package/src/plugins/builtin/perps/pane.tsx +7 -7
  460. package/src/plugins/builtin/portfolio-list/cell-version.ts +10 -4
  461. package/src/plugins/builtin/portfolio-list/cli/bulk-symbols.ts +128 -14
  462. package/src/plugins/builtin/portfolio-list/cli/portfolio-command.ts +108 -46
  463. package/src/plugins/builtin/portfolio-list/cli/render.ts +368 -45
  464. package/src/plugins/builtin/portfolio-list/cli/shared.ts +8 -2
  465. package/src/plugins/builtin/portfolio-list/cli/watchlist-command.ts +24 -34
  466. package/src/plugins/builtin/portfolio-list/grid.tsx +3 -1
  467. package/src/plugins/builtin/portfolio-list/headless.ts +151 -29
  468. package/src/plugins/builtin/portfolio-list/income.ts +296 -0
  469. package/src/plugins/builtin/portfolio-list/metrics.ts +2 -2
  470. package/src/plugins/builtin/portfolio-list/pane/futures-terms.ts +58 -0
  471. package/src/plugins/builtin/portfolio-list/pane/index.tsx +27 -10
  472. package/src/plugins/builtin/portfolio-list/pane/supplemental.ts +47 -28
  473. package/src/plugins/builtin/portfolio-list/quick-add/index.tsx +3 -2
  474. package/src/plugins/builtin/portfolio-list/quick-add/resolution.ts +10 -3
  475. package/src/plugins/builtin/portfolio-list/summary/index.tsx +26 -4
  476. package/src/plugins/builtin/portfolio-list/summary/totals.ts +31 -3
  477. package/src/plugins/builtin/portfolio-list/table.tsx +25 -5
  478. package/src/plugins/builtin/power/prices-headless.ts +2 -1
  479. package/src/plugins/builtin/realized-vol/chart-model.ts +29 -5
  480. package/src/plugins/builtin/realized-vol/charts.tsx +14 -8
  481. package/src/plugins/builtin/realized-vol/evidence.ts +2 -0
  482. package/src/plugins/builtin/realized-vol/headless.ts +6 -4
  483. package/src/plugins/builtin/realized-vol/model.ts +5 -1
  484. package/src/plugins/builtin/realized-vol/pane.tsx +31 -11
  485. package/src/plugins/builtin/realized-vol/settings.ts +1 -1
  486. package/src/plugins/builtin/research/analyst-headless.ts +4 -0
  487. package/src/plugins/builtin/research/corporate-actions-pane.tsx +2 -0
  488. package/src/plugins/builtin/research/event-model.ts +22 -2
  489. package/src/plugins/builtin/research/headless-schema.ts +1 -0
  490. package/src/plugins/builtin/research/headless.ts +3 -0
  491. package/src/plugins/builtin/research/index.tsx +3 -0
  492. package/src/plugins/builtin/research/relative-valuation-columns.ts +27 -5
  493. package/src/plugins/builtin/research/relative-valuation-headless.ts +2 -0
  494. package/src/plugins/builtin/revenue-breakdown/index.tsx +1 -0
  495. package/src/plugins/builtin/reverse-dcf/headless.ts +9 -6
  496. package/src/plugins/builtin/reverse-dcf/index.tsx +2 -2
  497. package/src/plugins/builtin/reverse-dcf/model.ts +51 -4
  498. package/src/plugins/builtin/reverse-dcf/pane.tsx +23 -10
  499. package/src/plugins/builtin/risk-factors/headless.ts +7 -0
  500. package/src/plugins/builtin/risk-factors/index.tsx +1 -0
  501. package/src/plugins/builtin/scanner/feed.ts +5 -3
  502. package/src/plugins/builtin/scanner/headless.ts +9 -57
  503. package/src/plugins/builtin/scanner/index.ts +1 -2
  504. package/src/plugins/builtin/sec/forms.ts +2 -6
  505. package/src/plugins/builtin/sec/fund-facts-view.tsx +53 -0
  506. package/src/plugins/builtin/sec/fund-facts.ts +328 -0
  507. package/src/plugins/builtin/sec/headless.ts +140 -44
  508. package/src/plugins/builtin/sec/index.tsx +95 -30
  509. package/src/plugins/builtin/sec/model.ts +2 -44
  510. package/src/plugins/builtin/shared/headless-options.ts +10 -0
  511. package/src/plugins/builtin/shared/locked-rows.tsx +3 -1
  512. package/src/plugins/builtin/shared/move-rank.ts +108 -0
  513. package/src/plugins/builtin/shared/report-freshness.ts +25 -9
  514. package/src/plugins/builtin/shared/scanner-capture.ts +95 -0
  515. package/src/plugins/builtin/shared/treasury-cutoffs.ts +15 -0
  516. package/src/plugins/builtin/shared/use-quote-board.ts +1 -0
  517. package/src/plugins/builtin/shared/volatility/live-session.ts +34 -0
  518. package/src/plugins/builtin/shared/volatility-indices.ts +32 -0
  519. package/src/plugins/builtin/short-interest/headless.ts +3 -0
  520. package/src/plugins/builtin/short-interest/watch-model.ts +2 -2
  521. package/src/plugins/builtin/social-mentions/client.ts +8 -1
  522. package/src/plugins/builtin/social-mentions/pane.tsx +8 -6
  523. package/src/plugins/builtin/supply-chain/client.ts +12 -3
  524. package/src/plugins/builtin/supply-chain/disclosure-quote.tsx +9 -5
  525. package/src/plugins/builtin/supply-chain/evidence.ts +3 -1
  526. package/src/plugins/builtin/supply-chain/flow-layout.ts +2 -1
  527. package/src/plugins/builtin/supply-chain/flow.tsx +23 -16
  528. package/src/plugins/builtin/supply-chain/graph-client.ts +8 -5
  529. package/src/plugins/builtin/supply-chain/graph-evidence.ts +1 -1
  530. package/src/plugins/builtin/supply-chain/graph-model.ts +10 -2
  531. package/src/plugins/builtin/supply-chain/graph-pane.tsx +9 -7
  532. package/src/plugins/builtin/supply-chain/graph.tsx +8 -6
  533. package/src/plugins/builtin/supply-chain/headless.ts +69 -27
  534. package/src/plugins/builtin/supply-chain/index.tsx +1 -1
  535. package/src/plugins/builtin/supply-chain/model.ts +76 -15
  536. package/src/plugins/builtin/supply-chain/pane.tsx +29 -15
  537. package/src/plugins/builtin/supply-chain/row-evidence.tsx +5 -4
  538. package/src/plugins/builtin/themes/model.ts +2 -5
  539. package/src/plugins/builtin/thirteenf/api.ts +50 -2
  540. package/src/plugins/builtin/thirteenf/data.ts +250 -11
  541. package/src/plugins/builtin/thirteenf/headless.ts +311 -28
  542. package/src/plugins/builtin/thirteenf/index.tsx +4 -1
  543. package/src/plugins/builtin/thirteenf/model.ts +244 -19
  544. package/src/plugins/builtin/thirteenf/overlap-pane.tsx +133 -33
  545. package/src/plugins/builtin/thirteenf/overlap.ts +1 -1
  546. package/src/plugins/builtin/thirteenf/pane.tsx +24 -5
  547. package/src/plugins/builtin/thirteenf/report-notes.ts +78 -0
  548. package/src/plugins/builtin/thirteenf/types.ts +49 -0
  549. package/src/plugins/builtin/ticker-detail/data-panes/historical-prices.tsx +22 -8
  550. package/src/plugins/builtin/ticker-detail/data-panes/history-bars.ts +17 -1
  551. package/src/plugins/builtin/ticker-detail/financials/model.ts +2 -42
  552. package/src/plugins/builtin/ticker-detail/financials/tab.tsx +1 -1
  553. package/src/plugins/builtin/ticker-detail/headless.ts +23 -10
  554. package/src/plugins/builtin/ticker-detail/overview/components.tsx +27 -3
  555. package/src/plugins/builtin/ticker-detail/overview/dividend.ts +60 -0
  556. package/src/plugins/builtin/ticker-detail/overview/model.ts +46 -9
  557. package/src/plugins/builtin/ticker-detail/overview/pane.tsx +3 -0
  558. package/src/plugins/builtin/ticker-detail/overview-tab.tsx +36 -3
  559. package/src/plugins/builtin/ticker-detail/quote-monitor/card.tsx +18 -19
  560. package/src/plugins/builtin/time-sales/client.ts +7 -4
  561. package/src/plugins/builtin/time-sales/headless.ts +71 -22
  562. package/src/plugins/builtin/time-sales/model.ts +12 -0
  563. package/src/plugins/builtin/time-sales/pane.tsx +31 -7
  564. package/src/plugins/builtin/time-sales/window.ts +128 -0
  565. package/src/plugins/builtin/trace-bonds/client.ts +351 -33
  566. package/src/plugins/builtin/trace-bonds/headless.ts +60 -22
  567. package/src/plugins/builtin/trace-bonds/index.tsx +4 -2
  568. package/src/plugins/builtin/trace-bonds/model.ts +27 -25
  569. package/src/plugins/builtin/trace-bonds/pane.tsx +63 -45
  570. package/src/plugins/builtin/treasury-auctions/cache.ts +61 -15
  571. package/src/plugins/builtin/treasury-auctions/client.ts +45 -10
  572. package/src/plugins/builtin/treasury-auctions/headless.ts +35 -13
  573. package/src/plugins/builtin/treasury-auctions/index.tsx +5 -2
  574. package/src/plugins/builtin/treasury-auctions/model.ts +20 -16
  575. package/src/plugins/builtin/treasury-auctions/pane.tsx +29 -12
  576. package/src/plugins/builtin/vol-surface/charts.tsx +2 -1
  577. package/src/plugins/builtin/vol-surface/headless.ts +3 -2
  578. package/src/plugins/builtin/vol-surface/pane.tsx +2 -1
  579. package/src/plugins/builtin/vol-surface/stored.ts +4 -7
  580. package/src/plugins/builtin/volatility/chart-model.ts +16 -15
  581. package/src/plugins/builtin/volatility/charts.tsx +5 -5
  582. package/src/plugins/builtin/volatility/client.ts +73 -2
  583. package/src/plugins/builtin/volatility/evidence.ts +13 -14
  584. package/src/plugins/builtin/volatility/headless.ts +13 -7
  585. package/src/plugins/builtin/volatility/index.tsx +1 -1
  586. package/src/plugins/builtin/volatility/model.ts +104 -38
  587. package/src/plugins/builtin/volatility/pane.tsx +42 -24
  588. package/src/plugins/builtin/volatility/series.ts +22 -13
  589. package/src/plugins/builtin/world-venue-map/geo-series.ts +9 -0
  590. package/src/plugins/builtin/world-venue-map/headless.ts +8 -5
  591. package/src/plugins/builtin/world-venue-map/index.ts +16 -2
  592. package/src/plugins/builtin/world-venue-map/map.tsx +13 -17
  593. package/src/plugins/builtin/yield-curve/curves.ts +29 -5
  594. package/src/plugins/builtin/yield-curve/headless.ts +41 -8
  595. package/src/plugins/builtin/yield-curve/history.ts +5 -5
  596. package/src/plugins/builtin/yield-curve/index.tsx +30 -13
  597. package/src/plugins/compat.ts +3 -1
  598. package/src/plugins/dependencies.ts +8 -2
  599. package/src/plugins/host-link.ts +12 -5
  600. package/src/plugins/installer.ts +16 -7
  601. package/src/plugins/loader.ts +9 -2
  602. package/src/plugins/marketplace/activation.ts +10 -4
  603. package/src/plugins/registry/host-actions.ts +3 -0
  604. package/src/plugins/registry/index.ts +3 -1
  605. package/src/{plugins/builtin/portfolio-list → portfolio}/allocation.ts +74 -12
  606. package/src/{plugins/builtin/portfolio-list → portfolio}/column-values.ts +140 -53
  607. package/src/portfolio/futures-positions.ts +213 -0
  608. package/src/portfolio/futures-terms.ts +75 -0
  609. package/src/portfolio/manual-lots.ts +78 -0
  610. package/src/portfolio/mutations.ts +54 -10
  611. package/src/portfolio/position-metrics.ts +44 -10
  612. package/src/portfolio/valuation-basis.ts +31 -4
  613. package/src/public/__snapshots__/public-api.test.ts.snap +4 -0
  614. package/src/public/time-series.ts +2 -1
  615. package/src/remote/confirm-change.tsx +2 -1
  616. package/src/remote/server.ts +1 -1
  617. package/src/remote/watchlist.ts +9 -1
  618. package/src/renderers/dom/data-table/row.tsx +1 -1
  619. package/src/renderers/dom/desktop/audio-player.tsx +312 -0
  620. package/src/renderers/dom/desktop/control-styles.ts +17 -82
  621. package/src/renderers/dom/desktop/controls.tsx +39 -63
  622. package/src/renderers/dom/desktop/dialog-actions.tsx +13 -53
  623. package/src/renderers/dom/desktop/icons.tsx +8 -0
  624. package/src/renderers/dom/desktop/list-view.tsx +6 -6
  625. package/src/renderers/dom/desktop/popover.tsx +0 -3
  626. package/src/renderers/dom/desktop/query-bar.tsx +6 -4
  627. package/src/renderers/dom/desktop/select-field.tsx +9 -8
  628. package/src/renderers/dom/desktop/stack-header.ts +3 -0
  629. package/src/renderers/dom/dom-ui-host.tsx +3 -2
  630. package/src/renderers/dom/host/chart-surface.tsx +3 -3
  631. package/src/renderers/dom/host/size-observer.ts +33 -4
  632. package/src/renderers/dom/host/surface-3d.tsx +3 -2
  633. package/src/renderers/dom/host/surface-fit.ts +4 -1
  634. package/src/renderers/dom/host/tabs.tsx +22 -132
  635. package/src/renderers/dom/styles.css +358 -160
  636. package/src/renderers/electrobun/bun/core-capabilities.ts +1 -1
  637. package/src/renderers/electrobun/bun/desktop/backend.ts +1 -1
  638. package/src/renderers/electrobun/bun/desktop/initialization.ts +1 -0
  639. package/src/renderers/electrobun/bun/desktop/state-broadcaster.ts +43 -1
  640. package/src/renderers/electrobun/bun/desktop/workspace/requests.ts +5 -1
  641. package/src/renderers/electrobun/shared/rpc-codec.ts +7 -0
  642. package/src/renderers/electrobun/view/cli-pane-shot-entry.tsx +21 -17
  643. package/src/renderers/electrobun/view/cli-pane-shot-frame.tsx +3 -3
  644. package/src/renderers/electrobun/view/desktop/window/bridge.ts +6 -8
  645. package/src/renderers/electrobun/view/desktop/window/snapshot.ts +18 -0
  646. package/src/series/capability.ts +1 -0
  647. package/src/series/files.ts +9 -3
  648. package/src/series/registry.ts +40 -14
  649. package/src/series/resolve.ts +121 -18
  650. package/src/series/standalone.ts +3 -2
  651. package/src/series/types.ts +55 -1
  652. package/src/series/validate.ts +39 -0
  653. package/src/shares/api.ts +26 -7
  654. package/src/shares/bug-report-dialog.tsx +2 -2
  655. package/src/shares/bug-report-flow.tsx +4 -7
  656. package/src/shares/capture-flow.ts +5 -4
  657. package/src/shares/capture-preview.tsx +2 -2
  658. package/src/shares/chat.ts +7 -27
  659. package/src/shares/flow.tsx +86 -40
  660. package/src/shares/location.ts +1 -3
  661. package/src/shares/pane-image.ts +11 -9
  662. package/src/shares/pane.ts +5 -2
  663. package/src/shares/payload.ts +1 -1
  664. package/src/shares/personal-pane.ts +3 -3
  665. package/src/shares/portable-layout.ts +9 -2
  666. package/src/shares/ready.ts +42 -0
  667. package/src/shares/test-harness.ts +62 -0
  668. package/src/sources/gloomberb-cloud/batched-lookups.ts +73 -0
  669. package/src/sources/gloomberb-cloud/index.ts +64 -12
  670. package/src/sources/gloomberb-cloud/normalizers.ts +31 -2
  671. package/src/sources/gloomberb-cloud/perpetuals.ts +20 -1
  672. package/src/sources/history-omitted.ts +34 -0
  673. package/src/sources/history-result.ts +3 -0
  674. package/src/sources/history-retention.ts +1 -1
  675. package/src/sources/provider-errors.ts +43 -1
  676. package/src/sources/provider-router/batches.ts +3 -2
  677. package/src/sources/provider-router/cache.ts +2 -1
  678. package/src/sources/provider-router/cached-routes.ts +9 -3
  679. package/src/sources/provider-router/history.ts +9 -8
  680. package/src/sources/provider-router/index.ts +18 -3
  681. package/src/sources/provider-router/primary.ts +5 -4
  682. package/src/sources/provider-router/quote-route.ts +3 -1
  683. package/src/sources/provider-router/routing.ts +2 -1
  684. package/src/sources/provider-router/search.ts +47 -13
  685. package/src/sources/provider-router/streaming.ts +7 -4
  686. package/src/sources/sec-edgar.ts +1 -3
  687. package/src/state/app/context/index.tsx +9 -13
  688. package/src/state/app/tab-cursor.ts +149 -12
  689. package/src/state/hooks/quote-streaming.ts +3 -2
  690. package/src/state/hooks/session-snapshot.ts +3 -2
  691. package/src/state/persist-scheduler.ts +12 -4
  692. package/src/sync/controller.ts +22 -1
  693. package/src/sync/core-contributors.ts +58 -15
  694. package/src/team/collections-sync.ts +14 -4
  695. package/src/team/collections.ts +40 -11
  696. package/src/team/store.ts +5 -4
  697. package/src/telemetry/attention-counts.ts +8 -2
  698. package/src/telemetry/crash-reports-dom.ts +3 -0
  699. package/src/telemetry/crash-reports-node.ts +7 -4
  700. package/src/telemetry/crash-reports.ts +11 -11
  701. package/src/telemetry/usage-counts.ts +16 -12
  702. package/src/theme/colors.ts +2 -0
  703. package/src/theme/font-scale.ts +2 -0
  704. package/src/theme/ui-tokens.ts +71 -0
  705. package/src/tickers/batched-lookups.ts +186 -0
  706. package/src/tickers/company-name-listing.ts +97 -0
  707. package/src/tickers/company-name.ts +13 -0
  708. package/src/tickers/instrument-coverage.ts +112 -0
  709. package/src/tickers/listing-fate.ts +49 -9
  710. package/src/tickers/listing-venues.ts +24 -5
  711. package/src/tickers/open-target.ts +13 -5
  712. package/src/tickers/search/index.ts +112 -35
  713. package/src/tickers/search/ranking.ts +49 -1
  714. package/src/tickers/terminal-codes.ts +79 -0
  715. package/src/tickers/ticker-changes.ts +74 -3
  716. package/src/tickers/us-listing.ts +2 -1
  717. package/src/time-series/chart-data.ts +79 -8
  718. package/src/time-series/fundamentals.ts +55 -7
  719. package/src/time-series/ice-credit.ts +17 -2
  720. package/src/time-series/live-bars.ts +21 -8
  721. package/src/time-series/live-quotes.ts +2 -3
  722. package/src/time-series/price-comparison.ts +6 -1
  723. package/src/time-series/resolve.ts +65 -10
  724. package/src/time-series/spec.ts +2 -1
  725. package/src/time-series/studies.ts +3 -3
  726. package/src/time-series/types.ts +22 -0
  727. package/src/time-series/use-chart-resolution.ts +2 -1
  728. package/src/types/config.ts +7 -0
  729. package/src/types/data-provider.ts +20 -0
  730. package/src/types/headless.ts +142 -1
  731. package/src/types/instrument.ts +6 -0
  732. package/src/types/plugin.ts +32 -9
  733. package/src/types/price-history.ts +5 -0
  734. package/src/types/ticker-changes.ts +19 -0
  735. package/src/types/ticker.ts +10 -2
  736. package/src/ui/context-menu.tsx +2 -0
  737. package/src/ui/host.tsx +40 -4
  738. package/src/ui/measured-cells.ts +13 -7
  739. package/src/ui/qr.ts +7 -5
  740. package/src/updater/index.ts +5 -5
  741. package/src/utils/calendar-date.ts +86 -27
  742. package/src/utils/currency-units.ts +17 -0
  743. package/src/utils/debug-log.ts +1 -1
  744. package/src/utils/dividend-cash.ts +48 -0
  745. package/src/utils/dom-screenshot-rasters.ts +3 -1
  746. package/src/utils/dom-screenshot.ts +14 -10
  747. package/src/utils/exchange-rate-snapshot.ts +9 -4
  748. package/src/utils/external-url.ts +1 -0
  749. package/src/utils/fiscal-period.ts +47 -0
  750. package/src/utils/format.ts +5 -2
  751. package/src/utils/forward-dividend.ts +160 -11
  752. package/src/utils/futures-generic.ts +34 -8
  753. package/src/utils/http-proxy-response.ts +2 -1
  754. package/src/utils/local-utc-offset.ts +2 -0
  755. package/src/utils/log-failure.ts +31 -0
  756. package/src/utils/option-expiry.ts +12 -12
  757. package/src/utils/price-history-integrity.ts +56 -0
  758. package/src/utils/price-history.ts +13 -1
  759. package/src/utils/sec-filings.ts +245 -0
  760. package/src/utils/selection-clipboard.ts +5 -2
  761. package/src/utils/throttled-fetch.ts +1 -0
  762. package/src/{plugins/builtin/dividend-yield/trailing-cash.ts → utils/trailing-dividend.ts} +55 -8
  763. package/src/utils/url.ts +1 -0
  764. package/src/utils/utc-time.ts +11 -0
  765. package/src/plugins/builtin/chat/share/targets.ts +0 -27
  766. package/src/renderers/dom/host/top-surface.ts +0 -119
  767. package/src/shares/dialog.tsx +0 -221
  768. package/src/shares/live.ts +0 -19
@@ -1,11 +1,13 @@
1
1
  /**
2
- * Companies ranked by recent open-market insider buying, as
3
- * `GET /cloud/sec/insider-signals` returns them. Only Form 4 purchases (code
4
- * P) by officers, directors and 10% owners count. Dates are `YYYY-MM-DD`,
5
- * values USD.
2
+ * Companies ranked by recent open-market insider buying or selling, as
3
+ * `GET /cloud/sec/insider-signals` returns them. Buying counts Form 4
4
+ * purchases (code P), selling the sales (code S) an insider chose to make: a
5
+ * Rule 10b5-1 plan's, a sell-to-cover's, an option exercise's and an
6
+ * offering's are left out. Only officers, directors and 10% owners count.
7
+ * Dates are `YYYY-MM-DD`, values USD.
6
8
  */
7
9
 
8
- type InsiderSignalRole =
10
+ export type InsiderSignalRole =
9
11
  | "CEO"
10
12
  | "CFO"
11
13
  | "COO"
@@ -15,13 +17,57 @@ type InsiderSignalRole =
15
17
  | "Director"
16
18
  | "10% owner";
17
19
 
18
- interface InsiderSignalBuyer {
20
+ /** Purchases or sales. */
21
+ export type InsiderSignalSide = "buy" | "sell";
22
+ /** Whose trades a ranking reads: everyone, chief officers and other officers, directors, or 10% owners. */
23
+ export type InsiderSignalRoleGroup = "all" | "officers" | "directors" | "owners";
24
+ /** Market value: micro under $300M, small to $2B, mid to $10B, large above. */
25
+ export type InsiderSignalCap = "micro" | "small" | "mid" | "large";
26
+
27
+ /**
28
+ * One insider in a row: what they traded in the window. On the sell side
29
+ * `buys` and `lastBuy` are the days they sold and the last of them.
30
+ */
31
+ export interface InsiderSignalBuyer {
19
32
  name: string;
20
33
  role: InsiderSignalRole;
21
34
  value: number;
22
- /** Days the insider bought in the window. */
35
+ /** Days the insider traded in the window. */
23
36
  buys: number;
24
37
  lastBuy: string;
38
+ /** Left out by servers that predate selling. */
39
+ shares?: number;
40
+ /** The holding's change in the window, percent: positive bought, negative sold; null without balances. */
41
+ stakeChangePct?: number | null;
42
+ /** Opened a position: held nothing before, or a holding worth under $10K or under 1% of what was bought. */
43
+ newPosition?: boolean;
44
+ /** Sold every share and unit the forms report. */
45
+ exited?: boolean;
46
+ /**
47
+ * The insider's trade days in the 90 days ending on their last, the days
48
+ * before the window included: their nth buy (sale), 1 for a lone day. Null
49
+ * when they traded both ways. Left out by servers that predate it.
50
+ */
51
+ repeatBuys?: number | null;
52
+ /**
53
+ * Their largest day in the window against their usual size, to a tenth and
54
+ * at most 100 ("100x+"); null without enough history, or when they traded
55
+ * both ways. Left out by servers that predate it.
56
+ */
57
+ usualRatio?: number | null;
58
+ /** Bought and sold in the window: the row counts the net, on the side it falls. */
59
+ twoWay?: boolean;
60
+ }
61
+
62
+ /** One fact behind a row, structured, strongest first. */
63
+ interface InsiderWhySignal {
64
+ kind: "cluster" | "repeat" | "usual" | "stake" | "new" | "exited" | "size" | "both";
65
+ /** cluster: insiders; repeat: the ordinal; usual: the multiple; stake: percent, negative sold; new, exited, both: 1; size: dollars. */
66
+ value: number;
67
+ /** A few characters: "3 insiders", "4th buy", "5x usual", "+56%", "6x stake", "NEW", "both ways". */
68
+ text: string;
69
+ /** The insider it is about; null for the company's (a cluster). */
70
+ insider: { name: string; role: InsiderSignalRole } | null;
25
71
  }
26
72
 
27
73
  export interface InsiderSignalRow {
@@ -32,9 +78,9 @@ export interface InsiderSignalRow {
32
78
  score: number;
33
79
  /** Why the company ranks, strongest first, in plain words. */
34
80
  reasons: string[];
35
- /** Distinct insiders who bought in the window. */
81
+ /** Distinct insiders who traded in the window. */
36
82
  insiders: number;
37
- /** Insider buy days in the window. */
83
+ /** Insider trade days in the window. */
38
84
  buys: number;
39
85
  value: number;
40
86
  shares: number;
@@ -47,14 +93,40 @@ export interface InsiderSignalRow {
47
93
  usualRatio: number | null;
48
94
  stakeIncreasePct: number | null;
49
95
  newPosition: boolean;
96
+ /** Left out by servers that predate selling. */
97
+ stakeChangePct?: number | null;
98
+ exited?: boolean;
50
99
  };
51
- /** The biggest buyers, up to five. */
100
+ /** The reasons' facts, structured; left out by servers that predate them. */
101
+ whySignals?: InsiderWhySignal[];
102
+ /** The insiders who traded, largest first, up to ten. */
52
103
  buyers: InsiderSignalBuyer[];
104
+ /** Stored market value, USD; null when the server has none for it. */
105
+ marketCap?: number | null;
106
+ }
107
+
108
+ interface InsiderSignalsFilters {
109
+ role: InsiderSignalRoleGroup;
110
+ minValue: number;
111
+ cluster: boolean;
112
+ position: "new" | "exited" | null;
113
+ cap: InsiderSignalCap | null;
53
114
  }
54
115
 
55
116
  export interface InsiderSignalsPayload {
56
- /** Days of buying each row covers, ending `through`. */
117
+ /**
118
+ * The company asked for (`ticker`): `rows` is its row alone, with every
119
+ * insider, whatever its size. Absent for the ranking, and from a server
120
+ * that predates the question, which answers the ranking instead.
121
+ */
122
+ ticker?: string;
123
+ /** Left out by servers that predate selling: buying. */
124
+ side?: InsiderSignalSide;
125
+ /** Days of trading each row covers, ending `through`. */
57
126
  window: number;
127
+ filters?: InsiderSignalsFilters;
128
+ /** Whether rows carry market values, so the cap filter can work. */
129
+ marketCaps?: "stored" | "unavailable";
58
130
  through: string;
59
131
  /** The newest filing day read. */
60
132
  asOf: string | null;
@@ -68,8 +140,20 @@ export interface InsiderSignalsPayload {
68
140
  }
69
141
 
70
142
  export interface CloudInsiderSignalsParams {
143
+ /** Buying unless told. */
144
+ side?: InsiderSignalSide;
71
145
  /** Days, 1 to 90; the server reads 30 when left out. */
72
146
  window?: number;
73
147
  /** Rows, 1 to 200; the server reads 50 when left out. */
74
148
  limit?: number;
149
+ role?: InsiderSignalRoleGroup;
150
+ /** USD the insiders traded in the window, at least. */
151
+ minValue?: number;
152
+ /** Only companies where two insiders or more traded within a span. */
153
+ cluster?: boolean;
154
+ /** "new" on the buy side, "exited" on the sell side. */
155
+ position?: "new" | "exited";
156
+ cap?: InsiderSignalCap;
157
+ /** One company instead of the ranking: its row, with every insider. */
158
+ ticker?: string;
75
159
  }
@@ -134,6 +134,7 @@ export function normalizeChatMessage(message: ChatMessage): ChatMessage {
134
134
  if (paneLink) normalized.paneLink = paneLink;
135
135
  else delete normalized.paneLink;
136
136
  }
137
+ if ((message.announcement as unknown) !== true) delete normalized.announcement;
137
138
  return normalized;
138
139
  }
139
140
 
@@ -246,6 +246,8 @@ export type CloudSecFilingsParams = {
246
246
  name?: string;
247
247
  limit?: number;
248
248
  offset?: number;
249
+ /** Only these forms, each with its amendment (`8-K` is also `8-K/A`). A server that predates the filter sends every form. */
250
+ forms?: readonly string[];
249
251
  };
250
252
 
251
253
  export type CloudSecFilingParams = {
@@ -361,6 +363,10 @@ export function cloudEarningsTranscriptPath(id: string): string {
361
363
  return `/cloud/transcripts/${encodeURIComponent(id)}`;
362
364
  }
363
365
 
366
+ export function cloudEarningsCallAudioPath(id: string): string {
367
+ return `${cloudEarningsTranscriptPath(id)}/audio`;
368
+ }
369
+
364
370
  /**
365
371
  * An issuer read's path: a US listing or a bare symbol keeps its US ticker
366
372
  * and sends nothing else; a listing abroad sends its bare symbol with its
@@ -429,10 +435,16 @@ export function cloudSecFilingsPath(params: CloudSecFilingsParams): string {
429
435
  });
430
436
  if (params.limit != null) search.set("limit", String(params.limit));
431
437
  if (params.offset != null) search.set("offset", String(params.offset));
438
+ if (params.forms?.length) search.set("form", params.forms.join(","));
432
439
  setListingAbroad(search, abroad);
433
440
  return appendQuery("/cloud/sec/filings", search);
434
441
  }
435
442
 
443
+ /** A US-listed company's bank figures: SEC deposits and its lead bank's FDIC call report. */
444
+ export function cloudBankFiguresPath(symbol: string): string {
445
+ return appendQuery("/cloud/bank-figures", new URLSearchParams({ symbol }));
446
+ }
447
+
436
448
  /** Schedule 13D and 13G reports about the issuer behind `ticker`. */
437
449
  export function cloudSecBeneficialOwnersPath(params: CloudBeneficialOwnersParams): string {
438
450
  const abroad = listingAbroad(params.ticker, params.exchange, params.name);
@@ -445,11 +457,18 @@ export function cloudSecBeneficialOwnersPath(params: CloudBeneficialOwnersParams
445
457
  return appendQuery("/cloud/sec/beneficial-owners", search);
446
458
  }
447
459
 
448
- /** Companies ranked by recent open-market insider buying. */
460
+ /** Companies ranked by recent open-market insider buying or selling. Defaults are left out of the query. */
449
461
  export function cloudSecInsiderSignalsPath(params: CloudInsiderSignalsParams = {}): string {
450
462
  const search = new URLSearchParams();
463
+ if (params.side === "sell") search.set("side", "sell");
451
464
  if (params.window != null) search.set("window", String(params.window));
452
465
  if (params.limit != null) search.set("limit", String(params.limit));
466
+ if (params.role && params.role !== "all") search.set("role", params.role);
467
+ if (params.minValue) search.set("minValue", String(params.minValue));
468
+ if (params.cluster) search.set("cluster", "true");
469
+ if (params.position) search.set("position", params.position);
470
+ if (params.cap) search.set("cap", params.cap);
471
+ if (params.ticker) search.set("ticker", params.ticker);
453
472
  return appendQuery("/cloud/sec/insider-signals", search);
454
473
  }
455
474
 
@@ -1,3 +1,4 @@
1
+ import { logFailure } from "../utils/log-failure";
1
2
  import { httpFetch, isHttpFetchStreaming } from "../utils/http-transport";
2
3
  import { withDeadline } from "../utils/async-deadline";
3
4
  import {
@@ -148,7 +149,7 @@ export async function putWithRevision<T, Current extends { revision: number }>(
148
149
  });
149
150
  } catch (error) {
150
151
  if (!(error instanceof ApiRequestError) || error.status !== 412) throw error;
151
- const current = await revision.loadCurrent().catch(() => null);
152
+ const current = await revision.loadCurrent().catch(logFailure("cloud-request", "Current revision request failed", null));
152
153
  throw new revision.conflict(error.message, current, current?.revision ?? (revision.expected ?? 0) + 1);
153
154
  }
154
155
  }
@@ -269,7 +270,7 @@ export class CloudApiRequestTransport {
269
270
  });
270
271
  throwIfRequestAborted(options.signal);
271
272
  if (!response.ok) {
272
- const text = await response.text().catch(() => "");
273
+ const text = await response.text().catch(logFailure("cloud-request", "Error response body read failed", ""));
273
274
  throw new ApiRequestError(
274
275
  parseApiErrorMessage(text),
275
276
  response.status,
@@ -411,12 +412,19 @@ export class CloudApiRequestTransport {
411
412
  // layers, which a server without them answers with 404, or a ticker
412
413
  // change lookup: a note beside a quote, never one of the refused market
413
414
  // requests a lookup of many symbols waits out and retries. Nor the
414
- // tickers beside a list of organization names, which say so in place.
415
+ // tickers beside a list of organization names, which say so in place,
416
+ // or a 13F filer's EDGAR filing list, whose report says it went unchecked.
417
+ // Nor the batched searches and ticker changes a list of symbols starts
418
+ // with: a service without them answers 404, and whatever they leave
419
+ // unanswered is looked up one symbol at a time, which is tracked.
415
420
  if (
416
421
  path.startsWith("/telemetry/")
417
422
  || path === "/assist/searches"
418
423
  || path === "/cloud/geo/layers"
424
+ || path.startsWith("/cloud/sec/13f/filer?")
419
425
  || path.startsWith("/market/ticker-changes?")
426
+ || path === "/market/ticker-changes/batch"
427
+ || path === "/market/search/batch"
420
428
  || path === "/market/organization-tickers"
421
429
  ) return request();
422
430
  return this.connectionHealth.track(
@@ -1,3 +1,4 @@
1
+ import { logFailure } from "../utils/log-failure";
1
2
  import { apiClient } from "./index";
2
3
  import { getCurrentPluginTarget } from "../plugins/current-target";
3
4
  import type { DesktopDeepLinkBridge } from "../types/desktop-deeplink";
@@ -99,6 +100,7 @@ function cleanUrlValue(value: unknown): string | undefined {
99
100
  new URL(cleaned);
100
101
  return cleaned;
101
102
  } catch {
103
+ // Intentional ignore: Malformed attribution URLs are excluded from the payload.
102
104
  return undefined;
103
105
  }
104
106
  }
@@ -122,7 +124,7 @@ export function readStoredAttribution(stored: string | null, now = Date.now()):
122
124
  const parsed: unknown = JSON.parse(stored ?? "{}");
123
125
  if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) saved = parsed as Record<string, unknown>;
124
126
  } catch {
125
- /* Corrupt storage is the same as no storage. */
127
+ // Intentional ignore: Corrupt optional attribution is treated as absent.
126
128
  }
127
129
 
128
130
  const next: Record<string, string> = {};
@@ -170,6 +172,7 @@ export function carriesHandoff(href: string): boolean {
170
172
  FIRST_TOUCH_KEYS.some((key) => params.has(key))
171
173
  );
172
174
  } catch {
175
+ // Intentional ignore: Malformed links carry no usable attribution handoff.
173
176
  return false;
174
177
  }
175
178
  }
@@ -258,7 +261,7 @@ export function initializeBrowserResearchActivity(): void {
258
261
  stripHandoffParams(url);
259
262
  history.replaceState(history.state, "", url.href);
260
263
  } catch {
261
- /* Private browsing must still work. */
264
+ // Intentional ignore: Private browsing may deny optional attribution storage.
262
265
  }
263
266
  }
264
267
 
@@ -275,7 +278,7 @@ export function initializeDesktopResearchActivity(storage: StorageLike = localSt
275
278
  anonymousId = stored && ANONYMOUS_ID.test(stored) ? stored : undefined;
276
279
  attribution = readStoredAttribution(storage.getItem(ATTRIBUTION_STORAGE_KEY));
277
280
  } catch {
278
- /* A read-only profile still runs the app. */
281
+ // Intentional ignore: A read-only profile may deny optional attribution storage.
279
282
  }
280
283
  }
281
284
 
@@ -297,6 +300,7 @@ export function adoptDesktopHandoff(href: string, storage: StorageLike = localSt
297
300
  storage.setItem(ATTRIBUTION_STORAGE_KEY, JSON.stringify(attribution));
298
301
  return true;
299
302
  } catch {
303
+ // Intentional ignore: Optional attribution storage may be unavailable; the deep link still opens.
300
304
  return false;
301
305
  }
302
306
  }
@@ -406,9 +410,10 @@ export function recordResearchActivity(
406
410
  if (!wallEvent) return;
407
411
  const views = wallSessionViews();
408
412
  views.add(key);
409
- try { sessionStorage.setItem(WALL_VIEWS_SESSION_KEY, JSON.stringify([...views])); } catch { /* Native sessions use the in-memory set. */ }
413
+ try { sessionStorage.setItem(WALL_VIEWS_SESSION_KEY, JSON.stringify([...views])); } catch { /* Intentional ignore: Native sessions retain wall views in the in-memory set. */ }
410
414
  })
411
- .catch(() => {
415
+ .catch((error) => {
416
+ logFailure("cloud-telemetry", "Research activity request failed")(error);
412
417
  sent.delete(key);
413
418
  });
414
419
  }
@@ -432,7 +437,8 @@ export function recordResearchTabView(tabId: string, fromExternalPlugin: boolean
432
437
  export function identifyResearchUser(): void {
433
438
  try {
434
439
  recordResearchActivity("workspace_opened");
435
- } catch {
440
+ } catch (error) {
441
+ logFailure("cloud-telemetry", "Research identity reporting failed")(error);
436
442
  /* Analytics never blocks sign-in. */
437
443
  }
438
444
  }
@@ -444,6 +450,7 @@ function webExperimentAttribution(): { experiments?: string } {
444
450
  const experiments = storedExperimentAssignments(localStorage);
445
451
  return experiments ? { experiments } : {};
446
452
  } catch {
453
+ // Intentional ignore: Unavailable optional storage contributes no experiment attribution.
447
454
  return {};
448
455
  }
449
456
  }
@@ -499,7 +506,7 @@ function wallExperimentContext(): WallExperimentContext {
499
506
  try {
500
507
  if (surface === "web") local = localStorage;
501
508
  if (surface === "web" || surface === "desktop") session = sessionStorage;
502
- } catch { /* Native and private sessions keep their answer in memory. */ }
509
+ } catch { /* Intentional ignore: Native and private sessions keep experiment answers in memory. */ }
503
510
  return {
504
511
  surface,
505
512
  accountId: user?.id,
@@ -516,7 +523,7 @@ function wallSessionViews(): Set<string> {
516
523
  try {
517
524
  const saved: unknown = JSON.parse(sessionStorage.getItem(WALL_VIEWS_SESSION_KEY) ?? "[]");
518
525
  if (Array.isArray(saved)) return new Set(saved.filter((value): value is string => typeof value === "string"));
519
- } catch { /* Native sessions use the in-memory set. */ }
526
+ } catch { /* Intentional ignore: Native sessions retain wall views in the in-memory set. */ }
520
527
  return new Set();
521
528
  }
522
529
 
@@ -1,3 +1,4 @@
1
+ import { logFailure } from "../utils/log-failure";
1
2
  import type { TapeFeedEvent } from "./tape";
2
3
  import type {
3
4
  AuthUser,
@@ -188,7 +189,7 @@ export class CloudApiSocket {
188
189
  try {
189
190
  ws?.close();
190
191
  } catch {
191
- // ignore closed sockets
192
+ // Intentional ignore: Closing an already closed socket needs no further cleanup.
192
193
  }
193
194
  }
194
195
 
@@ -312,7 +313,8 @@ export class CloudApiSocket {
312
313
  try {
313
314
  this.ws.send(JSON.stringify(payload));
314
315
  return true;
315
- } catch {
316
+ } catch (error) {
317
+ logFailure("cloud-socket", "WebSocket frame send failed")(error);
316
318
  return false;
317
319
  }
318
320
  }
@@ -557,7 +559,8 @@ export class CloudApiSocket {
557
559
  let parsed: any;
558
560
  try {
559
561
  parsed = JSON.parse(raw);
560
- } catch {
562
+ } catch (error) {
563
+ logFailure("cloud-socket", "WebSocket message decoding failed")(error);
561
564
  return;
562
565
  }
563
566
 
@@ -7,7 +7,7 @@ export interface GraphOptions {
7
7
  minPct: number; minConfidence: number; limit: number; ranking: "score" | "shortest"; asOf?: string;
8
8
  }
9
9
  export const DEFAULT_GRAPH_OPTIONS: GraphOptions = { depth: 2, direction: "both", roles: [], sources: [], tiers: [], minPct: 0, minConfidence: 0, limit: 50, ranking: "score" };
10
- export interface GraphEvidence extends Pick<SupplyRow, "claimType" | "corroboration" | "leadStatus" | "firstSeenAt" | "lastSeenAt" | "lastConfirmedAt" | "whyUnconfirmed" | "evidence" | "nativeAmount" | "nativeCurrency" | "nativeScale" | "entityScope" | "quoteGloss" | "sectionRef" | "sourceAttribution"> {
10
+ export interface GraphEvidence extends Pick<SupplyRow, "claimType" | "corroboration" | "leadStatus" | "firstSeenAt" | "lastSeenAt" | "lastConfirmedAt" | "whyUnconfirmed" | "evidence" | "nativeAmount" | "nativeCurrency" | "nativeScale" | "entityScope" | "quoteGloss" | "sectionRef" | "sourceAttribution" | "periodMonths"> {
11
11
  /** Source trust tier, distinct from the graph evidence class in tier. */
12
12
  trustTier?: SupplyTier;
13
13
  id: string; fromEntity: string; toEntity: string; reportingEntity: string;
@@ -25,7 +25,7 @@ interface GraphLink {
25
25
  }
26
26
  export interface GraphPath {
27
27
  id: string; nodeIds: string[]; linkIds: string[]; hops: number; score: number; confidence: number;
28
- exposure: { pct: number; basis: NonNullable<SupplyRow["pctBasis"]>; period: string; denominatorEntityId: string; estimated: true } | null;
28
+ exposure: { pct: number; basis: NonNullable<SupplyRow["pctBasis"]>; period: string; periodMonths?: number | null; denominatorEntityId: string; estimated: true } | null;
29
29
  }
30
30
  interface GraphReach { entityId: string; direction: "upstream" | "downstream"; hops: number; bestPath: GraphPath; shortestPath: GraphPath; }
31
31
  export interface GraphPayload {
@@ -55,6 +55,8 @@ export interface SupplyRow {
55
55
  jurisdiction?: string | null;
56
56
  entityScope?: "entity" | "group" | "anonymous" | "aggregate" | null;
57
57
  period: string;
58
+ /** Months every figure on the row covers: 0 a balance at the period end, 3 a quarter, 12 a year. Null or absent when the source does not say or the figures differ in length. */
59
+ periodMonths?: number | null;
58
60
  fiscalYear: string | null;
59
61
  sourceKind: "xbrl" | "filing_text" | "call" | "news" | "web" | "import" | "press_release";
60
62
  form: string | null;
@@ -88,6 +90,12 @@ export interface SupplyChainPayload {
88
90
  says: SupplyRow[];
89
91
  names: SupplyRow[];
90
92
  counts: { says: Record<SupplyRole, number>; names: Record<SupplyRole, number> };
93
+ /**
94
+ * Shares from a period before the latest one their reporter disclosed on the
95
+ * same basis: dated, never current rows. Absent from older servers.
96
+ */
97
+ earlier?: { says: SupplyRow[]; names: SupplyRow[] };
98
+ earlierCounts?: { says: Record<SupplyRole, number>; names: Record<SupplyRole, number> };
91
99
  access: "full" | "preview";
92
100
  lockedRows: number;
93
101
  totalRows: number;
@@ -39,6 +39,18 @@ export interface TapeSnapshot {
39
39
  corrections: number;
40
40
  cancels: number;
41
41
  connected: boolean;
42
+ /**
43
+ * Present when a window was asked for (`from`/`to`): the span served, its
44
+ * end clipped to the feed cutoff, and whether a channel held more than its
45
+ * capacity there, so only the first of its prints are listed. Absent from a
46
+ * server that predates windows, which answers with the latest tape.
47
+ */
48
+ window?: TapeRange & { truncated: { trades: boolean; quotes: boolean } };
49
+ }
50
+ /** A span of the tape as ISO instants; `to` is exclusive. */
51
+ export interface TapeRange {
52
+ from: string;
53
+ to: string;
42
54
  }
43
55
  export type TapeFeedEvent = { type: "data"; payload: TapeSnapshot }
44
56
  | { type: "reset" | "disconnected"; reason: string };
@@ -120,6 +120,12 @@ export interface ChatMessage {
120
120
  attachmentReview?: "pending" | "failed";
121
121
  /** What the message opens in the terminal (a Gloom Wire story or calendar). Only the server sets it. */
122
122
  paneLink?: ChatPaneLink;
123
+ /**
124
+ * An announcement Gloom posted, drawn as one. Only the server sets it, and
125
+ * only on one that still stands: a retracted announcement is the removal
126
+ * placeholder without it.
127
+ */
128
+ announcement?: true;
123
129
  clientStatus?: "sending" | "failed";
124
130
  clientError?: string | null;
125
131
  /** The idempotency key a local send went out with, so a retry repeats it. */
@@ -611,9 +617,25 @@ export interface CloudCdsHistoryPointPayload {
611
617
  reported: number;
612
618
  /** The contract on the run that day, e.g. "2031-12-20". */
613
619
  maturity: string;
620
+ /** For a line quoted upfront: that day's level in points on the line's coupon. */
621
+ upfrontPts?: number;
622
+ }
623
+
624
+ /**
625
+ * Past 2,000bp a name is quoted in points upfront on its running coupon, the
626
+ * level and its moves alike; `spreadBp` and the bp moves stay beside them.
627
+ * Absent from servers before it, which read as `spread`.
628
+ */
629
+ interface CloudCdsUpfrontQuote {
630
+ quote?: "spread" | "upfront";
631
+ /** The line's running coupon, bp. */
632
+ couponBp?: number | null;
633
+ upfrontPts?: number | null;
634
+ change1WPts?: number | null;
635
+ change1MPts?: number | null;
614
636
  }
615
637
 
616
- export interface CloudCdsHistoryResponse {
638
+ export interface CloudCdsHistoryResponse extends CloudCdsUpfrontQuote {
617
639
  source: string;
618
640
  /** The matched reference entity, or null when nothing on the tape matched. */
619
641
  issuer: string | null;
@@ -621,14 +643,31 @@ export interface CloudCdsHistoryResponse {
621
643
  currency: string | null;
622
644
  asOf: string | null;
623
645
  points: CloudCdsHistoryPointPayload[];
646
+ /**
647
+ * The last point's move over a week and a month in bp, on one contract and
648
+ * chained through the contract before across a roll, as the index board's.
649
+ * Null without a comparable level, or once the level is more than 5 trading
650
+ * days behind the tape; absent from servers before them.
651
+ */
652
+ change1W?: number | null;
653
+ change1M?: number | null;
654
+ /**
655
+ * Why the line has no level in the month to its newest print, when one
656
+ * cause explains it: `upfront-side-unknown` when the prints carry an
657
+ * upfront without the side that paid it and nothing else places the level.
658
+ */
659
+ noLevelReason?: string | null;
624
660
  }
625
661
 
626
662
  /** An issuer's latest 5Y level: the last point of its history over the last month. */
627
- export interface CloudCdsLevelPayload {
663
+ export interface CloudCdsLevelPayload extends CloudCdsUpfrontQuote {
628
664
  /** The reference entity as the history response names it. */
629
665
  issuer: string;
630
666
  spreadBp: number;
631
667
  date: string;
668
+ /** As the history response's moves for the same name. */
669
+ change1W?: number | null;
670
+ change1M?: number | null;
632
671
  }
633
672
 
634
673
  export interface CloudCdsLevelsResponse {
@@ -1099,6 +1138,8 @@ export interface CloudTranscriptTurnPayload {
1099
1138
  isQa: boolean;
1100
1139
  /** Offset into the recording; null when the company published the transcript as a document. */
1101
1140
  startSeconds: number | null;
1141
+ /** Where each of `paragraphs` starts in the recording, in seconds; absent without timings or on older servers. */
1142
+ paragraphStarts?: number[];
1102
1143
  }
1103
1144
 
1104
1145
  interface CloudTranscriptKeyFigurePayload {
@@ -1145,6 +1186,20 @@ export interface CloudEarningsTranscriptPayload {
1145
1186
  updatedAt: string | null;
1146
1187
  }
1147
1188
 
1189
+ /**
1190
+ * A call's audio to play beside its transcript. `kind` names what it is; a
1191
+ * stored recording is the only kind so far.
1192
+ */
1193
+ export interface CloudEarningsCallAudioPayload {
1194
+ kind: "recording";
1195
+ /** A signed address that plays until `expiresAt`, seeking included. */
1196
+ url: string;
1197
+ expiresAt: string;
1198
+ durationSeconds: number | null;
1199
+ bytes?: number;
1200
+ contentType?: string;
1201
+ }
1202
+
1148
1203
  export type CloudSearchDocType = "transcript" | "news" | "filing";
1149
1204
 
1150
1205
  export type CloudSearchSort = "relevance" | "newest" | "oldest";
@@ -1263,10 +1318,14 @@ interface CloudSecFilingPayload {
1263
1318
  primaryDocument?: string;
1264
1319
  primaryDocDescription?: string;
1265
1320
  items?: string;
1321
+ /** SEC's period of report, YYYY-MM-DD: a 10-Q's or 10-K's balance-sheet date. Absent from older servers. */
1322
+ reportDate?: string;
1266
1323
  cik: string;
1267
1324
  companyName?: string;
1268
1325
  filingUrl: string;
1269
1326
  primaryDocumentUrl?: string;
1327
+ /** The filing's SEC file number for this company, empty when it has none. Absent from older servers. */
1328
+ fileNumber?: string;
1270
1329
  }
1271
1330
 
1272
1331
  interface CloudSecDocumentPayload {
@@ -1488,6 +1547,11 @@ export interface CloudMarketResponse<T> {
1488
1547
  session?: unknown;
1489
1548
  /** "1day" when daily bars answer an intraday range: the listing has no intraday bars. */
1490
1549
  servedResolution?: unknown;
1550
+ /**
1551
+ * Untrusted: daily sessions the bars leave out and why, as
1552
+ * `[{ date: "2020-04-20", reason: "non-positive-close" }]`. Validated by the history adapter.
1553
+ */
1554
+ omittedSessions?: unknown;
1491
1555
  /** Untrusted until the history adapter validates its boundary dates. */
1492
1556
  coverage?: CloudHistoryCoverage;
1493
1557
  providerMeta?: {
@@ -1,3 +1,4 @@
1
+ import { logFailure } from "../utils/log-failure";
1
2
  import type { ExperimentAnswer, StorageLike } from "./web-experiments";
2
3
 
3
4
  /**
@@ -36,11 +37,11 @@ function isVariant(value: unknown): value is UpgradePersonalizedVariant {
36
37
  }
37
38
 
38
39
  function read(storage: StorageLike | undefined, key: string): string | null {
39
- try { return storage?.getItem(key) ?? null; } catch { return null; }
40
+ try { return storage?.getItem(key) ?? null; } catch { /* Intentional ignore: Private browsing may deny optional experiment storage. */ return null; }
40
41
  }
41
42
 
42
43
  function write(storage: StorageLike | undefined, key: string, value: string): void {
43
- try { storage?.setItem(key, value); } catch { /* Storage is optional in private browsing. */ }
44
+ try { storage?.setItem(key, value); } catch { /* Intentional ignore: Private browsing may deny optional experiment storage. */ }
44
45
  }
45
46
 
46
47
  /**
@@ -77,7 +78,7 @@ export function createUpgradeExperimentSession() {
77
78
  if (inFlight) return inFlight;
78
79
  const request = (async () => {
79
80
  let answer: ExperimentAnswer;
80
- try { answer = await ask(); } catch { return null; }
81
+ try { answer = await ask(); } catch (error) { logFailure("cloud-experiments", "Experiment exposure request failed")(error); return null; }
81
82
  const variant = answer.accepted && isVariant(answer.variant) ? answer.variant : null;
82
83
  answers.set(identity, variant);
83
84
  write(context.session, `${SESSION_PREFIX}${identity}`, variant ?? "excluded");
@@ -1,3 +1,4 @@
1
+ import { logFailure } from "../utils/log-failure";
1
2
  import { EXPERIMENTS_STORAGE_KEY, storedExperimentAssignments, type ExperimentAnswer, type StorageLike } from "./web-experiments";
2
3
 
3
4
  export type WallExperiment = "wall_teaser" | "wall_teaser_signin";
@@ -25,11 +26,11 @@ function unit(context: WallExperimentContext, experiment: WallExperiment): strin
25
26
  }
26
27
 
27
28
  function read(storage: StorageLike | undefined, key: string): string | null {
28
- try { return storage?.getItem(key) ?? null; } catch { return null; }
29
+ try { return storage?.getItem(key) ?? null; } catch { /* Intentional ignore: Private browsing may deny optional experiment storage. */ return null; }
29
30
  }
30
31
 
31
32
  function write(storage: StorageLike | undefined, key: string, value: string): void {
32
- try { storage?.setItem(key, value); } catch { /* Storage is optional in private browsing. */ }
33
+ try { storage?.setItem(key, value); } catch { /* Intentional ignore: Private browsing may deny optional experiment storage. */ }
33
34
  }
34
35
 
35
36
  function isVariant(value: unknown): value is WallTeaserVariant {
@@ -77,7 +78,8 @@ export function createWallExperimentSession(experiment: WallExperiment = "wall_t
77
78
 
78
79
  const request = (async () => {
79
80
  let answer: ExperimentAnswer;
80
- try { answer = await ask(storedVariant(context.local, experiment)); } catch {
81
+ try { answer = await ask(storedVariant(context.local, experiment)); } catch (error) {
82
+ logFailure("cloud-experiments", "Experiment exposure request failed")(error);
81
83
  // An older API (422), offline connection or timeout is not an exposure.
82
84
  return null;
83
85
  }
@@ -1,3 +1,4 @@
1
+ import { logFailure } from "../utils/log-failure";
1
2
  import { withDeadline } from "../utils/async-deadline";
2
3
  import { canonicalExchange } from "../utils/exchanges";
3
4
  import { CloudApiRequestTransport } from "./request";
@@ -43,7 +44,8 @@ export async function getWallSummary(wall: string, symbol: string, exchange?: st
43
44
  signal: controller.signal,
44
45
  }), 3_000, "Wall summary request timed out", (error) => controller.abort(error));
45
46
  return parseWallSummary(result);
46
- } catch {
47
+ } catch (error) {
48
+ logFailure("cloud-wall-summary", "Wall summary request failed")(error);
47
49
  return null;
48
50
  }
49
51
  }