gloomberb 0.16.3 → 0.16.5

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 (820) hide show
  1. package/README.md +14 -91
  2. package/package.json +7 -1
  3. package/src/{plugins/builtin/cloud → account}/auth-form.tsx +9 -9
  4. package/src/{plugins/builtin/cloud → account}/auth-model.ts +4 -4
  5. package/src/account/billing.ts +57 -0
  6. package/src/{plugins/builtin/cloud → account}/device-signin-dialog.tsx +18 -12
  7. package/src/{plugins/builtin/cloud → account}/device-signin.ts +2 -2
  8. package/src/{plugins/builtin/cloud → account}/email-auth-attempt.ts +2 -2
  9. package/src/account/session.ts +16 -0
  10. package/src/{plugins/builtin/cloud → account}/upgrade-dialog.tsx +42 -17
  11. package/src/account/upgrade-personalization.ts +57 -0
  12. package/src/account/upgrade-tickers.ts +124 -0
  13. package/src/{plugins/builtin/cloud → account}/verification-panel.tsx +6 -6
  14. package/src/api-client/askg.ts +43 -0
  15. package/src/api-client/auth.ts +15 -0
  16. package/src/api-client/beneficial-owners.ts +4 -0
  17. package/src/api-client/chat.ts +19 -0
  18. package/src/api-client/company-kpis.ts +14 -2
  19. package/src/api-client/data.ts +58 -18
  20. package/src/api-client/earnings.ts +6 -0
  21. package/src/api-client/futures-curve.ts +56 -0
  22. package/src/api-client/index.ts +16 -1
  23. package/src/api-client/market-discovery.ts +10 -1
  24. package/src/api-client/normalizers.ts +27 -0
  25. package/src/api-client/paths.ts +95 -23
  26. package/src/api-client/request.ts +2 -1
  27. package/src/api-client/research-activity.ts +46 -10
  28. package/src/api-client/socket.ts +39 -8
  29. package/src/api-client/types.ts +74 -2
  30. package/src/api-client/upgrade-experiment.ts +90 -0
  31. package/src/api-client/yield-curves.ts +8 -0
  32. package/src/app/global-shortcuts.ts +26 -2
  33. package/src/app/keybindings/actions.ts +10 -0
  34. package/src/app/pane-runtime/index.tsx +8 -0
  35. package/src/app/pane-runtime/pane-template-runtime.ts +5 -0
  36. package/src/app/pane-runtime/plugin-bindings.ts +65 -25
  37. package/src/app/pane-runtime/ticker-inspector-runtime.ts +12 -0
  38. package/src/app/pane-runtime/ticker-open-runtime.ts +25 -4
  39. package/src/app/runtime/desktop-deeplink.ts +5 -0
  40. package/src/app/star-prompt/model.ts +98 -0
  41. package/src/app/star-prompt/runtime.ts +41 -0
  42. package/src/app/star-prompt/status-line.tsx +190 -0
  43. package/src/app.tsx +13 -7
  44. package/src/architecture/core-builtin-allowlist.json +61 -0
  45. package/src/brokers/signed-in/adapter.ts +33 -2
  46. package/src/brokers/signed-in/client.ts +10 -0
  47. package/src/brokers/signed-in/sign-in-dialog.tsx +34 -14
  48. package/src/brokers/signed-in/sign-in.ts +62 -5
  49. package/src/capabilities/chart-series.ts +11 -1
  50. package/src/capabilities/registry.ts +8 -1
  51. package/src/capabilities/types.ts +2 -0
  52. package/src/cli/commands/crypto-hints.ts +19 -4
  53. package/src/cli/commands/fred-series.ts +61 -0
  54. package/src/cli/commands/market.ts +744 -181
  55. package/src/cli/commands/news-hints.ts +62 -0
  56. package/src/cli/commands/news-search.ts +53 -0
  57. package/src/cli/commands/options-chain.ts +172 -0
  58. package/src/cli/commands/options-leaps.ts +425 -0
  59. package/src/cli/commands/overview.ts +251 -40
  60. package/src/cli/commands/remote.ts +2 -1
  61. package/src/cli/commands/search.ts +109 -15
  62. package/src/cli/commands/system.ts +151 -24
  63. package/src/cli/commands/themes.ts +64 -0
  64. package/src/cli/commands/ticker.ts +149 -40
  65. package/src/cli/context.ts +45 -14
  66. package/src/cli/desktop-pane-shot.ts +150 -17
  67. package/src/cli/earnings-calendar.ts +71 -0
  68. package/src/cli/errors.ts +25 -2
  69. package/src/cli/freshness.ts +22 -8
  70. package/src/cli/fx-pair.ts +57 -0
  71. package/src/cli/glossary.ts +429 -0
  72. package/src/cli/help.ts +14 -1
  73. package/src/cli/history-rows.ts +48 -7
  74. package/src/cli/index-roots.ts +58 -0
  75. package/src/cli/index.ts +29 -12
  76. package/src/cli/known-gaps.ts +27 -0
  77. package/src/cli/listing-arg.ts +595 -26
  78. package/src/cli/not-a-ticker.ts +44 -0
  79. package/src/cli/options.ts +50 -6
  80. package/src/cli/pane-functions/access-gate.ts +5 -0
  81. package/src/cli/pane-functions/capabilities.ts +11 -4
  82. package/src/cli/pane-functions/catalog.ts +48 -7
  83. package/src/cli/pane-functions/data.ts +48 -13
  84. package/src/cli/pane-functions/discovery.ts +1 -0
  85. package/src/cli/pane-functions/dom.ts +41 -19
  86. package/src/cli/pane-functions/freshness.ts +531 -32
  87. package/src/cli/pane-functions/function-help.ts +77 -25
  88. package/src/cli/pane-functions/headless.ts +50 -21
  89. package/src/cli/pane-functions/index.ts +66 -10
  90. package/src/cli/pane-functions/market-session.ts +147 -0
  91. package/src/cli/pane-functions/options.ts +77 -25
  92. package/src/cli/pane-functions/report-notices.ts +81 -0
  93. package/src/cli/pane-functions/report.ts +19 -8
  94. package/src/cli/pane-functions/resolver.ts +53 -18
  95. package/src/cli/pane-functions/screenshot-evidence.ts +2 -0
  96. package/src/cli/pane-functions/screenshot.ts +199 -30
  97. package/src/cli/registry.ts +2 -1
  98. package/src/cli/report-tables.ts +3 -0
  99. package/src/cli/result.ts +53 -13
  100. package/src/cli/row-window.ts +76 -0
  101. package/src/cli/scroll-truncation.ts +34 -0
  102. package/src/cli/staged-tickers.ts +52 -0
  103. package/src/cli/symbol-args.ts +9 -0
  104. package/src/cli/symbol-list.ts +172 -0
  105. package/src/cli/ticker-resolution.ts +223 -30
  106. package/src/cli/types.ts +5 -0
  107. package/src/components/chart/composite/axis-overlays.tsx +6 -2
  108. package/src/components/chart/composite/composite-chart.tsx +83 -10
  109. package/src/components/chart/composite/legend.tsx +88 -8
  110. package/src/components/chart/composite/panel-surface.tsx +44 -17
  111. package/src/components/chart/composite/price-axis-labels.tsx +3 -1
  112. package/src/components/chart/composite/rasterizer.ts +64 -4
  113. package/src/components/chart/composite/series-cues.ts +71 -0
  114. package/src/components/chart/composite/text-renderer.ts +16 -8
  115. package/src/components/chart/composite/types.ts +3 -0
  116. package/src/components/command-bar/commands/direct/index.ts +9 -1
  117. package/src/components/command-bar/commands/plugin/items.ts +3 -1
  118. package/src/components/command-bar/commands/registry.ts +7 -0
  119. package/src/components/command-bar/layout-items/focused-pane.ts +38 -0
  120. package/src/components/command-bar/pane-templates/workflow.ts +5 -0
  121. package/src/components/command-bar/panel/index.tsx +11 -3
  122. package/src/components/command-bar/panel/runtime.ts +3 -0
  123. package/src/components/command-bar/panel/types.ts +2 -0
  124. package/src/components/command-bar/routes/root/command-items.ts +2 -0
  125. package/src/components/command-bar/routes/root/plugin-turn-on.ts +92 -0
  126. package/src/components/command-bar/routes/root/provider-search.ts +4 -3
  127. package/src/components/command-bar/routes/root/results.ts +40 -10
  128. package/src/components/command-bar/routes/root/runtime.ts +8 -0
  129. package/src/components/command-bar/routes/root/search-providers.ts +97 -14
  130. package/src/components/command-bar/routes/ticker-search/results.ts +12 -11
  131. package/src/components/command-bar/routes/ticker-search/route.ts +4 -3
  132. package/src/components/command-bar/surface/index.tsx +18 -4
  133. package/src/components/command-bar/theme-picker.tsx +48 -13
  134. package/src/components/command-bar/workflow/ops.ts +5 -3
  135. package/src/components/command-bar/workflow/tickers.ts +23 -4
  136. package/src/components/data-table/view.tsx +28 -9
  137. package/src/components/layout/detached-pane-shell.tsx +9 -0
  138. package/src/components/layout/floating-pane.tsx +9 -2
  139. package/src/components/layout/header.tsx +20 -5
  140. package/src/components/layout/market-summary.ts +23 -9
  141. package/src/components/layout/pane/content.tsx +40 -29
  142. package/src/components/layout/pane/cycle-order.ts +2 -11
  143. package/src/components/layout/pane/footer/index.tsx +6 -2
  144. package/src/components/layout/pane/footer/model.ts +35 -1
  145. package/src/components/layout/pane/header.tsx +26 -2
  146. package/src/components/layout/pane/index.tsx +12 -2
  147. package/src/components/layout/pane/sidebar.tsx +78 -10
  148. package/src/components/layout/pane/title.ts +1 -1
  149. package/src/components/layout/presentation.ts +22 -0
  150. package/src/components/layout/shell/active-drag.ts +21 -5
  151. package/src/components/layout/shell/drag/index.ts +43 -9
  152. package/src/components/layout/shell/drag/live.ts +87 -6
  153. package/src/components/layout/shell/drag/runtime.ts +62 -20
  154. package/src/components/layout/shell/index.tsx +71 -12
  155. package/src/components/layout/shell/layout-state.ts +5 -11
  156. package/src/components/layout/shell/menu.ts +33 -1
  157. package/src/components/layout/shell/native/pointer-runtime.ts +3 -1
  158. package/src/components/layout/shell/pane/actions.ts +2 -1
  159. package/src/components/layout/shell/pane/layers.tsx +216 -28
  160. package/src/components/layout/shell/pane/management-shortcuts.ts +5 -0
  161. package/src/components/layout/shell/pane/new-layout.ts +116 -0
  162. package/src/components/layout/shell/shortcuts.ts +5 -2
  163. package/src/components/layout/shell/terminal-pointer-runtime.ts +24 -0
  164. package/src/components/layout/shell/visible-layout.ts +44 -1
  165. package/src/components/layout/status-bar.tsx +4 -1
  166. package/src/components/markdown-text.tsx +69 -23
  167. package/src/components/metric-treemap/heat-surface.tsx +37 -9
  168. package/src/components/metric-treemap/heat-tiles.ts +48 -17
  169. package/src/components/onboarding/account-step/form-panel.tsx +1 -1
  170. package/src/components/onboarding/account-step/index.tsx +1 -1
  171. package/src/components/onboarding/account-step/qr-panel.tsx +1 -1
  172. package/src/components/onboarding/account-step/signed-in-panel.tsx +1 -1
  173. package/src/components/onboarding/onboarding-frame.tsx +33 -10
  174. package/src/components/onboarding/onboarding-keyboard.ts +1 -1
  175. package/src/components/onboarding/onboarding-wizard.tsx +50 -41
  176. package/src/components/onboarding/portfolio-step/positions-panel.tsx +5 -2
  177. package/src/components/onboarding/pro-step-layout.ts +86 -0
  178. package/src/components/onboarding/use-onboarding-upgrade.ts +8 -4
  179. package/src/components/onboarding/wizard-account.ts +2 -2
  180. package/src/components/pane-template-wizard.tsx +9 -1
  181. package/src/components/price-selector-dialog.tsx +11 -2
  182. package/src/components/sign-in-gate.tsx +3 -3
  183. package/src/components/ticker/list-table-view.tsx +24 -1
  184. package/src/components/ui/action-row.tsx +2 -1
  185. package/src/components/ui/button.tsx +17 -1
  186. package/src/components/ui/choice-dialog.tsx +6 -4
  187. package/src/components/ui/confirm-dialog.tsx +28 -18
  188. package/src/components/ui/data-table/index.tsx +49 -0
  189. package/src/components/ui/data-table/opentui/index.tsx +37 -6
  190. package/src/components/ui/data-table/types.ts +20 -1
  191. package/src/components/ui/data-table/visible-range.ts +2 -0
  192. package/src/components/ui/dialog-actions.tsx +64 -0
  193. package/src/components/ui/display.tsx +17 -3
  194. package/src/components/ui/frame.tsx +35 -2
  195. package/src/components/ui/icon.tsx +13 -2
  196. package/src/components/ui/index.ts +1 -1
  197. package/src/components/ui/text-prompt-dialog.tsx +11 -9
  198. package/src/core/connection-health.ts +1 -1
  199. package/src/core/state/app/layout-reducer.ts +89 -3
  200. package/src/core/state/app/state.ts +8 -5
  201. package/src/core/state/app/types.ts +13 -2
  202. package/src/data/cached-query.ts +2 -0
  203. package/src/data/config/layout.ts +55 -21
  204. package/src/data/config/store/fold-panes.ts +149 -0
  205. package/src/data/config/store/migrations.ts +7 -0
  206. package/src/data/config/store/node.ts +27 -6
  207. package/src/data/config/store/normalize.ts +44 -5
  208. package/src/data/ticker-repository.ts +5 -0
  209. package/src/data/ticker-store.ts +15 -0
  210. package/src/docs/content.ts +215 -0
  211. package/src/docs/load.ts +139 -0
  212. package/src/docs/requests.ts +39 -0
  213. package/src/docs/snapshot.chunk.ts +8 -0
  214. package/src/docs/snapshot.json +7416 -0
  215. package/src/docs/topics.ts +216 -0
  216. package/src/i18n/es.ts +75 -5
  217. package/src/i18n/ja.ts +75 -5
  218. package/src/i18n/ko.ts +75 -5
  219. package/src/i18n/zh-cn.ts +75 -5
  220. package/src/i18n/zh-tw.ts +75 -5
  221. package/src/layout/desks.ts +2 -3
  222. package/src/layout/pane-layout-move.ts +264 -0
  223. package/src/layout/pane-manager/dock-tree.ts +18 -0
  224. package/src/layout/pane-manager/hidden-panes.ts +160 -0
  225. package/src/layout/pane-manager/index.ts +2 -0
  226. package/src/market-data/coordinator/chart.ts +10 -4
  227. package/src/market-data/coordinator/entries.ts +7 -1
  228. package/src/market-data/coordinator/index.ts +6 -3
  229. package/src/market-data/coordinator/quotes.ts +2 -2
  230. package/src/{plugins/builtin/futures/contracts.ts → market-data/futures-board.ts} +81 -28
  231. package/src/market-data/futures-contract.ts +151 -0
  232. package/src/market-data/hooks.tsx +10 -2
  233. package/src/market-data/market/format.ts +39 -21
  234. package/src/market-data/market/freshness.ts +193 -30
  235. package/src/market-data/market/status.ts +59 -23
  236. package/src/market-data/options-alternatives.ts +69 -0
  237. package/src/market-data/published-apac-sessions.ts +23 -1
  238. package/src/market-data/quotes/contributions.ts +22 -2
  239. package/src/market-data/quotes/metadata.ts +8 -9
  240. package/src/market-data/quotes/resolution.ts +2 -0
  241. package/src/market-data/quotes/screener-live-quotes.ts +61 -9
  242. package/src/market-data/result-types.ts +2 -0
  243. package/src/plugins/builtin/account-management/keyboard.ts +3 -0
  244. package/src/plugins/builtin/account-management/model.ts +2 -56
  245. package/src/plugins/builtin/account-management/navigation.ts +1 -1
  246. package/src/plugins/builtin/account-management/pane.tsx +37 -8
  247. package/src/plugins/builtin/account-management/password-dialog.tsx +1 -1
  248. package/src/plugins/builtin/alerts/cli.ts +313 -47
  249. package/src/plugins/builtin/alerts/events-pane.tsx +45 -7
  250. package/src/plugins/builtin/alerts/events.ts +23 -2
  251. package/src/plugins/builtin/alerts/history-pane.tsx +7 -2
  252. package/src/plugins/builtin/alerts/history.ts +2 -0
  253. package/src/plugins/builtin/alerts/index.tsx +41 -9
  254. package/src/plugins/builtin/alerts/pane.tsx +8 -0
  255. package/src/plugins/builtin/alerts/quotes.ts +3 -0
  256. package/src/plugins/builtin/alerts/research-builder.ts +8 -3
  257. package/src/plugins/builtin/alerts/research-rules.ts +18 -2
  258. package/src/plugins/builtin/alerts/scheduled-check.ts +122 -0
  259. package/src/plugins/builtin/alerts/scheduled-sources.ts +25 -0
  260. package/src/plugins/builtin/alerts/scheduled.ts +254 -0
  261. package/src/plugins/builtin/alerts/targets.ts +92 -0
  262. package/src/plugins/builtin/analytics/index.tsx +4 -2
  263. package/src/plugins/builtin/analytics/risk-headless.ts +33 -13
  264. package/src/plugins/builtin/analytics/risk-math.ts +91 -27
  265. package/src/plugins/builtin/analytics/risk-model.ts +71 -12
  266. package/src/plugins/builtin/analytics/risk-pane.tsx +23 -12
  267. package/src/plugins/builtin/attention/index.tsx +2 -0
  268. package/src/plugins/builtin/attention/pane.tsx +3 -1
  269. package/src/plugins/builtin/attention/series.ts +26 -0
  270. package/src/plugins/builtin/awards/index.tsx +2 -0
  271. package/src/plugins/builtin/awards/pane.tsx +3 -1
  272. package/src/plugins/builtin/awards/series.ts +29 -0
  273. package/src/plugins/builtin/backtest/pane.tsx +1 -1
  274. package/src/plugins/builtin/bond-calculator/model.ts +2 -1
  275. package/src/plugins/builtin/broker-manager/detail.tsx +4 -0
  276. package/src/plugins/builtin/broker-manager/index.tsx +7 -3
  277. package/src/plugins/builtin/broker-manager/model.ts +8 -0
  278. package/src/plugins/builtin/broker-manager/pane-actions.tsx +8 -2
  279. package/src/plugins/builtin/broker-manager/sign-in-end.ts +82 -0
  280. package/src/plugins/builtin/broker-manager/table.ts +5 -0
  281. package/src/plugins/builtin/builtin-plugin-meta.ts +121 -11
  282. package/src/plugins/builtin/catalysts/pane.tsx +3 -1
  283. package/src/plugins/builtin/cds/client.ts +70 -13
  284. package/src/plugins/builtin/cds/headless.ts +116 -19
  285. package/src/plugins/builtin/cds/index.tsx +3 -1
  286. package/src/plugins/builtin/cds/model.ts +193 -31
  287. package/src/plugins/builtin/cds/pane.tsx +56 -14
  288. package/src/plugins/builtin/cds/series.ts +19 -0
  289. package/src/plugins/builtin/central-bank-rates/index.tsx +2 -0
  290. package/src/plugins/builtin/central-bank-rates/series.ts +42 -0
  291. package/src/plugins/builtin/chart-composer/catalog-inventory.ts +192 -255
  292. package/src/plugins/builtin/chart-composer/data-catalog-pane.tsx +84 -46
  293. package/src/plugins/builtin/chart-composer/editor.tsx +5 -4
  294. package/src/plugins/builtin/chart-composer/field-series.ts +40 -0
  295. package/src/plugins/builtin/chart-composer/headless.ts +8 -3
  296. package/src/plugins/builtin/chart-composer/index.tsx +9 -2
  297. package/src/plugins/builtin/chart-composer/pane.tsx +1 -1
  298. package/src/plugins/builtin/chart-composer/series-catalog.ts +58 -50
  299. package/src/plugins/builtin/chart-composer/series-expression.ts +18 -10
  300. package/src/plugins/builtin/chart-composer/use-series-catalog.ts +59 -3
  301. package/src/plugins/builtin/chart-composer/user-series.ts +84 -0
  302. package/src/plugins/builtin/chat/channels.ts +34 -36
  303. package/src/plugins/builtin/chat/command-bar.ts +138 -0
  304. package/src/plugins/builtin/chat/composer-commands.ts +21 -1
  305. package/src/plugins/builtin/chat/content/composer-runtime.ts +11 -1
  306. package/src/plugins/builtin/chat/content/footer.tsx +5 -3
  307. package/src/plugins/builtin/chat/content/index.tsx +21 -1
  308. package/src/plugins/builtin/chat/content/mentions.ts +2 -1
  309. package/src/plugins/builtin/chat/content/new-dm-dialog.tsx +10 -2
  310. package/src/plugins/builtin/chat/content/user-map.ts +3 -1
  311. package/src/plugins/builtin/chat/controller/index.ts +50 -0
  312. package/src/plugins/builtin/chat/conversations.ts +256 -0
  313. package/src/plugins/builtin/chat/discord-command.ts +91 -0
  314. package/src/plugins/builtin/chat/edit-window.ts +12 -6
  315. package/src/plugins/builtin/chat/ghost-user.ts +14 -0
  316. package/src/plugins/builtin/chat/index.tsx +40 -2
  317. package/src/plugins/builtin/chat/layout.ts +2 -0
  318. package/src/plugins/builtin/chat/message/desktop.tsx +2 -1
  319. package/src/plugins/builtin/chat/message/header.tsx +24 -15
  320. package/src/plugins/builtin/chat/message/profile-popover.tsx +2 -1
  321. package/src/plugins/builtin/chat/message/render-state.ts +3 -0
  322. package/src/plugins/builtin/chat/pane-requests.ts +60 -0
  323. package/src/plugins/builtin/chat/pane-state.ts +32 -2
  324. package/src/plugins/builtin/chat/pane.tsx +8 -0
  325. package/src/plugins/builtin/cloud/askg/controller.ts +223 -23
  326. package/src/plugins/builtin/cloud/askg/conversation-store.ts +21 -0
  327. package/src/plugins/builtin/cloud/askg/executor.ts +57 -3
  328. package/src/plugins/builtin/cloud/askg/manifest.ts +33 -7
  329. package/src/plugins/builtin/cloud/askg/model.ts +156 -78
  330. package/src/plugins/builtin/cloud/askg/pane.tsx +772 -377
  331. package/src/plugins/builtin/cloud/askg/protocol.ts +50 -3
  332. package/src/plugins/builtin/cloud/askg/tool-display.ts +440 -0
  333. package/src/plugins/builtin/cloud/askg/tool-timeline.tsx +403 -0
  334. package/src/plugins/builtin/cloud/askg/undo.ts +2 -0
  335. package/src/plugins/builtin/cloud/auth-actions.tsx +1 -1
  336. package/src/plugins/builtin/cloud/auth-commands.ts +1 -1
  337. package/src/plugins/builtin/cloud/auth-dialog.tsx +3 -3
  338. package/src/plugins/builtin/cloud/company-picker.tsx +1 -9
  339. package/src/plugins/builtin/cloud/mcp-connect/command.ts +24 -0
  340. package/src/plugins/builtin/cloud/mcp-connect/dialog.tsx +363 -0
  341. package/src/plugins/builtin/cloud/mcp-connect/model.ts +135 -0
  342. package/src/plugins/builtin/cloud/mcp-connect/sections.ts +62 -0
  343. package/src/plugins/builtin/cloud/plugin.tsx +36 -1
  344. package/src/plugins/builtin/cloud/terminal-relay/acm-tab.tsx +89 -0
  345. package/src/plugins/builtin/cloud/terminal-relay/client.ts +97 -0
  346. package/src/plugins/builtin/cloud/terminal-relay/connect-section.tsx +57 -0
  347. package/src/plugins/builtin/cloud/terminal-relay/engine.ts +734 -0
  348. package/src/plugins/builtin/cloud/terminal-relay/grants.ts +137 -0
  349. package/src/plugins/builtin/cloud/terminal-relay/host.tsx +81 -0
  350. package/src/plugins/builtin/cloud/terminal-relay/indicator.tsx +82 -0
  351. package/src/plugins/builtin/cloud/terminal-relay/manifest.ts +239 -0
  352. package/src/plugins/builtin/cloud/terminal-relay/policy.ts +162 -0
  353. package/src/plugins/builtin/cloud/terminal-relay/prompts.tsx +192 -0
  354. package/src/plugins/builtin/cloud/terminal-relay/redact.ts +73 -0
  355. package/src/plugins/builtin/cloud/terminal-relay/summary.ts +62 -0
  356. package/src/plugins/builtin/cloud/thesis/exposure.ts +1 -1
  357. package/src/plugins/builtin/cloud/thesis/prompts.tsx +2 -1
  358. package/src/plugins/builtin/comment-letters/client.ts +1 -3
  359. package/src/plugins/builtin/company-attention/app-rank.tsx +1 -1
  360. package/src/plugins/builtin/company-attention/headless.ts +19 -5
  361. package/src/plugins/builtin/company-attention/index.tsx +2 -0
  362. package/src/plugins/builtin/company-attention/model.ts +26 -7
  363. package/src/plugins/builtin/company-attention/pane.tsx +12 -9
  364. package/src/plugins/builtin/company-attention/series.ts +52 -0
  365. package/src/plugins/builtin/company-kpis/client.ts +23 -8
  366. package/src/plugins/builtin/company-kpis/headless.ts +3 -1
  367. package/src/plugins/builtin/company-kpis/pane.tsx +19 -9
  368. package/src/plugins/builtin/company-kpis/screenshot-evidence.ts +10 -3
  369. package/src/plugins/builtin/composite-plugins.ts +116 -67
  370. package/src/plugins/builtin/cot/index.tsx +3 -1
  371. package/src/plugins/builtin/cot/model.ts +40 -11
  372. package/src/plugins/builtin/cot/series.ts +27 -0
  373. package/src/plugins/builtin/credit-boards/cdx-pane.tsx +4 -4
  374. package/src/plugins/builtin/credit-boards/index.tsx +23 -21
  375. package/src/plugins/builtin/credit-boards/model.ts +0 -1
  376. package/src/plugins/builtin/credit-boards/pane.tsx +30 -0
  377. package/src/plugins/builtin/credit-boards/series.ts +66 -0
  378. package/src/plugins/builtin/credit-boards/sovr-pane.tsx +4 -4
  379. package/src/plugins/builtin/credit-conditions/index.tsx +2 -0
  380. package/src/plugins/builtin/credit-conditions/series.ts +26 -0
  381. package/src/plugins/builtin/credit-documents/headless.ts +31 -1
  382. package/src/plugins/builtin/credit-documents/pane.tsx +3 -1
  383. package/src/plugins/builtin/crypto-board/headless.ts +2 -3
  384. package/src/plugins/builtin/crypto-board/index.tsx +2 -0
  385. package/src/plugins/builtin/crypto-board/model.ts +12 -0
  386. package/src/plugins/builtin/crypto-board/pane.tsx +19 -12
  387. package/src/plugins/builtin/crypto-board/series.ts +48 -0
  388. package/src/plugins/builtin/custom-view/live-quotes.ts +2 -2
  389. package/src/plugins/builtin/debt-maturities/client.ts +37 -9
  390. package/src/plugins/builtin/debt-maturities/headless.ts +3 -1
  391. package/src/plugins/builtin/debt-maturities/index.tsx +2 -0
  392. package/src/plugins/builtin/debt-maturities/pane.tsx +5 -4
  393. package/src/plugins/builtin/debt-maturities/series.ts +45 -0
  394. package/src/plugins/builtin/dividend-yield/headless.ts +2 -2
  395. package/src/plugins/builtin/dividend-yield/index.tsx +3 -1
  396. package/src/plugins/builtin/dividend-yield/pane.tsx +1 -1
  397. package/src/plugins/builtin/dividend-yield/series.ts +20 -0
  398. package/src/plugins/builtin/docs/blocks.tsx +181 -0
  399. package/src/plugins/builtin/docs/index.tsx +68 -0
  400. package/src/plugins/builtin/docs/pane.tsx +426 -0
  401. package/src/plugins/builtin/docs/targets.ts +72 -0
  402. package/src/plugins/builtin/docs/use-docs.ts +60 -0
  403. package/src/plugins/builtin/doe/index.tsx +2 -0
  404. package/src/plugins/builtin/doe/series.ts +62 -0
  405. package/src/plugins/builtin/earnings/client.ts +3 -2
  406. package/src/plugins/builtin/earnings/format.ts +1 -5
  407. package/src/plugins/builtin/earnings/headless.ts +58 -6
  408. package/src/plugins/builtin/earnings/history-model.ts +15 -1
  409. package/src/plugins/builtin/earnings/history-table.ts +13 -2
  410. package/src/plugins/builtin/earnings/history.tsx +7 -3
  411. package/src/plugins/builtin/earnings-calls/data.ts +28 -7
  412. package/src/plugins/builtin/earnings-calls/headless.ts +3 -2
  413. package/src/plugins/builtin/earnings-calls/pane.tsx +10 -5
  414. package/src/plugins/builtin/econ/calendar-model.ts +42 -17
  415. package/src/plugins/builtin/econ/detail-view.tsx +2 -2
  416. package/src/plugins/builtin/econ/fred-catalog.ts +189 -0
  417. package/src/plugins/builtin/econ/fred-series-map.ts +0 -46
  418. package/src/plugins/builtin/econ/index.tsx +70 -22
  419. package/src/plugins/builtin/econ-statistics/defs.ts +5 -0
  420. package/src/plugins/builtin/econ-statistics/headless.ts +30 -5
  421. package/src/plugins/builtin/econ-statistics/pane.tsx +1 -1
  422. package/src/plugins/builtin/econ-statistics/stats.ts +1 -0
  423. package/src/plugins/builtin/econ-statistics/view.ts +17 -0
  424. package/src/plugins/builtin/equity-screener/pane.tsx +4 -11
  425. package/src/plugins/builtin/executives/data.ts +17 -6
  426. package/src/plugins/builtin/executives/pane.tsx +16 -7
  427. package/src/plugins/builtin/exposure/holdings.ts +1 -1
  428. package/src/plugins/builtin/exposure/pane.tsx +3 -1
  429. package/src/plugins/builtin/fear-greed/index.tsx +4 -0
  430. package/src/plugins/builtin/fear-greed/series.ts +52 -0
  431. package/src/plugins/builtin/filing-events/pane.tsx +22 -5
  432. package/src/plugins/builtin/futures/index.tsx +43 -3
  433. package/src/plugins/builtin/futures/model.ts +1 -1
  434. package/src/plugins/builtin/futures/returns.ts +1 -1
  435. package/src/plugins/builtin/futures/series.ts +13 -0
  436. package/src/plugins/builtin/futures/table.tsx +1 -1
  437. package/src/plugins/builtin/futures/use-front-returns.ts +1 -1
  438. package/src/plugins/builtin/futures-curve/client.ts +12 -3
  439. package/src/plugins/builtin/futures-curve/headless.ts +70 -9
  440. package/src/plugins/builtin/futures-curve/index.tsx +1 -1
  441. package/src/plugins/builtin/futures-curve/model.ts +66 -11
  442. package/src/plugins/builtin/futures-curve/pane.tsx +52 -18
  443. package/src/plugins/builtin/fx-matrix/index.tsx +22 -1
  444. package/src/plugins/builtin/fx-matrix/pairs.ts +1 -1
  445. package/src/plugins/builtin/fx-matrix/settings.ts +42 -2
  446. package/src/plugins/builtin/gpu/board.tsx +13 -10
  447. package/src/plugins/builtin/gpu/changes.tsx +4 -4
  448. package/src/plugins/builtin/gpu/client.ts +19 -1
  449. package/src/plugins/builtin/gpu/equities.tsx +14 -10
  450. package/src/plugins/builtin/gpu/headless.ts +64 -27
  451. package/src/plugins/builtin/gpu/history.tsx +3 -3
  452. package/src/plugins/builtin/gpu/index.tsx +2 -0
  453. package/src/plugins/builtin/gpu/model.ts +114 -20
  454. package/src/plugins/builtin/gpu/pane.tsx +28 -12
  455. package/src/plugins/builtin/gpu/series.ts +38 -0
  456. package/src/plugins/builtin/help/function-card.tsx +25 -6
  457. package/src/plugins/builtin/help/index.tsx +18 -8
  458. package/src/plugins/builtin/holders/beneficial-client.ts +29 -7
  459. package/src/plugins/builtin/holders/beneficial-model.ts +90 -3
  460. package/src/plugins/builtin/holders/beneficial-report.ts +57 -5
  461. package/src/plugins/builtin/holders/beneficial-view.tsx +62 -14
  462. package/src/plugins/builtin/holders/client.ts +22 -3
  463. package/src/plugins/builtin/holders/format.ts +18 -3
  464. package/src/plugins/builtin/holders/headless.ts +42 -134
  465. package/src/plugins/builtin/holders/pane.tsx +14 -4
  466. package/src/plugins/builtin/holders/report-header.ts +40 -5
  467. package/src/plugins/builtin/holders/report-rows.ts +240 -0
  468. package/src/plugins/builtin/insider/client.ts +35 -20
  469. package/src/plugins/builtin/insider/headless.ts +41 -11
  470. package/src/plugins/builtin/insider/index.tsx +27 -10
  471. package/src/plugins/builtin/insider/insider-data.ts +10 -0
  472. package/src/plugins/builtin/insider/issuer.ts +49 -0
  473. package/src/plugins/builtin/insider/model.ts +3 -0
  474. package/src/plugins/builtin/iv-history/charts.tsx +21 -7
  475. package/src/plugins/builtin/iv-history/client.ts +26 -6
  476. package/src/plugins/builtin/iv-history/format.ts +33 -2
  477. package/src/plugins/builtin/iv-history/headless.ts +27 -12
  478. package/src/plugins/builtin/iv-history/index.tsx +5 -3
  479. package/src/plugins/builtin/iv-history/model.ts +172 -20
  480. package/src/plugins/builtin/iv-history/pane.tsx +11 -3
  481. package/src/plugins/builtin/iv-history/screen-pane.tsx +45 -25
  482. package/src/plugins/builtin/iv-history/series.ts +29 -0
  483. package/src/plugins/builtin/jobs/headless.ts +28 -3
  484. package/src/plugins/builtin/jobs/index.tsx +3 -1
  485. package/src/plugins/builtin/jobs/pane.tsx +1 -1
  486. package/src/plugins/builtin/jobs/series.ts +19 -0
  487. package/src/plugins/builtin/kelly-sizer/headless.ts +149 -0
  488. package/src/plugins/builtin/kelly-sizer/history.ts +80 -0
  489. package/src/plugins/builtin/kelly-sizer/index.tsx +2 -0
  490. package/src/plugins/builtin/kelly-sizer/pane.tsx +111 -40
  491. package/src/plugins/builtin/kelly-sizer/portfolio.ts +0 -39
  492. package/src/plugins/builtin/kelly-sizer/sections.tsx +14 -0
  493. package/src/plugins/builtin/kelly-sizer/types.ts +9 -1
  494. package/src/plugins/builtin/layout-manager/index.tsx +9 -1
  495. package/src/plugins/builtin/macro-day/client.ts +68 -3
  496. package/src/plugins/builtin/macro-day/headless.ts +18 -12
  497. package/src/plugins/builtin/macro-day/index.tsx +3 -0
  498. package/src/plugins/builtin/macro-day/model.ts +66 -15
  499. package/src/plugins/builtin/macro-day/pane.tsx +34 -20
  500. package/src/plugins/builtin/macro-day/release-table.ts +40 -0
  501. package/src/plugins/builtin/macro-day/releases.ts +62 -44
  502. package/src/plugins/builtin/market-heatmap/data.ts +25 -5
  503. package/src/plugins/builtin/market-heatmap/evidence.ts +90 -0
  504. package/src/plugins/builtin/market-heatmap/index.tsx +144 -63
  505. package/src/plugins/builtin/market-heatmap/model.ts +102 -3
  506. package/src/plugins/builtin/market-heatmap/portfolio.ts +12 -2
  507. package/src/plugins/builtin/market-movers/client.ts +7 -5
  508. package/src/plugins/builtin/market-movers/headless.ts +31 -4
  509. package/src/plugins/builtin/market-movers/index.tsx +11 -3
  510. package/src/plugins/builtin/market-movers/model.ts +101 -17
  511. package/src/plugins/builtin/market-movers/screener.ts +31 -0
  512. package/src/plugins/builtin/market-movers/table.ts +50 -23
  513. package/src/plugins/builtin/market-valuation/chart-series.ts +29 -69
  514. package/src/plugins/builtin/market-valuation/index.tsx +3 -3
  515. package/src/plugins/builtin/market-valuation/indicators.ts +0 -5
  516. package/src/plugins/builtin/members/headless.ts +7 -2
  517. package/src/plugins/builtin/members/model.ts +31 -3
  518. package/src/plugins/builtin/members/pane.tsx +3 -6
  519. package/src/plugins/builtin/mna/headless.ts +15 -3
  520. package/src/plugins/builtin/money-markets/index.tsx +2 -0
  521. package/src/plugins/builtin/money-markets/series.ts +41 -0
  522. package/src/plugins/builtin/news/headless.ts +9 -2
  523. package/src/plugins/builtin/news/wire/news/footer.ts +10 -0
  524. package/src/plugins/builtin/notes/cli.ts +12 -7
  525. package/src/plugins/builtin/openfda/client.ts +1 -1
  526. package/src/plugins/builtin/options/carry.ts +95 -0
  527. package/src/plugins/builtin/options/index.tsx +58 -5
  528. package/src/plugins/builtin/options/strike-window.ts +183 -0
  529. package/src/plugins/builtin/options/table.ts +55 -3
  530. package/src/plugins/builtin/options/types.ts +8 -1
  531. package/src/plugins/builtin/options/view.tsx +162 -13
  532. package/src/plugins/builtin/options-calculator/inputs.ts +2 -1
  533. package/src/plugins/builtin/options-positioning/client.ts +7 -3
  534. package/src/plugins/builtin/options-positioning/headless.ts +5 -2
  535. package/src/plugins/builtin/options-positioning/pane.tsx +2 -2
  536. package/src/plugins/builtin/options-scenario/charts.tsx +2 -2
  537. package/src/plugins/builtin/options-scenario/client.ts +75 -18
  538. package/src/plugins/builtin/options-scenario/headless.ts +72 -24
  539. package/src/plugins/builtin/options-scenario/hedge.ts +285 -0
  540. package/src/plugins/builtin/options-scenario/index.tsx +9 -2
  541. package/src/plugins/builtin/options-scenario/model.ts +33 -0
  542. package/src/plugins/builtin/options-scenario/pane.tsx +40 -16
  543. package/src/plugins/builtin/pe-band/model.ts +2 -2
  544. package/src/plugins/builtin/pe-band/report-dates.ts +11 -7
  545. package/src/plugins/builtin/perps/client.ts +40 -6
  546. package/src/plugins/builtin/perps/equity-row.tsx +33 -8
  547. package/src/plugins/builtin/perps/freshness.ts +66 -0
  548. package/src/plugins/builtin/perps/headless.ts +45 -30
  549. package/src/plugins/builtin/perps/index.tsx +18 -1
  550. package/src/plugins/builtin/perps/model.ts +32 -6
  551. package/src/plugins/builtin/perps/pane.tsx +76 -20
  552. package/src/plugins/builtin/perps/series.ts +76 -0
  553. package/src/plugins/builtin/plugin-marketplace/model.ts +64 -21
  554. package/src/plugins/builtin/plugin-marketplace/packs.ts +118 -0
  555. package/src/plugins/builtin/plugin-marketplace/pane.tsx +357 -39
  556. package/src/plugins/builtin/plugin-marketplace/store.ts +7 -1
  557. package/src/plugins/builtin/plugin-module.ts +90 -4
  558. package/src/plugins/builtin/portfolio-list/account-metrics.ts +1 -1
  559. package/src/plugins/builtin/portfolio-list/cli/bulk-symbols.ts +273 -0
  560. package/src/plugins/builtin/portfolio-list/cli/import-13f.ts +109 -0
  561. package/src/plugins/builtin/portfolio-list/cli/portfolio-command.ts +400 -99
  562. package/src/plugins/builtin/portfolio-list/cli/render.ts +281 -43
  563. package/src/plugins/builtin/portfolio-list/cli/shared.ts +26 -16
  564. package/src/plugins/builtin/portfolio-list/cli/watchlist-command.ts +120 -47
  565. package/src/plugins/builtin/portfolio-list/column-values.ts +1 -1
  566. package/src/plugins/builtin/portfolio-list/grid.tsx +1 -1
  567. package/src/plugins/builtin/portfolio-list/headless.ts +70 -9
  568. package/src/plugins/builtin/portfolio-list/imported-from.ts +8 -0
  569. package/src/plugins/builtin/portfolio-list/live-valuation.ts +6 -2
  570. package/src/plugins/builtin/portfolio-list/pane/index.tsx +6 -1
  571. package/src/plugins/builtin/portfolio-list/quick-add/index.tsx +17 -1
  572. package/src/plugins/builtin/portfolio-list/summary/totals.ts +1 -1
  573. package/src/plugins/builtin/portfolio-list/table.tsx +7 -1
  574. package/src/plugins/builtin/power/client.ts +16 -0
  575. package/src/plugins/builtin/power/evidence.ts +6 -2
  576. package/src/plugins/builtin/power/headless.ts +71 -7
  577. package/src/plugins/builtin/power/index.tsx +4 -1
  578. package/src/plugins/builtin/power/model.ts +72 -1
  579. package/src/plugins/builtin/power/pane.tsx +32 -9
  580. package/src/plugins/builtin/rate-path/headless.ts +11 -3
  581. package/src/plugins/builtin/realized-vol/headless.ts +8 -0
  582. package/src/plugins/builtin/realized-vol/pane.tsx +1 -1
  583. package/src/plugins/builtin/research/corporate-actions-pane.tsx +7 -4
  584. package/src/plugins/builtin/research/equity-diagnostic-pane.tsx +1 -1
  585. package/src/plugins/builtin/research/event-model.ts +68 -24
  586. package/src/plugins/builtin/research/events-headless.ts +2 -1
  587. package/src/plugins/builtin/research/headless.ts +2 -1
  588. package/src/plugins/builtin/revenue-breakdown/client.ts +13 -6
  589. package/src/plugins/builtin/revenue-breakdown/headless.ts +4 -1
  590. package/src/plugins/builtin/revenue-breakdown/pane.tsx +7 -4
  591. package/src/plugins/builtin/reverse-dcf/headless.ts +5 -1
  592. package/src/plugins/builtin/reverse-dcf/pane.tsx +1 -1
  593. package/src/plugins/builtin/risk-factors/data.ts +23 -9
  594. package/src/plugins/builtin/risk-factors/headless.ts +5 -2
  595. package/src/plugins/builtin/risk-factors/pane.tsx +6 -5
  596. package/src/plugins/builtin/seasonality/client.ts +15 -7
  597. package/src/plugins/builtin/seasonality/headless.ts +36 -12
  598. package/src/plugins/builtin/seasonality/index.tsx +2 -2
  599. package/src/plugins/builtin/seasonality/model.ts +119 -0
  600. package/src/plugins/builtin/seasonality/pane.tsx +108 -37
  601. package/src/plugins/builtin/sec/index.tsx +5 -5
  602. package/src/plugins/builtin/sectors/client.ts +10 -2
  603. package/src/plugins/builtin/sectors/headless.ts +35 -6
  604. package/src/plugins/builtin/sectors/index.tsx +18 -1
  605. package/src/plugins/builtin/sectors/sector-model.ts +150 -41
  606. package/src/plugins/builtin/series-inventory.ts +91 -0
  607. package/src/plugins/builtin/shared/cloud-upgrade.ts +1 -1
  608. package/src/plugins/builtin/shared/command-tab.ts +69 -0
  609. package/src/plugins/builtin/shared/earnings-report.ts +55 -0
  610. package/src/plugins/builtin/shared/fred-points.ts +20 -0
  611. package/src/plugins/builtin/shared/fx-rate-freshness.ts +101 -0
  612. package/src/plugins/builtin/shared/headless-market-data.ts +33 -1
  613. package/src/plugins/builtin/shared/members-menu.tsx +4 -4
  614. package/src/plugins/builtin/shared/open-description.ts +29 -0
  615. package/src/plugins/builtin/shared/report-freshness.ts +59 -2
  616. package/src/plugins/builtin/shared/series-warning.ts +5 -0
  617. package/src/plugins/builtin/shared/ticker-request.ts +25 -1
  618. package/src/plugins/builtin/shared/use-quote-board.ts +25 -5
  619. package/src/plugins/builtin/shared/volatility/options.ts +1 -46
  620. package/src/plugins/builtin/short-interest/headless.ts +1 -0
  621. package/src/plugins/builtin/short-interest/index.tsx +21 -4
  622. package/src/plugins/builtin/short-interest/series.ts +36 -0
  623. package/src/plugins/builtin/short-interest/surface.tsx +4 -4
  624. package/src/plugins/builtin/short-interest/watch-headless.ts +1 -0
  625. package/src/plugins/builtin/short-interest/watch-model.ts +9 -5
  626. package/src/plugins/builtin/short-volume/headless.ts +1 -0
  627. package/src/plugins/builtin/short-volume/index.tsx +3 -10
  628. package/src/plugins/builtin/short-volume/series.ts +23 -0
  629. package/src/plugins/builtin/social-mentions/index.tsx +2 -0
  630. package/src/plugins/builtin/social-mentions/series.ts +23 -0
  631. package/src/plugins/builtin/supply-chain/graph-pane.tsx +3 -2
  632. package/src/plugins/builtin/supply-chain/model.ts +1 -1
  633. package/src/plugins/builtin/supply-chain/pane.tsx +3 -1
  634. package/src/plugins/builtin/thirteenf/api.ts +1 -0
  635. package/src/plugins/builtin/thirteenf/data.ts +6 -4
  636. package/src/plugins/builtin/thirteenf/headless.ts +217 -36
  637. package/src/plugins/builtin/thirteenf/model.ts +39 -1
  638. package/src/plugins/builtin/thirteenf/overlap.ts +75 -0
  639. package/src/plugins/builtin/thirteenf/pane.tsx +10 -1
  640. package/src/plugins/builtin/thirteenf/report-notes.ts +103 -1
  641. package/src/plugins/builtin/thirteenf/types.ts +2 -0
  642. package/src/plugins/builtin/ticker-detail/headless.ts +43 -21
  643. package/src/plugins/builtin/ticker-detail/index.tsx +3 -0
  644. package/src/plugins/builtin/ticker-detail/overview/components.tsx +1 -1
  645. package/src/plugins/builtin/ticker-detail/overview/futures-contract.ts +31 -0
  646. package/src/plugins/builtin/ticker-detail/overview/model.ts +3 -3
  647. package/src/plugins/builtin/ticker-detail/overview/pane.tsx +2 -1
  648. package/src/plugins/builtin/ticker-detail/overview-tab.tsx +48 -4
  649. package/src/plugins/builtin/ticker-detail/pane.tsx +4 -5
  650. package/src/plugins/builtin/ticker-detail/quote-monitor/card.tsx +94 -6
  651. package/src/plugins/builtin/ticker-detail/quote-monitor/index.tsx +13 -3
  652. package/src/plugins/builtin/time-sales/headless.ts +1 -0
  653. package/src/plugins/builtin/treasury-auctions/cache.ts +5 -2
  654. package/src/plugins/builtin/treasury-auctions/client.ts +22 -8
  655. package/src/plugins/builtin/treasury-auctions/headless.ts +56 -6
  656. package/src/plugins/builtin/treasury-auctions/index.tsx +12 -9
  657. package/src/plugins/builtin/treasury-auctions/model.ts +205 -30
  658. package/src/plugins/builtin/treasury-auctions/pane.tsx +35 -11
  659. package/src/plugins/builtin/treasury-auctions/types.ts +11 -1
  660. package/src/plugins/builtin/vol-surface/charts.tsx +1 -3
  661. package/src/plugins/builtin/vol-surface/client.ts +6 -2
  662. package/src/plugins/builtin/vol-surface/evidence.ts +11 -6
  663. package/src/plugins/builtin/vol-surface/headless.ts +125 -20
  664. package/src/plugins/builtin/vol-surface/model.ts +23 -11
  665. package/src/plugins/builtin/vol-surface/pane.tsx +38 -27
  666. package/src/plugins/builtin/vol-surface/tables.ts +124 -0
  667. package/src/plugins/builtin/volatility/index.tsx +2 -0
  668. package/src/plugins/builtin/volatility/series.ts +84 -0
  669. package/src/plugins/builtin/world-indices/client.ts +22 -4
  670. package/src/plugins/builtin/world-indices/headless.ts +54 -27
  671. package/src/plugins/builtin/world-indices/model.ts +4 -2
  672. package/src/plugins/builtin/world-indices/table.tsx +13 -2
  673. package/src/plugins/builtin/world-venue-map/geo-series.ts +27 -2
  674. package/src/plugins/builtin/world-venue-map/headless.ts +4 -1
  675. package/src/plugins/builtin/world-venue-map/index.ts +3 -2
  676. package/src/plugins/builtin/world-venue-map/layered-pane.tsx +8 -4
  677. package/src/plugins/builtin/world-venue-map/layers.ts +29 -0
  678. package/src/plugins/builtin/yield-curve/chart.ts +2 -2
  679. package/src/plugins/builtin/yield-curve/curves.ts +21 -8
  680. package/src/plugins/builtin/yield-curve/headless.ts +71 -18
  681. package/src/plugins/builtin/yield-curve/index.tsx +4 -2
  682. package/src/plugins/builtin/yield-curve/series.ts +86 -0
  683. package/src/plugins/builtin-editorial.ts +126 -0
  684. package/src/plugins/catalog-backend.ts +16 -9
  685. package/src/plugins/catalog-browser.ts +129 -64
  686. package/src/plugins/catalog-manifest.ts +73 -40
  687. package/src/plugins/catalog-ui.ts +26 -6
  688. package/src/plugins/extracted-plugins.ts +7 -1
  689. package/src/plugins/ownership.ts +150 -7
  690. package/src/plugins/plugin-functions.ts +54 -0
  691. package/src/plugins/plugin-off.ts +36 -0
  692. package/src/plugins/registry/host-actions.ts +16 -0
  693. package/src/plugins/registry/index.ts +173 -28
  694. package/src/plugins/registry/plugin-state.ts +25 -1
  695. package/src/plugins/runtime/context.tsx +29 -0
  696. package/src/{plugins/builtin/portfolio-list → portfolio}/position-metrics.ts +6 -6
  697. package/src/portfolio/position-value.ts +40 -0
  698. package/src/public/__snapshots__/public-api.test.ts.snap +7 -0
  699. package/src/public/time-series.ts +17 -0
  700. package/src/react/auto-refresh.ts +13 -3
  701. package/src/react/input.ts +48 -1
  702. package/src/remote/app-host.tsx +25 -4
  703. package/src/remote/confirm-change.tsx +85 -0
  704. package/src/remote/controller-utils.ts +8 -1
  705. package/src/remote/controller.ts +126 -59
  706. package/src/remote/matching.ts +69 -0
  707. package/src/remote/pane-screenshot.ts +47 -0
  708. package/src/remote/schema.ts +63 -1
  709. package/src/remote/semantic-tree.tsx +14 -0
  710. package/src/remote/types.ts +32 -0
  711. package/src/remote/watchlist.ts +306 -0
  712. package/src/renderers/browser/main.tsx +3 -2
  713. package/src/renderers/cloudflare/worker.ts +1 -1
  714. package/src/renderers/dom/data-table/frozen-column.ts +3 -1
  715. package/src/renderers/dom/data-table/index.tsx +33 -6
  716. package/src/renderers/dom/data-table/row.tsx +27 -1
  717. package/src/renderers/dom/desktop/control-styles.ts +63 -1
  718. package/src/renderers/dom/desktop/controls.tsx +30 -23
  719. package/src/renderers/dom/desktop/dialog-actions.tsx +170 -0
  720. package/src/renderers/dom/desktop/icons.tsx +21 -0
  721. package/src/renderers/dom/desktop/query-bar.tsx +59 -32
  722. package/src/renderers/dom/dom-ui-host.tsx +3 -0
  723. package/src/renderers/dom/host/box.tsx +4 -1
  724. package/src/renderers/dom/host/chart-surface.tsx +6 -2
  725. package/src/renderers/dom/host/drag-shield.ts +17 -6
  726. package/src/renderers/dom/host/live-frame.ts +14 -2
  727. package/src/renderers/dom/host/overflow-fade.ts +14 -1
  728. package/src/renderers/dom/host/size-observer.ts +26 -0
  729. package/src/renderers/dom/host/surface-3d.tsx +7 -2
  730. package/src/renderers/dom/host/text.tsx +1 -1
  731. package/src/renderers/dom/input-host.tsx +6 -1
  732. package/src/renderers/dom/styles.css +74 -0
  733. package/src/renderers/electrobun/bun/desktop/backend.ts +5 -1
  734. package/src/renderers/electrobun/bun/desktop/detached-windows.ts +12 -1
  735. package/src/renderers/electrobun/bun/desktop/initialization.ts +2 -1
  736. package/src/renderers/electrobun/shared/protocol.ts +2 -0
  737. package/src/renderers/electrobun/view/cli-pane-shot-entry.tsx +18 -3
  738. package/src/renderers/electrobun/view/cli-pane-shot-frame.tsx +109 -5
  739. package/src/renderers/electrobun/view/cli-pane-shot-health.ts +10 -26
  740. package/src/renderers/electrobun/view/main.tsx +6 -1
  741. package/src/renderers/opentui/input-host.tsx +6 -1
  742. package/src/renderers/opentui/start.tsx +9 -0
  743. package/src/series/capability.ts +75 -0
  744. package/src/series/csv.ts +160 -0
  745. package/src/series/files.ts +107 -0
  746. package/src/series/registry.ts +198 -0
  747. package/src/series/resolve.ts +107 -0
  748. package/src/series/standalone.ts +48 -0
  749. package/src/series/types.ts +145 -0
  750. package/src/series/validate.ts +171 -0
  751. package/src/shares/portable-layout.ts +16 -6
  752. package/src/sources/gloomberb-cloud/index.ts +26 -17
  753. package/src/sources/gloomberb-cloud/normalizers.ts +5 -1
  754. package/src/sources/history-result.ts +1 -0
  755. package/src/sources/listing-symbols.ts +14 -5
  756. package/src/sources/provider-errors.ts +88 -3
  757. package/src/sources/provider-router/batches.ts +4 -1
  758. package/src/sources/provider-router/cache.ts +4 -2
  759. package/src/sources/provider-router/cached-routes.ts +9 -5
  760. package/src/sources/provider-router/financial-routes.ts +12 -5
  761. package/src/sources/provider-router/financials.ts +55 -15
  762. package/src/sources/provider-router/history.ts +68 -34
  763. package/src/sources/provider-router/index.ts +1 -1
  764. package/src/sources/provider-router/primary.ts +23 -5
  765. package/src/sources/provider-router/search.ts +1 -0
  766. package/src/sources/sec-edgar.ts +68 -8
  767. package/src/sync/core-contributors.ts +5 -3
  768. package/src/test-support/cli-context.ts +2 -1
  769. package/src/test-support/data-provider.ts +34 -0
  770. package/src/test-support/shell-pane-keys.tsx +1 -0
  771. package/src/theme/series-colors.ts +46 -0
  772. package/src/theme/themes.ts +149 -0
  773. package/src/tickers/company-name.ts +75 -0
  774. package/src/tickers/instrument-kind.ts +25 -0
  775. package/src/tickers/open-target.ts +3 -2
  776. package/src/tickers/search/index.ts +67 -9
  777. package/src/tickers/search/ranking.ts +78 -18
  778. package/src/tickers/search/types.ts +10 -2
  779. package/src/tickers/starter-symbols.ts +8 -0
  780. package/src/tickers/us-listing.ts +34 -0
  781. package/src/time-series/hooks.ts +9 -0
  782. package/src/time-series/resolve.ts +96 -30
  783. package/src/time-series/types.ts +4 -2
  784. package/src/time-series/use-chart-resolution.ts +32 -0
  785. package/src/types/config.ts +67 -1
  786. package/src/types/data-provider.ts +5 -0
  787. package/src/types/financials.ts +52 -1
  788. package/src/types/headless.ts +72 -0
  789. package/src/types/instrument.ts +8 -0
  790. package/src/types/plugin.ts +68 -3
  791. package/src/types/price-history.ts +7 -0
  792. package/src/types/ticker.ts +14 -0
  793. package/src/ui/host.tsx +26 -4
  794. package/src/ui/index.tsx +2 -0
  795. package/src/ui/live-resize.ts +81 -0
  796. package/src/ui/live-stretch.ts +121 -0
  797. package/src/ui/measured-cells.ts +58 -0
  798. package/src/ui/pane-fill.ts +11 -0
  799. package/src/utils/basis-points.ts +17 -0
  800. package/src/utils/cli-output.ts +21 -2
  801. package/src/utils/concurrency.ts +25 -0
  802. package/src/utils/crypto-pair.ts +20 -0
  803. package/src/utils/currency-pair.ts +19 -0
  804. package/src/utils/decimal-comma.ts +19 -0
  805. package/src/utils/dom-screenshot-css.ts +265 -0
  806. package/src/utils/dom-screenshot-rasters.ts +276 -0
  807. package/src/utils/dom-screenshot.ts +437 -52
  808. package/src/utils/exchange-rate-snapshot.ts +6 -2
  809. package/src/utils/exchanges.ts +120 -1
  810. package/src/utils/format.ts +17 -3
  811. package/src/utils/fundamentals.ts +66 -0
  812. package/src/utils/futures-generic.ts +6 -12
  813. package/src/utils/fx-market-hours.ts +44 -0
  814. package/src/utils/option-expiry.ts +126 -0
  815. package/src/utils/price-history.ts +130 -40
  816. package/src/utils/rpc-timeout-error.ts +6 -2
  817. package/src/utils/sec-eps-basis.ts +178 -36
  818. package/src/utils/sec.ts +98 -40
  819. package/src/utils/throttled-fetch.ts +51 -22
  820. package/src/utils/utc-time.ts +51 -4
