gloomberb 0.18.4 → 0.19.0
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 +1 -1
- package/README.zh-CN.md +1 -1
- package/package.json +1 -1
- package/patches/electrobun@1.18.1.patch +169 -5
- package/src/account/auth-model.ts +7 -3
- package/src/api-client/auth.ts +9 -4
- package/src/api-client/catalysts.ts +2 -1
- package/src/api-client/cot.ts +6 -2
- package/src/api-client/credit-documents.ts +6 -0
- package/src/api-client/data.ts +31 -6
- package/src/api-client/equity-screener.ts +24 -0
- package/src/api-client/fund-facts.ts +45 -4
- package/src/api-client/index.ts +171 -11
- package/src/api-client/live-scan.ts +91 -0
- package/src/api-client/market-discovery.ts +10 -0
- package/src/api-client/market-movers.ts +7 -0
- package/src/api-client/members.ts +13 -1
- package/src/api-client/perps.ts +43 -0
- package/src/api-client/request.ts +222 -41
- package/src/api-client/research-activity.ts +6 -12
- package/src/api-client/types.ts +74 -0
- package/src/app/keybindings/index.ts +3 -0
- package/src/app/keybindings/labels.ts +18 -1
- package/src/app/keybindings/resolve.ts +14 -0
- package/src/app/pane-runtime/plugin-bindings.ts +9 -5
- package/src/app/runtime/broker-import.ts +42 -27
- package/src/app/runtime/plugin-bindings.ts +73 -56
- package/src/architecture/core-builtin-allowlist.json +1 -1
- package/src/architecture/pane-tabs-allowlist.json +3 -0
- package/src/architecture/ttl-caches-allowlist.json +19 -0
- package/src/brokers/sync-broker-instance.ts +2 -8
- package/src/capabilities/chart-series.ts +1 -1
- package/src/cli/commands/crypto-hints.ts +40 -24
- package/src/cli/commands/fred-series.ts +5 -0
- package/src/cli/commands/keybindings.ts +23 -0
- package/src/cli/commands/market.ts +138 -46
- package/src/cli/commands/options-chain.ts +107 -10
- package/src/cli/commands/options-leaps.ts +9 -3
- package/src/cli/commands/overview.ts +176 -39
- package/src/cli/commands/search.ts +39 -3
- package/src/cli/commands/themes.ts +11 -2
- package/src/cli/commands/ticker.ts +57 -35
- package/src/cli/company-name-hint.ts +41 -0
- package/src/cli/earnings-calendar.ts +1 -1
- package/src/cli/errors.ts +10 -2
- package/src/cli/export-source.ts +29 -1
- package/src/cli/glossary.ts +73 -1
- package/src/cli/history-rows.ts +87 -16
- package/src/cli/index.ts +2 -0
- package/src/cli/known-gaps.ts +5 -2
- package/src/cli/listing-arg.ts +195 -56
- package/src/cli/output-file.ts +68 -0
- package/src/cli/pane-functions/capabilities.ts +3 -0
- package/src/cli/pane-functions/catalog.ts +80 -7
- package/src/cli/pane-functions/dom.ts +13 -3
- package/src/cli/pane-functions/freshness.ts +111 -16
- package/src/cli/pane-functions/function-help.ts +23 -13
- package/src/cli/pane-functions/headless.ts +56 -12
- package/src/cli/pane-functions/index.ts +58 -16
- package/src/cli/pane-functions/market-session.ts +81 -9
- package/src/cli/pane-functions/options.ts +19 -1
- package/src/cli/pane-functions/report.ts +5 -1
- package/src/cli/pane-functions/resolver.ts +35 -8
- package/src/cli/pane-functions/screenshot-assessment.ts +6 -4
- package/src/cli/pane-functions/screenshot-types.ts +5 -0
- package/src/cli/quote-answer.ts +30 -13
- package/src/cli/report-tables.ts +18 -7
- package/src/cli/restore-plugins.ts +13 -1
- package/src/cli/result.ts +57 -5
- package/src/cli/ticker-resolution.ts +3 -2
- package/src/components/chart/composite/composite-chart.tsx +26 -4
- package/src/components/chart/composite/format.ts +27 -0
- package/src/components/chart/composite/interactions.ts +6 -0
- package/src/components/chart/composite/legend.tsx +45 -7
- package/src/components/chart/composite/levels.ts +2 -0
- package/src/components/chart/composite/panel-gestures.ts +33 -0
- package/src/components/chart/composite/panel-series.ts +1 -0
- package/src/components/chart/composite/panel-surface.tsx +61 -5
- package/src/components/chart/composite/range-statistics.ts +62 -0
- package/src/components/chart/composite/rasterizer.ts +24 -13
- package/src/components/chart/composite/scene.ts +46 -7
- package/src/components/chart/composite/series-axis-tags.tsx +16 -9
- package/src/components/chart/composite/series-cues.ts +14 -0
- package/src/components/chart/composite/text-renderer.ts +9 -2
- package/src/components/chart/composite/tool-catalog.ts +36 -0
- package/src/components/chart/composite/tools.ts +203 -44
- package/src/components/chart/composite/types.ts +4 -0
- package/src/components/chart/composite/use-composite-chart-keyboard.ts +11 -4
- package/src/components/command-bar/assist/inventory.ts +2 -1
- package/src/components/command-bar/commands/direct/index.ts +28 -13
- package/src/components/command-bar/pane-templates/items.ts +3 -2
- package/src/components/command-bar/panel/prompt-binding.ts +0 -8
- package/src/components/command-bar/workflow/alert.ts +1 -1
- package/src/components/command-bar/workflow/collection-actions.ts +3 -3
- package/src/components/layout/header.tsx +26 -40
- package/src/components/layout/pane/footer/index.tsx +1 -0
- package/src/components/layout/pane/footer/model.ts +27 -0
- package/src/components/onboarding/onboarding-frame.tsx +1 -1
- package/src/components/onboarding/onboarding-wizard.tsx +4 -1
- package/src/components/onboarding/portfolio-step/positions-panel.tsx +14 -9
- package/src/components/onboarding/wizard-broker-sync.ts +0 -1
- package/src/components/onboarding/wizard-positions.ts +3 -3
- package/src/components/ticker/list-table-view.tsx +4 -1
- package/src/components/ui/choice-dialog.tsx +23 -18
- package/src/components/ui/choice-groups.ts +18 -0
- package/src/components/ui/data-table/opentui/index.tsx +9 -7
- package/src/components/ui/data-table/opentui/model.ts +26 -1
- package/src/components/ui/data-table/types.ts +2 -0
- package/src/components/ui/display.tsx +5 -1
- package/src/components/ui/list-view.tsx +8 -4
- package/src/components/ui/query-bar-keys.tsx +2 -0
- package/src/components/ui/query-bar.tsx +1 -0
- package/src/components/ui/select-button.tsx +5 -1
- package/src/components/ui/select-field.tsx +1 -0
- package/src/components/ui/table-layout.ts +8 -5
- package/src/core/app-runtime.ts +2 -0
- package/src/core/app-services.ts +2 -2
- package/src/core/state/app/layout.ts +2 -0
- package/src/core/state/app/state.ts +9 -0
- package/src/core/state/app/types.ts +3 -0
- package/src/data/config/chart-settings.ts +1 -1
- package/src/data/json-ticker-repository.ts +17 -8
- package/src/data/saved-copies.ts +55 -16
- package/src/data/ticker-repository.ts +16 -9
- package/src/data/ticker-writes.ts +81 -0
- package/src/data/ttl-cache.ts +165 -0
- package/src/docs/snapshot.json +427 -216
- package/src/i18n/es.ts +19 -3
- package/src/i18n/ja.ts +19 -3
- package/src/i18n/ko.ts +19 -3
- package/src/i18n/zh-cn.ts +19 -3
- package/src/i18n/zh-tw.ts +19 -3
- package/src/market-data/coordinator/financials.ts +10 -2
- package/src/market-data/coordinator/index.ts +3 -1
- package/src/market-data/coordinator/quotes.ts +4 -2
- package/src/market-data/depositary-pair.ts +2 -2
- package/src/market-data/fund-facts.ts +50 -0
- package/src/market-data/market/change-basis.ts +48 -7
- package/src/market-data/market/dated-previous-close.ts +203 -0
- package/src/market-data/market/format.ts +25 -0
- package/src/market-data/market/freshness.ts +2 -1
- package/src/market-data/market/futures-week.ts +68 -0
- package/src/market-data/market/status.ts +16 -4
- package/src/market-data/options-alternatives.ts +141 -4
- package/src/market-data/quotes/contributions.ts +20 -2
- package/src/market-data/quotes/resolution.ts +3 -0
- package/src/market-data/selectors.ts +3 -0
- package/src/news/aggregator.ts +113 -9
- package/src/news/cloud-session.ts +21 -0
- package/src/news/hooks.ts +1 -0
- package/src/news/news-model.ts +1 -0
- package/src/news/types.ts +11 -0
- package/src/notifications/notification-log.ts +6 -4
- package/src/plugins/builtin/alerts/alert-engine.ts +25 -2
- package/src/plugins/builtin/alerts/alert-log.ts +33 -0
- package/src/plugins/builtin/alerts/calendar-events.ts +57 -6
- package/src/plugins/builtin/alerts/cli-forms.ts +216 -0
- package/src/plugins/builtin/alerts/cli.ts +380 -82
- package/src/plugins/builtin/alerts/command.ts +31 -0
- package/src/plugins/builtin/alerts/constants.ts +1 -1
- package/src/plugins/builtin/alerts/events-pane.tsx +19 -4
- package/src/plugins/builtin/alerts/fired-log.ts +113 -8
- package/src/plugins/builtin/alerts/format.ts +80 -4
- package/src/plugins/builtin/alerts/headless.ts +30 -7
- package/src/plugins/builtin/alerts/history-rows.ts +7 -3
- package/src/plugins/builtin/alerts/history.ts +2 -0
- package/src/plugins/builtin/alerts/index.tsx +135 -22
- package/src/plugins/builtin/alerts/live.ts +3 -3
- package/src/plugins/builtin/alerts/metric-command.ts +134 -0
- package/src/plugins/builtin/alerts/metric-data.ts +111 -0
- package/src/plugins/builtin/alerts/metric-model.ts +324 -0
- package/src/plugins/builtin/alerts/metric-parity-fixture.json +725 -0
- package/src/plugins/builtin/alerts/pane.tsx +90 -39
- package/src/plugins/builtin/alerts/quotes.ts +6 -0
- package/src/plugins/builtin/alerts/storage.ts +37 -10
- package/src/plugins/builtin/alerts/types.ts +7 -0
- package/src/plugins/builtin/analytics/index.tsx +2 -1
- package/src/plugins/builtin/analytics/risk-client.ts +16 -5
- package/src/plugins/builtin/analytics/risk-fx.ts +70 -15
- package/src/plugins/builtin/analytics/risk-headless.ts +27 -0
- package/src/plugins/builtin/analytics/risk-model.ts +55 -9
- package/src/plugins/builtin/analytics/risk-pane.tsx +8 -2
- package/src/plugins/builtin/attention/index.tsx +2 -1
- package/src/plugins/builtin/attention/listing.ts +14 -0
- package/src/plugins/builtin/backtest/headless.ts +10 -5
- package/src/plugins/builtin/backtest/pane.tsx +9 -4
- package/src/plugins/builtin/backtest/presets.ts +29 -3
- package/src/plugins/builtin/broker-manager/index.tsx +10 -5
- package/src/plugins/builtin/broker-manager/model.ts +6 -1
- package/src/plugins/builtin/broker-trading/controller.ts +22 -12
- package/src/plugins/builtin/broker-trading/index.tsx +13 -1
- package/src/plugins/builtin/broker-trading/order-feed.ts +9 -4
- package/src/plugins/builtin/broker-trading/pane.tsx +1 -1
- package/src/plugins/builtin/buildout/cells.tsx +12 -4
- package/src/plugins/builtin/buildout/format.ts +38 -0
- package/src/plugins/builtin/buildout/model/normalizers.ts +36 -1
- package/src/plugins/builtin/buildout/pane/index.tsx +4 -1
- package/src/plugins/builtin/buildout/table-model.ts +23 -2
- package/src/plugins/builtin/builtin-plugin-meta.ts +7 -3
- package/src/plugins/builtin/catalysts/model.ts +2 -1
- package/src/plugins/builtin/changelog/index.tsx +9 -6
- package/src/plugins/builtin/chart-composer/catalog-inventory.ts +6 -1
- package/src/plugins/builtin/chart-composer/chart-spec-edit.ts +1 -1
- package/src/plugins/builtin/chart-composer/cli-options.ts +9 -5
- package/src/plugins/builtin/chart-composer/data-catalog-pane.tsx +12 -2
- package/src/plugins/builtin/chart-composer/editor/controller.ts +4 -2
- package/src/plugins/builtin/chart-composer/editor/model.ts +2 -0
- package/src/plugins/builtin/chart-composer/editor.tsx +7 -5
- package/src/plugins/builtin/chart-composer/formula.ts +71 -18
- package/src/plugins/builtin/chart-composer/headless-schema.ts +21 -4
- package/src/plugins/builtin/chart-composer/headless.ts +19 -3
- package/src/plugins/builtin/chart-composer/index.tsx +1 -1
- package/src/plugins/builtin/chart-composer/pane.tsx +53 -9
- package/src/plugins/builtin/chart-composer/presets.ts +50 -15
- package/src/plugins/builtin/chart-composer/quick-add.tsx +40 -25
- package/src/plugins/builtin/chart-composer/session-history.ts +18 -9
- package/src/plugins/builtin/chart-composer/settings.ts +27 -0
- package/src/plugins/builtin/chart-composer/use-series-catalog.ts +40 -26
- package/src/plugins/builtin/chat/content/command-suggestions.ts +93 -0
- package/src/plugins/builtin/chat/content/composer.tsx +13 -6
- package/src/plugins/builtin/chat/content/footer.tsx +6 -3
- package/src/plugins/builtin/chat/content/index.tsx +50 -21
- package/src/plugins/builtin/chat/content/open-targets.ts +14 -3
- package/src/plugins/builtin/chat/controller/session-runtime.ts +4 -2
- package/src/plugins/builtin/chat/index.tsx +23 -0
- package/src/plugins/builtin/chat/message/desktop.tsx +1 -0
- package/src/plugins/builtin/chat/message/inline-tokens.tsx +23 -0
- package/src/plugins/builtin/chat/message/pane-chip.tsx +50 -20
- package/src/plugins/builtin/chat/pane-links/commands.ts +271 -0
- package/src/plugins/builtin/chat/pane-links/model.ts +12 -3
- package/src/plugins/builtin/chat/pane-links/open.ts +8 -1
- package/src/plugins/builtin/chat/unread-inbox-pane.tsx +10 -1
- package/src/plugins/builtin/clinical-trials/model.ts +0 -9
- package/src/plugins/builtin/clinical-trials/pane.tsx +15 -22
- package/src/plugins/builtin/clinical-trials/sponsor-tickers.ts +8 -6
- package/src/plugins/builtin/cloud/askg/manifest.ts +2 -0
- package/src/plugins/builtin/cloud/plugin.tsx +1 -1
- package/src/plugins/builtin/company-attention/building.tsx +5 -1
- package/src/plugins/builtin/company-attention/client.ts +8 -9
- package/src/plugins/builtin/company-attention/evidence.ts +4 -1
- package/src/plugins/builtin/company-attention/moves.tsx +5 -1
- package/src/plugins/builtin/company-attention/pane.tsx +9 -2
- package/src/plugins/builtin/company-attention/signals.tsx +5 -1
- package/src/plugins/builtin/correlation/headless.ts +13 -5
- package/src/plugins/builtin/correlation/history.ts +22 -0
- package/src/plugins/builtin/cot/client.ts +22 -18
- package/src/plugins/builtin/cot/headless.ts +15 -10
- package/src/plugins/builtin/cot/model.ts +14 -1
- package/src/plugins/builtin/cot/pane.tsx +22 -14
- package/src/plugins/builtin/credit-boards/client.ts +6 -10
- package/src/plugins/builtin/credit-conditions/headless.ts +8 -2
- package/src/plugins/builtin/credit-conditions/index.tsx +5 -1
- package/src/plugins/builtin/credit-conditions/model.ts +4 -0
- package/src/plugins/builtin/credit-conditions/series.ts +3 -1
- package/src/plugins/builtin/credit-documents/detail.tsx +2 -2
- package/src/plugins/builtin/credit-documents/export.ts +173 -0
- package/src/plugins/builtin/credit-documents/headless.ts +7 -7
- package/src/plugins/builtin/credit-documents/model.ts +104 -14
- package/src/plugins/builtin/credit-documents/pane.tsx +12 -5
- package/src/plugins/builtin/custom-view/sources.ts +2 -0
- package/src/plugins/builtin/dividend-yield/client.ts +131 -23
- package/src/plugins/builtin/dividend-yield/headless.ts +44 -16
- package/src/plugins/builtin/dividend-yield/model.ts +8 -5
- package/src/plugins/builtin/dividend-yield/pane.tsx +38 -13
- package/src/plugins/builtin/dividend-yield/ranking.ts +37 -14
- package/src/plugins/builtin/dividend-yield/types.ts +20 -2
- package/src/plugins/builtin/dividend-yield/view.ts +30 -2
- package/src/plugins/builtin/docs/targets.ts +5 -1
- package/src/plugins/builtin/earnings/board-model.ts +16 -15
- package/src/plugins/builtin/earnings/board.tsx +62 -71
- package/src/plugins/builtin/earnings/headless.ts +40 -4
- package/src/plugins/builtin/earnings/scope.ts +31 -43
- package/src/plugins/builtin/earnings-calls/calendar.tsx +2 -2
- package/src/plugins/builtin/earnings-calls/format.ts +31 -2
- package/src/plugins/builtin/earnings-calls/headless.ts +7 -2
- package/src/plugins/builtin/earnings-calls/model.ts +6 -1
- package/src/plugins/builtin/earnings-calls/pane.tsx +5 -4
- package/src/plugins/builtin/econ/calendar-model.ts +14 -9
- package/src/plugins/builtin/econ/figures.ts +72 -0
- package/src/plugins/builtin/econ/index.tsx +33 -3
- package/src/plugins/builtin/econ/types.ts +4 -0
- package/src/plugins/builtin/econ-statistics/defs.ts +6 -0
- package/src/plugins/builtin/econ-statistics/headless.ts +85 -35
- package/src/plugins/builtin/econ-statistics/stats.ts +37 -9
- package/src/plugins/builtin/econ-statistics/view.ts +3 -0
- package/src/plugins/builtin/equity-screener/categories.ts +179 -0
- package/src/plugins/builtin/equity-screener/client.ts +4 -2
- package/src/plugins/builtin/equity-screener/headless.ts +144 -13
- package/src/plugins/builtin/equity-screener/ideas.ts +49 -0
- package/src/plugins/builtin/equity-screener/model.ts +99 -10
- package/src/plugins/builtin/equity-screener/pane.tsx +70 -15
- package/src/plugins/builtin/exposure/charts.tsx +2 -2
- package/src/plugins/builtin/exposure/model.ts +13 -1
- package/src/plugins/builtin/exposure/pane.tsx +4 -4
- package/src/plugins/builtin/fixed-income/pane.tsx +2 -1
- package/src/plugins/builtin/futures/index.tsx +1 -0
- package/src/plugins/builtin/futures/model.ts +2 -1
- package/src/plugins/builtin/futures/table.tsx +2 -2
- package/src/plugins/builtin/futures/use-board-terms.ts +42 -28
- package/src/plugins/builtin/futures/use-front-returns.ts +45 -28
- package/src/plugins/builtin/fx-matrix/client.ts +11 -3
- package/src/plugins/builtin/fx-matrix/headless.ts +6 -3
- package/src/plugins/builtin/fx-matrix/index.tsx +16 -4
- package/src/plugins/builtin/fx-matrix/live-legs.ts +54 -3
- package/src/plugins/builtin/gpu/headless.ts +8 -2
- package/src/plugins/builtin/help/function-index.ts +4 -1
- package/src/plugins/builtin/help/index.tsx +1 -0
- package/src/plugins/builtin/help/keybindings-editor.tsx +18 -14
- package/src/plugins/builtin/help/shortcut-model.ts +1 -1
- package/src/plugins/builtin/holders/fund-holders.ts +51 -0
- package/src/plugins/builtin/holders/headless.ts +18 -1
- package/src/plugins/builtin/iv-history/client.ts +52 -11
- package/src/plugins/builtin/iv-history/format.ts +36 -23
- package/src/plugins/builtin/iv-history/headless.ts +36 -18
- package/src/plugins/builtin/iv-history/index.tsx +2 -2
- package/src/plugins/builtin/iv-history/model.ts +163 -27
- package/src/plugins/builtin/iv-history/pane.tsx +10 -6
- package/src/plugins/builtin/iv-history/screen-pane.tsx +22 -15
- package/src/plugins/builtin/iv-history/universe.ts +5 -1
- package/src/plugins/builtin/jobs/client.ts +25 -29
- package/src/plugins/builtin/kelly-sizer/model.ts +12 -8
- package/src/plugins/builtin/kelly-sizer/pane.tsx +9 -9
- package/src/plugins/builtin/kelly-sizer/sections.tsx +19 -10
- package/src/plugins/builtin/kelly-sizer/types.ts +10 -4
- package/src/plugins/builtin/macro-day/pane.tsx +7 -5
- package/src/plugins/builtin/macro-day/release-table.ts +2 -2
- package/src/plugins/builtin/market-heatmap/data.ts +8 -33
- package/src/plugins/builtin/market-movers/client.ts +25 -7
- package/src/plugins/builtin/market-movers/footer.ts +2 -2
- package/src/plugins/builtin/market-movers/headless.ts +32 -12
- package/src/plugins/builtin/market-movers/index.tsx +26 -14
- package/src/plugins/builtin/market-movers/min-float.ts +74 -0
- package/src/plugins/builtin/market-movers/model.ts +4 -1
- package/src/plugins/builtin/market-movers/screener.ts +14 -0
- package/src/plugins/builtin/market-movers/session-body.tsx +13 -8
- package/src/plugins/builtin/market-movers/session-table.ts +4 -3
- package/src/plugins/builtin/market-movers/table.ts +17 -5
- package/src/plugins/builtin/members/breadth-pane.tsx +82 -0
- package/src/plugins/builtin/members/client.ts +19 -4
- package/src/plugins/builtin/members/headless.ts +20 -7
- package/src/plugins/builtin/members/index.tsx +9 -9
- package/src/plugins/builtin/members/model.ts +23 -4
- package/src/plugins/builtin/members/pane.tsx +25 -15
- package/src/plugins/builtin/news/index.tsx +1 -0
- package/src/plugins/builtin/news/wire/categories.ts +19 -3
- package/src/plugins/builtin/news/wire/industry-pane.tsx +1 -0
- package/src/plugins/builtin/news/wire/news/footer.ts +31 -5
- package/src/plugins/builtin/news/wire/news/preset-pane.tsx +6 -1
- package/src/plugins/builtin/news/wire/news/table.tsx +2 -2
- package/src/plugins/builtin/openfda/client.ts +14 -2
- package/src/plugins/builtin/openfda/index.tsx +3 -2
- package/src/plugins/builtin/openfda/model.ts +9 -0
- package/src/plugins/builtin/openfda/pane.tsx +42 -6
- package/src/plugins/builtin/options/analytics.ts +54 -6
- package/src/plugins/builtin/options/enrichment.ts +17 -5
- package/src/plugins/builtin/options/model-spot.ts +5 -2
- package/src/plugins/builtin/options/strike-window.ts +2 -1
- package/src/plugins/builtin/options/table.ts +6 -9
- package/src/plugins/builtin/options/types.ts +2 -0
- package/src/plugins/builtin/options/view.tsx +42 -12
- package/src/plugins/builtin/options-positioning/client.ts +30 -0
- package/src/plugins/builtin/options-positioning/headless.ts +74 -21
- package/src/plugins/builtin/options-positioning/index.tsx +4 -4
- package/src/plugins/builtin/options-positioning/model.ts +122 -14
- package/src/plugins/builtin/options-positioning/pane.tsx +87 -42
- package/src/plugins/builtin/options-scenario/client.ts +116 -47
- package/src/plugins/builtin/options-scenario/csp-screen-headless.ts +142 -10
- package/src/plugins/builtin/options-scenario/csp-screen-pane.tsx +206 -55
- package/src/plugins/builtin/options-scenario/csp-screen.ts +63 -23
- package/src/plugins/builtin/options-scenario/csp.ts +8 -2
- package/src/plugins/builtin/options-scenario/index.tsx +9 -7
- package/src/plugins/builtin/options-scenario/strategy-screen.ts +532 -0
- package/src/plugins/builtin/pe-band/model.ts +12 -49
- package/src/plugins/builtin/perps/cascade-tabs.tsx +161 -0
- package/src/plugins/builtin/perps/cascade.ts +236 -0
- package/src/plugins/builtin/perps/client.ts +56 -2
- package/src/plugins/builtin/perps/freshness.ts +12 -10
- package/src/plugins/builtin/perps/headless.ts +65 -9
- package/src/plugins/builtin/perps/index.tsx +7 -5
- package/src/plugins/builtin/perps/live-rows.ts +10 -3
- package/src/plugins/builtin/perps/model.ts +18 -4
- package/src/plugins/builtin/perps/pane.tsx +32 -31
- package/src/plugins/builtin/perps/status-line.ts +25 -0
- package/src/plugins/builtin/plugin-module.ts +5 -1
- package/src/plugins/builtin/portfolio-list/cached-account.ts +3 -1
- package/src/plugins/builtin/portfolio-list/cli/bulk-symbols.ts +2 -8
- package/src/plugins/builtin/portfolio-list/cli/portfolio-command.ts +4 -4
- package/src/plugins/builtin/portfolio-list/cli/render.ts +12 -7
- package/src/plugins/builtin/portfolio-list/headless.ts +1 -1
- package/src/plugins/builtin/portfolio-list/pane/futures-front.ts +40 -0
- package/src/plugins/builtin/portfolio-list/pane/index.tsx +4 -1
- package/src/plugins/builtin/portfolio-list/pane/streaming.ts +5 -2
- package/src/plugins/builtin/portfolio-list/pane/supplemental.ts +3 -2
- package/src/plugins/builtin/portfolio-list/quick-add/resolution.ts +3 -1
- package/src/plugins/builtin/portfolio-list/summary/index.tsx +11 -8
- package/src/plugins/builtin/portfolio-list/table.tsx +11 -3
- package/src/plugins/builtin/primary-dealers/client.ts +13 -38
- package/src/plugins/builtin/rate-path/pane.tsx +2 -2
- package/src/plugins/builtin/realized-vol/index.tsx +2 -2
- package/src/plugins/builtin/realized-vol/pane.tsx +3 -3
- package/src/plugins/builtin/relative-rotation/client.ts +18 -4
- package/src/plugins/builtin/relative-rotation/headless.ts +3 -3
- package/src/plugins/builtin/relative-rotation/index.tsx +2 -1
- package/src/plugins/builtin/relative-rotation/model.ts +16 -40
- package/src/plugins/builtin/relative-rotation/pane.tsx +3 -2
- package/src/plugins/builtin/research/corporate-actions-pane.tsx +3 -2
- package/src/plugins/builtin/research/event-model.ts +10 -8
- package/src/plugins/builtin/research/headless.ts +1 -1
- package/src/plugins/builtin/research/relative-valuation-headless.ts +5 -1
- package/src/plugins/builtin/research/relative-valuation-model.ts +31 -3
- package/src/plugins/builtin/research/relative-valuation-pane.tsx +11 -9
- package/src/plugins/builtin/reverse-dcf/headless.ts +5 -3
- package/src/plugins/builtin/reverse-dcf/model.ts +61 -6
- package/src/plugins/builtin/reverse-dcf/pane.tsx +7 -4
- package/src/plugins/builtin/scanner/feed.ts +2 -2
- package/src/plugins/builtin/scanner/flow-model.ts +50 -4
- package/src/plugins/builtin/scanner/flow-pane.tsx +367 -65
- package/src/plugins/builtin/scanner/flow-session.ts +146 -0
- package/src/plugins/builtin/scanner/headless.ts +204 -35
- package/src/plugins/builtin/scanner/index.ts +40 -6
- package/src/plugins/builtin/scanner/live-condition-editor.tsx +222 -0
- package/src/plugins/builtin/scanner/live-feed.ts +168 -0
- package/src/plugins/builtin/scanner/live-headless.ts +138 -0
- package/src/plugins/builtin/scanner/live-model.ts +362 -0
- package/src/plugins/builtin/scanner/live-pane.tsx +677 -0
- package/src/plugins/builtin/scanner/live-track.ts +186 -0
- package/src/plugins/builtin/scanner/lock-note.ts +3 -2
- package/src/plugins/builtin/seasonality/headless.ts +10 -1
- package/src/plugins/builtin/sec/fund-facts-view.tsx +5 -2
- package/src/plugins/builtin/sec/fund-facts.ts +116 -34
- package/src/plugins/builtin/sec/headless.ts +2 -1
- package/src/plugins/builtin/series-inventory.ts +3 -0
- package/src/plugins/builtin/shared/cloud-resource.ts +3 -2
- package/src/plugins/builtin/shared/cloud-upgrade.ts +4 -3
- package/src/plugins/builtin/shared/earnings-calendar.ts +6 -2
- package/src/plugins/builtin/shared/earnings-report.ts +2 -2
- package/src/plugins/builtin/shared/job-posting.ts +1 -0
- package/src/plugins/builtin/shared/macro-releases.ts +65 -0
- package/src/plugins/builtin/shared/members-menu.tsx +3 -2
- package/src/plugins/builtin/shared/pro-lock-note.ts +12 -12
- package/src/plugins/builtin/shared/report-freshness.ts +3 -2
- package/src/plugins/builtin/shared/scanner-capture.ts +3 -0
- package/src/plugins/builtin/shared/ticker-choice.tsx +2 -1
- package/src/plugins/builtin/shared/ticker-company.ts +77 -0
- package/src/plugins/builtin/shared/use-quote-board.ts +10 -3
- package/src/plugins/builtin/shared/volatility/live-session.ts +34 -8
- package/src/plugins/builtin/shared/volatility/pricing.ts +26 -1
- package/src/plugins/builtin/shared/wall-view-lifecycle.ts +3 -1
- package/src/plugins/builtin/themes/headless.ts +6 -4
- package/src/plugins/builtin/themes/model.ts +17 -8
- package/src/plugins/builtin/themes/pane.tsx +7 -7
- package/src/plugins/builtin/ticker-detail/data-panes/historical-prices.tsx +43 -18
- package/src/plugins/builtin/ticker-detail/data-panes/returns-history.ts +3 -2
- package/src/plugins/builtin/ticker-detail/data-panes/returns-model.ts +62 -0
- package/src/plugins/builtin/ticker-detail/data-panes/returns-pane.tsx +83 -46
- package/src/plugins/builtin/ticker-detail/headless.ts +31 -16
- package/src/plugins/builtin/ticker-detail/overview/model.ts +1 -1
- package/src/plugins/builtin/ticker-detail/pane.tsx +3 -2
- package/src/plugins/builtin/ticker-detail/quote-footer.ts +6 -1
- package/src/plugins/builtin/ticker-detail/quote-monitor/index.tsx +2 -1
- package/src/plugins/builtin/ticker-detail/settings.ts +1 -0
- package/src/plugins/builtin/time-sales/pane.tsx +31 -19
- package/src/plugins/builtin/treasury-daily/client.ts +41 -5
- package/src/plugins/builtin/treasury-daily/headless.ts +2 -2
- package/src/plugins/builtin/treasury-daily/index.tsx +1 -1
- package/src/plugins/builtin/treasury-daily/model.ts +50 -3
- package/src/plugins/builtin/treasury-daily/pane.tsx +81 -2
- package/src/plugins/builtin/vol-surface/charts.tsx +9 -4
- package/src/plugins/builtin/vol-surface/client.ts +9 -17
- package/src/plugins/builtin/vol-surface/headless.ts +63 -14
- package/src/plugins/builtin/vol-surface/index.tsx +2 -2
- package/src/plugins/builtin/vol-surface/model.ts +22 -7
- package/src/plugins/builtin/vol-surface/pane.tsx +48 -9
- package/src/plugins/builtin/vol-surface/tables.ts +31 -3
- package/src/plugins/builtin/volatility/dvol.ts +46 -0
- package/src/plugins/builtin/volatility/index.tsx +2 -2
- package/src/plugins/builtin/volatility/pane.tsx +4 -4
- package/src/plugins/builtin/volatility/series.ts +26 -0
- package/src/plugins/builtin/world-indices/footer.ts +1 -1
- package/src/plugins/builtin/world-venue-map/headless.ts +3 -3
- package/src/plugins/catalog-browser.ts +13 -8
- package/src/plugins/catalog-manifest.ts +2 -1
- package/src/plugins/marketplace/model.ts +18 -5
- package/src/portfolio/column-values.ts +5 -5
- package/src/portfolio/futures-positions.ts +6 -3
- package/src/portfolio/position-quantity.ts +15 -9
- package/src/public/__snapshots__/public-api.test.ts.snap +1 -0
- package/src/remote/resources.ts +2 -1
- package/src/renderers/browser/app-services.ts +1 -7
- package/src/renderers/browser/config-host.ts +2 -55
- package/src/renderers/browser/main.tsx +7 -57
- package/src/renderers/dom/data-table/row.tsx +26 -0
- package/src/renderers/dom/desktop/list-view.tsx +13 -10
- package/src/renderers/dom/desktop/query-bar.tsx +4 -2
- package/src/renderers/dom/desktop/select-field.tsx +4 -2
- package/src/renderers/dom/host/chart-surface.tsx +21 -0
- package/src/renderers/electrobun/bun/desktop/app-name.ts +222 -0
- package/src/renderers/electrobun/bun/desktop/backend.ts +29 -7
- package/src/renderers/electrobun/bun/desktop/host-requests.ts +7 -0
- package/src/renderers/electrobun/bun/desktop/initialization.ts +2 -0
- package/src/renderers/electrobun/bun/desktop/relaunch.ts +74 -25
- package/src/renderers/electrobun/bun/desktop/state-broadcaster.ts +1 -0
- package/src/renderers/electrobun/bun/desktop/update.ts +173 -5
- package/src/renderers/electrobun/bun/desktop/view-ids.ts +52 -0
- package/src/renderers/electrobun/bun/desktop/workspace/index.ts +2 -0
- package/src/renderers/electrobun/bun/index.ts +25 -1
- package/src/renderers/electrobun/shared/app-name.ts +30 -0
- package/src/renderers/electrobun/shared/protocol.ts +10 -0
- package/src/renderers/electrobun/view/backend-rpc.ts +6 -0
- package/src/renderers/electrobun/view/cli-pane-shot-frame.tsx +3 -3
- package/src/renderers/electrobun/view/desktop/window/snapshot.ts +1 -0
- package/src/renderers/electrobun/view/main.tsx +24 -1
- package/src/renderers/electrobun/view/news-source.ts +3 -1
- package/src/renderers/electrobun/view/remote/ticker-repository.ts +14 -7
- package/src/renderers/electrobun/view/view-ids.ts +85 -0
- package/src/renderers/opentui/start.tsx +5 -0
- package/src/renderers/opentui/toast-host.tsx +71 -43
- package/src/series/registry.ts +1 -0
- package/src/series/types.ts +6 -0
- package/src/series/validate.ts +1 -0
- package/src/sources/gloomberb-cloud/index.ts +1 -0
- package/src/sources/gloomberb-cloud/news.ts +47 -7
- package/src/sources/gloomberb-cloud/normalizers.ts +2 -0
- package/src/sources/provider-router/batches.ts +10 -2
- package/src/sources/provider-router/financial-routes.ts +3 -3
- package/src/sources/provider-router/financials.ts +15 -3
- package/src/sources/provider-router/history.ts +28 -7
- package/src/sources/provider-router/index.ts +149 -10
- package/src/sources/provider-router/search.ts +13 -2
- package/src/state/app/context/index.tsx +3 -0
- package/src/state/ticker-cleanup.ts +50 -0
- package/src/sync/auth-transition.ts +19 -9
- package/src/sync/baseline.ts +10 -4
- package/src/sync/controller.ts +70 -19
- package/src/sync/core-contributors.ts +90 -31
- package/src/sync/react.ts +4 -1
- package/src/sync/types.ts +3 -0
- package/src/telemetry/stall-reports-dom.ts +38 -0
- package/src/telemetry/stall-reports-node.ts +75 -0
- package/src/telemetry/stall-reports.ts +214 -0
- package/src/telemetry/usage-counts.ts +0 -18
- package/src/test-support/preload.ts +14 -0
- package/src/theme/colors.ts +8 -0
- package/src/theme/themes.ts +10 -0
- package/src/tickers/company-name.ts +103 -3
- package/src/tickers/listing-venues.ts +38 -3
- package/src/tickers/search/bare-symbol.ts +36 -0
- package/src/tickers/search/index.ts +36 -7
- package/src/tickers/search/ranking.ts +10 -1
- package/src/tickers/search/types.ts +5 -0
- package/src/tickers/terminal-codes.ts +19 -0
- package/src/time-series/alignment.ts +1 -1
- package/src/time-series/base-series.ts +13 -5
- package/src/time-series/daily-valuation.ts +62 -0
- package/src/time-series/economic.ts +18 -4
- package/src/time-series/field-catalog.ts +2 -4
- package/src/time-series/filed-trailing-eps.ts +197 -0
- package/src/time-series/forward-valuation.ts +32 -0
- package/src/time-series/fundamentals.ts +198 -7
- package/src/time-series/hooks.ts +1 -0
- package/src/time-series/ice-credit.ts +3 -0
- package/src/time-series/price-comparison.ts +30 -2
- package/src/time-series/price-units.ts +72 -2
- package/src/time-series/resolve-context.ts +7 -1
- package/src/time-series/resolve.ts +116 -15
- package/src/time-series/series-presentation.ts +40 -6
- package/src/time-series/session-bar.ts +11 -0
- package/src/time-series/spec.ts +5 -3
- package/src/time-series/studies.ts +278 -74
- package/src/time-series/total-return.ts +160 -0
- package/src/time-series/transforms.ts +3 -3
- package/src/time-series/types.ts +27 -1
- package/src/time-series/valuation-releases.ts +39 -0
- package/src/types/data-provider.ts +9 -1
- package/src/types/desktop-window.ts +2 -0
- package/src/types/financials.ts +73 -2
- package/src/types/headless.ts +61 -5
- package/src/types/instrument.ts +3 -0
- package/src/types/news-source.ts +1 -0
- package/src/types/plugin.ts +10 -1
- package/src/ui/host.tsx +3 -0
- package/src/updater/command-names.ts +12 -7
- package/src/updater/failure.ts +4 -1
- package/src/utils/cli-output.ts +42 -1
- package/src/utils/crypto-pair.ts +44 -0
- package/src/utils/financial-statements.ts +6 -1
- package/src/utils/forward-dividend.ts +2 -0
- package/src/utils/fundamentals.ts +24 -3
- package/src/utils/fx-market-hours.ts +26 -3
- package/src/utils/main-thread-stall.ts +35 -2
- package/src/utils/market-capitalization.ts +24 -1
- package/src/utils/network-failure.ts +9 -6
- package/src/utils/option-expiry.ts +48 -1
- package/src/utils/options.ts +10 -0
- package/src/utils/plugin-proxy-hosts.json +1 -0
- package/src/utils/price-history.ts +12 -1
- package/src/utils/shell-word.ts +8 -0
- package/src/utils/trailing-dividend.ts +53 -4
- package/src/plugins/builtin/clinical-trials/ticker-sponsor.ts +0 -17
- package/src/renderers/browser/first-screen.ts +0 -193
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import type { CorporateActionsData } from "../types/financials";
|
|
2
|
+
import { cashInMajorUnits } from "../utils/dividend-cash";
|
|
3
|
+
import { resolveCurrencyUnit } from "../utils/currency-units";
|
|
4
|
+
import { logFailure } from "../utils/log-failure";
|
|
5
|
+
import { dividendReferencePrice } from "../utils/trailing-dividend";
|
|
6
|
+
import { observationDate } from "./price-comparison";
|
|
7
|
+
import { CHART_RESOLUTION_STEP_MS, chartBarSizeStepMs } from "./resolution";
|
|
8
|
+
import type { ResolvedSeries, TimeSeriesPoint } from "./types";
|
|
9
|
+
|
|
10
|
+
/** One cash distribution per share: its ex-date (`YYYY-MM-DD`) and its amount in the listing's major currency unit. */
|
|
11
|
+
export interface CashDistribution {
|
|
12
|
+
exDate: string;
|
|
13
|
+
amount: number;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export interface TotalReturnOptions {
|
|
17
|
+
/** The session day a bar belongs to, `YYYY-MM-DD`. */
|
|
18
|
+
dayOf: (point: TimeSeriesPoint) => string;
|
|
19
|
+
/**
|
|
20
|
+
* A bar's price in the distributions' currency unit, or null when the two
|
|
21
|
+
* currencies differ (nothing is converted).
|
|
22
|
+
*/
|
|
23
|
+
cashPrice: (price: number) => number | null;
|
|
24
|
+
/**
|
|
25
|
+
* Bars longer than a session (weekly, monthly) are dated at their start, so a
|
|
26
|
+
* distribution belongs to the bar that holds its ex-date, not the first one
|
|
27
|
+
* dated on or after it. This is how many days a bar holds; the last bar holds
|
|
28
|
+
* that many from its own date, and a distribution after that precedes no bar.
|
|
29
|
+
*/
|
|
30
|
+
barDays?: number;
|
|
31
|
+
/** Today, `YYYY-MM-DD`: a distribution dated after it has not gone ex. */
|
|
32
|
+
asOf?: string;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export interface TotalReturnResult {
|
|
36
|
+
points: TimeSeriesPoint[];
|
|
37
|
+
/** Distributions reinvested inside the series; one before its first bar or after its last is not. */
|
|
38
|
+
applied: number;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/** The day a bar of `barDays` days dated `day` ends on; 30-day multiples are calendar months. */
|
|
42
|
+
function barEnd(day: string, barDays: number): string {
|
|
43
|
+
const end = new Date(`${day}T00:00:00Z`);
|
|
44
|
+
if (barDays >= 28 && barDays % 30 === 0) end.setUTCMonth(end.getUTCMonth() + barDays / 30);
|
|
45
|
+
else end.setUTCDate(end.getUTCDate() + barDays);
|
|
46
|
+
return end.toISOString().slice(0, 10);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function scaled(value: number | null | undefined, factor: number): number | null | undefined {
|
|
50
|
+
return typeof value === "number" && Number.isFinite(value) ? value * factor : value;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* A price series as its total return: every cash distribution is reinvested at
|
|
55
|
+
* the close of its ex-date bar, so the series moves by (close + cash) over the
|
|
56
|
+
* bar before. Each price is multiplied by the shares the cash has bought
|
|
57
|
+
* since the series began, which leaves its first bar as it was; volume is
|
|
58
|
+
* left alone. A distribution dated at or before the first bar precedes the
|
|
59
|
+
* series, so nothing is reinvested for it.
|
|
60
|
+
*/
|
|
61
|
+
export function reinvestDistributions(
|
|
62
|
+
points: readonly TimeSeriesPoint[],
|
|
63
|
+
distributions: readonly CashDistribution[],
|
|
64
|
+
{ dayOf, cashPrice, barDays, asOf }: TotalReturnOptions,
|
|
65
|
+
): TotalReturnResult {
|
|
66
|
+
const ordered = [...points].sort((left, right) => left.date.getTime() - right.date.getTime());
|
|
67
|
+
const holdingBar = barDays !== undefined && barDays > 1;
|
|
68
|
+
const cash = distributions
|
|
69
|
+
.filter((entry) => /^\d{4}-\d{2}-\d{2}$/.test(entry.exDate) && Number.isFinite(entry.amount) && entry.amount > 0
|
|
70
|
+
&& (asOf === undefined || entry.exDate <= asOf))
|
|
71
|
+
.sort((left, right) => left.exDate.localeCompare(right.exDate));
|
|
72
|
+
const days = ordered.map(dayOf);
|
|
73
|
+
let factor = 1;
|
|
74
|
+
let applied = 0;
|
|
75
|
+
let next = 0;
|
|
76
|
+
const adjusted = ordered.map((point, index) => {
|
|
77
|
+
const barDay = days[index]!;
|
|
78
|
+
const before = holdingBar ? days[index + 1] ?? barEnd(barDay, barDays!) : null;
|
|
79
|
+
while (next < cash.length) {
|
|
80
|
+
const entry = cash[next]!;
|
|
81
|
+
if (before !== null ? entry.exDate >= before : entry.exDate > barDay) break;
|
|
82
|
+
if (index === 0) { next += 1; continue; }
|
|
83
|
+
const close = point.close ?? point.value;
|
|
84
|
+
// A bar with no price leaves the cash for the next bar that has one.
|
|
85
|
+
if (typeof close !== "number" || !Number.isFinite(close) || close <= 0) break;
|
|
86
|
+
// Cash in another currency than the price buys nothing: the series stays a price series.
|
|
87
|
+
const price = cashPrice(close);
|
|
88
|
+
if (price !== null && price > 0) {
|
|
89
|
+
factor *= 1 + entry.amount / price;
|
|
90
|
+
applied += 1;
|
|
91
|
+
}
|
|
92
|
+
next += 1;
|
|
93
|
+
}
|
|
94
|
+
if (factor === 1) return point;
|
|
95
|
+
return {
|
|
96
|
+
...point,
|
|
97
|
+
value: scaled(point.value, factor) ?? null,
|
|
98
|
+
...point.rawValue !== undefined ? { rawValue: scaled(point.rawValue, factor) ?? null } : {},
|
|
99
|
+
...point.open !== undefined ? { open: scaled(point.open, factor) } : {},
|
|
100
|
+
...point.high !== undefined ? { high: scaled(point.high, factor) } : {},
|
|
101
|
+
...point.low !== undefined ? { low: scaled(point.low, factor) } : {},
|
|
102
|
+
...point.close !== undefined ? { close: scaled(point.close, factor) } : {},
|
|
103
|
+
};
|
|
104
|
+
});
|
|
105
|
+
return { points: adjusted, applied };
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
export interface TotalReturnOutcome {
|
|
109
|
+
series: ResolvedSeries;
|
|
110
|
+
/** Why the series stays a price series, when it does. */
|
|
111
|
+
notice?: string;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
const DAY_MS = 86_400_000;
|
|
115
|
+
|
|
116
|
+
/** How many days a bar holds when it is longer than a session (a month counts as 30), so a distribution belongs to the bar holding its ex-date. */
|
|
117
|
+
function barDaysLongerThanSession(series: Pick<ResolvedSeries, "barSize" | "historyResolution">): number | undefined {
|
|
118
|
+
const step = series.barSize ? chartBarSizeStepMs(series.barSize)
|
|
119
|
+
: series.historyResolution ? CHART_RESOLUTION_STEP_MS[series.historyResolution] : null;
|
|
120
|
+
return step !== null && step > DAY_MS ? Math.round(step / DAY_MS) : undefined;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* A price series as its total return, from the cash history its listing pays.
|
|
125
|
+
* The series says which basis it ended up on: `total` once its distributions
|
|
126
|
+
* are reinvested (a listing that pays none is its price), `price` with the
|
|
127
|
+
* reason when the history cannot be read, covers no distributions, or is in
|
|
128
|
+
* another currency than the prices. Nothing is converted.
|
|
129
|
+
*/
|
|
130
|
+
export async function totalReturnSeries(
|
|
131
|
+
series: ResolvedSeries,
|
|
132
|
+
loadActions: () => Promise<CorporateActionsData | null>,
|
|
133
|
+
priceCurrency: string | undefined,
|
|
134
|
+
asOf: Date,
|
|
135
|
+
): Promise<TotalReturnOutcome> {
|
|
136
|
+
const priceOnly = (notice: string): TotalReturnOutcome => ({ series: { ...series, returnBasis: "price" }, notice });
|
|
137
|
+
const actions = await loadActions().catch(logFailure("total-return", "Loading distribution history failed", null));
|
|
138
|
+
if (!actions) return priceOnly("distribution history unavailable; showing the price return.");
|
|
139
|
+
const cash = cashInMajorUnits(actions);
|
|
140
|
+
const dividends = Array.isArray(cash.dividends) ? cash.dividends : [];
|
|
141
|
+
if (cash.coverage?.dividends === "unavailable" || (cash.coverage?.dividends !== "available" && dividends.length === 0)) {
|
|
142
|
+
return priceOnly("distribution history unavailable; showing the price return.");
|
|
143
|
+
}
|
|
144
|
+
const currency = resolveCurrencyUnit(cash.currency).currency;
|
|
145
|
+
if (dividends.length > 0 && !currency) return priceOnly("distribution currency unknown; showing the price return.");
|
|
146
|
+
if (dividends.length > 0 && !resolveCurrencyUnit(priceCurrency).currency) {
|
|
147
|
+
return priceOnly("price currency unknown; showing the price return.");
|
|
148
|
+
}
|
|
149
|
+
if (dividends.length > 0 && dividendReferencePrice(1, priceCurrency, currency) === null) {
|
|
150
|
+
return priceOnly(`distributions are in ${currency}, not the price currency; showing the price return.`);
|
|
151
|
+
}
|
|
152
|
+
const { points } = reinvestDistributions(series.points, dividends, {
|
|
153
|
+
dayOf: (point) => observationDate(point.date.getTime(), series),
|
|
154
|
+
cashPrice: (price) => dividendReferencePrice(price, priceCurrency, currency),
|
|
155
|
+
barDays: barDaysLongerThanSession(series),
|
|
156
|
+
asOf: asOf.toISOString().slice(0, 10),
|
|
157
|
+
});
|
|
158
|
+
// "ECC Close" is its price: a label the chart wrote from the field says what the series is now.
|
|
159
|
+
return { series: { ...series, points, returnBasis: "total", label: series.label.replace(/ (?:Close|Price|Open|High|Low)$/, " Total return") } };
|
|
160
|
+
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { ResolvedSeries, SeriesTransform, TimeSeriesPoint } from "./types";
|
|
2
2
|
import { calendarMonthsBefore } from "../utils/calendar-date";
|
|
3
3
|
import { isFiniteNumber } from "../utils/guards";
|
|
4
|
+
import { isOhlcSeriesStyle } from "./spec";
|
|
4
5
|
|
|
5
6
|
const DAY_MS = 24 * 60 * 60 * 1_000;
|
|
6
7
|
// Volume is separate supporting data, not another price. A volume series has
|
|
@@ -160,14 +161,13 @@ export function applyResolvedSeriesTransform(
|
|
|
160
161
|
...series,
|
|
161
162
|
// A rebased or log value no longer counts what the price did.
|
|
162
163
|
...(series.statedUnit ? { statedUnit: undefined } : {}),
|
|
164
|
+
...(series.valueDecimals !== undefined ? { valueDecimals: undefined } : {}),
|
|
163
165
|
transform,
|
|
164
166
|
rawUnit: series.rawUnit ?? series.unit,
|
|
165
167
|
unit: percent ? "%" : transform === "index100" ? "index" : "log",
|
|
166
168
|
unitGroup: percent ? "percent" : transform === "index100" ? "index" : "log",
|
|
167
169
|
dataShape: "scalar",
|
|
168
|
-
style: series.style
|
|
169
|
-
? "line"
|
|
170
|
-
: series.style,
|
|
170
|
+
style: isOhlcSeriesStyle(series.style) ? "line" : series.style,
|
|
171
171
|
points: applySeriesTransform(series.points, transform, options),
|
|
172
172
|
};
|
|
173
173
|
}
|
package/src/time-series/types.ts
CHANGED
|
@@ -10,7 +10,7 @@ export type SeriesPeriod = "auto" | "daily" | "weekly" | "monthly" | "quarterly"
|
|
|
10
10
|
* "band" draws a line through each point's value inside a shaded range from
|
|
11
11
|
* its `low` to its `high`: an average within its historical range.
|
|
12
12
|
*/
|
|
13
|
-
export type SeriesStyle = "line" | "area" | "step" | "columns" | "points" | "candles" | "ohlc" | "hlc" | "band";
|
|
13
|
+
export type SeriesStyle = "line" | "area" | "step" | "columns" | "points" | "candles" | "hollow" | "heikin-ashi" | "ohlc" | "hlc" | "band";
|
|
14
14
|
export type SeriesTransform = "raw" | "percent" | "index100" | "yoy" | "qoq" | "log";
|
|
15
15
|
export type SeriesAxis = "auto" | "left" | "right";
|
|
16
16
|
export type SeriesInterpolation = "none" | "step-after";
|
|
@@ -110,6 +110,11 @@ export interface ChartViewportSpec {
|
|
|
110
110
|
maxPoints?: number;
|
|
111
111
|
/** Intraday market history includes pre-market and after-hours bars where the venue has them. */
|
|
112
112
|
extendedHours?: boolean;
|
|
113
|
+
/**
|
|
114
|
+
* Security price series are drawn as total returns: each cash distribution
|
|
115
|
+
* is reinvested at the close of its ex-date bar. Price returns otherwise.
|
|
116
|
+
*/
|
|
117
|
+
totalReturn?: boolean;
|
|
113
118
|
}
|
|
114
119
|
|
|
115
120
|
export interface ChartSpec {
|
|
@@ -141,6 +146,8 @@ export interface TimeSeriesPoint {
|
|
|
141
146
|
low?: number | null;
|
|
142
147
|
close?: number | null;
|
|
143
148
|
volume?: number | null;
|
|
149
|
+
/** The bar this figure traded in closed below its open: volume draws it in the falling colour. */
|
|
150
|
+
fell?: boolean;
|
|
144
151
|
periodLabel?: string;
|
|
145
152
|
/**
|
|
146
153
|
* A financial statement period as the FA columns name it: `FY2025`, `Q3 FY26`,
|
|
@@ -183,6 +190,12 @@ export interface ResolvedSeries {
|
|
|
183
190
|
unit: string;
|
|
184
191
|
/** Unit of rawValue, retained when presentation transforms change unit. */
|
|
185
192
|
rawUnit?: string;
|
|
193
|
+
/**
|
|
194
|
+
* What a price series' returns are, set when the chart asked for total
|
|
195
|
+
* returns: `total` once its distributions are reinvested, `price` when the
|
|
196
|
+
* source gave none to reinvest (`warning` says why).
|
|
197
|
+
*/
|
|
198
|
+
returnBasis?: "total" | "price";
|
|
186
199
|
unitGroup: string;
|
|
187
200
|
/**
|
|
188
201
|
* The unit the legend states beside each value, read bare as FUT prints its
|
|
@@ -192,6 +205,11 @@ export interface ResolvedSeries {
|
|
|
192
205
|
statedUnit?: string;
|
|
193
206
|
/** Source instrument category used only for monetary market-price precision. */
|
|
194
207
|
priceAssetCategory?: string;
|
|
208
|
+
/**
|
|
209
|
+
* The decimals a value worked out from prices (a formula, a spread, a price
|
|
210
|
+
* over an FX rate) prints at: the most its legs print, from two to four.
|
|
211
|
+
*/
|
|
212
|
+
valueDecimals?: number;
|
|
195
213
|
/** Volume basis established by the source instrument; omitted when unspecified. */
|
|
196
214
|
volumeUnit?: "shares" | "contracts";
|
|
197
215
|
nativeFrequency: SeriesPeriod;
|
|
@@ -306,6 +324,14 @@ export interface ChartResolutionResult {
|
|
|
306
324
|
loading: boolean;
|
|
307
325
|
errors: string[];
|
|
308
326
|
warnings: string[];
|
|
327
|
+
/**
|
|
328
|
+
* Where a series' source starts after the range asked for, and why (a
|
|
329
|
+
* publisher's cap on history), as `warnings` also carries it, so a report
|
|
330
|
+
* says it where it would otherwise print a range that quietly starts later.
|
|
331
|
+
*/
|
|
332
|
+
coverageNotices?: string[];
|
|
333
|
+
/** What the price levels of a total-return chart without a comparison are (`warnings` also carries it). */
|
|
334
|
+
returnBasisNotice?: string;
|
|
309
335
|
/**
|
|
310
336
|
* Each charted listing that no longer trades: its symbol and label
|
|
311
337
|
* ("Delisted Oct 27, 2022"), which `warnings` carries as "TWTR: Delisted Oct 27, 2022".
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { EarningsAction, FinancialStatement } from "../types/financials";
|
|
2
|
+
import { regularSessionCloseOn } from "../market-data/market/freshness";
|
|
3
|
+
import { financialAvailabilityTime } from "../utils/financial-statements";
|
|
4
|
+
|
|
5
|
+
/** A reported event for this fiscal quarter, never a projected calendar date. */
|
|
6
|
+
function releaseFor(statement: FinancialStatement, releases: readonly EarningsAction[]) {
|
|
7
|
+
return releases.filter((release) => release.dateType !== "fiscal-period-end"
|
|
8
|
+
&& release.dateStatus === "reported"
|
|
9
|
+
&& release.fiscalPeriod === statement.date.slice(0, 7)
|
|
10
|
+
&& Date.parse(release.date) >= Date.parse(statement.date))
|
|
11
|
+
.sort((a, b) => a.date.localeCompare(b.date))[0];
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/** Preserve dated inputs; an earnings release can precede the filing of the same period. */
|
|
15
|
+
export function statementAtRelease(statement: FinancialStatement, releases: readonly EarningsAction[], exchange?: string): FinancialStatement {
|
|
16
|
+
const release = releaseFor(statement, releases);
|
|
17
|
+
if (!release) return statement;
|
|
18
|
+
const timestamp = release.reportedAt && Number.isFinite(Date.parse(release.reportedAt)) ? release.reportedAt : undefined;
|
|
19
|
+
const beforeClose = /^(bmo|dmh|pre[ -]?market|before (?:open|market)|during (?:market|hours))$/i.test(release.time ?? "");
|
|
20
|
+
const close = beforeClose ? regularSessionCloseOn(exchange, release.date) : null;
|
|
21
|
+
// A known session establishes availability by its close. Unknown timing,
|
|
22
|
+
// like an after-close release, takes effect on the following daily bar.
|
|
23
|
+
const publication = timestamp ?? (close != null ? new Date(close).toISOString() : release.date);
|
|
24
|
+
const earlier = (filed: string | undefined) => {
|
|
25
|
+
if (!filed) return undefined;
|
|
26
|
+
// A later comparative/restatement is not evidence that this value was in
|
|
27
|
+
// the original release. Restrict the substitution to this period's filing.
|
|
28
|
+
const lag = Date.parse(filed) - Date.parse(statement.date);
|
|
29
|
+
return lag >= 0 && lag <= 120 * 86_400_000 && financialAvailabilityTime(publication) <= financialAvailabilityTime(filed)
|
|
30
|
+
? publication : filed;
|
|
31
|
+
};
|
|
32
|
+
return { ...statement,
|
|
33
|
+
availableAt: earlier(statement.availableAt),
|
|
34
|
+
...(statement.fieldSources ? { fieldSources: Object.fromEntries(Object.entries(statement.fieldSources)
|
|
35
|
+
.map(([field, source]) => [field, source && { ...source, filed: earlier(source.filed) }])) } : {}),
|
|
36
|
+
...(statement.fieldAvailability ? { fieldAvailability: Object.fromEntries(Object.entries(statement.fieldAvailability)
|
|
37
|
+
.map(([field, filed]) => [field, earlier(filed)!])) } : {}),
|
|
38
|
+
};
|
|
39
|
+
}
|
|
@@ -148,6 +148,12 @@ export interface MarketDataRequestContext {
|
|
|
148
148
|
historySession?: "extended";
|
|
149
149
|
/** The listing's company, from its own quote: an SEC lookup for a non-US listing checks the registrant against it. */
|
|
150
150
|
listingName?: string;
|
|
151
|
+
/**
|
|
152
|
+
* The caller prints what the quote's move is from: a short-lived process
|
|
153
|
+
* (the CLI) waits briefly for the daily closes that date a previous close
|
|
154
|
+
* no venue calendar dates. The long-lived app dates every quote anyway.
|
|
155
|
+
*/
|
|
156
|
+
datesChangeBasis?: boolean;
|
|
151
157
|
}
|
|
152
158
|
|
|
153
159
|
export interface CachedFinancialsTarget {
|
|
@@ -216,6 +222,8 @@ export interface QuoteBatchOptions {
|
|
|
216
222
|
revalidate?: boolean;
|
|
217
223
|
/** The caller stopped waiting; a transport that can abandon the request does. */
|
|
218
224
|
signal?: AbortSignal;
|
|
225
|
+
/** The caller prints what each move is from (MarketDataRequestContext.datesChangeBasis). */
|
|
226
|
+
datesChangeBasis?: boolean;
|
|
219
227
|
}
|
|
220
228
|
|
|
221
229
|
export interface TickerFinancialsBatchResult {
|
|
@@ -244,7 +252,7 @@ export interface AssetDataProvider {
|
|
|
244
252
|
primaryMarketSourceName?(): string | null | Promise<string | null>;
|
|
245
253
|
getCachedFinancialsForTargets?(targets: CachedFinancialsTarget[], options?: { allowExpired?: boolean; includeStaleQuotes?: boolean }): Map<string, TickerFinancials> | Promise<Map<string, TickerFinancials>>;
|
|
246
254
|
getQuotesBatch?(targets: QuoteSubscriptionTarget[], options?: QuoteBatchOptions): Promise<QuoteBatchResult[]>;
|
|
247
|
-
getTickerFinancialsBatch?(targets: CachedFinancialsTarget[], options?: { forceRefresh?: boolean }): Promise<TickerFinancialsBatchResult[]>;
|
|
255
|
+
getTickerFinancialsBatch?(targets: CachedFinancialsTarget[], options?: { forceRefresh?: boolean; datesChangeBasis?: boolean }): Promise<TickerFinancialsBatchResult[]>;
|
|
248
256
|
getTickerFinancials(ticker: string, exchange?: string, context?: MarketDataRequestContext): Promise<TickerFinancials>;
|
|
249
257
|
getQuote(ticker: string, exchange?: string, context?: MarketDataRequestContext): Promise<Quote>;
|
|
250
258
|
/** Listing facts may outlive the quote price; this method never returns price/session values. */
|
|
@@ -8,6 +8,8 @@ export interface DesktopSharedStateSnapshot {
|
|
|
8
8
|
/** @deprecated Ignored and no longer sent. */
|
|
9
9
|
activePanel?: "left" | "right";
|
|
10
10
|
statusBarVisible: boolean;
|
|
11
|
+
/** Transient position-sync failures, shared with detached Brokers panes. */
|
|
12
|
+
brokerSyncErrors?: Record<string, string>;
|
|
11
13
|
mainStateRevision?: number;
|
|
12
14
|
layoutChanged?: boolean;
|
|
13
15
|
}
|
package/src/types/financials.ts
CHANGED
|
@@ -120,6 +120,12 @@ export interface Quote extends DepositaryReceiptFacts {
|
|
|
120
120
|
*/
|
|
121
121
|
changeBasis?: "24h" | "none";
|
|
122
122
|
previousClose?: number;
|
|
123
|
+
/**
|
|
124
|
+
* Exchange-local date of previousClose. The app's quote router reads it
|
|
125
|
+
* from the listing's own daily closes where the venue's calendar cannot
|
|
126
|
+
* date the close (PreviousCloseDates); a source may set it too.
|
|
127
|
+
*/
|
|
128
|
+
previousCloseDate?: string;
|
|
123
129
|
/** Official close of a completed regular session, in this quote's currency. */
|
|
124
130
|
regularClose?: number;
|
|
125
131
|
/** Exchange-local date of regularClose; separate from the daily previous-close reference. */
|
|
@@ -324,7 +330,12 @@ export interface Fundamentals extends DepositaryReceiptFacts {
|
|
|
324
330
|
/** Set where Gloom Cloud checked `enterpriseValue` against market cap + total debt - cash; pairs with that value only. */
|
|
325
331
|
enterpriseValueCheck?: EnterpriseValueCheck;
|
|
326
332
|
/** Explicit provider retractions; omitted fields alone remain eligible for fallback. */
|
|
327
|
-
unavailableFields?: Array<"enterpriseValue" | "enterpriseToRevenue">;
|
|
333
|
+
unavailableFields?: Array<"enterpriseValue" | "enterpriseToRevenue" | "marketCap">;
|
|
334
|
+
/**
|
|
335
|
+
* Why `marketCap` is retracted, with "marketCap" in `unavailableFields`: a depositary receipt its source priced as
|
|
336
|
+
* an ordinary share (the receipt's price times the company's ordinary shares), with no ratio to convert them.
|
|
337
|
+
*/
|
|
338
|
+
marketCapUnavailable?: "receipt-priced-as-ordinary";
|
|
328
339
|
operatingCashFlow?: number;
|
|
329
340
|
freeCashFlow?: number;
|
|
330
341
|
dividendYield?: number;
|
|
@@ -339,6 +350,18 @@ export interface Fundamentals extends DepositaryReceiptFacts {
|
|
|
339
350
|
revenue?: number;
|
|
340
351
|
netIncome?: number;
|
|
341
352
|
eps?: number;
|
|
353
|
+
/**
|
|
354
|
+
* Where `eps` and `trailingPE` come from: `filed-quarters` when `eps` is the
|
|
355
|
+
* diluted EPS of the last four filed quarters (or the fiscal year they end
|
|
356
|
+
* with), as PEB and GE read the statements, its last period ending
|
|
357
|
+
* `trailingEpsPeriodEnd`, and `trailingPE` the price over it; `served` when
|
|
358
|
+
* those quarters give none (or one that cannot be priced: see
|
|
359
|
+
* time-series/filed-trailing-eps) and both are Gloom Cloud's trailing
|
|
360
|
+
* figures, including a P/E it serves with no EPS (a fund's). Absent when
|
|
361
|
+
* there is neither an EPS nor a P/E.
|
|
362
|
+
*/
|
|
363
|
+
trailingEpsSource?: "filed-quarters" | "served";
|
|
364
|
+
trailingEpsPeriodEnd?: string;
|
|
342
365
|
operatingMargin?: number;
|
|
343
366
|
profitMargin?: number;
|
|
344
367
|
revenueGrowth?: number;
|
|
@@ -516,6 +539,8 @@ export type EarningsDateStatus = "reported" | "confirmed" | "projected";
|
|
|
516
539
|
|
|
517
540
|
export interface EarningsAction {
|
|
518
541
|
date: string;
|
|
542
|
+
/** Known release/acceptance timestamp, when the calendar has one. */
|
|
543
|
+
reportedAt?: string;
|
|
519
544
|
dateType?: "announcement" | "fiscal-period-end";
|
|
520
545
|
currency?: string;
|
|
521
546
|
time?: string;
|
|
@@ -548,10 +573,24 @@ export interface CorporateActionsData {
|
|
|
548
573
|
dividends: DividendAction[];
|
|
549
574
|
/** Declared and unpaid, for the listings Gloom Cloud has them for; absent elsewhere and from older servers. */
|
|
550
575
|
declaredDividends?: DeclaredDividendAction[];
|
|
576
|
+
/**
|
|
577
|
+
* What each paid row was declared as when the company declares in another
|
|
578
|
+
* currency than the listing pays (BP's dollars beside its London pence), per
|
|
579
|
+
* ordinary share, keyed by the paid row's ex-date. Absent elsewhere and from older servers.
|
|
580
|
+
*/
|
|
581
|
+
declaredCash?: DeclaredCash;
|
|
582
|
+
/** Set when `dividends` is the last good history standing in for a refresh that could not read it: when that history was read. */
|
|
583
|
+
dividendsAsOf?: string;
|
|
551
584
|
splits: SplitAction[];
|
|
552
585
|
earnings: EarningsAction[];
|
|
553
586
|
}
|
|
554
587
|
|
|
588
|
+
/** Paid rows as their company declared them, in `currency` (its major unit). */
|
|
589
|
+
export interface DeclaredCash {
|
|
590
|
+
currency: string;
|
|
591
|
+
rows: DividendAction[];
|
|
592
|
+
}
|
|
593
|
+
|
|
555
594
|
export interface CompanyProfile {
|
|
556
595
|
description?: string;
|
|
557
596
|
/**
|
|
@@ -971,6 +1010,8 @@ export interface EpsEstimateHistory {
|
|
|
971
1010
|
}
|
|
972
1011
|
|
|
973
1012
|
export interface TickerFinancials {
|
|
1013
|
+
/** Reported earnings-release events retained with daily valuation snapshots. */
|
|
1014
|
+
earningsReleases?: EarningsAction[];
|
|
974
1015
|
statementHistory?: StatementHistoryAttempt;
|
|
975
1016
|
/** @deprecated No longer populated. */
|
|
976
1017
|
operatingHistoryRetryAt?: number;
|
|
@@ -1014,6 +1055,29 @@ export interface OptionContract {
|
|
|
1014
1055
|
lastTradeDate: number;
|
|
1015
1056
|
/** Millisecond timestamp for the latest streamed quote applied to this snapshot. */
|
|
1016
1057
|
lastUpdated?: number;
|
|
1058
|
+
/**
|
|
1059
|
+
* A venue's own mark, for a venue that marks every contract (Deribit): the
|
|
1060
|
+
* premium in `currency`, its implied volatility (a decimal) and Black-76
|
|
1061
|
+
* greeks at the expiry's forward (delta per 1.00, gamma per 1.00, vega per
|
|
1062
|
+
* volatility point, theta per calendar day). These replace the solved ones.
|
|
1063
|
+
*/
|
|
1064
|
+
mark?: OptionMark;
|
|
1065
|
+
/**
|
|
1066
|
+
* The premiums in the coin a venue quotes them in (Deribit's BTC and ETH
|
|
1067
|
+
* options); null where there is none. The contract's own prices are these
|
|
1068
|
+
* at the expiry's forward.
|
|
1069
|
+
*/
|
|
1070
|
+
coin?: { currency: string; bid: number | null; ask: number | null; mark: number; last: number | null };
|
|
1071
|
+
}
|
|
1072
|
+
|
|
1073
|
+
export interface OptionMark {
|
|
1074
|
+
price: number;
|
|
1075
|
+
iv: number;
|
|
1076
|
+
delta: number;
|
|
1077
|
+
gamma: number;
|
|
1078
|
+
vega: number;
|
|
1079
|
+
theta: number;
|
|
1080
|
+
forward: number;
|
|
1017
1081
|
}
|
|
1018
1082
|
|
|
1019
1083
|
export interface OptionsChain {
|
|
@@ -1023,11 +1087,18 @@ export interface OptionsChain {
|
|
|
1023
1087
|
puts: OptionContract[];
|
|
1024
1088
|
providerId?: string;
|
|
1025
1089
|
dataSource?: "live" | "delayed";
|
|
1026
|
-
feed?: "opra" | "gloom";
|
|
1090
|
+
feed?: "opra" | "gloom" | "deribit";
|
|
1027
1091
|
delayMinutes?: number;
|
|
1028
1092
|
realtimeEligible?: boolean;
|
|
1029
1093
|
/** ISO timestamp for the upstream options snapshot. */
|
|
1030
1094
|
asOf?: string;
|
|
1095
|
+
/**
|
|
1096
|
+
* The rate the venue prices its premiums at (Deribit marks at zero); the
|
|
1097
|
+
* model rate when absent, as for US listed options.
|
|
1098
|
+
*/
|
|
1099
|
+
rate?: number;
|
|
1100
|
+
/** The venue a chain is listed on when it is not a US options exchange (Deribit). */
|
|
1101
|
+
venue?: string;
|
|
1031
1102
|
/**
|
|
1032
1103
|
* The session the chain's open interest counts, YYYY-MM-DD, as Gloom Cloud
|
|
1033
1104
|
* states it; null when none of its counts is dated. Absent from a source
|
package/src/types/headless.ts
CHANGED
|
@@ -34,6 +34,12 @@ export interface HeadlessPaneArgumentDef {
|
|
|
34
34
|
examples?: readonly string[];
|
|
35
35
|
}
|
|
36
36
|
|
|
37
|
+
/** A list the catalog prints under a function's options, such as the sector names a screen's criteria match. */
|
|
38
|
+
export interface HeadlessPaneReference {
|
|
39
|
+
title: string;
|
|
40
|
+
items: readonly string[];
|
|
41
|
+
}
|
|
42
|
+
|
|
37
43
|
export interface HeadlessPaneOptionValue {
|
|
38
44
|
value: string;
|
|
39
45
|
aliases?: string[];
|
|
@@ -83,6 +89,8 @@ export interface HeadlessPaneOptionDef {
|
|
|
83
89
|
* absent.
|
|
84
90
|
*/
|
|
85
91
|
valueWords?: number;
|
|
92
|
+
/** The value is a comma list (`--metric trailingPE,dividendYieldPercent`), and the flag typed again adds to it. */
|
|
93
|
+
list?: boolean;
|
|
86
94
|
/** The option in use as typed after the function, such as `--expiration 2028-01-21`; the catalog shows it as an example. */
|
|
87
95
|
example?: string;
|
|
88
96
|
/** The example runs without the function's optional argument, as an option that works only then does (`fn INS --side sell`). */
|
|
@@ -138,8 +146,10 @@ export interface HeadlessPaneContext {
|
|
|
138
146
|
* known. A code several companies list (BDI) throws asking which, with
|
|
139
147
|
* `quote`'s message; `argumentWith(key)` is the function's argument naming
|
|
140
148
|
* that listing instead (`BDI:TSX`), for the retry each listing offers.
|
|
149
|
+
* `coinNote` is what `quote` says of a bare coin ticker read as a listing
|
|
150
|
+
* that is not the coin (ETH, the Grayscale fund), for the report's warnings.
|
|
141
151
|
*/
|
|
142
|
-
resolveListing?: (symbol: string, argumentWith: (key: string) => string) => Promise<{ symbol: string; exchange?: string; name?: string } | null>;
|
|
152
|
+
resolveListing?: (symbol: string, argumentWith: (key: string) => string) => Promise<{ symbol: string; exchange?: string; name?: string; coinNote?: string } | null>;
|
|
143
153
|
/**
|
|
144
154
|
* What a plugin keeps on this device only (its `ctx.resume` state, never
|
|
145
155
|
* synced), such as ALRT's log of the alerts the app fired; null when none.
|
|
@@ -216,6 +226,14 @@ export interface HeadlessPaneEntry {
|
|
|
216
226
|
* rather than read back the number `formatted` draws.
|
|
217
227
|
*/
|
|
218
228
|
unit?: string;
|
|
229
|
+
/**
|
|
230
|
+
* In a report with `exportDated`, where this line is not of the section's own period and release (a previous
|
|
231
|
+
* reading, a year ago): the period it covers, when it was released and what it is as of. A null `released`
|
|
232
|
+
* or `asOf` leaves the cell blank rather than borrow the section's.
|
|
233
|
+
*/
|
|
234
|
+
period?: string | null;
|
|
235
|
+
released?: string | null;
|
|
236
|
+
asOf?: string | null;
|
|
219
237
|
}
|
|
220
238
|
|
|
221
239
|
/**
|
|
@@ -353,7 +371,8 @@ export interface HeadlessPaneFreshness {
|
|
|
353
371
|
* Each source's own newest observation, for data drawn from several venues
|
|
354
372
|
* polled apart (a perpetuals board). The line then dates every source and
|
|
355
373
|
* says how old the oldest of them is (`Binance 02:15 · Bybit 02:24 UTC ·
|
|
356
|
-
* oldest 9 min`),
|
|
374
|
+
* oldest 9 min`), or with `ageOnly` the oldest observation, and `asOf` is the
|
|
375
|
+
* newest of them unless declared.
|
|
357
376
|
*/
|
|
358
377
|
sources?: Array<{ source: string; asOf: string | number | Date }>;
|
|
359
378
|
/** Say how old the oldest observation is (`oldest 4 min`): rows polled apart from one source. */
|
|
@@ -363,7 +382,8 @@ export interface HeadlessPaneFreshness {
|
|
|
363
382
|
* For rows priced apart from a snapshot refreshed on a schedule (CRYP's board), where `live` would call prices
|
|
364
383
|
* that are minutes old real-time and `delayed` would call a snapshot renewed every few seconds held back. A row
|
|
365
384
|
* that states its own feed (`dataSource`, `delayMinutes`) still says it, and so does a declared `status`.
|
|
366
|
-
* Says how old the oldest observation is, as `oldestAge` does
|
|
385
|
+
* Says how old the oldest observation is, as `oldestAge` does, even beside `sources`: a venue that streams some
|
|
386
|
+
* rows and not others is as old as its oldest row, not its newest.
|
|
367
387
|
*/
|
|
368
388
|
ageOnly?: boolean;
|
|
369
389
|
/**
|
|
@@ -527,6 +547,8 @@ export type HeadlessBundleSection =
|
|
|
527
547
|
locked?: boolean;
|
|
528
548
|
entries?: never;
|
|
529
549
|
textEntries?: never;
|
|
550
|
+
period?: never;
|
|
551
|
+
released?: never;
|
|
530
552
|
}
|
|
531
553
|
| {
|
|
532
554
|
title: string;
|
|
@@ -540,8 +562,14 @@ export type HeadlessBundleSection =
|
|
|
540
562
|
textEntries?: HeadlessPaneEntry[];
|
|
541
563
|
/** The symbol the figures are of, where the report's own is not: each exported line names it in `symbol_or_series`. */
|
|
542
564
|
symbol?: string;
|
|
543
|
-
/**
|
|
544
|
-
|
|
565
|
+
/**
|
|
566
|
+
* When the figures were observed (an ISO date or instant), where it is not the report's newest: each exported line names it in `as_of`.
|
|
567
|
+
* Null leaves `as_of` blank, for figures with no date of their own to state.
|
|
568
|
+
*/
|
|
569
|
+
asOf?: string | null;
|
|
570
|
+
/** In a report with `exportDated`: the period the figures cover, and when they were released (an ISO date or instant), which each exported line names in `period` and `released`. */
|
|
571
|
+
period?: string;
|
|
572
|
+
released?: string;
|
|
545
573
|
columns?: never;
|
|
546
574
|
rows?: never;
|
|
547
575
|
textColumns?: never;
|
|
@@ -584,6 +612,8 @@ export interface HeadlessSeries {
|
|
|
584
612
|
interval?: string;
|
|
585
613
|
/** Decimal places the text report prints the latest value to (a correlation to 3); JSON and CSV keep every digit. */
|
|
586
614
|
textDecimals?: number;
|
|
615
|
+
/** The text report prints the latest value as the tables print an amount (63.33B), for a company's reported total; JSON and CSV keep every digit. */
|
|
616
|
+
textCompact?: boolean;
|
|
587
617
|
/** Each point's `value` is its bar's close: `--csv` and `--ndjson` write Close alone, JSON keeps both. */
|
|
588
618
|
valueIsClose?: boolean;
|
|
589
619
|
points: HeadlessSeriesPoint[];
|
|
@@ -597,6 +627,8 @@ export interface HeadlessSeriesResult extends HeadlessPaneResultBase {
|
|
|
597
627
|
export interface HeadlessSnapshotResult extends HeadlessPaneResultBase {
|
|
598
628
|
asOf: string | number | Date;
|
|
599
629
|
items: HeadlessPaneRow[];
|
|
630
|
+
/** What the report says when `items` is empty, in place of "No data.": why there are none. */
|
|
631
|
+
empty?: string;
|
|
600
632
|
}
|
|
601
633
|
|
|
602
634
|
export interface HeadlessPaneResultByShape {
|
|
@@ -622,6 +654,8 @@ export interface HeadlessPaneDefinition<Shape extends HeadlessPaneShape = Headle
|
|
|
622
654
|
intents?: string[];
|
|
623
655
|
dataRequirements?: string[];
|
|
624
656
|
limitations?: string[];
|
|
657
|
+
/** Names an option's values match, listed by the catalog under each title: EQS's sectors and industries. */
|
|
658
|
+
reference?: HeadlessPaneReference[];
|
|
625
659
|
screenshotReadiness?: "ready" | "partial" | "live-dom" | "unsupported";
|
|
626
660
|
};
|
|
627
661
|
/**
|
|
@@ -644,6 +678,21 @@ export interface HeadlessPaneDefinition<Shape extends HeadlessPaneShape = Headle
|
|
|
644
678
|
* points at GIP's 1-minute bars). `key` is the listing as read, RMS:ASX.
|
|
645
679
|
*/
|
|
646
680
|
usListingsOnlyHint?(key: string): string;
|
|
681
|
+
/**
|
|
682
|
+
* A typed symbol the function reads as another before it is resolved, with
|
|
683
|
+
* the note that says so: OPX and OVDV read a bare BTC or ETH as the coin
|
|
684
|
+
* (BTC-USD), whose options are the ones asked about, not the US fund that
|
|
685
|
+
* trades as BTC. Null reads the symbol as typed.
|
|
686
|
+
*/
|
|
687
|
+
symbolAlias?(typed: string): { symbol: string; note: string } | null;
|
|
688
|
+
/**
|
|
689
|
+
* A listing the function has no data for, answered before any request with
|
|
690
|
+
* what exists instead: OPX and OVDV answer a coin nothing lists options on
|
|
691
|
+
* (SOL-USD) with BTC and ETH options, and OVDV, VCA and HIVG an FX pair with
|
|
692
|
+
* the currency funds' options. `key` is the listing as read; `details` is
|
|
693
|
+
* the line after `message`, left out when the message says it all.
|
|
694
|
+
*/
|
|
695
|
+
refuseSymbol?(key: string): { message: string; details?: string } | null;
|
|
647
696
|
/**
|
|
648
697
|
* `fn` exits 1 when the report has no name with data: no rows, or every row
|
|
649
698
|
* is one of `unavailableSymbols`. A list that gives data for some names
|
|
@@ -684,6 +733,13 @@ export interface HeadlessPaneDefinition<Shape extends HeadlessPaneShape = Headle
|
|
|
684
733
|
* sessions), so a saved file keeps what stderr said.
|
|
685
734
|
*/
|
|
686
735
|
exportWarnings?: boolean;
|
|
736
|
+
/**
|
|
737
|
+
* The rows are statistics dated by a period and a release, so `--csv` and
|
|
738
|
+
* `--ndjson` end every table with `period`, `released` and `retrieved` after
|
|
739
|
+
* the five fixed columns (a table's own columns of those names stand in for
|
|
740
|
+
* them), and `as_of` is the release, from the section's `rowAsOfKey` or `asOf`.
|
|
741
|
+
*/
|
|
742
|
+
exportDated?: boolean;
|
|
687
743
|
columns?: HeadlessPaneColumn[];
|
|
688
744
|
/**
|
|
689
745
|
* The report title. A report passes the loaded result, so a title can name
|
package/src/types/instrument.ts
CHANGED
|
@@ -79,6 +79,9 @@ export interface InstrumentSearchResult {
|
|
|
79
79
|
* carries that name. A leftover listing of the merged company (GOGLC on
|
|
80
80
|
* BYMA) is linked to it by search, naming the `successor`. */
|
|
81
81
|
formerIssuer?: { symbol: string; name: string; until: string; successor?: { symbol: string; name: string | null } };
|
|
82
|
+
/** The name a renamed company had (Cassava Sciences Inc, now Filana Therapeutics' FLNA), sent by newer cloud
|
|
83
|
+
* servers on the row a search by that name found. `searchAliases` then carries it as EDGAR files it. */
|
|
84
|
+
formerName?: string;
|
|
82
85
|
/** A US listing that no longer trades, found by its exact symbol (TWTR). Untrusted until parsed. */
|
|
83
86
|
delisting?: ListingDelisting;
|
|
84
87
|
/** The company's home line, its common stock on its home exchange (7203 on JPX for Toyota), sent by newer
|