gloomberb 0.16.0 → 0.16.2
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 -1
- package/package.json +2 -1
- package/src/api-client/beneficial-owners.ts +92 -0
- package/src/api-client/data.ts +44 -11
- package/src/api-client/errors.ts +12 -0
- package/src/api-client/geo.ts +363 -0
- package/src/api-client/index.ts +5 -0
- package/src/api-client/market-discovery.ts +10 -0
- package/src/api-client/members.ts +26 -0
- package/src/api-client/paths.ts +30 -1
- package/src/api-client/perps.ts +41 -0
- package/src/api-client/request.ts +5 -2
- package/src/api-client/types.ts +9 -1
- package/src/app/global-shortcuts.ts +14 -6
- package/src/app/keybindings/actions.ts +1 -1
- package/src/app/runtime/update.ts +38 -2
- package/src/app.tsx +10 -6
- package/src/brokers/account-cache.ts +24 -0
- package/src/cli/commands/command-utils.ts +8 -0
- package/src/cli/commands/crypto-hints.ts +75 -0
- package/src/cli/commands/market.ts +414 -106
- package/src/cli/commands/overview.ts +77 -32
- package/src/cli/commands/ticker.ts +101 -43
- package/src/cli/desktop-pane-shot.ts +34 -4
- package/src/cli/freshness.ts +61 -0
- package/src/cli/help.ts +1 -0
- package/src/cli/helpers.ts +4 -8
- package/src/cli/index.ts +12 -2
- package/src/cli/listing-arg.ts +321 -0
- package/src/cli/pane-functions/access-gate.ts +42 -0
- package/src/cli/pane-functions/catalog.ts +28 -1
- package/src/cli/pane-functions/data.ts +3 -1
- package/src/cli/pane-functions/dom.ts +20 -2
- package/src/cli/pane-functions/freshness.ts +400 -0
- package/src/cli/pane-functions/function-help.ts +36 -22
- package/src/cli/pane-functions/headless.ts +39 -11
- package/src/cli/pane-functions/index.ts +15 -4
- package/src/cli/pane-functions/options.ts +3 -0
- package/src/cli/pane-functions/report.ts +4 -0
- package/src/cli/pane-functions/resolver.ts +35 -7
- package/src/cli/pane-functions/screenshot-evidence.ts +2 -0
- package/src/cli/pane-functions/screenshot.ts +7 -3
- package/src/cli/result.ts +41 -27
- package/src/cli/ticker-resolution.ts +7 -5
- package/src/components/chart/composite/composite-chart.tsx +88 -2536
- package/src/components/chart/composite/drawing-store.ts +59 -0
- package/src/components/chart/composite/legend.tsx +319 -0
- package/src/components/chart/composite/panel-bitmap.ts +139 -0
- package/src/components/chart/composite/panel-gestures.ts +59 -0
- package/src/components/chart/composite/panel-labels.ts +107 -0
- package/src/components/chart/composite/panel-surface.tsx +876 -0
- package/src/components/chart/composite/tool-catalog.ts +98 -0
- package/src/components/chart/composite/toolbar.tsx +186 -0
- package/src/components/chart/composite/tools.ts +8 -0
- package/src/components/chart/composite/use-composite-chart-keyboard.ts +703 -0
- package/src/components/chart/composite/use-composite-viewport.ts +143 -0
- package/src/components/command-bar/commands/collection.ts +5 -1
- package/src/components/command-bar/list/model.ts +5 -0
- package/src/components/command-bar/list/view.tsx +16 -3
- package/src/components/command-bar/pane-templates/workflow.ts +1 -0
- package/src/components/command-bar/routes/root/command-items.ts +9 -2
- package/src/components/command-bar/routes/root/plugin-install.ts +2 -2
- package/src/components/command-bar/routes/root/provider-search.ts +19 -5
- package/src/components/command-bar/routes/root/runtime.ts +14 -5
- package/src/components/command-bar/routes/ticker-search/actions.ts +5 -0
- package/src/components/command-bar/routes/ticker-search/results.ts +31 -5
- package/src/components/command-bar/routes/ticker-search/route.ts +2 -2
- package/src/components/command-bar/routing/actions.ts +2 -0
- package/src/components/command-bar/selection-runtime.ts +38 -0
- package/src/components/command-bar/surface/index.tsx +7 -2
- package/src/components/command-bar/workflow/ops.ts +1 -1
- package/src/components/command-bar/workflow/tickers.ts +6 -0
- package/src/components/data-table/view.tsx +29 -10
- package/src/components/feedback-dialog.tsx +2 -1
- package/src/components/form-modal/field-row.tsx +2 -2
- package/src/components/index.ts +2 -2
- package/src/components/layout/detached-pane-shell.tsx +6 -3
- package/src/components/layout/floating-pane.tsx +6 -0
- package/src/components/layout/header.tsx +24 -7
- package/src/components/layout/missing-pane.tsx +2 -2
- package/src/components/layout/pane/content.tsx +23 -10
- package/src/components/layout/pane/error-boundary.tsx +103 -0
- package/src/components/layout/pane/footer/registration.tsx +68 -23
- package/src/components/layout/pane/header.tsx +61 -28
- package/src/components/layout/pane/index.tsx +6 -0
- package/src/components/layout/pane/title.ts +31 -7
- package/src/components/layout/shell/drag/index.ts +6 -5
- package/src/components/layout/shell/drag/runtime.ts +3 -0
- package/src/components/layout/shell/index.tsx +6 -0
- package/src/components/layout/shell/menu.ts +2 -1
- package/src/components/layout/shell/pane/actions.ts +2 -1
- package/src/components/layout/shell/pane/layers.tsx +29 -10
- package/src/components/layout/shell/terminal-pointer-runtime.ts +24 -3
- package/src/components/layout/shell/ticker-link-menu.ts +23 -9
- package/src/components/metric-treemap/heat-surface.tsx +745 -0
- package/src/components/metric-treemap/heat-tiles.ts +228 -0
- package/src/components/metric-treemap/index.tsx +2 -0
- package/src/components/metric-treemap/layout.ts +8 -0
- package/src/components/metric-treemap/scene.ts +432 -0
- package/src/components/onboarding/onboarding-keyboard.ts +311 -0
- package/src/components/onboarding/onboarding-wizard.tsx +101 -788
- package/src/components/onboarding/use-onboarding-broker-form.ts +263 -0
- package/src/components/onboarding/use-onboarding-progress.ts +298 -0
- package/src/components/onboarding/use-onboarding-upgrade.ts +83 -0
- package/src/components/pane-settings-dialog/field-dialogs.tsx +1 -0
- package/src/components/ticker/list-table-view.tsx +13 -1
- package/src/components/toggle-list.tsx +38 -12
- package/src/components/ui/country-flag-art.tsx +449 -0
- package/src/components/ui/country-flag.tsx +41 -0
- package/src/components/ui/data-table/types.ts +13 -0
- package/src/components/ui/fields.tsx +8 -0
- package/src/components/ui/icon.tsx +2 -0
- package/src/components/ui/index.ts +4 -0
- package/src/components/ui/multi-select/dialog.tsx +108 -22
- package/src/components/ui/range-track.tsx +53 -0
- package/src/components/ui/status.tsx +8 -2
- package/src/components/ui/tabs.tsx +11 -4
- package/src/components/ui/text-prompt-dialog.tsx +4 -2
- package/src/core/state/app/types.ts +10 -1
- package/src/data/config/store/normalize.ts +17 -1
- package/src/i18n/es.ts +24 -4
- package/src/i18n/ja.ts +24 -4
- package/src/i18n/ko.ts +24 -4
- package/src/i18n/zh-cn.ts +24 -4
- package/src/i18n/zh-tw.ts +24 -4
- package/src/layout/ticker-navigation.ts +28 -2
- package/src/market-data/coordinator/chart.ts +1 -1
- package/src/market-data/coordinator/quotes.ts +23 -4
- package/src/market-data/fx-closes.ts +72 -0
- package/src/market-data/market/freshness.ts +78 -6
- package/src/market-data/market/session-close-note.ts +57 -0
- package/src/market-data/market/status.ts +151 -0
- package/src/market-data/published-apac-sessions.ts +66 -0
- package/src/market-data/quotes/contributions.ts +8 -0
- package/src/market-data/quotes/freshness.ts +36 -0
- package/src/market-data/quotes/resolution.ts +24 -8
- package/src/market-data/quotes/screener-live-quotes.ts +49 -4
- package/src/market-data/quotes/time.ts +16 -0
- package/src/plugins/builtin/account-management/pane.tsx +4 -0
- package/src/plugins/builtin/alerts/cli.ts +10 -5
- package/src/plugins/builtin/alerts/index.tsx +1 -0
- package/src/plugins/builtin/analytics/metrics.ts +8 -3
- package/src/plugins/builtin/analytics/risk-client.ts +330 -79
- package/src/plugins/builtin/analytics/risk-fx.ts +102 -0
- package/src/plugins/builtin/analytics/risk-headless.ts +61 -49
- package/src/plugins/builtin/analytics/risk-math.ts +33 -13
- package/src/plugins/builtin/analytics/risk-model.ts +282 -64
- package/src/plugins/builtin/analytics/risk-pane.tsx +62 -30
- package/src/plugins/builtin/analytics/risk-test-data.ts +206 -0
- package/src/plugins/builtin/attention/headless.ts +6 -4
- package/src/plugins/builtin/attention/index.tsx +1 -1
- package/src/plugins/builtin/attention/pane.tsx +1 -1
- package/src/plugins/builtin/awards/headless.ts +1 -0
- package/src/plugins/builtin/awards/pane.tsx +1 -1
- package/src/plugins/builtin/backtest/headless.ts +1 -0
- package/src/plugins/builtin/bond-calculator/headless.ts +1 -0
- package/src/plugins/builtin/buildout/cells.tsx +15 -12
- package/src/plugins/builtin/buildout/detail/company.tsx +3 -3
- package/src/plugins/builtin/buildout/detail/index.tsx +0 -1
- package/src/plugins/builtin/buildout/detail/intel.tsx +6 -6
- package/src/plugins/builtin/buildout/detail/site.tsx +4 -7
- package/src/plugins/builtin/buildout/detail/ui.tsx +0 -19
- package/src/plugins/builtin/buildout/index.tsx +1 -0
- package/src/plugins/builtin/catalysts/headless.ts +3 -1
- package/src/plugins/builtin/catalysts/index.tsx +2 -2
- package/src/plugins/builtin/catalysts/pane.tsx +3 -1
- package/src/plugins/builtin/cds/headless.ts +2 -0
- package/src/plugins/builtin/cds/index.tsx +1 -0
- package/src/plugins/builtin/central-bank-rates/headless.ts +1 -0
- package/src/plugins/builtin/chart-composer/headless.ts +38 -3
- package/src/plugins/builtin/chart-composer/index.tsx +3 -1
- package/src/plugins/builtin/chart-composer/series-expression.ts +18 -2
- package/src/plugins/builtin/chat/channels.ts +19 -3
- package/src/plugins/builtin/chat/content/composer-runtime.ts +28 -13
- package/src/plugins/builtin/chat/content/footer.tsx +15 -6
- package/src/plugins/builtin/chat/content/index.tsx +120 -21
- package/src/plugins/builtin/chat/content/new-dm-dialog.tsx +261 -113
- package/src/plugins/builtin/chat/content/transcript.tsx +20 -2
- package/src/plugins/builtin/chat/direct-messages.ts +200 -0
- package/src/plugins/builtin/chat/index.tsx +1 -0
- package/src/plugins/builtin/chat/message/desktop.tsx +3 -0
- package/src/plugins/builtin/chat/message/header.tsx +16 -6
- package/src/plugins/builtin/chat/message/inline-tokens.tsx +72 -32
- package/src/plugins/builtin/chat/message/profile-popover.tsx +96 -12
- package/src/plugins/builtin/chat/message/terminal.tsx +3 -0
- package/src/plugins/builtin/chat/message/types.ts +14 -2
- package/src/plugins/builtin/chat/profile-popover.ts +18 -13
- package/src/plugins/builtin/clinical-trials/index.tsx +1 -0
- package/src/plugins/builtin/cloud/askg/executor.ts +2 -1
- package/src/plugins/builtin/cloud/plugin.tsx +1 -0
- package/src/plugins/builtin/cloud/team/module.tsx +1 -0
- package/src/plugins/builtin/cloud/thesis/module.tsx +1 -0
- package/src/plugins/builtin/cloud-tweets/registration.ts +1 -0
- package/src/plugins/builtin/comment-letters/index.tsx +1 -0
- package/src/plugins/builtin/company-attention/headless.ts +5 -1
- package/src/plugins/builtin/company-attention/pane.tsx +1 -1
- package/src/plugins/builtin/company-kpis/headless.ts +1 -0
- package/src/plugins/builtin/congress-trades/headless.ts +1 -0
- package/src/plugins/builtin/correlation/compute.ts +59 -16
- package/src/plugins/builtin/correlation/geo.ts +34 -0
- package/src/plugins/builtin/correlation/headless-schema.ts +4 -1
- package/src/plugins/builtin/correlation/headless.ts +42 -8
- package/src/plugins/builtin/correlation/history.ts +2 -0
- package/src/plugins/builtin/correlation/index.tsx +68 -14
- package/src/plugins/builtin/correlation/matrix/model.ts +17 -2
- package/src/plugins/builtin/correlation/matrix/selection.ts +5 -3
- package/src/plugins/builtin/correlation/relationship/model.ts +1 -1
- package/src/plugins/builtin/correlation/relationship/pane.tsx +4 -2
- package/src/plugins/builtin/correlation/relationship/view-model.ts +16 -1
- package/src/plugins/builtin/correlation/settings.ts +1 -1
- package/src/plugins/builtin/cot/headless.ts +6 -3
- package/src/plugins/builtin/cot/index.tsx +3 -3
- package/src/plugins/builtin/cot/model.ts +36 -3
- package/src/plugins/builtin/cpi/headless.ts +4 -0
- package/src/plugins/builtin/credit-boards/headless.ts +2 -0
- package/src/plugins/builtin/credit-conditions/headless.ts +1 -0
- package/src/plugins/builtin/credit-documents/gauge.tsx +5 -8
- package/src/plugins/builtin/credit-documents/headless.ts +2 -0
- package/src/plugins/builtin/crypto-board/headless.ts +3 -0
- package/src/plugins/builtin/custom-view/loader.ts +1 -1
- package/src/plugins/builtin/debt-maturities/headless.ts +4 -0
- package/src/plugins/builtin/debt-maturities/wall-bar.tsx +14 -41
- package/src/plugins/builtin/dividend-yield/client.ts +4 -2
- package/src/plugins/builtin/dividend-yield/headless.ts +1 -0
- package/src/plugins/builtin/doe/headless.ts +7 -0
- package/src/plugins/builtin/doe/range-bar.tsx +7 -37
- package/src/plugins/builtin/earnings/client.ts +2 -2
- package/src/plugins/builtin/earnings/headless.ts +5 -0
- package/src/plugins/builtin/earnings-calls/headless.ts +1 -0
- package/src/plugins/builtin/earnings-calls/index.tsx +1 -0
- package/src/plugins/builtin/earnings-ripple/client.ts +91 -18
- package/src/plugins/builtin/earnings-ripple/headless.ts +28 -8
- package/src/plugins/builtin/earnings-ripple/index.tsx +2 -2
- package/src/plugins/builtin/earnings-ripple/model.ts +97 -7
- package/src/plugins/builtin/earnings-ripple/pane.tsx +148 -23
- package/src/plugins/builtin/econ/index.tsx +1 -0
- package/src/plugins/builtin/econ-statistics/headless.ts +2 -0
- package/src/plugins/builtin/equity-screener/headless.ts +2 -0
- package/src/plugins/builtin/estimate-revisions/headless.ts +1 -0
- package/src/plugins/builtin/executives/index.tsx +1 -0
- package/src/plugins/builtin/exposure/headless.ts +3 -1
- package/src/plugins/builtin/fear-greed/headless.ts +2 -0
- package/src/plugins/builtin/filing-events/index.tsx +1 -0
- package/src/plugins/builtin/futures-curve/client.ts +12 -3
- package/src/plugins/builtin/futures-curve/headless.ts +39 -10
- package/src/plugins/builtin/futures-curve/index.tsx +3 -3
- package/src/plugins/builtin/futures-curve/model.ts +188 -4
- package/src/plugins/builtin/futures-curve/pane.tsx +51 -9
- package/src/plugins/builtin/fx-matrix/direction.ts +81 -0
- package/src/plugins/builtin/fx-matrix/index.tsx +71 -33
- package/src/plugins/builtin/fx-matrix/live-legs.ts +17 -0
- package/src/plugins/builtin/fx-matrix/pairs.ts +68 -14
- package/src/plugins/builtin/fx-matrix/settings.ts +62 -0
- package/src/plugins/builtin/gpu/headless.ts +7 -3
- package/src/plugins/builtin/gpu/ladder.tsx +26 -30
- package/src/plugins/builtin/gpu/model.ts +27 -1
- package/src/plugins/builtin/holders/beneficial-client.ts +209 -0
- package/src/plugins/builtin/holders/beneficial-model.ts +279 -0
- package/src/plugins/builtin/holders/beneficial-report.ts +126 -0
- package/src/plugins/builtin/holders/beneficial-view.tsx +241 -0
- package/src/plugins/builtin/holders/headless.ts +139 -5
- package/src/plugins/builtin/holders/index.tsx +10 -3
- package/src/plugins/builtin/holders/pane.tsx +20 -3
- package/src/plugins/builtin/holders/report-header.ts +95 -0
- package/src/plugins/builtin/holders/table-model.ts +20 -5
- package/src/plugins/builtin/holders/thirteenf-match.ts +29 -1
- package/src/plugins/builtin/holders/types.ts +2 -1
- package/src/plugins/builtin/insider/headless.ts +2 -0
- package/src/plugins/builtin/ipo-calendar/headless.ts +1 -0
- package/src/plugins/builtin/iv-history/headless.ts +4 -1
- package/src/plugins/builtin/jobs/headless.ts +1 -0
- package/src/plugins/builtin/jobs/index.tsx +1 -0
- package/src/plugins/builtin/jobs/share-bars.tsx +5 -28
- package/src/plugins/builtin/kelly-sizer/index.tsx +1 -0
- package/src/plugins/builtin/macro-day/headless.ts +2 -0
- package/src/plugins/builtin/market-halts/index.tsx +1 -0
- package/src/plugins/builtin/market-heatmap/data.ts +30 -2
- package/src/plugins/builtin/market-heatmap/headless.ts +135 -0
- package/src/plugins/builtin/market-heatmap/index.tsx +245 -81
- package/src/plugins/builtin/market-heatmap/live.ts +88 -0
- package/src/plugins/builtin/market-heatmap/model.ts +146 -0
- package/src/plugins/builtin/market-heatmap/portfolio.ts +50 -11
- package/src/plugins/builtin/market-movers/client.ts +3 -2
- package/src/plugins/builtin/market-movers/headless.ts +10 -1
- package/src/plugins/builtin/market-movers/screener.ts +18 -5
- package/src/plugins/builtin/market-valuation/headless.ts +2 -0
- package/src/plugins/builtin/members/client.ts +53 -0
- package/src/plugins/builtin/members/headless.ts +35 -0
- package/src/plugins/builtin/members/index.tsx +20 -0
- package/src/plugins/builtin/members/model.ts +68 -0
- package/src/plugins/builtin/members/pane.tsx +175 -0
- package/src/plugins/builtin/mna/distress/headless.ts +1 -0
- package/src/plugins/builtin/mna/headless.ts +1 -0
- package/src/plugins/builtin/mna/index.tsx +2 -1
- package/src/plugins/builtin/mna/pane.tsx +5 -2
- package/src/plugins/builtin/money-markets/headless.ts +1 -0
- package/src/plugins/builtin/news/headless.ts +2 -0
- package/src/plugins/builtin/news/wire/index.tsx +8 -1
- package/src/plugins/builtin/notes/cli.ts +14 -6
- package/src/plugins/builtin/notes/index.tsx +1 -0
- package/src/plugins/builtin/openfda/index.tsx +1 -0
- package/src/plugins/builtin/options/index.tsx +2 -1
- package/src/plugins/builtin/options-calculator/headless.ts +2 -0
- package/src/plugins/builtin/options-positioning/headless.ts +3 -0
- package/src/plugins/builtin/options-scenario/headless.ts +5 -0
- package/src/plugins/builtin/pe-band/client.ts +74 -2
- package/src/plugins/builtin/pe-band/headless.ts +26 -8
- package/src/plugins/builtin/pe-band/model.ts +102 -22
- package/src/plugins/builtin/pe-band/pane.tsx +34 -16
- package/src/plugins/builtin/pe-band/report-dates.ts +78 -0
- package/src/plugins/builtin/perps/client.ts +66 -5
- package/src/plugins/builtin/perps/equity-identity.ts +16 -0
- package/src/plugins/builtin/perps/equity-row.tsx +6 -4
- package/src/plugins/builtin/perps/headless.ts +144 -16
- package/src/plugins/builtin/perps/index.tsx +6 -6
- package/src/plugins/builtin/perps/model.ts +189 -12
- package/src/plugins/builtin/perps/pane.tsx +248 -47
- package/src/plugins/builtin/plugin-marketplace/activation.ts +19 -0
- package/src/plugins/builtin/plugin-marketplace/pane.tsx +2 -2
- package/src/plugins/builtin/plugin-marketplace/store.ts +2 -0
- package/src/plugins/builtin/portfolio-list/allocation.ts +245 -0
- package/src/plugins/builtin/portfolio-list/cached-account.ts +33 -0
- package/src/plugins/builtin/portfolio-list/cell-version.ts +19 -1
- package/src/plugins/builtin/portfolio-list/cli/portfolio-command.ts +328 -29
- package/src/plugins/builtin/portfolio-list/cli/render.ts +230 -39
- package/src/plugins/builtin/portfolio-list/cli/shared.ts +67 -2
- package/src/plugins/builtin/portfolio-list/cli/watchlist-command.ts +35 -31
- package/src/plugins/builtin/portfolio-list/column-values.ts +124 -47
- package/src/plugins/builtin/portfolio-list/headless.ts +98 -16
- package/src/plugins/builtin/portfolio-list/index.tsx +14 -3
- package/src/plugins/builtin/portfolio-list/live-valuation.ts +7 -5
- package/src/plugins/builtin/portfolio-list/mutations.ts +55 -1
- package/src/plugins/builtin/portfolio-list/pane/data.ts +6 -0
- package/src/plugins/builtin/portfolio-list/pane/index.tsx +47 -13
- package/src/plugins/builtin/portfolio-list/quick-add/index.tsx +43 -2
- package/src/plugins/builtin/portfolio-list/quick-add/resolution.ts +48 -5
- package/src/plugins/builtin/portfolio-list/settings.ts +33 -2
- package/src/plugins/builtin/portfolio-list/summary/index.tsx +24 -1
- package/src/plugins/builtin/portfolio-list/summary/totals.ts +26 -7
- package/src/plugins/builtin/power/headless.ts +3 -1
- package/src/plugins/builtin/rate-path/headless.ts +2 -0
- package/src/plugins/builtin/realized-vol/headless.ts +2 -0
- package/src/plugins/builtin/relative-rotation/headless.ts +2 -0
- package/src/plugins/builtin/research/analyst-headless.ts +3 -0
- package/src/plugins/builtin/research/events-headless.ts +2 -0
- package/src/plugins/builtin/research/headless.ts +2 -0
- package/src/plugins/builtin/research/index.tsx +1 -0
- package/src/plugins/builtin/research/relative-valuation-headless.ts +10 -5
- package/src/plugins/builtin/research/relative-valuation-model.ts +11 -3
- package/src/plugins/builtin/research/relative-valuation-pane.tsx +3 -3
- package/src/plugins/builtin/research-search/index.tsx +1 -0
- package/src/plugins/builtin/revenue-breakdown/headless.ts +2 -0
- package/src/plugins/builtin/reverse-dcf/headless.ts +2 -0
- package/src/plugins/builtin/risk-factors/headless.ts +2 -0
- package/src/plugins/builtin/scanner/flow-history.ts +2 -13
- package/src/plugins/builtin/scanner/headless.ts +14 -0
- package/src/plugins/builtin/scanner/hilo-bars.tsx +12 -70
- package/src/plugins/builtin/scanner/hilo-model.ts +0 -18
- package/src/plugins/builtin/seasonality/headless.ts +2 -0
- package/src/plugins/builtin/sec/command-bar-search.ts +14 -4
- package/src/plugins/builtin/sec/filing-content.ts +42 -17
- package/src/plugins/builtin/sec/forms.ts +12 -0
- package/src/plugins/builtin/sec/headless.ts +2 -0
- package/src/plugins/builtin/sectors/client.ts +1 -0
- package/src/plugins/builtin/sectors/headless.ts +9 -1
- package/src/plugins/builtin/sectors/move-bar.tsx +10 -32
- package/src/plugins/builtin/sectors/sector-model.ts +2 -0
- package/src/plugins/builtin/shared/crypto-pair.ts +14 -0
- package/src/plugins/builtin/shared/locked-rows.tsx +1 -1
- package/src/plugins/builtin/shared/report-freshness.ts +57 -0
- package/src/plugins/builtin/shared/research-cells.tsx +4 -9
- package/src/plugins/builtin/short-interest/headless.ts +2 -0
- package/src/plugins/builtin/short-interest/watch-headless.ts +1 -0
- package/src/plugins/builtin/short-volume/headless.ts +1 -0
- package/src/plugins/builtin/social-mentions/headless.ts +1 -0
- package/src/plugins/builtin/social-mentions/index.tsx +1 -1
- package/src/plugins/builtin/supply-chain/headless.ts +7 -1
- package/src/plugins/builtin/supply-chain/index.tsx +10 -1
- package/src/plugins/builtin/supply-chain/model.ts +27 -2
- package/src/plugins/builtin/supply-chain/pane.tsx +71 -32
- package/src/plugins/builtin/themes/headless.ts +3 -0
- package/src/plugins/builtin/thirteenf/headless.ts +110 -25
- package/src/plugins/builtin/thirteenf/index.tsx +2 -1
- package/src/plugins/builtin/thirteenf/report-notes.ts +149 -0
- package/src/plugins/builtin/ticker-detail/headless.ts +7 -1
- package/src/plugins/builtin/ticker-detail/index.tsx +1 -0
- package/src/plugins/builtin/ticker-detail/overview/components.tsx +5 -60
- package/src/plugins/builtin/ticker-detail/overview/model.ts +9 -2
- package/src/plugins/builtin/ticker-detail/overview/pane.tsx +1 -1
- package/src/plugins/builtin/ticker-detail/overview-tab.tsx +26 -26
- package/src/plugins/builtin/ticker-detail/pane.tsx +1 -1
- package/src/plugins/builtin/ticker-detail/quote-footer.ts +7 -1
- package/src/plugins/builtin/ticker-detail/quote-monitor/card.tsx +20 -4
- package/src/plugins/builtin/ticker-detail/quote-monitor/index.tsx +2 -2
- package/src/plugins/builtin/time-sales/headless.ts +5 -1
- package/src/plugins/builtin/treasury-auctions/headless.ts +1 -0
- package/src/plugins/builtin/vol-surface/index.tsx +1 -1
- package/src/plugins/builtin/volatility/headless.ts +6 -1
- package/src/plugins/builtin/world-indices/headless.ts +2 -0
- package/src/plugins/builtin/world-venue-map/basemap-layer.tsx +157 -0
- package/src/plugins/builtin/world-venue-map/basemap.ts +214 -0
- package/src/plugins/builtin/world-venue-map/client.ts +45 -0
- package/src/plugins/builtin/world-venue-map/entity-detail.tsx +147 -0
- package/src/plugins/builtin/world-venue-map/entity-table.ts +59 -0
- package/src/plugins/builtin/world-venue-map/evidence.ts +77 -0
- package/src/plugins/builtin/world-venue-map/feed.ts +293 -0
- package/src/plugins/builtin/world-venue-map/geo-draw.tsx +248 -0
- package/src/plugins/builtin/world-venue-map/geo-series.ts +142 -0
- package/src/plugins/builtin/world-venue-map/geo-svg.tsx +447 -0
- package/src/plugins/builtin/world-venue-map/headless.ts +146 -0
- package/src/plugins/builtin/world-venue-map/ids.ts +1 -0
- package/src/plugins/builtin/world-venue-map/index.ts +67 -4
- package/src/plugins/builtin/world-venue-map/layered-pane.tsx +552 -0
- package/src/plugins/builtin/world-venue-map/layers.ts +348 -0
- package/src/plugins/builtin/world-venue-map/map-symbols.ts +220 -0
- package/src/plugins/builtin/world-venue-map/map.tsx +381 -45
- package/src/plugins/builtin/world-venue-map/model.ts +7 -4
- package/src/plugins/builtin/world-venue-map/natural-earth/index.chunk.ts +199 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e000n00.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e000n15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e000n30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e000n45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e000n60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e000n75.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e000s15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e000s30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e000s60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e015n00.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e015n15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e015n30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e015n45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e015n60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e015n75.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e015s15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e015s30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e015s45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e030n00.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e030n15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e030n30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e030n45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e030n60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e030n75.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e030s15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e030s30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e030s45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e030s60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e045n00.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e045n15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e045n30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e045n45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e045n60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e045n75.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e045s15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e045s30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e045s60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e060n00.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e060n15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e060n30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e060n45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e060n60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e060n75.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e060s15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e060s30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e060s60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e075n00.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e075n15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e075n30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e075n45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e075n60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e075n75.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e075s45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e090n00.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e090n15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e090n30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e090n45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e090n60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e090n75.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e090s15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e105n00.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e105n15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e105n30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e105n45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e105n60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e105n75.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e105s15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e105s30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e105s45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e120n00.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e120n15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e120n30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e120n45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e120n60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e120s15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e120s30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e120s45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e135n00.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e135n15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e135n30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e135n45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e135n60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e135n75.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e135s15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e135s30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e135s45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e150n00.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e150n15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e150n45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e150n60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e150n75.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e150s15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e150s30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e150s45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e150s60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e165n00.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e165n15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e165n45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e165n60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e165s15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e165s30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e165s45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e165s60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w015n00.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w015n15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w015n30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w015n45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w015n60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w015n75.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w015s15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w015s30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w015s45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w030n00.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w030n15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w030n30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w030n60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w030n75.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w030s30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w030s60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w045n30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w045n45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w045n60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w045n75.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w045s15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w045s30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w045s60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w060n00.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w060n30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w060n45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w060n60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w060n75.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w060s15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w060s30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w060s45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w060s60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w075n00.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w075n15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w075n30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w075n45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w075n60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w075n75.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w075s15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w075s30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w075s45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w075s60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w090n00.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w090n15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w090n30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w090n45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w090n60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w090n75.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w090s15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w090s30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w090s45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w090s60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w105n00.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w105n15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w105n30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w105n45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w105n60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w105n75.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w105s15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w120n00.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w120n15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w120n30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w120n45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w120n60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w120n75.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w120s30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w135n30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w135n45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w135n60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w135n75.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w135s30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w150n45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w150n60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w150s15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w150s30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w165n00.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w165n15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w165n45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w165n60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w165s15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w165s30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w180n00.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w180n15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w180n45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w180n60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w180s15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w180s30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w180s45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/world-50m.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/pane.tsx +28 -43
- package/src/plugins/builtin/world-venue-map/use-geo.ts +55 -0
- package/src/plugins/builtin/world-venue-map/venue-header.tsx +32 -0
- package/src/plugins/builtin/yield-curve/headless.ts +16 -0
- package/src/plugins/catalog-browser.ts +2 -0
- package/src/plugins/catalog-manifest.ts +1 -0
- package/src/plugins/catalog-ui.ts +3 -1
- package/src/plugins/catalog.ts +1 -1
- package/src/plugins/host-link.ts +33 -1
- package/src/plugins/installer.ts +48 -12
- package/src/plugins/loader.ts +30 -3
- package/src/plugins/manager-node.ts +15 -5
- package/src/plugins/registry/index.ts +1 -1
- package/src/plugins/registry/pane-settings.ts +26 -7
- package/src/public/__snapshots__/public-api.test.ts.snap +2 -0
- package/src/renderers/dom/build-assets.ts +81 -3
- package/src/renderers/dom/data-table/row.tsx +52 -16
- package/src/renderers/dom/desktop/controls.tsx +7 -3
- package/src/renderers/dom/desktop/icons.tsx +1 -0
- package/src/renderers/dom/desktop/list-view.tsx +35 -10
- package/src/renderers/dom/desktop/popover.tsx +73 -14
- package/src/renderers/dom/host/box.tsx +69 -26
- package/src/renderers/dom/host/input.tsx +14 -3
- package/src/renderers/dom/host/tabs.tsx +37 -1
- package/src/renderers/dom/styles.css +41 -7
- package/src/renderers/electrobun/bun/desktop/backend-requests.ts +11 -6
- package/src/renderers/electrobun/bun/desktop/backend.ts +1 -0
- package/src/renderers/electrobun/bun/desktop/update.ts +181 -87
- package/src/renderers/electrobun/bun/index.ts +73 -6
- package/src/renderers/electrobun/bun/window/remembered-frame.ts +122 -0
- package/src/renderers/electrobun/shared/protocol.ts +3 -0
- package/src/renderers/electrobun/view/backend-rpc.ts +10 -4
- package/src/renderers/electrobun/view/cli-pane-shot-entry.tsx +3 -1
- package/src/renderers/electrobun/view/main.tsx +7 -1
- package/src/renderers/electrobun/view/renderer-window-error.ts +18 -0
- package/src/renderers/electrobun/view/rpc-timeout.ts +14 -3
- package/src/renderers/electrobun/view/update-host.ts +45 -21
- package/src/renderers/opentui/host.tsx +5 -0
- package/src/sources/gloomberb-cloud/index.ts +25 -4
- package/src/sources/gloomberb-cloud/normalizers.ts +36 -5
- package/src/sources/provider-router/cached-routes.ts +4 -1
- package/src/sources/provider-router/financials.ts +11 -8
- package/src/sources/provider-router/history.ts +15 -10
- package/src/sources/sec-registrant.ts +75 -0
- package/src/state/app/context/index.tsx +24 -8
- package/src/state/hooks/quote-streaming.ts +41 -26
- package/src/sync/core-contributors.ts +4 -0
- package/src/telemetry/benign-window-error.ts +7 -0
- package/src/telemetry/crash-reports-dom.ts +2 -0
- package/src/telemetry/crash-reports.ts +4 -1
- package/src/test-support/cli-context.ts +10 -2
- package/src/test-support/daily-nav.ts +25 -0
- package/src/theme/heat-colors.ts +357 -2
- package/src/tickers/instrument-kind.ts +34 -7
- package/src/tickers/search/asset-classes.ts +24 -9
- package/src/tickers/search/index.ts +44 -11
- package/src/tickers/search/ranking.ts +23 -3
- package/src/time-series/resolve.ts +1 -1
- package/src/time-series/use-chart-resolution.ts +1 -1
- package/src/types/context-menu.ts +6 -0
- package/src/types/data-provider.ts +2 -0
- package/src/types/financials.ts +5 -0
- package/src/types/headless.ts +79 -2
- package/src/types/plugin.ts +38 -6
- package/src/types/ticker.ts +15 -0
- package/src/ui/context-menu.tsx +1 -0
- package/src/ui/host.tsx +16 -0
- package/src/updater/index.ts +38 -13
- package/src/utils/async-deadline.ts +21 -0
- package/src/utils/cli-output.ts +5 -1
- package/src/utils/crypto-pair.ts +41 -0
- package/src/utils/currency-units.ts +14 -0
- package/src/utils/depositary-receipt.ts +26 -0
- package/src/utils/exchanges.ts +72 -0
- package/src/utils/fire-and-forget.ts +24 -0
- package/src/utils/format.ts +13 -0
- package/src/utils/price-earnings.ts +70 -3
- package/src/utils/price-history.ts +58 -13
- package/src/utils/rpc-timeout-error.ts +27 -0
- package/src/utils/sec.ts +13 -1
- package/src/utils/utc-time.ts +79 -0
|
@@ -184,7 +184,7 @@ function createProviderTickerSearchCandidates(
|
|
|
184
184
|
}
|
|
185
185
|
|
|
186
186
|
export async function searchTickerCandidates({
|
|
187
|
-
query,
|
|
187
|
+
query: rawQuery,
|
|
188
188
|
tickers,
|
|
189
189
|
dataProvider,
|
|
190
190
|
searchContext,
|
|
@@ -203,6 +203,7 @@ export async function searchTickerCandidates({
|
|
|
203
203
|
/** Called when a slower, richer source improves results already returned. */
|
|
204
204
|
onPartial?: (candidates: TickerSearchCandidate[]) => void;
|
|
205
205
|
}): Promise<TickerSearchCandidate[]> {
|
|
206
|
+
const query = symbolSearchQuery(rawQuery);
|
|
206
207
|
const assemble = (providerResults: InstrumentSearchResult[]) => buildTickerSearchCandidates({
|
|
207
208
|
query,
|
|
208
209
|
tickers,
|
|
@@ -261,17 +262,42 @@ interface ResolveTickerSearchOptions {
|
|
|
261
262
|
searchContext?: SearchRequestContext;
|
|
262
263
|
}
|
|
263
264
|
|
|
265
|
+
/** `NET:` asks which NET. `NET:N` narrows that list. `NET:XNYS` already names one. */
|
|
266
|
+
const LISTING_PICKER_QUERY = /^[A-Z0-9][A-Z0-9.\-]{0,20}:$/;
|
|
267
|
+
const LISTING_CHOICE_QUERY = /^([A-Z0-9][A-Z0-9.\-]{0,20}):([A-Z0-9.\-]*)$/;
|
|
268
|
+
|
|
269
|
+
function isListingPickerQuery(query: string): boolean {
|
|
270
|
+
return LISTING_PICKER_QUERY.test(query.trim().toUpperCase());
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
/** `NET:` and `NET:N` name a symbol plus the exchange prefix still being typed. */
|
|
274
|
+
export function listingChoiceQuery(query: string): { symbol: string; suffix: string } | null {
|
|
275
|
+
const match = LISTING_CHOICE_QUERY.exec(query.trim().toUpperCase());
|
|
276
|
+
if (!match?.[1]) return null;
|
|
277
|
+
return { symbol: match[1], suffix: match[2] ?? "" };
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
/** Search text for a ticker query. A trailing colon searches the symbol it qualifies. */
|
|
281
|
+
export function symbolSearchQuery(query: string): string {
|
|
282
|
+
const trimmed = query.trim();
|
|
283
|
+
if (!isListingPickerQuery(trimmed)) return trimmed;
|
|
284
|
+
return trimmed.slice(0, -1).toUpperCase();
|
|
285
|
+
}
|
|
286
|
+
|
|
264
287
|
export function resolveTickerSearch(options: ResolveTickerSearchOptions): Promise<ResolvedTickerSearch | null> {
|
|
265
|
-
const
|
|
266
|
-
if (!
|
|
267
|
-
|
|
268
|
-
const
|
|
288
|
+
const requested = normalizeTickerInput(options.activeTicker, options.query);
|
|
289
|
+
if (!requested) return Promise.resolve(null);
|
|
290
|
+
// `NET:` lists NET's venues instead of settling on one.
|
|
291
|
+
const pickListing = isListingPickerQuery(requested);
|
|
292
|
+
const symbol = symbolSearchQuery(requested);
|
|
293
|
+
const literal = resolveTickerSymbol(symbol, options, pickListing ? requested : null);
|
|
294
|
+
const alternatives = pickListing ? [] : dottedVenueQueries(symbol);
|
|
269
295
|
// Most input has no venue code to retry: hand back the literal lookup
|
|
270
296
|
// itself, so it settles no later than it did before the retry existed.
|
|
271
297
|
if (alternatives.length === 0) return literal;
|
|
272
298
|
return literal.then(async (resolved) => {
|
|
273
299
|
for (const alternative of resolved ? [] : alternatives) {
|
|
274
|
-
const match = await resolveTickerSymbol(alternative, options);
|
|
300
|
+
const match = await resolveTickerSymbol(alternative, options, null);
|
|
275
301
|
if (match) return match;
|
|
276
302
|
}
|
|
277
303
|
return resolved;
|
|
@@ -281,6 +307,8 @@ export function resolveTickerSearch(options: ResolveTickerSearchOptions): Promis
|
|
|
281
307
|
async function resolveTickerSymbol(
|
|
282
308
|
symbol: string,
|
|
283
309
|
{ tickers, dataProvider, searchContext }: ResolveTickerSearchOptions,
|
|
310
|
+
/** The `NET:` text that asked for every venue, or null to settle on one. */
|
|
311
|
+
pickerQuery: string | null,
|
|
284
312
|
): Promise<ResolvedTickerSearch | null> {
|
|
285
313
|
const local = tickers.get(symbol)
|
|
286
314
|
?? findExactTickerSearchMatch(createLocalTickerSearchCandidates(tickers.values()), symbol)?.ticker
|
|
@@ -292,8 +320,10 @@ async function resolveTickerSymbol(
|
|
|
292
320
|
}));
|
|
293
321
|
if (contracts.size > 1) throw new AmbiguousContractError(symbol,
|
|
294
322
|
[...contracts.values()].map((contract) => tickerInstrumentLabel(local.metadata.ticker, contract)));
|
|
295
|
-
return { kind: "local", symbol: local.metadata.ticker, ticker: local };
|
|
296
323
|
}
|
|
324
|
+
// A saved symbol keeps its company. The colon still offers the others.
|
|
325
|
+
const saved: ResolvedTickerSearch | null = local ? { kind: "local", symbol: local.metadata.ticker, ticker: local } : null;
|
|
326
|
+
if (saved && !pickerQuery) return saved;
|
|
297
327
|
|
|
298
328
|
const providerItems = createProviderTickerSearchCandidates(
|
|
299
329
|
await searchProviderResults(dataProvider, symbol, searchContext),
|
|
@@ -303,13 +333,18 @@ async function resolveTickerSymbol(
|
|
|
303
333
|
const matches = literalMatches.length ? literalMatches
|
|
304
334
|
: providerItems.filter((item) => findExactTickerSearchMatch([item], symbol));
|
|
305
335
|
let exactMatch = matches[0];
|
|
306
|
-
if (!exactMatch?.result) return
|
|
336
|
+
if (!exactMatch?.result) return saved;
|
|
307
337
|
|
|
308
338
|
const contracts = new Set(matches.map((item) => item.contractKey).filter(Boolean));
|
|
309
339
|
if (contracts.size > 1 || (contracts.size && matches.some((item) => !item.contractKey))) {
|
|
310
340
|
throw new AmbiguousContractError(symbol, matches.map((item) => tickerInstrumentLabel(item.symbol, item.result?.brokerContract)));
|
|
311
341
|
}
|
|
312
342
|
const listings = new Set(matches.map((item) => publicTickerKey(item.symbol, listingExchange(item.result!))));
|
|
343
|
+
const ambiguity = (query: string) => new AmbiguousTickerError(query, [...listings], Object.fromEntries(matches.map((item) => [
|
|
344
|
+
publicTickerKey(item.symbol, listingExchange(item.result!)), item.result!.name,
|
|
345
|
+
])));
|
|
346
|
+
if (pickerQuery && listings.size > 1) throw ambiguity(pickerQuery);
|
|
347
|
+
if (saved) return saved;
|
|
313
348
|
if (listings.size > 1 && !parsePublicTickerKey(symbol).exchange && !tickerHasListingSuffix(symbol)) {
|
|
314
349
|
// Search order is relevance, not a canonical listing identifier. Align bare
|
|
315
350
|
// symbols with the quote source only when it supplies the exact identity.
|
|
@@ -336,9 +371,7 @@ async function resolveTickerSymbol(
|
|
|
336
371
|
// An unavailable quote cannot establish the default listing.
|
|
337
372
|
}
|
|
338
373
|
if (new Set(verified.map((item) => publicTickerKey(item.symbol, listingExchange(item.result!)))).size !== 1) {
|
|
339
|
-
throw
|
|
340
|
-
publicTickerKey(item.symbol, listingExchange(item.result!)), item.result!.name,
|
|
341
|
-
])));
|
|
374
|
+
throw ambiguity(symbol);
|
|
342
375
|
}
|
|
343
376
|
exactMatch = verified[0]!;
|
|
344
377
|
}
|
|
@@ -4,7 +4,7 @@ import type {
|
|
|
4
4
|
} from "./types";
|
|
5
5
|
import { getListingSymbol, tickerHasListingSuffix } from "../../sources/listing-symbols";
|
|
6
6
|
import { canonicalExchange, parsePublicTickerKey } from "../../utils/exchanges";
|
|
7
|
-
import { assetClassMarketSymbol, instrumentClassCode, parseAssetClassQuery } from "./asset-classes";
|
|
7
|
+
import { assetClassKeeps, assetClassMarketSymbol, instrumentClassCode, parseAssetClassQuery } from "./asset-classes";
|
|
8
8
|
|
|
9
9
|
const FUND_TYPES = new Set(["ETF", "ETN", "ETP", "FUND", "MUTUALFUND", "CEF", "CLOSEDEND"]);
|
|
10
10
|
const DERIVATIVE_TYPES = new Set(["OPT", "OPTION", "OPTIONS", "FUT", "FUTURE", "FUTURES", "WARRANT", "WARRANTS", "RIGHT", "RIGHTS"]);
|
|
@@ -174,12 +174,12 @@ export function rankTickerSearchItems<T extends Pick<TickerSearchRankableItem, "
|
|
|
174
174
|
if (!intent.normalizedQuery) return items;
|
|
175
175
|
|
|
176
176
|
const ranked = (assetClass
|
|
177
|
-
? items.filter((item) => instrumentClassCode({
|
|
177
|
+
? items.filter((item) => assetClassKeeps(assetClass.code, instrumentClassCode({
|
|
178
178
|
instrumentClass: item.instrumentClass,
|
|
179
179
|
instrumentType: item.instrumentType,
|
|
180
180
|
symbol: item.symbol || item.label,
|
|
181
181
|
exchange: item.exchangeLabel || item.right,
|
|
182
|
-
})
|
|
182
|
+
})))
|
|
183
183
|
: items)
|
|
184
184
|
.map((item, index) => {
|
|
185
185
|
// A saved public key replaces its provider row during deduplication.
|
|
@@ -259,8 +259,28 @@ export function rankTickerSearchItems<T extends Pick<TickerSearchRankableItem, "
|
|
|
259
259
|
promoteMuchMorePopularCompanies(filtered);
|
|
260
260
|
|
|
261
261
|
type RankedEntry = (typeof ranked)[number];
|
|
262
|
+
// One exact symbol can name several companies (NET is Cloudflare in New York
|
|
263
|
+
// and Netcall in London). Saved listings come first, then each company ranks
|
|
264
|
+
// by its earliest listing position in the returned search order.
|
|
265
|
+
// Without this, a name that starts with the symbol (Netcall) or the boost for
|
|
266
|
+
// stocks over funds (GLD) put a thinly traded company first.
|
|
267
|
+
const exactIssuerRank = new Map<string, number>();
|
|
268
|
+
const exactIssuerKey = (entry: RankedEntry) => getIssuerGroupKey(entry.item.detail) || `item:${entry.index}`;
|
|
269
|
+
for (const entry of filtered) {
|
|
270
|
+
if (entry.symbolMatchRank !== 4 || entry.item.providerRank == null) continue;
|
|
271
|
+
const key = exactIssuerKey(entry);
|
|
272
|
+
exactIssuerRank.set(key, Math.min(entry.item.providerRank, exactIssuerRank.get(key) ?? Number.POSITIVE_INFINITY));
|
|
273
|
+
}
|
|
262
274
|
const compareFallbackEntries = (a: RankedEntry, b: RankedEntry): number => {
|
|
263
275
|
if (b.symbolMatchRank !== a.symbolMatchRank) return b.symbolMatchRank - a.symbolMatchRank;
|
|
276
|
+
if (a.symbolMatchRank === 4) {
|
|
277
|
+
const aSaved = isSavedSearchItem(a.item);
|
|
278
|
+
const bSaved = isSavedSearchItem(b.item);
|
|
279
|
+
if (aSaved !== bSaved) return aSaved ? -1 : 1;
|
|
280
|
+
const aIssuerRank = exactIssuerRank.get(exactIssuerKey(a)) ?? Number.POSITIVE_INFINITY;
|
|
281
|
+
const bIssuerRank = exactIssuerRank.get(exactIssuerKey(b)) ?? Number.POSITIVE_INFINITY;
|
|
282
|
+
if (aIssuerRank !== bIssuerRank) return aIssuerRank - bIssuerRank;
|
|
283
|
+
}
|
|
264
284
|
if (b.score !== a.score) return b.score - a.score;
|
|
265
285
|
const aSaved = isSavedSearchItem(a.item);
|
|
266
286
|
const bSaved = isSavedSearchItem(b.item);
|
|
@@ -1647,7 +1647,7 @@ async function resolveChartSpecPass(
|
|
|
1647
1647
|
|| (request.bounds.end !== null && now() - (request.bounds.end + 1) < 60 * 60_000);
|
|
1648
1648
|
const staleCurrent = (value: LoadedPriceHistory) => currentWindow() && !!value.session
|
|
1649
1649
|
&& isPriceHistoryStaleForCurrentWindow(value.points, now(), {
|
|
1650
|
-
exchange: source.instrument.exchange, session: value.session,
|
|
1650
|
+
symbol: source.instrument.symbol, exchange: source.instrument.exchange, session: value.session,
|
|
1651
1651
|
...(value.resolution ? { intervalMs: CHART_RESOLUTION_STEP_MS[value.resolution] } : {}),
|
|
1652
1652
|
});
|
|
1653
1653
|
if (staleCurrent(loaded)) {
|
|
@@ -105,7 +105,7 @@ function freshSeedPoints(
|
|
|
105
105
|
// Broker contract/session interpretation remains unproven, as at acquisition.
|
|
106
106
|
const session = instrument.instrument ? undefined : result.session;
|
|
107
107
|
if (currentWindow && isIntradayResolution(resolution) && isPriceHistoryStaleForCurrentWindow(points, now, {
|
|
108
|
-
exchange: target.exchange, intervalMs: CHART_RESOLUTION_STEP_MS[resolution], session,
|
|
108
|
+
symbol: target.symbol, exchange: target.exchange, intervalMs: CHART_RESOLUTION_STEP_MS[resolution], session,
|
|
109
109
|
})) return null;
|
|
110
110
|
return points.length ? points : null;
|
|
111
111
|
}
|
|
@@ -80,6 +80,12 @@ export type ContextMenuContext =
|
|
|
80
80
|
layoutIndex: number;
|
|
81
81
|
layoutName: string;
|
|
82
82
|
active: boolean;
|
|
83
|
+
}
|
|
84
|
+
| {
|
|
85
|
+
/** A person's name or @mention in the chat. */
|
|
86
|
+
kind: "chat-user";
|
|
87
|
+
userId: string;
|
|
88
|
+
username: string | null;
|
|
83
89
|
};
|
|
84
90
|
|
|
85
91
|
export function hasRunnableContextMenuItem(items: readonly ContextMenuItem[]): boolean {
|
|
@@ -116,6 +116,8 @@ export interface MarketDataRequestContext {
|
|
|
116
116
|
historyRequestKey?: string;
|
|
117
117
|
/** Intraday history should include pre-market and after-hours bars where the source has them. */
|
|
118
118
|
historySession?: "extended";
|
|
119
|
+
/** The listing's company, from its own quote: an SEC lookup for a non-US listing checks the registrant against it. */
|
|
120
|
+
listingName?: string;
|
|
119
121
|
}
|
|
120
122
|
|
|
121
123
|
export interface CachedFinancialsTarget {
|
package/src/types/financials.ts
CHANGED
|
@@ -41,6 +41,8 @@ export interface QuoteMetadata {
|
|
|
41
41
|
export interface Quote {
|
|
42
42
|
/** Applies to this price observation; a stored position cannot supply it. */
|
|
43
43
|
priceBasis?: PriceBasis;
|
|
44
|
+
/** Daily fund net asset value; independent of the units used to format its price. */
|
|
45
|
+
priceObservation?: "nav";
|
|
44
46
|
symbol: string;
|
|
45
47
|
/** Provider-reported security type, independent of the company profile. */
|
|
46
48
|
instrumentType?: string;
|
|
@@ -56,6 +58,9 @@ export interface Quote {
|
|
|
56
58
|
regularClose?: number;
|
|
57
59
|
/** Exchange-local date of regularClose; separate from the daily previous-close reference. */
|
|
58
60
|
regularCloseSessionDate?: string;
|
|
61
|
+
/** Move of that completed regular session from the one before it, in this quote's currency; set and cleared together with regularClose. */
|
|
62
|
+
regularChange?: number;
|
|
63
|
+
regularChangePercent?: number;
|
|
59
64
|
/** Provider's exchange-local session date for the daily quote reference. */
|
|
60
65
|
changeSessionDate?: string;
|
|
61
66
|
high52w?: number;
|
package/src/types/headless.ts
CHANGED
|
@@ -71,7 +71,12 @@ export interface HeadlessPaneContext {
|
|
|
71
71
|
settings?: Record<string, unknown>;
|
|
72
72
|
capabilities?: CapabilityInvoker;
|
|
73
73
|
/** Read one local portfolio without passing holdings through a remote endpoint. */
|
|
74
|
-
resolvePortfolio?: (id: string) => Promise<{
|
|
74
|
+
resolvePortfolio?: (id: string) => Promise<{
|
|
75
|
+
portfolio: import("./ticker").Portfolio;
|
|
76
|
+
tickers: import("./ticker").TickerRecord[];
|
|
77
|
+
/** The broker account the portfolio was last synced with, as saved on this device. */
|
|
78
|
+
account?: import("./trading").BrokerAccount | null;
|
|
79
|
+
} | null>;
|
|
75
80
|
/** Read locally remembered watchlist membership. */
|
|
76
81
|
resolveWatchlist?: (id: string) => Promise<import("./ticker").TickerRecord[] | null>;
|
|
77
82
|
/** Resolve locally remembered exchange identities without coupling plugins to storage. */
|
|
@@ -97,6 +102,63 @@ export interface HeadlessPaneEntry {
|
|
|
97
102
|
formatted?: string;
|
|
98
103
|
}
|
|
99
104
|
|
|
105
|
+
/**
|
|
106
|
+
* How current a report's data is (docs/usage.md#how-current-a-report-is):
|
|
107
|
+
* - `live`: a real-time feed, such as a streaming venue or a real-time quote.
|
|
108
|
+
* - `delayed`: a feed held back on purpose, by `delayMinutes` when known.
|
|
109
|
+
* - `stale`: a feed or scheduled release whose newest observation is older
|
|
110
|
+
* than that kind of data allows.
|
|
111
|
+
* - `not-a-feed`: data that is not a feed at all (filings, fundamentals,
|
|
112
|
+
* calendars, statistics releases, calculators, local portfolio data). It
|
|
113
|
+
* never reads stale just because it is old.
|
|
114
|
+
*/
|
|
115
|
+
export type HeadlessFreshnessStatus = "live" | "delayed" | "stale" | "not-a-feed";
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* What a report can cite about its data. Every field is optional: the report
|
|
119
|
+
* fills what is missing from the result itself (quote `dataSource`,
|
|
120
|
+
* `delayMinutes`, `stale`, `asOf`/`observedAt`/`lastUpdated` fields, the last
|
|
121
|
+
* point of each series), so a pane declares only what that would get wrong.
|
|
122
|
+
*/
|
|
123
|
+
export interface HeadlessPaneFreshness {
|
|
124
|
+
/**
|
|
125
|
+
* Who a reader would cite: the venue, exchange or agency for primary data
|
|
126
|
+
* ("SEC EDGAR", "Hyperliquid"), "Gloom Cloud" for aggregated market data,
|
|
127
|
+
* "Local data" or "Your inputs". Never a data vendor or an internal provider id.
|
|
128
|
+
*/
|
|
129
|
+
source?: string;
|
|
130
|
+
/** Newest observation in the data. A `YYYY-MM-DD` string reads as a date without a time. */
|
|
131
|
+
asOf?: string | number | Date | null;
|
|
132
|
+
/** Oldest observation, mentioned when it is far older than `asOf`; `null` when the rows are a history. */
|
|
133
|
+
oldest?: string | number | Date | null;
|
|
134
|
+
/**
|
|
135
|
+
* The row field that says when each row was observed, when it is not one of
|
|
136
|
+
* the standard names (`asOf`, `observedAt`, `lastUpdated`...). The report is
|
|
137
|
+
* then dated by that field alone, not by metadata stamps.
|
|
138
|
+
*/
|
|
139
|
+
observedKey?: string;
|
|
140
|
+
status?: HeadlessFreshnessStatus;
|
|
141
|
+
/** How far a delayed feed is held back, in minutes. */
|
|
142
|
+
delayMinutes?: number;
|
|
143
|
+
/** What not-a-feed data is, in a few words: "filed data", "monthly release", "your inputs". */
|
|
144
|
+
basis?: string;
|
|
145
|
+
/** The newest observation is stale once it is older than this many minutes. */
|
|
146
|
+
maxAgeMinutes?: number;
|
|
147
|
+
/**
|
|
148
|
+
* The rows' and metadata's own `stale` flags mean something other than "this
|
|
149
|
+
* value is out of date" (a historical marker, a cache state), so the report
|
|
150
|
+
* judges staleness from the schedule alone.
|
|
151
|
+
*/
|
|
152
|
+
ignoreStaleFlags?: boolean;
|
|
153
|
+
/**
|
|
154
|
+
* `daily`: one observation per US trading day, stale once more than one
|
|
155
|
+
* completed session has passed after the newest (a day's lag is allowed).
|
|
156
|
+
*/
|
|
157
|
+
cadence?: "daily";
|
|
158
|
+
/** The newest observation is stale once this time (the next scheduled release) has passed by a day. */
|
|
159
|
+
nextExpectedAt?: string | number | Date | null;
|
|
160
|
+
}
|
|
161
|
+
|
|
100
162
|
interface HeadlessPaneResultBase {
|
|
101
163
|
/** False when usable output does not fully cover the requested inputs/depth. */
|
|
102
164
|
complete?: boolean;
|
|
@@ -104,8 +166,17 @@ interface HeadlessPaneResultBase {
|
|
|
104
166
|
symbols?: string[];
|
|
105
167
|
/** Missing inputs must remain visible even when other inputs returned rows. */
|
|
106
168
|
unavailableSymbols?: string[];
|
|
169
|
+
/** Failures: a source that did not answer, or a value that could not be computed. */
|
|
107
170
|
errors?: string[];
|
|
171
|
+
/**
|
|
172
|
+
* Caveats about a report that did load: what it leaves out, what it assumes,
|
|
173
|
+
* how a value was marked. One sentence each. They never make a report fail;
|
|
174
|
+
* `complete: false` says when the report does not cover what was asked.
|
|
175
|
+
*/
|
|
176
|
+
notes?: string[];
|
|
108
177
|
metadata?: Record<string, unknown>;
|
|
178
|
+
/** What this load knows about its data's source and age; overrides the definition's `freshness`. */
|
|
179
|
+
freshness?: HeadlessPaneFreshness;
|
|
109
180
|
}
|
|
110
181
|
|
|
111
182
|
export interface HeadlessRowsResult extends HeadlessPaneResultBase {
|
|
@@ -185,8 +256,14 @@ export interface HeadlessPaneDefinition<Shape extends HeadlessPaneShape = Headle
|
|
|
185
256
|
description?: string;
|
|
186
257
|
argument: HeadlessPaneArgumentDef;
|
|
187
258
|
options: HeadlessPaneOptionDef[];
|
|
259
|
+
/** What is true of every load: its source, and whether it is a feed. */
|
|
260
|
+
freshness?: HeadlessPaneFreshness;
|
|
188
261
|
columns?: HeadlessPaneColumn[];
|
|
189
|
-
|
|
262
|
+
/**
|
|
263
|
+
* The report title. A report passes the loaded result, so a title can name
|
|
264
|
+
* what the load resolved (the view an `auto` query became, a fund's name).
|
|
265
|
+
*/
|
|
266
|
+
describe?: string | ((args: HeadlessPaneLoadArgs, result?: HeadlessPaneResult) => string);
|
|
190
267
|
load(
|
|
191
268
|
args: HeadlessPaneLoadArgs,
|
|
192
269
|
ctx: HeadlessPaneContext,
|
package/src/types/plugin.ts
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import type { ReactNode } from "react";
|
|
2
2
|
import type { AppTickerRepositoryPort } from "../core/app-service-ports";
|
|
3
|
-
import type { HeadlessPaneDefinition } from "./headless";
|
|
3
|
+
import type { HeadlessPaneDefinition, HeadlessPaneFreshness } from "./headless";
|
|
4
4
|
|
|
5
5
|
export type {
|
|
6
6
|
HeadlessBundleResult,
|
|
7
7
|
HeadlessBundleSection,
|
|
8
|
+
HeadlessFreshnessStatus,
|
|
8
9
|
HeadlessPaneApiClient,
|
|
9
10
|
HeadlessPaneArgumentDef,
|
|
10
11
|
HeadlessPaneArgumentKind,
|
|
@@ -12,6 +13,7 @@ export type {
|
|
|
12
13
|
HeadlessPaneContext,
|
|
13
14
|
HeadlessPaneDefinition,
|
|
14
15
|
HeadlessPaneEntry,
|
|
16
|
+
HeadlessPaneFreshness,
|
|
15
17
|
HeadlessPaneLoadArgs,
|
|
16
18
|
HeadlessPaneOptionDef,
|
|
17
19
|
HeadlessPaneOptionType,
|
|
@@ -116,27 +118,48 @@ export interface PaneDef {
|
|
|
116
118
|
tickerSource?: boolean;
|
|
117
119
|
/**
|
|
118
120
|
* Pane shows one ticker read through its binding (`usePaneTicker`, `usePaneTickerIdentity`), so
|
|
119
|
-
* its pane menu offers "Link to" each visible
|
|
120
|
-
* selection. A function decides per instance (a chart with one
|
|
121
|
-
* follower must never write its own `cursorSymbol`: that would
|
|
121
|
+
* its pane menu offers "Link to" each visible list, scanner, and other single-ticker pane, and
|
|
122
|
+
* it then follows that pane's selection. A function decides per instance (a chart with one
|
|
123
|
+
* security, not a comparison). A follower must never write its own `cursorSymbol`: that would
|
|
124
|
+
* win over the binding.
|
|
122
125
|
*/
|
|
123
126
|
tickerFollower?: boolean | ((pane: PaneInstanceConfig) => boolean);
|
|
124
127
|
/** Renderer-neutral data model used by CLI functions, automation, and hosted tools. */
|
|
125
128
|
headless?: HeadlessPaneDefinition;
|
|
129
|
+
/**
|
|
130
|
+
* Source and status a rendered-view report (`fn` on a pane without a
|
|
131
|
+
* `headless` model) cites, when "Gloom Cloud" with the state the footer
|
|
132
|
+
* shows would be wrong: local data, a calculator, filed records.
|
|
133
|
+
*/
|
|
134
|
+
reportFreshness?: Pick<HeadlessPaneFreshness, "source" | "status" | "basis">;
|
|
126
135
|
/** Add an Excel-compatible CSV action for the pane's single active DataTable. */
|
|
127
136
|
tableExport?: true;
|
|
128
137
|
settings?: PaneSettingsDef | ((context: PaneSettingsContext) => PaneSettingsDef | null);
|
|
129
138
|
/** Portable sharing is public by default; list the few pane-owned fields that must remain local. */
|
|
130
139
|
portableShare?: PanePortableShareDef;
|
|
131
|
-
/**
|
|
140
|
+
/**
|
|
141
|
+
* Compact controls surfaced next to the pane title. A key references a
|
|
142
|
+
* toggle field in settings, or a two-option select field when `onValue` is set.
|
|
143
|
+
*/
|
|
132
144
|
quickSettings?: readonly PaneQuickSettingDef[];
|
|
133
145
|
}
|
|
134
146
|
|
|
135
147
|
export interface PaneQuickSettingDef {
|
|
136
148
|
type: "toggle";
|
|
137
149
|
key: string;
|
|
138
|
-
icon: "zap";
|
|
150
|
+
icon: "zap" | "sqrt";
|
|
139
151
|
label?: string;
|
|
152
|
+
/**
|
|
153
|
+
* For a two-option select field: the option the control turns on. Turning
|
|
154
|
+
* it off picks the field's other option.
|
|
155
|
+
*/
|
|
156
|
+
onValue?: string;
|
|
157
|
+
/**
|
|
158
|
+
* Shows the control only where it changes something, for a setting that
|
|
159
|
+
* applies to some of what the pane can show. The field stays in the
|
|
160
|
+
* settings dialog either way.
|
|
161
|
+
*/
|
|
162
|
+
visible?: (context: PaneSettingsContext) => boolean;
|
|
140
163
|
}
|
|
141
164
|
|
|
142
165
|
export interface PaneSettingsContext {
|
|
@@ -183,11 +206,15 @@ interface PaneSettingSelectField extends PaneSettingFieldBase {
|
|
|
183
206
|
interface PaneSettingMultiSelectField extends PaneSettingFieldBase {
|
|
184
207
|
type: "multi-select";
|
|
185
208
|
options: PaneSettingOption[];
|
|
209
|
+
/** A long list: a filter box, each description beside its label. */
|
|
210
|
+
searchable?: boolean;
|
|
186
211
|
}
|
|
187
212
|
|
|
188
213
|
interface PaneSettingOrderedMultiSelectField extends PaneSettingFieldBase {
|
|
189
214
|
type: "ordered-multi-select";
|
|
190
215
|
options: PaneSettingOption[];
|
|
216
|
+
/** A long list: a filter box, each description beside its label and each selection's position. */
|
|
217
|
+
searchable?: boolean;
|
|
191
218
|
}
|
|
192
219
|
|
|
193
220
|
export interface PaneSettingActionContext extends PaneSettingsContext {
|
|
@@ -251,6 +278,11 @@ interface PaneTemplateShortcut {
|
|
|
251
278
|
aliases?: readonly string[];
|
|
252
279
|
argPlaceholder?: string;
|
|
253
280
|
argKind?: "text" | "ticker" | "ticker-list";
|
|
281
|
+
/**
|
|
282
|
+
* For a ticker list, entries kept as typed instead of resolved as tickers:
|
|
283
|
+
* CORR keeps map series (`GEO:HORMUZ`) beside its tickers.
|
|
284
|
+
*/
|
|
285
|
+
keepArgToken?: (token: string) => boolean;
|
|
254
286
|
argOptional?: boolean;
|
|
255
287
|
/**
|
|
256
288
|
* With no argument typed and none to infer from the active ticker, open
|
package/src/types/ticker.ts
CHANGED
|
@@ -56,6 +56,21 @@ export interface Portfolio {
|
|
|
56
56
|
lastSyncedAt?: number;
|
|
57
57
|
/** Set on paper portfolios shared with a team; the server holds the items. */
|
|
58
58
|
teamId?: string;
|
|
59
|
+
/**
|
|
60
|
+
* Cash held beside the positions, entered by hand. A broker account that
|
|
61
|
+
* reports its own cash is shown instead of this.
|
|
62
|
+
*/
|
|
63
|
+
cash?: PortfolioCash;
|
|
64
|
+
/**
|
|
65
|
+
* Target weights in percent of the total value, cash included, keyed by
|
|
66
|
+
* ticker symbol; `CASH` is the cash line.
|
|
67
|
+
*/
|
|
68
|
+
targetWeights?: Record<string, number>;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export interface PortfolioCash {
|
|
72
|
+
amount: number;
|
|
73
|
+
currency: string;
|
|
59
74
|
}
|
|
60
75
|
|
|
61
76
|
export interface Watchlist {
|
package/src/ui/context-menu.tsx
CHANGED
|
@@ -42,6 +42,7 @@ const MENU_SURFACE_SELECTOR = [
|
|
|
42
42
|
"[data-gloom-role='pane-header']",
|
|
43
43
|
"[data-gloom-role='pane-action']",
|
|
44
44
|
"[data-gloom-role='pane-close']",
|
|
45
|
+
"[data-gloom-role='pane-restore']",
|
|
45
46
|
"[data-gloom-role='status-bar']",
|
|
46
47
|
"[data-gloom-role='tab-button']",
|
|
47
48
|
].join(", ");
|
package/src/ui/host.tsx
CHANGED
|
@@ -375,6 +375,8 @@ export interface HostTabsProps {
|
|
|
375
375
|
addLabel?: string;
|
|
376
376
|
onAdd?: () => void;
|
|
377
377
|
onReorder?: (fromValue: string, toValue: string) => void;
|
|
378
|
+
/** A press that moves, on a tab that is not reordered. */
|
|
379
|
+
onDrag?: () => void;
|
|
378
380
|
focused?: boolean;
|
|
379
381
|
palette: HostTabsPalette;
|
|
380
382
|
}
|
|
@@ -459,6 +461,20 @@ export interface HostPopoverProps {
|
|
|
459
461
|
trigger: ReactNode;
|
|
460
462
|
children: ReactNode;
|
|
461
463
|
anchorPoint?: { x: number; y: number } | null;
|
|
464
|
+
/**
|
|
465
|
+
* Opens beside this element instead of the trigger, such as a name the
|
|
466
|
+
* pointer is on: below it with the left edges aligned, above it when there
|
|
467
|
+
* is no room below, and kept inside the boundary. A Box ref is one. Read
|
|
468
|
+
* each time the popover places itself, so it follows the element when the
|
|
469
|
+
* page scrolls.
|
|
470
|
+
*/
|
|
471
|
+
anchor?: BoxRenderable | null;
|
|
472
|
+
/** `pane` also keeps the popover inside the pane it opens from. Default `viewport`. */
|
|
473
|
+
boundary?: "viewport" | "pane";
|
|
474
|
+
/** The pointer came onto the popover, e.g. to keep a hover card open while it is used. */
|
|
475
|
+
onPointerEnter?: () => void;
|
|
476
|
+
/** The pointer left the popover. */
|
|
477
|
+
onPointerLeave?: () => void;
|
|
462
478
|
placement?: "bottom-start" | "bottom-end";
|
|
463
479
|
minWidth?: number | string;
|
|
464
480
|
maxWidth?: number | string;
|
package/src/updater/index.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { compareSemver } from "../utils/semver";
|
|
2
2
|
import { GITHUB_LATEST_RELEASE_API_URL } from "./github-releases";
|
|
3
3
|
|
|
4
|
-
function getRuntimeProcess(): Pick<NodeJS.Process, "platform" | "arch" | "argv" | "execPath"> | null {
|
|
4
|
+
function getRuntimeProcess(): Pick<NodeJS.Process, "platform" | "arch" | "argv" | "execPath" | "getBuiltinModule"> | null {
|
|
5
5
|
return (globalThis as { process?: NodeJS.Process }).process ?? null;
|
|
6
6
|
}
|
|
7
7
|
|
|
@@ -17,10 +17,18 @@ export interface ReleaseInfo {
|
|
|
17
17
|
}
|
|
18
18
|
|
|
19
19
|
export interface UpdateProgress {
|
|
20
|
-
|
|
20
|
+
/**
|
|
21
|
+
* `ready`: the new version is downloaded and waiting. The terminal binary is
|
|
22
|
+
* already swapped and runs on the next launch; the desktop app applies it
|
|
23
|
+
* when `canRestart` is set and the user asks. Nothing restarts by itself.
|
|
24
|
+
* `done` is for a finished action that has nothing left to wait for.
|
|
25
|
+
*/
|
|
26
|
+
phase: "downloading" | "ready" | "replacing" | "done" | "error";
|
|
21
27
|
percent?: number;
|
|
22
28
|
error?: string;
|
|
23
29
|
message?: string;
|
|
30
|
+
/** With `ready`: this host can apply the update and relaunch on request. */
|
|
31
|
+
canRestart?: boolean;
|
|
24
32
|
}
|
|
25
33
|
|
|
26
34
|
export type UpdateAction =
|
|
@@ -43,7 +51,10 @@ export type UpdateCheckResult =
|
|
|
43
51
|
|
|
44
52
|
export interface UpdateHost {
|
|
45
53
|
checkForUpdateDetailed(currentVersion: string): Promise<UpdateCheckResult>;
|
|
54
|
+
/** Downloads and stages the update, ending in `ready` (or `error`). It never relaunches the app. */
|
|
46
55
|
performUpdate(release: ReleaseInfo, onProgress: (p: UpdateProgress) => void): Promise<void>;
|
|
56
|
+
/** Installs the staged update and relaunches the app. Only runs on an explicit request. */
|
|
57
|
+
applyUpdate?(onProgress: (p: UpdateProgress) => void): Promise<void>;
|
|
47
58
|
}
|
|
48
59
|
|
|
49
60
|
let updateHost: UpdateHost | null = null;
|
|
@@ -255,6 +266,11 @@ export function canSelfUpdate(release: Pick<ReleaseInfo, "updateAction"> | null
|
|
|
255
266
|
return release?.updateAction.kind === "self" || release?.updateAction.kind === "desktop";
|
|
256
267
|
}
|
|
257
268
|
|
|
269
|
+
/** A downloaded update this host can install and relaunch into when the user asks. */
|
|
270
|
+
export function canRestartToApply(progress: UpdateProgress | null | undefined): boolean {
|
|
271
|
+
return progress?.phase === "ready" && progress.canRestart === true;
|
|
272
|
+
}
|
|
273
|
+
|
|
258
274
|
export async function checkForUpdateDetailed(
|
|
259
275
|
currentVersion: string,
|
|
260
276
|
): Promise<UpdateCheckResult> {
|
|
@@ -339,6 +355,15 @@ export async function checkForUpdate(
|
|
|
339
355
|
return result.kind === "available" ? result.release : null;
|
|
340
356
|
}
|
|
341
357
|
|
|
358
|
+
/** Installs the downloaded update and relaunches. Callers gate it on `canRestartToApply`. */
|
|
359
|
+
export async function applyUpdate(onProgress: (p: UpdateProgress) => void): Promise<void> {
|
|
360
|
+
if (!updateHost?.applyUpdate) {
|
|
361
|
+
onProgress({ phase: "error", error: "Restarting to apply an update is unavailable in this runtime." });
|
|
362
|
+
return;
|
|
363
|
+
}
|
|
364
|
+
await updateHost.applyUpdate(onProgress);
|
|
365
|
+
}
|
|
366
|
+
|
|
342
367
|
export async function performUpdate(
|
|
343
368
|
release: ReleaseInfo,
|
|
344
369
|
onProgress: (p: UpdateProgress) => void,
|
|
@@ -389,17 +414,15 @@ export async function performUpdate(
|
|
|
389
414
|
let unlinkUpdatePath: ((path: string) => void) | null = null;
|
|
390
415
|
|
|
391
416
|
try {
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
chmodSync,
|
|
399
|
-
} = await import(fsModulePath) as typeof import("fs");
|
|
417
|
+
// Not import(): Bun folds even a specifier held in a variable and bundles
|
|
418
|
+
// browser polyfills for all three into the web and desktop view builds,
|
|
419
|
+
// which never reach this path. Self-update only runs in the compiled
|
|
420
|
+
// terminal binary, where the process is always there.
|
|
421
|
+
const runtime = getRuntimeProcess()!;
|
|
422
|
+
const { renameSync, unlinkSync, chmodSync } = runtime.getBuiltinModule("fs");
|
|
400
423
|
unlinkUpdatePath = unlinkSync;
|
|
401
|
-
const { gunzipSync } =
|
|
402
|
-
const { createHash } =
|
|
424
|
+
const { gunzipSync } = runtime.getBuiltinModule("zlib");
|
|
425
|
+
const { createHash } = runtime.getBuiltinModule("crypto");
|
|
403
426
|
|
|
404
427
|
onProgress({ phase: "downloading", percent: 0 });
|
|
405
428
|
|
|
@@ -458,7 +481,9 @@ export async function performUpdate(
|
|
|
458
481
|
unlinkSync(oldPath);
|
|
459
482
|
} catch {}
|
|
460
483
|
|
|
461
|
-
|
|
484
|
+
// The new binary is in place; the running process keeps the old one until
|
|
485
|
+
// the user restarts it, which this process never does for them.
|
|
486
|
+
onProgress({ phase: "ready" });
|
|
462
487
|
} catch (err: unknown) {
|
|
463
488
|
// Clean up temp file on failure
|
|
464
489
|
try {
|
|
@@ -58,3 +58,24 @@ export function abortable<T>(promise: Promise<T>, signal: AbortSignal | undefine
|
|
|
58
58
|
promise.then(resolve, reject).finally(() => signal.removeEventListener("abort", abort));
|
|
59
59
|
});
|
|
60
60
|
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Aborts when the caller's signal does or after `timeoutMs`, whichever comes
|
|
64
|
+
* first, with that signal's reason. Wired by hand because AbortSignal.any is
|
|
65
|
+
* missing from the older system WebViews the desktop app runs in.
|
|
66
|
+
*/
|
|
67
|
+
export function signalWithTimeout(signal: AbortSignal | undefined, timeoutMs: number): AbortSignal {
|
|
68
|
+
const timeout = AbortSignal.timeout(timeoutMs);
|
|
69
|
+
if (!signal) return timeout;
|
|
70
|
+
if (signal.aborted) return signal;
|
|
71
|
+
const controller = new AbortController();
|
|
72
|
+
const fromCaller = () => controller.abort(signal.reason);
|
|
73
|
+
const fromTimeout = () => controller.abort(timeout.reason);
|
|
74
|
+
signal.addEventListener("abort", fromCaller, { once: true });
|
|
75
|
+
timeout.addEventListener("abort", fromTimeout, { once: true });
|
|
76
|
+
controller.signal.addEventListener("abort", () => {
|
|
77
|
+
signal.removeEventListener("abort", fromCaller);
|
|
78
|
+
timeout.removeEventListener("abort", fromTimeout);
|
|
79
|
+
}, { once: true });
|
|
80
|
+
return controller.signal;
|
|
81
|
+
}
|
package/src/utils/cli-output.ts
CHANGED
|
@@ -8,6 +8,8 @@ export interface CliTableColumn {
|
|
|
8
8
|
maxWidth?: number;
|
|
9
9
|
/** Dropped, rightmost first, before other columns are shortened to fit a terminal. */
|
|
10
10
|
optional?: boolean;
|
|
11
|
+
/** Among optional columns, a higher priority is dropped sooner; equal ones go rightmost first. */
|
|
12
|
+
dropPriority?: number;
|
|
11
13
|
/** False keeps the column whole when fitting, for identifiers a user types into the next command. */
|
|
12
14
|
shrink?: boolean;
|
|
13
15
|
}
|
|
@@ -301,7 +303,9 @@ export function renderTable(columns: CliTableColumn[], rows: string[][], options
|
|
|
301
303
|
let truncate = false;
|
|
302
304
|
if (available != null && tableWidth(shown.map((entry) => entry.width)) > available) {
|
|
303
305
|
while (tableWidth(shown.map((entry) => entry.width)) > available) {
|
|
304
|
-
const dropped = shown.
|
|
306
|
+
const dropped = shown.reduce<(typeof shown)[number] | undefined>((pick, entry) => (
|
|
307
|
+
entry.column.optional && (!pick || (entry.column.dropPriority ?? 0) >= (pick.column.dropPriority ?? 0)) ? entry : pick
|
|
308
|
+
), undefined);
|
|
305
309
|
if (!dropped) break;
|
|
306
310
|
shown = shown.filter((entry) => entry !== dropped);
|
|
307
311
|
}
|