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
|
@@ -16,18 +16,20 @@ import { publicTickerKey } from "../../../utils/exchanges";
|
|
|
16
16
|
import { truncateToDisplayWidth } from "../../../utils/format";
|
|
17
17
|
import { SignInWall } from "../cloud/auth-actions";
|
|
18
18
|
import { CLOUD_PLAN_KEY, useCloudUpgradeAction } from "../shared/cloud-upgrade";
|
|
19
|
+
import { useOpenDescription } from "../shared/open-description";
|
|
19
20
|
import { Blurred, LockedOverlay, UpgradeLabel } from "../shared/locked-rows";
|
|
20
21
|
import { isCloudSessionRequired, useResearchCloudSession } from "../shared/research-cloud-session";
|
|
21
22
|
import { AwardDetail } from "./detail";
|
|
22
23
|
import { useAwardAlerts } from "./alerts";
|
|
23
24
|
import { AWARDS_UNAVAILABLE, fetchAwards, loadAward, loadAwards, validateAwards } from "./client";
|
|
24
25
|
import { useAwardsEvidence } from "./evidence";
|
|
25
|
-
import { AWARD_TABS, aggregateId, awardHistorySeries, awardPercent, awardPeriod, awardScope, awardTab, awardTypeLabel, money,
|
|
26
|
+
import { AWARD_TABS, aggregateId, awardHistorySeries, awardPercent, awardPeriod, awardScope, awardsPreviewNote, awardTab, awardTypeLabel, futureAwardDatesNote, money,
|
|
27
|
+
rankedAggregates } from "./model";
|
|
26
28
|
|
|
27
29
|
type Item = { kind: "award"; row: AwardRow } | { kind: "aggregate"; row: AwardAggregate } | { kind: "leader"; row: AwardCompanyLeader } | { kind: "locked"; id: string }
|
|
28
|
-
| { kind: "section"; id: string; label: string; count: number };
|
|
29
|
-
const itemId = (item: Item) => item.kind === "locked" || item.kind === "section" ? item.id : item.kind === "award" ? item.row.id : item.kind === "leader" ? `${aggregateId(item.row)}:${item.row.sector}` : aggregateId(item.row);
|
|
30
|
-
const isRowItem = (item: Item) => item.kind !== "section";
|
|
30
|
+
| { kind: "section"; id: string; label: string; count: number } | { kind: "note"; id: string; text: string };
|
|
31
|
+
const itemId = (item: Item) => item.kind === "locked" || item.kind === "section" || item.kind === "note" ? item.id : item.kind === "award" ? item.row.id : item.kind === "leader" ? `${aggregateId(item.row)}:${item.row.sector}` : aggregateId(item.row);
|
|
32
|
+
const isRowItem = (item: Item) => item.kind !== "section" && item.kind !== "note";
|
|
31
33
|
/** Shares only compare inside one scope and currency, so each pair is its own section. */
|
|
32
34
|
function groupedAggregates<T extends AwardAggregate>(rows: readonly T[], toItem: (row: T) => Item): Item[] {
|
|
33
35
|
const groups = new Map<string, T[]>();
|
|
@@ -72,6 +74,7 @@ function AwardsView({ width, height, focused, symbol }: PaneProps & { symbol: st
|
|
|
72
74
|
const accessKey = `${session.requestKey}:${access.hasProAccess ? "full" : "preview"}`;
|
|
73
75
|
const openUpgrade = useCloudUpgradeAction("awards");
|
|
74
76
|
const { createPaneFromTemplate } = usePluginAppActions();
|
|
77
|
+
const openDescription = useOpenDescription();
|
|
75
78
|
const [initialTab] = usePaneSettingValue("tab", symbol ? "company" : "feed");
|
|
76
79
|
const [savedTab, setTab] = usePluginPaneState<string>("awards:tab", initialTab);
|
|
77
80
|
const tab = awardTab(savedTab);
|
|
@@ -131,10 +134,13 @@ function AwardsView({ width, height, focused, symbol }: PaneProps & { symbol: st
|
|
|
131
134
|
const aggregates = useMemo(() => rankedAggregates(tab === "agencies" ? data?.agencies ?? [] : data?.sectors ?? [], currency, awardType), [data, tab, currency, awardType]);
|
|
132
135
|
const aggregated = tab === "agencies" || tab === "sectors";
|
|
133
136
|
const showLeaders = tab === "sectors" && leaderView === "companies";
|
|
137
|
+
// A preview is the same latest awards whatever the filters say, so its award rows open with what they are.
|
|
138
|
+
const previewNote = data && (tab === "feed" || tab === "company") ? awardsPreviewNote(data, filter) : null;
|
|
134
139
|
const items = useMemo<Item[]>(() => [
|
|
140
|
+
...(previewNote ? [{ kind: "note" as const, id: "note:preview", text: previewNote }] : []),
|
|
135
141
|
...(showLeaders ? groupedAggregates(data?.leaders ?? [], (row): Item => ({ kind: "leader", row })) : aggregated ? groupedAggregates(aggregates, (row): Item => ({ kind: "aggregate", row })) : rows.map((row): Item => ({ kind: "award", row }))),
|
|
136
142
|
...(data?.locked ? Array.from({ length: 3 }, (_, i): Item => ({ kind: "locked", id: `locked:${i}` })) : []),
|
|
137
|
-
], [showLeaders, aggregated, aggregates, rows, data?.leaders, data?.locked]);
|
|
143
|
+
], [previewNote, showLeaders, aggregated, aggregates, rows, data?.leaders, data?.locked]);
|
|
138
144
|
const selected = tab === "company" && !ticker ? null
|
|
139
145
|
: items.find((item) => itemId(item) === selectedId && isRowItem(item)) ?? items.find(isRowItem) ?? null;
|
|
140
146
|
const current = openRow ?? (selected?.kind === "award" ? selected.row : null);
|
|
@@ -157,7 +163,7 @@ function AwardsView({ width, height, focused, symbol }: PaneProps & { symbol: st
|
|
|
157
163
|
...(current ? [{ id: "source", key: "o", label: "pen source", onPress: () => void host.openExternal(current.sourceUrl) }] : []),
|
|
158
164
|
...(current && !openId ? [{ id: "evidence", key: "e", label: "vidence", onPress: () => setOpen(current.id) }] : []),
|
|
159
165
|
...(selectedEntity ? [
|
|
160
|
-
{ id: "description", key: "d", label: "es", onPress: () =>
|
|
166
|
+
{ id: "description", key: "d", label: "es", onPress: () => openDescription(selectedEntity.ticker, selectedEntity.exchange ?? undefined) },
|
|
161
167
|
{ id: "financials", key: "f", label: "a", onPress: () => navigate("financial-analysis-pane") },
|
|
162
168
|
{ id: "graph", key: "g", label: "raph", onPress: () => navigate("chart-composer-pane") },
|
|
163
169
|
{ id: "supply", key: "s", label: "plc", onPress: () => navigate("supply-chain-pane") },
|
|
@@ -174,6 +180,7 @@ function AwardsView({ width, height, focused, symbol }: PaneProps & { symbol: st
|
|
|
174
180
|
...(data?.truncated && Object.values(data.truncated).some(Boolean) ? ["Some aggregate history exceeds this response's limit. Narrow the date range or scope."] : []),
|
|
175
181
|
...(tab === "company" && currencies.length > 1 && !currency ? [`Chart in ${chartCurrency}; select a currency to inspect other obligations.`] : []),
|
|
176
182
|
...(tab === "company" && scopes.length > 1 && !source ? [`Chart covers ${awardScope(chartSource).toLowerCase()}; select a scope to inspect other contracts.`] : []),
|
|
183
|
+
...(data && (tab === "feed" || tab === "company") ? [futureAwardDatesNote(rows, data.generatedAt)].filter((note): note is string => !!note) : []),
|
|
177
184
|
] });
|
|
178
185
|
const { strip, rows: tabRows } = usePaneTabs(!denied ? { tabs: [...AWARD_TABS], activeValue: tab, onSelect: (value) => { setTab(value); setOpen(null); }, focused, dense: true } : null);
|
|
179
186
|
const bodyHeight = Math.max(3, height - tabRows);
|
|
@@ -194,10 +201,12 @@ function AwardsView({ width, height, focused, symbol }: PaneProps & { symbol: st
|
|
|
194
201
|
: aggregated ? AGG_COLUMNS.filter((column) => column.id !== "scope" && column.id !== "currency").map((column) => column.id === "label" ? { ...column, label: tab === "agencies" ? "Agency" : "Sector" } : column)
|
|
195
202
|
: tab === "events" ? EVENT_COLUMNS : FEED_COLUMNS;
|
|
196
203
|
const maxShare = Math.max(0, ...items.map((item) => item.kind === "aggregate" || item.kind === "leader" ? item.row.sharePercent ?? 0 : 0));
|
|
197
|
-
|
|
198
|
-
const
|
|
199
|
-
|
|
200
|
-
|
|
204
|
+
// A preview's cohorts are the latest of any company, so they never chart as the ticker's.
|
|
205
|
+
const charted = data?.locked ? [] : series;
|
|
206
|
+
const latest = data?.locked ? undefined : data?.history.filter((row) => row.source === chartSource && row.currency === chartCurrency && row.awardType === awardType).at(-1);
|
|
207
|
+
const chart = tab === "company" && ticker ? { series: charted, formatValue: (value: number) => `${chartCurrency} ${money(value)}`, formatAxisValue: formatCompactAxis, ...chartSelection,
|
|
208
|
+
remoteKind: "award-obligations", empty: charted.length ? undefined : data?.locked ? "Full award history requires Pro." : "History is accumulating for this company." } : null;
|
|
209
|
+
useAwardsEvidence(data, tab, tab === "company" && !ticker ? 0 : items.filter((item) => item.kind !== "locked" && item.kind !== "note").length);
|
|
201
210
|
if (denied || !data && isCloudSessionRequired(failed?.message)) return <SignInWall placement="awards-signin" action="view government awards" needsVerification={session.needsVerification} />;
|
|
202
211
|
return <Box width={width} height={height} flexDirection="column">
|
|
203
212
|
{strip}
|
|
@@ -213,15 +222,15 @@ function AwardsView({ width, height, focused, symbol }: PaneProps & { symbol: st
|
|
|
213
222
|
figures={tab === "company" && ticker && latest ? [{ id: "total", label: `Obligated ${chartCurrency}`, value: money(latest.cumulativeObligatedAmount) },
|
|
214
223
|
{ id: "period", label: "Latest cohort", value: latest.month.slice(0, 7), detail: awardScope(chartSource) }] : undefined} />}
|
|
215
224
|
selection={{ kind: "id", selectedId: selected ? itemId(selected) : null, getId: itemId, onChange: setSelected }} getItemKey={itemId}
|
|
216
|
-
isNavigable={isRowItem} renderSectionHeader={(item) => item.kind === "section" ? { text: `${item.label} (${item.count})` } : null}
|
|
217
|
-
onActivate={(item) => { if (item.kind === "section") return; if (item.kind === "locked") openUpgrade(); else if (item.kind === "award") setOpen(item.row.id);
|
|
225
|
+
isNavigable={isRowItem} renderSectionHeader={(item) => item.kind === "section" ? { text: `${item.label} (${item.count})` } : item.kind === "note" ? { text: item.text } : null}
|
|
226
|
+
onActivate={(item) => { if (item.kind === "section" || item.kind === "note") return; if (item.kind === "locked") openUpgrade(); else if (item.kind === "award") setOpen(item.row.id);
|
|
218
227
|
else if (item.kind === "leader") { setCurrency(item.row.currency); setSource(item.row.source); setSector(item.row.sector);
|
|
219
228
|
if (item.row.ticker) { setTicker(publicTickerKey(item.row.ticker, item.row.exchange ?? undefined)); setTab("company"); } else { setQuery(item.row.label); setTab("feed"); } }
|
|
220
229
|
else { setCurrency(item.row.currency); setSource(item.row.source);
|
|
221
230
|
if (tab === "agencies") { setAgency(item.row.key); setTab("feed"); } else { setSector(item.row.key); setLeaderView("companies"); } } }}
|
|
222
231
|
sortColumnId={null} sortDirection="desc" selectedTextOverridesCellColor showHorizontalScrollbar resetScrollKey={JSON.stringify([tab, filter])}
|
|
223
232
|
renderCell={(item, column, _index, state) => {
|
|
224
|
-
if (item.kind === "section") return { text: "" };
|
|
233
|
+
if (item.kind === "section" || item.kind === "note") return { text: "" };
|
|
225
234
|
if (item.kind === "locked") {
|
|
226
235
|
if (!desktop && ["recipient", "label"].includes(column.id) && item.id === "locked:0") return { text: "Upgrade for full awards", content: <UpgradeLabel text="Upgrade for full awards" onPress={openUpgrade} />, onMouseDown: openUpgrade };
|
|
227
236
|
return desktop ? { text: "", content: <Blurred><Text fg={colors.textDim}>{["recipient", "label"].includes(column.id) ? "Additional award" : "Hidden"}</Text></Blurred> }
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { SeriesDefinition } from "../../../series/types";
|
|
2
|
+
import { fetchAwards } from "./client";
|
|
3
|
+
|
|
4
|
+
/** The scope AWARDS calls "US federal contracts": one source, one currency and prime awards, so no total counts a contract twice. */
|
|
5
|
+
const US_FEDERAL = { source: "usaspending", currency: "USD", awardType: "prime" } as const;
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* A company's US federal contract obligations by month, as AWARDS charts its
|
|
9
|
+
* company history. Pro: the free preview is one shared view, not the
|
|
10
|
+
* company's history, so it fails with the pane's own words.
|
|
11
|
+
*/
|
|
12
|
+
export const AWARD_SERIES: readonly SeriesDefinition[] = [{
|
|
13
|
+
id: "awards:us-federal-obligations",
|
|
14
|
+
name: "US federal contract obligations",
|
|
15
|
+
unit: "USD",
|
|
16
|
+
frequency: "monthly",
|
|
17
|
+
group: "Alternative data",
|
|
18
|
+
tags: ["government awards", "contracts", "procurement", "defense", "obligations"],
|
|
19
|
+
description: "Obligated dollars on US federal prime contracts awarded to the company, by award month, as AWARDS charts them. Needs Pro.",
|
|
20
|
+
input: "ticker",
|
|
21
|
+
style: "columns",
|
|
22
|
+
load: async ({ ticker, signal }) => {
|
|
23
|
+
const data = await fetchAwards({ ticker: ticker!, ...US_FEDERAL, limit: 1 }, undefined, signal);
|
|
24
|
+
if (data.locked || data.access === "preview") throw new Error("Full award history requires Pro.");
|
|
25
|
+
const rows = data.history.filter((row) => row.source === US_FEDERAL.source && row.currency === US_FEDERAL.currency && row.awardType === US_FEDERAL.awardType);
|
|
26
|
+
if (!rows.length) throw new Error(`No US federal contracts awarded to ${ticker}.`);
|
|
27
|
+
return rows.map((row) => ({ date: `${row.month.slice(0, 7)}-01`, value: row.obligatedAmount === null ? null : Number(row.obligatedAmount) }));
|
|
28
|
+
},
|
|
29
|
+
}];
|
|
@@ -15,8 +15,8 @@ export const backtestHeadless: HeadlessPaneDefinition<"bundle"> = {
|
|
|
15
15
|
aliases: ["BT", "BTST"],
|
|
16
16
|
screenshotReadiness: "live-dom",
|
|
17
17
|
limitations: [
|
|
18
|
-
"Long-only, one instrument, daily bars; signals fill at the next session's open",
|
|
19
|
-
"Price returns: dividends, borrow and cash interest are not modelled",
|
|
18
|
+
"Long-only, one instrument, daily bars; signals fill at the next session's open.",
|
|
19
|
+
"Price returns: dividends, borrow and cash interest are not modelled.",
|
|
20
20
|
],
|
|
21
21
|
},
|
|
22
22
|
options: [
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { numberErrorMessage } from "../../../utils/decimal-comma";
|
|
1
2
|
import { priceBond, solveBondYield, treasurySpread, type BondTerms, type TreasuryBenchmarkPoint } from "./math";
|
|
2
3
|
|
|
3
4
|
export interface BondDraft {
|
|
@@ -20,7 +21,7 @@ export function defaultBondDraft(now = new Date()): BondDraft {
|
|
|
20
21
|
}
|
|
21
22
|
|
|
22
23
|
function inputNumber(value: string, label: string): number {
|
|
23
|
-
if (!value.trim() || !/^[+-]?(?:\d+(?:\.\d*)?|\.\d+)$/.test(value.trim())) throw new Error(`${label} must be a number
|
|
24
|
+
if (!value.trim() || !/^[+-]?(?:\d+(?:\.\d*)?|\.\d+)$/.test(value.trim())) throw new Error(numberErrorMessage(`${label} must be a number`, value));
|
|
24
25
|
const number = Number(value);
|
|
25
26
|
if (!Number.isFinite(number)) throw new Error(`${label} must be finite`);
|
|
26
27
|
return number;
|
|
@@ -19,7 +19,7 @@ function definition(litigation: boolean): HeadlessPaneDefinition<"bundle"> {
|
|
|
19
19
|
{ key: "detailTab", type: "enum", values: [{ value: "evidence" }, { value: "history" }], defaultValue: "evidence", description: "Detail section for screenshots." },
|
|
20
20
|
{ key: "event", type: "string", settingKey: "open", description: "Event ID for evidence and revision history." },
|
|
21
21
|
],
|
|
22
|
-
discovery: { aliases: [litigation ? "LITI" : "CATL"], dataRequirements: ["Gloom Cloud catalyst records"], limitations: ["Pro; free preview includes three events", "Only published dates and confidently resolved corporate parties are linked", "Coverage varies by jurisdiction and source; absence is not proof of no event"] },
|
|
22
|
+
discovery: { aliases: [litigation ? "LITI" : "CATL"], dataRequirements: ["Gloom Cloud catalyst records"], limitations: ["Pro; free preview includes three events.", "Only published dates and confidently resolved corporate parties are linked.", "Coverage varies by jurisdiction and source; absence is not proof of no event."] },
|
|
23
23
|
describe: litigation ? "Company litigation, enforcement and antitrust dockets with evidence" : "Regulatory, clinical, legal and trade-policy catalyst calendar with provenance",
|
|
24
24
|
async load(args, ctx) {
|
|
25
25
|
if (typeof args.options.event === "string" && args.options.event) {
|
|
@@ -14,6 +14,7 @@ import type { PaneProps } from "../../../types/plugin";
|
|
|
14
14
|
import { Box, Text, useUiCapabilities, type ScrollBoxRenderable } from "../../../ui";
|
|
15
15
|
import { SignInWall } from "../cloud/auth-actions";
|
|
16
16
|
import { CLOUD_PLAN_KEY, useCloudUpgradeAction } from "../shared/cloud-upgrade";
|
|
17
|
+
import { useOpenDescription } from "../shared/open-description";
|
|
17
18
|
import { Blurred, LockedOverlay, UpgradeLabel } from "../shared/locked-rows";
|
|
18
19
|
import { listingCell } from "../shared/research-cells";
|
|
19
20
|
import { isCloudSessionRequired, useResearchCloudSession } from "../shared/research-cloud-session";
|
|
@@ -47,6 +48,7 @@ export function CatalystView({ width, height, focused, symbol, litigation = fals
|
|
|
47
48
|
const access = usePlanAccess();
|
|
48
49
|
const accessKey = `${session.requestKey}:${access.hasProAccess ? "full" : "preview"}`;
|
|
49
50
|
const { createPaneFromTemplate, openPluginCommandWorkflow } = usePluginAppActions();
|
|
51
|
+
const openDescription = useOpenDescription();
|
|
50
52
|
const openUpgrade = useCloudUpgradeAction("catl");
|
|
51
53
|
const [initialTab] = usePaneSettingValue("tab", "calendar");
|
|
52
54
|
const [savedTab, setTab] = usePluginPaneState("catalyst:tab", initialTab);
|
|
@@ -100,7 +102,7 @@ export function CatalystView({ width, height, focused, symbol, litigation = fals
|
|
|
100
102
|
const { strip, rows: tabRows } = usePaneTabs(!openId ? { tabs: [...CATALYST_TABS].map((item) => litigation && item.value === "calendar" ? { ...item, label: "Dockets" } : item), activeValue: tab, onSelect: (value) => { setTab(value); setSelectedId(null); }, focused, dense: true } : null);
|
|
101
103
|
const selectedSymbol = selected ? catalystSymbol(selected) : symbol;
|
|
102
104
|
const hints: PaneHint[] = [
|
|
103
|
-
...(!openId && selectedSymbol ? [{ id: "description", key: "d", label: "es", onPress: () =>
|
|
105
|
+
...(!openId && selectedSymbol ? [{ id: "description", key: "d", label: "es", onPress: () => openDescription(selectedSymbol) },
|
|
104
106
|
{ id: "financials", key: "f", label: "a", onPress: () => createPaneFromTemplate("financial-analysis-pane", { symbol: selectedSymbol }) },
|
|
105
107
|
{ id: "chart", key: "g", label: "raph", onPress: () => createPaneFromTemplate("chart-composer-pane", { arg: selectedSymbol }) },
|
|
106
108
|
{ id: "related", key: "t", label: litigation ? "o calendar" : "o litigation", onPress: () => createPaneFromTemplate(litigation ? "catalysts-pane" : "litigation-pane", { symbol: selectedSymbol }) }] : []),
|
|
@@ -2,21 +2,33 @@ import {
|
|
|
2
2
|
apiClient,
|
|
3
3
|
type CloudCdsHistoryPointPayload,
|
|
4
4
|
type CloudCdsHistoryResponse,
|
|
5
|
+
type CloudCdsLevelsResponse,
|
|
5
6
|
type CloudCdsResponse,
|
|
6
7
|
} from "../../../api-client";
|
|
7
8
|
import type { CloudCdsHistoryParams } from "../../../api-client/paths";
|
|
8
9
|
import type { InstrumentSearchResult } from "../../../types/instrument";
|
|
9
|
-
import {
|
|
10
|
+
import {
|
|
11
|
+
cdsReferenceEntity,
|
|
12
|
+
issuerNameOf,
|
|
13
|
+
normalizeCdsTrades,
|
|
14
|
+
spreadLevelsOf,
|
|
15
|
+
type CdsSpreadLevels,
|
|
16
|
+
type CdsTrade,
|
|
17
|
+
} from "./model";
|
|
10
18
|
|
|
11
19
|
/** One trading week of public dissemination is what "recent activity" means here. */
|
|
12
|
-
const
|
|
20
|
+
export const CDS_TRADE_DAYS = 5;
|
|
13
21
|
const CDS_TRADE_LIMIT = 500;
|
|
14
22
|
|
|
15
23
|
export interface CdsActivity {
|
|
16
24
|
source: string;
|
|
17
25
|
asOf: string | null;
|
|
26
|
+
/** What was asked for, as typed: a ticker or a name. Null for the market-wide view. */
|
|
27
|
+
query: string | null;
|
|
18
28
|
/** The issuer name actually sent, after any symbol lookup. */
|
|
19
29
|
issuer: string | null;
|
|
30
|
+
/** How many days of the tape the trades cover. */
|
|
31
|
+
days: number;
|
|
20
32
|
trades: CdsTrade[];
|
|
21
33
|
}
|
|
22
34
|
|
|
@@ -27,7 +39,8 @@ export type InstrumentSearch = (query: string, limit?: number) => Promise<Instru
|
|
|
27
39
|
|
|
28
40
|
/**
|
|
29
41
|
* A bare ticker with normal symbol punctuation and no spaces. Anything longer or
|
|
30
|
-
* containing a space is already a company name and is sent
|
|
42
|
+
* containing a space is already a company name and is sent as the tape would
|
|
43
|
+
* name it.
|
|
31
44
|
*/
|
|
32
45
|
const TICKER_LIKE = /^[A-Za-z0-9][A-Za-z0-9.^:-]{0,11}$/;
|
|
33
46
|
const US_PRIMARY_EXCHANGES = new Set(["AMEX", "NASDAQ", "NYSE", "NYSEAMERICAN", "NYSEARCA"]);
|
|
@@ -42,22 +55,28 @@ function isPrimaryUsCommonStock(result: InstrumentSearchResult): boolean {
|
|
|
42
55
|
|
|
43
56
|
/**
|
|
44
57
|
* The backend matches DTCC issuer names, so a ticker has to become a company
|
|
45
|
-
* name first
|
|
46
|
-
*
|
|
47
|
-
*
|
|
48
|
-
*
|
|
58
|
+
* name first: its reference entity when the debt sits with another entity,
|
|
59
|
+
* else the listed company's name without its share class ("Alphabet Inc.",
|
|
60
|
+
* not "Alphabet Inc. Class A Common Stock"). An untracked symbol has no local
|
|
61
|
+
* metadata to expand it, and its quote name never arrives for a fixed
|
|
62
|
+
* binding, so the shared instrument search is the only reliable expansion. A
|
|
63
|
+
* search outage falls back to the raw input rather than taking the CDS
|
|
64
|
+
* request down with it.
|
|
49
65
|
*/
|
|
50
|
-
async function resolveIssuerName(
|
|
66
|
+
export async function resolveIssuerName(
|
|
51
67
|
issuer: string,
|
|
52
68
|
searchInstruments: InstrumentSearch,
|
|
53
69
|
): Promise<string> {
|
|
54
|
-
if (!TICKER_LIKE.test(issuer)) return issuer;
|
|
70
|
+
if (!TICKER_LIKE.test(issuer)) return issuerNameOf(issuer);
|
|
71
|
+
const referenceEntity = cdsReferenceEntity(issuer);
|
|
72
|
+
if (referenceEntity) return referenceEntity;
|
|
55
73
|
try {
|
|
56
74
|
const results = await searchInstruments(issuer);
|
|
57
75
|
const symbol = issuer.toUpperCase();
|
|
58
76
|
const exactMatches = results.filter((result) => result.symbol.toUpperCase() === symbol);
|
|
59
77
|
const match = exactMatches.find(isPrimaryUsCommonStock) ?? exactMatches[0] ?? results[0];
|
|
60
|
-
|
|
78
|
+
const name = match?.name?.trim();
|
|
79
|
+
return name ? issuerNameOf(name) : issuer;
|
|
61
80
|
} catch {
|
|
62
81
|
return issuer;
|
|
63
82
|
}
|
|
@@ -68,16 +87,19 @@ export async function loadCdsActivity(
|
|
|
68
87
|
fetchCds: CdsFetch = (params) => apiClient.getCloudCds(params),
|
|
69
88
|
searchInstruments: InstrumentSearch = (query, limit) => apiClient.searchInstruments(query, limit),
|
|
70
89
|
): Promise<CdsActivity> {
|
|
71
|
-
const
|
|
90
|
+
const query = issuer?.trim() || null;
|
|
91
|
+
const resolved = query ? await resolveIssuerName(query, searchInstruments) : null;
|
|
72
92
|
const response = await fetchCds({
|
|
73
93
|
...(resolved ? { issuer: resolved } : {}),
|
|
74
|
-
days:
|
|
94
|
+
days: CDS_TRADE_DAYS,
|
|
75
95
|
limit: CDS_TRADE_LIMIT,
|
|
76
96
|
});
|
|
77
97
|
return {
|
|
78
98
|
source: response.source,
|
|
79
99
|
asOf: response.asOf,
|
|
100
|
+
query,
|
|
80
101
|
issuer: resolved,
|
|
102
|
+
days: CDS_TRADE_DAYS,
|
|
81
103
|
trades: normalizeCdsTrades(response.trades ?? []),
|
|
82
104
|
};
|
|
83
105
|
}
|
|
@@ -107,3 +129,18 @@ export async function loadCdsSpreadHistory(
|
|
|
107
129
|
.toSorted((left, right) => left.date.localeCompare(right.date));
|
|
108
130
|
return { issuer: response.issuer, points };
|
|
109
131
|
}
|
|
132
|
+
|
|
133
|
+
export type CdsLevelsFetch = () => Promise<CloudCdsLevelsResponse>;
|
|
134
|
+
export type CdsSpreadLevelsLoader = () => Promise<CdsSpreadLevels>;
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* Every listed issuer's latest 5Y level, in one request: the last point of
|
|
138
|
+
* each name's line over the last month, the line the pane charts, so the list
|
|
139
|
+
* can be ranked by it. A name without one is not in the response.
|
|
140
|
+
*/
|
|
141
|
+
export async function loadCdsSpreadLevels(
|
|
142
|
+
fetchLevels: CdsLevelsFetch = () => apiClient.getCloudCdsLevels(),
|
|
143
|
+
): Promise<CdsSpreadLevels> {
|
|
144
|
+
const response = await fetchLevels();
|
|
145
|
+
return spreadLevelsOf(response.levels ?? []);
|
|
146
|
+
}
|
|
@@ -1,32 +1,50 @@
|
|
|
1
1
|
import type {
|
|
2
|
+
HeadlessBundleResult,
|
|
3
|
+
HeadlessBundleSection,
|
|
2
4
|
HeadlessPaneDefinition,
|
|
5
|
+
HeadlessPaneEntry,
|
|
3
6
|
HeadlessPaneLoadArgs,
|
|
4
|
-
HeadlessRowsResult,
|
|
5
7
|
} from "../../../types/plugin";
|
|
6
8
|
import {
|
|
9
|
+
CDS_TRADE_DAYS,
|
|
7
10
|
loadCdsActivity,
|
|
11
|
+
loadCdsSpreadHistory,
|
|
12
|
+
loadCdsSpreadLevels,
|
|
8
13
|
type CdsActivity,
|
|
9
14
|
type CdsFetch,
|
|
15
|
+
type CdsHistoryFetch,
|
|
16
|
+
type CdsLevelsFetch,
|
|
17
|
+
type CdsSpreadHistory,
|
|
10
18
|
type InstrumentSearch,
|
|
11
19
|
} from "./client";
|
|
12
20
|
import {
|
|
13
21
|
DEFAULT_ISSUER_SORT,
|
|
14
22
|
DEFAULT_TRADE_SORT,
|
|
23
|
+
cdsFreshness,
|
|
24
|
+
displayIssuerName,
|
|
15
25
|
formatBp,
|
|
16
26
|
formatEventTime,
|
|
17
27
|
formatNotional,
|
|
28
|
+
formatSpreadChange,
|
|
29
|
+
formatSpreadRange,
|
|
18
30
|
formatUpfront,
|
|
31
|
+
lastTradeOf,
|
|
32
|
+
noTradesMessage,
|
|
19
33
|
sortIssuers,
|
|
20
34
|
sortTrades,
|
|
35
|
+
spreadSummary,
|
|
21
36
|
summarizeIssuers,
|
|
37
|
+
withSpreadLevels,
|
|
38
|
+
type CdsSpreadLevels,
|
|
22
39
|
type CdsTrade,
|
|
23
40
|
} from "./model";
|
|
24
41
|
|
|
25
42
|
const ISSUER_COLUMNS = [
|
|
26
43
|
{ key: "issuer", header: "Issuer" },
|
|
27
44
|
{ key: "trades", header: "Trades", align: "right" as const },
|
|
28
|
-
{ key: "lastTradeAt", header: "Last UTC", format: (value: unknown) => formatEventTime(Number(value)) },
|
|
29
|
-
{ key: "
|
|
45
|
+
{ key: "lastTradeAt", header: "Last UTC", shrink: false, format: (value: unknown) => formatEventTime(Number(value)) },
|
|
46
|
+
{ key: "spread5yBp", header: "5Y spread", align: "right" as const, format: (value: unknown) => formatBp(value as number | null) },
|
|
47
|
+
{ key: "spread5yDate", header: "5Y date", shrink: false, format: (value: unknown) => (typeof value === "string" ? value : "--") },
|
|
30
48
|
];
|
|
31
49
|
|
|
32
50
|
function tradeForFormatting(row: Record<string, unknown>): CdsTrade {
|
|
@@ -34,7 +52,7 @@ function tradeForFormatting(row: Record<string, unknown>): CdsTrade {
|
|
|
34
52
|
}
|
|
35
53
|
|
|
36
54
|
const TRADE_COLUMNS = [
|
|
37
|
-
{ key: "eventAt", header: "Time UTC", format: (value: unknown) => formatEventTime(Number(value)) },
|
|
55
|
+
{ key: "eventAt", header: "Time UTC", shrink: false, format: (value: unknown) => formatEventTime(Number(value)) },
|
|
38
56
|
{ key: "issuer", header: "Issuer" },
|
|
39
57
|
{ key: "maturity", header: "Maturity" },
|
|
40
58
|
{
|
|
@@ -48,27 +66,94 @@ const TRADE_COLUMNS = [
|
|
|
48
66
|
{ key: "spreadBp", header: "Spread", align: "right" as const, format: (value: unknown) => formatBp(value as number | null) },
|
|
49
67
|
{
|
|
50
68
|
key: "upfront",
|
|
51
|
-
header: "
|
|
69
|
+
header: "Abs upfront",
|
|
52
70
|
align: "right" as const,
|
|
53
71
|
format: (_value: unknown, row: Record<string, unknown>) => formatUpfront(tradeForFormatting(row)),
|
|
54
72
|
},
|
|
55
73
|
];
|
|
56
74
|
|
|
57
|
-
|
|
58
|
-
|
|
75
|
+
/**
|
|
76
|
+
* The pane's figures over its 5Y chart, as label and value lines: the level,
|
|
77
|
+
* its date, the 1M move on the same contract (`--` across a roll) and the
|
|
78
|
+
* range charted. JSON keeps the numbers; text and CSV read as the pane does.
|
|
79
|
+
*/
|
|
80
|
+
function spreadEntries(history: CdsSpreadHistory): HeadlessPaneEntry[] {
|
|
81
|
+
const summary = spreadSummary(history.points);
|
|
82
|
+
if (!summary) return [];
|
|
83
|
+
return [
|
|
84
|
+
{ key: "spreadBp", label: "5Y spread", value: summary.spreadBp, formatted: formatBp(summary.spreadBp) },
|
|
85
|
+
{ key: "date", label: "Date", value: summary.date },
|
|
86
|
+
{
|
|
87
|
+
key: "change1mBp",
|
|
88
|
+
label: "1M change",
|
|
89
|
+
value: summary.change1mBp,
|
|
90
|
+
formatted: summary.change1mBp == null ? "--" : formatSpreadChange(summary.change1mBp),
|
|
91
|
+
},
|
|
92
|
+
...(summary.range ? [{
|
|
93
|
+
key: "range",
|
|
94
|
+
label: "Range",
|
|
95
|
+
value: summary.range,
|
|
96
|
+
formatted: `${formatSpreadRange(summary.range)} since ${summary.range.since}`,
|
|
97
|
+
}] : []),
|
|
98
|
+
];
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
interface CdsReportInputs {
|
|
102
|
+
activity: CdsActivity;
|
|
103
|
+
/** The issuer's 5Y line, or the error that kept it out. */
|
|
104
|
+
history?: CdsSpreadHistory | Error | null;
|
|
105
|
+
/** Each listed issuer's 5Y level, or the error that kept them out. */
|
|
106
|
+
levels?: CdsSpreadLevels | Error | null;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
function projectCdsHeadless({ activity, history, levels }: CdsReportInputs): HeadlessBundleResult {
|
|
110
|
+
const errors: string[] = [];
|
|
111
|
+
const notes: string[] = [];
|
|
112
|
+
const empty = noTradesMessage({ query: activity.query, issuer: activity.issuer, days: activity.days });
|
|
113
|
+
const metadata = { issuer: activity.issuer, days: activity.days };
|
|
114
|
+
if (activity.query) {
|
|
115
|
+
const line = history instanceof Error || !history ? null : history;
|
|
116
|
+
if (history instanceof Error) errors.push("5Y spread history unavailable.");
|
|
117
|
+
const entries = line ? spreadEntries(line) : [];
|
|
118
|
+
// The name the tape was queried for heads the figures, as in the pane, so a ticker says what it became.
|
|
119
|
+
const name = displayIssuerName(activity.issuer ?? line?.issuer ?? activity.query);
|
|
120
|
+
if (line && entries.length === 0) notes.push(`No 5Y spread level for ${name} in the last two years.`);
|
|
121
|
+
const sections: HeadlessBundleSection[] = [
|
|
122
|
+
...(entries.length ? [{ title: name, entries }] : []),
|
|
123
|
+
{
|
|
124
|
+
title: "Trades",
|
|
125
|
+
columns: TRADE_COLUMNS,
|
|
126
|
+
rows: sortTrades(activity.trades, DEFAULT_TRADE_SORT).map((trade) => ({ ...trade })),
|
|
127
|
+
empty,
|
|
128
|
+
},
|
|
129
|
+
];
|
|
59
130
|
return {
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
131
|
+
sections,
|
|
132
|
+
metadata,
|
|
133
|
+
freshness: cdsFreshness(lastTradeOf(activity.trades, line?.points)),
|
|
134
|
+
...(errors.length ? { errors } : {}),
|
|
135
|
+
...(notes.length ? { notes } : {}),
|
|
63
136
|
};
|
|
64
137
|
}
|
|
138
|
+
if (levels instanceof Error) errors.push("5Y spreads unavailable.");
|
|
139
|
+
const issuers = withSpreadLevels(summarizeIssuers(activity.trades), levels instanceof Error ? null : levels ?? null);
|
|
65
140
|
return {
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
141
|
+
sections: [{
|
|
142
|
+
title: "Issuers",
|
|
143
|
+
columns: ISSUER_COLUMNS,
|
|
144
|
+
rows: sortIssuers(issuers, DEFAULT_ISSUER_SORT).map((issuerRow) => ({ ...issuerRow })),
|
|
145
|
+
empty,
|
|
146
|
+
}],
|
|
147
|
+
metadata,
|
|
148
|
+
freshness: cdsFreshness(lastTradeOf(activity.trades)),
|
|
149
|
+
...(errors.length ? { errors } : {}),
|
|
69
150
|
};
|
|
70
151
|
}
|
|
71
152
|
|
|
153
|
+
function settled<T>(pending: Promise<T>): Promise<T | Error> {
|
|
154
|
+
return pending.catch((error: unknown) => (error instanceof Error ? error : new Error(String(error))));
|
|
155
|
+
}
|
|
156
|
+
|
|
72
157
|
export interface CdsHeadlessDependencies {
|
|
73
158
|
load(
|
|
74
159
|
args: HeadlessPaneLoadArgs,
|
|
@@ -76,38 +161,53 @@ export interface CdsHeadlessDependencies {
|
|
|
76
161
|
fetchCds: CdsFetch,
|
|
77
162
|
searchInstruments: InstrumentSearch,
|
|
78
163
|
): Promise<CdsActivity>;
|
|
164
|
+
loadHistory?(issuer: string, fetchHistory: CdsHistoryFetch): Promise<CdsSpreadHistory>;
|
|
165
|
+
loadLevels?: typeof loadCdsSpreadLevels;
|
|
79
166
|
}
|
|
80
167
|
|
|
81
168
|
const defaultDependencies: CdsHeadlessDependencies = {
|
|
82
169
|
load: (_args, issuer, fetchCds, searchInstruments) => (
|
|
83
170
|
loadCdsActivity(issuer, fetchCds, searchInstruments)
|
|
84
171
|
),
|
|
172
|
+
loadHistory: (issuer, fetchHistory) => loadCdsSpreadHistory(issuer, fetchHistory),
|
|
173
|
+
loadLevels: loadCdsSpreadLevels,
|
|
85
174
|
};
|
|
86
175
|
|
|
87
176
|
export function createCdsHeadless(
|
|
88
177
|
dependencies: CdsHeadlessDependencies = defaultDependencies,
|
|
89
|
-
): HeadlessPaneDefinition<"
|
|
178
|
+
): HeadlessPaneDefinition<"bundle"> {
|
|
179
|
+
const loadHistory = dependencies.loadHistory ?? defaultDependencies.loadHistory!;
|
|
180
|
+
const loadLevels = dependencies.loadLevels ?? defaultDependencies.loadLevels!;
|
|
90
181
|
return {
|
|
91
|
-
shape: "
|
|
92
|
-
|
|
93
|
-
freshness:
|
|
182
|
+
shape: "bundle",
|
|
183
|
+
description: `Single-name CDS from DTCC public dissemination. With no argument: the issuers traded in the last ${CDS_TRADE_DAYS} days, most active first, with trade count, last trade and 5Y spread. With a ticker or issuer: its 5Y spread (level, date, 1M change, range) and its trades.`,
|
|
184
|
+
freshness: cdsFreshness(null),
|
|
94
185
|
argument: {
|
|
95
186
|
kind: "free-text",
|
|
96
187
|
placeholder: "ticker or issuer",
|
|
97
|
-
description: "Optional ticker or issuer. Omit
|
|
188
|
+
description: "Optional ticker or issuer. Omit to list the most-active issuers with their 5Y spread.",
|
|
98
189
|
optional: true,
|
|
99
190
|
},
|
|
100
191
|
options: [],
|
|
101
192
|
describe: (args) => typeof args.argument === "string" ? `CDS | ${args.argument}` : "Single-Name CDS",
|
|
102
193
|
async load(args, ctx) {
|
|
103
194
|
const issuer = typeof args.argument === "string" ? args.argument : null;
|
|
195
|
+
const fetchHistory: CdsHistoryFetch = (params) => ctx.apiClient.getCloudCdsHistory(params);
|
|
196
|
+
const fetchLevels: CdsLevelsFetch = () => ctx.apiClient.getCloudCdsLevels();
|
|
197
|
+
// The list's levels are one request for every issuer, read beside its trades.
|
|
198
|
+
const levels = issuer?.trim() ? null : settled(loadLevels(fetchLevels));
|
|
104
199
|
const activity = await dependencies.load(
|
|
105
200
|
args,
|
|
106
201
|
issuer,
|
|
107
202
|
(params) => ctx.apiClient.getCloudCds(params),
|
|
108
203
|
(query, limit) => ctx.apiClient.searchInstruments(query, limit),
|
|
109
204
|
);
|
|
110
|
-
|
|
205
|
+
if (activity.query) {
|
|
206
|
+
// The line follows the name the tape was queried for, as the pane's does.
|
|
207
|
+
const history = activity.issuer ? await settled(loadHistory(activity.issuer, fetchHistory)) : null;
|
|
208
|
+
return projectCdsHeadless({ activity, history });
|
|
209
|
+
}
|
|
210
|
+
return projectCdsHeadless({ activity, levels: await levels });
|
|
111
211
|
},
|
|
112
212
|
};
|
|
113
213
|
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { PaneTemplateCreateOptions } from "../../../types/plugin";
|
|
2
2
|
import type { PluginModule } from "../plugin-module";
|
|
3
|
+
import { SINGLE_NAME_CDS_SERIES } from "./series";
|
|
3
4
|
import { CDS_PANE_ID } from "./model";
|
|
4
5
|
import { CdsPane } from "./pane";
|
|
5
6
|
import { cdsHeadless } from "./headless";
|
|
@@ -12,6 +13,7 @@ function explicitSymbol(options?: PaneTemplateCreateOptions): string | null {
|
|
|
12
13
|
}
|
|
13
14
|
|
|
14
15
|
export const cdsModule: PluginModule = {
|
|
16
|
+
series: SINGLE_NAME_CDS_SERIES,
|
|
15
17
|
panes: [{
|
|
16
18
|
id: CDS_PANE_ID,
|
|
17
19
|
name: "Single-Name CDS",
|
|
@@ -27,7 +29,7 @@ export const cdsModule: PluginModule = {
|
|
|
27
29
|
id: "cds-pane",
|
|
28
30
|
paneId: CDS_PANE_ID,
|
|
29
31
|
label: "Single-Name CDS",
|
|
30
|
-
description: "Single-name corporate CDS
|
|
32
|
+
description: "Single-name corporate CDS from DTCC public dissemination: with no argument, the issuers traded in the last 5 days with their 5Y spread; with a ticker or issuer, its 5Y spread history and trades.",
|
|
31
33
|
keywords: ["cds", "credit", "default", "swap", "spread", "single name", "issuer", "dtcc", "protection"],
|
|
32
34
|
shortcut: { prefix: "CDS", argPlaceholder: "ticker", argKind: "ticker", argOptional: true },
|
|
33
35
|
headless: cdsHeadless,
|