gloomberb 0.17.5 → 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 (922) hide show
  1. package/README.md +2 -0
  2. package/README.zh-CN.md +2 -0
  3. package/package.json +8 -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/chat.ts +9 -0
  12. package/src/api-client/commodity-balances.ts +77 -0
  13. package/src/api-client/credit-boards.ts +21 -1
  14. package/src/api-client/crypto-markets.ts +88 -1
  15. package/src/api-client/data.ts +135 -6
  16. package/src/api-client/debt-maturities.ts +18 -0
  17. package/src/api-client/earnings.ts +10 -0
  18. package/src/api-client/equity-screener.ts +3 -0
  19. package/src/api-client/errors.ts +13 -0
  20. package/src/api-client/fund-facts.ts +72 -0
  21. package/src/api-client/futures-curve.ts +26 -3
  22. package/src/api-client/geo.ts +11 -1
  23. package/src/api-client/index.ts +30 -2
  24. package/src/api-client/insider-signals.ts +159 -0
  25. package/src/api-client/market-discovery.ts +1 -1
  26. package/src/api-client/normalizers.ts +2 -0
  27. package/src/api-client/paths.ts +28 -0
  28. package/src/api-client/request.ts +11 -3
  29. package/src/api-client/research-activity.ts +15 -8
  30. package/src/api-client/socket.ts +16 -3
  31. package/src/api-client/supply-chain-graph.ts +2 -2
  32. package/src/api-client/supply-chain.ts +8 -0
  33. package/src/api-client/tape.ts +12 -0
  34. package/src/api-client/types.ts +91 -3
  35. package/src/api-client/upgrade-experiment.ts +4 -3
  36. package/src/api-client/wall-experiments.ts +5 -3
  37. package/src/api-client/wall-summary.ts +3 -1
  38. package/src/api-client/web-experiments.ts +5 -2
  39. package/src/api-client/yield-curves.ts +17 -0
  40. package/src/app/command-bar-intro.ts +38 -0
  41. package/src/app/keybindings/actions.ts +1 -1
  42. package/src/app/pane-runtime/pane-template-runtime.ts +35 -7
  43. package/src/app/pane-runtime/plugin-bindings.ts +4 -0
  44. package/src/app/pane-runtime/ticker-open-runtime.ts +4 -14
  45. package/src/app/pane-runtime/ticker-open-target.ts +31 -0
  46. package/src/app/runtime/broker-import.ts +23 -21
  47. package/src/app/runtime/desktop-deeplink.ts +3 -4
  48. package/src/app/runtime/plugin-bindings.ts +16 -9
  49. package/src/app/runtime/startup.ts +3 -4
  50. package/src/app/runtime/ticker-refresh.ts +13 -12
  51. package/src/app/runtime/update.ts +17 -3
  52. package/src/architecture/core-builtin-allowlist.json +2 -13
  53. package/src/architecture/silent-catch-allowlist.json +3 -0
  54. package/src/architecture/ui-literals-allowlist.json +186 -0
  55. package/src/architecture/ui-tokens-allowlist.json +40 -0
  56. package/src/ask-gloom/pane-context.ts +3 -1
  57. package/src/brokers/broker-portfolio-sync.ts +66 -0
  58. package/src/brokers/signed-in/catalog.ts +2 -1
  59. package/src/brokers/signed-in/client.ts +7 -2
  60. package/src/brokers/signed-in/sign-in-dialog.tsx +120 -26
  61. package/src/brokers/signed-in/sign-in.ts +22 -20
  62. package/src/brokers/sync-broker-instance.ts +77 -42
  63. package/src/capabilities/chart-series.ts +2 -0
  64. package/src/capabilities/registry.ts +1 -3
  65. package/src/cli/bank-section.ts +147 -0
  66. package/src/cli/base-converter.ts +5 -2
  67. package/src/cli/board-coins.ts +70 -0
  68. package/src/cli/commands/fred-series.ts +90 -0
  69. package/src/cli/commands/market.ts +434 -96
  70. package/src/cli/commands/news-search.ts +35 -2
  71. package/src/cli/commands/options-chain.ts +25 -9
  72. package/src/cli/commands/options-leaps.ts +3 -3
  73. package/src/cli/commands/overview.ts +130 -40
  74. package/src/cli/commands/plugins.ts +1 -0
  75. package/src/cli/commands/search.ts +87 -24
  76. package/src/cli/commands/system.ts +5 -2
  77. package/src/cli/commands/ticker.ts +361 -64
  78. package/src/cli/context.ts +15 -1
  79. package/src/cli/desktop-pane-shot.ts +11 -3
  80. package/src/cli/earnings-calendar.ts +2 -1
  81. package/src/cli/errors.ts +25 -2
  82. package/src/cli/export-source.ts +18 -3
  83. package/src/cli/fx-pair.ts +77 -0
  84. package/src/cli/glossary.ts +196 -14
  85. package/src/cli/history-rows.ts +84 -19
  86. package/src/cli/index-roots.ts +26 -0
  87. package/src/cli/index.ts +57 -20
  88. package/src/cli/known-gaps.ts +156 -22
  89. package/src/cli/listing-arg.ts +217 -150
  90. package/src/cli/listing-suggestion.ts +7 -23
  91. package/src/cli/name-entries.ts +76 -0
  92. package/src/cli/not-a-ticker.ts +15 -6
  93. package/src/cli/pane-functions/access-gate.ts +22 -0
  94. package/src/cli/pane-functions/capabilities.ts +62 -4
  95. package/src/cli/pane-functions/catalog.ts +144 -39
  96. package/src/cli/pane-functions/data.ts +6 -5
  97. package/src/cli/pane-functions/discovery.ts +1 -1
  98. package/src/cli/pane-functions/dom.ts +3 -3
  99. package/src/cli/pane-functions/freshness.ts +93 -17
  100. package/src/cli/pane-functions/function-help.ts +20 -17
  101. package/src/cli/pane-functions/headless.ts +187 -40
  102. package/src/cli/pane-functions/index.ts +126 -12
  103. package/src/cli/pane-functions/options.ts +17 -3
  104. package/src/cli/pane-functions/report-notices.ts +17 -3
  105. package/src/cli/pane-functions/resolver.ts +74 -18
  106. package/src/cli/pane-functions/screenshot.ts +126 -23
  107. package/src/cli/pane-functions/shot-options.ts +68 -0
  108. package/src/cli/perpetual-contract.ts +3 -1
  109. package/src/cli/report-tables.ts +21 -6
  110. package/src/cli/result.ts +2 -0
  111. package/src/cli/series-search.ts +6 -1
  112. package/src/cli/staged-tickers.ts +5 -0
  113. package/src/cli/statement-filings.ts +261 -0
  114. package/src/cli/symbol-args.ts +47 -8
  115. package/src/cli/symbol-list.ts +9 -2
  116. package/src/cli/symbol-rows.ts +269 -29
  117. package/src/cli/ticker-resolution.ts +148 -35
  118. package/src/cli/treasury-yields.ts +86 -0
  119. package/src/cli/types.ts +3 -0
  120. package/src/cli/uncovered-instrument.ts +20 -0
  121. package/src/cli/unknown-command.ts +18 -0
  122. package/src/components/chart/composite/axis-overlays.tsx +16 -9
  123. package/src/components/chart/composite/composite-chart.tsx +163 -23
  124. package/src/components/chart/composite/downsample.ts +19 -3
  125. package/src/components/chart/composite/format.ts +13 -0
  126. package/src/components/chart/composite/legend.tsx +161 -68
  127. package/src/components/chart/composite/panel-bitmap.ts +8 -2
  128. package/src/components/chart/composite/panel-labels.ts +38 -0
  129. package/src/components/chart/composite/panel-series.ts +1 -0
  130. package/src/components/chart/composite/panel-surface.tsx +28 -10
  131. package/src/components/chart/composite/price-axis-labels.tsx +16 -3
  132. package/src/components/chart/composite/scene.ts +60 -2
  133. package/src/components/chart/composite/series-axis-tags.tsx +67 -0
  134. package/src/components/chart/composite/toolbar.tsx +12 -7
  135. package/src/components/chart/composite/tools.ts +2 -2
  136. package/src/components/chart/composite/types.ts +34 -0
  137. package/src/components/chart/composite/use-composite-chart-keyboard.ts +28 -1
  138. package/src/components/chart/core/view-reset.ts +46 -0
  139. package/src/components/chart/curve/curve-surface.tsx +1 -1
  140. package/src/components/chart/static/series.ts +39 -0
  141. package/src/components/chart/static/trail-chart-surface.tsx +2 -1
  142. package/src/components/command-bar/commands/collection-list.ts +45 -15
  143. package/src/components/command-bar/commands/collection.ts +11 -4
  144. package/src/components/command-bar/commands/direct/index.ts +1 -1
  145. package/src/components/command-bar/commands/registry.ts +2 -2
  146. package/src/components/command-bar/list/badge.ts +4 -3
  147. package/src/components/command-bar/list/model.ts +12 -0
  148. package/src/components/command-bar/list/view.tsx +1 -1
  149. package/src/components/command-bar/pane-templates/workflow.ts +5 -0
  150. package/src/components/command-bar/panel/index.tsx +19 -8
  151. package/src/components/command-bar/panel/native-surface.ts +6 -4
  152. package/src/components/command-bar/panel/prompt-example.ts +22 -0
  153. package/src/components/command-bar/routes/root/command-items.ts +1 -1
  154. package/src/components/command-bar/routes/root/pick-prefetch.ts +38 -0
  155. package/src/components/command-bar/routes/root/provider-search.ts +9 -9
  156. package/src/components/command-bar/routes/root/results.ts +13 -0
  157. package/src/components/command-bar/routes/root/runtime.ts +3 -0
  158. package/src/components/command-bar/routes/root/shortcut-feedback.ts +3 -1
  159. package/src/components/command-bar/routes/root/shortcut-items.ts +1 -1
  160. package/src/components/command-bar/routes/root/start-here.ts +90 -0
  161. package/src/components/command-bar/routes/ticker-search/actions.ts +34 -0
  162. package/src/components/command-bar/routes/ticker-search/results.ts +42 -3
  163. package/src/components/command-bar/routes/ticker-search/route.ts +3 -10
  164. package/src/components/command-bar/surface/index.tsx +5 -0
  165. package/src/components/command-bar/theme-picker.tsx +3 -1
  166. package/src/components/command-bar/workflow/builtin.ts +5 -1
  167. package/src/components/command-bar/workflow/collection-actions.ts +23 -13
  168. package/src/components/command-bar/workflow/ops.ts +25 -3
  169. package/src/components/command-bar/workflow/pane-reuse.ts +3 -2
  170. package/src/{plugins/builtin/portfolio-list/command-bar.ts → components/command-bar/workflow/portfolio-position.ts} +42 -9
  171. package/src/components/command-bar/workflow/tickers.ts +7 -5
  172. package/src/components/feedback-dialog.tsx +1 -1
  173. package/src/components/form-modal/broker-step.tsx +7 -63
  174. package/src/components/form-modal/content.tsx +7 -2
  175. package/src/components/form-modal/field-row.tsx +6 -8
  176. package/src/components/form-modal/host.tsx +3 -3
  177. package/src/components/form-modal/model.ts +3 -0
  178. package/src/components/form-modal/routes.ts +17 -2
  179. package/src/components/index.ts +6 -6
  180. package/src/components/input-search-bar.tsx +43 -6
  181. package/src/components/layout/detached-pane-shell.tsx +0 -1
  182. package/src/components/layout/floating-pane.tsx +0 -1
  183. package/src/components/layout/header.tsx +8 -7
  184. package/src/components/layout/pane/content.tsx +11 -8
  185. package/src/components/layout/pane/footer/index.tsx +7 -4
  186. package/src/components/layout/pane/footer/model.ts +28 -2
  187. package/src/components/layout/pane/header.tsx +9 -19
  188. package/src/components/layout/pane/index.tsx +0 -1
  189. package/src/components/layout/pane/instrument-coverage-gate.tsx +57 -0
  190. package/src/components/layout/pane/pane-tabs.tsx +4 -3
  191. package/src/components/layout/pane/sizing.ts +9 -0
  192. package/src/components/layout/pane/ticker-fate-gate.tsx +62 -0
  193. package/src/components/layout/shell/pane/capture.ts +44 -20
  194. package/src/components/layout/status-bar.tsx +3 -6
  195. package/src/components/markdown-text.tsx +17 -2
  196. package/src/components/market-board/index.tsx +19 -8
  197. package/src/components/metric-treemap/heat-surface.tsx +2 -7
  198. package/src/components/onboarding/account-step/qr-panel.tsx +5 -2
  199. package/src/components/onboarding/onboarding-frame.tsx +24 -21
  200. package/src/components/onboarding/portfolio-step/positions-panel.tsx +20 -10
  201. package/src/components/onboarding/wizard-model.ts +1 -1
  202. package/src/components/onboarding/wizard-positions.ts +56 -19
  203. package/src/components/pane-settings-dialog/desktop.tsx +12 -50
  204. package/src/components/pane-settings-dialog/field-dialogs.tsx +1 -1
  205. package/src/components/price-performance.tsx +18 -2
  206. package/src/components/reader/article-reader.tsx +11 -10
  207. package/src/components/reader/detail-reader.tsx +9 -5
  208. package/src/components/reader/reader-text.tsx +51 -24
  209. package/src/components/sign-in-code-panel.tsx +129 -75
  210. package/src/components/ticker/badge/format.ts +64 -15
  211. package/src/components/ticker/badge/index.tsx +33 -11
  212. package/src/components/ticker/badge/list.tsx +4 -3
  213. package/src/components/ticker/badge/text.tsx +2 -2
  214. package/src/components/ticker/list-table-view.tsx +8 -1
  215. package/src/components/ui/action-row.tsx +5 -2
  216. package/src/components/ui/audio-player.tsx +70 -0
  217. package/src/components/ui/card.tsx +75 -0
  218. package/src/components/ui/data-table/index.tsx +4 -2
  219. package/src/components/ui/data-table/opentui/index.tsx +61 -20
  220. package/src/components/ui/data-table/opentui/model.ts +104 -0
  221. package/src/components/ui/data-table/types.ts +11 -0
  222. package/src/components/ui/detail-scroll-body.tsx +1 -1
  223. package/src/components/ui/dialog-actions.tsx +1 -21
  224. package/src/components/ui/display.tsx +13 -5
  225. package/src/components/ui/external-link.tsx +4 -2
  226. package/src/components/ui/fields.tsx +12 -0
  227. package/src/components/ui/figure.tsx +5 -3
  228. package/src/components/ui/frame.tsx +40 -6
  229. package/src/components/ui/icon.tsx +4 -0
  230. package/src/components/ui/index.ts +4 -1
  231. package/src/components/ui/inline-quick-add.tsx +4 -1
  232. package/src/components/ui/list-view.tsx +8 -0
  233. package/src/components/ui/prose.tsx +97 -25
  234. package/src/components/ui/query-bar-keys.tsx +32 -6
  235. package/src/components/ui/query-bar.tsx +35 -4
  236. package/src/components/ui/quote.ts +42 -0
  237. package/src/components/ui/range-track.tsx +15 -2
  238. package/src/components/ui/reveal-in-scroll-box.ts +21 -3
  239. package/src/components/ui/select-button.tsx +38 -3
  240. package/src/components/ui/status.tsx +73 -4
  241. package/src/components/ui/table-layout.ts +20 -0
  242. package/src/components/ui/windowed-list.tsx +27 -0
  243. package/src/components/use-pinned-moment.ts +19 -0
  244. package/src/core/app-runtime.ts +2 -2
  245. package/src/core/state/app/instrument.ts +18 -1
  246. package/src/core/state/app/layout.ts +6 -0
  247. package/src/core/state/app/state.ts +14 -2
  248. package/src/data/cached-query.ts +1 -1
  249. package/src/data/config/chart-settings.ts +3 -1
  250. package/src/data/config/home.ts +4 -1
  251. package/src/data/config/store/node.ts +9 -4
  252. package/src/data/config/store/normalize.ts +9 -0
  253. package/src/data/json-storage.ts +6 -3
  254. package/src/data/json-ticker-repository.ts +3 -1
  255. package/src/data/plugin-cache.ts +5 -1
  256. package/src/data/sqlite/json.ts +3 -1
  257. package/src/data/ticker-repository.ts +5 -2
  258. package/src/docs/snapshot.json +248 -5
  259. package/src/feedback/diagnostics.ts +2 -6
  260. package/src/i18n/es.ts +86 -6
  261. package/src/i18n/index.ts +3 -9
  262. package/src/i18n/ja.ts +86 -6
  263. package/src/i18n/ko.ts +86 -6
  264. package/src/i18n/zh-cn.ts +86 -6
  265. package/src/i18n/zh-tw.ts +86 -6
  266. package/src/layout-marketplace/cloud.ts +16 -5
  267. package/src/layout-marketplace/gallery-desktop.tsx +8 -4
  268. package/src/layout-marketplace/gallery.tsx +4 -4
  269. package/src/layout-marketplace/linked-sync.ts +9 -3
  270. package/src/layout-marketplace/linked.ts +24 -3
  271. package/src/layout-marketplace/model.ts +39 -4
  272. package/src/market-data/bars-per-year.ts +43 -0
  273. package/src/market-data/bond-funds.ts +85 -0
  274. package/src/market-data/coordinator/auxiliary.ts +5 -2
  275. package/src/market-data/coordinator/index.ts +39 -5
  276. package/src/market-data/futures-contract.ts +155 -5
  277. package/src/market-data/hooks.tsx +77 -12
  278. package/src/market-data/market/bar-period.ts +107 -0
  279. package/src/market-data/market/format.ts +18 -14
  280. package/src/market-data/market/freshness.ts +29 -4
  281. package/src/market-data/market/index-level.ts +51 -0
  282. package/src/market-data/market/status.ts +152 -13
  283. package/src/market-data/model-dividend-yield.ts +117 -0
  284. package/src/market-data/quotes/freshness.ts +30 -1
  285. package/src/{plugins/builtin/portfolio-list → market-data/quotes}/live-valuation.ts +52 -6
  286. package/src/market-data/quotes/regular-session-valuation.ts +32 -1
  287. package/src/market-data/realized-volatility.ts +16 -7
  288. package/src/market-data/tax-equivalent.ts +344 -0
  289. package/src/news/aggregator.ts +4 -2
  290. package/src/notifications/notification-log.ts +5 -3
  291. package/src/plugins/auto-update-node.ts +1 -0
  292. package/src/plugins/builtin/account-management/footer.ts +1 -1
  293. package/src/plugins/builtin/account-management/keyboard.ts +3 -0
  294. package/src/plugins/builtin/account-management/model.ts +1 -0
  295. package/src/plugins/builtin/account-management/pane.tsx +71 -19
  296. package/src/plugins/builtin/account-management/trial-cancel.ts +40 -0
  297. package/src/plugins/builtin/alerts/cli.ts +7 -18
  298. package/src/plugins/builtin/alerts/constants.ts +8 -0
  299. package/src/plugins/builtin/alerts/event-rows.ts +16 -0
  300. package/src/plugins/builtin/alerts/events-pane.tsx +2 -14
  301. package/src/plugins/builtin/alerts/headless.ts +182 -0
  302. package/src/plugins/builtin/alerts/index.tsx +3 -0
  303. package/src/plugins/builtin/alerts/pane.tsx +1 -7
  304. package/src/plugins/builtin/alerts/storage.ts +17 -1
  305. package/src/plugins/builtin/analytics/index.tsx +6 -1
  306. package/src/plugins/builtin/analytics/metrics.ts +55 -13
  307. package/src/plugins/builtin/analytics/risk-headless.ts +26 -7
  308. package/src/plugins/builtin/analytics/risk-math.ts +83 -0
  309. package/src/plugins/builtin/analytics/risk-model.ts +171 -19
  310. package/src/plugins/builtin/analytics/risk-pane.tsx +17 -12
  311. package/src/plugins/builtin/analytics/sector-model.ts +14 -3
  312. package/src/plugins/builtin/awards/headless.ts +6 -5
  313. package/src/plugins/builtin/awards/index.tsx +1 -1
  314. package/src/plugins/builtin/backtest/client.ts +38 -8
  315. package/src/plugins/builtin/backtest/engine.ts +25 -13
  316. package/src/plugins/builtin/backtest/export.ts +27 -0
  317. package/src/plugins/builtin/backtest/format.ts +19 -3
  318. package/src/plugins/builtin/backtest/headless.ts +42 -28
  319. package/src/plugins/builtin/backtest/index.tsx +3 -0
  320. package/src/plugins/builtin/backtest/pane.tsx +39 -10
  321. package/src/plugins/builtin/backtest/report.ts +160 -0
  322. package/src/plugins/builtin/backtest/rules.ts +2 -0
  323. package/src/plugins/builtin/backtest/window.ts +112 -0
  324. package/src/plugins/builtin/bond-calculator/headless.ts +3 -2
  325. package/src/plugins/builtin/broker-manager/add-flow.tsx +4 -4
  326. package/src/plugins/builtin/builtin-plugin-meta.ts +0 -1
  327. package/src/plugins/builtin/catalysts/headless.ts +24 -13
  328. package/src/plugins/builtin/catalysts/index.tsx +4 -2
  329. package/src/plugins/builtin/catalysts/model.ts +18 -1
  330. package/src/plugins/builtin/catalysts/pane.tsx +2 -2
  331. package/src/plugins/builtin/cds/client.ts +28 -5
  332. package/src/plugins/builtin/cds/headless.ts +183 -31
  333. package/src/plugins/builtin/cds/index.tsx +1 -1
  334. package/src/plugins/builtin/cds/model.ts +229 -53
  335. package/src/plugins/builtin/cds/pane.tsx +82 -26
  336. package/src/plugins/builtin/central-bank-rates/headless.ts +1 -1
  337. package/src/plugins/builtin/chart-composer/catalog-inventory.ts +39 -1
  338. package/src/plugins/builtin/chart-composer/chart-spec-edit.ts +77 -0
  339. package/src/plugins/builtin/chart-composer/chart-spec.ts +15 -0
  340. package/src/plugins/builtin/chart-composer/data-catalog-pane.tsx +22 -2
  341. package/src/plugins/builtin/chart-composer/editor/controller.ts +14 -10
  342. package/src/plugins/builtin/chart-composer/editor/desktop-view.tsx +2 -2
  343. package/src/plugins/builtin/chart-composer/formula.ts +233 -0
  344. package/src/plugins/builtin/chart-composer/headless-schema.ts +10 -2
  345. package/src/plugins/builtin/chart-composer/headless.ts +117 -15
  346. package/src/plugins/builtin/chart-composer/index.tsx +73 -15
  347. package/src/plugins/builtin/chart-composer/pane.tsx +86 -23
  348. package/src/plugins/builtin/chart-composer/presets.ts +165 -8
  349. package/src/plugins/builtin/chart-composer/quick-add.tsx +9 -2
  350. package/src/plugins/builtin/chart-composer/series-catalog.ts +85 -16
  351. package/src/plugins/builtin/chart-composer/series-expression.ts +10 -8
  352. package/src/plugins/builtin/chart-composer/series-listings.ts +178 -0
  353. package/src/plugins/builtin/chart-composer/session-range.ts +87 -0
  354. package/src/plugins/builtin/chart-composer/settings.ts +16 -4
  355. package/src/plugins/builtin/chart-composer/studies.ts +1 -1
  356. package/src/plugins/builtin/chat/attachments/desktop.tsx +4 -1
  357. package/src/plugins/builtin/chat/content/channel-navigation.ts +17 -6
  358. package/src/plugins/builtin/chat/content/composer-runtime.ts +49 -14
  359. package/src/plugins/builtin/chat/content/composer.tsx +22 -1
  360. package/src/plugins/builtin/chat/content/index.tsx +47 -10
  361. package/src/plugins/builtin/chat/content/layout-metrics.ts +3 -0
  362. package/src/plugins/builtin/chat/content/mentions.ts +50 -21
  363. package/src/plugins/builtin/chat/content/scroll.ts +12 -5
  364. package/src/plugins/builtin/chat/content/shortcuts.ts +32 -13
  365. package/src/plugins/builtin/chat/content/snapshot.ts +40 -6
  366. package/src/plugins/builtin/chat/content/transcript.tsx +48 -37
  367. package/src/plugins/builtin/chat/content/whole-message-copy.ts +44 -2
  368. package/src/plugins/builtin/chat/controller/index.ts +68 -17
  369. package/src/plugins/builtin/chat/controller/mention-candidates.ts +104 -0
  370. package/src/plugins/builtin/chat/controller/realtime.ts +9 -0
  371. package/src/plugins/builtin/chat/controller/state.ts +10 -0
  372. package/src/plugins/builtin/chat/controller/view.ts +2 -0
  373. package/src/plugins/builtin/chat/conversation-recency.ts +73 -0
  374. package/src/plugins/builtin/chat/conversations.ts +12 -5
  375. package/src/plugins/builtin/chat/ghost-user.ts +11 -3
  376. package/src/plugins/builtin/chat/layout.ts +25 -5
  377. package/src/plugins/builtin/chat/message/desktop.tsx +15 -5
  378. package/src/plugins/builtin/chat/message/header.tsx +26 -4
  379. package/src/plugins/builtin/chat/message/pane-chip.tsx +131 -35
  380. package/src/plugins/builtin/chat/message/render-state.ts +28 -1
  381. package/src/plugins/builtin/chat/message/terminal.tsx +9 -3
  382. package/src/plugins/builtin/chat/pane-links/composer.ts +87 -0
  383. package/src/plugins/builtin/chat/pane-links/model.ts +1 -1
  384. package/src/plugins/builtin/chat/share/flow.tsx +9 -73
  385. package/src/plugins/builtin/chat/sidebar-rows.ts +18 -5
  386. package/src/plugins/builtin/chat/sidebar.tsx +6 -1
  387. package/src/plugins/builtin/cloud/askg/controller.ts +5 -3
  388. package/src/plugins/builtin/cloud/askg/executor.ts +3 -1
  389. package/src/plugins/builtin/cloud/askg/lock-note.ts +16 -0
  390. package/src/plugins/builtin/cloud/askg/manifest.ts +4 -3
  391. package/src/plugins/builtin/cloud/askg/pane.tsx +6 -2
  392. package/src/plugins/builtin/cloud/auth-actions.tsx +4 -2
  393. package/src/plugins/builtin/cloud/company-picker.tsx +21 -26
  394. package/src/plugins/builtin/cloud/mcp-connect/dialog.tsx +5 -3
  395. package/src/plugins/builtin/cloud/plugin.tsx +2 -0
  396. package/src/plugins/builtin/cloud/team/module.tsx +5 -1
  397. package/src/plugins/builtin/cloud/team/pane.tsx +11 -4
  398. package/src/plugins/builtin/cloud/team/views.ts +11 -4
  399. package/src/plugins/builtin/cloud/terminal-relay/engine.ts +9 -4
  400. package/src/plugins/builtin/cloud/terminal-relay/manifest.ts +16 -5
  401. package/src/plugins/builtin/cloud/terminal-relay/prompts.tsx +3 -2
  402. package/src/plugins/builtin/cloud/thesis/detail.tsx +2 -1
  403. package/src/plugins/builtin/cloud/thesis/exposure.ts +3 -0
  404. package/src/plugins/builtin/cloud/thesis/prompts.tsx +3 -2
  405. package/src/plugins/builtin/cloud/thesis/ticker-tab.tsx +2 -1
  406. package/src/plugins/builtin/cloud/trial-offer-status-widget.tsx +2 -1
  407. package/src/plugins/builtin/cloud/verification-status-widget.tsx +2 -1
  408. package/src/plugins/builtin/commodities-energy/index.tsx +31 -9
  409. package/src/plugins/builtin/commodities-energy/view-state.ts +11 -0
  410. package/src/plugins/builtin/commodity-balances/client.ts +51 -193
  411. package/src/plugins/builtin/commodity-balances/headless.ts +10 -3
  412. package/src/plugins/builtin/commodity-balances/model.ts +5 -180
  413. package/src/plugins/builtin/commodity-balances/pane.tsx +3 -0
  414. package/src/plugins/builtin/company-attention/headless.ts +15 -7
  415. package/src/plugins/builtin/company-attention/index.tsx +1 -1
  416. package/src/plugins/builtin/company-attention/model.ts +49 -4
  417. package/src/plugins/builtin/company-attention/pane.tsx +11 -9
  418. package/src/plugins/builtin/company-kpis/headless.ts +4 -3
  419. package/src/plugins/builtin/company-kpis/index.tsx +2 -2
  420. package/src/plugins/builtin/company-kpis/pane.tsx +9 -3
  421. package/src/plugins/builtin/congress-trades/headless.ts +23 -2
  422. package/src/plugins/builtin/correlation/relationship/pane.tsx +18 -46
  423. package/src/plugins/builtin/cot/headless.ts +5 -2
  424. package/src/plugins/builtin/credit-boards/cdx-pane.tsx +41 -13
  425. package/src/plugins/builtin/credit-boards/client.ts +9 -2
  426. package/src/plugins/builtin/credit-boards/headless.ts +93 -27
  427. package/src/plugins/builtin/credit-boards/index.tsx +15 -4
  428. package/src/plugins/builtin/credit-boards/model.ts +105 -6
  429. package/src/plugins/builtin/credit-boards/sovr-pane.tsx +14 -3
  430. package/src/plugins/builtin/credit-documents/detail.tsx +2 -1
  431. package/src/plugins/builtin/credit-documents/index.tsx +3 -0
  432. package/src/plugins/builtin/credit-documents/model.ts +3 -10
  433. package/src/plugins/builtin/crypto-board/client.ts +152 -2
  434. package/src/plugins/builtin/crypto-board/headless.ts +138 -19
  435. package/src/plugins/builtin/crypto-board/index.tsx +5 -3
  436. package/src/plugins/builtin/crypto-board/model.ts +210 -12
  437. package/src/plugins/builtin/crypto-board/pane.tsx +148 -9
  438. package/src/plugins/builtin/crypto-board/series.ts +52 -1
  439. package/src/plugins/builtin/crypto-board/supply.ts +123 -0
  440. package/src/plugins/builtin/custom-view/index.tsx +1 -1
  441. package/src/plugins/builtin/custom-view/loader.ts +57 -7
  442. package/src/plugins/builtin/custom-view/sources.ts +146 -0
  443. package/src/plugins/builtin/custom-view/view-spec.ts +37 -1
  444. package/src/plugins/builtin/debt-maturities/client.ts +54 -1
  445. package/src/plugins/builtin/debt-maturities/headless.ts +27 -3
  446. package/src/plugins/builtin/debt-maturities/index.tsx +2 -0
  447. package/src/plugins/builtin/debt-maturities/model.ts +58 -13
  448. package/src/plugins/builtin/debt-maturities/pane.tsx +47 -7
  449. package/src/plugins/builtin/dividend-yield/client.ts +42 -36
  450. package/src/plugins/builtin/dividend-yield/headless.ts +113 -18
  451. package/src/plugins/builtin/dividend-yield/index.tsx +5 -2
  452. package/src/plugins/builtin/dividend-yield/pane.tsx +37 -13
  453. package/src/plugins/builtin/dividend-yield/provider-client.ts +7 -3
  454. package/src/plugins/builtin/dividend-yield/ranking.ts +187 -0
  455. package/src/plugins/builtin/dividend-yield/reference-price.ts +28 -5
  456. package/src/plugins/builtin/dividend-yield/types.ts +6 -1
  457. package/src/plugins/builtin/dividend-yield/view.ts +1 -1
  458. package/src/plugins/builtin/docs/blocks.tsx +54 -8
  459. package/src/plugins/builtin/docs/pane.tsx +8 -13
  460. package/src/plugins/builtin/earnings/board-model.ts +33 -3
  461. package/src/plugins/builtin/earnings/board-table.ts +59 -14
  462. package/src/plugins/builtin/earnings/board.tsx +36 -3
  463. package/src/plugins/builtin/earnings/headless.ts +27 -7
  464. package/src/plugins/builtin/earnings/history-model.ts +9 -1
  465. package/src/plugins/builtin/earnings/history-table.ts +16 -5
  466. package/src/plugins/builtin/earnings/history.tsx +40 -10
  467. package/src/plugins/builtin/earnings/index.tsx +3 -1
  468. package/src/plugins/builtin/earnings/no-earnings.ts +52 -0
  469. package/src/plugins/builtin/earnings-calls/data.ts +51 -0
  470. package/src/plugins/builtin/earnings-calls/headless.ts +7 -0
  471. package/src/plugins/builtin/earnings-calls/index.tsx +1 -0
  472. package/src/plugins/builtin/earnings-calls/model.ts +97 -0
  473. package/src/plugins/builtin/earnings-calls/pane.tsx +107 -7
  474. package/src/plugins/builtin/earnings-calls/transcript-view.tsx +140 -22
  475. package/src/plugins/builtin/earnings-calls/use-call-playback.ts +194 -0
  476. package/src/plugins/builtin/econ/calendar-model.ts +22 -0
  477. package/src/plugins/builtin/econ/calendar-source.ts +35 -0
  478. package/src/plugins/builtin/econ/index.tsx +40 -8
  479. package/src/plugins/builtin/econ-statistics/defs.ts +7 -0
  480. package/src/plugins/builtin/econ-statistics/detail.tsx +11 -1
  481. package/src/plugins/builtin/econ-statistics/headless.ts +31 -5
  482. package/src/plugins/builtin/econ-statistics/pane.tsx +5 -3
  483. package/src/plugins/builtin/econ-statistics/stats.ts +10 -0
  484. package/src/plugins/builtin/econ-statistics/view.ts +23 -0
  485. package/src/plugins/builtin/equity-screener/client.ts +1 -1
  486. package/src/plugins/builtin/equity-screener/model.ts +46 -4
  487. package/src/plugins/builtin/equity-screener/pane.tsx +3 -0
  488. package/src/plugins/builtin/estimate-revisions/client.ts +32 -22
  489. package/src/plugins/builtin/estimate-revisions/headless.ts +1 -0
  490. package/src/plugins/builtin/estimate-revisions/index.tsx +1 -0
  491. package/src/plugins/builtin/estimate-revisions/pane.tsx +5 -3
  492. package/src/plugins/builtin/executives/index.tsx +1 -0
  493. package/src/plugins/builtin/exposure/editor.tsx +3 -3
  494. package/src/plugins/builtin/fear-greed/index.tsx +9 -0
  495. package/src/plugins/builtin/filing-events/index.tsx +1 -0
  496. package/src/plugins/builtin/futures/index.tsx +2 -2
  497. package/src/plugins/builtin/futures/model.ts +39 -25
  498. package/src/plugins/builtin/futures/series.ts +38 -1
  499. package/src/plugins/builtin/futures/table.tsx +1 -1
  500. package/src/plugins/builtin/futures/use-board-terms.ts +2 -2
  501. package/src/plugins/builtin/futures-curve/client.ts +4 -4
  502. package/src/plugins/builtin/futures-curve/headless.ts +24 -4
  503. package/src/plugins/builtin/futures-curve/index.tsx +2 -2
  504. package/src/plugins/builtin/futures-curve/model.ts +50 -9
  505. package/src/plugins/builtin/futures-curve/pane.tsx +14 -10
  506. package/src/plugins/builtin/help/index.tsx +55 -8
  507. package/src/plugins/builtin/help/shortcut-table.tsx +15 -2
  508. package/src/plugins/builtin/holders/headless.ts +12 -0
  509. package/src/plugins/builtin/insider/headless.ts +345 -5
  510. package/src/plugins/builtin/insider/index.tsx +304 -36
  511. package/src/plugins/builtin/insider/insiders.tsx +224 -0
  512. package/src/plugins/builtin/insider/signals-cells.tsx +52 -0
  513. package/src/plugins/builtin/insider/signals-client.ts +193 -0
  514. package/src/plugins/builtin/insider/signals-model.ts +718 -0
  515. package/src/plugins/builtin/insider/signals.tsx +376 -0
  516. package/src/plugins/builtin/ipo-calendar/headless.ts +17 -7
  517. package/src/plugins/builtin/ipo-calendar/index.tsx +23 -3
  518. package/src/plugins/builtin/ipo-calendar/model.ts +84 -36
  519. package/src/plugins/builtin/ipo-calendar/pane.tsx +20 -8
  520. package/src/plugins/builtin/iv-history/client.ts +41 -2
  521. package/src/plugins/builtin/iv-history/headless.ts +26 -16
  522. package/src/plugins/builtin/iv-history/screen-pane.tsx +25 -7
  523. package/src/plugins/builtin/jobs/headless.ts +1 -0
  524. package/src/plugins/builtin/jobs/index.tsx +1 -0
  525. package/src/plugins/builtin/jodi/client.ts +42 -205
  526. package/src/plugins/builtin/jodi/headless.ts +15 -4
  527. package/src/plugins/builtin/jodi/model.ts +18 -43
  528. package/src/plugins/builtin/jodi/pane.tsx +5 -0
  529. package/src/plugins/builtin/kelly-sizer/pane.tsx +1 -1
  530. package/src/plugins/builtin/kelly-sizer/portfolio.ts +1 -1
  531. package/src/plugins/builtin/market-heatmap/headless.ts +1 -0
  532. package/src/plugins/builtin/market-heatmap/portfolio.ts +3 -1
  533. package/src/plugins/builtin/market-movers/client.ts +32 -6
  534. package/src/plugins/builtin/market-movers/headless.ts +7 -2
  535. package/src/plugins/builtin/market-movers/model.ts +64 -3
  536. package/src/plugins/builtin/market-movers/screener.ts +20 -9
  537. package/src/plugins/builtin/market-valuation/detail.tsx +7 -2
  538. package/src/plugins/builtin/market-valuation/headless.ts +17 -4
  539. package/src/plugins/builtin/market-valuation/pane.tsx +8 -4
  540. package/src/plugins/builtin/market-valuation/view.ts +10 -0
  541. package/src/plugins/builtin/market-valuation/zone-scale/desktop.tsx +31 -57
  542. package/src/plugins/builtin/mna/distress/headless.ts +2 -1
  543. package/src/plugins/builtin/mna/headless.ts +14 -2
  544. package/src/plugins/builtin/mna/index.tsx +1 -0
  545. package/src/plugins/builtin/news/headless.ts +4 -0
  546. package/src/plugins/builtin/news/wire/news/footer.ts +5 -3
  547. package/src/plugins/builtin/news/wire/news/table.tsx +57 -11
  548. package/src/plugins/builtin/notes/cli.ts +8 -4
  549. package/src/plugins/builtin/notes/files.ts +66 -20
  550. package/src/plugins/builtin/notes/migration.ts +18 -6
  551. package/src/plugins/builtin/notes/owner.tsx +3 -2
  552. package/src/plugins/builtin/notes/quick-notes-pane.tsx +3 -2
  553. package/src/plugins/builtin/options-positioning/client.ts +10 -0
  554. package/src/plugins/builtin/options-positioning/headless.ts +88 -13
  555. package/src/plugins/builtin/options-positioning/index.tsx +2 -2
  556. package/src/plugins/builtin/options-positioning/model.ts +33 -0
  557. package/src/plugins/builtin/options-positioning/pane.tsx +38 -16
  558. package/src/plugins/builtin/options-scenario/charts.tsx +13 -4
  559. package/src/plugins/builtin/options-scenario/client.ts +114 -17
  560. package/src/plugins/builtin/options-scenario/collar.ts +141 -0
  561. package/src/plugins/builtin/options-scenario/csp.ts +1 -1
  562. package/src/plugins/builtin/options-scenario/freshness.ts +27 -0
  563. package/src/plugins/builtin/options-scenario/headless.ts +30 -12
  564. package/src/plugins/builtin/options-scenario/index.tsx +1 -1
  565. package/src/plugins/builtin/options-scenario/model.ts +55 -5
  566. package/src/plugins/builtin/options-scenario/pane.tsx +24 -5
  567. package/src/plugins/builtin/pe-band/index.tsx +1 -1
  568. package/src/plugins/builtin/pe-band/model.ts +1 -15
  569. package/src/plugins/builtin/perps/headless.ts +30 -13
  570. package/src/plugins/builtin/perps/model.ts +45 -3
  571. package/src/plugins/builtin/perps/pane.tsx +7 -7
  572. package/src/plugins/builtin/portfolio-list/cell-version.ts +10 -4
  573. package/src/plugins/builtin/portfolio-list/cli/bulk-symbols.ts +128 -14
  574. package/src/plugins/builtin/portfolio-list/cli/portfolio-command.ts +144 -63
  575. package/src/plugins/builtin/portfolio-list/cli/render.ts +373 -48
  576. package/src/plugins/builtin/portfolio-list/cli/shared.ts +23 -9
  577. package/src/plugins/builtin/portfolio-list/cli/watchlist-command.ts +25 -35
  578. package/src/plugins/builtin/portfolio-list/grid.tsx +3 -1
  579. package/src/plugins/builtin/portfolio-list/headless.ts +161 -32
  580. package/src/plugins/builtin/portfolio-list/income.ts +296 -0
  581. package/src/plugins/builtin/portfolio-list/metrics.ts +2 -2
  582. package/src/plugins/builtin/portfolio-list/pane/futures-terms.ts +58 -0
  583. package/src/plugins/builtin/portfolio-list/pane/index.tsx +63 -14
  584. package/src/plugins/builtin/portfolio-list/pane/remove-ticker.ts +1 -1
  585. package/src/plugins/builtin/portfolio-list/pane/supplemental.ts +47 -28
  586. package/src/plugins/builtin/portfolio-list/quick-add/index.tsx +38 -8
  587. package/src/plugins/builtin/portfolio-list/quick-add/resolution.ts +12 -4
  588. package/src/plugins/builtin/portfolio-list/settings.ts +22 -0
  589. package/src/plugins/builtin/portfolio-list/since-last-seen.ts +197 -0
  590. package/src/plugins/builtin/portfolio-list/summary/index.tsx +26 -4
  591. package/src/plugins/builtin/portfolio-list/summary/totals.ts +32 -4
  592. package/src/plugins/builtin/portfolio-list/table.tsx +39 -7
  593. package/src/plugins/builtin/power/prices-headless.ts +2 -1
  594. package/src/plugins/builtin/realized-vol/chart-model.ts +29 -5
  595. package/src/plugins/builtin/realized-vol/charts.tsx +14 -8
  596. package/src/plugins/builtin/realized-vol/evidence.ts +2 -0
  597. package/src/plugins/builtin/realized-vol/headless.ts +6 -4
  598. package/src/plugins/builtin/realized-vol/model.ts +5 -1
  599. package/src/plugins/builtin/realized-vol/pane.tsx +31 -11
  600. package/src/plugins/builtin/realized-vol/settings.ts +1 -1
  601. package/src/plugins/builtin/research/analyst-headless.ts +4 -0
  602. package/src/plugins/builtin/research/corporate-actions-pane.tsx +16 -5
  603. package/src/plugins/builtin/research/event-model.ts +63 -51
  604. package/src/plugins/builtin/research/headless-schema.ts +1 -0
  605. package/src/plugins/builtin/research/headless.ts +4 -1
  606. package/src/plugins/builtin/research/index.tsx +3 -0
  607. package/src/plugins/builtin/research/relative-valuation-columns.ts +27 -5
  608. package/src/plugins/builtin/research/relative-valuation-headless.ts +2 -0
  609. package/src/plugins/builtin/revenue-breakdown/index.tsx +1 -0
  610. package/src/plugins/builtin/reverse-dcf/headless.ts +28 -9
  611. package/src/plugins/builtin/reverse-dcf/index.tsx +5 -2
  612. package/src/plugins/builtin/reverse-dcf/model.ts +87 -6
  613. package/src/plugins/builtin/reverse-dcf/pane.tsx +30 -7
  614. package/src/plugins/builtin/risk-factors/headless.ts +7 -0
  615. package/src/plugins/builtin/risk-factors/index.tsx +1 -0
  616. package/src/plugins/builtin/scanner/feed.ts +5 -3
  617. package/src/plugins/builtin/scanner/headless.ts +9 -57
  618. package/src/plugins/builtin/scanner/index.ts +1 -2
  619. package/src/plugins/builtin/sec/forms.ts +2 -6
  620. package/src/plugins/builtin/sec/fund-facts-view.tsx +53 -0
  621. package/src/plugins/builtin/sec/fund-facts.ts +328 -0
  622. package/src/plugins/builtin/sec/headless.ts +140 -44
  623. package/src/plugins/builtin/sec/index.tsx +95 -30
  624. package/src/plugins/builtin/sec/model.ts +2 -44
  625. package/src/plugins/builtin/shared/earnings-report.ts +48 -1
  626. package/src/plugins/builtin/shared/headless-options.ts +10 -0
  627. package/src/plugins/builtin/shared/history-span.ts +55 -0
  628. package/src/plugins/builtin/shared/locked-rows.tsx +3 -1
  629. package/src/plugins/builtin/shared/move-rank.ts +108 -0
  630. package/src/plugins/builtin/shared/report-freshness.ts +45 -20
  631. package/src/plugins/builtin/shared/scanner-capture.ts +95 -0
  632. package/src/plugins/builtin/shared/series-detail-chart.tsx +5 -2
  633. package/src/plugins/builtin/shared/series-list-detail.tsx +7 -3
  634. package/src/plugins/builtin/shared/ticker-surface.ts +16 -2
  635. package/src/plugins/builtin/shared/treasury-cutoffs.ts +15 -0
  636. package/src/plugins/builtin/shared/use-quote-board.ts +13 -5
  637. package/src/plugins/builtin/shared/volatility/live-session.ts +34 -0
  638. package/src/plugins/builtin/shared/volatility-indices.ts +32 -0
  639. package/src/plugins/builtin/short-interest/headless.ts +3 -0
  640. package/src/plugins/builtin/short-interest/watch-model.ts +2 -2
  641. package/src/plugins/builtin/social-mentions/client.ts +8 -1
  642. package/src/plugins/builtin/social-mentions/pane.tsx +8 -6
  643. package/src/plugins/builtin/supply-chain/client.ts +12 -3
  644. package/src/plugins/builtin/supply-chain/disclosure-quote.tsx +9 -5
  645. package/src/plugins/builtin/supply-chain/evidence.ts +3 -1
  646. package/src/plugins/builtin/supply-chain/flow-layout.ts +2 -1
  647. package/src/plugins/builtin/supply-chain/flow.tsx +23 -16
  648. package/src/plugins/builtin/supply-chain/graph-client.ts +8 -5
  649. package/src/plugins/builtin/supply-chain/graph-evidence.ts +1 -1
  650. package/src/plugins/builtin/supply-chain/graph-model.ts +10 -2
  651. package/src/plugins/builtin/supply-chain/graph-pane.tsx +9 -7
  652. package/src/plugins/builtin/supply-chain/graph.tsx +8 -6
  653. package/src/plugins/builtin/supply-chain/headless.ts +69 -27
  654. package/src/plugins/builtin/supply-chain/index.tsx +1 -1
  655. package/src/plugins/builtin/supply-chain/model.ts +76 -15
  656. package/src/plugins/builtin/supply-chain/pane.tsx +29 -15
  657. package/src/plugins/builtin/supply-chain/row-evidence.tsx +5 -4
  658. package/src/plugins/builtin/themes/headless.ts +15 -2
  659. package/src/plugins/builtin/themes/model.ts +2 -5
  660. package/src/plugins/builtin/thirteenf/api.ts +50 -2
  661. package/src/plugins/builtin/thirteenf/data.ts +250 -11
  662. package/src/plugins/builtin/thirteenf/headless.ts +311 -28
  663. package/src/plugins/builtin/thirteenf/index.tsx +4 -1
  664. package/src/plugins/builtin/thirteenf/model.ts +244 -19
  665. package/src/plugins/builtin/thirteenf/overlap-pane.tsx +133 -33
  666. package/src/plugins/builtin/thirteenf/overlap.ts +1 -1
  667. package/src/plugins/builtin/thirteenf/pane.tsx +24 -5
  668. package/src/plugins/builtin/thirteenf/report-notes.ts +78 -0
  669. package/src/plugins/builtin/thirteenf/types.ts +49 -0
  670. package/src/plugins/builtin/ticker-detail/data-panes/historical-prices.tsx +106 -24
  671. package/src/plugins/builtin/ticker-detail/data-panes/history-bars.ts +108 -0
  672. package/src/plugins/builtin/ticker-detail/data-panes/returns-pane.tsx +26 -8
  673. package/src/plugins/builtin/ticker-detail/financials/model.ts +2 -42
  674. package/src/plugins/builtin/ticker-detail/financials/tab.tsx +1 -1
  675. package/src/plugins/builtin/ticker-detail/headless-schema.ts +4 -2
  676. package/src/plugins/builtin/ticker-detail/headless.ts +109 -23
  677. package/src/plugins/builtin/ticker-detail/overview/components.tsx +27 -3
  678. package/src/plugins/builtin/ticker-detail/overview/dividend.ts +60 -0
  679. package/src/plugins/builtin/ticker-detail/overview/model.ts +46 -9
  680. package/src/plugins/builtin/ticker-detail/overview/pane.tsx +3 -0
  681. package/src/plugins/builtin/ticker-detail/overview-tab.tsx +37 -4
  682. package/src/plugins/builtin/ticker-detail/quote-monitor/card.tsx +18 -19
  683. package/src/plugins/builtin/time-sales/client.ts +7 -4
  684. package/src/plugins/builtin/time-sales/headless.ts +71 -22
  685. package/src/plugins/builtin/time-sales/model.ts +12 -0
  686. package/src/plugins/builtin/time-sales/pane.tsx +31 -7
  687. package/src/plugins/builtin/time-sales/window.ts +128 -0
  688. package/src/plugins/builtin/trace-bonds/client.ts +351 -33
  689. package/src/plugins/builtin/trace-bonds/headless.ts +60 -22
  690. package/src/plugins/builtin/trace-bonds/index.tsx +4 -2
  691. package/src/plugins/builtin/trace-bonds/model.ts +27 -25
  692. package/src/plugins/builtin/trace-bonds/pane.tsx +63 -45
  693. package/src/plugins/builtin/treasury-auctions/cache.ts +61 -15
  694. package/src/plugins/builtin/treasury-auctions/client.ts +45 -10
  695. package/src/plugins/builtin/treasury-auctions/headless.ts +35 -13
  696. package/src/plugins/builtin/treasury-auctions/index.tsx +5 -2
  697. package/src/plugins/builtin/treasury-auctions/model.ts +20 -16
  698. package/src/plugins/builtin/treasury-auctions/pane.tsx +29 -12
  699. package/src/plugins/builtin/vol-surface/charts.tsx +2 -1
  700. package/src/plugins/builtin/vol-surface/headless.ts +3 -2
  701. package/src/plugins/builtin/vol-surface/pane.tsx +2 -1
  702. package/src/plugins/builtin/vol-surface/stored.ts +4 -7
  703. package/src/plugins/builtin/volatility/chart-model.ts +16 -15
  704. package/src/plugins/builtin/volatility/charts.tsx +5 -5
  705. package/src/plugins/builtin/volatility/client.ts +73 -2
  706. package/src/plugins/builtin/volatility/evidence.ts +13 -14
  707. package/src/plugins/builtin/volatility/headless.ts +13 -7
  708. package/src/plugins/builtin/volatility/index.tsx +1 -1
  709. package/src/plugins/builtin/volatility/model.ts +104 -38
  710. package/src/plugins/builtin/volatility/pane.tsx +42 -24
  711. package/src/plugins/builtin/volatility/series.ts +22 -13
  712. package/src/plugins/builtin/world-venue-map/geo-series.ts +9 -0
  713. package/src/plugins/builtin/world-venue-map/headless.ts +25 -8
  714. package/src/plugins/builtin/world-venue-map/index.ts +16 -2
  715. package/src/plugins/builtin/world-venue-map/map.tsx +13 -17
  716. package/src/plugins/builtin/yield-curve/curves.ts +29 -5
  717. package/src/plugins/builtin/yield-curve/headless.ts +41 -8
  718. package/src/plugins/builtin/yield-curve/history.ts +5 -5
  719. package/src/plugins/builtin/yield-curve/index.tsx +30 -13
  720. package/src/plugins/compat.ts +3 -1
  721. package/src/plugins/dependencies.ts +8 -2
  722. package/src/plugins/host-link.ts +12 -5
  723. package/src/plugins/installer.ts +16 -7
  724. package/src/plugins/loader.ts +9 -2
  725. package/src/plugins/marketplace/activation.ts +10 -4
  726. package/src/plugins/registry/host-actions.ts +3 -0
  727. package/src/plugins/registry/index.ts +3 -1
  728. package/src/{plugins/builtin/portfolio-list → portfolio}/allocation.ts +82 -15
  729. package/src/{plugins/builtin/portfolio-list → portfolio}/column-values.ts +143 -55
  730. package/src/portfolio/futures-positions.ts +213 -0
  731. package/src/portfolio/futures-terms.ts +75 -0
  732. package/src/portfolio/manual-lots.ts +78 -0
  733. package/src/{plugins/builtin/portfolio-list → portfolio}/mutations.ts +59 -15
  734. package/src/portfolio/position-metrics.ts +44 -10
  735. package/src/portfolio/valuation-basis.ts +34 -24
  736. package/src/public/__snapshots__/public-api.test.ts.snap +6 -0
  737. package/src/public/time-series.ts +2 -1
  738. package/src/remote/confirm-change.tsx +2 -1
  739. package/src/remote/controller.ts +27 -7
  740. package/src/remote/schema.ts +25 -9
  741. package/src/remote/server.ts +1 -1
  742. package/src/remote/watchlist.ts +9 -1
  743. package/src/renderers/cloudflare/http-proxy.ts +21 -13
  744. package/src/renderers/dom/data-table/row.tsx +1 -1
  745. package/src/renderers/dom/desktop/audio-player.tsx +312 -0
  746. package/src/renderers/dom/desktop/control-styles.ts +17 -82
  747. package/src/renderers/dom/desktop/controls.tsx +39 -63
  748. package/src/renderers/dom/desktop/dialog-actions.tsx +13 -53
  749. package/src/renderers/dom/desktop/icons.tsx +8 -0
  750. package/src/renderers/dom/desktop/list-view.tsx +6 -6
  751. package/src/renderers/dom/desktop/popover.tsx +0 -3
  752. package/src/renderers/dom/desktop/query-bar.tsx +7 -5
  753. package/src/renderers/dom/desktop/select-field.tsx +9 -8
  754. package/src/renderers/dom/desktop/stack-header.ts +3 -0
  755. package/src/renderers/dom/dom-ui-host.tsx +5 -2
  756. package/src/renderers/dom/host/chart-surface.tsx +3 -3
  757. package/src/renderers/dom/host/size-observer.ts +33 -4
  758. package/src/renderers/dom/host/surface-3d.tsx +3 -2
  759. package/src/renderers/dom/host/surface-fit.ts +4 -1
  760. package/src/renderers/dom/host/tabs.tsx +22 -132
  761. package/src/renderers/dom/styles.css +358 -160
  762. package/src/renderers/dom/windowed-list.tsx +201 -0
  763. package/src/renderers/dom/windowed-rows.ts +65 -0
  764. package/src/renderers/electrobun/bun/core-capabilities.ts +1 -1
  765. package/src/renderers/electrobun/bun/desktop/backend-requests.ts +2 -9
  766. package/src/renderers/electrobun/bun/desktop/backend.ts +1 -1
  767. package/src/renderers/electrobun/bun/desktop/http-stream.ts +21 -6
  768. package/src/renderers/electrobun/bun/desktop/initialization.ts +1 -0
  769. package/src/renderers/electrobun/bun/desktop/state-broadcaster.ts +43 -1
  770. package/src/renderers/electrobun/bun/desktop/update.ts +21 -6
  771. package/src/renderers/electrobun/bun/desktop/workspace/requests.ts +5 -1
  772. package/src/renderers/electrobun/shared/protocol.ts +4 -2
  773. package/src/renderers/electrobun/shared/rpc-codec.ts +7 -0
  774. package/src/renderers/electrobun/view/cli-pane-shot-entry.tsx +21 -17
  775. package/src/renderers/electrobun/view/cli-pane-shot-frame.tsx +3 -3
  776. package/src/renderers/electrobun/view/desktop/window/bridge.ts +6 -8
  777. package/src/renderers/electrobun/view/desktop/window/snapshot.ts +18 -0
  778. package/src/renderers/electrobun/view/http-fetch.ts +12 -1
  779. package/src/series/capability.ts +1 -0
  780. package/src/series/files.ts +9 -3
  781. package/src/series/registry.ts +40 -14
  782. package/src/series/resolve.ts +121 -18
  783. package/src/series/standalone.ts +3 -2
  784. package/src/series/types.ts +55 -1
  785. package/src/series/validate.ts +39 -0
  786. package/src/shares/api.ts +26 -7
  787. package/src/shares/bug-report-dialog.tsx +2 -2
  788. package/src/shares/bug-report-flow.tsx +4 -7
  789. package/src/shares/capture-flow.ts +5 -4
  790. package/src/shares/capture-preview.tsx +2 -2
  791. package/src/shares/chat.ts +7 -27
  792. package/src/shares/flow.tsx +86 -40
  793. package/src/shares/location.ts +1 -3
  794. package/src/shares/pane-image.ts +11 -9
  795. package/src/shares/pane.ts +5 -2
  796. package/src/shares/payload.ts +1 -1
  797. package/src/shares/personal-pane.ts +3 -3
  798. package/src/shares/portable-layout.ts +9 -2
  799. package/src/shares/ready.ts +42 -0
  800. package/src/shares/test-harness.ts +62 -0
  801. package/src/sources/gloomberb-cloud/batched-lookups.ts +73 -0
  802. package/src/sources/gloomberb-cloud/index.ts +64 -12
  803. package/src/sources/gloomberb-cloud/normalizers.ts +31 -2
  804. package/src/sources/gloomberb-cloud/perpetuals.ts +20 -1
  805. package/src/sources/history-omitted.ts +34 -0
  806. package/src/sources/history-result.ts +3 -0
  807. package/src/sources/history-retention.ts +1 -1
  808. package/src/sources/listing-symbols.ts +8 -4
  809. package/src/sources/provider-errors.ts +43 -1
  810. package/src/sources/provider-router/batches.ts +3 -2
  811. package/src/sources/provider-router/cache.ts +2 -1
  812. package/src/sources/provider-router/cached-routes.ts +9 -3
  813. package/src/sources/provider-router/history.ts +9 -8
  814. package/src/sources/provider-router/index.ts +18 -3
  815. package/src/sources/provider-router/primary.ts +5 -4
  816. package/src/sources/provider-router/quote-route.ts +3 -1
  817. package/src/sources/provider-router/routing.ts +2 -1
  818. package/src/sources/provider-router/search.ts +47 -13
  819. package/src/sources/provider-router/streaming.ts +7 -4
  820. package/src/sources/sec-edgar.ts +1 -3
  821. package/src/state/app/context/index.tsx +9 -0
  822. package/src/state/app/tab-cursor.ts +222 -0
  823. package/src/state/hooks/quote-streaming.ts +3 -2
  824. package/src/state/hooks/session-snapshot.ts +3 -2
  825. package/src/state/persist-scheduler.ts +12 -4
  826. package/src/sync/controller.ts +22 -1
  827. package/src/sync/core-contributors.ts +264 -74
  828. package/src/team/collections-sync.ts +14 -4
  829. package/src/team/collections.ts +40 -11
  830. package/src/team/store.ts +5 -4
  831. package/src/telemetry/attention-counts.ts +8 -2
  832. package/src/telemetry/crash-reports-dom.ts +3 -0
  833. package/src/telemetry/crash-reports-node.ts +7 -4
  834. package/src/telemetry/crash-reports.ts +11 -11
  835. package/src/telemetry/usage-counts.ts +16 -12
  836. package/src/test-support/config-store.ts +31 -0
  837. package/src/test-support/moved-symbols.ts +64 -0
  838. package/src/theme/colors.ts +32 -0
  839. package/src/theme/font-scale.ts +2 -0
  840. package/src/theme/ui-tokens.ts +71 -0
  841. package/src/tickers/batched-lookups.ts +186 -0
  842. package/src/tickers/company-name-listing.ts +97 -0
  843. package/src/tickers/company-name.ts +13 -0
  844. package/src/tickers/instrument-coverage.ts +112 -0
  845. package/src/tickers/listing-fate.ts +282 -0
  846. package/src/tickers/listing-venues.ts +24 -5
  847. package/src/tickers/open-target.ts +13 -5
  848. package/src/tickers/search/index.ts +156 -37
  849. package/src/tickers/search/ranking.ts +68 -3
  850. package/src/tickers/search/types.ts +3 -0
  851. package/src/tickers/search/upsert.ts +22 -7
  852. package/src/tickers/terminal-codes.ts +79 -0
  853. package/src/tickers/ticker-changes.ts +100 -12
  854. package/src/tickers/us-listing.ts +2 -1
  855. package/src/time-series/bar-spacing.ts +19 -0
  856. package/src/time-series/chart-data.ts +116 -21
  857. package/src/time-series/field-catalog.ts +5 -2
  858. package/src/time-series/forward-valuation.ts +10 -7
  859. package/src/time-series/fundamentals.ts +103 -17
  860. package/src/time-series/hooks.ts +2 -0
  861. package/src/time-series/ice-credit.ts +17 -2
  862. package/src/time-series/live-bars.ts +24 -9
  863. package/src/time-series/live-quotes.ts +2 -3
  864. package/src/time-series/parsed-history-cache.ts +2 -0
  865. package/src/time-series/price-comparison.ts +6 -1
  866. package/src/time-series/price-units.ts +69 -0
  867. package/src/time-series/resolve.ts +114 -14
  868. package/src/time-series/session-bar.ts +138 -0
  869. package/src/time-series/spec.ts +14 -4
  870. package/src/time-series/studies.ts +214 -15
  871. package/src/time-series/transforms.ts +2 -0
  872. package/src/time-series/types.ts +33 -1
  873. package/src/time-series/use-chart-resolution.ts +2 -1
  874. package/src/time-series/valuation-price.ts +13 -0
  875. package/src/types/config.ts +17 -1
  876. package/src/types/data-provider.ts +20 -0
  877. package/src/types/financials.ts +2 -0
  878. package/src/types/headless.ts +169 -1
  879. package/src/types/instrument.ts +6 -0
  880. package/src/types/plugin.ts +39 -9
  881. package/src/types/price-history.ts +5 -0
  882. package/src/types/ticker-changes.ts +19 -0
  883. package/src/types/ticker.ts +10 -2
  884. package/src/ui/context-menu.tsx +2 -0
  885. package/src/ui/host.tsx +45 -4
  886. package/src/ui/measured-cells.ts +13 -7
  887. package/src/ui/qr.ts +7 -5
  888. package/src/updater/index.ts +8 -6
  889. package/src/utils/asset-category.ts +20 -0
  890. package/src/utils/calendar-date.ts +86 -27
  891. package/src/utils/currency-units.ts +17 -0
  892. package/src/utils/debug-log.ts +1 -1
  893. package/src/utils/decimal-comma.ts +83 -3
  894. package/src/utils/dividend-cash.ts +48 -0
  895. package/src/utils/dom-screenshot-rasters.ts +3 -1
  896. package/src/utils/dom-screenshot.ts +14 -10
  897. package/src/utils/exchange-rate-snapshot.ts +9 -4
  898. package/src/utils/external-url.ts +1 -0
  899. package/src/utils/fiscal-period.ts +47 -0
  900. package/src/utils/format.ts +5 -2
  901. package/src/utils/forward-dividend.ts +160 -11
  902. package/src/utils/fundamentals.ts +7 -2
  903. package/src/utils/futures-generic.ts +34 -8
  904. package/src/utils/http-proxy-response.ts +67 -9
  905. package/src/utils/local-utc-offset.ts +2 -0
  906. package/src/utils/log-failure.ts +31 -0
  907. package/src/utils/option-expiry.ts +12 -12
  908. package/src/utils/plugin-proxy-hosts.json +1 -5
  909. package/src/utils/price-history-integrity.ts +56 -0
  910. package/src/utils/price-history.ts +13 -1
  911. package/src/utils/sec-filings.ts +245 -0
  912. package/src/utils/selection-clipboard.ts +5 -2
  913. package/src/utils/throttled-fetch.ts +1 -0
  914. package/src/{plugins/builtin/dividend-yield/trailing-cash.ts → utils/trailing-dividend.ts} +55 -8
  915. package/src/utils/typo-distance.ts +22 -0
  916. package/src/utils/url.ts +1 -0
  917. package/src/utils/utc-time.ts +11 -0
  918. package/src/plugins/builtin/chat/share/targets.ts +0 -27
  919. package/src/plugins/builtin/shared/zip-text.ts +0 -46
  920. package/src/renderers/dom/host/top-surface.ts +0 -119
  921. package/src/shares/dialog.tsx +0 -221
  922. package/src/shares/live.ts +0 -19
