gloomberb 0.17.6 → 0.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/README.zh-CN.md +2 -0
- package/package.json +6 -1
- package/patches/electrobun@1.18.1.patch +74 -0
- package/src/account/auth-model.ts +3 -2
- package/src/account/device-signin-dialog.tsx +38 -13
- package/src/account/device-signin.ts +2 -1
- package/src/account/upgrade-dialog.tsx +6 -2
- package/src/api-client/askg.ts +5 -3
- package/src/api-client/bank-figures.ts +73 -0
- package/src/api-client/credit-boards.ts +21 -1
- package/src/api-client/crypto-markets.ts +88 -1
- package/src/api-client/data.ts +104 -4
- package/src/api-client/debt-maturities.ts +18 -0
- package/src/api-client/equity-screener.ts +3 -0
- package/src/api-client/errors.ts +13 -0
- package/src/api-client/fund-facts.ts +72 -0
- package/src/api-client/futures-curve.ts +26 -3
- package/src/api-client/geo.ts +11 -1
- package/src/api-client/index.ts +25 -2
- package/src/api-client/insider-signals.ts +95 -11
- package/src/api-client/normalizers.ts +1 -0
- package/src/api-client/paths.ts +20 -1
- package/src/api-client/request.ts +11 -3
- package/src/api-client/research-activity.ts +15 -8
- package/src/api-client/socket.ts +6 -3
- package/src/api-client/supply-chain-graph.ts +2 -2
- package/src/api-client/supply-chain.ts +8 -0
- package/src/api-client/tape.ts +12 -0
- package/src/api-client/types.ts +66 -2
- package/src/api-client/upgrade-experiment.ts +4 -3
- package/src/api-client/wall-experiments.ts +5 -3
- package/src/api-client/wall-summary.ts +3 -1
- package/src/api-client/web-experiments.ts +5 -2
- package/src/api-client/yield-curves.ts +17 -0
- package/src/app/command-bar-intro.ts +38 -0
- package/src/app/keybindings/actions.ts +1 -1
- package/src/app/pane-runtime/pane-template-runtime.ts +35 -7
- package/src/app/pane-runtime/plugin-bindings.ts +4 -0
- package/src/app/pane-runtime/ticker-open-runtime.ts +4 -14
- package/src/app/pane-runtime/ticker-open-target.ts +31 -0
- package/src/app/runtime/desktop-deeplink.ts +3 -4
- package/src/app/runtime/plugin-bindings.ts +3 -2
- package/src/app/runtime/startup.ts +3 -4
- package/src/app/runtime/ticker-refresh.ts +13 -12
- package/src/app/runtime/update.ts +3 -2
- package/src/architecture/core-builtin-allowlist.json +0 -3
- package/src/architecture/silent-catch-allowlist.json +3 -0
- package/src/architecture/ui-literals-allowlist.json +186 -0
- package/src/architecture/ui-tokens-allowlist.json +40 -0
- package/src/ask-gloom/pane-context.ts +3 -1
- package/src/brokers/signed-in/catalog.ts +2 -1
- package/src/brokers/signed-in/client.ts +7 -2
- package/src/brokers/signed-in/sign-in-dialog.tsx +120 -26
- package/src/brokers/signed-in/sign-in.ts +22 -20
- package/src/brokers/sync-broker-instance.ts +2 -1
- package/src/capabilities/chart-series.ts +2 -0
- package/src/capabilities/registry.ts +1 -3
- package/src/cli/bank-section.ts +147 -0
- package/src/cli/base-converter.ts +5 -2
- package/src/cli/board-coins.ts +70 -0
- package/src/cli/commands/fred-series.ts +90 -0
- package/src/cli/commands/market.ts +340 -69
- package/src/cli/commands/news-search.ts +35 -2
- package/src/cli/commands/options-chain.ts +7 -5
- package/src/cli/commands/options-leaps.ts +3 -3
- package/src/cli/commands/overview.ts +78 -29
- package/src/cli/commands/plugins.ts +1 -0
- package/src/cli/commands/search.ts +87 -24
- package/src/cli/commands/system.ts +5 -2
- package/src/cli/commands/ticker.ts +337 -60
- package/src/cli/context.ts +2 -1
- package/src/cli/desktop-pane-shot.ts +11 -3
- package/src/cli/earnings-calendar.ts +2 -1
- package/src/cli/errors.ts +10 -0
- package/src/cli/export-source.ts +18 -3
- package/src/cli/glossary.ts +196 -14
- package/src/cli/history-rows.ts +60 -9
- package/src/cli/index-roots.ts +26 -0
- package/src/cli/index.ts +34 -9
- package/src/cli/known-gaps.ts +156 -22
- package/src/cli/listing-arg.ts +156 -12
- package/src/cli/listing-suggestion.ts +4 -2
- package/src/cli/name-entries.ts +76 -0
- package/src/cli/not-a-ticker.ts +15 -6
- package/src/cli/pane-functions/access-gate.ts +22 -0
- package/src/cli/pane-functions/capabilities.ts +62 -4
- package/src/cli/pane-functions/catalog.ts +94 -39
- package/src/cli/pane-functions/data.ts +6 -5
- package/src/cli/pane-functions/discovery.ts +1 -1
- package/src/cli/pane-functions/dom.ts +3 -3
- package/src/cli/pane-functions/freshness.ts +49 -8
- package/src/cli/pane-functions/function-help.ts +13 -10
- package/src/cli/pane-functions/headless.ts +177 -42
- package/src/cli/pane-functions/index.ts +64 -8
- package/src/cli/pane-functions/options.ts +17 -3
- package/src/cli/pane-functions/report-notices.ts +17 -3
- package/src/cli/pane-functions/resolver.ts +48 -13
- package/src/cli/pane-functions/screenshot.ts +124 -23
- package/src/cli/pane-functions/shot-options.ts +68 -0
- package/src/cli/perpetual-contract.ts +3 -1
- package/src/cli/report-tables.ts +10 -2
- package/src/cli/staged-tickers.ts +5 -0
- package/src/cli/statement-filings.ts +261 -0
- package/src/cli/symbol-args.ts +47 -8
- package/src/cli/symbol-list.ts +9 -2
- package/src/cli/symbol-rows.ts +269 -29
- package/src/cli/ticker-resolution.ts +148 -34
- package/src/cli/treasury-yields.ts +86 -0
- package/src/cli/types.ts +3 -0
- package/src/cli/uncovered-instrument.ts +20 -0
- package/src/components/chart/composite/axis-overlays.tsx +16 -9
- package/src/components/chart/composite/composite-chart.tsx +85 -6
- package/src/components/chart/composite/downsample.ts +19 -3
- package/src/components/chart/composite/format.ts +3 -0
- package/src/components/chart/composite/legend.tsx +155 -76
- package/src/components/chart/composite/panel-bitmap.ts +8 -2
- package/src/components/chart/composite/panel-surface.tsx +3 -3
- package/src/components/chart/composite/toolbar.tsx +12 -7
- package/src/components/chart/composite/types.ts +6 -0
- package/src/components/chart/composite/use-composite-chart-keyboard.ts +28 -1
- package/src/components/chart/curve/curve-surface.tsx +1 -1
- package/src/components/chart/static/series.ts +39 -0
- package/src/components/chart/static/trail-chart-surface.tsx +2 -1
- package/src/components/command-bar/commands/collection-list.ts +45 -15
- package/src/components/command-bar/commands/collection.ts +10 -3
- package/src/components/command-bar/commands/registry.ts +2 -2
- package/src/components/command-bar/list/badge.ts +4 -3
- package/src/components/command-bar/list/model.ts +5 -0
- package/src/components/command-bar/list/view.tsx +1 -1
- package/src/components/command-bar/panel/index.tsx +19 -8
- package/src/components/command-bar/panel/native-surface.ts +6 -4
- package/src/components/command-bar/panel/prompt-example.ts +22 -0
- package/src/components/command-bar/routes/root/provider-search.ts +3 -9
- package/src/components/command-bar/routes/root/results.ts +13 -0
- package/src/components/command-bar/routes/root/start-here.ts +90 -0
- package/src/components/command-bar/routes/ticker-search/results.ts +42 -3
- package/src/components/command-bar/routes/ticker-search/route.ts +3 -10
- package/src/components/command-bar/theme-picker.tsx +3 -1
- package/src/components/command-bar/workflow/builtin.ts +5 -1
- package/src/components/command-bar/workflow/collection-actions.ts +21 -12
- package/src/components/command-bar/workflow/ops.ts +21 -1
- package/src/{plugins/builtin/portfolio-list/command-bar.ts → components/command-bar/workflow/portfolio-position.ts} +42 -9
- package/src/components/command-bar/workflow/tickers.ts +6 -4
- package/src/components/feedback-dialog.tsx +1 -1
- package/src/components/form-modal/broker-step.tsx +7 -63
- package/src/components/form-modal/content.tsx +7 -2
- package/src/components/form-modal/field-row.tsx +6 -8
- package/src/components/form-modal/host.tsx +3 -3
- package/src/components/form-modal/model.ts +3 -0
- package/src/components/form-modal/routes.ts +17 -2
- package/src/components/index.ts +6 -6
- package/src/components/input-search-bar.tsx +43 -6
- package/src/components/layout/detached-pane-shell.tsx +0 -1
- package/src/components/layout/floating-pane.tsx +0 -1
- package/src/components/layout/header.tsx +8 -7
- package/src/components/layout/pane/footer/index.tsx +7 -4
- package/src/components/layout/pane/footer/model.ts +28 -2
- package/src/components/layout/pane/header.tsx +9 -19
- package/src/components/layout/pane/index.tsx +0 -1
- package/src/components/layout/pane/instrument-coverage-gate.tsx +57 -0
- package/src/components/layout/pane/pane-tabs.tsx +4 -3
- package/src/components/layout/pane/sizing.ts +9 -0
- package/src/components/layout/pane/ticker-fate-gate.tsx +8 -2
- package/src/components/layout/shell/pane/capture.ts +44 -20
- package/src/components/layout/status-bar.tsx +3 -6
- package/src/components/markdown-text.tsx +17 -2
- package/src/components/market-board/index.tsx +19 -8
- package/src/components/metric-treemap/heat-surface.tsx +2 -7
- package/src/components/onboarding/account-step/qr-panel.tsx +5 -2
- package/src/components/onboarding/onboarding-frame.tsx +24 -21
- package/src/components/onboarding/portfolio-step/positions-panel.tsx +20 -10
- package/src/components/onboarding/wizard-positions.ts +40 -11
- package/src/components/pane-settings-dialog/desktop.tsx +12 -50
- package/src/components/pane-settings-dialog/field-dialogs.tsx +1 -1
- package/src/components/price-performance.tsx +18 -2
- package/src/components/reader/article-reader.tsx +11 -10
- package/src/components/reader/detail-reader.tsx +9 -5
- package/src/components/reader/reader-text.tsx +51 -24
- package/src/components/sign-in-code-panel.tsx +129 -75
- package/src/components/ticker/badge/index.tsx +2 -1
- package/src/components/ui/action-row.tsx +5 -2
- package/src/components/ui/audio-player.tsx +70 -0
- package/src/components/ui/card.tsx +75 -0
- package/src/components/ui/data-table/index.tsx +4 -2
- package/src/components/ui/data-table/types.ts +11 -0
- package/src/components/ui/detail-scroll-body.tsx +1 -1
- package/src/components/ui/dialog-actions.tsx +1 -21
- package/src/components/ui/display.tsx +13 -5
- package/src/components/ui/external-link.tsx +4 -2
- package/src/components/ui/fields.tsx +12 -0
- package/src/components/ui/figure.tsx +5 -3
- package/src/components/ui/frame.tsx +40 -6
- package/src/components/ui/icon.tsx +4 -0
- package/src/components/ui/index.ts +4 -1
- package/src/components/ui/list-view.tsx +8 -0
- package/src/components/ui/prose.tsx +97 -25
- package/src/components/ui/query-bar-keys.tsx +3 -1
- package/src/components/ui/query-bar.tsx +6 -0
- package/src/components/ui/quote.ts +42 -0
- package/src/components/ui/range-track.tsx +15 -2
- package/src/components/ui/reveal-in-scroll-box.ts +21 -3
- package/src/components/ui/select-button.tsx +38 -3
- package/src/components/ui/status.tsx +73 -4
- package/src/components/ui/table-layout.ts +20 -0
- package/src/components/use-pinned-moment.ts +19 -0
- package/src/core/app-runtime.ts +2 -2
- package/src/core/state/app/instrument.ts +18 -1
- package/src/core/state/app/layout.ts +6 -0
- package/src/core/state/app/state.ts +14 -2
- package/src/data/cached-query.ts +1 -1
- package/src/data/config/chart-settings.ts +3 -1
- package/src/data/config/home.ts +4 -1
- package/src/data/config/store/node.ts +9 -4
- package/src/data/config/store/normalize.ts +9 -0
- package/src/data/json-storage.ts +6 -3
- package/src/data/json-ticker-repository.ts +3 -1
- package/src/data/plugin-cache.ts +5 -1
- package/src/data/sqlite/json.ts +3 -1
- package/src/data/ticker-repository.ts +5 -2
- package/src/feedback/diagnostics.ts +2 -6
- package/src/i18n/es.ts +86 -6
- package/src/i18n/index.ts +3 -9
- package/src/i18n/ja.ts +86 -6
- package/src/i18n/ko.ts +86 -6
- package/src/i18n/zh-cn.ts +86 -6
- package/src/i18n/zh-tw.ts +86 -6
- package/src/layout-marketplace/gallery-desktop.tsx +8 -4
- package/src/market-data/bars-per-year.ts +43 -0
- package/src/market-data/bond-funds.ts +85 -0
- package/src/market-data/coordinator/auxiliary.ts +5 -2
- package/src/market-data/coordinator/index.ts +6 -5
- package/src/market-data/futures-contract.ts +102 -5
- package/src/market-data/hooks.tsx +20 -11
- package/src/market-data/market/bar-period.ts +36 -0
- package/src/market-data/market/format.ts +5 -13
- package/src/market-data/market/freshness.ts +1 -3
- package/src/market-data/market/index-level.ts +51 -0
- package/src/market-data/model-dividend-yield.ts +57 -16
- package/src/market-data/quotes/live-valuation.ts +48 -2
- package/src/market-data/realized-volatility.ts +16 -7
- package/src/market-data/tax-equivalent.ts +344 -0
- package/src/news/aggregator.ts +4 -2
- package/src/notifications/notification-log.ts +5 -3
- package/src/plugins/auto-update-node.ts +1 -0
- package/src/plugins/builtin/account-management/footer.ts +1 -1
- package/src/plugins/builtin/account-management/keyboard.ts +3 -0
- package/src/plugins/builtin/account-management/model.ts +1 -0
- package/src/plugins/builtin/account-management/pane.tsx +71 -19
- package/src/plugins/builtin/account-management/trial-cancel.ts +40 -0
- package/src/plugins/builtin/alerts/cli.ts +7 -18
- package/src/plugins/builtin/alerts/constants.ts +8 -0
- package/src/plugins/builtin/alerts/event-rows.ts +16 -0
- package/src/plugins/builtin/alerts/events-pane.tsx +2 -14
- package/src/plugins/builtin/alerts/headless.ts +182 -0
- package/src/plugins/builtin/alerts/index.tsx +3 -0
- package/src/plugins/builtin/alerts/pane.tsx +1 -7
- package/src/plugins/builtin/alerts/storage.ts +17 -1
- package/src/plugins/builtin/analytics/index.tsx +6 -1
- package/src/plugins/builtin/analytics/metrics.ts +47 -9
- package/src/plugins/builtin/analytics/risk-headless.ts +14 -2
- package/src/plugins/builtin/analytics/risk-math.ts +83 -0
- package/src/plugins/builtin/analytics/risk-model.ts +97 -4
- package/src/plugins/builtin/analytics/risk-pane.tsx +11 -6
- package/src/plugins/builtin/analytics/sector-model.ts +14 -3
- package/src/plugins/builtin/awards/headless.ts +6 -5
- package/src/plugins/builtin/awards/index.tsx +1 -1
- package/src/plugins/builtin/backtest/client.ts +38 -8
- package/src/plugins/builtin/backtest/engine.ts +25 -13
- package/src/plugins/builtin/backtest/export.ts +27 -0
- package/src/plugins/builtin/backtest/format.ts +19 -3
- package/src/plugins/builtin/backtest/headless.ts +42 -28
- package/src/plugins/builtin/backtest/index.tsx +3 -0
- package/src/plugins/builtin/backtest/pane.tsx +39 -10
- package/src/plugins/builtin/backtest/report.ts +160 -0
- package/src/plugins/builtin/backtest/rules.ts +2 -0
- package/src/plugins/builtin/backtest/window.ts +112 -0
- package/src/plugins/builtin/bond-calculator/headless.ts +3 -2
- package/src/plugins/builtin/broker-manager/add-flow.tsx +4 -4
- package/src/plugins/builtin/catalysts/headless.ts +24 -13
- package/src/plugins/builtin/catalysts/index.tsx +4 -2
- package/src/plugins/builtin/catalysts/model.ts +18 -1
- package/src/plugins/builtin/catalysts/pane.tsx +2 -2
- package/src/plugins/builtin/cds/client.ts +28 -5
- package/src/plugins/builtin/cds/headless.ts +183 -31
- package/src/plugins/builtin/cds/index.tsx +1 -1
- package/src/plugins/builtin/cds/model.ts +229 -53
- package/src/plugins/builtin/cds/pane.tsx +82 -26
- package/src/plugins/builtin/central-bank-rates/headless.ts +1 -1
- package/src/plugins/builtin/chart-composer/catalog-inventory.ts +39 -1
- package/src/plugins/builtin/chart-composer/chart-spec-edit.ts +77 -0
- package/src/plugins/builtin/chart-composer/chart-spec.ts +15 -0
- package/src/plugins/builtin/chart-composer/data-catalog-pane.tsx +22 -2
- package/src/plugins/builtin/chart-composer/editor/desktop-view.tsx +2 -2
- package/src/plugins/builtin/chart-composer/headless-schema.ts +10 -2
- package/src/plugins/builtin/chart-composer/headless.ts +99 -21
- package/src/plugins/builtin/chart-composer/index.tsx +70 -13
- package/src/plugins/builtin/chart-composer/pane.tsx +65 -15
- package/src/plugins/builtin/chart-composer/presets.ts +79 -11
- package/src/plugins/builtin/chart-composer/series-catalog.ts +50 -14
- package/src/plugins/builtin/chart-composer/series-expression.ts +9 -7
- package/src/plugins/builtin/chart-composer/series-listings.ts +178 -0
- package/src/plugins/builtin/chart-composer/session-range.ts +87 -0
- package/src/plugins/builtin/chat/attachments/desktop.tsx +4 -1
- package/src/plugins/builtin/chat/content/composer-runtime.ts +49 -14
- package/src/plugins/builtin/chat/content/composer.tsx +22 -1
- package/src/plugins/builtin/chat/content/index.tsx +35 -5
- package/src/plugins/builtin/chat/content/layout-metrics.ts +3 -0
- package/src/plugins/builtin/chat/content/shortcuts.ts +32 -13
- package/src/plugins/builtin/chat/content/snapshot.ts +29 -6
- package/src/plugins/builtin/chat/ghost-user.ts +11 -3
- package/src/plugins/builtin/chat/layout.ts +2 -0
- package/src/plugins/builtin/chat/message/desktop.tsx +13 -5
- package/src/plugins/builtin/chat/message/header.tsx +26 -4
- package/src/plugins/builtin/chat/message/pane-chip.tsx +131 -35
- package/src/plugins/builtin/chat/message/render-state.ts +28 -1
- package/src/plugins/builtin/chat/message/terminal.tsx +9 -3
- package/src/plugins/builtin/chat/pane-links/composer.ts +87 -0
- package/src/plugins/builtin/chat/pane-links/model.ts +1 -1
- package/src/plugins/builtin/chat/share/flow.tsx +9 -73
- package/src/plugins/builtin/cloud/askg/controller.ts +5 -3
- package/src/plugins/builtin/cloud/askg/executor.ts +3 -1
- package/src/plugins/builtin/cloud/askg/lock-note.ts +16 -0
- package/src/plugins/builtin/cloud/askg/pane.tsx +6 -2
- package/src/plugins/builtin/cloud/auth-actions.tsx +4 -2
- package/src/plugins/builtin/cloud/company-picker.tsx +21 -26
- package/src/plugins/builtin/cloud/mcp-connect/dialog.tsx +5 -3
- package/src/plugins/builtin/cloud/plugin.tsx +2 -0
- package/src/plugins/builtin/cloud/team/module.tsx +5 -1
- package/src/plugins/builtin/cloud/team/pane.tsx +11 -4
- package/src/plugins/builtin/cloud/team/views.ts +11 -4
- package/src/plugins/builtin/cloud/terminal-relay/engine.ts +9 -4
- package/src/plugins/builtin/cloud/terminal-relay/prompts.tsx +3 -2
- package/src/plugins/builtin/cloud/thesis/detail.tsx +2 -1
- package/src/plugins/builtin/cloud/thesis/exposure.ts +3 -0
- package/src/plugins/builtin/cloud/thesis/prompts.tsx +3 -2
- package/src/plugins/builtin/cloud/thesis/ticker-tab.tsx +2 -1
- package/src/plugins/builtin/cloud/trial-offer-status-widget.tsx +2 -1
- package/src/plugins/builtin/cloud/verification-status-widget.tsx +2 -1
- package/src/plugins/builtin/commodities-energy/index.tsx +8 -5
- package/src/plugins/builtin/commodities-energy/view-state.ts +11 -0
- package/src/plugins/builtin/company-attention/headless.ts +15 -7
- package/src/plugins/builtin/company-attention/index.tsx +1 -1
- package/src/plugins/builtin/company-attention/model.ts +49 -4
- package/src/plugins/builtin/company-attention/pane.tsx +11 -9
- package/src/plugins/builtin/company-kpis/headless.ts +4 -3
- package/src/plugins/builtin/company-kpis/index.tsx +2 -2
- package/src/plugins/builtin/company-kpis/pane.tsx +9 -3
- package/src/plugins/builtin/congress-trades/headless.ts +23 -2
- package/src/plugins/builtin/correlation/relationship/pane.tsx +18 -46
- package/src/plugins/builtin/cot/headless.ts +5 -2
- package/src/plugins/builtin/credit-boards/cdx-pane.tsx +41 -13
- package/src/plugins/builtin/credit-boards/client.ts +9 -2
- package/src/plugins/builtin/credit-boards/headless.ts +93 -27
- package/src/plugins/builtin/credit-boards/index.tsx +15 -4
- package/src/plugins/builtin/credit-boards/model.ts +105 -6
- package/src/plugins/builtin/credit-boards/sovr-pane.tsx +14 -3
- package/src/plugins/builtin/credit-documents/detail.tsx +2 -1
- package/src/plugins/builtin/credit-documents/index.tsx +3 -0
- package/src/plugins/builtin/credit-documents/model.ts +3 -10
- package/src/plugins/builtin/crypto-board/client.ts +152 -2
- package/src/plugins/builtin/crypto-board/headless.ts +138 -19
- package/src/plugins/builtin/crypto-board/index.tsx +5 -3
- package/src/plugins/builtin/crypto-board/model.ts +210 -12
- package/src/plugins/builtin/crypto-board/pane.tsx +148 -9
- package/src/plugins/builtin/crypto-board/series.ts +52 -1
- package/src/plugins/builtin/crypto-board/supply.ts +123 -0
- package/src/plugins/builtin/debt-maturities/client.ts +54 -1
- package/src/plugins/builtin/debt-maturities/headless.ts +27 -3
- package/src/plugins/builtin/debt-maturities/index.tsx +2 -0
- package/src/plugins/builtin/debt-maturities/model.ts +58 -13
- package/src/plugins/builtin/debt-maturities/pane.tsx +47 -7
- package/src/plugins/builtin/dividend-yield/client.ts +42 -36
- package/src/plugins/builtin/dividend-yield/headless.ts +113 -18
- package/src/plugins/builtin/dividend-yield/index.tsx +5 -2
- package/src/plugins/builtin/dividend-yield/pane.tsx +37 -13
- package/src/plugins/builtin/dividend-yield/provider-client.ts +7 -3
- package/src/plugins/builtin/dividend-yield/ranking.ts +187 -0
- package/src/plugins/builtin/dividend-yield/reference-price.ts +28 -5
- package/src/plugins/builtin/dividend-yield/types.ts +6 -1
- package/src/plugins/builtin/dividend-yield/view.ts +1 -1
- package/src/plugins/builtin/docs/blocks.tsx +54 -8
- package/src/plugins/builtin/docs/pane.tsx +8 -13
- package/src/plugins/builtin/earnings/headless.ts +3 -2
- package/src/plugins/builtin/earnings-calls/data.ts +51 -0
- package/src/plugins/builtin/earnings-calls/headless.ts +7 -0
- package/src/plugins/builtin/earnings-calls/index.tsx +1 -0
- package/src/plugins/builtin/earnings-calls/model.ts +97 -0
- package/src/plugins/builtin/earnings-calls/pane.tsx +107 -7
- package/src/plugins/builtin/earnings-calls/transcript-view.tsx +140 -22
- package/src/plugins/builtin/earnings-calls/use-call-playback.ts +194 -0
- package/src/plugins/builtin/econ/calendar-model.ts +22 -0
- package/src/plugins/builtin/econ/calendar-source.ts +35 -0
- package/src/plugins/builtin/econ/index.tsx +40 -8
- package/src/plugins/builtin/econ-statistics/defs.ts +7 -0
- package/src/plugins/builtin/econ-statistics/detail.tsx +8 -1
- package/src/plugins/builtin/econ-statistics/headless.ts +26 -5
- package/src/plugins/builtin/econ-statistics/pane.tsx +4 -2
- package/src/plugins/builtin/econ-statistics/stats.ts +10 -0
- package/src/plugins/builtin/econ-statistics/view.ts +19 -0
- package/src/plugins/builtin/equity-screener/client.ts +1 -1
- package/src/plugins/builtin/equity-screener/model.ts +46 -4
- package/src/plugins/builtin/equity-screener/pane.tsx +3 -0
- package/src/plugins/builtin/estimate-revisions/client.ts +32 -22
- package/src/plugins/builtin/estimate-revisions/headless.ts +1 -0
- package/src/plugins/builtin/estimate-revisions/index.tsx +1 -0
- package/src/plugins/builtin/estimate-revisions/pane.tsx +5 -3
- package/src/plugins/builtin/executives/index.tsx +1 -0
- package/src/plugins/builtin/exposure/editor.tsx +3 -3
- package/src/plugins/builtin/fear-greed/index.tsx +9 -0
- package/src/plugins/builtin/filing-events/index.tsx +1 -0
- package/src/plugins/builtin/futures/index.tsx +2 -2
- package/src/plugins/builtin/futures/model.ts +34 -21
- package/src/plugins/builtin/futures/table.tsx +1 -1
- package/src/plugins/builtin/futures/use-board-terms.ts +2 -2
- package/src/plugins/builtin/futures-curve/headless.ts +4 -2
- package/src/plugins/builtin/futures-curve/model.ts +5 -7
- package/src/plugins/builtin/help/index.tsx +55 -8
- package/src/plugins/builtin/help/shortcut-table.tsx +15 -2
- package/src/plugins/builtin/holders/headless.ts +12 -0
- package/src/plugins/builtin/insider/headless.ts +311 -41
- package/src/plugins/builtin/insider/index.tsx +280 -106
- package/src/plugins/builtin/insider/insiders.tsx +224 -0
- package/src/plugins/builtin/insider/signals-cells.tsx +52 -0
- package/src/plugins/builtin/insider/signals-client.ts +135 -11
- package/src/plugins/builtin/insider/signals-model.ts +628 -56
- package/src/plugins/builtin/insider/signals.tsx +283 -83
- package/src/plugins/builtin/ipo-calendar/headless.ts +17 -7
- package/src/plugins/builtin/ipo-calendar/index.tsx +23 -3
- package/src/plugins/builtin/ipo-calendar/model.ts +84 -36
- package/src/plugins/builtin/ipo-calendar/pane.tsx +20 -8
- package/src/plugins/builtin/iv-history/headless.ts +2 -0
- package/src/plugins/builtin/jobs/headless.ts +1 -0
- package/src/plugins/builtin/jobs/index.tsx +1 -0
- package/src/plugins/builtin/jodi/headless.ts +2 -0
- package/src/plugins/builtin/kelly-sizer/pane.tsx +1 -1
- package/src/plugins/builtin/kelly-sizer/portfolio.ts +1 -1
- package/src/plugins/builtin/market-heatmap/headless.ts +1 -0
- package/src/plugins/builtin/market-heatmap/portfolio.ts +3 -1
- package/src/plugins/builtin/market-valuation/pane.tsx +1 -1
- package/src/plugins/builtin/market-valuation/zone-scale/desktop.tsx +31 -57
- package/src/plugins/builtin/mna/distress/headless.ts +2 -1
- package/src/plugins/builtin/mna/headless.ts +14 -2
- package/src/plugins/builtin/mna/index.tsx +1 -0
- package/src/plugins/builtin/news/headless.ts +4 -0
- package/src/plugins/builtin/news/wire/news/footer.ts +5 -3
- package/src/plugins/builtin/news/wire/news/table.tsx +57 -11
- package/src/plugins/builtin/notes/cli.ts +8 -4
- package/src/plugins/builtin/notes/files.ts +66 -20
- package/src/plugins/builtin/notes/migration.ts +18 -6
- package/src/plugins/builtin/notes/owner.tsx +3 -2
- package/src/plugins/builtin/notes/quick-notes-pane.tsx +3 -2
- package/src/plugins/builtin/options-scenario/client.ts +7 -4
- package/src/plugins/builtin/options-scenario/headless.ts +5 -3
- package/src/plugins/builtin/pe-band/index.tsx +1 -1
- package/src/plugins/builtin/pe-band/model.ts +1 -15
- package/src/plugins/builtin/perps/headless.ts +30 -13
- package/src/plugins/builtin/perps/model.ts +45 -3
- package/src/plugins/builtin/perps/pane.tsx +7 -7
- package/src/plugins/builtin/portfolio-list/cell-version.ts +10 -4
- package/src/plugins/builtin/portfolio-list/cli/bulk-symbols.ts +128 -14
- package/src/plugins/builtin/portfolio-list/cli/portfolio-command.ts +108 -46
- package/src/plugins/builtin/portfolio-list/cli/render.ts +368 -45
- package/src/plugins/builtin/portfolio-list/cli/shared.ts +8 -2
- package/src/plugins/builtin/portfolio-list/cli/watchlist-command.ts +24 -34
- package/src/plugins/builtin/portfolio-list/grid.tsx +3 -1
- package/src/plugins/builtin/portfolio-list/headless.ts +151 -29
- package/src/plugins/builtin/portfolio-list/income.ts +296 -0
- package/src/plugins/builtin/portfolio-list/metrics.ts +2 -2
- package/src/plugins/builtin/portfolio-list/pane/futures-terms.ts +58 -0
- package/src/plugins/builtin/portfolio-list/pane/index.tsx +27 -10
- package/src/plugins/builtin/portfolio-list/pane/supplemental.ts +47 -28
- package/src/plugins/builtin/portfolio-list/quick-add/index.tsx +3 -2
- package/src/plugins/builtin/portfolio-list/quick-add/resolution.ts +10 -3
- package/src/plugins/builtin/portfolio-list/summary/index.tsx +26 -4
- package/src/plugins/builtin/portfolio-list/summary/totals.ts +31 -3
- package/src/plugins/builtin/portfolio-list/table.tsx +25 -5
- package/src/plugins/builtin/power/prices-headless.ts +2 -1
- package/src/plugins/builtin/realized-vol/chart-model.ts +29 -5
- package/src/plugins/builtin/realized-vol/charts.tsx +14 -8
- package/src/plugins/builtin/realized-vol/evidence.ts +2 -0
- package/src/plugins/builtin/realized-vol/headless.ts +6 -4
- package/src/plugins/builtin/realized-vol/model.ts +5 -1
- package/src/plugins/builtin/realized-vol/pane.tsx +31 -11
- package/src/plugins/builtin/realized-vol/settings.ts +1 -1
- package/src/plugins/builtin/research/analyst-headless.ts +4 -0
- package/src/plugins/builtin/research/corporate-actions-pane.tsx +2 -0
- package/src/plugins/builtin/research/event-model.ts +22 -2
- package/src/plugins/builtin/research/headless-schema.ts +1 -0
- package/src/plugins/builtin/research/headless.ts +3 -0
- package/src/plugins/builtin/research/index.tsx +3 -0
- package/src/plugins/builtin/research/relative-valuation-columns.ts +27 -5
- package/src/plugins/builtin/research/relative-valuation-headless.ts +2 -0
- package/src/plugins/builtin/revenue-breakdown/index.tsx +1 -0
- package/src/plugins/builtin/reverse-dcf/headless.ts +9 -6
- package/src/plugins/builtin/reverse-dcf/index.tsx +2 -2
- package/src/plugins/builtin/reverse-dcf/model.ts +51 -4
- package/src/plugins/builtin/reverse-dcf/pane.tsx +23 -10
- package/src/plugins/builtin/risk-factors/headless.ts +7 -0
- package/src/plugins/builtin/risk-factors/index.tsx +1 -0
- package/src/plugins/builtin/scanner/feed.ts +5 -3
- package/src/plugins/builtin/scanner/headless.ts +9 -57
- package/src/plugins/builtin/scanner/index.ts +1 -2
- package/src/plugins/builtin/sec/forms.ts +2 -6
- package/src/plugins/builtin/sec/fund-facts-view.tsx +53 -0
- package/src/plugins/builtin/sec/fund-facts.ts +328 -0
- package/src/plugins/builtin/sec/headless.ts +140 -44
- package/src/plugins/builtin/sec/index.tsx +95 -30
- package/src/plugins/builtin/sec/model.ts +2 -44
- package/src/plugins/builtin/shared/headless-options.ts +10 -0
- package/src/plugins/builtin/shared/locked-rows.tsx +3 -1
- package/src/plugins/builtin/shared/move-rank.ts +108 -0
- package/src/plugins/builtin/shared/report-freshness.ts +25 -9
- package/src/plugins/builtin/shared/scanner-capture.ts +95 -0
- package/src/plugins/builtin/shared/treasury-cutoffs.ts +15 -0
- package/src/plugins/builtin/shared/use-quote-board.ts +1 -0
- package/src/plugins/builtin/shared/volatility/live-session.ts +34 -0
- package/src/plugins/builtin/shared/volatility-indices.ts +32 -0
- package/src/plugins/builtin/short-interest/headless.ts +3 -0
- package/src/plugins/builtin/short-interest/watch-model.ts +2 -2
- package/src/plugins/builtin/social-mentions/client.ts +8 -1
- package/src/plugins/builtin/social-mentions/pane.tsx +8 -6
- package/src/plugins/builtin/supply-chain/client.ts +12 -3
- package/src/plugins/builtin/supply-chain/disclosure-quote.tsx +9 -5
- package/src/plugins/builtin/supply-chain/evidence.ts +3 -1
- package/src/plugins/builtin/supply-chain/flow-layout.ts +2 -1
- package/src/plugins/builtin/supply-chain/flow.tsx +23 -16
- package/src/plugins/builtin/supply-chain/graph-client.ts +8 -5
- package/src/plugins/builtin/supply-chain/graph-evidence.ts +1 -1
- package/src/plugins/builtin/supply-chain/graph-model.ts +10 -2
- package/src/plugins/builtin/supply-chain/graph-pane.tsx +9 -7
- package/src/plugins/builtin/supply-chain/graph.tsx +8 -6
- package/src/plugins/builtin/supply-chain/headless.ts +69 -27
- package/src/plugins/builtin/supply-chain/index.tsx +1 -1
- package/src/plugins/builtin/supply-chain/model.ts +76 -15
- package/src/plugins/builtin/supply-chain/pane.tsx +29 -15
- package/src/plugins/builtin/supply-chain/row-evidence.tsx +5 -4
- package/src/plugins/builtin/themes/model.ts +2 -5
- package/src/plugins/builtin/thirteenf/api.ts +50 -2
- package/src/plugins/builtin/thirteenf/data.ts +250 -11
- package/src/plugins/builtin/thirteenf/headless.ts +311 -28
- package/src/plugins/builtin/thirteenf/index.tsx +4 -1
- package/src/plugins/builtin/thirteenf/model.ts +244 -19
- package/src/plugins/builtin/thirteenf/overlap-pane.tsx +133 -33
- package/src/plugins/builtin/thirteenf/overlap.ts +1 -1
- package/src/plugins/builtin/thirteenf/pane.tsx +24 -5
- package/src/plugins/builtin/thirteenf/report-notes.ts +78 -0
- package/src/plugins/builtin/thirteenf/types.ts +49 -0
- package/src/plugins/builtin/ticker-detail/data-panes/historical-prices.tsx +22 -8
- package/src/plugins/builtin/ticker-detail/data-panes/history-bars.ts +17 -1
- package/src/plugins/builtin/ticker-detail/financials/model.ts +2 -42
- package/src/plugins/builtin/ticker-detail/financials/tab.tsx +1 -1
- package/src/plugins/builtin/ticker-detail/headless.ts +23 -10
- package/src/plugins/builtin/ticker-detail/overview/components.tsx +27 -3
- package/src/plugins/builtin/ticker-detail/overview/dividend.ts +60 -0
- package/src/plugins/builtin/ticker-detail/overview/model.ts +46 -9
- package/src/plugins/builtin/ticker-detail/overview/pane.tsx +3 -0
- package/src/plugins/builtin/ticker-detail/overview-tab.tsx +36 -3
- package/src/plugins/builtin/ticker-detail/quote-monitor/card.tsx +18 -19
- package/src/plugins/builtin/time-sales/client.ts +7 -4
- package/src/plugins/builtin/time-sales/headless.ts +71 -22
- package/src/plugins/builtin/time-sales/model.ts +12 -0
- package/src/plugins/builtin/time-sales/pane.tsx +31 -7
- package/src/plugins/builtin/time-sales/window.ts +128 -0
- package/src/plugins/builtin/trace-bonds/client.ts +351 -33
- package/src/plugins/builtin/trace-bonds/headless.ts +60 -22
- package/src/plugins/builtin/trace-bonds/index.tsx +4 -2
- package/src/plugins/builtin/trace-bonds/model.ts +27 -25
- package/src/plugins/builtin/trace-bonds/pane.tsx +63 -45
- package/src/plugins/builtin/treasury-auctions/cache.ts +61 -15
- package/src/plugins/builtin/treasury-auctions/client.ts +45 -10
- package/src/plugins/builtin/treasury-auctions/headless.ts +35 -13
- package/src/plugins/builtin/treasury-auctions/index.tsx +5 -2
- package/src/plugins/builtin/treasury-auctions/model.ts +20 -16
- package/src/plugins/builtin/treasury-auctions/pane.tsx +29 -12
- package/src/plugins/builtin/vol-surface/charts.tsx +2 -1
- package/src/plugins/builtin/vol-surface/headless.ts +3 -2
- package/src/plugins/builtin/vol-surface/pane.tsx +2 -1
- package/src/plugins/builtin/vol-surface/stored.ts +4 -7
- package/src/plugins/builtin/volatility/chart-model.ts +16 -15
- package/src/plugins/builtin/volatility/charts.tsx +5 -5
- package/src/plugins/builtin/volatility/client.ts +73 -2
- package/src/plugins/builtin/volatility/evidence.ts +13 -14
- package/src/plugins/builtin/volatility/headless.ts +13 -7
- package/src/plugins/builtin/volatility/index.tsx +1 -1
- package/src/plugins/builtin/volatility/model.ts +104 -38
- package/src/plugins/builtin/volatility/pane.tsx +42 -24
- package/src/plugins/builtin/volatility/series.ts +22 -13
- package/src/plugins/builtin/world-venue-map/geo-series.ts +9 -0
- package/src/plugins/builtin/world-venue-map/headless.ts +8 -5
- package/src/plugins/builtin/world-venue-map/index.ts +16 -2
- package/src/plugins/builtin/world-venue-map/map.tsx +13 -17
- package/src/plugins/builtin/yield-curve/curves.ts +29 -5
- package/src/plugins/builtin/yield-curve/headless.ts +41 -8
- package/src/plugins/builtin/yield-curve/history.ts +5 -5
- package/src/plugins/builtin/yield-curve/index.tsx +30 -13
- package/src/plugins/compat.ts +3 -1
- package/src/plugins/dependencies.ts +8 -2
- package/src/plugins/host-link.ts +12 -5
- package/src/plugins/installer.ts +16 -7
- package/src/plugins/loader.ts +9 -2
- package/src/plugins/marketplace/activation.ts +10 -4
- package/src/plugins/registry/host-actions.ts +3 -0
- package/src/plugins/registry/index.ts +3 -1
- package/src/{plugins/builtin/portfolio-list → portfolio}/allocation.ts +74 -12
- package/src/{plugins/builtin/portfolio-list → portfolio}/column-values.ts +140 -53
- package/src/portfolio/futures-positions.ts +213 -0
- package/src/portfolio/futures-terms.ts +75 -0
- package/src/portfolio/manual-lots.ts +78 -0
- package/src/portfolio/mutations.ts +54 -10
- package/src/portfolio/position-metrics.ts +44 -10
- package/src/portfolio/valuation-basis.ts +31 -4
- package/src/public/__snapshots__/public-api.test.ts.snap +4 -0
- package/src/public/time-series.ts +2 -1
- package/src/remote/confirm-change.tsx +2 -1
- package/src/remote/server.ts +1 -1
- package/src/remote/watchlist.ts +9 -1
- package/src/renderers/dom/data-table/row.tsx +1 -1
- package/src/renderers/dom/desktop/audio-player.tsx +312 -0
- package/src/renderers/dom/desktop/control-styles.ts +17 -82
- package/src/renderers/dom/desktop/controls.tsx +39 -63
- package/src/renderers/dom/desktop/dialog-actions.tsx +13 -53
- package/src/renderers/dom/desktop/icons.tsx +8 -0
- package/src/renderers/dom/desktop/list-view.tsx +6 -6
- package/src/renderers/dom/desktop/popover.tsx +0 -3
- package/src/renderers/dom/desktop/query-bar.tsx +6 -4
- package/src/renderers/dom/desktop/select-field.tsx +9 -8
- package/src/renderers/dom/desktop/stack-header.ts +3 -0
- package/src/renderers/dom/dom-ui-host.tsx +3 -2
- package/src/renderers/dom/host/chart-surface.tsx +3 -3
- package/src/renderers/dom/host/size-observer.ts +33 -4
- package/src/renderers/dom/host/surface-3d.tsx +3 -2
- package/src/renderers/dom/host/surface-fit.ts +4 -1
- package/src/renderers/dom/host/tabs.tsx +22 -132
- package/src/renderers/dom/styles.css +358 -160
- package/src/renderers/electrobun/bun/core-capabilities.ts +1 -1
- package/src/renderers/electrobun/bun/desktop/backend.ts +1 -1
- package/src/renderers/electrobun/bun/desktop/initialization.ts +1 -0
- package/src/renderers/electrobun/bun/desktop/state-broadcaster.ts +43 -1
- package/src/renderers/electrobun/bun/desktop/workspace/requests.ts +5 -1
- package/src/renderers/electrobun/shared/rpc-codec.ts +7 -0
- package/src/renderers/electrobun/view/cli-pane-shot-entry.tsx +21 -17
- package/src/renderers/electrobun/view/cli-pane-shot-frame.tsx +3 -3
- package/src/renderers/electrobun/view/desktop/window/bridge.ts +6 -8
- package/src/renderers/electrobun/view/desktop/window/snapshot.ts +18 -0
- package/src/series/capability.ts +1 -0
- package/src/series/files.ts +9 -3
- package/src/series/registry.ts +40 -14
- package/src/series/resolve.ts +121 -18
- package/src/series/standalone.ts +3 -2
- package/src/series/types.ts +55 -1
- package/src/series/validate.ts +39 -0
- package/src/shares/api.ts +26 -7
- package/src/shares/bug-report-dialog.tsx +2 -2
- package/src/shares/bug-report-flow.tsx +4 -7
- package/src/shares/capture-flow.ts +5 -4
- package/src/shares/capture-preview.tsx +2 -2
- package/src/shares/chat.ts +7 -27
- package/src/shares/flow.tsx +86 -40
- package/src/shares/location.ts +1 -3
- package/src/shares/pane-image.ts +11 -9
- package/src/shares/pane.ts +5 -2
- package/src/shares/payload.ts +1 -1
- package/src/shares/personal-pane.ts +3 -3
- package/src/shares/portable-layout.ts +9 -2
- package/src/shares/ready.ts +42 -0
- package/src/shares/test-harness.ts +62 -0
- package/src/sources/gloomberb-cloud/batched-lookups.ts +73 -0
- package/src/sources/gloomberb-cloud/index.ts +64 -12
- package/src/sources/gloomberb-cloud/normalizers.ts +31 -2
- package/src/sources/gloomberb-cloud/perpetuals.ts +20 -1
- package/src/sources/history-omitted.ts +34 -0
- package/src/sources/history-result.ts +3 -0
- package/src/sources/history-retention.ts +1 -1
- package/src/sources/provider-errors.ts +43 -1
- package/src/sources/provider-router/batches.ts +3 -2
- package/src/sources/provider-router/cache.ts +2 -1
- package/src/sources/provider-router/cached-routes.ts +9 -3
- package/src/sources/provider-router/history.ts +9 -8
- package/src/sources/provider-router/index.ts +18 -3
- package/src/sources/provider-router/primary.ts +5 -4
- package/src/sources/provider-router/quote-route.ts +3 -1
- package/src/sources/provider-router/routing.ts +2 -1
- package/src/sources/provider-router/search.ts +47 -13
- package/src/sources/provider-router/streaming.ts +7 -4
- package/src/sources/sec-edgar.ts +1 -3
- package/src/state/app/context/index.tsx +9 -13
- package/src/state/app/tab-cursor.ts +149 -12
- package/src/state/hooks/quote-streaming.ts +3 -2
- package/src/state/hooks/session-snapshot.ts +3 -2
- package/src/state/persist-scheduler.ts +12 -4
- package/src/sync/controller.ts +22 -1
- package/src/sync/core-contributors.ts +58 -15
- package/src/team/collections-sync.ts +14 -4
- package/src/team/collections.ts +40 -11
- package/src/team/store.ts +5 -4
- package/src/telemetry/attention-counts.ts +8 -2
- package/src/telemetry/crash-reports-dom.ts +3 -0
- package/src/telemetry/crash-reports-node.ts +7 -4
- package/src/telemetry/crash-reports.ts +11 -11
- package/src/telemetry/usage-counts.ts +16 -12
- package/src/theme/colors.ts +2 -0
- package/src/theme/font-scale.ts +2 -0
- package/src/theme/ui-tokens.ts +71 -0
- package/src/tickers/batched-lookups.ts +186 -0
- package/src/tickers/company-name-listing.ts +97 -0
- package/src/tickers/company-name.ts +13 -0
- package/src/tickers/instrument-coverage.ts +112 -0
- package/src/tickers/listing-fate.ts +49 -9
- package/src/tickers/listing-venues.ts +24 -5
- package/src/tickers/open-target.ts +13 -5
- package/src/tickers/search/index.ts +112 -35
- package/src/tickers/search/ranking.ts +49 -1
- package/src/tickers/terminal-codes.ts +79 -0
- package/src/tickers/ticker-changes.ts +74 -3
- package/src/tickers/us-listing.ts +2 -1
- package/src/time-series/chart-data.ts +79 -8
- package/src/time-series/fundamentals.ts +55 -7
- package/src/time-series/ice-credit.ts +17 -2
- package/src/time-series/live-bars.ts +21 -8
- package/src/time-series/live-quotes.ts +2 -3
- package/src/time-series/price-comparison.ts +6 -1
- package/src/time-series/resolve.ts +65 -10
- package/src/time-series/spec.ts +2 -1
- package/src/time-series/studies.ts +3 -3
- package/src/time-series/types.ts +22 -0
- package/src/time-series/use-chart-resolution.ts +2 -1
- package/src/types/config.ts +7 -0
- package/src/types/data-provider.ts +20 -0
- package/src/types/headless.ts +142 -1
- package/src/types/instrument.ts +6 -0
- package/src/types/plugin.ts +32 -9
- package/src/types/price-history.ts +5 -0
- package/src/types/ticker-changes.ts +19 -0
- package/src/types/ticker.ts +10 -2
- package/src/ui/context-menu.tsx +2 -0
- package/src/ui/host.tsx +40 -4
- package/src/ui/measured-cells.ts +13 -7
- package/src/ui/qr.ts +7 -5
- package/src/updater/index.ts +5 -5
- package/src/utils/calendar-date.ts +86 -27
- package/src/utils/currency-units.ts +17 -0
- package/src/utils/debug-log.ts +1 -1
- package/src/utils/dividend-cash.ts +48 -0
- package/src/utils/dom-screenshot-rasters.ts +3 -1
- package/src/utils/dom-screenshot.ts +14 -10
- package/src/utils/exchange-rate-snapshot.ts +9 -4
- package/src/utils/external-url.ts +1 -0
- package/src/utils/fiscal-period.ts +47 -0
- package/src/utils/format.ts +5 -2
- package/src/utils/forward-dividend.ts +160 -11
- package/src/utils/futures-generic.ts +34 -8
- package/src/utils/http-proxy-response.ts +2 -1
- package/src/utils/local-utc-offset.ts +2 -0
- package/src/utils/log-failure.ts +31 -0
- package/src/utils/option-expiry.ts +12 -12
- package/src/utils/price-history-integrity.ts +56 -0
- package/src/utils/price-history.ts +13 -1
- package/src/utils/sec-filings.ts +245 -0
- package/src/utils/selection-clipboard.ts +5 -2
- package/src/utils/throttled-fetch.ts +1 -0
- package/src/{plugins/builtin/dividend-yield/trailing-cash.ts → utils/trailing-dividend.ts} +55 -8
- package/src/utils/url.ts +1 -0
- package/src/utils/utc-time.ts +11 -0
- package/src/plugins/builtin/chat/share/targets.ts +0 -27
- package/src/renderers/dom/host/top-surface.ts +0 -119
- package/src/shares/dialog.tsx +0 -221
- package/src/shares/live.ts +0 -19
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import type {
|
|
2
|
+
ThirteenFEdgarFiling,
|
|
3
|
+
ThirteenFFilerStatus,
|
|
2
4
|
ThirteenFFormSummary,
|
|
3
5
|
ThirteenFFund,
|
|
4
6
|
ThirteenFHoldingRecord,
|
|
@@ -34,6 +36,8 @@ export interface Forms13FReadOptions {
|
|
|
34
36
|
interface Forms13FRequestOptions extends Forms13FReadOptions {
|
|
35
37
|
cache?: boolean;
|
|
36
38
|
signal?: AbortSignal;
|
|
39
|
+
/** Gloom Cloud only: a path the public 13F source does not serve. */
|
|
40
|
+
cloudOnly?: boolean;
|
|
37
41
|
}
|
|
38
42
|
|
|
39
43
|
let forms13FPersistence: PluginPersistence | null = null;
|
|
@@ -123,8 +127,9 @@ async function fetchForms13F<T>(
|
|
|
123
127
|
let value: T;
|
|
124
128
|
try {
|
|
125
129
|
value = await apiClient.getCloudSec13F(path, params, { signal: options.signal }) as T;
|
|
126
|
-
} catch {
|
|
130
|
+
} catch (error) {
|
|
127
131
|
options.signal?.throwIfAborted();
|
|
132
|
+
if (options.cloudOnly) throw error;
|
|
128
133
|
const url = `${FORMS_13F_BASE_URL}${path}?${searchParams.toString()}`;
|
|
129
134
|
const response = await httpFetch(url, {
|
|
130
135
|
headers: { Accept: "application/json" },
|
|
@@ -260,6 +265,9 @@ export async function searchThirteenFFunds(
|
|
|
260
265
|
return arrayResponse(raw).map(mapFund).filter((fund): fund is ThirteenFFund => !!fund);
|
|
261
266
|
}
|
|
262
267
|
|
|
268
|
+
/** The most funds one page of the performance ranking holds; the source refuses more. */
|
|
269
|
+
export const TOP_FUNDS_MAX_LIMIT = 100;
|
|
270
|
+
|
|
263
271
|
export async function listTopThirteenFFunds(
|
|
264
272
|
quarter: string,
|
|
265
273
|
limit = 50,
|
|
@@ -268,7 +276,7 @@ export async function listTopThirteenFFunds(
|
|
|
268
276
|
): Promise<ThirteenFTopFund[]> {
|
|
269
277
|
const raw = await fetchForms13F<unknown>("/topfunds", {
|
|
270
278
|
quarter,
|
|
271
|
-
limit,
|
|
279
|
+
limit: Math.min(limit, TOP_FUNDS_MAX_LIMIT),
|
|
272
280
|
offset: options.offset ?? 0,
|
|
273
281
|
}, { ...options, signal });
|
|
274
282
|
return arrayResponse(raw).map(mapTopFund).filter((fund): fund is ThirteenFTopFund => !!fund);
|
|
@@ -381,3 +389,43 @@ export async function lookupThirteenFHoldersByCusip(
|
|
|
381
389
|
: [],
|
|
382
390
|
};
|
|
383
391
|
}
|
|
392
|
+
|
|
393
|
+
function mapEdgarFiling(raw: any): ThirteenFEdgarFiling | null {
|
|
394
|
+
const form = stringOrEmpty(raw?.form), period = stringOrEmpty(raw?.period), filed = stringOrEmpty(raw?.filed);
|
|
395
|
+
if (!form.startsWith("13F") || !period || !filed) return null;
|
|
396
|
+
const managers = Array.isArray(raw.otherManagers) ? raw.otherManagers : null;
|
|
397
|
+
return {
|
|
398
|
+
form,
|
|
399
|
+
period,
|
|
400
|
+
filed,
|
|
401
|
+
accession: stringOrEmpty(raw.accession),
|
|
402
|
+
url: stringOrEmpty(raw.url),
|
|
403
|
+
...(managers ? {
|
|
404
|
+
otherManagers: managers
|
|
405
|
+
.map((manager: any) => ({
|
|
406
|
+
cik: stringOrEmpty(manager?.cik) ? normalizeCik(stringOrEmpty(manager.cik)) : null,
|
|
407
|
+
name: stringOrEmpty(manager?.name).trim(),
|
|
408
|
+
fileNumber: stringOrEmpty(manager?.fileNumber) || null,
|
|
409
|
+
}))
|
|
410
|
+
.filter((manager: { name: string }) => manager.name),
|
|
411
|
+
} : {}),
|
|
412
|
+
};
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
/**
|
|
416
|
+
* The fund's 13F filings as EDGAR lists them, 13F-NT notices included, from
|
|
417
|
+
* Gloom Cloud. A notice names the managers that reported its holdings.
|
|
418
|
+
*/
|
|
419
|
+
export async function loadThirteenFFilerStatus(
|
|
420
|
+
cik: string,
|
|
421
|
+
signal?: AbortSignal,
|
|
422
|
+
options: Forms13FReadOptions = {},
|
|
423
|
+
): Promise<ThirteenFFilerStatus> {
|
|
424
|
+
const raw = asRecord(await fetchForms13F<unknown>("/filer", { cik: normalizeCik(cik) }, { ...options, signal, cloudOnly: true }));
|
|
425
|
+
return {
|
|
426
|
+
cik: normalizeCik(stringOrEmpty(raw.cik) || cik),
|
|
427
|
+
name: stringOrEmpty(raw.name),
|
|
428
|
+
source: stringOrEmpty(raw.source),
|
|
429
|
+
filings: arrayResponse(raw.filings).map(mapEdgarFiling).filter((filing): filing is ThirteenFEdgarFiling => !!filing),
|
|
430
|
+
};
|
|
431
|
+
}
|
|
@@ -5,23 +5,34 @@ import {
|
|
|
5
5
|
listThirteenFForms,
|
|
6
6
|
listThirteenFFilings,
|
|
7
7
|
listTopThirteenFFunds,
|
|
8
|
+
loadThirteenFFilerStatus,
|
|
8
9
|
lookupThirteenFHoldersByCusip,
|
|
9
10
|
lookupThirteenFTickers,
|
|
10
11
|
normalizeCik,
|
|
11
12
|
searchThirteenFFunds,
|
|
12
13
|
} from "./api";
|
|
13
14
|
import { isoDateDaysAgo, isoDateToday, isoDateYearsAgo } from "../../../utils/calendar-date";
|
|
15
|
+
import { abortable, withDeadline } from "../../../utils/async-deadline";
|
|
14
16
|
import {
|
|
15
17
|
buildBrowserRows,
|
|
18
|
+
filingGapFor,
|
|
19
|
+
estimateFilingQuarterReturn,
|
|
20
|
+
hasComparable13FQuarter,
|
|
16
21
|
latestLikely13FQuarter,
|
|
17
22
|
oneFundPerCik,
|
|
18
23
|
buildPeriodReports,
|
|
19
24
|
dedupeLatestForms,
|
|
25
|
+
filingSplitCandidates,
|
|
26
|
+
type FilingQuarterReturn,
|
|
20
27
|
} from "./model";
|
|
28
|
+
import { mapWithConcurrency } from "../../../utils/concurrency";
|
|
29
|
+
import { describeTickerChange, movedAwayChange, startTickerChangeLookup } from "../../../tickers/ticker-changes";
|
|
30
|
+
import type { DataProvider } from "../../../types/data-provider";
|
|
21
31
|
import type {
|
|
22
32
|
FundBrowserRow,
|
|
23
33
|
FundDetailData,
|
|
24
34
|
ThirteenFBrowserTab,
|
|
35
|
+
ThirteenFFilingGap,
|
|
25
36
|
ThirteenFFund,
|
|
26
37
|
ThirteenFHoldingRecord,
|
|
27
38
|
ThirteenFTopFund,
|
|
@@ -129,15 +140,8 @@ async function loadBrowserPage(
|
|
|
129
140
|
|
|
130
141
|
if (tab === "performance") {
|
|
131
142
|
const topFunds = await listTopThirteenFFunds(quarter, browserLimit, signal, pageApiOptions);
|
|
132
|
-
const quarters =
|
|
133
|
-
|
|
134
|
-
const index = Number(quarter.at(-1)) - 1 - back;
|
|
135
|
-
return `${year + Math.floor(index / 4)}Q${((index % 4) + 4) % 4 + 1}`;
|
|
136
|
-
});
|
|
137
|
-
const history = await Promise.all(quarters.map(async previous => {
|
|
138
|
-
try { return new Map((await listTopThirteenFFunds(previous, 100, signal, apiOptions)).filter(fund => fund.periodOfReport === quarterToPeriod(previous)).map(fund => [fund.cik, fund.pnl])); }
|
|
139
|
-
catch (error) { if (signal?.aborted) throw error; options.onWarning?.(`${previous}: performance ranking unavailable.`); return new Map<string, number | null>(); }
|
|
140
|
-
}));
|
|
143
|
+
const quarters = priorQuarters(quarter);
|
|
144
|
+
const history = await loadRankingHistory(quarters, signal, { ...apiOptions, onWarning: options.onWarning });
|
|
141
145
|
const funds: ThirteenFFund[] = topFunds.map((fund) => ({ cik: fund.cik, name: fund.name }));
|
|
142
146
|
const rows = buildBrowserRows({ topFunds, source: "performance" }).map(row => ({ ...row, priorReturns: quarters.map((previous, index) => ({ quarter: previous, value: history[index]?.get(row.cik) ?? null })) }));
|
|
143
147
|
const result: BrowserLoadResult = {
|
|
@@ -258,11 +262,237 @@ async function loadBrowserPage(
|
|
|
258
262
|
return result;
|
|
259
263
|
}
|
|
260
264
|
|
|
265
|
+
/** How long a fund's report waits on EDGAR's filing list before it goes out unchecked. */
|
|
266
|
+
const FILER_STATUS_TIMEOUT_MS = 4_000;
|
|
267
|
+
|
|
268
|
+
/**
|
|
269
|
+
* What the fund filed for the newest quarter past its deadline, when its
|
|
270
|
+
* latest report (`latestPeriod`) predates that quarter: EDGAR says whether it
|
|
271
|
+
* was a 13F-NT and who reported instead. Null when the report is current; a
|
|
272
|
+
* gap with `checked: false` when EDGAR could not be asked (a server without
|
|
273
|
+
* the route, a failure, or no answer within the deadline).
|
|
274
|
+
*/
|
|
275
|
+
export async function loadFilingGap(
|
|
276
|
+
cik: string,
|
|
277
|
+
latestPeriod: string | null | undefined,
|
|
278
|
+
signal?: AbortSignal,
|
|
279
|
+
now = new Date(),
|
|
280
|
+
options: { forceRefresh?: boolean; timeoutMs?: number } = {},
|
|
281
|
+
): Promise<ThirteenFFilingGap | null> {
|
|
282
|
+
if (!filingGapFor(latestPeriod, null, now)) return null;
|
|
283
|
+
const controller = new AbortController();
|
|
284
|
+
const abort = () => controller.abort(signal?.reason);
|
|
285
|
+
if (signal?.aborted) abort();
|
|
286
|
+
else signal?.addEventListener("abort", abort, { once: true });
|
|
287
|
+
const timeoutMs = options.timeoutMs ?? FILER_STATUS_TIMEOUT_MS;
|
|
288
|
+
try {
|
|
289
|
+
const status = await withDeadline(
|
|
290
|
+
loadThirteenFFilerStatus(cik, controller.signal, { forceRefresh: options.forceRefresh }),
|
|
291
|
+
timeoutMs,
|
|
292
|
+
`13F filer status timed out after ${timeoutMs}ms`,
|
|
293
|
+
(error) => controller.abort(error),
|
|
294
|
+
).catch((error: unknown) => {
|
|
295
|
+
if (signal?.aborted) throw error;
|
|
296
|
+
return null;
|
|
297
|
+
});
|
|
298
|
+
return filingGapFor(latestPeriod, status, now);
|
|
299
|
+
} finally {
|
|
300
|
+
signal?.removeEventListener("abort", abort);
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
/** The three quarters before `quarter` (`2026Q2`), newest first, as the performance list's columns name them. */
|
|
305
|
+
function priorQuarters(quarter: string): string[] {
|
|
306
|
+
return [1, 2, 3].map(back => {
|
|
307
|
+
const year = Number(quarter.slice(0, 4));
|
|
308
|
+
const index = Number(quarter.at(-1)) - 1 - back;
|
|
309
|
+
return `${year + Math.floor(index / 4)}Q${((index % 4) + 4) % 4 + 1}`;
|
|
310
|
+
});
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
/** Each quarter's ranked estimates by CIK; a quarter whose ranking fails is empty, with a warning. */
|
|
314
|
+
async function loadRankingHistory(
|
|
315
|
+
quarters: readonly string[],
|
|
316
|
+
signal: AbortSignal | undefined,
|
|
317
|
+
options: Forms13FReadOptions,
|
|
318
|
+
): Promise<Array<Map<string, number | null>>> {
|
|
319
|
+
return Promise.all(quarters.map(async previous => {
|
|
320
|
+
try { return new Map((await listTopThirteenFFunds(previous, 100, signal, options)).filter(fund => fund.periodOfReport === quarterToPeriod(previous)).map(fund => [fund.cik, fund.pnl])); }
|
|
321
|
+
catch (error) { if (signal?.aborted) throw error; options.onWarning?.(`${previous}: performance ranking unavailable.`); return new Map<string, number | null>(); }
|
|
322
|
+
}));
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
/** How far down the performance ranking a fund's own row is looked for. */
|
|
326
|
+
const RANKING_LOOKUP_LIMIT = 100;
|
|
327
|
+
|
|
328
|
+
/** One fund's row of the performance list, and where its estimate comes from. */
|
|
329
|
+
export interface FundPerformanceResult extends BrowserLoadResult {
|
|
330
|
+
/** `ranking`: the fund's own row of the ranking; `filings`: estimated from its last two filings; null: neither has one. */
|
|
331
|
+
basis: "ranking" | "filings" | null;
|
|
332
|
+
/**
|
|
333
|
+
* The fund in its latest quarter's ranking: `ranked` (with or without a
|
|
334
|
+
* return), `unranked`, or `unavailable` when the ranking failed to load;
|
|
335
|
+
* null without a filed quarter.
|
|
336
|
+
*/
|
|
337
|
+
ranking: "ranked" | "unranked" | "unavailable" | null;
|
|
338
|
+
/** Lines of a filings estimate split between the filings (priced split-adjusted) and those left out; see estimateFilingQuarterReturn. */
|
|
339
|
+
splits?: FilingQuarterReturn["splits"];
|
|
340
|
+
skipped?: FilingQuarterReturn["skipped"];
|
|
341
|
+
/** What EDGAR shows for the quarter after the fund's latest report, when it is behind (loadFundDetail). */
|
|
342
|
+
filingGap?: ThirteenFFilingGap | null;
|
|
343
|
+
/** Why there is no estimate, when there is none. */
|
|
344
|
+
unavailable?: string;
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
/** A ticker's split factor, new shares per old, after one day through another: 1 for none, null when its actions cannot be read. */
|
|
348
|
+
export type SplitFactorLookup = (ticker: string, after: string, through: string) => Promise<number | null>;
|
|
349
|
+
|
|
350
|
+
/** The least provider adjustment that is a share split: 5:4. A spinoff's price adjustment, nearer 1, changes no share count. */
|
|
351
|
+
const MIN_SPLIT_FACTOR = 1.25;
|
|
352
|
+
|
|
353
|
+
/** The share splits a ticker's own corporate actions show, as one factor; see corporateSplitFactor. */
|
|
354
|
+
async function ownSplitFactor(marketData: Pick<DataProvider, "getCorporateActions">, ticker: string, after: string, through: string): Promise<number | null> {
|
|
355
|
+
if (!marketData.getCorporateActions) return null;
|
|
356
|
+
const actions = await marketData.getCorporateActions(ticker);
|
|
357
|
+
if (actions.coverage?.splits === "unavailable") return null;
|
|
358
|
+
return actions.splits.reduce((factor, split) => {
|
|
359
|
+
const ratio = split.fromFactor && split.toFactor ? split.toFactor / split.fromFactor : split.ratio;
|
|
360
|
+
const inWindow = split.date.slice(0, 10) > after && split.date.slice(0, 10) <= through;
|
|
361
|
+
return inWindow && ratio && Number.isFinite(ratio) && Math.abs(Math.log(ratio)) >= Math.log(MIN_SPLIT_FACTOR) - 1e-9 ? factor * ratio : factor;
|
|
362
|
+
}, 1);
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
/** How long a renamed ticker's change record is waited for. */
|
|
366
|
+
const RENAME_LOOKUP_MS = 5_000;
|
|
367
|
+
|
|
368
|
+
/**
|
|
369
|
+
* The share splits a ticker's corporate actions show after `after` through
|
|
370
|
+
* `through` (ex-dates, `YYYY-MM-DD`), as one factor of new shares per old: 1
|
|
371
|
+
* for none, null when the source has no corporate actions or says it has no
|
|
372
|
+
* splits for the ticker.
|
|
373
|
+
*
|
|
374
|
+
* A ticker its company has left (BK became BNY, VSCO became VSXY) has none of
|
|
375
|
+
* its own, so when the ticker's actions are unreadable they are asked of the
|
|
376
|
+
* symbol the company trades as now, once, when its change record says nothing
|
|
377
|
+
* lists under the old one. A ticker with no such record stays unreadable.
|
|
378
|
+
*/
|
|
379
|
+
export async function corporateSplitFactor(marketData: Pick<DataProvider, "getCorporateActions" | "getTickerChanges">, ticker: string, after: string, through: string): Promise<number | null> {
|
|
380
|
+
let failure: unknown;
|
|
381
|
+
const own = await ownSplitFactor(marketData, ticker, after, through).catch((error: unknown) => { failure = error; return null; });
|
|
382
|
+
if (own != null) return own;
|
|
383
|
+
const payload = await startTickerChangeLookup(marketData, ticker).settle(RENAME_LOOKUP_MS);
|
|
384
|
+
const current = movedAwayChange(describeTickerChange(ticker, payload))?.tradesAs;
|
|
385
|
+
if (!current || current.toUpperCase() === ticker.trim().toUpperCase()) {
|
|
386
|
+
if (failure) throw failure;
|
|
387
|
+
return null;
|
|
388
|
+
}
|
|
389
|
+
return ownSplitFactor(marketData, current, after, through);
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
/** Corporate-action lookups in flight at once for one fund's split candidates. */
|
|
393
|
+
const SPLIT_LOOKUP_CONCURRENCY = 6;
|
|
394
|
+
/** How long one ticker's corporate actions are waited for before its split reads as unconfirmed. */
|
|
395
|
+
const SPLIT_LOOKUP_TIMEOUT_MS = 10_000;
|
|
396
|
+
|
|
397
|
+
/**
|
|
398
|
+
* The split factor between a fund's two quarter ends for each of its split
|
|
399
|
+
* candidates (filingSplitCandidates), by row id, for estimateFilingQuarterReturn
|
|
400
|
+
* and the Holdings rows: a few lookups at once, each as the lookup answers it.
|
|
401
|
+
* A line the lookup cannot answer for (no ticker, a failure, no answer in time)
|
|
402
|
+
* is null, unconfirmed. Only an abort rejects. A fund with no candidates, or
|
|
403
|
+
* without two comparable quarters, makes no lookup.
|
|
404
|
+
*/
|
|
405
|
+
export async function loadSplitFactors(detail: FundDetailData, lookup: SplitFactorLookup, signal?: AbortSignal): Promise<Map<string, number | null>> {
|
|
406
|
+
const period = detail.latestForm?.periodOfReport;
|
|
407
|
+
const previousPeriod = detail.previousForm?.periodOfReport;
|
|
408
|
+
if (!period || !previousPeriod) return new Map();
|
|
409
|
+
return new Map(await mapWithConcurrency(filingSplitCandidates(detail), SPLIT_LOOKUP_CONCURRENCY, async (line) => {
|
|
410
|
+
signal?.throwIfAborted();
|
|
411
|
+
if (!line.ticker) return [line.id, null] as const;
|
|
412
|
+
const factor = await abortable(
|
|
413
|
+
withDeadline(lookup(line.ticker, previousPeriod, period), SPLIT_LOOKUP_TIMEOUT_MS, `${line.ticker} split lookup timed out`),
|
|
414
|
+
signal,
|
|
415
|
+
"Split lookup aborted",
|
|
416
|
+
).catch((error: unknown) => {
|
|
417
|
+
if (signal?.aborted) throw error;
|
|
418
|
+
return null;
|
|
419
|
+
});
|
|
420
|
+
return [line.id, factor] as const;
|
|
421
|
+
}));
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
/**
|
|
425
|
+
* One fund's row of the performance list, with the list's columns: its
|
|
426
|
+
* ranking's return for its latest quarter when the ranking gives one,
|
|
427
|
+
* otherwise its return estimated from its own last two filings
|
|
428
|
+
* (estimateFilingQuarterReturn); `ranking` says whether the ranking lists it
|
|
429
|
+
* without a return, leaves it out, or failed to load. The prior quarters are
|
|
430
|
+
* the ranking's, as the list's are.
|
|
431
|
+
*/
|
|
432
|
+
export async function loadFundPerformance(
|
|
433
|
+
cik: string,
|
|
434
|
+
fallbackName: string,
|
|
435
|
+
signal?: AbortSignal,
|
|
436
|
+
options: { forceRefresh?: boolean; splitFactor?: SplitFactorLookup } = {},
|
|
437
|
+
): Promise<FundPerformanceResult> {
|
|
438
|
+
const warnings: string[] = [];
|
|
439
|
+
const apiOptions = { forceRefresh: options.forceRefresh, onWarning: (warning: string) => warnings.push(warning) };
|
|
440
|
+
const detail = await loadFundDetail(cik, fallbackName, signal, options);
|
|
441
|
+
const period = detail.latestForm?.periodOfReport;
|
|
442
|
+
const quarter = period ? periodToQuarter(period) : null;
|
|
443
|
+
const quarters = quarter ? priorQuarters(quarter) : [];
|
|
444
|
+
const [ranked, history] = await Promise.all([
|
|
445
|
+
quarter
|
|
446
|
+
? listTopThirteenFFunds(quarter, RANKING_LOOKUP_LIMIT, signal, apiOptions).catch((error: unknown): null => {
|
|
447
|
+
if (signal?.aborted) throw error;
|
|
448
|
+
warnings.push(`${quarter}: performance ranking unavailable.`);
|
|
449
|
+
return null;
|
|
450
|
+
})
|
|
451
|
+
: Promise.resolve(null),
|
|
452
|
+
loadRankingHistory(quarters, signal, apiOptions),
|
|
453
|
+
]);
|
|
454
|
+
const own = ranked?.find((fund) => fund.cik === detail.cik && fund.periodOfReport === period);
|
|
455
|
+
const ranking = !quarter ? null : !ranked ? "unavailable" : own ? "ranked" : "unranked";
|
|
456
|
+
// A line that moved as across a split is priced by its corporate actions: split-adjusted, as a trade, or left out unread.
|
|
457
|
+
const factors = own?.pnl != null || !options.splitFactor ? new Map<string, number | null>() : await loadSplitFactors(detail, options.splitFactor, signal);
|
|
458
|
+
const filed = own?.pnl != null ? null : estimateFilingQuarterReturn(detail, factors);
|
|
459
|
+
const estimate = own?.pnl ?? filed?.percent ?? null;
|
|
460
|
+
const basis = own?.pnl != null ? "ranking" : estimate != null ? "filings" : null;
|
|
461
|
+
const latest = detail.latestReport;
|
|
462
|
+
const row: FundBrowserRow = {
|
|
463
|
+
id: `performance:${detail.cik}`,
|
|
464
|
+
cik: detail.cik,
|
|
465
|
+
name: detail.name,
|
|
466
|
+
periodOfReport: period,
|
|
467
|
+
filedAsOfDate: detail.latestForm?.filedAsOfDate,
|
|
468
|
+
// An incomplete report has no total to state, as the list leaves it out.
|
|
469
|
+
tableValueTotal: latest ? (latest.complete ? latest.tableValueTotal : null) : null,
|
|
470
|
+
tableEntryTotal: latest ? (latest.complete ? latest.tableEntryTotal : null) : null,
|
|
471
|
+
estQuarterReturn: estimate,
|
|
472
|
+
priorReturns: quarters.map((previous, index) => ({ quarter: previous, value: history[index]?.get(detail.cik) ?? null })),
|
|
473
|
+
source: "performance",
|
|
474
|
+
};
|
|
475
|
+
const unavailable = basis ? undefined
|
|
476
|
+
: !period ? "No 13F filing in the last four years."
|
|
477
|
+
: !hasComparable13FQuarter(detail) ? `No comparable quarter before ${period} to estimate a return from.`
|
|
478
|
+
: filed?.skipped.length ? `No share position held through the quarter to ${period} that could be priced across it.`
|
|
479
|
+
: `No share position held through the quarter to ${period}.`;
|
|
480
|
+
const warning = [...new Set([...(detail.warnings ?? []), ...warnings])].join(" ") || undefined;
|
|
481
|
+
return {
|
|
482
|
+
rows: [row], ...(quarter ? { quarter } : {}), ...(period ? { period } : {}), hasMore: false, basis, ranking,
|
|
483
|
+
...(filed?.splits.length ? { splits: filed.splits } : {}),
|
|
484
|
+
...(filed?.skipped.length ? { skipped: filed.skipped } : {}),
|
|
485
|
+
...(detail.filingGap ? { filingGap: detail.filingGap } : {}),
|
|
486
|
+
...(unavailable ? { unavailable } : {}), ...(warning ? { warning } : {}),
|
|
487
|
+
};
|
|
488
|
+
}
|
|
489
|
+
|
|
261
490
|
export async function loadFundDetail(
|
|
262
491
|
cik: string,
|
|
263
492
|
fallbackName: string,
|
|
264
493
|
signal?: AbortSignal,
|
|
265
|
-
|
|
494
|
+
/** `filingGap: false` skips EDGAR's filing list, for a load that never shows it (an overlap). */
|
|
495
|
+
options: { forceRefresh?: boolean; filingGap?: boolean } = {},
|
|
266
496
|
): Promise<FundDetailData> {
|
|
267
497
|
const now = new Date();
|
|
268
498
|
const warnings: string[] = [];
|
|
@@ -297,7 +527,7 @@ export async function loadFundDetail(
|
|
|
297
527
|
}
|
|
298
528
|
return holdings;
|
|
299
529
|
}
|
|
300
|
-
const [latestHoldings, previousHoldings] = await Promise.all([
|
|
530
|
+
const [latestHoldings, previousHoldings, filingGap] = await Promise.all([
|
|
301
531
|
loadReport(latestReport),
|
|
302
532
|
loadReport(previousReport).catch((error) => {
|
|
303
533
|
if (signal?.aborted) throw error;
|
|
@@ -305,6 +535,8 @@ export async function loadFundDetail(
|
|
|
305
535
|
warnings.push(`${previousReport?.periodOfReport ?? "Prior quarter"}: holdings unavailable; comparison unavailable.`);
|
|
306
536
|
return [];
|
|
307
537
|
}),
|
|
538
|
+
options.filingGap === false ? null
|
|
539
|
+
: loadFilingGap(cik, latestForm?.periodOfReport, signal, now, { forceRefresh: options.forceRefresh }),
|
|
308
540
|
]);
|
|
309
541
|
return {
|
|
310
542
|
cik: normalizeCik(cik),
|
|
@@ -317,6 +549,7 @@ export async function loadFundDetail(
|
|
|
317
549
|
latestReport,
|
|
318
550
|
previousReport,
|
|
319
551
|
warnings,
|
|
552
|
+
filingGap,
|
|
320
553
|
};
|
|
321
554
|
}
|
|
322
555
|
|
|
@@ -333,6 +566,12 @@ export async function loadFilingPositions(
|
|
|
333
566
|
return { ...result, warnings };
|
|
334
567
|
}
|
|
335
568
|
|
|
569
|
+
/** `2026Q2` for a quarter end such as 2026-06-30. */
|
|
570
|
+
function periodToQuarter(period: string): string | null {
|
|
571
|
+
const match = /^(\d{4})-(\d{2})-\d{2}$/.exec(period);
|
|
572
|
+
return match ? `${match[1]}Q${Math.floor((Number(match[2]) - 1) / 3) + 1}` : null;
|
|
573
|
+
}
|
|
574
|
+
|
|
336
575
|
function quarterToPeriod(quarter: string): string {
|
|
337
576
|
const match = /^(\d{4})Q([1-4])$/.exec(quarter);
|
|
338
577
|
if (!match) return "";
|