gloomberb 0.18.2 → 0.18.4
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 +8 -8
- package/README.zh-CN.md +11 -11
- package/bin/{gloomberb → gloom} +3 -1
- package/package.json +6 -2
- package/patches/electrobun@1.18.1.patch +106 -5
- package/src/account/checkout-handoff.tsx +225 -0
- package/src/account/device-signin-dialog.tsx +2 -2
- package/src/account/device-signin.ts +2 -2
- package/src/account/upgrade-dialog.tsx +1 -1
- package/src/api-client/askg.ts +2 -2
- package/src/api-client/auth.ts +2 -2
- package/src/api-client/central-bank-rates.ts +6 -0
- package/src/api-client/collections.ts +5 -1
- package/src/api-client/cot.ts +2 -0
- package/src/api-client/crypto-etf-flows.ts +37 -0
- package/src/api-client/crypto-markets.ts +60 -0
- package/src/api-client/data.ts +99 -5
- package/src/api-client/doe.ts +15 -0
- package/src/api-client/equity-screener.ts +28 -0
- package/src/api-client/exchange-announcements.ts +38 -0
- package/src/api-client/fund-facts.ts +39 -0
- package/src/api-client/futures-curve.ts +9 -1
- package/src/api-client/hiring.ts +301 -0
- package/src/api-client/index.ts +24 -5
- package/src/api-client/market-discovery.ts +14 -0
- package/src/api-client/members.ts +6 -0
- package/src/api-client/mna.ts +6 -0
- package/src/api-client/paths.ts +18 -1
- package/src/api-client/request.ts +26 -7
- package/src/api-client/short-side-publications.ts +37 -0
- package/src/api-client/socket.ts +64 -4
- package/src/api-client/swap-curve.ts +35 -0
- package/src/api-client/telemetry.ts +17 -0
- package/src/api-client/themes.ts +7 -1
- package/src/api-client/types.ts +90 -2
- package/src/app/global-shortcuts.ts +1 -16
- package/src/app/pane-runtime/plugin-bindings.ts +9 -2
- package/src/app/runtime/desktop-deeplink.ts +5 -5
- package/src/app/runtime/plugin-bindings.ts +2 -2
- package/src/app/runtime/startup.ts +13 -0
- package/src/app/runtime/update.ts +28 -8
- package/src/app/star-prompt/status-line.tsx +2 -2
- package/src/architecture/core-builtin-allowlist.json +5 -2
- package/src/architecture/pane-tabs-allowlist.json +65 -0
- package/src/architecture/ui-literals-allowlist.json +3 -3
- package/src/architecture/ui-tokens-allowlist.json +1 -1
- package/src/brokers/broker-portfolio-sync.ts +37 -0
- package/src/brokers/directory.ts +11 -0
- package/src/brokers/logos.ts +3 -1
- package/src/brokers/signed-in/adapter.ts +304 -26
- package/src/brokers/signed-in/client.ts +14 -2
- package/src/brokers/signed-in/connect.ts +10 -2
- package/src/brokers/sync-broker-instance.ts +9 -1
- package/src/capabilities/chart-series.ts +22 -6
- package/src/cli/bank-section.ts +1 -1
- package/src/cli/base-converter.ts +23 -14
- package/src/cli/central-bank-events.ts +1 -1
- package/src/cli/command-options.ts +59 -4
- package/src/cli/commands/api.ts +9 -6
- package/src/cli/commands/broker.ts +2 -2
- package/src/cli/commands/command-utils.ts +2 -2
- package/src/cli/commands/crypto-hints.ts +7 -20
- package/src/cli/commands/fred-series.ts +4 -2
- package/src/cli/commands/keybindings.ts +2 -2
- package/src/cli/commands/market.ts +1189 -296
- package/src/cli/commands/news-hints.ts +2 -2
- package/src/cli/commands/news-search.ts +59 -6
- package/src/cli/commands/options-leaps.ts +41 -26
- package/src/cli/commands/overview.ts +121 -48
- package/src/cli/commands/plugins.ts +9 -9
- package/src/cli/commands/remote.ts +13 -10
- package/src/cli/commands/search.ts +64 -44
- package/src/cli/commands/system.ts +27 -19
- package/src/cli/commands/themes.ts +1 -1
- package/src/cli/commands/ticker.ts +272 -70
- package/src/cli/context.ts +3 -2
- package/src/cli/desktop-pane-shot-view.ts +2 -2
- package/src/cli/desktop-pane-shot.ts +1 -1
- package/src/cli/earnings-calendar.ts +4 -4
- package/src/cli/entry.ts +18 -1
- package/src/cli/errors.ts +20 -2
- package/src/cli/exit-codes.ts +1 -1
- package/src/cli/export-source.ts +10 -4
- package/src/cli/freshness.ts +2 -8
- package/src/cli/fx-forward.ts +130 -0
- package/src/cli/fx-pair.ts +10 -9
- package/src/cli/glossary.ts +64 -20
- package/src/cli/help.ts +20 -14
- package/src/cli/history-export.ts +126 -0
- package/src/cli/history-rows.ts +196 -43
- package/src/cli/index-roots.ts +5 -45
- package/src/cli/index.ts +32 -18
- package/src/cli/issuer-membership.ts +103 -0
- package/src/cli/known-gaps.ts +118 -25
- package/src/cli/listing-arg.ts +315 -43
- package/src/cli/name-entries.ts +73 -22
- package/src/cli/native-smoke.ts +2 -0
- package/src/cli/not-a-ticker.ts +19 -9
- package/src/cli/opentui-libc.ts +5 -0
- package/src/cli/options.ts +12 -0
- package/src/cli/pane-functions/capabilities.ts +77 -20
- package/src/cli/pane-functions/catalog.ts +40 -23
- package/src/cli/pane-functions/discovery.ts +1 -1
- package/src/cli/pane-functions/dom.ts +12 -8
- package/src/cli/pane-functions/financial-ratio-shot.ts +2 -2
- package/src/cli/pane-functions/freshness.ts +174 -23
- package/src/cli/pane-functions/function-help.ts +66 -27
- package/src/cli/pane-functions/headless.ts +48 -16
- package/src/cli/pane-functions/index.ts +82 -21
- package/src/cli/pane-functions/options.ts +22 -2
- package/src/cli/pane-functions/report-notices.ts +12 -4
- package/src/cli/pane-functions/report.ts +5 -5
- package/src/cli/pane-functions/resolver.ts +65 -14
- package/src/cli/pane-functions/screenshot-assessment.ts +322 -0
- package/src/cli/pane-functions/screenshot-bridge.ts +152 -0
- package/src/cli/pane-functions/screenshot-chart-evidence.ts +396 -0
- package/src/cli/pane-functions/screenshot-data-evidence.ts +383 -0
- package/src/cli/pane-functions/screenshot-evidence.ts +1 -1
- package/src/cli/pane-functions/screenshot-payload.ts +453 -0
- package/src/cli/pane-functions/screenshot-render.ts +316 -0
- package/src/cli/pane-functions/screenshot-types.ts +162 -0
- package/src/cli/pane-functions/shot-options.ts +8 -3
- package/src/cli/peso-dollar-rates.ts +79 -0
- package/src/cli/quote-answer.ts +38 -3
- package/src/cli/report-tables.ts +190 -27
- package/src/cli/restore-plugins.ts +29 -14
- package/src/cli/result.ts +122 -25
- package/src/cli/series-search.ts +5 -5
- package/src/cli/statement-filings.ts +19 -0
- package/src/cli/suffixed-listing-rows.ts +49 -0
- package/src/cli/symbol-args.ts +50 -15
- package/src/cli/symbol-cells.ts +120 -0
- package/src/cli/symbol-list.ts +226 -60
- package/src/cli/symbol-rows.ts +131 -25
- package/src/cli/ticker-resolution.ts +108 -11
- package/src/cli/treasury-yields.ts +5 -5
- package/src/cli/types.ts +2 -0
- package/src/cli/uncovered-instrument.ts +3 -3
- package/src/cli/unknown-command.ts +6 -6
- package/src/components/chart/composite/chart-layout.ts +131 -0
- package/src/components/chart/composite/composite-chart.tsx +387 -21
- package/src/components/chart/composite/drawing-store.ts +26 -6
- package/src/components/chart/composite/interactions.ts +9 -3
- package/src/components/chart/composite/legend.tsx +75 -3
- package/src/components/chart/composite/levels.ts +5 -0
- package/src/components/chart/composite/panel-gestures.ts +41 -0
- package/src/components/chart/composite/panel-labels.ts +2 -1
- package/src/components/chart/composite/panel-surface.tsx +316 -11
- package/src/components/chart/composite/price-axis-labels.tsx +27 -3
- package/src/components/chart/composite/rasterizer.ts +44 -19
- package/src/components/chart/composite/scene.ts +16 -4
- package/src/components/chart/composite/text-renderer.ts +48 -21
- package/src/components/chart/composite/toolbar.tsx +52 -5
- package/src/components/chart/composite/types.ts +19 -0
- package/src/components/chart/composite/use-composite-chart-keyboard.ts +120 -13
- package/src/components/chart/composite/use-composite-value-scales.ts +44 -0
- package/src/components/chart/composite/use-composite-viewport.ts +12 -3
- package/src/components/chart/composite/value-scale.ts +149 -0
- package/src/components/chart/composite/volume-profile-paint.ts +6 -3
- package/src/components/chart/core/pointer.ts +2 -0
- package/src/components/chart-table/index.ts +2 -0
- package/src/components/chart-table/read.tsx +74 -0
- package/src/components/command-bar/commands/collection-list.ts +41 -19
- package/src/components/command-bar/commands/collection.ts +9 -3
- package/src/components/command-bar/commands/direct/index.ts +1 -1
- package/src/components/command-bar/commands/direct/runtime.ts +3 -2
- package/src/components/command-bar/pane-templates/items.ts +59 -6
- package/src/components/command-bar/pane-templates/workflow.ts +10 -1
- package/src/components/command-bar/routes/root/command-items.ts +32 -6
- package/src/components/command-bar/routes/root/plugin-install.ts +1 -1
- package/src/components/command-bar/routes/root/provider-search.ts +42 -11
- package/src/components/command-bar/routes/root/results.ts +18 -4
- package/src/components/command-bar/routes/root/runtime.ts +15 -3
- package/src/components/command-bar/routes/root/search-providers.ts +25 -2
- package/src/components/command-bar/routes/root/selection.ts +6 -1
- package/src/components/command-bar/routes/root/shortcut-feedback.ts +4 -1
- package/src/components/command-bar/routes/root/shortcuts.ts +30 -3
- package/src/components/command-bar/routes/ticker-search/results.ts +73 -4
- package/src/components/command-bar/selection-runtime.ts +50 -10
- package/src/components/command-bar/surface/index.tsx +24 -2
- package/src/components/command-bar/view-model.ts +7 -0
- package/src/components/command-bar/workflow/broker.ts +2 -2
- package/src/components/command-bar/workflow/collection-actions.ts +46 -7
- package/src/components/command-bar/workflow/collection-ticker.ts +32 -4
- package/src/components/command-bar/workflow/fields.ts +8 -2
- package/src/components/command-bar/workflow/ops.ts +18 -4
- package/src/components/command-bar/workflow/portfolio-position.ts +53 -4
- package/src/components/command-bar/workflow/submit.ts +3 -2
- package/src/components/command-bar/workflow/tickers.ts +5 -1
- package/src/components/company-logo.tsx +39 -0
- package/src/components/data-table/sections.ts +4 -2
- package/src/components/data-table/view.tsx +23 -3
- package/src/components/form-modal/confirm.tsx +2 -1
- package/src/components/form-modal/request.ts +5 -0
- package/src/components/form-modal/routes.ts +4 -1
- package/src/components/index.ts +13 -6
- package/src/components/layout/detached-pane-shell.tsx +1 -0
- package/src/components/layout/floating-pane.tsx +1 -0
- package/src/components/layout/header.tsx +234 -60
- package/src/components/layout/market-summary.ts +9 -6
- package/src/components/layout/pane/capture-status.ts +1 -1
- package/src/components/layout/pane/footer/model.ts +11 -5
- package/src/components/layout/pane/header.tsx +10 -3
- package/src/components/layout/pane/index.tsx +1 -0
- package/src/components/layout/pane/pane-tabs.tsx +9 -1
- package/src/components/layout/shell/chrome.ts +19 -6
- package/src/components/layout/shell/index.tsx +2 -1
- package/src/components/layout/shell/pane/layers.tsx +19 -1
- package/src/components/layout/status-bar.tsx +2 -2
- package/src/components/market-board/index.tsx +11 -3
- package/src/components/onboarding/onboarding-wizard.tsx +1 -0
- package/src/components/onboarding/portfolio-step/broker-setup-panel.tsx +2 -2
- package/src/components/onboarding/wizard-broker-sync.ts +4 -1
- package/src/components/pane-settings-dialog/desktop.tsx +20 -7
- package/src/components/pane-settings-dialog/tui.tsx +17 -9
- package/src/components/pane-settings-dialog/value.ts +8 -1
- package/src/components/pane-settings-dialog.tsx +44 -13
- package/src/components/sign-in-code-panel.tsx +27 -19
- package/src/components/ui/column-grid.tsx +48 -4
- package/src/components/ui/country-flag-art.tsx +180 -0
- package/src/components/ui/country-flag.tsx +118 -12
- package/src/components/ui/data-table/opentui/index.tsx +61 -2
- package/src/components/ui/data-table/opentui/model.ts +109 -2
- package/src/components/ui/data-table/types.ts +1 -1
- package/src/components/ui/display.tsx +5 -1
- package/src/components/ui/index.ts +3 -1
- package/src/components/ui/logo-mark.tsx +11 -2
- package/src/components/ui/query-bar.tsx +1 -1
- package/src/components/ui/row-notes.ts +79 -0
- package/src/components/ui/stat-grid.tsx +28 -3
- package/src/components/ui/status.tsx +3 -1
- package/src/core/app-services.ts +4 -0
- package/src/core/state/app/layout.ts +4 -4
- package/src/data/cached-query.ts +8 -1
- package/src/data/config/chart-settings.ts +3 -3
- package/src/data/config/home.ts +10 -2
- package/src/data/config/layout.ts +4 -1
- package/src/data/config/store/node.ts +4 -0
- package/src/data/config/store/normalize.ts +13 -3
- package/src/data/config/store/portfolio-as-of-column.ts +2 -2
- package/src/data/json-storage.ts +2 -0
- package/src/data/saved-copies.ts +84 -0
- package/src/docs/snapshot.json +65 -32
- package/src/i18n/es.ts +51 -12
- package/src/i18n/ja.ts +51 -12
- package/src/i18n/ko.ts +51 -12
- package/src/i18n/zh-cn.ts +51 -12
- package/src/i18n/zh-tw.ts +51 -12
- package/src/layout/desks.ts +1 -1
- package/src/layout/launch-layout.ts +1 -1
- package/src/layout/pane-manager/floating-actions.ts +5 -3
- package/src/layout/pane-manager/floating.ts +43 -1
- package/src/layout/pane-manager/index.ts +2 -0
- package/src/layout/selected-ticker.ts +74 -0
- package/src/market-data/depositary-pair.ts +251 -0
- package/src/market-data/futures-board.ts +1 -1
- package/src/market-data/futures-contract.ts +124 -40
- package/src/market-data/fx-closes.ts +17 -2
- package/src/market-data/hooks.tsx +19 -11
- package/src/market-data/market/change-basis.ts +49 -7
- package/src/market-data/market/freshness.ts +34 -5
- package/src/market-data/market/period-return.ts +163 -0
- package/src/market-data/market/trading-sessions.ts +13 -0
- package/src/market-data/market/year-to-date.ts +8 -13
- package/src/market-data/performance.ts +20 -14
- package/src/market-data/perpetual-premium.ts +32 -0
- package/src/market-data/published-apac-sessions.ts +2 -1
- package/src/market-data/published-futures-sessions.ts +69 -0
- package/src/market-data/quotes/contributions.ts +5 -1
- package/src/market-data/quotes/freshness.ts +42 -0
- package/src/market-data/quotes/intraday-bar.ts +37 -0
- package/src/market-data/quotes/regular-session-valuation.ts +13 -8
- package/src/market-data/quotes/resolution.ts +4 -2
- package/src/market-data/tax-equivalent.ts +1 -1
- package/src/market-data/ticker-price-returns.ts +3 -1
- package/src/news/aggregator.ts +5 -1
- package/src/news/news-model.ts +4 -0
- package/src/news/types.ts +11 -0
- package/src/notifications/app-notifier.ts +1 -1
- package/src/plugins/auto-update.ts +2 -2
- package/src/plugins/builtin/account-management/index.tsx +1 -0
- package/src/plugins/builtin/account-management/pane.tsx +9 -8
- package/src/plugins/builtin/alerts/alert-engine.ts +30 -18
- package/src/plugins/builtin/alerts/calendar-events.ts +378 -0
- package/src/plugins/builtin/alerts/cli.ts +485 -76
- package/src/plugins/builtin/alerts/command.ts +5 -10
- package/src/plugins/builtin/alerts/event-rows.ts +9 -5
- package/src/plugins/builtin/alerts/events-pane.tsx +71 -56
- package/src/plugins/builtin/alerts/events.ts +108 -5
- package/src/plugins/builtin/alerts/fired-log.ts +78 -0
- package/src/plugins/builtin/alerts/format.ts +2 -1
- package/src/plugins/builtin/alerts/headless.ts +100 -39
- package/src/plugins/builtin/alerts/history-pane.tsx +105 -62
- package/src/plugins/builtin/alerts/history-rows.ts +89 -0
- package/src/plugins/builtin/alerts/index.tsx +45 -18
- package/src/plugins/builtin/alerts/iv-level.ts +365 -0
- package/src/plugins/builtin/alerts/levels.ts +3 -3
- package/src/plugins/builtin/alerts/pane.tsx +97 -29
- package/src/plugins/builtin/alerts/price.ts +35 -0
- package/src/plugins/builtin/alerts/quotes.ts +24 -0
- package/src/plugins/builtin/alerts/research-builder.ts +84 -11
- package/src/plugins/builtin/alerts/research-rules.ts +77 -3
- package/src/plugins/builtin/alerts/scheduled-check.ts +206 -32
- package/src/plugins/builtin/alerts/scheduled-sources.ts +26 -3
- package/src/plugins/builtin/alerts/scheduled.ts +188 -29
- package/src/plugins/builtin/alerts/storage.ts +13 -10
- package/src/plugins/builtin/alerts/targets.ts +12 -3
- package/src/plugins/builtin/analytics/index.tsx +8 -2
- package/src/plugins/builtin/analytics/metrics.ts +1 -1
- package/src/plugins/builtin/analytics/risk-book.ts +215 -0
- package/src/plugins/builtin/analytics/risk-client.ts +13 -6
- package/src/plugins/builtin/analytics/risk-headless.ts +55 -21
- package/src/plugins/builtin/analytics/risk-math.ts +6 -3
- package/src/plugins/builtin/analytics/risk-model.ts +297 -104
- package/src/plugins/builtin/analytics/risk-options.ts +17 -2
- package/src/plugins/builtin/analytics/risk-pane.tsx +107 -43
- package/src/plugins/builtin/attention/pane.tsx +22 -16
- package/src/plugins/builtin/awards/headless.ts +7 -3
- package/src/plugins/builtin/awards/model.ts +18 -0
- package/src/plugins/builtin/awards/pane.tsx +12 -9
- package/src/plugins/builtin/backtest/export.ts +1 -1
- package/src/plugins/builtin/backtest/headless.ts +3 -3
- package/src/plugins/builtin/backtest/rules.ts +41 -5
- package/src/plugins/builtin/broker-manager/add-flow.tsx +12 -7
- package/src/plugins/builtin/broker-manager/detail.tsx +47 -19
- package/src/plugins/builtin/broker-manager/footer.ts +27 -11
- package/src/plugins/builtin/broker-manager/index.tsx +21 -12
- package/src/plugins/builtin/broker-manager/keyboard.ts +1 -1
- package/src/plugins/builtin/broker-manager/model.ts +12 -2
- package/src/plugins/builtin/broker-manager/pane-actions.tsx +183 -57
- package/src/plugins/builtin/broker-manager/table.ts +28 -12
- package/src/plugins/builtin/broker-trading/account-picker.tsx +2 -1
- package/src/plugins/builtin/broker-trading/chart-levels.ts +82 -13
- package/src/plugins/builtin/broker-trading/controller.ts +45 -13
- package/src/plugins/builtin/broker-trading/dock.tsx +24 -4
- package/src/plugins/builtin/broker-trading/headless.ts +2 -1
- package/src/plugins/builtin/broker-trading/index.tsx +7 -1
- package/src/plugins/builtin/broker-trading/linked-orders.ts +148 -0
- package/src/plugins/builtin/broker-trading/order-feed.ts +75 -7
- package/src/plugins/builtin/broker-trading/orders.tsx +109 -31
- package/src/plugins/builtin/broker-trading/overview-orders.tsx +9 -3
- package/src/plugins/builtin/broker-trading/pane-model.ts +30 -2
- package/src/plugins/builtin/broker-trading/pane.tsx +115 -26
- package/src/plugins/builtin/broker-trading/ticket-parts.tsx +36 -7
- package/src/plugins/builtin/broker-trading/ticket.tsx +122 -36
- package/src/plugins/builtin/buildout/cells.tsx +4 -0
- package/src/plugins/builtin/buildout/detail/index.tsx +5 -1
- package/src/plugins/builtin/buildout/detail/ui.tsx +7 -4
- package/src/plugins/builtin/buildout/pane/index.tsx +34 -18
- package/src/plugins/builtin/buildout/pane/status.tsx +0 -4
- package/src/plugins/builtin/builtin-plugin-meta.ts +1 -1
- package/src/plugins/builtin/catalysts/client.ts +2 -2
- package/src/plugins/builtin/catalysts/detail.tsx +3 -2
- package/src/plugins/builtin/catalysts/index.tsx +1 -1
- package/src/plugins/builtin/catalysts/model.ts +49 -4
- package/src/plugins/builtin/catalysts/pane.tsx +9 -11
- package/src/plugins/builtin/central-bank-rates/client.ts +5 -0
- package/src/plugins/builtin/central-bank-rates/headless.ts +36 -10
- package/src/plugins/builtin/central-bank-rates/model.ts +33 -8
- package/src/plugins/builtin/changelog/index.tsx +1 -0
- package/src/plugins/builtin/chart-composer/catalog-inventory.ts +1 -0
- package/src/plugins/builtin/chart-composer/chart-spec-edit.ts +2 -1
- package/src/plugins/builtin/chart-composer/chart-spec.ts +7 -0
- package/src/plugins/builtin/chart-composer/cli-options.ts +2 -5
- package/src/plugins/builtin/chart-composer/data-catalog-pane.tsx +2 -1
- package/src/plugins/builtin/chart-composer/editor/controller.ts +2 -0
- package/src/plugins/builtin/chart-composer/editor.tsx +4 -1
- package/src/plugins/builtin/chart-composer/headless-schema.ts +28 -26
- package/src/plugins/builtin/chart-composer/headless.ts +253 -35
- package/src/plugins/builtin/chart-composer/index.tsx +12 -2
- package/src/plugins/builtin/chart-composer/leverage-overlay.ts +142 -0
- package/src/plugins/builtin/chart-composer/pane.tsx +128 -28
- package/src/plugins/builtin/chart-composer/series-catalog.ts +1 -0
- package/src/plugins/builtin/chart-composer/series-expression.ts +65 -6
- package/src/plugins/builtin/chart-composer/session-history.ts +15 -21
- package/src/plugins/builtin/chart-composer/session-range.ts +4 -2
- package/src/plugins/builtin/chart-composer/settings.ts +31 -19
- package/src/plugins/builtin/chart-composer/use-series-catalog.ts +5 -6
- package/src/plugins/builtin/chart-composer/viewport-labels.ts +18 -8
- package/src/plugins/builtin/chat/attachments/model.ts +3 -1
- package/src/plugins/builtin/chat/content/index.tsx +1 -1
- package/src/plugins/builtin/chat/pane-links/open.ts +1 -1
- package/src/plugins/builtin/chat/people.ts +1 -1
- package/src/plugins/builtin/clinical-trials/client.ts +5 -2
- package/src/plugins/builtin/clinical-trials/model.ts +13 -4
- package/src/plugins/builtin/clinical-trials/pane.tsx +32 -12
- package/src/plugins/builtin/clinical-trials/ticker-sponsor.ts +17 -0
- package/src/plugins/builtin/cloud/askg/controller.ts +1 -1
- package/src/plugins/builtin/cloud/askg/lock-note.ts +1 -1
- package/src/plugins/builtin/cloud/askg/tool-display.ts +1 -1
- package/src/plugins/builtin/cloud/auth-commands.ts +3 -3
- package/src/plugins/builtin/cloud/team/pane-sections.tsx +105 -47
- package/src/plugins/builtin/cloud/team/pane-ui.tsx +42 -4
- package/src/plugins/builtin/cloud/team/pane.tsx +204 -64
- package/src/plugins/builtin/cloud/thesis/store.ts +45 -22
- package/src/plugins/builtin/cloud-tweets/registration.ts +1 -0
- package/src/plugins/builtin/commodities-energy/index.tsx +29 -2
- package/src/plugins/builtin/commodities-energy/view-state.ts +2 -0
- package/src/plugins/builtin/commodity-balances/pane.tsx +14 -8
- package/src/plugins/builtin/company-attention/app-rank.tsx +11 -10
- package/src/plugins/builtin/company-attention/building-model.ts +222 -0
- package/src/plugins/builtin/company-attention/building.tsx +172 -0
- package/src/plugins/builtin/company-attention/client.ts +117 -1
- package/src/plugins/builtin/company-attention/evidence.ts +16 -3
- package/src/plugins/builtin/company-attention/headless.ts +101 -5
- package/src/plugins/builtin/company-attention/index.tsx +6 -3
- package/src/plugins/builtin/company-attention/model.ts +33 -7
- package/src/plugins/builtin/company-attention/moves-model.ts +253 -0
- package/src/plugins/builtin/company-attention/moves.tsx +159 -0
- package/src/plugins/builtin/company-attention/pane.tsx +89 -31
- package/src/plugins/builtin/company-attention/signals-model.ts +229 -0
- package/src/plugins/builtin/company-attention/signals.tsx +160 -0
- package/src/plugins/builtin/company-kpis/headless.ts +3 -2
- package/src/plugins/builtin/company-kpis/model.ts +2 -2
- package/src/plugins/builtin/company-kpis/pane.tsx +5 -4
- package/src/plugins/builtin/composite-plugins.ts +2 -1
- package/src/plugins/builtin/congress-trades/headless.ts +1 -1
- package/src/plugins/builtin/connections/index.ts +1 -0
- package/src/plugins/builtin/correlation/headless-schema.ts +3 -2
- package/src/plugins/builtin/correlation/headless.ts +7 -4
- package/src/plugins/builtin/correlation/relationship/model.ts +1 -0
- package/src/plugins/builtin/correlation/settings.ts +1 -0
- package/src/plugins/builtin/cot/headless.ts +28 -6
- package/src/plugins/builtin/cot/model.ts +12 -0
- package/src/plugins/builtin/cot/pane.tsx +7 -5
- package/src/plugins/builtin/cpi/headless.ts +5 -1
- package/src/plugins/builtin/cpi/pane.tsx +11 -9
- package/src/plugins/builtin/credit-boards/model.ts +2 -0
- package/src/plugins/builtin/credit-documents/headless.ts +1 -1
- package/src/plugins/builtin/credit-documents/pane.tsx +8 -7
- package/src/plugins/builtin/crypto-board/client.ts +86 -0
- package/src/plugins/builtin/crypto-board/defi-view.tsx +218 -0
- package/src/plugins/builtin/crypto-board/defi.ts +239 -0
- package/src/plugins/builtin/crypto-board/headless.ts +117 -6
- package/src/plugins/builtin/crypto-board/index.tsx +8 -3
- package/src/plugins/builtin/crypto-board/model.ts +40 -8
- package/src/plugins/builtin/crypto-board/pane.tsx +55 -21
- package/src/plugins/builtin/crypto-board/series.ts +19 -1
- package/src/plugins/builtin/crypto-etf-flows/client.ts +60 -0
- package/src/plugins/builtin/crypto-etf-flows/headless.ts +132 -0
- package/src/plugins/builtin/crypto-etf-flows/index.tsx +44 -0
- package/src/plugins/builtin/crypto-etf-flows/model.ts +121 -0
- package/src/plugins/builtin/crypto-etf-flows/pane.tsx +193 -0
- package/src/plugins/builtin/debt-maturities/pane.tsx +4 -3
- package/src/plugins/builtin/debug/index.tsx +1 -0
- package/src/plugins/builtin/dividend-yield/index.tsx +1 -1
- package/src/plugins/builtin/docs/index.tsx +1 -1
- package/src/plugins/builtin/docs/pane.tsx +2 -2
- package/src/plugins/builtin/docs/targets.ts +1 -1
- package/src/plugins/builtin/doe/client.ts +5 -1
- package/src/plugins/builtin/doe/headless.ts +12 -6
- package/src/plugins/builtin/doe/model.ts +43 -6
- package/src/plugins/builtin/doe/pane.tsx +19 -12
- package/src/plugins/builtin/earnings/board-model.ts +13 -6
- package/src/plugins/builtin/earnings/board-table.ts +4 -1
- package/src/plugins/builtin/earnings/board.tsx +253 -50
- package/src/plugins/builtin/earnings/calendar-model.ts +188 -0
- package/src/plugins/builtin/earnings/calendar.tsx +338 -0
- package/src/plugins/builtin/earnings/client.ts +4 -3
- package/src/plugins/builtin/earnings/headless.ts +53 -15
- package/src/plugins/builtin/earnings/history-model.ts +53 -36
- package/src/plugins/builtin/earnings/index.tsx +15 -22
- package/src/plugins/builtin/earnings/model.ts +17 -12
- package/src/plugins/builtin/earnings/scope.ts +89 -0
- package/src/plugins/builtin/earnings-calls/calendar.tsx +310 -0
- package/src/plugins/builtin/earnings-calls/data.ts +146 -2
- package/src/plugins/builtin/earnings-calls/headless.ts +151 -9
- package/src/plugins/builtin/earnings-calls/index.tsx +3 -3
- package/src/plugins/builtin/earnings-calls/lock-note.ts +1 -1
- package/src/plugins/builtin/earnings-calls/pane.tsx +149 -31
- package/src/plugins/builtin/earnings-calls/upcoming.ts +195 -0
- package/src/plugins/builtin/earnings-ripple/pane.tsx +10 -5
- package/src/plugins/builtin/econ/calendar-model.ts +132 -20
- package/src/plugins/builtin/econ/detail-view.tsx +48 -10
- package/src/plugins/builtin/econ/fred-catalog.ts +23 -6
- package/src/plugins/builtin/econ/fred-series-map.ts +4 -0
- package/src/plugins/builtin/econ/index.tsx +112 -25
- package/src/plugins/builtin/econ/print-watch.ts +2 -1
- package/src/plugins/builtin/econ/types.ts +32 -1
- package/src/plugins/builtin/econ-statistics/client.ts +16 -3
- package/src/plugins/builtin/econ-statistics/defs.ts +4 -0
- package/src/plugins/builtin/econ-statistics/detail.tsx +2 -2
- package/src/plugins/builtin/econ-statistics/headless.ts +13 -2
- package/src/plugins/builtin/econ-statistics/index.tsx +3 -3
- package/src/plugins/builtin/econ-statistics/pane.tsx +2 -1
- package/src/plugins/builtin/econ-statistics/stats.ts +103 -0
- package/src/plugins/builtin/econ-statistics/view.ts +16 -1
- package/src/plugins/builtin/equity-screener/client.ts +21 -3
- package/src/plugins/builtin/equity-screener/headless.ts +77 -5
- package/src/plugins/builtin/equity-screener/live.ts +1 -1
- package/src/plugins/builtin/equity-screener/model.ts +34 -0
- package/src/plugins/builtin/equity-screener/pane.tsx +148 -106
- package/src/plugins/builtin/equity-screener/screen-check.ts +90 -0
- package/src/plugins/builtin/equity-screener/ticker-check.tsx +148 -0
- package/src/plugins/builtin/estimate-revisions/headless.ts +3 -1
- package/src/plugins/builtin/estimate-revisions/lock-note.ts +3 -3
- package/src/plugins/builtin/estimate-revisions/model.ts +8 -10
- package/src/plugins/builtin/exposure/headless.ts +51 -6
- package/src/plugins/builtin/exposure/index.tsx +28 -2
- package/src/plugins/builtin/exposure/model.ts +7 -0
- package/src/plugins/builtin/exposure/pane.tsx +16 -10
- package/src/plugins/builtin/fear-greed/index.tsx +1 -1
- package/src/plugins/builtin/filing-events/index.tsx +1 -1
- package/src/plugins/builtin/futures/model.ts +10 -9
- package/src/plugins/builtin/futures/returns.ts +8 -36
- package/src/plugins/builtin/futures/table.tsx +1 -1
- package/src/plugins/builtin/futures-curve/client.ts +40 -9
- package/src/plugins/builtin/futures-curve/headless.ts +39 -17
- package/src/plugins/builtin/futures-curve/model.ts +258 -69
- package/src/plugins/builtin/futures-curve/pane.tsx +46 -17
- package/src/plugins/builtin/fx-matrix/client.ts +15 -8
- package/src/plugins/builtin/fx-matrix/headless.ts +32 -14
- package/src/plugins/builtin/fx-matrix/index.tsx +13 -11
- package/src/plugins/builtin/fx-matrix/live-legs.ts +22 -0
- package/src/plugins/builtin/fx-matrix/settings.ts +2 -1
- package/src/plugins/builtin/gpu/board.tsx +4 -1
- package/src/plugins/builtin/gpu/changes.tsx +10 -10
- package/src/plugins/builtin/gpu/equities.tsx +4 -1
- package/src/plugins/builtin/gpu/headless.ts +9 -4
- package/src/plugins/builtin/gpu/history.tsx +4 -2
- package/src/plugins/builtin/gpu/pane.tsx +5 -3
- package/src/plugins/builtin/help/index.tsx +13 -3
- package/src/plugins/builtin/holders/beneficial-model.ts +8 -11
- package/src/plugins/builtin/holders/beneficial-report.ts +6 -5
- package/src/plugins/builtin/holders/beneficial-view.tsx +7 -3
- package/src/plugins/builtin/holders/client.ts +15 -2
- package/src/plugins/builtin/holders/format.ts +28 -17
- package/src/plugins/builtin/holders/headless.ts +48 -8
- package/src/plugins/builtin/holders/index-holders.ts +264 -0
- package/src/plugins/builtin/holders/pane.tsx +79 -15
- package/src/plugins/builtin/holders/report-rows.ts +35 -7
- package/src/plugins/builtin/holders/table-model.ts +2 -1
- package/src/plugins/builtin/holders/thirteenf-match.ts +3 -1
- package/src/plugins/builtin/holders/treemap.tsx +2 -2
- package/src/plugins/builtin/insider/base-values.ts +11 -7
- package/src/plugins/builtin/insider/client.ts +3 -0
- package/src/plugins/builtin/insider/headless.ts +20 -7
- package/src/plugins/builtin/insider/index.tsx +17 -8
- package/src/plugins/builtin/insider/issuer.ts +34 -4
- package/src/plugins/builtin/insider/signals-client.ts +3 -3
- package/src/plugins/builtin/insider/signals.tsx +1 -1
- package/src/plugins/builtin/insider/table-model.ts +35 -13
- package/src/plugins/builtin/insider/table.tsx +5 -2
- package/src/plugins/builtin/ipo-calendar/pane.tsx +7 -4
- package/src/plugins/builtin/iv-history/client.ts +20 -0
- package/src/plugins/builtin/iv-history/events.ts +145 -0
- package/src/plugins/builtin/iv-history/format.ts +3 -0
- package/src/plugins/builtin/iv-history/headless.ts +91 -7
- package/src/plugins/builtin/iv-history/index.tsx +1 -1
- package/src/plugins/builtin/iv-history/model.ts +13 -4
- package/src/plugins/builtin/iv-history/series.ts +3 -1
- package/src/plugins/builtin/jobs/lock-note.ts +1 -1
- package/src/plugins/builtin/jobs/model.ts +4 -15
- package/src/plugins/builtin/jobs/pane.tsx +7 -5
- package/src/plugins/builtin/jobs/share-bars.tsx +11 -5
- package/src/plugins/builtin/jodi/pane.tsx +14 -8
- package/src/plugins/builtin/layout-manager/index.tsx +1 -0
- package/src/plugins/builtin/macro-day/headless.ts +20 -7
- package/src/plugins/builtin/macro-day/index.tsx +3 -2
- package/src/plugins/builtin/macro-day/model.ts +29 -8
- package/src/plugins/builtin/macro-day/pane.tsx +46 -10
- package/src/plugins/builtin/macro-day/releases.ts +55 -13
- package/src/plugins/builtin/market-heatmap/data.ts +9 -2
- package/src/plugins/builtin/market-heatmap/evidence.ts +1 -1
- package/src/plugins/builtin/market-heatmap/headless.ts +9 -6
- package/src/plugins/builtin/market-heatmap/index.tsx +3 -3
- package/src/plugins/builtin/market-heatmap/model.ts +10 -7
- package/src/plugins/builtin/market-movers/client.ts +36 -21
- package/src/plugins/builtin/market-movers/headless.ts +8 -2
- package/src/plugins/builtin/market-movers/index.tsx +16 -10
- package/src/plugins/builtin/market-movers/screener.ts +33 -11
- package/src/plugins/builtin/market-movers/session-body.tsx +4 -2
- package/src/plugins/builtin/market-movers/session-table.ts +4 -2
- package/src/plugins/builtin/market-movers/table.ts +4 -1
- package/src/plugins/builtin/market-valuation/headless.ts +2 -0
- package/src/plugins/builtin/market-valuation/view.ts +5 -0
- package/src/plugins/builtin/members/headless.ts +6 -5
- package/src/plugins/builtin/members/pane.tsx +11 -4
- package/src/plugins/builtin/mna/client.ts +1 -0
- package/src/plugins/builtin/mna/detail.tsx +20 -32
- package/src/plugins/builtin/mna/distress/detail.tsx +16 -4
- package/src/plugins/builtin/mna/distress/model.ts +3 -2
- package/src/plugins/builtin/mna/distress/pane.tsx +7 -4
- package/src/plugins/builtin/mna/headless.ts +6 -13
- package/src/plugins/builtin/mna/model.ts +93 -15
- package/src/plugins/builtin/mna/pane.tsx +5 -4
- package/src/plugins/builtin/news/headless.ts +12 -6
- package/src/plugins/builtin/news/index.tsx +10 -1
- package/src/plugins/builtin/news/wire/index.tsx +3 -2
- package/src/plugins/builtin/news/wire/news/command-bar-search.ts +26 -10
- package/src/plugins/builtin/news/wire/news/query-presets.ts +6 -2
- package/src/plugins/builtin/news/wire/rss/cli.ts +3 -3
- package/src/plugins/builtin/notes/cli.ts +50 -15
- package/src/plugins/builtin/notes/export.ts +17 -6
- package/src/plugins/builtin/notes/files.ts +16 -5
- package/src/plugins/builtin/openfda/pane.tsx +1 -1
- package/src/plugins/builtin/options/carry.ts +2 -2
- package/src/plugins/builtin/options/enrichment-model.ts +10 -9
- package/src/plugins/builtin/options/index.tsx +1 -1
- package/src/plugins/builtin/options/model-spot.ts +70 -4
- package/src/plugins/builtin/options/view.tsx +51 -23
- package/src/plugins/builtin/options-calculator/headless.ts +46 -7
- package/src/plugins/builtin/options-calculator/pane.tsx +3 -2
- package/src/plugins/builtin/options-positioning/headless.ts +11 -3
- package/src/plugins/builtin/options-positioning/model.ts +24 -0
- package/src/plugins/builtin/options-positioning/pane.tsx +10 -12
- package/src/plugins/builtin/options-scenario/client.ts +142 -29
- package/src/plugins/builtin/options-scenario/collar.ts +8 -6
- package/src/plugins/builtin/options-scenario/csp-screen-headless.ts +127 -0
- package/src/plugins/builtin/options-scenario/csp-screen-pane.tsx +165 -0
- package/src/plugins/builtin/options-scenario/csp-screen.ts +258 -0
- package/src/plugins/builtin/options-scenario/csp.ts +101 -21
- package/src/plugins/builtin/options-scenario/headless.ts +49 -21
- package/src/plugins/builtin/options-scenario/hedge.ts +20 -14
- package/src/plugins/builtin/options-scenario/index.tsx +28 -3
- package/src/plugins/builtin/options-scenario/model.ts +13 -0
- package/src/plugins/builtin/options-scenario/pane.tsx +22 -10
- package/src/plugins/builtin/perps/equity-row.tsx +11 -3
- package/src/plugins/builtin/perps/freshness.ts +8 -5
- package/src/plugins/builtin/perps/headless.ts +3 -1
- package/src/plugins/builtin/perps/list-perpetuals.ts +25 -4
- package/src/plugins/builtin/perps/live-rows.ts +161 -0
- package/src/plugins/builtin/perps/markets-section.tsx +154 -0
- package/src/plugins/builtin/perps/pane.tsx +36 -17
- package/src/plugins/builtin/perps/venue-markets.ts +96 -0
- package/src/plugins/builtin/plugin-marketplace/index.tsx +2 -1
- package/src/plugins/builtin/plugin-marketplace/pane.tsx +145 -60
- package/src/plugins/builtin/portfolio-list/cli/bulk-symbols.ts +78 -27
- package/src/plugins/builtin/portfolio-list/cli/portfolio-command.ts +158 -141
- package/src/plugins/builtin/portfolio-list/cli/render.ts +49 -20
- package/src/plugins/builtin/portfolio-list/cli/shared.ts +3 -3
- package/src/plugins/builtin/portfolio-list/cli/watchlist-command.ts +29 -24
- package/src/plugins/builtin/portfolio-list/headless.ts +6 -3
- package/src/plugins/builtin/portfolio-list/income.ts +13 -2
- package/src/plugins/builtin/portfolio-list/index.tsx +9 -2
- package/src/plugins/builtin/portfolio-list/pane/index.tsx +21 -8
- package/src/plugins/builtin/portfolio-list/pane/purchase-date-fx.ts +46 -0
- package/src/plugins/builtin/portfolio-list/summary/live-accounts.ts +16 -9
- package/src/plugins/builtin/portfolio-list/summary/totals.ts +2 -15
- package/src/plugins/builtin/power/client.ts +6 -3
- package/src/plugins/builtin/power/evidence.ts +22 -7
- package/src/plugins/builtin/power/gas.tsx +5 -1
- package/src/plugins/builtin/power/pane.tsx +44 -32
- package/src/plugins/builtin/power/prices.tsx +10 -3
- package/src/plugins/builtin/research/analyst-headless.ts +25 -8
- package/src/plugins/builtin/research/analyst-model.ts +68 -3
- package/src/plugins/builtin/research/corporate-actions-pane.tsx +63 -14
- package/src/plugins/builtin/research/event-model.ts +3 -1
- package/src/plugins/builtin/research/event-sources.ts +12 -4
- package/src/plugins/builtin/research/index.tsx +2 -1
- package/src/plugins/builtin/research/relative-valuation-basis.ts +58 -0
- package/src/plugins/builtin/research/relative-valuation-columns.ts +31 -2
- package/src/plugins/builtin/research/relative-valuation-currency.ts +12 -5
- package/src/plugins/builtin/research/relative-valuation-headless.ts +84 -26
- package/src/plugins/builtin/research/relative-valuation-model.ts +88 -19
- package/src/plugins/builtin/research/relative-valuation-pane.tsx +76 -9
- package/src/plugins/builtin/research/relative-valuation-peers.ts +1 -1
- package/src/plugins/builtin/reverse-dcf/client.ts +2 -1
- package/src/plugins/builtin/reverse-dcf/model.ts +10 -5
- package/src/plugins/builtin/risk-factors/index.tsx +2 -2
- package/src/plugins/builtin/scanner/lock-note.ts +1 -1
- package/src/plugins/builtin/seasonality/client.ts +2 -1
- package/src/plugins/builtin/sec/forms.ts +13 -0
- package/src/plugins/builtin/sec/fund-abroad.ts +32 -0
- package/src/plugins/builtin/sec/fund-facts.ts +68 -8
- package/src/plugins/builtin/sec/headless.ts +85 -8
- package/src/plugins/builtin/sec/index.tsx +58 -12
- package/src/plugins/builtin/sectors/client.ts +6 -4
- package/src/plugins/builtin/sectors/sector-model.ts +11 -15
- package/src/plugins/builtin/series-inventory.ts +2 -0
- package/src/plugins/builtin/shared/broker-reconnect.ts +107 -22
- package/src/plugins/builtin/shared/cloud-resource.ts +15 -2
- package/src/plugins/builtin/shared/cloud-upgrade.ts +34 -6
- package/src/plugins/builtin/shared/earnings-calendar.ts +375 -0
- package/src/plugins/builtin/{earnings/estimate-basis.ts → shared/earnings-estimate-basis.ts} +1 -1
- package/src/plugins/builtin/shared/earnings-report.ts +3 -3
- package/src/plugins/builtin/shared/fx-rate-freshness.ts +23 -1
- package/src/plugins/builtin/shared/job-posting.ts +129 -0
- package/src/plugins/builtin/shared/pro-lock-note.ts +3 -3
- package/src/plugins/builtin/shared/report-freshness.ts +3 -0
- package/src/plugins/builtin/shared/research-trading.tsx +23 -0
- package/src/plugins/builtin/shared/series-cache.ts +2 -0
- package/src/plugins/builtin/shared/series-list-detail.tsx +3 -1
- package/src/plugins/builtin/shared/ticker-surface.ts +2 -1
- package/src/plugins/builtin/shared/volatility/options.ts +2 -1
- package/src/plugins/builtin/short-interest/client.ts +2 -0
- package/src/plugins/builtin/short-interest/headless.ts +41 -12
- package/src/plugins/builtin/short-interest/index.tsx +23 -1
- package/src/plugins/builtin/short-interest/model.ts +70 -19
- package/src/plugins/builtin/short-interest/pane.tsx +19 -2
- package/src/plugins/builtin/short-interest/publications-client.ts +82 -0
- package/src/plugins/builtin/short-interest/publications-headless.ts +29 -0
- package/src/plugins/builtin/short-interest/publications-model.ts +50 -0
- package/src/plugins/builtin/short-interest/publications-pane.tsx +66 -0
- package/src/plugins/builtin/short-interest/schedule.ts +35 -2
- package/src/plugins/builtin/short-interest/surface.tsx +11 -4
- package/src/plugins/builtin/short-interest/types.ts +9 -0
- package/src/plugins/builtin/short-interest/watch-client.ts +14 -8
- package/src/plugins/builtin/short-interest/watch-model.ts +12 -25
- package/src/plugins/builtin/short-interest/watch-pane.tsx +5 -1
- package/src/plugins/builtin/social-mentions/client.ts +2 -1
- package/src/plugins/builtin/supply-chain/flow.tsx +33 -9
- package/src/plugins/builtin/supply-chain/model.ts +51 -3
- package/src/plugins/builtin/supply-chain/pane.tsx +78 -39
- package/src/plugins/builtin/supply-chain/row-evidence.tsx +1 -1
- package/src/plugins/builtin/themes/headless.ts +8 -5
- package/src/plugins/builtin/themes/model.ts +14 -4
- package/src/plugins/builtin/themes/pane.tsx +24 -5
- package/src/plugins/builtin/thirteenf/headless.ts +5 -5
- package/src/plugins/builtin/thirteenf/signals.ts +3 -1
- package/src/plugins/builtin/ticker-detail/adr-pair/headless.ts +123 -0
- package/src/plugins/builtin/ticker-detail/adr-pair/model.ts +132 -0
- package/src/plugins/builtin/ticker-detail/adr-pair/tab.tsx +87 -0
- package/src/plugins/builtin/ticker-detail/data-panes/historical-prices.tsx +40 -26
- package/src/plugins/builtin/ticker-detail/data-panes/history-bars.ts +8 -4
- package/src/plugins/builtin/ticker-detail/data-panes/returns-history.ts +67 -3
- package/src/plugins/builtin/ticker-detail/data-panes/returns-model.ts +112 -5
- package/src/plugins/builtin/ticker-detail/data-panes/returns-pane.tsx +17 -2
- package/src/plugins/builtin/ticker-detail/financials/aggregation.ts +21 -7
- package/src/plugins/builtin/ticker-detail/financials/model.ts +36 -1
- package/src/plugins/builtin/ticker-detail/financials/offerings.ts +56 -0
- package/src/plugins/builtin/ticker-detail/financials/ratios.ts +62 -13
- package/src/plugins/builtin/ticker-detail/financials/tab.tsx +30 -4
- package/src/plugins/builtin/ticker-detail/headless-schema.ts +14 -2
- package/src/plugins/builtin/ticker-detail/headless.ts +148 -35
- package/src/plugins/builtin/ticker-detail/index.tsx +37 -5
- package/src/plugins/builtin/ticker-detail/overview/model.ts +65 -10
- package/src/plugins/builtin/ticker-detail/overview/pane.tsx +9 -1
- package/src/plugins/builtin/ticker-detail/overview-tab.tsx +68 -11
- package/src/plugins/builtin/ticker-detail/pane.tsx +11 -0
- package/src/plugins/builtin/ticker-detail/quote-footer.ts +8 -3
- package/src/plugins/builtin/ticker-detail/research-tabs.ts +11 -0
- package/src/plugins/builtin/vol-surface/client.ts +28 -7
- package/src/plugins/builtin/vol-surface/headless.ts +43 -15
- package/src/plugins/builtin/vol-surface/model.ts +34 -12
- package/src/plugins/builtin/vol-surface/pane.tsx +33 -13
- package/src/plugins/builtin/vol-surface/stored.ts +34 -3
- package/src/plugins/builtin/vol-surface/tables.ts +14 -0
- package/src/plugins/builtin/volatility/model.ts +5 -10
- package/src/plugins/builtin/world-venue-map/basemap-layer.tsx +4 -3
- package/src/plugins/builtin/world-venue-map/basemap.ts +3 -1
- package/src/plugins/builtin/world-venue-map/chokepoint-chart.ts +40 -0
- package/src/plugins/builtin/world-venue-map/evidence.ts +1 -1
- package/src/plugins/builtin/world-venue-map/geo-series.ts +90 -11
- package/src/plugins/builtin/world-venue-map/headless.ts +1 -1
- package/src/plugins/builtin/world-venue-map/index.ts +3 -26
- package/src/plugins/builtin/world-venue-map/layers.ts +1 -1
- package/src/plugins/builtin/world-venue-map/map.tsx +2 -1
- package/src/plugins/builtin/world-venue-map/pane.tsx +4 -2
- package/src/plugins/builtin/world-venue-map/venue-header.tsx +15 -4
- package/src/plugins/builtin/yield-curve/client.ts +25 -0
- package/src/plugins/builtin/yield-curve/curves.ts +7 -4
- package/src/plugins/builtin/yield-curve/headless.ts +38 -4
- package/src/plugins/builtin/yield-curve/history.ts +4 -3
- package/src/plugins/builtin/yield-curve/index.tsx +12 -6
- package/src/plugins/builtin/yield-curve/swaps-model.ts +93 -0
- package/src/plugins/builtin/yield-curve/swaps.tsx +99 -0
- package/src/plugins/bundle.ts +1 -1
- package/src/plugins/catalog-browser.ts +2 -1
- package/src/plugins/compat.ts +3 -3
- package/src/plugins/dependencies.ts +75 -14
- package/src/plugins/extracted-plugins.ts +132 -34
- package/src/plugins/host-link.ts +149 -34
- package/src/plugins/installer.ts +35 -10
- package/src/plugins/loader.ts +206 -38
- package/src/plugins/manager-node.ts +2 -2
- package/src/plugins/marketplace/deactivation.ts +22 -0
- package/src/plugins/marketplace/model.ts +2 -2
- package/src/plugins/marketplace/packs.ts +1 -1
- package/src/plugins/ownership.ts +1 -1
- package/src/plugins/peer-retry.ts +155 -0
- package/src/plugins/registry/contributions.ts +3 -1
- package/src/plugins/registry/index.ts +4 -3
- package/src/plugins/registry/plugin-state.ts +3 -0
- package/src/plugins/seed-notice.ts +20 -0
- package/src/plugins/shortcut-argument.ts +39 -0
- package/src/portfolio/allocation.ts +1 -1
- package/src/portfolio/collection-name.ts +31 -0
- package/src/portfolio/column-values.ts +10 -8
- package/src/portfolio/cost-fx.ts +296 -19
- package/src/portfolio/manual-lots.ts +75 -0
- package/src/portfolio/mutations.ts +60 -22
- package/src/portfolio/suffixed-listings.ts +209 -0
- package/src/portfolio/totals-currency.ts +24 -0
- package/src/public/__snapshots__/public-api.test.ts.snap +14 -0
- package/src/public/time-series.ts +11 -8
- package/src/remote/schema.ts +1 -1
- package/src/renderers/browser/config-host.ts +3 -0
- package/src/renderers/browser/main.tsx +23 -3
- package/src/renderers/dom/boot-frame-page.ts +187 -0
- package/src/renderers/dom/boot-frame.ts +237 -0
- package/src/renderers/dom/build-assets.ts +46 -8
- package/src/renderers/dom/desktop/controls.tsx +1 -1
- package/src/renderers/dom/desktop/query-bar.tsx +2 -0
- package/src/renderers/dom/dom-ui-host.tsx +4 -29
- package/src/renderers/dom/host/ascii-text.ts +16 -2
- package/src/renderers/dom/host/box.tsx +43 -2
- package/src/renderers/dom/host/chart-surface.tsx +2 -0
- package/src/renderers/dom/host/hls.chunk.ts +3 -0
- package/src/renderers/dom/host/image-surface.tsx +49 -0
- package/src/renderers/dom/host/media-surface.tsx +24 -18
- package/src/renderers/dom/host/mouse.ts +30 -0
- package/src/renderers/dom/host/size-observer.ts +1 -1
- package/src/renderers/dom/host/style.ts +1 -1
- package/src/renderers/dom/host/tabs.tsx +16 -5
- package/src/renderers/dom/host/top-surface.ts +127 -0
- package/src/renderers/dom/styles.css +115 -0
- package/src/renderers/dom/test-utils.tsx +2 -1
- package/src/renderers/electrobun/bun/application-menu/index.ts +3 -3
- package/src/renderers/electrobun/bun/core-capabilities.ts +9 -1
- package/src/renderers/electrobun/bun/desktop/backend-requests.ts +3 -0
- package/src/renderers/electrobun/bun/desktop/backend.ts +56 -3
- package/src/renderers/electrobun/bun/desktop/detached-windows.ts +1 -1
- package/src/renderers/electrobun/bun/desktop/host-requests.ts +9 -3
- package/src/renderers/electrobun/bun/desktop/initialization.ts +81 -18
- package/src/renderers/electrobun/bun/desktop/update.ts +210 -30
- package/src/renderers/electrobun/bun/external-plugins.ts +29 -7
- package/src/renderers/electrobun/bun/index.ts +11 -1
- package/src/renderers/electrobun/bun/window/boot-frame.ts +67 -0
- package/src/renderers/electrobun/bun/window/create.ts +4 -1
- package/src/renderers/electrobun/shared/boot-frame.ts +7 -0
- package/src/renderers/electrobun/shared/protocol.ts +6 -1
- package/src/renderers/electrobun/view/cli-pane-shot-entry.tsx +1 -1
- package/src/renderers/electrobun/view/config-host.ts +3 -0
- package/src/renderers/electrobun/view/fatal-screen.tsx +1 -1
- package/src/renderers/electrobun/view/main.tsx +30 -4
- package/src/renderers/electrobun/view/news-source.ts +9 -7
- package/src/renderers/electrobun/view/remote/asset-data-client.ts +9 -2
- package/src/renderers/electrobun/view/ui-host.tsx +1 -1
- package/src/renderers/opentui/browser-open.ts +88 -0
- package/src/renderers/opentui/host.tsx +5 -14
- package/src/renderers/opentui/image/loader.ts +3 -2
- package/src/renderers/opentui/native-smoke.ts +10 -1
- package/src/renderers/opentui/pane-image/index.ts +2 -1
- package/src/renderers/opentui/render-lib.ts +253 -0
- package/src/renderers/opentui/render-timing-smoke.ts +1 -1
- package/src/renderers/opentui/start.tsx +8 -1
- package/src/renderers/share/layout-view.tsx +2 -2
- package/src/renderers/share/main.tsx +4 -4
- package/src/renderers/share/view.tsx +1 -1
- package/src/series/resolve.ts +22 -6
- package/src/series/standalone.ts +30 -2
- package/src/series/types.ts +8 -1
- package/src/shares/api.ts +4 -1
- package/src/shares/pane.ts +1 -1
- package/src/sources/gloomberb-cloud/fred-series.ts +46 -1
- package/src/sources/gloomberb-cloud/index.ts +39 -16
- package/src/sources/gloomberb-cloud/news.ts +39 -0
- package/src/sources/gloomberb-cloud/normalizers.ts +14 -1
- package/src/sources/gloomberb-cloud/perpetuals.ts +49 -1
- package/src/sources/listing-symbols.ts +37 -0
- package/src/sources/provider-errors.ts +16 -2
- package/src/sources/provider-router/financial-routes.ts +21 -3
- package/src/sources/provider-router/financials.ts +15 -2
- package/src/sources/provider-router/history.ts +30 -8
- package/src/sources/provider-router/index.ts +16 -0
- package/src/sources/provider-router/primary.ts +1 -1
- package/src/state/app/bootstrap.ts +23 -0
- package/src/state/hooks/inline-tickers.ts +30 -5
- package/src/sync/controller.ts +1 -1
- package/src/sync/core-contributors.ts +46 -14
- package/src/team/collections-sync.ts +2 -1
- package/src/team/collections.ts +178 -17
- package/src/telemetry/crash-reports.ts +21 -4
- package/src/telemetry/update-failures-node.ts +59 -0
- package/src/telemetry/update-failures.ts +307 -0
- package/src/test-support/builtin-panes.ts +1 -1
- package/src/theme/colors.ts +3 -30
- package/src/theme/ui-tokens.ts +37 -1
- package/src/tickers/company-name-listing.ts +215 -36
- package/src/tickers/company-name.ts +43 -0
- package/src/tickers/index-roots.ts +47 -0
- package/src/tickers/instrument-label.ts +5 -1
- package/src/tickers/listing-fate.ts +30 -0
- package/src/tickers/metadata.ts +10 -0
- package/src/tickers/perpetual-listing.ts +5 -2
- package/src/tickers/search/home-listing.ts +75 -0
- package/src/tickers/search/index.ts +76 -27
- package/src/tickers/search/ranking.ts +54 -4
- package/src/tickers/search/upsert.ts +29 -0
- package/src/tickers/terminal-codes.ts +416 -40
- package/src/time-series/bar-aggregation.ts +243 -0
- package/src/time-series/base-series.ts +307 -0
- package/src/time-series/chart-bounds.ts +349 -0
- package/src/time-series/chart-seed.ts +142 -0
- package/src/time-series/economic.ts +5 -0
- package/src/time-series/fundamentals.ts +18 -3
- package/src/time-series/history-acquisition.ts +499 -0
- package/src/time-series/leverage.ts +100 -0
- package/src/time-series/market-resolution.ts +4 -2
- package/src/time-series/market.ts +2 -1
- package/src/time-series/price-comparison.ts +175 -30
- package/src/time-series/range.ts +9 -1
- package/src/time-series/resolution.ts +174 -16
- package/src/time-series/resolve-context.ts +157 -0
- package/src/time-series/resolve.ts +126 -1577
- package/src/time-series/series-name.ts +38 -0
- package/src/time-series/series-presentation.ts +208 -0
- package/src/time-series/spec.ts +11 -6
- package/src/time-series/studies.ts +109 -12
- package/src/time-series/tail-reconcile.ts +121 -0
- package/src/time-series/types.ts +29 -2
- package/src/time-series/use-chart-resolution.ts +4 -5
- package/src/types/broker.ts +10 -0
- package/src/types/config.ts +14 -0
- package/src/types/data-provider.ts +20 -0
- package/src/types/exchange-rate.ts +6 -0
- package/src/types/financials.ts +104 -7
- package/src/types/headless.ts +83 -6
- package/src/types/instrument.ts +3 -0
- package/src/types/issuer-listings.ts +28 -0
- package/src/types/plugin.ts +65 -8
- package/src/types/price-history.ts +2 -0
- package/src/types/ticker.ts +13 -0
- package/src/types/trading.ts +59 -1
- package/src/ui/ascii-font.ts +13 -1
- package/src/ui/host.tsx +6 -1
- package/src/updater/command-names.ts +175 -0
- package/src/updater/failure.ts +163 -0
- package/src/updater/index.ts +97 -28
- package/src/utils/calendar-date.ts +32 -15
- package/src/utils/cash-runway.ts +241 -0
- package/src/utils/central-banks.ts +42 -0
- package/src/utils/cli-output.ts +259 -80
- package/src/utils/contract-month.ts +16 -0
- package/src/utils/crypto-pair.ts +61 -3
- package/src/utils/currency-pair.ts +26 -0
- package/src/utils/currency-units.ts +29 -0
- package/src/utils/datetime-format.ts +10 -0
- package/src/utils/debug-log.ts +1 -1
- package/src/utils/decimal-comma.ts +39 -6
- package/src/utils/exchange-announcements.ts +71 -0
- package/src/utils/exchange-rate-snapshot.ts +10 -0
- package/src/utils/financial-statements.ts +83 -4
- package/src/utils/format.ts +34 -16
- package/src/utils/fundamentals.ts +150 -34
- package/src/utils/fx-market-hours.ts +10 -1
- package/src/utils/latest-financial-period.ts +8 -0
- package/src/utils/linux-libc.ts +54 -0
- package/src/utils/market-capitalization.ts +111 -15
- package/src/utils/max-drawdown.ts +64 -0
- package/src/utils/network-failure.ts +83 -0
- package/src/utils/option-expiry.ts +139 -7
- package/src/utils/price-earnings.ts +11 -5
- package/src/utils/price-history.ts +18 -8
- package/src/utils/price-window.ts +131 -0
- package/src/utils/release-date.ts +47 -0
- package/src/utils/sec.ts +71 -0
- package/src/utils/throttled-fetch.ts +11 -4
- package/src/utils/trailing-eps.ts +67 -0
- package/src/utils/typed-text.ts +21 -0
- package/src/utils/utc-time.ts +24 -1
- package/src/version.ts +6 -0
- package/src/cli/pane-functions/screenshot.ts +0 -2122
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { Box } from "../../../ui";
|
|
1
|
+
import { Box, useUiCapabilities } from "../../../ui";
|
|
2
2
|
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
3
3
|
import { TextAttributes, type ScrollBoxRenderable } from "../../../ui";
|
|
4
|
+
import { COUNTRY_FLAG_CELLS, withCountryFlag } from "../../../components/ui/country-flag";
|
|
4
5
|
import {
|
|
5
6
|
Button,
|
|
6
7
|
DataTableStackView,
|
|
@@ -12,18 +13,25 @@ import {
|
|
|
12
13
|
type PaneFooterSegment,
|
|
13
14
|
} from "../../../components";
|
|
14
15
|
import { usePluginPaneState } from "../../runtime";
|
|
16
|
+
import { useAppConfig, usePaneSettingValue } from "../../../public/react";
|
|
17
|
+
import { readerTimeZone, timeZoneCity, zonedClock } from "../../../utils/utc-time";
|
|
18
|
+
import { usePaneInstance } from "../../../state/app/context";
|
|
19
|
+
import { commandRequestParams } from "../shared/command-tab";
|
|
15
20
|
import { useAsyncResource } from "../../../react/async-resource";
|
|
16
21
|
import { useAutoRefresh } from "../../../react/auto-refresh";
|
|
17
22
|
import { usePaneVisible } from "../../../state/app/activity";
|
|
23
|
+
import { formatCountdown } from "../../../utils/datetime-format";
|
|
18
24
|
import type { PaneProps } from "../../../types/plugin";
|
|
19
25
|
import type { PluginModule } from "../plugin-module";
|
|
20
26
|
import { colors, blendHex } from "../../../theme/colors";
|
|
21
|
-
import type
|
|
27
|
+
import { hasNoReleaseTime, hasNoStatedTime, isAllDayEvent, type EconEvent } from "./types";
|
|
22
28
|
import { FRED_CATALOG_SERIES } from "./fred-catalog";
|
|
23
29
|
import { ECON_PRINT_NOTIFICATIONS_ENABLED_KEY, retainVisiblePrintRefresh, setupHighImpactPrintNotifications } from "./print-watch";
|
|
24
30
|
import { EconDetailView } from "./detail-view";
|
|
25
31
|
import {
|
|
26
32
|
COUNTRY_CYCLE,
|
|
33
|
+
COUNTRY_FILTER_HINT,
|
|
34
|
+
countriesWithoutEvents,
|
|
27
35
|
DEFAULT_IMPACT_FILTER,
|
|
28
36
|
FILTER_CYCLE,
|
|
29
37
|
attachEconCalendarPersistence,
|
|
@@ -33,18 +41,21 @@ import {
|
|
|
33
41
|
dateKey,
|
|
34
42
|
dayLabel,
|
|
35
43
|
filteredEmptyTitle,
|
|
36
|
-
formatCountdown,
|
|
37
44
|
formatStaleness,
|
|
38
45
|
getCalendarCache,
|
|
39
46
|
subscribeCalendar,
|
|
40
47
|
impactIndicator,
|
|
41
48
|
loadCalendar,
|
|
49
|
+
eventCountry,
|
|
42
50
|
matchesCountry,
|
|
43
51
|
matchesImpact,
|
|
52
|
+
noScheduledReleasesMessage,
|
|
53
|
+
parseCountryFilter,
|
|
44
54
|
resetEconCalendarPersistence,
|
|
45
55
|
shortCalendarEnd,
|
|
46
56
|
shortDayLabel,
|
|
47
57
|
timeLabel,
|
|
58
|
+
valueColumnWidth,
|
|
48
59
|
type CountryFilter,
|
|
49
60
|
type DisplayRow,
|
|
50
61
|
type EconCalendarColumn,
|
|
@@ -93,7 +104,21 @@ function EconCalendarPane({ focused, width, height }: PaneProps) {
|
|
|
93
104
|
// reload or a shared layout comes back to the same release.
|
|
94
105
|
const [selectedKey, setSelectedKey] = usePluginPaneState<string | null>("selectedKey", null);
|
|
95
106
|
const [impactFilter, setImpactFilter] = usePluginPaneState<ImpactFilter>("impactFilter", DEFAULT_IMPACT_FILTER);
|
|
96
|
-
const [
|
|
107
|
+
const [chosenCountry, setCountryFilter] = usePluginPaneState<CountryFilter>("countryFilter", "all");
|
|
108
|
+
// Countries a caller named (`ECO MX,BR`, `fn ECO --country MX`) are shown once per request; a later choice is the reader's.
|
|
109
|
+
const pane = usePaneInstance();
|
|
110
|
+
const [countrySetting] = usePaneSettingValue<string>("country", "");
|
|
111
|
+
const requestedCountry = pane?.params?.country || countrySetting || null;
|
|
112
|
+
const countryRequest = pane?.params?.country ? `${pane.params.country}|${pane.params.tabAt ?? ""}`
|
|
113
|
+
: countrySetting ? `setting|${countrySetting}` : "";
|
|
114
|
+
const [shownCountryRequest, setShownCountryRequest] = usePluginPaneState("countryRequest", "");
|
|
115
|
+
const countryPending = !!countryRequest && countryRequest !== shownCountryRequest;
|
|
116
|
+
const countryFilter: CountryFilter = countryPending && requestedCountry ? requestedCountry : chosenCountry;
|
|
117
|
+
useEffect(() => {
|
|
118
|
+
if (!countryPending || !requestedCountry) return;
|
|
119
|
+
setShownCountryRequest(countryRequest);
|
|
120
|
+
setCountryFilter(requestedCountry);
|
|
121
|
+
}, [countryPending, countryRequest, requestedCountry, setCountryFilter, setShownCountryRequest]);
|
|
97
122
|
const [now, setNow] = useState(Date.now());
|
|
98
123
|
const [openKey, setOpenKey] = usePluginPaneState<string | null>("openKey", null);
|
|
99
124
|
|
|
@@ -221,35 +246,47 @@ function EconCalendarPane({ focused, width, height }: PaneProps) {
|
|
|
221
246
|
handleRefreshKey(event, () => void calendar.reload(), { stopPropagation: true })
|
|
222
247
|
), [calendar.reload]);
|
|
223
248
|
|
|
249
|
+
// The desktop and the web lead each country's code with its flag.
|
|
250
|
+
const flagged = useUiCapabilities().nativePaneChrome === true;
|
|
251
|
+
// A reader who set a time zone (`config set timezone`) gets their clock in a column beside UTC.
|
|
252
|
+
const readerZone = readerTimeZone(useAppConfig().timezone);
|
|
224
253
|
const columns = useMemo<EconCalendarColumn[]>(() => {
|
|
225
254
|
// The header names the zone, so the column is as wide as the header needs.
|
|
226
255
|
const timeLabelText = `TIME (${CALENDAR_TIME_ZONE_LABEL})`;
|
|
227
256
|
const timeWidth = tableColumnWidth({ width: 6, label: timeLabelText });
|
|
228
|
-
const actualWidth = 9;
|
|
229
|
-
const forecastWidth = 10;
|
|
230
|
-
const priorWidth = 9;
|
|
257
|
+
const actualWidth = valueColumnWidth(filtered, "actual", 9);
|
|
258
|
+
const forecastWidth = valueColumnWidth(filtered, "forecast", 10);
|
|
259
|
+
const priorWidth = valueColumnWidth(filtered, "prior", 9);
|
|
231
260
|
const minEventWidth = 12;
|
|
261
|
+
// The reader's clock, with the weekday on rows where it is another day than the UTC one they are listed under.
|
|
262
|
+
const readerLabel = readerZone ? timeZoneCity(readerZone).toUpperCase() : null;
|
|
263
|
+
const readerWidth = !readerZone || !readerLabel ? 0 : tableColumnWidth({ label: readerLabel,
|
|
264
|
+
width: filtered.some((ev) => !hasNoReleaseTime(ev) && zonedClock(ev.date.getTime(), readerZone).label.length > 5) ? 9 : 5 });
|
|
232
265
|
// Padding, one gap per column boundary, and the vertical scrollbar lane;
|
|
233
266
|
// one column short of that clipped the PRIOR values at the right edge.
|
|
234
|
-
const
|
|
235
|
-
|
|
236
|
-
width - 3 - columnCount - (timeWidth + impactWidth + countryWidth + actualWidth + forecastWidth + priorWidth)
|
|
267
|
+
const roomBeside = (count: number, timesWidth: number) => (impactWidth: number, countryWidth: number) => (
|
|
268
|
+
width - 3 - count - (timesWidth + impactWidth + countryWidth + actualWidth + forecastWidth + priorWidth)
|
|
237
269
|
);
|
|
270
|
+
const codeWidth = 2 + (flagged ? COUNTRY_FLAG_CELLS : 0);
|
|
271
|
+
// The reader's column only where the event names keep room to read beside it, under the short headers.
|
|
272
|
+
const withReader = readerWidth > 0 && roomBeside(8, timeWidth + readerWidth)(4, Math.max(3, codeWidth)) >= minEventWidth;
|
|
273
|
+
const eventRoom = withReader ? roomBeside(8, timeWidth + readerWidth) : roomBeside(7, timeWidth);
|
|
238
274
|
// IMPACT and COUNTRY in words while event names keep room to read; the
|
|
239
275
|
// short labels otherwise, with the word on hover where there is one.
|
|
240
276
|
const spelledImpactWidth = tableColumnWidth({ width: 1, label: SPELLED_IMPACT });
|
|
241
|
-
const spelledCountryWidth = tableColumnWidth({ width: 1, label: SPELLED_COUNTRY });
|
|
277
|
+
const spelledCountryWidth = Math.max(codeWidth, tableColumnWidth({ width: 1, label: SPELLED_COUNTRY }));
|
|
242
278
|
const spelled = eventRoom(spelledImpactWidth, spelledCountryWidth) >= SPELLED_HEADER_MIN_EVENT_WIDTH;
|
|
243
279
|
const impactColumn = spelled
|
|
244
280
|
? { label: SPELLED_IMPACT, width: spelledImpactWidth }
|
|
245
281
|
: { label: "IMP", width: 4, title: "Impact" };
|
|
246
282
|
const countryColumn = spelled
|
|
247
283
|
? { label: SPELLED_COUNTRY, width: spelledCountryWidth }
|
|
248
|
-
: { label: "CTY", width: 3, title: "Country" };
|
|
284
|
+
: { label: "CTY", width: Math.max(3, codeWidth), title: "Country" };
|
|
249
285
|
const eventWidth = Math.max(minEventWidth, eventRoom(impactColumn.width, countryColumn.width));
|
|
250
286
|
|
|
251
287
|
return [
|
|
252
288
|
{ id: "time", label: timeLabelText, width: timeWidth, align: "left" },
|
|
289
|
+
...withReader ? [{ id: "readerTime" as const, label: readerLabel!, width: readerWidth, align: "left" as const, title: readerZone! }] : [],
|
|
253
290
|
{ id: "impact", ...impactColumn, align: "left" },
|
|
254
291
|
{ id: "country", ...countryColumn, align: "left" },
|
|
255
292
|
{ id: "event", label: "EVENT", width: eventWidth, align: "left" },
|
|
@@ -257,11 +294,15 @@ function EconCalendarPane({ focused, width, height }: PaneProps) {
|
|
|
257
294
|
{ id: "forecast", label: "FORECAST", width: forecastWidth, align: "right" },
|
|
258
295
|
{ id: "prior", label: "PRIOR", width: priorWidth, align: "right" },
|
|
259
296
|
];
|
|
260
|
-
}, [width]);
|
|
297
|
+
}, [filtered, flagged, readerZone, width]);
|
|
261
298
|
const separatorBg = blendHex(colors.bg, colors.border, 0.3);
|
|
262
299
|
const staleness = fetchedAt ? formatStaleness(fetchedAt, now) : "";
|
|
263
300
|
// The calendar has events and the filters hid them all: say which, with the way back.
|
|
264
|
-
|
|
301
|
+
// Countries named one by one with nothing in the calendar: a quiet window there, said plainly.
|
|
302
|
+
const unscheduled = useMemo(() => countriesWithoutEvents(countryFilter, events), [countryFilter, events]);
|
|
303
|
+
const filterEmptyTitle = events.length === 0 ? null
|
|
304
|
+
: unscheduled.length > 0 && unscheduled.length === countryFilter.split(",").length ? noScheduledReleasesMessage(unscheduled).replace(/\.$/, "")
|
|
305
|
+
: filteredEmptyTitle(impactFilter, countryFilter);
|
|
265
306
|
const emptyStateHint = !loading && !error
|
|
266
307
|
? [
|
|
267
308
|
impactFilter !== "all" ? `impact: ${impactFilter}` : null,
|
|
@@ -271,7 +312,10 @@ function EconCalendarPane({ focused, width, height }: PaneProps) {
|
|
|
271
312
|
|
|
272
313
|
// Next upcoming event for countdown
|
|
273
314
|
const nextEvent = nextUpcomingEventIdx >= 0 ? filtered[nextUpcomingEventIdx] : undefined;
|
|
274
|
-
|
|
315
|
+
// A bank that states no time, or an all-day event, has a day to count to, not an hour.
|
|
316
|
+
const nextCountdown = !nextEvent ? null
|
|
317
|
+
: hasNoReleaseTime(nextEvent) ? shortDayLabel(nextEvent.date)
|
|
318
|
+
: formatCountdown(nextEvent.date.getTime() - now);
|
|
275
319
|
// The countdown changes every tick, so it is footer status, not query bar
|
|
276
320
|
// context; the footer ellipsizes a long event name.
|
|
277
321
|
const nextText = nextEvent && nextCountdown ? `next ${nextEvent.event} ${nextCountdown}` : null;
|
|
@@ -285,7 +329,7 @@ function EconCalendarPane({ focused, width, height }: PaneProps) {
|
|
|
285
329
|
...(showStale ? [{ id: "stale", parts: [{ text: "STALE", tone: "warning" as const }] }] : []),
|
|
286
330
|
...(staleness ? [{ id: "updated", parts: [{ text: staleness, tone: "muted" as const }] }] : []),
|
|
287
331
|
], [detailEvent, listedAfterStatus, nextText, showStale, staleness]);
|
|
288
|
-
// A report of the pane (`
|
|
332
|
+
// A report of the pane (`gloom fn ECO`) says it too.
|
|
289
333
|
const listedThrough = listedEnd ? dateKey(listedEnd) : null;
|
|
290
334
|
useRemoteUiNode(listedAfter && listedThrough ? {
|
|
291
335
|
role: "report-notice",
|
|
@@ -346,7 +390,10 @@ function EconCalendarPane({ focused, width, height }: PaneProps) {
|
|
|
346
390
|
const ev = row.event;
|
|
347
391
|
switch (column.id) {
|
|
348
392
|
case "time":
|
|
349
|
-
|
|
393
|
+
// A bank that states no time has none here, and its detail says why; an all-day event (a plenum, an election) says so.
|
|
394
|
+
return { text: hasNoStatedTime(ev) ? "" : isAllDayEvent(ev) ? "All day" : timeLabel(ev.date), color: colors.textMuted };
|
|
395
|
+
case "readerTime":
|
|
396
|
+
return { text: hasNoReleaseTime(ev) || !readerZone ? "" : zonedClock(ev.date.getTime(), readerZone).label, color: colors.textMuted };
|
|
350
397
|
case "impact": {
|
|
351
398
|
const indicator = impactIndicator(ev.impact);
|
|
352
399
|
return {
|
|
@@ -354,10 +401,14 @@ function EconCalendarPane({ focused, width, height }: PaneProps) {
|
|
|
354
401
|
color: indicator.color,
|
|
355
402
|
};
|
|
356
403
|
}
|
|
357
|
-
case "country":
|
|
358
|
-
// The ISO code,
|
|
359
|
-
//
|
|
360
|
-
|
|
404
|
+
case "country": {
|
|
405
|
+
// The ISO code, led on the desktop by the flag drawn as art, never a
|
|
406
|
+
// flag emoji: emoji widths do not match a fixed column and pushed the
|
|
407
|
+
// right-hand columns off the pane. A national euro-area release is
|
|
408
|
+
// its member's (DE for German Ifo), the ECB's the euro area's.
|
|
409
|
+
const country = eventCountry(ev);
|
|
410
|
+
return withCountryFlag({ text: country, color: colors.textMuted }, country, flagged);
|
|
411
|
+
}
|
|
361
412
|
case "event":
|
|
362
413
|
return { text: ev.event, color: colors.text };
|
|
363
414
|
case "actual":
|
|
@@ -370,7 +421,7 @@ function EconCalendarPane({ focused, width, height }: PaneProps) {
|
|
|
370
421
|
case "prior":
|
|
371
422
|
return { text: ev.prior ?? "—", color: colors.textDim };
|
|
372
423
|
}
|
|
373
|
-
}, []);
|
|
424
|
+
}, [flagged, readerZone]);
|
|
374
425
|
|
|
375
426
|
const selectedEvent = filtered[selectedIdx];
|
|
376
427
|
const filterControls = (
|
|
@@ -381,7 +432,9 @@ function EconCalendarPane({ focused, width, height }: PaneProps) {
|
|
|
381
432
|
options: FILTER_CYCLE.map((value) => ({ value, label: IMPACT_LABELS[value] })),
|
|
382
433
|
onChange: (value: string) => selectImpactFilter(value as ImpactFilter) },
|
|
383
434
|
{ id: "region", label: "Region", inline: true, value: countryFilter, defaultValue: "all",
|
|
384
|
-
|
|
435
|
+
// Countries a command named stay a choice beside the regions while they are shown.
|
|
436
|
+
options: [...COUNTRY_CYCLE, ...(COUNTRY_CYCLE.includes(countryFilter) ? [] : [countryFilter])]
|
|
437
|
+
.map((value) => ({ value, label: value === "all" ? "All" : value.split(",").join(", ") })),
|
|
385
438
|
onChange: (value: string) => selectCountryFilter(value as CountryFilter) },
|
|
386
439
|
]}
|
|
387
440
|
meta={selectedEvent ? dayLabel(selectedEvent.date, today) : undefined}
|
|
@@ -462,6 +515,19 @@ export const economicCalendarModule: PluginModule = {
|
|
|
462
515
|
defaultMode: "floating",
|
|
463
516
|
defaultFloatingSize: { width: 100, height: 30 },
|
|
464
517
|
tableExport: true,
|
|
518
|
+
reportOptions: [{
|
|
519
|
+
key: "country",
|
|
520
|
+
type: "string",
|
|
521
|
+
placeholder: "countries",
|
|
522
|
+
description: "Regions or two-letter country codes to list, comma separated: US, G7, EU, or such as MX,BR,ZA",
|
|
523
|
+
example: "--country MX,BR,ZA",
|
|
524
|
+
exampleWithoutArgument: true,
|
|
525
|
+
normalize: (value) => {
|
|
526
|
+
const parsed = parseCountryFilter(value);
|
|
527
|
+
if ("error" in parsed) throw new Error(`${parsed.error} ${COUNTRY_FILTER_HINT}`);
|
|
528
|
+
return parsed.filter;
|
|
529
|
+
},
|
|
530
|
+
}],
|
|
465
531
|
settings: {
|
|
466
532
|
title: "Economic Calendar Settings",
|
|
467
533
|
fields: [{
|
|
@@ -479,8 +545,29 @@ export const economicCalendarModule: PluginModule = {
|
|
|
479
545
|
label: "Economic Calendar",
|
|
480
546
|
description: "Upcoming economic events, releases, and indicators.",
|
|
481
547
|
// "econ" stays a keyword so the old ECON prefix still finds this pane.
|
|
482
|
-
keywords: ["econ", "economic", "calendar", "events", "macro", "releases", "fed", "cpi", "gdp"
|
|
483
|
-
|
|
548
|
+
keywords: ["econ", "economic", "calendar", "events", "macro", "releases", "fed", "cpi", "gdp", "rate decision", "ipca",
|
|
549
|
+
"brazil inflation"],
|
|
550
|
+
// ECO MX,BR opens the calendar on those countries.
|
|
551
|
+
shortcut: {
|
|
552
|
+
prefix: "ECO",
|
|
553
|
+
argKind: "text",
|
|
554
|
+
argPlaceholder: "countries",
|
|
555
|
+
argOptional: true,
|
|
556
|
+
openWithoutArg: true,
|
|
557
|
+
argOptions: () => [
|
|
558
|
+
{ value: "US", label: "United States" },
|
|
559
|
+
{ value: "G7", label: "G7" },
|
|
560
|
+
{ value: "EU", label: "Euro area" },
|
|
561
|
+
{ value: "MX,BR,ZA,IN,KR", label: "Mexico, Brazil, South Africa, India and Korea" },
|
|
562
|
+
],
|
|
563
|
+
},
|
|
564
|
+
createInstance: (_context, options) => {
|
|
565
|
+
const typed = options?.arg?.trim();
|
|
566
|
+
if (!typed) return {};
|
|
567
|
+
const parsed = parseCountryFilter(typed);
|
|
568
|
+
if ("error" in parsed) throw new Error(`${parsed.error} ${COUNTRY_FILTER_HINT}`);
|
|
569
|
+
return { params: commandRequestParams({ country: parsed.filter }) };
|
|
570
|
+
},
|
|
484
571
|
}],
|
|
485
572
|
setup(ctx) {
|
|
486
573
|
attachEconCalendarPersistence(ctx.persistence);
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { GloomPluginContext } from "../../../types/plugin";
|
|
2
2
|
import {
|
|
3
|
+
eventCountry,
|
|
3
4
|
getCalendarCache,
|
|
4
5
|
landedHighImpactPrints,
|
|
5
6
|
loadCalendar,
|
|
@@ -92,7 +93,7 @@ export function startHighImpactPrintWatch(
|
|
|
92
93
|
|
|
93
94
|
const toast = (event: EconEvent) => {
|
|
94
95
|
ctx.notify({
|
|
95
|
-
title: event
|
|
96
|
+
title: eventCountry(event),
|
|
96
97
|
body: printBody(event),
|
|
97
98
|
type: "info",
|
|
98
99
|
desktop: "always",
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
|
|
2
1
|
export type EconImpact = "high" | "medium" | "low";
|
|
3
2
|
|
|
4
3
|
export interface EconEvent {
|
|
@@ -11,4 +10,36 @@ export interface EconEvent {
|
|
|
11
10
|
forecast: string | null;
|
|
12
11
|
prior: string | null;
|
|
13
12
|
impact: EconImpact;
|
|
13
|
+
/**
|
|
14
|
+
* Rows Gloom Cloud adds beside its feeds: a central bank's kept decision or
|
|
15
|
+
* a statistics office's listed release. The feeds' own rows carry none of
|
|
16
|
+
* the fields below.
|
|
17
|
+
*/
|
|
18
|
+
kind?: "central-bank-decision" | "statistics-release";
|
|
19
|
+
/** The publisher's own clock time and its IANA zone; null when it states no time. */
|
|
20
|
+
localTime?: string | null;
|
|
21
|
+
timeZone?: string;
|
|
22
|
+
/** Why a row has no time, when its publisher states none. */
|
|
23
|
+
timeNote?: string | null;
|
|
24
|
+
/** The day the prior level was observed. */
|
|
25
|
+
priorAsOf?: string | null;
|
|
26
|
+
/** The period a release covers, as its publisher names it. */
|
|
27
|
+
referencePeriod?: string | null;
|
|
28
|
+
/** Who publishes it (Freddie Mac for the 30-year mortgage rate), and its page when one is named. */
|
|
29
|
+
source?: { name: string; url?: string };
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/** Whether a row's time is blank because its publisher states none (a bank whose calendar gives the day only). */
|
|
33
|
+
export function hasNoStatedTime(event: Pick<EconEvent, "timeNote">): boolean {
|
|
34
|
+
return typeof event.timeNote === "string" && event.timeNote.length > 0;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/** A row that takes its whole day (a plenum, an election, a summit): it has a day and no release time. */
|
|
38
|
+
export function isAllDayEvent(event: Pick<EconEvent, "time" | "timeNote">): boolean {
|
|
39
|
+
return event.time === "All Day" && !hasNoStatedTime(event);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/** A row with a day and no clock time to count to: an all-day event, or a bank that states no time. */
|
|
43
|
+
export function hasNoReleaseTime(event: Pick<EconEvent, "time" | "timeNote">): boolean {
|
|
44
|
+
return hasNoStatedTime(event) || isAllDayEvent(event);
|
|
14
45
|
}
|
|
@@ -12,6 +12,8 @@ export interface StatBuild {
|
|
|
12
12
|
stat: StatDef;
|
|
13
13
|
points: StatPoint[];
|
|
14
14
|
trend: TrendFit;
|
|
15
|
+
/** The day the latest point's figure was released (`YYYY-MM-DD`), when FRED says. */
|
|
16
|
+
releasedOn?: string;
|
|
15
17
|
cache?: SeriesCacheMetadata;
|
|
16
18
|
}
|
|
17
19
|
|
|
@@ -45,10 +47,12 @@ function build(def: StatDef, result: DatedObservation[] | SeriesCacheLoadResult)
|
|
|
45
47
|
? observations
|
|
46
48
|
: observations.map((entry) => ({
|
|
47
49
|
date: entry.date,
|
|
48
|
-
|
|
50
|
+
// Rounded off the float's last digits: 2.36 × 100 is 236, not 236.00000000000003.
|
|
51
|
+
value: entry.value == null ? null : Number((entry.value * scale).toPrecision(12)),
|
|
49
52
|
}));
|
|
50
53
|
const points = applyTransform(scaled, def.transform);
|
|
51
54
|
if (points.length === 0) return null;
|
|
55
|
+
const releasedOn = latestRelease(observations, points.at(-1)!.date);
|
|
52
56
|
const cache = Array.isArray(result) ? undefined : {
|
|
53
57
|
fetchedAt: result.fetchedAt,
|
|
54
58
|
stale: result.stale,
|
|
@@ -56,7 +60,14 @@ function build(def: StatDef, result: DatedObservation[] | SeriesCacheLoadResult)
|
|
|
56
60
|
...(result.refreshError ? { refreshError: result.refreshError } : {}),
|
|
57
61
|
};
|
|
58
62
|
// These go negative routinely, so the fit stays linear.
|
|
59
|
-
return { stat: def, points, trend: fitTrend(points, "linear"), ...(cache ? { cache } : {}) };
|
|
63
|
+
return { stat: def, points, trend: fitTrend(points, "linear"), ...(releasedOn ? { releasedOn } : {}), ...(cache ? { cache } : {}) };
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/** When the newest observation was released, if the latest point is that observation's. */
|
|
67
|
+
function latestRelease(observations: readonly DatedObservation[], latestDate: string): string | undefined {
|
|
68
|
+
const newest = observations.reduce<DatedObservation | null>((best, entry) =>
|
|
69
|
+
entry.value != null && (!best || entry.date > best.date) ? entry : best, null);
|
|
70
|
+
return newest?.date === latestDate && typeof newest.releasedOn === "string" ? newest.releasedOn : undefined;
|
|
60
71
|
}
|
|
61
72
|
|
|
62
73
|
/**
|
|
@@ -72,7 +83,9 @@ function alignDerivedBuilds(builds: StatBuild[]): StatBuild[] {
|
|
|
72
83
|
const cap = (legs as string[]).reduce((oldest, date) => date < oldest ? date : oldest);
|
|
73
84
|
if ((entry.points.at(-1)?.date ?? "") <= cap) return entry;
|
|
74
85
|
const points = entry.points.filter((point) => point.date <= cap);
|
|
75
|
-
|
|
86
|
+
if (points.length === 0) return entry;
|
|
87
|
+
const { releasedOn: _cutRelease, ...rest } = entry;
|
|
88
|
+
return { ...rest, points, trend: fitTrend(points, "linear") };
|
|
76
89
|
});
|
|
77
90
|
}
|
|
78
91
|
|
|
@@ -5,6 +5,7 @@ export type StatCategoryId =
|
|
|
5
5
|
| "inflation"
|
|
6
6
|
| "labor"
|
|
7
7
|
| "growth"
|
|
8
|
+
| "nowcasts"
|
|
8
9
|
| "consumer"
|
|
9
10
|
| "housing"
|
|
10
11
|
| "rates"
|
|
@@ -14,6 +15,7 @@ export const STAT_CATEGORIES: ReadonlyArray<{ id: StatCategoryId; label: string
|
|
|
14
15
|
{ id: "inflation", label: "Inflation" },
|
|
15
16
|
{ id: "labor", label: "Labor" },
|
|
16
17
|
{ id: "growth", label: "Growth" },
|
|
18
|
+
{ id: "nowcasts", label: "Nowcasts & conditions" },
|
|
17
19
|
{ id: "consumer", label: "Consumer" },
|
|
18
20
|
{ id: "housing", label: "Housing" },
|
|
19
21
|
{ id: "rates", label: "Rates & Money" },
|
|
@@ -56,6 +58,8 @@ export interface StatDef {
|
|
|
56
58
|
staleAfterMs: number;
|
|
57
59
|
/** Searchable description; the long-form reference lives in docs/economics-reference.md. */
|
|
58
60
|
note: string;
|
|
61
|
+
/** Other words the catalog and the pane's filter find it by: `PMMS` for the mortgage rate. */
|
|
62
|
+
keywords?: readonly string[];
|
|
59
63
|
/** Concise measurement identity that must remain beside the values. */
|
|
60
64
|
measurementBasis?: string;
|
|
61
65
|
/**
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { useMemo } from "react";
|
|
2
2
|
import { ExternalLinkText, type StatItem } from "../../../components/ui";
|
|
3
|
-
import { fredSeriesUrl } from "../../../sources/gloomberb-cloud/fred-series";
|
|
3
|
+
import { fredSeriesUrl, fredSourceLabel } from "../../../sources/gloomberb-cloud/fred-series";
|
|
4
4
|
import { colors } from "../../../theme/colors";
|
|
5
5
|
import { Box, Text } from "../../../ui";
|
|
6
6
|
import { formatBasisPoints } from "../../../utils/basis-points";
|
|
@@ -74,7 +74,7 @@ export function StatDetail({
|
|
|
74
74
|
<Box flexDirection="row" flexWrap="wrap" paddingX={1} flexShrink={0}>
|
|
75
75
|
<ExternalLinkText
|
|
76
76
|
url={fredSeriesUrl(stat.seriesId)}
|
|
77
|
-
label={
|
|
77
|
+
label={fredSourceLabel(stat.seriesId)}
|
|
78
78
|
color={colors.text}
|
|
79
79
|
/>
|
|
80
80
|
{stat.measurementBasis ? <Text fg={colors.textDim}>{` · ${stat.measurementBasis}`}</Text> : null}
|
|
@@ -3,6 +3,7 @@ import type {
|
|
|
3
3
|
HeadlessPaneDefinition,
|
|
4
4
|
HeadlessPaneEntry,
|
|
5
5
|
} from "../../../types/plugin";
|
|
6
|
+
import { fredSourceLabel } from "../../../sources/gloomberb-cloud/fred-series";
|
|
6
7
|
import { formatBasisPoints, toBasisPoints } from "../../../utils/basis-points";
|
|
7
8
|
import { formatNumber } from "../../../utils/format";
|
|
8
9
|
import type { StatDef } from "./defs";
|
|
@@ -70,8 +71,9 @@ function detailEntries(view: StatViewModel, cutoffShown: boolean): HeadlessPaneE
|
|
|
70
71
|
})),
|
|
71
72
|
// FRED dates a monthly reading at the month's first day; the text says which period it is.
|
|
72
73
|
// A Treasury yield adds when in the day it was taken, so it is not read against ^TNX's earlier close.
|
|
73
|
-
|
|
74
|
-
{ label: "
|
|
74
|
+
// A figure dated by its period also says when it was released: "Sep 2026, released Tue 20 Oct".
|
|
75
|
+
{ label: "Period", value: view.latest.date, formatted: view.stat.cutoff && !cutoffShown ? `${view.reading} ${view.stat.cutoff}` : view.readingReleased },
|
|
76
|
+
{ label: "Source", value: fredSourceLabel(view.stat.seriesId) },
|
|
75
77
|
];
|
|
76
78
|
}
|
|
77
79
|
|
|
@@ -115,6 +117,11 @@ export function projectStatsHeadlessBundle(
|
|
|
115
117
|
format: (value: unknown) => formatNumber(Number(value), 0),
|
|
116
118
|
},
|
|
117
119
|
{ key: "asOf", header: "Period", format: (_value: unknown, row: Record<string, unknown>) => String(row.reading) },
|
|
120
|
+
{
|
|
121
|
+
key: "releasedOn",
|
|
122
|
+
header: "Released",
|
|
123
|
+
format: (_value: unknown, row: Record<string, unknown>) => typeof row.released === "string" ? row.released.replace(/^released /, "") : "",
|
|
124
|
+
},
|
|
118
125
|
],
|
|
119
126
|
rows: categoryViews.map((view) => ({
|
|
120
127
|
id: view.stat.id,
|
|
@@ -129,8 +136,12 @@ export function projectStatsHeadlessBundle(
|
|
|
129
136
|
previousBasisPoints: view.previous ? toBasisPoints(view.previous.value) : null,
|
|
130
137
|
} : {}),
|
|
131
138
|
percentile: view.percentile,
|
|
139
|
+
// The period the figure covers; `releasedOn` is when it was published, which the report is as of.
|
|
132
140
|
asOf: view.latest.date,
|
|
141
|
+
releasedOn: view.releasedOn,
|
|
142
|
+
...(view.periodicity ? { periodicity: view.periodicity } : {}),
|
|
133
143
|
reading: view.reading,
|
|
144
|
+
released: view.released,
|
|
134
145
|
stale: view.observationStale || view.cacheStale,
|
|
135
146
|
fetchedAt: view.fetchedAt,
|
|
136
147
|
cacheStale: view.cacheStale,
|
|
@@ -23,15 +23,15 @@ export const econStatisticsModule: PluginModule = {
|
|
|
23
23
|
paneId: ECON_STATISTICS_PANE_ID,
|
|
24
24
|
label: "Economic Statistics",
|
|
25
25
|
description: "Inflation, labour, growth, housing and rates against their own history.",
|
|
26
|
-
keywords: [
|
|
26
|
+
keywords: [...new Set([
|
|
27
27
|
"economic",
|
|
28
28
|
"statistics",
|
|
29
29
|
"macro",
|
|
30
30
|
"indicators",
|
|
31
31
|
"data",
|
|
32
32
|
...STAT_CATEGORIES.map((entry) => entry.label.toLowerCase()),
|
|
33
|
-
...STATS.
|
|
34
|
-
],
|
|
33
|
+
...STATS.flatMap((entry) => [entry.shortLabel, ...entry.keywords ?? []].map((keyword) => keyword.toLowerCase())),
|
|
34
|
+
])],
|
|
35
35
|
shortcut: {
|
|
36
36
|
prefix: "ECST",
|
|
37
37
|
argPlaceholder: "statistic",
|
|
@@ -63,6 +63,7 @@ function matchesQuery(view: StatViewModel, query: string): boolean {
|
|
|
63
63
|
view.stat.seriesId,
|
|
64
64
|
categoryLabel(view.stat.category),
|
|
65
65
|
view.stat.note,
|
|
66
|
+
...view.stat.keywords ?? [],
|
|
66
67
|
].join(" ").toLowerCase();
|
|
67
68
|
return query.split(/\s+/).every((token) => haystack.includes(token));
|
|
68
69
|
}
|
|
@@ -150,7 +151,7 @@ export function EconStatisticsPane({ focused, width, height }: PaneProps) {
|
|
|
150
151
|
// A Treasury yield names when in the day it was taken, as GC does, so it is not read against ^TNX's earlier close.
|
|
151
152
|
const cutoff = selected.stat.cutoff ? ` ${selected.stat.cutoff}` : "";
|
|
152
153
|
const info: PaneFooterSegment[] = [
|
|
153
|
-
{ id: "as-of", parts: [{ text: `reading for ${selected.reading}${cutoff}`, tone: "muted" }] },
|
|
154
|
+
{ id: "as-of", parts: [{ text: `reading for ${cutoff ? selected.reading : selected.readingReleased}${cutoff}`, tone: "muted" }] },
|
|
154
155
|
];
|
|
155
156
|
// The cached first paint is being replaced; its age only counts once that load fails.
|
|
156
157
|
const seeding = resource.loading && resource.updatedAt === null && !selected.refreshError;
|
|
@@ -5,6 +5,9 @@ import type { StatDef } from "./defs";
|
|
|
5
5
|
const DAY_MS = 24 * 60 * 60 * 1000;
|
|
6
6
|
const DAILY = 6 * DAY_MS;
|
|
7
7
|
const WEEKLY = 21 * DAY_MS;
|
|
8
|
+
// GDPNow is dated at quarter start but updated through the following month's
|
|
9
|
+
// advance GDP release; allow that ~120-day span plus two weeks.
|
|
10
|
+
const NOWCAST_QUARTERLY = 135 * DAY_MS;
|
|
8
11
|
// FRED dates a print at the start of its period, so an on-time print is two
|
|
9
12
|
// periods plus the release lag old just before the next one lands. Each limit
|
|
10
13
|
// adds about two weeks to the slowest normal lag of its group.
|
|
@@ -16,11 +19,14 @@ const QUARTERLY = 235 * DAY_MS; // GDP, productivity: two quarters plus a lag up
|
|
|
16
19
|
const pct = (value: number) => `${formatNumber(value, 1)}%`;
|
|
17
20
|
const pct2 = (value: number) => `${formatNumber(value, 2)}%`;
|
|
18
21
|
const plain = (value: number) => formatNumber(value, 1);
|
|
22
|
+
const index2 = (value: number) => formatNumber(value, 2);
|
|
19
23
|
/** FRED reports payrolls and claims in thousands already. */
|
|
20
24
|
const thousands = (value: number) => `${formatNumber(value / 1000, value >= 10_000 ? 1 : 2)}M`;
|
|
21
25
|
const signedThousands = (value: number) =>
|
|
22
26
|
`${value > 0 ? "+" : ""}${formatNumber(value, 0)}k`;
|
|
23
27
|
const billions = (value: number) => `${formatNumber(value, 0)}B`;
|
|
28
|
+
/** A spread already scaled to basis points; the label says the unit. */
|
|
29
|
+
const basisPoints = (value: number) => formatNumber(value, 0);
|
|
24
30
|
|
|
25
31
|
function stat(def: StatDef): StatDef {
|
|
26
32
|
return def;
|
|
@@ -249,6 +255,68 @@ export const STATS: readonly StatDef[] = [
|
|
|
249
255
|
limit: 500,
|
|
250
256
|
}),
|
|
251
257
|
|
|
258
|
+
// ---- Nowcasts & conditions --------------------------------------------
|
|
259
|
+
stat({
|
|
260
|
+
id: "gdpnow",
|
|
261
|
+
measurementBasis: "Estimate · q/q annualized",
|
|
262
|
+
label: "Atlanta Fed GDPNow",
|
|
263
|
+
shortLabel: "GDPNow",
|
|
264
|
+
category: "nowcasts",
|
|
265
|
+
seriesId: "GDPNOW",
|
|
266
|
+
transform: "level",
|
|
267
|
+
direction: "higher-is-good",
|
|
268
|
+
axisUnit: "%",
|
|
269
|
+
formatValue: pct,
|
|
270
|
+
reference: { value: 0, label: "flat" },
|
|
271
|
+
staleAfterMs: NOWCAST_QUARTERLY,
|
|
272
|
+
note: "Atlanta Fed model estimate of real GDP growth, updated within the quarter. Already an annualized percentage change, not a GDP level.",
|
|
273
|
+
}),
|
|
274
|
+
stat({
|
|
275
|
+
id: "nfci",
|
|
276
|
+
measurementBasis: "Weekly · index",
|
|
277
|
+
label: "Chicago Fed Financial Conditions",
|
|
278
|
+
shortLabel: "Chicago NFCI",
|
|
279
|
+
category: "nowcasts",
|
|
280
|
+
seriesId: "NFCI",
|
|
281
|
+
transform: "level",
|
|
282
|
+
direction: "higher-is-bad",
|
|
283
|
+
axisUnit: "",
|
|
284
|
+
formatValue: index2,
|
|
285
|
+
reference: { value: 0, label: "average" },
|
|
286
|
+
staleAfterMs: WEEKLY,
|
|
287
|
+
note: "Chicago Fed National Financial Conditions Index. Positive values mean tighter-than-average conditions; negative values mean looser conditions.",
|
|
288
|
+
}),
|
|
289
|
+
stat({
|
|
290
|
+
id: "financial-stress",
|
|
291
|
+
measurementBasis: "Weekly · index",
|
|
292
|
+
label: "St. Louis Fed Financial Stress",
|
|
293
|
+
shortLabel: "St. Louis FSI",
|
|
294
|
+
category: "nowcasts",
|
|
295
|
+
seriesId: "STLFSI4",
|
|
296
|
+
transform: "level",
|
|
297
|
+
direction: "higher-is-bad",
|
|
298
|
+
axisUnit: "",
|
|
299
|
+
formatValue: index2,
|
|
300
|
+
reference: { value: 0, label: "average" },
|
|
301
|
+
staleAfterMs: WEEKLY,
|
|
302
|
+
note: "St. Louis Fed Financial Stress Index, current fourth version. Positive values mean above-average stress; negative values mean below-average stress.",
|
|
303
|
+
}),
|
|
304
|
+
stat({
|
|
305
|
+
id: "median-cpi",
|
|
306
|
+
measurementBasis: "m/m annualized · seasonally adjusted",
|
|
307
|
+
label: "Cleveland Fed Median CPI",
|
|
308
|
+
shortLabel: "Median CPI",
|
|
309
|
+
category: "nowcasts",
|
|
310
|
+
seriesId: "MEDCPIM158SFRBCLE",
|
|
311
|
+
transform: "level",
|
|
312
|
+
direction: "higher-is-bad",
|
|
313
|
+
axisUnit: "%",
|
|
314
|
+
formatValue: pct,
|
|
315
|
+
reference: null,
|
|
316
|
+
staleAfterMs: MONTHLY_EARLY,
|
|
317
|
+
note: "Cleveland Fed weighted median consumer price change. Published as an annualized monthly percentage change, not a year-over-year inflation rate.",
|
|
318
|
+
}),
|
|
319
|
+
|
|
252
320
|
// ---- Consumer --------------------------------------------------------
|
|
253
321
|
stat({
|
|
254
322
|
id: "retail-sales",
|
|
@@ -378,6 +446,41 @@ export const STATS: readonly StatDef[] = [
|
|
|
378
446
|
note: "Newly built homes sold, at an annual rate.",
|
|
379
447
|
limit: 900,
|
|
380
448
|
}),
|
|
449
|
+
stat({
|
|
450
|
+
id: "mortgage-30y",
|
|
451
|
+
measurementBasis: "Weekly · Freddie Mac PMMS",
|
|
452
|
+
label: "30-Year Mortgage Rate",
|
|
453
|
+
shortLabel: "30Y mortgage rate",
|
|
454
|
+
category: "housing",
|
|
455
|
+
seriesId: "MORTGAGE30US",
|
|
456
|
+
transform: "level",
|
|
457
|
+
direction: "neutral",
|
|
458
|
+
axisUnit: "%",
|
|
459
|
+
formatValue: pct2,
|
|
460
|
+
reference: null,
|
|
461
|
+
staleAfterMs: WEEKLY,
|
|
462
|
+
note: "Freddie Mac's weekly average 30-year fixed mortgage rate, what a home purchase is financed at.",
|
|
463
|
+
keywords: ["mortgage rates", "PMMS", "Freddie Mac", "homebuilders"],
|
|
464
|
+
}),
|
|
465
|
+
stat({
|
|
466
|
+
id: "mortgage-spread",
|
|
467
|
+
measurementBasis: "30Y mortgage minus 10Y Treasury on the PMMS date",
|
|
468
|
+
label: "Mortgage–10Y Spread (bp)",
|
|
469
|
+
shortLabel: "Mortgage–10Y (bp)",
|
|
470
|
+
category: "housing",
|
|
471
|
+
seriesId: "MORTGAGE30US10Y",
|
|
472
|
+
derivedFrom: ["mortgage-30y", "ten-year"],
|
|
473
|
+
transform: "level",
|
|
474
|
+
// Gloom Cloud serves it in percentage points, as FRED does its spreads.
|
|
475
|
+
scale: 100,
|
|
476
|
+
direction: "neutral",
|
|
477
|
+
axisUnit: "",
|
|
478
|
+
formatValue: basisPoints,
|
|
479
|
+
reference: null,
|
|
480
|
+
staleAfterMs: WEEKLY,
|
|
481
|
+
note: "The 30-year mortgage rate less the 10-year Treasury yield on each survey date, how much mortgages pay over Treasuries.",
|
|
482
|
+
keywords: ["mortgage spread", "PMMS", "homebuilders"],
|
|
483
|
+
}),
|
|
381
484
|
// ---- Rates & money ---------------------------------------------------
|
|
382
485
|
stat({
|
|
383
486
|
id: "fed-funds",
|