@@ -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. */
@@ -143,6 +149,21 @@ export interface ChatChannel {
143
149
  teamId?: string;
144
150
  dmUser?: ChatUserSummary | null;
145
151
  members?: ChatUserSummary[];
152
+ /**
153
+ * When the newest message you can see in a direct or group conversation was
154
+ * sent; null when it has none. Absent from channels of other kinds and from
155
+ * servers that do not report it.
156
+ */
157
+ lastMessageAt?: string | null;
158
+ }
159
+
160
+ /** Minimal identities scoped by the server to this channel and existing DMs. */
161
+ export interface ChatMentionCandidate {
162
+ id: string;
163
+ username: string;
164
+ displayName: string | null;
165
+ channelActivityAt: string | null;
166
+ conversationActivityAt: string | null;
146
167
  }
147
168
 
148
169
  export interface ChatChannelState {
@@ -596,9 +617,25 @@ export interface CloudCdsHistoryPointPayload {
596
617
  reported: number;
597
618
  /** The contract on the run that day, e.g. "2031-12-20". */
598
619
  maturity: string;
620
+ /** For a line quoted upfront: that day's level in points on the line's coupon. */
621
+ upfrontPts?: number;
599
622
  }
600
623
 
601
- export interface CloudCdsHistoryResponse {
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;
636
+ }
637
+
638
+ export interface CloudCdsHistoryResponse extends CloudCdsUpfrontQuote {
602
639
  source: string;
603
640
  /** The matched reference entity, or null when nothing on the tape matched. */
604
641
  issuer: string | null;
@@ -606,14 +643,31 @@ export interface CloudCdsHistoryResponse {
606
643
  currency: string | null;
607
644
  asOf: string | null;
608
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;
609
660
  }
610
661
 
611
662
  /** An issuer's latest 5Y level: the last point of its history over the last month. */
612
- export interface CloudCdsLevelPayload {
663
+ export interface CloudCdsLevelPayload extends CloudCdsUpfrontQuote {
613
664
  /** The reference entity as the history response names it. */
614
665
  issuer: string;
615
666
  spreadBp: number;
616
667
  date: string;
668
+ /** As the history response's moves for the same name. */
669
+ change1W?: number | null;
670
+ change1M?: number | null;
617
671
  }
618
672
 
619
673
  export interface CloudCdsLevelsResponse {
@@ -1084,6 +1138,8 @@ export interface CloudTranscriptTurnPayload {
1084
1138
  isQa: boolean;
1085
1139
  /** Offset into the recording; null when the company published the transcript as a document. */
1086
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[];
1087
1143
  }
1088
1144
 
1089
1145
  interface CloudTranscriptKeyFigurePayload {
@@ -1130,6 +1186,20 @@ export interface CloudEarningsTranscriptPayload {
1130
1186
  updatedAt: string | null;
1131
1187
  }
1132
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
+
1133
1203
  export type CloudSearchDocType = "transcript" | "news" | "filing";
1134
1204
 
1135
1205
  export type CloudSearchSort = "relevance" | "newest" | "oldest";
@@ -1248,10 +1318,14 @@ interface CloudSecFilingPayload {
1248
1318
  primaryDocument?: string;
1249
1319
  primaryDocDescription?: string;
1250
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;
1251
1323
  cik: string;
1252
1324
  companyName?: string;
1253
1325
  filingUrl: string;
1254
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;
1255
1329
  }
1256
1330
 
1257
1331
  interface CloudSecDocumentPayload {
@@ -1473,6 +1547,11 @@ export interface CloudMarketResponse<T> {
1473
1547
  session?: unknown;
1474
1548
  /** "1day" when daily bars answer an intraday range: the listing has no intraday bars. */
1475
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;
1476
1555
  /** Untrusted until the history adapter validates its boundary dates. */
1477
1556
  coverage?: CloudHistoryCoverage;
1478
1557
  providerMeta?: {
@@ -1517,6 +1596,15 @@ export interface CloudMarketBatchPayload<T> {
1517
1596
 
1518
1597
  export type CloudMarketScreenerCategory = "gainers" | "losers" | "most-active";
1519
1598
 
1599
+ /**
1600
+ * What Gloom Cloud selects and ranks Gainers and Losers by: `regular` the last
1601
+ * completed regular session's move, the Chg% a row shows; `extended` the
1602
+ * latest print, after-hours or pre-market included. While the regular session
1603
+ * trades the two are one list. A server that predates the choice ignores it
1604
+ * and ranks by the latest print.
1605
+ */
1606
+ export type CloudMoverSession = "regular" | "extended";
1607
+
1520
1608
  /**
1521
1609
  * A movers row's quote sessions, under the quote's field names and meaning:
1522
1610
  * the session it was read in, the day its change is dated to, the last
@@ -1529,7 +1617,7 @@ export type CloudMoverSessionFields = Partial<Pick<Quote,
1529
1617
  | "preMarketPrice" | "preMarketChange" | "preMarketChangePercent"
1530
1618
  | "postMarketPrice" | "postMarketChange" | "postMarketChangePercent">>;
1531
1619
 
1532
- /** price, change and changePercent are the live print the list is ranked by; the session fields say how it reads. */
1620
+ /** price, change and changePercent are the live print the server ranks the list by; the session fields say how it reads. */
1533
1621
  export interface CloudMarketScreenerItem extends CloudMoverSessionFields {
1534
1622
  rank: number;
1535
1623
  symbol: string;
@@ -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
  }
@@ -13,6 +13,7 @@
13
13
  * later milestone as `experiments`, which the API turns into `exp_<key>` and
14
14
  * saves to the account once they sign in.
15
15
  */
16
+ import { logFailure } from "../utils/log-failure";
16
17
 
17
18
  export interface StorageLike {
18
19
  getItem(key: string): string | null;
@@ -75,6 +76,7 @@ function read(storage: StorageLike, key: string): string | null {
75
76
  try {
76
77
  return storage.getItem(key);
77
78
  } catch {
79
+ // Intentional ignore: Private browsing may deny optional experiment storage.
78
80
  return null;
79
81
  }
80
82
  }
@@ -83,7 +85,7 @@ function write(storage: StorageLike, key: string, value: string): void {
83
85
  try {
84
86
  storage.setItem(key, value);
85
87
  } catch {
86
- /* Private browsing still runs the terminal; the arm is just not remembered. */
88
+ // Intentional ignore: Private browsing may deny optional experiment storage.
87
89
  }
88
90
  }
89
91
 
@@ -112,7 +114,8 @@ export function exposeExperiment(experiment: string, env: WebExperimentEnvironme
112
114
  let answer: ExperimentAnswer;
113
115
  try {
114
116
  answer = await env.ask({ experiment, variant: assignments.get(experiment) });
115
- } catch {
117
+ } catch (error) {
118
+ logFailure("cloud-experiments", "Experiment exposure request failed")(error);
116
119
  // Not counted, so the next page load in this session may ask again.
117
120
  return null;
118
121
  }
@@ -33,9 +33,26 @@ export interface CloudCurveView {
33
33
  percentile1y: number | null;
34
34
  observations1y: number;
35
35
  }>;
36
+ /** Each tenor's 1D and 1W move ranked against its whole stored history; absent on servers older than it. */
37
+ moves?: CloudCurveMove[];
36
38
  checkedAt: string | null;
37
39
  }
38
40
 
41
+ /** How big a tenor's move into the session was, against every move of the same horizon through it. */
42
+ export interface CloudCurveMove {
43
+ tenor: string;
44
+ horizon: "1D" | "1W";
45
+ /** The session the move is measured from (the day before, or seven days before, within ten days). */
46
+ from: string | null;
47
+ /** Percentage points. */
48
+ change: number | null;
49
+ /** Midrank percentile of the move's size, 0 to 100; null below a year of moves. */
50
+ percentile: number | null;
51
+ observations: number;
52
+ /** The session the oldest ranked move ends on. */
53
+ since: string | null;
54
+ }
55
+
39
56
  /** One tenor of a stored curve over time, oldest first (`GET /cloud/econ/curves/:curve/history`). */
40
57
  export interface CloudCurveHistory {
41
58
  curve: CloudCurveHeader;
@@ -0,0 +1,38 @@
1
+ import type { AppConfig } from "../types/config";
2
+
3
+ /**
4
+ * The empty command bar's introduction: the Start Here rows in plain words and
5
+ * a placeholder with plain words to type. It shows for the first opens of the
6
+ * empty bar on this machine and then never again, so the bar settles into the
7
+ * list someone who knows the codes expects.
8
+ */
9
+ const COMMAND_BAR_INTRO_OPENS = 10;
10
+
11
+ /**
12
+ * Where the count stops: one past the last open with the introduction. It
13
+ * changes no more after that, so it is never saved again.
14
+ */
15
+ const COMMAND_BAR_OPENS_DONE = COMMAND_BAR_INTRO_OPENS + 1;
16
+
17
+ /**
18
+ * The saved count, or done when there is none. A new config starts at 0, so a
19
+ * config without one was made by a build from before the count, by someone who
20
+ * has been opening the bar all along.
21
+ */
22
+ export function sanitizeCommandBarOpens(value: unknown): number {
23
+ if (typeof value !== "number" || !Number.isFinite(value)) return COMMAND_BAR_OPENS_DONE;
24
+ return Math.min(COMMAND_BAR_OPENS_DONE, Math.max(0, Math.floor(value)));
25
+ }
26
+
27
+ /** The count after the empty bar opens once more. */
28
+ export function recordCommandBarOpen(opens: number | undefined): number {
29
+ return Math.min(COMMAND_BAR_OPENS_DONE, sanitizeCommandBarOpens(opens) + 1);
30
+ }
31
+
32
+ /**
33
+ * Whether the open bar is one of the first opens. The count already includes
34
+ * this open, so it reads the same for as long as the bar stays open.
35
+ */
36
+ export function showsCommandBarIntro(config: Pick<AppConfig, "commandBarOpens">): boolean {
37
+ return sanitizeCommandBarOpens(config.commandBarOpens) <= COMMAND_BAR_INTRO_OPENS;
38
+ }
@@ -231,7 +231,7 @@ export const KEYBINDING_ACTIONS: readonly KeybindingActionDef[] = [
231
231
  {
232
232
  id: "pane-share",
233
233
  category: "Pane Management",
234
- description: "Share the focused pane: post a picture to chat or copy its link.",
234
+ description: "Share the focused pane: copy a link to it.",
235
235
  defaults: ["CmdOrCtrl+Shift+S"],
236
236
  },
237
237
  {
@@ -11,6 +11,7 @@ import type { DataProvider } from "../../types/data-provider";
11
11
  import type {
12
12
  PaneDef,
13
13
  PaneTemplateCreateOptions,
14
+ PaneTemplateDef,
14
15
  PaneTemplateInstanceConfig,
15
16
  } from "../../types/plugin";
16
17
 
@@ -35,6 +36,39 @@ interface UseAppPaneTemplateRuntimeOptions {
35
36
  tickerRepository: AppTickerRepositoryPort;
36
37
  }
37
38
 
39
+ /**
40
+ * Whether shared data opens the pane by itself: the template takes it whole
41
+ * (a chart a plugin built), so its settings form would ask for what the data
42
+ * already says. A template that restores shares decides; any other takes data
43
+ * that holds something.
44
+ */
45
+ function shareDataOpens(template: Pick<PaneTemplateDef, "publicShare">, shareData: unknown): boolean {
46
+ if (!shareData || typeof shareData !== "object" || Array.isArray(shareData)) return false;
47
+ const restore = template.publicShare?.restore;
48
+ if (!restore) return Object.keys(shareData).length > 0;
49
+ try {
50
+ return restore(shareData as Record<string, unknown>) !== null;
51
+ } catch {
52
+ // Intentional ignore: data the template cannot restore asks for its settings form instead.
53
+ return false;
54
+ }
55
+ }
56
+
57
+ /**
58
+ * Whether opening a template asks for its settings first, in the same form the
59
+ * command bar opens, which creates the pane when it is sent.
60
+ */
61
+ export function templateAsksForSettings(
62
+ template: Pick<PaneTemplateDef, "wizard" | "publicShare">,
63
+ options: PaneTemplateCreateOptions | undefined,
64
+ ): boolean {
65
+ return !!template.wizard
66
+ && template.wizard.length > 0
67
+ && !options?.values
68
+ && !shareDataOpens(template, options?.shareData)
69
+ && (!options?.arg || template.wizard.some((step) => step.type === "textarea"));
70
+ }
71
+
38
72
  export function useAppPaneTemplateRuntime({
39
73
  buildPaneInstance,
40
74
  dataProvider,
@@ -49,13 +83,7 @@ export function useAppPaneTemplateRuntime({
49
83
  const template = pluginRegistry.paneTemplates.get(templateId);
50
84
  if (!template) return;
51
85
 
52
- // A template that asks for settings asks in the same form the command bar
53
- // opens, which creates the pane when it is sent.
54
- const asksForSettings = !!template.wizard
55
- && template.wizard.length > 0
56
- && !options?.values
57
- && (!options?.arg || template.wizard.some((step) => step.type === "textarea"));
58
- if (asksForSettings) {
86
+ if (templateAsksForSettings(template, options)) {
59
87
  openFormModal({ kind: "pane-template", templateId, arg: options?.arg, options });
60
88
  return;
61
89
  }
@@ -177,6 +177,10 @@ export function bindAppPanePluginRegistry({
177
177
  if (isDetachedWindow || isDialogOpen()) return;
178
178
  dispatch({ type: "SET_COMMAND_BAR", open: true, query });
179
179
  },
180
+ runCommandBarQuery: (query) => {
181
+ if (isDetachedWindow || isDialogOpen()) return;
182
+ dispatch({ type: "SET_COMMAND_BAR", open: true, query, launch: { kind: "run-query", query } });
183
+ },
180
184
  // Forms submit through the main window's state, so a detached window says where to go.
181
185
  openPluginCommandWorkflow: (commandId) => {
182
186
  if (isDetachedWindow) {
@@ -24,8 +24,8 @@ import {
24
24
  tickerOpenFailureMessage,
25
25
  type TickerOpenTarget,
26
26
  } from "../../tickers/open-target";
27
- import { AmbiguousTickerError, findExactTickerSearchMatch } from "../../tickers/search";
28
- import { isDialogOpen } from "../../ui/dialog-stack";
27
+ import { findExactTickerSearchMatch } from "../../tickers/search";
28
+ import { offerTickerListings, publishTickerOpenTarget as publishOpenTarget } from "./ticker-open-target";
29
29
  import { parsePublicTickerKey, publicTickerKey } from "../../utils/exchanges";
30
30
  import { attentionActionForPane, captureAttentionAction } from "../../telemetry/attention-counts";
31
31
  import { tickerHasListingSuffix } from "../../sources/listing-symbols";
@@ -79,11 +79,7 @@ export function useAppTickerOpenRuntime({
79
79
  return target;
80
80
  } catch (err) {
81
81
  if (!canPresentFeedback()) return null;
82
- // Ticker search offers the listings, unless a dialog would sit over the bar.
83
- if (err instanceof AmbiguousTickerError && !isDialogOpen()) {
84
- dispatch({ type: "SET_COMMAND_BAR", open: true, query: rawSymbol,
85
- launch: { kind: "ticker-search", query: rawSymbol } });
86
- }
82
+ offerTickerListings(err, rawSymbol, dispatch);
87
83
  const message = err instanceof Error ? err.message : String(err);
88
84
  pluginRegistry.notify({ body: `Failed to open ${rawSymbol}: ${message}`, type: "error" });
89
85
  return null;
@@ -91,13 +87,7 @@ export function useAppTickerOpenRuntime({
91
87
  }, [dataProvider, dispatch, pluginRegistry, stateRef, tickerRepository]);
92
88
 
93
89
  const publishTickerOpenTarget = useCallback((target: TickerOpenTarget) => {
94
- const currentTicker = stateRef.current.tickers.get(target.symbol);
95
- if (currentTicker !== target.ticker) {
96
- dispatch({ type: "UPDATE_TICKER", ticker: target.ticker });
97
- }
98
- if (target.created) {
99
- pluginRegistry.events.emit("ticker:added", { symbol: target.symbol, ticker: target.ticker });
100
- }
90
+ publishOpenTarget(target, { tickers: stateRef.current.tickers, dispatch, events: pluginRegistry.events });
101
91
  }, [dispatch, pluginRegistry.events, stateRef]);
102
92
 
103
93
  /**
@@ -0,0 +1,31 @@
1
+ import type { Dispatch } from "react";
2
+ import type { PluginRegistry } from "../../plugins/registry";
3
+ import type { AppAction } from "../../state/app/context";
4
+ import type { TickerRecord } from "../../types/ticker";
5
+ import type { TickerOpenTarget } from "../../tickers/open-target";
6
+ import { AmbiguousTickerError } from "../../tickers/search";
7
+ import { isDialogOpen } from "../../ui/dialog-stack";
8
+
9
+ /**
10
+ * A resolved open joins the app's tickers: the store takes the record when it
11
+ * is not the one it holds, and a ticker new to the app is announced once.
12
+ * Every open, from the command bar, a link or a pane, publishes it this way.
13
+ */
14
+ export function publishTickerOpenTarget(target: TickerOpenTarget, { tickers, dispatch, events }: {
15
+ tickers: ReadonlyMap<string, TickerRecord>;
16
+ dispatch: Dispatch<AppAction>;
17
+ events: Pick<PluginRegistry["events"], "emit">;
18
+ }): void {
19
+ if (tickers.get(target.symbol) !== target.ticker) {
20
+ dispatch({ type: "UPDATE_TICKER", ticker: target.ticker });
21
+ }
22
+ if (target.created) {
23
+ events.emit("ticker:added", { symbol: target.symbol, ticker: target.ticker });
24
+ }
25
+ }
26
+
27
+ /** An open whose symbol names several listings offers them in ticker search, unless a dialog would sit over the bar. */
28
+ export function offerTickerListings(error: unknown, rawSymbol: string, dispatch: Dispatch<AppAction>): void {
29
+ if (!(error instanceof AmbiguousTickerError) || isDialogOpen()) return;
30
+ dispatch({ type: "SET_COMMAND_BAR", open: true, query: rawSymbol, launch: { kind: "ticker-search", query: rawSymbol } });
31
+ }
@@ -8,7 +8,7 @@ import {
8
8
  import type { SyncBrokerInstanceResult } from "../../brokers/sync-broker-instance";
9
9
  import type { AppTickerRepositoryPort } from "../../core/app-service-ports";
10
10
  import type { PluginRegistry } from "../../plugins/registry";
11
- import { adoptHeldPortfolioCurrencies } from "../../plugins/builtin/portfolio-list/mutations";
11
+ import { adoptHeldPortfolioCurrencies } from "../../portfolio/mutations";
12
12
  import { saveConfigImmediately } from "../../state/config-save-scheduler";
13
13
  import type { AppAction, AppState } from "../../state/app/context";
14
14
  import type { AppConfig } from "../../types/config";
@@ -18,6 +18,7 @@ import { getBrokerInstance } from "../../utils/broker-instances";
18
18
  export interface AppBrokerImportRuntime {
19
19
  importBrokerPositions: (
20
20
  instanceId: string,
21
+ /** What the sync reads. It lands on the app's tickers as they are when it commits, whatever was passed. */
21
22
  tickerMap?: Map<string, TickerRecord>,
22
23
  options?: BrokerImportOptions,
23
24
  ) => Promise<SyncBrokerInstanceResult>;
@@ -52,6 +53,13 @@ export function useBrokerImportRuntime({
52
53
  stateRef: { current: AppState };
53
54
  tickerRepository: AppTickerRepositoryPort;
54
55
  }): AppBrokerImportRuntime {
56
+ /**
57
+ * Commits a sync: carried onto the app as it is now (a pull or an edit while
58
+ * the broker answered stays) and handed to the app before anything is
59
+ * written. With a wait in between, a pull landing in it would be overwritten
60
+ * by this older copy and pushed from here as an edit. The writes start in
61
+ * the same tick, so the copy of anyone writing after lands on disk after it.
62
+ */
55
63
  const applyBrokerImportResult = useCallback(async (
56
64
  instanceId: string,
57
65
  result: SyncBrokerInstanceResult,
@@ -62,31 +70,27 @@ export function useBrokerImportRuntime({
62
70
  },
63
71
  ) => {
64
72
  throwIfBrokerImportCancelled(options?.signal);
65
- dispatch({ type: "SET_BROKER_ACCOUNTS", instanceId, accounts: result.brokerAccounts });
66
-
67
- const liveConfig = stateRef.current.config;
73
+ const live = stateRef.current;
74
+ result.rebase(live);
68
75
  const nextConfig = options?.callerOwnsConfig
69
- ? (result.config !== baseConfig ? result.config : liveConfig)
70
- : rebaseBrokerSyncConfig(liveConfig, baseConfig, result.config, instanceId);
71
- if (nextConfig !== liveConfig) {
72
- throwIfBrokerImportCancelled(options?.signal);
73
- dispatch({ type: "SET_CONFIG", config: nextConfig });
74
- await saveConfigImmediately(nextConfig);
75
- throwIfBrokerImportCancelled(options?.signal);
76
- pluginRegistry.events.emit("config:changed", { config: nextConfig });
76
+ ? (result.config !== baseConfig ? result.config : live.config)
77
+ : rebaseBrokerSyncConfig(live.config, baseConfig, result.config, instanceId);
78
+ const configChanged = nextConfig !== live.config;
79
+
80
+ dispatch({ type: "SET_BROKER_ACCOUNTS", instanceId, accounts: result.brokerAccounts });
81
+ if (configChanged) dispatch({ type: "SET_CONFIG", config: nextConfig });
82
+ for (const ticker of [...result.addedTickers, ...result.updatedTickers]) {
83
+ dispatch({ type: "UPDATE_TICKER", ticker });
77
84
  }
85
+ await Promise.all([result.commit(), configChanged ? saveConfigImmediately(nextConfig) : undefined]);
78
86
 
87
+ if (configChanged) pluginRegistry.events.emit("config:changed", { config: nextConfig });
79
88
  for (const ticker of result.addedTickers) {
80
- throwIfBrokerImportCancelled(options?.signal);
81
89
  pluginRegistry.events.emit("ticker:added", { symbol: ticker.metadata.ticker, ticker });
82
90
  }
83
- for (const ticker of [...result.addedTickers, ...result.updatedTickers]) {
84
- throwIfBrokerImportCancelled(options?.signal);
85
- dispatch({ type: "UPDATE_TICKER", ticker: { ...ticker } });
86
- }
87
91
 
88
92
  for (const position of result.positions) {
89
- throwIfBrokerImportCancelled(options?.signal);
93
+ if (options?.signal?.aborted) break;
90
94
  // Skip market data for broker option symbols; position marks are already available.
91
95
  // Position data (markPrice, marketValue, unrealizedPnl) is used directly.
92
96
  if (options?.refreshImportedTickers !== false && position.assetCategory !== "OPT") {
@@ -120,8 +124,6 @@ export function useBrokerImportRuntime({
120
124
  throwIfBrokerImportCancelled(options?.signal);
121
125
  options?.onCommitStart?.();
122
126
  commitStarted = true;
123
- await result.commit();
124
- throwIfBrokerImportCancelled(options?.signal);
125
127
  await applyBrokerImportResult(instanceId, result, baseConfig, {
126
128
  ...options,
127
129
  callerOwnsConfig: options?.config !== undefined,
@@ -155,7 +157,7 @@ export function useBrokerImportRuntime({
155
157
  deferPersistence: true,
156
158
  onResult: async (result, instance, previousConfig) => {
157
159
  if (!getBrokerInstance(stateRef.current.config.brokerInstances, instance.id)) return;
158
- await result.commit();
160
+ // Startup syncs run beside the first pull: each lands on what it left.
159
161
  await applyBrokerImportResult(instance.id, result, previousConfig, {
160
162
  refreshImportedTickers: false,
161
163
  });