gloomberb 0.18.3 → 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/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 +84 -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 +22 -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 +21 -4
- 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/themes.ts +7 -1
- package/src/api-client/types.ts +90 -2
- 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/star-prompt/status-line.tsx +2 -2
- package/src/architecture/core-builtin-allowlist.json +5 -2
- 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 +1117 -264
- 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 +192 -47
- 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 +19 -13
- 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 +24 -18
- package/src/cli/known-gaps.ts +118 -25
- package/src/cli/listing-arg.ts +300 -41
- package/src/cli/name-entries.ts +30 -18
- 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 +75 -20
- package/src/cli/pane-functions/catalog.ts +24 -23
- package/src/cli/pane-functions/discovery.ts +1 -1
- package/src/cli/pane-functions/dom.ts +10 -7
- 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 +24 -11
- package/src/cli/pane-functions/index.ts +18 -16
- 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 +47 -10
- 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 +61 -16
- package/src/cli/restore-plugins.ts +29 -14
- package/src/cli/result.ts +111 -22
- 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 +198 -68
- 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 +373 -16
- package/src/components/chart/composite/interactions.ts +7 -2
- 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 +305 -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 +13 -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/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/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 +12 -6
- package/src/components/layout/header.tsx +7 -6
- 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/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/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 +29 -12
- package/src/i18n/ja.ts +29 -12
- package/src/i18n/ko.ts +29 -12
- package/src/i18n/zh-cn.ts +29 -12
- package/src/i18n/zh-tw.ts +29 -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 +29 -19
- 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 +107 -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 +76 -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 +97 -36
- package/src/plugins/builtin/attention/pane.tsx +6 -2
- 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 +6 -3
- 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 +22 -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 +110 -23
- package/src/plugins/builtin/broker-trading/ticket-parts.tsx +36 -7
- package/src/plugins/builtin/broker-trading/ticket.tsx +112 -31
- 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 +25 -12
- 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/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 +6 -8
- 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 +127 -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 +11 -4
- package/src/plugins/builtin/company-attention/app-rank.tsx +7 -5
- 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 +79 -23
- 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 +1 -1
- 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 +5 -3
- 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 +3 -2
- 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/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/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 +18 -11
- 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 +68 -6
- package/src/plugins/builtin/equity-screener/live.ts +1 -1
- package/src/plugins/builtin/equity-screener/model.ts +6 -0
- package/src/plugins/builtin/equity-screener/pane.tsx +45 -10
- 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 +6 -1
- 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/headless.ts +9 -4
- 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 +13 -1
- package/src/plugins/builtin/holders/format.ts +28 -17
- package/src/plugins/builtin/holders/headless.ts +46 -7
- 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/treemap.tsx +2 -2
- package/src/plugins/builtin/insider/headless.ts +1 -1
- package/src/plugins/builtin/insider/signals-client.ts +1 -1
- package/src/plugins/builtin/insider/signals.tsx +1 -1
- 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/headless.ts +4 -4
- 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 +10 -4
- 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 +33 -19
- 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 +29 -8
- 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 +49 -14
- package/src/plugins/builtin/openfda/pane.tsx +1 -1
- package/src/plugins/builtin/options/carry.ts +2 -2
- package/src/plugins/builtin/options/index.tsx +1 -1
- package/src/plugins/builtin/options/view.tsx +10 -10
- package/src/plugins/builtin/options-calculator/headless.ts +46 -7
- package/src/plugins/builtin/options-scenario/client.ts +123 -28
- 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 +36 -15
- 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 +9 -5
- 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 +143 -59
- package/src/plugins/builtin/portfolio-list/cli/bulk-symbols.ts +72 -24
- 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 +4 -1
- 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 +8 -1
- 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/model.ts +6 -2
- package/src/plugins/builtin/risk-factors/index.tsx +2 -2
- package/src/plugins/builtin/scanner/lock-note.ts +1 -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 +2 -1
- 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-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 +21 -0
- package/src/plugins/builtin/shared/series-cache.ts +2 -0
- package/src/plugins/builtin/shared/ticker-surface.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/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 +5 -4
- package/src/plugins/builtin/vol-surface/headless.ts +12 -3
- package/src/plugins/builtin/vol-surface/model.ts +4 -2
- 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/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/styles.css +76 -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/desktop/backend-requests.ts +3 -0
- package/src/renderers/electrobun/bun/desktop/backend.ts +46 -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/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 +5 -5
- package/src/renderers/electrobun/view/remote/asset-data-client.ts +1 -1
- 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 +1 -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 +32 -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/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 +17 -4
- 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 +210 -33
- package/src/tickers/index-roots.ts +47 -0
- package/src/tickers/instrument-label.ts +5 -1
- 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 +14 -0
- package/src/types/exchange-rate.ts +6 -0
- package/src/types/financials.ts +104 -7
- package/src/types/headless.ts +76 -6
- package/src/types/instrument.ts +3 -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/index.ts +10 -5
- 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-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 +3 -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,4 +1,5 @@
|
|
|
1
1
|
import type { AlertCondition } from "./types";
|
|
2
|
+
import { readAlertPrice } from "./price";
|
|
2
3
|
import { normalizeAlertSymbol } from "./quotes";
|
|
3
4
|
|
|
4
5
|
export interface AlertCommandInput {
|
|
@@ -54,17 +55,13 @@ export function parseAlertShortcutValues(
|
|
|
54
55
|
values.condition = condition;
|
|
55
56
|
}
|
|
56
57
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
if (!Number.isFinite(price)) {
|
|
60
|
-
throw new Error("Use a numeric target price.");
|
|
61
|
-
}
|
|
62
|
-
values.price = String(price);
|
|
63
|
-
}
|
|
58
|
+
// The price reads as `alerts add` reads it: 81k is 81000, 81,000 asks which was meant, and text that is no number says what to type.
|
|
59
|
+
if (parts[2]) values.price = String(readAlertPrice(parts[2].replace(/^\$/, "")));
|
|
64
60
|
|
|
65
61
|
return values;
|
|
66
62
|
}
|
|
67
63
|
|
|
64
|
+
/** The alert a command's values name: null while one is missing, and a price that reads two ways or as no number throws (`readAlertPrice`). */
|
|
68
65
|
export function parseAlertCommandValues(
|
|
69
66
|
values?: Record<string, string>,
|
|
70
67
|
): AlertCommandInput | null {
|
|
@@ -80,7 +77,5 @@ export function parseAlertCommandValues(
|
|
|
80
77
|
const condition = parseAlertCondition(values?.condition);
|
|
81
78
|
const priceStr = values?.price?.trim();
|
|
82
79
|
if (!symbol || !condition || !priceStr) return null;
|
|
83
|
-
|
|
84
|
-
if (!Number.isFinite(price)) return null;
|
|
85
|
-
return { symbol, condition, price };
|
|
80
|
+
return { symbol, condition, price: readAlertPrice(priceStr.replace(/^\$/, "")) };
|
|
86
81
|
}
|
|
@@ -1,16 +1,20 @@
|
|
|
1
1
|
import { eventAlertTarget, type EventAlertRule } from "./events";
|
|
2
|
-
import { readScheduledRule, scheduledAlertStatus } from "./scheduled";
|
|
2
|
+
import { readScheduledRule, scheduledAlertStatus, scheduledToday } from "./scheduled";
|
|
3
3
|
|
|
4
|
-
/** Earnings and
|
|
4
|
+
/** Earnings, macro and calendar event rules name the event day they wait for; the rest name what they follow. */
|
|
5
5
|
export function ruleTarget(rule: EventAlertRule): string {
|
|
6
6
|
const target = eventAlertTarget(rule);
|
|
7
7
|
if (!readScheduledRule(rule)) return target;
|
|
8
8
|
return `${target} · ${rule.eventDate ?? "date not known yet"}`;
|
|
9
9
|
}
|
|
10
10
|
|
|
11
|
-
/**
|
|
12
|
-
|
|
11
|
+
/**
|
|
12
|
+
* The state word the Events tab shows: a scheduled rule is Alerted once it has gone off for its coming
|
|
13
|
+
* event, an IV level once its level was reached, until it is re-armed.
|
|
14
|
+
*/
|
|
15
|
+
export function ruleState(rule: EventAlertRule, now: number = Date.now()): "Active" | "Paused" | "Alerted" {
|
|
13
16
|
const scheduled = readScheduledRule(rule);
|
|
14
|
-
const status = scheduled ? scheduledAlertStatus(rule, scheduled.leadDays,
|
|
17
|
+
const status = scheduled ? scheduledAlertStatus(rule, scheduled.leadDays, scheduledToday(scheduled.target, now), scheduled.trigger)
|
|
18
|
+
: rule.status === "active" && rule.kind === "iv_level" && rule.triggeredAt ? "triggered" : rule.status;
|
|
15
19
|
return status === "paused" ? "Paused" : status === "triggered" ? "Alerted" : "Active";
|
|
16
20
|
}
|
|
@@ -13,12 +13,16 @@ import { colors } from "../../../theme/colors";
|
|
|
13
13
|
import type { PaneProps } from "../../../types/plugin";
|
|
14
14
|
import { useDialog } from "../../../ui/dialog";
|
|
15
15
|
import { useCloudSyncStatus } from "../../../sync/react";
|
|
16
|
-
import { usePluginAppActions, usePluginConfigState } from "../../runtime";
|
|
16
|
+
import { usePluginAppActions, usePluginConfigState, usePluginState } from "../../runtime";
|
|
17
17
|
import {
|
|
18
|
+
CALENDAR_ALERTS_KEY,
|
|
18
19
|
EVENT_ALERTS_KEY,
|
|
20
|
+
IV_LEVEL_ALERTS_KEY,
|
|
21
|
+
eventAlertStoreKey,
|
|
19
22
|
eventAlertTarget,
|
|
20
|
-
|
|
23
|
+
readEventAlertStores,
|
|
21
24
|
toggleEventAlert,
|
|
25
|
+
updateEventAlerts,
|
|
22
26
|
type EventAlertRule,
|
|
23
27
|
} from "./events";
|
|
24
28
|
import { ruleState, ruleTarget } from "./event-rows";
|
|
@@ -28,9 +32,9 @@ import { isResearchAlertKind } from "./research-rules";
|
|
|
28
32
|
import { useAsyncResource } from "../../../public/react";
|
|
29
33
|
import { usePlanAccess } from "../../../api-client/plan-access";
|
|
30
34
|
import { useResearchCloudSession } from "../shared/research-cloud-session";
|
|
31
|
-
import { newYorkToday } from "../earnings/board-model";
|
|
32
35
|
import { rearmScheduledAlert } from "./scheduled";
|
|
33
36
|
import { checkScheduledEventAlertsNow } from "./scheduled-check";
|
|
37
|
+
import { checkIvLevelAlertsNow, IV_LEVEL_CHECKS_KEY, ivLevelCheckText, readIvLevelChecks, rearmIvLevelAlert } from "./iv-level";
|
|
34
38
|
import { alertTarget, alertViewHints, eventRuleSubject, useOpenAlertTarget } from "./targets";
|
|
35
39
|
|
|
36
40
|
const columnsFor = (width: number, lastCheck: boolean): DataTableColumn[] => [
|
|
@@ -46,7 +50,24 @@ const columnsFor = (width: number, lastCheck: boolean): DataTableColumn[] => [
|
|
|
46
50
|
export function EventAlertsPane({ focused, width, height }: PaneProps) {
|
|
47
51
|
const [catalystStatus] = usePluginConfigState<string>(CATALYST_POLL_STATUS, "Catalyst alerts check every five minutes while the app is open");
|
|
48
52
|
const [json, setJson] = usePluginConfigState<string>(EVENT_ALERTS_KEY, "[]");
|
|
49
|
-
|
|
53
|
+
// IV levels and calendar events are kept in their own lists, which released versions never read.
|
|
54
|
+
const [ivJson, setIvJson] = usePluginConfigState<string>(IV_LEVEL_ALERTS_KEY, "[]");
|
|
55
|
+
const [calendarJson, setCalendarJson] = usePluginConfigState<string>(CALENDAR_ALERTS_KEY, "[]");
|
|
56
|
+
const { rules, error } = useMemo(
|
|
57
|
+
() => readEventAlertStores((key) => key === IV_LEVEL_ALERTS_KEY ? ivJson : key === CALENDAR_ALERTS_KEY ? calendarJson : json),
|
|
58
|
+
[json, ivJson, calendarJson],
|
|
59
|
+
);
|
|
60
|
+
// Their readings stay on this device.
|
|
61
|
+
const [savedChecks] = usePluginState<unknown>(IV_LEVEL_CHECKS_KEY, {});
|
|
62
|
+
const checks = useMemo(() => readIvLevelChecks(savedChecks), [savedChecks]);
|
|
63
|
+
/** Changes one rule in the list it is kept in, leaving what that list holds of kinds this version does not know. */
|
|
64
|
+
const updateRules = useCallback(
|
|
65
|
+
(rule: EventAlertRule, update: (rules: EventAlertRule[]) => EventAlertRule[]) => {
|
|
66
|
+
const key = eventAlertStoreKey(rule);
|
|
67
|
+
(key === IV_LEVEL_ALERTS_KEY ? setIvJson : key === CALENDAR_ALERTS_KEY ? setCalendarJson : setJson)((current) => updateEventAlerts(current, update));
|
|
68
|
+
},
|
|
69
|
+
[setJson, setIvJson, setCalendarJson],
|
|
70
|
+
);
|
|
50
71
|
const [selected, setSelected] = useState(0);
|
|
51
72
|
const [sort, setSort] = useState<{ columnId: string; direction: SortDirection }>({ columnId: "created", direction: "desc" });
|
|
52
73
|
const sync = useCloudSyncStatus();
|
|
@@ -70,21 +91,22 @@ export function EventAlertsPane({ focused, width, height }: PaneProps) {
|
|
|
70
91
|
[rules, sort],
|
|
71
92
|
);
|
|
72
93
|
const selectedRule = items[Math.min(selected, Math.max(0, items.length - 1))];
|
|
73
|
-
const
|
|
74
|
-
const selectedFired = !!selectedRule && ruleState(selectedRule,
|
|
94
|
+
const now = Date.now();
|
|
95
|
+
const selectedFired = !!selectedRule && ruleState(selectedRule, now) === "Alerted";
|
|
75
96
|
const openTarget = useOpenAlertTarget();
|
|
76
97
|
const selectedTarget = useMemo(() => selectedRule ? alertTarget(eventRuleSubject(selectedRule)) : null, [selectedRule]);
|
|
77
98
|
// Research rules keep a dated observation in the Cloud; show its value and percentile.
|
|
78
99
|
const access = usePlanAccess();
|
|
79
100
|
const session = useResearchCloudSession();
|
|
80
|
-
const hasResearch = rules.some((rule) => isResearchAlertKind(rule.kind));
|
|
101
|
+
const hasResearch = rules.some((rule) => isResearchAlertKind(rule.kind) && rule.kind !== "iv_level");
|
|
81
102
|
const stateLoader = useCallback(() => fetchAlertHistory(0), [session.requestKey]);
|
|
82
103
|
const history = useAsyncResource(access.signedIn && hasResearch ? stateLoader : null);
|
|
83
104
|
const states = useMemo(
|
|
84
105
|
() => new Map((history.data?.states ?? []).map((state) => [state.ruleId, state])),
|
|
85
106
|
[history.data],
|
|
86
107
|
);
|
|
87
|
-
|
|
108
|
+
// An IV level is read by this app, so its last reading needs no session.
|
|
109
|
+
const columns = columnsFor(width, (hasResearch && !!history.data) || rules.some((rule) => rule.kind === "iv_level"));
|
|
88
110
|
const add = useCallback(
|
|
89
111
|
() => openPluginCommandWorkflow("set-event-alert"),
|
|
90
112
|
[openPluginCommandWorkflow],
|
|
@@ -92,48 +114,31 @@ export function EventAlertsPane({ focused, width, height }: PaneProps) {
|
|
|
92
114
|
const toggle = useCallback(
|
|
93
115
|
(rule: EventAlertRule | undefined) => {
|
|
94
116
|
if (!rule) return;
|
|
95
|
-
|
|
96
|
-
const result = readEventAlerts(current);
|
|
97
|
-
return result.error
|
|
98
|
-
? current
|
|
99
|
-
: JSON.stringify(
|
|
100
|
-
result.rules.map((entry) => (entry.id === rule.id ? toggleEventAlert(entry) : entry)),
|
|
101
|
-
);
|
|
102
|
-
});
|
|
117
|
+
updateRules(rule, (rules) => rules.map((entry) => (entry.id === rule.id ? toggleEventAlert(entry) : entry)));
|
|
103
118
|
},
|
|
104
|
-
[
|
|
119
|
+
[updateRules],
|
|
105
120
|
);
|
|
106
|
-
// An earnings or macro alert that went off alerts again for the same event.
|
|
121
|
+
// An earnings or macro alert that went off alerts again for the same event; an IV level watches its level again.
|
|
107
122
|
const rearm = useCallback(
|
|
108
123
|
(rule: EventAlertRule | undefined) => {
|
|
109
124
|
if (!rule) return;
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
return result.error
|
|
113
|
-
? current
|
|
114
|
-
: JSON.stringify(result.rules.map((entry) => (entry.id === rule.id ? rearmScheduledAlert(entry) : entry)));
|
|
115
|
-
});
|
|
125
|
+
const ivLevel = rule.kind === "iv_level";
|
|
126
|
+
updateRules(rule, (rules) => rules.map((entry) => (entry.id === rule.id ? ivLevel ? rearmIvLevelAlert(entry) : rearmScheduledAlert(entry) : entry)));
|
|
116
127
|
// Once the write has landed, so it alerts now rather than at the next 15-minute check.
|
|
117
|
-
setTimeout(checkScheduledEventAlertsNow, 1_000);
|
|
128
|
+
setTimeout(ivLevel ? checkIvLevelAlertsNow : checkScheduledEventAlertsNow, 1_000);
|
|
118
129
|
},
|
|
119
|
-
[
|
|
130
|
+
[updateRules],
|
|
120
131
|
);
|
|
121
132
|
const remove = useCallback(async () => {
|
|
122
133
|
if (!selectedRule) return;
|
|
123
|
-
const
|
|
134
|
+
const rule = selectedRule;
|
|
124
135
|
const confirmed = await confirmDialog(dialog, {
|
|
125
136
|
title: "Delete event alert?",
|
|
126
|
-
body: [eventAlertTarget(
|
|
137
|
+
body: [eventAlertTarget(rule)],
|
|
127
138
|
confirmLabel: "Delete",
|
|
128
139
|
});
|
|
129
|
-
if (confirmed)
|
|
130
|
-
|
|
131
|
-
const result = readEventAlerts(current);
|
|
132
|
-
return result.error
|
|
133
|
-
? current
|
|
134
|
-
: JSON.stringify(result.rules.filter((rule) => rule.id !== id));
|
|
135
|
-
});
|
|
136
|
-
}, [dialog, selectedRule, setJson]);
|
|
140
|
+
if (confirmed) updateRules(rule, (rules) => rules.filter((entry) => entry.id !== rule.id));
|
|
141
|
+
}, [dialog, selectedRule, updateRules]);
|
|
137
142
|
const status =
|
|
138
143
|
error ??
|
|
139
144
|
(selectedRule?.kind === "catalyst" ? catalystStatus : null) ??
|
|
@@ -192,31 +197,41 @@ export function EventAlertsPane({ focused, width, height }: PaneProps) {
|
|
|
192
197
|
sortColumnId={sort.columnId}
|
|
193
198
|
sortDirection={sort.direction}
|
|
194
199
|
onHeaderClick={(id) => setSort((current) => nextHeaderSort(current, id))}
|
|
195
|
-
renderCell={(rule, column, _index, row) =>
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
200
|
+
renderCell={(rule, column, _index, row) => {
|
|
201
|
+
// An IV level that could not be read says so on its own row: No data in State, the reason in Last check.
|
|
202
|
+
const check = rule.kind === "iv_level" ? checks[rule.id] : undefined;
|
|
203
|
+
const unread = rule.kind === "iv_level" && rule.status === "active" && !rule.triggeredAt && check?.value === null;
|
|
204
|
+
const state = ruleState(rule, now);
|
|
205
|
+
return {
|
|
206
|
+
text:
|
|
207
|
+
column.id === "kind"
|
|
208
|
+
? alertKindLabel(rule.kind)
|
|
209
|
+
: column.id === "last"
|
|
210
|
+
? rule.kind === "iv_level"
|
|
211
|
+
? ivLevelCheckText(rule, check)
|
|
212
|
+
: isResearchAlertKind(rule.kind)
|
|
213
|
+
? ruleStateText(states.get(rule.id))
|
|
214
|
+
: ""
|
|
215
|
+
: column.id === "target"
|
|
216
|
+
? ruleTarget(rule)
|
|
217
|
+
: column.id === "status"
|
|
218
|
+
? unread ? "No data" : state
|
|
219
|
+
: new Date(rule.createdAt).toISOString().slice(0, 10),
|
|
220
|
+
color: row.selected
|
|
221
|
+
? colors.selectedText
|
|
222
|
+
: unread && (column.id === "status" || column.id === "last")
|
|
223
|
+
? colors.negative
|
|
224
|
+
: rule.status === "paused"
|
|
225
|
+
? colors.textMuted
|
|
226
|
+
: colors.text,
|
|
227
|
+
};
|
|
228
|
+
}}
|
|
214
229
|
emptyStateTitle={error ?? "No event alerts"}
|
|
215
230
|
emptyContent={error ? undefined : (
|
|
216
231
|
<PaneStatusBody
|
|
217
232
|
empty
|
|
218
233
|
emptyTitle="No event alerts"
|
|
219
|
-
emptyMessage="Follow earnings and CPI or FOMC dates, filings, news, members, funds or market moves."
|
|
234
|
+
emptyMessage="Follow earnings and CPI or FOMC dates, filings, news, IV levels, members, funds or market moves."
|
|
220
235
|
actions={<Button label="Add event alert" compact onPress={add} />}
|
|
221
236
|
/>
|
|
222
237
|
)}
|
|
@@ -2,8 +2,30 @@ import { CATALYST_TYPES } from "../../../api-client/catalysts";
|
|
|
2
2
|
import { isResearchAlertKind, normalizeResearchRule, type ResearchAlertKind } from "./research-rules";
|
|
3
3
|
import { researchAlertDescription } from "./research-builder";
|
|
4
4
|
export const EVENT_ALERTS_KEY = "eventAlerts";
|
|
5
|
+
/**
|
|
6
|
+
* IV level rules, kept apart from `eventAlerts`: released versions read every
|
|
7
|
+
* rule there and refuse the whole list over a kind they do not know, so a rule
|
|
8
|
+
* synced from a newer app would stop every event alert on a device not yet
|
|
9
|
+
* updated. They never read this key.
|
|
10
|
+
*/
|
|
11
|
+
export const IV_LEVEL_ALERTS_KEY = "ivLevelAlerts";
|
|
12
|
+
/**
|
|
13
|
+
* Calendar event rules (any release in the economic calendar), kept apart for
|
|
14
|
+
* the same reason: a released version refuses the whole `eventAlerts` list
|
|
15
|
+
* over one. CPI and FOMC stay `macro_event` rules in `eventAlerts`, which
|
|
16
|
+
* every version reads.
|
|
17
|
+
*/
|
|
18
|
+
export const CALENDAR_ALERTS_KEY = "calendarAlerts";
|
|
5
19
|
export const MAX_EVENT_ALERTS = 40;
|
|
6
20
|
|
|
21
|
+
/** The config key a rule is kept under. */
|
|
22
|
+
export const eventAlertStoreKey = (rule: Pick<EventAlertRule, "kind">) =>
|
|
23
|
+
rule.kind === "iv_level" ? IV_LEVEL_ALERTS_KEY : rule.kind === "calendar_event" ? CALENDAR_ALERTS_KEY : EVENT_ALERTS_KEY;
|
|
24
|
+
|
|
25
|
+
/** Every config key event alerts are kept under. */
|
|
26
|
+
export const EVENT_ALERT_STORE_KEYS = [EVENT_ALERTS_KEY, IV_LEVEL_ALERTS_KEY, CALENDAR_ALERTS_KEY] as const;
|
|
27
|
+
type EventAlertStoreKey = (typeof EVENT_ALERT_STORE_KEYS)[number];
|
|
28
|
+
|
|
7
29
|
export interface EventAlertRule {
|
|
8
30
|
id: string;
|
|
9
31
|
kind: "congress_trade" | "thirteenf_filing" | "catalyst" | ResearchAlertKind;
|
|
@@ -18,14 +40,22 @@ export interface EventAlertRule {
|
|
|
18
40
|
eventDate?: string;
|
|
19
41
|
/** Scheduled events: the event date it already alerted for. The next event date arms it again. */
|
|
20
42
|
firedFor?: string;
|
|
43
|
+
/** Macro and calendar events: the event date whose figures (actual, forecast, prior) it already sent. */
|
|
44
|
+
printedFor?: string;
|
|
45
|
+
/**
|
|
46
|
+
* IV level: when the level was reached. The rule stays Alerted until it is
|
|
47
|
+
* re-armed. Its readings stay on the device (`ivLevelChecks`), so synced
|
|
48
|
+
* config changes only when a rule goes off or is edited.
|
|
49
|
+
*/
|
|
50
|
+
triggeredAt?: number;
|
|
21
51
|
}
|
|
22
52
|
|
|
23
53
|
const isDateKey = (value: unknown): value is string =>
|
|
24
54
|
typeof value === "string" && /^\d{4}-\d{2}-\d{2}$/.test(value) && Number.isFinite(Date.parse(`${value}T00:00:00Z`));
|
|
25
55
|
|
|
26
|
-
/** Earnings and
|
|
56
|
+
/** Earnings, macro and calendar event rules: they follow a dated event and alert a number of days before it. */
|
|
27
57
|
export function isScheduledEventRule(rule: Pick<EventAlertRule, "kind">): boolean {
|
|
28
|
-
return rule.kind === "earnings_date" || rule.kind === "macro_event";
|
|
58
|
+
return rule.kind === "earnings_date" || rule.kind === "macro_event" || rule.kind === "calendar_event";
|
|
29
59
|
}
|
|
30
60
|
|
|
31
61
|
export const EVENT_ALERT_TEMPLATES = [
|
|
@@ -87,11 +117,28 @@ export function createEventAlert(
|
|
|
87
117
|
};
|
|
88
118
|
}
|
|
89
119
|
|
|
90
|
-
|
|
120
|
+
/** A saved list of event alerts: the rules this version reads, and the ones of kinds it does not know. */
|
|
121
|
+
export interface EventAlertList {
|
|
122
|
+
rules: EventAlertRule[];
|
|
123
|
+
error: string | null;
|
|
124
|
+
/**
|
|
125
|
+
* Saved rules of kinds this version does not know (a newer app's), as they
|
|
126
|
+
* were saved: they are left out of every list and check, and written back
|
|
127
|
+
* unchanged with the rest.
|
|
128
|
+
*/
|
|
129
|
+
kept: unknown[];
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/** A kind this version reads: a template's, or a research rule's. */
|
|
133
|
+
const isKnownEventAlertKind = (kind: string) =>
|
|
134
|
+
EVENT_ALERT_TEMPLATES.some((template) => template.kind === kind) || isResearchAlertKind(kind);
|
|
135
|
+
|
|
136
|
+
export function readEventAlerts(json: string): EventAlertList {
|
|
91
137
|
try {
|
|
92
138
|
const parsed: unknown = JSON.parse(json);
|
|
93
139
|
if (!Array.isArray(parsed)) throw new Error();
|
|
94
140
|
const rules: EventAlertRule[] = [];
|
|
141
|
+
const kept: unknown[] = [];
|
|
95
142
|
const ids = new Set<string>();
|
|
96
143
|
for (const value of parsed) {
|
|
97
144
|
if (
|
|
@@ -102,6 +149,12 @@ export function readEventAlerts(json: string): { rules: EventAlertRule[]; error:
|
|
|
102
149
|
ids.has(value.id)
|
|
103
150
|
)
|
|
104
151
|
throw new Error();
|
|
152
|
+
// A newer app's kind is kept as it is, so it neither stops this list nor is lost when it is saved.
|
|
153
|
+
if (typeof value.kind === "string" && !isKnownEventAlertKind(value.kind)) {
|
|
154
|
+
kept.push(value);
|
|
155
|
+
ids.add(value.id);
|
|
156
|
+
continue;
|
|
157
|
+
}
|
|
105
158
|
const template = EVENT_ALERT_TEMPLATES.find(
|
|
106
159
|
(entry) => entry.kind === value.kind && entry.target === value.target,
|
|
107
160
|
);
|
|
@@ -129,15 +182,64 @@ export function readEventAlerts(json: string): { rules: EventAlertRule[]; error:
|
|
|
129
182
|
if (isScheduledEventRule(rule)) {
|
|
130
183
|
if (isDateKey(value.eventDate)) rule.eventDate = value.eventDate;
|
|
131
184
|
if (isDateKey(value.firedFor)) rule.firedFor = value.firedFor;
|
|
185
|
+
if (isDateKey(value.printedFor)) rule.printedFor = value.printedFor;
|
|
132
186
|
}
|
|
187
|
+
if (rule.kind === "iv_level" && Number.isFinite(value.triggeredAt) && value.triggeredAt > 0) rule.triggeredAt = value.triggeredAt;
|
|
133
188
|
rules.push(rule);
|
|
134
189
|
ids.add(value.id);
|
|
135
190
|
}
|
|
136
|
-
return { rules, error: null };
|
|
191
|
+
return { rules, error: null, kept };
|
|
137
192
|
} catch {
|
|
138
193
|
// Intentional ignore: invalid saved rules return the error displayed by callers.
|
|
139
|
-
return { rules: [], error: "Saved event alerts could not be read." };
|
|
194
|
+
return { rules: [], error: "Saved event alerts could not be read.", kept: [] };
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/** A list as it is saved: its rules, then the ones of kinds this version does not know, unchanged. */
|
|
199
|
+
function writeEventAlerts(rules: readonly EventAlertRule[], kept: readonly unknown[] = []): string {
|
|
200
|
+
return JSON.stringify([...rules, ...kept]);
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
/** A saved list with `update` applied to its rules; a list that does not read is left as it is. */
|
|
204
|
+
export function updateEventAlerts(json: string | null | undefined, update: (rules: EventAlertRule[]) => EventAlertRule[]): string {
|
|
205
|
+
const current = json ?? "[]";
|
|
206
|
+
const list = readEventAlerts(current);
|
|
207
|
+
return list.error ? current : writeEventAlerts(update(list.rules), list.kept);
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
/** Every saved list, read through `get`: the rules of each, together, and each list as read. */
|
|
211
|
+
export function readEventAlertStores(get: (key: string) => unknown): {
|
|
212
|
+
rules: EventAlertRule[];
|
|
213
|
+
error: string | null;
|
|
214
|
+
lists: Record<EventAlertStoreKey, EventAlertList>;
|
|
215
|
+
} {
|
|
216
|
+
const read = (key: string) => {
|
|
217
|
+
const raw = get(key);
|
|
218
|
+
return readEventAlerts(typeof raw === "string" && raw ? raw : "[]");
|
|
219
|
+
};
|
|
220
|
+
const lists = Object.fromEntries(EVENT_ALERT_STORE_KEYS.map((key) => [key, read(key)])) as Record<EventAlertStoreKey, EventAlertList>;
|
|
221
|
+
const all = Object.values(lists);
|
|
222
|
+
return { rules: all.flatMap((list) => list.rules), error: all.find((list) => list.error)?.error ?? null, lists };
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/**
|
|
226
|
+
* `rules` saved back to the lists they belong in, each keeping what it held of
|
|
227
|
+
* kinds this version does not know. Only a list that changes is returned.
|
|
228
|
+
*/
|
|
229
|
+
export function writeEventAlertStores(
|
|
230
|
+
lists: ReturnType<typeof readEventAlertStores>["lists"],
|
|
231
|
+
rules: readonly EventAlertRule[],
|
|
232
|
+
): Record<string, string> {
|
|
233
|
+
const written: Record<string, string> = {};
|
|
234
|
+
for (const [key, list] of Object.entries(lists)) {
|
|
235
|
+
// A list that does not read is never written over.
|
|
236
|
+
if (list.error) continue;
|
|
237
|
+
const own = rules.filter((rule) => eventAlertStoreKey(rule) === key);
|
|
238
|
+
const before = list.rules;
|
|
239
|
+
const same = own.length === before.length && own.every((rule, index) => rule === before[index]);
|
|
240
|
+
if (!same) written[key] = writeEventAlerts(own, list.kept);
|
|
140
241
|
}
|
|
242
|
+
return written;
|
|
141
243
|
}
|
|
142
244
|
|
|
143
245
|
export function toggleEventAlert(rule: EventAlertRule, now = Date.now()): EventAlertRule {
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import type { PluginResumeState } from "../../../types/plugin";
|
|
2
|
+
import type { QuoteDataSource } from "../../../types/financials";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* The alerts this device's app fired, kept on the device (plugin resume
|
|
6
|
+
* state, never synced): `fn ALRT --tab history` and the History tab read it
|
|
7
|
+
* signed out, and merge Gloom Cloud's deliveries in when signed in.
|
|
8
|
+
*/
|
|
9
|
+
export const FIRED_LOG_KEY = "firedLog";
|
|
10
|
+
/** The newest entries kept; older ones fall off as new ones are added. */
|
|
11
|
+
export const MAX_FIRED_ALERTS = 1000;
|
|
12
|
+
|
|
13
|
+
export interface FiredAlert {
|
|
14
|
+
id: string;
|
|
15
|
+
/** When the app fired it, ISO. */
|
|
16
|
+
firedAt: string;
|
|
17
|
+
/** The rule's kind: `price`, `iv_level`, `earnings_date`, `macro_event`. */
|
|
18
|
+
kind: string;
|
|
19
|
+
ruleId: string;
|
|
20
|
+
/** The rule as it read when it went off: `BTC above 85000`, `IBIT · 30d ATM IV above 50%`. */
|
|
21
|
+
rule: string;
|
|
22
|
+
/** The figure that set it off, in `unit`; null for a dated event. */
|
|
23
|
+
value: number | null;
|
|
24
|
+
/** `value`'s unit: the quote's currency, `%`, `vol pts`. */
|
|
25
|
+
unit?: string;
|
|
26
|
+
/** What the notification said beside the figure, such as an earnings line. */
|
|
27
|
+
detail?: string;
|
|
28
|
+
/** When the quote behind `value` was observed, ISO. */
|
|
29
|
+
quoteAt: string | null;
|
|
30
|
+
/** How current that quote was: `real-time`, `15 min delayed`. */
|
|
31
|
+
source: string | null;
|
|
32
|
+
symbol?: string;
|
|
33
|
+
exchange?: string;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export type FiredAlertInput = Omit<FiredAlert, "id" | "firedAt"> & { firedAt: number };
|
|
37
|
+
|
|
38
|
+
/** How current a quote was, in the words reports use. */
|
|
39
|
+
export function quoteSourceWords(source: QuoteDataSource | undefined): string | null {
|
|
40
|
+
return source === "live" ? "real-time" : source === "delayed" ? "delayed" : source === "snapshot" ? "snapshot" : null;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/** A millisecond time as the log keeps it, ISO; null for none. */
|
|
44
|
+
export function firedAlertTime(value: number | null | undefined): string | null {
|
|
45
|
+
return value != null && Number.isFinite(value) && value > 0 ? new Date(value).toISOString() : null;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const isText = (value: unknown): value is string => typeof value === "string";
|
|
49
|
+
const optionalText = (value: unknown): value is string | undefined => value === undefined || typeof value === "string";
|
|
50
|
+
|
|
51
|
+
/** Entries that read, oldest first; anything else in the store is dropped rather than shown wrong. */
|
|
52
|
+
export function readFiredAlerts(value: unknown): FiredAlert[] {
|
|
53
|
+
if (!Array.isArray(value)) return [];
|
|
54
|
+
return value.filter((entry): entry is FiredAlert => !!entry && typeof entry === "object"
|
|
55
|
+
&& isText(entry.id) && isText(entry.kind) && isText(entry.ruleId) && isText(entry.rule)
|
|
56
|
+
&& isText(entry.firedAt) && Number.isFinite(Date.parse(entry.firedAt))
|
|
57
|
+
&& (entry.value === null || Number.isFinite(entry.value))
|
|
58
|
+
&& (entry.quoteAt === null || isText(entry.quoteAt)) && (entry.source === null || isText(entry.source))
|
|
59
|
+
&& optionalText(entry.unit) && optionalText(entry.detail) && optionalText(entry.symbol) && optionalText(entry.exchange));
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/** `entries` with one more at the end, the oldest dropped past the cap. */
|
|
63
|
+
export function appendFiredAlert(entries: readonly FiredAlert[], input: FiredAlertInput, id: string = crypto.randomUUID()): FiredAlert[] {
|
|
64
|
+
const { firedAt, ...rest } = input;
|
|
65
|
+
const entry: FiredAlert = { id, firedAt: firedAlertTime(firedAt) ?? new Date().toISOString(), ...rest };
|
|
66
|
+
return [...entries, entry].slice(-MAX_FIRED_ALERTS);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/** Records a fired alert in the device's log. A log that cannot be written never stops the alert itself. */
|
|
70
|
+
export function createFiredAlertRecorder(resume: Pick<PluginResumeState, "getState" | "setState">, onError: (error: unknown) => void) {
|
|
71
|
+
return (input: FiredAlertInput) => {
|
|
72
|
+
try {
|
|
73
|
+
resume.setState(FIRED_LOG_KEY, appendFiredAlert(readFiredAlerts(resume.getState(FIRED_LOG_KEY)), input));
|
|
74
|
+
} catch (error) {
|
|
75
|
+
onError(error);
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
}
|
|
@@ -45,8 +45,9 @@ export function formatAlertDistance(alert: AlertRule): string {
|
|
|
45
45
|
return `${/[1-9]/.test(fixed) ? (percent > 0 ? "+" : "-") : ""}${fixed}%`;
|
|
46
46
|
}
|
|
47
47
|
|
|
48
|
+
/** The Quote cell: the quote's age and feed, or, on the row of an alert that got none, why (a stale quote, or none). */
|
|
48
49
|
export function formatQuoteChecked(alert: AlertRule): string {
|
|
49
|
-
if (alert.lastCheckError) return "No quote";
|
|
50
|
+
if (alert.lastCheckError) return /\bstale\b/i.test(alert.lastCheckError) ? "Stale" : "No quote";
|
|
50
51
|
if (alert.lastQuoteUpdatedAt) {
|
|
51
52
|
return formatQuoteAgeWithSource({
|
|
52
53
|
lastUpdated: alert.lastQuoteUpdatedAt,
|