@gloom-sh/terminal 0.18.5 → 0.19.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/README.zh-CN.md +1 -1
- package/package.json +1 -1
- package/patches/electrobun@1.18.1.patch +163 -8
- package/src/api-client/app-attention.ts +3 -0
- package/src/api-client/beneficial-owners.ts +3 -0
- package/src/api-client/company-kpis.ts +3 -0
- package/src/api-client/cot.ts +6 -2
- package/src/api-client/credit-documents.ts +6 -0
- package/src/api-client/data.ts +19 -7
- package/src/api-client/equity-screener.ts +24 -0
- package/src/api-client/fund-facts.ts +45 -4
- package/src/api-client/hiring.ts +3 -0
- package/src/api-client/index.ts +15 -0
- package/src/api-client/ipo.ts +24 -1
- package/src/api-client/market-discovery.ts +10 -0
- package/src/api-client/market-movers.ts +7 -0
- package/src/api-client/members.ts +1 -1
- package/src/api-client/mna.ts +3 -0
- package/src/api-client/paths.ts +9 -1
- package/src/api-client/perps.ts +43 -0
- package/src/api-client/research-activity.ts +3 -2
- package/src/api-client/roadmap.ts +85 -0
- package/src/api-client/types.ts +82 -2
- package/src/app/pane-runtime/plugin-bindings.ts +9 -5
- package/src/app/runtime/broker-import.ts +0 -2
- package/src/app/runtime/plugin-bindings.ts +73 -56
- package/src/architecture/core-builtin-allowlist.json +2 -2
- package/src/architecture/pane-tabs-allowlist.json +3 -0
- package/src/architecture/ttl-caches-allowlist.json +19 -0
- package/src/brokers/sync-broker-instance.ts +2 -8
- package/src/capabilities/chart-series.ts +1 -1
- package/src/cli/commands/crypto-hints.ts +40 -24
- package/src/cli/commands/market.ts +107 -38
- package/src/cli/commands/news-search.ts +22 -0
- package/src/cli/commands/options-chain.ts +48 -7
- package/src/cli/commands/options-leaps.ts +9 -3
- package/src/cli/commands/overview.ts +147 -32
- package/src/cli/commands/search.ts +21 -1
- package/src/cli/commands/themes.ts +11 -2
- package/src/cli/commands/ticker.ts +87 -36
- package/src/cli/company-name-hint.ts +41 -0
- package/src/cli/earnings-calendar.ts +1 -1
- package/src/cli/errors.ts +25 -2
- package/src/cli/glossary.ts +31 -2
- package/src/cli/history-rows.ts +57 -9
- package/src/cli/index-roots.ts +0 -7
- package/src/cli/index.ts +2 -0
- package/src/cli/listing-arg.ts +235 -60
- package/src/cli/output-file.ts +68 -0
- package/src/cli/pane-functions/capabilities.ts +4 -0
- package/src/cli/pane-functions/catalog.ts +80 -7
- package/src/cli/pane-functions/discovery.ts +21 -1
- package/src/cli/pane-functions/dom.ts +13 -3
- package/src/cli/pane-functions/freshness.ts +93 -4
- package/src/cli/pane-functions/function-help.ts +20 -10
- package/src/cli/pane-functions/headless.ts +17 -7
- package/src/cli/pane-functions/index.ts +54 -16
- package/src/cli/pane-functions/market-session.ts +66 -4
- package/src/cli/pane-functions/options.ts +19 -1
- package/src/cli/pane-functions/resolver.ts +19 -8
- package/src/cli/pane-functions/screenshot-assessment.ts +6 -4
- package/src/cli/pane-functions/screenshot-types.ts +5 -0
- package/src/cli/quote-answer.ts +22 -11
- package/src/cli/saved-copy-persistence.ts +88 -0
- package/src/cli/ticker-resolution.ts +3 -2
- package/src/components/chart/composite/composite-chart.tsx +4 -0
- package/src/components/chart/composite/interactions.ts +6 -0
- package/src/components/chart/composite/legend.tsx +45 -7
- package/src/components/chart/composite/panel-gestures.ts +33 -0
- package/src/components/chart/composite/panel-surface.tsx +52 -3
- package/src/components/chart/composite/rasterizer.ts +24 -13
- package/src/components/chart/composite/scene.ts +39 -4
- package/src/components/chart/composite/series-cues.ts +14 -0
- package/src/components/chart/composite/text-renderer.ts +9 -2
- package/src/components/chart/composite/tool-catalog.ts +36 -0
- package/src/components/chart/composite/tools.ts +203 -44
- package/src/components/chart/composite/use-composite-chart-keyboard.ts +11 -4
- package/src/components/command-bar/assist/inventory.ts +2 -1
- package/src/components/command-bar/commands/direct/index.ts +28 -13
- package/src/components/command-bar/list/model.ts +5 -0
- package/src/components/command-bar/pane-templates/items.ts +3 -2
- package/src/components/command-bar/routes/root/runtime.ts +6 -7
- package/src/components/command-bar/selection-runtime.ts +52 -3
- package/src/components/command-bar/surface/index.tsx +2 -0
- package/src/components/command-bar/workflow/collection-actions.ts +3 -3
- package/src/components/layout/pane/capture-stamp.ts +2 -2
- package/src/components/layout/pane/footer/index.tsx +22 -6
- package/src/components/layout/pane/footer/model.ts +83 -15
- package/src/components/layout/pane/status-footer.ts +35 -2
- package/src/components/layout/status-widget-space.ts +9 -0
- package/src/components/onboarding/onboarding-wizard.tsx +4 -1
- package/src/components/onboarding/portfolio-step/positions-panel.tsx +12 -7
- package/src/components/onboarding/wizard-broker-sync.ts +0 -1
- package/src/components/onboarding/wizard-positions.ts +3 -3
- package/src/components/ticker/list-table-view.tsx +8 -21
- package/src/components/ui/choice-dialog.tsx +23 -18
- package/src/components/ui/choice-groups.ts +18 -0
- package/src/components/ui/data-table/opentui/index.tsx +9 -7
- package/src/components/ui/data-table/opentui/model.ts +26 -1
- package/src/components/ui/data-table/types.ts +2 -0
- package/src/components/ui/display.tsx +18 -3
- package/src/components/ui/icon.tsx +4 -1
- package/src/components/ui/list-view.tsx +8 -4
- package/src/components/ui/query-bar-keys.tsx +2 -0
- package/src/components/ui/query-bar.tsx +1 -0
- package/src/components/ui/select-button.tsx +5 -1
- package/src/components/ui/select-field.tsx +1 -0
- package/src/components/ui/table-layout.ts +8 -5
- package/src/core/app-runtime.ts +2 -0
- package/src/core/app-services.ts +2 -2
- package/src/data/config/chart-settings.ts +1 -1
- package/src/data/json-ticker-repository.ts +17 -8
- package/src/data/plugin-cache.ts +5 -3
- package/src/data/saved-copies.ts +8 -0
- package/src/data/ticker-repository.ts +16 -9
- package/src/data/ticker-writes.ts +81 -0
- package/src/data/ttl-cache.ts +165 -0
- package/src/docs/snapshot.json +103 -142
- package/src/i18n/es.ts +20 -6
- package/src/i18n/ja.ts +20 -6
- package/src/i18n/ko.ts +20 -6
- package/src/i18n/zh-cn.ts +20 -6
- package/src/i18n/zh-tw.ts +20 -6
- package/src/market-data/depositary-pair.ts +27 -3
- package/src/market-data/fund-facts.ts +50 -0
- package/src/market-data/market/change-basis.ts +16 -3
- package/src/market-data/market/format.ts +25 -0
- package/src/market-data/market/freshness.ts +2 -1
- package/src/market-data/options-alternatives.ts +81 -4
- package/src/market-data/quotes/metadata.ts +7 -0
- package/src/news/aggregator.ts +119 -9
- package/src/news/cloud-session.ts +21 -0
- package/src/news/hooks.ts +1 -0
- package/src/news/news-model.ts +1 -0
- package/src/news/types.ts +17 -0
- package/src/plugins/builtin/alerts/alert-engine.ts +20 -1
- package/src/plugins/builtin/alerts/alert-log.ts +33 -0
- package/src/plugins/builtin/alerts/calendar-events.ts +10 -4
- package/src/plugins/builtin/alerts/cli-forms.ts +216 -0
- package/src/plugins/builtin/alerts/cli.ts +362 -80
- package/src/plugins/builtin/alerts/command.ts +25 -1
- package/src/plugins/builtin/alerts/event-rows.ts +24 -3
- package/src/plugins/builtin/alerts/events-pane.tsx +34 -10
- package/src/plugins/builtin/alerts/fired-log.ts +73 -9
- package/src/plugins/builtin/alerts/format.ts +75 -5
- package/src/plugins/builtin/alerts/headless.ts +34 -12
- package/src/plugins/builtin/alerts/history-rows.ts +3 -2
- package/src/plugins/builtin/alerts/history.ts +1 -1
- package/src/plugins/builtin/alerts/index.tsx +79 -16
- package/src/plugins/builtin/alerts/metric-command.ts +77 -4
- package/src/plugins/builtin/alerts/metric-data.ts +54 -13
- package/src/plugins/builtin/alerts/metric-model.ts +163 -14
- package/src/plugins/builtin/alerts/metric-parity-fixture.json +1 -1
- package/src/plugins/builtin/alerts/pane.tsx +61 -23
- package/src/plugins/builtin/alerts/quotes.ts +6 -0
- package/src/plugins/builtin/alerts/storage.ts +12 -8
- package/src/plugins/builtin/alerts/types.ts +4 -0
- package/src/plugins/builtin/analytics/index.tsx +2 -1
- package/src/plugins/builtin/analytics/risk-client.ts +16 -5
- package/src/plugins/builtin/analytics/risk-fx.ts +70 -15
- package/src/plugins/builtin/analytics/risk-headless.ts +27 -0
- package/src/plugins/builtin/analytics/risk-model.ts +55 -9
- package/src/plugins/builtin/analytics/risk-pane.tsx +8 -2
- package/src/plugins/builtin/attention/index.tsx +2 -1
- package/src/plugins/builtin/attention/listing.ts +14 -0
- package/src/plugins/builtin/broker-manager/index.tsx +7 -3
- package/src/plugins/builtin/buildout/cells.tsx +12 -4
- package/src/plugins/builtin/buildout/format.ts +38 -0
- package/src/plugins/builtin/buildout/model/normalizers.ts +36 -1
- package/src/plugins/builtin/buildout/pane/index.tsx +4 -1
- package/src/plugins/builtin/buildout/table-model.ts +23 -2
- package/src/plugins/builtin/builtin-plugin-meta.ts +6 -2
- package/src/plugins/builtin/cds/client.ts +142 -30
- package/src/plugins/builtin/cds/headless.ts +35 -8
- package/src/plugins/builtin/cds/model.ts +145 -18
- package/src/plugins/builtin/cds/pane.tsx +16 -5
- package/src/plugins/builtin/changelog/index.tsx +9 -6
- package/src/plugins/builtin/chart-composer/catalog-inventory.ts +3 -0
- package/src/plugins/builtin/chart-composer/cli-options.ts +4 -0
- package/src/plugins/builtin/chart-composer/data-catalog-pane.tsx +7 -0
- package/src/plugins/builtin/chart-composer/editor/controller.ts +2 -2
- package/src/plugins/builtin/chart-composer/follow-binding.ts +14 -2
- package/src/plugins/builtin/chart-composer/headless-schema.ts +7 -1
- package/src/plugins/builtin/chart-composer/headless.ts +6 -1
- package/src/plugins/builtin/chart-composer/index.tsx +5 -6
- package/src/plugins/builtin/chart-composer/pane.tsx +37 -8
- package/src/plugins/builtin/chart-composer/settings.ts +27 -0
- package/src/plugins/builtin/chat/content/command-suggestions.ts +1 -0
- package/src/plugins/builtin/chat/controller/index.ts +5 -1
- package/src/plugins/builtin/chat/controller/notifications.ts +33 -3
- package/src/plugins/builtin/chat/controller/state.ts +25 -2
- package/src/plugins/builtin/chat/controller/unread-people.ts +89 -23
- package/src/plugins/builtin/chat/controller/utils.ts +7 -2
- package/src/plugins/builtin/chat/pane-links/commands.ts +7 -1
- package/src/plugins/builtin/chat/status-preview.ts +79 -0
- package/src/plugins/builtin/chat/status-widget.tsx +147 -10
- package/src/plugins/builtin/chat/unread-badge.ts +51 -10
- package/src/plugins/builtin/clinical-trials/client.ts +49 -4
- package/src/plugins/builtin/clinical-trials/model.ts +86 -31
- package/src/plugins/builtin/clinical-trials/pane.tsx +61 -49
- package/src/plugins/builtin/clinical-trials/sponsor-listing.ts +90 -0
- package/src/plugins/builtin/clinical-trials/sponsor-tickers.ts +95 -15
- package/src/plugins/builtin/clinical-trials/trial-pages.ts +50 -0
- package/src/plugins/builtin/cloud/askg/manifest.ts +2 -0
- package/src/plugins/builtin/company-attention/building.tsx +5 -1
- package/src/plugins/builtin/company-attention/client.ts +8 -9
- package/src/plugins/builtin/company-attention/evidence.ts +4 -1
- package/src/plugins/builtin/company-attention/headless.ts +2 -1
- package/src/plugins/builtin/company-attention/moves.tsx +5 -1
- package/src/plugins/builtin/company-attention/pane.tsx +12 -2
- package/src/plugins/builtin/company-attention/signals.tsx +5 -1
- package/src/plugins/builtin/company-kpis/headless.ts +8 -3
- package/src/plugins/builtin/company-kpis/model.ts +73 -5
- package/src/plugins/builtin/company-kpis/pane.tsx +15 -7
- package/src/plugins/builtin/composite-plugins.ts +2 -1
- package/src/plugins/builtin/correlation/headless.ts +13 -5
- package/src/plugins/builtin/correlation/history.ts +22 -0
- package/src/plugins/builtin/cot/client.ts +22 -18
- package/src/plugins/builtin/cot/headless.ts +15 -10
- package/src/plugins/builtin/cot/model.ts +14 -1
- package/src/plugins/builtin/cot/pane.tsx +22 -14
- package/src/plugins/builtin/credit-boards/client.ts +6 -10
- package/src/plugins/builtin/credit-conditions/headless.ts +8 -2
- package/src/plugins/builtin/credit-conditions/index.tsx +5 -1
- package/src/plugins/builtin/credit-conditions/model.ts +4 -0
- package/src/plugins/builtin/credit-conditions/series.ts +3 -1
- package/src/plugins/builtin/credit-documents/detail.tsx +2 -2
- package/src/plugins/builtin/credit-documents/export.ts +173 -0
- package/src/plugins/builtin/credit-documents/headless.ts +10 -10
- package/src/plugins/builtin/credit-documents/model.ts +104 -14
- package/src/plugins/builtin/credit-documents/pane.tsx +12 -5
- package/src/plugins/builtin/custom-view/sources.ts +2 -0
- package/src/plugins/builtin/dividend-yield/client.ts +131 -23
- package/src/plugins/builtin/dividend-yield/headless.ts +44 -16
- package/src/plugins/builtin/dividend-yield/model.ts +8 -5
- package/src/plugins/builtin/dividend-yield/pane.tsx +38 -13
- package/src/plugins/builtin/dividend-yield/ranking.ts +37 -14
- package/src/plugins/builtin/dividend-yield/types.ts +20 -2
- package/src/plugins/builtin/dividend-yield/view.ts +30 -2
- package/src/plugins/builtin/docs/targets.ts +5 -1
- package/src/plugins/builtin/doe/headless.ts +3 -2
- package/src/plugins/builtin/doe/pane.tsx +13 -3
- package/src/plugins/builtin/earnings/board-model.ts +16 -15
- package/src/plugins/builtin/earnings/board.tsx +62 -71
- package/src/plugins/builtin/earnings/headless.ts +40 -4
- package/src/plugins/builtin/earnings/scope.ts +31 -43
- package/src/plugins/builtin/earnings-calls/calendar.tsx +2 -2
- package/src/plugins/builtin/earnings-calls/data.ts +18 -6
- package/src/plugins/builtin/earnings-calls/format.ts +31 -2
- package/src/plugins/builtin/earnings-calls/headless.ts +20 -5
- package/src/plugins/builtin/earnings-calls/model.ts +6 -1
- package/src/plugins/builtin/earnings-calls/pane.tsx +12 -4
- package/src/plugins/builtin/econ/calendar-model.ts +48 -1
- package/src/plugins/builtin/econ/calendar-source.ts +4 -2
- package/src/plugins/builtin/econ/detail-view.tsx +2 -2
- package/src/plugins/builtin/econ/figures.ts +48 -0
- package/src/plugins/builtin/econ/index.tsx +14 -5
- package/src/plugins/builtin/econ/print-watch.ts +3 -1
- package/src/plugins/builtin/econ/types.ts +2 -0
- package/src/plugins/builtin/econ-statistics/client.ts +11 -0
- package/src/plugins/builtin/econ-statistics/defs.ts +6 -0
- package/src/plugins/builtin/econ-statistics/headless.ts +16 -6
- package/src/plugins/builtin/econ-statistics/pane.tsx +8 -4
- package/src/plugins/builtin/econ-statistics/stats.ts +39 -9
- package/src/plugins/builtin/equity-screener/categories.ts +179 -0
- package/src/plugins/builtin/equity-screener/client.ts +4 -2
- package/src/plugins/builtin/equity-screener/headless.ts +144 -13
- package/src/plugins/builtin/equity-screener/ideas.ts +49 -0
- package/src/plugins/builtin/equity-screener/model.ts +99 -10
- package/src/plugins/builtin/equity-screener/pane.tsx +68 -13
- package/src/plugins/builtin/fixed-income/pane.tsx +2 -1
- package/src/plugins/builtin/futures/use-board-terms.ts +42 -28
- package/src/plugins/builtin/futures/use-front-returns.ts +45 -28
- package/src/plugins/builtin/fx-matrix/client.ts +6 -3
- package/src/plugins/builtin/fx-matrix/headless.ts +1 -1
- package/src/plugins/builtin/fx-matrix/index.tsx +4 -2
- package/src/plugins/builtin/fx-matrix/live-legs.ts +42 -3
- package/src/plugins/builtin/gpu/headless.ts +8 -2
- package/src/plugins/builtin/help/function-index.ts +4 -1
- package/src/plugins/builtin/help/index.tsx +62 -59
- package/src/plugins/builtin/help/shortcut-model.ts +1 -1
- package/src/plugins/builtin/help/shortcut-table.tsx +5 -6
- package/src/plugins/builtin/help/table-cells.tsx +13 -2
- package/src/plugins/builtin/holders/beneficial-client.ts +5 -1
- package/src/plugins/builtin/holders/beneficial-view.tsx +3 -0
- package/src/plugins/builtin/holders/fund-holders.ts +51 -0
- package/src/plugins/builtin/holders/headless.ts +22 -3
- package/src/plugins/builtin/holders/pane.tsx +3 -0
- package/src/plugins/builtin/holders/report-rows.ts +4 -1
- package/src/plugins/builtin/insider/headless.ts +2 -2
- package/src/plugins/builtin/ipo-calendar/client.ts +18 -2
- package/src/plugins/builtin/ipo-calendar/headless.ts +75 -11
- package/src/plugins/builtin/ipo-calendar/listing-ipo.ts +160 -0
- package/src/plugins/builtin/ipo-calendar/model.ts +98 -2
- package/src/plugins/builtin/iv-history/client.ts +52 -11
- package/src/plugins/builtin/iv-history/format.ts +36 -23
- package/src/plugins/builtin/iv-history/headless.ts +33 -18
- package/src/plugins/builtin/iv-history/index.tsx +2 -2
- package/src/plugins/builtin/iv-history/model.ts +163 -27
- package/src/plugins/builtin/iv-history/pane.tsx +10 -6
- package/src/plugins/builtin/iv-history/screen-pane.tsx +22 -15
- package/src/plugins/builtin/iv-history/universe.ts +5 -1
- package/src/plugins/builtin/jobs/client.ts +25 -29
- package/src/plugins/builtin/kelly-sizer/model.ts +12 -8
- package/src/plugins/builtin/kelly-sizer/pane.tsx +9 -9
- package/src/plugins/builtin/kelly-sizer/sections.tsx +19 -10
- package/src/plugins/builtin/kelly-sizer/types.ts +10 -4
- package/src/plugins/builtin/macro-day/headless.ts +12 -5
- package/src/plugins/builtin/macro-day/index.tsx +1 -1
- package/src/plugins/builtin/macro-day/model.ts +39 -5
- package/src/plugins/builtin/macro-day/pane.tsx +27 -19
- package/src/plugins/builtin/macro-day/release-table.ts +2 -2
- package/src/plugins/builtin/market-heatmap/data.ts +8 -33
- package/src/plugins/builtin/market-movers/client.ts +27 -7
- package/src/plugins/builtin/market-movers/headless.ts +34 -12
- package/src/plugins/builtin/market-movers/index.tsx +26 -14
- package/src/plugins/builtin/market-movers/min-float.ts +74 -0
- package/src/plugins/builtin/market-movers/model.ts +4 -1
- package/src/plugins/builtin/market-movers/screener.ts +22 -4
- package/src/plugins/builtin/market-movers/session-body.tsx +13 -8
- package/src/plugins/builtin/market-movers/session-table.ts +4 -3
- package/src/plugins/builtin/market-movers/table.ts +17 -5
- package/src/plugins/builtin/members/breadth-pane.tsx +2 -1
- package/src/plugins/builtin/mna/headless.ts +2 -0
- package/src/plugins/builtin/mna/pane.tsx +3 -1
- package/src/plugins/builtin/news/headless.ts +3 -1
- package/src/plugins/builtin/news/index.tsx +4 -0
- package/src/plugins/builtin/news/wire/categories.ts +19 -3
- package/src/plugins/builtin/news/wire/industry-pane.tsx +1 -0
- package/src/plugins/builtin/news/wire/news/footer.ts +31 -5
- package/src/plugins/builtin/news/wire/news/preset-pane.tsx +6 -1
- package/src/plugins/builtin/news/wire/news/table.tsx +2 -2
- package/src/plugins/builtin/openfda/client.ts +14 -2
- package/src/plugins/builtin/openfda/index.tsx +3 -2
- package/src/plugins/builtin/openfda/model.ts +9 -0
- package/src/plugins/builtin/openfda/pane.tsx +42 -6
- package/src/plugins/builtin/options/analytics.ts +29 -5
- package/src/plugins/builtin/options/enrichment.ts +17 -5
- package/src/plugins/builtin/options/table.ts +5 -2
- package/src/plugins/builtin/options/types.ts +2 -0
- package/src/plugins/builtin/options/view.tsx +17 -4
- package/src/plugins/builtin/options-positioning/client.ts +11 -0
- package/src/plugins/builtin/options-positioning/headless.ts +21 -8
- package/src/plugins/builtin/options-positioning/index.tsx +1 -1
- package/src/plugins/builtin/options-positioning/model.ts +78 -9
- package/src/plugins/builtin/options-positioning/pane.tsx +21 -6
- package/src/plugins/builtin/options-scenario/client.ts +116 -47
- package/src/plugins/builtin/options-scenario/csp-screen-headless.ts +142 -10
- package/src/plugins/builtin/options-scenario/csp-screen-pane.tsx +206 -55
- package/src/plugins/builtin/options-scenario/csp-screen.ts +63 -23
- package/src/plugins/builtin/options-scenario/csp.ts +8 -2
- package/src/plugins/builtin/options-scenario/index.tsx +9 -7
- package/src/plugins/builtin/options-scenario/strategy-screen.ts +532 -0
- package/src/plugins/builtin/pe-band/model.ts +12 -49
- package/src/plugins/builtin/perps/cascade-tabs.tsx +161 -0
- package/src/plugins/builtin/perps/cascade.ts +236 -0
- package/src/plugins/builtin/perps/client.ts +56 -2
- package/src/plugins/builtin/perps/headless.ts +65 -9
- package/src/plugins/builtin/perps/index.tsx +7 -5
- package/src/plugins/builtin/perps/model.ts +18 -4
- package/src/plugins/builtin/perps/pane.tsx +19 -22
- package/src/plugins/builtin/perps/status-line.ts +25 -0
- package/src/plugins/builtin/plugin-module.ts +5 -1
- package/src/plugins/builtin/portfolio-list/cached-account.ts +3 -1
- package/src/plugins/builtin/portfolio-list/cli/bulk-symbols.ts +2 -8
- package/src/plugins/builtin/portfolio-list/cli/portfolio-command.ts +4 -4
- package/src/plugins/builtin/portfolio-list/cli/render.ts +7 -5
- package/src/plugins/builtin/portfolio-list/pane/futures-front.ts +40 -0
- package/src/plugins/builtin/portfolio-list/pane/index.tsx +6 -7
- package/src/plugins/builtin/portfolio-list/pane/streaming.ts +5 -2
- package/src/plugins/builtin/portfolio-list/pane/supplemental.ts +3 -2
- package/src/plugins/builtin/portfolio-list/quick-add/index.tsx +0 -14
- package/src/plugins/builtin/portfolio-list/quick-add/resolution.ts +5 -2
- package/src/plugins/builtin/portfolio-list/table.tsx +15 -9
- package/src/plugins/builtin/primary-dealers/client.ts +13 -38
- package/src/plugins/builtin/realized-vol/client.ts +13 -5
- package/src/plugins/builtin/realized-vol/evidence.ts +29 -4
- package/src/plugins/builtin/realized-vol/headless.ts +8 -4
- package/src/plugins/builtin/realized-vol/index.tsx +2 -2
- package/src/plugins/builtin/realized-vol/model.ts +37 -6
- package/src/plugins/builtin/realized-vol/pane.tsx +11 -9
- package/src/plugins/builtin/relative-rotation/client.ts +18 -4
- package/src/plugins/builtin/relative-rotation/headless.ts +3 -3
- package/src/plugins/builtin/relative-rotation/index.tsx +2 -1
- package/src/plugins/builtin/relative-rotation/model.ts +16 -40
- package/src/plugins/builtin/relative-rotation/pane.tsx +3 -2
- package/src/plugins/builtin/research/corporate-actions-pane.tsx +3 -2
- package/src/plugins/builtin/research/event-model.ts +40 -12
- package/src/plugins/builtin/research/headless.ts +1 -1
- package/src/plugins/builtin/research/index.tsx +7 -3
- package/src/plugins/builtin/research/relative-valuation-headless.ts +13 -26
- package/src/plugins/builtin/research/relative-valuation-model.ts +31 -3
- package/src/plugins/builtin/research/relative-valuation-pane.tsx +59 -20
- package/src/plugins/builtin/research/relative-valuation-peers.ts +217 -20
- package/src/plugins/builtin/research/relative-valuation-settings.ts +44 -0
- package/src/plugins/builtin/reverse-dcf/headless.ts +5 -3
- package/src/plugins/builtin/reverse-dcf/model.ts +61 -6
- package/src/plugins/builtin/reverse-dcf/pane.tsx +7 -4
- package/src/plugins/builtin/risk-factors/data.ts +4 -2
- package/src/plugins/builtin/risk-factors/headless.ts +5 -2
- package/src/plugins/builtin/roadmap/index.tsx +28 -0
- package/src/plugins/builtin/roadmap/model.ts +67 -0
- package/src/plugins/builtin/roadmap/pane.tsx +244 -0
- package/src/plugins/builtin/scanner/flow-model.ts +50 -4
- package/src/plugins/builtin/scanner/flow-pane.tsx +367 -65
- package/src/plugins/builtin/scanner/flow-session.ts +146 -0
- package/src/plugins/builtin/scanner/headless.ts +204 -35
- package/src/plugins/builtin/scanner/index.ts +16 -5
- package/src/plugins/builtin/scanner/live-headless.ts +48 -5
- package/src/plugins/builtin/scanner/live-model.ts +11 -0
- package/src/plugins/builtin/scanner/live-pane.tsx +3 -3
- package/src/plugins/builtin/scanner/lock-note.ts +3 -2
- package/src/plugins/builtin/seasonality/headless.ts +10 -1
- package/src/plugins/builtin/sec/fund-facts-view.tsx +5 -2
- package/src/plugins/builtin/sec/fund-facts.ts +116 -34
- package/src/plugins/builtin/sec/headless.ts +4 -2
- package/src/plugins/builtin/sec/index.tsx +3 -0
- package/src/plugins/builtin/series-inventory.ts +2 -0
- package/src/plugins/builtin/shared/cloud-resource.ts +16 -7
- package/src/plugins/builtin/shared/cloud-upgrade.ts +4 -3
- package/src/plugins/builtin/shared/earnings-calendar.ts +6 -2
- package/src/plugins/builtin/shared/earnings-report.ts +2 -2
- package/src/plugins/builtin/shared/headless-market-data.ts +2 -2
- package/src/plugins/builtin/shared/job-posting.ts +1 -0
- package/src/plugins/builtin/shared/members-menu.tsx +3 -2
- package/src/plugins/builtin/shared/pro-lock-note.ts +12 -12
- package/src/plugins/builtin/shared/report-freshness.ts +11 -2
- package/src/plugins/builtin/shared/research-cells.tsx +1 -1
- package/src/plugins/builtin/shared/series-cache.ts +4 -4
- package/src/plugins/builtin/shared/ticker-choice.tsx +2 -1
- package/src/plugins/builtin/shared/ticker-company.ts +77 -0
- package/src/plugins/builtin/shared/use-quote-board.ts +2 -1
- package/src/plugins/builtin/shared/volatility/live-session.ts +34 -8
- package/src/plugins/builtin/shared/volatility/pricing.ts +19 -0
- package/src/plugins/builtin/shared/wall-view-lifecycle.ts +3 -1
- package/src/plugins/builtin/themes/model.ts +16 -7
- package/src/plugins/builtin/themes/pane.tsx +5 -5
- package/src/plugins/builtin/thirteenf/api.ts +12 -1
- package/src/plugins/builtin/thirteenf/data.ts +7 -7
- package/src/plugins/builtin/thirteenf/headless.ts +31 -4
- package/src/plugins/builtin/ticker-detail/data-panes/historical-prices.tsx +43 -18
- package/src/plugins/builtin/ticker-detail/data-panes/returns-history.ts +3 -2
- package/src/plugins/builtin/ticker-detail/data-panes/returns-model.ts +62 -0
- package/src/plugins/builtin/ticker-detail/data-panes/returns-pane.tsx +83 -46
- package/src/plugins/builtin/ticker-detail/headless.ts +31 -16
- package/src/plugins/builtin/ticker-detail/overview/model.ts +11 -3
- package/src/plugins/builtin/ticker-detail/overview-tab.tsx +2 -1
- package/src/plugins/builtin/ticker-detail/pane.tsx +14 -8
- package/src/plugins/builtin/ticker-detail/quote-monitor/index.tsx +2 -1
- package/src/plugins/builtin/ticker-detail/settings.ts +1 -0
- package/src/plugins/builtin/time-sales/pane.tsx +31 -19
- package/src/plugins/builtin/treasury-auctions/headless.ts +21 -12
- package/src/plugins/builtin/treasury-auctions/pane.tsx +9 -3
- package/src/plugins/builtin/treasury-daily/client.ts +41 -5
- package/src/plugins/builtin/treasury-daily/headless.ts +2 -2
- package/src/plugins/builtin/treasury-daily/index.tsx +1 -1
- package/src/plugins/builtin/treasury-daily/model.ts +50 -3
- package/src/plugins/builtin/treasury-daily/pane.tsx +81 -2
- package/src/plugins/builtin/vol-surface/client.ts +3 -13
- package/src/plugins/builtin/vol-surface/headless.ts +3 -3
- package/src/plugins/builtin/vol-surface/index.tsx +1 -1
- package/src/plugins/builtin/vol-surface/pane.tsx +7 -5
- package/src/plugins/builtin/volatility/index.tsx +2 -2
- package/src/plugins/builtin/volatility/pane.tsx +7 -4
- package/src/plugins/builtin/world-venue-map/headless.ts +3 -3
- package/src/plugins/builtin/yield-curve/client.ts +61 -1
- package/src/plugins/builtin/yield-curve/headless.ts +9 -6
- package/src/plugins/builtin/yield-curve/index.tsx +34 -10
- package/src/plugins/builtin/yield-curve/swaps.tsx +9 -5
- package/src/plugins/catalog-browser.ts +2 -1
- package/src/plugins/catalog-manifest.ts +2 -1
- package/src/plugins/host-link.ts +1 -1
- package/src/plugins/marketplace/model.ts +18 -5
- package/src/portfolio/column-values.ts +11 -7
- package/src/portfolio/futures-positions.ts +6 -3
- package/src/portfolio/position-quantity.ts +15 -9
- package/src/remote/resources.ts +2 -1
- package/src/renderers/dom/data-table/row.tsx +26 -0
- package/src/renderers/dom/desktop/icons.tsx +7 -0
- package/src/renderers/dom/desktop/list-view.tsx +13 -10
- package/src/renderers/dom/desktop/query-bar.tsx +4 -2
- package/src/renderers/dom/desktop/select-field.tsx +4 -2
- package/src/renderers/dom/host/chart-surface.tsx +21 -0
- package/src/renderers/electrobun/bun/desktop/app-name.ts +3 -3
- package/src/renderers/electrobun/bun/desktop/backend.ts +21 -10
- package/src/renderers/electrobun/bun/desktop/host-requests.ts +15 -0
- package/src/renderers/electrobun/bun/desktop/initialization.ts +2 -0
- package/src/renderers/electrobun/bun/desktop/installer-folder.ts +731 -0
- package/src/renderers/electrobun/bun/desktop/relaunch.ts +102 -10
- package/src/renderers/electrobun/bun/desktop/update.ts +115 -14
- package/src/renderers/electrobun/bun/desktop/view-ids.ts +52 -0
- package/src/renderers/electrobun/bun/desktop/windows-script.ts +92 -0
- package/src/renderers/electrobun/bun/index.ts +26 -2
- package/src/renderers/electrobun/bun/window/create.ts +43 -4
- package/src/renderers/electrobun/bun/window/events.ts +20 -0
- package/src/renderers/electrobun/bun/window/windows-custom-chrome.ts +9 -2
- package/src/renderers/electrobun/bun/window/windows-native.ts +78 -0
- package/src/renderers/electrobun/bun/window/windows-quit.ts +57 -0
- package/src/renderers/electrobun/shared/app-name.ts +13 -0
- package/src/renderers/electrobun/shared/protocol.ts +12 -0
- package/src/renderers/electrobun/view/backend-rpc.ts +6 -0
- package/src/renderers/electrobun/view/main.tsx +24 -1
- package/src/renderers/electrobun/view/news-source.ts +5 -1
- package/src/renderers/electrobun/view/remote/ticker-repository.ts +14 -7
- package/src/renderers/electrobun/view/ui-host.tsx +8 -0
- package/src/renderers/electrobun/view/view-ids.ts +85 -0
- package/src/renderers/opentui/start.tsx +5 -0
- package/src/series/registry.ts +1 -0
- package/src/series/types.ts +6 -0
- package/src/series/validate.ts +1 -0
- package/src/sources/gloomberb-cloud/fred-series.ts +3 -1
- package/src/sources/gloomberb-cloud/index.ts +43 -8
- package/src/sources/gloomberb-cloud/news.ts +47 -7
- package/src/sources/provider-router/financials.ts +15 -3
- package/src/sources/provider-router/index.ts +8 -5
- package/src/state/ticker-cleanup.ts +50 -0
- package/src/sync/controller.ts +4 -3
- package/src/sync/core-contributors.ts +90 -31
- package/src/telemetry/stall-reports-dom.ts +38 -0
- package/src/telemetry/stall-reports-node.ts +75 -0
- package/src/telemetry/stall-reports.ts +214 -0
- package/src/test-support/preload.ts +14 -0
- package/src/theme/themes.ts +10 -0
- package/src/tickers/company-name-listing.ts +53 -13
- package/src/tickers/company-name.ts +50 -4
- package/src/tickers/index-roots.ts +7 -0
- package/src/tickers/listing-fate.ts +2 -2
- package/src/tickers/listing-venues.ts +15 -3
- package/src/tickers/search/index.ts +6 -2
- package/src/tickers/search/ranking.ts +5 -1
- package/src/tickers/search/upsert.ts +13 -0
- package/src/tickers/terminal-codes.ts +19 -0
- package/src/tickers/ticker-changes.ts +8 -4
- package/src/time-series/alignment.ts +1 -1
- package/src/time-series/economic.ts +18 -4
- package/src/time-series/field-catalog.ts +1 -1
- package/src/time-series/filed-trailing-eps.ts +197 -0
- package/src/time-series/fundamentals.ts +44 -1
- package/src/time-series/ice-credit.ts +3 -0
- package/src/time-series/price-comparison.ts +30 -2
- package/src/time-series/resolve-context.ts +3 -1
- package/src/time-series/resolve.ts +56 -4
- package/src/time-series/session-bar.ts +11 -0
- package/src/time-series/spec.ts +3 -2
- package/src/time-series/studies.ts +8 -2
- package/src/time-series/total-return.ts +160 -0
- package/src/time-series/transforms.ts +2 -3
- package/src/time-series/types.ts +22 -1
- package/src/types/company-from.ts +40 -0
- package/src/types/data-provider.ts +7 -0
- package/src/types/financials.ts +59 -1
- package/src/types/headless.ts +27 -3
- package/src/types/news-source.ts +1 -0
- package/src/types/plugin.ts +9 -0
- package/src/ui/host.tsx +3 -0
- package/src/updater/failure.ts +4 -1
- package/src/utils/cli-output.ts +42 -1
- package/src/utils/crypto-pair.ts +165 -7
- package/src/utils/declared-dividends.ts +1 -1
- package/src/utils/forward-dividend.ts +2 -0
- package/src/utils/fundamentals.ts +60 -8
- package/src/utils/fx-market-hours.ts +26 -3
- package/src/utils/main-thread-stall.ts +35 -2
- package/src/utils/market-capitalization.ts +24 -1
- package/src/utils/price-history.ts +7 -1
- package/src/utils/shell-word.ts +8 -0
- package/src/utils/trailing-dividend.ts +53 -4
- package/src/version.ts +2 -2
- package/src/plugins/builtin/clinical-trials/ticker-sponsor.ts +0 -17
|
@@ -16,14 +16,23 @@ function themeChoicesText(): string {
|
|
|
16
16
|
return `Themes: ${choices}. gloom config themes lists them with notes.`;
|
|
17
17
|
}
|
|
18
18
|
|
|
19
|
+
/** `Light themes: paper (Paper), github-light (GitHub Light), ...`, for `light` or `dark` typed as a theme; null for anything else. */
|
|
20
|
+
function appearanceHint(input: string): string | null {
|
|
21
|
+
const appearance = input.trim().toLowerCase();
|
|
22
|
+
if (appearance !== "light" && appearance !== "dark") return null;
|
|
23
|
+
const matching = listThemes().filter((theme) => theme.appearance === appearance).map(({ id, name }) => `${id} (${name})`);
|
|
24
|
+
return matching.length > 0 ? ` ${appearance === "light" ? "Light" : "Dark"} themes: ${matching.join(", ")}.` : null;
|
|
25
|
+
}
|
|
26
|
+
|
|
19
27
|
/**
|
|
20
28
|
* The id `input` names, by id or display name in any case. Anything else
|
|
21
|
-
* fails with the closest id when there is one, and every id with its name
|
|
29
|
+
* fails with the closest id when there is one, and every id with its name;
|
|
30
|
+
* `light` or `dark` with the themes of that look.
|
|
22
31
|
*/
|
|
23
32
|
export function requireThemeId(input: string): string {
|
|
24
33
|
const lookup = resolveThemeId(input);
|
|
25
34
|
if (lookup.ok) return lookup.id;
|
|
26
|
-
const hint = lookup.suggestion ? ` Did you mean ${describeThemeId(lookup.suggestion)}?` : "";
|
|
35
|
+
const hint = appearanceHint(input) ?? (lookup.suggestion ? ` Did you mean ${describeThemeId(lookup.suggestion)}?` : "");
|
|
27
36
|
return fail(`Unknown theme "${input.trim()}".${hint}`, themeChoicesText());
|
|
28
37
|
}
|
|
29
38
|
|
|
@@ -3,12 +3,12 @@ import { formatShortDate, parseDisplayDate } from "../../utils/datetime-format";
|
|
|
3
3
|
import { formatReportedMoney } from "../../utils/reported-money";
|
|
4
4
|
import {
|
|
5
5
|
appTtmRate, computedEnterpriseValueNote, convertedPriceEarningsNote, enterpriseValueLabel, enterpriseValueReconciliationNote, epsConversionNote,
|
|
6
|
-
fundamentalsCurrency, reportedEnterpriseValue, ttmAtAppRate, ttmConversionNote,
|
|
6
|
+
fundamentalsCurrency, reportedEnterpriseValue, trailingEpsSourceNote, ttmAtAppRate, ttmConversionNote,
|
|
7
7
|
} from "../../utils/fundamentals";
|
|
8
8
|
import { latestFinancialPeriod } from "../../utils/latest-financial-period";
|
|
9
9
|
import { burnsCash, cashRunway, SHORT_RUNWAY_HISTORY, formatRunwayMonths, offeringNote, offeringsAfter, runwayMethod, type CashRunway, type OfferingFiling, type RunwayEstimate } from "../../utils/cash-runway";
|
|
10
10
|
import { exportedFundamentals, formatPriceEarnings, NOT_MEANINGFUL, priceEarningsOnEarnings } from "../../utils/price-earnings";
|
|
11
|
-
import { describeFundamentalMarketCap, marketCapBasisNote, selectMarketCapitalization, viewMarketCapitalization } from "../../utils/market-capitalization";
|
|
11
|
+
import { describeFundamentalMarketCap, marketCapBasisNote, selectMarketCapitalization, viewMarketCapitalization, withheldMarketCap } from "../../utils/market-capitalization";
|
|
12
12
|
import {
|
|
13
13
|
formatCompact,
|
|
14
14
|
formatCurrency,
|
|
@@ -76,14 +76,14 @@ import { isKnownNonUsListing, secFilingItemCodes, US_FUND_FACTS_ONLY } from "../
|
|
|
76
76
|
import { currentReportItemsLabel, hiddenFilingsNote, loadLatestFilings, type HiddenFilings } from "../../utils/sec-filings";
|
|
77
77
|
import { canonicalExchange, exchangeLabel, isKnownExchangeCode, isUsListingExchange } from "../../utils/exchanges";
|
|
78
78
|
import {
|
|
79
|
-
failIfNotTraded, failMovedSymbol, ListingArgError, listingChoiceNotes, listingFateLoader, listingIdentity, loadBareVenues,
|
|
79
|
+
coinListingNotes, failIfNotTraded, failMovedSymbol, ListingArgError, listingChoiceNotes, listingFateLoader, listingIdentity, loadBareVenues,
|
|
80
80
|
resolveCliListing, type CliListing, type ListingDataRequest,
|
|
81
81
|
} from "../listing-arg";
|
|
82
82
|
import { movedAwayChange } from "../../tickers/ticker-changes";
|
|
83
83
|
import { companyMemberships, loadCompanyMemberships, type CompanyMemberships, type ListMembership } from "../issuer-membership";
|
|
84
84
|
import { isNotATickerMessage } from "../not-a-ticker";
|
|
85
85
|
import { sharesOutstandingInReceipts } from "../../utils/depositary-receipt";
|
|
86
|
-
import { depositaryPairText, isReceiptSide, listingDepositaryPair } from "../../market-data/depositary-pair";
|
|
86
|
+
import { cedearRatioText, depositaryPairText, isReceiptSide, listingCedearRatio, listingDepositaryPair } from "../../market-data/depositary-pair";
|
|
87
87
|
import { cliFreshnessFooter } from "../result";
|
|
88
88
|
import { providerMissReason } from "../../sources/provider-errors";
|
|
89
89
|
import { exportEntriesTable, reportFooterLines, type CliReportTables } from "../report-tables";
|
|
@@ -92,14 +92,15 @@ import { fundamentalsFreshness, quotesFreshness } from "../freshness";
|
|
|
92
92
|
import { distributionHistory, forwardDividendBasis, forwardDividendMayHaveLapsed, lapsedDividend, noCurrentDividend, TRAILING_DIVIDEND_BASIS, type DistributionHistory, type DividendLapse } from "../../utils/forward-dividend";
|
|
93
93
|
import { declaredDividends } from "../../utils/declared-dividends";
|
|
94
94
|
import { historyTrailingDividendYield, measuresTrailingYield } from "../../market-data/quotes/live-valuation";
|
|
95
|
-
import { notTheCoinNote } from "./crypto-hints";
|
|
96
95
|
import { loadOfferingFilings, loadStatementFilings, resultsReleaseText, statementPeriodText, type StatementFilingsReport } from "../statement-filings";
|
|
97
96
|
import type { BankFiguresPayload } from "../../api-client/bank-figures";
|
|
98
97
|
import { bankSection } from "../bank-section";
|
|
99
|
-
import type { FundBondFacts } from "../../api-client/fund-facts";
|
|
100
|
-
import { bondFigures,
|
|
98
|
+
import type { FundBondFacts, FundFactsPayload } from "../../api-client/fund-facts";
|
|
99
|
+
import { bondFigures, NOT_SEC_YIELD } from "../../market-data/bond-funds";
|
|
100
|
+
import { readFundFacts } from "../../market-data/fund-facts";
|
|
101
101
|
import { taxEquivalentLines, type TaxEquivalentAnalysis } from "../../market-data/tax-equivalent";
|
|
102
102
|
import { isRoundTheClockCoin } from "../../utils/crypto-pair";
|
|
103
|
+
import { ipoDetailNotes, ipoMetricRows, loadTickerIpo, type TickerIpo } from "../../plugins/builtin/ipo-calendar/listing-ipo";
|
|
103
104
|
import { coinNewsFallbackNotice } from "../../sources/gloomberb-cloud/news";
|
|
104
105
|
|
|
105
106
|
const NEWS_ITEM_LIMIT = 5;
|
|
@@ -126,6 +127,8 @@ const METADATA_SEPARATOR = " · ";
|
|
|
126
127
|
interface TickerCommandDependencies {
|
|
127
128
|
/** `--exchange`: the listing, for a symbol that trades in several places. */
|
|
128
129
|
exchange?: string;
|
|
130
|
+
/** A stock's IPO of the last year with its lock-up news; a failure leaves the IPO section out. */
|
|
131
|
+
listingIpo?: (listing: { symbol: string; exchange?: string | null }) => Promise<TickerIpo | null>;
|
|
129
132
|
initMarketData?: () => Promise<MarketContext>;
|
|
130
133
|
fail?: (message: string, details?: string) => never;
|
|
131
134
|
printResult?: CliCommandContext["printResult"];
|
|
@@ -667,21 +670,23 @@ function isYieldMetric(label: string): boolean {
|
|
|
667
670
|
}
|
|
668
671
|
|
|
669
672
|
/**
|
|
670
|
-
* A US-listed fund's
|
|
671
|
-
*
|
|
673
|
+
* A US-listed fund's facts for the report: the bond figures its yield lines
|
|
674
|
+
* read, and whether `fn ETF` has figures to point to. Null for any other
|
|
675
|
+
* listing, and when they cannot be read, which leaves the yield as it was
|
|
676
|
+
* and points nowhere.
|
|
672
677
|
*/
|
|
673
|
-
export async function
|
|
678
|
+
export async function loadReportFundFacts(
|
|
674
679
|
symbol: string,
|
|
675
680
|
exchange: string | undefined,
|
|
676
681
|
financials: Pick<TickerFinancials, "quote" | "quoteMetadata">,
|
|
677
682
|
tickerFile: TickerRecord | null = null,
|
|
678
|
-
load: (symbol: string) => Promise<
|
|
679
|
-
): Promise<
|
|
683
|
+
load: (symbol: string) => Promise<FundFactsPayload> = (ticker) => readFundFacts(ticker),
|
|
684
|
+
): Promise<FundFactsPayload | null> {
|
|
680
685
|
if (resolveTickerInstrumentKind(tickerFile, financials) !== "fund" || (exchange && !isUsListingExchange(exchange))) return null;
|
|
681
686
|
try {
|
|
682
687
|
return await load(symbol);
|
|
683
688
|
} catch (error) {
|
|
684
|
-
logFailure("cli.commands-ticker", "Read
|
|
689
|
+
logFailure("cli.commands-ticker", "Read fund facts failed")(error);
|
|
685
690
|
return null;
|
|
686
691
|
}
|
|
687
692
|
}
|
|
@@ -712,7 +717,8 @@ function fundamentalsMetrics(
|
|
|
712
717
|
{ label: "P/E (TTM)", ...multipleFigure(priceEarningsOnEarnings(fundamentals?.trailingPE, fundamentals?.eps)) },
|
|
713
718
|
{ label: "Forward P/E", ...multipleFigure(priceEarningsOnEarnings(fundamentals?.forwardPE, fundamentals?.forwardEps)) },
|
|
714
719
|
{ label: "PEG", ...multipleFigure(fundamentals?.pegRatio) },
|
|
715
|
-
//
|
|
720
|
+
// EPS (TTM) is the last four filed quarters' (filed-trailing-eps), so its twelve months can end before those of
|
|
721
|
+
// the flows below, Gloom Cloud's trailing block; Gloom Cloud's EPS standing in is noted (trailingEpsSourceNote).
|
|
716
722
|
{ label: "EPS (TTM)", ...reportedMoney(fundamentals?.eps, fundamentals?.epsCurrency?.trim() || reportingCurrency, true, codes) },
|
|
717
723
|
{
|
|
718
724
|
label: dividendYieldLabel(fundamentals?.dividendYieldBasis, bond),
|
|
@@ -797,6 +803,7 @@ function fundamentalsNotes(
|
|
|
797
803
|
: undefined;
|
|
798
804
|
const conversion = [...TRAILING_MONEY_METRICS].some(shown) ? ttmConversionNote(fundamentals) : undefined;
|
|
799
805
|
const eps = shown("EPS (TTM)") ? epsConversionNote(fundamentals) : undefined;
|
|
806
|
+
const epsSource = trailingEpsSourceNote(fundamentals, { eps: shown("EPS (TTM)"), pe: shown("P/E (TTM)") });
|
|
800
807
|
const priceEarnings = metrics.some((metric) => metric.label === "P/E (TTM)" && typeof metric.value === "number")
|
|
801
808
|
? convertedPriceEarningsNote(fundamentals, quoteCurrency)
|
|
802
809
|
: undefined;
|
|
@@ -804,7 +811,9 @@ function fundamentalsNotes(
|
|
|
804
811
|
const enterpriseValue = shown("Enterprise Value")
|
|
805
812
|
? enterpriseValueReconciliationNote(fundamentals) ?? computedEnterpriseValueNote(fundamentals)
|
|
806
813
|
: undefined;
|
|
807
|
-
|
|
814
|
+
// A cap Gloom Cloud withheld says why, as RV and EQS do.
|
|
815
|
+
const withheld = withheldMarketCap(fundamentals)?.note;
|
|
816
|
+
return [withheld, shareBasis, enterpriseValue, conversion, eps, epsSource, priceEarnings].filter((note): note is string => !!note);
|
|
808
817
|
}
|
|
809
818
|
|
|
810
819
|
// The share count is the market cap's basis: the cap is the count times the price, or a note says why not.
|
|
@@ -814,8 +823,10 @@ type FundamentalsReportData = TickerFinancials & {
|
|
|
814
823
|
symbol: string;
|
|
815
824
|
exchange?: string;
|
|
816
825
|
distributions?: DividendDistributions | null;
|
|
817
|
-
/** A bond fund's SEC yield, yield to worst and duration (
|
|
826
|
+
/** A bond fund's SEC yield, yield to worst and duration (loadReportFundFacts). */
|
|
818
827
|
bondFund?: FundBondFacts | null;
|
|
828
|
+
/** A US-listed fund's facts (loadReportFundFacts): the note points to `fn ETF` only when they cover it. */
|
|
829
|
+
fundFacts?: FundFactsPayload | null;
|
|
819
830
|
/** `fundamentals --tax-rate`: the tax-equivalent yield and muni/Treasury ratio. */
|
|
820
831
|
taxEquivalent?: TaxEquivalentAnalysis | null;
|
|
821
832
|
/** The filings behind the latest statements, and a newer quarter's results release. */
|
|
@@ -839,20 +850,25 @@ function statementFilingsNotes(report: StatementFilingsReport | null | undefined
|
|
|
839
850
|
}
|
|
840
851
|
|
|
841
852
|
/**
|
|
842
|
-
* Where a fund's facts are: for a US listing, the ETF function
|
|
843
|
-
* premium, net assets)
|
|
844
|
-
* fund
|
|
853
|
+
* Where a fund's facts are: for a US listing, the ETF function, naming the
|
|
854
|
+
* figures it has (fee, NAV, premium, net assets), and only when it has some:
|
|
855
|
+
* a fund it has none for, or whose facts could not be read, gets no pointer
|
|
856
|
+
* to a pane that would only say why. A fund listed elsewhere has none yet.
|
|
857
|
+
* Only for a fund: a stock's report says nothing of it.
|
|
845
858
|
*/
|
|
846
859
|
function fundFactsNote(
|
|
847
860
|
symbol: string,
|
|
848
861
|
exchange: string | undefined,
|
|
849
862
|
financials: Pick<TickerFinancials, "quote" | "quoteMetadata">,
|
|
850
863
|
tickerFile: TickerRecord | null = null,
|
|
864
|
+
facts: FundFactsPayload | null = null,
|
|
851
865
|
): string | null {
|
|
852
866
|
if (resolveTickerInstrumentKind(tickerFile, financials) !== "fund") return null;
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
867
|
+
if (exchange && !isUsListingExchange(exchange)) return US_FUND_FACTS_ONLY;
|
|
868
|
+
if (!facts?.covered) return null;
|
|
869
|
+
const figures = [facts.expenseRatio && "fee", facts.nav && "NAV", facts.premiumDiscount && "premium", facts.netAssets && "net assets"]
|
|
870
|
+
.filter((figure): figure is string => !!figure);
|
|
871
|
+
return `Fund facts${figures.length ? ` (${figures.join(", ")})` : ""}: fn ETF ${symbol}.`;
|
|
856
872
|
}
|
|
857
873
|
|
|
858
874
|
/**
|
|
@@ -947,7 +963,7 @@ export function renderFundamentalsReport(
|
|
|
947
963
|
const before = lines.length;
|
|
948
964
|
const metrics = fundamentalsReportMetrics(financials, view);
|
|
949
965
|
appendMetricSection(lines, view === "valuation" ? "Valuation" : "Fundamentals", metricLines(metrics));
|
|
950
|
-
const fund = fundFactsNote(symbol, financials.exchange || quote?.exchangeName, financials);
|
|
966
|
+
const fund = fundFactsNote(symbol, financials.exchange || quote?.exchangeName, financials, null, financials.fundFacts);
|
|
951
967
|
if (lines.length === before) lines.push("", cliStyles.muted([`No ${view} reported for ${financials.symbol}.`, fund].filter(Boolean).join(" ")));
|
|
952
968
|
else if (fund) lines.push(cliStyles.muted(fund));
|
|
953
969
|
for (const note of fundamentalsNotes(atRegularSessionPrice(financials), metrics, quote?.currency)) lines.push(cliStyles.muted(note));
|
|
@@ -987,7 +1003,8 @@ export function fundamentalsReportTables(
|
|
|
987
1003
|
freshness: ReportFreshness,
|
|
988
1004
|
): CliReportTables {
|
|
989
1005
|
const metrics = fundamentalsReportMetrics(financials, view);
|
|
990
|
-
const fund = fundFactsNote(financials.quote?.symbol ?? financials.symbol, financials.exchange || financials.quote?.exchangeName, financials
|
|
1006
|
+
const fund = fundFactsNote(financials.quote?.symbol ?? financials.symbol, financials.exchange || financials.quote?.exchangeName, financials, null,
|
|
1007
|
+
financials.fundFacts);
|
|
991
1008
|
const tables = [exportEntriesTable(
|
|
992
1009
|
view === "valuation" ? "Valuation" : "Fundamentals",
|
|
993
1010
|
metrics.map((metric) => ({ label: metric.label, value: metric.value, formatted: metric.text, unit: metric.unit })),
|
|
@@ -1064,18 +1081,24 @@ export async function buildTickerReport({
|
|
|
1064
1081
|
distributions = null,
|
|
1065
1082
|
statementFilings = null,
|
|
1066
1083
|
bondFund = null,
|
|
1084
|
+
fundFacts = null,
|
|
1067
1085
|
memberships,
|
|
1068
1086
|
offerings = [],
|
|
1087
|
+
ipo = null,
|
|
1069
1088
|
}: {
|
|
1070
1089
|
symbol: string;
|
|
1090
|
+
/** A stock's IPO of the last year, with its lock-up estimate and news (loadTickerIpo). */
|
|
1091
|
+
ipo?: TickerIpo | null;
|
|
1071
1092
|
/** The lists holding the company, by any of its listings (loadCompanyMemberships); the saved listing's own lists when absent. */
|
|
1072
1093
|
memberships?: CompanyMemberships;
|
|
1073
1094
|
/** The filings behind the latest statements, and a newer quarter's results release. */
|
|
1074
1095
|
statementFilings?: StatementFilingsReport | null;
|
|
1075
1096
|
/** The company's latest offering prospectuses (424B5, 424B4); those after the latest balance sheet get a note. */
|
|
1076
1097
|
offerings?: readonly OfferingFiling[];
|
|
1077
|
-
/** A bond fund's SEC yield, yield to worst and duration (
|
|
1098
|
+
/** A bond fund's SEC yield, yield to worst and duration (loadReportFundFacts). */
|
|
1078
1099
|
bondFund?: FundBondFacts | null;
|
|
1100
|
+
/** A US-listed fund's facts (loadReportFundFacts): the report points to `fn ETF` only when they cover it. */
|
|
1101
|
+
fundFacts?: FundFactsPayload | null;
|
|
1079
1102
|
/** The distributions a dividend yield is read with (loadDividendDistributions). */
|
|
1080
1103
|
distributions?: DividendDistributions | null;
|
|
1081
1104
|
/** The exchange the command named, as a canonical code. */
|
|
@@ -1091,7 +1114,7 @@ export async function buildTickerReport({
|
|
|
1091
1114
|
notes?: string;
|
|
1092
1115
|
/** Why there is no quote, when a source said; "Quote unavailable." otherwise. */
|
|
1093
1116
|
quoteNote?: string;
|
|
1094
|
-
/** "CAR = Avis Budget Group, NASDAQ (
|
|
1117
|
+
/** "CAR = Avis Budget Group, NASDAQ (different companies on XETRA, ASX)", for a bare symbol several companies list. */
|
|
1095
1118
|
listingNote?: string;
|
|
1096
1119
|
recentNews?: NewsArticle[];
|
|
1097
1120
|
recentSecFilings?: SecFilingItem[];
|
|
@@ -1148,6 +1171,9 @@ export async function buildTickerReport({
|
|
|
1148
1171
|
if (depositaryPair) {
|
|
1149
1172
|
lines.push(cliStyles.muted(`ADR ratio ${depositaryPairText(depositaryPair, isReceiptSide(financials))}. Implied FX and premium: gloom fn ADR ${quote?.symbol ?? symbol}`));
|
|
1150
1173
|
}
|
|
1174
|
+
// A CEDEAR states its ratio in its company's shares, as a receipt does.
|
|
1175
|
+
const cedearRatio = listingCedearRatio(financials);
|
|
1176
|
+
if (cedearRatio) lines.push(cliStyles.muted(`CEDEAR ratio ${cedearRatioText(cedearRatio)}.`));
|
|
1151
1177
|
|
|
1152
1178
|
// A list that holds the company as another of its listings says which: "Watchlists R (as RCI.B:TSX)".
|
|
1153
1179
|
const lists = memberships ?? companyMemberships(config, tickerFile, [], null);
|
|
@@ -1233,7 +1259,15 @@ export async function buildTickerReport({
|
|
|
1233
1259
|
]);
|
|
1234
1260
|
}
|
|
1235
1261
|
|
|
1236
|
-
|
|
1262
|
+
// A stock that listed in the last year: its IPO, the move since, and when its lock-up is estimated to end.
|
|
1263
|
+
if (ipo) {
|
|
1264
|
+
appendMetricSection(lines, "IPO", ipoMetricRows(ipo.deal, quote ? getRegularSessionDisplay(quote)?.price : null));
|
|
1265
|
+
for (const note of ipoDetailNotes(ipo.deal, ipo.news)) lines.push(cliStyles.muted(note));
|
|
1266
|
+
}
|
|
1267
|
+
|
|
1268
|
+
// A listing of the last year may have no statements yet: its IPO says how recent it is.
|
|
1269
|
+
const listing = { listedSince: ipo ? ipo.deal.listingDate ?? ipo.deal.firstDay?.session ?? null : null };
|
|
1270
|
+
const metrics = fundamentalsMetrics(quote, priced.fundamentals, profile, { text: marketCapText }, priceReturns, fundamentalsCurrency(financials, listing),
|
|
1237
1271
|
{ text: enterpriseValueText }, distributions, bondFund, codes);
|
|
1238
1272
|
const reportedCurrency = financials.financialCurrency?.trim();
|
|
1239
1273
|
const statements = [...financials.annualStatements, ...financials.quarterlyStatements];
|
|
@@ -1254,7 +1288,8 @@ export async function buildTickerReport({
|
|
|
1254
1288
|
if (lines.length > beforeFundamentals) for (const note of conversionNotes(toBase, convertedCurrencies, rates)) lines.push(cliStyles.muted(note));
|
|
1255
1289
|
// Where a fund's facts would go: under its fundamentals, or in their place.
|
|
1256
1290
|
const fund = fundFactsNote(quote?.symbol ?? symbol,
|
|
1257
|
-
quote?.tradingExchangeName || listingExchange || quote?.listingExchangeName || quote?.exchangeName || tickerFile?.metadata.exchange, financials, tickerFile
|
|
1291
|
+
quote?.tradingExchangeName || listingExchange || quote?.listingExchangeName || quote?.exchangeName || tickerFile?.metadata.exchange, financials, tickerFile,
|
|
1292
|
+
fundFacts);
|
|
1258
1293
|
if (fund) lines.push(...lines.length === beforeFundamentals ? [""] : [], cliStyles.muted(fund));
|
|
1259
1294
|
|
|
1260
1295
|
if (capitalization?.provenance.kind === "fundamentals") {
|
|
@@ -1331,9 +1366,11 @@ function buildTickerStructuredData({
|
|
|
1331
1366
|
bondFund = null,
|
|
1332
1367
|
memberships,
|
|
1333
1368
|
offerings = [],
|
|
1369
|
+
ipo = null,
|
|
1334
1370
|
}: {
|
|
1335
1371
|
symbol: string;
|
|
1336
1372
|
listing: CliListing;
|
|
1373
|
+
ipo?: TickerIpo | null;
|
|
1337
1374
|
memberships: CompanyMemberships;
|
|
1338
1375
|
statementFilings: StatementFilingsReport | null;
|
|
1339
1376
|
offerings?: readonly OfferingFiling[];
|
|
@@ -1416,6 +1453,8 @@ function buildTickerStructuredData({
|
|
|
1416
1453
|
// and the offering prospectuses filed since that the cash does not include.
|
|
1417
1454
|
cashRunway: runway,
|
|
1418
1455
|
offeringsAfterBalanceSheet: runway ? offeringsAfter(offerings, runway.periodEnd) : [],
|
|
1456
|
+
// A stock that listed in the last year: its IPO deal (offer price, first day, lock-up estimate) and lock-up news.
|
|
1457
|
+
...ipo ? { ipo: { ...ipo.deal, lockupNews: ipo.news } } : {},
|
|
1419
1458
|
// The form and filed date of the latest periods' filings, and a newer quarter's results released before its statements.
|
|
1420
1459
|
statementFilings,
|
|
1421
1460
|
notes,
|
|
@@ -1444,6 +1483,8 @@ function buildTickerStructuredData({
|
|
|
1444
1483
|
}
|
|
1445
1484
|
|
|
1446
1485
|
function depositaryPairJson(financials: TickerFinancials) {
|
|
1486
|
+
const cedear = listingCedearRatio(financials);
|
|
1487
|
+
if (cedear) return { cedearRatio: { ...cedear, text: cedearRatioText(cedear) } };
|
|
1447
1488
|
const pair = listingDepositaryPair(financials);
|
|
1448
1489
|
if (!pair) return {};
|
|
1449
1490
|
const receipt = isReceiptSide(financials);
|
|
@@ -1535,10 +1576,11 @@ export async function ticker(symbol: string, dependencies: TickerCommandDependen
|
|
|
1535
1576
|
// The yield's distributions, read beside the rest when a trailing yield, a forward basis or its lapse needs them; they never fail the report.
|
|
1536
1577
|
const distributions = loadDividendDistributions(dataProvider, { symbol: requestSymbol, exchange }, resolvedFinancials,
|
|
1537
1578
|
{ declared: !dependencies.printResult });
|
|
1538
|
-
// A
|
|
1539
|
-
const
|
|
1579
|
+
// A fund's facts: its bond figures beside its distribution yield, and whether fn ETF has any to point to.
|
|
1580
|
+
const fundFacts = loadReportFundFacts(requestSymbol,
|
|
1540
1581
|
quote?.tradingExchangeName || exchange || quote?.listingExchangeName || quote?.exchangeName || tickerFile?.metadata.exchange,
|
|
1541
1582
|
resolvedFinancials, tickerFile);
|
|
1583
|
+
const bondFund = fundFacts.then((facts) => facts?.bond ?? null);
|
|
1542
1584
|
const statementFilings = loadStatementFilings(statementSources, { symbol: requestSymbol, exchange }, {
|
|
1543
1585
|
quarter: latestFinancialPeriod(resolvedFinancials.quarterlyStatements, (row) => row.date),
|
|
1544
1586
|
annual: latestFinancialPeriod(resolvedFinancials.annualStatements, (row) => row.date),
|
|
@@ -1554,6 +1596,11 @@ export async function ticker(symbol: string, dependencies: TickerCommandDependen
|
|
|
1554
1596
|
});
|
|
1555
1597
|
// An offering since the latest balance sheet, read only when the report has a runway to flag.
|
|
1556
1598
|
const offerings = loadOfferingFilings(statementSources, { symbol: requestSymbol, exchange }, cashRunway(resolvedFinancials) != null);
|
|
1599
|
+
// A stock's IPO of the last year, read beside the rest; it never fails the report.
|
|
1600
|
+
const ipoLoad = quote && resolveTickerInstrumentKind(tickerFile, resolvedFinancials) === "equity"
|
|
1601
|
+
? (dependencies.listingIpo ?? loadTickerIpo)({ symbol: requestSymbol, exchange: exchange || quote.listingExchangeName || quote.exchangeName })
|
|
1602
|
+
.catch(logFailure("cli.commands-ticker", "Read a listing's IPO failed", null))
|
|
1603
|
+
: Promise.resolve(null);
|
|
1557
1604
|
const [notesResult, newsResult, secFilingsResult] = await Promise.allSettled([
|
|
1558
1605
|
notesFiles.load(tickerFile?.metadata.ticker ?? normalized),
|
|
1559
1606
|
dataProvider.getNews({
|
|
@@ -1589,17 +1636,18 @@ export async function ticker(symbol: string, dependencies: TickerCommandDependen
|
|
|
1589
1636
|
// The quote is the feed in this report; without one, the fundamentals date it.
|
|
1590
1637
|
const freshness = quote ? quotesFreshness([quote]) : fundamentalsFreshness(resolvedFinancials);
|
|
1591
1638
|
const quoteNote = quote ? undefined : await quoteUnavailableNote(dataProvider, requestSymbol, exchange);
|
|
1592
|
-
|
|
1593
|
-
|
|
1594
|
-
|
|
1595
|
-
|
|
1596
|
-
|
|
1639
|
+
// A bare coin ticker read as another listing says where the coin is, as `quote` does: from the quote, else from the saved listing.
|
|
1640
|
+
const choiceNotes = [
|
|
1641
|
+
...await listingChoiceNotes(listing, { store, dataProvider }, quote, venues),
|
|
1642
|
+
...quote || !tickerFile ? [] : coinListingNotes(listing, { name: tickerFile.metadata.name, instrumentType: tickerFile.metadata.assetCategory }),
|
|
1643
|
+
];
|
|
1644
|
+
const listingNote = choiceNotes.join("\n") || undefined;
|
|
1597
1645
|
const memberships = await membershipsLoad;
|
|
1598
1646
|
// A converted TTM block at the rate the rest of the report converts at, the one `fx` reports.
|
|
1599
1647
|
const shownFinancials = await atReportTtmRate(resolvedFinancials, toBase);
|
|
1600
1648
|
if (dependencies.printResult) {
|
|
1601
1649
|
const newsNote = recentNews[0]?.searchedFor ? coinNewsFallbackNotice(requestSymbol, recentNews[0].searchedFor) : null;
|
|
1602
|
-
const warnings = [
|
|
1650
|
+
const warnings = [...choiceNotes, quoteNote, newsNote].filter((note): note is string => !!note);
|
|
1603
1651
|
dependencies.printResult({
|
|
1604
1652
|
freshness,
|
|
1605
1653
|
warnings: warnings.length > 0 ? warnings : undefined,
|
|
@@ -1620,6 +1668,7 @@ export async function ticker(symbol: string, dependencies: TickerCommandDependen
|
|
|
1620
1668
|
bondFund: await bondFund,
|
|
1621
1669
|
memberships,
|
|
1622
1670
|
offerings: await offerings,
|
|
1671
|
+
ipo: await ipoLoad,
|
|
1623
1672
|
}),
|
|
1624
1673
|
});
|
|
1625
1674
|
return;
|
|
@@ -1643,8 +1692,10 @@ export async function ticker(symbol: string, dependencies: TickerCommandDependen
|
|
|
1643
1692
|
distributions: await distributions,
|
|
1644
1693
|
statementFilings: await statementFilings,
|
|
1645
1694
|
bondFund: await bondFund,
|
|
1695
|
+
fundFacts: await fundFacts,
|
|
1646
1696
|
memberships,
|
|
1647
1697
|
offerings: await offerings,
|
|
1698
|
+
ipo: await ipoLoad,
|
|
1648
1699
|
}));
|
|
1649
1700
|
if (freshness) console.log(`\n${cliFreshnessFooter(freshness, quote ?? resolvedFinancials)}`);
|
|
1650
1701
|
});
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { CliListing } from "./listing-arg";
|
|
2
|
+
import { companyNameSuggestion, isUnsettledNoProvider, type ListingDeps } from "./listing-arg";
|
|
3
|
+
import { describeSuggestion } from "./listing-suggestion";
|
|
4
|
+
import { isNotATickerMessage, withListingSuggestion } from "./not-a-ticker";
|
|
5
|
+
|
|
6
|
+
type SearchDeps = Pick<ListingDeps, "dataProvider">;
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* "Not a ticker: PALANTIR TECHNOLOGIES. Did you mean PLTR (Palantir
|
|
10
|
+
* Technologies Inc.)?" for words typed where one ticker goes, with the
|
|
11
|
+
* company search names for them. Without one the sentence ends at the
|
|
12
|
+
* symbol, and the error printer adds the search to try.
|
|
13
|
+
*/
|
|
14
|
+
export async function notATickerWords(typed: string, deps: SearchDeps): Promise<string> {
|
|
15
|
+
const symbol = typed.trim().replace(/^\$/, "").toUpperCase();
|
|
16
|
+
const message = `Not a ticker: ${symbol}.`;
|
|
17
|
+
const suggestion = await companyNameSuggestion(typed, deps);
|
|
18
|
+
return suggestion ? withListingSuggestion(message, describeSuggestion(suggestion)) : message;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Why a command stops on a listing whose own quote failed with `error`, when
|
|
23
|
+
* the word typed for it is no ticker, or null when it is not known to be: the
|
|
24
|
+
* source's "Not a ticker: PALANTIR.", and a word a source could not answer for
|
|
25
|
+
* (a timeout, a rate limit) that search resolves to a company all the same, as
|
|
26
|
+
* `quote` says it of a name. Both name the company beside it. A real ticker a
|
|
27
|
+
* source failed to quote is not stopped here: it is not a company's name.
|
|
28
|
+
*/
|
|
29
|
+
export async function notATickerStop(
|
|
30
|
+
error: unknown,
|
|
31
|
+
listing: Pick<CliListing, "symbol" | "exchange" | "typed">,
|
|
32
|
+
deps: SearchDeps,
|
|
33
|
+
): Promise<string | null> {
|
|
34
|
+
const message = error instanceof Error ? error.message : null;
|
|
35
|
+
const notATicker = isNotATickerMessage(message);
|
|
36
|
+
if (!notATicker && !isUnsettledNoProvider(error)) return null;
|
|
37
|
+
if (listing.exchange || !listing.typed) return notATicker ? message : null;
|
|
38
|
+
const suggestion = await companyNameSuggestion(listing.typed, deps);
|
|
39
|
+
if (!suggestion) return notATicker ? message : null;
|
|
40
|
+
return withListingSuggestion(notATicker ? message! : `Not a ticker: ${listing.symbol}.`, describeSuggestion(suggestion));
|
|
41
|
+
}
|
|
@@ -43,7 +43,7 @@ export async function noListingCalendarNote(
|
|
|
43
43
|
}
|
|
44
44
|
|
|
45
45
|
/**
|
|
46
|
-
* "SAN = Banco Santander, NYSE (
|
|
46
|
+
* "SAN = Banco Santander, NYSE (different companies on EPA, LSE)" for a bare symbol whose
|
|
47
47
|
* calendar date is its US line's, when several companies list the symbol:
|
|
48
48
|
* the event names the company the date is for.
|
|
49
49
|
*/
|
package/src/cli/errors.ts
CHANGED
|
@@ -10,8 +10,10 @@ import { DATA_SERVICE_UNREACHABLE_MESSAGE, isNetworkFailure } from "../utils/net
|
|
|
10
10
|
const USAGE_PREFIX = "Usage: ";
|
|
11
11
|
/** The code of every error a command fails with: bad input, nothing found, an option it does not take. */
|
|
12
12
|
export const CLI_ERROR_CODE = "cli_error";
|
|
13
|
+
/** The code of a command that ran, and the data service has nothing for what it asked. */
|
|
14
|
+
export const NO_DATA_CODE = "no_data";
|
|
13
15
|
/** The code of a command whose requests never reached the data service. */
|
|
14
|
-
|
|
16
|
+
const SERVICE_UNREACHABLE_CODE = "service_unreachable";
|
|
15
17
|
|
|
16
18
|
/** What to check when nothing answered: the connection, and the proxy when one is set. */
|
|
17
19
|
function unreachableHint(): string {
|
|
@@ -61,11 +63,32 @@ export function failWithFields(message: string, code: string, fields: Record<str
|
|
|
61
63
|
throw new CliFailure(message, undefined, code, undefined, fields);
|
|
62
64
|
}
|
|
63
65
|
|
|
66
|
+
/** Fails as `error` says: its code, message, details and whether to retry, and any field it carries beside them. */
|
|
67
|
+
export function failWithError(error: CliErrorObject): never {
|
|
68
|
+
const { code, message, details, retryable, ...fields } = error;
|
|
69
|
+
throw new CliFailure(message, details, code, retryable, Object.keys(fields).length > 0 ? fields : undefined);
|
|
70
|
+
}
|
|
71
|
+
|
|
64
72
|
/** Fails with what asking again shortly may get past (a busy service): `--json` marks it `retryable`. */
|
|
65
73
|
export function failRetryable(message: string, code: string): never {
|
|
66
74
|
throw new CliFailure(message, undefined, code, true);
|
|
67
75
|
}
|
|
68
76
|
|
|
77
|
+
/**
|
|
78
|
+
* What a command says when its requests never reached the data service:
|
|
79
|
+
* `message` names what it could not get (by default only that), and the
|
|
80
|
+
* details what to check. `--json` marks it retryable.
|
|
81
|
+
*/
|
|
82
|
+
export function unreachableError(message = DATA_SERVICE_UNREACHABLE_MESSAGE): CliErrorObject {
|
|
83
|
+
return { code: SERVICE_UNREACHABLE_CODE, message, details: unreachableHint(), retryable: true };
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/** Fails as a command whose requests never reached the data service (`unreachableError`). */
|
|
87
|
+
export function failUnreachable(message?: string): never {
|
|
88
|
+
const error = unreachableError(message);
|
|
89
|
+
throw new CliFailure(error.message, error.details, error.code, error.retryable);
|
|
90
|
+
}
|
|
91
|
+
|
|
69
92
|
export function closeAndFail(persistence: AppPersistence, message: string, details?: string): never {
|
|
70
93
|
persistence.close();
|
|
71
94
|
fail(message, details);
|
|
@@ -96,7 +119,7 @@ function cliErrorObject(error: unknown): CliErrorObject {
|
|
|
96
119
|
}
|
|
97
120
|
// No answer came back at all: in Gloom's words, whichever fetch failed (Bun's "Unable to connect", a refused proxy).
|
|
98
121
|
if (isNetworkFailure(error)) {
|
|
99
|
-
return
|
|
122
|
+
return unreachableError();
|
|
100
123
|
}
|
|
101
124
|
// Gloom Cloud refused what was asked (an unknown series, a bad date): the input was wrong, not the program.
|
|
102
125
|
if (error instanceof ApiRequestError && error.status === 400) {
|
package/src/cli/glossary.ts
CHANGED
|
@@ -437,6 +437,12 @@ export const GLOSSARY: readonly GlossaryEntry[] = [
|
|
|
437
437
|
definition: "How many ordinary shares one depositary receipt holds: 1 ADR = 10 ordinary shares means one GGAL in New York is ten GGAL.BA shares in Buenos Aires. "
|
|
438
438
|
+ "A receipt's price compares with its home price only once the home price is multiplied by the ratio.",
|
|
439
439
|
},
|
|
440
|
+
{
|
|
441
|
+
term: "CEDEAR ratio", aliases: ["cedear", "cedears", "certificado de deposito argentino"],
|
|
442
|
+
functions: ["DES"], shown: ["CEDEAR ratio", "CEDEAR Ratio"],
|
|
443
|
+
definition: "How many Buenos Aires CEDEARs make the company's shares they stand for, from BYMA's published list: 20 AAPL:BYMA = 1 Apple Inc. share. "
|
|
444
|
+
+ "A CEDEAR's market cap is its company's, in the currency of the listing it stands for (Apple's in dollars), not the certificate's peso price times a share count.",
|
|
445
|
+
},
|
|
440
446
|
{
|
|
441
447
|
term: "ADR premium", aliases: ["adr discount", "adr vs home", "receipt premium", "adr premium/discount"],
|
|
442
448
|
functions: ["ADR"], shown: ["ADR vs home", "premium", "discount"],
|
|
@@ -714,7 +720,30 @@ export const GLOSSARY: readonly GlossaryEntry[] = [
|
|
|
714
720
|
},
|
|
715
721
|
{
|
|
716
722
|
term: "Other reportables", aliases: ["other reportable", "other reportable traders"], functions: ["COT"], shown: ["Other Reportables"],
|
|
717
|
-
definition: "The disaggregated
|
|
723
|
+
definition: "The disaggregated and TFF reports' large traders that fit none of their other classes, such as proprietary traders and family offices.",
|
|
724
|
+
},
|
|
725
|
+
// The Traders in Financial Futures report's classes, and the options it can count.
|
|
726
|
+
{
|
|
727
|
+
term: "Traders in Financial Futures", short: "TFF", aliases: ["tff report", "financial futures report", "financial traders report"], functions: ["COT"], shown: ["Financial (TFF)"],
|
|
728
|
+
definition: "The CFTC's report on financial futures, such as rates, currencies, stock indexes and VIX. "
|
|
729
|
+
+ "It splits large traders into dealers, asset managers, leveraged funds and other reportables.",
|
|
730
|
+
},
|
|
731
|
+
{
|
|
732
|
+
term: "Leveraged funds", aliases: ["leveraged fund", "leveraged money", "lev funds"], functions: ["COT"], shown: ["Leveraged Funds"],
|
|
733
|
+
definition: "The TFF report's hedge funds, CTAs and other money managers trading for clients or with borrowed money: the speculators most watched in rates, currencies and indexes.",
|
|
734
|
+
},
|
|
735
|
+
{
|
|
736
|
+
term: "Asset manager/institutional", aliases: ["asset manager", "asset managers", "institutional", "real money"], functions: ["COT"], shown: ["Asset Manager/Institutional"],
|
|
737
|
+
definition: "The TFF report's pension funds, insurers, mutual funds and endowments, investing for the long run; usually net long stock index futures.",
|
|
738
|
+
},
|
|
739
|
+
{
|
|
740
|
+
term: "Dealer/intermediary", aliases: ["dealer intermediary", "intermediary", "intermediaries"], functions: ["COT"], shown: ["Dealer/Intermediary"],
|
|
741
|
+
definition: "The TFF report's banks and dealers on the sell side, taking the other side of their clients' trades and hedging it.",
|
|
742
|
+
},
|
|
743
|
+
{
|
|
744
|
+
term: "Futures and options combined", aliases: ["futures + options", "futures and options", "combined report", "combined positions"], functions: ["COT"], shown: ["Futures + options"],
|
|
745
|
+
definition: "A COT report that adds each group's options to its futures, delta-adjusted: an option counts as the futures it moves like. "
|
|
746
|
+
+ "Futures only, the default, counts futures alone.",
|
|
718
747
|
},
|
|
719
748
|
// Futures basis and curve shape (CTM, FUT, PERP).
|
|
720
749
|
{
|
|
@@ -800,7 +829,7 @@ export const GLOSSARY: readonly GlossaryEntry[] = [
|
|
|
800
829
|
term: "Risk reversal", short: "RR", aliases: ["25d risk reversal", "25-delta risk reversal", "25 delta risk reversal", "rr25", "risk reversals"],
|
|
801
830
|
functions: ["OVDV"], shown: ["RR"],
|
|
802
831
|
definition: "The 25-delta call's implied volatility minus the 25-delta put's, in vol points, for one expiry. Negative means puts cost more than calls "
|
|
803
|
-
+ "as far from the forward (downside protection is bid), positive that upside calls are. OVDV
|
|
832
|
+
+ "as far from the forward (downside protection is bid), positive that upside calls are. OVDV, VCA and HIVG's rr25d all sign it call minus put.",
|
|
804
833
|
},
|
|
805
834
|
{
|
|
806
835
|
term: "Butterfly", short: "BF", aliases: ["25d butterfly", "25-delta butterfly", "25 delta butterfly", "bf25", "smile curvature", "fly"],
|