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,7 +1,15 @@
|
|
|
1
1
|
// Alerts a number of days before a dated event: a company's next earnings, or
|
|
2
|
-
//
|
|
3
|
-
//
|
|
4
|
-
//
|
|
2
|
+
// a release in the economic calendar, CPI and FOMC among them. An earnings
|
|
3
|
+
// rule can instead go off once the report's actual EPS is out; a release also
|
|
4
|
+
// alerts with its figures once they print (calendar-events.ts). The rules are
|
|
5
|
+
// event alert rules (`earnings_date`, `macro_event`, `calendar_event`) with
|
|
6
|
+
// the lead time in their config; this module is the date arithmetic and the
|
|
7
|
+
// lookup of the next event date.
|
|
8
|
+
import { formatNumber } from "../../../utils/format";
|
|
9
|
+
import type { EconEvent } from "../econ/types";
|
|
10
|
+
import { newYorkToday } from "../earnings/board-model";
|
|
11
|
+
import { epsSurprise } from "../shared/earnings-report";
|
|
12
|
+
import { calendarEventLabel, nextReleaseDate, type CalendarReleaseTarget } from "./calendar-events";
|
|
5
13
|
import type { EventAlertRule } from "./events";
|
|
6
14
|
import { MACRO_EVENT_NAMES } from "./research-builder";
|
|
7
15
|
import {
|
|
@@ -15,21 +23,51 @@ import {
|
|
|
15
23
|
|
|
16
24
|
const DAY_MS = 86_400_000;
|
|
17
25
|
|
|
18
|
-
/**
|
|
26
|
+
/**
|
|
27
|
+
* What a scheduled alert follows: one US-listed company's earnings, CPI or
|
|
28
|
+
* FOMC, or any release in the economic calendar by its name and country.
|
|
29
|
+
*/
|
|
19
30
|
export type ScheduledEventTarget =
|
|
20
31
|
| { kind: "earnings"; symbol: string; exchange: string }
|
|
21
|
-
| { kind: "macro"; event: MacroAlertEvent }
|
|
32
|
+
| { kind: "macro"; event: MacroAlertEvent }
|
|
33
|
+
| CalendarReleaseTarget;
|
|
34
|
+
|
|
35
|
+
/** CPI, FOMC and calendar releases alert again with their figures once they print; earnings do not. */
|
|
36
|
+
export const followsRelease = (target: ScheduledEventTarget): target is Exclude<ScheduledEventTarget, { kind: "earnings" }> =>
|
|
37
|
+
target.kind !== "earnings";
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* The day a rule's dates count from: New York's for earnings, CPI and FOMC,
|
|
41
|
+
* whose calendars give New York days; the UTC day for a calendar release,
|
|
42
|
+
* which the economic calendar lists by its UTC day.
|
|
43
|
+
*/
|
|
44
|
+
export function scheduledToday(target: ScheduledEventTarget, now: number = Date.now()): string {
|
|
45
|
+
return target.kind === "release" ? new Date(now).toISOString().slice(0, 10) : newYorkToday(new Date(now));
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/** When a scheduled rule goes off: its lead time before the date, or (earnings only) once the results are out. */
|
|
49
|
+
export type ScheduledTrigger = "date" | "results";
|
|
22
50
|
|
|
23
51
|
export interface ScheduledRule {
|
|
24
52
|
target: ScheduledEventTarget;
|
|
25
53
|
leadDays: number;
|
|
54
|
+
trigger: ScheduledTrigger;
|
|
26
55
|
}
|
|
27
56
|
|
|
57
|
+
/**
|
|
58
|
+
* How long past its report date a results alert waits for the actual EPS:
|
|
59
|
+
* an after-close report is filled in overnight, and a late one a day or two
|
|
60
|
+
* later. Past it the alert lets that report go and follows the next one.
|
|
61
|
+
*/
|
|
62
|
+
const RESULTS_WAIT_DAYS = 3;
|
|
63
|
+
|
|
28
64
|
/**
|
|
29
65
|
* Where a scheduled alert stands on `today` (a New York calendar day):
|
|
30
66
|
* `armed` before its lead time, `due` from the lead day through the event day
|
|
31
67
|
* until it alerts, `fired` once it has for this event, `passed` after the
|
|
32
|
-
* event day, and `unscheduled` with no event date to wait for.
|
|
68
|
+
* event day, and `unscheduled` with no event date to wait for. A results
|
|
69
|
+
* alert is due from the report day through `RESULTS_WAIT_DAYS` after it, and
|
|
70
|
+
* goes off within that only once the actual EPS is out.
|
|
33
71
|
*/
|
|
34
72
|
export type ScheduledPhase = "unscheduled" | "armed" | "due" | "fired" | "passed";
|
|
35
73
|
|
|
@@ -49,9 +87,6 @@ export function parseMacroEventName(raw: string | null | undefined): MacroAlertE
|
|
|
49
87
|
return isMacroAlertEvent(name) ? name : null;
|
|
50
88
|
}
|
|
51
89
|
|
|
52
|
-
/** The names a macro event alert takes, as the CLI spells them. */
|
|
53
|
-
export const MACRO_EVENT_CLI_NAMES = "CPI or FOMC";
|
|
54
|
-
|
|
55
90
|
function shiftDate(date: string, days: number): string {
|
|
56
91
|
return new Date(Date.parse(`${date}T00:00:00Z`) + days * DAY_MS).toISOString().slice(0, 10);
|
|
57
92
|
}
|
|
@@ -71,54 +106,88 @@ export function scheduledPhase(
|
|
|
71
106
|
leadDays: number,
|
|
72
107
|
firedFor: string | undefined,
|
|
73
108
|
today: string,
|
|
109
|
+
trigger: ScheduledTrigger = "date",
|
|
74
110
|
): ScheduledPhase {
|
|
75
111
|
if (!eventDate) return "unscheduled";
|
|
76
|
-
|
|
112
|
+
const results = trigger === "results";
|
|
113
|
+
if (today > (results ? shiftDate(eventDate, RESULTS_WAIT_DAYS) : eventDate)) return "passed";
|
|
77
114
|
if (firedFor === eventDate) return "fired";
|
|
78
|
-
return today >= leadStartDate(eventDate, leadDays) ? "due" : "armed";
|
|
115
|
+
return today >= (results ? eventDate : leadStartDate(eventDate, leadDays)) ? "due" : "armed";
|
|
79
116
|
}
|
|
80
117
|
|
|
81
118
|
/** The rule's target and lead time; null for a rule that is not a scheduled event or does not read. */
|
|
82
119
|
export function readScheduledRule(rule: EventAlertRule): ScheduledRule | null {
|
|
83
|
-
if (rule.kind !== "earnings_date" && rule.kind !== "macro_event") return null;
|
|
120
|
+
if (rule.kind !== "earnings_date" && rule.kind !== "macro_event" && rule.kind !== "calendar_event") return null;
|
|
84
121
|
const config = readResearchRule(rule.kind, rule.value);
|
|
85
122
|
if (!config || typeof config.leadDays !== "number") return null;
|
|
86
123
|
if (rule.kind === "macro_event") {
|
|
87
|
-
return isMacroAlertEvent(config.event) ? { target: { kind: "macro", event: config.event }, leadDays: config.leadDays } : null;
|
|
124
|
+
return isMacroAlertEvent(config.event) ? { target: { kind: "macro", event: config.event }, leadDays: config.leadDays, trigger: "date" } : null;
|
|
125
|
+
}
|
|
126
|
+
if (rule.kind === "calendar_event") {
|
|
127
|
+
return config.event && config.country
|
|
128
|
+
? {
|
|
129
|
+
target: { kind: "release", event: config.event, country: config.country, ...(config.publisher ? { publisher: config.publisher } : {}) },
|
|
130
|
+
leadDays: config.leadDays,
|
|
131
|
+
trigger: "date",
|
|
132
|
+
}
|
|
133
|
+
: null;
|
|
88
134
|
}
|
|
89
135
|
return config.symbol
|
|
90
|
-
? {
|
|
136
|
+
? {
|
|
137
|
+
target: { kind: "earnings", symbol: config.symbol, exchange: config.exchange ?? "" },
|
|
138
|
+
leadDays: config.leadDays,
|
|
139
|
+
trigger: config.when === "results" ? "results" : "date",
|
|
140
|
+
}
|
|
91
141
|
: null;
|
|
92
142
|
}
|
|
93
143
|
|
|
94
144
|
/** One key per thing to look up, shared by every rule on the same event. */
|
|
95
145
|
export function scheduledTargetKey(target: ScheduledEventTarget): string {
|
|
146
|
+
if (target.kind === "release") return `release:${target.country}:${target.event.toLowerCase()}:${target.publisher ?? ""}`;
|
|
96
147
|
return target.kind === "earnings" ? `earnings:${target.symbol}` : `macro:${target.event}`;
|
|
97
148
|
}
|
|
98
149
|
|
|
99
|
-
/** "CRWV earnings", "CPI release", "FOMC decision". */
|
|
150
|
+
/** "CRWV earnings", "CPI release", "FOMC decision", "NBS Manufacturing PMI (CN)". */
|
|
100
151
|
export function scheduledEventName(target: ScheduledEventTarget): string {
|
|
152
|
+
if (target.kind === "release") return calendarEventLabel(target);
|
|
101
153
|
return target.kind === "earnings" ? `${target.symbol} earnings` : MACRO_EVENT_NAMES[target.event];
|
|
102
154
|
}
|
|
103
155
|
|
|
104
156
|
/**
|
|
105
|
-
*
|
|
106
|
-
*
|
|
157
|
+
* "1 day before", "3 days before", "when results are out": when a rule goes
|
|
158
|
+
* off, as lists say it; a release's ("1 day before and when it prints")
|
|
159
|
+
* also once its figures are out.
|
|
160
|
+
*/
|
|
161
|
+
export function scheduledTriggerText(rule: Pick<ScheduledRule, "leadDays" | "trigger"> & { prints?: boolean }): string {
|
|
162
|
+
if (rule.trigger === "results") return "when results are out";
|
|
163
|
+
return `${rule.leadDays} day${rule.leadDays === 1 ? "" : "s"} before${rule.prints ? " and when it prints" : ""}`;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* A new rule for `target`, alerting `lead` days before it or, for earnings,
|
|
168
|
+
* once the results are out, with the event date the caller looked up. Throws
|
|
169
|
+
* for a listing the rule cannot follow.
|
|
107
170
|
*/
|
|
108
171
|
export function createScheduledAlert(
|
|
109
172
|
target: ScheduledEventTarget,
|
|
110
|
-
|
|
173
|
+
lead: number | "results",
|
|
111
174
|
eventDate: string | null,
|
|
112
175
|
now = Date.now(),
|
|
113
176
|
): EventAlertRule {
|
|
114
|
-
|
|
177
|
+
if (target.kind !== "earnings" && lead === "results") throw new Error("Only earnings alerts can wait for results.");
|
|
178
|
+
const kind = target.kind === "earnings" ? "earnings_date" : target.kind === "release" ? "calendar_event" : "macro_event";
|
|
179
|
+
const timing = lead === "results" ? { when: "results" } : { leadDays: lead };
|
|
115
180
|
const value = normalizeResearchRule(kind, target.kind === "earnings"
|
|
116
|
-
? { version: 1, symbol: target.symbol, exchange: target.exchange,
|
|
117
|
-
:
|
|
181
|
+
? { version: 1, symbol: target.symbol, exchange: target.exchange, ...timing }
|
|
182
|
+
: target.kind === "release"
|
|
183
|
+
? { version: 1, event: target.event, country: target.country, ...(target.publisher ? { publisher: target.publisher } : {}), ...timing }
|
|
184
|
+
: { version: 1, event: target.event, ...timing });
|
|
118
185
|
if (!value) {
|
|
119
186
|
throw new Error(target.kind === "earnings"
|
|
120
187
|
? `Earnings alerts follow US listings, such as CRWV or AAPL:NASDAQ. ${target.exchange ? `${target.symbol}:${target.exchange}` : target.symbol} is not one.`
|
|
121
|
-
:
|
|
188
|
+
: target.kind === "release"
|
|
189
|
+
? `A calendar event alert takes the event's name, a two-letter country and 1 to ${MAX_LEAD_DAYS} days before.`
|
|
190
|
+
: `Days before must be a whole number from 1 to ${MAX_LEAD_DAYS}.`);
|
|
122
191
|
}
|
|
123
192
|
return {
|
|
124
193
|
id: crypto.randomUUID(),
|
|
@@ -131,9 +200,9 @@ export function createScheduledAlert(
|
|
|
131
200
|
};
|
|
132
201
|
}
|
|
133
202
|
|
|
134
|
-
/** Re-armed: it alerts again for the event it already alerted for, and a paused rule resumes. */
|
|
203
|
+
/** Re-armed: it alerts again for the event it already alerted for, its figures too, and a paused rule resumes. */
|
|
135
204
|
export function rearmScheduledAlert(rule: EventAlertRule, now = Date.now()): EventAlertRule {
|
|
136
|
-
const { firedFor: _fired, ...rest } = rule;
|
|
205
|
+
const { firedFor: _fired, printedFor: _printed, ...rest } = rule;
|
|
137
206
|
return { ...rest, status: "active", createdAt: rule.status === "paused" ? now : rule.createdAt };
|
|
138
207
|
}
|
|
139
208
|
|
|
@@ -151,9 +220,80 @@ export function scheduledAlertMessage(target: ScheduledEventTarget, eventDate: s
|
|
|
151
220
|
}
|
|
152
221
|
|
|
153
222
|
/** A list's state word: paused, active, or triggered while it has alerted for the coming event. */
|
|
154
|
-
export function scheduledAlertStatus(
|
|
223
|
+
export function scheduledAlertStatus(
|
|
224
|
+
rule: EventAlertRule,
|
|
225
|
+
leadDays: number,
|
|
226
|
+
today: string,
|
|
227
|
+
trigger: ScheduledTrigger = "date",
|
|
228
|
+
): "active" | "paused" | "triggered" {
|
|
155
229
|
if (rule.status === "paused") return "paused";
|
|
156
|
-
return scheduledPhase(rule.eventDate, leadDays, rule.firedFor, today) === "fired" ? "triggered" : "active";
|
|
230
|
+
return scheduledPhase(rule.eventDate, leadDays, rule.firedFor, today, trigger) === "fired" ? "triggered" : "active";
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
/** A company's report as ERN has it: its day and, once out, the actual EPS. */
|
|
234
|
+
export interface EarningsResultRow {
|
|
235
|
+
symbol: string;
|
|
236
|
+
date: string;
|
|
237
|
+
epsActual: number | null;
|
|
238
|
+
epsEstimate: number | null;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
/**
|
|
242
|
+
* The report `symbol` was waited for on `eventDate`, once its actual EPS is
|
|
243
|
+
* out: the reported row nearest that day, from a few days before it (a date
|
|
244
|
+
* moved up) through `RESULTS_WAIT_DAYS` after. Null while it is not out.
|
|
245
|
+
*/
|
|
246
|
+
export function reportedResult(rows: readonly EarningsResultRow[], symbol: string, eventDate: string): EarningsResultRow | null {
|
|
247
|
+
const wanted = symbol.trim().toUpperCase();
|
|
248
|
+
const from = shiftDate(eventDate, -RESULTS_WAIT_DAYS);
|
|
249
|
+
const to = shiftDate(eventDate, RESULTS_WAIT_DAYS);
|
|
250
|
+
return rows
|
|
251
|
+
.filter((row) => row.symbol.trim().toUpperCase() === wanted && row.epsActual != null && Number.isFinite(row.epsActual)
|
|
252
|
+
&& row.date >= from && row.date <= to)
|
|
253
|
+
.sort((left, right) => Math.abs(daysBetween(eventDate, left.date)) - Math.abs(daysBetween(eventDate, right.date)))[0] ?? null;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
type ResultsRead = (symbols: string[]) => Promise<readonly EarningsResultRow[]>;
|
|
257
|
+
|
|
258
|
+
/**
|
|
259
|
+
* The reports results alerts wait on, from ERN's board and, for each symbol
|
|
260
|
+
* the board has no actual EPS for (a listing the stored calendar does not
|
|
261
|
+
* cover, or the board unreadable), the per-ticker calendar. Either read
|
|
262
|
+
* failing leaves the other's rows; only both failing, or the board failing
|
|
263
|
+
* with no other read, is an error.
|
|
264
|
+
*/
|
|
265
|
+
export async function readEarningsResults(
|
|
266
|
+
symbols: readonly string[],
|
|
267
|
+
board: ResultsRead,
|
|
268
|
+
calendar: ResultsRead | null,
|
|
269
|
+
): Promise<EarningsResultRow[]> {
|
|
270
|
+
const [fromBoard] = await Promise.allSettled([board([...symbols])]);
|
|
271
|
+
const rows = fromBoard.status === "fulfilled" ? [...fromBoard.value] : [];
|
|
272
|
+
const reported = new Set(rows.filter((row) => row.epsActual != null).map((row) => row.symbol.trim().toUpperCase()));
|
|
273
|
+
const missing = symbols.filter((symbol) => !reported.has(symbol.trim().toUpperCase()));
|
|
274
|
+
if (missing.length === 0 || !calendar) {
|
|
275
|
+
if (fromBoard.status === "rejected") throw fromBoard.reason;
|
|
276
|
+
return rows;
|
|
277
|
+
}
|
|
278
|
+
const [fromCalendar] = await Promise.allSettled([calendar(missing)]);
|
|
279
|
+
if (fromCalendar.status === "fulfilled") return [...rows, ...fromCalendar.value];
|
|
280
|
+
if (fromBoard.status === "rejected") throw fromBoard.reason;
|
|
281
|
+
return rows;
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
/** The days to read reports over for results alerts waiting on `eventDates`. */
|
|
285
|
+
export function resultsLookupRange(eventDates: readonly string[]): { from: string; to: string } | null {
|
|
286
|
+
const sorted = [...eventDates].sort();
|
|
287
|
+
return sorted.length === 0 ? null : { from: shiftDate(sorted[0]!, -RESULTS_WAIT_DAYS), to: shiftDate(sorted.at(-1)!, RESULTS_WAIT_DAYS) };
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
/** The notification once results are out: "CRWV reported EPS 0.12 vs 0.10 expected (+20.0%)". */
|
|
291
|
+
export function scheduledResultsMessage(symbol: string, result: Pick<EarningsResultRow, "epsActual" | "epsEstimate">): string {
|
|
292
|
+
const actual = `${symbol} reported EPS ${formatNumber(result.epsActual ?? undefined, 2)}`;
|
|
293
|
+
if (result.epsEstimate == null) return actual;
|
|
294
|
+
const surprise = epsSurprise(result.epsActual, result.epsEstimate);
|
|
295
|
+
const shown = surprise == null ? null : Number((surprise * 100).toFixed(1));
|
|
296
|
+
return `${actual} vs ${formatNumber(result.epsEstimate, 2)} expected${shown == null ? "" : ` (${shown > 0 ? "+" : ""}${shown.toFixed(1)}%)`}`;
|
|
157
297
|
}
|
|
158
298
|
|
|
159
299
|
export interface EarningsDateRow {
|
|
@@ -163,7 +303,7 @@ export interface EarningsDateRow {
|
|
|
163
303
|
|
|
164
304
|
/**
|
|
165
305
|
* The next earnings day of `symbol` on or after `today`. The day is the UTC
|
|
166
|
-
* date of the report time, the day ERN and `
|
|
306
|
+
* date of the report time, the day ERN and `gloom earnings` show.
|
|
167
307
|
*/
|
|
168
308
|
export function nextEarningsDate(events: readonly EarningsDateRow[], symbol: string, today: string): string | null {
|
|
169
309
|
const wanted = symbol.trim().toUpperCase();
|
|
@@ -203,6 +343,14 @@ export interface ScheduledEventSources {
|
|
|
203
343
|
earnings(symbols: string[]): Promise<readonly EarningsDateRow[]>;
|
|
204
344
|
cpi(): Promise<CpiReleaseCalendar>;
|
|
205
345
|
fomc(): Promise<ReadonlyArray<{ date: string }>>;
|
|
346
|
+
/**
|
|
347
|
+
* The economic calendar ECO lists: the dates of calendar releases, and the
|
|
348
|
+
* figures every release alert sends once they print. `force` asks past a
|
|
349
|
+
* fresh cache, while a print is due.
|
|
350
|
+
*/
|
|
351
|
+
calendar?(force?: boolean): Promise<readonly EconEvent[]>;
|
|
352
|
+
/** The reports of `symbols` from `from` to `to`, actual EPS included once out; results alerts read it. */
|
|
353
|
+
results?(symbols: string[], from: string, to: string): Promise<readonly EarningsResultRow[]>;
|
|
206
354
|
}
|
|
207
355
|
|
|
208
356
|
export type ScheduledDateLookup = { date: string | null } | { error: string };
|
|
@@ -211,18 +359,27 @@ const errorText = (error: unknown) => (error instanceof Error ? error.message :
|
|
|
211
359
|
|
|
212
360
|
/**
|
|
213
361
|
* The next date of every target, keyed by `scheduledTargetKey`: one earnings
|
|
214
|
-
* request for all the symbols, one CPI and one
|
|
215
|
-
* gives its targets an error and leaves the others alone.
|
|
362
|
+
* request for all the symbols, one CPI, one FOMC and one calendar read. A
|
|
363
|
+
* source that fails gives its targets an error and leaves the others alone.
|
|
364
|
+
* `today` is New York's day; a calendar release follows its next row still
|
|
365
|
+
* to come at `now`.
|
|
216
366
|
*/
|
|
217
367
|
export async function lookupScheduledDates(
|
|
218
368
|
targets: readonly ScheduledEventTarget[],
|
|
219
369
|
sources: ScheduledEventSources,
|
|
220
370
|
today: string,
|
|
371
|
+
now: number = Date.now(),
|
|
221
372
|
): Promise<Map<string, ScheduledDateLookup>> {
|
|
222
373
|
const result = new Map<string, ScheduledDateLookup>();
|
|
223
374
|
const symbols = [...new Set(targets.flatMap((target) => (target.kind === "earnings" ? [target.symbol] : [])))];
|
|
224
375
|
const macros = new Set(targets.flatMap((target) => (target.kind === "macro" ? [target.event] : [])));
|
|
376
|
+
const releases = targets.filter((target): target is CalendarReleaseTarget => target.kind === "release");
|
|
377
|
+
const readCalendar = sources.calendar?.bind(sources) ?? (() => Promise.reject(new Error("The economic calendar is not available.")));
|
|
225
378
|
await Promise.all([
|
|
379
|
+
releases.length === 0 ? null : readCalendar().then(
|
|
380
|
+
(events) => { for (const target of releases) result.set(scheduledTargetKey(target), { date: nextReleaseDate(events, target, now) }); },
|
|
381
|
+
(error) => { for (const target of releases) result.set(scheduledTargetKey(target), { error: errorText(error) }); },
|
|
382
|
+
),
|
|
226
383
|
symbols.length === 0 ? null : sources.earnings(symbols).then(
|
|
227
384
|
(events) => { for (const symbol of symbols) result.set(`earnings:${symbol}`, { date: nextEarningsDate(events, symbol, today) }); },
|
|
228
385
|
(error) => { for (const symbol of symbols) result.set(`earnings:${symbol}`, { error: errorText(error) }); },
|
|
@@ -241,6 +398,7 @@ export async function lookupScheduledDates(
|
|
|
241
398
|
|
|
242
399
|
/** Why no alert was added when the next date could not be looked up. */
|
|
243
400
|
export function eventDateUnavailableMessage(target: ScheduledEventTarget, error: string): string {
|
|
401
|
+
if (target.kind === "release") return `The economic calendar could not be loaded (${error}), so no alert was added.`;
|
|
244
402
|
return target.kind === "earnings"
|
|
245
403
|
? `Earnings dates for ${target.symbol} could not be loaded (${error}), so no alert was added. Check the symbol, or try again later.`
|
|
246
404
|
: `The next ${MACRO_EVENT_NAMES[target.event]} date could not be loaded (${error}), so no alert was added.`;
|
|
@@ -248,6 +406,7 @@ export function eventDateUnavailableMessage(target: ScheduledEventTarget, error:
|
|
|
248
406
|
|
|
249
407
|
/** Why no alert was added for an event with no known next date. */
|
|
250
408
|
export function noUpcomingEventMessage(target: ScheduledEventTarget): string {
|
|
409
|
+
if (target.kind === "release") return `The economic calendar lists no upcoming ${calendarEventLabel(target)}, so no alert was added.`;
|
|
251
410
|
return target.kind === "earnings"
|
|
252
411
|
? `No upcoming earnings date is known for ${target.symbol}, so no alert was added.`
|
|
253
412
|
: `No upcoming ${MACRO_EVENT_NAMES[target.event]} date is known, so no alert was added.`;
|
|
@@ -6,31 +6,34 @@ import {
|
|
|
6
6
|
serializeAlerts,
|
|
7
7
|
} from "./alert-engine";
|
|
8
8
|
import { ALERTS_KEY, ALERTS_PLUGIN_ID } from "./constants";
|
|
9
|
-
import {
|
|
9
|
+
import { readEventAlertStores } from "./events";
|
|
10
10
|
import type { AlertRule } from "./types";
|
|
11
11
|
|
|
12
12
|
export function loadAlerts(ctx: GloomPluginContext): AlertRule[] {
|
|
13
|
-
const json = ctx.configState.get<
|
|
14
|
-
|
|
13
|
+
const json = ctx.configState.get<unknown>(ALERTS_KEY);
|
|
14
|
+
// Background evaluation must not notify from a partial store it cannot safely update.
|
|
15
|
+
if (readAlertsStoreError(json)) return [];
|
|
15
16
|
return deserializeAlerts(json);
|
|
16
17
|
}
|
|
17
18
|
|
|
18
|
-
export function saveAlerts(
|
|
19
|
+
export async function saveAlerts(
|
|
19
20
|
ctx: GloomPluginContext,
|
|
20
21
|
alerts: AlertRule[],
|
|
21
|
-
): void {
|
|
22
|
-
ctx.configState.
|
|
22
|
+
): Promise<void> {
|
|
23
|
+
const error = readAlertsStoreError(ctx.configState.get<unknown>(ALERTS_KEY));
|
|
24
|
+
if (error) throw new Error(error);
|
|
25
|
+
await ctx.configState.set(ALERTS_KEY, serializeAlerts(alerts));
|
|
23
26
|
}
|
|
24
27
|
|
|
25
28
|
/** Both alert stores as the saved config holds them, for the CLI and the reports, which have no plugin context. */
|
|
26
29
|
export function readAlertStores(config: AppConfig) {
|
|
27
30
|
const pluginState = config.pluginConfig[ALERTS_PLUGIN_ID] ?? {};
|
|
28
31
|
const rawPrice = pluginState[ALERTS_KEY];
|
|
29
|
-
const rawEvents = pluginState[EVENT_ALERTS_KEY];
|
|
30
32
|
return {
|
|
31
33
|
pluginState,
|
|
32
|
-
alerts: deserializeAlerts(
|
|
33
|
-
alertsError:
|
|
34
|
-
|
|
34
|
+
alerts: deserializeAlerts(rawPrice),
|
|
35
|
+
alertsError: readAlertsStoreError(rawPrice),
|
|
36
|
+
// The event alerts, and the IV levels kept apart from them.
|
|
37
|
+
events: readEventAlertStores((key) => pluginState[key]),
|
|
35
38
|
};
|
|
36
39
|
}
|
|
@@ -18,6 +18,8 @@ export interface AlertSubject {
|
|
|
18
18
|
marketId?: string;
|
|
19
19
|
/** A macro event rule's release: `cpi` or `fomc`. */
|
|
20
20
|
event?: string;
|
|
21
|
+
/** A calendar event rule's country, which ECO opens on. */
|
|
22
|
+
country?: string;
|
|
21
23
|
keyword?: string;
|
|
22
24
|
cik?: string;
|
|
23
25
|
}
|
|
@@ -32,8 +34,9 @@ const pane = (templateId: string, options?: PaneTemplateCreateOptions): AlertTar
|
|
|
32
34
|
|
|
33
35
|
/**
|
|
34
36
|
* The one map from what an alert follows to what it opens, for every rule kind and every delivered alert:
|
|
35
|
-
* a perpetual opens PERP on its market; a dated event the pane its date comes from (ERN, CPI, WIRP); catalyst,
|
|
36
|
-
* Congress and 13F rules their calendar or list, on the company or fund they name;
|
|
37
|
+
* a perpetual opens PERP on its market; a dated event the pane its date comes from (ERN, CPI, WIRP, ECO); catalyst,
|
|
38
|
+
* Congress and 13F rules their calendar or list, on the company or fund they name; an IV level the symbol's
|
|
39
|
+
* OVDV, whose fits it reads; a hiring move HIRE on the company; any other rule on a security
|
|
37
40
|
* that listing's DES. A rule on no security opens the pane it watches (SRCH for a news keyword, FLOW for flow
|
|
38
41
|
* on the user's lists, FIRST for breaking news). Null when there is nothing to open.
|
|
39
42
|
*/
|
|
@@ -43,13 +46,18 @@ export function alertTarget(subject: AlertSubject): AlertTarget | null {
|
|
|
43
46
|
case "perps_threshold": return subject.marketId ? pane("perps-pane", { arg: subject.marketId }) : null;
|
|
44
47
|
case "earnings_date":
|
|
45
48
|
case "earnings": return symbol ? pane("earnings-calendar-pane", { arg: symbol }) : null;
|
|
49
|
+
case "iv_level": return symbol ? pane("vol-surface-pane", { symbol }) : null;
|
|
46
50
|
case "macro_event": return subject.event === "cpi" ? pane("cpi-pane") : subject.event === "fomc" ? pane("rate-path-pane") : null;
|
|
51
|
+
// Any other release opens the economic calendar on its country.
|
|
52
|
+
case "calendar_event": return pane("econ-calendar-pane", subject.country ? { arg: subject.country } : undefined);
|
|
47
53
|
case "catalyst": return pane("catalysts-pane", symbol ? { symbol } : undefined);
|
|
48
54
|
case "congress_trade": return pane("congress-trades-pane");
|
|
49
55
|
case "thirteenf_filing": return pane(THIRTEENF_TEMPLATE_ID, subject.cik ? { arg: subject.cik } : undefined);
|
|
50
56
|
case "news_keyword": if (!symbol) return pane(RESEARCH_SEARCH_TEMPLATE_ID, subject.keyword ? { arg: subject.keyword } : undefined); break;
|
|
51
57
|
case "options_flow": if (!symbol) return pane("scanner-flow-pane"); break;
|
|
52
58
|
case "breaking_news": if (!symbol) return pane("news-breaking-pane"); break;
|
|
59
|
+
// A hiring move opens HIRE on the company, where its Moves tab says why.
|
|
60
|
+
case "hiring_move": return symbol ? pane("hiring-pane", { symbol }) : null;
|
|
53
61
|
}
|
|
54
62
|
return symbol ? { kind: "description", symbol, ...(subject.exchange ? { exchange: subject.exchange } : {}) } : null;
|
|
55
63
|
}
|
|
@@ -61,7 +69,8 @@ const venue = (exchange: string | undefined) => exchange && exchange !== "US" ?
|
|
|
61
69
|
export function eventRuleSubject(rule: EventAlertRule): AlertSubject {
|
|
62
70
|
if (isResearchAlertKind(rule.kind)) {
|
|
63
71
|
const config = readResearchRule(rule.kind, rule.value);
|
|
64
|
-
return { kind: rule.kind, symbol: config?.symbol, exchange: venue(config?.exchange), marketId: config?.marketId, event: config?.event, keyword: config?.keyword
|
|
72
|
+
return { kind: rule.kind, symbol: config?.symbol, exchange: venue(config?.exchange), marketId: config?.marketId, event: config?.event, keyword: config?.keyword,
|
|
73
|
+
...config?.country ? { country: config.country } : {} };
|
|
65
74
|
}
|
|
66
75
|
return { kind: rule.kind, ...(rule.target === "ticker" ? { symbol: rule.value } : rule.target === "fund" ? { cik: rule.value } : {}) };
|
|
67
76
|
}
|
|
@@ -66,7 +66,7 @@ import {
|
|
|
66
66
|
type SectorTableColumn,
|
|
67
67
|
} from "./sector-model";
|
|
68
68
|
import { describePortfolioTab, resolvePortfolioId, resolveTemplatePortfolioId } from "./portfolio-selection";
|
|
69
|
-
import { findNamedCollection } from "../../../portfolio/collection-name";
|
|
69
|
+
import { findNamedCollection, unknownCollectionArgError } from "../../../portfolio/collection-name";
|
|
70
70
|
import {
|
|
71
71
|
analyticsFigures,
|
|
72
72
|
riskFigureNotices,
|
|
@@ -465,6 +465,8 @@ export const portfolioAnalyticsModule: PluginModule = {
|
|
|
465
465
|
{ key: "equityShift", label: "Index shift (%)", type: "text" },
|
|
466
466
|
{ key: "rateShift", label: "10Y shift (bp)", type: "text" },
|
|
467
467
|
{ key: "volShift", label: "VIX shift (points)", type: "text" },
|
|
468
|
+
{ key: "fxShift", label: "FX shift vs USD (TRY -20)", type: "text" },
|
|
469
|
+
{ key: "assetShift", label: "Asset shift (GLD 10)", type: "text" },
|
|
468
470
|
] }),
|
|
469
471
|
defaultPosition: "right",
|
|
470
472
|
defaultMode: "floating",
|
|
@@ -483,7 +485,11 @@ export const portfolioAnalyticsModule: PluginModule = {
|
|
|
483
485
|
label: prefix === "PORT" ? "Portfolio Analytics" : "Portfolio Market Risk",
|
|
484
486
|
description: "Benchmark-relative risk, factor betas, stress shifts and local account evidence.",
|
|
485
487
|
keywords: ["risk", "analytics", "sharpe", "beta", "sector", "allocation", "portfolio", "style", "quality", "factor tilt"],
|
|
486
|
-
shortcut: {
|
|
488
|
+
shortcut: {
|
|
489
|
+
prefix, argKind: "text", argOptional: true, argPlaceholder: "portfolio-id",
|
|
490
|
+
// `PORT Nope` names no portfolio: the bar says so, not the first portfolio's risk.
|
|
491
|
+
argError: (arg, context) => unknownCollectionArgError(arg, context.config.portfolios, "portfolio"),
|
|
492
|
+
},
|
|
487
493
|
headless: portfolioRiskHeadless,
|
|
488
494
|
canCreate: (context) => context.config.portfolios.length > 0,
|
|
489
495
|
createInstance: (context, options) => {
|
|
@@ -149,7 +149,7 @@ interface AlignedSeries {
|
|
|
149
149
|
/**
|
|
150
150
|
* Lined-up holdings, kept with their series: weights move with every quote,
|
|
151
151
|
* the series only with their bars, so a portfolio valued again (each Cloud
|
|
152
|
-
* sync values every one
|
|
152
|
+
* sync values every one) only weighs returns already lined up
|
|
153
153
|
* instead of matching every interval of every holding again. A few lists per
|
|
154
154
|
* first series, since one holding can open more than one portfolio.
|
|
155
155
|
*/
|