gloomberb 0.16.4 → 0.16.6

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 (852) hide show
  1. package/README.md +14 -91
  2. package/package.json +5 -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 +16 -15
  11. package/src/{plugins/builtin/cloud → account}/upgrade-personalization.ts +7 -7
  12. package/src/{plugins/builtin/cloud → account}/upgrade-tickers.ts +6 -6
  13. package/src/{plugins/builtin/cloud → account}/verification-panel.tsx +6 -6
  14. package/src/api-client/central-bank-rates.ts +6 -1
  15. package/src/api-client/chat.ts +26 -0
  16. package/src/api-client/credit-boards.ts +2 -0
  17. package/src/api-client/data.ts +73 -3
  18. package/src/api-client/earnings.ts +6 -0
  19. package/src/api-client/europe-energy.ts +106 -0
  20. package/src/api-client/futures-curve.ts +56 -0
  21. package/src/api-client/index.ts +13 -1
  22. package/src/api-client/market-discovery.ts +13 -1
  23. package/src/api-client/normalizers.ts +32 -0
  24. package/src/api-client/paths.ts +7 -0
  25. package/src/api-client/perps.ts +8 -0
  26. package/src/api-client/request.ts +9 -2
  27. package/src/api-client/research-activity.ts +15 -10
  28. package/src/api-client/socket.ts +29 -0
  29. package/src/api-client/themes.ts +22 -1
  30. package/src/api-client/types.ts +78 -2
  31. package/src/api-client/yield-curves.ts +8 -0
  32. package/src/app/global-shortcuts.ts +50 -2
  33. package/src/app/keybindings/actions.ts +12 -1
  34. package/src/app/pane-runtime/plugin-bindings.ts +2 -2
  35. package/src/app/pane-runtime/ticker-open-runtime.ts +16 -6
  36. package/src/app/runtime/desktop-deeplink.ts +10 -5
  37. package/src/app/runtime/startup.ts +1 -1
  38. package/src/app.tsx +6 -0
  39. package/src/architecture/core-builtin-allowlist.json +8 -26
  40. package/src/ask-gloom/pane-context.ts +114 -0
  41. package/src/ask-gloom/pane-request.ts +70 -0
  42. package/src/ask-gloom/pane-text.ts +201 -0
  43. package/src/brokers/signed-in/sign-in-dialog.tsx +11 -5
  44. package/src/capabilities/chart-series.ts +19 -2
  45. package/src/capabilities/factories.ts +1 -0
  46. package/src/cli/central-bank-events.ts +23 -0
  47. package/src/cli/command-options.ts +17 -5
  48. package/src/cli/commands/crypto-hints.ts +35 -2
  49. package/src/cli/commands/fred-series.ts +146 -0
  50. package/src/cli/commands/market.ts +501 -115
  51. package/src/cli/commands/news-hints.ts +62 -0
  52. package/src/cli/commands/news-search.ts +53 -0
  53. package/src/cli/commands/options-leaps.ts +5 -2
  54. package/src/cli/commands/overview.ts +132 -26
  55. package/src/cli/commands/remote.ts +2 -1
  56. package/src/cli/commands/search.ts +317 -13
  57. package/src/cli/commands/system.ts +55 -8
  58. package/src/cli/commands/ticker.ts +155 -18
  59. package/src/cli/context.ts +45 -14
  60. package/src/cli/desktop-pane-shot.ts +76 -7
  61. package/src/cli/earnings-calendar.ts +71 -0
  62. package/src/cli/errors.ts +7 -5
  63. package/src/cli/exit-codes.ts +8 -0
  64. package/src/cli/export-source.ts +58 -0
  65. package/src/cli/freshness.ts +18 -7
  66. package/src/cli/glossary.ts +483 -0
  67. package/src/cli/help.ts +10 -0
  68. package/src/cli/helpers.ts +2 -5
  69. package/src/cli/history-rows.ts +118 -7
  70. package/src/cli/index-roots.ts +7 -0
  71. package/src/cli/index.ts +29 -9
  72. package/src/cli/known-gaps.ts +84 -0
  73. package/src/cli/listing-arg.ts +551 -97
  74. package/src/cli/not-a-ticker.ts +24 -9
  75. package/src/cli/pane-functions/access-gate.ts +13 -2
  76. package/src/cli/pane-functions/capabilities.ts +4 -3
  77. package/src/cli/pane-functions/catalog.ts +214 -40
  78. package/src/cli/pane-functions/data.ts +42 -8
  79. package/src/cli/pane-functions/discovery.ts +1 -0
  80. package/src/cli/pane-functions/dom.ts +37 -8
  81. package/src/cli/pane-functions/freshness.ts +393 -49
  82. package/src/cli/pane-functions/function-help.ts +31 -15
  83. package/src/cli/pane-functions/headless.ts +98 -30
  84. package/src/cli/pane-functions/index.ts +101 -19
  85. package/src/cli/pane-functions/market-session.ts +22 -8
  86. package/src/cli/pane-functions/options.ts +71 -22
  87. package/src/cli/pane-functions/report-notices.ts +25 -7
  88. package/src/cli/pane-functions/report.ts +15 -8
  89. package/src/cli/pane-functions/resolver.ts +74 -19
  90. package/src/cli/pane-functions/screenshot.ts +250 -27
  91. package/src/cli/perpetual-contract.ts +60 -0
  92. package/src/cli/registry.ts +3 -1
  93. package/src/cli/report-tables.ts +26 -7
  94. package/src/cli/result.ts +45 -11
  95. package/src/cli/series-search.ts +111 -0
  96. package/src/cli/staged-tickers.ts +52 -0
  97. package/src/cli/symbol-args.ts +27 -0
  98. package/src/cli/symbol-list.ts +154 -0
  99. package/src/cli/symbol-rows.ts +154 -0
  100. package/src/cli/ticker-resolution.ts +311 -27
  101. package/src/cli/types.ts +5 -0
  102. package/src/components/chart/composite/axis-overlays.tsx +14 -3
  103. package/src/components/chart/composite/composite-chart.tsx +71 -11
  104. package/src/components/chart/composite/crosshair-readout.tsx +150 -0
  105. package/src/components/chart/composite/downsample.ts +1 -1
  106. package/src/components/chart/composite/format.ts +29 -0
  107. package/src/components/chart/composite/interactions.ts +9 -2
  108. package/src/components/chart/composite/legend.tsx +100 -33
  109. package/src/components/chart/composite/panel-bitmap.ts +70 -35
  110. package/src/components/chart/composite/panel-labels.ts +18 -17
  111. package/src/components/chart/composite/panel-series.ts +1 -0
  112. package/src/components/chart/composite/panel-surface.tsx +46 -21
  113. package/src/components/chart/composite/price-axis-labels.tsx +3 -1
  114. package/src/components/chart/composite/rasterizer.ts +50 -8
  115. package/src/components/chart/composite/scene.ts +2 -1
  116. package/src/components/chart/composite/time-scale.ts +26 -9
  117. package/src/components/chart/composite/types.ts +18 -0
  118. package/src/components/chart/composite/use-composite-viewport.ts +30 -2
  119. package/src/components/chart/native/raster/crosshair.ts +8 -3
  120. package/src/components/chart/native/raster/primitives.ts +85 -21
  121. package/src/components/chart/native/surface/manager.ts +33 -8
  122. package/src/components/chart/surface3d/chart.tsx +1 -1
  123. package/src/components/command-bar/action-runtime.ts +1 -1
  124. package/src/components/command-bar/commands/collection-list.ts +210 -0
  125. package/src/components/command-bar/commands/collection.ts +40 -1
  126. package/src/components/command-bar/commands/direct/index.ts +4 -0
  127. package/src/components/command-bar/commands/registry.ts +8 -0
  128. package/src/components/command-bar/panel/index.tsx +11 -3
  129. package/src/components/command-bar/panel/runtime.ts +3 -0
  130. package/src/components/command-bar/panel/types.ts +2 -0
  131. package/src/components/command-bar/routes/root/plugin-install.ts +4 -4
  132. package/src/components/command-bar/routes/root/provider-search.ts +4 -3
  133. package/src/components/command-bar/routes/ticker-search/results.ts +12 -11
  134. package/src/components/command-bar/routes/ticker-search/route.ts +4 -3
  135. package/src/components/command-bar/routing/actions.ts +1 -1
  136. package/src/components/command-bar/workflow/tickers.ts +42 -17
  137. package/src/components/layout/detached-pane-shell.tsx +68 -39
  138. package/src/components/layout/floating-pane.tsx +10 -1
  139. package/src/components/layout/header.tsx +25 -5
  140. package/src/components/layout/missing-pane.tsx +3 -3
  141. package/src/components/layout/pane/capture-stamp.ts +41 -0
  142. package/src/components/layout/pane/capture-status.ts +12 -0
  143. package/src/components/layout/pane/content.tsx +7 -13
  144. package/src/components/layout/pane/footer/index.tsx +6 -2
  145. package/src/components/layout/pane/footer/keyboard.ts +3 -0
  146. package/src/components/layout/pane/footer/model.ts +41 -1
  147. package/src/components/layout/pane/header.tsx +50 -1
  148. package/src/components/layout/pane/index.tsx +21 -3
  149. package/src/components/layout/pane/sidebar.tsx +88 -21
  150. package/src/components/layout/shell/active-drag.ts +21 -5
  151. package/src/components/layout/shell/cursor-occlusion.ts +2 -1
  152. package/src/components/layout/shell/drag/index.ts +39 -9
  153. package/src/components/layout/shell/drag/live.ts +61 -51
  154. package/src/components/layout/shell/drag/runtime.ts +54 -12
  155. package/src/components/layout/shell/index.tsx +84 -65
  156. package/src/components/layout/shell/menu.ts +14 -1
  157. package/src/components/layout/shell/native/pointer-runtime.ts +3 -1
  158. package/src/components/layout/shell/pane/actions.ts +32 -10
  159. package/src/components/layout/shell/pane/ask.ts +131 -0
  160. package/src/components/layout/shell/pane/capture.ts +162 -0
  161. package/src/components/layout/shell/pane/layers.tsx +218 -50
  162. package/src/components/layout/shell/pane/management-shortcuts.ts +46 -1
  163. package/src/components/layout/shell/shortcuts.ts +21 -4
  164. package/src/components/layout/shell/terminal-pointer-runtime.ts +24 -0
  165. package/src/components/markdown-text.tsx +62 -20
  166. package/src/components/metric-treemap/heat-surface.tsx +8 -1
  167. package/src/components/onboarding/account-step/form-panel.tsx +1 -1
  168. package/src/components/onboarding/account-step/index.tsx +1 -1
  169. package/src/components/onboarding/account-step/qr-panel.tsx +1 -1
  170. package/src/components/onboarding/account-step/signed-in-panel.tsx +1 -1
  171. package/src/components/onboarding/onboarding-keyboard.ts +1 -1
  172. package/src/components/onboarding/onboarding-wizard.tsx +2 -2
  173. package/src/components/onboarding/use-onboarding-upgrade.ts +3 -3
  174. package/src/components/onboarding/wizard-account.ts +2 -2
  175. package/src/components/pane-template-wizard.tsx +9 -1
  176. package/src/components/price-selector-dialog.tsx +11 -2
  177. package/src/components/reader/article-reader.tsx +642 -0
  178. package/src/components/reader/article-text.ts +527 -0
  179. package/src/components/sign-in-gate.tsx +3 -3
  180. package/src/components/ticker/list-table-view.tsx +43 -2
  181. package/src/components/ui/action-row.tsx +2 -1
  182. package/src/components/ui/button.tsx +7 -1
  183. package/src/components/ui/choice-dialog.tsx +6 -4
  184. package/src/components/ui/confirm-dialog.tsx +28 -18
  185. package/src/components/ui/data-table/index.tsx +18 -6
  186. package/src/components/ui/data-table/opentui/index.tsx +37 -6
  187. package/src/components/ui/data-table/types.ts +12 -0
  188. package/src/components/ui/dialog-actions.tsx +64 -0
  189. package/src/components/ui/display.tsx +17 -3
  190. package/src/components/ui/frame.tsx +35 -2
  191. package/src/components/ui/icon.tsx +6 -1
  192. package/src/components/ui/query-bar.tsx +10 -1
  193. package/src/components/ui/text-prompt-dialog.tsx +11 -9
  194. package/src/data/cached-query.ts +2 -0
  195. package/src/data/config/store/migrations.ts +7 -0
  196. package/src/data/config/store/normalize.ts +7 -2
  197. package/src/data/config/store/portfolio-as-of-column.ts +57 -0
  198. package/src/data/ticker-repository.ts +5 -0
  199. package/src/data/ticker-store.ts +15 -0
  200. package/src/docs/content.ts +215 -0
  201. package/src/docs/load.ts +139 -0
  202. package/src/docs/requests.ts +39 -0
  203. package/src/docs/snapshot.chunk.ts +8 -0
  204. package/src/docs/snapshot.json +7555 -0
  205. package/src/docs/topics.ts +216 -0
  206. package/src/i18n/es.ts +65 -5
  207. package/src/i18n/ja.ts +65 -5
  208. package/src/i18n/ko.ts +65 -5
  209. package/src/i18n/zh-cn.ts +65 -5
  210. package/src/i18n/zh-tw.ts +65 -5
  211. package/src/layout/desks.ts +1 -1
  212. package/src/layout/pane-manager/dock-tree.ts +18 -0
  213. package/src/layout/pane-manager/index.ts +1 -0
  214. package/src/layout-marketplace/gallery.tsx +1 -1
  215. package/src/market-data/coordinator/chart.ts +10 -4
  216. package/src/market-data/coordinator/index.ts +6 -3
  217. package/src/{plugins/builtin/futures/contracts.ts → market-data/futures-board.ts} +81 -28
  218. package/src/market-data/futures-contract.ts +151 -0
  219. package/src/market-data/hooks.tsx +10 -2
  220. package/src/market-data/market/format.ts +39 -21
  221. package/src/market-data/market/freshness.ts +84 -20
  222. package/src/market-data/market/session-close-note.ts +3 -2
  223. package/src/market-data/market/status.ts +19 -23
  224. package/src/market-data/published-apac-sessions.ts +23 -1
  225. package/src/market-data/quotes/contributions.ts +5 -0
  226. package/src/market-data/quotes/metadata.ts +19 -24
  227. package/src/market-data/quotes/resolution.ts +5 -0
  228. package/src/market-data/quotes/screener-live-quotes.ts +5 -4
  229. package/src/market-data/result-types.ts +2 -0
  230. package/src/notifications/app-notifier.ts +17 -1
  231. package/src/notifications/notification-log.ts +180 -0
  232. package/src/plugins/auto-update-node.ts +2 -2
  233. package/src/plugins/auto-update.ts +2 -2
  234. package/src/plugins/builtin/account-management/index.tsx +1 -0
  235. package/src/plugins/builtin/account-management/model.ts +1 -56
  236. package/src/plugins/builtin/account-management/pane.tsx +6 -4
  237. package/src/plugins/builtin/account-management/password-dialog.tsx +1 -1
  238. package/src/plugins/builtin/alerts/catalysts.ts +1 -1
  239. package/src/plugins/builtin/alerts/cli.ts +313 -47
  240. package/src/plugins/builtin/alerts/events-pane.tsx +45 -7
  241. package/src/plugins/builtin/alerts/events.ts +23 -2
  242. package/src/plugins/builtin/alerts/focus.ts +27 -0
  243. package/src/plugins/builtin/alerts/history-pane.tsx +7 -2
  244. package/src/plugins/builtin/alerts/history.ts +2 -0
  245. package/src/plugins/builtin/alerts/index.tsx +47 -11
  246. package/src/plugins/builtin/alerts/pane.tsx +27 -1
  247. package/src/plugins/builtin/alerts/research-builder.ts +8 -3
  248. package/src/plugins/builtin/alerts/research-rules.ts +18 -2
  249. package/src/plugins/builtin/alerts/scheduled-check.ts +122 -0
  250. package/src/plugins/builtin/alerts/scheduled-sources.ts +25 -0
  251. package/src/plugins/builtin/alerts/scheduled.ts +254 -0
  252. package/src/plugins/builtin/alerts/targets.ts +92 -0
  253. package/src/plugins/builtin/analytics/index.tsx +8 -3
  254. package/src/plugins/builtin/analytics/risk-headless.ts +60 -27
  255. package/src/plugins/builtin/analytics/risk-math.ts +91 -27
  256. package/src/plugins/builtin/analytics/risk-model.ts +35 -5
  257. package/src/plugins/builtin/analytics/risk-pane.tsx +15 -8
  258. package/src/plugins/builtin/attention/headless.ts +1 -1
  259. package/src/plugins/builtin/attention/index.tsx +2 -0
  260. package/src/plugins/builtin/attention/pane.tsx +3 -1
  261. package/src/plugins/builtin/attention/series.ts +26 -0
  262. package/src/plugins/builtin/awards/headless.ts +88 -18
  263. package/src/plugins/builtin/awards/index.tsx +2 -0
  264. package/src/plugins/builtin/awards/model.ts +41 -1
  265. package/src/plugins/builtin/awards/pane.tsx +22 -13
  266. package/src/plugins/builtin/awards/series.ts +29 -0
  267. package/src/plugins/builtin/backtest/headless.ts +2 -2
  268. package/src/plugins/builtin/bond-calculator/model.ts +2 -1
  269. package/src/plugins/builtin/broker-manager/index.tsx +1 -0
  270. package/src/plugins/builtin/catalysts/headless.ts +1 -1
  271. package/src/plugins/builtin/catalysts/pane.tsx +3 -1
  272. package/src/plugins/builtin/cds/client.ts +49 -12
  273. package/src/plugins/builtin/cds/headless.ts +119 -19
  274. package/src/plugins/builtin/cds/index.tsx +3 -1
  275. package/src/plugins/builtin/cds/model.ts +214 -32
  276. package/src/plugins/builtin/cds/pane.tsx +58 -14
  277. package/src/plugins/builtin/cds/series.ts +19 -0
  278. package/src/plugins/builtin/central-bank-rates/client.ts +4 -0
  279. package/src/plugins/builtin/central-bank-rates/headless.ts +46 -16
  280. package/src/plugins/builtin/central-bank-rates/index.tsx +3 -1
  281. package/src/plugins/builtin/central-bank-rates/model.ts +99 -0
  282. package/src/plugins/builtin/central-bank-rates/pane.tsx +1 -1
  283. package/src/plugins/builtin/central-bank-rates/series.ts +36 -0
  284. package/src/plugins/builtin/chart-composer/catalog-inventory.ts +193 -255
  285. package/src/plugins/builtin/chart-composer/data-catalog-pane.tsx +84 -46
  286. package/src/plugins/builtin/chart-composer/editor.tsx +5 -4
  287. package/src/plugins/builtin/chart-composer/field-series.ts +40 -0
  288. package/src/plugins/builtin/chart-composer/headless-schema.ts +1 -1
  289. package/src/plugins/builtin/chart-composer/headless.ts +70 -5
  290. package/src/plugins/builtin/chart-composer/index.tsx +15 -3
  291. package/src/plugins/builtin/chart-composer/pane.tsx +81 -38
  292. package/src/plugins/builtin/chart-composer/series-catalog.ts +58 -50
  293. package/src/plugins/builtin/chart-composer/series-expression.ts +18 -10
  294. package/src/plugins/builtin/chart-composer/use-series-catalog.ts +59 -3
  295. package/src/plugins/builtin/chart-composer/user-series.ts +84 -0
  296. package/src/plugins/builtin/chat/content/composer-runtime.ts +6 -1
  297. package/src/plugins/builtin/chat/content/composer.tsx +5 -1
  298. package/src/plugins/builtin/chat/content/footer.tsx +12 -0
  299. package/src/plugins/builtin/chat/content/index.tsx +89 -5
  300. package/src/plugins/builtin/chat/content/new-dm-dialog.tsx +10 -2
  301. package/src/plugins/builtin/chat/content/new-messages.tsx +89 -0
  302. package/src/plugins/builtin/chat/content/row-activity.ts +132 -0
  303. package/src/plugins/builtin/chat/content/scroll.ts +127 -27
  304. package/src/plugins/builtin/chat/content/shortcuts.ts +2 -2
  305. package/src/plugins/builtin/chat/content/transcript.tsx +145 -78
  306. package/src/plugins/builtin/chat/content/types.ts +1 -0
  307. package/src/plugins/builtin/chat/controller/fetch.ts +8 -2
  308. package/src/plugins/builtin/chat/controller/index.ts +123 -1
  309. package/src/plugins/builtin/chat/controller/message-loading.ts +3 -0
  310. package/src/plugins/builtin/chat/controller/messages.ts +7 -2
  311. package/src/plugins/builtin/chat/controller/realtime.ts +10 -1
  312. package/src/plugins/builtin/chat/controller/send.ts +61 -1
  313. package/src/plugins/builtin/chat/controller/state.ts +8 -0
  314. package/src/plugins/builtin/chat/ghost-user.ts +20 -0
  315. package/src/plugins/builtin/chat/index.tsx +23 -5
  316. package/src/plugins/builtin/chat/layout.ts +78 -5
  317. package/src/plugins/builtin/chat/message/ai-badge.tsx +18 -0
  318. package/src/plugins/builtin/chat/message/desktop.tsx +55 -6
  319. package/src/plugins/builtin/chat/message/header.tsx +16 -4
  320. package/src/plugins/builtin/chat/message/profile-popover.tsx +5 -1
  321. package/src/plugins/builtin/chat/message/reactions.tsx +210 -0
  322. package/src/plugins/builtin/chat/message/render-state.ts +18 -2
  323. package/src/plugins/builtin/chat/message/terminal.tsx +43 -4
  324. package/src/plugins/builtin/chat/message/types.ts +12 -0
  325. package/src/plugins/builtin/chat/reactions.ts +197 -0
  326. package/src/plugins/builtin/chat/share/flow.tsx +87 -0
  327. package/src/plugins/builtin/chat/share/targets.ts +27 -0
  328. package/src/plugins/builtin/chat/status-widget.tsx +6 -3
  329. package/src/plugins/builtin/chat/unread-inbox-pane.tsx +148 -27
  330. package/src/plugins/builtin/chat/unread-inbox.ts +22 -0
  331. package/src/plugins/builtin/cloud/askg/attached-pane.tsx +69 -0
  332. package/src/plugins/builtin/cloud/askg/controller.ts +111 -19
  333. package/src/plugins/builtin/cloud/askg/executor.ts +57 -3
  334. package/src/plugins/builtin/cloud/askg/manifest.ts +32 -7
  335. package/src/plugins/builtin/cloud/askg/model.ts +27 -8
  336. package/src/plugins/builtin/cloud/askg/pane-attachment.ts +94 -0
  337. package/src/plugins/builtin/cloud/askg/pane.tsx +141 -12
  338. package/src/plugins/builtin/cloud/askg/pending-question.ts +11 -0
  339. package/src/plugins/builtin/cloud/askg/protocol.ts +10 -1
  340. package/src/plugins/builtin/cloud/askg/tool-display.ts +3 -0
  341. package/src/plugins/builtin/cloud/askg/undo.ts +2 -0
  342. package/src/plugins/builtin/cloud/auth-actions.tsx +1 -1
  343. package/src/plugins/builtin/cloud/auth-commands.ts +1 -1
  344. package/src/plugins/builtin/cloud/auth-dialog.tsx +3 -3
  345. package/src/plugins/builtin/cloud/company-picker.tsx +1 -1
  346. package/src/plugins/builtin/cloud/mcp-connect/dialog.tsx +3 -0
  347. package/src/plugins/builtin/cloud/plugin.tsx +19 -2
  348. package/src/plugins/builtin/cloud/team/model.ts +5 -0
  349. package/src/plugins/builtin/cloud/team/module.tsx +1 -0
  350. package/src/plugins/builtin/cloud/team/store.ts +8 -3
  351. package/src/plugins/builtin/cloud/terminal-relay/engine.ts +77 -9
  352. package/src/plugins/builtin/cloud/terminal-relay/manifest.ts +6 -1
  353. package/src/plugins/builtin/cloud/terminal-relay/policy.ts +9 -0
  354. package/src/plugins/builtin/cloud/terminal-relay/prompts.tsx +35 -11
  355. package/src/plugins/builtin/cloud/thesis/exposure.ts +1 -1
  356. package/src/plugins/builtin/cloud/thesis/module.tsx +1 -0
  357. package/src/plugins/builtin/cloud/thesis/prompts.tsx +2 -1
  358. package/src/plugins/builtin/company-attention/app-rank.tsx +1 -1
  359. package/src/plugins/builtin/company-attention/headless.ts +21 -7
  360. package/src/plugins/builtin/company-attention/index.tsx +2 -0
  361. package/src/plugins/builtin/company-attention/model.ts +26 -7
  362. package/src/plugins/builtin/company-attention/pane.tsx +12 -9
  363. package/src/plugins/builtin/company-attention/series.ts +52 -0
  364. package/src/plugins/builtin/company-kpis/headless.ts +97 -10
  365. package/src/plugins/builtin/company-kpis/model.ts +24 -2
  366. package/src/plugins/builtin/company-kpis/pane.tsx +17 -16
  367. package/src/plugins/builtin/composite-plugins.ts +19 -13
  368. package/src/plugins/builtin/connections/index.ts +1 -0
  369. package/src/plugins/builtin/cot/headless.ts +1 -1
  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/cpi/headless.ts +3 -3
  374. package/src/plugins/builtin/credit-boards/cdx-pane.tsx +10 -1
  375. package/src/plugins/builtin/credit-boards/client.ts +6 -2
  376. package/src/plugins/builtin/credit-boards/headless.ts +108 -31
  377. package/src/plugins/builtin/credit-boards/index.tsx +2 -0
  378. package/src/plugins/builtin/credit-boards/model.ts +11 -1
  379. package/src/plugins/builtin/credit-boards/series.ts +66 -0
  380. package/src/plugins/builtin/credit-conditions/client.ts +12 -9
  381. package/src/plugins/builtin/credit-conditions/headless.ts +13 -2
  382. package/src/plugins/builtin/credit-conditions/index.tsx +18 -9
  383. package/src/plugins/builtin/credit-conditions/model.ts +19 -11
  384. package/src/plugins/builtin/credit-conditions/series.ts +16 -0
  385. package/src/plugins/builtin/credit-documents/headless.ts +33 -3
  386. package/src/plugins/builtin/credit-documents/pane.tsx +3 -1
  387. package/src/plugins/builtin/crypto-board/headless.ts +2 -3
  388. package/src/plugins/builtin/crypto-board/index.tsx +2 -0
  389. package/src/plugins/builtin/crypto-board/model.ts +12 -0
  390. package/src/plugins/builtin/crypto-board/pane.tsx +19 -12
  391. package/src/plugins/builtin/crypto-board/series.ts +48 -0
  392. package/src/plugins/builtin/custom-view/live-quotes.ts +2 -2
  393. package/src/plugins/builtin/debt-maturities/headless.ts +17 -11
  394. package/src/plugins/builtin/debt-maturities/index.tsx +2 -0
  395. package/src/plugins/builtin/debt-maturities/series.ts +45 -0
  396. package/src/plugins/builtin/dividend-yield/client.ts +3 -0
  397. package/src/plugins/builtin/dividend-yield/headless.ts +7 -4
  398. package/src/plugins/builtin/dividend-yield/index.tsx +3 -1
  399. package/src/plugins/builtin/dividend-yield/pane.tsx +3 -1
  400. package/src/plugins/builtin/dividend-yield/series.ts +20 -0
  401. package/src/plugins/builtin/dividend-yield/types.ts +2 -0
  402. package/src/plugins/builtin/docs/blocks.tsx +181 -0
  403. package/src/plugins/builtin/docs/index.tsx +68 -0
  404. package/src/plugins/builtin/docs/pane.tsx +426 -0
  405. package/src/plugins/builtin/docs/targets.ts +72 -0
  406. package/src/plugins/builtin/docs/use-docs.ts +60 -0
  407. package/src/plugins/builtin/doe/headless.ts +12 -8
  408. package/src/plugins/builtin/doe/index.tsx +2 -0
  409. package/src/plugins/builtin/doe/series.ts +62 -0
  410. package/src/plugins/builtin/earnings/client.ts +3 -2
  411. package/src/plugins/builtin/earnings/format.ts +1 -5
  412. package/src/plugins/builtin/earnings/headless.ts +58 -6
  413. package/src/plugins/builtin/earnings/history-model.ts +15 -1
  414. package/src/plugins/builtin/earnings/history-table.ts +13 -2
  415. package/src/plugins/builtin/earnings/history.tsx +7 -3
  416. package/src/plugins/builtin/earnings/index.tsx +9 -0
  417. package/src/plugins/builtin/earnings-calls/headless.ts +28 -2
  418. package/src/plugins/builtin/earnings-calls/index.tsx +1 -1
  419. package/src/plugins/builtin/earnings-ripple/index.tsx +2 -0
  420. package/src/plugins/builtin/econ/fred-catalog.ts +198 -0
  421. package/src/plugins/builtin/econ/fred-series-map.ts +0 -46
  422. package/src/plugins/builtin/econ/index.tsx +2 -0
  423. package/src/plugins/builtin/econ-statistics/defs.ts +5 -0
  424. package/src/plugins/builtin/econ-statistics/headless.ts +19 -4
  425. package/src/plugins/builtin/econ-statistics/stats.ts +1 -0
  426. package/src/plugins/builtin/equity-screener/headless.ts +3 -3
  427. package/src/plugins/builtin/equity-screener/pane.tsx +4 -11
  428. package/src/plugins/builtin/estimate-revisions/headless.ts +3 -3
  429. package/src/plugins/builtin/exposure/drivers.ts +13 -0
  430. package/src/plugins/builtin/exposure/headless.ts +205 -13
  431. package/src/plugins/builtin/exposure/holdings.ts +1 -1
  432. package/src/plugins/builtin/exposure/index.tsx +1 -0
  433. package/src/plugins/builtin/exposure/model.ts +23 -3
  434. package/src/plugins/builtin/exposure/pane.tsx +14 -12
  435. package/src/plugins/builtin/fear-greed/index.tsx +18 -10
  436. package/src/plugins/builtin/fear-greed/series.ts +52 -0
  437. package/src/plugins/builtin/futures/index.tsx +43 -3
  438. package/src/plugins/builtin/futures/model.ts +1 -1
  439. package/src/plugins/builtin/futures/returns.ts +1 -1
  440. package/src/plugins/builtin/futures/series.ts +13 -0
  441. package/src/plugins/builtin/futures/table.tsx +1 -1
  442. package/src/plugins/builtin/futures/use-front-returns.ts +1 -1
  443. package/src/plugins/builtin/futures-curve/client.ts +12 -3
  444. package/src/plugins/builtin/futures-curve/headless.ts +71 -10
  445. package/src/plugins/builtin/futures-curve/index.tsx +1 -1
  446. package/src/plugins/builtin/futures-curve/model.ts +66 -11
  447. package/src/plugins/builtin/futures-curve/pane.tsx +52 -18
  448. package/src/plugins/builtin/fx-matrix/client.ts +63 -0
  449. package/src/plugins/builtin/fx-matrix/export.ts +2 -1
  450. package/src/plugins/builtin/fx-matrix/headless.ts +154 -0
  451. package/src/plugins/builtin/fx-matrix/index.tsx +4 -4
  452. package/src/plugins/builtin/gpu/board.tsx +13 -10
  453. package/src/plugins/builtin/gpu/changes.tsx +4 -4
  454. package/src/plugins/builtin/gpu/client.ts +19 -1
  455. package/src/plugins/builtin/gpu/equities.tsx +14 -10
  456. package/src/plugins/builtin/gpu/headless.ts +58 -27
  457. package/src/plugins/builtin/gpu/history.tsx +3 -3
  458. package/src/plugins/builtin/gpu/index.tsx +2 -0
  459. package/src/plugins/builtin/gpu/model.ts +101 -16
  460. package/src/plugins/builtin/gpu/pane.tsx +28 -12
  461. package/src/plugins/builtin/gpu/series.ts +38 -0
  462. package/src/plugins/builtin/help/function-card.tsx +25 -6
  463. package/src/plugins/builtin/help/function-index.ts +2 -0
  464. package/src/plugins/builtin/help/index.tsx +31 -9
  465. package/src/plugins/builtin/holders/beneficial-model.ts +90 -3
  466. package/src/plugins/builtin/holders/beneficial-report.ts +57 -5
  467. package/src/plugins/builtin/holders/beneficial-view.tsx +55 -11
  468. package/src/plugins/builtin/holders/client.ts +22 -3
  469. package/src/plugins/builtin/holders/format.ts +18 -3
  470. package/src/plugins/builtin/holders/headless.ts +36 -133
  471. package/src/plugins/builtin/holders/pane.tsx +11 -4
  472. package/src/plugins/builtin/holders/report-header.ts +40 -5
  473. package/src/plugins/builtin/holders/report-rows.ts +240 -0
  474. package/src/plugins/builtin/insider/client.ts +35 -20
  475. package/src/plugins/builtin/insider/headless.ts +41 -11
  476. package/src/plugins/builtin/insider/index.tsx +26 -9
  477. package/src/plugins/builtin/insider/insider-data.ts +10 -0
  478. package/src/plugins/builtin/insider/issuer.ts +49 -0
  479. package/src/plugins/builtin/insider/model.ts +3 -0
  480. package/src/plugins/builtin/ipo-calendar/headless.ts +1 -1
  481. package/src/plugins/builtin/iv-history/client.ts +20 -6
  482. package/src/plugins/builtin/iv-history/format.ts +9 -0
  483. package/src/plugins/builtin/iv-history/headless.ts +56 -21
  484. package/src/plugins/builtin/iv-history/index.tsx +2 -0
  485. package/src/plugins/builtin/iv-history/model.ts +143 -8
  486. package/src/plugins/builtin/iv-history/screen-pane.tsx +5 -9
  487. package/src/plugins/builtin/iv-history/series.ts +29 -0
  488. package/src/plugins/builtin/jobs/headless.ts +26 -3
  489. package/src/plugins/builtin/jobs/index.tsx +3 -1
  490. package/src/plugins/builtin/jobs/series.ts +19 -0
  491. package/src/plugins/builtin/kelly-sizer/index.tsx +2 -0
  492. package/src/plugins/builtin/kelly-sizer/pane.tsx +2 -1
  493. package/src/plugins/builtin/kelly-sizer/portfolio.ts +0 -39
  494. package/src/plugins/builtin/macro-day/client.ts +44 -3
  495. package/src/plugins/builtin/macro-day/headless.ts +13 -10
  496. package/src/plugins/builtin/macro-day/model.ts +56 -10
  497. package/src/plugins/builtin/macro-day/pane.tsx +30 -20
  498. package/src/plugins/builtin/market-heatmap/headless.ts +20 -5
  499. package/src/plugins/builtin/market-heatmap/index.tsx +6 -0
  500. package/src/plugins/builtin/market-heatmap/model.ts +19 -11
  501. package/src/plugins/builtin/market-heatmap/portfolio.ts +2 -2
  502. package/src/plugins/builtin/market-movers/client.ts +7 -5
  503. package/src/plugins/builtin/market-movers/index.tsx +3 -2
  504. package/src/plugins/builtin/market-movers/model.ts +30 -0
  505. package/src/plugins/builtin/market-movers/screener.ts +31 -0
  506. package/src/plugins/builtin/market-valuation/chart-series.ts +29 -69
  507. package/src/plugins/builtin/market-valuation/index.tsx +3 -3
  508. package/src/plugins/builtin/market-valuation/indicators.ts +0 -5
  509. package/src/plugins/builtin/members/headless.ts +8 -3
  510. package/src/plugins/builtin/members/model.ts +31 -3
  511. package/src/plugins/builtin/members/pane.tsx +6 -8
  512. package/src/plugins/builtin/mna/distress/headless.ts +4 -4
  513. package/src/plugins/builtin/mna/headless.ts +18 -6
  514. package/src/plugins/builtin/money-markets/headless.ts +5 -4
  515. package/src/plugins/builtin/money-markets/index.tsx +2 -0
  516. package/src/plugins/builtin/money-markets/series.ts +41 -0
  517. package/src/plugins/builtin/news/index.tsx +0 -2
  518. package/src/plugins/builtin/news/wire/news/detail-view.tsx +53 -104
  519. package/src/plugins/builtin/news/wire/news/footer.ts +2 -25
  520. package/src/plugins/builtin/news/wire/news/preset-pane.tsx +0 -2
  521. package/src/plugins/builtin/notes/cli.ts +12 -7
  522. package/src/plugins/builtin/notes/index.tsx +1 -0
  523. package/src/plugins/builtin/options/index.tsx +3 -0
  524. package/src/plugins/builtin/options/view.tsx +1 -1
  525. package/src/plugins/builtin/options-calculator/inputs.ts +2 -1
  526. package/src/plugins/builtin/options-positioning/client.ts +7 -3
  527. package/src/plugins/builtin/options-positioning/headless.ts +4 -3
  528. package/src/plugins/builtin/options-positioning/pane.tsx +2 -2
  529. package/src/plugins/builtin/options-scenario/client.ts +2 -1
  530. package/src/plugins/builtin/options-scenario/headless.ts +1 -0
  531. package/src/plugins/builtin/options-scenario/hedge.ts +2 -1
  532. package/src/plugins/builtin/perps/client.ts +90 -16
  533. package/src/plugins/builtin/perps/equity-row.tsx +52 -17
  534. package/src/plugins/builtin/perps/freshness.ts +66 -0
  535. package/src/plugins/builtin/perps/headless.ts +47 -32
  536. package/src/plugins/builtin/perps/index.tsx +23 -4
  537. package/src/plugins/builtin/perps/list-perpetuals.ts +118 -0
  538. package/src/plugins/builtin/perps/model.ts +20 -5
  539. package/src/plugins/builtin/perps/open-market.ts +15 -0
  540. package/src/plugins/builtin/perps/pane.tsx +76 -20
  541. package/src/plugins/builtin/perps/series.ts +76 -0
  542. package/src/plugins/builtin/plugin-marketplace/index.tsx +1 -1
  543. package/src/plugins/builtin/plugin-marketplace/pane.tsx +73 -67
  544. package/src/plugins/builtin/plugin-module.ts +3 -0
  545. package/src/plugins/builtin/portfolio-list/account-metrics.ts +1 -1
  546. package/src/plugins/builtin/portfolio-list/allocation.ts +5 -4
  547. package/src/plugins/builtin/portfolio-list/cell-version.ts +8 -1
  548. package/src/plugins/builtin/portfolio-list/cli/bulk-symbols.ts +161 -0
  549. package/src/plugins/builtin/portfolio-list/cli/import-13f.ts +109 -0
  550. package/src/plugins/builtin/portfolio-list/cli/portfolio-command.ts +384 -74
  551. package/src/plugins/builtin/portfolio-list/cli/render.ts +437 -71
  552. package/src/plugins/builtin/portfolio-list/cli/shared.ts +21 -4
  553. package/src/plugins/builtin/portfolio-list/cli/watchlist-command.ts +121 -47
  554. package/src/plugins/builtin/portfolio-list/column-values.ts +104 -26
  555. package/src/plugins/builtin/portfolio-list/grid.tsx +1 -1
  556. package/src/plugins/builtin/portfolio-list/headless.ts +84 -18
  557. package/src/plugins/builtin/portfolio-list/imported-from.ts +8 -0
  558. package/src/plugins/builtin/portfolio-list/index.tsx +5 -1
  559. package/src/plugins/builtin/portfolio-list/live-valuation.ts +6 -2
  560. package/src/plugins/builtin/portfolio-list/mutations.ts +2 -9
  561. package/src/plugins/builtin/portfolio-list/pane/data.ts +5 -1
  562. package/src/plugins/builtin/portfolio-list/pane/index.tsx +52 -9
  563. package/src/plugins/builtin/portfolio-list/quick-add/index.tsx +33 -11
  564. package/src/plugins/builtin/portfolio-list/quick-add/resolution.ts +21 -1
  565. package/src/plugins/builtin/portfolio-list/settings.ts +17 -0
  566. package/src/plugins/builtin/portfolio-list/summary/index.tsx +12 -0
  567. package/src/plugins/builtin/portfolio-list/summary/totals.ts +9 -4
  568. package/src/plugins/builtin/portfolio-list/table.tsx +37 -7
  569. package/src/plugins/builtin/power/client.ts +16 -0
  570. package/src/plugins/builtin/power/evidence.ts +63 -10
  571. package/src/plugins/builtin/power/headless.ts +77 -9
  572. package/src/plugins/builtin/power/index.tsx +28 -3
  573. package/src/plugins/builtin/power/model.ts +73 -2
  574. package/src/plugins/builtin/power/pane.tsx +37 -9
  575. package/src/plugins/builtin/power/prices-client.ts +139 -0
  576. package/src/plugins/builtin/power/prices-headless.ts +137 -0
  577. package/src/plugins/builtin/power/prices-model.ts +103 -0
  578. package/src/plugins/builtin/power/prices.tsx +179 -0
  579. package/src/plugins/builtin/rate-path/headless.ts +46 -18
  580. package/src/plugins/builtin/realized-vol/headless.ts +5 -0
  581. package/src/plugins/builtin/relative-rotation/headless.ts +3 -3
  582. package/src/plugins/builtin/research/corporate-actions-pane.tsx +5 -2
  583. package/src/plugins/builtin/research/event-model.ts +68 -24
  584. package/src/plugins/builtin/research/events-headless.ts +2 -1
  585. package/src/plugins/builtin/research/headless.ts +2 -1
  586. package/src/plugins/builtin/research/index.tsx +2 -0
  587. package/src/plugins/builtin/research-search/article.ts +65 -0
  588. package/src/plugins/builtin/research-search/document-view.tsx +33 -215
  589. package/src/plugins/builtin/research-search/model.ts +0 -9
  590. package/src/plugins/builtin/research-search/pane.tsx +41 -30
  591. package/src/plugins/builtin/research-search/snippet.ts +0 -29
  592. package/src/plugins/builtin/revenue-breakdown/headless.ts +18 -6
  593. package/src/plugins/builtin/seasonality/client.ts +15 -7
  594. package/src/plugins/builtin/seasonality/headless.ts +36 -12
  595. package/src/plugins/builtin/seasonality/index.tsx +2 -2
  596. package/src/plugins/builtin/seasonality/model.ts +119 -0
  597. package/src/plugins/builtin/seasonality/pane.tsx +108 -37
  598. package/src/plugins/builtin/sec/headless.ts +25 -3
  599. package/src/plugins/builtin/sec/index.tsx +2 -1
  600. package/src/plugins/builtin/series-inventory.ts +93 -0
  601. package/src/plugins/builtin/shared/cloud-denied.ts +15 -0
  602. package/src/plugins/builtin/shared/cloud-upgrade.ts +1 -1
  603. package/src/plugins/builtin/shared/command-tab.ts +30 -12
  604. package/src/plugins/builtin/shared/earnings-report.ts +55 -0
  605. package/src/plugins/builtin/shared/fred-points.ts +20 -0
  606. package/src/plugins/builtin/shared/free-preview.ts +47 -0
  607. package/src/plugins/builtin/shared/fx-rate-freshness.ts +101 -0
  608. package/src/plugins/builtin/shared/open-description.ts +29 -0
  609. package/src/plugins/builtin/shared/report-freshness.ts +12 -1
  610. package/src/plugins/builtin/shared/series-warning.ts +5 -0
  611. package/src/plugins/builtin/shared/volatility/options.ts +4 -1
  612. package/src/plugins/builtin/short-interest/headless.ts +1 -0
  613. package/src/plugins/builtin/short-interest/index.tsx +2 -0
  614. package/src/plugins/builtin/short-interest/series.ts +36 -0
  615. package/src/plugins/builtin/short-interest/watch-headless.ts +3 -2
  616. package/src/plugins/builtin/short-interest/watch-model.ts +9 -5
  617. package/src/plugins/builtin/short-volume/headless.ts +2 -1
  618. package/src/plugins/builtin/short-volume/index.tsx +2 -0
  619. package/src/plugins/builtin/short-volume/series.ts +23 -0
  620. package/src/plugins/builtin/social-mentions/headless.ts +1 -1
  621. package/src/plugins/builtin/social-mentions/index.tsx +2 -0
  622. package/src/plugins/builtin/social-mentions/series.ts +23 -0
  623. package/src/plugins/builtin/supply-chain/graph-pane.tsx +3 -2
  624. package/src/plugins/builtin/supply-chain/headless.ts +43 -11
  625. package/src/plugins/builtin/supply-chain/model.ts +13 -0
  626. package/src/plugins/builtin/supply-chain/pane.tsx +8 -6
  627. package/src/plugins/builtin/themes/headless.ts +74 -10
  628. package/src/plugins/builtin/themes/model.ts +71 -4
  629. package/src/plugins/builtin/themes/pane.tsx +22 -5
  630. package/src/plugins/builtin/thirteenf/api.ts +1 -0
  631. package/src/plugins/builtin/thirteenf/data.ts +6 -4
  632. package/src/plugins/builtin/thirteenf/headless.ts +217 -36
  633. package/src/plugins/builtin/thirteenf/model.ts +39 -1
  634. package/src/plugins/builtin/thirteenf/overlap.ts +75 -0
  635. package/src/plugins/builtin/thirteenf/pane.tsx +10 -1
  636. package/src/plugins/builtin/thirteenf/report-notes.ts +103 -1
  637. package/src/plugins/builtin/thirteenf/types.ts +2 -0
  638. package/src/plugins/builtin/ticker-detail/data-panes/returns-history.ts +114 -0
  639. package/src/plugins/builtin/ticker-detail/data-panes/returns-model.ts +57 -2
  640. package/src/plugins/builtin/ticker-detail/data-panes/returns-pane.tsx +19 -55
  641. package/src/plugins/builtin/ticker-detail/headless-schema.ts +30 -0
  642. package/src/plugins/builtin/ticker-detail/headless.ts +86 -0
  643. package/src/plugins/builtin/ticker-detail/index.tsx +26 -11
  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 +49 -5
  649. package/src/plugins/builtin/ticker-detail/quote-monitor/index.tsx +13 -3
  650. package/src/plugins/builtin/time-sales/headless.ts +2 -1
  651. package/src/plugins/builtin/time-sales/index.tsx +2 -1
  652. package/src/plugins/builtin/treasury-auctions/headless.ts +16 -2
  653. package/src/plugins/builtin/treasury-auctions/index.tsx +1 -0
  654. package/src/plugins/builtin/treasury-auctions/model.ts +8 -0
  655. package/src/plugins/builtin/vol-surface/evidence.ts +7 -1
  656. package/src/plugins/builtin/vol-surface/headless.ts +51 -17
  657. package/src/plugins/builtin/vol-surface/heat-grid.tsx +113 -0
  658. package/src/plugins/builtin/vol-surface/model.ts +39 -6
  659. package/src/plugins/builtin/vol-surface/pane.tsx +14 -13
  660. package/src/plugins/builtin/vol-surface/stored.ts +63 -3
  661. package/src/plugins/builtin/vol-surface/surface.tsx +30 -2
  662. package/src/plugins/builtin/volatility/index.tsx +2 -0
  663. package/src/plugins/builtin/volatility/series.ts +84 -0
  664. package/src/plugins/builtin/world-venue-map/basemap-layer.tsx +6 -5
  665. package/src/plugins/builtin/world-venue-map/basemap.ts +6 -3
  666. package/src/plugins/builtin/world-venue-map/geo-draw.tsx +2 -1
  667. package/src/plugins/builtin/world-venue-map/geo-series.ts +26 -1
  668. package/src/plugins/builtin/world-venue-map/geo-svg.tsx +6 -6
  669. package/src/plugins/builtin/world-venue-map/headless.ts +4 -1
  670. package/src/plugins/builtin/world-venue-map/index.ts +2 -1
  671. package/src/plugins/builtin/world-venue-map/layered-pane.tsx +24 -13
  672. package/src/plugins/builtin/world-venue-map/layers.ts +29 -0
  673. package/src/plugins/builtin/world-venue-map/map.tsx +144 -13
  674. package/src/plugins/builtin/world-venue-map/model.ts +56 -19
  675. package/src/plugins/builtin/world-venue-map/pane.tsx +5 -2
  676. package/src/plugins/builtin/yield-curve/chart.ts +2 -2
  677. package/src/plugins/builtin/yield-curve/curves.ts +21 -8
  678. package/src/plugins/builtin/yield-curve/headless.ts +71 -18
  679. package/src/plugins/builtin/yield-curve/index.tsx +4 -2
  680. package/src/plugins/builtin/yield-curve/series.ts +86 -0
  681. package/src/plugins/catalog-browser.ts +2 -1
  682. package/src/plugins/installer.ts +2 -2
  683. package/src/plugins/loader.ts +15 -0
  684. package/src/plugins/manager-node.ts +1 -1
  685. package/src/plugins/{builtin/plugin-marketplace → marketplace}/feed.ts +2 -2
  686. package/src/plugins/{builtin/plugin-marketplace → marketplace}/model.ts +6 -6
  687. package/src/plugins/{builtin/plugin-marketplace → marketplace}/store.ts +1 -1
  688. package/src/plugins/registry/host-actions.ts +11 -0
  689. package/src/plugins/registry/index.ts +89 -4
  690. package/src/portfolio/collection-name.ts +31 -0
  691. package/src/{plugins/builtin/portfolio-list → portfolio}/position-metrics.ts +6 -6
  692. package/src/portfolio/position-value.ts +40 -0
  693. package/src/portfolio/valuation-basis.ts +79 -0
  694. package/src/public/__snapshots__/public-api.test.ts.snap +7 -0
  695. package/src/public/time-series.ts +17 -0
  696. package/src/react/auto-refresh.ts +13 -3
  697. package/src/react/input.ts +33 -1
  698. package/src/react/key-repeat.ts +86 -0
  699. package/src/remote/app-host.tsx +20 -4
  700. package/src/remote/confirm-change.tsx +85 -0
  701. package/src/remote/controller-utils.ts +8 -1
  702. package/src/remote/controller.ts +144 -7
  703. package/src/remote/pane-screenshot.ts +47 -0
  704. package/src/remote/schema.ts +65 -2
  705. package/src/remote/types.ts +30 -0
  706. package/src/remote/watchlist.ts +306 -0
  707. package/src/renderers/browser/main.tsx +4 -3
  708. package/src/renderers/browser/research-entry.ts +4 -2
  709. package/src/renderers/cloudflare/worker.ts +1 -1
  710. package/src/renderers/dom/data-table/frozen-column.ts +3 -1
  711. package/src/renderers/dom/data-table/index.tsx +33 -6
  712. package/src/renderers/dom/data-table/row.tsx +30 -1
  713. package/src/renderers/dom/desktop/control-styles.ts +63 -1
  714. package/src/renderers/dom/desktop/controls.tsx +30 -23
  715. package/src/renderers/dom/desktop/dialog-actions.tsx +170 -0
  716. package/src/renderers/dom/desktop/icons.tsx +16 -0
  717. package/src/renderers/dom/dom-ui-host.tsx +3 -0
  718. package/src/renderers/dom/host/block-glyph-canvas.tsx +6 -3
  719. package/src/renderers/dom/host/box.tsx +8 -0
  720. package/src/renderers/dom/host/chart-surface.tsx +33 -2
  721. package/src/renderers/dom/host/live-frame.ts +6 -2
  722. package/src/renderers/dom/host/overflow-fade.ts +14 -1
  723. package/src/renderers/dom/host/scroll-box.tsx +32 -0
  724. package/src/renderers/dom/host/size-observer.ts +41 -0
  725. package/src/renderers/dom/host/sticky-scroll.ts +128 -0
  726. package/src/renderers/dom/host/style.ts +1 -1
  727. package/src/renderers/dom/host/surface-3d.tsx +19 -7
  728. package/src/renderers/dom/host/surface-fit.ts +406 -0
  729. package/src/renderers/dom/host/text.tsx +1 -1
  730. package/src/renderers/dom/input-host.tsx +1 -0
  731. package/src/renderers/dom/styles.css +102 -5
  732. package/src/renderers/electrobun/bun/application-menu/click.ts +18 -0
  733. package/src/renderers/electrobun/bun/index.ts +3 -2
  734. package/src/renderers/electrobun/shared/protocol.ts +1 -1
  735. package/src/renderers/electrobun/view/cli-pane-shot-entry.tsx +29 -2
  736. package/src/renderers/electrobun/view/cli-pane-shot-frame.tsx +63 -20
  737. package/src/renderers/electrobun/view/cli-pane-shot-health.ts +10 -26
  738. package/src/renderers/electrobun/view/main.tsx +5 -3
  739. package/src/renderers/electrobun/view/remote/asset-data-client.ts +2 -0
  740. package/src/renderers/opentui/chart-surface.tsx +1 -0
  741. package/src/renderers/opentui/frame-capture.ts +33 -0
  742. package/src/renderers/opentui/host.tsx +10 -13
  743. package/src/renderers/opentui/pane-image/glyphs-license.txt +107 -0
  744. package/src/renderers/opentui/pane-image/glyphs.json +1 -0
  745. package/src/renderers/opentui/pane-image/index.ts +107 -0
  746. package/src/renderers/opentui/pane-image/raster.ts +428 -0
  747. package/src/renderers/opentui/start.tsx +3 -3
  748. package/src/renderers/opentui/test-utils.tsx +3 -0
  749. package/src/renderers/opentui/ui-host.tsx +29 -1
  750. package/src/series/capability.ts +75 -0
  751. package/src/series/csv.ts +160 -0
  752. package/src/series/files.ts +107 -0
  753. package/src/series/registry.ts +198 -0
  754. package/src/series/resolve.ts +108 -0
  755. package/src/series/standalone.ts +48 -0
  756. package/src/series/types.ts +153 -0
  757. package/src/series/validate.ts +171 -0
  758. package/src/shares/chat.ts +34 -0
  759. package/src/shares/dialog.tsx +295 -0
  760. package/src/shares/flow.tsx +56 -0
  761. package/src/shares/live.ts +14 -22
  762. package/src/shares/pane-image.ts +152 -0
  763. package/src/shares/personal-pane.ts +64 -0
  764. package/src/shares/portable-layout.ts +4 -2
  765. package/src/shares/prepare.ts +20 -0
  766. package/src/sources/gloomberb-cloud/index.ts +109 -10
  767. package/src/sources/gloomberb-cloud/normalizers.ts +3 -0
  768. package/src/sources/gloomberb-cloud/perpetuals.ts +249 -0
  769. package/src/sources/history-result.ts +1 -0
  770. package/src/sources/history-retention.ts +11 -0
  771. package/src/sources/listing-symbols.ts +4 -1
  772. package/src/sources/listing-target.ts +4 -0
  773. package/src/sources/provider-router/batches.ts +4 -1
  774. package/src/sources/provider-router/cache.ts +4 -2
  775. package/src/sources/provider-router/cached-routes.ts +1 -1
  776. package/src/sources/provider-router/financial-routes.ts +1 -0
  777. package/src/sources/provider-router/financials.ts +13 -0
  778. package/src/sources/provider-router/history.ts +43 -25
  779. package/src/sources/provider-router/index.ts +14 -0
  780. package/src/sources/provider-router/search.ts +1 -0
  781. package/src/state/hooks/inline-tickers.ts +49 -11
  782. package/src/sync/core-contributors.ts +1 -0
  783. package/src/test-support/shell-pane-keys.tsx +1 -0
  784. package/src/theme/theme-context.tsx +15 -1
  785. package/src/tickers/company-name.ts +75 -0
  786. package/src/tickers/instrument-kind.ts +34 -1
  787. package/src/tickers/listing-name.ts +34 -0
  788. package/src/tickers/listing-venues.ts +132 -0
  789. package/src/tickers/open-target.ts +13 -4
  790. package/src/tickers/perpetual-listing.ts +151 -0
  791. package/src/tickers/prediction-listing.ts +26 -0
  792. package/src/tickers/search/index.ts +72 -11
  793. package/src/tickers/search/ranking.ts +98 -20
  794. package/src/tickers/search/types.ts +7 -1
  795. package/src/tickers/ticker-changes.ts +213 -0
  796. package/src/tickers/us-listing.ts +34 -0
  797. package/src/time-series/economic.ts +2 -6
  798. package/src/time-series/hooks.ts +9 -0
  799. package/src/time-series/ice-credit.ts +39 -0
  800. package/src/time-series/resolve.ts +211 -29
  801. package/src/time-series/studies.ts +1 -0
  802. package/src/time-series/types.ts +12 -2
  803. package/src/time-series/use-chart-resolution.ts +32 -0
  804. package/src/types/config.ts +10 -2
  805. package/src/types/data-provider.ts +11 -0
  806. package/src/types/financials.ts +62 -1
  807. package/src/types/headless.ts +113 -0
  808. package/src/types/instrument.ts +4 -0
  809. package/src/types/plugin.ts +52 -2
  810. package/src/types/price-history.ts +7 -0
  811. package/src/types/ticker-changes.ts +26 -0
  812. package/src/types/ticker.ts +14 -0
  813. package/src/ui/context-menu.tsx +13 -1
  814. package/src/ui/host.tsx +57 -3
  815. package/src/ui/live-resize.ts +91 -0
  816. package/src/ui/live-stretch.ts +153 -0
  817. package/src/ui/measured-cells.ts +58 -0
  818. package/src/ui/sticky-scroll.ts +7 -0
  819. package/src/utils/basis-points.ts +17 -0
  820. package/src/utils/central-banks.ts +76 -0
  821. package/src/utils/cli-output.ts +131 -15
  822. package/src/utils/concurrency.ts +25 -0
  823. package/src/utils/crypto-pair.ts +20 -0
  824. package/src/utils/currency-pair.ts +19 -0
  825. package/src/utils/currency-units.ts +11 -0
  826. package/src/utils/datetime-format.ts +27 -6
  827. package/src/utils/decimal-comma.ts +19 -0
  828. package/src/utils/dom-screenshot-css.ts +265 -0
  829. package/src/utils/dom-screenshot-rasters.ts +276 -0
  830. package/src/utils/dom-screenshot.ts +439 -52
  831. package/src/utils/double-escape-close.ts +15 -1
  832. package/src/utils/exchange-rate-snapshot.ts +6 -2
  833. package/src/utils/exchanges.ts +143 -1
  834. package/src/utils/format.ts +35 -5
  835. package/src/utils/forward-dividend.ts +14 -0
  836. package/src/utils/fundamentals.ts +66 -0
  837. package/src/utils/futures-generic.ts +6 -12
  838. package/src/utils/fx-market-hours.ts +15 -5
  839. package/src/utils/fx-status.ts +6 -1
  840. package/src/utils/inline-content-tokenizer.ts +22 -3
  841. package/src/utils/market-capitalization.ts +8 -0
  842. package/src/utils/one-shot.ts +73 -0
  843. package/src/utils/options.ts +37 -8
  844. package/src/utils/price-history.ts +99 -42
  845. package/src/utils/sec-eps-basis.ts +24 -11
  846. package/src/utils/sec.ts +61 -7
  847. package/src/utils/utc-time.ts +63 -4
  848. package/src/plugins/builtin/fx-matrix/freshness.ts +0 -65
  849. /package/src/plugins/{builtin/plugin-marketplace → marketplace}/activation.ts +0 -0
  850. /package/src/plugins/{builtin/plugin-marketplace → marketplace}/ids.ts +0 -0
  851. /package/src/plugins/{builtin/plugin-marketplace → marketplace}/packs.ts +0 -0
  852. /package/src/{plugins/builtin/cloud → tickers}/starter-symbols.ts +0 -0
