gloomberb 0.18.3 → 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/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 +84 -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 +22 -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 +21 -4
- 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/themes.ts +7 -1
- package/src/api-client/types.ts +90 -2
- 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/star-prompt/status-line.tsx +2 -2
- package/src/architecture/core-builtin-allowlist.json +5 -2
- 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 +1117 -264
- 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 +192 -47
- 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 +19 -13
- 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 +24 -18
- package/src/cli/known-gaps.ts +118 -25
- package/src/cli/listing-arg.ts +300 -41
- package/src/cli/name-entries.ts +30 -18
- 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 +75 -20
- package/src/cli/pane-functions/catalog.ts +24 -23
- package/src/cli/pane-functions/discovery.ts +1 -1
- package/src/cli/pane-functions/dom.ts +10 -7
- 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 +24 -11
- package/src/cli/pane-functions/index.ts +18 -16
- 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 +47 -10
- 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 +61 -16
- package/src/cli/restore-plugins.ts +29 -14
- package/src/cli/result.ts +111 -22
- 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 +198 -68
- 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 +373 -16
- package/src/components/chart/composite/interactions.ts +7 -2
- 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 +305 -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 +13 -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/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/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 +12 -6
- package/src/components/layout/header.tsx +7 -6
- 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/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/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 +29 -12
- package/src/i18n/ja.ts +29 -12
- package/src/i18n/ko.ts +29 -12
- package/src/i18n/zh-cn.ts +29 -12
- package/src/i18n/zh-tw.ts +29 -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 +29 -19
- 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 +107 -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 +76 -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 +97 -36
- package/src/plugins/builtin/attention/pane.tsx +6 -2
- 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 +6 -3
- 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 +22 -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 +110 -23
- package/src/plugins/builtin/broker-trading/ticket-parts.tsx +36 -7
- package/src/plugins/builtin/broker-trading/ticket.tsx +112 -31
- 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 +25 -12
- 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/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 +6 -8
- 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 +127 -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 +11 -4
- package/src/plugins/builtin/company-attention/app-rank.tsx +7 -5
- 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 +79 -23
- 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 +1 -1
- 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 +5 -3
- 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 +3 -2
- 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/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/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 +18 -11
- 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 +68 -6
- package/src/plugins/builtin/equity-screener/live.ts +1 -1
- package/src/plugins/builtin/equity-screener/model.ts +6 -0
- package/src/plugins/builtin/equity-screener/pane.tsx +45 -10
- 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 +6 -1
- 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/headless.ts +9 -4
- 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 +13 -1
- package/src/plugins/builtin/holders/format.ts +28 -17
- package/src/plugins/builtin/holders/headless.ts +46 -7
- 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/treemap.tsx +2 -2
- package/src/plugins/builtin/insider/headless.ts +1 -1
- package/src/plugins/builtin/insider/signals-client.ts +1 -1
- package/src/plugins/builtin/insider/signals.tsx +1 -1
- 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/headless.ts +4 -4
- 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 +10 -4
- 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 +33 -19
- 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 +29 -8
- 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 +49 -14
- package/src/plugins/builtin/openfda/pane.tsx +1 -1
- package/src/plugins/builtin/options/carry.ts +2 -2
- package/src/plugins/builtin/options/index.tsx +1 -1
- package/src/plugins/builtin/options/view.tsx +10 -10
- package/src/plugins/builtin/options-calculator/headless.ts +46 -7
- package/src/plugins/builtin/options-scenario/client.ts +123 -28
- 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 +36 -15
- 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 +9 -5
- 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 +143 -59
- package/src/plugins/builtin/portfolio-list/cli/bulk-symbols.ts +72 -24
- 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 +4 -1
- 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 +8 -1
- 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/model.ts +6 -2
- package/src/plugins/builtin/risk-factors/index.tsx +2 -2
- package/src/plugins/builtin/scanner/lock-note.ts +1 -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 +2 -1
- 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-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 +21 -0
- package/src/plugins/builtin/shared/series-cache.ts +2 -0
- package/src/plugins/builtin/shared/ticker-surface.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/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 +5 -4
- package/src/plugins/builtin/vol-surface/headless.ts +12 -3
- package/src/plugins/builtin/vol-surface/model.ts +4 -2
- 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/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/styles.css +76 -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/desktop/backend-requests.ts +3 -0
- package/src/renderers/electrobun/bun/desktop/backend.ts +46 -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/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 +5 -5
- package/src/renderers/electrobun/view/remote/asset-data-client.ts +1 -1
- 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 +1 -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 +32 -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/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 +17 -4
- 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 +210 -33
- package/src/tickers/index-roots.ts +47 -0
- package/src/tickers/instrument-label.ts +5 -1
- 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 +14 -0
- package/src/types/exchange-rate.ts +6 -0
- package/src/types/financials.ts +104 -7
- package/src/types/headless.ts +76 -6
- package/src/types/instrument.ts +3 -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/index.ts +10 -5
- 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-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 +3 -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,12 +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 {
|
|
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";
|
|
39
45
|
import { currencyCodeLabel, heldCurrencyUnit } from "../../utils/currency-units";
|
|
40
46
|
import { quotedFxPair } from "../../utils/currency-pair";
|
|
41
47
|
import type { AppConfig } from "../../types/config";
|
|
42
|
-
import type { DeclaredDividendAction, FinancialStatement, Quote, TickerFinancials } from "../../types/financials";
|
|
48
|
+
import type { CompanyProfile, DeclaredDividendAction, FinancialStatement, Quote, TickerFinancials } from "../../types/financials";
|
|
43
49
|
import { atRegularSessionPrice, regularSessionValuationPrice } from "../../market-data/quotes/regular-session-valuation";
|
|
44
50
|
import { computeTickerPriceReturns } from "../../market-data/ticker-price-returns";
|
|
45
51
|
import { instrumentTypeLabel, resolveTickerInstrumentKind } from "../../tickers/instrument-kind";
|
|
@@ -50,7 +56,7 @@ import type { TickerRecord } from "../../types/ticker";
|
|
|
50
56
|
import type { CliCommandContext } from "../../types/plugin";
|
|
51
57
|
import { getPortfolioPositionMetrics, getPortfolioQuoteDisplay, lotCostFxRate, resolvePortfolioMarketValue, resolvePortfolioPositionPnl } from "../../portfolio/position-metrics";
|
|
52
58
|
import { isFuturesTicker } from "../../portfolio/futures-positions";
|
|
53
|
-
import { createBaseConverter, type
|
|
59
|
+
import { createBaseConverter, type BaseConverter } from "../base-converter";
|
|
54
60
|
import { formatFxRate } from "../fx-pair";
|
|
55
61
|
import { initMarketData, withMarketData } from "../context";
|
|
56
62
|
import { fail } from "../errors";
|
|
@@ -66,7 +72,7 @@ import {
|
|
|
66
72
|
quoteChangeText,
|
|
67
73
|
} from "../helpers";
|
|
68
74
|
import { NotesFiles } from "../../plugins/builtin/notes/files";
|
|
69
|
-
import { isKnownNonUsListing, secFilingItemCodes } from "../../utils/sec";
|
|
75
|
+
import { isKnownNonUsListing, secFilingItemCodes, US_FUND_FACTS_ONLY } from "../../utils/sec";
|
|
70
76
|
import { currentReportItemsLabel, hiddenFilingsNote, loadLatestFilings, type HiddenFilings } from "../../utils/sec-filings";
|
|
71
77
|
import { canonicalExchange, exchangeLabel, isKnownExchangeCode, isUsListingExchange } from "../../utils/exchanges";
|
|
72
78
|
import {
|
|
@@ -77,6 +83,7 @@ import { movedAwayChange } from "../../tickers/ticker-changes";
|
|
|
77
83
|
import { companyMemberships, loadCompanyMemberships, type CompanyMemberships, type ListMembership } from "../issuer-membership";
|
|
78
84
|
import { isNotATickerMessage } from "../not-a-ticker";
|
|
79
85
|
import { sharesOutstandingInReceipts } from "../../utils/depositary-receipt";
|
|
86
|
+
import { depositaryPairText, isReceiptSide, listingDepositaryPair } from "../../market-data/depositary-pair";
|
|
80
87
|
import { cliFreshnessFooter } from "../result";
|
|
81
88
|
import { providerMissReason } from "../../sources/provider-errors";
|
|
82
89
|
import { exportEntriesTable, reportFooterLines, type CliReportTables } from "../report-tables";
|
|
@@ -86,12 +93,14 @@ import { distributionHistory, forwardDividendBasis, forwardDividendMayHaveLapsed
|
|
|
86
93
|
import { declaredDividends } from "../../utils/declared-dividends";
|
|
87
94
|
import { historyTrailingDividendYield, measuresTrailingYield } from "../../market-data/quotes/live-valuation";
|
|
88
95
|
import { notTheCoinNote } from "./crypto-hints";
|
|
89
|
-
import { loadStatementFilings, resultsReleaseText, statementPeriodText, type StatementFilingsReport } from "../statement-filings";
|
|
96
|
+
import { loadOfferingFilings, loadStatementFilings, resultsReleaseText, statementPeriodText, type StatementFilingsReport } from "../statement-filings";
|
|
90
97
|
import type { BankFiguresPayload } from "../../api-client/bank-figures";
|
|
91
98
|
import { bankSection } from "../bank-section";
|
|
92
99
|
import type { FundBondFacts } from "../../api-client/fund-facts";
|
|
93
100
|
import { bondFigures, fetchFundBondFacts, NOT_SEC_YIELD } from "../../market-data/bond-funds";
|
|
94
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";
|
|
95
104
|
|
|
96
105
|
const NEWS_ITEM_LIMIT = 5;
|
|
97
106
|
const SEC_FILING_LIMIT = 5;
|
|
@@ -166,7 +175,16 @@ function wrapProse(text: string): string {
|
|
|
166
175
|
return wrapText(text, Math.min(cliTerminalWidth() ?? MAX_PROSE_WIDTH, MAX_PROSE_WIDTH)).join("\n");
|
|
167
176
|
}
|
|
168
177
|
|
|
169
|
-
|
|
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]> {
|
|
170
188
|
const money = (value: number | undefined, perShare = false) => formatReportedMoney(value, currency, perShare, codes);
|
|
171
189
|
return [
|
|
172
190
|
["Revenue", money(statement.totalRevenue)],
|
|
@@ -179,6 +197,9 @@ function buildStatementMetrics(statement: FinancialStatement, currency?: string,
|
|
|
179
197
|
["Operating Cash Flow", money(statement.operatingCashFlow)],
|
|
180
198
|
["Free Cash Flow", money(statement.freeCashFlow)],
|
|
181
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]] : [],
|
|
182
203
|
["Total Assets", money(statement.totalAssets)],
|
|
183
204
|
["Total Liabilities", money(statement.totalLiabilities)],
|
|
184
205
|
["Total Debt", money(statement.totalDebt)],
|
|
@@ -195,9 +216,15 @@ function buildStatementMetrics(statement: FinancialStatement, currency?: string,
|
|
|
195
216
|
* A receipt's count is its ordinary shares expressed in receipts, as its
|
|
196
217
|
* market cap is; the ordinary count follows when the service gives it.
|
|
197
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
|
+
|
|
198
224
|
function sharesOutstandingText(fundamentals: TickerFinancials["fundamentals"], inReceipts: boolean): string {
|
|
199
225
|
const shares = fundamentals?.sharesOutstanding;
|
|
200
|
-
if (shares == null
|
|
226
|
+
if (shares == null) return formatCompact(shares);
|
|
227
|
+
if (!inReceipts) return datedCount(shares, fundamentals?.sharesOutstandingAsOf);
|
|
201
228
|
const ordinary = fundamentals?.shareBasis === "depositary_receipt" ? fundamentals.underlyingOrdinaryShares : undefined;
|
|
202
229
|
return ordinary != null && Number.isFinite(ordinary) && ordinary > 0
|
|
203
230
|
? `${formatCompact(shares)} (ADR equivalent = ${formatCompact(ordinary)} ordinary shares)`
|
|
@@ -213,6 +240,19 @@ function appendTextSection(lines: string[], title: string, content: string | und
|
|
|
213
240
|
lines.push(verbatim ? text : wrapProse(text));
|
|
214
241
|
}
|
|
215
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
|
+
|
|
216
256
|
function appendFeedSection(
|
|
217
257
|
lines: string[],
|
|
218
258
|
title: string,
|
|
@@ -322,8 +362,9 @@ async function appendTickerPositions(lines: string[], tickerFile: TickerRecord |
|
|
|
322
362
|
const currentPrice = getPortfolioQuoteDisplay(metrics, quote)?.price ?? null;
|
|
323
363
|
const currentPriceBase = currentPrice != null && quoteCurrency ? await toBase(currentPrice, quoteCurrency) : null;
|
|
324
364
|
const positionRate = positionCurrency ? await toBase(1, positionCurrency) : Number.NaN;
|
|
325
|
-
|
|
326
|
-
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);
|
|
327
368
|
const baseMetrics = getPortfolioPositionMetrics({ ...tickerFile, metadata: { ...tickerFile.metadata, positions: [position] } }, undefined, quoteCurrency,
|
|
328
369
|
{ currency: config.baseCurrency, convert: value => value * positionRate }, quote);
|
|
329
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.
|
|
@@ -363,7 +404,34 @@ async function appendTickerPositions(lines: string[], tickerFile: TickerRecord |
|
|
|
363
404
|
}
|
|
364
405
|
|
|
365
406
|
/** The ticker report's converter: what `createBaseConverter` makes, whose rates a report states; a plain function in tests. */
|
|
366
|
-
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
|
+
}
|
|
367
435
|
|
|
368
436
|
/**
|
|
369
437
|
* A base currency other than USD reads every amount with its code (259.36
|
|
@@ -387,11 +455,11 @@ interface ReportRateNotes {
|
|
|
387
455
|
boughtAt: ReadonlySet<string>;
|
|
388
456
|
}
|
|
389
457
|
|
|
390
|
-
/** The currencies of the shown lots whose cost converts into the base currency at the rate they were bought at. */
|
|
458
|
+
/** The currencies of the shown lots whose cost converts into the base currency at the rate they were bought at, pence as GBP. */
|
|
391
459
|
function boughtRateCurrencies(tickerFile: TickerRecord | null, quoteCurrency: string, baseCurrency: string): Set<string> {
|
|
392
460
|
return new Set((tickerFile?.metadata.positions ?? []).flatMap((position) => {
|
|
393
461
|
const currency = (position.currency || quoteCurrency).trim();
|
|
394
|
-
return position.shares !== 0 && currency && lotCostFxRate(position, currency, baseCurrency) !== null ? [currency.
|
|
462
|
+
return position.shares !== 0 && currency && lotCostFxRate(position, currency, baseCurrency) !== null ? [heldCurrencyUnit(currency).currency] : [];
|
|
395
463
|
}));
|
|
396
464
|
}
|
|
397
465
|
|
|
@@ -442,9 +510,13 @@ function reportedMoney(value: number | undefined, currency: string | undefined,
|
|
|
442
510
|
return { text: formatReportedMoney(value, currency, perShare, codes), value, unit: currency?.trim() || "ccy?" };
|
|
443
511
|
}
|
|
444
512
|
|
|
445
|
-
/**
|
|
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
|
+
*/
|
|
446
517
|
function enterpriseValueFigure(figure: MetricFigure, fundamentals: TickerFinancials["fundamentals"]): MetricFigure {
|
|
447
518
|
const label = enterpriseValueLabel(fundamentals);
|
|
519
|
+
if (label === "not-meaningful") return { ...multipleFigure(NOT_MEANINGFUL), unit: figure.unit };
|
|
448
520
|
if (label === "unavailable") return { text: "unavailable", value: null, unit: figure.unit };
|
|
449
521
|
return label === "provider" && figure.text !== "—" ? { ...figure, text: `${figure.text} (provider)` } : figure;
|
|
450
522
|
}
|
|
@@ -664,6 +736,9 @@ function fundamentalsMetrics(
|
|
|
664
736
|
value: fundamentals?.sharesOutstanding,
|
|
665
737
|
...(receipt ? { unit: "ADR equivalent" } : {}),
|
|
666
738
|
},
|
|
739
|
+
...(fundamentals?.sharesOutstanding != null && fundamentals.sharesOutstandingAsOf ? [{
|
|
740
|
+
label: "Shares Outstanding As Of", text: fundamentals.sharesOutstandingAsOf, value: fundamentals.sharesOutstandingAsOf, exportOnly: true,
|
|
741
|
+
}] : []),
|
|
667
742
|
];
|
|
668
743
|
}
|
|
669
744
|
|
|
@@ -682,10 +757,12 @@ function floatAndShortInterestMetrics(
|
|
|
682
757
|
const days = fundamentals?.shortRatio;
|
|
683
758
|
const date = fundamentals?.shortInterestDate;
|
|
684
759
|
const receipt = finite(float) && sharesOutstandingInReceipts(quote, fundamentals, profile?.description);
|
|
760
|
+
const floatAsOf = finite(float) && float > 0 ? fundamentals?.floatSharesAsOf : undefined;
|
|
685
761
|
return [
|
|
686
762
|
finite(float) && float > 0
|
|
687
|
-
? { label: "Float", text:
|
|
763
|
+
? { label: "Float", text: datedCount(float, floatAsOf), value: float, ...(receipt ? { unit: "ADR equivalent" } : {}) }
|
|
688
764
|
: { label: "Float", text: "—" },
|
|
765
|
+
...floatAsOf ? [{ label: "Float As Of", text: floatAsOf, value: floatAsOf, exportOnly: true }] : [],
|
|
689
766
|
finite(short)
|
|
690
767
|
? { label: "Short Interest", text: `${formatCompact(short)}${date ? ` (settled ${date})` : ""}`, value: short, unit: "shares" }
|
|
691
768
|
: { label: "Short Interest", text: "—" },
|
|
@@ -702,7 +779,7 @@ function metricLines(metrics: readonly FundamentalsMetric[]): Array<[string, str
|
|
|
702
779
|
const TRAILING_MONEY_METRICS = new Set(["EPS (TTM)", "Revenue (TTM)", "Net Income (TTM)", "Operating Cash Flow (TTM)", "Free Cash Flow (TTM)"]);
|
|
703
780
|
|
|
704
781
|
/**
|
|
705
|
-
* 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
|
|
706
783
|
* withdrawn EV compares with market cap + debt - cash, what a converted TTM block was converted from, an EPS in
|
|
707
784
|
* another currency than the amounts beside it, and what a P/E on such an EPS divides. `priced` is the snapshot at
|
|
708
785
|
* the regular session price (atRegularSessionPrice), the figures the lines show, so each note reads those.
|
|
@@ -714,21 +791,24 @@ function fundamentalsNotes(
|
|
|
714
791
|
): string[] {
|
|
715
792
|
const fundamentals = priced.fundamentals;
|
|
716
793
|
const shown = (label: string) => metrics.some((metric) => metric.label === label && metric.text !== "—");
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
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)))
|
|
720
797
|
: undefined;
|
|
721
798
|
const conversion = [...TRAILING_MONEY_METRICS].some(shown) ? ttmConversionNote(fundamentals) : undefined;
|
|
722
799
|
const eps = shown("EPS (TTM)") ? epsConversionNote(fundamentals) : undefined;
|
|
723
800
|
const priceEarnings = metrics.some((metric) => metric.label === "P/E (TTM)" && typeof metric.value === "number")
|
|
724
801
|
? convertedPriceEarningsNote(fundamentals, quoteCurrency)
|
|
725
802
|
: undefined;
|
|
726
|
-
|
|
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;
|
|
727
807
|
return [shareBasis, enterpriseValue, conversion, eps, priceEarnings].filter((note): note is string => !!note);
|
|
728
808
|
}
|
|
729
809
|
|
|
730
810
|
// The share count is the market cap's basis: the cap is the count times the price, or a note says why not.
|
|
731
|
-
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)"]);
|
|
732
812
|
|
|
733
813
|
type FundamentalsReportData = TickerFinancials & {
|
|
734
814
|
symbol: string;
|
|
@@ -772,7 +852,7 @@ function fundFactsNote(
|
|
|
772
852
|
if (resolveTickerInstrumentKind(tickerFile, financials) !== "fund") return null;
|
|
773
853
|
return !exchange || isUsListingExchange(exchange)
|
|
774
854
|
? `Fund facts (fee, NAV, premium, net assets): fn ETF ${symbol}.`
|
|
775
|
-
:
|
|
855
|
+
: US_FUND_FACTS_ONLY;
|
|
776
856
|
}
|
|
777
857
|
|
|
778
858
|
/**
|
|
@@ -828,7 +908,7 @@ function fundamentalsReportMetrics(snapshot: FundamentalsReportData, view: "fund
|
|
|
828
908
|
const financials = atRegularSessionPrice(snapshot);
|
|
829
909
|
const quote = financials.quote;
|
|
830
910
|
const fundamentals = financials.fundamentals;
|
|
831
|
-
const capitalization =
|
|
911
|
+
const capitalization = viewMarketCapitalization(quote, fundamentals, regularSessionValuationPrice(quote));
|
|
832
912
|
const marketCap: MetricFigure = capitalization
|
|
833
913
|
? { text: `${formatCompact(capitalization.value)} ${capitalization.currency}`, value: capitalization.value, unit: capitalization.currency }
|
|
834
914
|
: { text: "—" };
|
|
@@ -840,13 +920,14 @@ function fundamentalsReportMetrics(snapshot: FundamentalsReportData, view: "fund
|
|
|
840
920
|
}
|
|
841
921
|
const valued = metrics.filter(({ label, text }) => (VALUATION_METRICS.has(label) || isYieldMetric(label)) && text !== "—");
|
|
842
922
|
// The share count follows the market cap it is the basis of.
|
|
843
|
-
const
|
|
844
|
-
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]);
|
|
845
926
|
// A listing with no valuation (a fund) says so rather than printing its price alone.
|
|
846
927
|
return valuation.length === 0 ? [] : [...valuationPriceMetrics(financials).filter((metric) => metric.text !== "—"), ...valuation];
|
|
847
928
|
}
|
|
848
929
|
|
|
849
|
-
/** Text for `
|
|
930
|
+
/** Text for `gloom fundamentals` and `gloom valuation`: the ticker report's fundamentals without the rest. */
|
|
850
931
|
export function renderFundamentalsReport(
|
|
851
932
|
financials: FundamentalsReportData,
|
|
852
933
|
view: "fundamentals" | "valuation",
|
|
@@ -882,7 +963,7 @@ export function renderFundamentalsReport(
|
|
|
882
963
|
} else if (financials.bankNote) {
|
|
883
964
|
lines.push("", renderSection("Bank"), cliStyles.muted(financials.bankNote));
|
|
884
965
|
}
|
|
885
|
-
|
|
966
|
+
appendDescription(lines, profile);
|
|
886
967
|
}
|
|
887
968
|
return lines.join("\n");
|
|
888
969
|
}
|
|
@@ -929,6 +1010,10 @@ export function fundamentalsReportTables(
|
|
|
929
1010
|
{ label: "Sector", value: profile?.sector },
|
|
930
1011
|
{ label: "Industry", value: profile?.industry },
|
|
931
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
|
+
] : [],
|
|
932
1017
|
].filter((entry) => typeof entry.value === "string" && entry.value.trim().length > 0)));
|
|
933
1018
|
}
|
|
934
1019
|
return {
|
|
@@ -975,16 +1060,20 @@ export async function buildTickerReport({
|
|
|
975
1060
|
recentSecFilings = [],
|
|
976
1061
|
hiddenSecFilings = NOTHING_HIDDEN,
|
|
977
1062
|
futuresContract = null,
|
|
1063
|
+
usdPerMmbtu = null,
|
|
978
1064
|
distributions = null,
|
|
979
1065
|
statementFilings = null,
|
|
980
1066
|
bondFund = null,
|
|
981
1067
|
memberships,
|
|
1068
|
+
offerings = [],
|
|
982
1069
|
}: {
|
|
983
1070
|
symbol: string;
|
|
984
1071
|
/** The lists holding the company, by any of its listings (loadCompanyMemberships); the saved listing's own lists when absent. */
|
|
985
1072
|
memberships?: CompanyMemberships;
|
|
986
1073
|
/** The filings behind the latest statements, and a newer quarter's results release. */
|
|
987
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[];
|
|
988
1077
|
/** A bond fund's SEC yield, yield to worst and duration (loadReportBondFacts). */
|
|
989
1078
|
bondFund?: FundBondFacts | null;
|
|
990
1079
|
/** The distributions a dividend yield is read with (loadDividendDistributions). */
|
|
@@ -993,6 +1082,8 @@ export async function buildTickerReport({
|
|
|
993
1082
|
listingExchange?: string;
|
|
994
1083
|
/** A futures symbol's contract terms and latest confirmed settlement. */
|
|
995
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;
|
|
996
1087
|
tickerFile: TickerRecord | null;
|
|
997
1088
|
financials: TickerFinancials;
|
|
998
1089
|
config: AppConfig;
|
|
@@ -1052,6 +1143,11 @@ export async function buildTickerReport({
|
|
|
1052
1143
|
if (metadataParts.length > 0) {
|
|
1053
1144
|
lines.push(cliStyles.muted(metadataParts.join(METADATA_SEPARATOR)));
|
|
1054
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
|
+
}
|
|
1055
1151
|
|
|
1056
1152
|
// A list that holds the company as another of its listings says which: "Watchlists R (as RCI.B:TSX)".
|
|
1057
1153
|
const lists = memberships ?? companyMemberships(config, tickerFile, [], null);
|
|
@@ -1070,7 +1166,7 @@ export async function buildTickerReport({
|
|
|
1070
1166
|
|
|
1071
1167
|
// Market cap and the multiples are measured at the regular session price the Quote section heads with.
|
|
1072
1168
|
const priced = atRegularSessionPrice(financials);
|
|
1073
|
-
const capitalization =
|
|
1169
|
+
const capitalization = viewMarketCapitalization(priced.quote, priced.fundamentals, regularSessionValuationPrice(priced.quote));
|
|
1074
1170
|
// Market cap and EV read in the currency they are reported in, as the revenue and income beside them do,
|
|
1075
1171
|
// with the base currency's figure after them when it differs: 627.2B USD (878.15B CAD).
|
|
1076
1172
|
const convertedCurrencies = new Set<string>();
|
|
@@ -1107,12 +1203,14 @@ export async function buildTickerReport({
|
|
|
1107
1203
|
// A futures price is its latest trade; the exchange settlement is its own row, dated by its session.
|
|
1108
1204
|
appendMetricSection(lines, "Quote", [
|
|
1109
1205
|
// A price in cents says what it is per: 314.95¢/lb.
|
|
1110
|
-
["Last", colorBySign(`${formatMarketPriceWithCurrency(session.price, quote.currency, quoteOptions)}${
|
|
1206
|
+
["Last", colorBySign(`${formatMarketPriceWithCurrency(session.price, quote.currency, quoteOptions)}${futuresPricePer(futuresContract, quote.currency)}`, session.change)],
|
|
1111
1207
|
...futuresContract
|
|
1112
|
-
? [["Settle",
|
|
1208
|
+
? [["Settle", quoteSettleText(quote, futuresContract)] as [string, string]]
|
|
1113
1209
|
: [],
|
|
1114
1210
|
// The move says what it is measured from: "vs Fri 16 Oct close", a future's "vs Fri 16 Oct settle".
|
|
1115
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]] : [],
|
|
1116
1214
|
["Open", quote.open != null ? formatMarketPriceWithCurrency(quote.open, quote.currency, quoteOptions) : "—"],
|
|
1117
1215
|
// A listing that no longer trades: its last session's range, never today's.
|
|
1118
1216
|
[quote.delisting ? "Last Session" : "Day Range", quote.low != null || quote.high != null
|
|
@@ -1137,9 +1235,22 @@ export async function buildTickerReport({
|
|
|
1137
1235
|
|
|
1138
1236
|
const metrics = fundamentalsMetrics(quote, priced.fundamentals, profile, { text: marketCapText }, priceReturns, fundamentalsCurrency(financials),
|
|
1139
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
|
+
|
|
1140
1246
|
const beforeFundamentals = lines.length;
|
|
1141
1247
|
appendMetricSection(lines, "Fundamentals", metricLines(metrics));
|
|
1142
1248
|
for (const note of fundamentalsNotes(priced, metrics, quote?.currency)) lines.push(cliStyles.muted(note));
|
|
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));
|
|
1143
1254
|
if (lines.length > beforeFundamentals) for (const note of conversionNotes(toBase, convertedCurrencies, rates)) lines.push(cliStyles.muted(note));
|
|
1144
1255
|
// Where a fund's facts would go: under its fundamentals, or in their place.
|
|
1145
1256
|
const fund = fundFactsNote(quote?.symbol ?? symbol,
|
|
@@ -1150,26 +1261,24 @@ export async function buildTickerReport({
|
|
|
1150
1261
|
lines.push(cliStyles.muted(`Market cap: ${describeFundamentalMarketCap(capitalization.provenance)}.`));
|
|
1151
1262
|
}
|
|
1152
1263
|
|
|
1153
|
-
const reportedCurrency = financials.financialCurrency?.trim();
|
|
1154
|
-
const statements = [...financials.annualStatements, ...financials.quarterlyStatements];
|
|
1155
|
-
const fallbackCurrency = reportedCurrency && statements.every((row) => !row.currency?.trim() || row.currency.trim() === reportedCurrency)
|
|
1156
|
-
? reportedCurrency : undefined;
|
|
1157
|
-
const statementCurrency = (row: FinancialStatement) => row.currency?.trim() || fallbackCurrency;
|
|
1158
|
-
const latestAnnual = latestFinancialPeriod(financials.annualStatements, row => row.date);
|
|
1159
1264
|
if (latestAnnual) {
|
|
1160
1265
|
appendMetricSection(lines, `Latest Annual (${statementPeriodText(latestAnnual.date, statementFilings?.latestAnnual ?? null)})`,
|
|
1161
1266
|
buildStatementMetrics(latestAnnual, statementCurrency(latestAnnual), codes));
|
|
1162
1267
|
}
|
|
1163
1268
|
|
|
1164
|
-
const latestQuarter = latestFinancialPeriod(financials.quarterlyStatements, row => row.date);
|
|
1165
1269
|
if (latestQuarter) {
|
|
1270
|
+
const runway = cashRunway(financials);
|
|
1166
1271
|
appendMetricSection(lines, `Latest Quarter (${statementPeriodText(latestQuarter.date, statementFilings?.latestQuarter ?? null)})`,
|
|
1167
|
-
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));
|
|
1168
1277
|
}
|
|
1169
1278
|
// The statements stop a quarter short of the results the company has released.
|
|
1170
1279
|
if (statementFilings?.resultsRelease && (latestAnnual || latestQuarter)) lines.push(cliStyles.muted(resultsReleaseText(statementFilings.resultsRelease)));
|
|
1171
1280
|
|
|
1172
|
-
|
|
1281
|
+
appendDescription(lines, profile);
|
|
1173
1282
|
|
|
1174
1283
|
appendTextSection(lines, "Notes", notes, true);
|
|
1175
1284
|
|
|
@@ -1184,7 +1293,7 @@ export async function buildTickerReport({
|
|
|
1184
1293
|
],
|
|
1185
1294
|
body: item.summary,
|
|
1186
1295
|
link: item.url,
|
|
1187
|
-
})));
|
|
1296
|
+
})), recentNews[0]?.searchedFor ? coinNewsFallbackNotice(symbol, recentNews[0].searchedFor) : null);
|
|
1188
1297
|
|
|
1189
1298
|
appendFeedSection(lines, "Recent SEC Filings", recentSecFilings.map((filing) => ({
|
|
1190
1299
|
title: (() => {
|
|
@@ -1216,17 +1325,22 @@ function buildTickerStructuredData({
|
|
|
1216
1325
|
recentSecFilings,
|
|
1217
1326
|
hiddenSecFilings,
|
|
1218
1327
|
futuresContract,
|
|
1328
|
+
usdPerMmbtu = null,
|
|
1219
1329
|
distributions,
|
|
1220
1330
|
statementFilings,
|
|
1221
1331
|
bondFund = null,
|
|
1222
1332
|
memberships,
|
|
1333
|
+
offerings = [],
|
|
1223
1334
|
}: {
|
|
1224
1335
|
symbol: string;
|
|
1225
1336
|
listing: CliListing;
|
|
1226
1337
|
memberships: CompanyMemberships;
|
|
1227
1338
|
statementFilings: StatementFilingsReport | null;
|
|
1339
|
+
offerings?: readonly OfferingFiling[];
|
|
1228
1340
|
bondFund?: FundBondFacts | null;
|
|
1229
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;
|
|
1230
1344
|
distributions: DividendDistributions | null;
|
|
1231
1345
|
tickerFile: TickerRecord | null;
|
|
1232
1346
|
financials: TickerFinancials;
|
|
@@ -1241,6 +1355,7 @@ function buildTickerStructuredData({
|
|
|
1241
1355
|
const identity = listingIdentity(listing, quote);
|
|
1242
1356
|
// Market cap and the multiples at the regular session price, as the text report gives them.
|
|
1243
1357
|
const priced = atRegularSessionPrice(financials);
|
|
1358
|
+
const runway = cashRunway(financials);
|
|
1244
1359
|
return {
|
|
1245
1360
|
symbol,
|
|
1246
1361
|
listing: { symbol: identity.symbol, exchange: identity.exchange || null, name: identity.name },
|
|
@@ -1266,8 +1381,11 @@ function buildTickerStructuredData({
|
|
|
1266
1381
|
lastUpdated: quote.lastUpdated ? new Date(quote.lastUpdated).toISOString() : "",
|
|
1267
1382
|
} : null,
|
|
1268
1383
|
quoteMetadata: financials.quoteMetadata,
|
|
1384
|
+
// The receipt pair the listing is a side of, and which side.
|
|
1385
|
+
...depositaryPairJson(financials),
|
|
1269
1386
|
// Only for futures: the contract the symbol prices, its terms and its latest confirmed settlement.
|
|
1270
1387
|
...futuresContract ? { futuresContract } : {},
|
|
1388
|
+
...usdPerMmbtu ? { usdPerMmbtu } : {},
|
|
1271
1389
|
ticker: tickerFile ? {
|
|
1272
1390
|
ticker: tickerFile.metadata.ticker,
|
|
1273
1391
|
name: tickerFile.metadata.name ?? "",
|
|
@@ -1294,6 +1412,10 @@ function buildTickerStructuredData({
|
|
|
1294
1412
|
latestQuarter: latestFinancialPeriod(financials.quarterlyStatements, row => row.date) ?? null,
|
|
1295
1413
|
annualStatementCount: financials.annualStatements.length,
|
|
1296
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) : [],
|
|
1297
1419
|
// The form and filed date of the latest periods' filings, and a newer quarter's results released before its statements.
|
|
1298
1420
|
statementFilings,
|
|
1299
1421
|
notes,
|
|
@@ -1321,6 +1443,13 @@ function buildTickerStructuredData({
|
|
|
1321
1443
|
};
|
|
1322
1444
|
}
|
|
1323
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
|
+
|
|
1324
1453
|
const QUOTE_UNAVAILABLE = "Quote unavailable.";
|
|
1325
1454
|
|
|
1326
1455
|
/** Asks for the quote the report lacks once more, for the reason the data service gave when it had none. */
|
|
@@ -1422,6 +1551,8 @@ export async function ticker(symbol: string, dependencies: TickerCommandDependen
|
|
|
1422
1551
|
loadTickers: () => store.loadAllTickers(),
|
|
1423
1552
|
dataProvider,
|
|
1424
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);
|
|
1425
1556
|
const [notesResult, newsResult, secFilingsResult] = await Promise.allSettled([
|
|
1426
1557
|
notesFiles.load(tickerFile?.metadata.ticker ?? normalized),
|
|
1427
1558
|
dataProvider.getNews({
|
|
@@ -1432,6 +1563,10 @@ export async function ticker(symbol: string, dependencies: TickerCommandDependen
|
|
|
1432
1563
|
exchange: exchange || quote?.exchangeName || "",
|
|
1433
1564
|
tickerTier: "primary",
|
|
1434
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
|
+
: {}),
|
|
1435
1570
|
}),
|
|
1436
1571
|
// Outside the US the lookup checks the SEC registrant against the listing's company,
|
|
1437
1572
|
// and refuses another company's filings.
|
|
@@ -1442,6 +1577,9 @@ export async function ticker(symbol: string, dependencies: TickerCommandDependen
|
|
|
1442
1577
|
]);
|
|
1443
1578
|
|
|
1444
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));
|
|
1445
1583
|
const notes = notesResult.status === "fulfilled" ? notesResult.value : "";
|
|
1446
1584
|
const recentNews = newsResult.status === "fulfilled" ? newsResult.value : [];
|
|
1447
1585
|
const { filings: recentSecFilings, hidden: hiddenSecFilings } = secFilingsResult.status === "fulfilled"
|
|
@@ -1456,8 +1594,11 @@ export async function ticker(symbol: string, dependencies: TickerCommandDependen
|
|
|
1456
1594
|
: notTheCoinNote(listing.symbol, quote ?? (tickerFile ? { name: tickerFile.metadata.name, instrumentType: tickerFile.metadata.assetCategory } : null));
|
|
1457
1595
|
const listingNote = [choiceNote, coinNote].filter((note): note is string => !!note).join("\n") || undefined;
|
|
1458
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);
|
|
1459
1599
|
if (dependencies.printResult) {
|
|
1460
|
-
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);
|
|
1461
1602
|
dependencies.printResult({
|
|
1462
1603
|
freshness,
|
|
1463
1604
|
warnings: warnings.length > 0 ? warnings : undefined,
|
|
@@ -1465,17 +1606,19 @@ export async function ticker(symbol: string, dependencies: TickerCommandDependen
|
|
|
1465
1606
|
symbol: normalized,
|
|
1466
1607
|
listing,
|
|
1467
1608
|
tickerFile,
|
|
1468
|
-
financials:
|
|
1609
|
+
financials: shownFinancials,
|
|
1469
1610
|
config,
|
|
1470
1611
|
notes,
|
|
1471
1612
|
recentNews,
|
|
1472
1613
|
recentSecFilings,
|
|
1473
1614
|
hiddenSecFilings,
|
|
1474
1615
|
futuresContract,
|
|
1616
|
+
usdPerMmbtu,
|
|
1475
1617
|
distributions: await distributions,
|
|
1476
1618
|
statementFilings: await statementFilings,
|
|
1477
1619
|
bondFund: await bondFund,
|
|
1478
1620
|
memberships,
|
|
1621
|
+
offerings: await offerings,
|
|
1479
1622
|
}),
|
|
1480
1623
|
});
|
|
1481
1624
|
return;
|
|
@@ -1485,7 +1628,7 @@ export async function ticker(symbol: string, dependencies: TickerCommandDependen
|
|
|
1485
1628
|
symbol: normalized,
|
|
1486
1629
|
listingExchange: listing.exchange,
|
|
1487
1630
|
tickerFile,
|
|
1488
|
-
financials:
|
|
1631
|
+
financials: shownFinancials,
|
|
1489
1632
|
config,
|
|
1490
1633
|
toBase,
|
|
1491
1634
|
notes,
|
|
@@ -1495,11 +1638,13 @@ export async function ticker(symbol: string, dependencies: TickerCommandDependen
|
|
|
1495
1638
|
recentSecFilings,
|
|
1496
1639
|
hiddenSecFilings,
|
|
1497
1640
|
futuresContract,
|
|
1641
|
+
usdPerMmbtu,
|
|
1498
1642
|
distributions: await distributions,
|
|
1499
1643
|
statementFilings: await statementFilings,
|
|
1500
1644
|
bondFund: await bondFund,
|
|
1501
1645
|
memberships,
|
|
1646
|
+
offerings: await offerings,
|
|
1502
1647
|
}));
|
|
1503
|
-
if (freshness) console.log(`\n${cliFreshnessFooter(freshness)}`);
|
|
1648
|
+
if (freshness) console.log(`\n${cliFreshnessFooter(freshness, quote ?? resolvedFinancials)}`);
|
|
1504
1649
|
});
|
|
1505
1650
|
}
|
package/src/cli/context.ts
CHANGED
|
@@ -10,7 +10,7 @@ import type { PluginCapability } from "../capabilities";
|
|
|
10
10
|
import type { AppConfig } from "../types/config";
|
|
11
11
|
import type { GloomPlugin } from "../types/plugin";
|
|
12
12
|
import { getLoadablePlugins } from "../plugins/catalog";
|
|
13
|
-
import { standaloneSeriesInvoker } from "../series/standalone";
|
|
13
|
+
import { standaloneSeriesCatalog, standaloneSeriesInvoker } from "../series/standalone";
|
|
14
14
|
import type { PluginRegistry } from "../plugins/registry";
|
|
15
15
|
import type { LoadedExternalPlugin } from "../plugins/loader";
|
|
16
16
|
import { apiClient } from "../api-client";
|
|
@@ -131,7 +131,8 @@ export async function initMarketData(options: CliContextOptions = {}): Promise<M
|
|
|
131
131
|
dataProvider.setConfigAccessor(() => context.config);
|
|
132
132
|
dataProvider.setBackgroundRevalidation(false);
|
|
133
133
|
const seriesCapabilities = standaloneSeriesInvoker(plugins, context.dataDir, context.config.disabledPlugins);
|
|
134
|
-
|
|
134
|
+
const findCatalogSeries = standaloneSeriesCatalog(plugins, context.config.disabledPlugins);
|
|
135
|
+
return { ...context, dataProvider, seriesCapabilities, findCatalogSeries, statementSources: cloudStatementReportSources };
|
|
135
136
|
}
|
|
136
137
|
|
|
137
138
|
export async function initCliServices(options: CliServicesOptions = {}) {
|