gloomberb 0.18.2 → 0.18.4
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 +8 -8
- package/README.zh-CN.md +11 -11
- package/bin/{gloomberb → gloom} +3 -1
- package/package.json +6 -2
- package/patches/electrobun@1.18.1.patch +106 -5
- package/src/account/checkout-handoff.tsx +225 -0
- package/src/account/device-signin-dialog.tsx +2 -2
- package/src/account/device-signin.ts +2 -2
- package/src/account/upgrade-dialog.tsx +1 -1
- package/src/api-client/askg.ts +2 -2
- package/src/api-client/auth.ts +2 -2
- package/src/api-client/central-bank-rates.ts +6 -0
- package/src/api-client/collections.ts +5 -1
- package/src/api-client/cot.ts +2 -0
- package/src/api-client/crypto-etf-flows.ts +37 -0
- package/src/api-client/crypto-markets.ts +60 -0
- package/src/api-client/data.ts +99 -5
- package/src/api-client/doe.ts +15 -0
- package/src/api-client/equity-screener.ts +28 -0
- package/src/api-client/exchange-announcements.ts +38 -0
- package/src/api-client/fund-facts.ts +39 -0
- package/src/api-client/futures-curve.ts +9 -1
- package/src/api-client/hiring.ts +301 -0
- package/src/api-client/index.ts +24 -5
- package/src/api-client/market-discovery.ts +14 -0
- package/src/api-client/members.ts +6 -0
- package/src/api-client/mna.ts +6 -0
- package/src/api-client/paths.ts +18 -1
- package/src/api-client/request.ts +26 -7
- package/src/api-client/short-side-publications.ts +37 -0
- package/src/api-client/socket.ts +64 -4
- package/src/api-client/swap-curve.ts +35 -0
- package/src/api-client/telemetry.ts +17 -0
- package/src/api-client/themes.ts +7 -1
- package/src/api-client/types.ts +90 -2
- package/src/app/global-shortcuts.ts +1 -16
- package/src/app/pane-runtime/plugin-bindings.ts +9 -2
- package/src/app/runtime/desktop-deeplink.ts +5 -5
- package/src/app/runtime/plugin-bindings.ts +2 -2
- package/src/app/runtime/startup.ts +13 -0
- package/src/app/runtime/update.ts +28 -8
- package/src/app/star-prompt/status-line.tsx +2 -2
- package/src/architecture/core-builtin-allowlist.json +5 -2
- package/src/architecture/pane-tabs-allowlist.json +65 -0
- package/src/architecture/ui-literals-allowlist.json +3 -3
- package/src/architecture/ui-tokens-allowlist.json +1 -1
- package/src/brokers/broker-portfolio-sync.ts +37 -0
- package/src/brokers/directory.ts +11 -0
- package/src/brokers/logos.ts +3 -1
- package/src/brokers/signed-in/adapter.ts +304 -26
- package/src/brokers/signed-in/client.ts +14 -2
- package/src/brokers/signed-in/connect.ts +10 -2
- package/src/brokers/sync-broker-instance.ts +9 -1
- package/src/capabilities/chart-series.ts +22 -6
- package/src/cli/bank-section.ts +1 -1
- package/src/cli/base-converter.ts +23 -14
- package/src/cli/central-bank-events.ts +1 -1
- package/src/cli/command-options.ts +59 -4
- package/src/cli/commands/api.ts +9 -6
- package/src/cli/commands/broker.ts +2 -2
- package/src/cli/commands/command-utils.ts +2 -2
- package/src/cli/commands/crypto-hints.ts +7 -20
- package/src/cli/commands/fred-series.ts +4 -2
- package/src/cli/commands/keybindings.ts +2 -2
- package/src/cli/commands/market.ts +1189 -296
- package/src/cli/commands/news-hints.ts +2 -2
- package/src/cli/commands/news-search.ts +59 -6
- package/src/cli/commands/options-leaps.ts +41 -26
- package/src/cli/commands/overview.ts +121 -48
- package/src/cli/commands/plugins.ts +9 -9
- package/src/cli/commands/remote.ts +13 -10
- package/src/cli/commands/search.ts +64 -44
- package/src/cli/commands/system.ts +27 -19
- package/src/cli/commands/themes.ts +1 -1
- package/src/cli/commands/ticker.ts +272 -70
- package/src/cli/context.ts +3 -2
- package/src/cli/desktop-pane-shot-view.ts +2 -2
- package/src/cli/desktop-pane-shot.ts +1 -1
- package/src/cli/earnings-calendar.ts +4 -4
- package/src/cli/entry.ts +18 -1
- package/src/cli/errors.ts +20 -2
- package/src/cli/exit-codes.ts +1 -1
- package/src/cli/export-source.ts +10 -4
- package/src/cli/freshness.ts +2 -8
- package/src/cli/fx-forward.ts +130 -0
- package/src/cli/fx-pair.ts +10 -9
- package/src/cli/glossary.ts +64 -20
- package/src/cli/help.ts +20 -14
- package/src/cli/history-export.ts +126 -0
- package/src/cli/history-rows.ts +196 -43
- package/src/cli/index-roots.ts +5 -45
- package/src/cli/index.ts +32 -18
- package/src/cli/issuer-membership.ts +103 -0
- package/src/cli/known-gaps.ts +118 -25
- package/src/cli/listing-arg.ts +315 -43
- package/src/cli/name-entries.ts +73 -22
- package/src/cli/native-smoke.ts +2 -0
- package/src/cli/not-a-ticker.ts +19 -9
- package/src/cli/opentui-libc.ts +5 -0
- package/src/cli/options.ts +12 -0
- package/src/cli/pane-functions/capabilities.ts +77 -20
- package/src/cli/pane-functions/catalog.ts +40 -23
- package/src/cli/pane-functions/discovery.ts +1 -1
- package/src/cli/pane-functions/dom.ts +12 -8
- package/src/cli/pane-functions/financial-ratio-shot.ts +2 -2
- package/src/cli/pane-functions/freshness.ts +174 -23
- package/src/cli/pane-functions/function-help.ts +66 -27
- package/src/cli/pane-functions/headless.ts +48 -16
- package/src/cli/pane-functions/index.ts +82 -21
- package/src/cli/pane-functions/options.ts +22 -2
- package/src/cli/pane-functions/report-notices.ts +12 -4
- package/src/cli/pane-functions/report.ts +5 -5
- package/src/cli/pane-functions/resolver.ts +65 -14
- package/src/cli/pane-functions/screenshot-assessment.ts +322 -0
- package/src/cli/pane-functions/screenshot-bridge.ts +152 -0
- package/src/cli/pane-functions/screenshot-chart-evidence.ts +396 -0
- package/src/cli/pane-functions/screenshot-data-evidence.ts +383 -0
- package/src/cli/pane-functions/screenshot-evidence.ts +1 -1
- package/src/cli/pane-functions/screenshot-payload.ts +453 -0
- package/src/cli/pane-functions/screenshot-render.ts +316 -0
- package/src/cli/pane-functions/screenshot-types.ts +162 -0
- package/src/cli/pane-functions/shot-options.ts +8 -3
- package/src/cli/peso-dollar-rates.ts +79 -0
- package/src/cli/quote-answer.ts +38 -3
- package/src/cli/report-tables.ts +190 -27
- package/src/cli/restore-plugins.ts +29 -14
- package/src/cli/result.ts +122 -25
- package/src/cli/series-search.ts +5 -5
- package/src/cli/statement-filings.ts +19 -0
- package/src/cli/suffixed-listing-rows.ts +49 -0
- package/src/cli/symbol-args.ts +50 -15
- package/src/cli/symbol-cells.ts +120 -0
- package/src/cli/symbol-list.ts +226 -60
- package/src/cli/symbol-rows.ts +131 -25
- package/src/cli/ticker-resolution.ts +108 -11
- package/src/cli/treasury-yields.ts +5 -5
- package/src/cli/types.ts +2 -0
- package/src/cli/uncovered-instrument.ts +3 -3
- package/src/cli/unknown-command.ts +6 -6
- package/src/components/chart/composite/chart-layout.ts +131 -0
- package/src/components/chart/composite/composite-chart.tsx +387 -21
- package/src/components/chart/composite/drawing-store.ts +26 -6
- package/src/components/chart/composite/interactions.ts +9 -3
- package/src/components/chart/composite/legend.tsx +75 -3
- package/src/components/chart/composite/levels.ts +5 -0
- package/src/components/chart/composite/panel-gestures.ts +41 -0
- package/src/components/chart/composite/panel-labels.ts +2 -1
- package/src/components/chart/composite/panel-surface.tsx +316 -11
- package/src/components/chart/composite/price-axis-labels.tsx +27 -3
- package/src/components/chart/composite/rasterizer.ts +44 -19
- package/src/components/chart/composite/scene.ts +16 -4
- package/src/components/chart/composite/text-renderer.ts +48 -21
- package/src/components/chart/composite/toolbar.tsx +52 -5
- package/src/components/chart/composite/types.ts +19 -0
- package/src/components/chart/composite/use-composite-chart-keyboard.ts +120 -13
- package/src/components/chart/composite/use-composite-value-scales.ts +44 -0
- package/src/components/chart/composite/use-composite-viewport.ts +12 -3
- package/src/components/chart/composite/value-scale.ts +149 -0
- package/src/components/chart/composite/volume-profile-paint.ts +6 -3
- package/src/components/chart/core/pointer.ts +2 -0
- package/src/components/chart-table/index.ts +2 -0
- package/src/components/chart-table/read.tsx +74 -0
- package/src/components/command-bar/commands/collection-list.ts +41 -19
- package/src/components/command-bar/commands/collection.ts +9 -3
- package/src/components/command-bar/commands/direct/index.ts +1 -1
- package/src/components/command-bar/commands/direct/runtime.ts +3 -2
- package/src/components/command-bar/pane-templates/items.ts +59 -6
- package/src/components/command-bar/pane-templates/workflow.ts +10 -1
- package/src/components/command-bar/routes/root/command-items.ts +32 -6
- package/src/components/command-bar/routes/root/plugin-install.ts +1 -1
- package/src/components/command-bar/routes/root/provider-search.ts +42 -11
- package/src/components/command-bar/routes/root/results.ts +18 -4
- package/src/components/command-bar/routes/root/runtime.ts +15 -3
- package/src/components/command-bar/routes/root/search-providers.ts +25 -2
- package/src/components/command-bar/routes/root/selection.ts +6 -1
- package/src/components/command-bar/routes/root/shortcut-feedback.ts +4 -1
- package/src/components/command-bar/routes/root/shortcuts.ts +30 -3
- package/src/components/command-bar/routes/ticker-search/results.ts +73 -4
- package/src/components/command-bar/selection-runtime.ts +50 -10
- package/src/components/command-bar/surface/index.tsx +24 -2
- package/src/components/command-bar/view-model.ts +7 -0
- package/src/components/command-bar/workflow/broker.ts +2 -2
- package/src/components/command-bar/workflow/collection-actions.ts +46 -7
- package/src/components/command-bar/workflow/collection-ticker.ts +32 -4
- package/src/components/command-bar/workflow/fields.ts +8 -2
- package/src/components/command-bar/workflow/ops.ts +18 -4
- package/src/components/command-bar/workflow/portfolio-position.ts +53 -4
- package/src/components/command-bar/workflow/submit.ts +3 -2
- package/src/components/command-bar/workflow/tickers.ts +5 -1
- package/src/components/company-logo.tsx +39 -0
- package/src/components/data-table/sections.ts +4 -2
- package/src/components/data-table/view.tsx +23 -3
- package/src/components/form-modal/confirm.tsx +2 -1
- package/src/components/form-modal/request.ts +5 -0
- package/src/components/form-modal/routes.ts +4 -1
- package/src/components/index.ts +13 -6
- package/src/components/layout/detached-pane-shell.tsx +1 -0
- package/src/components/layout/floating-pane.tsx +1 -0
- package/src/components/layout/header.tsx +234 -60
- package/src/components/layout/market-summary.ts +9 -6
- package/src/components/layout/pane/capture-status.ts +1 -1
- package/src/components/layout/pane/footer/model.ts +11 -5
- package/src/components/layout/pane/header.tsx +10 -3
- package/src/components/layout/pane/index.tsx +1 -0
- package/src/components/layout/pane/pane-tabs.tsx +9 -1
- package/src/components/layout/shell/chrome.ts +19 -6
- package/src/components/layout/shell/index.tsx +2 -1
- package/src/components/layout/shell/pane/layers.tsx +19 -1
- package/src/components/layout/status-bar.tsx +2 -2
- package/src/components/market-board/index.tsx +11 -3
- package/src/components/onboarding/onboarding-wizard.tsx +1 -0
- package/src/components/onboarding/portfolio-step/broker-setup-panel.tsx +2 -2
- package/src/components/onboarding/wizard-broker-sync.ts +4 -1
- package/src/components/pane-settings-dialog/desktop.tsx +20 -7
- package/src/components/pane-settings-dialog/tui.tsx +17 -9
- package/src/components/pane-settings-dialog/value.ts +8 -1
- package/src/components/pane-settings-dialog.tsx +44 -13
- package/src/components/sign-in-code-panel.tsx +27 -19
- package/src/components/ui/column-grid.tsx +48 -4
- package/src/components/ui/country-flag-art.tsx +180 -0
- package/src/components/ui/country-flag.tsx +118 -12
- package/src/components/ui/data-table/opentui/index.tsx +61 -2
- package/src/components/ui/data-table/opentui/model.ts +109 -2
- package/src/components/ui/data-table/types.ts +1 -1
- package/src/components/ui/display.tsx +5 -1
- package/src/components/ui/index.ts +3 -1
- package/src/components/ui/logo-mark.tsx +11 -2
- package/src/components/ui/query-bar.tsx +1 -1
- package/src/components/ui/row-notes.ts +79 -0
- package/src/components/ui/stat-grid.tsx +28 -3
- package/src/components/ui/status.tsx +3 -1
- package/src/core/app-services.ts +4 -0
- package/src/core/state/app/layout.ts +4 -4
- package/src/data/cached-query.ts +8 -1
- package/src/data/config/chart-settings.ts +3 -3
- package/src/data/config/home.ts +10 -2
- package/src/data/config/layout.ts +4 -1
- package/src/data/config/store/node.ts +4 -0
- package/src/data/config/store/normalize.ts +13 -3
- package/src/data/config/store/portfolio-as-of-column.ts +2 -2
- package/src/data/json-storage.ts +2 -0
- package/src/data/saved-copies.ts +84 -0
- package/src/docs/snapshot.json +65 -32
- package/src/i18n/es.ts +51 -12
- package/src/i18n/ja.ts +51 -12
- package/src/i18n/ko.ts +51 -12
- package/src/i18n/zh-cn.ts +51 -12
- package/src/i18n/zh-tw.ts +51 -12
- package/src/layout/desks.ts +1 -1
- package/src/layout/launch-layout.ts +1 -1
- package/src/layout/pane-manager/floating-actions.ts +5 -3
- package/src/layout/pane-manager/floating.ts +43 -1
- package/src/layout/pane-manager/index.ts +2 -0
- package/src/layout/selected-ticker.ts +74 -0
- package/src/market-data/depositary-pair.ts +251 -0
- package/src/market-data/futures-board.ts +1 -1
- package/src/market-data/futures-contract.ts +124 -40
- package/src/market-data/fx-closes.ts +17 -2
- package/src/market-data/hooks.tsx +19 -11
- package/src/market-data/market/change-basis.ts +49 -7
- package/src/market-data/market/freshness.ts +34 -5
- package/src/market-data/market/period-return.ts +163 -0
- package/src/market-data/market/trading-sessions.ts +13 -0
- package/src/market-data/market/year-to-date.ts +8 -13
- package/src/market-data/performance.ts +20 -14
- package/src/market-data/perpetual-premium.ts +32 -0
- package/src/market-data/published-apac-sessions.ts +2 -1
- package/src/market-data/published-futures-sessions.ts +69 -0
- package/src/market-data/quotes/contributions.ts +5 -1
- package/src/market-data/quotes/freshness.ts +42 -0
- package/src/market-data/quotes/intraday-bar.ts +37 -0
- package/src/market-data/quotes/regular-session-valuation.ts +13 -8
- package/src/market-data/quotes/resolution.ts +4 -2
- package/src/market-data/tax-equivalent.ts +1 -1
- package/src/market-data/ticker-price-returns.ts +3 -1
- package/src/news/aggregator.ts +5 -1
- package/src/news/news-model.ts +4 -0
- package/src/news/types.ts +11 -0
- package/src/notifications/app-notifier.ts +1 -1
- package/src/plugins/auto-update.ts +2 -2
- package/src/plugins/builtin/account-management/index.tsx +1 -0
- package/src/plugins/builtin/account-management/pane.tsx +9 -8
- package/src/plugins/builtin/alerts/alert-engine.ts +30 -18
- package/src/plugins/builtin/alerts/calendar-events.ts +378 -0
- package/src/plugins/builtin/alerts/cli.ts +485 -76
- package/src/plugins/builtin/alerts/command.ts +5 -10
- package/src/plugins/builtin/alerts/event-rows.ts +9 -5
- package/src/plugins/builtin/alerts/events-pane.tsx +71 -56
- package/src/plugins/builtin/alerts/events.ts +108 -5
- package/src/plugins/builtin/alerts/fired-log.ts +78 -0
- package/src/plugins/builtin/alerts/format.ts +2 -1
- package/src/plugins/builtin/alerts/headless.ts +100 -39
- package/src/plugins/builtin/alerts/history-pane.tsx +105 -62
- package/src/plugins/builtin/alerts/history-rows.ts +89 -0
- package/src/plugins/builtin/alerts/index.tsx +45 -18
- package/src/plugins/builtin/alerts/iv-level.ts +365 -0
- package/src/plugins/builtin/alerts/levels.ts +3 -3
- package/src/plugins/builtin/alerts/pane.tsx +97 -29
- package/src/plugins/builtin/alerts/price.ts +35 -0
- package/src/plugins/builtin/alerts/quotes.ts +24 -0
- package/src/plugins/builtin/alerts/research-builder.ts +84 -11
- package/src/plugins/builtin/alerts/research-rules.ts +77 -3
- package/src/plugins/builtin/alerts/scheduled-check.ts +206 -32
- package/src/plugins/builtin/alerts/scheduled-sources.ts +26 -3
- package/src/plugins/builtin/alerts/scheduled.ts +188 -29
- package/src/plugins/builtin/alerts/storage.ts +13 -10
- package/src/plugins/builtin/alerts/targets.ts +12 -3
- package/src/plugins/builtin/analytics/index.tsx +8 -2
- package/src/plugins/builtin/analytics/metrics.ts +1 -1
- package/src/plugins/builtin/analytics/risk-book.ts +215 -0
- package/src/plugins/builtin/analytics/risk-client.ts +13 -6
- package/src/plugins/builtin/analytics/risk-headless.ts +55 -21
- package/src/plugins/builtin/analytics/risk-math.ts +6 -3
- package/src/plugins/builtin/analytics/risk-model.ts +297 -104
- package/src/plugins/builtin/analytics/risk-options.ts +17 -2
- package/src/plugins/builtin/analytics/risk-pane.tsx +107 -43
- package/src/plugins/builtin/attention/pane.tsx +22 -16
- package/src/plugins/builtin/awards/headless.ts +7 -3
- package/src/plugins/builtin/awards/model.ts +18 -0
- package/src/plugins/builtin/awards/pane.tsx +12 -9
- package/src/plugins/builtin/backtest/export.ts +1 -1
- package/src/plugins/builtin/backtest/headless.ts +3 -3
- package/src/plugins/builtin/backtest/rules.ts +41 -5
- package/src/plugins/builtin/broker-manager/add-flow.tsx +12 -7
- package/src/plugins/builtin/broker-manager/detail.tsx +47 -19
- package/src/plugins/builtin/broker-manager/footer.ts +27 -11
- package/src/plugins/builtin/broker-manager/index.tsx +21 -12
- package/src/plugins/builtin/broker-manager/keyboard.ts +1 -1
- package/src/plugins/builtin/broker-manager/model.ts +12 -2
- package/src/plugins/builtin/broker-manager/pane-actions.tsx +183 -57
- package/src/plugins/builtin/broker-manager/table.ts +28 -12
- package/src/plugins/builtin/broker-trading/account-picker.tsx +2 -1
- package/src/plugins/builtin/broker-trading/chart-levels.ts +82 -13
- package/src/plugins/builtin/broker-trading/controller.ts +45 -13
- package/src/plugins/builtin/broker-trading/dock.tsx +24 -4
- package/src/plugins/builtin/broker-trading/headless.ts +2 -1
- package/src/plugins/builtin/broker-trading/index.tsx +7 -1
- package/src/plugins/builtin/broker-trading/linked-orders.ts +148 -0
- package/src/plugins/builtin/broker-trading/order-feed.ts +75 -7
- package/src/plugins/builtin/broker-trading/orders.tsx +109 -31
- package/src/plugins/builtin/broker-trading/overview-orders.tsx +9 -3
- package/src/plugins/builtin/broker-trading/pane-model.ts +30 -2
- package/src/plugins/builtin/broker-trading/pane.tsx +115 -26
- package/src/plugins/builtin/broker-trading/ticket-parts.tsx +36 -7
- package/src/plugins/builtin/broker-trading/ticket.tsx +122 -36
- package/src/plugins/builtin/buildout/cells.tsx +4 -0
- package/src/plugins/builtin/buildout/detail/index.tsx +5 -1
- package/src/plugins/builtin/buildout/detail/ui.tsx +7 -4
- package/src/plugins/builtin/buildout/pane/index.tsx +34 -18
- package/src/plugins/builtin/buildout/pane/status.tsx +0 -4
- package/src/plugins/builtin/builtin-plugin-meta.ts +1 -1
- package/src/plugins/builtin/catalysts/client.ts +2 -2
- package/src/plugins/builtin/catalysts/detail.tsx +3 -2
- package/src/plugins/builtin/catalysts/index.tsx +1 -1
- package/src/plugins/builtin/catalysts/model.ts +49 -4
- package/src/plugins/builtin/catalysts/pane.tsx +9 -11
- package/src/plugins/builtin/central-bank-rates/client.ts +5 -0
- package/src/plugins/builtin/central-bank-rates/headless.ts +36 -10
- package/src/plugins/builtin/central-bank-rates/model.ts +33 -8
- package/src/plugins/builtin/changelog/index.tsx +1 -0
- package/src/plugins/builtin/chart-composer/catalog-inventory.ts +1 -0
- package/src/plugins/builtin/chart-composer/chart-spec-edit.ts +2 -1
- package/src/plugins/builtin/chart-composer/chart-spec.ts +7 -0
- package/src/plugins/builtin/chart-composer/cli-options.ts +2 -5
- package/src/plugins/builtin/chart-composer/data-catalog-pane.tsx +2 -1
- package/src/plugins/builtin/chart-composer/editor/controller.ts +2 -0
- package/src/plugins/builtin/chart-composer/editor.tsx +4 -1
- package/src/plugins/builtin/chart-composer/headless-schema.ts +28 -26
- package/src/plugins/builtin/chart-composer/headless.ts +253 -35
- package/src/plugins/builtin/chart-composer/index.tsx +12 -2
- package/src/plugins/builtin/chart-composer/leverage-overlay.ts +142 -0
- package/src/plugins/builtin/chart-composer/pane.tsx +128 -28
- package/src/plugins/builtin/chart-composer/series-catalog.ts +1 -0
- package/src/plugins/builtin/chart-composer/series-expression.ts +65 -6
- package/src/plugins/builtin/chart-composer/session-history.ts +15 -21
- package/src/plugins/builtin/chart-composer/session-range.ts +4 -2
- package/src/plugins/builtin/chart-composer/settings.ts +31 -19
- package/src/plugins/builtin/chart-composer/use-series-catalog.ts +5 -6
- package/src/plugins/builtin/chart-composer/viewport-labels.ts +18 -8
- package/src/plugins/builtin/chat/attachments/model.ts +3 -1
- package/src/plugins/builtin/chat/content/index.tsx +1 -1
- package/src/plugins/builtin/chat/pane-links/open.ts +1 -1
- package/src/plugins/builtin/chat/people.ts +1 -1
- package/src/plugins/builtin/clinical-trials/client.ts +5 -2
- package/src/plugins/builtin/clinical-trials/model.ts +13 -4
- package/src/plugins/builtin/clinical-trials/pane.tsx +32 -12
- package/src/plugins/builtin/clinical-trials/ticker-sponsor.ts +17 -0
- package/src/plugins/builtin/cloud/askg/controller.ts +1 -1
- package/src/plugins/builtin/cloud/askg/lock-note.ts +1 -1
- package/src/plugins/builtin/cloud/askg/tool-display.ts +1 -1
- package/src/plugins/builtin/cloud/auth-commands.ts +3 -3
- package/src/plugins/builtin/cloud/team/pane-sections.tsx +105 -47
- package/src/plugins/builtin/cloud/team/pane-ui.tsx +42 -4
- package/src/plugins/builtin/cloud/team/pane.tsx +204 -64
- package/src/plugins/builtin/cloud/thesis/store.ts +45 -22
- package/src/plugins/builtin/cloud-tweets/registration.ts +1 -0
- package/src/plugins/builtin/commodities-energy/index.tsx +29 -2
- package/src/plugins/builtin/commodities-energy/view-state.ts +2 -0
- package/src/plugins/builtin/commodity-balances/pane.tsx +14 -8
- package/src/plugins/builtin/company-attention/app-rank.tsx +11 -10
- package/src/plugins/builtin/company-attention/building-model.ts +222 -0
- package/src/plugins/builtin/company-attention/building.tsx +172 -0
- package/src/plugins/builtin/company-attention/client.ts +117 -1
- package/src/plugins/builtin/company-attention/evidence.ts +16 -3
- package/src/plugins/builtin/company-attention/headless.ts +101 -5
- package/src/plugins/builtin/company-attention/index.tsx +6 -3
- package/src/plugins/builtin/company-attention/model.ts +33 -7
- package/src/plugins/builtin/company-attention/moves-model.ts +253 -0
- package/src/plugins/builtin/company-attention/moves.tsx +159 -0
- package/src/plugins/builtin/company-attention/pane.tsx +89 -31
- package/src/plugins/builtin/company-attention/signals-model.ts +229 -0
- package/src/plugins/builtin/company-attention/signals.tsx +160 -0
- package/src/plugins/builtin/company-kpis/headless.ts +3 -2
- package/src/plugins/builtin/company-kpis/model.ts +2 -2
- package/src/plugins/builtin/company-kpis/pane.tsx +5 -4
- package/src/plugins/builtin/composite-plugins.ts +2 -1
- package/src/plugins/builtin/congress-trades/headless.ts +1 -1
- package/src/plugins/builtin/connections/index.ts +1 -0
- package/src/plugins/builtin/correlation/headless-schema.ts +3 -2
- package/src/plugins/builtin/correlation/headless.ts +7 -4
- package/src/plugins/builtin/correlation/relationship/model.ts +1 -0
- package/src/plugins/builtin/correlation/settings.ts +1 -0
- package/src/plugins/builtin/cot/headless.ts +28 -6
- package/src/plugins/builtin/cot/model.ts +12 -0
- package/src/plugins/builtin/cot/pane.tsx +7 -5
- package/src/plugins/builtin/cpi/headless.ts +5 -1
- package/src/plugins/builtin/cpi/pane.tsx +11 -9
- package/src/plugins/builtin/credit-boards/model.ts +2 -0
- package/src/plugins/builtin/credit-documents/headless.ts +1 -1
- package/src/plugins/builtin/credit-documents/pane.tsx +8 -7
- package/src/plugins/builtin/crypto-board/client.ts +86 -0
- package/src/plugins/builtin/crypto-board/defi-view.tsx +218 -0
- package/src/plugins/builtin/crypto-board/defi.ts +239 -0
- package/src/plugins/builtin/crypto-board/headless.ts +117 -6
- package/src/plugins/builtin/crypto-board/index.tsx +8 -3
- package/src/plugins/builtin/crypto-board/model.ts +40 -8
- package/src/plugins/builtin/crypto-board/pane.tsx +55 -21
- package/src/plugins/builtin/crypto-board/series.ts +19 -1
- package/src/plugins/builtin/crypto-etf-flows/client.ts +60 -0
- package/src/plugins/builtin/crypto-etf-flows/headless.ts +132 -0
- package/src/plugins/builtin/crypto-etf-flows/index.tsx +44 -0
- package/src/plugins/builtin/crypto-etf-flows/model.ts +121 -0
- package/src/plugins/builtin/crypto-etf-flows/pane.tsx +193 -0
- package/src/plugins/builtin/debt-maturities/pane.tsx +4 -3
- package/src/plugins/builtin/debug/index.tsx +1 -0
- package/src/plugins/builtin/dividend-yield/index.tsx +1 -1
- package/src/plugins/builtin/docs/index.tsx +1 -1
- package/src/plugins/builtin/docs/pane.tsx +2 -2
- package/src/plugins/builtin/docs/targets.ts +1 -1
- package/src/plugins/builtin/doe/client.ts +5 -1
- package/src/plugins/builtin/doe/headless.ts +12 -6
- package/src/plugins/builtin/doe/model.ts +43 -6
- package/src/plugins/builtin/doe/pane.tsx +19 -12
- package/src/plugins/builtin/earnings/board-model.ts +13 -6
- package/src/plugins/builtin/earnings/board-table.ts +4 -1
- package/src/plugins/builtin/earnings/board.tsx +253 -50
- package/src/plugins/builtin/earnings/calendar-model.ts +188 -0
- package/src/plugins/builtin/earnings/calendar.tsx +338 -0
- package/src/plugins/builtin/earnings/client.ts +4 -3
- package/src/plugins/builtin/earnings/headless.ts +53 -15
- package/src/plugins/builtin/earnings/history-model.ts +53 -36
- package/src/plugins/builtin/earnings/index.tsx +15 -22
- package/src/plugins/builtin/earnings/model.ts +17 -12
- package/src/plugins/builtin/earnings/scope.ts +89 -0
- package/src/plugins/builtin/earnings-calls/calendar.tsx +310 -0
- package/src/plugins/builtin/earnings-calls/data.ts +146 -2
- package/src/plugins/builtin/earnings-calls/headless.ts +151 -9
- package/src/plugins/builtin/earnings-calls/index.tsx +3 -3
- package/src/plugins/builtin/earnings-calls/lock-note.ts +1 -1
- package/src/plugins/builtin/earnings-calls/pane.tsx +149 -31
- package/src/plugins/builtin/earnings-calls/upcoming.ts +195 -0
- package/src/plugins/builtin/earnings-ripple/pane.tsx +10 -5
- package/src/plugins/builtin/econ/calendar-model.ts +132 -20
- package/src/plugins/builtin/econ/detail-view.tsx +48 -10
- package/src/plugins/builtin/econ/fred-catalog.ts +23 -6
- package/src/plugins/builtin/econ/fred-series-map.ts +4 -0
- package/src/plugins/builtin/econ/index.tsx +112 -25
- package/src/plugins/builtin/econ/print-watch.ts +2 -1
- package/src/plugins/builtin/econ/types.ts +32 -1
- package/src/plugins/builtin/econ-statistics/client.ts +16 -3
- package/src/plugins/builtin/econ-statistics/defs.ts +4 -0
- package/src/plugins/builtin/econ-statistics/detail.tsx +2 -2
- package/src/plugins/builtin/econ-statistics/headless.ts +13 -2
- package/src/plugins/builtin/econ-statistics/index.tsx +3 -3
- package/src/plugins/builtin/econ-statistics/pane.tsx +2 -1
- package/src/plugins/builtin/econ-statistics/stats.ts +103 -0
- package/src/plugins/builtin/econ-statistics/view.ts +16 -1
- package/src/plugins/builtin/equity-screener/client.ts +21 -3
- package/src/plugins/builtin/equity-screener/headless.ts +77 -5
- package/src/plugins/builtin/equity-screener/live.ts +1 -1
- package/src/plugins/builtin/equity-screener/model.ts +34 -0
- package/src/plugins/builtin/equity-screener/pane.tsx +148 -106
- package/src/plugins/builtin/equity-screener/screen-check.ts +90 -0
- package/src/plugins/builtin/equity-screener/ticker-check.tsx +148 -0
- package/src/plugins/builtin/estimate-revisions/headless.ts +3 -1
- package/src/plugins/builtin/estimate-revisions/lock-note.ts +3 -3
- package/src/plugins/builtin/estimate-revisions/model.ts +8 -10
- package/src/plugins/builtin/exposure/headless.ts +51 -6
- package/src/plugins/builtin/exposure/index.tsx +28 -2
- package/src/plugins/builtin/exposure/model.ts +7 -0
- package/src/plugins/builtin/exposure/pane.tsx +16 -10
- package/src/plugins/builtin/fear-greed/index.tsx +1 -1
- package/src/plugins/builtin/filing-events/index.tsx +1 -1
- package/src/plugins/builtin/futures/model.ts +10 -9
- package/src/plugins/builtin/futures/returns.ts +8 -36
- package/src/plugins/builtin/futures/table.tsx +1 -1
- package/src/plugins/builtin/futures-curve/client.ts +40 -9
- package/src/plugins/builtin/futures-curve/headless.ts +39 -17
- package/src/plugins/builtin/futures-curve/model.ts +258 -69
- package/src/plugins/builtin/futures-curve/pane.tsx +46 -17
- package/src/plugins/builtin/fx-matrix/client.ts +15 -8
- package/src/plugins/builtin/fx-matrix/headless.ts +32 -14
- package/src/plugins/builtin/fx-matrix/index.tsx +13 -11
- package/src/plugins/builtin/fx-matrix/live-legs.ts +22 -0
- package/src/plugins/builtin/fx-matrix/settings.ts +2 -1
- package/src/plugins/builtin/gpu/board.tsx +4 -1
- package/src/plugins/builtin/gpu/changes.tsx +10 -10
- package/src/plugins/builtin/gpu/equities.tsx +4 -1
- package/src/plugins/builtin/gpu/headless.ts +9 -4
- package/src/plugins/builtin/gpu/history.tsx +4 -2
- package/src/plugins/builtin/gpu/pane.tsx +5 -3
- package/src/plugins/builtin/help/index.tsx +13 -3
- package/src/plugins/builtin/holders/beneficial-model.ts +8 -11
- package/src/plugins/builtin/holders/beneficial-report.ts +6 -5
- package/src/plugins/builtin/holders/beneficial-view.tsx +7 -3
- package/src/plugins/builtin/holders/client.ts +15 -2
- package/src/plugins/builtin/holders/format.ts +28 -17
- package/src/plugins/builtin/holders/headless.ts +48 -8
- package/src/plugins/builtin/holders/index-holders.ts +264 -0
- package/src/plugins/builtin/holders/pane.tsx +79 -15
- package/src/plugins/builtin/holders/report-rows.ts +35 -7
- package/src/plugins/builtin/holders/table-model.ts +2 -1
- package/src/plugins/builtin/holders/thirteenf-match.ts +3 -1
- package/src/plugins/builtin/holders/treemap.tsx +2 -2
- package/src/plugins/builtin/insider/base-values.ts +11 -7
- package/src/plugins/builtin/insider/client.ts +3 -0
- package/src/plugins/builtin/insider/headless.ts +20 -7
- package/src/plugins/builtin/insider/index.tsx +17 -8
- package/src/plugins/builtin/insider/issuer.ts +34 -4
- package/src/plugins/builtin/insider/signals-client.ts +3 -3
- package/src/plugins/builtin/insider/signals.tsx +1 -1
- package/src/plugins/builtin/insider/table-model.ts +35 -13
- package/src/plugins/builtin/insider/table.tsx +5 -2
- package/src/plugins/builtin/ipo-calendar/pane.tsx +7 -4
- package/src/plugins/builtin/iv-history/client.ts +20 -0
- package/src/plugins/builtin/iv-history/events.ts +145 -0
- package/src/plugins/builtin/iv-history/format.ts +3 -0
- package/src/plugins/builtin/iv-history/headless.ts +91 -7
- package/src/plugins/builtin/iv-history/index.tsx +1 -1
- package/src/plugins/builtin/iv-history/model.ts +13 -4
- package/src/plugins/builtin/iv-history/series.ts +3 -1
- package/src/plugins/builtin/jobs/lock-note.ts +1 -1
- package/src/plugins/builtin/jobs/model.ts +4 -15
- package/src/plugins/builtin/jobs/pane.tsx +7 -5
- package/src/plugins/builtin/jobs/share-bars.tsx +11 -5
- package/src/plugins/builtin/jodi/pane.tsx +14 -8
- package/src/plugins/builtin/layout-manager/index.tsx +1 -0
- package/src/plugins/builtin/macro-day/headless.ts +20 -7
- package/src/plugins/builtin/macro-day/index.tsx +3 -2
- package/src/plugins/builtin/macro-day/model.ts +29 -8
- package/src/plugins/builtin/macro-day/pane.tsx +46 -10
- package/src/plugins/builtin/macro-day/releases.ts +55 -13
- package/src/plugins/builtin/market-heatmap/data.ts +9 -2
- package/src/plugins/builtin/market-heatmap/evidence.ts +1 -1
- package/src/plugins/builtin/market-heatmap/headless.ts +9 -6
- package/src/plugins/builtin/market-heatmap/index.tsx +3 -3
- package/src/plugins/builtin/market-heatmap/model.ts +10 -7
- package/src/plugins/builtin/market-movers/client.ts +36 -21
- package/src/plugins/builtin/market-movers/headless.ts +8 -2
- package/src/plugins/builtin/market-movers/index.tsx +16 -10
- package/src/plugins/builtin/market-movers/screener.ts +33 -11
- package/src/plugins/builtin/market-movers/session-body.tsx +4 -2
- package/src/plugins/builtin/market-movers/session-table.ts +4 -2
- package/src/plugins/builtin/market-movers/table.ts +4 -1
- package/src/plugins/builtin/market-valuation/headless.ts +2 -0
- package/src/plugins/builtin/market-valuation/view.ts +5 -0
- package/src/plugins/builtin/members/headless.ts +6 -5
- package/src/plugins/builtin/members/pane.tsx +11 -4
- package/src/plugins/builtin/mna/client.ts +1 -0
- package/src/plugins/builtin/mna/detail.tsx +20 -32
- package/src/plugins/builtin/mna/distress/detail.tsx +16 -4
- package/src/plugins/builtin/mna/distress/model.ts +3 -2
- package/src/plugins/builtin/mna/distress/pane.tsx +7 -4
- package/src/plugins/builtin/mna/headless.ts +6 -13
- package/src/plugins/builtin/mna/model.ts +93 -15
- package/src/plugins/builtin/mna/pane.tsx +5 -4
- package/src/plugins/builtin/news/headless.ts +12 -6
- package/src/plugins/builtin/news/index.tsx +10 -1
- package/src/plugins/builtin/news/wire/index.tsx +3 -2
- package/src/plugins/builtin/news/wire/news/command-bar-search.ts +26 -10
- package/src/plugins/builtin/news/wire/news/query-presets.ts +6 -2
- package/src/plugins/builtin/news/wire/rss/cli.ts +3 -3
- package/src/plugins/builtin/notes/cli.ts +50 -15
- package/src/plugins/builtin/notes/export.ts +17 -6
- package/src/plugins/builtin/notes/files.ts +16 -5
- package/src/plugins/builtin/openfda/pane.tsx +1 -1
- package/src/plugins/builtin/options/carry.ts +2 -2
- package/src/plugins/builtin/options/enrichment-model.ts +10 -9
- package/src/plugins/builtin/options/index.tsx +1 -1
- package/src/plugins/builtin/options/model-spot.ts +70 -4
- package/src/plugins/builtin/options/view.tsx +51 -23
- package/src/plugins/builtin/options-calculator/headless.ts +46 -7
- package/src/plugins/builtin/options-calculator/pane.tsx +3 -2
- package/src/plugins/builtin/options-positioning/headless.ts +11 -3
- package/src/plugins/builtin/options-positioning/model.ts +24 -0
- package/src/plugins/builtin/options-positioning/pane.tsx +10 -12
- package/src/plugins/builtin/options-scenario/client.ts +142 -29
- package/src/plugins/builtin/options-scenario/collar.ts +8 -6
- package/src/plugins/builtin/options-scenario/csp-screen-headless.ts +127 -0
- package/src/plugins/builtin/options-scenario/csp-screen-pane.tsx +165 -0
- package/src/plugins/builtin/options-scenario/csp-screen.ts +258 -0
- package/src/plugins/builtin/options-scenario/csp.ts +101 -21
- package/src/plugins/builtin/options-scenario/headless.ts +49 -21
- package/src/plugins/builtin/options-scenario/hedge.ts +20 -14
- package/src/plugins/builtin/options-scenario/index.tsx +28 -3
- package/src/plugins/builtin/options-scenario/model.ts +13 -0
- package/src/plugins/builtin/options-scenario/pane.tsx +22 -10
- package/src/plugins/builtin/perps/equity-row.tsx +11 -3
- package/src/plugins/builtin/perps/freshness.ts +8 -5
- package/src/plugins/builtin/perps/headless.ts +3 -1
- package/src/plugins/builtin/perps/list-perpetuals.ts +25 -4
- package/src/plugins/builtin/perps/live-rows.ts +161 -0
- package/src/plugins/builtin/perps/markets-section.tsx +154 -0
- package/src/plugins/builtin/perps/pane.tsx +36 -17
- package/src/plugins/builtin/perps/venue-markets.ts +96 -0
- package/src/plugins/builtin/plugin-marketplace/index.tsx +2 -1
- package/src/plugins/builtin/plugin-marketplace/pane.tsx +145 -60
- package/src/plugins/builtin/portfolio-list/cli/bulk-symbols.ts +78 -27
- package/src/plugins/builtin/portfolio-list/cli/portfolio-command.ts +158 -141
- package/src/plugins/builtin/portfolio-list/cli/render.ts +49 -20
- package/src/plugins/builtin/portfolio-list/cli/shared.ts +3 -3
- package/src/plugins/builtin/portfolio-list/cli/watchlist-command.ts +29 -24
- package/src/plugins/builtin/portfolio-list/headless.ts +6 -3
- package/src/plugins/builtin/portfolio-list/income.ts +13 -2
- package/src/plugins/builtin/portfolio-list/index.tsx +9 -2
- package/src/plugins/builtin/portfolio-list/pane/index.tsx +21 -8
- package/src/plugins/builtin/portfolio-list/pane/purchase-date-fx.ts +46 -0
- package/src/plugins/builtin/portfolio-list/summary/live-accounts.ts +16 -9
- package/src/plugins/builtin/portfolio-list/summary/totals.ts +2 -15
- package/src/plugins/builtin/power/client.ts +6 -3
- package/src/plugins/builtin/power/evidence.ts +22 -7
- package/src/plugins/builtin/power/gas.tsx +5 -1
- package/src/plugins/builtin/power/pane.tsx +44 -32
- package/src/plugins/builtin/power/prices.tsx +10 -3
- package/src/plugins/builtin/research/analyst-headless.ts +25 -8
- package/src/plugins/builtin/research/analyst-model.ts +68 -3
- package/src/plugins/builtin/research/corporate-actions-pane.tsx +63 -14
- package/src/plugins/builtin/research/event-model.ts +3 -1
- package/src/plugins/builtin/research/event-sources.ts +12 -4
- package/src/plugins/builtin/research/index.tsx +2 -1
- package/src/plugins/builtin/research/relative-valuation-basis.ts +58 -0
- package/src/plugins/builtin/research/relative-valuation-columns.ts +31 -2
- package/src/plugins/builtin/research/relative-valuation-currency.ts +12 -5
- package/src/plugins/builtin/research/relative-valuation-headless.ts +84 -26
- package/src/plugins/builtin/research/relative-valuation-model.ts +88 -19
- package/src/plugins/builtin/research/relative-valuation-pane.tsx +76 -9
- package/src/plugins/builtin/research/relative-valuation-peers.ts +1 -1
- package/src/plugins/builtin/reverse-dcf/client.ts +2 -1
- package/src/plugins/builtin/reverse-dcf/model.ts +10 -5
- package/src/plugins/builtin/risk-factors/index.tsx +2 -2
- package/src/plugins/builtin/scanner/lock-note.ts +1 -1
- package/src/plugins/builtin/seasonality/client.ts +2 -1
- package/src/plugins/builtin/sec/forms.ts +13 -0
- package/src/plugins/builtin/sec/fund-abroad.ts +32 -0
- package/src/plugins/builtin/sec/fund-facts.ts +68 -8
- package/src/plugins/builtin/sec/headless.ts +85 -8
- package/src/plugins/builtin/sec/index.tsx +58 -12
- package/src/plugins/builtin/sectors/client.ts +6 -4
- package/src/plugins/builtin/sectors/sector-model.ts +11 -15
- package/src/plugins/builtin/series-inventory.ts +2 -0
- package/src/plugins/builtin/shared/broker-reconnect.ts +107 -22
- package/src/plugins/builtin/shared/cloud-resource.ts +15 -2
- package/src/plugins/builtin/shared/cloud-upgrade.ts +34 -6
- package/src/plugins/builtin/shared/earnings-calendar.ts +375 -0
- package/src/plugins/builtin/{earnings/estimate-basis.ts → shared/earnings-estimate-basis.ts} +1 -1
- package/src/plugins/builtin/shared/earnings-report.ts +3 -3
- package/src/plugins/builtin/shared/fx-rate-freshness.ts +23 -1
- package/src/plugins/builtin/shared/job-posting.ts +129 -0
- package/src/plugins/builtin/shared/pro-lock-note.ts +3 -3
- package/src/plugins/builtin/shared/report-freshness.ts +3 -0
- package/src/plugins/builtin/shared/research-trading.tsx +23 -0
- package/src/plugins/builtin/shared/series-cache.ts +2 -0
- package/src/plugins/builtin/shared/series-list-detail.tsx +3 -1
- package/src/plugins/builtin/shared/ticker-surface.ts +2 -1
- package/src/plugins/builtin/shared/volatility/options.ts +2 -1
- package/src/plugins/builtin/short-interest/client.ts +2 -0
- package/src/plugins/builtin/short-interest/headless.ts +41 -12
- package/src/plugins/builtin/short-interest/index.tsx +23 -1
- package/src/plugins/builtin/short-interest/model.ts +70 -19
- package/src/plugins/builtin/short-interest/pane.tsx +19 -2
- package/src/plugins/builtin/short-interest/publications-client.ts +82 -0
- package/src/plugins/builtin/short-interest/publications-headless.ts +29 -0
- package/src/plugins/builtin/short-interest/publications-model.ts +50 -0
- package/src/plugins/builtin/short-interest/publications-pane.tsx +66 -0
- package/src/plugins/builtin/short-interest/schedule.ts +35 -2
- package/src/plugins/builtin/short-interest/surface.tsx +11 -4
- package/src/plugins/builtin/short-interest/types.ts +9 -0
- package/src/plugins/builtin/short-interest/watch-client.ts +14 -8
- package/src/plugins/builtin/short-interest/watch-model.ts +12 -25
- package/src/plugins/builtin/short-interest/watch-pane.tsx +5 -1
- package/src/plugins/builtin/social-mentions/client.ts +2 -1
- package/src/plugins/builtin/supply-chain/flow.tsx +33 -9
- package/src/plugins/builtin/supply-chain/model.ts +51 -3
- package/src/plugins/builtin/supply-chain/pane.tsx +78 -39
- package/src/plugins/builtin/supply-chain/row-evidence.tsx +1 -1
- package/src/plugins/builtin/themes/headless.ts +8 -5
- package/src/plugins/builtin/themes/model.ts +14 -4
- package/src/plugins/builtin/themes/pane.tsx +24 -5
- package/src/plugins/builtin/thirteenf/headless.ts +5 -5
- package/src/plugins/builtin/thirteenf/signals.ts +3 -1
- package/src/plugins/builtin/ticker-detail/adr-pair/headless.ts +123 -0
- package/src/plugins/builtin/ticker-detail/adr-pair/model.ts +132 -0
- package/src/plugins/builtin/ticker-detail/adr-pair/tab.tsx +87 -0
- package/src/plugins/builtin/ticker-detail/data-panes/historical-prices.tsx +40 -26
- package/src/plugins/builtin/ticker-detail/data-panes/history-bars.ts +8 -4
- package/src/plugins/builtin/ticker-detail/data-panes/returns-history.ts +67 -3
- package/src/plugins/builtin/ticker-detail/data-panes/returns-model.ts +112 -5
- package/src/plugins/builtin/ticker-detail/data-panes/returns-pane.tsx +17 -2
- package/src/plugins/builtin/ticker-detail/financials/aggregation.ts +21 -7
- package/src/plugins/builtin/ticker-detail/financials/model.ts +36 -1
- package/src/plugins/builtin/ticker-detail/financials/offerings.ts +56 -0
- package/src/plugins/builtin/ticker-detail/financials/ratios.ts +62 -13
- package/src/plugins/builtin/ticker-detail/financials/tab.tsx +30 -4
- package/src/plugins/builtin/ticker-detail/headless-schema.ts +14 -2
- package/src/plugins/builtin/ticker-detail/headless.ts +148 -35
- package/src/plugins/builtin/ticker-detail/index.tsx +37 -5
- package/src/plugins/builtin/ticker-detail/overview/model.ts +65 -10
- package/src/plugins/builtin/ticker-detail/overview/pane.tsx +9 -1
- package/src/plugins/builtin/ticker-detail/overview-tab.tsx +68 -11
- package/src/plugins/builtin/ticker-detail/pane.tsx +11 -0
- package/src/plugins/builtin/ticker-detail/quote-footer.ts +8 -3
- package/src/plugins/builtin/ticker-detail/research-tabs.ts +11 -0
- package/src/plugins/builtin/vol-surface/client.ts +28 -7
- package/src/plugins/builtin/vol-surface/headless.ts +43 -15
- package/src/plugins/builtin/vol-surface/model.ts +34 -12
- package/src/plugins/builtin/vol-surface/pane.tsx +33 -13
- package/src/plugins/builtin/vol-surface/stored.ts +34 -3
- package/src/plugins/builtin/vol-surface/tables.ts +14 -0
- package/src/plugins/builtin/volatility/model.ts +5 -10
- package/src/plugins/builtin/world-venue-map/basemap-layer.tsx +4 -3
- package/src/plugins/builtin/world-venue-map/basemap.ts +3 -1
- package/src/plugins/builtin/world-venue-map/chokepoint-chart.ts +40 -0
- package/src/plugins/builtin/world-venue-map/evidence.ts +1 -1
- package/src/plugins/builtin/world-venue-map/geo-series.ts +90 -11
- package/src/plugins/builtin/world-venue-map/headless.ts +1 -1
- package/src/plugins/builtin/world-venue-map/index.ts +3 -26
- package/src/plugins/builtin/world-venue-map/layers.ts +1 -1
- package/src/plugins/builtin/world-venue-map/map.tsx +2 -1
- package/src/plugins/builtin/world-venue-map/pane.tsx +4 -2
- package/src/plugins/builtin/world-venue-map/venue-header.tsx +15 -4
- package/src/plugins/builtin/yield-curve/client.ts +25 -0
- package/src/plugins/builtin/yield-curve/curves.ts +7 -4
- package/src/plugins/builtin/yield-curve/headless.ts +38 -4
- package/src/plugins/builtin/yield-curve/history.ts +4 -3
- package/src/plugins/builtin/yield-curve/index.tsx +12 -6
- package/src/plugins/builtin/yield-curve/swaps-model.ts +93 -0
- package/src/plugins/builtin/yield-curve/swaps.tsx +99 -0
- package/src/plugins/bundle.ts +1 -1
- package/src/plugins/catalog-browser.ts +2 -1
- package/src/plugins/compat.ts +3 -3
- package/src/plugins/dependencies.ts +75 -14
- package/src/plugins/extracted-plugins.ts +132 -34
- package/src/plugins/host-link.ts +149 -34
- package/src/plugins/installer.ts +35 -10
- package/src/plugins/loader.ts +206 -38
- package/src/plugins/manager-node.ts +2 -2
- package/src/plugins/marketplace/deactivation.ts +22 -0
- package/src/plugins/marketplace/model.ts +2 -2
- package/src/plugins/marketplace/packs.ts +1 -1
- package/src/plugins/ownership.ts +1 -1
- package/src/plugins/peer-retry.ts +155 -0
- package/src/plugins/registry/contributions.ts +3 -1
- package/src/plugins/registry/index.ts +4 -3
- package/src/plugins/registry/plugin-state.ts +3 -0
- package/src/plugins/seed-notice.ts +20 -0
- package/src/plugins/shortcut-argument.ts +39 -0
- package/src/portfolio/allocation.ts +1 -1
- package/src/portfolio/collection-name.ts +31 -0
- package/src/portfolio/column-values.ts +10 -8
- package/src/portfolio/cost-fx.ts +296 -19
- package/src/portfolio/manual-lots.ts +75 -0
- package/src/portfolio/mutations.ts +60 -22
- package/src/portfolio/suffixed-listings.ts +209 -0
- package/src/portfolio/totals-currency.ts +24 -0
- package/src/public/__snapshots__/public-api.test.ts.snap +14 -0
- package/src/public/time-series.ts +11 -8
- package/src/remote/schema.ts +1 -1
- package/src/renderers/browser/config-host.ts +3 -0
- package/src/renderers/browser/main.tsx +23 -3
- package/src/renderers/dom/boot-frame-page.ts +187 -0
- package/src/renderers/dom/boot-frame.ts +237 -0
- package/src/renderers/dom/build-assets.ts +46 -8
- package/src/renderers/dom/desktop/controls.tsx +1 -1
- package/src/renderers/dom/desktop/query-bar.tsx +2 -0
- package/src/renderers/dom/dom-ui-host.tsx +4 -29
- package/src/renderers/dom/host/ascii-text.ts +16 -2
- package/src/renderers/dom/host/box.tsx +43 -2
- package/src/renderers/dom/host/chart-surface.tsx +2 -0
- package/src/renderers/dom/host/hls.chunk.ts +3 -0
- package/src/renderers/dom/host/image-surface.tsx +49 -0
- package/src/renderers/dom/host/media-surface.tsx +24 -18
- package/src/renderers/dom/host/mouse.ts +30 -0
- package/src/renderers/dom/host/size-observer.ts +1 -1
- package/src/renderers/dom/host/style.ts +1 -1
- package/src/renderers/dom/host/tabs.tsx +16 -5
- package/src/renderers/dom/host/top-surface.ts +127 -0
- package/src/renderers/dom/styles.css +115 -0
- package/src/renderers/dom/test-utils.tsx +2 -1
- package/src/renderers/electrobun/bun/application-menu/index.ts +3 -3
- package/src/renderers/electrobun/bun/core-capabilities.ts +9 -1
- package/src/renderers/electrobun/bun/desktop/backend-requests.ts +3 -0
- package/src/renderers/electrobun/bun/desktop/backend.ts +56 -3
- package/src/renderers/electrobun/bun/desktop/detached-windows.ts +1 -1
- package/src/renderers/electrobun/bun/desktop/host-requests.ts +9 -3
- package/src/renderers/electrobun/bun/desktop/initialization.ts +81 -18
- package/src/renderers/electrobun/bun/desktop/update.ts +210 -30
- package/src/renderers/electrobun/bun/external-plugins.ts +29 -7
- package/src/renderers/electrobun/bun/index.ts +11 -1
- package/src/renderers/electrobun/bun/window/boot-frame.ts +67 -0
- package/src/renderers/electrobun/bun/window/create.ts +4 -1
- package/src/renderers/electrobun/shared/boot-frame.ts +7 -0
- package/src/renderers/electrobun/shared/protocol.ts +6 -1
- package/src/renderers/electrobun/view/cli-pane-shot-entry.tsx +1 -1
- package/src/renderers/electrobun/view/config-host.ts +3 -0
- package/src/renderers/electrobun/view/fatal-screen.tsx +1 -1
- package/src/renderers/electrobun/view/main.tsx +30 -4
- package/src/renderers/electrobun/view/news-source.ts +9 -7
- package/src/renderers/electrobun/view/remote/asset-data-client.ts +9 -2
- package/src/renderers/electrobun/view/ui-host.tsx +1 -1
- package/src/renderers/opentui/browser-open.ts +88 -0
- package/src/renderers/opentui/host.tsx +5 -14
- package/src/renderers/opentui/image/loader.ts +3 -2
- package/src/renderers/opentui/native-smoke.ts +10 -1
- package/src/renderers/opentui/pane-image/index.ts +2 -1
- package/src/renderers/opentui/render-lib.ts +253 -0
- package/src/renderers/opentui/render-timing-smoke.ts +1 -1
- package/src/renderers/opentui/start.tsx +8 -1
- package/src/renderers/share/layout-view.tsx +2 -2
- package/src/renderers/share/main.tsx +4 -4
- package/src/renderers/share/view.tsx +1 -1
- package/src/series/resolve.ts +22 -6
- package/src/series/standalone.ts +30 -2
- package/src/series/types.ts +8 -1
- package/src/shares/api.ts +4 -1
- package/src/shares/pane.ts +1 -1
- package/src/sources/gloomberb-cloud/fred-series.ts +46 -1
- package/src/sources/gloomberb-cloud/index.ts +39 -16
- package/src/sources/gloomberb-cloud/news.ts +39 -0
- package/src/sources/gloomberb-cloud/normalizers.ts +14 -1
- package/src/sources/gloomberb-cloud/perpetuals.ts +49 -1
- package/src/sources/listing-symbols.ts +37 -0
- package/src/sources/provider-errors.ts +16 -2
- package/src/sources/provider-router/financial-routes.ts +21 -3
- package/src/sources/provider-router/financials.ts +15 -2
- package/src/sources/provider-router/history.ts +30 -8
- package/src/sources/provider-router/index.ts +16 -0
- package/src/sources/provider-router/primary.ts +1 -1
- package/src/state/app/bootstrap.ts +23 -0
- package/src/state/hooks/inline-tickers.ts +30 -5
- package/src/sync/controller.ts +1 -1
- package/src/sync/core-contributors.ts +46 -14
- package/src/team/collections-sync.ts +2 -1
- package/src/team/collections.ts +178 -17
- package/src/telemetry/crash-reports.ts +21 -4
- package/src/telemetry/update-failures-node.ts +59 -0
- package/src/telemetry/update-failures.ts +307 -0
- package/src/test-support/builtin-panes.ts +1 -1
- package/src/theme/colors.ts +3 -30
- package/src/theme/ui-tokens.ts +37 -1
- package/src/tickers/company-name-listing.ts +215 -36
- package/src/tickers/company-name.ts +43 -0
- package/src/tickers/index-roots.ts +47 -0
- package/src/tickers/instrument-label.ts +5 -1
- package/src/tickers/listing-fate.ts +30 -0
- package/src/tickers/metadata.ts +10 -0
- package/src/tickers/perpetual-listing.ts +5 -2
- package/src/tickers/search/home-listing.ts +75 -0
- package/src/tickers/search/index.ts +76 -27
- package/src/tickers/search/ranking.ts +54 -4
- package/src/tickers/search/upsert.ts +29 -0
- package/src/tickers/terminal-codes.ts +416 -40
- package/src/time-series/bar-aggregation.ts +243 -0
- package/src/time-series/base-series.ts +307 -0
- package/src/time-series/chart-bounds.ts +349 -0
- package/src/time-series/chart-seed.ts +142 -0
- package/src/time-series/economic.ts +5 -0
- package/src/time-series/fundamentals.ts +18 -3
- package/src/time-series/history-acquisition.ts +499 -0
- package/src/time-series/leverage.ts +100 -0
- package/src/time-series/market-resolution.ts +4 -2
- package/src/time-series/market.ts +2 -1
- package/src/time-series/price-comparison.ts +175 -30
- package/src/time-series/range.ts +9 -1
- package/src/time-series/resolution.ts +174 -16
- package/src/time-series/resolve-context.ts +157 -0
- package/src/time-series/resolve.ts +126 -1577
- package/src/time-series/series-name.ts +38 -0
- package/src/time-series/series-presentation.ts +208 -0
- package/src/time-series/spec.ts +11 -6
- package/src/time-series/studies.ts +109 -12
- package/src/time-series/tail-reconcile.ts +121 -0
- package/src/time-series/types.ts +29 -2
- package/src/time-series/use-chart-resolution.ts +4 -5
- package/src/types/broker.ts +10 -0
- package/src/types/config.ts +14 -0
- package/src/types/data-provider.ts +20 -0
- package/src/types/exchange-rate.ts +6 -0
- package/src/types/financials.ts +104 -7
- package/src/types/headless.ts +83 -6
- package/src/types/instrument.ts +3 -0
- package/src/types/issuer-listings.ts +28 -0
- package/src/types/plugin.ts +65 -8
- package/src/types/price-history.ts +2 -0
- package/src/types/ticker.ts +13 -0
- package/src/types/trading.ts +59 -1
- package/src/ui/ascii-font.ts +13 -1
- package/src/ui/host.tsx +6 -1
- package/src/updater/command-names.ts +175 -0
- package/src/updater/failure.ts +163 -0
- package/src/updater/index.ts +97 -28
- package/src/utils/calendar-date.ts +32 -15
- package/src/utils/cash-runway.ts +241 -0
- package/src/utils/central-banks.ts +42 -0
- package/src/utils/cli-output.ts +259 -80
- package/src/utils/contract-month.ts +16 -0
- package/src/utils/crypto-pair.ts +61 -3
- package/src/utils/currency-pair.ts +26 -0
- package/src/utils/currency-units.ts +29 -0
- package/src/utils/datetime-format.ts +10 -0
- package/src/utils/debug-log.ts +1 -1
- package/src/utils/decimal-comma.ts +39 -6
- package/src/utils/exchange-announcements.ts +71 -0
- package/src/utils/exchange-rate-snapshot.ts +10 -0
- package/src/utils/financial-statements.ts +83 -4
- package/src/utils/format.ts +34 -16
- package/src/utils/fundamentals.ts +150 -34
- package/src/utils/fx-market-hours.ts +10 -1
- package/src/utils/latest-financial-period.ts +8 -0
- package/src/utils/linux-libc.ts +54 -0
- package/src/utils/market-capitalization.ts +111 -15
- package/src/utils/max-drawdown.ts +64 -0
- package/src/utils/network-failure.ts +83 -0
- package/src/utils/option-expiry.ts +139 -7
- package/src/utils/price-earnings.ts +11 -5
- package/src/utils/price-history.ts +18 -8
- package/src/utils/price-window.ts +131 -0
- package/src/utils/release-date.ts +47 -0
- package/src/utils/sec.ts +71 -0
- package/src/utils/throttled-fetch.ts +11 -4
- package/src/utils/trailing-eps.ts +67 -0
- package/src/utils/typed-text.ts +21 -0
- package/src/utils/utc-time.ts +24 -1
- package/src/version.ts +6 -0
- package/src/cli/pane-functions/screenshot.ts +0 -2122
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
import { logFailure } from "../../utils/log-failure";
|
|
2
2
|
import { formatShortDate, parseDisplayDate } from "../../utils/datetime-format";
|
|
3
3
|
import { formatReportedMoney } from "../../utils/reported-money";
|
|
4
|
-
import {
|
|
4
|
+
import {
|
|
5
|
+
appTtmRate, computedEnterpriseValueNote, convertedPriceEarningsNote, enterpriseValueLabel, enterpriseValueReconciliationNote, epsConversionNote,
|
|
6
|
+
fundamentalsCurrency, reportedEnterpriseValue, ttmAtAppRate, ttmConversionNote,
|
|
7
|
+
} from "../../utils/fundamentals";
|
|
5
8
|
import { latestFinancialPeriod } from "../../utils/latest-financial-period";
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
9
|
+
import { burnsCash, cashRunway, SHORT_RUNWAY_HISTORY, formatRunwayMonths, offeringNote, offeringsAfter, runwayMethod, type CashRunway, type OfferingFiling, type RunwayEstimate } from "../../utils/cash-runway";
|
|
10
|
+
import { exportedFundamentals, formatPriceEarnings, NOT_MEANINGFUL, priceEarningsOnEarnings } from "../../utils/price-earnings";
|
|
11
|
+
import { describeFundamentalMarketCap, marketCapBasisNote, selectMarketCapitalization, viewMarketCapitalization } from "../../utils/market-capitalization";
|
|
8
12
|
import {
|
|
9
13
|
formatCompact,
|
|
10
14
|
formatCurrency,
|
|
@@ -34,11 +38,14 @@ import {
|
|
|
34
38
|
quoteMarketStateLabel,
|
|
35
39
|
} from "../../market-data/market/status";
|
|
36
40
|
import type { FuturesContractTermsPayload } from "../../api-client/futures-curve";
|
|
37
|
-
import { changeBasisJson, quoteChangeBasis, quotePreviousCloseDate } from "../../market-data/market/change-basis";
|
|
38
|
-
import {
|
|
39
|
-
|
|
41
|
+
import { changeBasisJson, quoteChangeBasis, quotePreviousCloseDate, quoteSettleText } from "../../market-data/market/change-basis";
|
|
42
|
+
import {
|
|
43
|
+
futuresContractLines, futuresPricePer, isFuturesInstrument, loadFuturesContractTerms, loadUsdPerMmbtu, usdPerMmbtuText, type UsdPerMmbtu,
|
|
44
|
+
} from "../../market-data/futures-contract";
|
|
45
|
+
import { currencyCodeLabel, heldCurrencyUnit } from "../../utils/currency-units";
|
|
46
|
+
import { quotedFxPair } from "../../utils/currency-pair";
|
|
40
47
|
import type { AppConfig } from "../../types/config";
|
|
41
|
-
import type { DeclaredDividendAction, FinancialStatement, Quote, TickerFinancials } from "../../types/financials";
|
|
48
|
+
import type { CompanyProfile, DeclaredDividendAction, FinancialStatement, Quote, TickerFinancials } from "../../types/financials";
|
|
42
49
|
import { atRegularSessionPrice, regularSessionValuationPrice } from "../../market-data/quotes/regular-session-valuation";
|
|
43
50
|
import { computeTickerPriceReturns } from "../../market-data/ticker-price-returns";
|
|
44
51
|
import { instrumentTypeLabel, resolveTickerInstrumentKind } from "../../tickers/instrument-kind";
|
|
@@ -49,7 +56,7 @@ import type { TickerRecord } from "../../types/ticker";
|
|
|
49
56
|
import type { CliCommandContext } from "../../types/plugin";
|
|
50
57
|
import { getPortfolioPositionMetrics, getPortfolioQuoteDisplay, lotCostFxRate, resolvePortfolioMarketValue, resolvePortfolioPositionPnl } from "../../portfolio/position-metrics";
|
|
51
58
|
import { isFuturesTicker } from "../../portfolio/futures-positions";
|
|
52
|
-
import { createBaseConverter, type
|
|
59
|
+
import { createBaseConverter, type BaseConverter } from "../base-converter";
|
|
53
60
|
import { formatFxRate } from "../fx-pair";
|
|
54
61
|
import { initMarketData, withMarketData } from "../context";
|
|
55
62
|
import { fail } from "../errors";
|
|
@@ -65,7 +72,7 @@ import {
|
|
|
65
72
|
quoteChangeText,
|
|
66
73
|
} from "../helpers";
|
|
67
74
|
import { NotesFiles } from "../../plugins/builtin/notes/files";
|
|
68
|
-
import { isKnownNonUsListing, secFilingItemCodes } from "../../utils/sec";
|
|
75
|
+
import { isKnownNonUsListing, secFilingItemCodes, US_FUND_FACTS_ONLY } from "../../utils/sec";
|
|
69
76
|
import { currentReportItemsLabel, hiddenFilingsNote, loadLatestFilings, type HiddenFilings } from "../../utils/sec-filings";
|
|
70
77
|
import { canonicalExchange, exchangeLabel, isKnownExchangeCode, isUsListingExchange } from "../../utils/exchanges";
|
|
71
78
|
import {
|
|
@@ -73,8 +80,10 @@ import {
|
|
|
73
80
|
resolveCliListing, type CliListing, type ListingDataRequest,
|
|
74
81
|
} from "../listing-arg";
|
|
75
82
|
import { movedAwayChange } from "../../tickers/ticker-changes";
|
|
83
|
+
import { companyMemberships, loadCompanyMemberships, type CompanyMemberships, type ListMembership } from "../issuer-membership";
|
|
76
84
|
import { isNotATickerMessage } from "../not-a-ticker";
|
|
77
85
|
import { sharesOutstandingInReceipts } from "../../utils/depositary-receipt";
|
|
86
|
+
import { depositaryPairText, isReceiptSide, listingDepositaryPair } from "../../market-data/depositary-pair";
|
|
78
87
|
import { cliFreshnessFooter } from "../result";
|
|
79
88
|
import { providerMissReason } from "../../sources/provider-errors";
|
|
80
89
|
import { exportEntriesTable, reportFooterLines, type CliReportTables } from "../report-tables";
|
|
@@ -84,12 +93,14 @@ import { distributionHistory, forwardDividendBasis, forwardDividendMayHaveLapsed
|
|
|
84
93
|
import { declaredDividends } from "../../utils/declared-dividends";
|
|
85
94
|
import { historyTrailingDividendYield, measuresTrailingYield } from "../../market-data/quotes/live-valuation";
|
|
86
95
|
import { notTheCoinNote } from "./crypto-hints";
|
|
87
|
-
import { loadStatementFilings, resultsReleaseText, statementPeriodText, type StatementFilingsReport } from "../statement-filings";
|
|
96
|
+
import { loadOfferingFilings, loadStatementFilings, resultsReleaseText, statementPeriodText, type StatementFilingsReport } from "../statement-filings";
|
|
88
97
|
import type { BankFiguresPayload } from "../../api-client/bank-figures";
|
|
89
98
|
import { bankSection } from "../bank-section";
|
|
90
99
|
import type { FundBondFacts } from "../../api-client/fund-facts";
|
|
91
100
|
import { bondFigures, fetchFundBondFacts, NOT_SEC_YIELD } from "../../market-data/bond-funds";
|
|
92
101
|
import { taxEquivalentLines, type TaxEquivalentAnalysis } from "../../market-data/tax-equivalent";
|
|
102
|
+
import { isRoundTheClockCoin } from "../../utils/crypto-pair";
|
|
103
|
+
import { coinNewsFallbackNotice } from "../../sources/gloomberb-cloud/news";
|
|
93
104
|
|
|
94
105
|
const NEWS_ITEM_LIMIT = 5;
|
|
95
106
|
const SEC_FILING_LIMIT = 5;
|
|
@@ -164,7 +175,16 @@ function wrapProse(text: string): string {
|
|
|
164
175
|
return wrapText(text, Math.min(cliTerminalWidth() ?? MAX_PROSE_WIDTH, MAX_PROSE_WIDTH)).join("\n");
|
|
165
176
|
}
|
|
166
177
|
|
|
167
|
-
|
|
178
|
+
/** The runway row: months at the latest quarter's burn and at the trailing year's, each with the period it is read over. */
|
|
179
|
+
function cashRunwayText(runway: CashRunway): string {
|
|
180
|
+
const { quarter, trailing, periodEnd } = runway;
|
|
181
|
+
if (quarter?.kind === "no-burn" && trailing?.kind === "no-burn") return `no burn (quarter and TTM to ${periodEnd})`;
|
|
182
|
+
const part = (estimate: RunwayEstimate | null, period: string) => estimate
|
|
183
|
+
? `${estimate.kind === "no-burn" ? "no burn" : formatRunwayMonths(estimate.months)} (${period} to ${periodEnd})` : null;
|
|
184
|
+
return [part(quarter, "quarter"), trailing ? part(trailing, "TTM") : `TTM ${runway.trailingGap === "short-history" ? SHORT_RUNWAY_HISTORY : "not reported"}`].filter((text): text is string => !!text).join(" \u00b7 ");
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
function buildStatementMetrics(statement: FinancialStatement, currency?: string, codes = false, runway?: CashRunway | null): Array<[string, string]> {
|
|
168
188
|
const money = (value: number | undefined, perShare = false) => formatReportedMoney(value, currency, perShare, codes);
|
|
169
189
|
return [
|
|
170
190
|
["Revenue", money(statement.totalRevenue)],
|
|
@@ -177,6 +197,9 @@ function buildStatementMetrics(statement: FinancialStatement, currency?: string,
|
|
|
177
197
|
["Operating Cash Flow", money(statement.operatingCashFlow)],
|
|
178
198
|
["Free Cash Flow", money(statement.freeCashFlow)],
|
|
179
199
|
["Cash", money(statement.cashAndCashEquivalents)],
|
|
200
|
+
["Cash + ST Inv", money(statement.cashCashEquivalentsAndShortTermInvestments)],
|
|
201
|
+
// The latest quarter's only: months of cash at its burn and the trailing year's.
|
|
202
|
+
...runway ? [["Cash Runway", cashRunwayText(runway)] as [string, string]] : [],
|
|
180
203
|
["Total Assets", money(statement.totalAssets)],
|
|
181
204
|
["Total Liabilities", money(statement.totalLiabilities)],
|
|
182
205
|
["Total Debt", money(statement.totalDebt)],
|
|
@@ -193,9 +216,15 @@ function buildStatementMetrics(statement: FinancialStatement, currency?: string,
|
|
|
193
216
|
* A receipt's count is its ordinary shares expressed in receipts, as its
|
|
194
217
|
* market cap is; the ordinary count follows when the service gives it.
|
|
195
218
|
*/
|
|
219
|
+
/** `504.5M (as of 2026-09-03)`: a share count with the day it was counted, when that is known (a 10-K or 10-Q cover count). */
|
|
220
|
+
function datedCount(count: number, asOf: string | undefined): string {
|
|
221
|
+
return asOf ? `${formatCompact(count)} (as of ${asOf})` : formatCompact(count);
|
|
222
|
+
}
|
|
223
|
+
|
|
196
224
|
function sharesOutstandingText(fundamentals: TickerFinancials["fundamentals"], inReceipts: boolean): string {
|
|
197
225
|
const shares = fundamentals?.sharesOutstanding;
|
|
198
|
-
if (shares == null
|
|
226
|
+
if (shares == null) return formatCompact(shares);
|
|
227
|
+
if (!inReceipts) return datedCount(shares, fundamentals?.sharesOutstandingAsOf);
|
|
199
228
|
const ordinary = fundamentals?.shareBasis === "depositary_receipt" ? fundamentals.underlyingOrdinaryShares : undefined;
|
|
200
229
|
return ordinary != null && Number.isFinite(ordinary) && ordinary > 0
|
|
201
230
|
? `${formatCompact(shares)} (ADR equivalent = ${formatCompact(ordinary)} ordinary shares)`
|
|
@@ -211,6 +240,19 @@ function appendTextSection(lines: string[], title: string, content: string | und
|
|
|
211
240
|
lines.push(verbatim ? text : wrapProse(text));
|
|
212
241
|
}
|
|
213
242
|
|
|
243
|
+
/** "Description from ChinaAMC (Hong Kong), Product Key Facts on HKEXnews: https://...": where a quoted description is from. */
|
|
244
|
+
function descriptionSourceLine(profile: CompanyProfile | undefined): string | null {
|
|
245
|
+
const source = profile?.description?.trim() ? profile.descriptionSource : undefined;
|
|
246
|
+
return source?.publisher && source.url ? `Description from ${source.publisher}: ${source.url}` : null;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
/** The description with where it is from under it, when it is quoted. */
|
|
250
|
+
function appendDescription(lines: string[], profile: CompanyProfile | undefined) {
|
|
251
|
+
appendTextSection(lines, "Description", profile?.description);
|
|
252
|
+
const source = descriptionSourceLine(profile);
|
|
253
|
+
if (source) lines.push(cliStyles.muted(source));
|
|
254
|
+
}
|
|
255
|
+
|
|
214
256
|
function appendFeedSection(
|
|
215
257
|
lines: string[],
|
|
216
258
|
title: string,
|
|
@@ -301,7 +343,7 @@ function shouldFetchSecFilings(
|
|
|
301
343
|
}
|
|
302
344
|
|
|
303
345
|
async function appendTickerPositions(lines: string[], tickerFile: TickerRecord | null, quote: TickerFinancials["quote"],
|
|
304
|
-
config: AppConfig, toBase: ReportBaseConverter): Promise<void> {
|
|
346
|
+
config: AppConfig, toBase: ReportBaseConverter, rates: ReportRateNotes): Promise<void> {
|
|
305
347
|
const quoteCurrency = quote?.currency?.trim() || tickerFile?.metadata.currency?.trim() || "";
|
|
306
348
|
const codes = writesCurrencyCodes(config);
|
|
307
349
|
const money = codes ? formatCurrencyCode : formatCurrency;
|
|
@@ -320,13 +362,15 @@ async function appendTickerPositions(lines: string[], tickerFile: TickerRecord |
|
|
|
320
362
|
const currentPrice = getPortfolioQuoteDisplay(metrics, quote)?.price ?? null;
|
|
321
363
|
const currentPriceBase = currentPrice != null && quoteCurrency ? await toBase(currentPrice, quoteCurrency) : null;
|
|
322
364
|
const positionRate = positionCurrency ? await toBase(1, positionCurrency) : Number.NaN;
|
|
323
|
-
|
|
324
|
-
if (
|
|
365
|
+
// By the major currency the converter states its rate in: pence (GBp, GBX) at GBP's.
|
|
366
|
+
if (positionCurrency) converted.add(heldCurrencyUnit(positionCurrency).currency);
|
|
367
|
+
if (quoteCurrency && currentPrice != null) converted.add(heldCurrencyUnit(quoteCurrency).currency);
|
|
325
368
|
const baseMetrics = getPortfolioPositionMetrics({ ...tickerFile, metadata: { ...tickerFile.metadata, positions: [position] } }, undefined, quoteCurrency,
|
|
326
369
|
{ currency: config.baseCurrency, convert: value => value * positionRate }, quote);
|
|
327
|
-
// A cost bought at an entered rate into the base currency converts at it, as its P&L does; any other at today's.
|
|
370
|
+
// A cost bought at an entered rate into the base currency converts at it, as its P&L does, and says so; any other at today's.
|
|
371
|
+
const boughtRate = positionCurrency ? lotCostFxRate(position, positionCurrency, config.baseCurrency) : null;
|
|
328
372
|
const costBasisBase = !positionCurrency ? Number.NaN
|
|
329
|
-
:
|
|
373
|
+
: boughtRate !== null ? baseMetrics.signedCost
|
|
330
374
|
: await toBase(metrics.signedCost, positionCurrency);
|
|
331
375
|
const marketValueBase = resolvePortfolioMarketValue(baseMetrics, currentPriceBase)?.net ?? Number.NaN;
|
|
332
376
|
const selectedPnl = resolvePortfolioPositionPnl(baseMetrics, currentPriceBase);
|
|
@@ -339,7 +383,8 @@ async function appendTickerPositions(lines: string[], tickerFile: TickerRecord |
|
|
|
339
383
|
"Position",
|
|
340
384
|
`${formatMarketQuantity(metrics.totalShares, { assetCategory: tickerFile.metadata.assetCategory, multiplier: position.multiplier, priceBasis: metrics.priceBasis, quantityCurrency: positionCurrency })} ${metrics.priceBasis === "percent-of-par" ? "@" : `${tickerFile.metadata.assetCategory === "BOND" ? "units" : contracts ? "contracts" : "shares"} @`} ${positionCurrency ? formatMarketCostWithCurrency(position.avgCost, positionCurrency, { assetCategory: tickerFile.metadata.assetCategory, multiplier: position.multiplier, priceBasis: metrics.priceBasis, currencyCode: codes }) : "—"}`,
|
|
341
385
|
],
|
|
342
|
-
["Cost Basis", money(costBasisBase, config.baseCurrency)
|
|
386
|
+
["Cost Basis", `${money(costBasisBase, config.baseCurrency)}${boughtRate !== null
|
|
387
|
+
? ` (${formatFxRate(boughtRate)} ${config.baseCurrency.trim().toUpperCase()} per ${positionCurrency} when bought)` : ""}`],
|
|
343
388
|
["Market Value", money(marketValueBase, config.baseCurrency)],
|
|
344
389
|
[
|
|
345
390
|
selectedPnl.basis === "broker-snapshot" ? "Broker P&L" : "P&L",
|
|
@@ -354,12 +399,39 @@ async function appendTickerPositions(lines: string[], tickerFile: TickerRecord |
|
|
|
354
399
|
lines.push("");
|
|
355
400
|
}
|
|
356
401
|
}
|
|
357
|
-
for (const note of conversionNotes(toBase, converted)) lines.push(cliStyles.muted(note));
|
|
402
|
+
for (const note of conversionNotes(toBase, converted, rates)) lines.push(cliStyles.muted(note));
|
|
358
403
|
}
|
|
359
404
|
}
|
|
360
405
|
|
|
361
406
|
/** The ticker report's converter: what `createBaseConverter` makes, whose rates a report states; a plain function in tests. */
|
|
362
|
-
type ReportBaseConverter = ((value: number, fromCurrency: string) => Promise<number>) &
|
|
407
|
+
type ReportBaseConverter = ((value: number, fromCurrency: string) => Promise<number>) & Partial<Pick<BaseConverter, "conversions" | "usdRate">>;
|
|
408
|
+
|
|
409
|
+
/**
|
|
410
|
+
* The financials with a converted TTM block at the rate the report converts everything else at, the one `fx`
|
|
411
|
+
* reports (ttmAtAppRate), for the text and the JSON alike; as served when the converter has no rate for it.
|
|
412
|
+
*/
|
|
413
|
+
export async function atReportTtmRate(financials: TickerFinancials, toBase: Partial<Pick<BaseConverter, "usdRate">>): Promise<TickerFinancials> {
|
|
414
|
+
const fundamentals = financials.fundamentals;
|
|
415
|
+
const from = fundamentals?.ttmConversion?.from?.trim();
|
|
416
|
+
const to = fundamentals?.financialCurrency?.trim();
|
|
417
|
+
if (!fundamentals || !from || !to || from === to || !toBase.usdRate) return financials;
|
|
418
|
+
const legs = new Map(await Promise.all([from, to].map(async (currency) =>
|
|
419
|
+
[heldCurrencyUnit(currency).currency, await toBase.usdRate!(currency)] as const)));
|
|
420
|
+
const shown = ttmAtAppRate(fundamentals, appTtmRate(fundamentals, (currency) => legs.get(currency)));
|
|
421
|
+
return shown === fundamentals ? financials : { ...financials, fundamentals: shown };
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
/**
|
|
425
|
+
* "TTM figures in ARS; the statements in USD.": a trailing block the source states in another currency than the
|
|
426
|
+
* statements shown below it, which no conversion explains (YPFD on BYMA: ARS figures beside USD statements).
|
|
427
|
+
*/
|
|
428
|
+
function ttmCurrencySplitNote(fundamentals: TickerFinancials["fundamentals"], statementCurrencies: ReadonlyArray<string | undefined>): string | undefined {
|
|
429
|
+
const ttm = fundamentals?.financialCurrency?.trim();
|
|
430
|
+
const shown = new Set(statementCurrencies.map((currency) => currency?.trim()).filter((currency): currency is string => !!currency));
|
|
431
|
+
if (!ttm || fundamentals?.ttmConversion || shown.size !== 1) return undefined;
|
|
432
|
+
const [statements] = shown;
|
|
433
|
+
return heldCurrencyUnit(statements).currency === heldCurrencyUnit(ttm).currency ? undefined : `TTM figures in ${ttm}; the statements in ${statements}.`;
|
|
434
|
+
}
|
|
363
435
|
|
|
364
436
|
/**
|
|
365
437
|
* A base currency other than USD reads every amount with its code (259.36
|
|
@@ -372,14 +444,41 @@ export function writesCurrencyCodes(config: Pick<AppConfig, "baseCurrency"> | un
|
|
|
372
444
|
}
|
|
373
445
|
|
|
374
446
|
/**
|
|
375
|
-
*
|
|
376
|
-
*
|
|
377
|
-
*
|
|
447
|
+
* What the report's rate notes have said and must say: each currency's rate
|
|
448
|
+
* is stated once, under the first section that converted it, and a lot whose
|
|
449
|
+
* cost converts at the rate entered when it was bought is left out of it.
|
|
450
|
+
*/
|
|
451
|
+
interface ReportRateNotes {
|
|
452
|
+
/** Currencies whose rate a note already gave. */
|
|
453
|
+
noted: Set<string>;
|
|
454
|
+
/** Currencies of lots whose Cost Basis is at their own entered rate. */
|
|
455
|
+
boughtAt: ReadonlySet<string>;
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
/** The currencies of the shown lots whose cost converts into the base currency at the rate they were bought at, pence as GBP. */
|
|
459
|
+
function boughtRateCurrencies(tickerFile: TickerRecord | null, quoteCurrency: string, baseCurrency: string): Set<string> {
|
|
460
|
+
return new Set((tickerFile?.metadata.positions ?? []).flatMap((position) => {
|
|
461
|
+
const currency = (position.currency || quoteCurrency).trim();
|
|
462
|
+
return position.shares !== 0 && currency && lotCostFxRate(position, currency, baseCurrency) !== null ? [heldCurrencyUnit(currency).currency] : [];
|
|
463
|
+
}));
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
/**
|
|
467
|
+
* "CAD figures at USD/CAD 1.40623, as of 2026-10-21 04:46 UTC.": the rate
|
|
468
|
+
* and its date for each currency in `currencies` the report converted into
|
|
469
|
+
* the base currency, as markets quote the pair (USD/JPY, not JPY/USD), so a
|
|
470
|
+
* converted figure is never without what it was converted at. A rate already
|
|
471
|
+
* stated is not repeated, and a cost basis at its own rate is excepted.
|
|
378
472
|
*/
|
|
379
|
-
function conversionNotes(toBase: ReportBaseConverter, currencies: ReadonlySet<string
|
|
473
|
+
function conversionNotes(toBase: ReportBaseConverter, currencies: ReadonlySet<string>, rates: ReportRateNotes): string[] {
|
|
380
474
|
return (toBase.conversions?.() ?? [])
|
|
381
|
-
.filter((conversion) => currencies.has(conversion.currency) && conversion.currency !== conversion.baseCurrency)
|
|
382
|
-
.map(({ currency, baseCurrency, rate, asOf }) =>
|
|
475
|
+
.filter((conversion) => currencies.has(conversion.currency) && conversion.currency !== conversion.baseCurrency && !rates.noted.has(conversion.currency))
|
|
476
|
+
.map(({ currency, baseCurrency, rate, asOf }) => {
|
|
477
|
+
rates.noted.add(currency);
|
|
478
|
+
const quoted = quotedFxPair(currency, baseCurrency, rate);
|
|
479
|
+
const except = rates.boughtAt.has(currency) ? ", except a cost basis at the rate it was bought at" : "";
|
|
480
|
+
return `${baseCurrency} figures at ${quoted.pair} ${formatFxRate(quoted.rate)}${asOf != null ? `, as of ${formatTimestamp(asOf)}` : ""}${except}.`;
|
|
481
|
+
});
|
|
383
482
|
}
|
|
384
483
|
|
|
385
484
|
/** A source's enterprise value is in the units of the capitalization it reports beside it,
|
|
@@ -411,9 +510,13 @@ function reportedMoney(value: number | undefined, currency: string | undefined,
|
|
|
411
510
|
return { text: formatReportedMoney(value, currency, perShare, codes), value, unit: currency?.trim() || "ccy?" };
|
|
412
511
|
}
|
|
413
512
|
|
|
414
|
-
/**
|
|
513
|
+
/**
|
|
514
|
+
* The EV line: labelled "(provider)" when it is more than 5% from market cap + debt - cash, "unavailable" when
|
|
515
|
+
* withdrawn, N/M at or below zero as a P/E over a loss is.
|
|
516
|
+
*/
|
|
415
517
|
function enterpriseValueFigure(figure: MetricFigure, fundamentals: TickerFinancials["fundamentals"]): MetricFigure {
|
|
416
518
|
const label = enterpriseValueLabel(fundamentals);
|
|
519
|
+
if (label === "not-meaningful") return { ...multipleFigure(NOT_MEANINGFUL), unit: figure.unit };
|
|
417
520
|
if (label === "unavailable") return { text: "unavailable", value: null, unit: figure.unit };
|
|
418
521
|
return label === "provider" && figure.text !== "—" ? { ...figure, text: `${figure.text} (provider)` } : figure;
|
|
419
522
|
}
|
|
@@ -633,6 +736,9 @@ function fundamentalsMetrics(
|
|
|
633
736
|
value: fundamentals?.sharesOutstanding,
|
|
634
737
|
...(receipt ? { unit: "ADR equivalent" } : {}),
|
|
635
738
|
},
|
|
739
|
+
...(fundamentals?.sharesOutstanding != null && fundamentals.sharesOutstandingAsOf ? [{
|
|
740
|
+
label: "Shares Outstanding As Of", text: fundamentals.sharesOutstandingAsOf, value: fundamentals.sharesOutstandingAsOf, exportOnly: true,
|
|
741
|
+
}] : []),
|
|
636
742
|
];
|
|
637
743
|
}
|
|
638
744
|
|
|
@@ -651,10 +757,12 @@ function floatAndShortInterestMetrics(
|
|
|
651
757
|
const days = fundamentals?.shortRatio;
|
|
652
758
|
const date = fundamentals?.shortInterestDate;
|
|
653
759
|
const receipt = finite(float) && sharesOutstandingInReceipts(quote, fundamentals, profile?.description);
|
|
760
|
+
const floatAsOf = finite(float) && float > 0 ? fundamentals?.floatSharesAsOf : undefined;
|
|
654
761
|
return [
|
|
655
762
|
finite(float) && float > 0
|
|
656
|
-
? { label: "Float", text:
|
|
763
|
+
? { label: "Float", text: datedCount(float, floatAsOf), value: float, ...(receipt ? { unit: "ADR equivalent" } : {}) }
|
|
657
764
|
: { label: "Float", text: "—" },
|
|
765
|
+
...floatAsOf ? [{ label: "Float As Of", text: floatAsOf, value: floatAsOf, exportOnly: true }] : [],
|
|
658
766
|
finite(short)
|
|
659
767
|
? { label: "Short Interest", text: `${formatCompact(short)}${date ? ` (settled ${date})` : ""}`, value: short, unit: "shares" }
|
|
660
768
|
: { label: "Short Interest", text: "—" },
|
|
@@ -671,7 +779,7 @@ function metricLines(metrics: readonly FundamentalsMetric[]): Array<[string, str
|
|
|
671
779
|
const TRAILING_MONEY_METRICS = new Set(["EPS (TTM)", "Revenue (TTM)", "Net Income (TTM)", "Operating Cash Flow (TTM)", "Free Cash Flow (TTM)"]);
|
|
672
780
|
|
|
673
781
|
/**
|
|
674
|
-
* The notes under shown fundamentals: a market cap
|
|
782
|
+
* The notes under shown fundamentals: a market cap shown as the share count times the price and the provider's, how a labelled or
|
|
675
783
|
* withdrawn EV compares with market cap + debt - cash, what a converted TTM block was converted from, an EPS in
|
|
676
784
|
* another currency than the amounts beside it, and what a P/E on such an EPS divides. `priced` is the snapshot at
|
|
677
785
|
* the regular session price (atRegularSessionPrice), the figures the lines show, so each note reads those.
|
|
@@ -683,21 +791,24 @@ function fundamentalsNotes(
|
|
|
683
791
|
): string[] {
|
|
684
792
|
const fundamentals = priced.fundamentals;
|
|
685
793
|
const shown = (label: string) => metrics.some((metric) => metric.label === label && metric.text !== "—");
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
794
|
+
// The cap shown is the share count times the price where the provider's sits more than 2% from it; the note names the provider's.
|
|
795
|
+
const shareBasis = shown("Market Cap")
|
|
796
|
+
? marketCapBasisNote(viewMarketCapitalization(priced.quote, fundamentals, regularSessionValuationPrice(priced.quote)))
|
|
689
797
|
: undefined;
|
|
690
798
|
const conversion = [...TRAILING_MONEY_METRICS].some(shown) ? ttmConversionNote(fundamentals) : undefined;
|
|
691
799
|
const eps = shown("EPS (TTM)") ? epsConversionNote(fundamentals) : undefined;
|
|
692
800
|
const priceEarnings = metrics.some((metric) => metric.label === "P/E (TTM)" && typeof metric.value === "number")
|
|
693
801
|
? convertedPriceEarningsNote(fundamentals, quoteCurrency)
|
|
694
802
|
: undefined;
|
|
695
|
-
|
|
803
|
+
// Why the EV is labelled, withdrawn or N/M; for an insurer's, what Gloom Cloud computed it from.
|
|
804
|
+
const enterpriseValue = shown("Enterprise Value")
|
|
805
|
+
? enterpriseValueReconciliationNote(fundamentals) ?? computedEnterpriseValueNote(fundamentals)
|
|
806
|
+
: undefined;
|
|
696
807
|
return [shareBasis, enterpriseValue, conversion, eps, priceEarnings].filter((note): note is string => !!note);
|
|
697
808
|
}
|
|
698
809
|
|
|
699
810
|
// The share count is the market cap's basis: the cap is the count times the price, or a note says why not.
|
|
700
|
-
const VALUATION_METRICS = new Set(["Market Cap", "Shares Outstanding", "Enterprise Value", "P/E (TTM)", "Forward P/E", "PEG", "EPS (TTM)"]);
|
|
811
|
+
const VALUATION_METRICS = new Set(["Market Cap", "Shares Outstanding", "Shares Outstanding As Of", "Enterprise Value", "P/E (TTM)", "Forward P/E", "PEG", "EPS (TTM)"]);
|
|
701
812
|
|
|
702
813
|
type FundamentalsReportData = TickerFinancials & {
|
|
703
814
|
symbol: string;
|
|
@@ -741,7 +852,7 @@ function fundFactsNote(
|
|
|
741
852
|
if (resolveTickerInstrumentKind(tickerFile, financials) !== "fund") return null;
|
|
742
853
|
return !exchange || isUsListingExchange(exchange)
|
|
743
854
|
? `Fund facts (fee, NAV, premium, net assets): fn ETF ${symbol}.`
|
|
744
|
-
:
|
|
855
|
+
: US_FUND_FACTS_ONLY;
|
|
745
856
|
}
|
|
746
857
|
|
|
747
858
|
/**
|
|
@@ -797,7 +908,7 @@ function fundamentalsReportMetrics(snapshot: FundamentalsReportData, view: "fund
|
|
|
797
908
|
const financials = atRegularSessionPrice(snapshot);
|
|
798
909
|
const quote = financials.quote;
|
|
799
910
|
const fundamentals = financials.fundamentals;
|
|
800
|
-
const capitalization =
|
|
911
|
+
const capitalization = viewMarketCapitalization(quote, fundamentals, regularSessionValuationPrice(quote));
|
|
801
912
|
const marketCap: MetricFigure = capitalization
|
|
802
913
|
? { text: `${formatCompact(capitalization.value)} ${capitalization.currency}`, value: capitalization.value, unit: capitalization.currency }
|
|
803
914
|
: { text: "—" };
|
|
@@ -809,13 +920,14 @@ function fundamentalsReportMetrics(snapshot: FundamentalsReportData, view: "fund
|
|
|
809
920
|
}
|
|
810
921
|
const valued = metrics.filter(({ label, text }) => (VALUATION_METRICS.has(label) || isYieldMetric(label)) && text !== "—");
|
|
811
922
|
// The share count follows the market cap it is the basis of.
|
|
812
|
-
const
|
|
813
|
-
const
|
|
923
|
+
const isShares = (label: string) => label === "Shares Outstanding" || label === "Shares Outstanding As Of";
|
|
924
|
+
const shares = valued.filter((metric) => isShares(metric.label));
|
|
925
|
+
const valuation = valued.flatMap((metric) => isShares(metric.label) ? [] : metric.label === "Market Cap" ? [metric, ...shares] : [metric]);
|
|
814
926
|
// A listing with no valuation (a fund) says so rather than printing its price alone.
|
|
815
927
|
return valuation.length === 0 ? [] : [...valuationPriceMetrics(financials).filter((metric) => metric.text !== "—"), ...valuation];
|
|
816
928
|
}
|
|
817
929
|
|
|
818
|
-
/** Text for `
|
|
930
|
+
/** Text for `gloom fundamentals` and `gloom valuation`: the ticker report's fundamentals without the rest. */
|
|
819
931
|
export function renderFundamentalsReport(
|
|
820
932
|
financials: FundamentalsReportData,
|
|
821
933
|
view: "fundamentals" | "valuation",
|
|
@@ -851,7 +963,7 @@ export function renderFundamentalsReport(
|
|
|
851
963
|
} else if (financials.bankNote) {
|
|
852
964
|
lines.push("", renderSection("Bank"), cliStyles.muted(financials.bankNote));
|
|
853
965
|
}
|
|
854
|
-
|
|
966
|
+
appendDescription(lines, profile);
|
|
855
967
|
}
|
|
856
968
|
return lines.join("\n");
|
|
857
969
|
}
|
|
@@ -898,6 +1010,10 @@ export function fundamentalsReportTables(
|
|
|
898
1010
|
{ label: "Sector", value: profile?.sector },
|
|
899
1011
|
{ label: "Industry", value: profile?.industry },
|
|
900
1012
|
{ label: "Description", value: profile?.description?.trim() },
|
|
1013
|
+
...profile?.description?.trim() && profile.descriptionSource ? [
|
|
1014
|
+
{ label: "Description Source", value: profile.descriptionSource.publisher },
|
|
1015
|
+
{ label: "Description URL", value: profile.descriptionSource.url },
|
|
1016
|
+
] : [],
|
|
901
1017
|
].filter((entry) => typeof entry.value === "string" && entry.value.trim().length > 0)));
|
|
902
1018
|
}
|
|
903
1019
|
return {
|
|
@@ -944,13 +1060,20 @@ export async function buildTickerReport({
|
|
|
944
1060
|
recentSecFilings = [],
|
|
945
1061
|
hiddenSecFilings = NOTHING_HIDDEN,
|
|
946
1062
|
futuresContract = null,
|
|
1063
|
+
usdPerMmbtu = null,
|
|
947
1064
|
distributions = null,
|
|
948
1065
|
statementFilings = null,
|
|
949
1066
|
bondFund = null,
|
|
1067
|
+
memberships,
|
|
1068
|
+
offerings = [],
|
|
950
1069
|
}: {
|
|
951
1070
|
symbol: string;
|
|
1071
|
+
/** The lists holding the company, by any of its listings (loadCompanyMemberships); the saved listing's own lists when absent. */
|
|
1072
|
+
memberships?: CompanyMemberships;
|
|
952
1073
|
/** The filings behind the latest statements, and a newer quarter's results release. */
|
|
953
1074
|
statementFilings?: StatementFilingsReport | null;
|
|
1075
|
+
/** The company's latest offering prospectuses (424B5, 424B4); those after the latest balance sheet get a note. */
|
|
1076
|
+
offerings?: readonly OfferingFiling[];
|
|
954
1077
|
/** A bond fund's SEC yield, yield to worst and duration (loadReportBondFacts). */
|
|
955
1078
|
bondFund?: FundBondFacts | null;
|
|
956
1079
|
/** The distributions a dividend yield is read with (loadDividendDistributions). */
|
|
@@ -959,6 +1082,8 @@ export async function buildTickerReport({
|
|
|
959
1082
|
listingExchange?: string;
|
|
960
1083
|
/** A futures symbol's contract terms and latest confirmed settlement. */
|
|
961
1084
|
futuresContract?: FuturesContractTermsPayload | null;
|
|
1085
|
+
/** A per-MWh gas price (Dutch TTF) in dollars per MMBtu, at the day's rate. */
|
|
1086
|
+
usdPerMmbtu?: UsdPerMmbtu | null;
|
|
962
1087
|
tickerFile: TickerRecord | null;
|
|
963
1088
|
financials: TickerFinancials;
|
|
964
1089
|
config: AppConfig;
|
|
@@ -981,6 +1106,10 @@ export async function buildTickerReport({
|
|
|
981
1106
|
const baseQuoteOptions = quoteFormatOptions(quote, tickerFile?.metadata.assetCategory, financials.quoteMetadata?.instrumentType);
|
|
982
1107
|
const baseCurrency = config.baseCurrency.trim().toUpperCase();
|
|
983
1108
|
const codes = writesCurrencyCodes(config);
|
|
1109
|
+
const rates: ReportRateNotes = {
|
|
1110
|
+
noted: new Set(),
|
|
1111
|
+
boughtAt: boughtRateCurrencies(tickerFile, quote?.currency?.trim() || tickerFile?.metadata.currency?.trim() || "", config.baseCurrency),
|
|
1112
|
+
};
|
|
984
1113
|
// Pad money prices to the currency's minor unit so a range reads £35.10 - £35.485, never past it (JPY has none).
|
|
985
1114
|
const quoteOptions = withCurrencyMinorDigits(codes ? { ...baseQuoteOptions, currencyCode: true } : baseQuoteOptions, quote?.currency);
|
|
986
1115
|
const lines: string[] = [];
|
|
@@ -1014,15 +1143,21 @@ export async function buildTickerReport({
|
|
|
1014
1143
|
if (metadataParts.length > 0) {
|
|
1015
1144
|
lines.push(cliStyles.muted(metadataParts.join(METADATA_SEPARATOR)));
|
|
1016
1145
|
}
|
|
1146
|
+
// A receipt and its home line each state the ratio, and where the two are compared.
|
|
1147
|
+
const depositaryPair = listingDepositaryPair(financials);
|
|
1148
|
+
if (depositaryPair) {
|
|
1149
|
+
lines.push(cliStyles.muted(`ADR ratio ${depositaryPairText(depositaryPair, isReceiptSide(financials))}. Implied FX and premium: gloom fn ADR ${quote?.symbol ?? symbol}`));
|
|
1150
|
+
}
|
|
1017
1151
|
|
|
1018
|
-
|
|
1019
|
-
const
|
|
1152
|
+
// A list that holds the company as another of its listings says which: "Watchlists R (as RCI.B:TSX)".
|
|
1153
|
+
const lists = memberships ?? companyMemberships(config, tickerFile, [], null);
|
|
1154
|
+
const listNames = (held: readonly ListMembership[]) => held.map((list) => list.via ? `${list.name} (as ${list.via})` : list.name).join(", ");
|
|
1020
1155
|
const membershipParts = [
|
|
1021
|
-
|
|
1022
|
-
? `Portfolios ${
|
|
1156
|
+
lists.portfolios.length > 0
|
|
1157
|
+
? `Portfolios ${listNames(lists.portfolios)}`
|
|
1023
1158
|
: undefined,
|
|
1024
|
-
|
|
1025
|
-
? `Watchlists ${
|
|
1159
|
+
lists.watchlists.length > 0
|
|
1160
|
+
? `Watchlists ${listNames(lists.watchlists)}`
|
|
1026
1161
|
: undefined,
|
|
1027
1162
|
].filter((part): part is string => !!part);
|
|
1028
1163
|
if (membershipParts.length > 0) {
|
|
@@ -1031,15 +1166,18 @@ export async function buildTickerReport({
|
|
|
1031
1166
|
|
|
1032
1167
|
// Market cap and the multiples are measured at the regular session price the Quote section heads with.
|
|
1033
1168
|
const priced = atRegularSessionPrice(financials);
|
|
1034
|
-
const capitalization =
|
|
1169
|
+
const capitalization = viewMarketCapitalization(priced.quote, priced.fundamentals, regularSessionValuationPrice(priced.quote));
|
|
1035
1170
|
// Market cap and EV read in the currency they are reported in, as the revenue and income beside them do,
|
|
1036
1171
|
// with the base currency's figure after them when it differs: 627.2B USD (878.15B CAD).
|
|
1037
1172
|
const convertedCurrencies = new Set<string>();
|
|
1038
1173
|
const inBase = async (value: number, currency: string): Promise<string> => {
|
|
1039
|
-
|
|
1040
|
-
const
|
|
1174
|
+
// A minor unit converts as the hundredth of its currency it is: 2.75T GBp is 27.5B GBP, never 2.75T GBP.
|
|
1175
|
+
const unit = heldCurrencyUnit(currency);
|
|
1176
|
+
if (!unit.currency || (unit.currency === baseCurrency && unit.divisor === 1)) return "";
|
|
1177
|
+
const major = value / unit.divisor;
|
|
1178
|
+
const converted = unit.currency === baseCurrency ? major : await toBase(major, unit.currency);
|
|
1041
1179
|
if (!Number.isFinite(converted)) return "";
|
|
1042
|
-
convertedCurrencies.add(currency
|
|
1180
|
+
if (unit.currency !== baseCurrency) convertedCurrencies.add(unit.currency);
|
|
1043
1181
|
return ` (${formatCompact(converted)} ${baseCurrency})`;
|
|
1044
1182
|
};
|
|
1045
1183
|
const marketCapText = capitalization
|
|
@@ -1048,8 +1186,7 @@ export async function buildTickerReport({
|
|
|
1048
1186
|
// Shown in the same currency as the market cap, so the two can be compared.
|
|
1049
1187
|
const enterpriseValue = reportedEnterpriseValue(priced.fundamentals);
|
|
1050
1188
|
const evCurrency = enterpriseValueCurrency(quote, fundamentals);
|
|
1051
|
-
|
|
1052
|
-
const enterpriseValueText = `${formatReportedMoney(enterpriseValue, evCurrency)}${enterpriseValue != null && evCurrency && /^[A-Z]{3}$/.test(evCurrency)
|
|
1189
|
+
const enterpriseValueText = `${formatReportedMoney(enterpriseValue, evCurrency)}${enterpriseValue != null && evCurrency
|
|
1053
1190
|
? await inBase(enterpriseValue, evCurrency) : ""}`;
|
|
1054
1191
|
|
|
1055
1192
|
if (quote) {
|
|
@@ -1066,12 +1203,14 @@ export async function buildTickerReport({
|
|
|
1066
1203
|
// A futures price is its latest trade; the exchange settlement is its own row, dated by its session.
|
|
1067
1204
|
appendMetricSection(lines, "Quote", [
|
|
1068
1205
|
// A price in cents says what it is per: 314.95¢/lb.
|
|
1069
|
-
["Last", colorBySign(`${formatMarketPriceWithCurrency(session.price, quote.currency, quoteOptions)}${
|
|
1206
|
+
["Last", colorBySign(`${formatMarketPriceWithCurrency(session.price, quote.currency, quoteOptions)}${futuresPricePer(futuresContract, quote.currency)}`, session.change)],
|
|
1070
1207
|
...futuresContract
|
|
1071
|
-
? [["Settle",
|
|
1208
|
+
? [["Settle", quoteSettleText(quote, futuresContract)] as [string, string]]
|
|
1072
1209
|
: [],
|
|
1073
1210
|
// The move says what it is measured from: "vs Fri 16 Oct close", a future's "vs Fri 16 Oct settle".
|
|
1074
1211
|
["Change", quoteChangeText(quote, session, quoteOptions, futuresContract)],
|
|
1212
|
+
// European gas beside Henry Hub: "≈ $30.832/MMBtu at EUR/USD 1.1650", a conversion that says so.
|
|
1213
|
+
...usdPerMmbtu ? [["In USD", usdPerMmbtuText(usdPerMmbtu)] as [string, string]] : [],
|
|
1075
1214
|
["Open", quote.open != null ? formatMarketPriceWithCurrency(quote.open, quote.currency, quoteOptions) : "—"],
|
|
1076
1215
|
// A listing that no longer trades: its last session's range, never today's.
|
|
1077
1216
|
[quote.delisting ? "Last Session" : "Day Range", quote.low != null || quote.high != null
|
|
@@ -1096,10 +1235,23 @@ export async function buildTickerReport({
|
|
|
1096
1235
|
|
|
1097
1236
|
const metrics = fundamentalsMetrics(quote, priced.fundamentals, profile, { text: marketCapText }, priceReturns, fundamentalsCurrency(financials),
|
|
1098
1237
|
{ text: enterpriseValueText }, distributions, bondFund, codes);
|
|
1238
|
+
const reportedCurrency = financials.financialCurrency?.trim();
|
|
1239
|
+
const statements = [...financials.annualStatements, ...financials.quarterlyStatements];
|
|
1240
|
+
const fallbackCurrency = reportedCurrency && statements.every((row) => !row.currency?.trim() || row.currency.trim() === reportedCurrency)
|
|
1241
|
+
? reportedCurrency : undefined;
|
|
1242
|
+
const statementCurrency = (row: FinancialStatement) => row.currency?.trim() || fallbackCurrency;
|
|
1243
|
+
const latestAnnual = latestFinancialPeriod(financials.annualStatements, row => row.date);
|
|
1244
|
+
const latestQuarter = latestFinancialPeriod(financials.quarterlyStatements, row => row.date);
|
|
1245
|
+
|
|
1099
1246
|
const beforeFundamentals = lines.length;
|
|
1100
1247
|
appendMetricSection(lines, "Fundamentals", metricLines(metrics));
|
|
1101
1248
|
for (const note of fundamentalsNotes(priced, metrics, quote?.currency)) lines.push(cliStyles.muted(note));
|
|
1102
|
-
|
|
1249
|
+
// The trailing block beside statements in another currency, when no conversion says why.
|
|
1250
|
+
const split = metrics.some((metric) => TRAILING_MONEY_METRICS.has(metric.label) && metric.text !== "—")
|
|
1251
|
+
? ttmCurrencySplitNote(priced.fundamentals, [latestAnnual, latestQuarter].flatMap((row) => row ? [statementCurrency(row)] : []))
|
|
1252
|
+
: undefined;
|
|
1253
|
+
if (split) lines.push(cliStyles.muted(split));
|
|
1254
|
+
if (lines.length > beforeFundamentals) for (const note of conversionNotes(toBase, convertedCurrencies, rates)) lines.push(cliStyles.muted(note));
|
|
1103
1255
|
// Where a fund's facts would go: under its fundamentals, or in their place.
|
|
1104
1256
|
const fund = fundFactsNote(quote?.symbol ?? symbol,
|
|
1105
1257
|
quote?.tradingExchangeName || listingExchange || quote?.listingExchangeName || quote?.exchangeName || tickerFile?.metadata.exchange, financials, tickerFile);
|
|
@@ -1109,26 +1261,24 @@ export async function buildTickerReport({
|
|
|
1109
1261
|
lines.push(cliStyles.muted(`Market cap: ${describeFundamentalMarketCap(capitalization.provenance)}.`));
|
|
1110
1262
|
}
|
|
1111
1263
|
|
|
1112
|
-
const reportedCurrency = financials.financialCurrency?.trim();
|
|
1113
|
-
const statements = [...financials.annualStatements, ...financials.quarterlyStatements];
|
|
1114
|
-
const fallbackCurrency = reportedCurrency && statements.every((row) => !row.currency?.trim() || row.currency.trim() === reportedCurrency)
|
|
1115
|
-
? reportedCurrency : undefined;
|
|
1116
|
-
const statementCurrency = (row: FinancialStatement) => row.currency?.trim() || fallbackCurrency;
|
|
1117
|
-
const latestAnnual = latestFinancialPeriod(financials.annualStatements, row => row.date);
|
|
1118
1264
|
if (latestAnnual) {
|
|
1119
1265
|
appendMetricSection(lines, `Latest Annual (${statementPeriodText(latestAnnual.date, statementFilings?.latestAnnual ?? null)})`,
|
|
1120
1266
|
buildStatementMetrics(latestAnnual, statementCurrency(latestAnnual), codes));
|
|
1121
1267
|
}
|
|
1122
1268
|
|
|
1123
|
-
const latestQuarter = latestFinancialPeriod(financials.quarterlyStatements, row => row.date);
|
|
1124
1269
|
if (latestQuarter) {
|
|
1270
|
+
const runway = cashRunway(financials);
|
|
1125
1271
|
appendMetricSection(lines, `Latest Quarter (${statementPeriodText(latestQuarter.date, statementFilings?.latestQuarter ?? null)})`,
|
|
1126
|
-
buildStatementMetrics(latestQuarter, statementCurrency(latestQuarter), codes));
|
|
1272
|
+
buildStatementMetrics(latestQuarter, statementCurrency(latestQuarter), codes, runway));
|
|
1273
|
+
// How the months are counted, and an offering since the balance sheet that the cash does not include yet.
|
|
1274
|
+
if (burnsCash(runway)) lines.push(cliStyles.muted(runwayMethod(runway.includesShortTerm)));
|
|
1275
|
+
const offering = runway ? offeringNote(offeringsAfter(offerings, runway.periodEnd), runway.periodEnd) : null;
|
|
1276
|
+
if (offering) lines.push(cliStyles.muted(offering));
|
|
1127
1277
|
}
|
|
1128
1278
|
// The statements stop a quarter short of the results the company has released.
|
|
1129
1279
|
if (statementFilings?.resultsRelease && (latestAnnual || latestQuarter)) lines.push(cliStyles.muted(resultsReleaseText(statementFilings.resultsRelease)));
|
|
1130
1280
|
|
|
1131
|
-
|
|
1281
|
+
appendDescription(lines, profile);
|
|
1132
1282
|
|
|
1133
1283
|
appendTextSection(lines, "Notes", notes, true);
|
|
1134
1284
|
|
|
@@ -1143,7 +1293,7 @@ export async function buildTickerReport({
|
|
|
1143
1293
|
],
|
|
1144
1294
|
body: item.summary,
|
|
1145
1295
|
link: item.url,
|
|
1146
|
-
})));
|
|
1296
|
+
})), recentNews[0]?.searchedFor ? coinNewsFallbackNotice(symbol, recentNews[0].searchedFor) : null);
|
|
1147
1297
|
|
|
1148
1298
|
appendFeedSection(lines, "Recent SEC Filings", recentSecFilings.map((filing) => ({
|
|
1149
1299
|
title: (() => {
|
|
@@ -1159,7 +1309,7 @@ export async function buildTickerReport({
|
|
|
1159
1309
|
link: filing.filingUrl,
|
|
1160
1310
|
})), hiddenFilingsNote(hiddenSecFilings));
|
|
1161
1311
|
|
|
1162
|
-
await appendTickerPositions(lines, tickerFile, quote, config, toBase);
|
|
1312
|
+
await appendTickerPositions(lines, tickerFile, quote, config, toBase, rates);
|
|
1163
1313
|
|
|
1164
1314
|
return lines.join("\n");
|
|
1165
1315
|
}
|
|
@@ -1175,15 +1325,22 @@ function buildTickerStructuredData({
|
|
|
1175
1325
|
recentSecFilings,
|
|
1176
1326
|
hiddenSecFilings,
|
|
1177
1327
|
futuresContract,
|
|
1328
|
+
usdPerMmbtu = null,
|
|
1178
1329
|
distributions,
|
|
1179
1330
|
statementFilings,
|
|
1180
1331
|
bondFund = null,
|
|
1332
|
+
memberships,
|
|
1333
|
+
offerings = [],
|
|
1181
1334
|
}: {
|
|
1182
1335
|
symbol: string;
|
|
1183
1336
|
listing: CliListing;
|
|
1337
|
+
memberships: CompanyMemberships;
|
|
1184
1338
|
statementFilings: StatementFilingsReport | null;
|
|
1339
|
+
offerings?: readonly OfferingFiling[];
|
|
1185
1340
|
bondFund?: FundBondFacts | null;
|
|
1186
1341
|
futuresContract: FuturesContractTermsPayload | null;
|
|
1342
|
+
/** A per-MWh gas price in dollars per MMBtu, and the rate it was converted at. */
|
|
1343
|
+
usdPerMmbtu?: UsdPerMmbtu | null;
|
|
1187
1344
|
distributions: DividendDistributions | null;
|
|
1188
1345
|
tickerFile: TickerRecord | null;
|
|
1189
1346
|
financials: TickerFinancials;
|
|
@@ -1198,6 +1355,7 @@ function buildTickerStructuredData({
|
|
|
1198
1355
|
const identity = listingIdentity(listing, quote);
|
|
1199
1356
|
// Market cap and the multiples at the regular session price, as the text report gives them.
|
|
1200
1357
|
const priced = atRegularSessionPrice(financials);
|
|
1358
|
+
const runway = cashRunway(financials);
|
|
1201
1359
|
return {
|
|
1202
1360
|
symbol,
|
|
1203
1361
|
listing: { symbol: identity.symbol, exchange: identity.exchange || null, name: identity.name },
|
|
@@ -1223,8 +1381,11 @@ function buildTickerStructuredData({
|
|
|
1223
1381
|
lastUpdated: quote.lastUpdated ? new Date(quote.lastUpdated).toISOString() : "",
|
|
1224
1382
|
} : null,
|
|
1225
1383
|
quoteMetadata: financials.quoteMetadata,
|
|
1384
|
+
// The receipt pair the listing is a side of, and which side.
|
|
1385
|
+
...depositaryPairJson(financials),
|
|
1226
1386
|
// Only for futures: the contract the symbol prices, its terms and its latest confirmed settlement.
|
|
1227
1387
|
...futuresContract ? { futuresContract } : {},
|
|
1388
|
+
...usdPerMmbtu ? { usdPerMmbtu } : {},
|
|
1228
1389
|
ticker: tickerFile ? {
|
|
1229
1390
|
ticker: tickerFile.metadata.ticker,
|
|
1230
1391
|
name: tickerFile.metadata.name ?? "",
|
|
@@ -1236,6 +1397,8 @@ function buildTickerStructuredData({
|
|
|
1236
1397
|
watchlists: formatWatchlistNames(config, tickerFile.metadata.watchlists),
|
|
1237
1398
|
positions: tickerFile.metadata.positions,
|
|
1238
1399
|
} : null,
|
|
1400
|
+
// The lists holding the company by any of its listings; `via` names the other listing a list holds it as.
|
|
1401
|
+
memberships,
|
|
1239
1402
|
fundamentals: financials.fundamentals || priceReturns.return1Y != null || priceReturns.return3Y != null ? exportedDividendFundamentals(exportedFundamentals({
|
|
1240
1403
|
...priced.fundamentals,
|
|
1241
1404
|
...priceReturns,
|
|
@@ -1249,6 +1412,10 @@ function buildTickerStructuredData({
|
|
|
1249
1412
|
latestQuarter: latestFinancialPeriod(financials.quarterlyStatements, row => row.date) ?? null,
|
|
1250
1413
|
annualStatementCount: financials.annualStatements.length,
|
|
1251
1414
|
quarterlyStatementCount: financials.quarterlyStatements.length,
|
|
1415
|
+
// Months of cash at the latest quarter's balance sheet, at its operating burn and the trailing year's,
|
|
1416
|
+
// and the offering prospectuses filed since that the cash does not include.
|
|
1417
|
+
cashRunway: runway,
|
|
1418
|
+
offeringsAfterBalanceSheet: runway ? offeringsAfter(offerings, runway.periodEnd) : [],
|
|
1252
1419
|
// The form and filed date of the latest periods' filings, and a newer quarter's results released before its statements.
|
|
1253
1420
|
statementFilings,
|
|
1254
1421
|
notes,
|
|
@@ -1276,6 +1443,13 @@ function buildTickerStructuredData({
|
|
|
1276
1443
|
};
|
|
1277
1444
|
}
|
|
1278
1445
|
|
|
1446
|
+
function depositaryPairJson(financials: TickerFinancials) {
|
|
1447
|
+
const pair = listingDepositaryPair(financials);
|
|
1448
|
+
if (!pair) return {};
|
|
1449
|
+
const receipt = isReceiptSide(financials);
|
|
1450
|
+
return { depositaryPair: { ...pair, side: receipt ? "receipt" : "home", text: depositaryPairText(pair, receipt) } };
|
|
1451
|
+
}
|
|
1452
|
+
|
|
1279
1453
|
const QUOTE_UNAVAILABLE = "Quote unavailable.";
|
|
1280
1454
|
|
|
1281
1455
|
/** Asks for the quote the report lacks once more, for the reason the data service gave when it had none. */
|
|
@@ -1368,6 +1542,17 @@ export async function ticker(symbol: string, dependencies: TickerCommandDependen
|
|
|
1368
1542
|
quarter: latestFinancialPeriod(resolvedFinancials.quarterlyStatements, (row) => row.date),
|
|
1369
1543
|
annual: latestFinancialPeriod(resolvedFinancials.annualStatements, (row) => row.date),
|
|
1370
1544
|
});
|
|
1545
|
+
// A list holding the company as another of its listings counts (a list of RCI.B:TSX holds RCI); read beside the rest. It never fails.
|
|
1546
|
+
const membershipsLoad = loadCompanyMemberships({
|
|
1547
|
+
config,
|
|
1548
|
+
own: tickerFile,
|
|
1549
|
+
symbol: listing.symbol,
|
|
1550
|
+
exchange: canonicalExchange(listing.exchange || quote?.listingExchangeName || quote?.exchangeName || tickerFile?.metadata.exchange),
|
|
1551
|
+
loadTickers: () => store.loadAllTickers(),
|
|
1552
|
+
dataProvider,
|
|
1553
|
+
});
|
|
1554
|
+
// An offering since the latest balance sheet, read only when the report has a runway to flag.
|
|
1555
|
+
const offerings = loadOfferingFilings(statementSources, { symbol: requestSymbol, exchange }, cashRunway(resolvedFinancials) != null);
|
|
1371
1556
|
const [notesResult, newsResult, secFilingsResult] = await Promise.allSettled([
|
|
1372
1557
|
notesFiles.load(tickerFile?.metadata.ticker ?? normalized),
|
|
1373
1558
|
dataProvider.getNews({
|
|
@@ -1378,6 +1563,10 @@ export async function ticker(symbol: string, dependencies: TickerCommandDependen
|
|
|
1378
1563
|
exchange: exchange || quote?.exchangeName || "",
|
|
1379
1564
|
tickerTier: "primary",
|
|
1380
1565
|
limit: NEWS_ITEM_LIMIT,
|
|
1566
|
+
// A coin pair with no story filed under it searches for the coin by this name.
|
|
1567
|
+
...(isRoundTheClockCoin(requestSymbol, exchange || quote?.exchangeName) && (quote?.name || tickerFile?.metadata.name)
|
|
1568
|
+
? { listingName: quote?.name || tickerFile?.metadata.name }
|
|
1569
|
+
: {}),
|
|
1381
1570
|
}),
|
|
1382
1571
|
// Outside the US the lookup checks the SEC registrant against the listing's company,
|
|
1383
1572
|
// and refuses another company's filings.
|
|
@@ -1388,6 +1577,9 @@ export async function ticker(symbol: string, dependencies: TickerCommandDependen
|
|
|
1388
1577
|
]);
|
|
1389
1578
|
|
|
1390
1579
|
const futuresContract = await cliFuturesContract(quote?.symbol ?? requestSymbol, quote?.instrumentType, dependencies.futuresContract);
|
|
1580
|
+
// A per-MWh gas price (TTF) adds its dollars per MMBtu at the day's rate, to read beside Henry Hub.
|
|
1581
|
+
const usdPerMmbtu = await loadUsdPerMmbtu(getRegularSessionDisplay(quote)?.price, futuresContract, quote?.currency,
|
|
1582
|
+
(currency) => dataProvider.getExchangeRate(currency));
|
|
1391
1583
|
const notes = notesResult.status === "fulfilled" ? notesResult.value : "";
|
|
1392
1584
|
const recentNews = newsResult.status === "fulfilled" ? newsResult.value : [];
|
|
1393
1585
|
const { filings: recentSecFilings, hidden: hiddenSecFilings } = secFilingsResult.status === "fulfilled"
|
|
@@ -1401,8 +1593,12 @@ export async function ticker(symbol: string, dependencies: TickerCommandDependen
|
|
|
1401
1593
|
const coinNote = listing.exchange ? null
|
|
1402
1594
|
: notTheCoinNote(listing.symbol, quote ?? (tickerFile ? { name: tickerFile.metadata.name, instrumentType: tickerFile.metadata.assetCategory } : null));
|
|
1403
1595
|
const listingNote = [choiceNote, coinNote].filter((note): note is string => !!note).join("\n") || undefined;
|
|
1596
|
+
const memberships = await membershipsLoad;
|
|
1597
|
+
// A converted TTM block at the rate the rest of the report converts at, the one `fx` reports.
|
|
1598
|
+
const shownFinancials = await atReportTtmRate(resolvedFinancials, toBase);
|
|
1404
1599
|
if (dependencies.printResult) {
|
|
1405
|
-
const
|
|
1600
|
+
const newsNote = recentNews[0]?.searchedFor ? coinNewsFallbackNotice(requestSymbol, recentNews[0].searchedFor) : null;
|
|
1601
|
+
const warnings = [choiceNote, coinNote, quoteNote, newsNote].filter((note): note is string => !!note);
|
|
1406
1602
|
dependencies.printResult({
|
|
1407
1603
|
freshness,
|
|
1408
1604
|
warnings: warnings.length > 0 ? warnings : undefined,
|
|
@@ -1410,16 +1606,19 @@ export async function ticker(symbol: string, dependencies: TickerCommandDependen
|
|
|
1410
1606
|
symbol: normalized,
|
|
1411
1607
|
listing,
|
|
1412
1608
|
tickerFile,
|
|
1413
|
-
financials:
|
|
1609
|
+
financials: shownFinancials,
|
|
1414
1610
|
config,
|
|
1415
1611
|
notes,
|
|
1416
1612
|
recentNews,
|
|
1417
1613
|
recentSecFilings,
|
|
1418
1614
|
hiddenSecFilings,
|
|
1419
1615
|
futuresContract,
|
|
1616
|
+
usdPerMmbtu,
|
|
1420
1617
|
distributions: await distributions,
|
|
1421
1618
|
statementFilings: await statementFilings,
|
|
1422
1619
|
bondFund: await bondFund,
|
|
1620
|
+
memberships,
|
|
1621
|
+
offerings: await offerings,
|
|
1423
1622
|
}),
|
|
1424
1623
|
});
|
|
1425
1624
|
return;
|
|
@@ -1429,7 +1628,7 @@ export async function ticker(symbol: string, dependencies: TickerCommandDependen
|
|
|
1429
1628
|
symbol: normalized,
|
|
1430
1629
|
listingExchange: listing.exchange,
|
|
1431
1630
|
tickerFile,
|
|
1432
|
-
financials:
|
|
1631
|
+
financials: shownFinancials,
|
|
1433
1632
|
config,
|
|
1434
1633
|
toBase,
|
|
1435
1634
|
notes,
|
|
@@ -1439,10 +1638,13 @@ export async function ticker(symbol: string, dependencies: TickerCommandDependen
|
|
|
1439
1638
|
recentSecFilings,
|
|
1440
1639
|
hiddenSecFilings,
|
|
1441
1640
|
futuresContract,
|
|
1641
|
+
usdPerMmbtu,
|
|
1442
1642
|
distributions: await distributions,
|
|
1443
1643
|
statementFilings: await statementFilings,
|
|
1444
1644
|
bondFund: await bondFund,
|
|
1645
|
+
memberships,
|
|
1646
|
+
offerings: await offerings,
|
|
1445
1647
|
}));
|
|
1446
|
-
if (freshness) console.log(`\n${cliFreshnessFooter(freshness)}`);
|
|
1648
|
+
if (freshness) console.log(`\n${cliFreshnessFooter(freshness, quote ?? resolvedFinancials)}`);
|
|
1447
1649
|
});
|
|
1448
1650
|
}
|