@@ -18,15 +18,44 @@ export interface WorldMapViewport {
18
18
  centerLatitude: number;
19
19
  }
20
20
 
21
- const MAX_LATITUDE = 85;
22
- const MIN_LATITUDE = -60;
21
+ /** The map's northern and southern edges; the land data is cut at the south one. */
22
+ export const MAX_LATITUDE = 80;
23
+ export const MIN_LATITUDE = -60;
23
24
  const LONGITUDE_SPAN = 360;
24
- export const MAX_WORLD_MAP_ZOOM = 18;
25
+ /** The most the map zooms in a narrow pane: 4,096 times the world. A wider pane stops sooner, at a pixel density (see map.tsx). */
26
+ export const MAX_WORLD_MAP_ZOOM = 4096;
27
+
28
+ /** Web Mercator stops here, where the projection runs to infinity. */
29
+ const MERCATOR_LIMIT = 85.0511287798;
30
+
31
+ /**
32
+ * Where a latitude falls on the map's vertical axis: Mercator, in degrees of
33
+ * longitude at the equator, so one unit north is one unit east wherever the
34
+ * point is. That keeps a country's proportions at every latitude, as on any
35
+ * web map. Plain latitude would stretch everything sideways by 1/cos(latitude):
36
+ * France drew about 1.4 times wider than it is tall.
37
+ */
38
+ export function mercatorY(latitude: number): number {
39
+ const radians = (clamp(latitude, -MERCATOR_LIMIT, MERCATOR_LIMIT) * Math.PI) / 180;
40
+ return (Math.log(Math.tan(Math.PI / 4 + radians / 2)) * 180) / Math.PI;
41
+ }
42
+
43
+ /** The latitude at a Mercator `y`, the inverse of {@link mercatorY}. */
44
+ function latitudeAtMercatorY(y: number): number {
45
+ return (Math.atan(Math.exp((y * Math.PI) / 180)) * 360) / Math.PI - 90;
46
+ }
47
+
48
+ const MERCATOR_TOP = mercatorY(MAX_LATITUDE);
49
+ const MERCATOR_BOTTOM = mercatorY(MIN_LATITUDE);
50
+ const MERCATOR_SPAN = MERCATOR_TOP - MERCATOR_BOTTOM;
51
+
52
+ /** The whole map's height over its width, for a pane that sizes itself to the world. */
53
+ export const WORLD_MAP_HEIGHT_RATIO = MERCATOR_SPAN / LONGITUDE_SPAN;
25
54
 
