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,11 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Companies ranked by recent open-market insider buying, as
|
|
3
|
-
* `GET /cloud/sec/insider-signals` returns them.
|
|
4
|
-
* P)
|
|
5
|
-
*
|
|
2
|
+
* Companies ranked by recent open-market insider buying or selling, as
|
|
3
|
+
* `GET /cloud/sec/insider-signals` returns them. Buying counts Form 4
|
|
4
|
+
* purchases (code P), selling the sales (code S) an insider chose to make: a
|
|
5
|
+
* Rule 10b5-1 plan's, a sell-to-cover's, an option exercise's and an
|
|
6
|
+
* offering's are left out. Only officers, directors and 10% owners count.
|
|
7
|
+
* Dates are `YYYY-MM-DD`, values USD.
|
|
6
8
|
*/
|
|
7
9
|
|
|
8
|
-
type InsiderSignalRole =
|
|
10
|
+
export type InsiderSignalRole =
|
|
9
11
|
| "CEO"
|
|
10
12
|
| "CFO"
|
|
11
13
|
| "COO"
|
|
@@ -15,13 +17,57 @@ type InsiderSignalRole =
|
|
|
15
17
|
| "Director"
|
|
16
18
|
| "10% owner";
|
|
17
19
|
|
|
18
|
-
|
|
20
|
+
/** Purchases or sales. */
|
|
21
|
+
export type InsiderSignalSide = "buy" | "sell";
|
|
22
|
+
/** Whose trades a ranking reads: everyone, chief officers and other officers, directors, or 10% owners. */
|
|
23
|
+
export type InsiderSignalRoleGroup = "all" | "officers" | "directors" | "owners";
|
|
24
|
+
/** Market value: micro under $300M, small to $2B, mid to $10B, large above. */
|
|
25
|
+
export type InsiderSignalCap = "micro" | "small" | "mid" | "large";
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* One insider in a row: what they traded in the window. On the sell side
|
|
29
|
+
* `buys` and `lastBuy` are the days they sold and the last of them.
|
|
30
|
+
*/
|
|
31
|
+
export interface InsiderSignalBuyer {
|
|
19
32
|
name: string;
|
|
20
33
|
role: InsiderSignalRole;
|
|
21
34
|
value: number;
|
|
22
|
-
/** Days the insider
|
|
35
|
+
/** Days the insider traded in the window. */
|
|
23
36
|
buys: number;
|
|
24
37
|
lastBuy: string;
|
|
38
|
+
/** Left out by servers that predate selling. */
|
|
39
|
+
shares?: number;
|
|
40
|
+
/** The holding's change in the window, percent: positive bought, negative sold; null without balances. */
|
|
41
|
+
stakeChangePct?: number | null;
|
|
42
|
+
/** Opened a position: held nothing before, or a holding worth under $10K or under 1% of what was bought. */
|
|
43
|
+
newPosition?: boolean;
|
|
44
|
+
/** Sold every share and unit the forms report. */
|
|
45
|
+
exited?: boolean;
|
|
46
|
+
/**
|
|
47
|
+
* The insider's trade days in the 90 days ending on their last, the days
|
|
48
|
+
* before the window included: their nth buy (sale), 1 for a lone day. Null
|
|
49
|
+
* when they traded both ways. Left out by servers that predate it.
|
|
50
|
+
*/
|
|
51
|
+
repeatBuys?: number | null;
|
|
52
|
+
/**
|
|
53
|
+
* Their largest day in the window against their usual size, to a tenth and
|
|
54
|
+
* at most 100 ("100x+"); null without enough history, or when they traded
|
|
55
|
+
* both ways. Left out by servers that predate it.
|
|
56
|
+
*/
|
|
57
|
+
usualRatio?: number | null;
|
|
58
|
+
/** Bought and sold in the window: the row counts the net, on the side it falls. */
|
|
59
|
+
twoWay?: boolean;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/** One fact behind a row, structured, strongest first. */
|
|
63
|
+
interface InsiderWhySignal {
|
|
64
|
+
kind: "cluster" | "repeat" | "usual" | "stake" | "new" | "exited" | "size" | "both";
|
|
65
|
+
/** cluster: insiders; repeat: the ordinal; usual: the multiple; stake: percent, negative sold; new, exited, both: 1; size: dollars. */
|
|
66
|
+
value: number;
|
|
67
|
+
/** A few characters: "3 insiders", "4th buy", "5x usual", "+56%", "6x stake", "NEW", "both ways". */
|
|
68
|
+
text: string;
|
|
69
|
+
/** The insider it is about; null for the company's (a cluster). */
|
|
70
|
+
insider: { name: string; role: InsiderSignalRole } | null;
|
|
25
71
|
}
|
|
26
72
|
|
|
27
73
|
export interface InsiderSignalRow {
|
|
@@ -32,9 +78,9 @@ export interface InsiderSignalRow {
|
|
|
32
78
|
score: number;
|
|
33
79
|
/** Why the company ranks, strongest first, in plain words. */
|
|
34
80
|
reasons: string[];
|
|
35
|
-
/** Distinct insiders who
|
|
81
|
+
/** Distinct insiders who traded in the window. */
|
|
36
82
|
insiders: number;
|
|
37
|
-
/** Insider
|
|
83
|
+
/** Insider trade days in the window. */
|
|
38
84
|
buys: number;
|
|
39
85
|
value: number;
|
|
40
86
|
shares: number;
|
|
@@ -47,14 +93,40 @@ export interface InsiderSignalRow {
|
|
|
47
93
|
usualRatio: number | null;
|
|
48
94
|
stakeIncreasePct: number | null;
|
|
49
95
|
newPosition: boolean;
|
|
96
|
+
/** Left out by servers that predate selling. */
|
|
97
|
+
stakeChangePct?: number | null;
|
|
98
|
+
exited?: boolean;
|
|
50
99
|
};
|
|
51
|
-
/** The
|
|
100
|
+
/** The reasons' facts, structured; left out by servers that predate them. */
|
|
101
|
+
whySignals?: InsiderWhySignal[];
|
|
102
|
+
/** The insiders who traded, largest first, up to ten. */
|
|
52
103
|
buyers: InsiderSignalBuyer[];
|
|
104
|
+
/** Stored market value, USD; null when the server has none for it. */
|
|
105
|
+
marketCap?: number | null;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
interface InsiderSignalsFilters {
|
|
109
|
+
role: InsiderSignalRoleGroup;
|
|
110
|
+
minValue: number;
|
|
111
|
+
cluster: boolean;
|
|
112
|
+
position: "new" | "exited" | null;
|
|
113
|
+
cap: InsiderSignalCap | null;
|
|
53
114
|
}
|
|
54
115
|
|
|
55
116
|
export interface InsiderSignalsPayload {
|
|
56
|
-
/**
|
|
117
|
+
/**
|
|
118
|
+
* The company asked for (`ticker`): `rows` is its row alone, with every
|
|
119
|
+
* insider, whatever its size. Absent for the ranking, and from a server
|
|
120
|
+
* that predates the question, which answers the ranking instead.
|
|
121
|
+
*/
|
|
122
|
+
ticker?: string;
|
|
123
|
+
/** Left out by servers that predate selling: buying. */
|
|
124
|
+
side?: InsiderSignalSide;
|
|
125
|
+
/** Days of trading each row covers, ending `through`. */
|
|
57
126
|
window: number;
|
|
127
|
+
filters?: InsiderSignalsFilters;
|
|
128
|
+
/** Whether rows carry market values, so the cap filter can work. */
|
|
129
|
+
marketCaps?: "stored" | "unavailable";
|
|
58
130
|
through: string;
|
|
59
131
|
/** The newest filing day read. */
|
|
60
132
|
asOf: string | null;
|
|
@@ -68,8 +140,20 @@ export interface InsiderSignalsPayload {
|
|
|
68
140
|
}
|
|
69
141
|
|
|
70
142
|
export interface CloudInsiderSignalsParams {
|
|
143
|
+
/** Buying unless told. */
|
|
144
|
+
side?: InsiderSignalSide;
|
|
71
145
|
/** Days, 1 to 90; the server reads 30 when left out. */
|
|
72
146
|
window?: number;
|
|
73
147
|
/** Rows, 1 to 200; the server reads 50 when left out. */
|
|
74
148
|
limit?: number;
|
|
149
|
+
role?: InsiderSignalRoleGroup;
|
|
150
|
+
/** USD the insiders traded in the window, at least. */
|
|
151
|
+
minValue?: number;
|
|
152
|
+
/** Only companies where two insiders or more traded within a span. */
|
|
153
|
+
cluster?: boolean;
|
|
154
|
+
/** "new" on the buy side, "exited" on the sell side. */
|
|
155
|
+
position?: "new" | "exited";
|
|
156
|
+
cap?: InsiderSignalCap;
|
|
157
|
+
/** One company instead of the ranking: its row, with every insider. */
|
|
158
|
+
ticker?: string;
|
|
75
159
|
}
|
|
@@ -134,6 +134,7 @@ export function normalizeChatMessage(message: ChatMessage): ChatMessage {
|
|
|
134
134
|
if (paneLink) normalized.paneLink = paneLink;
|
|
135
135
|
else delete normalized.paneLink;
|
|
136
136
|
}
|
|
137
|
+
if ((message.announcement as unknown) !== true) delete normalized.announcement;
|
|
137
138
|
return normalized;
|
|
138
139
|
}
|
|
139
140
|
|
package/src/api-client/paths.ts
CHANGED
|
@@ -246,6 +246,8 @@ export type CloudSecFilingsParams = {
|
|
|
246
246
|
name?: string;
|
|
247
247
|
limit?: number;
|
|
248
248
|
offset?: number;
|
|
249
|
+
/** Only these forms, each with its amendment (`8-K` is also `8-K/A`). A server that predates the filter sends every form. */
|
|
250
|
+
forms?: readonly string[];
|
|
249
251
|
};
|
|
250
252
|
|
|
251
253
|
export type CloudSecFilingParams = {
|
|
@@ -361,6 +363,10 @@ export function cloudEarningsTranscriptPath(id: string): string {
|
|
|
361
363
|
return `/cloud/transcripts/${encodeURIComponent(id)}`;
|
|
362
364
|
}
|
|
363
365
|
|
|
366
|
+
export function cloudEarningsCallAudioPath(id: string): string {
|
|
367
|
+
return `${cloudEarningsTranscriptPath(id)}/audio`;
|
|
368
|
+
}
|
|
369
|
+
|
|
364
370
|
/**
|
|
365
371
|
* An issuer read's path: a US listing or a bare symbol keeps its US ticker
|
|
366
372
|
* and sends nothing else; a listing abroad sends its bare symbol with its
|
|
@@ -429,10 +435,16 @@ export function cloudSecFilingsPath(params: CloudSecFilingsParams): string {
|
|
|
429
435
|
});
|
|
430
436
|
if (params.limit != null) search.set("limit", String(params.limit));
|
|
431
437
|
if (params.offset != null) search.set("offset", String(params.offset));
|
|
438
|
+
if (params.forms?.length) search.set("form", params.forms.join(","));
|
|
432
439
|
setListingAbroad(search, abroad);
|
|
433
440
|
return appendQuery("/cloud/sec/filings", search);
|
|
434
441
|
}
|
|
435
442
|
|
|
443
|
+
/** A US-listed company's bank figures: SEC deposits and its lead bank's FDIC call report. */
|
|
444
|
+
export function cloudBankFiguresPath(symbol: string): string {
|
|
445
|
+
return appendQuery("/cloud/bank-figures", new URLSearchParams({ symbol }));
|
|
446
|
+
}
|
|
447
|
+
|
|
436
448
|
/** Schedule 13D and 13G reports about the issuer behind `ticker`. */
|
|
437
449
|
export function cloudSecBeneficialOwnersPath(params: CloudBeneficialOwnersParams): string {
|
|
438
450
|
const abroad = listingAbroad(params.ticker, params.exchange, params.name);
|
|
@@ -445,11 +457,18 @@ export function cloudSecBeneficialOwnersPath(params: CloudBeneficialOwnersParams
|
|
|
445
457
|
return appendQuery("/cloud/sec/beneficial-owners", search);
|
|
446
458
|
}
|
|
447
459
|
|
|
448
|
-
/** Companies ranked by recent open-market insider buying. */
|
|
460
|
+
/** Companies ranked by recent open-market insider buying or selling. Defaults are left out of the query. */
|
|
449
461
|
export function cloudSecInsiderSignalsPath(params: CloudInsiderSignalsParams = {}): string {
|
|
450
462
|
const search = new URLSearchParams();
|
|
463
|
+
if (params.side === "sell") search.set("side", "sell");
|
|
451
464
|
if (params.window != null) search.set("window", String(params.window));
|
|
452
465
|
if (params.limit != null) search.set("limit", String(params.limit));
|
|
466
|
+
if (params.role && params.role !== "all") search.set("role", params.role);
|
|
467
|
+
if (params.minValue) search.set("minValue", String(params.minValue));
|
|
468
|
+
if (params.cluster) search.set("cluster", "true");
|
|
469
|
+
if (params.position) search.set("position", params.position);
|
|
470
|
+
if (params.cap) search.set("cap", params.cap);
|
|
471
|
+
if (params.ticker) search.set("ticker", params.ticker);
|
|
453
472
|
return appendQuery("/cloud/sec/insider-signals", search);
|
|
454
473
|
}
|
|
455
474
|
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { logFailure } from "../utils/log-failure";
|
|
1
2
|
import { httpFetch, isHttpFetchStreaming } from "../utils/http-transport";
|
|
2
3
|
import { withDeadline } from "../utils/async-deadline";
|
|
3
4
|
import {
|
|
@@ -148,7 +149,7 @@ export async function putWithRevision<T, Current extends { revision: number }>(
|
|
|
148
149
|
});
|
|
149
150
|
} catch (error) {
|
|
150
151
|
if (!(error instanceof ApiRequestError) || error.status !== 412) throw error;
|
|
151
|
-
const current = await revision.loadCurrent().catch((
|
|
152
|
+
const current = await revision.loadCurrent().catch(logFailure("cloud-request", "Current revision request failed", null));
|
|
152
153
|
throw new revision.conflict(error.message, current, current?.revision ?? (revision.expected ?? 0) + 1);
|
|
153
154
|
}
|
|
154
155
|
}
|
|
@@ -269,7 +270,7 @@ export class CloudApiRequestTransport {
|
|
|
269
270
|
});
|
|
270
271
|
throwIfRequestAborted(options.signal);
|
|
271
272
|
if (!response.ok) {
|
|
272
|
-
const text = await response.text().catch((
|
|
273
|
+
const text = await response.text().catch(logFailure("cloud-request", "Error response body read failed", ""));
|
|
273
274
|
throw new ApiRequestError(
|
|
274
275
|
parseApiErrorMessage(text),
|
|
275
276
|
response.status,
|
|
@@ -411,12 +412,19 @@ export class CloudApiRequestTransport {
|
|
|
411
412
|
// layers, which a server without them answers with 404, or a ticker
|
|
412
413
|
// change lookup: a note beside a quote, never one of the refused market
|
|
413
414
|
// requests a lookup of many symbols waits out and retries. Nor the
|
|
414
|
-
// tickers beside a list of organization names, which say so in place
|
|
415
|
+
// tickers beside a list of organization names, which say so in place,
|
|
416
|
+
// or a 13F filer's EDGAR filing list, whose report says it went unchecked.
|
|
417
|
+
// Nor the batched searches and ticker changes a list of symbols starts
|
|
418
|
+
// with: a service without them answers 404, and whatever they leave
|
|
419
|
+
// unanswered is looked up one symbol at a time, which is tracked.
|
|
415
420
|
if (
|
|
416
421
|
path.startsWith("/telemetry/")
|
|
417
422
|
|| path === "/assist/searches"
|
|
418
423
|
|| path === "/cloud/geo/layers"
|
|
424
|
+
|| path.startsWith("/cloud/sec/13f/filer?")
|
|
419
425
|
|| path.startsWith("/market/ticker-changes?")
|
|
426
|
+
|| path === "/market/ticker-changes/batch"
|
|
427
|
+
|| path === "/market/search/batch"
|
|
420
428
|
|| path === "/market/organization-tickers"
|
|
421
429
|
) return request();
|
|
422
430
|
return this.connectionHealth.track(
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { logFailure } from "../utils/log-failure";
|
|
1
2
|
import { apiClient } from "./index";
|
|
2
3
|
import { getCurrentPluginTarget } from "../plugins/current-target";
|
|
3
4
|
import type { DesktopDeepLinkBridge } from "../types/desktop-deeplink";
|
|
@@ -99,6 +100,7 @@ function cleanUrlValue(value: unknown): string | undefined {
|
|
|
99
100
|
new URL(cleaned);
|
|
100
101
|
return cleaned;
|
|
101
102
|
} catch {
|
|
103
|
+
// Intentional ignore: Malformed attribution URLs are excluded from the payload.
|
|
102
104
|
return undefined;
|
|
103
105
|
}
|
|
104
106
|
}
|
|
@@ -122,7 +124,7 @@ export function readStoredAttribution(stored: string | null, now = Date.now()):
|
|
|
122
124
|
const parsed: unknown = JSON.parse(stored ?? "{}");
|
|
123
125
|
if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) saved = parsed as Record<string, unknown>;
|
|
124
126
|
} catch {
|
|
125
|
-
|
|
127
|
+
// Intentional ignore: Corrupt optional attribution is treated as absent.
|
|
126
128
|
}
|
|
127
129
|
|
|
128
130
|
const next: Record<string, string> = {};
|
|
@@ -170,6 +172,7 @@ export function carriesHandoff(href: string): boolean {
|
|
|
170
172
|
FIRST_TOUCH_KEYS.some((key) => params.has(key))
|
|
171
173
|
);
|
|
172
174
|
} catch {
|
|
175
|
+
// Intentional ignore: Malformed links carry no usable attribution handoff.
|
|
173
176
|
return false;
|
|
174
177
|
}
|
|
175
178
|
}
|
|
@@ -258,7 +261,7 @@ export function initializeBrowserResearchActivity(): void {
|
|
|
258
261
|
stripHandoffParams(url);
|
|
259
262
|
history.replaceState(history.state, "", url.href);
|
|
260
263
|
} catch {
|
|
261
|
-
|
|
264
|
+
// Intentional ignore: Private browsing may deny optional attribution storage.
|
|
262
265
|
}
|
|
263
266
|
}
|
|
264
267
|
|
|
@@ -275,7 +278,7 @@ export function initializeDesktopResearchActivity(storage: StorageLike = localSt
|
|
|
275
278
|
anonymousId = stored && ANONYMOUS_ID.test(stored) ? stored : undefined;
|
|
276
279
|
attribution = readStoredAttribution(storage.getItem(ATTRIBUTION_STORAGE_KEY));
|
|
277
280
|
} catch {
|
|
278
|
-
|
|
281
|
+
// Intentional ignore: A read-only profile may deny optional attribution storage.
|
|
279
282
|
}
|
|
280
283
|
}
|
|
281
284
|
|
|
@@ -297,6 +300,7 @@ export function adoptDesktopHandoff(href: string, storage: StorageLike = localSt
|
|
|
297
300
|
storage.setItem(ATTRIBUTION_STORAGE_KEY, JSON.stringify(attribution));
|
|
298
301
|
return true;
|
|
299
302
|
} catch {
|
|
303
|
+
// Intentional ignore: Optional attribution storage may be unavailable; the deep link still opens.
|
|
300
304
|
return false;
|
|
301
305
|
}
|
|
302
306
|
}
|
|
@@ -406,9 +410,10 @@ export function recordResearchActivity(
|
|
|
406
410
|
if (!wallEvent) return;
|
|
407
411
|
const views = wallSessionViews();
|
|
408
412
|
views.add(key);
|
|
409
|
-
try { sessionStorage.setItem(WALL_VIEWS_SESSION_KEY, JSON.stringify([...views])); } catch { /* Native sessions
|
|
413
|
+
try { sessionStorage.setItem(WALL_VIEWS_SESSION_KEY, JSON.stringify([...views])); } catch { /* Intentional ignore: Native sessions retain wall views in the in-memory set. */ }
|
|
410
414
|
})
|
|
411
|
-
.catch(() => {
|
|
415
|
+
.catch((error) => {
|
|
416
|
+
logFailure("cloud-telemetry", "Research activity request failed")(error);
|
|
412
417
|
sent.delete(key);
|
|
413
418
|
});
|
|
414
419
|
}
|
|
@@ -432,7 +437,8 @@ export function recordResearchTabView(tabId: string, fromExternalPlugin: boolean
|
|
|
432
437
|
export function identifyResearchUser(): void {
|
|
433
438
|
try {
|
|
434
439
|
recordResearchActivity("workspace_opened");
|
|
435
|
-
} catch {
|
|
440
|
+
} catch (error) {
|
|
441
|
+
logFailure("cloud-telemetry", "Research identity reporting failed")(error);
|
|
436
442
|
/* Analytics never blocks sign-in. */
|
|
437
443
|
}
|
|
438
444
|
}
|
|
@@ -444,6 +450,7 @@ function webExperimentAttribution(): { experiments?: string } {
|
|
|
444
450
|
const experiments = storedExperimentAssignments(localStorage);
|
|
445
451
|
return experiments ? { experiments } : {};
|
|
446
452
|
} catch {
|
|
453
|
+
// Intentional ignore: Unavailable optional storage contributes no experiment attribution.
|
|
447
454
|
return {};
|
|
448
455
|
}
|
|
449
456
|
}
|
|
@@ -499,7 +506,7 @@ function wallExperimentContext(): WallExperimentContext {
|
|
|
499
506
|
try {
|
|
500
507
|
if (surface === "web") local = localStorage;
|
|
501
508
|
if (surface === "web" || surface === "desktop") session = sessionStorage;
|
|
502
|
-
} catch { /* Native and private sessions keep
|
|
509
|
+
} catch { /* Intentional ignore: Native and private sessions keep experiment answers in memory. */ }
|
|
503
510
|
return {
|
|
504
511
|
surface,
|
|
505
512
|
accountId: user?.id,
|
|
@@ -516,7 +523,7 @@ function wallSessionViews(): Set<string> {
|
|
|
516
523
|
try {
|
|
517
524
|
const saved: unknown = JSON.parse(sessionStorage.getItem(WALL_VIEWS_SESSION_KEY) ?? "[]");
|
|
518
525
|
if (Array.isArray(saved)) return new Set(saved.filter((value): value is string => typeof value === "string"));
|
|
519
|
-
} catch { /* Native sessions
|
|
526
|
+
} catch { /* Intentional ignore: Native sessions retain wall views in the in-memory set. */ }
|
|
520
527
|
return new Set();
|
|
521
528
|
}
|
|
522
529
|
|
package/src/api-client/socket.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { logFailure } from "../utils/log-failure";
|
|
1
2
|
import type { TapeFeedEvent } from "./tape";
|
|
2
3
|
import type {
|
|
3
4
|
AuthUser,
|
|
@@ -188,7 +189,7 @@ export class CloudApiSocket {
|
|
|
188
189
|
try {
|
|
189
190
|
ws?.close();
|
|
190
191
|
} catch {
|
|
191
|
-
// ignore closed
|
|
192
|
+
// Intentional ignore: Closing an already closed socket needs no further cleanup.
|
|
192
193
|
}
|
|
193
194
|
}
|
|
194
195
|
|
|
@@ -312,7 +313,8 @@ export class CloudApiSocket {
|
|
|
312
313
|
try {
|
|
313
314
|
this.ws.send(JSON.stringify(payload));
|
|
314
315
|
return true;
|
|
315
|
-
} catch {
|
|
316
|
+
} catch (error) {
|
|
317
|
+
logFailure("cloud-socket", "WebSocket frame send failed")(error);
|
|
316
318
|
return false;
|
|
317
319
|
}
|
|
318
320
|
}
|
|
@@ -557,7 +559,8 @@ export class CloudApiSocket {
|
|
|
557
559
|
let parsed: any;
|
|
558
560
|
try {
|
|
559
561
|
parsed = JSON.parse(raw);
|
|
560
|
-
} catch {
|
|
562
|
+
} catch (error) {
|
|
563
|
+
logFailure("cloud-socket", "WebSocket message decoding failed")(error);
|
|
561
564
|
return;
|
|
562
565
|
}
|
|
563
566
|
|
|
@@ -7,7 +7,7 @@ export interface GraphOptions {
|
|
|
7
7
|
minPct: number; minConfidence: number; limit: number; ranking: "score" | "shortest"; asOf?: string;
|
|
8
8
|
}
|
|
9
9
|
export const DEFAULT_GRAPH_OPTIONS: GraphOptions = { depth: 2, direction: "both", roles: [], sources: [], tiers: [], minPct: 0, minConfidence: 0, limit: 50, ranking: "score" };
|
|
10
|
-
export interface GraphEvidence extends Pick<SupplyRow, "claimType" | "corroboration" | "leadStatus" | "firstSeenAt" | "lastSeenAt" | "lastConfirmedAt" | "whyUnconfirmed" | "evidence" | "nativeAmount" | "nativeCurrency" | "nativeScale" | "entityScope" | "quoteGloss" | "sectionRef" | "sourceAttribution"> {
|
|
10
|
+
export interface GraphEvidence extends Pick<SupplyRow, "claimType" | "corroboration" | "leadStatus" | "firstSeenAt" | "lastSeenAt" | "lastConfirmedAt" | "whyUnconfirmed" | "evidence" | "nativeAmount" | "nativeCurrency" | "nativeScale" | "entityScope" | "quoteGloss" | "sectionRef" | "sourceAttribution" | "periodMonths"> {
|
|
11
11
|
/** Source trust tier, distinct from the graph evidence class in tier. */
|
|
12
12
|
trustTier?: SupplyTier;
|
|
13
13
|
id: string; fromEntity: string; toEntity: string; reportingEntity: string;
|
|
@@ -25,7 +25,7 @@ interface GraphLink {
|
|
|
25
25
|
}
|
|
26
26
|
export interface GraphPath {
|
|
27
27
|
id: string; nodeIds: string[]; linkIds: string[]; hops: number; score: number; confidence: number;
|
|
28
|
-
exposure: { pct: number; basis: NonNullable<SupplyRow["pctBasis"]>; period: string; denominatorEntityId: string; estimated: true } | null;
|
|
28
|
+
exposure: { pct: number; basis: NonNullable<SupplyRow["pctBasis"]>; period: string; periodMonths?: number | null; denominatorEntityId: string; estimated: true } | null;
|
|
29
29
|
}
|
|
30
30
|
interface GraphReach { entityId: string; direction: "upstream" | "downstream"; hops: number; bestPath: GraphPath; shortestPath: GraphPath; }
|
|
31
31
|
export interface GraphPayload {
|
|
@@ -55,6 +55,8 @@ export interface SupplyRow {
|
|
|
55
55
|
jurisdiction?: string | null;
|
|
56
56
|
entityScope?: "entity" | "group" | "anonymous" | "aggregate" | null;
|
|
57
57
|
period: string;
|
|
58
|
+
/** Months every figure on the row covers: 0 a balance at the period end, 3 a quarter, 12 a year. Null or absent when the source does not say or the figures differ in length. */
|
|
59
|
+
periodMonths?: number | null;
|
|
58
60
|
fiscalYear: string | null;
|
|
59
61
|
sourceKind: "xbrl" | "filing_text" | "call" | "news" | "web" | "import" | "press_release";
|
|
60
62
|
form: string | null;
|
|
@@ -88,6 +90,12 @@ export interface SupplyChainPayload {
|
|
|
88
90
|
says: SupplyRow[];
|
|
89
91
|
names: SupplyRow[];
|
|
90
92
|
counts: { says: Record<SupplyRole, number>; names: Record<SupplyRole, number> };
|
|
93
|
+
/**
|
|
94
|
+
* Shares from a period before the latest one their reporter disclosed on the
|
|
95
|
+
* same basis: dated, never current rows. Absent from older servers.
|
|
96
|
+
*/
|
|
97
|
+
earlier?: { says: SupplyRow[]; names: SupplyRow[] };
|
|
98
|
+
earlierCounts?: { says: Record<SupplyRole, number>; names: Record<SupplyRole, number> };
|
|
91
99
|
access: "full" | "preview";
|
|
92
100
|
lockedRows: number;
|
|
93
101
|
totalRows: number;
|
package/src/api-client/tape.ts
CHANGED
|
@@ -39,6 +39,18 @@ export interface TapeSnapshot {
|
|
|
39
39
|
corrections: number;
|
|
40
40
|
cancels: number;
|
|
41
41
|
connected: boolean;
|
|
42
|
+
/**
|
|
43
|
+
* Present when a window was asked for (`from`/`to`): the span served, its
|
|
44
|
+
* end clipped to the feed cutoff, and whether a channel held more than its
|
|
45
|
+
* capacity there, so only the first of its prints are listed. Absent from a
|
|
46
|
+
* server that predates windows, which answers with the latest tape.
|
|
47
|
+
*/
|
|
48
|
+
window?: TapeRange & { truncated: { trades: boolean; quotes: boolean } };
|
|
49
|
+
}
|
|
50
|
+
/** A span of the tape as ISO instants; `to` is exclusive. */
|
|
51
|
+
export interface TapeRange {
|
|
52
|
+
from: string;
|
|
53
|
+
to: string;
|
|
42
54
|
}
|
|
43
55
|
export type TapeFeedEvent = { type: "data"; payload: TapeSnapshot }
|
|
44
56
|
| { type: "reset" | "disconnected"; reason: string };
|
package/src/api-client/types.ts
CHANGED
|
@@ -120,6 +120,12 @@ export interface ChatMessage {
|
|
|
120
120
|
attachmentReview?: "pending" | "failed";
|
|
121
121
|
/** What the message opens in the terminal (a Gloom Wire story or calendar). Only the server sets it. */
|
|
122
122
|
paneLink?: ChatPaneLink;
|
|
123
|
+
/**
|
|
124
|
+
* An announcement Gloom posted, drawn as one. Only the server sets it, and
|
|
125
|
+
* only on one that still stands: a retracted announcement is the removal
|
|
126
|
+
* placeholder without it.
|
|
127
|
+
*/
|
|
128
|
+
announcement?: true;
|
|
123
129
|
clientStatus?: "sending" | "failed";
|
|
124
130
|
clientError?: string | null;
|
|
125
131
|
/** The idempotency key a local send went out with, so a retry repeats it. */
|
|
@@ -611,9 +617,25 @@ export interface CloudCdsHistoryPointPayload {
|
|
|
611
617
|
reported: number;
|
|
612
618
|
/** The contract on the run that day, e.g. "2031-12-20". */
|
|
613
619
|
maturity: string;
|
|
620
|
+
/** For a line quoted upfront: that day's level in points on the line's coupon. */
|
|
621
|
+
upfrontPts?: number;
|
|
622
|
+
}
|
|
623
|
+
|
|
624
|
+
/**
|
|
625
|
+
* Past 2,000bp a name is quoted in points upfront on its running coupon, the
|
|
626
|
+
* level and its moves alike; `spreadBp` and the bp moves stay beside them.
|
|
627
|
+
* Absent from servers before it, which read as `spread`.
|
|
628
|
+
*/
|
|
629
|
+
interface CloudCdsUpfrontQuote {
|
|
630
|
+
quote?: "spread" | "upfront";
|
|
631
|
+
/** The line's running coupon, bp. */
|
|
632
|
+
couponBp?: number | null;
|
|
633
|
+
upfrontPts?: number | null;
|
|
634
|
+
change1WPts?: number | null;
|
|
635
|
+
change1MPts?: number | null;
|
|
614
636
|
}
|
|
615
637
|
|
|
616
|
-
export interface CloudCdsHistoryResponse {
|
|
638
|
+
export interface CloudCdsHistoryResponse extends CloudCdsUpfrontQuote {
|
|
617
639
|
source: string;
|
|
618
640
|
/** The matched reference entity, or null when nothing on the tape matched. */
|
|
619
641
|
issuer: string | null;
|
|
@@ -621,14 +643,31 @@ export interface CloudCdsHistoryResponse {
|
|
|
621
643
|
currency: string | null;
|
|
622
644
|
asOf: string | null;
|
|
623
645
|
points: CloudCdsHistoryPointPayload[];
|
|
646
|
+
/**
|
|
647
|
+
* The last point's move over a week and a month in bp, on one contract and
|
|
648
|
+
* chained through the contract before across a roll, as the index board's.
|
|
649
|
+
* Null without a comparable level, or once the level is more than 5 trading
|
|
650
|
+
* days behind the tape; absent from servers before them.
|
|
651
|
+
*/
|
|
652
|
+
change1W?: number | null;
|
|
653
|
+
change1M?: number | null;
|
|
654
|
+
/**
|
|
655
|
+
* Why the line has no level in the month to its newest print, when one
|
|
656
|
+
* cause explains it: `upfront-side-unknown` when the prints carry an
|
|
657
|
+
* upfront without the side that paid it and nothing else places the level.
|
|
658
|
+
*/
|
|
659
|
+
noLevelReason?: string | null;
|
|
624
660
|
}
|
|
625
661
|
|
|
626
662
|
/** An issuer's latest 5Y level: the last point of its history over the last month. */
|
|
627
|
-
export interface CloudCdsLevelPayload {
|
|
663
|
+
export interface CloudCdsLevelPayload extends CloudCdsUpfrontQuote {
|
|
628
664
|
/** The reference entity as the history response names it. */
|
|
629
665
|
issuer: string;
|
|
630
666
|
spreadBp: number;
|
|
631
667
|
date: string;
|
|
668
|
+
/** As the history response's moves for the same name. */
|
|
669
|
+
change1W?: number | null;
|
|
670
|
+
change1M?: number | null;
|
|
632
671
|
}
|
|
633
672
|
|
|
634
673
|
export interface CloudCdsLevelsResponse {
|
|
@@ -1099,6 +1138,8 @@ export interface CloudTranscriptTurnPayload {
|
|
|
1099
1138
|
isQa: boolean;
|
|
1100
1139
|
/** Offset into the recording; null when the company published the transcript as a document. */
|
|
1101
1140
|
startSeconds: number | null;
|
|
1141
|
+
/** Where each of `paragraphs` starts in the recording, in seconds; absent without timings or on older servers. */
|
|
1142
|
+
paragraphStarts?: number[];
|
|
1102
1143
|
}
|
|
1103
1144
|
|
|
1104
1145
|
interface CloudTranscriptKeyFigurePayload {
|
|
@@ -1145,6 +1186,20 @@ export interface CloudEarningsTranscriptPayload {
|
|
|
1145
1186
|
updatedAt: string | null;
|
|
1146
1187
|
}
|
|
1147
1188
|
|
|
1189
|
+
/**
|
|
1190
|
+
* A call's audio to play beside its transcript. `kind` names what it is; a
|
|
1191
|
+
* stored recording is the only kind so far.
|
|
1192
|
+
*/
|
|
1193
|
+
export interface CloudEarningsCallAudioPayload {
|
|
1194
|
+
kind: "recording";
|
|
1195
|
+
/** A signed address that plays until `expiresAt`, seeking included. */
|
|
1196
|
+
url: string;
|
|
1197
|
+
expiresAt: string;
|
|
1198
|
+
durationSeconds: number | null;
|
|
1199
|
+
bytes?: number;
|
|
1200
|
+
contentType?: string;
|
|
1201
|
+
}
|
|
1202
|
+
|
|
1148
1203
|
export type CloudSearchDocType = "transcript" | "news" | "filing";
|
|
1149
1204
|
|
|
1150
1205
|
export type CloudSearchSort = "relevance" | "newest" | "oldest";
|
|
@@ -1263,10 +1318,14 @@ interface CloudSecFilingPayload {
|
|
|
1263
1318
|
primaryDocument?: string;
|
|
1264
1319
|
primaryDocDescription?: string;
|
|
1265
1320
|
items?: string;
|
|
1321
|
+
/** SEC's period of report, YYYY-MM-DD: a 10-Q's or 10-K's balance-sheet date. Absent from older servers. */
|
|
1322
|
+
reportDate?: string;
|
|
1266
1323
|
cik: string;
|
|
1267
1324
|
companyName?: string;
|
|
1268
1325
|
filingUrl: string;
|
|
1269
1326
|
primaryDocumentUrl?: string;
|
|
1327
|
+
/** The filing's SEC file number for this company, empty when it has none. Absent from older servers. */
|
|
1328
|
+
fileNumber?: string;
|
|
1270
1329
|
}
|
|
1271
1330
|
|
|
1272
1331
|
interface CloudSecDocumentPayload {
|
|
@@ -1488,6 +1547,11 @@ export interface CloudMarketResponse<T> {
|
|
|
1488
1547
|
session?: unknown;
|
|
1489
1548
|
/** "1day" when daily bars answer an intraday range: the listing has no intraday bars. */
|
|
1490
1549
|
servedResolution?: unknown;
|
|
1550
|
+
/**
|
|
1551
|
+
* Untrusted: daily sessions the bars leave out and why, as
|
|
1552
|
+
* `[{ date: "2020-04-20", reason: "non-positive-close" }]`. Validated by the history adapter.
|
|
1553
|
+
*/
|
|
1554
|
+
omittedSessions?: unknown;
|
|
1491
1555
|
/** Untrusted until the history adapter validates its boundary dates. */
|
|
1492
1556
|
coverage?: CloudHistoryCoverage;
|
|
1493
1557
|
providerMeta?: {
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { logFailure } from "../utils/log-failure";
|
|
1
2
|
import type { ExperimentAnswer, StorageLike } from "./web-experiments";
|
|
2
3
|
|
|
3
4
|
/**
|
|
@@ -36,11 +37,11 @@ function isVariant(value: unknown): value is UpgradePersonalizedVariant {
|
|
|
36
37
|
}
|
|
37
38
|
|
|
38
39
|
function read(storage: StorageLike | undefined, key: string): string | null {
|
|
39
|
-
try { return storage?.getItem(key) ?? null; } catch { return null; }
|
|
40
|
+
try { return storage?.getItem(key) ?? null; } catch { /* Intentional ignore: Private browsing may deny optional experiment storage. */ return null; }
|
|
40
41
|
}
|
|
41
42
|
|
|
42
43
|
function write(storage: StorageLike | undefined, key: string, value: string): void {
|
|
43
|
-
try { storage?.setItem(key, value); } catch { /*
|
|
44
|
+
try { storage?.setItem(key, value); } catch { /* Intentional ignore: Private browsing may deny optional experiment storage. */ }
|
|
44
45
|
}
|
|
45
46
|
|
|
46
47
|
/**
|
|
@@ -77,7 +78,7 @@ export function createUpgradeExperimentSession() {
|
|
|
77
78
|
if (inFlight) return inFlight;
|
|
78
79
|
const request = (async () => {
|
|
79
80
|
let answer: ExperimentAnswer;
|
|
80
|
-
try { answer = await ask(); } catch { return null; }
|
|
81
|
+
try { answer = await ask(); } catch (error) { logFailure("cloud-experiments", "Experiment exposure request failed")(error); return null; }
|
|
81
82
|
const variant = answer.accepted && isVariant(answer.variant) ? answer.variant : null;
|
|
82
83
|
answers.set(identity, variant);
|
|
83
84
|
write(context.session, `${SESSION_PREFIX}${identity}`, variant ?? "excluded");
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { logFailure } from "../utils/log-failure";
|
|
1
2
|
import { EXPERIMENTS_STORAGE_KEY, storedExperimentAssignments, type ExperimentAnswer, type StorageLike } from "./web-experiments";
|
|
2
3
|
|
|
3
4
|
export type WallExperiment = "wall_teaser" | "wall_teaser_signin";
|
|
@@ -25,11 +26,11 @@ function unit(context: WallExperimentContext, experiment: WallExperiment): strin
|
|
|
25
26
|
}
|
|
26
27
|
|
|
27
28
|
function read(storage: StorageLike | undefined, key: string): string | null {
|
|
28
|
-
try { return storage?.getItem(key) ?? null; } catch { return null; }
|
|
29
|
+
try { return storage?.getItem(key) ?? null; } catch { /* Intentional ignore: Private browsing may deny optional experiment storage. */ return null; }
|
|
29
30
|
}
|
|
30
31
|
|
|
31
32
|
function write(storage: StorageLike | undefined, key: string, value: string): void {
|
|
32
|
-
try { storage?.setItem(key, value); } catch { /*
|
|
33
|
+
try { storage?.setItem(key, value); } catch { /* Intentional ignore: Private browsing may deny optional experiment storage. */ }
|
|
33
34
|
}
|
|
34
35
|
|
|
35
36
|
function isVariant(value: unknown): value is WallTeaserVariant {
|
|
@@ -77,7 +78,8 @@ export function createWallExperimentSession(experiment: WallExperiment = "wall_t
|
|
|
77
78
|
|
|
78
79
|
const request = (async () => {
|
|
79
80
|
let answer: ExperimentAnswer;
|
|
80
|
-
try { answer = await ask(storedVariant(context.local, experiment)); } catch {
|
|
81
|
+
try { answer = await ask(storedVariant(context.local, experiment)); } catch (error) {
|
|
82
|
+
logFailure("cloud-experiments", "Experiment exposure request failed")(error);
|
|
81
83
|
// An older API (422), offline connection or timeout is not an exposure.
|
|
82
84
|
return null;
|
|
83
85
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { logFailure } from "../utils/log-failure";
|
|
1
2
|
import { withDeadline } from "../utils/async-deadline";
|
|
2
3
|
import { canonicalExchange } from "../utils/exchanges";
|
|
3
4
|
import { CloudApiRequestTransport } from "./request";
|
|
@@ -43,7 +44,8 @@ export async function getWallSummary(wall: string, symbol: string, exchange?: st
|
|
|
43
44
|
signal: controller.signal,
|
|
44
45
|
}), 3_000, "Wall summary request timed out", (error) => controller.abort(error));
|
|
45
46
|
return parseWallSummary(result);
|
|
46
|
-
} catch {
|
|
47
|
+
} catch (error) {
|
|
48
|
+
logFailure("cloud-wall-summary", "Wall summary request failed")(error);
|
|
47
49
|
return null;
|
|
48
50
|
}
|
|
49
51
|
}
|