@@ -56,6 +56,8 @@ import {
56
56
  riskCoverageShortfall,
57
57
  riskCoverageText,
58
58
  riskPercentile,
59
+ riskAmountBase,
60
+ riskEvidence,
59
61
  riskValue,
60
62
  RISK_VIEWS,
61
63
  type PortfolioRiskModel,
@@ -79,7 +81,7 @@ const titles = {
79
81
  };
80
82
  const tabs = RISK_VIEWS.map((value) => ({ value, label: titles[value] }));
81
83
  const getKey = (row: RiskDisplayRow) => row.id;
82
- /** The two return rows chart the basket against SPY over the window they measure. */
84
+ /** The two return rows chart the basket against its benchmark over the window they measure. */
83
85
  const RETURN_ROW_IDS: ReadonlySet<string> = new Set(["return", "benchmark"]);
84
86
  const formatPercentValue = (value: number) => `${value.toFixed(2)}%`;
85
87
  const formatPlainAxis = spanAxisFormatter((value, digits) => value.toFixed(digits));
@@ -119,12 +121,15 @@ function holdingsSummaryItems(rows: RiskDisplayRow[]): StatItem[] {
119
121
  }));
120
122
  }
121
123
  /**
122
- * Cumulative return of the current-weight basket and of SPY across the last
123
- * window of paired sessions: the path behind the two return rows, whose
124
- * values the legend ends on. The series take the rows' names.
124
+ * Cumulative return of the current-weight basket and of its benchmark across
125
+ * the window of paired sessions the return rows measure (the last 60, or those
126
+ * since a 13F filing): the path behind the two rows, whose values the legend
127
+ * ends on. The series take the rows' names.
125
128
  */
