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
|
@@ -3,6 +3,7 @@ import { getTimeSeriesField } from "./field-catalog";
|
|
|
3
3
|
import type { ChartSpec, ResolvedSeries, TimeSeriesPoint } from "./types";
|
|
4
4
|
import type { ManualChartResolution } from "./resolution";
|
|
5
5
|
import { zonedDateTimeParts } from "../utils/zoned-date-time";
|
|
6
|
+
import { barLastSession } from "../market-data/market/bar-period";
|
|
6
7
|
|
|
7
8
|
const PRICE_COMPARISON_BASIS = "Price returns in each listing's currency; cash distributions and FX conversion excluded.";
|
|
8
9
|
|
|
@@ -102,6 +103,10 @@ export function resolvePriceComparison(
|
|
|
102
103
|
seriesIds, start: null, end: null,
|
|
103
104
|
notice: `${PRICE_COMPARISON_BASIS} Comparison unavailable: need two shared dates and a nonzero baseline.`,
|
|
104
105
|
};
|
|
106
|
+
// A weekly or monthly bar's close is from the last session of its period, which the notice dates it by.
|
|
107
|
+
const period = resolution === "1wk" ? "week" : resolution === "1mo" ? "month" : null;
|
|
108
|
+
const venue = byId.get(seriesIds[0]!)?.timeBasis?.exchange || byId.get(seriesIds[0]!)?.listing?.exchange || undefined;
|
|
109
|
+
const sessionDay = (key: string) => (period ? barLastSession(key, period, venue, Date.now()) : null) ?? key;
|
|
105
110
|
const sourceBounds = Object.fromEntries(seriesIds.map((id, index) => [id, {
|
|
106
111
|
start: observations[index]!.get(start)!.date.getTime(),
|
|
107
112
|
end: observations[index]!.get(end)!.date.getTime(),
|
|
@@ -113,7 +118,7 @@ export function resolvePriceComparison(
|
|
|
113
118
|
alignment: calendarBars ? "session-date" : "timestamp",
|
|
114
119
|
sourceBounds,
|
|
115
120
|
notice: calendarBars
|
|
116
|
-
? `${PRICE_COMPARISON_BASIS} Shared calendar dates: ${start} to ${end}; market session times may differ.`
|
|
121
|
+
? `${PRICE_COMPARISON_BASIS} Shared calendar dates: ${sessionDay(start)} to ${sessionDay(end)}; market session times may differ.`
|
|
117
122
|
: `${PRICE_COMPARISON_BASIS} Shared observations: ${displayDate(Number(start))} to ${displayDate(Number(end))}.`,
|
|
118
123
|
};
|
|
119
124
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { logFailure } from "../utils/log-failure";
|
|
1
2
|
import { resolveAssetDisplayKind } from "../market-data/market/format";
|
|
2
3
|
import { hasValidQuoteObservationTime } from "../market-data/quotes/freshness";
|
|
3
4
|
import { SnapshotHistoryUnavailableError } from "../market-data/snapshot-provider";
|
|
@@ -45,6 +46,7 @@ import {
|
|
|
45
46
|
} from "./field-catalog";
|
|
46
47
|
import {
|
|
47
48
|
fundamentalSeriesUsesAvailabilityFallback,
|
|
49
|
+
unreportedStatementPeriod,
|
|
48
50
|
valuationCurrencyWarning,
|
|
49
51
|
valuationPriceIssues,
|
|
50
52
|
valuationSeriesUsesLiveQuote,
|
|
@@ -76,6 +78,7 @@ import {
|
|
|
76
78
|
import {
|
|
77
79
|
canonicalExchange,
|
|
78
80
|
isUsListingExchange,
|
|
81
|
+
parsePublicTickerKey,
|
|
79
82
|
publicTickerKey,
|
|
80
83
|
resolveExchangeTimeZone,
|
|
81
84
|
} from "../utils/exchanges";
|
|
@@ -86,6 +89,7 @@ import { latestSessionStart, latestTradingSessionOpen, listingTimeZone, priorSes
|
|
|
86
89
|
import { futuresGenericCaption, futuresGenericListing, futuresListingPriceBasis } from "../utils/futures-generic";
|
|
87
90
|
import { classifyInstrumentType, kindFromListingSyntax } from "../tickers/instrument-kind";
|
|
88
91
|
import { contractPriceUnit } from "./price-units";
|
|
92
|
+
import { INDEX_POINTS_UNIT, isIndexLevel } from "../market-data/market/index-level";
|
|
89
93
|
import { isDatasetChart, isOhlcSeriesStyle } from "./spec";
|
|
90
94
|
import { SERIES_COLORS } from "../theme/series-colors";
|
|
91
95
|
import type {
|
|
@@ -1177,6 +1181,7 @@ function baseSecuritySeries(
|
|
|
1177
1181
|
const field = getTimeSeriesField(spec.source.fieldId);
|
|
1178
1182
|
if (!field) return null;
|
|
1179
1183
|
const points = extractSecuritySeries(financials, spec.source);
|
|
1184
|
+
const unreportedPeriod = points.length === 0 ? unreportedStatementPeriod(financials, spec.source) : null;
|
|
1180
1185
|
const symbol = instrumentLabel(spec.source);
|
|
1181
1186
|
const statementCurrency = field.id.startsWith("fundamental.") && field.unit.startsWith("currency")
|
|
1182
1187
|
? reportingCurrencySeries(points, financials.financialCurrency) : null;
|
|
@@ -1197,7 +1202,10 @@ function baseSecuritySeries(
|
|
|
1197
1202
|
// future's continuous symbol or contract in points, not dollars, as its quote does.
|
|
1198
1203
|
const genericBasis = field.unitGroup === "price" && isMarketFieldId(field.id)
|
|
1199
1204
|
? futuresListingPriceBasis(spec.source.instrument.symbol, spec.source.instrument.exchange) : null;
|
|
1200
|
-
|
|
1205
|
+
// An index's level is points too, never the currency its members trade in.
|
|
1206
|
+
const indexLevel = field.unitGroup === "price" && isMarketFieldId(field.id)
|
|
1207
|
+
&& isIndexLevel(financials.quote?.instrumentType || quoteMetadata?.instrumentType);
|
|
1208
|
+
const genericUnit = genericBasis === "points" || indexLevel ? INDEX_POINTS_UNIT : genericBasis === "thirty-seconds" ? "32nds" : null;
|
|
1201
1209
|
// A future's price in a currency counts what its contract terms say: heating
|
|
1202
1210
|
// oil is USD / gallon and crude USD / barrel, which a bare USD does not tell apart.
|
|
1203
1211
|
const statedUnit = !genericUnit && unitTemplate === "currency" ? contractPriceUnit(contractUnit, currency) : null;
|
|
@@ -1241,6 +1249,7 @@ function baseSecuritySeries(
|
|
|
1241
1249
|
? "Volume unit unknown." : statementCurrency?.warning ?? valuationCurrencyWarning(financials, spec.source),
|
|
1242
1250
|
nativeFrequency: marketField ? marketSeriesFrequency(spec.source, marketResolution)
|
|
1243
1251
|
: spec.source.period && spec.source.period !== "auto" ? spec.source.period : field.nativeFrequency,
|
|
1252
|
+
...(unreportedPeriod ? { unreportedPeriod } : {}),
|
|
1244
1253
|
...(marketField ? { historyResolution: marketResolution } : {}),
|
|
1245
1254
|
timestampMode: spec.source.timestampMode,
|
|
1246
1255
|
dataShape: field.dataShape,
|
|
@@ -1375,6 +1384,39 @@ function assignAxes(
|
|
|
1375
1384
|
});
|
|
1376
1385
|
}
|
|
1377
1386
|
|
|
1387
|
+
/**
|
|
1388
|
+
* A series drawn in a ticker's price (a moving average of it, a band around
|
|
1389
|
+
* it) takes the units of that ticker's price series when the chart has it, so
|
|
1390
|
+
* the two share an axis and the line sits on the price instead of on a scale
|
|
1391
|
+
* of its own.
|
|
1392
|
+
*/
|
|
1393
|
+
function adoptPriceUnits(series: ResolvedSeries[], specs: readonly ChartSeriesSpec[]): ResolvedSeries[] {
|
|
1394
|
+
if (!series.some((entry) => entry.priceOf)) return series;
|
|
1395
|
+
const specsById = new Map(specs.map((spec) => [spec.id, spec]));
|
|
1396
|
+
const prices = series.filter((entry) => {
|
|
1397
|
+
const source = specsById.get(entry.id)?.source;
|
|
1398
|
+
return source?.kind === "security" && getTimeSeriesField(source.fieldId)?.unitGroup === "price"
|
|
1399
|
+
&& entry.transform === "raw";
|
|
1400
|
+
});
|
|
1401
|
+
if (prices.length === 0) return series;
|
|
1402
|
+
return series.map((entry) => {
|
|
1403
|
+
if (!entry.priceOf) return entry;
|
|
1404
|
+
const wanted = parsePublicTickerKey(entry.priceOf.toUpperCase());
|
|
1405
|
+
const key = publicTickerKey(wanted.symbol, wanted.exchange);
|
|
1406
|
+
const named = (price: ResolvedSeries) => {
|
|
1407
|
+
const source = specsById.get(price.id)?.source;
|
|
1408
|
+
if (source?.kind !== "security") return false;
|
|
1409
|
+
return publicTickerKey(source.instrument.symbol, source.instrument.exchange) === key
|
|
1410
|
+
|| (!wanted.exchange && source.instrument.symbol.toUpperCase() === wanted.symbol);
|
|
1411
|
+
};
|
|
1412
|
+
const price = prices.find((candidate) => named(candidate) && candidate.panelId === entry.panelId)
|
|
1413
|
+
?? prices.find(named);
|
|
1414
|
+
return price && entry.transform === "raw"
|
|
1415
|
+
? { ...entry, unit: price.unit, unitGroup: price.unitGroup }
|
|
1416
|
+
: entry;
|
|
1417
|
+
});
|
|
1418
|
+
}
|
|
1419
|
+
|
|
1378
1420
|
function prepareBaseSeriesForStudies(
|
|
1379
1421
|
series: ResolvedSeries,
|
|
1380
1422
|
bounds: DateBounds,
|
|
@@ -1612,7 +1654,11 @@ async function resolveChartSpecPass(
|
|
|
1612
1654
|
if (statementHistory && (!value.statementHistory || value.statementHistory.status === "retryable-failure")) cache.financialsByInstrument.delete(key);
|
|
1613
1655
|
return value;
|
|
1614
1656
|
})
|
|
1615
|
-
.catch(() => {
|
|
1657
|
+
.catch((error) => {
|
|
1658
|
+
logFailure("time-series-resolve", "Loading chart financials failed")(error);
|
|
1659
|
+
cache.financialsByInstrument.delete(key);
|
|
1660
|
+
return null;
|
|
1661
|
+
});
|
|
1616
1662
|
cache.financialsByInstrument.set(key, pending);
|
|
1617
1663
|
cache.revision += 1;
|
|
1618
1664
|
}
|
|
@@ -1628,7 +1674,11 @@ async function resolveChartSpecPass(
|
|
|
1628
1674
|
: provider.getQuote(source.instrument.symbol, source.instrument.exchange ?? "", requestContext(source)).then(quoteMetadataFromQuote))
|
|
1629
1675
|
.then((metadata) => metadata && quoteMetadataMatchesTarget(metadata, source.instrument.symbol, source.instrument.exchange) ? metadata : null)
|
|
1630
1676
|
.then((metadata) => { if (!metadata) cache.quoteMetadataByInstrument.delete(key); return metadata; })
|
|
1631
|
-
.catch(() => {
|
|
1677
|
+
.catch((error) => {
|
|
1678
|
+
logFailure("time-series-resolve", "Loading chart quote metadata failed")(error);
|
|
1679
|
+
cache.quoteMetadataByInstrument.delete(key);
|
|
1680
|
+
return null;
|
|
1681
|
+
});
|
|
1632
1682
|
cache.quoteMetadataByInstrument.set(key, pending);
|
|
1633
1683
|
cache.revision += 1;
|
|
1634
1684
|
}
|
|
@@ -1671,7 +1721,7 @@ async function resolveChartSpecPass(
|
|
|
1671
1721
|
// preset in charge, the same as a source without the capability.
|
|
1672
1722
|
pending = Promise.resolve(result)
|
|
1673
1723
|
.then((value) => normalizeChartResolutionSupport(value))
|
|
1674
|
-
.catch((
|
|
1724
|
+
.catch(logFailure("time-series-resolve", "Could not load chart resolution support", [] as ChartResolutionSupport[]));
|
|
1675
1725
|
const settledPending = pending;
|
|
1676
1726
|
settledPending.then((settled) => {
|
|
1677
1727
|
if (cache.resolutionSupportByInstrument.get(key) !== settledPending) return;
|
|
@@ -1976,7 +2026,7 @@ async function resolveChartSpecPass(
|
|
|
1976
2026
|
const key = symbol.trim().toUpperCase();
|
|
1977
2027
|
let pending = cache.futuresPriceUnits.get(key);
|
|
1978
2028
|
if (!pending) {
|
|
1979
|
-
pending = sources.loadFuturesPriceUnit(key).catch((
|
|
2029
|
+
pending = sources.loadFuturesPriceUnit(key).catch(logFailure("time-series-resolve", "Could not load futures price unit", null)).then((unit) => {
|
|
1980
2030
|
// Terms that did not say are asked again on a later pass, when the source allows.
|
|
1981
2031
|
if (unit === null) cache.futuresPriceUnits.delete(key);
|
|
1982
2032
|
else cache.revision += 1;
|
|
@@ -2250,7 +2300,7 @@ async function resolveChartSpecPass(
|
|
|
2250
2300
|
errors.push(...studyResult.errors);
|
|
2251
2301
|
}
|
|
2252
2302
|
|
|
2253
|
-
const bufferedSeries = assignAxes(resolved, [...spec.series, ...spec.studies], warnings)
|
|
2303
|
+
const bufferedSeries = assignAxes(adoptPriceUnits(resolved, spec.series), [...spec.series, ...spec.studies], warnings)
|
|
2254
2304
|
.map((entry) => clipPriceComparison(entry, priceComparison));
|
|
2255
2305
|
resolved = bufferedSeries.map((entry) => {
|
|
2256
2306
|
const entryBounds = presentationBounds(entry, spec.studies, priceComparison, bounds);
|
|
@@ -2297,8 +2347,10 @@ async function resolveChartSpecPass(
|
|
|
2297
2347
|
];
|
|
2298
2348
|
for (const entry of resolved) {
|
|
2299
2349
|
if (entry.warning) warnings.push(`${entry.label}: ${entry.warning}`);
|
|
2300
|
-
|
|
2301
|
-
|
|
2350
|
+
if (entry.points.length === 0 && entry.unreportedPeriod) {
|
|
2351
|
+
warnings.push(`${entry.label}: no ${entry.unreportedPeriod} figures are reported; annual figures are available.`);
|
|
2352
|
+
} else if (entry.points.length === 0 && !entry.warning?.startsWith(VALUATION_CURRENCY_WARNING_PREFIX)) {
|
|
2353
|
+
// A currency mismatch already explains an empty valuation series.
|
|
2302
2354
|
warnings.push(`${entry.label}: no observations in the selected date range.`);
|
|
2303
2355
|
}
|
|
2304
2356
|
}
|
|
@@ -2385,7 +2437,10 @@ export function reconcileChartTail(
|
|
|
2385
2437
|
}
|
|
2386
2438
|
const run: Promise<boolean> = Promise.all([...cache.liveTails].map(async ([key, tail]) => {
|
|
2387
2439
|
const pending = cache.priceHistoryByRequest.get(key);
|
|
2388
|
-
const loaded = pending ? await pending.catch(() =>
|
|
2440
|
+
const loaded = pending ? await pending.catch(() => {
|
|
2441
|
+
// Intentional ignore: resolveChartSpecPass already includes this history failure in the series errors.
|
|
2442
|
+
return null;
|
|
2443
|
+
}) : null;
|
|
2389
2444
|
if (!pending || !loaded || loaded.resolution !== tail.resolution) return false;
|
|
2390
2445
|
const accumulated = cache.accumulatedPriceHistory.get(tail.accumulationKey);
|
|
2391
2446
|
const latest = latestObservationTime(accumulated?.points ?? loaded.points);
|
|
@@ -2406,7 +2461,7 @@ export function reconcileChartTail(
|
|
|
2406
2461
|
if (!request) {
|
|
2407
2462
|
const fetched = fetchHistoryResult(provider, symbol, exchange ?? "",
|
|
2408
2463
|
{ kind: "detail", start: new Date(start), end: new Date(end), interval: tail.resolution }, context)
|
|
2409
|
-
.catch((
|
|
2464
|
+
.catch(logFailure("time-series-resolve", "Could not reconcile chart history", null))
|
|
2410
2465
|
.finally(() => {
|
|
2411
2466
|
if (shared.get(requestKey) === fetched) shared.delete(requestKey);
|
|
2412
2467
|
});
|
package/src/time-series/spec.ts
CHANGED
|
@@ -36,7 +36,8 @@ import { recordOrNull } from "../utils/guards";
|
|
|
36
36
|
const RANGE_SET = new Set<TimeRange>(TIME_RANGES);
|
|
37
37
|
const RESOLUTIONS = new Set<ChartResolution>(CHART_RESOLUTIONS);
|
|
38
38
|
const PERIODS = new Set<SeriesPeriod>(["auto", "daily", "weekly", "monthly", "quarterly", "annual", "ttm"]);
|
|
39
|
-
|
|
39
|
+
// `band` only stays on a capability series: a field's styles and an economic series' leave it out.
|
|
40
|
+
const STYLES = new Set<SeriesStyle>(["line", "area", "step", "columns", "points", "candles", "ohlc", "hlc", "band"]);
|
|
40
41
|
const ECONOMIC_STYLES = new Set<SeriesStyle>(["line", "area", "step", "columns", "points"]);
|
|
41
42
|
const TRANSFORMS = new Set<SeriesTransform>(["raw", "percent", "index100", "yoy", "qoq", "log"]);
|
|
42
43
|
const AXES = new Set<SeriesAxis>(["auto", "left", "right"]);
|
|
@@ -377,9 +377,9 @@ function resolveMacd(spec: ChartStudySpec, input: ResolvedSeries, color: string)
|
|
|
377
377
|
}
|
|
378
378
|
|
|
379
379
|
function resolveVolume(spec: ChartStudySpec, input: ResolvedSeries, color: string, nameInput: boolean): ResolvedSeries[] {
|
|
380
|
-
//
|
|
381
|
-
//
|
|
382
|
-
if (input.points.
|
|
380
|
+
// No bar has volume to plot (spot FX quotes 0 for every bar; a coin's window
|
|
381
|
+
// can miss every bar's), so the study adds no panel rather than an empty one.
|
|
382
|
+
if (input.points.length > 0 && !input.points.some((point) => isFiniteNumber(point.volume) && point.volume !== 0)) return [];
|
|
383
383
|
const points = [...input.points]
|
|
384
384
|
.sort((left, right) => left.date.getTime() - right.date.getTime())
|
|
385
385
|
.flatMap((point) => isFiniteNumber(point.volume)
|
package/src/time-series/types.ts
CHANGED
|
@@ -122,6 +122,12 @@ export interface TimeSeriesPoint {
|
|
|
122
122
|
close?: number | null;
|
|
123
123
|
volume?: number | null;
|
|
124
124
|
periodLabel?: string;
|
|
125
|
+
/**
|
|
126
|
+
* A financial statement period as the FA columns name it: `FY2025`, `Q3 FY26`,
|
|
127
|
+
* `TTM Q3 FY26`, or the period's end date off the issuer's fiscal calendar.
|
|
128
|
+
* The legend prints it beside the value.
|
|
129
|
+
*/
|
|
130
|
+
fiscalPeriod?: string;
|
|
125
131
|
provenance?: {
|
|
126
132
|
priceHistoryIntegrity?: import("../utils/price-history-integrity").PriceHistoryIntegrity;
|
|
127
133
|
valuationPriceIssues?: import("./valuation-price").ValuationPriceIssue[];
|
|
@@ -169,6 +175,11 @@ export interface ResolvedSeries {
|
|
|
169
175
|
/** Volume basis established by the source instrument; omitted when unspecified. */
|
|
170
176
|
volumeUnit?: "shares" | "contracts";
|
|
171
177
|
nativeFrequency: SeriesPeriod;
|
|
178
|
+
/**
|
|
179
|
+
* Set on a series with nothing to draw because its company reports no
|
|
180
|
+
* figures of the period asked for, while its annual ones exist.
|
|
181
|
+
*/
|
|
182
|
+
unreportedPeriod?: "quarterly";
|
|
172
183
|
/** Acquired market-history cadence; null is explicitly unknown, undefined is legacy or nonmarket. */
|
|
173
184
|
historyResolution?: ManualChartResolution | null;
|
|
174
185
|
/**
|
|
@@ -203,11 +214,22 @@ export interface ResolvedSeries {
|
|
|
203
214
|
points: TimeSeriesPoint[];
|
|
204
215
|
/** Who a report of a loaded series cites, when its loader names the dataset and publisher. */
|
|
205
216
|
attribution?: SeriesAttribution;
|
|
217
|
+
/**
|
|
218
|
+
* The ticker whose price the values are in, such as a moving average of it:
|
|
219
|
+
* the chart draws the series on that price's axis when it shows the price.
|
|
220
|
+
*/
|
|
221
|
+
priceOf?: string;
|
|
206
222
|
/** Rejected valuation price inputs, retained independently of usable observations. */
|
|
207
223
|
valuationPriceIssues?: import("./valuation-price").ValuationPriceIssue[];
|
|
208
224
|
warning?: string;
|
|
209
225
|
/** Listed in the legend so it can be restored, but not drawn. */
|
|
210
226
|
hidden?: boolean;
|
|
227
|
+
/**
|
|
228
|
+
* A layer of a stacked area (`stackedSeries`): a band from the layers below
|
|
229
|
+
* to its own top, each point's `value` the top and `rawValue` the layer's own
|
|
230
|
+
* amount, which the legend shows.
|
|
231
|
+
*/
|
|
232
|
+
stacked?: boolean;
|
|
211
233
|
/** Columns below zero take this colour instead, so a change reads by its sign. */
|
|
212
234
|
negativeColor?: string;
|
|
213
235
|
/**
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { logFailure } from "../utils/log-failure";
|
|
1
2
|
import { useCallback, useEffect, useMemo, useRef, useState, useSyncExternalStore } from "react";
|
|
2
3
|
import {
|
|
3
4
|
ChartResolveCache,
|
|
@@ -401,7 +402,7 @@ export function useChartResolution(
|
|
|
401
402
|
if (disposed || quoteActivityAt <= lastReconcileAt) return;
|
|
402
403
|
lastReconcileAt = Date.now();
|
|
403
404
|
const changed = await reconcileChartTail(latestRequestRef.current.sources, resolveCacheRef.current)
|
|
404
|
-
.catch((
|
|
405
|
+
.catch(logFailure("time-series-use-chart-resolution", "Could not reconcile live chart", false));
|
|
405
406
|
if (disposed) return;
|
|
406
407
|
if (!changed) {
|
|
407
408
|
// A window that settles nothing, or that this history cannot take, is not asked for again at once.
|
package/src/types/config.ts
CHANGED
|
@@ -299,6 +299,12 @@ export interface AppConfig {
|
|
|
299
299
|
recentTickers: string[];
|
|
300
300
|
/** Pane templates recently run from the command bar, newest first. */
|
|
301
301
|
recentCommands: RecentCommand[];
|
|
302
|
+
/**
|
|
303
|
+
* How many times the empty command bar has opened, counted to one past its
|
|
304
|
+
* introduction (see `command-bar-intro.ts`). A new config starts at 0; one
|
|
305
|
+
* from an earlier build has none and reads as past it. Kept on this machine only.
|
|
306
|
+
*/
|
|
307
|
+
commandBarOpens?: number;
|
|
302
308
|
language?: LanguagePreference;
|
|
303
309
|
onboardingComplete?: boolean;
|
|
304
310
|
/** App version at the last launch, used to show release notes after an update. */
|
|
@@ -995,6 +1001,7 @@ export function createDefaultConfig(dataDir: string): AppConfig {
|
|
|
995
1001
|
fontSize: 12,
|
|
996
1002
|
recentTickers: [],
|
|
997
1003
|
recentCommands: [],
|
|
1004
|
+
commandBarOpens: 0,
|
|
998
1005
|
};
|
|
999
1006
|
}
|
|
1000
1007
|
|
|
@@ -45,6 +45,13 @@ export interface SecFilingItem {
|
|
|
45
45
|
companyName?: string;
|
|
46
46
|
filingUrl: string;
|
|
47
47
|
primaryDocumentUrl?: string;
|
|
48
|
+
/**
|
|
49
|
+
* The SEC file number EDGAR lists the filing under for this company, empty
|
|
50
|
+
* when it lists none: a 13D/13G about the company carries its 005- number,
|
|
51
|
+
* one it filed as a holder of another company none. Absent when the source
|
|
52
|
+
* does not say (an older server).
|
|
53
|
+
*/
|
|
54
|
+
fileNumber?: string;
|
|
48
55
|
}
|
|
49
56
|
|
|
50
57
|
export interface SecFilingDocument {
|
|
@@ -235,6 +242,19 @@ export interface AssetDataProvider {
|
|
|
235
242
|
* META), or what its holder was called before. Null when none is on record.
|
|
236
243
|
*/
|
|
237
244
|
getTickerChanges?(symbol: string, options?: { signal?: AbortSignal }): Promise<TickerChanges | null>;
|
|
245
|
+
/**
|
|
246
|
+
* `getTickerChanges` for several symbols in a few requests, by symbol as
|
|
247
|
+
* asked: null for one with no change on record. A symbol the source could not
|
|
248
|
+
* answer for is left out; null when the source cannot answer a batch at all.
|
|
249
|
+
*/
|
|
250
|
+
getTickerChangesBatch?(symbols: string[], options?: { signal?: AbortSignal }): Promise<Map<string, TickerChanges | null> | null>;
|
|
251
|
+
/**
|
|
252
|
+
* Several searches in a few requests, each answered with the rows `search`
|
|
253
|
+
* gives it from this source (up to `limit`), by query as asked. A query the
|
|
254
|
+
* source could not search is left out; null when it cannot search a batch at
|
|
255
|
+
* all, or when another source (a connected broker) adds rows of its own.
|
|
256
|
+
*/
|
|
257
|
+
searchBatch?(queries: string[], options?: { limit?: number; signal?: AbortSignal }): Promise<Map<string, InstrumentSearchResult[]> | null>;
|
|
238
258
|
getEarningsCalendar?(symbols: string[], context?: MarketDataRequestContext): Promise<EarningsEvent[]>;
|
|
239
259
|
getSecFilingDocuments?(filing: SecFilingItem): Promise<SecFilingDocument[]>;
|
|
240
260
|
getSecFilingContent?(filing: SecFilingItem): Promise<string | null>;
|
package/src/types/headless.ts
CHANGED
|
@@ -26,6 +26,12 @@ export interface HeadlessPaneArgumentDef {
|
|
|
26
26
|
minimum?: number;
|
|
27
27
|
/** Maximum item count for ticker and symbol list arguments. */
|
|
28
28
|
maximum?: number;
|
|
29
|
+
/**
|
|
30
|
+
* Arguments as typed after the function (`GAS`, `EUA`), which the catalog
|
|
31
|
+
* shows as examples: for an argument that takes forms its placeholder does
|
|
32
|
+
* not name.
|
|
33
|
+
*/
|
|
34
|
+
examples?: readonly string[];
|
|
29
35
|
}
|
|
30
36
|
|
|
31
37
|
export interface HeadlessPaneOptionValue {
|
|
@@ -33,6 +39,7 @@ export interface HeadlessPaneOptionValue {
|
|
|
33
39
|
aliases?: string[];
|
|
34
40
|
}
|
|
35
41
|
|
|
42
|
+
|
|
36
43
|
/**
|
|
37
44
|
* Declarative option schema shared by headless panes and the pane function CLI.
|
|
38
45
|
* `settingKey` and `pluginState` keep existing screenshot state wiring compatible.
|
|
@@ -51,10 +58,21 @@ export interface HeadlessPaneOptionDef {
|
|
|
51
58
|
pluginId: string;
|
|
52
59
|
key?: string;
|
|
53
60
|
};
|
|
54
|
-
/**
|
|
61
|
+
/**
|
|
62
|
+
* Set when the pane does not draw the option and only the report reads it
|
|
63
|
+
* (`--limit`'s rows of text): `shot` refuses it rather than capture the
|
|
64
|
+
* pane without it; `reportOnly` says what the report does with it, for
|
|
65
|
+
* the refusal (`sets how many rows the report lists`). Left out, the pane
|
|
66
|
+
* draws it, through `settingKey`, `pluginState`, a setting of the option's
|
|
67
|
+
* own key, or `shotState`.
|
|
68
|
+
*/
|
|
69
|
+
shot?: { reportOnly: string };
|
|
70
|
+
/** The value's name in the catalog's flag, `--expiration <date|unix>`; the type when absent. */
|
|
55
71
|
placeholder?: string;
|
|
56
72
|
/** The option in use as typed after the function, such as `--expiration 2028-01-21`; the catalog shows it as an example. */
|
|
57
73
|
example?: string;
|
|
74
|
+
/** The example runs without the function's optional argument, as an option that works only then does (`fn INS --side sell`). */
|
|
75
|
+
exampleWithoutArgument?: boolean;
|
|
58
76
|
/**
|
|
59
77
|
* Checks a typed value and returns it as the pane reads it, in place of the
|
|
60
78
|
* type's own check; throws an Error that names what is wrong.
|
|
@@ -96,6 +114,14 @@ export interface HeadlessPaneContext {
|
|
|
96
114
|
resolveWatchlist?: (id: string) => Promise<import("./ticker").TickerRecord[] | null>;
|
|
97
115
|
/** Resolve locally remembered exchange identities without coupling plugins to storage. */
|
|
98
116
|
resolveInstrument?: (symbol: string) => Promise<{ symbol: string; exchange?: string }>;
|
|
117
|
+
/**
|
|
118
|
+
* Read a bare symbol as `quote` reads it: the listing its quote is for and
|
|
119
|
+
* that listing's company, or null when nothing better than the symbol is
|
|
120
|
+
* known. A code several companies list (BDI) throws asking which, with
|
|
121
|
+
* `quote`'s message; `argumentWith(key)` is the function's argument naming
|
|
122
|
+
* that listing instead (`BDI:TSX`), for the retry each listing offers.
|
|
123
|
+
*/
|
|
124
|
+
resolveListing?: (symbol: string, argumentWith: (key: string) => string) => Promise<{ symbol: string; exchange?: string; name?: string } | null>;
|
|
99
125
|
}
|
|
100
126
|
|
|
101
127
|
export type HeadlessPaneRow = Record<string, unknown>;
|
|
@@ -254,6 +280,13 @@ export interface HeadlessPaneFreshness {
|
|
|
254
280
|
* never a market's session. Rows that are quotes keep the market line.
|
|
255
281
|
*/
|
|
256
282
|
dataset?: boolean;
|
|
283
|
+
/**
|
|
284
|
+
* The rows are a listing's price bars, which its quote carries on (`G AAPL`,
|
|
285
|
+
* `HP`). A screenshot dates them as it dates a quote board, by the quotes it
|
|
286
|
+
* shows with their delay and market. Any other report that declares a
|
|
287
|
+
* `status` ends its screenshot as it ends `fn`, whatever quotes the page loaded.
|
|
288
|
+
*/
|
|
289
|
+
prices?: boolean;
|
|
257
290
|
/**
|
|
258
291
|
* What a dataset's newest observation is, when its every line names it:
|
|
259
292
|
* `last trade` makes the `fn` footer, the pane footer and a screenshot read
|
|
@@ -282,6 +315,11 @@ export interface HeadlessPaneFreshness {
|
|
|
282
315
|
* listing's Friday close and another's later print.
|
|
283
316
|
*/
|
|
284
317
|
citeOldest?: boolean;
|
|
318
|
+
/**
|
|
319
|
+
* What the newest observation is, said before its time so the time is not read as when the report was read:
|
|
320
|
+
* `newest story` dates a news list `newest story Tue 29 Sep 2026 20:17 UTC`.
|
|
321
|
+
*/
|
|
322
|
+
asOfLabel?: string;
|
|
285
323
|
/** What the figures are, said after the status: `funding = current estimate, pays 08:00 UTC`. */
|
|
286
324
|
note?: string;
|
|
287
325
|
/**
|
|
@@ -318,6 +356,17 @@ interface HeadlessPaneResultBase {
|
|
|
318
356
|
freshness?: HeadlessPaneFreshness;
|
|
319
357
|
}
|
|
320
358
|
|
|
359
|
+
/** A table only `--csv` and `--ndjson` write, after the report's own rows. */
|
|
360
|
+
export interface HeadlessExportTable {
|
|
361
|
+
title: string;
|
|
362
|
+
columns: HeadlessPaneColumn[];
|
|
363
|
+
rows: HeadlessPaneRow[];
|
|
364
|
+
/** The unit every figure is in, which each exported row names in `currency_or_unit`. */
|
|
365
|
+
unit?: string;
|
|
366
|
+
/** The interval the rows are at (`1d`), which each exported row names in `interval`. */
|
|
367
|
+
interval?: string;
|
|
368
|
+
}
|
|
369
|
+
|
|
321
370
|
export interface HeadlessRowsResult extends HeadlessPaneResultBase {
|
|
322
371
|
columns?: HeadlessPaneColumn[];
|
|
323
372
|
/**
|
|
@@ -327,8 +376,27 @@ export interface HeadlessRowsResult extends HeadlessPaneResultBase {
|
|
|
327
376
|
*/
|
|
328
377
|
textColumns?: HeadlessPaneColumn[];
|
|
329
378
|
rows: HeadlessPaneRow[];
|
|
379
|
+
/** The rows `textColumns` read, when the text report adds lines that are no record (the position under its lots); `rows` when absent. CSV, NDJSON and JSON keep `rows`. */
|
|
380
|
+
textRows?: HeadlessPaneRow[];
|
|
330
381
|
/** What the report says when `rows` is empty, in place of "No data.": why there are none. */
|
|
331
382
|
empty?: string;
|
|
383
|
+
/**
|
|
384
|
+
* The row fields naming each row's own unit, symbol and observation date
|
|
385
|
+
* (an ISO date or instant), for rows of several series dated apart: each
|
|
386
|
+
* exported row names them in `currency_or_unit`, `symbol_or_series` and
|
|
387
|
+
* `as_of`, as a bundle section's `rowUnitKey`, `rowSymbolKey` and `rowAsOfKey` do.
|
|
388
|
+
*/
|
|
389
|
+
rowUnitKey?: string;
|
|
390
|
+
rowSymbolKey?: string;
|
|
391
|
+
rowAsOfKey?: string;
|
|
392
|
+
/** The interval every row is at (`daily`), which each exported row names in `interval`. */
|
|
393
|
+
interval?: string;
|
|
394
|
+
/**
|
|
395
|
+
* Tables `--csv` and `--ndjson` write after the rows, each in its own
|
|
396
|
+
* section, such as the dated history the rows sum up. The text report and
|
|
397
|
+
* JSON leave them out.
|
|
398
|
+
*/
|
|
399
|
+
exportTables?: HeadlessExportTable[];
|
|
332
400
|
}
|
|
333
401
|
|
|
334
402
|
export type HeadlessBundleSection =
|
|
@@ -352,6 +420,35 @@ export type HeadlessBundleSection =
|
|
|
352
420
|
* which every exported row names in `currency_or_unit`.
|
|
353
421
|
*/
|
|
354
422
|
unit?: string;
|
|
423
|
+
/**
|
|
424
|
+
* The row field naming each row's own unit, for a table of metrics whose
|
|
425
|
+
* rows differ (`%`, a ratio, a count): each exported row names it in
|
|
426
|
+
* `currency_or_unit` in place of `unit`, blank when the field is empty.
|
|
427
|
+
*/
|
|
428
|
+
rowUnitKey?: string;
|
|
429
|
+
/**
|
|
430
|
+
* The row field naming the symbol each row is of, for a table of several
|
|
431
|
+
* (a ranking): each exported row names it in `symbol_or_series`.
|
|
432
|
+
*/
|
|
433
|
+
rowSymbolKey?: string;
|
|
434
|
+
/**
|
|
435
|
+
* The row field holding when each row's figures were observed (an ISO
|
|
436
|
+
* date or instant), for rows dated apart: each exported row names it in
|
|
437
|
+
* `as_of`, blank when the field is empty.
|
|
438
|
+
*/
|
|
439
|
+
rowAsOfKey?: string;
|
|
440
|
+
/** The bar interval the rows are of (`1d`), which every exported row names in `interval`. */
|
|
441
|
+
interval?: string;
|
|
442
|
+
/** The symbol every row is of, where the report's own is not (a section per name): each exported row names it in `symbol_or_series`. */
|
|
443
|
+
symbol?: string;
|
|
444
|
+
/** When every row was observed (an ISO date or instant), where it is not the report's newest: each exported row names it in `as_of`. */
|
|
445
|
+
asOf?: string;
|
|
446
|
+
/**
|
|
447
|
+
* The free view holds this table back for Gloom Pro. Left empty, the text
|
|
448
|
+
* report leaves it out and says once, on its Pro line, what Pro adds, in
|
|
449
|
+
* place of a lock under each table; JSON keeps the section with `locked`.
|
|
450
|
+
*/
|
|
451
|
+
locked?: boolean;
|
|
355
452
|
entries?: never;
|
|
356
453
|
textEntries?: never;
|
|
357
454
|
}
|
|
@@ -365,15 +462,27 @@ export type HeadlessBundleSection =
|
|
|
365
462
|
* JSON keep `entries`.
|
|
366
463
|
*/
|
|
367
464
|
textEntries?: HeadlessPaneEntry[];
|
|
465
|
+
/** The symbol the figures are of, where the report's own is not: each exported line names it in `symbol_or_series`. */
|
|
466
|
+
symbol?: string;
|
|
467
|
+
/** When the figures were observed (an ISO date or instant), where it is not the report's newest: each exported line names it in `as_of`. */
|
|
468
|
+
asOf?: string;
|
|
368
469
|
columns?: never;
|
|
369
470
|
rows?: never;
|
|
370
471
|
textColumns?: never;
|
|
371
472
|
textRows?: never;
|
|
372
473
|
unit?: never;
|
|
474
|
+
rowUnitKey?: never;
|
|
475
|
+
interval?: never;
|
|
476
|
+
locked?: never;
|
|
373
477
|
};
|
|
374
478
|
|
|
375
479
|
export interface HeadlessBundleResult extends HeadlessPaneResultBase {
|
|
376
480
|
sections: HeadlessBundleSection[];
|
|
481
|
+
/**
|
|
482
|
+
* What the report says once when no section has a row, in place of each
|
|
483
|
+
* section's own `empty`: one reason covers them all (a ticker no source maps).
|
|
484
|
+
*/
|
|
485
|
+
empty?: string;
|
|
377
486
|
}
|
|
378
487
|
|
|
379
488
|
export interface HeadlessSeriesPoint extends HeadlessPaneRow {
|
|
@@ -389,6 +498,8 @@ export interface HeadlessSeriesPoint extends HeadlessPaneRow {
|
|
|
389
498
|
export interface HeadlessSeries {
|
|
390
499
|
id: string;
|
|
391
500
|
label: string;
|
|
501
|
+
/** The company or security a security's series is of (Apple Inc.), from its quote. */
|
|
502
|
+
name?: string;
|
|
392
503
|
/** Explicit unit of the point values; report formatting does not rescale them. */
|
|
393
504
|
unit?: string;
|
|
394
505
|
/** The symbol or series ID the series was asked for as (`USDZAR=X`, `DEXSFUS`), which exports name each row by. */
|
|
@@ -462,8 +573,30 @@ export interface HeadlessPaneDefinition<Shape extends HeadlessPaneShape = Headle
|
|
|
462
573
|
args: HeadlessPaneLoadArgs,
|
|
463
574
|
ctx: HeadlessPaneContext,
|
|
464
575
|
): Promise<HeadlessArgumentExpansion | null>;
|
|
576
|
+
/**
|
|
577
|
+
* How `shot` opens the pane on a request, past the settings its options
|
|
578
|
+
* name: 13F opens the fund a name resolved to, on the tab its view names.
|
|
579
|
+
* `load` is the report's own load, for state that depends on what it found.
|
|
580
|
+
* `given` names the options typed, by key: `args` carries every option's
|
|
581
|
+
* default too, which the pane may open on differently (M&A of one company
|
|
582
|
+
* opens on every status, its report on pending), so state an option sets
|
|
583
|
+
* is written only when it was asked for.
|
|
584
|
+
* Throws when the pane cannot draw the request, which `shot` reports
|
|
585
|
+
* instead of capturing another view.
|
|
586
|
+
*/
|
|
587
|
+
shotState?(
|
|
588
|
+
args: HeadlessPaneLoadArgs,
|
|
589
|
+
load: () => Promise<HeadlessPaneResultByShape[Shape]>,
|
|
590
|
+
given: ReadonlySet<string>,
|
|
591
|
+
): HeadlessShotState | Promise<HeadlessShotState>;
|
|
465
592
|
/** What is true of every load: its source, and whether it is a feed. */
|
|
466
593
|
freshness?: HeadlessPaneFreshness;
|
|
594
|
+
/**
|
|
595
|
+
* A `--csv` export also closes with the report's warnings, as notes, for a
|
|
596
|
+
* report whose warnings say which rows it left out (a backtest's dropped
|
|
597
|
+
* sessions), so a saved file keeps what stderr said.
|
|
598
|
+
*/
|
|
599
|
+
exportWarnings?: boolean;
|
|
467
600
|
columns?: HeadlessPaneColumn[];
|
|
468
601
|
/**
|
|
469
602
|
* The report title. A report passes the loaded result, so a title can name
|
|
@@ -487,6 +620,14 @@ export interface HeadlessPaneDefinition<Shape extends HeadlessPaneShape = Headle
|
|
|
487
620
|
|
|
488
621
|
export type HeadlessPaneResult = HeadlessPaneResultByShape[HeadlessPaneShape];
|
|
489
622
|
|
|
623
|
+
/** What `shot` merges into the captured pane for a request (`shotState`). */
|
|
624
|
+
export interface HeadlessShotState {
|
|
625
|
+
/** Merged into the pane's settings. */
|
|
626
|
+
settings?: Record<string, unknown>;
|
|
627
|
+
/** Merged into the pane's plugin state, by plugin id. */
|
|
628
|
+
pluginState?: Record<string, Record<string, unknown>>;
|
|
629
|
+
}
|
|
630
|
+
|
|
490
631
|
/** What a function runs with once it has widened its argument (`expandArgument`). */
|
|
491
632
|
export interface HeadlessArgumentExpansion {
|
|
492
633
|
/** The argument as it would be typed: `DUOL, COUR, CHGG`. */
|
package/src/types/instrument.ts
CHANGED
|
@@ -71,4 +71,10 @@ export interface InstrumentSearchResult {
|
|
|
71
71
|
* Albemarle, which the lithium funds hold), sent by newer cloud servers on a
|
|
72
72
|
* row a theme query added. Matched like the name, ranked after name matches. */
|
|
73
73
|
searchKeywords?: string[];
|
|
74
|
+
/** The company that merged into this one whose old name the query is
|
|
75
|
+
* (Golden Ocean Group Ltd, GOGL until 2025-08-20, on CMB.Tech's CMBT), sent
|
|
76
|
+
* by newer cloud servers on a row such a query added. `searchAliases` then
|
|
77
|
+
* carries that name. A leftover listing of the merged company (GOGLC on
|
|
78
|
+
* BYMA) is linked to it by search, naming the `successor`. */
|
|
79
|
+
formerIssuer?: { symbol: string; name: string; until: string; successor?: { symbol: string; name: string | null } };
|
|
74
80
|
}
|