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
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import type { CloudCdsHistoryPointPayload, CloudCdsTradePayload } from "../../../api-client";
|
|
1
|
+
import type { CloudCdsHistoryPointPayload, CloudCdsLevelPayload, CloudCdsTradePayload } from "../../../api-client";
|
|
2
2
|
import type { DataTableColumn, StatItem } from "../../../components";
|
|
3
3
|
import type { TimeSeriesPoint } from "../../../time-series/types";
|
|
4
|
+
import type { HeadlessPaneFreshness } from "../../../types/headless";
|
|
4
5
|
import type { TickerRecord } from "../../../types/ticker";
|
|
5
6
|
import { formatCompact } from "../../../utils/format";
|
|
6
7
|
import { compareSortValues, type SortPreference } from "../../../utils/sort-values";
|
|
@@ -45,7 +46,11 @@ export interface CdsIssuerSummary {
|
|
|
45
46
|
issuer: string;
|
|
46
47
|
trades: number;
|
|
47
48
|
lastTradeAt: number;
|
|
49
|
+
/** The newest spread a trade reported, when any did. */
|
|
48
50
|
latestSpreadBp: number | null;
|
|
51
|
+
/** The latest level of the issuer's 5Y line and its date, where it has one: what the list ranks by. */
|
|
52
|
+
spread5yBp: number | null;
|
|
53
|
+
spread5yDate: string | null;
|
|
49
54
|
}
|
|
50
55
|
|
|
51
56
|
/**
|
|
@@ -119,6 +124,32 @@ export function issuerGroupKey(name: string): string {
|
|
|
119
124
|
return (meaningful.length > 0 ? meaningful : tokens).join(" ") || name.trim().toLowerCase();
|
|
120
125
|
}
|
|
121
126
|
|
|
127
|
+
/**
|
|
128
|
+
* DTCC writes a comma inside a field as `;` ("CCO Holdings;LLC",
|
|
129
|
+
* "Amazon.com;Inc."), so a name gets its comma back before it is shown,
|
|
130
|
+
* grouped or sent as a query.
|
|
131
|
+
*/
|
|
132
|
+
export function displayIssuerName(name: string): string {
|
|
133
|
+
return name.replace(/\s*;\s*/g, ", ").trim();
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* What a listing's name says about the security rather than the company:
|
|
138
|
+
* share class, stock or receipt type. The tape names issuers, never their
|
|
139
|
+
* shares, so "Alphabet Inc. Class A Common Stock" has to become "Alphabet Inc.".
|
|
140
|
+
*/
|
|
141
|
+
const SECURITY_SUFFIX = /[\s,-]+(?:(?:class|series)\s+[a-z0-9]{1,2}|common|ordinary|stock|shares?|(?:american\s+)?(?:depositary|depository)(?:\s+(?:shares?|receipts?))?|ads|adrs?)$/i;
|
|
142
|
+
|
|
143
|
+
/** The issuer a listing's name stands for, as the tape would name it: its comma back, its share class gone. */
|
|
144
|
+
export function issuerNameOf(name: string): string {
|
|
145
|
+
let current = displayIssuerName(name);
|
|
146
|
+
for (;;) {
|
|
147
|
+
const next = current.replace(SECURITY_SUFFIX, "").trim();
|
|
148
|
+
if (next === current || !next) return current;
|
|
149
|
+
current = next;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
122
153
|
/** Mixed case reads as a real name; all-caps is the tape shouting. */
|
|
123
154
|
function isMixedCase(name: string): boolean {
|
|
124
155
|
return name !== name.toUpperCase();
|
|
@@ -177,9 +208,9 @@ function tapeTime(trade: CloudCdsTradePayload): number | null {
|
|
|
177
208
|
*/
|
|
178
209
|
function issuerOf(trade: CloudCdsTradePayload): string | null {
|
|
179
210
|
const reported = trade.issuerName?.trim();
|
|
180
|
-
if (reported) return reported;
|
|
211
|
+
if (reported) return displayIssuerName(reported);
|
|
181
212
|
const underlier = trade.upiUnderlierName?.trim();
|
|
182
|
-
return underlier && identifiesIssuer(underlier) ? underlier : null;
|
|
213
|
+
return underlier && identifiesIssuer(underlier) ? displayIssuerName(underlier) : null;
|
|
183
214
|
}
|
|
184
215
|
|
|
185
216
|
export function normalizeCdsTrades(trades: readonly CloudCdsTradePayload[]): CdsTrade[] {
|
|
@@ -227,6 +258,8 @@ export function summarizeIssuers(trades: readonly CdsTrade[]): CdsIssuerSummary[
|
|
|
227
258
|
trades: 1,
|
|
228
259
|
lastTradeAt: trade.eventAt,
|
|
229
260
|
latestSpreadBp: trade.spreadBp,
|
|
261
|
+
spread5yBp: null,
|
|
262
|
+
spread5yDate: null,
|
|
230
263
|
});
|
|
231
264
|
if (trade.spreadBp != null) spreadAt.set(trade.issuerKey, trade.eventAt);
|
|
232
265
|
continue;
|
|
@@ -242,20 +275,130 @@ export function summarizeIssuers(trades: readonly CdsTrade[]): CdsIssuerSummary[
|
|
|
242
275
|
return [...byIssuer.values()];
|
|
243
276
|
}
|
|
244
277
|
|
|
278
|
+
/** The latest 5Y level and its date, by issuer key. */
|
|
279
|
+
export type CdsSpreadLevels = ReadonlyMap<string, { spreadBp: number; date: string }>;
|
|
280
|
+
|
|
281
|
+
/**
|
|
282
|
+
* The backend's levels under the key the list groups issuers by, so every
|
|
283
|
+
* spelling of a name finds its level. Where two names the backend keeps apart
|
|
284
|
+
* fold into one key ("Oracle Corporation", "Oracle Cop"), the spelling the
|
|
285
|
+
* list would show keeps it. Malformed entries are left out.
|
|
286
|
+
*/
|
|
287
|
+
export function spreadLevelsOf(levels: readonly CloudCdsLevelPayload[]): CdsSpreadLevels {
|
|
288
|
+
const byKey = new Map<string, { issuer: string; spreadBp: number; date: string }>();
|
|
289
|
+
for (const level of levels) {
|
|
290
|
+
if (typeof level.issuer !== "string" || !/^\d{4}-\d{2}-\d{2}$/.test(level.date) || !Number.isFinite(level.spreadBp)) continue;
|
|
291
|
+
const issuer = displayIssuerName(level.issuer);
|
|
292
|
+
if (!issuer) continue;
|
|
293
|
+
const key = issuerGroupKey(issuer);
|
|
294
|
+
const current = byKey.get(key);
|
|
295
|
+
if (current && preferredIssuerName(current.issuer, issuer) === current.issuer) continue;
|
|
296
|
+
byKey.set(key, { issuer, spreadBp: level.spreadBp, date: level.date });
|
|
297
|
+
}
|
|
298
|
+
return new Map([...byKey].map(([key, { spreadBp, date }]) => [key, { spreadBp, date }]));
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
/** Each issuer with the latest level of its 5Y line, where it has one, so the list ranks by it. */
|
|
302
|
+
export function withSpreadLevels(rows: readonly CdsIssuerSummary[], levels: CdsSpreadLevels | null): CdsIssuerSummary[] {
|
|
303
|
+
if (!levels?.size) return [...rows];
|
|
304
|
+
return rows.map((row) => {
|
|
305
|
+
const level = levels.get(row.key);
|
|
306
|
+
return level ? { ...row, spread5yBp: level.spreadBp, spread5yDate: level.date } : row;
|
|
307
|
+
});
|
|
308
|
+
}
|
|
309
|
+
|
|
245
310
|
export function tradesForIssuer(trades: readonly CdsTrade[], issuerKey: string): CdsTrade[] {
|
|
246
311
|
return trades.filter((trade) => trade.issuerKey === issuerKey);
|
|
247
312
|
}
|
|
248
313
|
|
|
314
|
+
/**
|
|
315
|
+
* When the view was last traded: its newest print, or the last day its 5Y
|
|
316
|
+
* line has a level when no print is in the window. Null when neither is.
|
|
317
|
+
*/
|
|
318
|
+
export function lastTradeOf(
|
|
319
|
+
trades: readonly Pick<CdsTrade, "eventAt">[],
|
|
320
|
+
points: readonly Pick<CloudCdsHistoryPointPayload, "date">[] = [],
|
|
321
|
+
): number | string | null {
|
|
322
|
+
const newest = trades.reduce<number | null>((latest, trade) => (latest == null || trade.eventAt > latest ? trade.eventAt : latest), null);
|
|
323
|
+
const lineDate = points.at(-1)?.date ?? null;
|
|
324
|
+
if (newest == null) return lineDate;
|
|
325
|
+
return lineDate && Date.parse(`${lineDate}T00:00:00Z`) > newest ? lineDate : newest;
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
/**
|
|
329
|
+
* How current a CDS view is, the same at the end of `fn`, in the pane footer
|
|
330
|
+
* and on a shot: dated by its last trade, never by when the tape was fetched,
|
|
331
|
+
* with how many days that trade is behind:
|
|
332
|
+
* `Source: DTCC · last trade 2026-10-09 · lag 2 days`.
|
|
333
|
+
*/
|
|
334
|
+
export function cdsFreshness(lastTrade: number | string | null): HeadlessPaneFreshness {
|
|
335
|
+
return {
|
|
336
|
+
source: "DTCC",
|
|
337
|
+
// Public dissemination of swap trades, held back by rule for some trades.
|
|
338
|
+
status: "delayed",
|
|
339
|
+
dataset: true,
|
|
340
|
+
observation: "last trade",
|
|
341
|
+
asOf: typeof lastTrade === "number" ? new Date(lastTrade).toISOString() : lastTrade,
|
|
342
|
+
// The rows are a history, whose first entry is not stale data.
|
|
343
|
+
oldest: null,
|
|
344
|
+
};
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
/**
|
|
348
|
+
* What an empty view says: the window searched and, for one name, the
|
|
349
|
+
* reference entity the query became, with what was typed when that differs.
|
|
350
|
+
*/
|
|
351
|
+
export function noTradesMessage({ query, issuer, days }: {
|
|
352
|
+
query: string | null;
|
|
353
|
+
issuer: string | null;
|
|
354
|
+
days: number;
|
|
355
|
+
}): string {
|
|
356
|
+
const window = `in the last ${days} days`;
|
|
357
|
+
if (!query) return `No single-name CDS trades ${window}.`;
|
|
358
|
+
const name = issuer && issuer.toUpperCase() !== query.toUpperCase() ? `${issuer} (${query})` : issuer ?? query;
|
|
359
|
+
return `No CDS trades for ${name} ${window}.`;
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
/**
|
|
363
|
+
* Listed companies whose CDS references another entity than the one their
|
|
364
|
+
* shares trade as, usually the subsidiary or holding company that issues the
|
|
365
|
+
* debt. The tape never names the listed parent, so its name would match no
|
|
366
|
+
* trade. Every name here matches the entity's own spellings on the tape.
|
|
367
|
+
*/
|
|
368
|
+
const CDS_REFERENCE_ENTITIES: Readonly<Record<string, string>> = {
|
|
369
|
+
CHTR: "CCO Holdings, LLC",
|
|
370
|
+
GNW: "Genworth Holdings, Inc.",
|
|
371
|
+
HLT: "Hilton Domestic Operating Company Inc.",
|
|
372
|
+
HRB: "Block Financial LLC",
|
|
373
|
+
HTZ: "The Hertz Corporation",
|
|
374
|
+
IHRT: "iHeartCommunications, Inc.",
|
|
375
|
+
MPW: "MPT Operating Partnership, LP",
|
|
376
|
+
NCLH: "NCL Corporation Ltd.",
|
|
377
|
+
NXST: "Nexstar Media Inc.",
|
|
378
|
+
OMF: "OneMain Finance Corporation",
|
|
379
|
+
PARA: "Paramount Global",
|
|
380
|
+
PSKY: "Paramount Global",
|
|
381
|
+
SIRI: "Sirius XM Radio LLC",
|
|
382
|
+
TMUS: "T-Mobile USA, Inc.",
|
|
383
|
+
};
|
|
384
|
+
|
|
385
|
+
/** The reference entity a ticker's CDS trades under, when it is not the listed company. */
|
|
386
|
+
export function cdsReferenceEntity(symbol: string): string | null {
|
|
387
|
+
return CDS_REFERENCE_ENTITIES[symbol.trim().toUpperCase()] ?? null;
|
|
388
|
+
}
|
|
389
|
+
|
|
249
390
|
/**
|
|
250
391
|
* What the pane asks for. A tracked ticker already carries its company name; an
|
|
251
|
-
* untracked one
|
|
252
|
-
*
|
|
392
|
+
* untracked one, or one whose CDS references another entity, yields the bare
|
|
393
|
+
* symbol, which the loader expands before it reaches the backend.
|
|
253
394
|
*/
|
|
254
395
|
export function resolveIssuerQuery(
|
|
255
396
|
symbol: string | null,
|
|
256
397
|
ticker: TickerRecord | null,
|
|
257
398
|
): string | null {
|
|
258
|
-
|
|
399
|
+
const bare = symbol?.trim().toUpperCase() || null;
|
|
400
|
+
if (bare && cdsReferenceEntity(bare)) return bare;
|
|
401
|
+
return ticker?.metadata.name?.trim() || bare;
|
|
259
402
|
}
|
|
260
403
|
|
|
261
404
|
export function formatBp(value: number | null): string {
|
|
@@ -268,26 +411,29 @@ export function formatNotional(trade: Pick<CdsTrade, "notional" | "notionalCappe
|
|
|
268
411
|
return `${formatCompact(trade.notional)}${trade.notionalCapped ? "+" : ""}`;
|
|
269
412
|
}
|
|
270
413
|
|
|
414
|
+
/**
|
|
415
|
+
* DTCC publishes the upfront without a direction, and who paid it is not
|
|
416
|
+
* public, so it is an absolute amount: never signed, and labelled `abs`
|
|
417
|
+
* where it is shown.
|
|
418
|
+
*/
|
|
271
419
|
export function formatUpfront(trade: Pick<CdsTrade, "upfront" | "upfrontCurrency">): string {
|
|
272
420
|
if (trade.upfront == null) return "--";
|
|
273
|
-
|
|
274
|
-
return `${sign}${formatCompact(trade.upfront)}${trade.upfrontCurrency ? ` ${trade.upfrontCurrency}` : ""}`;
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
function pad(value: number): string {
|
|
278
|
-
return String(value).padStart(2, "0");
|
|
421
|
+
return `${formatCompact(Math.abs(trade.upfront))}${trade.upfrontCurrency ? ` ${trade.upfrontCurrency}` : ""}`;
|
|
279
422
|
}
|
|
280
423
|
|
|
281
|
-
/**
|
|
424
|
+
/**
|
|
425
|
+
* `2026-10-09 13:21`, in UTC: DTCC disseminates in UTC, a guessed local zone
|
|
426
|
+
* misdates prints, and `10/09` reads as 10 September to most of the world.
|
|
427
|
+
*/
|
|
282
428
|
export function formatEventTime(eventAt: number): string {
|
|
283
|
-
|
|
284
|
-
return
|
|
429
|
+
if (!Number.isFinite(eventAt)) return "--";
|
|
430
|
+
return new Date(eventAt).toISOString().slice(0, 16).replace("T", " ");
|
|
285
431
|
}
|
|
286
432
|
|
|
287
433
|
export function formatAsOf(asOf: string | null): string | null {
|
|
288
434
|
if (!asOf) return null;
|
|
289
435
|
const parsed = Date.parse(asOf);
|
|
290
|
-
return Number.isFinite(parsed) ? `${formatEventTime(parsed)}
|
|
436
|
+
return Number.isFinite(parsed) ? `${formatEventTime(parsed)} UTC` : asOf;
|
|
291
437
|
}
|
|
292
438
|
|
|
293
439
|
export function formatMaturity(maturity: string | null): string {
|
|
@@ -307,8 +453,8 @@ export function buildIssuerColumns(): IssuerColumn[] {
|
|
|
307
453
|
return [
|
|
308
454
|
{ id: "issuer", label: "ISSUER", width: 16, align: "left", flexGrow: 1 },
|
|
309
455
|
{ id: "trades", label: "TRADES", width: 7, align: "right" },
|
|
310
|
-
{ id: "last", label: "LAST UTC", width:
|
|
311
|
-
{ id: "spread", label: "SPREAD", width: 10, align: "right" },
|
|
456
|
+
{ id: "last", label: "LAST UTC", width: 16, align: "left" },
|
|
457
|
+
{ id: "spread", label: "5Y SPREAD", width: 10, align: "right" },
|
|
312
458
|
];
|
|
313
459
|
}
|
|
314
460
|
|
|
@@ -321,7 +467,7 @@ function issuerSortValue(columnId: IssuerColumnId, row: CdsIssuerSummary): strin
|
|
|
321
467
|
case "last":
|
|
322
468
|
return row.lastTradeAt;
|
|
323
469
|
case "spread":
|
|
324
|
-
return row.
|
|
470
|
+
return row.spread5yBp;
|
|
325
471
|
}
|
|
326
472
|
}
|
|
327
473
|
|
|
@@ -357,15 +503,15 @@ export const TRADE_SORT_COLUMN_IDS: readonly TradeColumnId[] = [
|
|
|
357
503
|
export const DEFAULT_TRADE_SORT: TradeSortPreference = { columnId: "time", direction: "desc" };
|
|
358
504
|
|
|
359
505
|
export function buildTradeColumns(width: number): TradeColumn[] {
|
|
360
|
-
const maturityWidth = Math.max(10, Math.min(12, width -
|
|
506
|
+
const maturityWidth = Math.max(10, Math.min(12, width - 59));
|
|
361
507
|
return [
|
|
362
|
-
{ id: "time", label: "TIME UTC", width:
|
|
508
|
+
{ id: "time", label: "TIME UTC", width: 16, align: "left" },
|
|
363
509
|
{ id: "maturity", label: "MATURITY", width: maturityWidth, align: "left" },
|
|
364
510
|
{ id: "notional", label: "NOTIONAL", width: 11, align: "right" },
|
|
365
511
|
{ id: "currency", label: "CCY", width: 5, align: "left" },
|
|
366
512
|
{ id: "coupon", label: "COUPON", width: 9, align: "right" },
|
|
367
513
|
{ id: "spread", label: "SPREAD", width: 10, align: "right" },
|
|
368
|
-
{ id: "upfront", label: "UPFRONT", width: 13, align: "right" },
|
|
514
|
+
{ id: "upfront", label: "ABS UPFRONT", width: 13, align: "right" },
|
|
369
515
|
];
|
|
370
516
|
}
|
|
371
517
|
|
|
@@ -423,35 +569,71 @@ export function spreadChartPoints(points: readonly CloudCdsHistoryPointPayload[]
|
|
|
423
569
|
return out;
|
|
424
570
|
}
|
|
425
571
|
|
|
426
|
-
|
|
572
|
+
/** The 1M move as the pane shows it: whole basis points, signed. */
|
|
573
|
+
export function formatSpreadChange(value: number): string {
|
|
427
574
|
const rounded = Math.round(value);
|
|
428
575
|
return `${rounded > 0 ? "+" : ""}${rounded}bp`;
|
|
429
576
|
}
|
|
430
577
|
|
|
578
|
+
function dayTime(date: string): number {
|
|
579
|
+
return Date.parse(`${date}T00:00:00Z`);
|
|
580
|
+
}
|
|
581
|
+
|
|
582
|
+
/** The figures of an issuer's 5Y line, the ones the pane heads its chart with and a report carries. */
|
|
583
|
+
export interface CdsSpreadSummary {
|
|
584
|
+
/** The latest level, bp, and the New York trade date it is from. */
|
|
585
|
+
spreadBp: number;
|
|
586
|
+
date: string;
|
|
587
|
+
/** The move over a month on the same contract; null across a roll or a gap. */
|
|
588
|
+
change1mBp: number | null;
|
|
589
|
+
/** Lowest and highest level since the first date charted; null with a single level. */
|
|
590
|
+
range: { lowBp: number; highBp: number; since: string } | null;
|
|
591
|
+
}
|
|
592
|
+
|
|
431
593
|
/**
|
|
432
594
|
* The latest level, its move over a month, and the range of what the chart
|
|
433
595
|
* shows. The month compares against the last level 30 to 45 days older on the
|
|
434
596
|
* same contract, so neither a gap nor a roll to the next contract, which
|
|
435
597
|
* trades wider, passes for a move.
|
|
436
598
|
*/
|
|
437
|
-
export function
|
|
599
|
+
export function spreadSummary(points: readonly CloudCdsHistoryPointPayload[]): CdsSpreadSummary | null {
|
|
438
600
|
const latest = points.at(-1);
|
|
439
|
-
if (!latest) return
|
|
440
|
-
const latestTime =
|
|
601
|
+
if (!latest) return null;
|
|
602
|
+
const latestTime = dayTime(latest.date);
|
|
441
603
|
const monthAgo = points.findLast((point) => {
|
|
442
604
|
if (point.maturity !== latest.maturity) return false;
|
|
443
|
-
const age = latestTime -
|
|
605
|
+
const age = latestTime - dayTime(point.date);
|
|
444
606
|
return age >= 30 * DAY_MS && age <= 45 * DAY_MS;
|
|
445
607
|
});
|
|
446
608
|
const levels = points.map((point) => point.spreadBp);
|
|
609
|
+
return {
|
|
610
|
+
spreadBp: latest.spreadBp,
|
|
611
|
+
date: latest.date,
|
|
612
|
+
// A tenth of a basis point is the line's own precision; the rest is float noise.
|
|
613
|
+
change1mBp: monthAgo ? Math.round((latest.spreadBp - monthAgo.spreadBp) * 10) / 10 : null,
|
|
614
|
+
range: points.length >= 2
|
|
615
|
+
? { lowBp: Math.min(...levels), highBp: Math.max(...levels), since: points[0]!.date }
|
|
616
|
+
: null,
|
|
617
|
+
};
|
|
618
|
+
}
|
|
619
|
+
|
|
620
|
+
/** `129 to 276bp`: the low keeps the level's precision, so the level never falls outside it. */
|
|
621
|
+
export function formatSpreadRange(range: NonNullable<CdsSpreadSummary["range"]>): string {
|
|
622
|
+
return `${formatBp(range.lowBp).slice(0, -2)} to ${formatBp(range.highBp)}`;
|
|
623
|
+
}
|
|
624
|
+
|
|
625
|
+
/** The pane's figures over its 5Y chart, from `spreadSummary`. */
|
|
626
|
+
export function spreadFigures(points: readonly CloudCdsHistoryPointPayload[]): StatItem[] {
|
|
627
|
+
const summary = spreadSummary(points);
|
|
628
|
+
if (!summary) return [];
|
|
447
629
|
return [
|
|
448
|
-
{ id: "spread", label: "5Y spread", value: formatBp(
|
|
449
|
-
...(
|
|
450
|
-
...(
|
|
630
|
+
{ id: "spread", label: "5Y spread", value: formatBp(summary.spreadBp), detail: summary.date },
|
|
631
|
+
...(summary.change1mBp != null ? [{ id: "change", label: "1M", value: formatSpreadChange(summary.change1mBp) }] : []),
|
|
632
|
+
...(summary.range ? [{
|
|
451
633
|
id: "range",
|
|
452
634
|
label: "Range",
|
|
453
|
-
value:
|
|
454
|
-
detail: `since ${
|
|
635
|
+
value: formatSpreadRange(summary.range),
|
|
636
|
+
detail: `since ${summary.range.since}`,
|
|
455
637
|
}] : []),
|
|
456
638
|
];
|
|
457
639
|
}
|
|
@@ -23,11 +23,15 @@ import { usePluginPaneState } from "../../runtime";
|
|
|
23
23
|
import { useAutoRefresh } from "../../../react/auto-refresh";
|
|
24
24
|
import { usePaneStatusFooter } from "../../../components/layout/pane/status-footer";
|
|
25
25
|
import { usePaneRefreshKey } from "../../../components/data-table/table-pane";
|
|
26
|
+
import { deriveHeadlessFreshness, paneStatusLineVariants } from "../../../cli/pane-functions/freshness";
|
|
26
27
|
import {
|
|
28
|
+
CDS_TRADE_DAYS,
|
|
27
29
|
loadCdsActivity,
|
|
28
30
|
loadCdsSpreadHistory,
|
|
31
|
+
loadCdsSpreadLevels,
|
|
29
32
|
type CdsActivityLoader,
|
|
30
33
|
type CdsSpreadHistoryLoader,
|
|
34
|
+
type CdsSpreadLevelsLoader,
|
|
31
35
|
} from "./client";
|
|
32
36
|
import {
|
|
33
37
|
DEFAULT_ISSUER_SORT,
|
|
@@ -36,12 +40,14 @@ import {
|
|
|
36
40
|
TRADE_SORT_COLUMN_IDS,
|
|
37
41
|
buildIssuerColumns,
|
|
38
42
|
buildTradeColumns,
|
|
39
|
-
|
|
43
|
+
cdsFreshness,
|
|
40
44
|
formatBp,
|
|
41
45
|
formatEventTime,
|
|
42
46
|
formatMaturity,
|
|
43
47
|
formatNotional,
|
|
44
48
|
formatUpfront,
|
|
49
|
+
lastTradeOf,
|
|
50
|
+
noTradesMessage,
|
|
45
51
|
resolveIssuerQuery,
|
|
46
52
|
sortIssuers,
|
|
47
53
|
sortTrades,
|
|
@@ -49,6 +55,7 @@ import {
|
|
|
49
55
|
spreadFigures,
|
|
50
56
|
summarizeIssuers,
|
|
51
57
|
tradesForIssuer,
|
|
58
|
+
withSpreadLevels,
|
|
52
59
|
type CdsIssuerSummary,
|
|
53
60
|
type CdsTrade,
|
|
54
61
|
type IssuerColumn,
|
|
@@ -77,8 +84,8 @@ function renderIssuerCell(
|
|
|
77
84
|
return { text: formatEventTime(row.lastTradeAt), color: colors.textMuted };
|
|
78
85
|
case "spread":
|
|
79
86
|
return {
|
|
80
|
-
text: formatBp(row.
|
|
81
|
-
color: row.
|
|
87
|
+
text: formatBp(row.spread5yBp),
|
|
88
|
+
color: row.spread5yBp == null ? colors.textDim : colors.text,
|
|
82
89
|
};
|
|
83
90
|
}
|
|
84
91
|
}
|
|
@@ -129,6 +136,7 @@ function CdsTradeTable({
|
|
|
129
136
|
onKeyDown,
|
|
130
137
|
before,
|
|
131
138
|
lineMaturity = null,
|
|
139
|
+
emptyMessage,
|
|
132
140
|
}: {
|
|
133
141
|
trades: CdsTrade[];
|
|
134
142
|
focused: boolean;
|
|
@@ -142,6 +150,8 @@ function CdsTradeTable({
|
|
|
142
150
|
before?: ReactNode;
|
|
143
151
|
/** The contract the 5Y line follows today. */
|
|
144
152
|
lineMaturity?: string | null;
|
|
153
|
+
/** What an empty table says: the window and the name searched. */
|
|
154
|
+
emptyMessage: string;
|
|
145
155
|
}) {
|
|
146
156
|
const columns = useMemo(() => buildTradeColumns(width), [width]);
|
|
147
157
|
const renderTradeRow = useCallback((trade: CdsTrade, column: TradeColumn) => (
|
|
@@ -168,12 +178,13 @@ function CdsTradeTable({
|
|
|
168
178
|
getItemKey={tradeKey}
|
|
169
179
|
renderCell={renderTradeRow}
|
|
170
180
|
selectedTextOverridesCellColor
|
|
171
|
-
emptyStateTitle=
|
|
181
|
+
emptyStateTitle={emptyMessage}
|
|
172
182
|
/>
|
|
173
183
|
);
|
|
174
184
|
}
|
|
175
185
|
|
|
176
186
|
const NO_TRADES: CdsTrade[] = [];
|
|
187
|
+
const NO_ISSUERS: CdsIssuerSummary[] = [];
|
|
177
188
|
const NO_POINTS: CloudCdsHistoryPointPayload[] = [];
|
|
178
189
|
/**
|
|
179
190
|
* The 5Y line has one point per New York trade date, dated at UTC midnight, so
|
|
@@ -231,6 +242,18 @@ interface CdsPaneProps extends PaneProps {
|
|
|
231
242
|
/** Injected by tests so the pane renders without the cloud backend. */
|
|
232
243
|
loadActivity?: CdsActivityLoader;
|
|
233
244
|
loadHistory?: CdsSpreadHistoryLoader;
|
|
245
|
+
loadLevels?: CdsSpreadLevelsLoader;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
/**
|
|
249
|
+
* The line `fn CDS` and `shot CDS` end with, from the same declaration:
|
|
250
|
+
* `Source: DTCC · last trade 2026-10-09 · lag 2 days`.
|
|
251
|
+
*/
|
|
252
|
+
function cdsStatusSegments(lastTrade: number | string | null): PaneFooterSegment[] {
|
|
253
|
+
if (lastTrade == null) return [];
|
|
254
|
+
const freshness = deriveHeadlessFreshness({ shape: "rows" }, { rows: [], freshness: cdsFreshness(lastTrade) });
|
|
255
|
+
const [line, ...shorter] = paneStatusLineVariants(freshness).map((text) => [{ text, tone: "muted" as const }]);
|
|
256
|
+
return [{ id: "cds-freshness", asOf: true, parts: line!, variants: shorter }];
|
|
234
257
|
}
|
|
235
258
|
|
|
236
259
|
export function CdsPane({
|
|
@@ -240,6 +263,7 @@ export function CdsPane({
|
|
|
240
263
|
height,
|
|
241
264
|
loadActivity = loadCdsActivity,
|
|
242
265
|
loadHistory = loadCdsSpreadHistory,
|
|
266
|
+
loadLevels = loadCdsSpreadLevels,
|
|
243
267
|
}: CdsPaneProps) {
|
|
244
268
|
const { symbol, ticker } = usePaneTickerIdentity();
|
|
245
269
|
const issuerQuery = useMemo(() => resolveIssuerQuery(symbol, ticker), [symbol, ticker]);
|
|
@@ -260,9 +284,16 @@ export function CdsPane({
|
|
|
260
284
|
useAutoRefresh(fetchedAt, load);
|
|
261
285
|
|
|
262
286
|
const trades = activity?.trades ?? NO_TRADES;
|
|
287
|
+
const summaries = useMemo(() => (issuerQuery ? NO_ISSUERS : summarizeIssuers(trades)), [issuerQuery, trades]);
|
|
288
|
+
// Every listed issuer's latest 5Y level, one request beside the trades, so the list ranks by it as `fn CDS` does.
|
|
289
|
+
const loadLevelsRef = useRef(loadLevels);
|
|
290
|
+
loadLevelsRef.current = loadLevels;
|
|
291
|
+
const levelsRequest = useCallback(() => loadLevelsRef.current(), []);
|
|
292
|
+
const levels = useAsyncResource(issuerQuery ? null : levelsRequest);
|
|
293
|
+
useAutoRefresh(levels.updatedAt, levels.load);
|
|
263
294
|
const issuers = useMemo(
|
|
264
|
-
() => (issuerQuery ? [] : sortIssuers(
|
|
265
|
-
[issuerQuery, issuerSort,
|
|
295
|
+
() => (issuerQuery ? [] : sortIssuers(withSpreadLevels(summaries, levels.data), issuerSort)),
|
|
296
|
+
[issuerQuery, issuerSort, levels.data, summaries],
|
|
266
297
|
);
|
|
267
298
|
const visibleTrades = useMemo(() => sortTrades(
|
|
268
299
|
issuerQuery ? trades : selectedIssuerKey ? tradesForIssuer(trades, selectedIssuerKey) : [],
|
|
@@ -288,7 +319,10 @@ export function CdsPane({
|
|
|
288
319
|
usePaneNoticeFooter({
|
|
289
320
|
registrationId: `${paneId}:cds-history`,
|
|
290
321
|
focused,
|
|
291
|
-
notices:
|
|
322
|
+
notices: [
|
|
323
|
+
...(historyIssuer && history.error && !history.data ? ["5Y spread history unavailable."] : []),
|
|
324
|
+
...(summaries.length && levels.error && !levels.data ? ["5Y spreads unavailable."] : []),
|
|
325
|
+
],
|
|
292
326
|
});
|
|
293
327
|
|
|
294
328
|
useEffect(() => {
|
|
@@ -313,6 +347,7 @@ export function CdsPane({
|
|
|
313
347
|
|
|
314
348
|
usePaneRefreshKey(() => {
|
|
315
349
|
load();
|
|
350
|
+
if (!issuerQuery) levels.load();
|
|
316
351
|
if (historyIssuer) history.load();
|
|
317
352
|
}, { focused });
|
|
318
353
|
|
|
@@ -343,17 +378,24 @@ export function CdsPane({
|
|
|
343
378
|
onSelect: () => (tradesInFront ? cycleTradeSort : cycleIssuerSort)(-1) },
|
|
344
379
|
], [cycleIssuerSort, cycleTradeSort, hasActivity, tradesInFront]);
|
|
345
380
|
|
|
346
|
-
|
|
347
|
-
const
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
381
|
+
// Dated by the last trade of what is in front: the issuer's, or the whole tape's.
|
|
382
|
+
const lastTrade = tradesInFront
|
|
383
|
+
? lastTradeOf(visibleTrades, spreadPoints)
|
|
384
|
+
: activity ? lastTradeOf(trades) : null;
|
|
385
|
+
const footerInfo = useMemo(() => cdsStatusSegments(lastTrade), [lastTrade]);
|
|
351
386
|
usePaneStatusFooter({
|
|
352
387
|
registrationId: paneId,
|
|
353
|
-
loading: status === "loading"
|
|
388
|
+
loading: status === "loading"
|
|
389
|
+
|| (!!historyIssuer && history.loading && !history.data)
|
|
390
|
+
|| (!issuerQuery && levels.loading && !levels.data),
|
|
354
391
|
error,
|
|
355
392
|
info: footerInfo,
|
|
356
393
|
});
|
|
394
|
+
const emptyMessage = noTradesMessage({
|
|
395
|
+
query: issuerQuery ? activity?.query ?? issuerQuery : selectedSummary?.issuer ?? null,
|
|
396
|
+
issuer: issuerQuery ? activity?.issuer ?? null : selectedSummary?.issuer ?? null,
|
|
397
|
+
days: activity?.days ?? CDS_TRADE_DAYS,
|
|
398
|
+
});
|
|
357
399
|
|
|
358
400
|
if (status === "loading" && !activity) {
|
|
359
401
|
return (
|
|
@@ -387,6 +429,7 @@ export function CdsPane({
|
|
|
387
429
|
onKeyDown={handleTradeKey}
|
|
388
430
|
before={header}
|
|
389
431
|
lineMaturity={lineMaturity}
|
|
432
|
+
emptyMessage={emptyMessage}
|
|
390
433
|
/>
|
|
391
434
|
);
|
|
392
435
|
}
|
|
@@ -414,6 +457,7 @@ export function CdsPane({
|
|
|
414
457
|
onSelect={setSelectedTradeId}
|
|
415
458
|
onKeyDown={handleTradeKey}
|
|
416
459
|
lineMaturity={lineMaturity}
|
|
460
|
+
emptyMessage={emptyMessage}
|
|
417
461
|
/>
|
|
418
462
|
) : null}
|
|
419
463
|
onDetailKeyDown={handleTradeKey}
|
|
@@ -441,7 +485,7 @@ export function CdsPane({
|
|
|
441
485
|
getItemKey={issuerKey}
|
|
442
486
|
renderCell={renderIssuerCell}
|
|
443
487
|
selectedTextOverridesCellColor
|
|
444
|
-
emptyStateTitle={error ? "CDS activity unavailable." :
|
|
488
|
+
emptyStateTitle={error ? "CDS activity unavailable." : emptyMessage}
|
|
445
489
|
/>
|
|
446
490
|
);
|
|
447
491
|
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { apiClient } from "../../../api-client";
|
|
2
|
+
import type { SeriesDefinition } from "../../../series/types";
|
|
3
|
+
import { loadCdsSpreadHistory, resolveIssuerName } from "./client";
|
|
4
|
+
|
|
5
|
+
/** A company's on-the-run 5Y CDS spread, by its ticker, as the CDS pane charts it. */
|
|
6
|
+
export const SINGLE_NAME_CDS_SERIES: readonly SeriesDefinition[] = [{
|
|
7
|
+
id: "cds:single-name-5y",
|
|
8
|
+
name: "5Y CDS spread",
|
|
9
|
+
unit: "bp",
|
|
10
|
+
frequency: "daily",
|
|
11
|
+
group: "Credit",
|
|
12
|
+
tags: ["CDS", "single name", "credit default swap", "spread"],
|
|
13
|
+
input: "ticker",
|
|
14
|
+
load: async ({ ticker }) => {
|
|
15
|
+
const issuer = await resolveIssuerName(ticker!, (query, limit) => apiClient.searchInstruments(query, limit));
|
|
16
|
+
const history = await loadCdsSpreadHistory(issuer);
|
|
17
|
+
return history.points.map((point) => ({ date: point.date, value: point.spreadBp }));
|
|
18
|
+
},
|
|
19
|
+
}];
|
|
@@ -45,6 +45,10 @@ export function validateCentralBankRates(payload: CentralBankRatesPayload): Cent
|
|
|
45
45
|
if (row.nextMeeting !== null && (!row.nextMeeting || row.nextMeeting.date == null || !dateOrNull(row.nextMeeting.date)
|
|
46
46
|
|| !urlOrNull(row.nextMeeting.sourceUrl) || row.nextMeeting.sourceUrl == null
|
|
47
47
|
|| !Number.isFinite(Date.parse(row.nextMeeting.verifiedAt)))) return invalid();
|
|
48
|
+
// Fields a newer server adds are read only when they hold what this app expects.
|
|
49
|
+
if (row.nextMeeting && row.nextMeeting.kind !== undefined && row.nextMeeting.kind !== "decision" && row.nextMeeting.kind !== "fixing") delete row.nextMeeting.kind;
|
|
50
|
+
if (row.nextMeetingStatus !== undefined && !["scheduled", "not-published", "not-verified", "no-policy-rate"].includes(row.nextMeetingStatus)) delete row.nextMeetingStatus;
|
|
51
|
+
if (row.seriesNotes !== undefined && !strings(row.seriesNotes)) delete row.seriesNotes;
|
|
48
52
|
}
|
|
49
53
|
return payload;
|
|
50
54
|
}
|