126
129
  function basketReturnSeries(model: PortfolioRiskModel): ChartTableChart["series"] {
127
- const sample = model.sample.slice(-60);
130
+ // A snapshot saved before the window existed covers the trailing 60.
131
+ const sessions = model.window?.sessions ?? 60;
132
+ const sample = sessions > 0 ? model.sample.slice(-sessions) : [];
128
133
  if (!sample.length) return [];
129
134
  const label = (id: string, fallback: string) => model.rows.risk.find((row) => row.id === id)?.label ?? fallback;
130
135
  let wealth = 1,
@@ -137,7 +142,7 @@ function basketReturnSeries(model: PortfolioRiskModel): ChartTableChart["series"
137
142
  ),
138
143
  staticSeries(
139
144
  [start, ...sample.map((row) => scalarPoint(new Date(row.dateKey), ((benchmark *= 1 + row.benchmark) - 1) * 100))],
140
- { id: "benchmark", label: label("benchmark", "SPY return"), color: colors.textMuted },
145
+ { id: "benchmark", label: label("benchmark", `${model.benchmark ?? "SPY"} return`), color: colors.textMuted },
141
146
  ),
142
147
  ];
143
148
  }
@@ -178,7 +183,7 @@ function RiskDetail({
178
183
  detail: row.asOf?.slice(0, 10) ?? "Source date unavailable",
179
184
  },
180
185
  ...(row.percentile != null ? [{ id: "percentile", label: "Pctl 1Y", value: riskPercentile(row) }] : []),
181
- { id: "evidence", label: "Evidence", value: row.detail, wide: true },
186
+ { id: "evidence", label: "Evidence", value: riskEvidence(row), wide: true },
182
187
  ];
