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.
- package/README.md +14 -91
- package/package.json +5 -1
- package/src/{plugins/builtin/cloud → account}/auth-form.tsx +9 -9
- package/src/{plugins/builtin/cloud → account}/auth-model.ts +4 -4
- package/src/account/billing.ts +57 -0
- package/src/{plugins/builtin/cloud → account}/device-signin-dialog.tsx +18 -12
- package/src/{plugins/builtin/cloud → account}/device-signin.ts +2 -2
- package/src/{plugins/builtin/cloud → account}/email-auth-attempt.ts +2 -2
- package/src/account/session.ts +16 -0
- package/src/{plugins/builtin/cloud → account}/upgrade-dialog.tsx +16 -15
- package/src/{plugins/builtin/cloud → account}/upgrade-personalization.ts +7 -7
- package/src/{plugins/builtin/cloud → account}/upgrade-tickers.ts +6 -6
- package/src/{plugins/builtin/cloud → account}/verification-panel.tsx +6 -6
- package/src/api-client/central-bank-rates.ts +6 -1
- package/src/api-client/chat.ts +26 -0
- package/src/api-client/credit-boards.ts +2 -0
- package/src/api-client/data.ts +73 -3
- package/src/api-client/earnings.ts +6 -0
- package/src/api-client/europe-energy.ts +106 -0
- package/src/api-client/futures-curve.ts +56 -0
- package/src/api-client/index.ts +13 -1
- package/src/api-client/market-discovery.ts +13 -1
- package/src/api-client/normalizers.ts +32 -0
- package/src/api-client/paths.ts +7 -0
- package/src/api-client/perps.ts +8 -0
- package/src/api-client/request.ts +9 -2
- package/src/api-client/research-activity.ts +15 -10
- package/src/api-client/socket.ts +29 -0
- package/src/api-client/themes.ts +22 -1
- package/src/api-client/types.ts +78 -2
- package/src/api-client/yield-curves.ts +8 -0
- package/src/app/global-shortcuts.ts +50 -2
- package/src/app/keybindings/actions.ts +12 -1
- package/src/app/pane-runtime/plugin-bindings.ts +2 -2
- package/src/app/pane-runtime/ticker-open-runtime.ts +16 -6
- package/src/app/runtime/desktop-deeplink.ts +10 -5
- package/src/app/runtime/startup.ts +1 -1
- package/src/app.tsx +6 -0
- package/src/architecture/core-builtin-allowlist.json +8 -26
- package/src/ask-gloom/pane-context.ts +114 -0
- package/src/ask-gloom/pane-request.ts +70 -0
- package/src/ask-gloom/pane-text.ts +201 -0
- package/src/brokers/signed-in/sign-in-dialog.tsx +11 -5
- package/src/capabilities/chart-series.ts +19 -2
- package/src/capabilities/factories.ts +1 -0
- package/src/cli/central-bank-events.ts +23 -0
- package/src/cli/command-options.ts +17 -5
- package/src/cli/commands/crypto-hints.ts +35 -2
- package/src/cli/commands/fred-series.ts +146 -0
- package/src/cli/commands/market.ts +501 -115
- package/src/cli/commands/news-hints.ts +62 -0
- package/src/cli/commands/news-search.ts +53 -0
- package/src/cli/commands/options-leaps.ts +5 -2
- package/src/cli/commands/overview.ts +132 -26
- package/src/cli/commands/remote.ts +2 -1
- package/src/cli/commands/search.ts +317 -13
- package/src/cli/commands/system.ts +55 -8
- package/src/cli/commands/ticker.ts +155 -18
- package/src/cli/context.ts +45 -14
- package/src/cli/desktop-pane-shot.ts +76 -7
- package/src/cli/earnings-calendar.ts +71 -0
- package/src/cli/errors.ts +7 -5
- package/src/cli/exit-codes.ts +8 -0
- package/src/cli/export-source.ts +58 -0
- package/src/cli/freshness.ts +18 -7
- package/src/cli/glossary.ts +483 -0
- package/src/cli/help.ts +10 -0
- package/src/cli/helpers.ts +2 -5
- package/src/cli/history-rows.ts +118 -7
- package/src/cli/index-roots.ts +7 -0
- package/src/cli/index.ts +29 -9
- package/src/cli/known-gaps.ts +84 -0
- package/src/cli/listing-arg.ts +551 -97
- package/src/cli/not-a-ticker.ts +24 -9
- package/src/cli/pane-functions/access-gate.ts +13 -2
- package/src/cli/pane-functions/capabilities.ts +4 -3
- package/src/cli/pane-functions/catalog.ts +214 -40
- package/src/cli/pane-functions/data.ts +42 -8
- package/src/cli/pane-functions/discovery.ts +1 -0
- package/src/cli/pane-functions/dom.ts +37 -8
- package/src/cli/pane-functions/freshness.ts +393 -49
- package/src/cli/pane-functions/function-help.ts +31 -15
- package/src/cli/pane-functions/headless.ts +98 -30
- package/src/cli/pane-functions/index.ts +101 -19
- package/src/cli/pane-functions/market-session.ts +22 -8
- package/src/cli/pane-functions/options.ts +71 -22
- package/src/cli/pane-functions/report-notices.ts +25 -7
- package/src/cli/pane-functions/report.ts +15 -8
- package/src/cli/pane-functions/resolver.ts +74 -19
- package/src/cli/pane-functions/screenshot.ts +250 -27
- package/src/cli/perpetual-contract.ts +60 -0
- package/src/cli/registry.ts +3 -1
- package/src/cli/report-tables.ts +26 -7
- package/src/cli/result.ts +45 -11
- package/src/cli/series-search.ts +111 -0
- package/src/cli/staged-tickers.ts +52 -0
- package/src/cli/symbol-args.ts +27 -0
- package/src/cli/symbol-list.ts +154 -0
- package/src/cli/symbol-rows.ts +154 -0
- package/src/cli/ticker-resolution.ts +311 -27
- package/src/cli/types.ts +5 -0
- package/src/components/chart/composite/axis-overlays.tsx +14 -3
- package/src/components/chart/composite/composite-chart.tsx +71 -11
- package/src/components/chart/composite/crosshair-readout.tsx +150 -0
- package/src/components/chart/composite/downsample.ts +1 -1
- package/src/components/chart/composite/format.ts +29 -0
- package/src/components/chart/composite/interactions.ts +9 -2
- package/src/components/chart/composite/legend.tsx +100 -33
- package/src/components/chart/composite/panel-bitmap.ts +70 -35
- package/src/components/chart/composite/panel-labels.ts +18 -17
- package/src/components/chart/composite/panel-series.ts +1 -0
- package/src/components/chart/composite/panel-surface.tsx +46 -21
- package/src/components/chart/composite/price-axis-labels.tsx +3 -1
- package/src/components/chart/composite/rasterizer.ts +50 -8
- package/src/components/chart/composite/scene.ts +2 -1
- package/src/components/chart/composite/time-scale.ts +26 -9
- package/src/components/chart/composite/types.ts +18 -0
- package/src/components/chart/composite/use-composite-viewport.ts +30 -2
- package/src/components/chart/native/raster/crosshair.ts +8 -3
- package/src/components/chart/native/raster/primitives.ts +85 -21
- package/src/components/chart/native/surface/manager.ts +33 -8
- package/src/components/chart/surface3d/chart.tsx +1 -1
- package/src/components/command-bar/action-runtime.ts +1 -1
- package/src/components/command-bar/commands/collection-list.ts +210 -0
- package/src/components/command-bar/commands/collection.ts +40 -1
- package/src/components/command-bar/commands/direct/index.ts +4 -0
- package/src/components/command-bar/commands/registry.ts +8 -0
- package/src/components/command-bar/panel/index.tsx +11 -3
- package/src/components/command-bar/panel/runtime.ts +3 -0
- package/src/components/command-bar/panel/types.ts +2 -0
- package/src/components/command-bar/routes/root/plugin-install.ts +4 -4
- package/src/components/command-bar/routes/root/provider-search.ts +4 -3
- package/src/components/command-bar/routes/ticker-search/results.ts +12 -11
- package/src/components/command-bar/routes/ticker-search/route.ts +4 -3
- package/src/components/command-bar/routing/actions.ts +1 -1
- package/src/components/command-bar/workflow/tickers.ts +42 -17
- package/src/components/layout/detached-pane-shell.tsx +68 -39
- package/src/components/layout/floating-pane.tsx +10 -1
- package/src/components/layout/header.tsx +25 -5
- package/src/components/layout/missing-pane.tsx +3 -3
- package/src/components/layout/pane/capture-stamp.ts +41 -0
- package/src/components/layout/pane/capture-status.ts +12 -0
- package/src/components/layout/pane/content.tsx +7 -13
- package/src/components/layout/pane/footer/index.tsx +6 -2
- package/src/components/layout/pane/footer/keyboard.ts +3 -0
- package/src/components/layout/pane/footer/model.ts +41 -1
- package/src/components/layout/pane/header.tsx +50 -1
- package/src/components/layout/pane/index.tsx +21 -3
- package/src/components/layout/pane/sidebar.tsx +88 -21
- package/src/components/layout/shell/active-drag.ts +21 -5
- package/src/components/layout/shell/cursor-occlusion.ts +2 -1
- package/src/components/layout/shell/drag/index.ts +39 -9
- package/src/components/layout/shell/drag/live.ts +61 -51
- package/src/components/layout/shell/drag/runtime.ts +54 -12
- package/src/components/layout/shell/index.tsx +84 -65
- package/src/components/layout/shell/menu.ts +14 -1
- package/src/components/layout/shell/native/pointer-runtime.ts +3 -1
- package/src/components/layout/shell/pane/actions.ts +32 -10
- package/src/components/layout/shell/pane/ask.ts +131 -0
- package/src/components/layout/shell/pane/capture.ts +162 -0
- package/src/components/layout/shell/pane/layers.tsx +218 -50
- package/src/components/layout/shell/pane/management-shortcuts.ts +46 -1
- package/src/components/layout/shell/shortcuts.ts +21 -4
- package/src/components/layout/shell/terminal-pointer-runtime.ts +24 -0
- package/src/components/markdown-text.tsx +62 -20
- package/src/components/metric-treemap/heat-surface.tsx +8 -1
- package/src/components/onboarding/account-step/form-panel.tsx +1 -1
- package/src/components/onboarding/account-step/index.tsx +1 -1
- package/src/components/onboarding/account-step/qr-panel.tsx +1 -1
- package/src/components/onboarding/account-step/signed-in-panel.tsx +1 -1
- package/src/components/onboarding/onboarding-keyboard.ts +1 -1
- package/src/components/onboarding/onboarding-wizard.tsx +2 -2
- package/src/components/onboarding/use-onboarding-upgrade.ts +3 -3
- package/src/components/onboarding/wizard-account.ts +2 -2
- package/src/components/pane-template-wizard.tsx +9 -1
- package/src/components/price-selector-dialog.tsx +11 -2
- package/src/components/reader/article-reader.tsx +642 -0
- package/src/components/reader/article-text.ts +527 -0
- package/src/components/sign-in-gate.tsx +3 -3
- package/src/components/ticker/list-table-view.tsx +43 -2
- package/src/components/ui/action-row.tsx +2 -1
- package/src/components/ui/button.tsx +7 -1
- package/src/components/ui/choice-dialog.tsx +6 -4
- package/src/components/ui/confirm-dialog.tsx +28 -18
- package/src/components/ui/data-table/index.tsx +18 -6
- package/src/components/ui/data-table/opentui/index.tsx +37 -6
- package/src/components/ui/data-table/types.ts +12 -0
- package/src/components/ui/dialog-actions.tsx +64 -0
- package/src/components/ui/display.tsx +17 -3
- package/src/components/ui/frame.tsx +35 -2
- package/src/components/ui/icon.tsx +6 -1
- package/src/components/ui/query-bar.tsx +10 -1
- package/src/components/ui/text-prompt-dialog.tsx +11 -9
- package/src/data/cached-query.ts +2 -0
- package/src/data/config/store/migrations.ts +7 -0
- package/src/data/config/store/normalize.ts +7 -2
- package/src/data/config/store/portfolio-as-of-column.ts +57 -0
- package/src/data/ticker-repository.ts +5 -0
- package/src/data/ticker-store.ts +15 -0
- package/src/docs/content.ts +215 -0
- package/src/docs/load.ts +139 -0
- package/src/docs/requests.ts +39 -0
- package/src/docs/snapshot.chunk.ts +8 -0
- package/src/docs/snapshot.json +7555 -0
- package/src/docs/topics.ts +216 -0
- package/src/i18n/es.ts +65 -5
- package/src/i18n/ja.ts +65 -5
- package/src/i18n/ko.ts +65 -5
- package/src/i18n/zh-cn.ts +65 -5
- package/src/i18n/zh-tw.ts +65 -5
- package/src/layout/desks.ts +1 -1
- package/src/layout/pane-manager/dock-tree.ts +18 -0
- package/src/layout/pane-manager/index.ts +1 -0
- package/src/layout-marketplace/gallery.tsx +1 -1
- package/src/market-data/coordinator/chart.ts +10 -4
- package/src/market-data/coordinator/index.ts +6 -3
- package/src/{plugins/builtin/futures/contracts.ts → market-data/futures-board.ts} +81 -28
- package/src/market-data/futures-contract.ts +151 -0
- package/src/market-data/hooks.tsx +10 -2
- package/src/market-data/market/format.ts +39 -21
- package/src/market-data/market/freshness.ts +84 -20
- package/src/market-data/market/session-close-note.ts +3 -2
- package/src/market-data/market/status.ts +19 -23
- package/src/market-data/published-apac-sessions.ts +23 -1
- package/src/market-data/quotes/contributions.ts +5 -0
- package/src/market-data/quotes/metadata.ts +19 -24
- package/src/market-data/quotes/resolution.ts +5 -0
- package/src/market-data/quotes/screener-live-quotes.ts +5 -4
- package/src/market-data/result-types.ts +2 -0
- package/src/notifications/app-notifier.ts +17 -1
- package/src/notifications/notification-log.ts +180 -0
- package/src/plugins/auto-update-node.ts +2 -2
- package/src/plugins/auto-update.ts +2 -2
- package/src/plugins/builtin/account-management/index.tsx +1 -0
- package/src/plugins/builtin/account-management/model.ts +1 -56
- package/src/plugins/builtin/account-management/pane.tsx +6 -4
- package/src/plugins/builtin/account-management/password-dialog.tsx +1 -1
- package/src/plugins/builtin/alerts/catalysts.ts +1 -1
- package/src/plugins/builtin/alerts/cli.ts +313 -47
- package/src/plugins/builtin/alerts/events-pane.tsx +45 -7
- package/src/plugins/builtin/alerts/events.ts +23 -2
- package/src/plugins/builtin/alerts/focus.ts +27 -0
- package/src/plugins/builtin/alerts/history-pane.tsx +7 -2
- package/src/plugins/builtin/alerts/history.ts +2 -0
- package/src/plugins/builtin/alerts/index.tsx +47 -11
- package/src/plugins/builtin/alerts/pane.tsx +27 -1
- package/src/plugins/builtin/alerts/research-builder.ts +8 -3
- package/src/plugins/builtin/alerts/research-rules.ts +18 -2
- package/src/plugins/builtin/alerts/scheduled-check.ts +122 -0
- package/src/plugins/builtin/alerts/scheduled-sources.ts +25 -0
- package/src/plugins/builtin/alerts/scheduled.ts +254 -0
- package/src/plugins/builtin/alerts/targets.ts +92 -0
- package/src/plugins/builtin/analytics/index.tsx +8 -3
- package/src/plugins/builtin/analytics/risk-headless.ts +60 -27
- package/src/plugins/builtin/analytics/risk-math.ts +91 -27
- package/src/plugins/builtin/analytics/risk-model.ts +35 -5
- package/src/plugins/builtin/analytics/risk-pane.tsx +15 -8
- package/src/plugins/builtin/attention/headless.ts +1 -1
- package/src/plugins/builtin/attention/index.tsx +2 -0
- package/src/plugins/builtin/attention/pane.tsx +3 -1
- package/src/plugins/builtin/attention/series.ts +26 -0
- package/src/plugins/builtin/awards/headless.ts +88 -18
- package/src/plugins/builtin/awards/index.tsx +2 -0
- package/src/plugins/builtin/awards/model.ts +41 -1
- package/src/plugins/builtin/awards/pane.tsx +22 -13
- package/src/plugins/builtin/awards/series.ts +29 -0
- package/src/plugins/builtin/backtest/headless.ts +2 -2
- package/src/plugins/builtin/bond-calculator/model.ts +2 -1
- package/src/plugins/builtin/broker-manager/index.tsx +1 -0
- package/src/plugins/builtin/catalysts/headless.ts +1 -1
- package/src/plugins/builtin/catalysts/pane.tsx +3 -1
- package/src/plugins/builtin/cds/client.ts +49 -12
- package/src/plugins/builtin/cds/headless.ts +119 -19
- package/src/plugins/builtin/cds/index.tsx +3 -1
- package/src/plugins/builtin/cds/model.ts +214 -32
- package/src/plugins/builtin/cds/pane.tsx +58 -14
- package/src/plugins/builtin/cds/series.ts +19 -0
- package/src/plugins/builtin/central-bank-rates/client.ts +4 -0
- package/src/plugins/builtin/central-bank-rates/headless.ts +46 -16
- package/src/plugins/builtin/central-bank-rates/index.tsx +3 -1
- package/src/plugins/builtin/central-bank-rates/model.ts +99 -0
- package/src/plugins/builtin/central-bank-rates/pane.tsx +1 -1
- package/src/plugins/builtin/central-bank-rates/series.ts +36 -0
- package/src/plugins/builtin/chart-composer/catalog-inventory.ts +193 -255
- package/src/plugins/builtin/chart-composer/data-catalog-pane.tsx +84 -46
- package/src/plugins/builtin/chart-composer/editor.tsx +5 -4
- package/src/plugins/builtin/chart-composer/field-series.ts +40 -0
- package/src/plugins/builtin/chart-composer/headless-schema.ts +1 -1
- package/src/plugins/builtin/chart-composer/headless.ts +70 -5
- package/src/plugins/builtin/chart-composer/index.tsx +15 -3
- package/src/plugins/builtin/chart-composer/pane.tsx +81 -38
- package/src/plugins/builtin/chart-composer/series-catalog.ts +58 -50
- package/src/plugins/builtin/chart-composer/series-expression.ts +18 -10
- package/src/plugins/builtin/chart-composer/use-series-catalog.ts +59 -3
- package/src/plugins/builtin/chart-composer/user-series.ts +84 -0
- package/src/plugins/builtin/chat/content/composer-runtime.ts +6 -1
- package/src/plugins/builtin/chat/content/composer.tsx +5 -1
- package/src/plugins/builtin/chat/content/footer.tsx +12 -0
- package/src/plugins/builtin/chat/content/index.tsx +89 -5
- package/src/plugins/builtin/chat/content/new-dm-dialog.tsx +10 -2
- package/src/plugins/builtin/chat/content/new-messages.tsx +89 -0
- package/src/plugins/builtin/chat/content/row-activity.ts +132 -0
- package/src/plugins/builtin/chat/content/scroll.ts +127 -27
- package/src/plugins/builtin/chat/content/shortcuts.ts +2 -2
- package/src/plugins/builtin/chat/content/transcript.tsx +145 -78
- package/src/plugins/builtin/chat/content/types.ts +1 -0
- package/src/plugins/builtin/chat/controller/fetch.ts +8 -2
- package/src/plugins/builtin/chat/controller/index.ts +123 -1
- package/src/plugins/builtin/chat/controller/message-loading.ts +3 -0
- package/src/plugins/builtin/chat/controller/messages.ts +7 -2
- package/src/plugins/builtin/chat/controller/realtime.ts +10 -1
- package/src/plugins/builtin/chat/controller/send.ts +61 -1
- package/src/plugins/builtin/chat/controller/state.ts +8 -0
- package/src/plugins/builtin/chat/ghost-user.ts +20 -0
- package/src/plugins/builtin/chat/index.tsx +23 -5
- package/src/plugins/builtin/chat/layout.ts +78 -5
- package/src/plugins/builtin/chat/message/ai-badge.tsx +18 -0
- package/src/plugins/builtin/chat/message/desktop.tsx +55 -6
- package/src/plugins/builtin/chat/message/header.tsx +16 -4
- package/src/plugins/builtin/chat/message/profile-popover.tsx +5 -1
- package/src/plugins/builtin/chat/message/reactions.tsx +210 -0
- package/src/plugins/builtin/chat/message/render-state.ts +18 -2
- package/src/plugins/builtin/chat/message/terminal.tsx +43 -4
- package/src/plugins/builtin/chat/message/types.ts +12 -0
- package/src/plugins/builtin/chat/reactions.ts +197 -0
- package/src/plugins/builtin/chat/share/flow.tsx +87 -0
- package/src/plugins/builtin/chat/share/targets.ts +27 -0
- package/src/plugins/builtin/chat/status-widget.tsx +6 -3
- package/src/plugins/builtin/chat/unread-inbox-pane.tsx +148 -27
- package/src/plugins/builtin/chat/unread-inbox.ts +22 -0
- package/src/plugins/builtin/cloud/askg/attached-pane.tsx +69 -0
- package/src/plugins/builtin/cloud/askg/controller.ts +111 -19
- package/src/plugins/builtin/cloud/askg/executor.ts +57 -3
- package/src/plugins/builtin/cloud/askg/manifest.ts +32 -7
- package/src/plugins/builtin/cloud/askg/model.ts +27 -8
- package/src/plugins/builtin/cloud/askg/pane-attachment.ts +94 -0
- package/src/plugins/builtin/cloud/askg/pane.tsx +141 -12
- package/src/plugins/builtin/cloud/askg/pending-question.ts +11 -0
- package/src/plugins/builtin/cloud/askg/protocol.ts +10 -1
- package/src/plugins/builtin/cloud/askg/tool-display.ts +3 -0
- package/src/plugins/builtin/cloud/askg/undo.ts +2 -0
- package/src/plugins/builtin/cloud/auth-actions.tsx +1 -1
- package/src/plugins/builtin/cloud/auth-commands.ts +1 -1
- package/src/plugins/builtin/cloud/auth-dialog.tsx +3 -3
- package/src/plugins/builtin/cloud/company-picker.tsx +1 -1
- package/src/plugins/builtin/cloud/mcp-connect/dialog.tsx +3 -0
- package/src/plugins/builtin/cloud/plugin.tsx +19 -2
- package/src/plugins/builtin/cloud/team/model.ts +5 -0
- package/src/plugins/builtin/cloud/team/module.tsx +1 -0
- package/src/plugins/builtin/cloud/team/store.ts +8 -3
- package/src/plugins/builtin/cloud/terminal-relay/engine.ts +77 -9
- package/src/plugins/builtin/cloud/terminal-relay/manifest.ts +6 -1
- package/src/plugins/builtin/cloud/terminal-relay/policy.ts +9 -0
- package/src/plugins/builtin/cloud/terminal-relay/prompts.tsx +35 -11
- package/src/plugins/builtin/cloud/thesis/exposure.ts +1 -1
- package/src/plugins/builtin/cloud/thesis/module.tsx +1 -0
- package/src/plugins/builtin/cloud/thesis/prompts.tsx +2 -1
- package/src/plugins/builtin/company-attention/app-rank.tsx +1 -1
- package/src/plugins/builtin/company-attention/headless.ts +21 -7
- package/src/plugins/builtin/company-attention/index.tsx +2 -0
- package/src/plugins/builtin/company-attention/model.ts +26 -7
- package/src/plugins/builtin/company-attention/pane.tsx +12 -9
- package/src/plugins/builtin/company-attention/series.ts +52 -0
- package/src/plugins/builtin/company-kpis/headless.ts +97 -10
- package/src/plugins/builtin/company-kpis/model.ts +24 -2
- package/src/plugins/builtin/company-kpis/pane.tsx +17 -16
- package/src/plugins/builtin/composite-plugins.ts +19 -13
- package/src/plugins/builtin/connections/index.ts +1 -0
- package/src/plugins/builtin/cot/headless.ts +1 -1
- package/src/plugins/builtin/cot/index.tsx +3 -1
- package/src/plugins/builtin/cot/model.ts +40 -11
- package/src/plugins/builtin/cot/series.ts +27 -0
- package/src/plugins/builtin/cpi/headless.ts +3 -3
- package/src/plugins/builtin/credit-boards/cdx-pane.tsx +10 -1
- package/src/plugins/builtin/credit-boards/client.ts +6 -2
- package/src/plugins/builtin/credit-boards/headless.ts +108 -31
- package/src/plugins/builtin/credit-boards/index.tsx +2 -0
- package/src/plugins/builtin/credit-boards/model.ts +11 -1
- package/src/plugins/builtin/credit-boards/series.ts +66 -0
- package/src/plugins/builtin/credit-conditions/client.ts +12 -9
- package/src/plugins/builtin/credit-conditions/headless.ts +13 -2
- package/src/plugins/builtin/credit-conditions/index.tsx +18 -9
- package/src/plugins/builtin/credit-conditions/model.ts +19 -11
- package/src/plugins/builtin/credit-conditions/series.ts +16 -0
- package/src/plugins/builtin/credit-documents/headless.ts +33 -3
- package/src/plugins/builtin/credit-documents/pane.tsx +3 -1
- package/src/plugins/builtin/crypto-board/headless.ts +2 -3
- package/src/plugins/builtin/crypto-board/index.tsx +2 -0
- package/src/plugins/builtin/crypto-board/model.ts +12 -0
- package/src/plugins/builtin/crypto-board/pane.tsx +19 -12
- package/src/plugins/builtin/crypto-board/series.ts +48 -0
- package/src/plugins/builtin/custom-view/live-quotes.ts +2 -2
- package/src/plugins/builtin/debt-maturities/headless.ts +17 -11
- package/src/plugins/builtin/debt-maturities/index.tsx +2 -0
- package/src/plugins/builtin/debt-maturities/series.ts +45 -0
- package/src/plugins/builtin/dividend-yield/client.ts +3 -0
- package/src/plugins/builtin/dividend-yield/headless.ts +7 -4
- package/src/plugins/builtin/dividend-yield/index.tsx +3 -1
- package/src/plugins/builtin/dividend-yield/pane.tsx +3 -1
- package/src/plugins/builtin/dividend-yield/series.ts +20 -0
- package/src/plugins/builtin/dividend-yield/types.ts +2 -0
- package/src/plugins/builtin/docs/blocks.tsx +181 -0
- package/src/plugins/builtin/docs/index.tsx +68 -0
- package/src/plugins/builtin/docs/pane.tsx +426 -0
- package/src/plugins/builtin/docs/targets.ts +72 -0
- package/src/plugins/builtin/docs/use-docs.ts +60 -0
- package/src/plugins/builtin/doe/headless.ts +12 -8
- package/src/plugins/builtin/doe/index.tsx +2 -0
- package/src/plugins/builtin/doe/series.ts +62 -0
- package/src/plugins/builtin/earnings/client.ts +3 -2
- package/src/plugins/builtin/earnings/format.ts +1 -5
- package/src/plugins/builtin/earnings/headless.ts +58 -6
- package/src/plugins/builtin/earnings/history-model.ts +15 -1
- package/src/plugins/builtin/earnings/history-table.ts +13 -2
- package/src/plugins/builtin/earnings/history.tsx +7 -3
- package/src/plugins/builtin/earnings/index.tsx +9 -0
- package/src/plugins/builtin/earnings-calls/headless.ts +28 -2
- package/src/plugins/builtin/earnings-calls/index.tsx +1 -1
- package/src/plugins/builtin/earnings-ripple/index.tsx +2 -0
- package/src/plugins/builtin/econ/fred-catalog.ts +198 -0
- package/src/plugins/builtin/econ/fred-series-map.ts +0 -46
- package/src/plugins/builtin/econ/index.tsx +2 -0
- package/src/plugins/builtin/econ-statistics/defs.ts +5 -0
- package/src/plugins/builtin/econ-statistics/headless.ts +19 -4
- package/src/plugins/builtin/econ-statistics/stats.ts +1 -0
- package/src/plugins/builtin/equity-screener/headless.ts +3 -3
- package/src/plugins/builtin/equity-screener/pane.tsx +4 -11
- package/src/plugins/builtin/estimate-revisions/headless.ts +3 -3
- package/src/plugins/builtin/exposure/drivers.ts +13 -0
- package/src/plugins/builtin/exposure/headless.ts +205 -13
- package/src/plugins/builtin/exposure/holdings.ts +1 -1
- package/src/plugins/builtin/exposure/index.tsx +1 -0
- package/src/plugins/builtin/exposure/model.ts +23 -3
- package/src/plugins/builtin/exposure/pane.tsx +14 -12
- package/src/plugins/builtin/fear-greed/index.tsx +18 -10
- package/src/plugins/builtin/fear-greed/series.ts +52 -0
- package/src/plugins/builtin/futures/index.tsx +43 -3
- package/src/plugins/builtin/futures/model.ts +1 -1
- package/src/plugins/builtin/futures/returns.ts +1 -1
- package/src/plugins/builtin/futures/series.ts +13 -0
- package/src/plugins/builtin/futures/table.tsx +1 -1
- package/src/plugins/builtin/futures/use-front-returns.ts +1 -1
- package/src/plugins/builtin/futures-curve/client.ts +12 -3
- package/src/plugins/builtin/futures-curve/headless.ts +71 -10
- package/src/plugins/builtin/futures-curve/index.tsx +1 -1
- package/src/plugins/builtin/futures-curve/model.ts +66 -11
- package/src/plugins/builtin/futures-curve/pane.tsx +52 -18
- package/src/plugins/builtin/fx-matrix/client.ts +63 -0
- package/src/plugins/builtin/fx-matrix/export.ts +2 -1
- package/src/plugins/builtin/fx-matrix/headless.ts +154 -0
- package/src/plugins/builtin/fx-matrix/index.tsx +4 -4
- package/src/plugins/builtin/gpu/board.tsx +13 -10
- package/src/plugins/builtin/gpu/changes.tsx +4 -4
- package/src/plugins/builtin/gpu/client.ts +19 -1
- package/src/plugins/builtin/gpu/equities.tsx +14 -10
- package/src/plugins/builtin/gpu/headless.ts +58 -27
- package/src/plugins/builtin/gpu/history.tsx +3 -3
- package/src/plugins/builtin/gpu/index.tsx +2 -0
- package/src/plugins/builtin/gpu/model.ts +101 -16
- package/src/plugins/builtin/gpu/pane.tsx +28 -12
- package/src/plugins/builtin/gpu/series.ts +38 -0
- package/src/plugins/builtin/help/function-card.tsx +25 -6
- package/src/plugins/builtin/help/function-index.ts +2 -0
- package/src/plugins/builtin/help/index.tsx +31 -9
- package/src/plugins/builtin/holders/beneficial-model.ts +90 -3
- package/src/plugins/builtin/holders/beneficial-report.ts +57 -5
- package/src/plugins/builtin/holders/beneficial-view.tsx +55 -11
- package/src/plugins/builtin/holders/client.ts +22 -3
- package/src/plugins/builtin/holders/format.ts +18 -3
- package/src/plugins/builtin/holders/headless.ts +36 -133
- package/src/plugins/builtin/holders/pane.tsx +11 -4
- package/src/plugins/builtin/holders/report-header.ts +40 -5
- package/src/plugins/builtin/holders/report-rows.ts +240 -0
- package/src/plugins/builtin/insider/client.ts +35 -20
- package/src/plugins/builtin/insider/headless.ts +41 -11
- package/src/plugins/builtin/insider/index.tsx +26 -9
- package/src/plugins/builtin/insider/insider-data.ts +10 -0
- package/src/plugins/builtin/insider/issuer.ts +49 -0
- package/src/plugins/builtin/insider/model.ts +3 -0
- package/src/plugins/builtin/ipo-calendar/headless.ts +1 -1
- package/src/plugins/builtin/iv-history/client.ts +20 -6
- package/src/plugins/builtin/iv-history/format.ts +9 -0
- package/src/plugins/builtin/iv-history/headless.ts +56 -21
- package/src/plugins/builtin/iv-history/index.tsx +2 -0
- package/src/plugins/builtin/iv-history/model.ts +143 -8
- package/src/plugins/builtin/iv-history/screen-pane.tsx +5 -9
- package/src/plugins/builtin/iv-history/series.ts +29 -0
- package/src/plugins/builtin/jobs/headless.ts +26 -3
- package/src/plugins/builtin/jobs/index.tsx +3 -1
- package/src/plugins/builtin/jobs/series.ts +19 -0
- package/src/plugins/builtin/kelly-sizer/index.tsx +2 -0
- package/src/plugins/builtin/kelly-sizer/pane.tsx +2 -1
- package/src/plugins/builtin/kelly-sizer/portfolio.ts +0 -39
- package/src/plugins/builtin/macro-day/client.ts +44 -3
- package/src/plugins/builtin/macro-day/headless.ts +13 -10
- package/src/plugins/builtin/macro-day/model.ts +56 -10
- package/src/plugins/builtin/macro-day/pane.tsx +30 -20
- package/src/plugins/builtin/market-heatmap/headless.ts +20 -5
- package/src/plugins/builtin/market-heatmap/index.tsx +6 -0
- package/src/plugins/builtin/market-heatmap/model.ts +19 -11
- package/src/plugins/builtin/market-heatmap/portfolio.ts +2 -2
- package/src/plugins/builtin/market-movers/client.ts +7 -5
- package/src/plugins/builtin/market-movers/index.tsx +3 -2
- package/src/plugins/builtin/market-movers/model.ts +30 -0
- package/src/plugins/builtin/market-movers/screener.ts +31 -0
- package/src/plugins/builtin/market-valuation/chart-series.ts +29 -69
- package/src/plugins/builtin/market-valuation/index.tsx +3 -3
- package/src/plugins/builtin/market-valuation/indicators.ts +0 -5
- package/src/plugins/builtin/members/headless.ts +8 -3
- package/src/plugins/builtin/members/model.ts +31 -3
- package/src/plugins/builtin/members/pane.tsx +6 -8
- package/src/plugins/builtin/mna/distress/headless.ts +4 -4
- package/src/plugins/builtin/mna/headless.ts +18 -6
- package/src/plugins/builtin/money-markets/headless.ts +5 -4
- package/src/plugins/builtin/money-markets/index.tsx +2 -0
- package/src/plugins/builtin/money-markets/series.ts +41 -0
- package/src/plugins/builtin/news/index.tsx +0 -2
- package/src/plugins/builtin/news/wire/news/detail-view.tsx +53 -104
- package/src/plugins/builtin/news/wire/news/footer.ts +2 -25
- package/src/plugins/builtin/news/wire/news/preset-pane.tsx +0 -2
- package/src/plugins/builtin/notes/cli.ts +12 -7
- package/src/plugins/builtin/notes/index.tsx +1 -0
- package/src/plugins/builtin/options/index.tsx +3 -0
- package/src/plugins/builtin/options/view.tsx +1 -1
- package/src/plugins/builtin/options-calculator/inputs.ts +2 -1
- package/src/plugins/builtin/options-positioning/client.ts +7 -3
- package/src/plugins/builtin/options-positioning/headless.ts +4 -3
- package/src/plugins/builtin/options-positioning/pane.tsx +2 -2
- package/src/plugins/builtin/options-scenario/client.ts +2 -1
- package/src/plugins/builtin/options-scenario/headless.ts +1 -0
- package/src/plugins/builtin/options-scenario/hedge.ts +2 -1
- package/src/plugins/builtin/perps/client.ts +90 -16
- package/src/plugins/builtin/perps/equity-row.tsx +52 -17
- package/src/plugins/builtin/perps/freshness.ts +66 -0
- package/src/plugins/builtin/perps/headless.ts +47 -32
- package/src/plugins/builtin/perps/index.tsx +23 -4
- package/src/plugins/builtin/perps/list-perpetuals.ts +118 -0
- package/src/plugins/builtin/perps/model.ts +20 -5
- package/src/plugins/builtin/perps/open-market.ts +15 -0
- package/src/plugins/builtin/perps/pane.tsx +76 -20
- package/src/plugins/builtin/perps/series.ts +76 -0
- package/src/plugins/builtin/plugin-marketplace/index.tsx +1 -1
- package/src/plugins/builtin/plugin-marketplace/pane.tsx +73 -67
- package/src/plugins/builtin/plugin-module.ts +3 -0
- package/src/plugins/builtin/portfolio-list/account-metrics.ts +1 -1
- package/src/plugins/builtin/portfolio-list/allocation.ts +5 -4
- package/src/plugins/builtin/portfolio-list/cell-version.ts +8 -1
- package/src/plugins/builtin/portfolio-list/cli/bulk-symbols.ts +161 -0
- package/src/plugins/builtin/portfolio-list/cli/import-13f.ts +109 -0
- package/src/plugins/builtin/portfolio-list/cli/portfolio-command.ts +384 -74
- package/src/plugins/builtin/portfolio-list/cli/render.ts +437 -71
- package/src/plugins/builtin/portfolio-list/cli/shared.ts +21 -4
- package/src/plugins/builtin/portfolio-list/cli/watchlist-command.ts +121 -47
- package/src/plugins/builtin/portfolio-list/column-values.ts +104 -26
- package/src/plugins/builtin/portfolio-list/grid.tsx +1 -1
- package/src/plugins/builtin/portfolio-list/headless.ts +84 -18
- package/src/plugins/builtin/portfolio-list/imported-from.ts +8 -0
- package/src/plugins/builtin/portfolio-list/index.tsx +5 -1
- package/src/plugins/builtin/portfolio-list/live-valuation.ts +6 -2
- package/src/plugins/builtin/portfolio-list/mutations.ts +2 -9
- package/src/plugins/builtin/portfolio-list/pane/data.ts +5 -1
- package/src/plugins/builtin/portfolio-list/pane/index.tsx +52 -9
- package/src/plugins/builtin/portfolio-list/quick-add/index.tsx +33 -11
- package/src/plugins/builtin/portfolio-list/quick-add/resolution.ts +21 -1
- package/src/plugins/builtin/portfolio-list/settings.ts +17 -0
- package/src/plugins/builtin/portfolio-list/summary/index.tsx +12 -0
- package/src/plugins/builtin/portfolio-list/summary/totals.ts +9 -4
- package/src/plugins/builtin/portfolio-list/table.tsx +37 -7
- package/src/plugins/builtin/power/client.ts +16 -0
- package/src/plugins/builtin/power/evidence.ts +63 -10
- package/src/plugins/builtin/power/headless.ts +77 -9
- package/src/plugins/builtin/power/index.tsx +28 -3
- package/src/plugins/builtin/power/model.ts +73 -2
- package/src/plugins/builtin/power/pane.tsx +37 -9
- package/src/plugins/builtin/power/prices-client.ts +139 -0
- package/src/plugins/builtin/power/prices-headless.ts +137 -0
- package/src/plugins/builtin/power/prices-model.ts +103 -0
- package/src/plugins/builtin/power/prices.tsx +179 -0
- package/src/plugins/builtin/rate-path/headless.ts +46 -18
- package/src/plugins/builtin/realized-vol/headless.ts +5 -0
- package/src/plugins/builtin/relative-rotation/headless.ts +3 -3
- package/src/plugins/builtin/research/corporate-actions-pane.tsx +5 -2
- package/src/plugins/builtin/research/event-model.ts +68 -24
- package/src/plugins/builtin/research/events-headless.ts +2 -1
- package/src/plugins/builtin/research/headless.ts +2 -1
- package/src/plugins/builtin/research/index.tsx +2 -0
- package/src/plugins/builtin/research-search/article.ts +65 -0
- package/src/plugins/builtin/research-search/document-view.tsx +33 -215
- package/src/plugins/builtin/research-search/model.ts +0 -9
- package/src/plugins/builtin/research-search/pane.tsx +41 -30
- package/src/plugins/builtin/research-search/snippet.ts +0 -29
- package/src/plugins/builtin/revenue-breakdown/headless.ts +18 -6
- package/src/plugins/builtin/seasonality/client.ts +15 -7
- package/src/plugins/builtin/seasonality/headless.ts +36 -12
- package/src/plugins/builtin/seasonality/index.tsx +2 -2
- package/src/plugins/builtin/seasonality/model.ts +119 -0
- package/src/plugins/builtin/seasonality/pane.tsx +108 -37
- package/src/plugins/builtin/sec/headless.ts +25 -3
- package/src/plugins/builtin/sec/index.tsx +2 -1
- package/src/plugins/builtin/series-inventory.ts +93 -0
- package/src/plugins/builtin/shared/cloud-denied.ts +15 -0
- package/src/plugins/builtin/shared/cloud-upgrade.ts +1 -1
- package/src/plugins/builtin/shared/command-tab.ts +30 -12
- package/src/plugins/builtin/shared/earnings-report.ts +55 -0
- package/src/plugins/builtin/shared/fred-points.ts +20 -0
- package/src/plugins/builtin/shared/free-preview.ts +47 -0
- package/src/plugins/builtin/shared/fx-rate-freshness.ts +101 -0
- package/src/plugins/builtin/shared/open-description.ts +29 -0
- package/src/plugins/builtin/shared/report-freshness.ts +12 -1
- package/src/plugins/builtin/shared/series-warning.ts +5 -0
- package/src/plugins/builtin/shared/volatility/options.ts +4 -1
- package/src/plugins/builtin/short-interest/headless.ts +1 -0
- package/src/plugins/builtin/short-interest/index.tsx +2 -0
- package/src/plugins/builtin/short-interest/series.ts +36 -0
- package/src/plugins/builtin/short-interest/watch-headless.ts +3 -2
- package/src/plugins/builtin/short-interest/watch-model.ts +9 -5
- package/src/plugins/builtin/short-volume/headless.ts +2 -1
- package/src/plugins/builtin/short-volume/index.tsx +2 -0
- package/src/plugins/builtin/short-volume/series.ts +23 -0
- package/src/plugins/builtin/social-mentions/headless.ts +1 -1
- package/src/plugins/builtin/social-mentions/index.tsx +2 -0
- package/src/plugins/builtin/social-mentions/series.ts +23 -0
- package/src/plugins/builtin/supply-chain/graph-pane.tsx +3 -2
- package/src/plugins/builtin/supply-chain/headless.ts +43 -11
- package/src/plugins/builtin/supply-chain/model.ts +13 -0
- package/src/plugins/builtin/supply-chain/pane.tsx +8 -6
- package/src/plugins/builtin/themes/headless.ts +74 -10
- package/src/plugins/builtin/themes/model.ts +71 -4
- package/src/plugins/builtin/themes/pane.tsx +22 -5
- package/src/plugins/builtin/thirteenf/api.ts +1 -0
- package/src/plugins/builtin/thirteenf/data.ts +6 -4
- package/src/plugins/builtin/thirteenf/headless.ts +217 -36
- package/src/plugins/builtin/thirteenf/model.ts +39 -1
- package/src/plugins/builtin/thirteenf/overlap.ts +75 -0
- package/src/plugins/builtin/thirteenf/pane.tsx +10 -1
- package/src/plugins/builtin/thirteenf/report-notes.ts +103 -1
- package/src/plugins/builtin/thirteenf/types.ts +2 -0
- package/src/plugins/builtin/ticker-detail/data-panes/returns-history.ts +114 -0
- package/src/plugins/builtin/ticker-detail/data-panes/returns-model.ts +57 -2
- package/src/plugins/builtin/ticker-detail/data-panes/returns-pane.tsx +19 -55
- package/src/plugins/builtin/ticker-detail/headless-schema.ts +30 -0
- package/src/plugins/builtin/ticker-detail/headless.ts +86 -0
- package/src/plugins/builtin/ticker-detail/index.tsx +26 -11
- package/src/plugins/builtin/ticker-detail/overview/components.tsx +1 -1
- package/src/plugins/builtin/ticker-detail/overview/futures-contract.ts +31 -0
- package/src/plugins/builtin/ticker-detail/overview/model.ts +3 -3
- package/src/plugins/builtin/ticker-detail/overview/pane.tsx +2 -1
- package/src/plugins/builtin/ticker-detail/overview-tab.tsx +49 -5
- package/src/plugins/builtin/ticker-detail/quote-monitor/index.tsx +13 -3
- package/src/plugins/builtin/time-sales/headless.ts +2 -1
- package/src/plugins/builtin/time-sales/index.tsx +2 -1
- package/src/plugins/builtin/treasury-auctions/headless.ts +16 -2
- package/src/plugins/builtin/treasury-auctions/index.tsx +1 -0
- package/src/plugins/builtin/treasury-auctions/model.ts +8 -0
- package/src/plugins/builtin/vol-surface/evidence.ts +7 -1
- package/src/plugins/builtin/vol-surface/headless.ts +51 -17
- package/src/plugins/builtin/vol-surface/heat-grid.tsx +113 -0
- package/src/plugins/builtin/vol-surface/model.ts +39 -6
- package/src/plugins/builtin/vol-surface/pane.tsx +14 -13
- package/src/plugins/builtin/vol-surface/stored.ts +63 -3
- package/src/plugins/builtin/vol-surface/surface.tsx +30 -2
- package/src/plugins/builtin/volatility/index.tsx +2 -0
- package/src/plugins/builtin/volatility/series.ts +84 -0
- package/src/plugins/builtin/world-venue-map/basemap-layer.tsx +6 -5
- package/src/plugins/builtin/world-venue-map/basemap.ts +6 -3
- package/src/plugins/builtin/world-venue-map/geo-draw.tsx +2 -1
- package/src/plugins/builtin/world-venue-map/geo-series.ts +26 -1
- package/src/plugins/builtin/world-venue-map/geo-svg.tsx +6 -6
- package/src/plugins/builtin/world-venue-map/headless.ts +4 -1
- package/src/plugins/builtin/world-venue-map/index.ts +2 -1
- package/src/plugins/builtin/world-venue-map/layered-pane.tsx +24 -13
- package/src/plugins/builtin/world-venue-map/layers.ts +29 -0
- package/src/plugins/builtin/world-venue-map/map.tsx +144 -13
- package/src/plugins/builtin/world-venue-map/model.ts +56 -19
- package/src/plugins/builtin/world-venue-map/pane.tsx +5 -2
- package/src/plugins/builtin/yield-curve/chart.ts +2 -2
- package/src/plugins/builtin/yield-curve/curves.ts +21 -8
- package/src/plugins/builtin/yield-curve/headless.ts +71 -18
- package/src/plugins/builtin/yield-curve/index.tsx +4 -2
- package/src/plugins/builtin/yield-curve/series.ts +86 -0
- package/src/plugins/catalog-browser.ts +2 -1
- package/src/plugins/installer.ts +2 -2
- package/src/plugins/loader.ts +15 -0
- package/src/plugins/manager-node.ts +1 -1
- package/src/plugins/{builtin/plugin-marketplace → marketplace}/feed.ts +2 -2
- package/src/plugins/{builtin/plugin-marketplace → marketplace}/model.ts +6 -6
- package/src/plugins/{builtin/plugin-marketplace → marketplace}/store.ts +1 -1
- package/src/plugins/registry/host-actions.ts +11 -0
- package/src/plugins/registry/index.ts +89 -4
- package/src/portfolio/collection-name.ts +31 -0
- package/src/{plugins/builtin/portfolio-list → portfolio}/position-metrics.ts +6 -6
- package/src/portfolio/position-value.ts +40 -0
- package/src/portfolio/valuation-basis.ts +79 -0
- package/src/public/__snapshots__/public-api.test.ts.snap +7 -0
- package/src/public/time-series.ts +17 -0
- package/src/react/auto-refresh.ts +13 -3
- package/src/react/input.ts +33 -1
- package/src/react/key-repeat.ts +86 -0
- package/src/remote/app-host.tsx +20 -4
- package/src/remote/confirm-change.tsx +85 -0
- package/src/remote/controller-utils.ts +8 -1
- package/src/remote/controller.ts +144 -7
- package/src/remote/pane-screenshot.ts +47 -0
- package/src/remote/schema.ts +65 -2
- package/src/remote/types.ts +30 -0
- package/src/remote/watchlist.ts +306 -0
- package/src/renderers/browser/main.tsx +4 -3
- package/src/renderers/browser/research-entry.ts +4 -2
- package/src/renderers/cloudflare/worker.ts +1 -1
- package/src/renderers/dom/data-table/frozen-column.ts +3 -1
- package/src/renderers/dom/data-table/index.tsx +33 -6
- package/src/renderers/dom/data-table/row.tsx +30 -1
- package/src/renderers/dom/desktop/control-styles.ts +63 -1
- package/src/renderers/dom/desktop/controls.tsx +30 -23
- package/src/renderers/dom/desktop/dialog-actions.tsx +170 -0
- package/src/renderers/dom/desktop/icons.tsx +16 -0
- package/src/renderers/dom/dom-ui-host.tsx +3 -0
- package/src/renderers/dom/host/block-glyph-canvas.tsx +6 -3
- package/src/renderers/dom/host/box.tsx +8 -0
- package/src/renderers/dom/host/chart-surface.tsx +33 -2
- package/src/renderers/dom/host/live-frame.ts +6 -2
- package/src/renderers/dom/host/overflow-fade.ts +14 -1
- package/src/renderers/dom/host/scroll-box.tsx +32 -0
- package/src/renderers/dom/host/size-observer.ts +41 -0
- package/src/renderers/dom/host/sticky-scroll.ts +128 -0
- package/src/renderers/dom/host/style.ts +1 -1
- package/src/renderers/dom/host/surface-3d.tsx +19 -7
- package/src/renderers/dom/host/surface-fit.ts +406 -0
- package/src/renderers/dom/host/text.tsx +1 -1
- package/src/renderers/dom/input-host.tsx +1 -0
- package/src/renderers/dom/styles.css +102 -5
- package/src/renderers/electrobun/bun/application-menu/click.ts +18 -0
- package/src/renderers/electrobun/bun/index.ts +3 -2
- package/src/renderers/electrobun/shared/protocol.ts +1 -1
- package/src/renderers/electrobun/view/cli-pane-shot-entry.tsx +29 -2
- package/src/renderers/electrobun/view/cli-pane-shot-frame.tsx +63 -20
- package/src/renderers/electrobun/view/cli-pane-shot-health.ts +10 -26
- package/src/renderers/electrobun/view/main.tsx +5 -3
- package/src/renderers/electrobun/view/remote/asset-data-client.ts +2 -0
- package/src/renderers/opentui/chart-surface.tsx +1 -0
- package/src/renderers/opentui/frame-capture.ts +33 -0
- package/src/renderers/opentui/host.tsx +10 -13
- package/src/renderers/opentui/pane-image/glyphs-license.txt +107 -0
- package/src/renderers/opentui/pane-image/glyphs.json +1 -0
- package/src/renderers/opentui/pane-image/index.ts +107 -0
- package/src/renderers/opentui/pane-image/raster.ts +428 -0
- package/src/renderers/opentui/start.tsx +3 -3
- package/src/renderers/opentui/test-utils.tsx +3 -0
- package/src/renderers/opentui/ui-host.tsx +29 -1
- package/src/series/capability.ts +75 -0
- package/src/series/csv.ts +160 -0
- package/src/series/files.ts +107 -0
- package/src/series/registry.ts +198 -0
- package/src/series/resolve.ts +108 -0
- package/src/series/standalone.ts +48 -0
- package/src/series/types.ts +153 -0
- package/src/series/validate.ts +171 -0
- package/src/shares/chat.ts +34 -0
- package/src/shares/dialog.tsx +295 -0
- package/src/shares/flow.tsx +56 -0
- package/src/shares/live.ts +14 -22
- package/src/shares/pane-image.ts +152 -0
- package/src/shares/personal-pane.ts +64 -0
- package/src/shares/portable-layout.ts +4 -2
- package/src/shares/prepare.ts +20 -0
- package/src/sources/gloomberb-cloud/index.ts +109 -10
- package/src/sources/gloomberb-cloud/normalizers.ts +3 -0
- package/src/sources/gloomberb-cloud/perpetuals.ts +249 -0
- package/src/sources/history-result.ts +1 -0
- package/src/sources/history-retention.ts +11 -0
- package/src/sources/listing-symbols.ts +4 -1
- package/src/sources/listing-target.ts +4 -0
- package/src/sources/provider-router/batches.ts +4 -1
- package/src/sources/provider-router/cache.ts +4 -2
- package/src/sources/provider-router/cached-routes.ts +1 -1
- package/src/sources/provider-router/financial-routes.ts +1 -0
- package/src/sources/provider-router/financials.ts +13 -0
- package/src/sources/provider-router/history.ts +43 -25
- package/src/sources/provider-router/index.ts +14 -0
- package/src/sources/provider-router/search.ts +1 -0
- package/src/state/hooks/inline-tickers.ts +49 -11
- package/src/sync/core-contributors.ts +1 -0
- package/src/test-support/shell-pane-keys.tsx +1 -0
- package/src/theme/theme-context.tsx +15 -1
- package/src/tickers/company-name.ts +75 -0
- package/src/tickers/instrument-kind.ts +34 -1
- package/src/tickers/listing-name.ts +34 -0
- package/src/tickers/listing-venues.ts +132 -0
- package/src/tickers/open-target.ts +13 -4
- package/src/tickers/perpetual-listing.ts +151 -0
- package/src/tickers/prediction-listing.ts +26 -0
- package/src/tickers/search/index.ts +72 -11
- package/src/tickers/search/ranking.ts +98 -20
- package/src/tickers/search/types.ts +7 -1
- package/src/tickers/ticker-changes.ts +213 -0
- package/src/tickers/us-listing.ts +34 -0
- package/src/time-series/economic.ts +2 -6
- package/src/time-series/hooks.ts +9 -0
- package/src/time-series/ice-credit.ts +39 -0
- package/src/time-series/resolve.ts +211 -29
- package/src/time-series/studies.ts +1 -0
- package/src/time-series/types.ts +12 -2
- package/src/time-series/use-chart-resolution.ts +32 -0
- package/src/types/config.ts +10 -2
- package/src/types/data-provider.ts +11 -0
- package/src/types/financials.ts +62 -1
- package/src/types/headless.ts +113 -0
- package/src/types/instrument.ts +4 -0
- package/src/types/plugin.ts +52 -2
- package/src/types/price-history.ts +7 -0
- package/src/types/ticker-changes.ts +26 -0
- package/src/types/ticker.ts +14 -0
- package/src/ui/context-menu.tsx +13 -1
- package/src/ui/host.tsx +57 -3
- package/src/ui/live-resize.ts +91 -0
- package/src/ui/live-stretch.ts +153 -0
- package/src/ui/measured-cells.ts +58 -0
- package/src/ui/sticky-scroll.ts +7 -0
- package/src/utils/basis-points.ts +17 -0
- package/src/utils/central-banks.ts +76 -0
- package/src/utils/cli-output.ts +131 -15
- package/src/utils/concurrency.ts +25 -0
- package/src/utils/crypto-pair.ts +20 -0
- package/src/utils/currency-pair.ts +19 -0
- package/src/utils/currency-units.ts +11 -0
- package/src/utils/datetime-format.ts +27 -6
- package/src/utils/decimal-comma.ts +19 -0
- package/src/utils/dom-screenshot-css.ts +265 -0
- package/src/utils/dom-screenshot-rasters.ts +276 -0
- package/src/utils/dom-screenshot.ts +439 -52
- package/src/utils/double-escape-close.ts +15 -1
- package/src/utils/exchange-rate-snapshot.ts +6 -2
- package/src/utils/exchanges.ts +143 -1
- package/src/utils/format.ts +35 -5
- package/src/utils/forward-dividend.ts +14 -0
- package/src/utils/fundamentals.ts +66 -0
- package/src/utils/futures-generic.ts +6 -12
- package/src/utils/fx-market-hours.ts +15 -5
- package/src/utils/fx-status.ts +6 -1
- package/src/utils/inline-content-tokenizer.ts +22 -3
- package/src/utils/market-capitalization.ts +8 -0
- package/src/utils/one-shot.ts +73 -0
- package/src/utils/options.ts +37 -8
- package/src/utils/price-history.ts +99 -42
- package/src/utils/sec-eps-basis.ts +24 -11
- package/src/utils/sec.ts +61 -7
- package/src/utils/utc-time.ts +63 -4
- package/src/plugins/builtin/fx-matrix/freshness.ts +0 -65
- /package/src/plugins/{builtin/plugin-marketplace → marketplace}/activation.ts +0 -0
- /package/src/plugins/{builtin/plugin-marketplace → marketplace}/ids.ts +0 -0
- /package/src/plugins/{builtin/plugin-marketplace → marketplace}/packs.ts +0 -0
- /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
|
-
|
|
22
|
-
const
|
|
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
|
-
|
|
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: (
|
|
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
|
-
|
|
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,
|
|
43
|
-
return Math.min(availableWidth / LONGITUDE_SPAN, effectiveHeight /
|
|
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
|
|
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 -
|
|
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,
|
|
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
|
|
142
|
+
const halfNorthing = effectiveHeight / (2 * scale);
|
|
106
143
|
const minLongitude = -180 + halfLongitude;
|
|
107
144
|
const maxLongitude = 180 - halfLongitude;
|
|
108
|
-
const
|
|
109
|
-
const
|
|
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:
|
|
117
|
-
? clamp(viewport.centerLatitude,
|
|
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
|
-
|
|
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})([
|
|
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 (
|
|
153
|
-
|
|
154
|
-
|
|
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
|
-
/**
|
|
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 === "
|
|
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
|
-
|
|
15
|
-
const
|
|
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
|
|
27
|
-
|
|
28
|
-
|
|
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
|
-
|
|
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
|
|
117
|
-
const
|
|
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:
|
|
171
|
+
...(comparePoints ? { columns: compareColumns(compareAsOf) } : {}),
|
|
125
172
|
rows: rows.map((point) => {
|
|
126
173
|
const compare = compareAt(point.maturity);
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
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
|
-
...(
|
|
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 ? {
|
|
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+[
|
|
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
|
-
|
|
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({
|
package/src/plugins/installer.ts
CHANGED
|
@@ -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 "./
|
|
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("./
|
|
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;
|
package/src/plugins/loader.ts
CHANGED
|
@@ -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 "./
|
|
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 "
|
|
2
|
-
import { isOfficialPluginRepo } from "
|
|
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 "
|
|
2
|
-
import { compareSemver, formatVersion, requiredGloomberb } from "
|
|
3
|
-
import { runsExternalPlugins } from "
|
|
4
|
-
import { BUILTIN_EDITORIAL } from "
|
|
5
|
-
import { builtinPluginGroupMembers } from "
|
|
6
|
-
import type { FunctionAccess } from "
|
|
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";
|