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
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
* later milestone as `experiments`, which the API turns into `exp_<key>` and
|
|
14
14
|
* saves to the account once they sign in.
|
|
15
15
|
*/
|
|
16
|
+
import { logFailure } from "../utils/log-failure";
|
|
16
17
|
|
|
17
18
|
export interface StorageLike {
|
|
18
19
|
getItem(key: string): string | null;
|
|
@@ -75,6 +76,7 @@ function read(storage: StorageLike, key: string): string | null {
|
|
|
75
76
|
try {
|
|
76
77
|
return storage.getItem(key);
|
|
77
78
|
} catch {
|
|
79
|
+
// Intentional ignore: Private browsing may deny optional experiment storage.
|
|
78
80
|
return null;
|
|
79
81
|
}
|
|
80
82
|
}
|
|
@@ -83,7 +85,7 @@ function write(storage: StorageLike, key: string, value: string): void {
|
|
|
83
85
|
try {
|
|
84
86
|
storage.setItem(key, value);
|
|
85
87
|
} catch {
|
|
86
|
-
|
|
88
|
+
// Intentional ignore: Private browsing may deny optional experiment storage.
|
|
87
89
|
}
|
|
88
90
|
}
|
|
89
91
|
|
|
@@ -112,7 +114,8 @@ export function exposeExperiment(experiment: string, env: WebExperimentEnvironme
|
|
|
112
114
|
let answer: ExperimentAnswer;
|
|
113
115
|
try {
|
|
114
116
|
answer = await env.ask({ experiment, variant: assignments.get(experiment) });
|
|
115
|
-
} catch {
|
|
117
|
+
} catch (error) {
|
|
118
|
+
logFailure("cloud-experiments", "Experiment exposure request failed")(error);
|
|
116
119
|
// Not counted, so the next page load in this session may ask again.
|
|
117
120
|
return null;
|
|
118
121
|
}
|
|
@@ -33,9 +33,26 @@ export interface CloudCurveView {
|
|
|
33
33
|
percentile1y: number | null;
|
|
34
34
|
observations1y: number;
|
|
35
35
|
}>;
|
|
36
|
+
/** Each tenor's 1D and 1W move ranked against its whole stored history; absent on servers older than it. */
|
|
37
|
+
moves?: CloudCurveMove[];
|
|
36
38
|
checkedAt: string | null;
|
|
37
39
|
}
|
|
38
40
|
|
|
41
|
+
/** How big a tenor's move into the session was, against every move of the same horizon through it. */
|
|
42
|
+
export interface CloudCurveMove {
|
|
43
|
+
tenor: string;
|
|
44
|
+
horizon: "1D" | "1W";
|
|
45
|
+
/** The session the move is measured from (the day before, or seven days before, within ten days). */
|
|
46
|
+
from: string | null;
|
|
47
|
+
/** Percentage points. */
|
|
48
|
+
change: number | null;
|
|
49
|
+
/** Midrank percentile of the move's size, 0 to 100; null below a year of moves. */
|
|
50
|
+
percentile: number | null;
|
|
51
|
+
observations: number;
|
|
52
|
+
/** The session the oldest ranked move ends on. */
|
|
53
|
+
since: string | null;
|
|
54
|
+
}
|
|
55
|
+
|
|
39
56
|
/** One tenor of a stored curve over time, oldest first (`GET /cloud/econ/curves/:curve/history`). */
|
|
40
57
|
export interface CloudCurveHistory {
|
|
41
58
|
curve: CloudCurveHeader;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { AppConfig } from "../types/config";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* The empty command bar's introduction: the Start Here rows in plain words and
|
|
5
|
+
* a placeholder with plain words to type. It shows for the first opens of the
|
|
6
|
+
* empty bar on this machine and then never again, so the bar settles into the
|
|
7
|
+
* list someone who knows the codes expects.
|
|
8
|
+
*/
|
|
9
|
+
const COMMAND_BAR_INTRO_OPENS = 10;
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Where the count stops: one past the last open with the introduction. It
|
|
13
|
+
* changes no more after that, so it is never saved again.
|
|
14
|
+
*/
|
|
15
|
+
const COMMAND_BAR_OPENS_DONE = COMMAND_BAR_INTRO_OPENS + 1;
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* The saved count, or done when there is none. A new config starts at 0, so a
|
|
19
|
+
* config without one was made by a build from before the count, by someone who
|
|
20
|
+
* has been opening the bar all along.
|
|
21
|
+
*/
|
|
22
|
+
export function sanitizeCommandBarOpens(value: unknown): number {
|
|
23
|
+
if (typeof value !== "number" || !Number.isFinite(value)) return COMMAND_BAR_OPENS_DONE;
|
|
24
|
+
return Math.min(COMMAND_BAR_OPENS_DONE, Math.max(0, Math.floor(value)));
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/** The count after the empty bar opens once more. */
|
|
28
|
+
export function recordCommandBarOpen(opens: number | undefined): number {
|
|
29
|
+
return Math.min(COMMAND_BAR_OPENS_DONE, sanitizeCommandBarOpens(opens) + 1);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Whether the open bar is one of the first opens. The count already includes
|
|
34
|
+
* this open, so it reads the same for as long as the bar stays open.
|
|
35
|
+
*/
|
|
36
|
+
export function showsCommandBarIntro(config: Pick<AppConfig, "commandBarOpens">): boolean {
|
|
37
|
+
return sanitizeCommandBarOpens(config.commandBarOpens) <= COMMAND_BAR_INTRO_OPENS;
|
|
38
|
+
}
|
|
@@ -231,7 +231,7 @@ export const KEYBINDING_ACTIONS: readonly KeybindingActionDef[] = [
|
|
|
231
231
|
{
|
|
232
232
|
id: "pane-share",
|
|
233
233
|
category: "Pane Management",
|
|
234
|
-
description: "Share the focused pane:
|
|
234
|
+
description: "Share the focused pane: copy a link to it.",
|
|
235
235
|
defaults: ["CmdOrCtrl+Shift+S"],
|
|
236
236
|
},
|
|
237
237
|
{
|
|
@@ -11,6 +11,7 @@ import type { DataProvider } from "../../types/data-provider";
|
|
|
11
11
|
import type {
|
|
12
12
|
PaneDef,
|
|
13
13
|
PaneTemplateCreateOptions,
|
|
14
|
+
PaneTemplateDef,
|
|
14
15
|
PaneTemplateInstanceConfig,
|
|
15
16
|
} from "../../types/plugin";
|
|
16
17
|
|
|
@@ -35,6 +36,39 @@ interface UseAppPaneTemplateRuntimeOptions {
|
|
|
35
36
|
tickerRepository: AppTickerRepositoryPort;
|
|
36
37
|
}
|
|
37
38
|
|
|
39
|
+
/**
|
|
40
|
+
* Whether shared data opens the pane by itself: the template takes it whole
|
|
41
|
+
* (a chart a plugin built), so its settings form would ask for what the data
|
|
42
|
+
* already says. A template that restores shares decides; any other takes data
|
|
43
|
+
* that holds something.
|
|
44
|
+
*/
|
|
45
|
+
function shareDataOpens(template: Pick<PaneTemplateDef, "publicShare">, shareData: unknown): boolean {
|
|
46
|
+
if (!shareData || typeof shareData !== "object" || Array.isArray(shareData)) return false;
|
|
47
|
+
const restore = template.publicShare?.restore;
|
|
48
|
+
if (!restore) return Object.keys(shareData).length > 0;
|
|
49
|
+
try {
|
|
50
|
+
return restore(shareData as Record<string, unknown>) !== null;
|
|
51
|
+
} catch {
|
|
52
|
+
// Intentional ignore: data the template cannot restore asks for its settings form instead.
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Whether opening a template asks for its settings first, in the same form the
|
|
59
|
+
* command bar opens, which creates the pane when it is sent.
|
|
60
|
+
*/
|
|
61
|
+
export function templateAsksForSettings(
|
|
62
|
+
template: Pick<PaneTemplateDef, "wizard" | "publicShare">,
|
|
63
|
+
options: PaneTemplateCreateOptions | undefined,
|
|
64
|
+
): boolean {
|
|
65
|
+
return !!template.wizard
|
|
66
|
+
&& template.wizard.length > 0
|
|
67
|
+
&& !options?.values
|
|
68
|
+
&& !shareDataOpens(template, options?.shareData)
|
|
69
|
+
&& (!options?.arg || template.wizard.some((step) => step.type === "textarea"));
|
|
70
|
+
}
|
|
71
|
+
|
|
38
72
|
export function useAppPaneTemplateRuntime({
|
|
39
73
|
buildPaneInstance,
|
|
40
74
|
dataProvider,
|
|
@@ -49,13 +83,7 @@ export function useAppPaneTemplateRuntime({
|
|
|
49
83
|
const template = pluginRegistry.paneTemplates.get(templateId);
|
|
50
84
|
if (!template) return;
|
|
51
85
|
|
|
52
|
-
|
|
53
|
-
// opens, which creates the pane when it is sent.
|
|
54
|
-
const asksForSettings = !!template.wizard
|
|
55
|
-
&& template.wizard.length > 0
|
|
56
|
-
&& !options?.values
|
|
57
|
-
&& (!options?.arg || template.wizard.some((step) => step.type === "textarea"));
|
|
58
|
-
if (asksForSettings) {
|
|
86
|
+
if (templateAsksForSettings(template, options)) {
|
|
59
87
|
openFormModal({ kind: "pane-template", templateId, arg: options?.arg, options });
|
|
60
88
|
return;
|
|
61
89
|
}
|
|
@@ -177,6 +177,10 @@ export function bindAppPanePluginRegistry({
|
|
|
177
177
|
if (isDetachedWindow || isDialogOpen()) return;
|
|
178
178
|
dispatch({ type: "SET_COMMAND_BAR", open: true, query });
|
|
179
179
|
},
|
|
180
|
+
runCommandBarQuery: (query) => {
|
|
181
|
+
if (isDetachedWindow || isDialogOpen()) return;
|
|
182
|
+
dispatch({ type: "SET_COMMAND_BAR", open: true, query, launch: { kind: "run-query", query } });
|
|
183
|
+
},
|
|
180
184
|
// Forms submit through the main window's state, so a detached window says where to go.
|
|
181
185
|
openPluginCommandWorkflow: (commandId) => {
|
|
182
186
|
if (isDetachedWindow) {
|
|
@@ -24,8 +24,8 @@ import {
|
|
|
24
24
|
tickerOpenFailureMessage,
|
|
25
25
|
type TickerOpenTarget,
|
|
26
26
|
} from "../../tickers/open-target";
|
|
27
|
-
import {
|
|
28
|
-
import {
|
|
27
|
+
import { findExactTickerSearchMatch } from "../../tickers/search";
|
|
28
|
+
import { offerTickerListings, publishTickerOpenTarget as publishOpenTarget } from "./ticker-open-target";
|
|
29
29
|
import { parsePublicTickerKey, publicTickerKey } from "../../utils/exchanges";
|
|
30
30
|
import { attentionActionForPane, captureAttentionAction } from "../../telemetry/attention-counts";
|
|
31
31
|
import { tickerHasListingSuffix } from "../../sources/listing-symbols";
|
|
@@ -79,11 +79,7 @@ export function useAppTickerOpenRuntime({
|
|
|
79
79
|
return target;
|
|
80
80
|
} catch (err) {
|
|
81
81
|
if (!canPresentFeedback()) return null;
|
|
82
|
-
|
|
83
|
-
if (err instanceof AmbiguousTickerError && !isDialogOpen()) {
|
|
84
|
-
dispatch({ type: "SET_COMMAND_BAR", open: true, query: rawSymbol,
|
|
85
|
-
launch: { kind: "ticker-search", query: rawSymbol } });
|
|
86
|
-
}
|
|
82
|
+
offerTickerListings(err, rawSymbol, dispatch);
|
|
87
83
|
const message = err instanceof Error ? err.message : String(err);
|
|
88
84
|
pluginRegistry.notify({ body: `Failed to open ${rawSymbol}: ${message}`, type: "error" });
|
|
89
85
|
return null;
|
|
@@ -91,13 +87,7 @@ export function useAppTickerOpenRuntime({
|
|
|
91
87
|
}, [dataProvider, dispatch, pluginRegistry, stateRef, tickerRepository]);
|
|
92
88
|
|
|
93
89
|
const publishTickerOpenTarget = useCallback((target: TickerOpenTarget) => {
|
|
94
|
-
|
|
95
|
-
if (currentTicker !== target.ticker) {
|
|
96
|
-
dispatch({ type: "UPDATE_TICKER", ticker: target.ticker });
|
|
97
|
-
}
|
|
98
|
-
if (target.created) {
|
|
99
|
-
pluginRegistry.events.emit("ticker:added", { symbol: target.symbol, ticker: target.ticker });
|
|
100
|
-
}
|
|
90
|
+
publishOpenTarget(target, { tickers: stateRef.current.tickers, dispatch, events: pluginRegistry.events });
|
|
101
91
|
}, [dispatch, pluginRegistry.events, stateRef]);
|
|
102
92
|
|
|
103
93
|
/**
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { Dispatch } from "react";
|
|
2
|
+
import type { PluginRegistry } from "../../plugins/registry";
|
|
3
|
+
import type { AppAction } from "../../state/app/context";
|
|
4
|
+
import type { TickerRecord } from "../../types/ticker";
|
|
5
|
+
import type { TickerOpenTarget } from "../../tickers/open-target";
|
|
6
|
+
import { AmbiguousTickerError } from "../../tickers/search";
|
|
7
|
+
import { isDialogOpen } from "../../ui/dialog-stack";
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* A resolved open joins the app's tickers: the store takes the record when it
|
|
11
|
+
* is not the one it holds, and a ticker new to the app is announced once.
|
|
12
|
+
* Every open, from the command bar, a link or a pane, publishes it this way.
|
|
13
|
+
*/
|
|
14
|
+
export function publishTickerOpenTarget(target: TickerOpenTarget, { tickers, dispatch, events }: {
|
|
15
|
+
tickers: ReadonlyMap<string, TickerRecord>;
|
|
16
|
+
dispatch: Dispatch<AppAction>;
|
|
17
|
+
events: Pick<PluginRegistry["events"], "emit">;
|
|
18
|
+
}): void {
|
|
19
|
+
if (tickers.get(target.symbol) !== target.ticker) {
|
|
20
|
+
dispatch({ type: "UPDATE_TICKER", ticker: target.ticker });
|
|
21
|
+
}
|
|
22
|
+
if (target.created) {
|
|
23
|
+
events.emit("ticker:added", { symbol: target.symbol, ticker: target.ticker });
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/** An open whose symbol names several listings offers them in ticker search, unless a dialog would sit over the bar. */
|
|
28
|
+
export function offerTickerListings(error: unknown, rawSymbol: string, dispatch: Dispatch<AppAction>): void {
|
|
29
|
+
if (!(error instanceof AmbiguousTickerError) || isDialogOpen()) return;
|
|
30
|
+
dispatch({ type: "SET_COMMAND_BAR", open: true, query: rawSymbol, launch: { kind: "ticker-search", query: rawSymbol } });
|
|
31
|
+
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { logFailure } from "../../utils/log-failure";
|
|
1
2
|
import { useEffect, type Dispatch } from "react";
|
|
2
3
|
import { apiClient } from "../../api-client";
|
|
3
4
|
import { getDockedPaneIds } from "../../layout/pane-manager";
|
|
@@ -81,9 +82,7 @@ function parseGloomUrl(rawUrl: string): ParsedGloomUrl | null {
|
|
|
81
82
|
let url: URL;
|
|
82
83
|
try {
|
|
83
84
|
url = new URL(rawUrl);
|
|
84
|
-
} catch {
|
|
85
|
-
return null;
|
|
86
|
-
}
|
|
85
|
+
} catch { /* Intentional ignore: Malformed external deep links are rejected as non-matches. */ return null; }
|
|
87
86
|
if (url.protocol !== "gloomberb:") return null;
|
|
88
87
|
|
|
89
88
|
const host = url.hostname.trim().toLowerCase();
|
|
@@ -575,7 +574,7 @@ export function handleDesktopDeepLink(rawUrl: string, options: DesktopDeepLinkHa
|
|
|
575
574
|
if (action.route.kind === "cloud-success") {
|
|
576
575
|
requestAccountManagementTab("pro");
|
|
577
576
|
// Checkout just completed: re-read the session so the new plan shows at once.
|
|
578
|
-
void chatController.refreshSession().catch((
|
|
577
|
+
void chatController.refreshSession().catch(logFailure("app.runtime.desktop-deeplink", "Checkout session refresh failed"));
|
|
579
578
|
}
|
|
580
579
|
options.pluginRegistry.showPane("account-management");
|
|
581
580
|
notifySuccess(options.pluginRegistry, action.message);
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { logFailure } from "../../utils/log-failure";
|
|
1
2
|
import type { Dispatch } from "react";
|
|
2
3
|
import {
|
|
3
4
|
clearPersistedBrokerAccounts,
|
|
@@ -136,7 +137,7 @@ export function bindPluginRegistryRuntimeAccess({
|
|
|
136
137
|
const broker = pluginRegistry.brokers.get(instance.brokerType);
|
|
137
138
|
if (!broker) throw new Error(`Broker "${instance.brokerType}" is not available.`);
|
|
138
139
|
|
|
139
|
-
const valid = await broker.validate(instance).catch((
|
|
140
|
+
const valid = await broker.validate(instance).catch(logFailure("app.runtime.plugin-bindings", "Broker setup validation failed", false));
|
|
140
141
|
if (!valid) throw new Error(`${broker.name} setup is incomplete.`);
|
|
141
142
|
|
|
142
143
|
await broker.connect?.(instance);
|
|
@@ -272,7 +273,7 @@ export function bindPluginRegistryRuntimeAccess({
|
|
|
272
273
|
pluginRegistry.events.emit("config:changed", { config: nextConfig });
|
|
273
274
|
// The profile that kept a portfolio fills in what the removed one held there.
|
|
274
275
|
for (const heirId of new Set(heirs.values())) {
|
|
275
|
-
void importBrokerPositions(heirId).catch((
|
|
276
|
+
void importBrokerPositions(heirId).catch(logFailure("app.runtime.plugin-bindings", "Replacement broker positions import failed"));
|
|
276
277
|
}
|
|
277
278
|
},
|
|
278
279
|
});
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { logFailure } from "../../utils/log-failure";
|
|
1
2
|
import { useCallback, useEffect, type Dispatch } from "react";
|
|
2
3
|
import { loadPersistedBrokerAccountMap } from "../../brokers/account-cache";
|
|
3
4
|
import type { AppSessionSnapshot } from "../../core/state/session-persistence";
|
|
@@ -155,7 +156,7 @@ export function useAppStartupRuntime({
|
|
|
155
156
|
sessionHydrationTargetCount: sessionSnapshot?.hydrationTargets.length ?? 0,
|
|
156
157
|
});
|
|
157
158
|
} catch (err) {
|
|
158
|
-
|
|
159
|
+
logFailure("app.runtime.startup", "Workspace startup hydration failed")(err);
|
|
159
160
|
}
|
|
160
161
|
})();
|
|
161
162
|
}, [
|
|
@@ -215,9 +216,7 @@ export function useAppStartupRuntime({
|
|
|
215
216
|
});
|
|
216
217
|
void Promise.race([pluginsReady, waitForPlugins]).then(() => {
|
|
217
218
|
recordRestoredFunctions(restoredUsageFunctions(config.layout, pluginRegistry, config.disabledPlugins));
|
|
218
|
-
}).catch((
|
|
219
|
-
/* Counting is best effort and must not surface as a crash. */
|
|
220
|
-
});
|
|
219
|
+
}).catch(logFailure("app.runtime.startup", "Restored function usage recording failed"));
|
|
221
220
|
}, [getState, isDetachedWindow, pluginRegistry, pluginsReady, state.initialized]);
|
|
222
221
|
|
|
223
222
|
useEffect(() => {
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { logFailure } from "../../utils/log-failure";
|
|
1
2
|
import { useCallback, useEffect, useRef, type Dispatch } from "react";
|
|
2
3
|
import type { MarketDataCoordinator } from "../../market-data/coordinator";
|
|
3
4
|
import { instrumentFromTicker, type InstrumentRef } from "../../market-data/request-types";
|
|
@@ -75,10 +76,10 @@ export function useTickerRefreshRuntime({
|
|
|
75
76
|
const data = entry.data ?? entry.lastGoodData;
|
|
76
77
|
if (data) pluginRegistry.events.emit("ticker:refreshed", { symbol: instrument.symbol, financials: data });
|
|
77
78
|
const currency = data?.quote?.currency;
|
|
78
|
-
if (currency) void marketData.loadFxRate(currency).catch((
|
|
79
|
-
void marketData.loadFxRate(baseCurrency).catch((
|
|
80
|
-
} catch {
|
|
81
|
-
|
|
79
|
+
if (currency) void marketData.loadFxRate(currency).catch(logFailure("app.runtime.ticker-refresh", "Refreshing an exchange rate failed"));
|
|
80
|
+
void marketData.loadFxRate(baseCurrency).catch(logFailure("app.runtime.ticker-refresh", "Refreshing an exchange rate failed"));
|
|
81
|
+
} catch (error) {
|
|
82
|
+
logFailure("app.runtime.ticker-refresh", "Ticker refresh failed")(error);
|
|
82
83
|
} finally {
|
|
83
84
|
refreshInFlight.delete(key);
|
|
84
85
|
setRefreshing(instrument.symbol, false);
|
|
@@ -93,10 +94,10 @@ export function useTickerRefreshRuntime({
|
|
|
93
94
|
const entry = await marketData.loadQuote(instrument, { forceRefresh: true });
|
|
94
95
|
const quote = entry.data ?? entry.lastGoodData;
|
|
95
96
|
if (!quote) return;
|
|
96
|
-
if (quote.currency) void marketData.loadFxRate(quote.currency).catch((
|
|
97
|
-
void marketData.loadFxRate(baseCurrency).catch((
|
|
98
|
-
} catch {
|
|
99
|
-
|
|
97
|
+
if (quote.currency) void marketData.loadFxRate(quote.currency).catch(logFailure("app.runtime.ticker-refresh", "Refreshing an exchange rate failed"));
|
|
98
|
+
void marketData.loadFxRate(baseCurrency).catch(logFailure("app.runtime.ticker-refresh", "Refreshing an exchange rate failed"));
|
|
99
|
+
} catch (error) {
|
|
100
|
+
logFailure("app.runtime.ticker-refresh", "Quote refresh failed")(error);
|
|
100
101
|
} finally {
|
|
101
102
|
quoteRefreshInFlight.delete(key);
|
|
102
103
|
}
|
|
@@ -154,10 +155,10 @@ export function useTickerRefreshRuntime({
|
|
|
154
155
|
const data = entry.data ?? entry.lastGoodData;
|
|
155
156
|
if (instrument && data) {
|
|
156
157
|
pluginRegistry.events.emit("ticker:refreshed", { symbol: instrument.symbol, financials: data });
|
|
157
|
-
if (data.quote?.currency) void marketData.loadFxRate(data.quote.currency).catch((
|
|
158
|
+
if (data.quote?.currency) void marketData.loadFxRate(data.quote.currency).catch(logFailure("app.runtime.ticker-refresh", "Refreshing an exchange rate failed"));
|
|
158
159
|
}
|
|
159
160
|
});
|
|
160
|
-
void marketData.loadFxRate(baseCurrency).catch((
|
|
161
|
+
void marketData.loadFxRate(baseCurrency).catch(logFailure("app.runtime.ticker-refresh", "Refreshing an exchange rate failed"));
|
|
161
162
|
} finally {
|
|
162
163
|
for (const { instrument, key } of runnable) {
|
|
163
164
|
refreshInFlight.delete(key);
|
|
@@ -183,9 +184,9 @@ export function useTickerRefreshRuntime({
|
|
|
183
184
|
const results = await marketData.loadQuotesBatch(runnable.map(({ instrument }) => instrument));
|
|
184
185
|
for (const entry of results) {
|
|
185
186
|
const quote = entry.data ?? entry.lastGoodData;
|
|
186
|
-
if (quote?.currency) void marketData.loadFxRate(quote.currency).catch((
|
|
187
|
+
if (quote?.currency) void marketData.loadFxRate(quote.currency).catch(logFailure("app.runtime.ticker-refresh", "Refreshing an exchange rate failed"));
|
|
187
188
|
}
|
|
188
|
-
void marketData.loadFxRate(baseCurrency).catch((
|
|
189
|
+
void marketData.loadFxRate(baseCurrency).catch(logFailure("app.runtime.ticker-refresh", "Refreshing an exchange rate failed"));
|
|
189
190
|
} finally {
|
|
190
191
|
for (const { key } of runnable) {
|
|
191
192
|
quoteRefreshInFlight.delete(key);
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { logFailure } from "../../utils/log-failure";
|
|
1
2
|
import { useCallback, useEffect, useRef, type Dispatch } from "react";
|
|
2
3
|
import type { PluginRegistry } from "../../plugins/registry";
|
|
3
4
|
import { saveConfigImmediately } from "../../state/config-save-scheduler";
|
|
@@ -214,13 +215,13 @@ export function useAppUpdateRuntime({
|
|
|
214
215
|
const isUpgrade = !!config.lastLaunchedVersion;
|
|
215
216
|
const nextConfig = { ...config, lastLaunchedVersion: VERSION };
|
|
216
217
|
dispatch({ type: "SET_CONFIG", config: nextConfig });
|
|
217
|
-
void saveConfigImmediately(nextConfig).catch((
|
|
218
|
+
void saveConfigImmediately(nextConfig).catch(logFailure("update", "Saving the last launched version failed"));
|
|
218
219
|
// Nightly builds come daily and the changelog lists stable releases only.
|
|
219
220
|
if (!isUpgrade || isPrereleaseVersion(VERSION)) return;
|
|
220
221
|
// Opened by the app, not the user: usage counts leave it out.
|
|
221
222
|
void runAutomated(() => pluginRegistry.createPaneFromTemplateAsync("changelog-pane", {
|
|
222
223
|
values: { version: VERSION },
|
|
223
|
-
})).catch((
|
|
224
|
+
})).catch(logFailure("update", "Opening release notes failed"));
|
|
224
225
|
}, [dispatch, enabled, isDetachedWindow, pluginRegistry, stateRef]);
|
|
225
226
|
|
|
226
227
|
useEffect(() => {
|
|
@@ -20,10 +20,7 @@
|
|
|
20
20
|
"src/cli/pane-functions/screenshot.ts": ["chart-composer","econ-statistics","market-valuation","portfolio-list","ticker-detail","time-sales"],
|
|
21
21
|
"src/components/command-bar/commands/direct/index.ts": ["broker-manager"],
|
|
22
22
|
"src/components/command-bar/routes/root/help-items.ts": ["help"],
|
|
23
|
-
"src/components/command-bar/workflow/builtin.ts": ["portfolio-list"],
|
|
24
23
|
"src/components/command-bar/workflow/ops.ts": ["correlation","portfolio-list","ticker-detail"],
|
|
25
|
-
"src/components/form-modal/routes.ts": ["portfolio-list"],
|
|
26
|
-
"src/components/index.ts": ["portfolio-list"],
|
|
27
24
|
"src/components/layout/shell/index.tsx": ["cloud"],
|
|
28
25
|
"src/components/onboarding/use-onboarding-upgrade.ts": ["chat"],
|
|
29
26
|
"src/layout/desks.ts": ["chart-composer"],
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
{
|
|
2
|
+
"src/cli/desktop-pane-shot.ts": {
|
|
3
|
+
"literals": {
|
|
4
|
+
"font size": 1
|
|
5
|
+
},
|
|
6
|
+
"why": "A pane picture's caption, drawn by the CLI into a page without the app's styles."
|
|
7
|
+
},
|
|
8
|
+
"src/components/metric-treemap/heat-surface.tsx": {
|
|
9
|
+
"literals": {
|
|
10
|
+
"font size": 2,
|
|
11
|
+
"font weight": 1,
|
|
12
|
+
"radius": 2
|
|
13
|
+
},
|
|
14
|
+
"why": "Heat map tiles size, weigh and round their labels to fit each tile; the hover tooltip is the kit's tooltip surface."
|
|
15
|
+
},
|
|
16
|
+
"src/components/metric-treemap/index.tsx": {
|
|
17
|
+
"literals": {
|
|
18
|
+
"font size": 1,
|
|
19
|
+
"font weight": 1,
|
|
20
|
+
"radius": 1,
|
|
21
|
+
"spacing": 1
|
|
22
|
+
},
|
|
23
|
+
"why": "Treemap labels are fitted and padded to their tile's size."
|
|
24
|
+
},
|
|
25
|
+
"src/components/onboarding/onboarding-frame.tsx": {
|
|
26
|
+
"literals": {
|
|
27
|
+
"radius": 1
|
|
28
|
+
},
|
|
29
|
+
"why": "The progress bar is a 2px data mark rounded at its ends."
|
|
30
|
+
},
|
|
31
|
+
"src/components/ui/country-flag.tsx": {
|
|
32
|
+
"literals": {
|
|
33
|
+
"radius": 1
|
|
34
|
+
},
|
|
35
|
+
"why": "A flag is a data mark with its own small rounding."
|
|
36
|
+
},
|
|
37
|
+
"src/components/ui/fields.tsx": {
|
|
38
|
+
"literals": {
|
|
39
|
+
"spacing": 1
|
|
40
|
+
},
|
|
41
|
+
"why": "A framed text area's text keeps 6px off its frame above and below, the padding its fields were given in #1426; its sides are the inset."
|
|
42
|
+
},
|
|
43
|
+
"src/components/ui/range-track.tsx": {
|
|
44
|
+
"literals": {
|
|
45
|
+
"radius": 1,
|
|
46
|
+
"spacing": 1
|
|
47
|
+
},
|
|
48
|
+
"why": "The range track is a data mark rounded at its ends; its marker is centred on its value by a negative margin."
|
|
49
|
+
},
|
|
50
|
+
"src/components/ui/ratio-bar.tsx": {
|
|
51
|
+
"literals": {
|
|
52
|
+
"radius": 2
|
|
53
|
+
},
|
|
54
|
+
"why": "Ratio bar segments are data marks rounded at their ends."
|
|
55
|
+
},
|
|
56
|
+
"src/components/ui/split-bar.tsx": {
|
|
57
|
+
"literals": {
|
|
58
|
+
"radius": 1
|
|
59
|
+
},
|
|
60
|
+
"why": "Split bar segments are data marks rounded at their ends."
|
|
61
|
+
},
|
|
62
|
+
"src/plugins/builtin/chat/attachments/desktop.tsx": {
|
|
63
|
+
"literals": {
|
|
64
|
+
"font size": 3,
|
|
65
|
+
"radius": 5,
|
|
66
|
+
"spacing": 2
|
|
67
|
+
},
|
|
68
|
+
"why": "Chat has its own owner and conventions; reported, not changed (GLO-768)."
|
|
69
|
+
},
|
|
70
|
+
"src/plugins/builtin/chat/content/handle-prompt.tsx": {
|
|
71
|
+
"literals": {
|
|
72
|
+
"font weight": 1,
|
|
73
|
+
"spacing": 2
|
|
74
|
+
},
|
|
75
|
+
"why": "Chat has its own owner and conventions; reported, not changed (GLO-768)."
|
|
76
|
+
},
|
|
77
|
+
"src/plugins/builtin/chat/message/pane-chip.tsx": {
|
|
78
|
+
"literals": {
|
|
79
|
+
"font weight": 1,
|
|
80
|
+
"radius": 3,
|
|
81
|
+
"spacing": 2
|
|
82
|
+
},
|
|
83
|
+
"why": "Chat has its own owner and conventions; reported, not changed (GLO-768)."
|
|
84
|
+
},
|
|
85
|
+
"src/plugins/builtin/credit-documents/gauge.tsx": {
|
|
86
|
+
"literals": {
|
|
87
|
+
"radius": 1
|
|
88
|
+
},
|
|
89
|
+
"why": "The gauge's fill is a data mark rounded at its end."
|
|
90
|
+
},
|
|
91
|
+
"src/plugins/builtin/executives/pane.tsx": {
|
|
92
|
+
"literals": {
|
|
93
|
+
"radius": 1
|
|
94
|
+
},
|
|
95
|
+
"why": "A legend swatch is a data mark."
|
|
96
|
+
},
|
|
97
|
+
"src/plugins/builtin/gpu/ladder.tsx": {
|
|
98
|
+
"literals": {
|
|
99
|
+
"radius": 4,
|
|
100
|
+
"spacing": 6
|
|
101
|
+
},
|
|
102
|
+
"why": "Ladder rungs, ranges and markers are data marks, centred on their values by negative margins."
|
|
103
|
+
},
|
|
104
|
+
"src/plugins/builtin/revenue-breakdown/bars.tsx": {
|
|
105
|
+
"literals": {
|
|
106
|
+
"radius": 1,
|
|
107
|
+
"spacing": 3
|
|
108
|
+
},
|
|
109
|
+
"why": "Revenue bars are data marks, spaced by their own gaps."
|
|
110
|
+
},
|
|
111
|
+
"src/plugins/builtin/supply-chain/graph-pane.tsx": {
|
|
112
|
+
"literals": {
|
|
113
|
+
"radius": 1
|
|
114
|
+
},
|
|
115
|
+
"why": "A graph node's dot is a data mark."
|
|
116
|
+
},
|
|
117
|
+
"src/plugins/builtin/world-venue-map/geo-svg.tsx": {
|
|
118
|
+
"literals": {
|
|
119
|
+
"font weight": 1
|
|
120
|
+
},
|
|
121
|
+
"why": "Map labels are fitted to the map's shapes."
|
|
122
|
+
},
|
|
123
|
+
"src/plugins/builtin/world-venue-map/map.tsx": {
|
|
124
|
+
"literals": {
|
|
125
|
+
"radius": 1
|
|
126
|
+
},
|
|
127
|
+
"why": "A legend swatch is the series' line, drawn as a data mark."
|
|
128
|
+
},
|
|
129
|
+
"src/renderers/dom/build-assets.ts": {
|
|
130
|
+
"literals": {
|
|
131
|
+
"grey": 1
|
|
132
|
+
},
|
|
133
|
+
"why": "The page's background before the app's styles load."
|
|
134
|
+
},
|
|
135
|
+
"src/renderers/dom/desktop/controls.tsx": {
|
|
136
|
+
"literals": {
|
|
137
|
+
"font size": 1,
|
|
138
|
+
"grey": 4,
|
|
139
|
+
"spacing": 2
|
|
140
|
+
},
|
|
141
|
+
"why": "The checkbox's tick is white on the accent for contrast in every theme; the message composer (its size and padding) belongs to chat."
|
|
142
|
+
},
|
|
143
|
+
"src/renderers/dom/host/media-surface.tsx": {
|
|
144
|
+
"literals": {
|
|
145
|
+
"grey": 3
|
|
146
|
+
},
|
|
147
|
+
"why": "A video's letterbox is black in every theme."
|
|
148
|
+
},
|
|
149
|
+
"src/renderers/dom/host/overflow-fade.ts": {
|
|
150
|
+
"literals": {
|
|
151
|
+
"grey": 4
|
|
152
|
+
},
|
|
153
|
+
"why": "Black here is a mask's opacity, not a colour."
|
|
154
|
+
},
|
|
155
|
+
"src/renderers/dom/host/surface-3d.tsx": {
|
|
156
|
+
"literals": {
|
|
157
|
+
"grey": 1,
|
|
158
|
+
"radius": 2
|
|
159
|
+
},
|
|
160
|
+
"why": "The 3D surface's colour bar and probe are data marks."
|
|
161
|
+
},
|
|
162
|
+
"src/renderers/dom/styles.css": {
|
|
163
|
+
"literals": {
|
|
164
|
+
"font size": 2,
|
|
165
|
+
"grey": 9,
|
|
166
|
+
"radius": 1,
|
|
167
|
+
"spacing": 17
|
|
168
|
+
},
|
|
169
|
+
"why": "The root font size the tokens scale from, the fatal page drawn when the app could not start (its own size, button, spacing and fallbacks), theme fallbacks inside var(), Windows' red close button, the pane header's 7px beside its 1px edge, the 1px a band or bar leaves its hairline, the toast's own layout (indicator, heading, actions) and the call player's thumb centred on its track."
|
|
170
|
+
},
|
|
171
|
+
"src/renderers/share/styles.css": {
|
|
172
|
+
"literals": {
|
|
173
|
+
"font size": 8,
|
|
174
|
+
"grey": 2,
|
|
175
|
+
"radius": 2,
|
|
176
|
+
"spacing": 43
|
|
177
|
+
},
|
|
178
|
+
"why": "Share pages are a separate public page with their own styles."
|
|
179
|
+
},
|
|
180
|
+
"src/types/config.ts": {
|
|
181
|
+
"literals": {
|
|
182
|
+
"font size": 1
|
|
183
|
+
},
|
|
184
|
+
"why": "The default font size setting, a number of pixels the user changes."
|
|
185
|
+
}
|
|
186
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{
|
|
2
|
+
"ADJ": [
|
|
3
|
+
{
|
|
4
|
+
"measure": "inset",
|
|
5
|
+
"value": 0,
|
|
6
|
+
"component": "LevelLine",
|
|
7
|
+
"why": "Registry plugin (gloomberb-adjacent-indices): its detail's level line is its own code and is fixed in its repository."
|
|
8
|
+
}
|
|
9
|
+
],
|
|
10
|
+
"CFNG": [
|
|
11
|
+
{
|
|
12
|
+
"measure": "font size",
|
|
13
|
+
"value": 31,
|
|
14
|
+
"component": "SvgText",
|
|
15
|
+
"why": "Registry plugin (gloomberb-crypto-fear-greed): the gauge's figure is drawn to the gauge's size, a fitted chart label."
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"measure": "font weight",
|
|
19
|
+
"value": 800,
|
|
20
|
+
"component": "SvgText",
|
|
21
|
+
"why": "Registry plugin (gloomberb-crypto-fear-greed): the gauge's figure, as above."
|
|
22
|
+
}
|
|
23
|
+
],
|
|
24
|
+
"CHAT": [
|
|
25
|
+
{
|
|
26
|
+
"measure": "inset",
|
|
27
|
+
"value": 7.2,
|
|
28
|
+
"component": "PaneSidebarRow",
|
|
29
|
+
"why": "Chat has its own owner: its channel rows start 7px in (reported, not changed, in GLO-768)."
|
|
30
|
+
}
|
|
31
|
+
],
|
|
32
|
+
"FXMD_REST_HEALTH": [
|
|
33
|
+
{
|
|
34
|
+
"measure": "inset",
|
|
35
|
+
"value": 0,
|
|
36
|
+
"component": "ResearchPane",
|
|
37
|
+
"why": "Registry plugin (gloomberb-fxmacrodata): its results line is its own code and is fixed in its repository."
|
|
38
|
+
}
|
|
39
|
+
]
|
|
40
|
+
}
|