183
188
  const statRows = statGridRows(items, width);
184
189
  const points = (row.history ?? []).map((point, index) => ({
@@ -263,7 +268,9 @@ export function PortfolioRiskPane({ focused, width, height }: PaneProps) {
263
268
  );
264
269
  const [equity] = usePaneSettingValue("equityShift", -10),
265
270
  [rates] = usePaneSettingValue("rateShift", 100),
266
- [volatility] = usePaneSettingValue("volShift", 10);
271
+ [volatility] = usePaneSettingValue("volShift", 10),
272
+ [since] = usePaneSettingValue("riskSince", "trailing");
273
+ const riskWindow = useMemo(() => (since === "filed" ? { since: "filed" as const } : {}), [since]);
267
274
  const [actionStatus, setActionStatus] = useState<string | null>(null);
268
275
  const [selected, setSelected] = usePluginPaneState<string | null>(
269
276
  "risk:selected",
@@ -323,12 +330,13 @@ export function PortfolioRiskPane({ focused, width, height }: PaneProps) {
323
330
  rates: Number(rates),
324
331
  volatility: Number(volatility),
325
332
  },
333
+ riskWindow,
326
334
  ),
327
335
  error: null,
328
336
  };
329
337
  } catch (error) {
330
338
  return {
331
- model: buildPortfolioRisk(portfolio, localTickers, market),
339
+ model: buildPortfolioRisk(portfolio, localTickers, market, null, undefined, riskWindow),
332
340
  error: error instanceof Error ? error.message : "Evidence invalid",
333
341
  };
334
342
  }
@@ -342,6 +350,7 @@ export function PortfolioRiskPane({ focused, width, height }: PaneProps) {
342
350
  equity,
343
351
  rates,
344
352
  volatility,
353
+ riskWindow,
345
354
  ]);
