gloomberb 0.18.3 → 0.18.5
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 +32 -1
- package/src/account/auth-model.ts +7 -3
- 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 +11 -6
- package/src/api-client/catalysts.ts +2 -1
- 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 +98 -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 +182 -16
- package/src/api-client/live-scan.ts +91 -0
- package/src/api-client/market-discovery.ts +14 -0
- package/src/api-client/members.ts +18 -0
- package/src/api-client/mna.ts +6 -0
- package/src/api-client/paths.ts +18 -1
- package/src/api-client/request.ts +224 -26
- package/src/api-client/research-activity.ts +3 -10
- 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 +96 -2
- package/src/app/keybindings/index.ts +3 -0
- package/src/app/keybindings/labels.ts +18 -1
- package/src/app/keybindings/resolve.ts +14 -0
- package/src/app/pane-runtime/plugin-bindings.ts +9 -2
- package/src/app/runtime/broker-import.ts +43 -26
- 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 +9 -2
- package/src/cli/commands/keybindings.ts +25 -2
- package/src/cli/commands/market.ts +1177 -278
- package/src/cli/commands/news-hints.ts +2 -2
- package/src/cli/commands/news-search.ts +59 -6
- package/src/cli/commands/options-chain.ts +59 -3
- package/src/cli/commands/options-leaps.ts +41 -26
- package/src/cli/commands/overview.ts +222 -61
- package/src/cli/commands/plugins.ts +9 -9
- package/src/cli/commands/remote.ts +13 -10
- package/src/cli/commands/search.ts +82 -46
- package/src/cli/commands/system.ts +27 -19
- package/src/cli/commands/themes.ts +1 -1
- package/src/cli/commands/ticker.ts +194 -48
- 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 +21 -3
- package/src/cli/exit-codes.ts +1 -1
- package/src/cli/export-source.ts +38 -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 +113 -20
- package/src/cli/help.ts +19 -13
- package/src/cli/history-export.ts +126 -0
- package/src/cli/history-rows.ts +226 -50
- package/src/cli/index-roots.ts +5 -45
- package/src/cli/index.ts +24 -18
- package/src/cli/known-gaps.ts +123 -27
- package/src/cli/listing-arg.ts +316 -46
- 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 +193 -30
- package/src/cli/pane-functions/function-help.ts +76 -30
- package/src/cli/pane-functions/headless.ts +59 -12
- package/src/cli/pane-functions/index.ts +28 -19
- package/src/cli/pane-functions/market-session.ts +15 -5
- 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 +10 -6
- package/src/cli/pane-functions/resolver.ts +64 -11
- 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 +45 -4
- package/src/cli/report-tables.ts +75 -19
- package/src/cli/restore-plugins.ts +42 -15
- package/src/cli/result.ts +164 -23
- 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 +395 -20
- package/src/components/chart/composite/format.ts +27 -0
- 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 +7 -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-series.ts +1 -0
- package/src/components/chart/composite/panel-surface.tsx +314 -13
- package/src/components/chart/composite/price-axis-labels.tsx +27 -3
- package/src/components/chart/composite/range-statistics.ts +62 -0
- package/src/components/chart/composite/rasterizer.ts +44 -19
- package/src/components/chart/composite/scene.ts +20 -4
- package/src/components/chart/composite/series-axis-tags.tsx +16 -9
- 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 +17 -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/panel/prompt-binding.ts +0 -8
- 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/alert.ts +1 -1
- 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 +33 -46
- 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/index.tsx +1 -0
- package/src/components/layout/pane/footer/model.ts +38 -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-frame.tsx +1 -1
- 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/portfolio-step/positions-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 +10 -2
- 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 +6 -4
- package/src/core/state/app/state.ts +9 -0
- package/src/core/state/app/types.ts +3 -0
- 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 +123 -0
- package/src/docs/snapshot.json +422 -112
- package/src/i18n/es.ts +30 -13
- package/src/i18n/ja.ts +30 -13
- package/src/i18n/ko.ts +30 -13
- package/src/i18n/zh-cn.ts +30 -13
- package/src/i18n/zh-tw.ts +30 -13
- 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/coordinator/financials.ts +10 -2
- package/src/market-data/coordinator/index.ts +3 -1
- package/src/market-data/coordinator/quotes.ts +4 -2
- 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 +81 -11
- package/src/market-data/market/dated-previous-close.ts +203 -0
- package/src/market-data/market/freshness.ts +34 -5
- package/src/market-data/market/futures-week.ts +68 -0
- package/src/market-data/market/period-return.ts +163 -0
- package/src/market-data/market/status.ts +16 -4
- 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/options-alternatives.ts +60 -0
- 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 +25 -3
- 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 +7 -2
- package/src/market-data/selectors.ts +3 -0
- 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/notifications/notification-log.ts +6 -4
- 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 +34 -20
- package/src/plugins/builtin/alerts/calendar-events.ts +429 -0
- package/src/plugins/builtin/alerts/cli.ts +533 -85
- package/src/plugins/builtin/alerts/command.ts +12 -10
- package/src/plugins/builtin/alerts/constants.ts +1 -1
- 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 +119 -0
- package/src/plugins/builtin/alerts/format.ts +10 -3
- package/src/plugins/builtin/alerts/headless.ts +107 -41
- package/src/plugins/builtin/alerts/history-pane.tsx +105 -62
- package/src/plugins/builtin/alerts/history-rows.ts +92 -0
- package/src/plugins/builtin/alerts/history.ts +2 -0
- package/src/plugins/builtin/alerts/index.tsx +107 -30
- package/src/plugins/builtin/alerts/iv-level.ts +365 -0
- package/src/plugins/builtin/alerts/levels.ts +3 -3
- package/src/plugins/builtin/alerts/live.ts +3 -3
- package/src/plugins/builtin/alerts/metric-command.ts +61 -0
- package/src/plugins/builtin/alerts/metric-data.ts +70 -0
- package/src/plugins/builtin/alerts/metric-model.ts +175 -0
- package/src/plugins/builtin/alerts/metric-parity-fixture.json +725 -0
- package/src/plugins/builtin/alerts/pane.tsx +130 -49
- 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 +38 -12
- package/src/plugins/builtin/alerts/targets.ts +12 -3
- package/src/plugins/builtin/alerts/types.ts +3 -0
- 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 +13 -8
- package/src/plugins/builtin/backtest/pane.tsx +9 -4
- package/src/plugins/builtin/backtest/presets.ts +29 -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 +24 -14
- package/src/plugins/builtin/broker-manager/keyboard.ts +1 -1
- package/src/plugins/builtin/broker-manager/model.ts +18 -3
- 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 +66 -24
- 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 +19 -1
- package/src/plugins/builtin/broker-trading/linked-orders.ts +148 -0
- package/src/plugins/builtin/broker-trading/order-feed.ts +83 -10
- 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 +111 -24
- 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 +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 +51 -5
- 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 +4 -1
- package/src/plugins/builtin/chart-composer/chart-spec-edit.ts +3 -2
- package/src/plugins/builtin/chart-composer/chart-spec.ts +7 -0
- package/src/plugins/builtin/chart-composer/cli-options.ts +7 -10
- package/src/plugins/builtin/chart-composer/data-catalog-pane.tsx +7 -3
- package/src/plugins/builtin/chart-composer/editor/controller.ts +4 -0
- package/src/plugins/builtin/chart-composer/editor/model.ts +2 -0
- package/src/plugins/builtin/chart-composer/editor.tsx +9 -4
- package/src/plugins/builtin/chart-composer/formula.ts +71 -18
- package/src/plugins/builtin/chart-composer/headless-schema.ts +42 -29
- package/src/plugins/builtin/chart-composer/headless.ts +266 -37
- 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 +144 -30
- package/src/plugins/builtin/chart-composer/presets.ts +50 -15
- package/src/plugins/builtin/chart-composer/quick-add.tsx +40 -25
- 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 +31 -28
- 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 +44 -31
- 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/command-suggestions.ts +92 -0
- package/src/plugins/builtin/chat/content/composer.tsx +13 -6
- package/src/plugins/builtin/chat/content/footer.tsx +6 -3
- package/src/plugins/builtin/chat/content/index.tsx +51 -22
- package/src/plugins/builtin/chat/content/open-targets.ts +14 -3
- package/src/plugins/builtin/chat/controller/session-runtime.ts +4 -2
- package/src/plugins/builtin/chat/index.tsx +23 -0
- package/src/plugins/builtin/chat/message/desktop.tsx +1 -0
- package/src/plugins/builtin/chat/message/inline-tokens.tsx +23 -0
- package/src/plugins/builtin/chat/message/pane-chip.tsx +50 -20
- package/src/plugins/builtin/chat/pane-links/commands.ts +265 -0
- package/src/plugins/builtin/chat/pane-links/model.ts +12 -3
- package/src/plugins/builtin/chat/pane-links/open.ts +9 -2
- package/src/plugins/builtin/chat/people.ts +1 -1
- package/src/plugins/builtin/chat/unread-inbox-pane.tsx +10 -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/plugin.tsx +1 -1
- 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 +144 -27
- package/src/plugins/builtin/econ/detail-view.tsx +48 -10
- package/src/plugins/builtin/econ/figures.ts +72 -0
- 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 +144 -27
- package/src/plugins/builtin/econ/print-watch.ts +2 -1
- package/src/plugins/builtin/econ/types.ts +34 -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 +87 -28
- 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 +104 -0
- package/src/plugins/builtin/econ-statistics/view.ts +19 -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 +47 -12
- 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/charts.tsx +2 -2
- 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 +20 -1
- package/src/plugins/builtin/exposure/pane.tsx +10 -5
- 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/index.tsx +1 -0
- package/src/plugins/builtin/futures/model.ts +12 -10
- package/src/plugins/builtin/futures/returns.ts +8 -36
- package/src/plugins/builtin/futures/table.tsx +3 -3
- 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 +20 -8
- package/src/plugins/builtin/fx-matrix/headless.ts +37 -16
- package/src/plugins/builtin/fx-matrix/index.tsx +25 -13
- package/src/plugins/builtin/fx-matrix/live-legs.ts +34 -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/help/keybindings-editor.tsx +18 -14
- 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 +7 -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 +51 -13
- 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/footer.ts +2 -2
- 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/breadth-pane.tsx +81 -0
- package/src/plugins/builtin/members/client.ts +19 -4
- package/src/plugins/builtin/members/headless.ts +24 -10
- package/src/plugins/builtin/members/index.tsx +9 -9
- package/src/plugins/builtin/members/model.ts +23 -4
- package/src/plugins/builtin/members/pane.tsx +31 -14
- 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/analytics.ts +26 -2
- package/src/plugins/builtin/options/carry.ts +2 -2
- package/src/plugins/builtin/options/index.tsx +1 -1
- package/src/plugins/builtin/options/model-spot.ts +5 -2
- package/src/plugins/builtin/options/strike-window.ts +2 -1
- package/src/plugins/builtin/options/table.ts +1 -7
- package/src/plugins/builtin/options/view.tsx +30 -13
- package/src/plugins/builtin/options-calculator/headless.ts +46 -7
- package/src/plugins/builtin/options-positioning/client.ts +19 -0
- package/src/plugins/builtin/options-positioning/headless.ts +54 -14
- package/src/plugins/builtin/options-positioning/index.tsx +3 -3
- package/src/plugins/builtin/options-positioning/model.ts +47 -8
- package/src/plugins/builtin/options-positioning/pane.tsx +68 -38
- 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 +14 -9
- 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 +168 -0
- package/src/plugins/builtin/perps/markets-section.tsx +154 -0
- package/src/plugins/builtin/perps/pane.tsx +49 -26
- 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 +54 -22
- 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 +7 -4
- 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/index.tsx +11 -8
- 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/rate-path/pane.tsx +2 -2
- 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 +80 -13
- 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/feed.ts +2 -2
- package/src/plugins/builtin/scanner/index.ts +24 -1
- package/src/plugins/builtin/scanner/live-condition-editor.tsx +222 -0
- package/src/plugins/builtin/scanner/live-feed.ts +168 -0
- package/src/plugins/builtin/scanner/live-headless.ts +114 -0
- package/src/plugins/builtin/scanner/live-model.ts +351 -0
- package/src/plugins/builtin/scanner/live-pane.tsx +677 -0
- package/src/plugins/builtin/scanner/live-track.ts +186 -0
- 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 +3 -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/macro-releases.ts +65 -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/scanner-capture.ts +3 -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/shared/use-quote-board.ts +8 -2
- package/src/plugins/builtin/shared/volatility/pricing.ts +7 -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 +11 -6
- package/src/plugins/builtin/themes/model.ts +15 -5
- package/src/plugins/builtin/themes/pane.tsx +27 -8
- 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 +14 -4
- package/src/plugins/builtin/ticker-detail/research-tabs.ts +11 -0
- package/src/plugins/builtin/vol-surface/charts.tsx +9 -4
- package/src/plugins/builtin/vol-surface/client.ts +7 -4
- package/src/plugins/builtin/vol-surface/headless.ts +71 -13
- package/src/plugins/builtin/vol-surface/index.tsx +2 -2
- package/src/plugins/builtin/vol-surface/model.ts +26 -9
- package/src/plugins/builtin/vol-surface/pane.tsx +44 -7
- package/src/plugins/builtin/vol-surface/tables.ts +31 -3
- package/src/plugins/builtin/volatility/dvol.ts +46 -0
- package/src/plugins/builtin/volatility/model.ts +5 -10
- package/src/plugins/builtin/volatility/pane.tsx +2 -2
- package/src/plugins/builtin/volatility/series.ts +26 -0
- package/src/plugins/builtin/world-indices/footer.ts +1 -1
- 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 +15 -9
- 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 +15 -13
- 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 +15 -0
- package/src/public/time-series.ts +11 -8
- package/src/remote/schema.ts +1 -1
- package/src/renderers/browser/app-services.ts +1 -7
- package/src/renderers/browser/config-host.ts +5 -55
- package/src/renderers/browser/main.tsx +30 -60
- 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/app-name.ts +222 -0
- 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/relaunch.ts +74 -25
- package/src/renderers/electrobun/bun/desktop/state-broadcaster.ts +1 -0
- package/src/renderers/electrobun/bun/desktop/update.ts +70 -3
- package/src/renderers/electrobun/bun/desktop/workspace/index.ts +2 -0
- package/src/renderers/electrobun/bun/external-plugins.ts +29 -7
- package/src/renderers/electrobun/bun/index.ts +36 -2
- 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/app-name.ts +17 -0
- 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/cli-pane-shot-frame.tsx +3 -3
- package/src/renderers/electrobun/view/config-host.ts +3 -0
- package/src/renderers/electrobun/view/desktop/window/snapshot.ts +1 -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/opentui/toast-host.tsx +71 -43
- 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 +16 -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/batches.ts +10 -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 +58 -15
- package/src/sources/provider-router/index.ts +146 -10
- package/src/sources/provider-router/primary.ts +1 -1
- package/src/sources/provider-router/search.ts +13 -2
- package/src/state/app/bootstrap.ts +23 -0
- package/src/state/app/context/index.tsx +3 -0
- package/src/state/hooks/inline-tickers.ts +30 -5
- package/src/sync/auth-transition.ts +19 -9
- package/src/sync/baseline.ts +10 -4
- package/src/sync/controller.ts +67 -17
- package/src/sync/core-contributors.ts +46 -14
- package/src/sync/react.ts +4 -1
- package/src/sync/types.ts +3 -0
- 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/telemetry/usage-counts.ts +0 -18
- package/src/test-support/builtin-panes.ts +1 -1
- package/src/theme/colors.ts +11 -30
- package/src/theme/ui-tokens.ts +37 -1
- package/src/tickers/company-name-listing.ts +210 -33
- package/src/tickers/company-name.ts +59 -0
- package/src/tickers/index-roots.ts +47 -0
- package/src/tickers/instrument-label.ts +5 -1
- package/src/tickers/listing-venues.ts +23 -0
- package/src/tickers/metadata.ts +10 -0
- package/src/tickers/perpetual-listing.ts +5 -2
- package/src/tickers/search/bare-symbol.ts +36 -0
- package/src/tickers/search/home-listing.ts +75 -0
- package/src/tickers/search/index.ts +111 -33
- package/src/tickers/search/ranking.ts +64 -5
- package/src/tickers/search/types.ts +5 -0
- 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 +315 -0
- package/src/time-series/chart-bounds.ts +349 -0
- package/src/time-series/chart-seed.ts +142 -0
- package/src/time-series/daily-valuation.ts +62 -0
- package/src/time-series/economic.ts +5 -0
- package/src/time-series/field-catalog.ts +1 -3
- package/src/time-series/forward-valuation.ts +32 -0
- package/src/time-series/fundamentals.ts +173 -10
- package/src/time-series/history-acquisition.ts +499 -0
- package/src/time-series/hooks.ts +1 -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/price-units.ts +72 -2
- package/src/time-series/range.ts +9 -1
- package/src/time-series/resolution.ts +174 -16
- package/src/time-series/resolve-context.ts +161 -0
- package/src/time-series/resolve.ts +185 -1587
- package/src/time-series/series-name.ts +38 -0
- package/src/time-series/series-presentation.ts +242 -0
- package/src/time-series/spec.ts +13 -7
- package/src/time-series/studies.ts +377 -82
- package/src/time-series/tail-reconcile.ts +121 -0
- package/src/time-series/transforms.ts +1 -0
- package/src/time-series/types.ts +34 -2
- package/src/time-series/use-chart-resolution.ts +4 -5
- package/src/time-series/valuation-releases.ts +39 -0
- package/src/types/broker.ts +10 -0
- package/src/types/config.ts +14 -0
- package/src/types/data-provider.ts +23 -1
- package/src/types/desktop-window.ts +2 -0
- package/src/types/exchange-rate.ts +6 -0
- package/src/types/financials.ts +145 -8
- package/src/types/headless.ts +117 -9
- package/src/types/instrument.ts +6 -0
- package/src/types/plugin.ts +66 -9
- 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 +180 -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 +89 -5
- 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 +86 -0
- package/src/utils/option-expiry.ts +186 -7
- package/src/utils/options.ts +10 -0
- package/src/utils/plugin-proxy-hosts.json +1 -0
- package/src/utils/price-earnings.ts +11 -5
- package/src/utils/price-history.ts +23 -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
- package/src/renderers/browser/first-screen.ts +0 -193
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The live scanner's wire format: a user's own intraday conditions over a
|
|
3
|
+
* universe of US stocks, evaluated by Gloom Cloud against a market-wide
|
|
4
|
+
* snapshot it refreshes every few seconds (real-time for Pro, 15 minutes
|
|
5
|
+
* delayed otherwise). `GET /market/scanner/live?scan=<definition JSON>`.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
/** Minutes a move, a volume window or an event can look back over. */
|
|
9
|
+
export const LIVE_SCAN_WINDOWS = [1, 5, 15, 30, 60] as const;
|
|
10
|
+
export type LiveScanWindow = (typeof LIVE_SCAN_WINDOWS)[number];
|
|
11
|
+
|
|
12
|
+
export const LIVE_SCAN_INDEXES = ["sp500", "sp400", "sp600", "russell1000", "russell2000"] as const;
|
|
13
|
+
export type LiveScanIndex = (typeof LIVE_SCAN_INDEXES)[number];
|
|
14
|
+
|
|
15
|
+
/** The universe as Gloom Cloud reads it; a watchlist goes as its symbols. */
|
|
16
|
+
type LiveScanWireUniverse =
|
|
17
|
+
| { kind: "all" }
|
|
18
|
+
| { kind: "index"; index: LiveScanIndex }
|
|
19
|
+
| { kind: "sector"; sector: string }
|
|
20
|
+
| { kind: "symbols"; symbols: string[] };
|
|
21
|
+
|
|
22
|
+
export type LiveScanDirection = "up" | "down" | "either";
|
|
23
|
+
|
|
24
|
+
export type LiveScanCondition =
|
|
25
|
+
/** Volume over the window (or the session so far) against the 20-session average's pace. */
|
|
26
|
+
| { kind: "volume_spike"; window: LiveScanWindow | "day"; ratio: number }
|
|
27
|
+
/** Percent move over the last `window` minutes. */
|
|
28
|
+
| { kind: "move"; window: LiveScanWindow; direction: LiveScanDirection; percent: number }
|
|
29
|
+
/** A new session high (low) printed in the last `within` minutes. */
|
|
30
|
+
| { kind: "new_high" | "new_low"; within: LiveScanWindow }
|
|
31
|
+
/** Crossed the session VWAP in the last `within` minutes, and still on that side. */
|
|
32
|
+
| { kind: "vwap_cross"; direction: "above" | "below" | "either"; within: LiveScanWindow }
|
|
33
|
+
/** The session's open against the previous close. */
|
|
34
|
+
| { kind: "gap"; direction: LiveScanDirection; percent: number };
|
|
35
|
+
|
|
36
|
+
export interface LiveScanWireDefinition {
|
|
37
|
+
version: 1;
|
|
38
|
+
universe: LiveScanWireUniverse;
|
|
39
|
+
conditions: LiveScanCondition[];
|
|
40
|
+
minPrice?: number;
|
|
41
|
+
minMarketCap?: number;
|
|
42
|
+
minVolume?: number;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
type LiveScanStatus = "live" | "starting" | "closed" | "degraded";
|
|
46
|
+
|
|
47
|
+
export interface LiveScanMatch {
|
|
48
|
+
symbol: string;
|
|
49
|
+
name: string | null;
|
|
50
|
+
/** Its US venue (NASDAQ, NYSE, ...), null when the screener does not list it. */
|
|
51
|
+
exchange?: string | null;
|
|
52
|
+
price: number;
|
|
53
|
+
changePercent: number | null;
|
|
54
|
+
volume: number | null;
|
|
55
|
+
/** The session's volume against the 20-session average's pace so far. */
|
|
56
|
+
relativeVolume: number | null;
|
|
57
|
+
/** Price against the session VWAP, in percent. */
|
|
58
|
+
vwapPercent: number | null;
|
|
59
|
+
gapPercent: number | null;
|
|
60
|
+
/**
|
|
61
|
+
* The figure each condition matched on, in the definition's order: a
|
|
62
|
+
* percent for a move or a gap, a multiple for a volume spike, the time of
|
|
63
|
+
* the event (epoch ms) for a new high or low or a VWAP cross.
|
|
64
|
+
*/
|
|
65
|
+
values: Array<number | null>;
|
|
66
|
+
/** The latest event a condition matched on. */
|
|
67
|
+
signalAt: number | null;
|
|
68
|
+
/** When the price printed. */
|
|
69
|
+
at: number | null;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export interface LiveScanPayload {
|
|
73
|
+
status: LiveScanStatus;
|
|
74
|
+
access: "realtime" | "delayed";
|
|
75
|
+
delayMinutes: number;
|
|
76
|
+
/** The market time the snapshot shows. */
|
|
77
|
+
asOf: number | null;
|
|
78
|
+
/** When the snapshot was refreshed. */
|
|
79
|
+
takenAt: number | null;
|
|
80
|
+
/** How often the snapshot refreshes. */
|
|
81
|
+
refreshMs: number;
|
|
82
|
+
scanned: number;
|
|
83
|
+
matched: number;
|
|
84
|
+
matches: LiveScanMatch[];
|
|
85
|
+
/** Windows the scanner cannot measure yet after it started; a condition over one matches nothing until then. */
|
|
86
|
+
warmingWindows: LiveScanWindow[];
|
|
87
|
+
warnings: string[];
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/** The scan travels in a POST body: a watchlist of 1,000 symbols would not fit a request line. */
|
|
91
|
+
export const LIVE_SCAN_PATH = "/market/scanner/live";
|
|
@@ -60,6 +60,12 @@ export interface MarketHeatmapResult {
|
|
|
60
60
|
stale?: boolean;
|
|
61
61
|
universe: MarketHeatmapUniverseId;
|
|
62
62
|
source: MarketHeatmapSource;
|
|
63
|
+
/**
|
|
64
|
+
* Whose prices the board carries: `realtime` for a Pro account, priced
|
|
65
|
+
* from a live read the server takes every 15 seconds; `delayed`, fifteen
|
|
66
|
+
* minutes behind, otherwise. An older server leaves it out (delayed).
|
|
67
|
+
*/
|
|
68
|
+
access?: "realtime" | "delayed";
|
|
63
69
|
fetchedAt: number;
|
|
64
70
|
/** The US market session the snapshot describes; null when the server cannot tell. */
|
|
65
71
|
session?: "REGULAR" | "PRE" | "POST" | "CLOSED" | null;
|
|
@@ -72,6 +78,14 @@ export interface MarketHeatmapResult {
|
|
|
72
78
|
* leaves it out.
|
|
73
79
|
*/
|
|
74
80
|
regularSessionClosedAt?: number | null;
|
|
81
|
+
/**
|
|
82
|
+
* When the prices the board's moves are read at were printed, in epoch
|
|
83
|
+
* milliseconds, never later than any of them: the oldest delayed print
|
|
84
|
+
* while the session trades, that session's close outside it. `fetchedAt`
|
|
85
|
+
* is when the server put the snapshot together, at least fifteen minutes
|
|
86
|
+
* later. Null when a print is unknown; an older server leaves it out.
|
|
87
|
+
*/
|
|
88
|
+
pricesAsOf?: number | null;
|
|
75
89
|
assets: MarketHeatmapAsset[];
|
|
76
90
|
}
|
|
77
91
|
|
|
@@ -7,6 +7,12 @@ export interface FundMember {
|
|
|
7
7
|
contribution: number | null; stale: boolean;
|
|
8
8
|
}
|
|
9
9
|
export interface FundMembersPayload {
|
|
10
|
+
/**
|
|
11
|
+
* Whose prices the members carry: `realtime` for a Pro account, priced from
|
|
12
|
+
* a live read the server renews every 15 seconds; `delayed`, fifteen
|
|
13
|
+
* minutes behind, otherwise. An older server leaves it out (delayed).
|
|
14
|
+
*/
|
|
15
|
+
access?: "realtime" | "delayed";
|
|
10
16
|
fund: MemberFund; asOf: string; fetchedAt: string; excludedDerivatives: number; stale: boolean;
|
|
11
17
|
quotesUnavailable: boolean; snapshotAsOf: string | null; fundDailyAsOf: string | null; quoteCap: number;
|
|
12
18
|
members: FundMember[];
|
|
@@ -24,3 +30,15 @@ export interface FundChangesPayload {
|
|
|
24
30
|
estimateLabel: string; attribution: { text: string; url: string } | null;
|
|
25
31
|
}
|
|
26
32
|
export interface MemberFundsPayload { funds: (MemberFund & { asOf: string | null })[] }
|
|
33
|
+
|
|
34
|
+
interface BreadthCount { above: number; eligible: number; percent: number | null }
|
|
35
|
+
export interface BreadthDay {
|
|
36
|
+
date: string; asOf: string; membershipAsOf: string; memberCount: number; observed: number;
|
|
37
|
+
advances: number; declines: number; unchanged: number; advanceDeclineEligible: number;
|
|
38
|
+
ma20: BreadthCount; ma50: BreadthCount; ma200: BreadthCount;
|
|
39
|
+
newHighs: number; newLows: number; highLowEligible: number; adLine: number | null;
|
|
40
|
+
}
|
|
41
|
+
export interface FundBreadthPayload {
|
|
42
|
+
fund: MemberFund; basis: "daily-close" | "intraday"; access?: "realtime" | "delayed"; membershipBasis: "current-members";
|
|
43
|
+
latest: BreadthDay | null; history: BreadthDay[]; stale: boolean;
|
|
44
|
+
}
|
package/src/api-client/mna.ts
CHANGED
|
@@ -26,6 +26,12 @@ export interface MnaTerms {
|
|
|
26
26
|
/** The listing the exchange ratio pays in, usually the acquirer's. */
|
|
27
27
|
ratioSymbol: string | null;
|
|
28
28
|
currency: string | null;
|
|
29
|
+
/**
|
|
30
|
+
* Each holder chooses the cash or the shares (usually prorated to a fixed
|
|
31
|
+
* mix) instead of getting both. Older servers leave it out, and read every
|
|
32
|
+
* deal with both legs as paying them together.
|
|
33
|
+
*/
|
|
34
|
+
election?: boolean;
|
|
29
35
|
/** A contingent value right rides on top of the per-share terms. */
|
|
30
36
|
cvr: boolean;
|
|
31
37
|
/** The offer is for part of the shares, so the spread applies to a prorated slice. */
|
package/src/api-client/paths.ts
CHANGED
|
@@ -74,6 +74,8 @@ export type CloudEarningsCallsParams = IssuerListingParams & {
|
|
|
74
74
|
offset?: number;
|
|
75
75
|
/** Include calls still working through the transcription pipeline. */
|
|
76
76
|
includePending?: boolean;
|
|
77
|
+
/** Every company's calls on these New York days (YYYY-MM-DD), earliest first, in place of a company or the shelf. */
|
|
78
|
+
upcoming?: { from: string; to: string };
|
|
77
79
|
};
|
|
78
80
|
|
|
79
81
|
export type CloudNewsParams = {
|
|
@@ -310,6 +312,14 @@ export function cloudJobsPostingsPath(ticker: string, params: CloudJobsPostingsP
|
|
|
310
312
|
return appendQuery(`/cloud/jobs/${encodeURIComponent(normalizeIssuerResearchTicker(ticker))}/postings`, search);
|
|
311
313
|
}
|
|
312
314
|
|
|
315
|
+
/** One posting of a company, by the database id the jobs list carries or the careers system's own id HIRE's evidence carries. */
|
|
316
|
+
export function cloudJobsPostingPath(ticker: string, posting: { id: number } | { externalId: string }): string {
|
|
317
|
+
const search = new URLSearchParams();
|
|
318
|
+
if ("id" in posting) search.set("id", String(posting.id));
|
|
319
|
+
else search.set("externalId", posting.externalId);
|
|
320
|
+
return appendQuery(`/cloud/jobs/${encodeURIComponent(normalizeIssuerResearchTicker(ticker))}/posting`, search);
|
|
321
|
+
}
|
|
322
|
+
|
|
313
323
|
export function cloudJobsMoversPath(limit?: number, offset?: number): string {
|
|
314
324
|
const search = new URLSearchParams();
|
|
315
325
|
if (limit != null) search.set("limit", String(limit));
|
|
@@ -356,6 +366,11 @@ export function cloudEarningsCallsPath(
|
|
|
356
366
|
if (params.limit != null) search.set("limit", String(params.limit));
|
|
357
367
|
if (params.offset != null) search.set("offset", String(params.offset));
|
|
358
368
|
if (params.includePending) search.set("includePending", "true");
|
|
369
|
+
if (params.upcoming) {
|
|
370
|
+
search.set("upcoming", "true");
|
|
371
|
+
search.set("from", params.upcoming.from);
|
|
372
|
+
search.set("to", params.upcoming.to);
|
|
373
|
+
}
|
|
359
374
|
return appendQuery("/cloud/transcripts", search);
|
|
360
375
|
}
|
|
361
376
|
|
|
@@ -605,9 +620,11 @@ export function cloudNewsPath(params: CloudNewsParams = {}): string {
|
|
|
605
620
|
}
|
|
606
621
|
|
|
607
622
|
/** Stories whose headline, summary or publisher matches the text, best match first; the service takes at most 100. */
|
|
608
|
-
|
|
623
|
+
/** `topics` are NI codes the stories must carry: `query=gold&topics=metals` is gold's market news. */
|
|
624
|
+
export function cloudNewsSearchPath(query: string, limit?: number, topics?: readonly string[]): string {
|
|
609
625
|
const search = new URLSearchParams({ query });
|
|
610
626
|
if (limit != null) search.set("limit", String(limit));
|
|
627
|
+
if (topics?.length) search.set("topics", topics.join(","));
|
|
611
628
|
return appendQuery("/news/search", search);
|
|
612
629
|
}
|
|
613
630
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { logFailure } from "../utils/log-failure";
|
|
2
2
|
import { httpFetch, isHttpFetchStreaming } from "../utils/http-transport";
|
|
3
|
-
import {
|
|
3
|
+
import { OperationTimeoutError } from "../utils/async-deadline";
|
|
4
4
|
import {
|
|
5
5
|
ApiRequestError,
|
|
6
6
|
parseApiErrorCode,
|
|
@@ -16,16 +16,59 @@ import {
|
|
|
16
16
|
type ConnectionHealthRegistry,
|
|
17
17
|
} from "../core/connection-health";
|
|
18
18
|
import { SESSION_COOKIE_NAMES } from "./session-cookie";
|
|
19
|
+
import { asDataServiceFailure, DataServiceUnreachableError } from "../utils/network-failure";
|
|
19
20
|
|
|
20
21
|
/** The public Gloom Cloud API, which the web app's same-origin `/api` path forwards to. */
|
|
21
22
|
export const DEFAULT_API_URL = "https://api.gloom.sh";
|
|
23
|
+
/**
|
|
24
|
+
* How long a request waits for the service to answer at all. Nothing back by
|
|
25
|
+
* then, and nothing else answered meanwhile, is a hung connection: the request
|
|
26
|
+
* fails as the data service being unreachable, as a refused one does.
|
|
27
|
+
*/
|
|
22
28
|
const DEFAULT_MARKET_REQUEST_TIMEOUT_MS = 10_000;
|
|
29
|
+
/**
|
|
30
|
+
* A search, which a command and a keystroke wait on, gives up on a connection
|
|
31
|
+
* that sends nothing back sooner. A slow search on a service that answers
|
|
32
|
+
* (some take five seconds) still gets the full market deadline.
|
|
33
|
+
*/
|
|
34
|
+
const SEARCH_ANSWER_TIMEOUT_MS = 4_000;
|
|
35
|
+
/**
|
|
36
|
+
* Once a request went unanswered, later ones wait this long for an answer,
|
|
37
|
+
* until any answer comes back: a hung connection is not waited out in full by
|
|
38
|
+
* every request a command or a pane makes after it.
|
|
39
|
+
*/
|
|
40
|
+
const UNREACHABLE_REQUEST_TIMEOUT_MS = 3_000;
|
|
41
|
+
/**
|
|
42
|
+
* Right after a request hung with nothing back, the requests that follow it
|
|
43
|
+
* (a fallback, the next step of a command) fail at once rather than each
|
|
44
|
+
* waiting out a connection that just proved dead. Past this they try again.
|
|
45
|
+
*/
|
|
46
|
+
const HUNG_FAIL_FAST_MS = 5_000;
|
|
23
47
|
const DEFAULT_RESEARCH_REQUEST_TIMEOUT_MS = 45_000;
|
|
48
|
+
/** Requests outside market reads (saves, uploads, drafts) may take the server this long once it is known to answer. */
|
|
49
|
+
const DEFAULT_SERVICE_REQUEST_LIMIT_MS = 120_000;
|
|
50
|
+
const UPLOAD_REQUEST_LIMIT_MS = 300_000;
|
|
51
|
+
/**
|
|
52
|
+
* How long the check that the service answers at all waits. It runs this long
|
|
53
|
+
* before a request's answer deadline, unless something answered meanwhile, so
|
|
54
|
+
* one slow request on a service that answers is waited for and a dead
|
|
55
|
+
* connection is not.
|
|
56
|
+
*/
|
|
57
|
+
const SERVICE_PROBE_TIMEOUT_MS = 3_000;
|
|
58
|
+
const SERVICE_PROBE_PATH = "/health";
|
|
24
59
|
// Research may fill missing sections after a primary read; quote/history reads remain latency bounded.
|
|
25
60
|
const RESEARCH_MARKET_PATHS = new Set([
|
|
26
61
|
"/market/dividends", "/market/short-interest", "/market/movers", "/market/trending",
|
|
27
62
|
"/market/heatmap", "/market/earnings-calendar",
|
|
28
63
|
]);
|
|
64
|
+
|
|
65
|
+
/** When a request gives up: without any answer from the service, and in all. */
|
|
66
|
+
interface RequestDeadline {
|
|
67
|
+
answerMs: number;
|
|
68
|
+
limitMs: number;
|
|
69
|
+
/** When to check that the service answers at all, if nothing has by then; null when the deadline is too short for it. */
|
|
70
|
+
probeAtMs: number | null;
|
|
71
|
+
}
|
|
29
72
|
/** Local status for "this runtime cannot stream", never returned by the server. */
|
|
30
73
|
export const STREAMING_UNSUPPORTED_STATUS = 0;
|
|
31
74
|
|
|
@@ -73,6 +116,8 @@ type CloudApiUploadTransport = (request: CloudApiUploadRequest) => Promise<Cloud
|
|
|
73
116
|
let cloudApiFetchTransport: CloudApiFetchTransport = httpFetch;
|
|
74
117
|
let cloudApiUploadTransport: CloudApiUploadTransport | null = null;
|
|
75
118
|
let cloudApiTransportInstalled = false;
|
|
119
|
+
/** Counts installed transports, so what a client learned of one connection is not applied to the next. */
|
|
120
|
+
let cloudApiTransportGeneration = 0;
|
|
76
121
|
let cloudApiFetchStreaming = true;
|
|
77
122
|
let cloudApiStreamFetch: CloudApiStreamFetch | null = null;
|
|
78
123
|
|
|
@@ -82,6 +127,7 @@ export function setCloudApiFetchTransport(
|
|
|
82
127
|
): void {
|
|
83
128
|
cloudApiFetchTransport = transport ?? httpFetch;
|
|
84
129
|
cloudApiTransportInstalled = !!transport;
|
|
130
|
+
cloudApiTransportGeneration += 1;
|
|
85
131
|
cloudApiFetchStreaming = transport ? (options.streaming ?? false) : true;
|
|
86
132
|
cloudApiStreamFetch = transport ? options.streamFetch ?? null : null;
|
|
87
133
|
}
|
|
@@ -171,6 +217,17 @@ export class CloudApiRequestTransport {
|
|
|
171
217
|
private readonly marketRequestTimeoutMs: number;
|
|
172
218
|
private readonly researchRequestTimeoutMs: number;
|
|
173
219
|
private readonly connectionHealth: ConnectionHealthRegistry;
|
|
220
|
+
/** Answers received from the service, by any request: a request that sees this grow knows the connection works. */
|
|
221
|
+
private answers = 0;
|
|
222
|
+
/** The last request went unanswered (refused or hung) and nothing has answered since. */
|
|
223
|
+
private unreachable = false;
|
|
224
|
+
/** When a request last hung with nothing back, while nothing has answered since. */
|
|
225
|
+
private hungAt: number | null = null;
|
|
226
|
+
/** The installed transport the two above were learned on. */
|
|
227
|
+
private connectionGeneration = cloudApiTransportGeneration;
|
|
228
|
+
/** Requests waiting under a deadline: the check that the service answers runs only while one is. */
|
|
229
|
+
private pending = 0;
|
|
230
|
+
private probe: AbortController | null = null;
|
|
174
231
|
|
|
175
232
|
readonly baseUrl = getCloudApiBaseUrl();
|
|
176
233
|
|
|
@@ -263,11 +320,11 @@ export class CloudApiRequestTransport {
|
|
|
263
320
|
GLOOM_CLOUD_HTTP_CONNECTION_ID,
|
|
264
321
|
operation,
|
|
265
322
|
async () => {
|
|
266
|
-
const response = await streamFetch(`${this.baseUrl}${path}`, {
|
|
323
|
+
const response = await this.reachService(() => streamFetch(`${this.baseUrl}${path}`, {
|
|
267
324
|
...options,
|
|
268
325
|
headers,
|
|
269
326
|
credentials: "include",
|
|
270
|
-
});
|
|
327
|
+
}), options.signal);
|
|
271
328
|
throwIfRequestAborted(options.signal);
|
|
272
329
|
if (!response.ok) {
|
|
273
330
|
const text = await response.text().catch(logFailure("cloud-request", "Error response body read failed", ""));
|
|
@@ -284,37 +341,178 @@ export class CloudApiRequestTransport {
|
|
|
284
341
|
}
|
|
285
342
|
|
|
286
343
|
async request<T>(path: string, options?: RequestInit, canApplySession: () => boolean = () => true): Promise<T> {
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
344
|
+
return this.withDeadline(path, this.deadlineFor(path), options?.signal, (signal) => this.performRequest<T>(path, {
|
|
345
|
+
...options,
|
|
346
|
+
signal,
|
|
347
|
+
}, canApplySession));
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
/**
|
|
351
|
+
* Every request's deadline. A market read or a search waits about ten
|
|
352
|
+
* seconds, research and requests outside market data longer. With nothing
|
|
353
|
+
* back from the service, a request gives up at ten seconds, a search at
|
|
354
|
+
* four, and any request at three after one went unanswered, until something
|
|
355
|
+
* answers again. Three seconds before that, a request still unanswered
|
|
356
|
+
* checks that the service answers at all, so one slow request on a working
|
|
357
|
+
* connection is waited for and a dead connection is not.
|
|
358
|
+
*/
|
|
359
|
+
private deadlineFor(path: string, limitMs?: number): RequestDeadline {
|
|
360
|
+
this.forgetOtherTransport();
|
|
361
|
+
const pathname = path.split("?")[0]!;
|
|
362
|
+
const market = pathname.startsWith("/market/");
|
|
363
|
+
const limit = limitMs ?? (!market ? DEFAULT_SERVICE_REQUEST_LIMIT_MS
|
|
364
|
+
: RESEARCH_MARKET_PATHS.has(pathname) ? this.researchRequestTimeoutMs : this.marketRequestTimeoutMs);
|
|
365
|
+
let answerMs = pathname === "/market/search"
|
|
366
|
+
? Math.min(this.marketRequestTimeoutMs, SEARCH_ANSWER_TIMEOUT_MS)
|
|
367
|
+
: this.marketRequestTimeoutMs;
|
|
368
|
+
if (this.unreachable) answerMs = Math.min(answerMs, UNREACHABLE_REQUEST_TIMEOUT_MS);
|
|
369
|
+
return {
|
|
370
|
+
answerMs,
|
|
371
|
+
limitMs: Math.max(limit, answerMs),
|
|
372
|
+
probeAtMs: answerMs >= SERVICE_PROBE_TIMEOUT_MS ? answerMs - SERVICE_PROBE_TIMEOUT_MS : null,
|
|
373
|
+
};
|
|
374
|
+
}
|
|
290
375
|
|
|
291
|
-
|
|
292
|
-
|
|
376
|
+
/**
|
|
377
|
+
* Runs one request under its deadline. Without an answer from the service by
|
|
378
|
+
* `answerMs` (from this request, any other, or the check that the service
|
|
379
|
+
* answers at all), the connection is taken as hung: the request is aborted
|
|
380
|
+
* and fails as the data service being unreachable, as a refused connection
|
|
381
|
+
* does. A service that answers but is slow gets until `limitMs`, then the
|
|
382
|
+
* request times out. A caller's abort stays an abort.
|
|
383
|
+
*/
|
|
384
|
+
private async withDeadline<T>(
|
|
385
|
+
path: string,
|
|
386
|
+
deadline: RequestDeadline,
|
|
387
|
+
callerSignal: AbortSignal | null | undefined,
|
|
388
|
+
run: (signal: AbortSignal) => Promise<T>,
|
|
389
|
+
): Promise<T> {
|
|
293
390
|
const controller = new AbortController();
|
|
294
|
-
const callerSignal = options?.signal;
|
|
295
391
|
const abortFromCaller = () => controller.abort(callerSignal?.reason);
|
|
296
392
|
if (callerSignal?.aborted) {
|
|
297
393
|
abortFromCaller();
|
|
298
394
|
} else {
|
|
299
395
|
callerSignal?.addEventListener("abort", abortFromCaller, { once: true });
|
|
300
396
|
}
|
|
301
|
-
|
|
397
|
+
const answersAtStart = this.answers;
|
|
398
|
+
const answered = () => this.answers > answersAtStart;
|
|
399
|
+
const generation = cloudApiTransportGeneration;
|
|
400
|
+
const what = path.startsWith("/market/") ? "Cloud market request" : "Cloud request";
|
|
401
|
+
const timedOut = (ms: number) => new OperationTimeoutError(`${what} timed out after ${ms}ms: ${path.split("?")[0]}`);
|
|
402
|
+
const timers: Array<ReturnType<typeof setTimeout>> = [];
|
|
403
|
+
if (this.hungAt != null && Date.now() - this.hungAt < HUNG_FAIL_FAST_MS && !controller.signal.aborted) {
|
|
404
|
+
callerSignal?.removeEventListener("abort", abortFromCaller);
|
|
405
|
+
throw new DataServiceUnreachableError(new OperationTimeoutError(`${what} not sent: the last one got no answer: ${path.split("?")[0]}`));
|
|
406
|
+
}
|
|
407
|
+
this.pending += 1;
|
|
302
408
|
try {
|
|
303
|
-
const
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
409
|
+
const work = run(controller.signal);
|
|
410
|
+
return await new Promise<T>((resolve, reject) => {
|
|
411
|
+
const fail = (error: Error) => {
|
|
412
|
+
reject(error);
|
|
413
|
+
controller.abort(error);
|
|
414
|
+
};
|
|
415
|
+
work.then(resolve, reject);
|
|
416
|
+
if (deadline.probeAtMs != null) {
|
|
417
|
+
timers.push(setTimeout(() => {
|
|
418
|
+
if (!answered()) this.checkServiceAnswers();
|
|
419
|
+
}, deadline.probeAtMs));
|
|
420
|
+
}
|
|
421
|
+
timers.push(setTimeout(() => {
|
|
422
|
+
// The caller gave up first: its abort settles the request, and says nothing of the connection.
|
|
423
|
+
if (callerSignal?.aborted) return;
|
|
424
|
+
if (!answered()) {
|
|
425
|
+
this.recordNoAnswer(generation, true);
|
|
426
|
+
fail(new DataServiceUnreachableError(timedOut(deadline.answerMs)));
|
|
427
|
+
} else if (deadline.limitMs > deadline.answerMs) {
|
|
428
|
+
timers.push(setTimeout(() => fail(timedOut(deadline.limitMs)), deadline.limitMs - deadline.answerMs));
|
|
429
|
+
} else {
|
|
430
|
+
fail(timedOut(deadline.answerMs));
|
|
431
|
+
}
|
|
432
|
+
}, deadline.answerMs));
|
|
433
|
+
});
|
|
313
434
|
} finally {
|
|
435
|
+
for (const timer of timers) clearTimeout(timer);
|
|
314
436
|
callerSignal?.removeEventListener("abort", abortFromCaller);
|
|
437
|
+
this.pending -= 1;
|
|
438
|
+
// Nothing waits on the check any more: it must not hold a command's process open.
|
|
439
|
+
if (this.pending === 0) this.probe?.abort();
|
|
315
440
|
}
|
|
316
441
|
}
|
|
317
442
|
|
|
443
|
+
/**
|
|
444
|
+
* Sends one request, saying the same thing whichever fetch failed to connect
|
|
445
|
+
* (Bun's "Unable to connect", a browser's "Failed to fetch", a refused proxy):
|
|
446
|
+
* every command, pane and status line then reads "Gloom couldn't reach its
|
|
447
|
+
* data service", and code that falls back to a saved copy can tell it apart.
|
|
448
|
+
* A caller's abort stays an abort. An answer of any status says the
|
|
449
|
+
* connection works, for the deadlines of the requests beside it.
|
|
450
|
+
*/
|
|
451
|
+
private async reachService<R>(fetch: () => Promise<R>, signal: AbortSignal | null | undefined): Promise<R> {
|
|
452
|
+
const generation = cloudApiTransportGeneration;
|
|
453
|
+
let response: R;
|
|
454
|
+
try {
|
|
455
|
+
response = await fetch();
|
|
456
|
+
} catch (error) {
|
|
457
|
+
if (signal?.aborted) throw error;
|
|
458
|
+
const failure = asDataServiceFailure(error);
|
|
459
|
+
if (failure instanceof DataServiceUnreachableError) this.recordNoAnswer(generation, false);
|
|
460
|
+
throw failure;
|
|
461
|
+
}
|
|
462
|
+
this.recordAnswer();
|
|
463
|
+
return response;
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
/** A new transport installed is a new connection: what failed on the last one says nothing about it. */
|
|
467
|
+
private forgetOtherTransport(): void {
|
|
468
|
+
if (this.fetchTransport || this.connectionGeneration === cloudApiTransportGeneration) return;
|
|
469
|
+
this.connectionGeneration = cloudApiTransportGeneration;
|
|
470
|
+
this.unreachable = false;
|
|
471
|
+
this.hungAt = null;
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
/** Something came back from the service: the connection works. */
|
|
475
|
+
private recordAnswer(): void {
|
|
476
|
+
this.answers += 1;
|
|
477
|
+
this.unreachable = false;
|
|
478
|
+
this.hungAt = null;
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
/**
|
|
482
|
+
* A request sent on the transport installed as `generation` got no answer:
|
|
483
|
+
* refused, or `hung` with nothing back by its deadline. Once another
|
|
484
|
+
* transport is installed, what one sent on the last says nothing of it.
|
|
485
|
+
*/
|
|
486
|
+
private recordNoAnswer(generation: number, hung: boolean): void {
|
|
487
|
+
if (!this.fetchTransport && generation !== cloudApiTransportGeneration) return;
|
|
488
|
+
this.unreachable = true;
|
|
489
|
+
if (hung) this.hungAt = Date.now();
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
/**
|
|
493
|
+
* Asks the service for anything at all, once at a time, so a request that
|
|
494
|
+
* is slow can tell a slow server (which answers this) from a dead
|
|
495
|
+
* connection (which does not). Any status counts as an answer. It stops
|
|
496
|
+
* when nothing waits on it any more.
|
|
497
|
+
*/
|
|
498
|
+
private checkServiceAnswers(): void {
|
|
499
|
+
if (this.probe) return;
|
|
500
|
+
const controller = new AbortController();
|
|
501
|
+
const timer = setTimeout(() => controller.abort(), SERVICE_PROBE_TIMEOUT_MS);
|
|
502
|
+
const done = () => {
|
|
503
|
+
clearTimeout(timer);
|
|
504
|
+
if (this.probe === controller) this.probe = null;
|
|
505
|
+
};
|
|
506
|
+
// Done once given up on, even through a transport that ignores the abort.
|
|
507
|
+
controller.signal.addEventListener("abort", done, { once: true });
|
|
508
|
+
this.probe = controller;
|
|
509
|
+
(this.fetchTransport ?? cloudApiFetchTransport)(`${this.baseUrl}${SERVICE_PROBE_PATH}`, { signal: controller.signal })
|
|
510
|
+
.then(() => this.recordAnswer(), () => {
|
|
511
|
+
// Intentional ignore: an unanswered check only leaves the request it guards to its own deadline.
|
|
512
|
+
})
|
|
513
|
+
.finally(done);
|
|
514
|
+
}
|
|
515
|
+
|
|
318
516
|
/**
|
|
319
517
|
* POSTs raw bytes, such as an image, and parses the JSON answer like
|
|
320
518
|
* `request`. Progress is reported where the installed upload transport can
|
|
@@ -338,17 +536,17 @@ export class CloudApiRequestTransport {
|
|
|
338
536
|
url,
|
|
339
537
|
body,
|
|
340
538
|
headers: new Headers(init?.headers),
|
|
341
|
-
signal: options.signal,
|
|
539
|
+
signal: init?.signal ?? options.signal,
|
|
342
540
|
onProgress: options.onProgress,
|
|
343
541
|
})
|
|
344
542
|
: undefined;
|
|
345
|
-
return this.performRequest<T>(path, {
|
|
543
|
+
return this.withDeadline(path, this.deadlineFor(path, UPLOAD_REQUEST_LIMIT_MS), options.signal, (signal) => this.performRequest<T>(path, {
|
|
346
544
|
method: "POST",
|
|
347
545
|
headers,
|
|
348
546
|
// Typed arrays are valid fetch bodies; RequestInit's DOM typing lags behind.
|
|
349
547
|
body: body as BodyInit,
|
|
350
|
-
signal
|
|
351
|
-
}, () => true, send);
|
|
548
|
+
signal,
|
|
549
|
+
}, () => true, send));
|
|
352
550
|
}
|
|
353
551
|
|
|
354
552
|
private async performRequest<T>(
|
|
@@ -372,14 +570,14 @@ export class CloudApiRequestTransport {
|
|
|
372
570
|
|
|
373
571
|
const operation = `${options?.method ?? "GET"} ${path.split("?")[0]}`;
|
|
374
572
|
const request = async () => {
|
|
375
|
-
const res = await (send ?? this.fetchTransport ?? cloudApiFetchTransport)(
|
|
573
|
+
const res = await this.reachService(() => (send ?? this.fetchTransport ?? cloudApiFetchTransport)(
|
|
376
574
|
`${this.baseUrl}${path}`,
|
|
377
575
|
{
|
|
378
576
|
...options,
|
|
379
577
|
headers,
|
|
380
578
|
credentials: "include",
|
|
381
579
|
},
|
|
382
|
-
);
|
|
580
|
+
), options?.signal);
|
|
383
581
|
throwIfRequestAborted(options?.signal);
|
|
384
582
|
const ownsCredential = canApplySession() && this.sessionToken === sessionTokenAtRequestStart;
|
|
385
583
|
if (ownsCredential) this.extractSessionCookie(res);
|
|
@@ -29,10 +29,7 @@ export type ResearchActivity =
|
|
|
29
29
|
| "onboarding_signed_in"
|
|
30
30
|
| "onboarding_pro_viewed"
|
|
31
31
|
| "onboarding_completed"
|
|
32
|
-
| "onboarding_skipped"
|
|
33
|
-
// The first action of a web visitor counted in the first-screen experiment,
|
|
34
|
-
// in that first session. Keep in sync with the server's list.
|
|
35
|
-
| "first_screen_engaged";
|
|
32
|
+
| "onboarding_skipped";
|
|
36
33
|
export type ResearchFeature =
|
|
37
34
|
| "overview"
|
|
38
35
|
| "chart"
|
|
@@ -461,10 +458,7 @@ function webExperimentAttribution(): { experiments?: string } {
|
|
|
461
458
|
* visitors on term.gloom.sh with an analytics id (no Do Not Track or Global
|
|
462
459
|
* Privacy Control) and not driven by automation are asked. See web-experiments.ts.
|
|
463
460
|
*/
|
|
464
|
-
export function exposeWebExperiment(
|
|
465
|
-
experiment: string,
|
|
466
|
-
{ placement, signal }: { placement?: string; signal?: AbortSignal } = {},
|
|
467
|
-
): Promise<string | null> {
|
|
461
|
+
export function exposeWebExperiment(experiment: string): Promise<string | null> {
|
|
468
462
|
if (!researchTelemetryAllowed()) return Promise.resolve(null);
|
|
469
463
|
if (getCurrentPluginTarget() !== "web") return Promise.resolve(null);
|
|
470
464
|
try {
|
|
@@ -481,8 +475,7 @@ export function exposeWebExperiment(
|
|
|
481
475
|
attribution: attributionPayload(),
|
|
482
476
|
experiment: key,
|
|
483
477
|
variant,
|
|
484
|
-
|
|
485
|
-
}, signal),
|
|
478
|
+
}),
|
|
486
479
|
});
|
|
487
480
|
} catch {
|
|
488
481
|
return Promise.resolve(null);
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/** Daily outstanding fails are separate settlement snapshots, never additive through time. */
|
|
2
|
+
interface FailsToDeliverObservation {
|
|
3
|
+
date: string;
|
|
4
|
+
cusip: string;
|
|
5
|
+
quantity: number;
|
|
6
|
+
price: number | null;
|
|
7
|
+
description: string;
|
|
8
|
+
sourceUrl: string;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
/** ATS share is a percentage of published off-exchange shares, not total market volume. */
|
|
12
|
+
interface OtcVolumeObservation {
|
|
13
|
+
weekStart: string;
|
|
14
|
+
atsShares: number | null;
|
|
15
|
+
nonAtsShares: number | null;
|
|
16
|
+
totalShares: number | null;
|
|
17
|
+
atsTrades: number | null;
|
|
18
|
+
nonAtsTrades: number | null;
|
|
19
|
+
atsSharePercent: number | null;
|
|
20
|
+
sourceUrl: string;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export interface ShortSidePublication<T> {
|
|
24
|
+
symbol: string;
|
|
25
|
+
status: "available" | "partial" | "unavailable";
|
|
26
|
+
asOf: string | null;
|
|
27
|
+
sourceAsOf: string | null;
|
|
28
|
+
fetchedAt: string;
|
|
29
|
+
loadedAt: string | null;
|
|
30
|
+
source: { name: string; url: string; cadence: string };
|
|
31
|
+
warnings: string[];
|
|
32
|
+
history: T[];
|
|
33
|
+
coverage: { from: string; to: string; publications: number };
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export type FailsToDeliverPayload = ShortSidePublication<FailsToDeliverObservation>;
|
|
37
|
+
export type OtcVolumePayload = ShortSidePublication<OtcVolumeObservation>;
|