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
|
@@ -2,7 +2,8 @@ import { pricePointIntegrity, type PriceHistoryIntegrity } from "../../../../uti
|
|
|
2
2
|
import type { QueryEntry } from "../../../../market-data/result-types";
|
|
3
3
|
import { colors } from "../../../../theme/colors";
|
|
4
4
|
import type { PricePoint } from "../../../../types/financials";
|
|
5
|
-
import { dailyCloses, correlateDailyCloses, type CorrelationResult, type DailyClose } from "../compute";
|
|
5
|
+
import { dailyCloses, correlateDailyCloses, type ChangeBasis, type CorrelationResult, type DailyClose } from "../compute";
|
|
6
|
+
import { geoSeriesToken } from "../geo";
|
|
6
7
|
import type { CorrelationRangePreset } from "../settings";
|
|
7
8
|
import { clipPriceHistoryToRange } from "../../../../time-series/history-window";
|
|
8
9
|
|
|
@@ -17,6 +18,8 @@ export type SeriesStatus = "loading" | "ready" | "insufficient" | "empty" | "err
|
|
|
17
18
|
export interface CorrelationSeries {
|
|
18
19
|
symbol: string;
|
|
19
20
|
prices: DailyClose[];
|
|
21
|
+
/** Prices correlate returns; a map series correlates its daily change. */
|
|
22
|
+
basis?: ChangeBasis;
|
|
20
23
|
status: SeriesStatus;
|
|
21
24
|
observationCount: number;
|
|
22
25
|
integrity?: PriceHistoryIntegrity[];
|
|
@@ -25,7 +28,10 @@ export interface CorrelationSeries {
|
|
|
25
28
|
fetchedAt?: number | null;
|
|
26
29
|
}
|
|
27
30
|
|
|
31
|
+
/** A map series shows its alias (HORMUZ, SUEZ.TANKER): the GEO prefix would leave no room for the name. */
|
|
28
32
|
export function displaySymbol(symbol: string): string {
|
|
33
|
+
const geo = geoSeriesToken(symbol);
|
|
34
|
+
if (geo) return geo.length > 10 ? geo.slice(0, 10) : geo;
|
|
29
35
|
return symbol.length > 5 ? symbol.slice(0, 5) : symbol;
|
|
30
36
|
}
|
|
31
37
|
|
|
@@ -87,6 +93,15 @@ export function buildCorrelationSeries(symbol: string, history: readonly PricePo
|
|
|
87
93
|
};
|
|
88
94
|
}
|
|
89
95
|
|
|
96
|
+
/** A map series' values as a matrix input: zero counts are kept, changes are level differences. */
|
|
97
|
+
export function buildGeoCorrelationSeries(symbol: string, values: DailyClose[]): CorrelationSeries {
|
|
98
|
+
const observationCount = Math.max(0, values.length - 1);
|
|
99
|
+
return {
|
|
100
|
+
symbol, prices: values, basis: "difference", observationCount,
|
|
101
|
+
status: values.length === 0 ? "empty" : observationCount < MIN_CORRELATION_OBSERVATIONS ? "insufficient" : "ready",
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
|
|
90
105
|
export function rowHeaderColor(status: SeriesStatus): string {
|
|
91
106
|
switch (status) {
|
|
92
107
|
case "loading":
|
|
@@ -122,7 +137,7 @@ export function buildCorrelationMatrix(
|
|
|
122
137
|
const rowSeries = seriesBySymbol.get(rowSym);
|
|
123
138
|
const colSeries = seriesBySymbol.get(colSym);
|
|
124
139
|
const result = rowSeries && colSeries
|
|
125
|
-
? correlateDailyCloses(rowSeries.prices, colSeries.prices, MIN_CORRELATION_OBSERVATIONS)
|
|
140
|
+
? correlateDailyCloses(rowSeries.prices, colSeries.prices, MIN_CORRELATION_OBSERVATIONS, rowSeries.basis, colSeries.basis)
|
|
126
141
|
: { correlation: null, sampleSize: 0 };
|
|
127
142
|
results.set(pairKey(rowSym, colSym), result);
|
|
128
143
|
if (rowIndex < colIndex) {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { chartTableLayout } from "../../../../components/chart-table/layout";
|
|
2
|
-
import { alignDailyCloses } from "../compute";
|
|
3
|
-
import {
|
|
2
|
+
import { alignDailyCloses, pairedChanges } from "../compute";
|
|
3
|
+
import { buildRollingCorrelationPoints } from "../relationship/model";
|
|
4
4
|
import type { CorrelationRangePreset } from "../settings";
|
|
5
5
|
import type { CorrelationSeries } from "./model";
|
|
6
6
|
|
|
@@ -49,7 +49,9 @@ export function buildMatrixPairHistory(
|
|
|
49
49
|
const aligned = alignDailyCloses(left?.prices ?? [], right?.prices ?? []).map((point) => ({
|
|
50
50
|
...point, date: new Date(`${point.dateKey}T00:00:00Z`),
|
|
51
51
|
}));
|
|
52
|
-
const returns =
|
|
52
|
+
const returns = pairedChanges(aligned, left?.basis, right?.basis).map(({ dateKey, left: leftReturn, right: rightReturn }) => ({
|
|
53
|
+
dateKey, date: new Date(`${dateKey}T00:00:00Z`), leftReturn, rightReturn,
|
|
54
|
+
}));
|
|
53
55
|
const points = buildRollingCorrelationPoints(returns, window);
|
|
54
56
|
const byTime = new Map(points.map((point) => [point.date.getTime(), point.close]));
|
|
55
57
|
const values = points.map((point) => point.close);
|
|
@@ -72,7 +72,7 @@ function alignRelationshipPrices(leftPoints: PricePoint[], rightPoints: PricePoi
|
|
|
72
72
|
}));
|
|
73
73
|
}
|
|
74
74
|
|
|
75
|
-
|
|
75
|
+
function buildRelationshipReturns(aligned: readonly Omit<RelationshipAlignedPoint, "ratio">[]): RelationshipReturnPoint[] {
|
|
76
76
|
const returns: RelationshipReturnPoint[] = [];
|
|
77
77
|
for (let index = 1; index < aligned.length; index++) {
|
|
78
78
|
const previous = aligned[index - 1]!;
|
|
@@ -43,6 +43,8 @@ import {
|
|
|
43
43
|
buildRelationshipRatioSeries,
|
|
44
44
|
buildRelationshipScatterPointsForDate,
|
|
45
45
|
buildRelationshipStatItems,
|
|
46
|
+
formatRatioAxisValue,
|
|
47
|
+
formatRatioValue,
|
|
46
48
|
type MultiLineChartSeries,
|
|
47
49
|
} from "./view-model";
|
|
48
50
|
|
|
@@ -99,13 +101,13 @@ const MIN_PANEL_ROWS = 3;
|
|
|
99
101
|
|
|
100
102
|
/** Each panel's axis reads at its own precision: whole index points, a ratio, a correlation. */
|
|
101
103
|
function formatAxisValue(value: number, domain: CompositeAxisDomain): string {
|
|
102
|
-
if (domain.seriesIds.includes("ratio")) return
|
|
104
|
+
if (domain.seriesIds.includes("ratio")) return formatRatioAxisValue(value, domain);
|
|
103
105
|
if (domain.seriesIds.includes("correlation")) return formatNumber(value, 2);
|
|
104
106
|
return formatNumber(value, 0);
|
|
105
107
|
}
|
|
106
108
|
|
|
107
109
|
function formatLegendValue(value: number, series: ResolvedSeries): string {
|
|
108
|
-
if (series.id === "ratio") return
|
|
110
|
+
if (series.id === "ratio") return formatRatioValue(value);
|
|
109
111
|
if (series.id === "correlation") return formatNumber(value, 2);
|
|
110
112
|
return formatNumber(value, 1);
|
|
111
113
|
}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import type { ProjectedChartPoint } from "../../../../components/chart/core/data";
|
|
2
2
|
import type { ScatterChartPoint } from "../../../../components/chart/static";
|
|
3
3
|
import { colors } from "../../../../theme/colors";
|
|
4
|
-
import { formatNumber } from "../../../../utils/format";
|
|
4
|
+
import { formatNumber, formatSignificant } from "../../../../utils/format";
|
|
5
|
+
import type { CompositeAxisDomain } from "../../../../components/chart/composite/types";
|
|
5
6
|
import type { StatItem } from "../../../../components/ui";
|
|
6
7
|
import type {
|
|
7
8
|
RelationshipAlignedPoint,
|
|
@@ -20,6 +21,20 @@ function formatNullableNumber(value: number | null | undefined, decimals: number
|
|
|
20
21
|
return typeof value === "number" && Number.isFinite(value) ? formatNumber(value, decimals) : "-";
|
|
21
22
|
}
|
|
22
23
|
|
|
24
|
+
/**
|
|
25
|
+
* A ratio's legend value at four significant digits, so a ratio of 0.000566
|
|
26
|
+
* does not read 0.001. Whole index points and correlations keep their own fixed decimals.
|
|
27
|
+
*/
|
|
28
|
+
export const formatRatioValue = (value: number) => formatSignificant(value);
|
|
29
|
+
|
|
30
|
+
/** Ratio axis ticks need decimals that tell neighbours apart: 0.00040, 0.00045, 0.00050 where 0.001 would repeat. */
|
|
31
|
+
export function formatRatioAxisValue(value: number, domain: Pick<CompositeAxisDomain, "min" | "max">): string {
|
|
32
|
+
if (Math.abs(value) >= 10) return formatNumber(value, 1);
|
|
33
|
+
const span = Math.abs(domain.max - domain.min);
|
|
34
|
+
const decimals = Number.isFinite(span) && span > 0 ? Math.min(10, Math.max(3, 1 - Math.floor(Math.log10(span)))) : 3;
|
|
35
|
+
return formatNumber(value, decimals);
|
|
36
|
+
}
|
|
37
|
+
|
|
23
38
|
export function buildIndexedPriceSeries(
|
|
24
39
|
aligned: RelationshipAlignedPoint[],
|
|
25
40
|
leftSymbol: string,
|
|
@@ -76,7 +76,7 @@ export function buildCorrelationSettingsDef(): PaneSettingsDef {
|
|
|
76
76
|
{
|
|
77
77
|
key: "symbolsText",
|
|
78
78
|
label: "Tickers",
|
|
79
|
-
description: `Enter up to ${MAX_CORRELATION_TICKERS} tickers. Empty uses the default CORR preset.`,
|
|
79
|
+
description: `Enter up to ${MAX_CORRELATION_TICKERS} tickers or map series (GEO:HORMUZ). Empty uses the default CORR preset.`,
|
|
80
80
|
type: "text",
|
|
81
81
|
placeholder: formatTickerListInput(DEFAULT_CORRELATION_SYMBOLS),
|
|
82
82
|
},
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { CotClass, CotClassSummary } from "../../../api-client/cot";
|
|
2
2
|
import type { HeadlessPaneColumn, HeadlessPaneDefinition } from "../../../types/plugin";
|
|
3
3
|
import { fetchCotBoard, fetchCotContract } from "./client";
|
|
4
|
-
import { COT_MAJOR_CODES, COT_SCOPES, cotClass, cotContractCode, cotInteger, cotMarketName, cotScope } from "./model";
|
|
4
|
+
import { COT_MAJOR_CODES, COT_SCOPES, cotClass, cotContractCode, cotInteger, cotMarketName, cotScope, cotUnknownMarketMessage } from "./model";
|
|
5
5
|
|
|
6
6
|
const camelClass = (id: CotClass) => id.replace(/-(\w)/g, (_match, letter: string) => letter.toUpperCase());
|
|
7
7
|
const rounded = (value: number | null, digits: number) => value == null ? null : Number(value.toFixed(digits));
|
|
@@ -25,7 +25,10 @@ const POSITION_COLUMNS: HeadlessPaneColumn[] = [
|
|
|
25
25
|
];
|
|
26
26
|
|
|
27
27
|
export const cotHeadless: HeadlessPaneDefinition<"bundle"> = {
|
|
28
|
-
shape: "bundle",
|
|
28
|
+
shape: "bundle",
|
|
29
|
+
// Tuesday positions published the Friday after; two weeks without a new report means one was missed.
|
|
30
|
+
freshness: { source: "CFTC", status: "not-a-feed", basis: "weekly report", maxAgeMinutes: 14 * 24 * 60 },
|
|
31
|
+
argument: { kind: "free-text", optional: true, placeholder: "code or root", description: "CFTC market code or verified futures root; omit for the extremes board." },
|
|
29
32
|
options: [{ key: "report", type: "enum", values: [{ value: "legacy" }, { value: "disaggregated" }], defaultValue: "legacy", description: "CFTC report family." },
|
|
30
33
|
{ key: "traderClass", type: "enum", values: ["noncommercial", "commercial", "producer", "swap", "managed-money", "other-reportable", "nonreportable"].map((value) => ({ value })), description: "Trader class for the extremes board; defaults by report family." },
|
|
31
34
|
{ key: "scope", type: "enum", values: COT_SCOPES.map(({ value }) => ({ value })), defaultValue: "major", description: "Markets on the extremes board, as in the pane." }],
|
|
@@ -35,7 +38,7 @@ export const cotHeadless: HeadlessPaneDefinition<"bundle"> = {
|
|
|
35
38
|
const family = args.options.report === "disaggregated" ? "disaggregated" : "legacy";
|
|
36
39
|
if (args.argument) {
|
|
37
40
|
const code = cotContractCode(args.argument);
|
|
38
|
-
if (!code) throw new Error(
|
|
41
|
+
if (!code) throw new Error(cotUnknownMarketMessage(args.argument));
|
|
39
42
|
const data = await fetchCotContract(code, family, ctx.apiClient);
|
|
40
43
|
const classes = data.positions.map((row) => row.id);
|
|
41
44
|
return { sections: [{ title: data.contract ? cotMarketName(data.contract.marketName) : code,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { PluginModule } from "../plugin-module";
|
|
2
2
|
import { cotBoardCache } from "./client";
|
|
3
3
|
import { cotHeadless } from "./headless";
|
|
4
|
-
import { COT_ROOT_OPTIONS, cotContractCode, cotRoot } from "./model";
|
|
4
|
+
import { COT_ROOT_OPTIONS, cotContractCode, cotContractCodeForTicker, cotRoot, cotUnknownMarketMessage } from "./model";
|
|
5
5
|
import { CotPane } from "./pane";
|
|
6
6
|
|
|
7
7
|
export const cotModule: PluginModule = {
|
|
@@ -15,8 +15,8 @@ export const cotModule: PluginModule = {
|
|
|
15
15
|
argOptions: () => COT_ROOT_OPTIONS }, headless: cotHeadless,
|
|
16
16
|
createInstance: (context, options) => {
|
|
17
17
|
const input = options?.arg?.trim();
|
|
18
|
-
const code = cotContractCode(input
|
|
19
|
-
if (input && !code) throw new Error(
|
|
18
|
+
const code = input ? cotContractCode(input) : cotContractCodeForTicker(context.activeTicker);
|
|
19
|
+
if (input && !code) throw new Error(cotUnknownMarketMessage(input));
|
|
20
20
|
return { title: code ? `COT ${cotRoot(code) ?? code}` : "CFTC Positioning", params: code ? { code } : undefined,
|
|
21
21
|
settings: { report: options?.values?.report ?? "legacy" }, placement: "floating" as const };
|
|
22
22
|
},
|
|
@@ -4,12 +4,13 @@ import type { ResolvedSeries } from "../../../time-series/types";
|
|
|
4
4
|
import type { PricePoint } from "../../../types/financials";
|
|
5
5
|
import { formatPriceObservation } from "../../../market-data/market/format";
|
|
6
6
|
import { cleanFloat32Price } from "../../../cli/history-rows";
|
|
7
|
+
import { cryptoPairCoin, isFuturesSymbol } from "../shared/crypto-pair";
|
|
7
8
|
|
|
8
9
|
export const COT_CLASSES: Record<CotFamily, Array<{ value: CotClass; label: string }>> = {
|
|
9
10
|
legacy: [{ value: "noncommercial", label: "Noncommercial" }, { value: "commercial", label: "Commercial" }, { value: "nonreportable", label: "Nonreportable" }],
|
|
10
11
|
disaggregated: [{ value: "managed-money", label: "Managed Money" }, { value: "producer", label: "Producer/Merchant" }, { value: "swap", label: "Swap Dealers" }, { value: "other-reportable", label: "Other Reportables" }, { value: "nonreportable", label: "Nonreportable" }],
|
|
11
12
|
};
|
|
12
|
-
const ROOTS: Record<string, { code: string; exchange: string; priceSymbol: string | null; name: string }> = {
|
|
13
|
+
const ROOTS: Record<string, { code: string; exchange: string; priceSymbol: string | null; name: string; crypto?: true }> = {
|
|
13
14
|
ZN: { code: "043602", exchange: "CBT", priceSymbol: "ZN=F", name: "10-Year T-Note" },
|
|
14
15
|
ZQ: { code: "045601", exchange: "CBT", priceSymbol: "ZQ=F", name: "30-Day Fed Funds" },
|
|
15
16
|
CL: { code: "067651", exchange: "NYM", priceSymbol: "CL=F", name: "WTI Crude Oil" },
|
|
@@ -18,14 +19,27 @@ const ROOTS: Record<string, { code: string; exchange: string; priceSymbol: strin
|
|
|
18
19
|
VX: { code: "1170E1", exchange: "CFE", priceSymbol: null, name: "VIX Futures" },
|
|
19
20
|
SR3: { code: "134741", exchange: "CME", priceSymbol: null, name: "3-Month SOFR" },
|
|
20
21
|
ES: { code: "13874A", exchange: "CME", priceSymbol: "ES=F", name: "E-Mini S&P 500" },
|
|
22
|
+
// CME crypto, verified against the CFTC board on 2026-10-09. Only the standard
|
|
23
|
+
// bitcoin and ether contracts return five years of front-price history; the
|
|
24
|
+
// micros, XRP and SOL come back with a single bar, so they chart no price.
|
|
25
|
+
BTC: { code: "133741", exchange: "CME", priceSymbol: "BTC=F", name: "Bitcoin", crypto: true },
|
|
26
|
+
ETH: { code: "146021", exchange: "CME", priceSymbol: "ETH=F", name: "Ether", crypto: true },
|
|
27
|
+
MBT: { code: "133742", exchange: "CME", priceSymbol: null, name: "Micro Bitcoin", crypto: true },
|
|
28
|
+
MET: { code: "146022", exchange: "CME", priceSymbol: null, name: "Micro Ether", crypto: true },
|
|
29
|
+
SOL: { code: "177741", exchange: "CME", priceSymbol: null, name: "Solana", crypto: true },
|
|
30
|
+
XRP: { code: "176740", exchange: "CME", priceSymbol: null, name: "XRP", crypto: true },
|
|
21
31
|
};
|
|
22
32
|
/** The roots `cotContractCode` accepts, labeled "ZQ 30-Day Fed Funds". */
|
|
23
|
-
export const COT_ROOT_OPTIONS = Object.entries(ROOTS).map(([root, row]) => ({ value: root, label: `${root} ${row.name}` }));
|
|
33
|
+
export const COT_ROOT_OPTIONS = Object.entries(ROOTS).map(([root, row]) => ({ value: root, label: root === row.name ? root : `${root} ${row.name}` }));
|
|
34
|
+
/** The crypto roots named for a coin, which a coin pair (BTC-USD) can stand for. The micros have no pair. */
|
|
35
|
+
const COIN_PAIR_ROOTS: ReadonlySet<string> = new Set(["BTC", "ETH", "SOL", "XRP"]);
|
|
24
36
|
/**
|
|
25
37
|
* Front-month price overlays for major markets without a root alias, each
|
|
26
38
|
* checked to return five years of daily history (2026-09-24). Keyed by CFTC
|
|
27
39
|
* code, never added to ROOTS: an alias would also claim the equity ticker under
|
|
28
40
|
* the cursor (ZM, ZS, PL). No cash index stands in, so the dollar index has none.
|
|
41
|
+
* Bitcoin and ether are in ROOTS, where `cotContractCodeForTicker` keeps the
|
|
42
|
+
* same guard for their aliases.
|
|
29
43
|
*/
|
|
30
44
|
const PRICE_OVERLAYS: Record<string, { exchange: string; priceSymbol: string }> = {
|
|
31
45
|
"209742": { exchange: "CME", priceSymbol: "NQ=F" }, "239742": { exchange: "CME", priceSymbol: "RTY=F" },
|
|
@@ -37,7 +51,6 @@ const PRICE_OVERLAYS: Record<string, { exchange: string; priceSymbol: string }>
|
|
|
37
51
|
"096742": { exchange: "CME", priceSymbol: "6B=F" }, "090741": { exchange: "CME", priceSymbol: "6C=F" },
|
|
38
52
|
"232741": { exchange: "CME", priceSymbol: "6A=F" }, "092741": { exchange: "CME", priceSymbol: "6S=F" },
|
|
39
53
|
"095741": { exchange: "CME", priceSymbol: "6M=F" },
|
|
40
|
-
"133741": { exchange: "CME", priceSymbol: "BTC=F" }, "146021": { exchange: "CME", priceSymbol: "ETH=F" },
|
|
41
54
|
"023651": { exchange: "NYM", priceSymbol: "NG=F" }, "111659": { exchange: "NYM", priceSymbol: "RB=F" },
|
|
42
55
|
"022651": { exchange: "NYM", priceSymbol: "HO=F" }, "06765T": { exchange: "NYM", priceSymbol: "BZ=F" },
|
|
43
56
|
"085692": { exchange: "CMX", priceSymbol: "HG=F" }, "076651": { exchange: "NYM", priceSymbol: "PL=F" },
|
|
@@ -77,11 +90,31 @@ export const COT_SCOPES = [{ value: "major", label: "Major markets" }, { value:
|
|
|
77
90
|
export type CotScope = typeof COT_SCOPES[number]["value"];
|
|
78
91
|
export function cotScope(value: unknown): CotScope { return value === "all" ? "all" : "major"; }
|
|
79
92
|
|
|
93
|
+
/** A CFTC code or root typed as an argument or stored in a pane: every alias, crypto included. */
|
|
80
94
|
export function cotContractCode(value: unknown): string | null {
|
|
81
95
|
if (typeof value !== "string") return null;
|
|
82
96
|
const input = value.trim().toUpperCase().replace(/=F$/, "");
|
|
83
97
|
return ROOTS[input === "VIX" ? "VX" : input]?.code ?? (/^[0-9A-Z]{5}[0-9A-Z+]$/.test(input) ? input : null);
|
|
84
98
|
}
|
|
99
|
+
/** What a market that is neither a root nor a CFTC code is told, with ones that work. */
|
|
100
|
+
export function cotUnknownMarketMessage(value: unknown): string {
|
|
101
|
+
const roots = ["ES", "CL", "GC", "ZN"].filter((root) => ROOTS[root]);
|
|
102
|
+
return `Unknown market "${String(value)}". Try ${roots.join(", ")} or a CFTC market code such as ${ROOTS.GC!.code}.`;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* The code for the ticker under the cursor, when COT is opened without an
|
|
106
|
+
* argument. The crypto aliases are also US ticker symbols (Grayscale's mini
|
|
107
|
+
* trusts are BTC and ETH, MetLife is MET), so a bare one is the equity's and
|
|
108
|
+
* never claims the market: only a futures symbol (BTC=F) or a coin pair
|
|
109
|
+
* (BTC-USD) does.
|
|
110
|
+
*/
|
|
111
|
+
export function cotContractCodeForTicker(ticker: unknown): string | null {
|
|
112
|
+
if (typeof ticker !== "string") return null;
|
|
113
|
+
const coin = cryptoPairCoin(ticker);
|
|
114
|
+
if (coin) return COIN_PAIR_ROOTS.has(coin) ? ROOTS[coin]!.code : null;
|
|
115
|
+
const input = ticker.trim().toUpperCase().replace(/=F$/, "");
|
|
116
|
+
return ROOTS[input]?.crypto && !isFuturesSymbol(ticker) ? null : cotContractCode(ticker);
|
|
117
|
+
}
|
|
85
118
|
/** The verified futures root a CFTC code belongs to, for titles readers recognize. */
|
|
86
119
|
export function cotRoot(code: string): string | null {
|
|
87
120
|
return Object.entries(ROOTS).find(([, row]) => row.code === code)?.[0] ?? null;
|
|
@@ -52,6 +52,8 @@ export const cpiHeadless: HeadlessPaneDefinition<"bundle"> = {
|
|
|
52
52
|
const headline = data.rows.find((row) => row.code === "SA0") ?? null;
|
|
53
53
|
const argument = Array.isArray(args.argument) ? args.argument.join(" ") : args.argument;
|
|
54
54
|
const metadata = { ...data, complete: data.status === "available" };
|
|
55
|
+
const freshness = { source: "BLS", status: "not-a-feed" as const, basis: "monthly release",
|
|
56
|
+
asOf: data.release.releasedAt, nextExpectedAt: data.release.nextReleaseAt };
|
|
55
57
|
if (argument) {
|
|
56
58
|
const option = cpiRowOption(argument);
|
|
57
59
|
const row = option ? data.rows.find((entry) => entry.id === option.value) : null;
|
|
@@ -66,12 +68,14 @@ export const cpiHeadless: HeadlessPaneDefinition<"bundle"> = {
|
|
|
66
68
|
rows: historyRows(row, headline) },
|
|
67
69
|
],
|
|
68
70
|
errors: data.gaps,
|
|
71
|
+
freshness,
|
|
69
72
|
metadata: { ...metadata, rows: [row] },
|
|
70
73
|
};
|
|
71
74
|
}
|
|
72
75
|
return {
|
|
73
76
|
sections: [{ title: header, columns: SUMMARY_COLUMNS, rows: cpiRows(data).map((row) => reportRow(row)) }],
|
|
74
77
|
errors: data.gaps,
|
|
78
|
+
freshness,
|
|
75
79
|
metadata,
|
|
76
80
|
};
|
|
77
81
|
},
|
|
@@ -8,6 +8,7 @@ export const cdxHeadless: HeadlessPaneDefinition<"rows"> = {
|
|
|
8
8
|
discovery: { aliases: ["CDX"], dataRequirements: ["Gloom Cloud index CDS endpoint"],
|
|
9
9
|
limitations: ["Daily medians of public DTCC prints on the on-the-run 5Y contract", "HY and EM quote in price"] },
|
|
10
10
|
shape: "rows",
|
|
11
|
+
freshness: { source: "DTCC", status: "not-a-feed", basis: "daily medians of public trades", cadence: "daily", observedKey: "date" },
|
|
11
12
|
argument: { kind: "none" },
|
|
12
13
|
options: [],
|
|
13
14
|
columns: [
|
|
@@ -43,6 +44,7 @@ export const sovrHeadless: HeadlessPaneDefinition<"rows"> = {
|
|
|
43
44
|
discovery: { aliases: ["SOVR", "WCDS"], dataRequirements: ["Gloom Cloud sovereign CDS endpoint"],
|
|
44
45
|
limitations: ["Daily 5Y levels from public DTCC prints; thinly traded names can miss days"] },
|
|
45
46
|
shape: "rows",
|
|
47
|
+
freshness: { source: "DTCC", status: "not-a-feed", basis: "daily levels of public trades", cadence: "daily", observedKey: "date" },
|
|
46
48
|
argument: { kind: "none" },
|
|
47
49
|
options: [],
|
|
48
50
|
columns: [
|
|
@@ -38,6 +38,7 @@ function createCreditConditionsHeadless(
|
|
|
38
38
|
options: [],
|
|
39
39
|
columns: COLUMNS,
|
|
40
40
|
describe: "Credit Spreads",
|
|
41
|
+
freshness: { source: "FRED", status: "not-a-feed", basis: "daily index levels", cadence: "daily", observedKey: "date" },
|
|
41
42
|
async load(args, ctx) {
|
|
42
43
|
const result = await dependencies.load(
|
|
43
44
|
args,
|
|
@@ -1,17 +1,14 @@
|
|
|
1
1
|
import type { CreditHeadroom } from "../../../api-client/credit-documents";
|
|
2
|
+
import { ratioBarGlyphs } from "../../../components/ui/ratio-bar";
|
|
2
3
|
import { useThemeColors } from "../../../theme/theme-context";
|
|
3
4
|
import { Box, Text, useUiCapabilities } from "../../../ui";
|
|
4
5
|
import { covenantUsage, headroomTone } from "./model";
|
|
5
6
|
|
|
6
|
-
const EIGHTHS = ["", "▏", "▎", "▍", "▌", "▋", "▊", "▉"];
|
|
7
7
|
/** Where the limit sits along the gauge; the rest shows how far a breach runs past it. */
|
|
8
8
|
const LIMIT_AT = 0.8;
|
|
9
9
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
const eighth = Math.round((cells - full) * 8);
|
|
13
|
-
return eighth === 8 ? "█".repeat(full + 1) : `${"█".repeat(full)}${EIGHTHS[eighth]}`;
|
|
14
|
-
}
|
|
10
|
+
/** `cells` of a run `span` cells long, in eighth-cell block glyphs. */
|
|
11
|
+
const blocks = (cells: number, span: number) => ratioBarGlyphs(cells / span, span, { resolution: "eighth" });
|
|
15
12
|
|
|
16
13
|
/**
|
|
17
14
|
* How much of a covenant's limit the reported metric uses, against a marker at
|
|
@@ -44,10 +41,10 @@ export function HeadroomGauge({ covenant, width, selected }: { covenant: CreditH
|
|
|
44
41
|
// In cells the limit is a whole column: usage 1 fills up to it, a breach runs through it.
|
|
45
42
|
const limit = Math.min(width - 1, Math.round(width * LIMIT_AT));
|
|
46
43
|
const cells = Math.min(width, Math.max(0, usage) * limit);
|
|
47
|
-
const after = cells > limit + 1 ? blocks(cells - limit - 1) : "";
|
|
44
|
+
const after = cells > limit + 1 ? blocks(cells - limit - 1, width - limit - 1) : "";
|
|
48
45
|
return (
|
|
49
46
|
<Box flexDirection="row" width={width} overflow="hidden">
|
|
50
|
-
<Text fg={fill}>{blocks(Math.min(cells, limit)).padEnd(limit)}</Text>
|
|
47
|
+
<Text fg={fill}>{blocks(Math.min(cells, limit), limit).padEnd(limit)}</Text>
|
|
51
48
|
<Text fg={marker} bg={cells > limit ? fill : undefined}>│</Text>
|
|
52
49
|
{after ? <Text fg={fill}>{after}</Text> : null}
|
|
53
50
|
</Box>
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import type { HeadlessPaneDefinition } from "../../../types/plugin";
|
|
2
2
|
import { fetchCreditDocuments, fetchCreditInstrument, fetchCreditScreen } from "./client";
|
|
3
3
|
import { CREDIT_TABS } from "./model";
|
|
4
|
+
import { SEC_FILINGS } from "../shared/report-freshness";
|
|
4
5
|
|
|
5
6
|
export const creditHeadless: HeadlessPaneDefinition<"bundle"> = {
|
|
6
7
|
shape: "bundle",
|
|
8
|
+
freshness: SEC_FILINGS,
|
|
7
9
|
argument: { kind: "ticker", description: "Issuer ticker, including exchange-qualified global symbols.", placeholder: "ticker" },
|
|
8
10
|
discovery: { aliases: ["CRDOC"], dataRequirements: ["Gloom Cloud credit-document evidence"], limitations: [
|
|
9
11
|
"Pro dataset; free accounts see a limited preview", "SEC credit documents with global issuer identifiers; other jurisdictions depend on connected sources",
|
|
@@ -40,6 +40,9 @@ export const cryptoBoardHeadless: HeadlessPaneDefinition<"rows"> = {
|
|
|
40
40
|
aliases: ["CRYP"],
|
|
41
41
|
dataRequirements: ["Gloom Cloud crypto markets"],
|
|
42
42
|
},
|
|
43
|
+
// A board snapshot refreshed every few minutes; the pane streams, the report does not.
|
|
44
|
+
// Crypto trades around the clock, so a snapshot an hour old has stopped refreshing.
|
|
45
|
+
freshness: { status: "delayed", maxAgeMinutes: 60 },
|
|
43
46
|
async load(args, ctx) {
|
|
44
47
|
const kind = args.options.list === "stablecoin" ? "stablecoin" : "coin" satisfies CryptoAssetKind;
|
|
45
48
|
const data = await fetchCryptoMarkets(ctx.apiClient);
|
|
@@ -101,7 +101,7 @@ export async function loadViewSource(
|
|
|
101
101
|
return {
|
|
102
102
|
rows,
|
|
103
103
|
columns,
|
|
104
|
-
errors: (loaded.result.errors ?? []).filter(Boolean),
|
|
104
|
+
errors: [...(loaded.result.errors ?? []), ...(loaded.result.notes ?? [])].filter(Boolean),
|
|
105
105
|
sourceLabel: resolved.label,
|
|
106
106
|
};
|
|
107
107
|
}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import type { HeadlessPaneDefinition } from "../../../types/plugin";
|
|
2
2
|
import { fetchDebtMaturities } from "./client";
|
|
3
3
|
import { bucketShare, debtNotices } from "./model";
|
|
4
|
+
import { SEC_FILINGS } from "../shared/report-freshness";
|
|
4
5
|
|
|
5
6
|
export const debtMaturitiesHeadless: HeadlessPaneDefinition<"bundle"> = {
|
|
6
7
|
shape: "bundle",
|
|
8
|
+
freshness: SEC_FILINGS,
|
|
7
9
|
argument: {
|
|
8
10
|
kind: "ticker",
|
|
9
11
|
description: "SEC reporting issuer ticker.",
|
|
@@ -84,6 +86,8 @@ export const debtMaturitiesHeadless: HeadlessPaneDefinition<"bundle"> = {
|
|
|
84
86
|
},
|
|
85
87
|
],
|
|
86
88
|
metadata: { ...data },
|
|
89
|
+
// The latest filing dates the report; the history rows are past years, not stale data.
|
|
90
|
+
freshness: { asOf: data.latest?.asOf ?? null },
|
|
87
91
|
};
|
|
88
92
|
},
|
|
89
93
|
};
|
|
@@ -1,24 +1,18 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { RatioBar } from "../../../components/ui/ratio-bar";
|
|
2
|
+
import { Box, Text } from "../../../ui";
|
|
2
3
|
import { colors } from "../../../theme/colors";
|
|
3
4
|
import type { BucketBar } from "./model";
|
|
4
5
|
|
|
5
|
-
const EIGHTHS = ["", "▏", "▎", "▍", "▌", "▋", "▊", "▉"];
|
|
6
6
|
const CAP = "▸";
|
|
7
7
|
|
|
8
8
|
/** Cells a capped bar keeps after its end for the cap. */
|
|
9
9
|
export const WALL_CAP_RESERVE = 2;
|
|
10
10
|
|
|
11
|
-
function blocks(cells: number): string {
|
|
12
|
-
const full = Math.floor(cells);
|
|
13
|
-
const eighth = Math.round((cells - full) * 8);
|
|
14
|
-
return eighth === 8 ? "█".repeat(full + 1) : `${"█".repeat(full)}${EIGHTHS[eighth]}`;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
11
|
/**
|
|
18
12
|
* One maturity bucket of the wall, inline in its table row. Dated buckets
|
|
19
13
|
* share one scale; a bucket past it (Thereafter, open ended) runs to the end,
|
|
20
14
|
* capped, so its length is never read as a measure; its PRINCIPAL cell says
|
|
21
|
-
* how much.
|
|
15
|
+
* how much.
|
|
22
16
|
*/
|
|
23
17
|
export function WallBar({ bar, width, reserve, selected }: {
|
|
24
18
|
bar: BucketBar | null;
|
|
@@ -27,37 +21,16 @@ export function WallBar({ bar, width, reserve, selected }: {
|
|
|
27
21
|
reserve: number;
|
|
28
22
|
selected: boolean;
|
|
29
23
|
}) {
|
|
30
|
-
const isDesktopWeb = useUiCapabilities().nativePaneChrome === true;
|
|
31
24
|
if (!bar || width <= 0) return <Text fg={colors.textDim}>{""}</Text>;
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
height: "9px",
|
|
44
|
-
borderRadius: "2px",
|
|
45
|
-
minWidth: bar.ratio > 0 ? "2px" : "0",
|
|
46
|
-
}}
|
|
47
|
-
/>
|
|
48
|
-
</Box>
|
|
49
|
-
{bar.capped ? <Text fg={labelColor}>{CAP}</Text> : null}
|
|
50
|
-
</Box>
|
|
51
|
-
);
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
if (bar.capped) {
|
|
55
|
-
return (
|
|
56
|
-
<Box flexDirection="row" width={width} overflow="hidden">
|
|
57
|
-
<Text fg={colors.warning}>{"█".repeat(scale)}</Text>
|
|
58
|
-
<Text fg={labelColor}>{` ${CAP}`}</Text>
|
|
59
|
-
</Box>
|
|
60
|
-
);
|
|
61
|
-
}
|
|
62
|
-
return <Text fg={colors.warning}>{blocks(bar.ratio * scale)}</Text>;
|
|
25
|
+
return (
|
|
26
|
+
<Box width={width} flexDirection="row" alignItems="center" overflow="hidden">
|
|
27
|
+
<RatioBar
|
|
28
|
+
ratio={bar.capped ? 1 : bar.ratio}
|
|
29
|
+
width={Math.max(1, width - reserve)}
|
|
30
|
+
color={colors.warning}
|
|
31
|
+
resolution="eighth"
|
|
32
|
+
/>
|
|
33
|
+
{bar.capped ? <Text fg={selected ? colors.selectedText : colors.text}>{` ${CAP}`}</Text> : null}
|
|
34
|
+
</Box>
|
|
35
|
+
);
|
|
63
36
|
}
|
|
@@ -6,6 +6,7 @@ import { resolveCurrencyUnit } from "../../../utils/currency-units";
|
|
|
6
6
|
import { calendarMonthsBefore } from "../../../utils/calendar-date";
|
|
7
7
|
import { inferCadence, trailingCashAt } from "./trailing-cash";
|
|
8
8
|
import { dividendQuotePriceMetadata } from "./reference-price";
|
|
9
|
+
import { mapQuote } from "../../../sources/gloomberb-cloud/normalizers";
|
|
9
10
|
|
|
10
11
|
export const DIVIDENDS_CONNECTION_ID = "gloom-dividends";
|
|
11
12
|
export const INCOMPLETE_DIVIDEND_HISTORY = "Incomplete cash history; totals unavailable.";
|
|
@@ -78,7 +79,8 @@ export async function fetchDividendData(
|
|
|
78
79
|
): Promise<DividendData> {
|
|
79
80
|
const response = await trackRequest("dividends", () => apiClient.getMarketDividends(symbol, exchange));
|
|
80
81
|
if (!response.data) throw new Error(`No dividend data found for ${symbol}`);
|
|
81
|
-
const { actions, quote, summary: quoteFields } = response.data;
|
|
82
|
+
const { actions, quote: rawQuote, summary: quoteFields } = response.data;
|
|
83
|
+
const quote = rawQuote ? mapQuote(rawQuote) : null;
|
|
82
84
|
const summaryError = response.data.summaryError ?? (!quoteFields ? UNAVAILABLE_DIVIDEND_SUMMARY
|
|
83
85
|
: [quoteFields.exDividendDate, quoteFields.dividendDate]
|
|
84
86
|
.some((timestamp) => timestamp != null && reportedDividendDate(timestamp) === null)
|
|
@@ -111,7 +113,7 @@ export async function fetchDividendData(
|
|
|
111
113
|
}
|
|
112
114
|
return {
|
|
113
115
|
payments, metrics, price, currency: currency || undefined, historyAvailable,
|
|
114
|
-
...(suppliedPrice == null && price != null && quote ? dividendQuotePriceMetadata(
|
|
116
|
+
...(suppliedPrice == null && price != null && quote ? dividendQuotePriceMetadata(quote) : {}),
|
|
115
117
|
...(historyError ? { historyError } : {}), ...(summaryError ? { summaryError } : {}),
|
|
116
118
|
providerId: actions?.providerId ?? "gloom", fetchedAt: actions?.fetchedAt,
|
|
117
119
|
stale: response.stale === true || response.data.stale === true || actions?.stale === true,
|
|
@@ -138,6 +138,7 @@ export function createDividendYieldHeadless(
|
|
|
138
138
|
): HeadlessPaneDefinition<"bundle"> {
|
|
139
139
|
return {
|
|
140
140
|
shape: "bundle",
|
|
141
|
+
freshness: { status: "not-a-feed", basis: "distribution history" },
|
|
141
142
|
argument: {
|
|
142
143
|
kind: "ticker",
|
|
143
144
|
placeholder: "ticker",
|
|
@@ -15,6 +15,7 @@ import {
|
|
|
15
15
|
formatDoeVsFive,
|
|
16
16
|
formatDoeVsYear,
|
|
17
17
|
} from "./model";
|
|
18
|
+
import { newestReportTime, oldestReportTime } from "../../../utils/utc-time";
|
|
18
19
|
|
|
19
20
|
const text = (value: unknown) => typeof value === "string" ? value : "--";
|
|
20
21
|
|
|
@@ -60,6 +61,10 @@ export function doeHeadless(defaultTab: DoeTab | "all"): HeadlessPaneDefinition<
|
|
|
60
61
|
describe: "EIA weekly petroleum and natural gas storage",
|
|
61
62
|
async load(args) {
|
|
62
63
|
const data = await fetchDoeBoard();
|
|
64
|
+
// EIA's weekly reports; once the next one is a day overdue the tables have missed it.
|
|
65
|
+
const freshness = { source: "EIA", status: "not-a-feed" as const, basis: "weekly release",
|
|
66
|
+
asOf: newestReportTime(data.reports.map((report) => report.releasedAt)),
|
|
67
|
+
nextExpectedAt: oldestReportTime(data.reports.map((report) => report.nextReleaseAt)) };
|
|
63
68
|
const argument = Array.isArray(args.argument) ? args.argument.join(" ") : args.argument;
|
|
64
69
|
if (argument) {
|
|
65
70
|
const option = doeSeriesOption(argument);
|
|
@@ -75,6 +80,7 @@ export function doeHeadless(defaultTab: DoeTab | "all"): HeadlessPaneDefinition<
|
|
|
75
80
|
rows: seasonalRows(row) },
|
|
76
81
|
],
|
|
77
82
|
errors: data.gaps,
|
|
83
|
+
freshness,
|
|
78
84
|
metadata: { ...data, series: [row], complete: data.status === "available" },
|
|
79
85
|
};
|
|
80
86
|
}
|
|
@@ -86,6 +92,7 @@ export function doeHeadless(defaultTab: DoeTab | "all"): HeadlessPaneDefinition<
|
|
|
86
92
|
rows: doeRows(data, tab).map(reportRow),
|
|
87
93
|
})),
|
|
88
94
|
errors: data.gaps,
|
|
95
|
+
freshness,
|
|
89
96
|
metadata: { ...data, complete: data.status === "available" },
|
|
90
97
|
};
|
|
91
98
|
},
|