@gloom-sh/terminal 0.18.5 → 0.19.1
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 +1 -1
- package/README.zh-CN.md +1 -1
- package/package.json +1 -1
- package/patches/electrobun@1.18.1.patch +163 -8
- package/src/api-client/app-attention.ts +3 -0
- package/src/api-client/beneficial-owners.ts +3 -0
- package/src/api-client/company-kpis.ts +3 -0
- package/src/api-client/cot.ts +6 -2
- package/src/api-client/credit-documents.ts +6 -0
- package/src/api-client/data.ts +19 -7
- package/src/api-client/equity-screener.ts +24 -0
- package/src/api-client/fund-facts.ts +45 -4
- package/src/api-client/hiring.ts +3 -0
- package/src/api-client/index.ts +15 -0
- package/src/api-client/ipo.ts +24 -1
- 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/mna.ts +3 -0
- package/src/api-client/paths.ts +9 -1
- package/src/api-client/perps.ts +43 -0
- package/src/api-client/research-activity.ts +3 -2
- package/src/api-client/roadmap.ts +85 -0
- package/src/api-client/types.ts +82 -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/core-builtin-allowlist.json +2 -2
- 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 +107 -38
- package/src/cli/commands/news-search.ts +22 -0
- package/src/cli/commands/options-chain.ts +48 -7
- package/src/cli/commands/options-leaps.ts +9 -3
- package/src/cli/commands/overview.ts +147 -32
- package/src/cli/commands/search.ts +21 -1
- package/src/cli/commands/themes.ts +11 -2
- package/src/cli/commands/ticker.ts +87 -36
- package/src/cli/company-name-hint.ts +41 -0
- package/src/cli/earnings-calendar.ts +1 -1
- package/src/cli/errors.ts +25 -2
- package/src/cli/glossary.ts +31 -2
- package/src/cli/history-rows.ts +57 -9
- package/src/cli/index-roots.ts +0 -7
- package/src/cli/index.ts +2 -0
- package/src/cli/listing-arg.ts +235 -60
- package/src/cli/output-file.ts +68 -0
- package/src/cli/pane-functions/capabilities.ts +4 -0
- package/src/cli/pane-functions/catalog.ts +80 -7
- package/src/cli/pane-functions/discovery.ts +21 -1
- package/src/cli/pane-functions/dom.ts +13 -3
- package/src/cli/pane-functions/freshness.ts +93 -4
- package/src/cli/pane-functions/function-help.ts +20 -10
- package/src/cli/pane-functions/headless.ts +17 -7
- package/src/cli/pane-functions/index.ts +54 -16
- 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/saved-copy-persistence.ts +88 -0
- 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/list/model.ts +5 -0
- package/src/components/command-bar/pane-templates/items.ts +3 -2
- package/src/components/command-bar/routes/root/runtime.ts +6 -7
- package/src/components/command-bar/selection-runtime.ts +52 -3
- package/src/components/command-bar/surface/index.tsx +2 -0
- package/src/components/command-bar/workflow/collection-actions.ts +3 -3
- package/src/components/layout/pane/capture-stamp.ts +2 -2
- package/src/components/layout/pane/footer/index.tsx +22 -6
- package/src/components/layout/pane/footer/model.ts +83 -15
- package/src/components/layout/pane/status-footer.ts +35 -2
- package/src/components/layout/status-widget-space.ts +9 -0
- 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 +8 -21
- 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/display.tsx +18 -3
- package/src/components/ui/icon.tsx +4 -1
- 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/plugin-cache.ts +5 -3
- package/src/data/saved-copies.ts +8 -0
- 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 +103 -142
- package/src/i18n/es.ts +20 -6
- package/src/i18n/ja.ts +20 -6
- package/src/i18n/ko.ts +20 -6
- package/src/i18n/zh-cn.ts +20 -6
- package/src/i18n/zh-tw.ts +20 -6
- package/src/market-data/depositary-pair.ts +27 -3
- 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/market-data/quotes/metadata.ts +7 -0
- package/src/news/aggregator.ts +119 -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 +17 -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/calendar-events.ts +10 -4
- package/src/plugins/builtin/alerts/cli-forms.ts +216 -0
- package/src/plugins/builtin/alerts/cli.ts +362 -80
- package/src/plugins/builtin/alerts/command.ts +25 -1
- package/src/plugins/builtin/alerts/event-rows.ts +24 -3
- package/src/plugins/builtin/alerts/events-pane.tsx +34 -10
- 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 +34 -12
- 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/cds/client.ts +142 -30
- package/src/plugins/builtin/cds/headless.ts +35 -8
- package/src/plugins/builtin/cds/model.ts +145 -18
- package/src/plugins/builtin/cds/pane.tsx +16 -5
- 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/follow-binding.ts +14 -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 +5 -6
- 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/controller/index.ts +5 -1
- package/src/plugins/builtin/chat/controller/notifications.ts +33 -3
- package/src/plugins/builtin/chat/controller/state.ts +25 -2
- package/src/plugins/builtin/chat/controller/unread-people.ts +89 -23
- package/src/plugins/builtin/chat/controller/utils.ts +7 -2
- package/src/plugins/builtin/chat/pane-links/commands.ts +7 -1
- package/src/plugins/builtin/chat/status-preview.ts +79 -0
- package/src/plugins/builtin/chat/status-widget.tsx +147 -10
- package/src/plugins/builtin/chat/unread-badge.ts +51 -10
- package/src/plugins/builtin/clinical-trials/client.ts +49 -4
- package/src/plugins/builtin/clinical-trials/model.ts +86 -31
- package/src/plugins/builtin/clinical-trials/pane.tsx +61 -49
- package/src/plugins/builtin/clinical-trials/sponsor-listing.ts +90 -0
- package/src/plugins/builtin/clinical-trials/sponsor-tickers.ts +95 -15
- package/src/plugins/builtin/clinical-trials/trial-pages.ts +50 -0
- 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/headless.ts +2 -1
- package/src/plugins/builtin/company-attention/moves.tsx +5 -1
- package/src/plugins/builtin/company-attention/pane.tsx +12 -2
- package/src/plugins/builtin/company-attention/signals.tsx +5 -1
- package/src/plugins/builtin/company-kpis/headless.ts +8 -3
- package/src/plugins/builtin/company-kpis/model.ts +73 -5
- package/src/plugins/builtin/company-kpis/pane.tsx +15 -7
- package/src/plugins/builtin/composite-plugins.ts +2 -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 +10 -10
- 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/doe/headless.ts +3 -2
- package/src/plugins/builtin/doe/pane.tsx +13 -3
- 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/data.ts +18 -6
- package/src/plugins/builtin/earnings-calls/format.ts +31 -2
- package/src/plugins/builtin/earnings-calls/headless.ts +20 -5
- package/src/plugins/builtin/earnings-calls/model.ts +6 -1
- package/src/plugins/builtin/earnings-calls/pane.tsx +12 -4
- package/src/plugins/builtin/econ/calendar-model.ts +48 -1
- package/src/plugins/builtin/econ/calendar-source.ts +4 -2
- package/src/plugins/builtin/econ/detail-view.tsx +2 -2
- package/src/plugins/builtin/econ/figures.ts +48 -0
- package/src/plugins/builtin/econ/index.tsx +14 -5
- package/src/plugins/builtin/econ/print-watch.ts +3 -1
- package/src/plugins/builtin/econ/types.ts +2 -0
- package/src/plugins/builtin/econ-statistics/client.ts +11 -0
- package/src/plugins/builtin/econ-statistics/defs.ts +6 -0
- package/src/plugins/builtin/econ-statistics/headless.ts +16 -6
- package/src/plugins/builtin/econ-statistics/pane.tsx +8 -4
- package/src/plugins/builtin/econ-statistics/stats.ts +39 -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 +62 -59
- package/src/plugins/builtin/help/shortcut-model.ts +1 -1
- package/src/plugins/builtin/help/shortcut-table.tsx +5 -6
- package/src/plugins/builtin/help/table-cells.tsx +13 -2
- package/src/plugins/builtin/holders/beneficial-client.ts +5 -1
- package/src/plugins/builtin/holders/beneficial-view.tsx +3 -0
- package/src/plugins/builtin/holders/fund-holders.ts +51 -0
- package/src/plugins/builtin/holders/headless.ts +22 -3
- package/src/plugins/builtin/holders/pane.tsx +3 -0
- package/src/plugins/builtin/holders/report-rows.ts +4 -1
- package/src/plugins/builtin/insider/headless.ts +2 -2
- package/src/plugins/builtin/ipo-calendar/client.ts +18 -2
- package/src/plugins/builtin/ipo-calendar/headless.ts +75 -11
- package/src/plugins/builtin/ipo-calendar/listing-ipo.ts +160 -0
- package/src/plugins/builtin/ipo-calendar/model.ts +98 -2
- 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/headless.ts +12 -5
- package/src/plugins/builtin/macro-day/index.tsx +1 -1
- package/src/plugins/builtin/macro-day/model.ts +39 -5
- package/src/plugins/builtin/macro-day/pane.tsx +27 -19
- 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 +27 -7
- package/src/plugins/builtin/market-movers/headless.ts +34 -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 +22 -4
- 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/mna/headless.ts +2 -0
- package/src/plugins/builtin/mna/pane.tsx +3 -1
- package/src/plugins/builtin/news/headless.ts +3 -1
- package/src/plugins/builtin/news/index.tsx +4 -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 +6 -7
- 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/index.tsx +0 -14
- package/src/plugins/builtin/portfolio-list/quick-add/resolution.ts +5 -2
- package/src/plugins/builtin/portfolio-list/table.tsx +15 -9
- package/src/plugins/builtin/primary-dealers/client.ts +13 -38
- package/src/plugins/builtin/realized-vol/client.ts +13 -5
- package/src/plugins/builtin/realized-vol/evidence.ts +29 -4
- package/src/plugins/builtin/realized-vol/headless.ts +8 -4
- package/src/plugins/builtin/realized-vol/index.tsx +2 -2
- package/src/plugins/builtin/realized-vol/model.ts +37 -6
- package/src/plugins/builtin/realized-vol/pane.tsx +11 -9
- 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 +40 -12
- package/src/plugins/builtin/research/headless.ts +1 -1
- package/src/plugins/builtin/research/index.tsx +7 -3
- package/src/plugins/builtin/research/relative-valuation-headless.ts +13 -26
- package/src/plugins/builtin/research/relative-valuation-model.ts +31 -3
- package/src/plugins/builtin/research/relative-valuation-pane.tsx +59 -20
- package/src/plugins/builtin/research/relative-valuation-peers.ts +217 -20
- package/src/plugins/builtin/research/relative-valuation-settings.ts +44 -0
- 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/risk-factors/data.ts +4 -2
- package/src/plugins/builtin/risk-factors/headless.ts +5 -2
- package/src/plugins/builtin/roadmap/index.tsx +28 -0
- package/src/plugins/builtin/roadmap/model.ts +67 -0
- package/src/plugins/builtin/roadmap/pane.tsx +244 -0
- 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 +48 -5
- 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 +4 -2
- package/src/plugins/builtin/sec/index.tsx +3 -0
- package/src/plugins/builtin/series-inventory.ts +2 -0
- package/src/plugins/builtin/shared/cloud-resource.ts +16 -7
- 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/headless-market-data.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 +11 -2
- package/src/plugins/builtin/shared/research-cells.tsx +1 -1
- package/src/plugins/builtin/shared/series-cache.ts +4 -4
- 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/thirteenf/api.ts +12 -1
- package/src/plugins/builtin/thirteenf/data.ts +7 -7
- package/src/plugins/builtin/thirteenf/headless.ts +31 -4
- 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 +11 -3
- package/src/plugins/builtin/ticker-detail/overview-tab.tsx +2 -1
- package/src/plugins/builtin/ticker-detail/pane.tsx +14 -8
- 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-auctions/headless.ts +21 -12
- package/src/plugins/builtin/treasury-auctions/pane.tsx +9 -3
- 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 +7 -4
- package/src/plugins/builtin/world-venue-map/headless.ts +3 -3
- package/src/plugins/builtin/yield-curve/client.ts +61 -1
- package/src/plugins/builtin/yield-curve/headless.ts +9 -6
- package/src/plugins/builtin/yield-curve/index.tsx +34 -10
- package/src/plugins/builtin/yield-curve/swaps.tsx +9 -5
- package/src/plugins/catalog-browser.ts +2 -1
- package/src/plugins/catalog-manifest.ts +2 -1
- package/src/plugins/host-link.ts +1 -1
- package/src/plugins/marketplace/model.ts +18 -5
- package/src/portfolio/column-values.ts +11 -7
- 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/icons.tsx +7 -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 +21 -10
- package/src/renderers/electrobun/bun/desktop/host-requests.ts +15 -0
- package/src/renderers/electrobun/bun/desktop/initialization.ts +2 -0
- package/src/renderers/electrobun/bun/desktop/installer-folder.ts +731 -0
- package/src/renderers/electrobun/bun/desktop/relaunch.ts +102 -10
- 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/bun/desktop/windows-script.ts +92 -0
- package/src/renderers/electrobun/bun/index.ts +26 -2
- package/src/renderers/electrobun/bun/window/create.ts +43 -4
- package/src/renderers/electrobun/bun/window/events.ts +20 -0
- package/src/renderers/electrobun/bun/window/windows-custom-chrome.ts +9 -2
- package/src/renderers/electrobun/bun/window/windows-native.ts +78 -0
- package/src/renderers/electrobun/bun/window/windows-quit.ts +57 -0
- package/src/renderers/electrobun/shared/app-name.ts +13 -0
- package/src/renderers/electrobun/shared/protocol.ts +12 -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 +5 -1
- package/src/renderers/electrobun/view/remote/ticker-repository.ts +14 -7
- package/src/renderers/electrobun/view/ui-host.tsx +8 -0
- 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/fred-series.ts +3 -1
- package/src/sources/gloomberb-cloud/index.ts +43 -8
- 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-listing.ts +53 -13
- package/src/tickers/company-name.ts +50 -4
- package/src/tickers/index-roots.ts +7 -0
- package/src/tickers/listing-fate.ts +2 -2
- package/src/tickers/listing-venues.ts +15 -3
- package/src/tickers/search/index.ts +6 -2
- package/src/tickers/search/ranking.ts +5 -1
- package/src/tickers/search/upsert.ts +13 -0
- package/src/tickers/terminal-codes.ts +19 -0
- package/src/tickers/ticker-changes.ts +8 -4
- 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/company-from.ts +40 -0
- package/src/types/data-provider.ts +7 -0
- package/src/types/financials.ts +59 -1
- package/src/types/headless.ts +27 -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 +165 -7
- package/src/utils/declared-dividends.ts +1 -1
- package/src/utils/forward-dividend.ts +2 -0
- package/src/utils/fundamentals.ts +60 -8
- 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/version.ts +2 -2
- package/src/plugins/builtin/clinical-trials/ticker-sponsor.ts +0 -17
package/src/api-client/ipo.ts
CHANGED
|
@@ -28,6 +28,24 @@ interface IpoFirstDay {
|
|
|
28
28
|
returnPct: number | null;
|
|
29
29
|
}
|
|
30
30
|
|
|
31
|
+
/**
|
|
32
|
+
* When a US IPO's lock-up is estimated to end: the final prospectus's date
|
|
33
|
+
* plus the period it states, or the first session plus the usual 180 days
|
|
34
|
+
* until the prospectus is read. An estimate: underwriters can release
|
|
35
|
+
* shares early, and some holders agree to other periods.
|
|
36
|
+
*/
|
|
37
|
+
export interface IpoLockup {
|
|
38
|
+
/** YYYY-MM-DD. */
|
|
39
|
+
endsOn: string;
|
|
40
|
+
days: number;
|
|
41
|
+
/** `prospectus`: the period the final prospectus states; `typical`: 180 days, when it states none of a lock-up's length or was not read. */
|
|
42
|
+
basis: "prospectus" | "typical";
|
|
43
|
+
/** The date the final prospectus is dated, when it was read. */
|
|
44
|
+
prospectusDate: string | null;
|
|
45
|
+
/** The SEC document the period was read from. */
|
|
46
|
+
prospectusUrl: string | null;
|
|
47
|
+
}
|
|
48
|
+
|
|
31
49
|
export interface IpoDeal {
|
|
32
50
|
/** Assigned when the deal is first seen and never changed. */
|
|
33
51
|
id: string;
|
|
@@ -66,6 +84,8 @@ export interface IpoDeal {
|
|
|
66
84
|
listingType: IpoListingType;
|
|
67
85
|
filedDate: string | null;
|
|
68
86
|
firstDay: IpoFirstDay | null;
|
|
87
|
+
/** A priced or listed US IPO's estimated lock-up end; absent elsewhere, and from a server without the estimate. */
|
|
88
|
+
lockup?: IpoLockup | null;
|
|
69
89
|
updatedAt: string;
|
|
70
90
|
}
|
|
71
91
|
|
|
@@ -86,11 +106,14 @@ export interface IpoCalendarPayload {
|
|
|
86
106
|
|
|
87
107
|
/**
|
|
88
108
|
* Narrows or moves the window. Without any, the server sends its default:
|
|
89
|
-
*
|
|
109
|
+
* a year back (90 days on a server before that) to 180 days ahead, filed
|
|
110
|
+
* and withdrawn deals left out.
|
|
90
111
|
*/
|
|
91
112
|
export interface IpoCalendarParams {
|
|
92
113
|
region?: IpoRegion;
|
|
93
114
|
status?: IpoStatus;
|
|
115
|
+
/** Company (in either script) or symbol the deals' names contain. */
|
|
116
|
+
q?: string;
|
|
94
117
|
/** First listing date, YYYY-MM-DD. */
|
|
95
118
|
from?: string;
|
|
96
119
|
/** Last listing date, YYYY-MM-DD. */
|
|
@@ -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/mna.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { CompanyFrom } from "../types/company-from";
|
|
1
2
|
/**
|
|
2
3
|
* Mergers and acquisitions read from news, press releases and SEC filings.
|
|
3
4
|
* A deal is one target and one buyer; a target with competing bidders has a
|
|
@@ -84,6 +85,8 @@ export interface MnaDealsParams {
|
|
|
84
85
|
|
|
85
86
|
export interface MnaDealsPayload {
|
|
86
87
|
deals: MnaDeal[];
|
|
88
|
+
/** The company's home line the data is read from, when not the listing asked (a receipt, a foreign line). */
|
|
89
|
+
companyFrom?: CompanyFrom;
|
|
87
90
|
hasMore: boolean;
|
|
88
91
|
nextOffset: number;
|
|
89
92
|
/** "delayed" hides deals first reported within `delayDays` from a free account. */
|
package/src/api-client/paths.ts
CHANGED
|
@@ -621,10 +621,18 @@ export function cloudNewsPath(params: CloudNewsParams = {}): string {
|
|
|
621
621
|
|
|
622
622
|
/** Stories whose headline, summary or publisher matches the text, best match first; the service takes at most 100. */
|
|
623
623
|
/** `topics` are NI codes the stories must carry: `query=gold&topics=metals` is gold's market news. */
|
|
624
|
-
|
|
624
|
+
/**
|
|
625
|
+
* `closest`: when no story has every word, the stories with the most of them, marked `match: "closest"`.
|
|
626
|
+
* `tickers`: only the stories filed under them (`HAWK:NYSE`).
|
|
627
|
+
*/
|
|
628
|
+
export function cloudNewsSearchPath(
|
|
629
|
+
query: string, limit?: number, topics?: readonly string[], options: { closest?: boolean; tickers?: readonly string[] } = {},
|
|
630
|
+
): string {
|
|
625
631
|
const search = new URLSearchParams({ query });
|
|
626
632
|
if (limit != null) search.set("limit", String(limit));
|
|
627
633
|
if (topics?.length) search.set("topics", topics.join(","));
|
|
634
|
+
if (options.tickers?.length) search.set("tickers", options.tickers.join(","));
|
|
635
|
+
if (options.closest) search.set("closest", "1");
|
|
628
636
|
return appendQuery("/news/search", search);
|
|
629
637
|
}
|
|
630
638
|
|
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. */
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import type { CloudApiRequest } from "./request";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* The public roadmap: what is being built, what is planned and what shipped,
|
|
5
|
+
* with the votes Pro members put on the first two. Anyone reads it; a signed-in
|
|
6
|
+
* Pro member votes once per item and can take the vote back.
|
|
7
|
+
*/
|
|
8
|
+
const ROADMAP_STATUSES = ["building", "planned", "shipped"] as const;
|
|
9
|
+
export type RoadmapStatus = (typeof ROADMAP_STATUSES)[number];
|
|
10
|
+
|
|
11
|
+
export interface RoadmapItem {
|
|
12
|
+
id: string;
|
|
13
|
+
title: string;
|
|
14
|
+
/** One line on what it is. */
|
|
15
|
+
blurb: string;
|
|
16
|
+
status: RoadmapStatus;
|
|
17
|
+
/** ISO time it shipped; null until then. */
|
|
18
|
+
shippedAt: string | null;
|
|
19
|
+
votes: number;
|
|
20
|
+
/** Whether this account voted for it; false signed out. */
|
|
21
|
+
voted: boolean;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export interface RoadmapPayload {
|
|
25
|
+
items: RoadmapItem[];
|
|
26
|
+
/** The service's word on whether this session may vote (a verified Pro account). */
|
|
27
|
+
canVote: boolean;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export interface RoadmapVote {
|
|
31
|
+
id: string;
|
|
32
|
+
votes: number;
|
|
33
|
+
voted: boolean;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function isRecord(value: unknown): value is Record<string, unknown> {
|
|
37
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function parseItem(value: unknown): RoadmapItem | null {
|
|
41
|
+
if (!isRecord(value)) return null;
|
|
42
|
+
const { id, title, blurb, status, shippedAt, votes, voted } = value;
|
|
43
|
+
if (typeof id !== "string" || !id || typeof title !== "string" || !title.trim()) return null;
|
|
44
|
+
if (!(ROADMAP_STATUSES as readonly unknown[]).includes(status)) return null;
|
|
45
|
+
return {
|
|
46
|
+
id,
|
|
47
|
+
title: title.trim(),
|
|
48
|
+
blurb: typeof blurb === "string" ? blurb.trim() : "",
|
|
49
|
+
status: status as RoadmapStatus,
|
|
50
|
+
shippedAt: typeof shippedAt === "string" && Number.isFinite(Date.parse(shippedAt)) ? shippedAt : null,
|
|
51
|
+
votes: typeof votes === "number" && Number.isFinite(votes) ? Math.max(0, Math.round(votes)) : 0,
|
|
52
|
+
voted: voted === true,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/** Items it cannot read (an unknown status from a newer service) are left out, not the whole list. */
|
|
57
|
+
function parseRoadmapPayload(value: unknown): RoadmapPayload {
|
|
58
|
+
if (!isRecord(value) || !Array.isArray(value.items)) throw new Error("The roadmap service returned invalid data.");
|
|
59
|
+
return {
|
|
60
|
+
items: value.items.map(parseItem).filter((item): item is RoadmapItem => item !== null),
|
|
61
|
+
canVote: value.canVote === true,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
function parseVote(value: unknown): RoadmapVote {
|
|
66
|
+
if (!isRecord(value) || typeof value.id !== "string" || typeof value.votes !== "number" || typeof value.voted !== "boolean") {
|
|
67
|
+
throw new Error("The roadmap service returned invalid data.");
|
|
68
|
+
}
|
|
69
|
+
return { id: value.id, votes: value.votes, voted: value.voted };
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export class CloudRoadmapApi {
|
|
73
|
+
constructor(private readonly request: CloudApiRequest) {}
|
|
74
|
+
|
|
75
|
+
async getRoadmap(signal?: AbortSignal): Promise<RoadmapPayload> {
|
|
76
|
+
return parseRoadmapPayload(await this.request<unknown>("/roadmap", { signal }));
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/** Votes, or takes the vote back; the answer is the item's count after it. */
|
|
80
|
+
async setRoadmapVote(id: string, voted: boolean): Promise<RoadmapVote> {
|
|
81
|
+
return parseVote(await this.request<unknown>(`/roadmap/${encodeURIComponent(id)}/vote`, {
|
|
82
|
+
method: voted ? "POST" : "DELETE",
|
|
83
|
+
}));
|
|
84
|
+
}
|
|
85
|
+
}
|
package/src/api-client/types.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { CompanyFrom } from "../types/company-from";
|
|
1
2
|
import type {
|
|
2
3
|
AnalystResearchData,
|
|
3
4
|
CorporateActionsData,
|
|
@@ -518,10 +519,16 @@ export interface CloudEconEventPayload {
|
|
|
518
519
|
source?: { name: string; url?: string };
|
|
519
520
|
/**
|
|
520
521
|
* The indicator this release is of, the same from one release to the next
|
|
521
|
-
* (
|
|
522
|
-
*
|
|
522
|
+
* (`us-unemployment-rate` on every month's row), where `id` names the one
|
|
523
|
+
* row. Absent from a server that names none; exports leave the column empty.
|
|
523
524
|
*/
|
|
524
525
|
indicatorId?: string | null;
|
|
526
|
+
/**
|
|
527
|
+
* Where the forecast (the consensus) was read from, `week-feed` or
|
|
528
|
+
* `release-calendar`, and when that feed was read. Absent on a row with no
|
|
529
|
+
* forecast and on one kept before the read was recorded.
|
|
530
|
+
*/
|
|
531
|
+
consensus?: { source: string; readAt: string } | null;
|
|
525
532
|
}
|
|
526
533
|
|
|
527
534
|
/** One currency's short-term rate, as GET /cloud/econ/short-rates serves it. */
|
|
@@ -891,6 +898,13 @@ export interface CloudEarningsCallPayload {
|
|
|
891
898
|
* New York day). Absent from a server that predates it.
|
|
892
899
|
*/
|
|
893
900
|
callTimeKnown?: boolean;
|
|
901
|
+
/**
|
|
902
|
+
* "other" for an event that is not an earnings call (a deal call, a
|
|
903
|
+
* conference, an investor day), named by eventLabel and with no fiscal
|
|
904
|
+
* period; null when unclear. Older servers omit both.
|
|
905
|
+
*/
|
|
906
|
+
eventKind?: "earnings" | "other" | null;
|
|
907
|
+
eventLabel?: string | null;
|
|
894
908
|
}
|
|
895
909
|
|
|
896
910
|
interface CloudJobsSeriesPoint {
|
|
@@ -1047,6 +1061,8 @@ export interface CloudEarningsCallListPayload {
|
|
|
1047
1061
|
pending?: boolean;
|
|
1048
1062
|
/** Set when the requested symbol is not one the SEC knows. */
|
|
1049
1063
|
unknownTicker?: boolean;
|
|
1064
|
+
/** The company's home line the calls are read from, when not the listing asked (a receipt, a foreign line). */
|
|
1065
|
+
companyFrom?: CompanyFrom;
|
|
1050
1066
|
}
|
|
1051
1067
|
|
|
1052
1068
|
/** One row of a proxy statement's Summary Compensation Table, in dollars. */
|
|
@@ -1255,6 +1271,13 @@ export interface CloudEarningsTranscriptPayload {
|
|
|
1255
1271
|
companyName: string | null;
|
|
1256
1272
|
fiscalYear: number | null;
|
|
1257
1273
|
fiscalQuarter: number | null;
|
|
1274
|
+
/**
|
|
1275
|
+
* "other" for an event that is not an earnings call (a deal call, a
|
|
1276
|
+
* conference, an investor day), named by eventLabel and with no fiscal
|
|
1277
|
+
* period; null when unclear. Older servers omit both.
|
|
1278
|
+
*/
|
|
1279
|
+
eventKind?: "earnings" | "other" | null;
|
|
1280
|
+
eventLabel?: string | null;
|
|
1258
1281
|
callAt: string | null;
|
|
1259
1282
|
timing: string | null;
|
|
1260
1283
|
webcastUrl: string | null;
|
|
@@ -1436,6 +1459,8 @@ export interface CloudSecFilingsResponse {
|
|
|
1436
1459
|
filings: CloudSecFilingPayload[];
|
|
1437
1460
|
hasMore: boolean;
|
|
1438
1461
|
nextOffset: number;
|
|
1462
|
+
/** The company's home line the filings are read from, when not the listing asked (a foreign line). */
|
|
1463
|
+
companyFrom?: CompanyFrom;
|
|
1439
1464
|
}
|
|
1440
1465
|
|
|
1441
1466
|
export interface CloudSecDocumentsResponse {
|
|
@@ -1536,6 +1561,15 @@ export interface CloudNewsPayload {
|
|
|
1536
1561
|
export interface CloudNewsListResponse {
|
|
1537
1562
|
items: CloudNewsPayload[];
|
|
1538
1563
|
nextCursor: string | null;
|
|
1564
|
+
/** Which news the service answered with, when it says: the live wire, or the one held back for a free account. */
|
|
1565
|
+
access?: "realtime" | "delayed";
|
|
1566
|
+
/**
|
|
1567
|
+
* A search asked for its closest stories: `all` when stories have every
|
|
1568
|
+
* word, `closest` when none does and these have the most of them.
|
|
1569
|
+
*/
|
|
1570
|
+
match?: "all" | "closest";
|
|
1571
|
+
/** A receipt's or foreign line's feed is its company's: the home line it reads, when not the listing asked. */
|
|
1572
|
+
companyFrom?: CompanyFrom;
|
|
1539
1573
|
}
|
|
1540
1574
|
|
|
1541
1575
|
interface CloudTweetUserPayload {
|
|
@@ -1739,6 +1773,14 @@ export interface CloudMarketScreenerItem extends CloudMoverSessionFields {
|
|
|
1739
1773
|
exchange: string;
|
|
1740
1774
|
lastUpdated: number;
|
|
1741
1775
|
dataSource: "live";
|
|
1776
|
+
/** The listing's float as the equity screener serves it; absent where it serves none. */
|
|
1777
|
+
floatShares?: number;
|
|
1778
|
+
/** Set with a float the source states no measurement date for: `partial`. */
|
|
1779
|
+
floatSharesState?: "partial";
|
|
1780
|
+
/** Why the float is partial, as the server says it. */
|
|
1781
|
+
floatSharesReason?: string;
|
|
1782
|
+
/** When the statistics the float is read from were retrieved (ISO). */
|
|
1783
|
+
floatSharesRetrievedAt?: string;
|
|
1742
1784
|
}
|
|
1743
1785
|
|
|
1744
1786
|
export interface CloudMarketScreenerPayload {
|
|
@@ -1933,6 +1975,44 @@ export interface ScannerFlowHistoryPage {
|
|
|
1933
1975
|
hasMore: boolean;
|
|
1934
1976
|
}
|
|
1935
1977
|
|
|
1978
|
+
/**
|
|
1979
|
+
* Premium of a slice of the session's recorded prints by where it traded: at
|
|
1980
|
+
* or above the ask (bought) or at or below the bid (sold). Mid and unknown
|
|
1981
|
+
* prints count as neither.
|
|
1982
|
+
*/
|
|
1983
|
+
interface ScannerFlowSidePremium {
|
|
1984
|
+
callAsk: number;
|
|
1985
|
+
callBid: number;
|
|
1986
|
+
putAsk: number;
|
|
1987
|
+
putBid: number;
|
|
1988
|
+
}
|
|
1989
|
+
|
|
1990
|
+
/** The session's prints in one time bucket, which starts at `at`. */
|
|
1991
|
+
export interface ScannerFlowSessionBucket extends ScannerFlowSidePremium {
|
|
1992
|
+
at: number;
|
|
1993
|
+
}
|
|
1994
|
+
|
|
1995
|
+
/** What one name printed at one expiry and strike during the session. */
|
|
1996
|
+
export interface ScannerFlowSessionStrike extends ScannerFlowSidePremium {
|
|
1997
|
+
expiry: string;
|
|
1998
|
+
strike: number;
|
|
1999
|
+
/** Every call print's premium, mid and unknown included. */
|
|
2000
|
+
callPremium: number;
|
|
2001
|
+
putPremium: number;
|
|
2002
|
+
prints: number;
|
|
2003
|
+
}
|
|
2004
|
+
|
|
2005
|
+
/** The latest session's recorded prints under the FLOW pane's filters, summed. */
|
|
2006
|
+
export interface ScannerFlowSession {
|
|
2007
|
+
/** The New York date of the session; null before any print was recorded. */
|
|
2008
|
+
session: string | null;
|
|
2009
|
+
bucketMs: number;
|
|
2010
|
+
/** Buckets with a matching print, oldest first. */
|
|
2011
|
+
buckets: ScannerFlowSessionBucket[];
|
|
2012
|
+
/** Only when one name was asked for: most premium first. */
|
|
2013
|
+
strikes: ScannerFlowSessionStrike[] | null;
|
|
2014
|
+
}
|
|
2015
|
+
|
|
1936
2016
|
export type ScannerPayload = ScannerHiloPayload | ScannerFlowPayload;
|
|
1937
2017
|
|
|
1938
2018
|
/** What a scanner subscriber receives: data, or the entitlement refusal. */
|
|
@@ -513,13 +513,17 @@ export function bindAppPanePluginRegistry({
|
|
|
513
513
|
removeExternalPlugin(pluginId, directory);
|
|
514
514
|
},
|
|
515
515
|
contributions: (pluginId) => {
|
|
516
|
+
// An unlisted function (`listed: false`) and a pane only it opens are left out, as of every list.
|
|
517
|
+
const registered = pluginRegistry.getPluginPaneTemplateIds(pluginId)
|
|
518
|
+
.map((id) => ({ id, template: pluginRegistry.paneTemplates.get(id) }));
|
|
519
|
+
const listedPaneIds = new Set(registered.flatMap(({ template }) => template && template.listed !== false ? [template.paneId] : []));
|
|
520
|
+
const unlistedPaneIds = new Set(registered.flatMap(({ template }) => template?.listed === false && !listedPaneIds.has(template.paneId) ? [template.paneId] : []));
|
|
516
521
|
const panes = pluginRegistry.getPluginPaneIds(pluginId)
|
|
522
|
+
.filter((id) => !unlistedPaneIds.has(id))
|
|
517
523
|
.map((id) => ({ id, name: pluginRegistry.panes.get(id)?.name ?? id }));
|
|
518
|
-
const templates =
|
|
519
|
-
.
|
|
520
|
-
|
|
521
|
-
return { id, label: template?.label ?? id, ...(template?.shortcut?.prefix ? { prefix: template.shortcut.prefix } : {}) };
|
|
522
|
-
});
|
|
524
|
+
const templates = registered
|
|
525
|
+
.filter(({ template }) => template?.listed !== false)
|
|
526
|
+
.map(({ id, template }) => ({ id, label: template?.label ?? id, ...(template?.shortcut?.prefix ? { prefix: template.shortcut.prefix } : {}) }));
|
|
523
527
|
const commands = [...pluginRegistry.commands.entries()]
|
|
524
528
|
.filter(([id]) => pluginRegistry.getCommandPluginId(id) === pluginId && !id.endsWith(":setup"))
|
|
525
529
|
.map(([id, command]) => ({ id, label: command.label, ...(command.shortcut ? { shortcut: command.shortcut } : {}) }));
|
|
@@ -28,7 +28,6 @@ export interface AppBrokerImportRuntime {
|
|
|
28
28
|
interface BrokerImportOptions {
|
|
29
29
|
refreshImportedTickers?: boolean;
|
|
30
30
|
config?: AppConfig;
|
|
31
|
-
persistResolvedBrokerConfig?: boolean;
|
|
32
31
|
signal?: AbortSignal;
|
|
33
32
|
onCommitStart?: () => void;
|
|
34
33
|
onCommitEnd?: () => void;
|
|
@@ -122,7 +121,6 @@ export function useBrokerImportRuntime({
|
|
|
122
121
|
tickerRepository,
|
|
123
122
|
existingTickers: tickerMap ?? new Map(stateRef.current.tickers),
|
|
124
123
|
resources: pluginRegistry.persistence.resources,
|
|
125
|
-
persistResolvedBrokerConfig: options?.persistResolvedBrokerConfig,
|
|
126
124
|
signal: options?.signal,
|
|
127
125
|
deferPersistence: true,
|
|
128
126
|
});
|
|
@@ -10,6 +10,8 @@ import type { MarketDataCoordinator } from "../../market-data/coordinator";
|
|
|
10
10
|
import { instrumentFromTicker } from "../../market-data/request-types";
|
|
11
11
|
import type { PluginRegistry } from "../../plugins/registry";
|
|
12
12
|
import { saveConfigImmediately } from "../../state/config-save-scheduler";
|
|
13
|
+
import { persistTickerCleanup } from "../../state/ticker-cleanup";
|
|
14
|
+
import { hasPendingTickerWrites } from "../../data/ticker-writes";
|
|
13
15
|
import { settleWithin } from "../../utils/async-deadline";
|
|
14
16
|
import type { AppAction, AppState } from "../../state/app/context";
|
|
15
17
|
import type { AppConfig, BrokerInstanceConfig } from "../../types/config";
|
|
@@ -215,66 +217,81 @@ export function bindPluginRegistryRuntimeAccess({
|
|
|
215
217
|
else removedPortfolioIds.add(portfolio.id);
|
|
216
218
|
}
|
|
217
219
|
|
|
218
|
-
const
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
220
|
+
const removeProfile = (config: AppConfig): AppConfig => ({
|
|
221
|
+
...config,
|
|
222
|
+
brokerInstances: config.brokerInstances.filter((entry) => entry.id !== instanceId),
|
|
223
|
+
portfolios: config.portfolios.flatMap((portfolio) => {
|
|
224
|
+
if (removedPortfolioIds.has(portfolio.id)) return [];
|
|
225
|
+
const heirId = heirs.get(portfolio.id);
|
|
226
|
+
return [heirId ? { ...portfolio, brokerInstanceId: heirId } : portfolio];
|
|
227
|
+
}),
|
|
222
228
|
});
|
|
223
|
-
const nextTickers = new Map(stateRef.current.tickers);
|
|
224
|
-
const nextBrokerInstances = stateRef.current.config.brokerInstances.filter((entry) => entry.id !== instanceId);
|
|
225
|
-
// What older removals and pulls from other devices left behind goes as well.
|
|
226
|
-
const known = knownBrokerHoldings({ portfolios: nextPortfolios, brokerInstances: nextBrokerInstances });
|
|
227
229
|
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
metadata
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
230
|
+
const cleanTickers = () => persistTickerCleanup({
|
|
231
|
+
tickerRepository,
|
|
232
|
+
getTickers: () => stateRef.current.tickers,
|
|
233
|
+
transform: (ticker) => {
|
|
234
|
+
// A position without a profile came from another device's sync of this one.
|
|
235
|
+
const nextPositions = ticker.metadata.positions.filter((position) => position.brokerInstanceId !== instanceId
|
|
236
|
+
&& !(removedPortfolioIds.has(position.portfolio) && !position.brokerInstanceId));
|
|
237
|
+
const heldPortfolioIds = new Set(nextPositions.map((position) => position.portfolio));
|
|
238
|
+
const nextPortfolioRefs = ticker.metadata.portfolios.filter((portfolioId) =>
|
|
239
|
+
!removedPortfolioIds.has(portfolioId) && (!heirs.has(portfolioId) || heldPortfolioIds.has(portfolioId)));
|
|
240
|
+
const nextBrokerContracts = (ticker.metadata.broker_contracts ?? []).filter((contract) => contract.brokerInstanceId !== instanceId);
|
|
241
|
+
const changed = nextPositions.length !== ticker.metadata.positions.length
|
|
242
|
+
|| nextPortfolioRefs.length !== ticker.metadata.portfolios.length
|
|
243
|
+
|| nextBrokerContracts.length !== (ticker.metadata.broker_contracts ?? []).length;
|
|
244
|
+
const removedTicker: TickerRecord = changed ? {
|
|
245
|
+
...ticker,
|
|
246
|
+
metadata: {
|
|
247
|
+
...ticker.metadata,
|
|
248
|
+
positions: nextPositions,
|
|
249
|
+
portfolios: nextPortfolioRefs,
|
|
250
|
+
broker_contracts: nextBrokerContracts,
|
|
251
|
+
},
|
|
252
|
+
} : ticker;
|
|
253
|
+
// Also clear holdings left behind by older removals or pulls.
|
|
254
|
+
const known = knownBrokerHoldings(removeProfile(stateRef.current.config));
|
|
255
|
+
const nextTicker = clearLeftoverBrokerHoldings(removedTicker, known) ?? removedTicker;
|
|
256
|
+
if (nextTicker === ticker) return ticker;
|
|
257
|
+
const empty = nextTicker.metadata.positions.length === 0
|
|
258
|
+
&& nextTicker.metadata.portfolios.length === 0
|
|
259
|
+
&& nextTicker.metadata.watchlists.length === 0
|
|
260
|
+
&& (nextTicker.metadata.broker_contracts ?? []).length === 0
|
|
261
|
+
&& nextTicker.metadata.tags.length === 0
|
|
262
|
+
&& Object.keys(nextTicker.metadata.custom).length === 0;
|
|
263
|
+
return empty ? null : nextTicker;
|
|
264
|
+
},
|
|
265
|
+
publish: (symbol, ticker) => {
|
|
266
|
+
if (ticker) dispatch({ type: "UPDATE_TICKER", ticker });
|
|
267
|
+
else {
|
|
268
|
+
dispatch({ type: "REMOVE_TICKER", symbol });
|
|
269
|
+
pluginRegistry.events.emit("ticker:removed", { symbol });
|
|
270
|
+
}
|
|
271
|
+
},
|
|
272
|
+
});
|
|
255
273
|
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
}
|
|
274
|
+
// Keep the profile available for retry until cleanup and config both
|
|
275
|
+
// succeed. Rebase after callbacks and edits, including during config saves.
|
|
276
|
+
let savedRemoval = false;
|
|
277
|
+
for (;;) {
|
|
278
|
+
const cleaned = await cleanTickers().catch(async (error: unknown) => {
|
|
279
|
+
// A config acknowledgement can precede a late row write. If that
|
|
280
|
+
// cleanup fails, keep its removal intent durable for a restart too.
|
|
281
|
+
if (savedRemoval) await saveConfigImmediately(stateRef.current.config);
|
|
282
|
+
throw error;
|
|
283
|
+
});
|
|
284
|
+
if (hasPendingTickerWrites(tickerRepository) || stateRef.current.tickers !== cleaned) continue;
|
|
285
|
+
const source = stateRef.current.config;
|
|
286
|
+
const nextConfig = removeProfile(source);
|
|
287
|
+
await saveConfigImmediately(nextConfig);
|
|
288
|
+
savedRemoval = true;
|
|
289
|
+
if (stateRef.current.config !== source || stateRef.current.tickers !== cleaned
|
|
290
|
+
|| hasPendingTickerWrites(tickerRepository)) continue;
|
|
291
|
+
dispatch({ type: "SET_CONFIG", config: nextConfig });
|
|
292
|
+
pluginRegistry.events.emit("config:changed", { config: nextConfig });
|
|
293
|
+
break;
|
|
266
294
|
}
|
|
267
|
-
|
|
268
|
-
const nextConfig = {
|
|
269
|
-
...stateRef.current.config,
|
|
270
|
-
brokerInstances: nextBrokerInstances,
|
|
271
|
-
portfolios: nextPortfolios,
|
|
272
|
-
};
|
|
273
|
-
|
|
274
|
-
dispatch({ type: "SET_CONFIG", config: nextConfig });
|
|
275
|
-
dispatch({ type: "SET_TICKERS", tickers: nextTickers });
|
|
276
|
-
await saveConfigImmediately(nextConfig);
|
|
277
|
-
pluginRegistry.events.emit("config:changed", { config: nextConfig });
|
|
278
295
|
// The profile that kept a portfolio fills in what the removed one held there.
|
|
279
296
|
for (const heirId of new Set(heirs.values())) {
|
|
280
297
|
void importBrokerPositions(heirId).catch(logFailure("app.runtime.plugin-bindings", "Replacement broker positions import failed"));
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
"src/cli/commands/options-chain.ts": ["options","options-calculator"],
|
|
10
10
|
"src/cli/commands/options-leaps.ts": ["iv-history","options","vol-surface"],
|
|
11
11
|
"src/cli/commands/overview.ts": ["correlation","econ","market-movers","sectors","world-indices"],
|
|
12
|
-
"src/cli/commands/ticker.ts": ["notes"],
|
|
12
|
+
"src/cli/commands/ticker.ts": ["ipo-calendar","notes"],
|
|
13
13
|
"src/cli/desktop-pane-shot.ts": ["market-valuation","time-sales"],
|
|
14
14
|
"src/cli/pane-functions/data.ts": ["chart-composer","correlation","seasonality","ticker-detail"],
|
|
15
15
|
"src/cli/pane-functions/financial-ratio-shot.ts": ["ticker-detail"],
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
"src/components/layout/shell/index.tsx": ["cloud"],
|
|
28
28
|
"src/components/onboarding/use-onboarding-upgrade.ts": ["chat"],
|
|
29
29
|
"src/layout/desks.ts": ["chart-composer"],
|
|
30
|
-
"src/plugins/catalog-browser.ts": ["alerts","analytics","attention","awards","backtest","bond-calculator","catalysts","cds","central-bank-rates","changelog","chart-composer","clinical-trials","cloud","comment-letters","commodities-energy","commodity-balances","company-attention","company-kpis","connections","correlation","cot","cpi","credit-boards","credit-conditions","credit-documents","crypto-board","crypto-etf-flows","debt-maturities","dividend-yield","docs","doe","earnings","earnings-calls","earnings-ripple","econ","econ-statistics","equity-screener","estimate-revisions","executives","exposure","fear-greed","filing-events","fixed-income","futures","futures-curve","fx-matrix","gpu","help","holders","insider","ipo-calendar","iv-history","jobs","jodi","kelly-sizer","layout-manager","macro-day","market-halts","market-heatmap","market-valuation","members","mna","money-markets","news","openfda","options","options-calculator","options-positioning","options-scenario","pe-band","perps","portfolio-list","power","primary-dealers","rate-path","realized-vol","relative-rotation","research","research-search","revenue-breakdown","reverse-dcf","risk-factors","scanner","seasonality","sec","sectors","short-interest","short-volume","social-mentions","supply-chain","thirteenf","ticker-detail","time-sales","trace-bonds","treasury-auctions","treasury-daily","vol-surface","volatility","world-indices","world-venue-map","yield-curve"],
|
|
30
|
+
"src/plugins/catalog-browser.ts": ["alerts","analytics","attention","awards","backtest","bond-calculator","catalysts","cds","central-bank-rates","changelog","chart-composer","clinical-trials","cloud","comment-letters","commodities-energy","commodity-balances","company-attention","company-kpis","connections","correlation","cot","cpi","credit-boards","credit-conditions","credit-documents","crypto-board","crypto-etf-flows","debt-maturities","dividend-yield","docs","doe","earnings","earnings-calls","earnings-ripple","econ","econ-statistics","equity-screener","estimate-revisions","executives","exposure","fear-greed","filing-events","fixed-income","futures","futures-curve","fx-matrix","gpu","help","holders","insider","ipo-calendar","iv-history","jobs","jodi","kelly-sizer","layout-manager","macro-day","market-halts","market-heatmap","market-valuation","members","mna","money-markets","news","openfda","options","options-calculator","options-positioning","options-scenario","pe-band","perps","portfolio-list","power","primary-dealers","rate-path","realized-vol","relative-rotation","research","research-search","revenue-breakdown","reverse-dcf","risk-factors","roadmap","scanner","seasonality","sec","sectors","short-interest","short-volume","social-mentions","supply-chain","thirteenf","ticker-detail","time-sales","trace-bonds","treasury-auctions","treasury-daily","vol-surface","volatility","world-indices","world-venue-map","yield-curve"],
|
|
31
31
|
"src/plugins/catalog-ui.ts": ["alerts","clinical-trials","cloud","comment-letters","custom-view","fear-greed","ipo-calendar","market-halts","market-heatmap","members","news","notes","openfda","research-search"],
|
|
32
32
|
"src/plugins/catalog.ts": ["debug"],
|
|
33
33
|
"src/remote/controller.ts": ["custom-view"],
|