26
55
  export const DEFAULT_WORLD_MAP_VIEWPORT: WorldMapViewport = {
27
56
  zoom: 1,
28
57
  centerLongitude: 0,
29
- centerLatitude: (MAX_LATITUDE + MIN_LATITUDE) / 2,
58
+ centerLatitude: latitudeAtMercatorY((MERCATOR_TOP + MERCATOR_BOTTOM) / 2),
30
59
  };
31
60
 
32
61
  function mapExtent(width: number, height: number, yUnitAspect = 1) {
@@ -34,13 +63,21 @@ function mapExtent(width: number, height: number, yUnitAspect = 1) {
34
63
  const availableHeight = Math.max(height - 1, 0);
35
64
  const unitAspect = Math.max(yUnitAspect, Number.EPSILON);
36
65
  const effectiveHeight = availableHeight * unitAspect;
37
- const latitudeSpan = MAX_LATITUDE - MIN_LATITUDE;
38
- return { availableWidth, availableHeight, unitAspect, effectiveHeight, latitudeSpan };
66
+ return { availableWidth, availableHeight, unitAspect, effectiveHeight, mercatorSpan: MERCATOR_SPAN };
39
67
  }
40
68
 
41
69
  function fittedWorldMapScale(width: number, height: number, yUnitAspect = 1): number {
42
- const { availableWidth, effectiveHeight, latitudeSpan } = mapExtent(width, height, yUnitAspect);
43
- return Math.min(availableWidth / LONGITUDE_SPAN, effectiveHeight / latitudeSpan);
70
+ const { availableWidth, effectiveHeight, mercatorSpan } = mapExtent(width, height, yUnitAspect);
71
+ return Math.min(availableWidth / LONGITUDE_SPAN, effectiveHeight / mercatorSpan);
72
+ }
73
+
74
+ /**
75
+ * The zoom at which the map draws `unitsPerDegree` view units to each degree of
76
+ * longitude, so a ceiling set in screen pixels follows the size of the pane.
77
+ */
78
+ export function zoomForDegreeScale(unitsPerDegree: number, width: number, height: number, yUnitAspect = 1): number {
79
+ const fit = fittedWorldMapScale(width, height, yUnitAspect);
80
+ return fit > 0 ? unitsPerDegree / fit : Number.POSITIVE_INFINITY;
44
81
  }
45
82
 
46
83
  function worldMapScale(
@@ -62,11 +99,11 @@ export function projectWorldPoint(
62
99
  ): WorldMapPoint {
63
100
  const { availableWidth, unitAspect, effectiveHeight } = mapExtent(width, height, yUnitAspect);
64
101
  const scale = worldMapScale(width, height, yUnitAspect, viewport);
65
- const clampedLatitude = clamp(latitude, MIN_LATITUDE, MAX_LATITUDE);
102
+ const northing = mercatorY(clamp(latitude, MIN_LATITUDE, MAX_LATITUDE)) - mercatorY(viewport.centerLatitude);
66
103
 
67
104
  return {
68
105
  x: availableWidth / 2 + (longitude - viewport.centerLongitude) * scale,
69
- y: (effectiveHeight / 2 - (clampedLatitude - viewport.centerLatitude) * scale) / unitAspect,
106
+ y: (effectiveHeight / 2 - northing * scale) / unitAspect,
70
107
  };
71
108
  }
72
109
 
@@ -82,7 +119,7 @@ export function unprojectWorldPoint(
82
119
  const scale = worldMapScale(width, height, yUnitAspect, viewport);
83
120
  return {
84
121
  longitude: viewport.centerLongitude + (x - availableWidth / 2) / scale,
85
- latitude: viewport.centerLatitude - (y * unitAspect - effectiveHeight / 2) / scale,
122
+ latitude: latitudeAtMercatorY(mercatorY(viewport.centerLatitude) - (y * unitAspect - effectiveHeight / 2) / scale),
86
123
  };
87
124
  }
88
125
 
@@ -96,25 +133,25 @@ export function clampWorldMapViewport(
96
133
  const zoom = clamp(viewport.zoom, 1, maxZoom);
97
134
  if (zoom <= 1) return DEFAULT_WORLD_MAP_VIEWPORT;
98
135
 
99
- const { availableWidth, effectiveHeight, latitudeSpan } = mapExtent(width, height, yUnitAspect);
136
+ const { availableWidth, effectiveHeight, mercatorSpan } = mapExtent(width, height, yUnitAspect);
100
137
  // A plot with no area yet (a pane mid-layout) says nothing about what fits:
101
138
  // keep the centre rather than resetting it to the middle of the world.
102
139
  if (availableWidth <= 0 || effectiveHeight <= 0) return { ...viewport, zoom };
103
140
  const scale = fittedWorldMapScale(width, height, yUnitAspect) * zoom;
104
141
  const halfLongitude = availableWidth / (2 * scale);
105
- const halfLatitude = effectiveHeight / (2 * scale);
142
+ const halfNorthing = effectiveHeight / (2 * scale);
106
143
  const minLongitude = -180 + halfLongitude;
107
144
  const maxLongitude = 180 - halfLongitude;
108
- const minLatitude = MIN_LATITUDE + halfLatitude;
109
- const maxLatitude = MAX_LATITUDE - halfLatitude;
145
+ const minNorthing = MERCATOR_BOTTOM + halfNorthing;
146
+ const maxNorthing = MERCATOR_TOP - halfNorthing;
110
147
 
111
148
  return {
112
149
  zoom,
113
150
  centerLongitude: minLongitude < maxLongitude
114
151
  ? clamp(viewport.centerLongitude, minLongitude, maxLongitude)
115
152
  : DEFAULT_WORLD_MAP_VIEWPORT.centerLongitude,
116
- centerLatitude: halfLatitude < latitudeSpan / 2
117
- ? clamp(viewport.centerLatitude, minLatitude, maxLatitude)
153
+ centerLatitude: halfNorthing < mercatorSpan / 2
154
+ ? latitudeAtMercatorY(clamp(mercatorY(viewport.centerLatitude), minNorthing, maxNorthing))
118
155
  : DEFAULT_WORLD_MAP_VIEWPORT.centerLatitude,
119
156
  };
120
157
  }
@@ -150,7 +187,7 @@ export function zoomWorldMapViewport(
150
187
  return clampWorldMapViewport({
151
188
  zoom: nextZoom,
152
189
  centerLongitude: geographic.longitude - (point.x - availableWidth / 2) / scale,
153
- centerLatitude: geographic.latitude + (point.y * unitAspect - effectiveHeight / 2) / scale,
190
+ centerLatitude: latitudeAtMercatorY(mercatorY(geographic.latitude) + (point.y * unitAspect - effectiveHeight / 2) / scale),
154
191
  }, width, height, yUnitAspect, maxZoom);
155
192
  }
156
193
 
@@ -169,7 +206,7 @@ export function panWorldMapViewport(
169
206
  return clampWorldMapViewport({
170
207
  zoom: viewport.zoom,
171
208
  centerLongitude: viewport.centerLongitude - deltaX / scale,
172
- centerLatitude: viewport.centerLatitude + (deltaY * unitAspect) / scale,
209
+ centerLatitude: latitudeAtMercatorY(mercatorY(viewport.centerLatitude) + (deltaY * unitAspect) / scale),
173
210
  }, width, height, yUnitAspect, maxZoom);
174
211
  }
175
212
 
@@ -25,7 +25,7 @@ import { loadWorldVenues } from "./client";
25
25
  import { WORLD_VENUE_MAP_PANE_ID } from "./ids";
26
26
  import { LayeredMapView } from "./layered-pane";
27
27
  import { activeLayerTokens, isPlainMap, LAYERS_SETTING_KEY, resolveActiveLayers, VENUES_SETTING_KEY } from "./layers";
28
- import { WorldVenueMap } from "./map";
28
+ import { useMapKeyboard, WorldVenueMap } from "./map";
29
29
  import { filterWorldVenues, formatVenueLocalTime } from "./model";
30
30
  import { useGeoCatalog } from "./use-geo";
31
31
  import { SelectedVenueHeader } from "./venue-header";
@@ -72,6 +72,7 @@ function VenueMapView({ focused, width, height }: PaneProps) {
72
72
  const { data, loading, error, load } = useAsyncResource(loadWorldVenues);
73
73
  const [query, setQuery] = useState("");
74
74
  const { active: searchFocused, focus: focusSearch, searchProps } = useQueryBarSearch();
75
+ const mapKeys = useMapKeyboard(searchFocused);
75
76
  const [selectedMic, setSelectedMic] = useState<string | null>(null);
76
77
  const [now, setNow] = useState(Date.now());
77
78
 
@@ -182,7 +183,8 @@ function VenueMapView({ focused, width, height }: PaneProps) {
182
183
 
183
184
  const table = (
184
185
  <DataTableView<CloudWorldVenuePayload, VenueColumn>
185
- focused={focused && !searchFocused}
186
+ focused={focused && !searchFocused && !mapKeys.active}
187
+ onTableMouseDown={mapKeys.release}
186
188
  selection={{
187
189
  kind: "id",
188
190
  selectedId: selectedMic,
@@ -222,6 +224,7 @@ function VenueMapView({ focused, width, height }: PaneProps) {
222
224
  onSelect={(venue) => setSelectedMic(venue.mic)}
223
225
  savedViewport={savedViewport}
224
226
  onViewportSettled={setSavedViewport}
227
+ keyboard={mapKeys.keyboard}
225
228
  />
226
229
  </Box>
227
230
  );
@@ -1,4 +1,5 @@
1
1
  import type { CurveSeries } from "../../../components/chart/curve";
2
+ import { formatBasisPoints } from "../../../utils/basis-points";
2
3
  import type { CurveNode } from "./forward";
3
4
  import type { YieldCurveLookbackId } from "./history";
4
5
  import { curveAsOf, curveSpread, isYieldObservationDate, type YieldPoint } from "./treasury-data";
@@ -9,8 +10,7 @@ export function formatYield(value: number): string {
9
10
 
10
11
  /** A yield change in percentage points, read in basis points: `+7bp`, `-12bp`. */
11
12
  export function formatYieldChange(change: number): string {
12
- const bp = Math.round(change * 100);
13
- return `${bp > 0 ? "+" : ""}${bp === 0 ? 0 : bp}bp`;
13
+ return formatBasisPoints(change);
14
14
  }
15
15
 
16
16
  export function buildYieldCurveSeries(points: readonly YieldPoint[]): CurveSeries {
@@ -140,29 +140,42 @@ export async function loadComparePoints(curve: CurveId, date: string, client: Cu
140
140
  }
141
141
  }
142
142
 
143
- const RELATIVE = /^(\d{1,2})([WMY])$/i;
143
+ const RELATIVE = /^(\d{1,2})([DWMY])$/i;
144
+ const COMPARE_HELP = "Compare with a date in YYYY-MM-DD format or a span such as 1D, 1W, 3M or 1Y.";
145
+
146
+ /** A span back from the session (1D, 1W, 3M, 1Y): what the compare field takes besides a date. */
147
+ export function isCompareSpan(value: string): boolean {
148
+ const match = value.trim().match(RELATIVE);
149
+ return match != null && Number(match[1]) > 0;
150
+ }
144
151
 
145
152
  /**
146
153
  * What the compare field accepts: a date, or a span back from the curve's
147
- * session (1W, 3M, 1Y). Empty turns comparing off.
154
+ * session (1D, 1W, 3M, 1Y). Empty turns comparing off. Anything else gets the
155
+ * help for both forms, not the as-of field's date-only message.
148
156
  */
149
157
  export function parseCompareInput(value: string, now = new Date()): string {
150
158
  const text = value.trim();
151
159
  if (!text) return "";
152
- if (RELATIVE.test(text)) return text.toUpperCase();
153
- const date = yieldCurveDate(text, now);
154
- if (!date) throw new Error("Compare with a date in YYYY-MM-DD format or a span such as 1W, 3M or 1Y.");
155
- return date;
160
+ if (isCompareSpan(text)) return text.toUpperCase();
161
+ if (!isYieldObservationDate(text)) throw new Error(COMPARE_HELP);
162
+ return yieldCurveDate(text, now);
156
163
  }
157
164
 
158
- /** The date a compare input asks for, given the session shown. */
165
+ /**
166
+ * The date a compare input asks for, given the session shown. A day back is the
167
+ * day before, and the curve loaded for it is the last session on or before
168
+ * that day, so 1D is the previous session.
169
+ */
159
170
  export function compareDate(input: string, asOf: string): string {
160
171
  const match = input.match(RELATIVE);
161
172
  if (!match) return input;
162
173
  const count = Number(match[1]);
163
174
  const unit = match[2]!.toUpperCase();
164
175
  const [year, month, day] = asOf.split("-").map(Number) as [number, number, number];
165
- if (unit === "W") return new Date(Date.UTC(year, month - 1, day - 7 * count)).toISOString().slice(0, 10);
176
+ if (unit === "D" || unit === "W") {
177
+ return new Date(Date.UTC(year, month - 1, day - (unit === "W" ? 7 : 1) * count)).toISOString().slice(0, 10);
178
+ }
166
179
  const months = unit === "M" ? count : count * 12;
167
180
  const target = new Date(Date.UTC(year, month - 1 - months, 1));
168
181
  const lastDay = new Date(Date.UTC(target.getUTCFullYear(), target.getUTCMonth() + 1, 0)).getUTCDate();
@@ -6,13 +6,16 @@ import {
6
6
  compareDate, CURVE_OPTIONS, curveIdOf, curveOption, curveSpreadFigures, loadComparePoints, loadCurveData, parseCompareInput,
7
7
  parseCurveArgument, type CurveData, type CurveId,
8
8
  } from "./curves";
9
+ import { yieldTenorRows, type YieldLookbackCurves } from "./chart";
9
10
  import { curveAsOf, type YieldPoint, yieldCurveErrors } from "./treasury-data";
10
- import { yieldCurveDate } from "./history";
11
+ import { loadYieldCurveLookbacks, yieldCurveDate } from "./history";
11
12
  import { loadWorldRows, type WorldRow } from "./world";
13
+ import { formatBasisPoints, toBasisPoints } from "../../../utils/basis-points";
12
14
 
13
15
  const percent = (value: unknown) => value == null ? "-" : `${Number(value).toFixed(2)}%`;
14
- const basisPoints = (value: unknown) => value == null ? "-" : `${Number(value) > 0 ? "+" : ""}${Math.round(Number(value))}bp`;
15
- const COLUMNS = [
16
+ /** A move already in basis points: `+3bp`, `-1bp`, `0bp`. */
17
+ const basisPoints = (value: unknown) => value == null ? "-" : formatBasisPoints(Number(value) / 100);
18
+ const MATURITY_COLUMNS = [
16
19
  { key: "maturity", header: "Maturity" },
17
20
  {
18
21
  key: "maturityYears",
@@ -21,11 +24,19 @@ const COLUMNS = [
21
24
  format: (value: unknown) => Number(value).toFixed(2).replace(/\.00$/, ""),
22
25
  },
23
26
  { key: "yield", header: "Yield", align: "right" as const, format: percent },
24
- { key: "asOf", header: "As of" },
25
27
  ];
26
- const COMPARE_COLUMNS = [
27
- ...COLUMNS,
28
- { key: "compare", header: "Compare", align: "right" as const, format: percent },
28
+ const AS_OF_COLUMN = { key: "asOf", header: "As of" };
29
+ /** The move since the previous session with a yield, per tenor. */
30
+ const COLUMNS = [
31
+ ...MATURITY_COLUMNS,
32
+ { key: "change1dBasisPoints", header: "1D bp", align: "right" as const, format: basisPoints },
33
+ AS_OF_COLUMN,
34
+ ];
35
+ /** Both curves and the difference; the compare curve's own session heads its column, as it may be a day or a year back. */
36
+ const compareColumns = (compareAsOf: string | null) => [
37
+ ...MATURITY_COLUMNS,
38
+ AS_OF_COLUMN,
39
+ { key: "compare", header: compareAsOf ? `vs ${compareAsOf}` : "Compare", align: "right" as const, format: percent },
29
40
  { key: "changeBasisPoints", header: "Chg bp", align: "right" as const, format: basisPoints },
30
41
  ];
31
42
  const WORLD_COLUMNS = [
@@ -41,12 +52,18 @@ const WORLD_COLUMNS = [
41
52
  export interface YieldCurveHeadlessDependencies {
42
53
  load(curve: CurveId, requestedDate: string, context: HeadlessPaneContext): Promise<CurveData>;
43
54
  compare?(curve: CurveId, date: string, context: HeadlessPaneContext): Promise<YieldPoint[]>;
55
+ /** The 1D, 1W and 1M curves of a session, for a curve loaded without them (the FRED fallback). */
56
+ lookbacks?(session: string, context: HeadlessPaneContext): Promise<YieldLookbackCurves>;
44
57
  world?(context: HeadlessPaneContext): Promise<WorldRow[]>;
45
58
  }
46
59
 
47
60
  const defaultDependencies: Required<YieldCurveHeadlessDependencies> = {
48
61
  load: (curve, requestedDate, context) => loadCurveData(curve, requestedDate, context.apiClient),
49
62
  compare: (curve, date, context) => loadComparePoints(curve, date, context.apiClient),
63
+ lookbacks: async (session, context) => Object.fromEntries(
64
+ (await loadYieldCurveLookbacks(session, (id, options) => context.apiClient.getCloudFredSeries(id, options)))
65
+ .map((lookback) => [lookback.id, lookback.points]),
66
+ ),
50
67
  world: (context) => loadWorldRows(context.apiClient),
51
68
  };
52
69
 
@@ -64,10 +81,23 @@ const CURVE_PUBLISHERS: Record<CurveId, string> = {
64
81
  ca: "Bank of Canada",
65
82
  };
66
83
 
84
+ /** Whose business days each curve's dates are, so a report names the day it means. */
85
+ const CURVE_MARKETS: Record<CurveId, string> = {
86
+ us: "US",
87
+ "us-real": "US",
88
+ "us-breakeven": "US",
89
+ "eu-aaa": "Euro area",
90
+ de: "Germany",
91
+ gb: "UK",
92
+ jp: "Japan",
93
+ ca: "Canada",
94
+ };
95
+
67
96
  export function createYieldCurveHeadless(
68
97
  dependencies: YieldCurveHeadlessDependencies = defaultDependencies,
69
98
  ): HeadlessPaneDefinition<"rows"> {
70
99
  const loadCompare = dependencies.compare ?? defaultDependencies.compare;
100
+ const loadLookbacks = dependencies.lookbacks ?? defaultDependencies.lookbacks;
71
101
  const loadWorld = dependencies.world ?? defaultDependencies.world;
72
102
  return {
73
103
  shape: "rows",
@@ -76,7 +106,7 @@ export function createYieldCurveHeadless(
76
106
  options: [
77
107
  { key: "date", type: "string", description: "Historical as-of date (YYYY-MM-DD); uses the latest session on or before it." },
78
108
  { key: "curve", type: "string", description: "ust (default), tips, breakeven, euro, bund, gilt, jgb or canada." },
79
- { key: "compare", type: "string", description: "Compare with a date (YYYY-MM-DD) or a span back from the curve's session (1W, 3M, 1Y)." },
109
+ { key: "compare", type: "string", description: "Compare with a date (YYYY-MM-DD) or a span back from the curve's session (1D, 1W, 1M, 3M, 1Y)." },
80
110
  { key: "view", type: "enum", values: [{ value: "curve" }, { value: "difference", aliases: ["diff"] }],
81
111
  description: "With a compare date: both curves, or the bp change by tenor as bars.",
82
112
  pluginState: { pluginId: "macro", key: "yield-curve:view" } },
@@ -87,7 +117,16 @@ export function createYieldCurveHeadless(
87
117
  pluginState: { pluginId: "macro", key: "yield-curve:tab" } },
88
118
  ],
89
119
  columns: COLUMNS,
90
- describe: "Yield Curves",
120
+ // The title names the curve, as the pane's Curve select does.
121
+ describe: (args) => {
122
+ if (args.options.tab === "world") return "Yield Curves | World";
123
+ try {
124
+ const curve = curveIdOf(args.options.curve) ?? parseCurveArgument(args.argument).curve ?? "us";
125
+ return `Yield Curves | ${curveOption(curve).label}`;
126
+ } catch {
127
+ return "Yield Curves";
128
+ }
129
+ },
91
130
  async load(args, context) {
92
131
  if (args.options.tab === "world") {
93
132
  const rows = await loadWorld(context);
@@ -111,26 +150,40 @@ export function createYieldCurveHeadless(
111
150
  const points = data.points;
112
151
  const session = curveAsOf(points);
113
152
  const comparePoints = compareInput && session ? await loadCompare(curve, compareDate(compareInput, session), context) : null;
153
+ const compareAsOf = comparePoints ? curveAsOf(comparePoints) : null;
114
154
  const compareAt = (maturity: string) => comparePoints?.find((point) => point.maturity === maturity)?.yield ?? null;
155
+ // The stored curve brings its look-backs; the FRED fallback's load after it, and a failure leaves the move blank.
156
+ const lookbacks = data.lookbacks ?? (session ? await loadLookbacks(session, context).catch(() => ({})) : {});
157
+ const change1d = new Map(yieldTenorRows(points, lookbacks).map((row) => [row.id, row.change1d]));
115
158
  const rows = [...points].sort((a, b) => a.maturityYears - b.maturityYears);
116
- const missingTenors = points.filter((point) => point.yield == null).map((point) => point.maturity);
117
- const spreads = curveSpreadFigures(data, data.lookbacks ?? {});
159
+ const missing = points.filter((point) => point.yield == null);
160
+ const missingTenors = missing.map((point) => point.maturity);
161
+ // On a past date a tenor the publisher has no yield for was most likely not issued yet: a note, not an error.
162
+ const notIssued = requestedDate && missing.length < points.length ? missing.filter((point) => !point.error).map((point) => point.maturity) : [];
163
+ const unavailable = missingTenors.filter((maturity) => !notIssued.includes(maturity));
164
+ const spreads = curveSpreadFigures(data, lookbacks);
118
165
  const spread = (id: string) => bp(spreads.find((entry) => entry.id === id)?.value ?? null);
119
166
  const twosTens = spread("2s10s");
120
167
  return {
121
168
  // Each curve is its official publisher's daily close; a past date is a historical curve, not a feed.
122
- freshness: { source: CURVE_PUBLISHERS[curve], status: "not-a-feed",
169
+ freshness: { source: CURVE_PUBLISHERS[curve], status: "not-a-feed", tradingDayMarket: CURVE_MARKETS[curve],
123
170
  ...(requestedDate ? { basis: "historical curve" } : { basis: "daily curve", cadence: "daily" }) },
124
- ...(comparePoints ? { columns: COMPARE_COLUMNS } : {}),
171
+ ...(comparePoints ? { columns: compareColumns(compareAsOf) } : {}),
125
172
  rows: rows.map((point) => {
126
173
  const compare = compareAt(point.maturity);
127
- return comparePoints
128
- ? { ...point, compare, changeBasisPoints: point.yield != null && compare != null ? (point.yield - compare) * 100 : null }
129
- : { ...point };
174
+ const change = change1d.get(point.maturity) ?? null;
175
+ return {
176
+ ...point,
177
+ change1dBasisPoints: change == null ? null : toBasisPoints(change, 1),
178
+ ...(comparePoints
179
+ ? { compare, changeBasisPoints: point.yield != null && compare != null ? (point.yield - compare) * 100 : null }
180
+ : {}),
181
+ };
130
182
  }),
183
+ ...(notIssued.length ? { notes: [`Not issued then: ${notIssued.join(", ")}`] } : {}),
131
184
  errors: [
132
185
  ...yieldCurveErrors(points),
133
- ...(missingTenors.length ? [`Tenors unavailable: ${missingTenors.join(", ")}`] : []),
186
+ ...(unavailable.length ? [`Tenors unavailable: ${unavailable.join(", ")}`] : []),
134
187
  ...(!session ? ["Curve has mixed or unknown observation dates."] : []),
135
188
  ...(points.some((point) => point.stale) ? ["Some Treasury sources are stale cached data."] : []),
136
189
  ],
@@ -140,7 +193,7 @@ export function createYieldCurveHeadless(
140
193
  units: "Percent",
141
194
  requestedDate: requestedDate || null,
142
195
  asOf: session,
143
- ...(comparePoints ? { compareAsOf: curveAsOf(comparePoints) } : {}),
196
+ ...(comparePoints ? { compare: compareInput, compareAsOf } : {}),
144
197
  inverted: twosTens == null ? null : twosTens < 0,
145
198
  spread2Y10YBasisPoints: twosTens,
146
199
  spread3M10YBasisPoints: spread("3m10y"),
@@ -15,6 +15,7 @@ import { useThemeColors } from "../../../theme/theme-context";
15
15
  import type { PaneProps } from "../../../types/plugin";
16
16
  import { Box, type InputRenderable } from "../../../ui";
17
17
  import type { PluginModule } from "../plugin-module";
18
+ import { GOVERNMENT_BOND_SERIES, TREASURY_SERIES } from "./series";
18
19
  import { useAutoRefresh } from "../../../react/auto-refresh";
19
20
  import { usePaneStatusFooter } from "../../../components/layout/pane/status-footer";
20
21
  import { formatPercentileRank } from "../../../utils/format";
@@ -59,7 +60,7 @@ const AS_OF_COLUMN: DataTableColumn = { id: "asOf", label: "As of", width: 12, a
59
60
  const tenorKey = (row: YieldTenorRow) => row.id;
60
61
  // Left and Right step along the maturities, the way the curve reads.
61
62
  const tenorPosition = (row: YieldTenorRow) => new Date(row.years * 86_400_000);
62
- const RELATIVE_COMPARE = /^\d+[WMY]$/;
63
+ const RELATIVE_COMPARE = /^\d+[DWMY]$/;
63
64
  /** A difference in basis points: `+7bp`, `-12bp`. */
64
65
  const formatBp = (value: number) => {
65
66
  const bp = Math.round(value);
@@ -328,7 +329,7 @@ function CurveTab({ curve, onCurveChange, focused, width, height }: {
328
329
  onChange: setShowForward }] : []),
329
330
  ]}
330
331
  // The session actually shown; a requested date the field already shows is not repeated.
331
- meta={asOf && asOf !== requestedDate ? `as of ${asOf}` : undefined}
332
+ asOf={asOf && asOf !== requestedDate ? `as of ${asOf}` : undefined}
332
333
  />
333
334
  );
334
335
  // The query bar stays above the status body so the curve or date can change
@@ -438,6 +439,7 @@ function WorldTab({ onOpen, focused, width, height }: {
438
439
  }
439
440
 
440
441
  export const yieldCurveModule: PluginModule = {
442
+ series: [...TREASURY_SERIES, ...GOVERNMENT_BOND_SERIES],
441
443
  panes: [{
442
444
  id: "yield-curve",
443
445
  name: "Yield Curves",
@@ -0,0 +1,86 @@
1
+ import { apiClient } from "../../../api-client";
2
+ import type { CloudCurveId } from "../../../api-client/yield-curves";
3
+ import { fredSeriesUrl } from "../../../sources/gloomberb-cloud/fred-series";
4
+ import type { SeriesDefinition } from "../../../series/types";
5
+ import { unavailableOnServer } from "../shared/cloud-resource";
6
+ import { TREASURY_MATURITIES } from "./treasury-data";
7
+
8
+ /** Each Treasury constant maturity the curve draws, as `UST:10Y`. */
9
+ export const TREASURY_SERIES: readonly SeriesDefinition[] = TREASURY_MATURITIES.map((entry) => ({
10
+ id: `ust:${entry.maturity}`,
11
+ name: `${entry.maturity} Treasury yield`,
12
+ unit: "%",
13
+ frequency: "daily",
14
+ group: "Rates",
15
+ tags: ["treasury", "yield curve", entry.seriesId],
16
+ publisher: "FRED",
17
+ url: fredSeriesUrl(entry.seriesId),
18
+ expression: `UST:${entry.maturity}`,
19
+ }));
20
+
21
+ /** The government curves stored beside the Treasury's, with the tenors each publisher prints. */
22
+ const CURVES: ReadonlyArray<{
23
+ curve: CloudCurveId;
24
+ name: (tenor: string) => string;
25
+ publisher: string;
26
+ tags: readonly string[];
27
+ tenors: readonly string[];
28
+ }> = [
29
+ {
30
+ curve: "de", publisher: "Bundesbank", tags: ["Germany", "Bund", "euro"],
31
+ name: (tenor) => `Germany ${tenor} Bund yield`,
32
+ tenors: ["1Y", "2Y", "3Y", "4Y", "5Y", "6Y", "7Y", "8Y", "9Y", "10Y", "15Y", "20Y", "25Y", "30Y"],
33
+ },
34
+ {
35
+ curve: "gb", publisher: "Bank of England", tags: ["UK", "gilt", "sterling", "zero coupon"],
36
+ name: (tenor) => `UK ${tenor} gilt yield (zero coupon)`,
37
+ tenors: ["6M", "1Y", "2Y", "3Y", "4Y", "5Y", "7Y", "10Y", "15Y", "20Y", "25Y", "30Y", "40Y"],
38
+ },
39
+ {
40
+ curve: "jp", publisher: "Japan Ministry of Finance", tags: ["Japan", "JGB", "yen"],
41
+ name: (tenor) => `Japan ${tenor} JGB yield`,
42
+ tenors: ["1Y", "2Y", "3Y", "4Y", "5Y", "6Y", "7Y", "8Y", "9Y", "10Y", "15Y", "20Y", "25Y", "30Y", "40Y"],
43
+ },
44
+ {
45
+ curve: "ca", publisher: "Bank of Canada", tags: ["Canada", "benchmark"],
46
+ name: (tenor) => `Canada ${tenor} benchmark yield`,
47
+ tenors: ["1M", "3M", "6M", "1Y", "2Y", "3Y", "5Y", "7Y", "10Y", "30Y"],
48
+ },
49
+ {
50
+ curve: "eu-aaa", publisher: "ECB", tags: ["euro area", "AAA", "euro"],
51
+ name: (tenor) => `Euro area AAA ${tenor} yield`,
52
+ tenors: ["3M", "6M", "1Y", "2Y", "3Y", "5Y", "7Y", "10Y", "15Y", "20Y", "30Y"],
53
+ },
54
+ {
55
+ // FRED lists the 5Y and 10Y; the curve has the rest.
56
+ curve: "us-real", publisher: "U.S. Treasury", tags: ["TIPS", "real yield", "treasury"],
57
+ name: (tenor) => `${tenor} TIPS real yield`,
58
+ tenors: ["7Y", "20Y", "30Y"],
59
+ },
60
+ {
61
+ curve: "us-breakeven", publisher: "U.S. Treasury", tags: ["breakeven", "inflation expectations", "treasury"],
62
+ name: (tenor) => `${tenor} breakeven inflation (nominal less TIPS)`,
63
+ tenors: ["7Y", "20Y", "30Y"],
64
+ },
65
+ ];
66
+
67
+ /** Each tenor of each government curve the yield curve pane draws, over time. */
68
+ export const GOVERNMENT_BOND_SERIES: readonly SeriesDefinition[] = CURVES.flatMap(({ curve, name, publisher, tags, tenors }) => (
69
+ tenors.map((tenor): SeriesDefinition => ({
70
+ id: `bond-yield:${curve}-${tenor.toLowerCase()}`,
71
+ name: name(tenor),
72
+ unit: "%",
73
+ frequency: "daily",
74
+ group: "Rates",
75
+ tags: [...tags, "government bond", "yield curve", tenor],
76
+ publisher,
77
+ load: async ({ start }) => {
78
+ try {
79
+ const history = await apiClient.getCloudCurveHistory(curve, tenor, start?.toISOString().slice(0, 10));
80
+ return history.points;
81
+ } catch (error) {
82
+ throw unavailableOnServer(error, `${name(tenor)} history is not available yet.`);
83
+ }
84
+ },
85
+ }))
86
+ ));
@@ -56,6 +56,7 @@ import { cotModule } from "./builtin/cot";
56
56
  import { doeModule } from "./builtin/doe";
57
57
  import { gpuModule } from "./builtin/gpu";
58
58
  import { fxMatrixModule } from "./builtin/fx-matrix";
59
+ import { docsModule } from "./builtin/docs";
59
60
  import { helpModule } from "./builtin/help";
60
61
  import { positionSizerModule } from "./builtin/kelly-sizer";
61
62
  import { layoutManagerModule } from "./builtin/layout-manager";
@@ -113,7 +114,7 @@ import {
113
114
 
114
115
  const browserApplicationPlugin = composeBuiltinPlugin({
115
116
  ...applicationPluginMeta,
116
- modules: [layoutManagerModule, helpModule, changelogModule, connectionsModule],
117
+ modules: [layoutManagerModule, helpModule, changelogModule, connectionsModule, docsModule],
117
118
  });
118
119
 
119
120
  const browserPortfolioPlugin = composeBuiltinPlugin({
@@ -3,7 +3,7 @@ import { existsSync, lstatSync, mkdirSync, readdirSync, rmSync, symlinkSync } fr
3
3
  import { execFile as execFileCallback, execFileSync, spawn } from "child_process";
4
4
  import { promisify } from "util";
5
5
  import { findAbsorbedPlugin, type AbsorbedPlugin } from "./absorbed";
6
- import type { PluginPin } from "./builtin/plugin-marketplace/store";
6
+ import type { PluginPin } from "./marketplace/store";
7
7
  import { bunCommand } from "./dependencies";
8
8
  import { linkHostPackages, missingPeerPlugins } from "./host-link";
9
9
  import {
@@ -518,7 +518,7 @@ export interface RegistryListing {
518
518
  export async function loadRegistryListings(): Promise<Map<string, RegistryListing>> {
519
519
  const listings = new Map<string, RegistryListing>();
520
520
  try {
521
- const { loadRegistry } = await import("./builtin/plugin-marketplace/feed");
521
+ const { loadRegistry } = await import("./marketplace/feed");
522
522
  const feed = await loadRegistry();
523
523
  for (const plugin of feed.plugins) {
524
524
  if (!plugin.repo) continue;
@@ -201,6 +201,12 @@ export function pluginsMissingHostExports(): string[] {
201
201
  return [...missingHostExportFailures].sort();
202
202
  }
203
203
 
204
+ /**
205
+ * Link failures of a new entry against files this process kept from the old
206
+ * commit: an export the old file lacks, or a package that was not there.
207
+ */
208
+ const STALE_LINK_FAILURE = /Export named '[^']+' not found in module|No matching export in "[^"]+" for import|Cannot find (?:module|package) '/;
209
+
204
210
  /** Bun's wording when an import does not resolve, from a native import. */
205
211
  const UNRESOLVED_MODULE = /Cannot find (?:module|package) '([^']+)'/;
206
212
 
@@ -317,6 +323,15 @@ export async function loadExternalPlugin(
317
323
  loaderLog.info(`${directory} loads after a restart: ${message}`);
318
324
  return { ...base, plugin: placeholder, needsRestart: true };
319
325
  }
326
+ // An update that links against modules this process imported at the old
327
+ // commit, which Bun keeps until a restart. The row already asks for one,
328
+ // and the next launch imports everything fresh; a plugin that is really
329
+ // broken fails there, and is reported there. A host export the running
330
+ // Gloomberb lacks is a different failure and stays one.
331
+ if (restart.needsRestart && !findMissingHostExport(message) && STALE_LINK_FAILURE.test(message)) {
332
+ loaderLog.info(`${directory} loads after a restart: ${message}`);
333
+ return { ...base, plugin: placeholder, needsRestart: true };
334
+ }
320
335
  loaderLog.error(`Failed to load plugin from ${pluginDir}: ${err}`);
321
336
  reportCrash(err, { kind: "plugin", plugin: directory });
322
337
  if (findMissingHostExport(message)) missingHostExportFailures.add(directory);
@@ -1,5 +1,5 @@
1
1
  import { join } from "path";
2
- import type { PluginManager, PluginOperationResult } from "./builtin/plugin-marketplace/store";
2
+ import type { PluginManager, PluginOperationResult } from "./marketplace/store";
3
3
  import { getPluginsDir, loadExternalPlugin } from "./loader";
4
4
  import type { PluginTarget } from "../types/plugin";
5
5
 
@@ -1,5 +1,5 @@
1
- import { createThrottledFetch } from "../../../utils/throttled-fetch";
2
- import { isOfficialPluginRepo } from "../../auto-update";
1
+ import { createThrottledFetch } from "../../utils/throttled-fetch";
2
+ import { isOfficialPluginRepo } from "../auto-update";
3
3
  import type { RegistryFeed, RegistryPlugin } from "./model";
4
4
 
5
5
  /**
@@ -1,9 +1,9 @@
1
- import type { PluginTarget } from "../../../types/plugin";
2
- import { compareSemver, formatVersion, requiredGloomberb } from "../../../utils/semver";
3
- import { runsExternalPlugins } from "../../current-target";
4
- import { BUILTIN_EDITORIAL } from "../../builtin-editorial";
5
- import { builtinPluginGroupMembers } from "../../ownership";
6
- import type { FunctionAccess } from "../../../cli/pane-functions/function-help";
1
+ import type { PluginTarget } from "../../types/plugin";
2
+ import { compareSemver, formatVersion, requiredGloomberb } from "../../utils/semver";
3
+ import { runsExternalPlugins } from "../current-target";
4
+ import { BUILTIN_EDITORIAL } from "../builtin-editorial";
5
+ import { builtinPluginGroupMembers } from "../ownership";
6
+ import type { FunctionAccess } from "../../cli/pane-functions/function-help";
7
7
  import { PACK_PLUGIN_IDS } from "./packs";
8
8
 
9
9
  type PluginTier = "official" | "verified" | "community";