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,5 +1,6 @@
|
|
|
1
1
|
import type { HeadlessPaneDefinition } from "../../../types/plugin";
|
|
2
|
-
import {
|
|
2
|
+
import type { CreditDocumentsPayload } from "../../../api-client/credit-documents";
|
|
3
|
+
import { creditIssuerSymbol, fetchCreditDocuments, fetchCreditInstrument, fetchCreditScreen } from "./client";
|
|
3
4
|
import { CREDIT_TABS } from "./model";
|
|
4
5
|
import { SEC_FILINGS } from "../shared/report-freshness";
|
|
5
6
|
|
|
@@ -8,8 +9,8 @@ export const creditHeadless: HeadlessPaneDefinition<"bundle"> = {
|
|
|
8
9
|
freshness: SEC_FILINGS,
|
|
9
10
|
argument: { kind: "ticker", description: "Issuer ticker, including exchange-qualified global symbols.", placeholder: "ticker" },
|
|
10
11
|
discovery: { aliases: ["CRDOC"], dataRequirements: ["Gloom Cloud credit-document evidence"], limitations: [
|
|
11
|
-
"Pro dataset; free accounts see a limited preview", "SEC credit documents with global issuer identifiers; other jurisdictions depend on connected sources",
|
|
12
|
-
"Undisclosed terms remain unavailable", "Headroom requires exact covenant definitions and supported reported financials", "Amounts retain their native currency",
|
|
12
|
+
"Pro dataset; free accounts see a limited preview.", "SEC credit documents with global issuer identifiers; other jurisdictions depend on connected sources.",
|
|
13
|
+
"Undisclosed terms remain unavailable.", "Headroom requires exact covenant definitions and supported reported financials.", "Amounts retain their native currency.",
|
|
13
14
|
] },
|
|
14
15
|
options: [
|
|
15
16
|
{ key: "tab", type: "enum", settingKey: "tab", defaultValue: "capital", values: CREDIT_TABS.map(({ value }) => ({ value })), description: "Capital structure, covenants, maturity wall or global risk screen." },
|
|
@@ -28,6 +29,12 @@ export const creditHeadless: HeadlessPaneDefinition<"bundle"> = {
|
|
|
28
29
|
}
|
|
29
30
|
const data = await fetchCreditDocuments(args.symbols[0]!, ctx.apiClient);
|
|
30
31
|
const instrument = args.options.instrument ? await fetchCreditInstrument(data.symbol, String(args.options.instrument), ctx.apiClient) : null;
|
|
32
|
+
const reason = instrument ? null : creditEmptyReason(data, args.symbols[0]!);
|
|
33
|
+
// Nothing on file says why once, instead of four empty sections.
|
|
34
|
+
if (reason) {
|
|
35
|
+
return { complete: false, errors: data.warnings, sections: [],
|
|
36
|
+
metadata: { symbol: data.symbol, issuer: data.issuer, asOf: data.asOf, access: data.access, lockedRows: data.lockedRows, status: data.status, reason, notices: [reason] } };
|
|
37
|
+
}
|
|
31
38
|
return { complete: data.status === "available" && data.lockedRows === 0, errors: [...data.warnings, ...(data.lockedRows ? ["Full credit documents and history require Gloom Pro"] : [])],
|
|
32
39
|
sections: instrument ? [{ title: instrument.name, rows: [{ ...instrument }] }, { title: "Current terms", rows: instrument.facts.map((row) => ({ ...row })) }, { title: "Amendment history", rows: (instrument.history ?? []).map((row) => ({ ...row })) }]
|
|
33
40
|
: [{ title: "Capital structure", rows: data.instruments.map((row) => ({ ...row })) }, { title: "Covenants", rows: data.covenants.map((row) => ({ ...row })) }, { title: "Maturity wall", rows: data.maturities.map((row) => ({ ...row })) }, { title: "Change of control", rows: data.changeOfControl.map((row) => ({ ...row })) }],
|
|
@@ -35,6 +42,29 @@ export const creditHeadless: HeadlessPaneDefinition<"bundle"> = {
|
|
|
35
42
|
},
|
|
36
43
|
};
|
|
37
44
|
|
|
45
|
+
/** An issuer whose documents the catalog and the docs use as the example. */
|
|
46
|
+
const CREDIT_EXAMPLE_SYMBOL = "FICO";
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Why an issuer's report has no rows at all, from the payload: no issuer on
|
|
50
|
+
* file for the symbol, or an issuer with no debt instrument read from its
|
|
51
|
+
* filings yet; with the command for an issuer that has documents. Null when
|
|
52
|
+
* any section has a row.
|
|
53
|
+
*/
|
|
54
|
+
export function creditEmptyReason(
|
|
55
|
+
data: Pick<CreditDocumentsPayload, "symbol" | "issuer" | "instruments" | "covenants" | "maturities" | "changeOfControl" | "lockedRows">,
|
|
56
|
+
requested: string,
|
|
57
|
+
): string | null {
|
|
58
|
+
const rows = data.instruments.length + data.covenants.length + data.maturities.length + data.changeOfControl.length;
|
|
59
|
+
if (rows > 0 || data.lockedRows > 0) return null;
|
|
60
|
+
const symbol = requested.trim().toUpperCase();
|
|
61
|
+
const why = data.issuer
|
|
62
|
+
? `No credit documents on file for ${data.issuer.name} (${symbol}): no debt instrument has been read from its filings yet.`
|
|
63
|
+
: `No credit documents on file for ${symbol}: it is not an issuer the credit-document set covers.`;
|
|
64
|
+
const example = creditIssuerSymbol(symbol) === CREDIT_EXAMPLE_SYMBOL ? "" : ` Try \`gloomberb fn CRDOC ${CREDIT_EXAMPLE_SYMBOL}\` for an issuer with documents.`;
|
|
65
|
+
return `${why}${example}`;
|
|
66
|
+
}
|
|
67
|
+
|
|
38
68
|
export const covenantsHeadless: HeadlessPaneDefinition<"bundle"> = {
|
|
39
69
|
...creditHeadless,
|
|
40
70
|
discovery: { ...creditHeadless.discovery, aliases: ["COVN"] },
|
|
@@ -12,6 +12,7 @@ import type { PaneProps } from "../../../types/plugin";
|
|
|
12
12
|
import { Box, Text, useUiCapabilities } from "../../../ui";
|
|
13
13
|
import { SignInWall } from "../cloud/auth-actions";
|
|
14
14
|
import { CLOUD_PLAN_KEY, useCloudUpgradeAction } from "../shared/cloud-upgrade";
|
|
15
|
+
import { useOpenDescription } from "../shared/open-description";
|
|
15
16
|
import { Blurred, LockedOverlay, UpgradeLabel } from "../shared/locked-rows";
|
|
16
17
|
import { isCloudSessionRequired, useResearchCloudSession } from "../shared/research-cloud-session";
|
|
17
18
|
import { cachedCredit, creditIssuerSymbol, CREDIT_UNAVAILABLE, fetchCreditScreen, loadCredit, validateCreditDocuments } from "./client";
|
|
@@ -34,6 +35,7 @@ export function CreditDocumentsPane(props: PaneProps) {
|
|
|
34
35
|
function CreditView({ symbol, width, height, focused, accessKey, needsVerification }: PaneProps & { symbol: string | null; accessKey: string; needsVerification: boolean }) {
|
|
35
36
|
const colors = useThemeColors(), desktop = !!useUiCapabilities().nativePaneChrome;
|
|
36
37
|
const { createPaneFromTemplate } = usePluginAppActions();
|
|
38
|
+
const openDescription = useOpenDescription();
|
|
37
39
|
const openUpgrade = useCloudUpgradeAction("crdoc");
|
|
38
40
|
const [openingTab] = usePaneSettingValue("tab", "capital");
|
|
39
41
|
const [savedTab, setTab] = usePluginPaneState<string>("credit:tab", openingTab);
|
|
@@ -103,7 +105,7 @@ function CreditView({ symbol, width, height, focused, accessKey, needsVerificati
|
|
|
103
105
|
const target = activeSymbol ?? symbol ?? "";
|
|
104
106
|
const allHints: PaneHint[] = [
|
|
105
107
|
...(symbol ? [
|
|
106
|
-
{ id: "credit:des", key: "d", label: "es", title: "Description (DES)", onPress: () =>
|
|
108
|
+
{ id: "credit:des", key: "d", label: "es", title: "Description (DES)", onPress: () => openDescription(target) },
|
|
107
109
|
{ id: "credit:fa", key: "f", label: "a", title: "Financial analysis (FA)", onPress: () => createPaneFromTemplate("financial-analysis-pane", { symbol: target }) },
|
|
108
110
|
{ id: "credit:graph", key: "g", label: "raph", title: "Price chart (G)", onPress: () => createPaneFromTemplate("chart-composer-pane", { arg: target }) },
|
|
109
111
|
{ id: "credit:ddis", key: "m", label: "aturities", title: "DDIS maturity schedule", onPress: () => createPaneFromTemplate("debt-maturities-pane", { symbol: target }) },
|
|
@@ -2,7 +2,7 @@ import type { CryptoAssetKind } from "../../../api-client/crypto-markets";
|
|
|
2
2
|
import type { HeadlessPaneDefinition } from "../../../types/plugin";
|
|
3
3
|
import { formatCompact } from "../../../utils/format";
|
|
4
4
|
import { fetchCryptoMarkets } from "./client";
|
|
5
|
-
import { buildCryptoRows, formatCryptoPercent } from "./model";
|
|
5
|
+
import { buildCryptoRows, CRYPTO_BOARD_FRESHNESS, formatCryptoPercent } from "./model";
|
|
6
6
|
|
|
7
7
|
const NO_QUOTES = new Map();
|
|
8
8
|
const number = (value: unknown) => (typeof value === "number" ? value : null);
|
|
@@ -41,8 +41,7 @@ export const cryptoBoardHeadless: HeadlessPaneDefinition<"rows"> = {
|
|
|
41
41
|
dataRequirements: ["Gloom Cloud crypto markets"],
|
|
42
42
|
},
|
|
43
43
|
// A board snapshot refreshed every few minutes; the pane streams, the report does not.
|
|
44
|
-
|
|
45
|
-
freshness: { status: "delayed", maxAgeMinutes: 60 },
|
|
44
|
+
freshness: { status: "delayed", ...CRYPTO_BOARD_FRESHNESS },
|
|
46
45
|
async load(args, ctx) {
|
|
47
46
|
const kind = args.options.list === "stablecoin" ? "stablecoin" : "coin" satisfies CryptoAssetKind;
|
|
48
47
|
const data = await fetchCryptoMarkets(ctx.apiClient);
|
|
@@ -3,8 +3,10 @@ import { LIVE_STREAMING_QUICK_SETTING, withLiveStreamingSetting } from "../../..
|
|
|
3
3
|
import { cryptoMarketsCache } from "./client";
|
|
4
4
|
import { cryptoBoardHeadless } from "./headless";
|
|
5
5
|
import { CryptoBoardPane } from "./pane";
|
|
6
|
+
import { CRYPTO_SERIES } from "./series";
|
|
6
7
|
|
|
7
8
|
export const cryptoBoardModule: PluginModule = {
|
|
9
|
+
series: CRYPTO_SERIES,
|
|
8
10
|
panes: [
|
|
9
11
|
{
|
|
10
12
|
id: "crypto-board",
|
|
@@ -4,11 +4,18 @@ import { getTableWidth } from "../../../components/ui/table-layout";
|
|
|
4
4
|
import { buildQuoteKey, resolveEntryData } from "../../../market-data/selectors";
|
|
5
5
|
import type { QueryEntry } from "../../../market-data/result-types";
|
|
6
6
|
import type { PricePoint, Quote } from "../../../types/financials";
|
|
7
|
+
import type { HeadlessPaneFreshness } from "../../../types/headless";
|
|
7
8
|
import { compareSortValues, nextHeaderSort, type SortDirection } from "../../../utils/sort-values";
|
|
8
9
|
import { isFiniteNumber } from "../../../utils/guards";
|
|
9
10
|
|
|
10
11
|
const DAY_MS = 86_400_000;
|
|
11
12
|
|
|
13
|
+
/**
|
|
14
|
+
* How the board's report, capture and footer date its prices: crypto trades around the clock, so a price an hour old
|
|
15
|
+
* has stopped refreshing, and coins are quoted apart, so the line says how old the oldest is.
|
|
16
|
+
*/
|
|
17
|
+
export const CRYPTO_BOARD_FRESHNESS: HeadlessPaneFreshness = { maxAgeMinutes: 60, oldestAge: true };
|
|
18
|
+
|
|
12
19
|
export const CRYPTO_TABS: Array<{ value: CryptoAssetKind; label: string }> = [
|
|
13
20
|
{ value: "coin", label: "Coins" },
|
|
14
21
|
{ value: "stablecoin", label: "Stablecoins" },
|
|
@@ -148,6 +155,11 @@ export function buildCryptoRows(
|
|
|
148
155
|
});
|
|
149
156
|
}
|
|
150
157
|
|
|
158
|
+
/** What a capture and the footer read of each row: when its price is from, and whether it is streaming live. */
|
|
159
|
+
export function cryptoRowObservations(rows: readonly CryptoRow[]): Array<{ quoteTime: string; dataSource: "live" | "delayed" }> {
|
|
160
|
+
return rows.flatMap((row) => row.updatedAt == null ? [] : [{ quoteTime: new Date(row.updatedAt).toISOString(), dataSource: row.live ? "live" as const : "delayed" as const }]);
|
|
161
|
+
}
|
|
162
|
+
|
|
151
163
|
/**
|
|
152
164
|
* Four significant digits and never fewer than two decimals, with trailing
|
|
153
165
|
* zeros kept, so a column running from 84,399.24 to 0.000005660 reads evenly.
|
|
@@ -14,6 +14,9 @@ import { handleRefreshKey } from "../../../components/data-table/table-pane";
|
|
|
14
14
|
import type { CryptoAssetKind, CryptoMarketAsset } from "../../../api-client/crypto-markets";
|
|
15
15
|
import { isAccessDenied } from "../../../api-client/errors";
|
|
16
16
|
import { useAsyncResource } from "../../../react/async-resource";
|
|
17
|
+
import { useAgeClock } from "../../../react/auto-refresh";
|
|
18
|
+
import { useRemoteUiNode } from "../../../remote/semantic-tree";
|
|
19
|
+
import { deriveHeadlessFreshness, paneStatusLine } from "../../../cli/pane-functions/freshness";
|
|
17
20
|
import { usePaneVisible } from "../../../state/app/activity";
|
|
18
21
|
import { useLiveQuoteEntries } from "../../../state/hooks/quote-streaming";
|
|
19
22
|
import { colors, priceColor } from "../../../theme/colors";
|
|
@@ -32,7 +35,9 @@ import { cachedCryptoMarkets, loadCryptoMarkets } from "./client";
|
|
|
32
35
|
import {
|
|
33
36
|
buildCryptoColumns,
|
|
34
37
|
buildCryptoRows,
|
|
38
|
+
CRYPTO_BOARD_FRESHNESS,
|
|
35
39
|
CRYPTO_TABS,
|
|
40
|
+
cryptoRowObservations,
|
|
36
41
|
DEFAULT_CRYPTO_SORT,
|
|
37
42
|
formatCryptoPercent,
|
|
38
43
|
nextCryptoSort,
|
|
@@ -151,10 +156,18 @@ export function CryptoBoardPane({ width, height, focused }: PaneProps) {
|
|
|
151
156
|
if (!selectedId || !rows.some((row) => row.id === selectedId)) setSelectedId(rows[0]!.id);
|
|
152
157
|
}, [rows, selectedId, setSelectedId]);
|
|
153
158
|
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
);
|
|
159
|
+
// Dated by the rows on screen while they stream, as `fn CRYP` and `shot CRYP` date the board.
|
|
160
|
+
const observations = useMemo(() => cryptoRowObservations(liveStreaming && streamedIds.size > 0
|
|
161
|
+
? rows.filter((row) => streamedIds.has(row.id)) : rows), [liveStreaming, rows, streamedIds]);
|
|
162
|
+
const now = useAgeClock(resource.updatedAt);
|
|
163
|
+
useRemoteUiNode(observations.length ? {
|
|
164
|
+
role: "report-freshness",
|
|
165
|
+
label: "Price freshness",
|
|
166
|
+
getMetadata: () => ({ ...CRYPTO_BOARD_FRESHNESS, observations }),
|
|
167
|
+
} : null);
|
|
168
|
+
const statusLine = useMemo(() => observations.length
|
|
169
|
+
? paneStatusLine(deriveHeadlessFreshness({ shape: "rows" }, { rows: observations, freshness: CRYPTO_BOARD_FRESHNESS }, now))
|
|
170
|
+
: null, [now, observations]);
|
|
158
171
|
const columns = useMemo(() => buildCryptoColumns(width), [width]);
|
|
159
172
|
|
|
160
173
|
const tabItems = CRYPTO_TABS.map((tab) => ({
|
|
@@ -178,16 +191,10 @@ export function CryptoBoardPane({ width, height, focused }: PaneProps) {
|
|
|
178
191
|
// Background refreshes run every 15s; only the first load is worth a label.
|
|
179
192
|
...(resource.loading && !data ? [{ id: "loading", parts: [{ text: "loading", tone: "muted" as const }] }] : []),
|
|
180
193
|
...(data && resource.error ? [{ id: "refresh", parts: [{ text: "refresh failed", tone: "warning" as const }] }] : []),
|
|
181
|
-
...(
|
|
182
|
-
id: "updated",
|
|
183
|
-
parts: [{
|
|
184
|
-
text: new Date(latestUpdate).toLocaleTimeString([], { hour: "2-digit", minute: "2-digit", second: "2-digit" }),
|
|
185
|
-
tone: "muted" as const,
|
|
186
|
-
}],
|
|
187
|
-
}] : []),
|
|
194
|
+
...(statusLine ? [{ id: "updated", asOf: true, parts: [{ text: statusLine, tone: "muted" as const }] }] : []),
|
|
188
195
|
...(resource.data?.stale ? [{ id: "cached", parts: [{ text: "cached", tone: "warning" as const }] }] : []),
|
|
189
196
|
],
|
|
190
|
-
}), [data,
|
|
197
|
+
}), [data, statusLine, resource.data?.stale, resource.error, resource.loading]);
|
|
191
198
|
|
|
192
199
|
const handleKeyDown = useCallback((event: DataTableKeyEvent) => (
|
|
193
200
|
handleRefreshKey(event, () => void resource.reload(), { stopPropagation: true })
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { SeriesDefinition } from "../../../series/types";
|
|
2
|
+
|
|
3
|
+
const PAIRS: ReadonlyArray<{ symbol: string; name: string }> = [
|
|
4
|
+
{ symbol: "BTC-USD", name: "Bitcoin" },
|
|
5
|
+
{ symbol: "ETH-USD", name: "Ethereum" },
|
|
6
|
+
{ symbol: "SOL-USD", name: "Solana" },
|
|
7
|
+
{ symbol: "XRP-USD", name: "XRP" },
|
|
8
|
+
{ symbol: "BNB-USD", name: "BNB" },
|
|
9
|
+
{ symbol: "DOGE-USD", name: "Dogecoin" },
|
|
10
|
+
{ symbol: "ADA-USD", name: "Cardano" },
|
|
11
|
+
{ symbol: "AVAX-USD", name: "Avalanche" },
|
|
12
|
+
{ symbol: "LINK-USD", name: "Chainlink" },
|
|
13
|
+
{ symbol: "DOT-USD", name: "Polkadot" },
|
|
14
|
+
{ symbol: "LTC-USD", name: "Litecoin" },
|
|
15
|
+
{ symbol: "UNI-USD", name: "Uniswap" },
|
|
16
|
+
{ symbol: "ATOM-USD", name: "Cosmos" },
|
|
17
|
+
{ symbol: "NEAR-USD", name: "NEAR" },
|
|
18
|
+
{ symbol: "APT-USD", name: "Aptos" },
|
|
19
|
+
{ symbol: "SUI-USD", name: "Sui" },
|
|
20
|
+
{ symbol: "TON-USD", name: "Toncoin" },
|
|
21
|
+
{ symbol: "SHIB-USD", name: "Shiba Inu" },
|
|
22
|
+
];
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* The large pairs by name, and the price of any pair: the board's sparklines
|
|
26
|
+
* and the price a pair on the user's lists charts.
|
|
27
|
+
*/
|
|
28
|
+
export const CRYPTO_SERIES: readonly SeriesDefinition[] = [
|
|
29
|
+
...PAIRS.map((pair): SeriesDefinition => ({
|
|
30
|
+
id: `crypto:${pair.symbol}`,
|
|
31
|
+
name: `${pair.name} (${pair.symbol})`,
|
|
32
|
+
unit: "USD",
|
|
33
|
+
frequency: "intraday",
|
|
34
|
+
group: "Crypto",
|
|
35
|
+
tags: [pair.symbol.split("-")[0]!, "crypto", "coin"],
|
|
36
|
+
expression: `${pair.symbol}:price`,
|
|
37
|
+
})),
|
|
38
|
+
{
|
|
39
|
+
id: "crypto:price",
|
|
40
|
+
name: "Price",
|
|
41
|
+
unit: "currency",
|
|
42
|
+
frequency: "intraday",
|
|
43
|
+
group: "Crypto",
|
|
44
|
+
tags: ["crypto", "pair"],
|
|
45
|
+
input: "crypto",
|
|
46
|
+
expression: "{ticker}:price",
|
|
47
|
+
},
|
|
48
|
+
];
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { resolveEntryValue } from "../../../market-data/coordinator";
|
|
2
|
-
import {
|
|
2
|
+
import { currencyPriceMinDigits } from "../../../market-data/market/format";
|
|
3
3
|
import type { QueryEntry } from "../../../market-data/result-types";
|
|
4
4
|
import type { QuoteSubscriptionTarget } from "../../../types/data-provider";
|
|
5
5
|
import type { Quote } from "../../../types/financials";
|
|
@@ -64,7 +64,7 @@ export function liveViewDecimalFloors(rows: readonly ViewRow[], fields: Readonly
|
|
|
64
64
|
function rowsMinorDigits(rows: readonly ViewRow[]): number {
|
|
65
65
|
const currencies = new Set(rows.map((row) => (typeof row.currency === "string" ? row.currency.trim() : "")));
|
|
66
66
|
if (currencies.size === 0) return 2;
|
|
67
|
-
return Math.max(...[...currencies].map((currency) =>
|
|
67
|
+
return Math.max(...[...currencies].map((currency) => currencyPriceMinDigits(currency || undefined)));
|
|
68
68
|
}
|
|
69
69
|
|
|
70
70
|
export function viewRowSymbol(row: ViewRow, symbolKey: string | null): string | null {
|
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
import type { HeadlessPaneDefinition } from "../../../types/plugin";
|
|
2
2
|
import { fetchDebtMaturities } from "./client";
|
|
3
|
-
import { bucketShare, debtNotices } from "./model";
|
|
3
|
+
import { bucketShare, debtAmount, debtNotices, debtPercent } from "./model";
|
|
4
4
|
import { SEC_FILINGS } from "../shared/report-freshness";
|
|
5
5
|
import { resolveHeadlessIssuerListing } from "../shared/headless-market-data";
|
|
6
6
|
|
|
7
|
+
/** Amounts and shares as the pane prints them (952.00M, 12.5%); exports keep the whole number. */
|
|
8
|
+
const amount = (value: unknown) => debtAmount(typeof value === "number" ? value : null);
|
|
9
|
+
const percent = (value: unknown) => debtPercent(typeof value === "number" ? value : null);
|
|
10
|
+
|
|
7
11
|
export const debtMaturitiesHeadless: HeadlessPaneDefinition<"bundle"> = {
|
|
8
12
|
shape: "bundle",
|
|
9
13
|
freshness: SEC_FILINGS,
|
|
@@ -16,11 +20,11 @@ export const debtMaturitiesHeadless: HeadlessPaneDefinition<"bundle"> = {
|
|
|
16
20
|
aliases: ["DDIS"],
|
|
17
21
|
dataRequirements: ["Gloom Cloud SEC principal maturity schedules"],
|
|
18
22
|
limitations: [
|
|
19
|
-
"Six relative fiscal maturity buckets; thereafter is open ended",
|
|
20
|
-
"Reported principal obligations, not carrying debt; scope can include short-term borrowing and hedges",
|
|
21
|
-
"Native currency; unsupported or missing facts remain null",
|
|
22
|
-
"No inferred weighted coupon or duration",
|
|
23
|
-
"Ten-year percentiles require five comparable annual observations",
|
|
23
|
+
"Six relative fiscal maturity buckets; thereafter is open ended.",
|
|
24
|
+
"Reported principal obligations, not carrying debt; scope can include short-term borrowing and hedges.",
|
|
25
|
+
"Native currency; unsupported or missing facts remain null.",
|
|
26
|
+
"No inferred weighted coupon or duration.",
|
|
27
|
+
"Ten-year percentiles require five comparable annual observations.",
|
|
24
28
|
],
|
|
25
29
|
},
|
|
26
30
|
options: [
|
|
@@ -49,9 +53,9 @@ export const debtMaturitiesHeadless: HeadlessPaneDefinition<"bundle"> = {
|
|
|
49
53
|
title: "Principal maturity schedule",
|
|
50
54
|
columns: [
|
|
51
55
|
{ key: "label", header: "Maturity" },
|
|
52
|
-
{ key: "value", header: "Principal", align: "right" },
|
|
56
|
+
{ key: "value", header: "Principal", align: "right", textFormat: amount },
|
|
53
57
|
{ key: "currency", header: "Currency" },
|
|
54
|
-
{ key: "share", header: "% total", align: "right" },
|
|
58
|
+
{ key: "share", header: "% total", align: "right", textFormat: percent },
|
|
55
59
|
{ key: "asOf", header: "As of" },
|
|
56
60
|
{ key: "filed", header: "Filed" },
|
|
57
61
|
],
|
|
@@ -68,18 +72,20 @@ export const debtMaturitiesHeadless: HeadlessPaneDefinition<"bundle"> = {
|
|
|
68
72
|
title: "Annual filing history",
|
|
69
73
|
columns: [
|
|
70
74
|
{ key: "asOf", header: "As of" },
|
|
71
|
-
{ key: "totalPrincipal", header: "Principal", align: "right" },
|
|
72
|
-
{ key: "next12MonthsShare", header: "Next 12m %", align: "right" },
|
|
73
|
-
{ key: "next3YearsShare", header: "Next 3y %", align: "right" },
|
|
75
|
+
{ key: "totalPrincipal", header: "Principal", align: "right", textFormat: amount },
|
|
76
|
+
{ key: "next12MonthsShare", header: "Next 12m %", align: "right", textFormat: percent },
|
|
77
|
+
{ key: "next3YearsShare", header: "Next 3y %", align: "right", textFormat: percent },
|
|
74
78
|
{
|
|
75
79
|
key: "interestExpense",
|
|
76
80
|
header: "Interest expense",
|
|
77
81
|
align: "right",
|
|
82
|
+
textFormat: amount,
|
|
78
83
|
},
|
|
79
84
|
{
|
|
80
85
|
key: "borrowingCostPercent",
|
|
81
86
|
header: "Cost proxy %",
|
|
82
87
|
align: "right",
|
|
88
|
+
textFormat: percent,
|
|
83
89
|
},
|
|
84
90
|
{ key: "currency", header: "Currency" },
|
|
85
91
|
{ key: "filed", header: "Filed" },
|
|
@@ -3,8 +3,10 @@ import { createTickerSurfacePaneTemplate } from "../shared/ticker-surface";
|
|
|
3
3
|
import { debtMaturitiesCache } from "./client";
|
|
4
4
|
import { debtMaturitiesHeadless } from "./headless";
|
|
5
5
|
import { DebtMaturitiesPane } from "./pane";
|
|
6
|
+
import { DEBT_MATURITY_SERIES } from "./series";
|
|
6
7
|
|
|
7
8
|
export const debtMaturitiesModule: PluginModule = {
|
|
9
|
+
series: DEBT_MATURITY_SERIES,
|
|
8
10
|
panes: [
|
|
9
11
|
{
|
|
10
12
|
id: "debt-maturities",
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { DebtHistoryPoint } from "../../../api-client/debt-maturities";
|
|
2
|
+
import type { SeriesDefinition } from "../../../series/types";
|
|
3
|
+
import { cachedSeriesWarning } from "../shared/series-warning";
|
|
4
|
+
import { loadDebtMaturities } from "./client";
|
|
5
|
+
|
|
6
|
+
type HistoryField = "totalPrincipal" | "next12MonthsShare" | "next3YearsShare";
|
|
7
|
+
|
|
8
|
+
const FIELDS: ReadonlyArray<{ id: string; field: HistoryField; name: string; unit: string; tags: readonly string[]; description: string }> = [
|
|
9
|
+
{ id: "total-principal", field: "totalPrincipal", name: "Debt principal total", unit: "USD", tags: ["principal", "total debt"],
|
|
10
|
+
description: "The principal the company reports maturing, all years summed, at each annual filing, as DDIS charts it." },
|
|
11
|
+
{ id: "due-12m-share", field: "next12MonthsShare", name: "Debt due in the next 12 months", unit: "%", tags: ["near-term maturities", "refinancing"],
|
|
12
|
+
description: "Share of reported debt principal maturing within a year of each annual filing, as DDIS charts it." },
|
|
13
|
+
{ id: "due-3y-share", field: "next3YearsShare", name: "Debt due in the next 3 years", unit: "%", tags: ["near-term maturities", "refinancing"],
|
|
14
|
+
description: "Share of reported debt principal maturing within three years of each annual filing, as DDIS charts it." },
|
|
15
|
+
];
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* A company's maturity wall across its annual filings, as DDIS reads it: the
|
|
19
|
+
* principal it reports and how much of it falls due soon. The wall itself is
|
|
20
|
+
* a schedule by year and stays in the pane.
|
|
21
|
+
*/
|
|
22
|
+
export const DEBT_MATURITY_SERIES: readonly SeriesDefinition[] = FIELDS.map(({ id, field, name, unit, tags, description }): SeriesDefinition => ({
|
|
23
|
+
id: `debt-maturities:${id}`,
|
|
24
|
+
name,
|
|
25
|
+
unit,
|
|
26
|
+
frequency: "annual",
|
|
27
|
+
group: "Credit",
|
|
28
|
+
tags: ["debt maturities", "maturity wall", "DDIS", ...tags],
|
|
29
|
+
description,
|
|
30
|
+
publisher: "SEC",
|
|
31
|
+
input: "ticker",
|
|
32
|
+
style: "step",
|
|
33
|
+
load: async ({ ticker }) => {
|
|
34
|
+
const resource = await loadDebtMaturities(ticker!);
|
|
35
|
+
if (!resource.payload.history.length) throw new Error(`No maturity schedule reported for ${ticker}.`);
|
|
36
|
+
// An amount stays in the unit it is listed in: a filing in another currency is a gap, not a converted figure.
|
|
37
|
+
const listed = (point: DebtHistoryPoint) => unit !== "USD" || point.currency === "USD";
|
|
38
|
+
const other = resource.payload.history.find((point) => !listed(point))?.currency;
|
|
39
|
+
const warning = other ? `Filings reported in ${other} are left out.` : cachedSeriesWarning(resource);
|
|
40
|
+
return {
|
|
41
|
+
points: resource.payload.history.map((point) => ({ date: point.asOf, value: listed(point) ? point[field] : null })),
|
|
42
|
+
...(warning ? { warning } : {}),
|
|
43
|
+
};
|
|
44
|
+
},
|
|
45
|
+
}));
|
|
@@ -149,6 +149,8 @@ export function buildDividendMetrics(
|
|
|
149
149
|
? trailingCashAt(eligible, now)
|
|
150
150
|
: options.summaryRatesComparable !== false ? quoteFields?.trailingAnnualDividendRate ?? null : null;
|
|
151
151
|
const forwardRate = options.summaryRatesComparable !== false ? quoteFields?.forwardAnnualDividendRate ?? null : null;
|
|
152
|
+
const forwardRateAsOf = forwardRate != null && /^\d{4}-\d{2}-\d{2}$/.test(quoteFields?.forwardRateAsOf ?? "")
|
|
153
|
+
? quoteFields!.forwardRateAsOf! : null;
|
|
152
154
|
const growth1Y = options.historyAvailable !== false ? computeGrowth(eligible, 1, now) : null;
|
|
153
155
|
const growth3Y = options.historyAvailable !== false ? computeGrowth(eligible, 3, now) : null;
|
|
154
156
|
|
|
@@ -170,6 +172,7 @@ export function buildDividendMetrics(
|
|
|
170
172
|
forwardYield: null,
|
|
171
173
|
trailingRate,
|
|
172
174
|
forwardRate,
|
|
175
|
+
forwardRateAsOf,
|
|
173
176
|
payoutRatio: quoteFields?.payoutRatio ?? null,
|
|
174
177
|
growth1Y,
|
|
175
178
|
growth3Y,
|
|
@@ -8,7 +8,8 @@ import { dividendReferencePrice, fetchDividendData, type DividendData } from "./
|
|
|
8
8
|
import type { DividendPayment } from "./types";
|
|
9
9
|
import { formatDividendYield, toDividendRows } from "./view";
|
|
10
10
|
import { formatDistributionAmount, formatPercent } from "../../../utils/format";
|
|
11
|
-
import {
|
|
11
|
+
import { forwardDividendBasis } from "../../../utils/forward-dividend";
|
|
12
|
+
import { currencyPriceMinDigits, formatMarketPriceWithCurrency } from "../../../market-data/market/format";
|
|
12
13
|
import type { Quote } from "../../../types/financials";
|
|
13
14
|
import { dividendPriceStatus, dividendQuotePriceMetadata } from "./reference-price";
|
|
14
15
|
|
|
@@ -85,13 +86,14 @@ export function projectDividendYieldHeadless(
|
|
|
85
86
|
{
|
|
86
87
|
title: "Dividend metrics",
|
|
87
88
|
entries: [
|
|
88
|
-
{ label: "Price", value: data.price, ...(data.price != null && currency ? { formatted: formatMarketPriceWithCurrency(data.price, currency, { minimumFractionDigits:
|
|
89
|
+
{ label: "Price", value: data.price, ...(data.price != null && currency ? { formatted: formatMarketPriceWithCurrency(data.price, currency, { minimumFractionDigits: currencyPriceMinDigits(currency) }) } : {}) },
|
|
89
90
|
...(data.stale ? [{ label: "History status", value: "Stale cash history; recent distributions may be missing." }] : []),
|
|
90
91
|
...(priceStatus ? [{ label: "Price status", value: priceStatus === "stale"
|
|
91
92
|
? "Stale reference price; cash yield may be out of date."
|
|
92
93
|
: "Reference price time unavailable; cash yield may be out of date." }] : []),
|
|
93
94
|
{ label: "Trailing yield", value: metrics.trailingYield, formatted: formatDividendYield(metrics.trailingYield) },
|
|
94
|
-
{ label: "Forward yield", value: metrics.forwardYield, formatted:
|
|
95
|
+
{ label: "Forward yield", value: metrics.forwardYield, formatted: metrics.forwardYield == null ? formatDividendYield(null)
|
|
96
|
+
: `${formatDividendYield(metrics.forwardYield)} (${forwardDividendBasis(metrics.forwardRateAsOf)})` },
|
|
95
97
|
{ label: "Trailing rate", value: metrics.trailingRate, formatted: currency ? formatDistributionAmount(metrics.trailingRate ?? undefined, currency) : "—" },
|
|
96
98
|
{ label: "Forward rate", value: metrics.forwardRate, formatted: currency ? formatDistributionAmount(metrics.forwardRate ?? undefined, currency) : "—" },
|
|
97
99
|
{ label: "Earnings Payout", value: metrics.payoutRatio, formatted: formatDividendYield(metrics.payoutRatio) },
|
|
@@ -127,7 +129,8 @@ export function projectDividendYieldHeadless(
|
|
|
127
129
|
priceStale: data.priceStale ?? null,
|
|
128
130
|
limitations: data.notes ?? [],
|
|
129
131
|
yieldMethod: "Cash distributions with ex-dates in the preceding 12 months, one payment per period for a regular cadence, divided by the reference share price; excludes reinvestment and is not SEC yield or total return.",
|
|
130
|
-
|
|
132
|
+
forwardRateAsOf: metrics.forwardRateAsOf,
|
|
133
|
+
forwardRateMethod: "Indicated annual cash rate, the one fundamentals use: the latest regular distribution annualized, dated by its ex-date (forwardRateAsOf). Only when its currency units are comparable with the share price.",
|
|
131
134
|
paymentFrequencyMethod: "Cadence inferred from ex-dates in the last two years, unavailable when no cash was reported in the last year; not an announced payment schedule.",
|
|
132
135
|
},
|
|
133
136
|
};
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { PluginModule } from "../plugin-module";
|
|
2
|
+
import { DIVIDEND_SERIES } from "./series";
|
|
2
3
|
import { createTickerSurfacePaneTemplate } from "../shared/ticker-surface";
|
|
3
4
|
import {
|
|
4
5
|
attachDividendYieldHealth,
|
|
@@ -19,6 +20,7 @@ function createDividendYieldModule({
|
|
|
19
20
|
} = {}): PluginModule {
|
|
20
21
|
let disposeConnection: (() => void) | null = null;
|
|
21
22
|
return {
|
|
23
|
+
series: DIVIDEND_SERIES,
|
|
22
24
|
setup(ctx) {
|
|
23
25
|
if (marketConnection) {
|
|
24
26
|
attachDividendYieldHealth(ctx.connectionHealth);
|
|
@@ -67,7 +69,7 @@ function createDividendYieldModule({
|
|
|
67
69
|
id: "dividend-yield-pane",
|
|
68
70
|
paneId: "dividend-yield",
|
|
69
71
|
label: "Dividend Yield",
|
|
70
|
-
description: "Cash distribution history, trailing cash yield,
|
|
72
|
+
description: "Cash distribution history, trailing cash yield, forward yield from the latest distribution, and growth. Future payments are not forecast.",
|
|
71
73
|
keywords: ["dividend", "yield", "dvd", "income", "payout", "ex-date", "distribution"],
|
|
72
74
|
shortcut: "DVD",
|
|
73
75
|
}),
|
|
@@ -77,7 +77,9 @@ function buildMetricItems(metrics: DividendMetrics, currency: string, hasHistory
|
|
|
77
77
|
: hasHistory ? [] : [{ id: "last-ex", label: "Last ex", value: formatDate(metrics.lastExDividendDate) }];
|
|
78
78
|
return [
|
|
79
79
|
{ id: "ttm-yield", label: short ? "TTM yld" : "TTM yield", value: formatDividendYield(metrics.trailingYield), color: priceColor(metrics.trailingYield ?? 0) },
|
|
80
|
-
|
|
80
|
+
// Dated by the distribution it annualizes; docs/research-data.md says how it is built.
|
|
81
|
+
{ id: "forward-yield", label: short ? "Fwd yld" : "Fwd yield", value: formatDividendYield(metrics.forwardYield), color: priceColor(metrics.forwardYield ?? 0),
|
|
82
|
+
...(metrics.forwardYield != null && metrics.forwardRateAsOf ? { detail: `as of ${metrics.forwardRateAsOf}` } : {}) },
|
|
81
83
|
{ id: "ttm-rate", label: short ? "TTM/sh" : "TTM/share", value: formatRate(metrics.trailingRate, currency) },
|
|
82
84
|
{ id: "forward-rate", label: short ? "Fwd/sh" : "Fwd/share", value: formatRate(metrics.forwardRate, currency) },
|
|
83
85
|
{ id: "growth-1y", label: short ? "1Y chg" : "1Y growth", value: formatGrowth(metrics.growth1Y), color: priceColor(metrics.growth1Y ?? 0) },
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { SeriesDefinition } from "../../../series/types";
|
|
2
|
+
import { fetchDividendData } from "./client";
|
|
3
|
+
import { buildTrailingCashChartPoints } from "./view";
|
|
4
|
+
|
|
5
|
+
/** A ticker's trailing twelve months of cash dividends, stepping at each payment, as DVD charts it. */
|
|
6
|
+
export const DIVIDEND_SERIES: readonly SeriesDefinition[] = [{
|
|
7
|
+
id: "dividends:ttm-cash",
|
|
8
|
+
name: "Trailing 12-month dividends",
|
|
9
|
+
unit: "currency/share",
|
|
10
|
+
frequency: "irregular",
|
|
11
|
+
group: "Securities",
|
|
12
|
+
tags: ["dividends", "income", "payout", "DVD"],
|
|
13
|
+
input: "ticker",
|
|
14
|
+
style: "step",
|
|
15
|
+
load: async ({ ticker }) => {
|
|
16
|
+
const data = await fetchDividendData(ticker!, null);
|
|
17
|
+
if (data.historyAvailable === false) throw new Error(data.historyError ?? `No dividend history for ${ticker}.`);
|
|
18
|
+
return buildTrailingCashChartPoints(data.payments).map((point) => ({ date: point.date, value: point.close }));
|
|
19
|
+
},
|
|
20
|
+
}];
|
|
@@ -13,6 +13,8 @@ export interface DividendMetrics {
|
|
|
13
13
|
forwardYield: number | null;
|
|
14
14
|
trailingRate: number | null;
|
|
15
15
|
forwardRate: number | null;
|
|
16
|
+
/** The ex-date of the distribution the forward rate annualizes, YYYY-MM-DD. */
|
|
17
|
+
forwardRateAsOf: string | null;
|
|
16
18
|
payoutRatio: number | null;
|
|
17
19
|
growth1Y: number | null;
|
|
18
20
|
growth3Y: number | null;
|