346
355
  const model = derived.model;
347
356
  const marketLoading = resource.loading && !resource.data;
@@ -458,7 +467,8 @@ export function PortfolioRiskPane({ focused, width, height }: PaneProps) {
458
467
  : [
459
468
  ...(basketBody ? [] : [
460
469
  ...(asOfDate && sharedEvidence ? [sharedEvidence] : []),
461
- model.portfolio.currency,
470
+ // The value the tail losses in money are taken on names the currency too.
471
+ rows.map(riskAmountBase).find(Boolean) ?? model.portfolio.currency,
462
472
  ...(asOfDate ? [asOfDate] : []),
463
473
  ...(EVIDENCE_VIEWS.has(view) && model.evidence ? [model.evidence.source] : []),
464
474
  ]),
@@ -576,7 +586,8 @@ export function PortfolioRiskPane({ focused, width, height }: PaneProps) {
576
586
  {
577
587
  id: "value",
578
588
  label: valueHeader,
579
- width: sharedUnit || attributionParts ? Math.max(9, valueHeader.length) : 16,
589
+ // A tail loss reads in money beside its percent: 2.60% ($5,735).
590
+ width: sharedUnit || attributionParts ? Math.max(9, valueHeader.length) : rows.some((row) => row.amount != null) ? 18 : 16,
580
591
  align: "right",
581
592
  },
582
593
  ...(attributionParts
@@ -601,7 +612,7 @@ export function PortfolioRiskPane({ focused, width, height }: PaneProps) {
601
612
  ]
602
613
  : []),
603
614
  ],
604
- [width, view, valueHeader, sharedUnit, attributionParts, sharedEvidence, showPercentile, sharedDate],
615
+ [width, view, valueHeader, sharedUnit, attributionParts, sharedEvidence, showPercentile, sharedDate, rows],
605
616
  );
606
617
  const selectView = (value: string) => {
607
618
  setView(value);
@@ -4,6 +4,7 @@ import { attentionWindow } from "./model";
4
4
  import { attentionHeadless } from "./headless";
5
5
  import { TrendingPane } from "./trending";
6
6
  import { AttentionPane } from "./pane";
7
+ import { ATTENTION_SERIES } from "./series";
7
8
  export const attentionModule: PluginModule = {
8
9
  panes: [{ id: "attention", name: "Research Attention", icon: "A", component: AttentionPane, defaultPosition: "right", defaultMode: "floating",
9
10
  defaultFloatingSize: { width: 126, height: 32 }, tableExport: true, headless: attentionHeadless },
@@ -13,6 +14,7 @@ export const attentionModule: PluginModule = {
13
14
  keywords: ["attention", "trending", "research", "activity"], shortcut: { prefix: "ATTN", argKind: "text", argPlaceholder: "TICKER", argOptional: true },
14
15
  headless: attentionHeadless, createInstance: (_ctx, options) => ({ placement: "floating", settings: { window: attentionWindow(options?.values?.window), symbol: (options?.arg ?? options?.symbol)?.trim().toUpperCase() ?? "" } }) },
15
16
  { id: "attention-trending-pane", paneId: "attention-trending", label: "Gloom Trending", description: "Compact daily research attention for a home workspace.", keywords: ["trending", "home"], createInstance: () => ({ placement: "floating" }) }],
17
+ series: ATTENTION_SERIES,
16
18
  setup(ctx) { attentionCache.attach(ctx.persistence); },
17
19
  dispose() { attentionCache.reset(); },
18
20
  };
@@ -12,6 +12,7 @@ import type { PaneProps } from "../../../types/plugin";
12
12
  import { Box, ScrollBox, Text, TextAttributes, useRendererHost, useUiCapabilities } from "../../../ui";
13
13
  import { SignInWall } from "../cloud/auth-actions";
14
14
  import { CLOUD_PLAN_KEY, useCloudUpgradeAction } from "../shared/cloud-upgrade";
15
+ import { useOpenDescription } from "../shared/open-description";
15
16
  import { Blurred, LockedOverlay } from "../shared/locked-rows";
16
17
  import { isCloudSessionRequired, useResearchCloudSession } from "../shared/research-cloud-session";
17
18
  import { useAttentionEvidence } from "./evidence";
@@ -87,6 +88,7 @@ export function AttentionPane({ width, height, focused }: PaneProps) {
87
88
  const desktop = !!useUiCapabilities().nativePaneChrome;
88
89
  const host = useRendererHost();
89
90
  const { createPaneFromTemplate } = usePluginAppActions();
91
+ const openDescription = useOpenDescription();
90
92
  const session = useResearchCloudSession();
91
93
  const access = usePlanAccess();
92
94
  const accessKey = `${session.requestKey}:${access.hasProAccess ? "pro" : "preview"}`;
@@ -126,7 +128,7 @@ export function AttentionPane({ width, height, focused }: PaneProps) {
126
128
  usePaneRefreshKey(() => { void resource.reload(); if (detailMode) void detail.reload(); }, { focused });
127
129
  const hints: PaneHint[] = [
128
130
  ...(selected && !groupMode ? [
129
- { id: "description", key: "d", label: "es", onPress: () => createPaneFromTemplate("new-ticker-detail-pane", { symbol: selected.symbol }) },
131
+ { id: "description", key: "d", label: "es", onPress: () => openDescription(selected.symbol) },
130
132
  { id: "financials", key: "f", label: "a", onPress: () => createPaneFromTemplate("financial-analysis-pane", { symbol: selected.symbol }) },
131
133
  { id: "chart", key: "g", label: "raph", onPress: () => createPaneFromTemplate("chart-composer-pane", { arg: selected.symbol }) },
132
134
  { id: "news", key: "n", label: "ews", onPress: () => createPaneFromTemplate("ticker-news-pane", { symbol: selected.symbol }) },
@@ -0,0 +1,26 @@
1
+ import type { SeriesDefinition } from "../../../series/types";
2
+ import { fetchAttention } from "./client";
3
+ import { emptyAttention, historyPoints } from "./model";
4
+
5
+ /**
6
+ * The hourly research attention ATTN charts for one ticker. A Pro reading
7
+ * served per account: the free preview carries no history, so it fails with
8
+ * the pane's own words instead of drawing an empty chart.
9
+ */
10
+ export const ATTENTION_SERIES: readonly SeriesDefinition[] = [{
11
+ id: "attention:research-hours",
12
+ name: "Research attention",
13
+ unit: "hours",
14
+ frequency: "intraday",
15
+ group: "Alternative data",
16
+ tags: ["attention", "research", "trending", "researcher-hours"],
17
+ description: "Rounded researcher-hours opt-in users spent on the ticker in each published hour, as ATTN charts them; an hour below the privacy threshold is a gap. Needs Pro.",
18
+ input: "ticker",
19
+ load: async ({ ticker }) => {
20
+ const data = await fetchAttention("now", ticker!);
21
+ if (data.entitlement === "preview") throw new Error("Pro unlocks published history.");
22
+ if (data.status === "disabled") throw new Error(emptyAttention(data));
23
+ if (!data.history?.length) throw new Error("No privacy-qualified hours for this ticker.");
24
+ return historyPoints(data.history).map((point) => ({ date: point.date, value: point.value }));
25
+ },
26
+ }];
@@ -2,8 +2,10 @@ import type { PluginModule } from "../plugin-module";
2
2
  import { awardDetailCache, awardsCache } from "./client";
3
3
  import { awardsHeadless } from "./headless";
4
4
  import { AwardsPane } from "./pane";
5
+ import { AWARD_SERIES } from "./series";
5
6
 
6
7
  export const awardsModule: PluginModule = {
8
+ series: AWARD_SERIES,
7
9
  setup(ctx) { awardsCache.attach(ctx.persistence); awardDetailCache.attach(ctx.persistence); },
8
10
  dispose() { awardsCache.reset(); awardDetailCache.reset(); },
9
11
  panes: [{ id: "awards", name: "Government Awards", icon: "A", component: AwardsPane, defaultPosition: "right", defaultMode: "floating",
@@ -16,6 +16,7 @@ import { publicTickerKey } from "../../../utils/exchanges";
16
16
  import { truncateToDisplayWidth } from "../../../utils/format";
17
17
  import { SignInWall } from "../cloud/auth-actions";
18
18
  import { CLOUD_PLAN_KEY, useCloudUpgradeAction } from "../shared/cloud-upgrade";
19
+ import { useOpenDescription } from "../shared/open-description";
19
20
  import { Blurred, LockedOverlay, UpgradeLabel } from "../shared/locked-rows";
20
21
  import { isCloudSessionRequired, useResearchCloudSession } from "../shared/research-cloud-session";
21
22
  import { AwardDetail } from "./detail";
@@ -72,6 +73,7 @@ function AwardsView({ width, height, focused, symbol }: PaneProps & { symbol: st
72
73
  const accessKey = `${session.requestKey}:${access.hasProAccess ? "full" : "preview"}`;
73
74
  const openUpgrade = useCloudUpgradeAction("awards");
74
75
  const { createPaneFromTemplate } = usePluginAppActions();
76
+ const openDescription = useOpenDescription();
75
77
  const [initialTab] = usePaneSettingValue("tab", symbol ? "company" : "feed");
76
78
  const [savedTab, setTab] = usePluginPaneState<string>("awards:tab", initialTab);
77
79
  const tab = awardTab(savedTab);
@@ -157,7 +159,7 @@ function AwardsView({ width, height, focused, symbol }: PaneProps & { symbol: st
157
159
  ...(current ? [{ id: "source", key: "o", label: "pen source", onPress: () => void host.openExternal(current.sourceUrl) }] : []),
158
160
  ...(current && !openId ? [{ id: "evidence", key: "e", label: "vidence", onPress: () => setOpen(current.id) }] : []),
159
161
  ...(selectedEntity ? [
160
- { id: "description", key: "d", label: "es", onPress: () => navigate("new-ticker-detail-pane") },
162
+ { id: "description", key: "d", label: "es", onPress: () => openDescription(selectedEntity.ticker, selectedEntity.exchange ?? undefined) },
161
163
  { id: "financials", key: "f", label: "a", onPress: () => navigate("financial-analysis-pane") },
162
164
  { id: "graph", key: "g", label: "raph", onPress: () => navigate("chart-composer-pane") },
163
165
  { id: "supply", key: "s", label: "plc", onPress: () => navigate("supply-chain-pane") },
@@ -0,0 +1,29 @@
1
+ import type { SeriesDefinition } from "../../../series/types";
2
+ import { fetchAwards } from "./client";
3
+
4
+ /** The scope AWARDS calls "US federal contracts": one source, one currency and prime awards, so no total counts a contract twice. */
5
+ const US_FEDERAL = { source: "usaspending", currency: "USD", awardType: "prime" } as const;
6
+
7
+ /**
8
+ * A company's US federal contract obligations by month, as AWARDS charts its
9
+ * company history. Pro: the free preview is one shared view, not the
10
+ * company's history, so it fails with the pane's own words.
11
+ */
12
+ export const AWARD_SERIES: readonly SeriesDefinition[] = [{
13
+ id: "awards:us-federal-obligations",
14
+ name: "US federal contract obligations",
15
+ unit: "USD",
16
+ frequency: "monthly",
17
+ group: "Alternative data",
18
+ tags: ["government awards", "contracts", "procurement", "defense", "obligations"],
19
+ description: "Obligated dollars on US federal prime contracts awarded to the company, by award month, as AWARDS charts them. Needs Pro.",
20
+ input: "ticker",
21
+ style: "columns",
22
+ load: async ({ ticker, signal }) => {
23
+ const data = await fetchAwards({ ticker: ticker!, ...US_FEDERAL, limit: 1 }, undefined, signal);
24
+ if (data.locked || data.access === "preview") throw new Error("Full award history requires Pro.");
25
+ const rows = data.history.filter((row) => row.source === US_FEDERAL.source && row.currency === US_FEDERAL.currency && row.awardType === US_FEDERAL.awardType);
26
+ if (!rows.length) throw new Error(`No US federal contracts awarded to ${ticker}.`);
27
+ return rows.map((row) => ({ date: `${row.month.slice(0, 7)}-01`, value: row.obligatedAmount === null ? null : Number(row.obligatedAmount) }));
28
+ },
29
+ }];
@@ -146,7 +146,7 @@ export function BacktestPane({ width, height, focused }: PaneProps) {
146
146
  }), [history.loading, result, view, paneId, symbol]);
147
147
 
148
148
  const { strip: tabStrip, rows: tabRows } = usePaneTabs(symbol ? { tabs: TABS, activeValue: view, onSelect: setView, focused, dense: true } : null);
149
- if (!symbol) return <EmptyState title="Choose a ticker." hint="Open BT with a symbol, for example BT AAPL." />;
149
+ if (!symbol) return <EmptyState title="Select a ticker." hint="Open BT with a symbol, for example BT AAPL." />;
150
150
  const bodyHeight = Math.max(4, height - 1 - tabRows);
151
151
  const wide = width - SUMMARY_WIDTH - 1 >= MIN_WIDE_CHART_COLS;
152
152
  const summaryTable = (tableWidth: number, tableHeight: number, before?: ReactNode) => (
@@ -1,3 +1,4 @@
1
+ import { numberErrorMessage } from "../../../utils/decimal-comma";
1
2
  import { priceBond, solveBondYield, treasurySpread, type BondTerms, type TreasuryBenchmarkPoint } from "./math";
2
3
 
3
4
  export interface BondDraft {
@@ -20,7 +21,7 @@ export function defaultBondDraft(now = new Date()): BondDraft {
20
21
  }
21
22
 
22
23
  function inputNumber(value: string, label: string): number {
23
- if (!value.trim() || !/^[+-]?(?:\d+(?:\.\d*)?|\.\d+)$/.test(value.trim())) throw new Error(`${label} must be a number`);
24
+ if (!value.trim() || !/^[+-]?(?:\d+(?:\.\d*)?|\.\d+)$/.test(value.trim())) throw new Error(numberErrorMessage(`${label} must be a number`, value));
24
25
  const number = Number(value);
25
26
  if (!Number.isFinite(number)) throw new Error(`${label} must be finite`);
26
27
  return number;
@@ -14,6 +14,7 @@ import { formatCurrency, truncateToDisplayWidth } from "../../../utils/format";
14
14
  import { t, tf } from "../../../i18n";
15
15
  import type { BrokerProfileRow } from "./model";
16
16
  import type { BrokerManagerMessage } from "./pane-actions";
17
+ import { signInEndNote } from "./sign-in-end";
17
18
  import { stateColor } from "./table";
18
19
 
19
20
  export type BrokerEditKey = "label" | "enabled" | string;
@@ -277,6 +278,9 @@ export function BrokerDetailContent({
277
278
  >
278
279
  {detailStatusMessage}
279
280
  </Text>
281
+ {row.signInEndsAt !== null && (
282
+ <Text fg={colors.warning} width={width} wrapText>{signInEndNote(row.signInEndsAt)}</Text>
283
+ )}
280
284
  <Text fg={colors.textMuted}>{tf("Last sync {time}", { time: formatRelativeAge(row.lastSyncedAt) })}</Text>
281
285
  <Text fg={colors.textMuted}>{tf("Status updated {time}", { time: formatRelativeAge(row.updatedAt) })}</Text>
282
286
  <Box height={1} />
@@ -37,6 +37,7 @@ import {
37
37
  type BrokerProfileRow,
38
38
  } from "./model";
39
39
  import { useBrokerManagerActions } from "./pane-actions";
40
+ import { useSignInEnds } from "./sign-in-end";
40
41
  import {
41
42
  buildBrokerColumns,
42
43
  renderBrokerCell,
@@ -78,9 +79,10 @@ export function BrokersPane({ focused, width, height }: PaneProps) {
78
79
 
79
80
  // Signed-in profiles take their broker's name from the connector list.
80
81
  const signedInBrokers = useSyncExternalStore(subscribeSignedInBrokers, getSignedInBrokers, getSignedInBrokers);
82
+ const { ends: signInEnds, reload: reloadSignInEnds } = useSignInEnds(config.brokerInstances);
81
83
  const rows = useMemo(
82
- () => buildBrokerProfileRows(config, adapters, brokerAccounts),
83
- [adapters, brokerAccounts, config, language, signedInBrokers, statusVersion],
84
+ () => buildBrokerProfileRows(config, adapters, brokerAccounts, signInEnds),
85
+ [adapters, brokerAccounts, config, language, signInEnds, signedInBrokers, statusVersion],
84
86
  );
85
87
  const selectedIndex = Math.max(0, rows.findIndex((row) => row.id === selectedId));
86
88
  const selectedRow = rows[selectedIndex] ?? null;
@@ -107,9 +109,11 @@ export function BrokersPane({ focused, width, height }: PaneProps) {
107
109
  if (!editKeys.includes(activeEditKey)) setActiveEditKey(editKeys[0] ?? "label");
108
110
  }, [activeEditKey, editDraft, editKeys]);
109
111
 
112
+ // After a connect or sync, which can renew a sign-in or find it ended.
110
113
  const refreshStatuses = useCallback(() => {
111
114
  setStatusVersion((version) => version + 1);
112
- }, []);
115
+ reloadSignInEnds();
116
+ }, [reloadSignInEnds]);
113
117
 
114
118
  const {
115
119
  busy,
@@ -3,6 +3,7 @@ import type { AppConfig, BrokerInstanceConfig } from "../../../types/config";
3
3
  import type { BrokerAccount } from "../../../types/trading";
4
4
  import { formatCurrency } from "../../../utils/format";
5
5
  import { t } from "../../../i18n";
6
+ import type { SignInEnds } from "./sign-in-end";
6
7
 
7
8
  export type BrokerDisplayState =
8
9
  | "disabled"
@@ -24,6 +25,8 @@ export interface BrokerProfileRow {
24
25
  accountCount: number;
25
26
  accountSummary: string;
26
27
  accountIds: string[];
28
+ /** When the broker ends this profile's sign-in, once Gloom says it is time to connect again. */
29
+ signInEndsAt: number | null;
27
30
  instance: BrokerInstanceConfig;
28
31
  adapter: BrokerAdapter | null;
29
32
  }
@@ -107,6 +110,7 @@ export function buildBrokerProfileRows(
107
110
  config: AppConfig,
108
111
  adapters: ReadonlyMap<string, BrokerAdapter | null>,
109
112
  brokerAccounts: Record<string, BrokerAccount[]>,
113
+ signInEnds: SignInEnds = new Map(),
110
114
  ): BrokerProfileRow[] {
111
115
  return config.brokerInstances.map((instance) => {
112
116
  const adapter = adapters.get(instance.brokerType) ?? null;
@@ -139,6 +143,10 @@ export function buildBrokerProfileRows(
139
143
  accountCount: accounts.length,
140
144
  accountSummary: summarizeBrokerAccounts(accounts),
141
145
  accountIds: accounts.map((account) => account.accountId),
146
+ // Say nothing next to a failure or a profile that does not connect.
147
+ signInEndsAt: state.state === "error" || state.state === "disabled" || state.state === "unavailable"
148
+ ? null
149
+ : signInEnds.get(instance.id) ?? null,
142
150
  instance,
143
151
  adapter,
144
152
  };
@@ -114,8 +114,14 @@ export function useBrokerManagerActions({
114
114
  const broker = signedInBrokerForProfile(selectedRow.instance, selectedRow.brokerName);
115
115
  try {
116
116
  setBusy(t("Connecting…"));
117
- if (!await requestBrokerSignIn(broker)) {
118
- setMessage(infoMessage(tf("{broker} was not connected.", { broker: broker.name })));
117
+ // A connected broker is connected again only by a new sign-in: this renews it before the broker ends it.
118
+ // A row that says when the sign-in ends is renewable before this session's first sync too.
119
+ const renew = selectedRow.state === "connected" || selectedRow.signInEndsAt !== null;
120
+ if (!await requestBrokerSignIn(broker, { renew })) {
121
+ // Backing out of a renewal leaves the broker connected, for now.
122
+ setMessage(infoMessage(renew
123
+ ? tf("{broker} sign-in was not renewed.", { broker: broker.name })
124
+ : tf("{broker} was not connected.", { broker: broker.name })));
119
125
  return;
120
126
  }
121
127
  await syncBrokerInstance(selectedRow.id);
@@ -0,0 +1,82 @@
1
+ import { useCallback, useMemo, useSyncExternalStore } from "react";
2
+ import { apiClient } from "../../../api-client";
3
+ import { fetchSignedInBrokerConnection, type SignedInBrokerConnection } from "../../../brokers/signed-in/client";
4
+ import { isSignedInBrokerProfile, signedInBrokerId } from "../../../brokers/signed-in/profile";
5
+ import { tf } from "../../../i18n";
6
+ import { useAsyncResource } from "../../../react/async-resource";
7
+ import type { BrokerInstanceConfig } from "../../../types/config";
8
+ import { formatDetailDate, formatShortDate } from "../../../utils/datetime-format";
9
+
10
+ /**
11
+ * Some brokers end a sign-in on their own clock, however often it was
12
+ * refreshed, and Gloom flags it a day before. Only that case shows anything: a
13
+ * server that predates the flag, or a sign-in with no end in sight, adds nothing.
14
+ */
15
+ export type SignInEnds = ReadonlyMap<string, number>;
16
+
17
+ /** When the broker ends the sign-in, if Gloom says it is time to connect again. */
18
+ export function signInEndOf(connection: Pick<SignedInBrokerConnection, "expiresAt" | "expiresSoon">): number | null {
19
+ if (connection.expiresSoon !== true || !connection.expiresAt) return null;
20
+ const endsAt = Date.parse(connection.expiresAt);
21
+ return Number.isFinite(endsAt) ? endsAt : null;
22
+ }
23
+
24
+ /** The profile row's status, in the place of "Connected": "Ends Oct 10". */
25
+ export function signInEndStatus(endsAt: number, now = Date.now()): string {
26
+ const date = formatShortDate(endsAt, { year: false });
27
+ return endsAt > now ? tf("Ends {date}", { date }) : tf("Ended {date}", { date });
28
+ }
29
+
30
+ /** The profile detail's note: "Sign-in ends Oct 10, 2026 at 3:00 PM". */
31
+ export function signInEndNote(endsAt: number, now = Date.now()): string {
32
+ const when = formatDetailDate(endsAt);
33
+ return endsAt > now ? tf("Sign-in ends {when}", { when }) : tf("Sign-in ended {when}", { when });
34
+ }
35
+
36
+ /**
37
+ * When each signed-in profile's sign-in ends, by instance id, for the profiles
38
+ * whose broker is about to end it. Read from Gloom when the pane opens and
39
+ * after a connect or sync; a failed read is the same as nothing to say.
40
+ */
41
+ export function useSignInEnds(
42
+ instances: readonly BrokerInstanceConfig[],
43
+ ): { ends: SignInEnds; reload: () => void } {
44
+ const profiles = useMemo(
45
+ () => instances.flatMap((instance) => isSignedInBrokerProfile(instance) && instance.enabled !== false
46
+ ? [{ id: instance.id, broker: signedInBrokerId(instance) }]
47
+ : []),
48
+ [instances],
49
+ );
50
+ // One read per broker, however many profiles name it.
51
+ const brokers = useMemo(() => [...new Set(profiles.map((profile) => profile.broker).filter(Boolean))].sort(), [profiles]);
52
+ const brokerKey = brokers.join(",");
53
+ const signedIn = useSyncExternalStore(
54
+ (listener) => apiClient.subscribeCurrentUser(listener),
55
+ () => apiClient.isSignedIn(),
56
+ () => apiClient.isSignedIn(),
57
+ );
58
+ const loader = useMemo(() => brokerKey && signedIn
59
+ ? async () => {
60
+ const reads = await Promise.all(brokerKey.split(",").map(async (broker) => {
61
+ try {
62
+ return [broker, signInEndOf(await fetchSignedInBrokerConnection(broker))] as const;
63
+ } catch {
64
+ return [broker, null] as const;
65
+ }
66
+ }));
67
+ return new Map(reads);
68
+ }
69
+ : null, [brokerKey, signedIn]);
70
+ const { data, reload } = useAsyncResource(loader, { keepPreviousData: true });
71
+
72
+ const ends = useMemo<SignInEnds>(() => {
73
+ const byInstance = new Map<string, number>();
74
+ for (const profile of profiles) {
75
+ const endsAt = data?.get(profile.broker);
76
+ if (endsAt != null) byInstance.set(profile.id, endsAt);
77
+ }
78
+ return byInstance;
79
+ }, [data, profiles]);
80
+ const refresh = useCallback(() => { void reload(); }, [reload]);
81
+ return { ends, reload: refresh };
82
+ }
@@ -4,6 +4,7 @@ import { colors } from "../../../theme/colors";
4
4
  import { formatRelativeAge } from "../../../utils/datetime-format";
5
5
  import type { BrokerDisplayState, BrokerProfileRow } from "./model";
6
6
  import { t } from "../../../i18n";
7
+ import { signInEndStatus } from "./sign-in-end";
7
8
 
8
9
  type BrokerColumnId = "profile" | "status" | "broker" | "mode" | "accounts" | "updated";
9
10
  export type BrokerColumn = DataTableColumn & { id: BrokerColumnId };
@@ -45,6 +46,10 @@ export function renderBrokerCell(row: BrokerProfileRow, column: BrokerColumn): D
45
46
  attributes: TextAttributes.BOLD,
46
47
  };
47
48
  case "status":
49
+ // A sign-in the broker is about to end replaces "Connected" until it is renewed.
50
+ if (row.signInEndsAt !== null) {
51
+ return { text: signInEndStatus(row.signInEndsAt), color: colors.warning };
52
+ }
48
53
  return {
49
54
  text: row.stateLabel,
50
55
  color: stateColor(row.state),
@@ -2,8 +2,9 @@
2
2
  // the browser catalog (catalog-browser.ts). Keep this file import-free so the
3
3
  // browser catalog can read it without pulling in native-only modules.
4
4
  //
5
- // Market Overview and Macro ship fewer panes on the web, so each catalog gives
6
- // them its own description rather than advertising panes it lacks.
5
+ // Screeners & Movers, Ownership & Insiders and Earnings ship fewer panes on
6
+ // the web, so each catalog gives them their own description rather than
7
+ // advertising panes they lack.
7
8
 
8
9
  export const applicationPluginMeta = {
9
10
  id: "application",
@@ -20,11 +21,44 @@ export const portfolioPluginMeta = {
20
21
  toggleable: true,
21
22
  };
22
23
 
23
- export const tickerResearchPluginMeta = {
24
- id: "ticker-research",
24
+ // Ticker Research's successors. Every module keeps the `ticker-research`
25
+ // state namespace: these four declare it, Alt Data and Quant default to it,
26
+ // and Credit & Bonds and Earnings compose theirs with an override.
27
+ // `ticker-research` itself now stands for all eight in disabledPlugins (see
28
+ // ownership.ts). The core keeps the name people know.
29
+
30
+ export const tickerCorePluginMeta = {
31
+ id: "ticker-core",
32
+ stateId: "ticker-research",
25
33
  name: "Ticker Research",
26
34
  version: "1.0.0",
27
- description: "Company research workspace: overview, charts, financials, filings, ownership, options, analyst research, and events.",
35
+ description: "Company overview, charts, financials, quotes and returns, analyst research and estimates, KPIs and segments, valuation, dividends, executives, and time and sales.",
36
+ toggleable: true,
37
+ };
38
+
39
+ export const optionsVolatilityPluginMeta = {
40
+ id: "options-volatility",
41
+ stateId: "ticker-research",
42
+ name: "Options & Volatility",
43
+ version: "1.0.0",
44
+ description: "Option chains and positioning, a pricing calculator, scenarios, the volatility surface, and realized and implied volatility history.",
45
+ toggleable: true,
46
+ };
47
+
48
+ export const ownershipPluginMeta = {
49
+ id: "ownership",
50
+ stateId: "ticker-research",
51
+ name: "Ownership & Insiders",
52
+ version: "1.0.0",
53
+ toggleable: true,
54
+ };
55
+
56
+ export const filingsPluginMeta = {
57
+ id: "filings",
58
+ stateId: "ticker-research",
59
+ name: "Filings & Events",
60
+ version: "1.0.0",
61
+ description: "SEC filings, risk factors, 8-K events, catalysts and litigation, and M&A and distress.",
28
62
  toggleable: true,
29
63
  };
30
64
 
@@ -36,16 +70,92 @@ export const newsPluginMeta = {
36
70
  toggleable: true,
37
71
  };
38
72
 
39
- export const marketOverviewPluginMeta = {
40
- id: "market-overview",
41
- name: "Market Overview",
73
+ // Market Overview's successors. Its modules keep the `market-overview` state
74
+ // namespace; Alt Data and Quant default to `ticker-research`, where their
75
+ // Ticker Research modules keep theirs, and compose their Market Overview
76
+ // modules with a `market-overview` override. `market-overview` itself
77
+ // now stands for all six in disabledPlugins (see ownership.ts).
78
+
79
+ export const globalMarketsPluginMeta = {
80
+ id: "global-markets",
81
+ stateId: "market-overview",
82
+ name: "Global Markets",
83
+ version: "1.0.0",
84
+ description: "World indices, the world map with chokepoint transits, sector and thematic performance, the FX matrix, and relative rotation.",
85
+ toggleable: true,
86
+ };
87
+
88
+ export const screenersPluginMeta = {
89
+ id: "screeners",
90
+ stateId: "market-overview",
91
+ name: "Screeners & Movers",
92
+ version: "1.0.0",
93
+ toggleable: true,
94
+ };
95
+
96
+ export const futuresCommoditiesPluginMeta = {
97
+ id: "futures-commodities",
98
+ stateId: "market-overview",
99
+ name: "Futures & Commodities",
100
+ version: "1.0.0",
101
+ description: "Futures board and curves, CFTC positioning, and EIA petroleum and gas storage.",
102
+ toggleable: true,
103
+ };
104
+
105
+ export const cryptoPluginMeta = {
106
+ id: "crypto",
107
+ stateId: "market-overview",
108
+ name: "Crypto & Perps",
109
+ version: "1.0.0",
110
+ description: "Top crypto assets by market cap, and perpetual funding, open interest and premiums.",
111
+ toggleable: true,
112
+ };
113
+
114
+ export const altDataPluginMeta = {
115
+ id: "alt-data",
116
+ stateId: "ticker-research",
117
+ name: "Supply Chain & Alt Data",
118
+ version: "1.0.0",
119
+ description: "Supply chains and exposure, government awards, hiring, apps and job postings, social mentions, research attention, GPU prices, and power queues.",
120
+ toggleable: true,
121
+ };
122
+
123
+ export const quantPluginMeta = {
124
+ id: "quant",
125
+ stateId: "ticker-research",
126
+ name: "Quant",
127
+ version: "1.0.0",
128
+ description: "Correlation matrix and relationship graphs, backtests, seasonality, and moves on macro release days.",
129
+ toggleable: true,
130
+ };
131
+
132
+ // Macro's successors keep its state namespace, so the pane state, settings and
133
+ // caches saved while they were one plugin stay theirs; the Ticker Research
134
+ // modules Credit & Bonds and Earnings hold keep `ticker-research`. `macro` itself now
135
+ // stands for all three in disabledPlugins (see ownership.ts).
136
+
137
+ export const ratesMacroPluginMeta = {
138
+ id: "rates-macro",
139
+ stateId: "macro",
140
+ name: "Rates & Macro",
141
+ version: "1.0.0",
142
+ description: "Economic calendar and statistics, consumer prices, yield curve, rate path, money markets, central bank rates, volatility, and market valuation.",
143
+ toggleable: true,
144
+ };
145
+
146
+ export const creditPluginMeta = {
147
+ id: "credit",
148
+ stateId: "macro",
149
+ name: "Credit & Bonds",
42
150
  version: "1.0.0",
151
+ description: "Single-name, index and sovereign CDS, credit spreads, Treasury auctions, a bond calculator, credit documents and covenants, and debt maturities.",
43
152
  toggleable: true,
44
153
  };
45
154
 
46
- export const macroPluginMeta = {
47
- id: "macro",
48
- name: "Macro",
155
+ export const earningsPluginMeta = {
156
+ id: "earnings",
157
+ stateId: "macro",
158
+ name: "Earnings",
49
159
  version: "1.0.0",
50
160
  toggleable: true,
51
161
  };