@gloom-sh/terminal 0.18.5 → 0.19.0
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/package.json +1 -1
- package/patches/electrobun@1.18.1.patch +140 -7
- package/src/api-client/cot.ts +6 -2
- package/src/api-client/credit-documents.ts +6 -0
- package/src/api-client/data.ts +17 -6
- package/src/api-client/equity-screener.ts +24 -0
- package/src/api-client/fund-facts.ts +45 -4
- package/src/api-client/index.ts +11 -0
- package/src/api-client/market-discovery.ts +10 -0
- package/src/api-client/market-movers.ts +7 -0
- package/src/api-client/members.ts +1 -1
- package/src/api-client/perps.ts +43 -0
- package/src/api-client/research-activity.ts +3 -2
- package/src/api-client/types.ts +70 -2
- package/src/app/pane-runtime/plugin-bindings.ts +9 -5
- package/src/app/runtime/broker-import.ts +0 -2
- package/src/app/runtime/plugin-bindings.ts +73 -56
- package/src/architecture/pane-tabs-allowlist.json +3 -0
- package/src/architecture/ttl-caches-allowlist.json +19 -0
- package/src/brokers/sync-broker-instance.ts +2 -8
- package/src/capabilities/chart-series.ts +1 -1
- package/src/cli/commands/crypto-hints.ts +40 -24
- package/src/cli/commands/market.ts +72 -26
- package/src/cli/commands/options-chain.ts +48 -7
- package/src/cli/commands/options-leaps.ts +9 -3
- package/src/cli/commands/overview.ts +61 -12
- package/src/cli/commands/search.ts +21 -1
- package/src/cli/commands/themes.ts +11 -2
- package/src/cli/commands/ticker.ts +55 -34
- package/src/cli/company-name-hint.ts +41 -0
- package/src/cli/earnings-calendar.ts +1 -1
- package/src/cli/errors.ts +8 -0
- package/src/cli/glossary.ts +25 -2
- package/src/cli/history-rows.ts +57 -9
- package/src/cli/index.ts +2 -0
- package/src/cli/listing-arg.ts +180 -52
- package/src/cli/output-file.ts +68 -0
- package/src/cli/pane-functions/capabilities.ts +3 -0
- package/src/cli/pane-functions/catalog.ts +80 -7
- package/src/cli/pane-functions/dom.ts +13 -3
- package/src/cli/pane-functions/freshness.ts +86 -3
- package/src/cli/pane-functions/function-help.ts +13 -10
- package/src/cli/pane-functions/headless.ts +17 -7
- package/src/cli/pane-functions/index.ts +49 -14
- package/src/cli/pane-functions/market-session.ts +66 -4
- package/src/cli/pane-functions/options.ts +19 -1
- package/src/cli/pane-functions/resolver.ts +19 -8
- package/src/cli/pane-functions/screenshot-assessment.ts +6 -4
- package/src/cli/pane-functions/screenshot-types.ts +5 -0
- package/src/cli/quote-answer.ts +22 -11
- package/src/cli/ticker-resolution.ts +3 -2
- package/src/components/chart/composite/composite-chart.tsx +4 -0
- package/src/components/chart/composite/interactions.ts +6 -0
- package/src/components/chart/composite/legend.tsx +45 -7
- package/src/components/chart/composite/panel-gestures.ts +33 -0
- package/src/components/chart/composite/panel-surface.tsx +52 -3
- package/src/components/chart/composite/rasterizer.ts +24 -13
- package/src/components/chart/composite/scene.ts +39 -4
- package/src/components/chart/composite/series-cues.ts +14 -0
- package/src/components/chart/composite/text-renderer.ts +9 -2
- package/src/components/chart/composite/tool-catalog.ts +36 -0
- package/src/components/chart/composite/tools.ts +203 -44
- package/src/components/chart/composite/use-composite-chart-keyboard.ts +11 -4
- package/src/components/command-bar/assist/inventory.ts +2 -1
- package/src/components/command-bar/commands/direct/index.ts +28 -13
- package/src/components/command-bar/pane-templates/items.ts +3 -2
- package/src/components/command-bar/workflow/collection-actions.ts +3 -3
- package/src/components/onboarding/onboarding-wizard.tsx +4 -1
- package/src/components/onboarding/portfolio-step/positions-panel.tsx +12 -7
- package/src/components/onboarding/wizard-broker-sync.ts +0 -1
- package/src/components/onboarding/wizard-positions.ts +3 -3
- package/src/components/ticker/list-table-view.tsx +4 -1
- package/src/components/ui/choice-dialog.tsx +23 -18
- package/src/components/ui/choice-groups.ts +18 -0
- package/src/components/ui/data-table/opentui/index.tsx +9 -7
- package/src/components/ui/data-table/opentui/model.ts +26 -1
- package/src/components/ui/data-table/types.ts +2 -0
- package/src/components/ui/list-view.tsx +8 -4
- package/src/components/ui/query-bar-keys.tsx +2 -0
- package/src/components/ui/query-bar.tsx +1 -0
- package/src/components/ui/select-button.tsx +5 -1
- package/src/components/ui/select-field.tsx +1 -0
- package/src/components/ui/table-layout.ts +8 -5
- package/src/core/app-runtime.ts +2 -0
- package/src/core/app-services.ts +2 -2
- package/src/data/config/chart-settings.ts +1 -1
- package/src/data/json-ticker-repository.ts +17 -8
- package/src/data/ticker-repository.ts +16 -9
- package/src/data/ticker-writes.ts +81 -0
- package/src/data/ttl-cache.ts +165 -0
- package/src/docs/snapshot.json +71 -137
- package/src/i18n/es.ts +18 -2
- package/src/i18n/ja.ts +18 -2
- package/src/i18n/ko.ts +18 -2
- package/src/i18n/zh-cn.ts +18 -2
- package/src/i18n/zh-tw.ts +18 -2
- package/src/market-data/depositary-pair.ts +2 -2
- package/src/market-data/fund-facts.ts +50 -0
- package/src/market-data/market/change-basis.ts +16 -3
- package/src/market-data/market/format.ts +25 -0
- package/src/market-data/market/freshness.ts +2 -1
- package/src/market-data/options-alternatives.ts +81 -4
- package/src/news/aggregator.ts +113 -9
- package/src/news/cloud-session.ts +21 -0
- package/src/news/hooks.ts +1 -0
- package/src/news/news-model.ts +1 -0
- package/src/news/types.ts +11 -0
- package/src/plugins/builtin/alerts/alert-engine.ts +20 -1
- package/src/plugins/builtin/alerts/alert-log.ts +33 -0
- package/src/plugins/builtin/alerts/cli-forms.ts +216 -0
- package/src/plugins/builtin/alerts/cli.ts +336 -77
- package/src/plugins/builtin/alerts/command.ts +25 -1
- package/src/plugins/builtin/alerts/events-pane.tsx +19 -4
- package/src/plugins/builtin/alerts/fired-log.ts +73 -9
- package/src/plugins/builtin/alerts/format.ts +75 -5
- package/src/plugins/builtin/alerts/headless.ts +24 -6
- package/src/plugins/builtin/alerts/history-rows.ts +3 -2
- package/src/plugins/builtin/alerts/history.ts +1 -1
- package/src/plugins/builtin/alerts/index.tsx +79 -16
- package/src/plugins/builtin/alerts/metric-command.ts +77 -4
- package/src/plugins/builtin/alerts/metric-data.ts +54 -13
- package/src/plugins/builtin/alerts/metric-model.ts +163 -14
- package/src/plugins/builtin/alerts/metric-parity-fixture.json +1 -1
- package/src/plugins/builtin/alerts/pane.tsx +61 -23
- package/src/plugins/builtin/alerts/quotes.ts +6 -0
- package/src/plugins/builtin/alerts/storage.ts +12 -8
- package/src/plugins/builtin/alerts/types.ts +4 -0
- package/src/plugins/builtin/analytics/index.tsx +2 -1
- package/src/plugins/builtin/analytics/risk-client.ts +16 -5
- package/src/plugins/builtin/analytics/risk-fx.ts +70 -15
- package/src/plugins/builtin/analytics/risk-headless.ts +27 -0
- package/src/plugins/builtin/analytics/risk-model.ts +55 -9
- package/src/plugins/builtin/analytics/risk-pane.tsx +8 -2
- package/src/plugins/builtin/attention/index.tsx +2 -1
- package/src/plugins/builtin/attention/listing.ts +14 -0
- package/src/plugins/builtin/broker-manager/index.tsx +7 -3
- package/src/plugins/builtin/buildout/cells.tsx +12 -4
- package/src/plugins/builtin/buildout/format.ts +38 -0
- package/src/plugins/builtin/buildout/model/normalizers.ts +36 -1
- package/src/plugins/builtin/buildout/pane/index.tsx +4 -1
- package/src/plugins/builtin/buildout/table-model.ts +23 -2
- package/src/plugins/builtin/builtin-plugin-meta.ts +6 -2
- package/src/plugins/builtin/changelog/index.tsx +9 -6
- package/src/plugins/builtin/chart-composer/catalog-inventory.ts +3 -0
- package/src/plugins/builtin/chart-composer/cli-options.ts +4 -0
- package/src/plugins/builtin/chart-composer/data-catalog-pane.tsx +7 -0
- package/src/plugins/builtin/chart-composer/editor/controller.ts +2 -2
- package/src/plugins/builtin/chart-composer/headless-schema.ts +7 -1
- package/src/plugins/builtin/chart-composer/headless.ts +6 -1
- package/src/plugins/builtin/chart-composer/index.tsx +1 -1
- package/src/plugins/builtin/chart-composer/pane.tsx +37 -8
- package/src/plugins/builtin/chart-composer/settings.ts +27 -0
- package/src/plugins/builtin/chat/content/command-suggestions.ts +1 -0
- package/src/plugins/builtin/chat/pane-links/commands.ts +7 -1
- package/src/plugins/builtin/clinical-trials/model.ts +0 -9
- package/src/plugins/builtin/clinical-trials/pane.tsx +15 -22
- package/src/plugins/builtin/clinical-trials/sponsor-tickers.ts +8 -6
- package/src/plugins/builtin/cloud/askg/manifest.ts +2 -0
- package/src/plugins/builtin/company-attention/building.tsx +5 -1
- package/src/plugins/builtin/company-attention/client.ts +8 -9
- package/src/plugins/builtin/company-attention/evidence.ts +4 -1
- package/src/plugins/builtin/company-attention/moves.tsx +5 -1
- package/src/plugins/builtin/company-attention/pane.tsx +9 -2
- package/src/plugins/builtin/company-attention/signals.tsx +5 -1
- package/src/plugins/builtin/correlation/headless.ts +13 -5
- package/src/plugins/builtin/correlation/history.ts +22 -0
- package/src/plugins/builtin/cot/client.ts +22 -18
- package/src/plugins/builtin/cot/headless.ts +15 -10
- package/src/plugins/builtin/cot/model.ts +14 -1
- package/src/plugins/builtin/cot/pane.tsx +22 -14
- package/src/plugins/builtin/credit-boards/client.ts +6 -10
- package/src/plugins/builtin/credit-conditions/headless.ts +8 -2
- package/src/plugins/builtin/credit-conditions/index.tsx +5 -1
- package/src/plugins/builtin/credit-conditions/model.ts +4 -0
- package/src/plugins/builtin/credit-conditions/series.ts +3 -1
- package/src/plugins/builtin/credit-documents/detail.tsx +2 -2
- package/src/plugins/builtin/credit-documents/export.ts +173 -0
- package/src/plugins/builtin/credit-documents/headless.ts +7 -7
- package/src/plugins/builtin/credit-documents/model.ts +104 -14
- package/src/plugins/builtin/credit-documents/pane.tsx +12 -5
- package/src/plugins/builtin/custom-view/sources.ts +2 -0
- package/src/plugins/builtin/dividend-yield/client.ts +131 -23
- package/src/plugins/builtin/dividend-yield/headless.ts +44 -16
- package/src/plugins/builtin/dividend-yield/model.ts +8 -5
- package/src/plugins/builtin/dividend-yield/pane.tsx +38 -13
- package/src/plugins/builtin/dividend-yield/ranking.ts +37 -14
- package/src/plugins/builtin/dividend-yield/types.ts +20 -2
- package/src/plugins/builtin/dividend-yield/view.ts +30 -2
- package/src/plugins/builtin/docs/targets.ts +5 -1
- package/src/plugins/builtin/earnings/board-model.ts +16 -15
- package/src/plugins/builtin/earnings/board.tsx +62 -71
- package/src/plugins/builtin/earnings/headless.ts +40 -4
- package/src/plugins/builtin/earnings/scope.ts +31 -43
- package/src/plugins/builtin/earnings-calls/calendar.tsx +2 -2
- package/src/plugins/builtin/earnings-calls/format.ts +31 -2
- package/src/plugins/builtin/earnings-calls/headless.ts +7 -2
- package/src/plugins/builtin/earnings-calls/model.ts +6 -1
- package/src/plugins/builtin/earnings-calls/pane.tsx +5 -4
- package/src/plugins/builtin/econ/types.ts +2 -0
- package/src/plugins/builtin/econ-statistics/defs.ts +6 -0
- package/src/plugins/builtin/econ-statistics/headless.ts +6 -4
- package/src/plugins/builtin/econ-statistics/stats.ts +36 -9
- package/src/plugins/builtin/equity-screener/categories.ts +179 -0
- package/src/plugins/builtin/equity-screener/client.ts +4 -2
- package/src/plugins/builtin/equity-screener/headless.ts +144 -13
- package/src/plugins/builtin/equity-screener/ideas.ts +49 -0
- package/src/plugins/builtin/equity-screener/model.ts +99 -10
- package/src/plugins/builtin/equity-screener/pane.tsx +68 -13
- package/src/plugins/builtin/fixed-income/pane.tsx +2 -1
- package/src/plugins/builtin/futures/use-board-terms.ts +42 -28
- package/src/plugins/builtin/futures/use-front-returns.ts +45 -28
- package/src/plugins/builtin/fx-matrix/client.ts +6 -3
- package/src/plugins/builtin/fx-matrix/headless.ts +1 -1
- package/src/plugins/builtin/fx-matrix/index.tsx +4 -2
- package/src/plugins/builtin/fx-matrix/live-legs.ts +42 -3
- package/src/plugins/builtin/gpu/headless.ts +8 -2
- package/src/plugins/builtin/help/function-index.ts +4 -1
- package/src/plugins/builtin/help/index.tsx +1 -0
- package/src/plugins/builtin/help/shortcut-model.ts +1 -1
- package/src/plugins/builtin/holders/fund-holders.ts +51 -0
- package/src/plugins/builtin/holders/headless.ts +18 -1
- package/src/plugins/builtin/iv-history/client.ts +52 -11
- package/src/plugins/builtin/iv-history/format.ts +36 -23
- package/src/plugins/builtin/iv-history/headless.ts +33 -18
- package/src/plugins/builtin/iv-history/index.tsx +2 -2
- package/src/plugins/builtin/iv-history/model.ts +163 -27
- package/src/plugins/builtin/iv-history/pane.tsx +10 -6
- package/src/plugins/builtin/iv-history/screen-pane.tsx +22 -15
- package/src/plugins/builtin/iv-history/universe.ts +5 -1
- package/src/plugins/builtin/jobs/client.ts +25 -29
- package/src/plugins/builtin/kelly-sizer/model.ts +12 -8
- package/src/plugins/builtin/kelly-sizer/pane.tsx +9 -9
- package/src/plugins/builtin/kelly-sizer/sections.tsx +19 -10
- package/src/plugins/builtin/kelly-sizer/types.ts +10 -4
- package/src/plugins/builtin/macro-day/release-table.ts +2 -2
- package/src/plugins/builtin/market-heatmap/data.ts +8 -33
- package/src/plugins/builtin/market-movers/client.ts +25 -7
- package/src/plugins/builtin/market-movers/headless.ts +32 -12
- package/src/plugins/builtin/market-movers/index.tsx +26 -14
- package/src/plugins/builtin/market-movers/min-float.ts +74 -0
- package/src/plugins/builtin/market-movers/model.ts +4 -1
- package/src/plugins/builtin/market-movers/screener.ts +14 -0
- package/src/plugins/builtin/market-movers/session-body.tsx +13 -8
- package/src/plugins/builtin/market-movers/session-table.ts +4 -3
- package/src/plugins/builtin/market-movers/table.ts +17 -5
- package/src/plugins/builtin/members/breadth-pane.tsx +2 -1
- package/src/plugins/builtin/news/index.tsx +1 -0
- package/src/plugins/builtin/news/wire/categories.ts +19 -3
- package/src/plugins/builtin/news/wire/industry-pane.tsx +1 -0
- package/src/plugins/builtin/news/wire/news/footer.ts +31 -5
- package/src/plugins/builtin/news/wire/news/preset-pane.tsx +6 -1
- package/src/plugins/builtin/news/wire/news/table.tsx +2 -2
- package/src/plugins/builtin/openfda/client.ts +14 -2
- package/src/plugins/builtin/openfda/index.tsx +3 -2
- package/src/plugins/builtin/openfda/model.ts +9 -0
- package/src/plugins/builtin/openfda/pane.tsx +42 -6
- package/src/plugins/builtin/options/analytics.ts +29 -5
- package/src/plugins/builtin/options/enrichment.ts +17 -5
- package/src/plugins/builtin/options/table.ts +5 -2
- package/src/plugins/builtin/options/types.ts +2 -0
- package/src/plugins/builtin/options/view.tsx +17 -4
- package/src/plugins/builtin/options-positioning/client.ts +11 -0
- package/src/plugins/builtin/options-positioning/headless.ts +21 -8
- package/src/plugins/builtin/options-positioning/index.tsx +1 -1
- package/src/plugins/builtin/options-positioning/model.ts +78 -9
- package/src/plugins/builtin/options-positioning/pane.tsx +21 -6
- package/src/plugins/builtin/options-scenario/client.ts +116 -47
- package/src/plugins/builtin/options-scenario/csp-screen-headless.ts +142 -10
- package/src/plugins/builtin/options-scenario/csp-screen-pane.tsx +206 -55
- package/src/plugins/builtin/options-scenario/csp-screen.ts +63 -23
- package/src/plugins/builtin/options-scenario/csp.ts +8 -2
- package/src/plugins/builtin/options-scenario/index.tsx +9 -7
- package/src/plugins/builtin/options-scenario/strategy-screen.ts +532 -0
- package/src/plugins/builtin/pe-band/model.ts +12 -49
- package/src/plugins/builtin/perps/cascade-tabs.tsx +161 -0
- package/src/plugins/builtin/perps/cascade.ts +236 -0
- package/src/plugins/builtin/perps/client.ts +56 -2
- package/src/plugins/builtin/perps/headless.ts +65 -9
- package/src/plugins/builtin/perps/index.tsx +7 -5
- package/src/plugins/builtin/perps/model.ts +18 -4
- package/src/plugins/builtin/perps/pane.tsx +19 -22
- package/src/plugins/builtin/perps/status-line.ts +25 -0
- package/src/plugins/builtin/plugin-module.ts +5 -1
- package/src/plugins/builtin/portfolio-list/cached-account.ts +3 -1
- package/src/plugins/builtin/portfolio-list/cli/bulk-symbols.ts +2 -8
- package/src/plugins/builtin/portfolio-list/cli/portfolio-command.ts +4 -4
- package/src/plugins/builtin/portfolio-list/cli/render.ts +7 -5
- package/src/plugins/builtin/portfolio-list/pane/futures-front.ts +40 -0
- package/src/plugins/builtin/portfolio-list/pane/index.tsx +4 -1
- package/src/plugins/builtin/portfolio-list/pane/streaming.ts +5 -2
- package/src/plugins/builtin/portfolio-list/pane/supplemental.ts +3 -2
- package/src/plugins/builtin/portfolio-list/quick-add/resolution.ts +3 -1
- package/src/plugins/builtin/portfolio-list/table.tsx +11 -3
- package/src/plugins/builtin/primary-dealers/client.ts +13 -38
- package/src/plugins/builtin/realized-vol/index.tsx +2 -2
- package/src/plugins/builtin/realized-vol/pane.tsx +3 -3
- package/src/plugins/builtin/relative-rotation/client.ts +18 -4
- package/src/plugins/builtin/relative-rotation/headless.ts +3 -3
- package/src/plugins/builtin/relative-rotation/index.tsx +2 -1
- package/src/plugins/builtin/relative-rotation/model.ts +16 -40
- package/src/plugins/builtin/relative-rotation/pane.tsx +3 -2
- package/src/plugins/builtin/research/corporate-actions-pane.tsx +3 -2
- package/src/plugins/builtin/research/event-model.ts +10 -8
- package/src/plugins/builtin/research/headless.ts +1 -1
- package/src/plugins/builtin/research/relative-valuation-headless.ts +5 -1
- package/src/plugins/builtin/research/relative-valuation-model.ts +31 -3
- package/src/plugins/builtin/research/relative-valuation-pane.tsx +7 -5
- package/src/plugins/builtin/reverse-dcf/headless.ts +5 -3
- package/src/plugins/builtin/reverse-dcf/model.ts +61 -6
- package/src/plugins/builtin/reverse-dcf/pane.tsx +7 -4
- package/src/plugins/builtin/scanner/flow-model.ts +50 -4
- package/src/plugins/builtin/scanner/flow-pane.tsx +367 -65
- package/src/plugins/builtin/scanner/flow-session.ts +146 -0
- package/src/plugins/builtin/scanner/headless.ts +204 -35
- package/src/plugins/builtin/scanner/index.ts +16 -5
- package/src/plugins/builtin/scanner/live-headless.ts +27 -3
- package/src/plugins/builtin/scanner/live-model.ts +11 -0
- package/src/plugins/builtin/scanner/live-pane.tsx +3 -3
- package/src/plugins/builtin/scanner/lock-note.ts +3 -2
- package/src/plugins/builtin/seasonality/headless.ts +10 -1
- package/src/plugins/builtin/sec/fund-facts-view.tsx +5 -2
- package/src/plugins/builtin/sec/fund-facts.ts +116 -34
- package/src/plugins/builtin/sec/headless.ts +2 -1
- package/src/plugins/builtin/series-inventory.ts +2 -0
- package/src/plugins/builtin/shared/cloud-resource.ts +3 -2
- package/src/plugins/builtin/shared/cloud-upgrade.ts +4 -3
- package/src/plugins/builtin/shared/earnings-calendar.ts +6 -2
- package/src/plugins/builtin/shared/earnings-report.ts +2 -2
- package/src/plugins/builtin/shared/job-posting.ts +1 -0
- package/src/plugins/builtin/shared/members-menu.tsx +3 -2
- package/src/plugins/builtin/shared/pro-lock-note.ts +12 -12
- package/src/plugins/builtin/shared/report-freshness.ts +3 -2
- package/src/plugins/builtin/shared/ticker-choice.tsx +2 -1
- package/src/plugins/builtin/shared/ticker-company.ts +77 -0
- package/src/plugins/builtin/shared/use-quote-board.ts +2 -1
- package/src/plugins/builtin/shared/volatility/live-session.ts +34 -8
- package/src/plugins/builtin/shared/volatility/pricing.ts +19 -0
- package/src/plugins/builtin/shared/wall-view-lifecycle.ts +3 -1
- package/src/plugins/builtin/themes/model.ts +16 -7
- package/src/plugins/builtin/themes/pane.tsx +5 -5
- package/src/plugins/builtin/ticker-detail/data-panes/historical-prices.tsx +43 -18
- package/src/plugins/builtin/ticker-detail/data-panes/returns-history.ts +3 -2
- package/src/plugins/builtin/ticker-detail/data-panes/returns-model.ts +62 -0
- package/src/plugins/builtin/ticker-detail/data-panes/returns-pane.tsx +83 -46
- package/src/plugins/builtin/ticker-detail/headless.ts +31 -16
- package/src/plugins/builtin/ticker-detail/overview/model.ts +1 -1
- package/src/plugins/builtin/ticker-detail/pane.tsx +3 -2
- package/src/plugins/builtin/ticker-detail/quote-monitor/index.tsx +2 -1
- package/src/plugins/builtin/ticker-detail/settings.ts +1 -0
- package/src/plugins/builtin/time-sales/pane.tsx +31 -19
- package/src/plugins/builtin/treasury-daily/client.ts +41 -5
- package/src/plugins/builtin/treasury-daily/headless.ts +2 -2
- package/src/plugins/builtin/treasury-daily/index.tsx +1 -1
- package/src/plugins/builtin/treasury-daily/model.ts +50 -3
- package/src/plugins/builtin/treasury-daily/pane.tsx +81 -2
- package/src/plugins/builtin/vol-surface/client.ts +3 -13
- package/src/plugins/builtin/vol-surface/headless.ts +3 -3
- package/src/plugins/builtin/vol-surface/index.tsx +1 -1
- package/src/plugins/builtin/vol-surface/pane.tsx +7 -5
- package/src/plugins/builtin/volatility/index.tsx +2 -2
- package/src/plugins/builtin/volatility/pane.tsx +2 -2
- package/src/plugins/builtin/world-venue-map/headless.ts +3 -3
- package/src/plugins/catalog-manifest.ts +2 -1
- package/src/plugins/marketplace/model.ts +18 -5
- package/src/portfolio/futures-positions.ts +6 -3
- package/src/portfolio/position-quantity.ts +15 -9
- package/src/remote/resources.ts +2 -1
- package/src/renderers/dom/data-table/row.tsx +26 -0
- package/src/renderers/dom/desktop/list-view.tsx +13 -10
- package/src/renderers/dom/desktop/query-bar.tsx +4 -2
- package/src/renderers/dom/desktop/select-field.tsx +4 -2
- package/src/renderers/dom/host/chart-surface.tsx +21 -0
- package/src/renderers/electrobun/bun/desktop/app-name.ts +3 -3
- package/src/renderers/electrobun/bun/desktop/backend.ts +12 -0
- package/src/renderers/electrobun/bun/desktop/host-requests.ts +7 -0
- package/src/renderers/electrobun/bun/desktop/initialization.ts +2 -0
- package/src/renderers/electrobun/bun/desktop/update.ts +115 -14
- package/src/renderers/electrobun/bun/desktop/view-ids.ts +52 -0
- package/src/renderers/electrobun/shared/app-name.ts +13 -0
- package/src/renderers/electrobun/shared/protocol.ts +10 -0
- package/src/renderers/electrobun/view/backend-rpc.ts +6 -0
- package/src/renderers/electrobun/view/main.tsx +24 -1
- package/src/renderers/electrobun/view/news-source.ts +3 -1
- package/src/renderers/electrobun/view/remote/ticker-repository.ts +14 -7
- package/src/renderers/electrobun/view/view-ids.ts +85 -0
- package/src/renderers/opentui/start.tsx +5 -0
- package/src/series/registry.ts +1 -0
- package/src/series/types.ts +6 -0
- package/src/series/validate.ts +1 -0
- package/src/sources/gloomberb-cloud/index.ts +1 -0
- package/src/sources/gloomberb-cloud/news.ts +47 -7
- package/src/sources/provider-router/financials.ts +15 -3
- package/src/sources/provider-router/index.ts +8 -5
- package/src/state/ticker-cleanup.ts +50 -0
- package/src/sync/controller.ts +4 -3
- package/src/sync/core-contributors.ts +90 -31
- package/src/telemetry/stall-reports-dom.ts +38 -0
- package/src/telemetry/stall-reports-node.ts +75 -0
- package/src/telemetry/stall-reports.ts +214 -0
- package/src/test-support/preload.ts +14 -0
- package/src/theme/themes.ts +10 -0
- package/src/tickers/company-name.ts +44 -3
- package/src/tickers/listing-venues.ts +15 -3
- package/src/tickers/terminal-codes.ts +19 -0
- package/src/time-series/alignment.ts +1 -1
- package/src/time-series/economic.ts +18 -4
- package/src/time-series/field-catalog.ts +1 -1
- package/src/time-series/filed-trailing-eps.ts +197 -0
- package/src/time-series/fundamentals.ts +44 -1
- package/src/time-series/ice-credit.ts +3 -0
- package/src/time-series/price-comparison.ts +30 -2
- package/src/time-series/resolve-context.ts +3 -1
- package/src/time-series/resolve.ts +56 -4
- package/src/time-series/session-bar.ts +11 -0
- package/src/time-series/spec.ts +3 -2
- package/src/time-series/studies.ts +8 -2
- package/src/time-series/total-return.ts +160 -0
- package/src/time-series/transforms.ts +2 -3
- package/src/time-series/types.ts +22 -1
- package/src/types/financials.ts +32 -1
- package/src/types/headless.ts +21 -3
- package/src/types/news-source.ts +1 -0
- package/src/types/plugin.ts +9 -0
- package/src/ui/host.tsx +3 -0
- package/src/updater/failure.ts +4 -1
- package/src/utils/cli-output.ts +42 -1
- package/src/utils/crypto-pair.ts +44 -0
- package/src/utils/forward-dividend.ts +2 -0
- package/src/utils/fundamentals.ts +24 -3
- package/src/utils/fx-market-hours.ts +26 -3
- package/src/utils/main-thread-stall.ts +35 -2
- package/src/utils/market-capitalization.ts +24 -1
- package/src/utils/price-history.ts +7 -1
- package/src/utils/shell-word.ts +8 -0
- package/src/utils/trailing-dividend.ts +53 -4
- package/src/plugins/builtin/clinical-trials/ticker-sponsor.ts +0 -17
package/package.json
CHANGED
|
@@ -74,7 +74,7 @@ index cdaa2bca0fabe577cb667056aa6f8f84211189c2..3839e5232742c2467180c344f51a30f1
|
|
|
74
74
|
|
|
75
75
|
// Encrypt function
|
|
76
76
|
diff --git a/dist/api/bun/core/Updater.ts b/dist/api/bun/core/Updater.ts
|
|
77
|
-
index 39daf6d341780af8e30c2c50327162863f5977ec..
|
|
77
|
+
index 39daf6d341780af8e30c2c50327162863f5977ec..4f3d2bef8e4b41a13a5a522c0af8dd700879a5db 100644
|
|
78
78
|
--- a/dist/api/bun/core/Updater.ts
|
|
79
79
|
+++ b/dist/api/bun/core/Updater.ts
|
|
80
80
|
@@ -132,6 +132,19 @@ let updateInfo: {
|
|
@@ -193,7 +193,52 @@ index 39daf6d341780af8e30c2c50327162863f5977ec..65677cd1d642ef832cf4f90a315d3ffc
|
|
|
193
193
|
emitStatus(
|
|
194
194
|
"fetching-patch",
|
|
195
195
|
`Checking for patch: ${currentHash.slice(0, 8)}`,
|
|
196
|
-
@@ -
|
|
196
|
+
@@ -498,11 +565,25 @@ const Updater = {
|
|
197
|
+
// - macOS/Windows: Resources/version.json (inside the app bundle directory)
|
|
198
|
+
// - Linux: metadata.json (alongside the app bundle)
|
|
199
|
+
const resourcesDir = "Resources";
|
|
200
|
+
- const patchedTarBytes = await Bun.file(
|
|
201
|
+
- tmpPatchedTarFilePath,
|
|
202
|
+
- ).arrayBuffer();
|
|
203
|
+
- const patchedArchive = new Bun.Archive(patchedTarBytes);
|
|
204
|
+
- const patchedFiles = await patchedArchive.files();
|
|
205
|
+
+ let patchedFiles: Map<string, File>;
|
|
206
|
+
+ try {
|
|
207
|
+
+ const patchedTarBytes = await Bun.file(
|
|
208
|
+
+ tmpPatchedTarFilePath,
|
|
209
|
+
+ ).arrayBuffer();
|
|
210
|
+
+ const patchedArchive = new Bun.Archive(patchedTarBytes);
|
|
211
|
+
+ patchedFiles = await patchedArchive.files();
|
|
212
|
+
+ } catch (error) {
|
|
213
|
+
+ // bspatch does not check what it patches: from a damaged tar it
|
|
214
|
+
+ // makes one that does not read, and would at every retry. The
|
|
215
|
+
+ // full download replaces both.
|
|
216
|
+
+ const message = error instanceof Error ? error.message : String(error);
|
|
217
|
+
+ emitStatus("patch-failed", `Patched tar does not read: ${message}`, {
|
|
218
|
+
+ currentHash,
|
|
219
|
+
+ errorMessage: message,
|
|
220
|
+
+ });
|
|
221
|
+
+ console.error("patched tar does not read", error);
|
|
222
|
+
+ break;
|
|
223
|
+
+ }
|
|
224
|
+
|
|
225
|
+
for (const [filePath] of patchedFiles) {
|
|
226
|
+
if (
|
|
227
|
+
@@ -528,8 +609,11 @@ const Updater = {
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
const hashFile = patchedFiles.get(hashFilePath);
|
|
231
|
+
- const hashFileJson = JSON.parse(await hashFile!.text());
|
|
232
|
+
- const nextHash = hashFileJson.hash;
|
|
233
|
+
+ // Unreadable, it has no hash below and the full download follows.
|
|
234
|
+
+ const nextHash: string = await hashFile!
|
|
235
|
+
+ .text()
|
|
236
|
+
+ .then((text) => JSON.parse(text)?.hash)
|
|
237
|
+
+ .catch(() => "");
|
|
238
|
+
|
|
239
|
+
if (seenHashes.includes(nextHash)) {
|
|
240
|
+
emitStatus(
|
|
241
|
+
@@ -612,12 +696,12 @@ const Updater = {
|
|
197
242
|
|
|
198
243
|
const cacheBuster = Math.random().toString(36).substring(7);
|
|
199
244
|
const platformPrefix = getPlatformPrefix(
|
|
@@ -208,7 +253,65 @@ index 39daf6d341780af8e30c2c50327162863f5977ec..65677cd1d642ef832cf4f90a315d3ffc
|
|
|
208
253
|
const prevVersionCompressedTarballPath = join(
|
|
209
254
|
appDataFolder,
|
|
210
255
|
"self-extraction",
|
|
211
|
-
@@ -
|
|
256
|
+
@@ -689,6 +773,13 @@ const Updater = {
|
|
257
|
+
emitStatus("error", updateInfo.error, { zstdPath });
|
|
258
|
+
console.error("zig-zstd not found:", zstdPath);
|
|
259
|
+
} else {
|
|
260
|
+
+ // Into a name of its own, renamed once whole: zig-zstd writes as
|
|
261
|
+
+ // it goes, and a run that failed (a download cut short) or never
|
|
262
|
+
+ // finished (the app quit) left part of a tar under the update's
|
|
263
|
+
+ // own name, which every later download took as done and every
|
|
264
|
+
+ // install then failed to unpack.
|
|
265
|
+
+ const partialTarPath = `${latestTarPath}.partial`;
|
|
266
|
+
+ rmSync(partialTarPath, { force: true });
|
|
267
|
+
const decompressResult = Bun.spawnSync(
|
|
268
|
+
[
|
|
269
|
+
zstdPath,
|
|
270
|
+
@@ -696,7 +787,7 @@ const Updater = {
|
|
271
|
+
"-i",
|
|
272
|
+
prevVersionCompressedTarballPath,
|
|
273
|
+
"-o",
|
|
274
|
+
- latestTarPath,
|
|
275
|
+
+ partialTarPath,
|
|
276
|
+
"--no-timing",
|
|
277
|
+
],
|
|
278
|
+
{
|
|
279
|
+
@@ -706,6 +797,7 @@ const Updater = {
|
|
280
|
+
},
|
|
281
|
+
);
|
|
282
|
+
if (!decompressResult.success) {
|
|
283
|
+
+ rmSync(partialTarPath, { force: true });
|
|
284
|
+
updateInfo.error = `zig-zstd failed with exit code ${decompressResult.exitCode}`;
|
|
285
|
+
emitStatus("error", updateInfo.error, {
|
|
286
|
+
zstdPath,
|
|
287
|
+
@@ -716,6 +808,7 @@ const Updater = {
|
|
288
|
+
zstdPath,
|
|
289
|
+
});
|
|
290
|
+
} else {
|
|
291
|
+
+ renameSync(partialTarPath, latestTarPath);
|
|
292
|
+
emitStatus("decompressing", "Decompression complete");
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
@@ -731,6 +824,8 @@ const Updater = {
|
|
296
|
+
// check for patch from that tar and apply it, until it matches the latest version
|
|
297
|
+
// as a fallback it should just download and unpack the latest version
|
|
298
|
+
updateInfo.updateReady = true;
|
|
299
|
+
+ // What failed on the way (a patch that did not apply) was recovered from.
|
|
300
|
+
+ updateInfo.error = "";
|
|
301
|
+
emitStatus(
|
|
302
|
+
"download-complete",
|
|
303
|
+
`Update ready to install (used ${usedPatchPath ? "patch" : "full download"} path)`,
|
|
304
|
+
@@ -741,7 +836,8 @@ const Updater = {
|
|
305
|
+
},
|
|
306
|
+
);
|
|
307
|
+
} else {
|
|
308
|
+
- updateInfo.error = "Failed to download latest version";
|
|
309
|
+
+ // Why it failed (zig-zstd's exit), when that is known.
|
|
310
|
+
+ if (!updateInfo.error) updateInfo.error = "Failed to download latest version";
|
|
311
|
+
emitStatus("error", "Failed to download latest version", { latestHash });
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
@@ -760,7 +856,12 @@ const Updater = {
|
|
212
315
|
mkdirSync(extractionFolder, { recursive: true });
|
|
213
316
|
}
|
|
214
317
|
|
|
@@ -222,7 +325,37 @@ index 39daf6d341780af8e30c2c50327162863f5977ec..65677cd1d642ef832cf4f90a315d3ffc
|
|
|
222
325
|
const latestTarPath = join(extractionFolder, `${latestHash}.tar`);
|
|
223
326
|
|
|
224
327
|
let appBundleSubpath: string = "";
|
|
225
|
-
@@ -
|
|
328
|
+
@@ -782,9 +883,26 @@ const Updater = {
|
|
329
|
+
mkdirSync(extractionDir, { recursive: true });
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
- const latestTarBytes = await Bun.file(latestTarPath).arrayBuffer();
|
|
333
|
+
- const latestArchive = new Bun.Archive(latestTarBytes);
|
|
334
|
+
- await latestArchive.extract(extractionDir);
|
|
335
|
+
+ try {
|
|
336
|
+
+ const latestTarBytes = await Bun.file(latestTarPath).arrayBuffer();
|
|
337
|
+
+ const latestArchive = new Bun.Archive(latestTarBytes);
|
|
338
|
+
+ await latestArchive.extract(extractionDir);
|
|
339
|
+
+ } catch (error) {
|
|
340
|
+
+ // The tar goes, with what it unpacked: left in place, every later
|
|
341
|
+
+ // download took it as the update again and every install failed
|
|
342
|
+
+ // here the same way. The next download fetches a fresh copy.
|
|
343
|
+
+ const message = `Failed to extract update: ${error instanceof Error ? error.message : String(error)}`;
|
|
344
|
+
+ try {
|
|
345
|
+
+ rmSync(latestTarPath, { force: true });
|
|
346
|
+
+ } catch (e) {
|
|
347
|
+
+ // Best effort, like the cleanup below.
|
|
348
|
+
+ }
|
|
349
|
+
+ cleanupExtractionFolder(extractionFolder, latestHash);
|
|
350
|
+
+ updateInfo.updateReady = false;
|
|
351
|
+
+ emitStatus("error", message, { errorMessage: message });
|
|
352
|
+
+ console.error("Failed to extract update", error);
|
|
353
|
+
+ return;
|
|
354
|
+
+ }
|
|
355
|
+
|
|
356
|
+
if (currentOS === "macos") {
|
|
357
|
+
// Find the .app bundle by scanning extracted directory
|
|
358
|
+
@@ -894,14 +1012,7 @@ const Updater = {
|
|
226
359
|
emitStatus("replacing-app", "Removing old version...");
|
|
227
360
|
|
|
228
361
|
if (currentOS === "macos") {
|
|
@@ -238,7 +371,7 @@ index 39daf6d341780af8e30c2c50327162863f5977ec..65677cd1d642ef832cf4f90a315d3ffc
|
|
|
238
371
|
|
|
239
372
|
// Remove quarantine extended attributes to prevent "damaged" error
|
|
240
373
|
// The inner bundle is already signed/notarized, but macOS applies
|
|
241
|
-
@@ -918,14 +
|
|
374
|
+
@@ -918,14 +1029,7 @@ const Updater = {
|
|
242
375
|
// On Linux, we now have directory bundles instead of AppImage files
|
|
243
376
|
// The app is stored in {appDataFolder}/app/
|
|
244
377
|
const appBundleDir = join(appDataFolder, "app");
|
|
@@ -254,7 +387,7 @@ index 39daf6d341780af8e30c2c50327162863f5977ec..65677cd1d642ef832cf4f90a315d3ffc
|
|
|
254
387
|
|
|
255
388
|
// Ensure launcher binary is executable
|
|
256
389
|
const launcherPath = join(appBundleDir, "bin", "launcher");
|
|
257
|
-
@@ -1071,14 +
|
|
390
|
+
@@ -1071,14 +1175,18 @@ del "%~f0"
|
|
258
391
|
// current process has exited first. The detached shell survives our
|
|
259
392
|
// exit and polls until the process is gone.
|
|
260
393
|
const pid = process.pid;
|
|
@@ -275,7 +408,7 @@ index 39daf6d341780af8e30c2c50327162863f5977ec..65677cd1d642ef832cf4f90a315d3ffc
|
|
|
275
408
|
detached: true,
|
|
276
409
|
stdio: ["ignore", "ignore", "ignore"],
|
|
277
410
|
} as any,
|
|
278
|
-
@@ -1087,7 +
|
|
411
|
+
@@ -1087,7 +1195,8 @@ del "%~f0"
|
|
279
412
|
// On Linux, launch the launcher binary inside the app directory
|
|
280
413
|
const launcherPath = join(runningAppBundlePath, "bin", "launcher");
|
|
281
414
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
package/src/api-client/cot.ts
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
|
-
|
|
1
|
+
/** The CFTC report: Legacy, Disaggregated, or Traders in Financial Futures (TFF). */
|
|
2
|
+
export type CotFamily = "legacy" | "disaggregated" | "tff"
|
|
2
3
|
export type CotClass = "noncommercial" | "commercial" | "producer" | "swap" | "managed-money" | "other-reportable" | "nonreportable"
|
|
4
|
+
| "dealer" | "asset-manager" | "leveraged-funds"
|
|
5
|
+
/** Futures positions alone, or futures and options combined (options delta-adjusted, as the CFTC reports them). */
|
|
6
|
+
export type CotPositions = "futures-only" | "combined"
|
|
3
7
|
interface CotPosition { long: number | null; short: number | null; spreading: number | null }
|
|
4
8
|
interface CotPercentile {
|
|
5
9
|
value: number | null
|
|
@@ -34,7 +38,7 @@ interface CotMarket {
|
|
|
34
38
|
}
|
|
35
39
|
export interface CotPayloadBase {
|
|
36
40
|
source: "CFTC"
|
|
37
|
-
scope:
|
|
41
|
+
scope: CotPositions
|
|
38
42
|
reportFamily: CotFamily
|
|
39
43
|
generatedAt: string
|
|
40
44
|
/** Tuesday position observation date, distinct from publication/download time. */
|
|
@@ -26,7 +26,10 @@ export interface CreditFact {
|
|
|
26
26
|
status: "active" | "superseded" | "pending";
|
|
27
27
|
supersedesId: string | null;
|
|
28
28
|
}
|
|
29
|
+
/** The party an instrument, covenant or wall bucket is of, when the filing names one other than the issuer. */
|
|
30
|
+
export interface CreditObligor { name: string; role?: string | null }
|
|
29
31
|
export interface CreditInstrument {
|
|
32
|
+
obligor?: CreditObligor | null;
|
|
30
33
|
lifecycle?: string | null;
|
|
31
34
|
id: string;
|
|
32
35
|
key: string;
|
|
@@ -41,6 +44,7 @@ export interface CreditInstrument {
|
|
|
41
44
|
history?: CreditFact[];
|
|
42
45
|
}
|
|
43
46
|
export interface CreditHeadroom {
|
|
47
|
+
obligor?: CreditObligor | null;
|
|
44
48
|
id: string;
|
|
45
49
|
instrumentId: string;
|
|
46
50
|
instrumentName: string;
|
|
@@ -57,12 +61,14 @@ export interface CreditHeadroom {
|
|
|
57
61
|
evidenceIds: string[];
|
|
58
62
|
}
|
|
59
63
|
export interface CreditMaturityBucket {
|
|
64
|
+
obligor?: CreditObligor | null;
|
|
60
65
|
year: number;
|
|
61
66
|
currency: string;
|
|
62
67
|
principal: number;
|
|
63
68
|
instruments: Array<{ id: string; name: string; principal: number; evidenceIds: string[] }>;
|
|
64
69
|
}
|
|
65
70
|
interface CreditControlExposure {
|
|
71
|
+
obligor?: CreditObligor | null;
|
|
66
72
|
instrumentId: string;
|
|
67
73
|
instrumentName: string;
|
|
68
74
|
currency: string | null;
|
package/src/api-client/data.ts
CHANGED
|
@@ -7,7 +7,7 @@ import { companyDisclosurePath } from "./company-kpis";
|
|
|
7
7
|
import { cloudExchangeAnnouncementsPath } from "./exchange-announcements";
|
|
8
8
|
import type { PowerBoard, PowerDetail, PowerFilter, PowerHistory } from "./power";
|
|
9
9
|
import type { PerpBoardPayload, PerpEquitiesPayload, PerpEquityListing, PerpHistoryPayload, PerpRankingsPayload, PerpBoardQuery, PerpHistoryQuery,
|
|
10
|
-
PerpMarketPayload } from "./perps";
|
|
10
|
+
PerpMarketPayload, PerpLiquidationsPayload, PerpDepthPayload } from "./perps";
|
|
11
11
|
import type { ExposureRequest, ExposurePayload, ExposureScenario } from "./exposure";
|
|
12
12
|
import type { SupplyChainPayload, SupplyOptions } from "./supply-chain";
|
|
13
13
|
import { supplyGraphQuery, type GraphOptions, type GraphPayload } from "./supply-chain-graph";
|
|
@@ -44,7 +44,7 @@ import type { BeneficialOwnersPayload, CloudBeneficialOwnersParams } from "./ben
|
|
|
44
44
|
import type { CloudInsiderSignalsParams, InsiderSignalsPayload } from "./insider-signals";
|
|
45
45
|
import type { SocialMentionDayPosts, SocialMentionsPayload, SocialMentionsRange } from "./social-mentions";
|
|
46
46
|
import type { FuturesContractTermsPayload, FuturesCurveAsOfPayload, FuturesCurvePayload } from "./futures-curve";
|
|
47
|
-
import type { CotBoardPayload, CotContractPayload, CotFamily, CotClass } from "./cot";
|
|
47
|
+
import type { CotBoardPayload, CotContractPayload, CotFamily, CotClass, CotPositions } from "./cot";
|
|
48
48
|
import type { DoeBoardPayload, DoePricesPayload } from "./doe";
|
|
49
49
|
import type { JodiBoardPayload, PsdBoardPayload } from "./commodity-balances";
|
|
50
50
|
import type { CarbonBoard, CarbonHistory, EuropePowerBoard, EuropePowerHistory, GasStorageBoard, GasStorageHistory, GasStorageSeasonal } from "./europe-energy";
|
|
@@ -180,6 +180,7 @@ import type {
|
|
|
180
180
|
CloudWorldVenueMapPayload,
|
|
181
181
|
CloudYieldPointPayload,
|
|
182
182
|
ScannerFlowHistoryPage,
|
|
183
|
+
ScannerFlowSession,
|
|
183
184
|
} from "./types";
|
|
184
185
|
import type { CloudApiRequest } from "./request";
|
|
185
186
|
|
|
@@ -594,12 +595,15 @@ export class CloudDataApi {
|
|
|
594
595
|
return this.request<CloudShillerPayload>(cloudShillerPath());
|
|
595
596
|
}
|
|
596
597
|
|
|
597
|
-
|
|
598
|
-
|
|
598
|
+
/** Futures-only positions unless `positions` asks for futures and options combined; the default request is unchanged. */
|
|
599
|
+
async getCloudCotBoard(report: CotFamily, traderClass: CotClass, positions: CotPositions = "futures-only"): Promise<CotBoardPayload> {
|
|
600
|
+
const query = new URLSearchParams({ report, traderClass, ...(positions === "combined" ? { scope: positions } : {}) });
|
|
601
|
+
return this.request<CotBoardPayload>(`/cloud/cot/board?${query}`);
|
|
599
602
|
}
|
|
600
603
|
|
|
601
|
-
async getCloudCotContract(code: string, report: CotFamily): Promise<CotContractPayload> {
|
|
602
|
-
|
|
604
|
+
async getCloudCotContract(code: string, report: CotFamily, positions: CotPositions = "futures-only"): Promise<CotContractPayload> {
|
|
605
|
+
const query = new URLSearchParams({ report, ...(positions === "combined" ? { scope: positions } : {}) });
|
|
606
|
+
return this.request<CotContractPayload>(`/cloud/cot/contracts/${encodeURIComponent(code)}?${query}`);
|
|
603
607
|
}
|
|
604
608
|
|
|
605
609
|
/** Geo layers (the map's layers, entities and series); one prefix-scoped method, like EQS. */
|
|
@@ -692,6 +696,8 @@ export class CloudDataApi {
|
|
|
692
696
|
}
|
|
693
697
|
async getCloudPerpsRankings(): Promise<PerpRankingsPayload> { return this.request("/cloud/perps/rankings"); }
|
|
694
698
|
async getCloudPerpsCompare(baseAsset: string): Promise<PerpBoardPayload> { return this.request(`/cloud/perps/compare?${new URLSearchParams({ baseAsset })}`); }
|
|
699
|
+
async getCloudPerpsLiquidations(baseAsset: string): Promise<PerpLiquidationsPayload> { return this.request(`/cloud/perps/liquidations?${new URLSearchParams({ baseAsset })}`); }
|
|
700
|
+
async getCloudPerpsDepth(baseAsset: string): Promise<PerpDepthPayload> { return this.request(`/cloud/perps/depth?${new URLSearchParams({ baseAsset })}`); }
|
|
695
701
|
async getCloudPerpsEquity(symbol: string, exchange?: string): Promise<PerpBoardPayload> {
|
|
696
702
|
const query = exchange === undefined ? "" : `?${new URLSearchParams({ identity: "listing", exchange })}`;
|
|
697
703
|
return this.request(`/cloud/perps/equity/${encodeURIComponent(symbol)}${query}`);
|
|
@@ -916,6 +922,11 @@ export class CloudDataApi {
|
|
|
916
922
|
return this.request<ScannerFlowHistoryPage>(`/market/scanner/flow/history?${search}`, { signal });
|
|
917
923
|
}
|
|
918
924
|
|
|
925
|
+
/** The latest session's recorded FLOW prints summed by side, by time and by strike (Pro); the plugin builds `search`. */
|
|
926
|
+
getScannerFlowSession(search: string, signal?: AbortSignal) {
|
|
927
|
+
return this.request<ScannerFlowSession>(`/market/scanner/flow/session?${search}`, { signal });
|
|
928
|
+
}
|
|
929
|
+
|
|
919
930
|
getMobileAlertHistory<T>(offset = 0) {
|
|
920
931
|
return this.request<T>(`/mobile/alerts/history?offset=${offset}`);
|
|
921
932
|
}
|
|
@@ -2,6 +2,27 @@
|
|
|
2
2
|
export const KPI_FIELDS = ["kpiArr", "kpiNrrPercent", "kpiRpo", "kpiCrpo", "kpiSubscribers", "kpiDau", "kpiMau", "kpiGmv", "kpiTakeRatePercent", "kpiSameStoreSalesPercent", "kpiStores", "kpiBacklog", "kpiBookToBill", "kpiNimPercent", "kpiCet1Percent", "kpiCombinedRatioPercent", "kpiOccupancyPercent", "kpiLoadFactorPercent", "guideRevenueChangePercent", "guideEpsChangePercent"] as const;
|
|
3
3
|
/** Payout ratio and dividend growth; listed only when asked (`include=dividends`), and omitted by a server from before them. */
|
|
4
4
|
export const DIVIDEND_FIELDS = ["payoutRatioPercent", "dividendGrowth1YPercent", "dividendGrowth3YPercent"] as const;
|
|
5
|
+
/**
|
|
6
|
+
* Technical readings of the stored daily bars at the last completed session; listed only when asked
|
|
7
|
+
* (`include=technical`), and omitted by a server from before them.
|
|
8
|
+
*/
|
|
9
|
+
export const TECHNICAL_FIELDS = [
|
|
10
|
+
"rsi14",
|
|
11
|
+
"priceVsSma20Percent", "priceVsSma50Percent", "priceVsSma200Percent",
|
|
12
|
+
"macdBullishCrossDays", "macdBearishCrossDays", "goldenCrossDays", "deathCrossDays",
|
|
13
|
+
"newHigh20dDays", "newLow20dDays", "newHigh52wDays", "newLow52wDays",
|
|
14
|
+
"bollingerWidthPercentile",
|
|
15
|
+
] as const;
|
|
16
|
+
/**
|
|
17
|
+
* IV30, its 52-week percentile and its moves in volatility points, and 20-session realized volatility with its
|
|
18
|
+
* 52-week rank; listed only when asked (`include=option-volatility`), and omitted by a server from before them.
|
|
19
|
+
*/
|
|
20
|
+
export const OPTION_VOLATILITY_FIELDS = ["iv30Percent", "ivPercentile", "iv30Change1d", "iv30Change5d", "hv20Percent", "hvRank"] as const;
|
|
21
|
+
/**
|
|
22
|
+
* Shares outstanding, float, short % of float and 13F institutional ownership, each with the day it describes;
|
|
23
|
+
* listed only when asked (`include=ownership`), and omitted by a server from before them.
|
|
24
|
+
*/
|
|
25
|
+
export const OWNERSHIP_FIELDS = ["sharesOutstanding", "floatShares", "shortPercentOfFloat", "institutionalOwnershipPercent"] as const;
|
|
5
26
|
export const NUMERIC_FIELDS = [
|
|
6
27
|
...KPI_FIELDS,
|
|
7
28
|
"price",
|
|
@@ -42,6 +63,7 @@ export const NUMERIC_FIELDS = [
|
|
|
42
63
|
"fromHigh52WPercent",
|
|
43
64
|
"beta",
|
|
44
65
|
"atrPercent",
|
|
66
|
+
...TECHNICAL_FIELDS,
|
|
45
67
|
"priceToBook",
|
|
46
68
|
"evToEbitda",
|
|
47
69
|
"roePercent",
|
|
@@ -49,6 +71,8 @@ export const NUMERIC_FIELDS = [
|
|
|
49
71
|
"analystUpsidePercent",
|
|
50
72
|
"ivRank",
|
|
51
73
|
"ivToHv",
|
|
74
|
+
...OPTION_VOLATILITY_FIELDS,
|
|
75
|
+
...OWNERSHIP_FIELDS,
|
|
52
76
|
"hiringOpenRoles", "hiringNetAddsWeek", "hiringRemotePercent", "hiringZScore",
|
|
53
77
|
"appAttentionScore", "appRankVelocity7d", "appRatingDrift7d", "appRatingCountGrowth7d",
|
|
54
78
|
] as const;
|
|
@@ -6,7 +6,15 @@ interface FundFact<T> {
|
|
|
6
6
|
url?: string;
|
|
7
7
|
}
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
/**
|
|
10
|
+
* `registered`: a 1940 Act fund (an ETF or UIT). `trust`: an exchange-traded
|
|
11
|
+
* trust or pool outside the 1940 Act. `closed-end`: a registered closed-end
|
|
12
|
+
* fund (ECC, OXLC, PDI), found filing N-CEN, N-CSR, N-PORT or N-2. `bdc`: a
|
|
13
|
+
* business development company (ARCC, MAIN), found filing N-2 or its N-54A
|
|
14
|
+
* election beside its 10-Q and 10-K. Either's shares trade at their own
|
|
15
|
+
* premium or discount to NAV. Servers before them say null.
|
|
16
|
+
*/
|
|
17
|
+
export type FundStructure = "registered" | "trust" | "closed-end" | "bdc";
|
|
10
18
|
type ExpenseRatioKind = "net" | "gross" | "sponsor-fee";
|
|
11
19
|
/**
|
|
12
20
|
* A bond fund as its sponsor classes it: `municipal` when its interest is
|
|
@@ -67,6 +75,22 @@ export interface FundMetalHoldings {
|
|
|
67
75
|
stale: boolean;
|
|
68
76
|
}
|
|
69
77
|
|
|
78
|
+
/**
|
|
79
|
+
* The 1M change in an ETF's shares outstanding (creations less redemptions),
|
|
80
|
+
* from the sponsor's count on `from` to its count on `asOf`. `value` puts a
|
|
81
|
+
* dollar figure on it, each day's change at that day's NAV; null when a day
|
|
82
|
+
* in between had none.
|
|
83
|
+
*/
|
|
84
|
+
export interface FundFlows {
|
|
85
|
+
period: "1M";
|
|
86
|
+
shares: number;
|
|
87
|
+
value: number | null;
|
|
88
|
+
from: string;
|
|
89
|
+
asOf: string;
|
|
90
|
+
source: string;
|
|
91
|
+
url?: string;
|
|
92
|
+
}
|
|
93
|
+
|
|
70
94
|
/**
|
|
71
95
|
* `not-collected-yet`: a source Gloom reads covers the fund, but it has no
|
|
72
96
|
* figures yet. `not-published`: no source Gloom reads covers it. Servers
|
|
@@ -86,10 +110,23 @@ export interface FundFactsPayload {
|
|
|
86
110
|
structure: FundStructure | null;
|
|
87
111
|
/** `document`: read from the fund's prospectus filed with the SEC on `asOf`, not from its sponsor. */
|
|
88
112
|
expenseRatio: (FundFact<number> & { kind: ExpenseRatioKind; document?: "prospectus" }) | null;
|
|
89
|
-
|
|
113
|
+
/**
|
|
114
|
+
* `period`: a `day`'s NAV, or a `month-end`'s (a closed-end fund's monthly
|
|
115
|
+
* estimate, or the NAV per share its filing states), which is its normal
|
|
116
|
+
* cadence rather than a lag. `estimate`: the range the sponsor published,
|
|
117
|
+
* whose midpoint `value` is. Servers before them leave both out.
|
|
118
|
+
*/
|
|
119
|
+
nav: (FundFact<number> & { period?: "day" | "month-end"; estimate?: { low: number; high: number } }) | null;
|
|
120
|
+
/** Why a covered fund has no NAV, in one line. Absent when it has one, and from servers before it. */
|
|
121
|
+
navReason?: string;
|
|
122
|
+
/** Dated by its own session: a month end on a weekend is priced at the Friday before it. */
|
|
90
123
|
closingPrice: FundFact<number> | null;
|
|
91
|
-
/**
|
|
92
|
-
|
|
124
|
+
/**
|
|
125
|
+
* `published` by the sponsor, or `computed` from the closing price against
|
|
126
|
+
* the NAV, dated by the NAV. `estimate`: computed against the midpoint of a
|
|
127
|
+
* NAV estimate, so an estimate too; absent from servers before it.
|
|
128
|
+
*/
|
|
129
|
+
premiumDiscount: (FundFact<number> & { basis: "published" | "computed"; estimate?: true }) | null;
|
|
93
130
|
/**
|
|
94
131
|
* `period`: a `day`'s figure, or the last `month-end`'s (Vanguard and ARK
|
|
95
132
|
* ETFs, N-PORT), which is not today's. `document`: the fund's N-PORT report
|
|
@@ -105,6 +142,10 @@ export interface FundFactsPayload {
|
|
|
105
142
|
bond?: FundBondFacts | null;
|
|
106
143
|
/** A metal trust's metal in trust; absent for any other fund, until its first read, and from servers before it. */
|
|
107
144
|
metalHoldings?: FundMetalHoldings | null;
|
|
145
|
+
/** Shares outstanding as the sponsor's file states them, dated. Servers before it leave it out. */
|
|
146
|
+
sharesOutstanding?: FundFact<number> | null;
|
|
147
|
+
/** The 1M change in shares outstanding; null until a month of counts is kept. Servers before it leave it out. */
|
|
148
|
+
flows?: FundFlows | null;
|
|
108
149
|
/** The newest NAV is older than a few US trading days: every figure is older than it looks. */
|
|
109
150
|
stale: boolean;
|
|
110
151
|
fetchedAt: string | null;
|
package/src/api-client/index.ts
CHANGED
|
@@ -225,6 +225,14 @@ class GloomApiClient {
|
|
|
225
225
|
return !!this.transport.getSessionToken() || !!this.currentUser;
|
|
226
226
|
}
|
|
227
227
|
|
|
228
|
+
/**
|
|
229
|
+
* Whether a request sent now carries a session: the token this client
|
|
230
|
+
* holds, or, in the browser, the cookie it cannot see and assumes is there.
|
|
231
|
+
*/
|
|
232
|
+
hasSessionCredential(): boolean {
|
|
233
|
+
return this.transport.hasSessionCredential();
|
|
234
|
+
}
|
|
235
|
+
|
|
228
236
|
/** Notifies when the user or credential changes, including plan and trial entitlement. */
|
|
229
237
|
subscribeCurrentUser(listener: () => void): () => void {
|
|
230
238
|
this.currentUserListeners.add(listener);
|
|
@@ -946,6 +954,7 @@ class GloomApiClient {
|
|
|
946
954
|
getCloudCentralBankRates = this.data.getCloudCentralBankRates.bind(this.data);
|
|
947
955
|
getMobileAlertHistory = this.data.getMobileAlertHistory.bind(this.data);
|
|
948
956
|
getScannerFlowHistory = this.data.getScannerFlowHistory.bind(this.data);
|
|
957
|
+
getScannerFlowSession = this.data.getScannerFlowSession.bind(this.data);
|
|
949
958
|
getLiveScan = this.data.getLiveScan.bind(this.data);
|
|
950
959
|
getCloudEstimateRevisions = this.data.getCloudEstimateRevisions.bind(this.data);
|
|
951
960
|
getCloudMoneyMarkets = this.data.getCloudMoneyMarkets.bind(this.data);
|
|
@@ -1004,6 +1013,8 @@ class GloomApiClient {
|
|
|
1004
1013
|
getCloudPerpsHistory = this.data.getCloudPerpsHistory.bind(this.data);
|
|
1005
1014
|
getCloudPerpsRankings = this.data.getCloudPerpsRankings.bind(this.data);
|
|
1006
1015
|
getCloudPerpsCompare = this.data.getCloudPerpsCompare.bind(this.data);
|
|
1016
|
+
getCloudPerpsLiquidations = this.data.getCloudPerpsLiquidations.bind(this.data);
|
|
1017
|
+
getCloudPerpsDepth = this.data.getCloudPerpsDepth.bind(this.data);
|
|
1007
1018
|
getCloudPerpsEquity = this.data.getCloudPerpsEquity.bind(this.data);
|
|
1008
1019
|
getCloudPerpsEquities = this.data.getCloudPerpsEquities.bind(this.data);
|
|
1009
1020
|
getCloudPerpsMarket = this.data.getCloudPerpsMarket.bind(this.data);
|
|
@@ -21,6 +21,12 @@ export interface ScreenerQuote {
|
|
|
21
21
|
previousClose?: number;
|
|
22
22
|
/** The quote's sessions beside the live print the server ranked the row by, when the server sends them. */
|
|
23
23
|
sessions?: CloudMoverSessionFields;
|
|
24
|
+
/** The listing's float as the equity screener serves it; absent where the server serves none or predates it. */
|
|
25
|
+
floatShares?: number;
|
|
26
|
+
/** Set with a float the source states no measurement date for: `partial`. */
|
|
27
|
+
floatSharesState?: "partial";
|
|
28
|
+
/** Why the float is partial, as the server says it. */
|
|
29
|
+
floatSharesReason?: string;
|
|
24
30
|
}
|
|
25
31
|
|
|
26
32
|
|
|
@@ -105,6 +111,8 @@ export interface DividendSummary {
|
|
|
105
111
|
/** The ex-date of the distribution that rate annualizes, YYYY-MM-DD. */
|
|
106
112
|
forwardRateAsOf?: string | null;
|
|
107
113
|
payoutRatio: number | null;
|
|
114
|
+
/** The trailing EPS fundamentals serve for the listing; only its sign is read, since a payout over a loss is not meaningful. Absent from older servers. */
|
|
115
|
+
trailingEps?: number | null;
|
|
108
116
|
exDividendDate: number | null;
|
|
109
117
|
dividendDate: number | null;
|
|
110
118
|
currency: string | null;
|
|
@@ -117,4 +125,6 @@ export interface MarketDividendsPayload {
|
|
|
117
125
|
summary: DividendSummary | null;
|
|
118
126
|
historyError?: string;
|
|
119
127
|
summaryError?: string;
|
|
128
|
+
/** When Gloom Cloud last asked for the history and the summary, ISO. Absent from older servers. */
|
|
129
|
+
triedAt?: string;
|
|
120
130
|
}
|
|
@@ -37,7 +37,14 @@ export interface CloudSessionMoverItem {
|
|
|
37
37
|
/** Regular-session VWAP. */
|
|
38
38
|
vwap: number | null;
|
|
39
39
|
vwapPercent: number | null;
|
|
40
|
+
/** The equity screener's float, null where it serves none. */
|
|
40
41
|
floatShares: number | null;
|
|
42
|
+
/** Set with a float the source states no measurement date for: `partial`. */
|
|
43
|
+
floatSharesState?: "partial";
|
|
44
|
+
/** Why the float is partial, as the server says it. */
|
|
45
|
+
floatSharesReason?: string;
|
|
46
|
+
/** When the statistics the float is read from were retrieved (ISO). */
|
|
47
|
+
floatSharesRetrievedAt?: string;
|
|
41
48
|
catalysts: CloudSessionCatalyst[];
|
|
42
49
|
lastUpdated: number;
|
|
43
50
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
interface MemberFund { ticker: string; name: string; aliases: string[]; changes: "sp500" | "announcements" | "none" }
|
|
2
2
|
export interface FundMember {
|
|
3
3
|
id: string; symbol: string | null; name: string; sector: string | null;
|
|
4
|
-
weight: number | null; shares: number; holdingPrice: number; marketValue: number;
|
|
4
|
+
weight: number | null; shares: number; holdingPrice: number | null; marketValue: number | null;
|
|
5
5
|
price: number | null; priceAsOf: string | null; changePercent: number | null; dailyAsOf: string | null;
|
|
6
6
|
return1WPercent: number | null; return1MPercent: number | null; returnYtdPercent: number | null;
|
|
7
7
|
contribution: number | null; stale: boolean;
|
package/src/api-client/perps.ts
CHANGED
|
@@ -174,3 +174,46 @@ export interface PerpMarketPayload extends PerpBoardPayload {
|
|
|
174
174
|
evidence: { kind: string; period_at: string; received_at: string; superseded_at: string | null; fingerprint: string; payload: PerpMarket | PerpFunding | PerpCandle }[];
|
|
175
175
|
methodologyUrl: string;
|
|
176
176
|
}
|
|
177
|
+
|
|
178
|
+
/** One contract's liquidations: long is longs liquidated (forced sells), short is shorts; quote notional. */
|
|
179
|
+
export interface PerpLiquidationMarket {
|
|
180
|
+
marketId: string; venue: string; symbol: string; dex: string; quoteCurrency: string;
|
|
181
|
+
long24h: number; short24h: number; long7d: number; short7d: number; count24h: number; count7d: number; lastEventAt: string | null;
|
|
182
|
+
}
|
|
183
|
+
export interface PerpLiquidationPrint {
|
|
184
|
+
marketId: string; venue: string; symbol: string; dex: string;
|
|
185
|
+
side: "long" | "short"; priceKind: "fill" | "bankruptcy"; price: number; quantity: number; notionalUsd: number;
|
|
186
|
+
/** The venue's time for the liquidation. */
|
|
187
|
+
eventAt: string;
|
|
188
|
+
/** When Gloom Cloud received it. */
|
|
189
|
+
receivedAt: string;
|
|
190
|
+
}
|
|
191
|
+
/** One base asset's liquidations across the venues' public streams. */
|
|
192
|
+
export interface PerpLiquidationsPayload {
|
|
193
|
+
status: string; baseAsset: string; asOf: string; from: string; collectingSince: string | null;
|
|
194
|
+
markets: PerpLiquidationMarket[];
|
|
195
|
+
totals: Pick<PerpLiquidationMarket, "long24h" | "short24h" | "long7d" | "short7d" | "count24h" | "count7d">;
|
|
196
|
+
/** Pro: UTC hours with liquidations over the last 7 days; empty for a preview. */
|
|
197
|
+
hourly: { time: string; long: number; short: number; count: number }[];
|
|
198
|
+
largest: PerpLiquidationPrint[];
|
|
199
|
+
streams: { venue: string; state: "live" | "down"; lastOkAt: string | null; error: string | null }[];
|
|
200
|
+
notes: string[];
|
|
201
|
+
locked: boolean; access: "pro" | "preview";
|
|
202
|
+
}
|
|
203
|
+
/** Quote notional resting within 0.5%, 1% and 2% of mid; reach is how far the returned book went, as a fraction of mid. */
|
|
204
|
+
export interface PerpDepthSnapshot {
|
|
205
|
+
marketId: string; bucket: string; observedAt: string; sourceAsOf: string | null; mid: number;
|
|
206
|
+
bid05: number; ask05: number; bid1: number; ask1: number; bid2: number; ask2: number;
|
|
207
|
+
bidReach: number; askReach: number; levels: number; grouping: number | null;
|
|
208
|
+
}
|
|
209
|
+
export interface PerpDepthRow extends PerpDepthSnapshot { venue: string; symbol: string; dex: string; quoteCurrency: string; stale: boolean }
|
|
210
|
+
/** One base asset's hourly order book depth across the venues. */
|
|
211
|
+
export interface PerpDepthPayload {
|
|
212
|
+
status: string; baseAsset: string; asOf: string;
|
|
213
|
+
rows: PerpDepthRow[];
|
|
214
|
+
/** Pro: every market's hourly snapshots over the last 7 days; empty for a preview. */
|
|
215
|
+
history: PerpDepthSnapshot[];
|
|
216
|
+
sources: { venue: string; lastOkAt: string | null; error: string | null }[];
|
|
217
|
+
notes: string[];
|
|
218
|
+
locked: boolean; access: "pro" | "preview";
|
|
219
|
+
}
|
|
@@ -46,8 +46,9 @@ const signinWallExperiment = createWallExperimentSession("wall_teaser_signin");
|
|
|
46
46
|
const upgradeExperiment = createUpgradeExperimentSession();
|
|
47
47
|
const WALL_VIEWS_SESSION_KEY = "gloomberb.wall-teaser.views";
|
|
48
48
|
|
|
49
|
-
|
|
50
|
-
const
|
|
49
|
+
// The desktop app also keeps a copy of these two on disk (electrobun/view/view-ids.ts).
|
|
50
|
+
export const ATTRIBUTION_STORAGE_KEY = "gloomberb.web.attribution";
|
|
51
|
+
export const ANONYMOUS_ID_STORAGE_KEY = "gloomberb.web.anonymous-id";
|
|
51
52
|
const HANDOFF_ID_KEY = "_gloom";
|
|
52
53
|
const ATTRIBUTION_WINDOW_MS = 30 * 24 * 60 * 60 * 1000;
|
|
53
54
|
/** Another device's clock may run slightly ahead; a touch from a minute in the future is still fresh. */
|