gloomberb 0.16.1 → 0.16.3
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 +2 -1
- package/package.json +2 -1
- package/src/api-client/beneficial-owners.ts +92 -0
- package/src/api-client/data.ts +26 -8
- package/src/api-client/errors.ts +12 -0
- package/src/api-client/geo.ts +363 -0
- package/src/api-client/index.ts +2 -0
- package/src/api-client/market-discovery.ts +10 -0
- package/src/api-client/paths.ts +30 -1
- package/src/api-client/perps.ts +37 -0
- package/src/api-client/request.ts +5 -2
- package/src/api-client/types.ts +2 -0
- package/src/brokers/account-cache.ts +69 -0
- package/src/cli/command-options.ts +74 -0
- package/src/cli/commands/command-utils.ts +37 -0
- package/src/cli/commands/crypto-hints.ts +75 -0
- package/src/cli/commands/market.ts +560 -136
- package/src/cli/commands/overview.ts +136 -48
- package/src/cli/commands/ticker.ts +220 -67
- package/src/cli/desktop-pane-shot.ts +37 -4
- package/src/cli/freshness.ts +61 -0
- package/src/cli/help.ts +27 -6
- package/src/cli/helpers.ts +4 -8
- package/src/cli/history-rows.ts +187 -15
- package/src/cli/index.ts +23 -8
- package/src/cli/listing-arg.ts +321 -0
- package/src/cli/options.ts +5 -1
- package/src/cli/pane-functions/access-gate.ts +42 -0
- package/src/cli/pane-functions/capabilities.ts +5 -0
- package/src/cli/pane-functions/catalog.ts +28 -1
- package/src/cli/pane-functions/data.ts +3 -1
- package/src/cli/pane-functions/dom.ts +87 -16
- package/src/cli/pane-functions/freshness.ts +400 -0
- package/src/cli/pane-functions/function-help.ts +31 -22
- package/src/cli/pane-functions/headless.ts +201 -41
- package/src/cli/pane-functions/index.ts +24 -6
- package/src/cli/pane-functions/options.ts +3 -0
- package/src/cli/pane-functions/report.ts +12 -1
- package/src/cli/pane-functions/resolver.ts +63 -9
- package/src/cli/pane-functions/screenshot-evidence.ts +2 -0
- package/src/cli/pane-functions/screenshot.ts +11 -3
- package/src/cli/registry.ts +6 -3
- package/src/cli/report-tables.ts +460 -0
- package/src/cli/result.ts +53 -29
- package/src/cli/ticker-resolution.ts +7 -5
- package/src/components/chart/composite/composite-chart.tsx +88 -2536
- package/src/components/chart/composite/drawing-store.ts +59 -0
- package/src/components/chart/composite/legend.tsx +319 -0
- package/src/components/chart/composite/panel-bitmap.ts +139 -0
- package/src/components/chart/composite/panel-gestures.ts +59 -0
- package/src/components/chart/composite/panel-labels.ts +107 -0
- package/src/components/chart/composite/panel-surface.tsx +876 -0
- package/src/components/chart/composite/tool-catalog.ts +98 -0
- package/src/components/chart/composite/toolbar.tsx +186 -0
- package/src/components/chart/composite/tools.ts +8 -0
- package/src/components/chart/composite/use-composite-chart-keyboard.ts +703 -0
- package/src/components/chart/composite/use-composite-viewport.ts +143 -0
- package/src/components/command-bar/list/model.ts +5 -0
- package/src/components/command-bar/list/view.tsx +16 -3
- package/src/components/command-bar/pane-templates/workflow.ts +1 -0
- package/src/components/command-bar/routes/ticker-search/actions.ts +5 -0
- package/src/components/command-bar/workflow/ops.ts +1 -1
- package/src/components/command-bar/workflow/tickers.ts +6 -0
- package/src/components/data-table/export.ts +6 -51
- package/src/components/data-table/view.tsx +32 -11
- package/src/components/feedback-dialog.tsx +2 -1
- package/src/components/form-modal/field-row.tsx +2 -2
- package/src/components/layout/detached-pane-shell.tsx +6 -3
- package/src/components/layout/pane/content.tsx +23 -10
- package/src/components/layout/pane/error-boundary.tsx +103 -0
- package/src/components/layout/pane/footer/registration.tsx +68 -23
- package/src/components/layout/pane/header.tsx +11 -11
- package/src/components/layout/shell/active-drag.ts +67 -35
- package/src/components/layout/shell/cursor-occlusion.ts +6 -5
- package/src/components/layout/shell/drag/index.ts +12 -7
- package/src/components/layout/shell/drag/live.ts +122 -0
- package/src/components/layout/shell/drag/overlays.tsx +179 -35
- package/src/components/layout/shell/drag/runtime.ts +62 -50
- package/src/components/layout/shell/drag/slide.ts +10 -0
- package/src/components/layout/shell/index.tsx +37 -51
- package/src/components/layout/shell/menu.ts +2 -1
- package/src/components/layout/shell/native/pointer-runtime.ts +13 -13
- package/src/components/layout/shell/native/surfaces.ts +30 -14
- package/src/components/layout/shell/pane/actions.ts +2 -1
- package/src/components/layout/shell/pane/layers.tsx +419 -168
- package/src/components/layout/shell/terminal-pointer-runtime.ts +18 -18
- package/src/components/layout/shell/window-mode/overlays.tsx +12 -4
- package/src/components/metric-treemap/heat-surface.tsx +43 -16
- package/src/components/metric-treemap/heat-tiles.ts +18 -0
- package/src/components/metric-treemap/layout.ts +2 -0
- package/src/components/onboarding/onboarding-keyboard.ts +311 -0
- package/src/components/onboarding/onboarding-wizard.tsx +101 -788
- package/src/components/onboarding/use-onboarding-broker-form.ts +263 -0
- package/src/components/onboarding/use-onboarding-progress.ts +298 -0
- package/src/components/onboarding/use-onboarding-upgrade.ts +83 -0
- package/src/components/ticker/list-table-view.tsx +13 -1
- package/src/components/ui/fields.tsx +8 -0
- package/src/components/ui/range-track.tsx +10 -3
- package/src/components/ui/status.tsx +8 -2
- package/src/components/ui/tabs.tsx +7 -4
- package/src/components/ui/text-prompt-dialog.tsx +4 -2
- package/src/data/config/store/normalize.ts +17 -1
- package/src/data/json-persistence.ts +17 -3
- package/src/data/json-storage.ts +2 -0
- package/src/data/memory-resource-store.ts +46 -0
- package/src/i18n/es.ts +19 -1
- package/src/i18n/ja.ts +19 -1
- package/src/i18n/ko.ts +19 -1
- package/src/i18n/zh-cn.ts +19 -1
- package/src/i18n/zh-tw.ts +19 -1
- package/src/market-data/coordinator/chart.ts +1 -1
- package/src/market-data/coordinator/quotes.ts +23 -4
- package/src/market-data/fx-closes.ts +72 -0
- package/src/market-data/market/freshness.ts +123 -6
- package/src/market-data/market/session-close-note.ts +57 -0
- package/src/market-data/market/status.ts +151 -0
- package/src/market-data/published-apac-sessions.ts +66 -0
- package/src/market-data/quotes/contributions.ts +2 -0
- package/src/market-data/quotes/freshness.ts +5 -0
- package/src/market-data/quotes/resolution.ts +2 -0
- package/src/market-data/quotes/screener-live-quotes.ts +49 -4
- package/src/plugins/builtin/account-management/pane.tsx +4 -0
- package/src/plugins/builtin/alerts/cli.ts +10 -5
- package/src/plugins/builtin/alerts/index.tsx +1 -0
- package/src/plugins/builtin/analytics/metrics.ts +8 -3
- package/src/plugins/builtin/analytics/pane-model.ts +10 -6
- package/src/plugins/builtin/analytics/risk-client.ts +191 -66
- package/src/plugins/builtin/analytics/risk-fx.ts +102 -0
- package/src/plugins/builtin/analytics/risk-headless.ts +19 -13
- package/src/plugins/builtin/analytics/risk-model.ts +45 -17
- package/src/plugins/builtin/analytics/risk-pane.tsx +1 -0
- package/src/plugins/builtin/analytics/risk-test-data.ts +25 -1
- package/src/plugins/builtin/attention/headless.ts +6 -4
- package/src/plugins/builtin/attention/index.tsx +1 -1
- package/src/plugins/builtin/attention/pane.tsx +2 -2
- package/src/plugins/builtin/awards/headless.ts +1 -0
- package/src/plugins/builtin/awards/pane.tsx +1 -1
- package/src/plugins/builtin/backtest/headless.ts +1 -0
- package/src/plugins/builtin/bond-calculator/headless.ts +1 -0
- package/src/plugins/builtin/buildout/index.tsx +1 -0
- package/src/plugins/builtin/catalysts/detail.tsx +1 -1
- package/src/plugins/builtin/catalysts/headless.ts +3 -1
- package/src/plugins/builtin/cds/headless.ts +2 -0
- package/src/plugins/builtin/central-bank-rates/headless.ts +1 -0
- package/src/plugins/builtin/chart-composer/headless.ts +38 -3
- package/src/plugins/builtin/chart-composer/index.tsx +3 -1
- package/src/plugins/builtin/chart-composer/series-expression.ts +18 -2
- package/src/plugins/builtin/chat/channels.ts +19 -3
- package/src/plugins/builtin/chat/content/composer-runtime.ts +28 -13
- package/src/plugins/builtin/chat/content/footer.tsx +15 -6
- package/src/plugins/builtin/chat/content/index.tsx +120 -21
- package/src/plugins/builtin/chat/content/new-dm-dialog.tsx +261 -113
- package/src/plugins/builtin/chat/content/transcript.tsx +20 -2
- package/src/plugins/builtin/chat/direct-messages.ts +200 -0
- package/src/plugins/builtin/chat/index.tsx +1 -0
- package/src/plugins/builtin/chat/message/desktop.tsx +3 -0
- package/src/plugins/builtin/chat/message/header.tsx +16 -6
- package/src/plugins/builtin/chat/message/inline-tokens.tsx +72 -32
- package/src/plugins/builtin/chat/message/profile-popover.tsx +96 -12
- package/src/plugins/builtin/chat/message/terminal.tsx +3 -0
- package/src/plugins/builtin/chat/message/types.ts +14 -2
- package/src/plugins/builtin/chat/profile-popover.ts +18 -13
- package/src/plugins/builtin/clinical-trials/index.tsx +1 -0
- package/src/plugins/builtin/cloud/askg/executor.ts +2 -1
- package/src/plugins/builtin/cloud/plugin.tsx +1 -0
- package/src/plugins/builtin/cloud/team/module.tsx +1 -0
- package/src/plugins/builtin/cloud/thesis/module.tsx +1 -0
- package/src/plugins/builtin/cloud-tweets/registration.ts +1 -0
- package/src/plugins/builtin/comment-letters/index.tsx +1 -0
- package/src/plugins/builtin/company-attention/headless.ts +5 -1
- package/src/plugins/builtin/company-attention/pane.tsx +2 -2
- package/src/plugins/builtin/company-kpis/headless.ts +1 -0
- package/src/plugins/builtin/congress-trades/headless.ts +1 -0
- package/src/plugins/builtin/correlation/compute.ts +59 -16
- package/src/plugins/builtin/correlation/geo.ts +34 -0
- package/src/plugins/builtin/correlation/headless-schema.ts +4 -1
- package/src/plugins/builtin/correlation/headless.ts +42 -8
- package/src/plugins/builtin/correlation/history.ts +2 -0
- package/src/plugins/builtin/correlation/index.tsx +68 -14
- package/src/plugins/builtin/correlation/matrix/model.ts +17 -2
- package/src/plugins/builtin/correlation/matrix/selection.ts +5 -3
- package/src/plugins/builtin/correlation/relationship/model.ts +1 -1
- package/src/plugins/builtin/correlation/relationship/pane.tsx +4 -2
- package/src/plugins/builtin/correlation/relationship/view-model.ts +16 -1
- package/src/plugins/builtin/correlation/settings.ts +1 -1
- package/src/plugins/builtin/cot/headless.ts +6 -3
- package/src/plugins/builtin/cot/index.tsx +3 -3
- package/src/plugins/builtin/cot/model.ts +36 -3
- package/src/plugins/builtin/cpi/headless.ts +4 -0
- package/src/plugins/builtin/credit-boards/headless.ts +2 -0
- package/src/plugins/builtin/credit-conditions/headless.ts +1 -0
- package/src/plugins/builtin/credit-documents/gauge.tsx +5 -8
- package/src/plugins/builtin/credit-documents/headless.ts +2 -0
- package/src/plugins/builtin/crypto-board/headless.ts +3 -0
- package/src/plugins/builtin/custom-view/loader.ts +1 -1
- package/src/plugins/builtin/debt-maturities/headless.ts +4 -0
- package/src/plugins/builtin/dividend-yield/headless.ts +1 -0
- package/src/plugins/builtin/doe/headless.ts +7 -0
- package/src/plugins/builtin/doe/range-bar.tsx +7 -37
- package/src/plugins/builtin/earnings/headless.ts +5 -0
- package/src/plugins/builtin/earnings-calls/headless.ts +1 -0
- package/src/plugins/builtin/earnings-ripple/client.ts +91 -18
- package/src/plugins/builtin/earnings-ripple/headless.ts +28 -8
- package/src/plugins/builtin/earnings-ripple/index.tsx +2 -2
- package/src/plugins/builtin/earnings-ripple/model.ts +97 -7
- package/src/plugins/builtin/earnings-ripple/pane.tsx +148 -23
- package/src/plugins/builtin/econ/index.tsx +1 -0
- package/src/plugins/builtin/econ-statistics/headless.ts +2 -0
- package/src/plugins/builtin/equity-screener/headless.ts +2 -0
- package/src/plugins/builtin/estimate-revisions/headless.ts +1 -0
- package/src/plugins/builtin/executives/index.tsx +1 -0
- package/src/plugins/builtin/exposure/headless.ts +3 -1
- package/src/plugins/builtin/fear-greed/headless.ts +2 -0
- package/src/plugins/builtin/filing-events/index.tsx +1 -0
- package/src/plugins/builtin/futures-curve/client.ts +12 -3
- package/src/plugins/builtin/futures-curve/headless.ts +39 -10
- package/src/plugins/builtin/futures-curve/index.tsx +3 -3
- package/src/plugins/builtin/futures-curve/model.ts +188 -4
- package/src/plugins/builtin/futures-curve/pane.tsx +51 -9
- package/src/plugins/builtin/gpu/headless.ts +7 -3
- package/src/plugins/builtin/gpu/ladder.tsx +26 -30
- package/src/plugins/builtin/gpu/model.ts +27 -1
- package/src/plugins/builtin/holders/beneficial-client.ts +209 -0
- package/src/plugins/builtin/holders/beneficial-model.ts +279 -0
- package/src/plugins/builtin/holders/beneficial-report.ts +126 -0
- package/src/plugins/builtin/holders/beneficial-view.tsx +241 -0
- package/src/plugins/builtin/holders/client.ts +3 -6
- package/src/plugins/builtin/holders/format.ts +31 -1
- package/src/plugins/builtin/holders/headless.ts +161 -6
- package/src/plugins/builtin/holders/index.tsx +10 -3
- package/src/plugins/builtin/holders/pane.tsx +42 -16
- package/src/plugins/builtin/holders/report-header.ts +136 -0
- package/src/plugins/builtin/holders/table-model.ts +20 -5
- package/src/plugins/builtin/holders/thirteenf-match.ts +29 -1
- package/src/plugins/builtin/holders/types.ts +2 -1
- package/src/plugins/builtin/insider/headless.ts +2 -0
- package/src/plugins/builtin/ipo-calendar/headless.ts +1 -0
- package/src/plugins/builtin/iv-history/headless.ts +4 -1
- package/src/plugins/builtin/jobs/headless.ts +1 -0
- package/src/plugins/builtin/kelly-sizer/index.tsx +1 -0
- package/src/plugins/builtin/kelly-sizer/pane.tsx +12 -6
- package/src/plugins/builtin/kelly-sizer/portfolio.ts +25 -0
- package/src/plugins/builtin/macro-day/headless.ts +2 -0
- package/src/plugins/builtin/market-halts/index.tsx +1 -0
- package/src/plugins/builtin/market-heatmap/data.ts +2 -0
- package/src/plugins/builtin/market-heatmap/headless.ts +135 -0
- package/src/plugins/builtin/market-heatmap/index.tsx +39 -46
- package/src/plugins/builtin/market-heatmap/model.ts +146 -0
- package/src/plugins/builtin/market-heatmap/portfolio.ts +23 -4
- package/src/plugins/builtin/market-movers/headless.ts +2 -0
- package/src/plugins/builtin/market-valuation/headless.ts +2 -0
- package/src/plugins/builtin/members/client.ts +20 -3
- package/src/plugins/builtin/members/headless.ts +5 -3
- package/src/plugins/builtin/members/model.ts +10 -2
- package/src/plugins/builtin/members/pane.tsx +23 -6
- package/src/plugins/builtin/mna/distress/headless.ts +1 -0
- package/src/plugins/builtin/mna/headless.ts +1 -0
- package/src/plugins/builtin/money-markets/headless.ts +1 -0
- package/src/plugins/builtin/news/headless.ts +2 -0
- package/src/plugins/builtin/news/wire/index.tsx +8 -1
- package/src/plugins/builtin/notes/cli.ts +14 -6
- package/src/plugins/builtin/notes/index.tsx +1 -0
- package/src/plugins/builtin/openfda/index.tsx +1 -0
- package/src/plugins/builtin/options-calculator/headless.ts +2 -0
- package/src/plugins/builtin/options-positioning/headless.ts +3 -0
- package/src/plugins/builtin/options-scenario/headless.ts +5 -0
- package/src/plugins/builtin/pe-band/client.ts +48 -3
- package/src/plugins/builtin/pe-band/headless.ts +25 -7
- package/src/plugins/builtin/pe-band/model.ts +92 -16
- package/src/plugins/builtin/pe-band/pane.tsx +33 -16
- package/src/plugins/builtin/perps/client.ts +50 -3
- package/src/plugins/builtin/perps/headless.ts +144 -16
- package/src/plugins/builtin/perps/index.tsx +6 -6
- package/src/plugins/builtin/perps/model.ts +189 -12
- package/src/plugins/builtin/perps/pane.tsx +249 -48
- package/src/plugins/builtin/portfolio-list/account-metrics.ts +16 -1
- package/src/plugins/builtin/portfolio-list/allocation.ts +248 -0
- package/src/plugins/builtin/portfolio-list/cached-account.ts +42 -0
- package/src/plugins/builtin/portfolio-list/cell-version.ts +19 -1
- package/src/plugins/builtin/portfolio-list/cli/portfolio-command.ts +328 -29
- package/src/plugins/builtin/portfolio-list/cli/render.ts +232 -39
- package/src/plugins/builtin/portfolio-list/cli/shared.ts +67 -2
- package/src/plugins/builtin/portfolio-list/cli/watchlist-command.ts +35 -31
- package/src/plugins/builtin/portfolio-list/column-values.ts +124 -47
- package/src/plugins/builtin/portfolio-list/headless.ts +100 -16
- package/src/plugins/builtin/portfolio-list/index.tsx +14 -3
- package/src/plugins/builtin/portfolio-list/live-valuation.ts +7 -5
- package/src/plugins/builtin/portfolio-list/mutations.ts +55 -1
- package/src/plugins/builtin/portfolio-list/pane/data.ts +6 -0
- package/src/plugins/builtin/portfolio-list/pane/index.tsx +53 -16
- package/src/plugins/builtin/portfolio-list/settings.ts +33 -2
- package/src/plugins/builtin/portfolio-list/summary/index.tsx +46 -5
- package/src/plugins/builtin/portfolio-list/summary/live-accounts.ts +11 -1
- package/src/plugins/builtin/portfolio-list/summary/totals.ts +26 -7
- package/src/plugins/builtin/power/headless.ts +3 -1
- package/src/plugins/builtin/rate-path/headless.ts +2 -0
- package/src/plugins/builtin/realized-vol/headless.ts +2 -0
- package/src/plugins/builtin/relative-rotation/headless.ts +2 -0
- package/src/plugins/builtin/research/analyst-headless.ts +3 -0
- package/src/plugins/builtin/research/events-headless.ts +2 -0
- package/src/plugins/builtin/research/headless.ts +2 -0
- package/src/plugins/builtin/research/index.tsx +1 -0
- package/src/plugins/builtin/research/relative-valuation-headless.ts +10 -5
- package/src/plugins/builtin/research/relative-valuation-model.ts +18 -6
- package/src/plugins/builtin/research/relative-valuation-pane.tsx +3 -3
- package/src/plugins/builtin/research-search/index.tsx +1 -0
- package/src/plugins/builtin/revenue-breakdown/headless.ts +2 -0
- package/src/plugins/builtin/reverse-dcf/headless.ts +2 -0
- package/src/plugins/builtin/reverse-dcf/model.ts +2 -1
- package/src/plugins/builtin/risk-factors/headless.ts +2 -0
- package/src/plugins/builtin/scanner/flow-history.ts +2 -13
- package/src/plugins/builtin/scanner/headless.ts +14 -0
- package/src/plugins/builtin/seasonality/headless.ts +2 -0
- package/src/plugins/builtin/sec/command-bar-search.ts +14 -4
- package/src/plugins/builtin/sec/filing-content.ts +42 -17
- package/src/plugins/builtin/sec/forms.ts +12 -0
- package/src/plugins/builtin/sec/headless.ts +2 -0
- package/src/plugins/builtin/sectors/client.ts +1 -0
- package/src/plugins/builtin/sectors/headless.ts +9 -1
- package/src/plugins/builtin/sectors/sector-model.ts +2 -0
- package/src/plugins/builtin/shared/crypto-pair.ts +14 -0
- package/src/plugins/builtin/shared/locked-rows.tsx +1 -1
- package/src/plugins/builtin/shared/members-menu.tsx +260 -0
- package/src/plugins/builtin/shared/report-freshness.ts +57 -0
- package/src/plugins/builtin/shared/research-cells.tsx +4 -9
- package/src/plugins/builtin/short-interest/headless.ts +2 -0
- package/src/plugins/builtin/short-interest/watch-headless.ts +1 -0
- package/src/plugins/builtin/short-volume/headless.ts +1 -0
- package/src/plugins/builtin/short-volume/pane.tsx +1 -1
- package/src/plugins/builtin/social-mentions/headless.ts +1 -0
- package/src/plugins/builtin/social-mentions/pane.tsx +1 -1
- package/src/plugins/builtin/supply-chain/headless.ts +7 -1
- package/src/plugins/builtin/supply-chain/index.tsx +10 -1
- package/src/plugins/builtin/supply-chain/model.ts +27 -2
- package/src/plugins/builtin/supply-chain/pane.tsx +71 -32
- package/src/plugins/builtin/themes/headless.ts +3 -0
- package/src/plugins/builtin/themes/pane.tsx +3 -0
- package/src/plugins/builtin/thirteenf/headless.ts +110 -25
- package/src/plugins/builtin/thirteenf/report-notes.ts +149 -0
- package/src/plugins/builtin/ticker-detail/financials/aggregation.ts +4 -0
- package/src/plugins/builtin/ticker-detail/financials/model.ts +25 -2
- package/src/plugins/builtin/ticker-detail/headless.ts +27 -5
- package/src/plugins/builtin/ticker-detail/index.tsx +1 -0
- package/src/plugins/builtin/ticker-detail/overview/model.ts +17 -5
- package/src/plugins/builtin/ticker-detail/overview-tab.tsx +27 -26
- package/src/plugins/builtin/time-sales/headless.ts +5 -1
- package/src/plugins/builtin/treasury-auctions/headless.ts +1 -0
- package/src/plugins/builtin/volatility/headless.ts +6 -1
- package/src/plugins/builtin/world-indices/headless.ts +2 -0
- package/src/plugins/builtin/world-venue-map/basemap-layer.tsx +159 -0
- package/src/plugins/builtin/world-venue-map/basemap.ts +232 -0
- package/src/plugins/builtin/world-venue-map/client.ts +45 -0
- package/src/plugins/builtin/world-venue-map/country-labels.ts +78 -0
- package/src/plugins/builtin/world-venue-map/entity-detail.tsx +147 -0
- package/src/plugins/builtin/world-venue-map/entity-table.ts +59 -0
- package/src/plugins/builtin/world-venue-map/evidence.ts +77 -0
- package/src/plugins/builtin/world-venue-map/feed.ts +293 -0
- package/src/plugins/builtin/world-venue-map/geo-draw.tsx +248 -0
- package/src/plugins/builtin/world-venue-map/geo-series.ts +142 -0
- package/src/plugins/builtin/world-venue-map/geo-svg.tsx +448 -0
- package/src/plugins/builtin/world-venue-map/headless.ts +146 -0
- package/src/plugins/builtin/world-venue-map/ids.ts +1 -0
- package/src/plugins/builtin/world-venue-map/index.ts +69 -6
- package/src/plugins/builtin/world-venue-map/layered-pane.tsx +565 -0
- package/src/plugins/builtin/world-venue-map/layers.ts +406 -0
- package/src/plugins/builtin/world-venue-map/map-symbols.ts +220 -0
- package/src/plugins/builtin/world-venue-map/map.tsx +557 -85
- package/src/plugins/builtin/world-venue-map/model.ts +23 -4
- package/src/plugins/builtin/world-venue-map/natural-earth/index.chunk.ts +202 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/labels.chunk.ts +244 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e000n00.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e000n15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e000n30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e000n45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e000n60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e000n75.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e000s15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e000s30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e000s60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e015n00.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e015n15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e015n30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e015n45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e015n60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e015n75.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e015s15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e015s30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e015s45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e030n00.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e030n15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e030n30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e030n45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e030n60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e030n75.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e030s15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e030s30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e030s45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e030s60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e045n00.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e045n15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e045n30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e045n45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e045n60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e045n75.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e045s15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e045s30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e045s60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e060n00.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e060n15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e060n30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e060n45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e060n60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e060n75.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e060s15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e060s30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e060s60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e075n00.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e075n15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e075n30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e075n45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e075n60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e075n75.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e075s45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e090n00.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e090n15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e090n30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e090n45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e090n60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e090n75.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e090s15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e105n00.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e105n15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e105n30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e105n45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e105n60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e105n75.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e105s15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e105s30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e105s45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e120n00.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e120n15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e120n30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e120n45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e120n60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e120s15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e120s30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e120s45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e135n00.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e135n15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e135n30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e135n45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e135n60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e135n75.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e135s15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e135s30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e135s45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e150n00.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e150n15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e150n45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e150n60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e150n75.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e150s15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e150s30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e150s45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e150s60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e165n00.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e165n15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e165n45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e165n60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e165s15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e165s30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e165s45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e165s60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w015n00.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w015n15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w015n30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w015n45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w015n60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w015n75.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w015s15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w015s30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w015s45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w030n00.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w030n15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w030n30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w030n60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w030n75.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w030s30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w030s60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w045n30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w045n45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w045n60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w045n75.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w045s15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w045s30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w045s60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w060n00.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w060n30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w060n45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w060n60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w060n75.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w060s15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w060s30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w060s45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w060s60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w075n00.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w075n15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w075n30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w075n45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w075n60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w075n75.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w075s15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w075s30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w075s45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w075s60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w090n00.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w090n15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w090n30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w090n45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w090n60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w090n75.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w090s15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w090s30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w090s45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w090s60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w105n00.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w105n15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w105n30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w105n45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w105n60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w105n75.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w105s15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w120n00.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w120n15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w120n30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w120n45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w120n60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w120n75.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w120s30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w135n30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w135n45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w135n60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w135n75.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w135s30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w150n45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w150n60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w150s15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w150s30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w165n00.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w165n15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w165n45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w165n60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w165s15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w165s30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w180n00.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w180n15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w180n45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w180n60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w180s15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w180s30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w180s45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/world-50m.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/pane.tsx +35 -44
- package/src/plugins/builtin/world-venue-map/use-geo.ts +55 -0
- package/src/plugins/builtin/world-venue-map/venue-header.tsx +32 -0
- package/src/plugins/builtin/yield-curve/headless.ts +16 -0
- package/src/plugins/loader.ts +13 -1
- package/src/plugins/registry/pane-settings.ts +1 -0
- package/src/renderers/browser/app-services.ts +3 -1
- package/src/renderers/dom/build-assets.ts +81 -3
- package/src/renderers/dom/data-table/dom.ts +31 -0
- package/src/renderers/dom/data-table/index.tsx +5 -0
- package/src/renderers/dom/data-table/row.tsx +2 -0
- package/src/renderers/dom/desktop/controls.tsx +7 -3
- package/src/renderers/dom/desktop/list-view.tsx +35 -10
- package/src/renderers/dom/desktop/popover.tsx +73 -14
- package/src/renderers/dom/host/box.tsx +113 -17
- package/src/renderers/dom/host/drag-shield.ts +24 -0
- package/src/renderers/dom/host/input.tsx +14 -3
- package/src/renderers/dom/host/live-frame.ts +54 -0
- package/src/renderers/dom/host/mouse.ts +8 -1
- package/src/renderers/dom/host/scroll-box.tsx +6 -5
- package/src/renderers/dom/host/tabs.tsx +3 -2
- package/src/renderers/dom/styles.css +16 -9
- package/src/renderers/electrobun/bun/desktop/backend-requests.ts +7 -0
- package/src/renderers/electrobun/bun/desktop/backend.ts +2 -0
- package/src/renderers/electrobun/bun/desktop/initialization.ts +13 -0
- package/src/renderers/electrobun/shared/protocol.ts +10 -1
- package/src/renderers/electrobun/view/backend-rpc.ts +10 -4
- package/src/renderers/electrobun/view/cli-pane-shot-entry.tsx +4 -0
- package/src/renderers/electrobun/view/host/native.ts +0 -10
- package/src/renderers/electrobun/view/host/window-move.ts +28 -0
- package/src/renderers/electrobun/view/remote/persistence.ts +15 -2
- package/src/renderers/electrobun/view/rpc-timeout.ts +14 -3
- package/src/renderers/electrobun/view/ui-host.tsx +2 -5
- package/src/renderers/opentui/host.tsx +5 -0
- package/src/renderers/opentui/ui-host.tsx +7 -1
- package/src/sources/gloomberb-cloud/index.ts +25 -4
- package/src/sources/gloomberb-cloud/normalizers.ts +43 -23
- package/src/sources/provider-router/batches.ts +3 -3
- package/src/sources/provider-router/cached-routes.ts +4 -1
- package/src/sources/provider-router/financial-routes.ts +2 -2
- package/src/sources/provider-router/financials.ts +76 -12
- package/src/sources/provider-router/history.ts +15 -10
- package/src/sources/provider-router/primary.ts +2 -2
- package/src/sources/sec-registrant.ts +75 -0
- package/src/state/app/context/index.tsx +24 -8
- package/src/state/hooks/quote-streaming.ts +41 -26
- package/src/state/pane-scroll-registry.tsx +67 -35
- package/src/sync/core-contributors.ts +4 -0
- package/src/telemetry/crash-reports.ts +4 -1
- package/src/test-support/cli-context.ts +10 -2
- package/src/test-support/margin-account.ts +108 -0
- package/src/theme/heat-colors.ts +266 -84
- package/src/time-series/resolution.ts +15 -0
- package/src/time-series/resolve.ts +1 -1
- package/src/time-series/use-chart-resolution.ts +1 -1
- package/src/types/context-menu.ts +6 -0
- package/src/types/data-provider.ts +2 -0
- package/src/types/financials.ts +35 -3
- package/src/types/headless.ts +79 -2
- package/src/types/plugin.ts +20 -1
- package/src/types/ticker.ts +15 -0
- package/src/ui/host.tsx +26 -0
- package/src/ui/index.tsx +8 -3
- package/src/ui/scroll-box-axis.ts +26 -0
- package/src/updater/index.ts +9 -11
- package/src/utils/async-deadline.ts +21 -0
- package/src/utils/cli-output.ts +5 -1
- package/src/utils/crypto-pair.ts +41 -0
- package/src/utils/currency-units.ts +19 -0
- package/src/utils/depositary-receipt.ts +70 -0
- package/src/utils/display-number.ts +63 -0
- package/src/utils/exchanges.ts +72 -0
- package/src/utils/fire-and-forget.ts +24 -0
- package/src/utils/format.ts +13 -0
- package/src/utils/fundamentals.ts +17 -1
- package/src/utils/price-earnings.ts +70 -3
- package/src/utils/price-history-integrity.ts +19 -6
- package/src/utils/price-history.ts +58 -13
- package/src/utils/rpc-timeout-error.ts +27 -0
- package/src/utils/sec.ts +13 -1
- package/src/utils/utc-time.ts +79 -0
|
@@ -26,25 +26,31 @@ import {
|
|
|
26
26
|
formatMaybePercent,
|
|
27
27
|
formatMoneyCompact,
|
|
28
28
|
formatSignedCompact,
|
|
29
|
+
holderStakeMarketCap,
|
|
30
|
+
holderValueCurrency,
|
|
29
31
|
resolveHolderOwnershipPercent,
|
|
30
32
|
} from "./format";
|
|
33
|
+
import { holderShareBasisMarker } from "./report-header";
|
|
31
34
|
import {
|
|
32
35
|
buildColumns,
|
|
36
|
+
hasHolderChanges,
|
|
33
37
|
buildRows,
|
|
34
38
|
DEFAULT_SORT,
|
|
39
|
+
nextViewMode,
|
|
35
40
|
sortRows,
|
|
36
41
|
VIEW_TABS,
|
|
37
42
|
} from "./table-model";
|
|
38
43
|
import { loadHolderData } from "./client";
|
|
39
44
|
import { HoldersTreemap } from "./treemap";
|
|
45
|
+
import { BeneficialOwnersView } from "./beneficial-view";
|
|
40
46
|
import type { HolderColumn, HolderColumnId, HolderRow, SortPreference, ViewMode } from "./types";
|
|
41
47
|
import { loadHolder13FMatches, type Holder13FMatch } from "./thirteenf-match";
|
|
42
48
|
import { useSampledValue, useTickerQuoteStream } from "../../../state/hooks/live-ticker-financials";
|
|
43
49
|
|
|
44
50
|
const HOLDER_MARKET_CAP_SAMPLE_MS = 5_000;
|
|
45
51
|
|
|
46
|
-
/** The "13F"
|
|
47
|
-
const
|
|
52
|
+
/** The width of a three-letter badge ("13F", "ADR"): the label and its padding. */
|
|
53
|
+
const BADGE_WIDTH = 5;
|
|
48
54
|
|
|
49
55
|
export function HoldersView({ focused, width, height }: { focused: boolean; width: number; height: number }) {
|
|
50
56
|
const { nativePaneChrome } = useUiCapabilities();
|
|
@@ -67,17 +73,20 @@ export function HoldersView({ focused, width, height }: { focused: boolean; widt
|
|
|
67
73
|
// refresh keeps the last holders; the failure goes to the footer.
|
|
68
74
|
const { data, loading, error, reload } = useAsyncResource<HolderData>(loadHolders, { keepPreviousData: true });
|
|
69
75
|
|
|
70
|
-
|
|
76
|
+
// The values' own currency: dollars from the 13F filings on a London line, not its pence.
|
|
77
|
+
const currency = holderValueCurrency(data, ticker?.metadata.currency || "USD")!;
|
|
71
78
|
// A stake without a reported percentage is the holding's value over the
|
|
72
|
-
// market cap. The stream keeps the cap
|
|
73
|
-
// stakes follow it at most every few
|
|
79
|
+
// market cap, when both are in one currency. The stream keeps the cap
|
|
80
|
+
// current, about once a second; the stakes follow it at most every few
|
|
81
|
+
// seconds so ticks do not re-sort them.
|
|
74
82
|
useTickerQuoteStream(ticker ? symbol : null, ticker, { surface: "detail", visible: false, weight: 30 });
|
|
75
|
-
const
|
|
76
|
-
const liveMarketCap = financials?.quote?.currency && financials.quote.currency !== currency ? undefined : quoteMarketCap;
|
|
83
|
+
const liveMarketCap = holderStakeMarketCap(financials?.quote?.marketCap, financials?.quote?.currency, currency);
|
|
77
84
|
const marketCap = useSampledValue(liveMarketCap, HOLDER_MARKET_CAP_SAMPLE_MS, `${symbol ?? ""}:${currency}`);
|
|
78
85
|
const rows = useMemo(() => buildRows(data), [data]);
|
|
79
86
|
const sortedRows = useMemo(() => sortRows(rows, sortPreference, marketCap), [marketCap, rows, sortPreference]);
|
|
80
|
-
|
|
87
|
+
// Change columns only when the source reports a change; otherwise they read "-" on every row.
|
|
88
|
+
const showChange = useMemo(() => hasHolderChanges(rows), [rows]);
|
|
89
|
+
const columns = useMemo(() => buildColumns(width, showChange), [showChange, width]);
|
|
81
90
|
const selectedIdx = selectedId
|
|
82
91
|
? sortedRows.findIndex((row) => row.id === selectedId)
|
|
83
92
|
: -1;
|
|
@@ -145,7 +154,7 @@ export function HoldersView({ focused, width, height }: { focused: boolean; widt
|
|
|
145
154
|
}, [setSortPreference]);
|
|
146
155
|
|
|
147
156
|
const toggleView = useCallback(() => {
|
|
148
|
-
setViewMode(
|
|
157
|
+
setViewMode(nextViewMode);
|
|
149
158
|
}, [setViewMode]);
|
|
150
159
|
|
|
151
160
|
const refresh = useCallback(() => {
|
|
@@ -211,17 +220,22 @@ export function HoldersView({ focused, width, height }: { focused: boolean; widt
|
|
|
211
220
|
switch (column.id) {
|
|
212
221
|
case "holder": {
|
|
213
222
|
const color = rowState.selected ? colors.selectedText : colors.textBright;
|
|
214
|
-
|
|
215
|
-
//
|
|
216
|
-
|
|
223
|
+
// ADR: a position held as receipts on a home line's list. 13F: a fund
|
|
224
|
+
// whose filing opens on Enter or o.
|
|
225
|
+
const receipts = holderShareBasisMarker(row);
|
|
226
|
+
const fund = fundMatches.has(row.id);
|
|
227
|
+
if (!receipts && !fund) return { text: row.name, color, attributes: TextAttributes.BOLD };
|
|
228
|
+
const badges = (receipts ? 1 : 0) + (fund ? 1 : 0);
|
|
229
|
+
// The name gives way first, so the markers survive a narrow column.
|
|
217
230
|
return {
|
|
218
|
-
text:
|
|
231
|
+
text: [row.name, receipts, fund ? "13F" : ""].filter(Boolean).join(" "),
|
|
219
232
|
content: (
|
|
220
233
|
<Box flexDirection="row" gap={1} width={column.width} overflow="hidden">
|
|
221
234
|
<Text fg={color} attributes={TextAttributes.BOLD}>
|
|
222
|
-
{clipToDisplayWidth(row.name, Math.max(1, column.width -
|
|
235
|
+
{clipToDisplayWidth(row.name, Math.max(1, column.width - badges * (BADGE_WIDTH + 1)))}
|
|
223
236
|
</Text>
|
|
224
|
-
<Badge label=
|
|
237
|
+
{receipts ? <Badge label={receipts} /> : null}
|
|
238
|
+
{fund ? <Badge label="13F" tone="accent" /> : null}
|
|
225
239
|
</Box>
|
|
226
240
|
),
|
|
227
241
|
};
|
|
@@ -250,7 +264,9 @@ export function HoldersView({ focused, width, height }: { focused: boolean; widt
|
|
|
250
264
|
}
|
|
251
265
|
}, [currency, fundMatches, marketCap]);
|
|
252
266
|
|
|
267
|
+
// The 13D/G tab registers its own footer.
|
|
253
268
|
usePaneFooter("holders", () => {
|
|
269
|
+
if (viewMode === "13dg") return null;
|
|
254
270
|
return {
|
|
255
271
|
info: [
|
|
256
272
|
...(data?.asOf ? [{ id: "as-of", parts: [{ text: data.asOf, tone: "value" as const }] }] : []),
|
|
@@ -264,7 +280,7 @@ export function HoldersView({ focused, width, height }: { focused: boolean; widt
|
|
|
264
280
|
...(selectedFundMatch ? [{ id: "fund", key: "o", label: "pen 13F", onPress: () => openFundDetail(selectedRow) }] : []),
|
|
265
281
|
],
|
|
266
282
|
};
|
|
267
|
-
}, [data, error, fundMatching, loading, openFundDetail, selectedFundMatch, selectedRow]);
|
|
283
|
+
}, [data, error, fundMatching, loading, openFundDetail, selectedFundMatch, selectedRow, viewMode]);
|
|
268
284
|
|
|
269
285
|
const selectView = useCallback((value: string) => setViewMode(value as ViewMode), [setViewMode]);
|
|
270
286
|
// As a research tab, h/l move between research tabs; `s` switches the view.
|
|
@@ -316,6 +332,16 @@ export function HoldersView({ focused, width, height }: { focused: boolean; widt
|
|
|
316
332
|
selectedTextOverridesCellColor
|
|
317
333
|
emptyStateTitle={statusTitle ?? "No holders available"}
|
|
318
334
|
/>
|
|
335
|
+
) : viewMode === "13dg" ? (
|
|
336
|
+
<BeneficialOwnersView
|
|
337
|
+
focused={focused}
|
|
338
|
+
width={width}
|
|
339
|
+
symbol={symbol ?? null}
|
|
340
|
+
holderRows={rows}
|
|
341
|
+
fundMatches={fundMatches}
|
|
342
|
+
onCycleView={toggleView}
|
|
343
|
+
onRefreshHolders={refresh}
|
|
344
|
+
/>
|
|
319
345
|
) : (
|
|
320
346
|
<HoldersTreemap
|
|
321
347
|
rows={sortedRows}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import type { HolderData } from "../../../types/financials";
|
|
2
|
+
import { currencyUnitLabel, resolveCurrencyUnit } from "../../../utils/currency-units";
|
|
3
|
+
import { adrRatioText } from "../../../utils/depositary-receipt";
|
|
4
|
+
import { canonicalExchange, isUsListingExchange, resolveExchangeTimeZone } from "../../../utils/exchanges";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* The lines above a holder table in text reports (`holders`, `insider`,
|
|
8
|
+
* `13f`, `fn HDS`): which listing, in which unit, and how much of the list
|
|
9
|
+
* is shown. Holder lists come as the source's own top holders, usually
|
|
10
|
+
* without a total, so the count says that rather than implying a full list.
|
|
11
|
+
*/
|
|
12
|
+
export interface HolderReportFacts {
|
|
13
|
+
name?: string | null;
|
|
14
|
+
/** Left out when the report title already names it. */
|
|
15
|
+
symbol?: string | null;
|
|
16
|
+
exchange?: string | null;
|
|
17
|
+
/** The unit the values are in. */
|
|
18
|
+
currency?: string | null;
|
|
19
|
+
/** The listing's price currency, when the values are in another one. */
|
|
20
|
+
listingCurrency?: string | null;
|
|
21
|
+
/** Left out when the report's closing line already carries it. */
|
|
22
|
+
asOf?: string | null;
|
|
23
|
+
/** Rows printed. */
|
|
24
|
+
shown: number;
|
|
25
|
+
/** Rows the source returned, before any limit. */
|
|
26
|
+
reported: number;
|
|
27
|
+
/** Every holder the source counts, when it says so. */
|
|
28
|
+
total?: number | null;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/** "Value (GBp)": a money column names its unit. */
|
|
32
|
+
export function moneyColumnHeader(label: string, currency?: string | null): string {
|
|
33
|
+
const unit = currency?.trim();
|
|
34
|
+
return unit ? `${label} (${unit})` : label;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function holderCountText(shown: number, reported: number, total?: number | null): string {
|
|
38
|
+
if (total != null && Number.isFinite(total) && total >= reported) {
|
|
39
|
+
return `${shown.toLocaleString("en-US")} of ${total.toLocaleString("en-US")} holders`;
|
|
40
|
+
}
|
|
41
|
+
if (reported === 0) return "none reported";
|
|
42
|
+
// Without a total the source's list is its largest holders, cut where it cuts it.
|
|
43
|
+
return shown < reported ? `${shown} of top ${reported} reported` : `top ${reported} reported`;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/** A venue the app knows by its short name (NasdaqGS is NASDAQ); any other as the source wrote it. */
|
|
47
|
+
function venueLabel(exchange?: string | null): string {
|
|
48
|
+
const canonical = canonicalExchange(exchange ?? "");
|
|
49
|
+
return resolveExchangeTimeZone(canonical) ? canonical : (exchange ?? "").trim();
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/** What the list is, after the listing is named: its unit, date and how much of it is shown. */
|
|
53
|
+
export function holderListFacts(
|
|
54
|
+
facts: Pick<HolderReportFacts, "currency" | "listingCurrency" | "asOf" | "shown" | "reported" | "total">,
|
|
55
|
+
): string[] {
|
|
56
|
+
const unit = currencyUnitLabel(facts.currency);
|
|
57
|
+
// Dollars on a London line: say they are the values' unit, not the listing's.
|
|
58
|
+
const otherUnit = unit && facts.listingCurrency?.trim() && facts.listingCurrency.trim() !== facts.currency?.trim();
|
|
59
|
+
return [
|
|
60
|
+
otherUnit ? `values in ${unit}` : unit,
|
|
61
|
+
facts.asOf ? `as of ${facts.asOf}` : "",
|
|
62
|
+
holderCountText(facts.shown, facts.reported, facts.total),
|
|
63
|
+
].filter(Boolean);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export function holdersHeaderLine(facts: HolderReportFacts): string {
|
|
67
|
+
const name = facts.name?.trim();
|
|
68
|
+
const symbol = facts.symbol?.trim();
|
|
69
|
+
const identity = name && symbol && name !== symbol ? `${name} (${symbol})` : name || symbol || "";
|
|
70
|
+
return [identity, venueLabel(facts.exchange), ...holderListFacts(facts)].filter(Boolean).join(" | ");
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/** The one report date every row shares, or null when they differ or none has one. */
|
|
74
|
+
export function sharedReportDate(rows: ReadonlyArray<{ reportDate?: unknown }>): string | null {
|
|
75
|
+
const dates = new Set(rows.map((row) => (typeof row.reportDate === "string" ? row.reportDate : "")));
|
|
76
|
+
const [only] = dates;
|
|
77
|
+
return dates.size === 1 && only ? only : null;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* How a holder value was reached: reported shares times the latest price, or,
|
|
82
|
+
* where Gloom Cloud priced the filings themselves, times the security's price
|
|
83
|
+
* at the report date in the values' currency.
|
|
84
|
+
*/
|
|
85
|
+
export function holderValueBasis(
|
|
86
|
+
reportDate: string | null,
|
|
87
|
+
basis?: HolderData["valueBasis"] | null,
|
|
88
|
+
valueCurrency?: string | null,
|
|
89
|
+
): string {
|
|
90
|
+
const shares = `shares reported${reportDate ? ` at ${reportDate}` : ""}`;
|
|
91
|
+
if (basis === "period_end_price") {
|
|
92
|
+
const unit = valueCurrency?.trim();
|
|
93
|
+
return `${shares} x period-end price${unit ? ` (${unit})` : ""}`;
|
|
94
|
+
}
|
|
95
|
+
return `${shares} x latest price`;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/** The short marker a holder row carries when its position is held as depositary receipts. */
|
|
99
|
+
export function holderShareBasisMarker(row: { shareBasis?: unknown }): string {
|
|
100
|
+
return row.shareBasis === "depositary_receipt" ? "ADR" : "";
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* What the share counts are, when Gloom Cloud says: which rows of a home
|
|
105
|
+
* line are positions in the receipts, or that a receipt line's rows all are.
|
|
106
|
+
*/
|
|
107
|
+
export function holderShareBasisNote(
|
|
108
|
+
data: Pick<HolderData, "shareBasis" | "adrRatio">,
|
|
109
|
+
rows: ReadonlyArray<{ shareBasis?: unknown }>,
|
|
110
|
+
): string | null {
|
|
111
|
+
const ratio = adrRatioText(data.adrRatio);
|
|
112
|
+
const each = ratio ? ` (${ratio})` : "";
|
|
113
|
+
if (rows.some((row) => holderShareBasisMarker(row))) return `ADR: shares held as depositary receipts${each}.`;
|
|
114
|
+
if (rows.length > 0 && data.shareBasis === "depositary_receipt") return `Shares are depositary receipts${each}.`;
|
|
115
|
+
return null;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/** A listing outside the US, by its venue, or by a currency other than the dollar. */
|
|
119
|
+
function isNonUsHolderListing(exchange?: string | null, currency?: string | null): boolean {
|
|
120
|
+
const venue = canonicalExchange(exchange ?? "");
|
|
121
|
+
if (venue && !isUsListingExchange(venue) && resolveExchangeTimeZone(venue)) return true;
|
|
122
|
+
const unit = resolveCurrencyUnit(currency).currency;
|
|
123
|
+
return unit !== "" && unit !== "USD";
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Holder lists are institutions' quarterly filings, mostly US 13F. On a
|
|
128
|
+
* listing outside the US they are not that market's share register, which a
|
|
129
|
+
* reader would otherwise assume.
|
|
130
|
+
*/
|
|
131
|
+
export function nonUsHolderCaveat(exchange?: string | null, currency?: string | null): string | null {
|
|
132
|
+
if (!isNonUsHolderListing(exchange, currency)) return null;
|
|
133
|
+
const canonical = canonicalExchange(exchange ?? "");
|
|
134
|
+
const venue = resolveExchangeTimeZone(canonical) ? canonical : "local";
|
|
135
|
+
return `Positions come from institutional filings (mostly US 13F), not the ${venue} share register.`;
|
|
136
|
+
}
|
|
@@ -11,8 +11,15 @@ export const DEFAULT_SORT: SortPreference = {
|
|
|
11
11
|
export const VIEW_TABS: Array<{ label: string; value: ViewMode }> = [
|
|
12
12
|
{ label: "Table", value: "table" },
|
|
13
13
|
{ label: "Chart", value: "chart" },
|
|
14
|
+
{ label: "13D/G", value: "13dg" },
|
|
14
15
|
];
|
|
15
16
|
|
|
17
|
+
/** `s` steps through the views in tab order. */
|
|
18
|
+
export function nextViewMode(current: ViewMode): ViewMode {
|
|
19
|
+
const index = VIEW_TABS.findIndex((tab) => tab.value === current);
|
|
20
|
+
return VIEW_TABS[(index + 1) % VIEW_TABS.length]!.value;
|
|
21
|
+
}
|
|
22
|
+
|
|
16
23
|
export function buildRows(data: HolderData | null): HolderRow[] {
|
|
17
24
|
return (data?.holders ?? []).map((holder, index) => ({
|
|
18
25
|
...holder,
|
|
@@ -20,23 +27,31 @@ export function buildRows(data: HolderData | null): HolderRow[] {
|
|
|
20
27
|
}));
|
|
21
28
|
}
|
|
22
29
|
|
|
23
|
-
|
|
30
|
+
/** Whether any holder carries the quarter's change; many sources report none. */
|
|
31
|
+
export function hasHolderChanges(rows: readonly HolderRow[]): boolean {
|
|
32
|
+
return rows.some((row) => row.changeShares != null || row.changePercent != null);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export function buildColumns(width: number, showChange: boolean): HolderColumn[] {
|
|
24
36
|
const valueWidth = 10;
|
|
25
37
|
const sharesWidth = 10;
|
|
26
38
|
const changeWidth = 10;
|
|
27
39
|
const changePercentWidth = 8;
|
|
28
40
|
const heldWidth = 7;
|
|
29
41
|
const dateWidth = 10;
|
|
30
|
-
const columnCount = 7;
|
|
31
|
-
const fixedWidth = valueWidth + sharesWidth +
|
|
42
|
+
const columnCount = showChange ? 7 : 5;
|
|
43
|
+
const fixedWidth = valueWidth + sharesWidth + heldWidth + dateWidth
|
|
44
|
+
+ (showChange ? changeWidth + changePercentWidth : 0);
|
|
32
45
|
const holderWidth = Math.max(16, width - 2 - columnCount - fixedWidth);
|
|
33
46
|
|
|
34
47
|
return [
|
|
35
48
|
{ id: "holder", label: "HOLDER", width: holderWidth, align: "left" },
|
|
36
49
|
{ id: "value", label: "MKT VAL", width: valueWidth, align: "right" },
|
|
37
50
|
{ id: "shares", label: "AMOUNT", width: sharesWidth, align: "right" },
|
|
38
|
-
|
|
39
|
-
|
|
51
|
+
...(showChange ? [
|
|
52
|
+
{ id: "changeShares", label: "CHG", width: changeWidth, align: "right" },
|
|
53
|
+
{ id: "changePercent", label: "CHG%", width: changePercentWidth, align: "right" },
|
|
54
|
+
] satisfies HolderColumn[] : []),
|
|
40
55
|
{ id: "percentHeld", label: "HELD", width: heldWidth, align: "right" },
|
|
41
56
|
{ id: "reportDate", label: "PERIOD", width: dateWidth, align: "right" },
|
|
42
57
|
];
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { listThirteenFForms, searchThirteenFFunds } from "../thirteenf/api";
|
|
1
|
+
import { listThirteenFForms, normalizeCik, searchThirteenFFunds } from "../thirteenf/api";
|
|
2
2
|
import { isoDateToday, isoDateYearsAgo } from "../../../utils/calendar-date";
|
|
3
3
|
import { buildPeriodReports } from "../thirteenf/model";
|
|
4
4
|
import type { HolderRow } from "./types";
|
|
@@ -42,6 +42,34 @@ export function bestFundMatch(holderName: string, funds: Array<{ cik: string; na
|
|
|
42
42
|
return matches.length === 1 ? matches[0] : undefined;
|
|
43
43
|
}
|
|
44
44
|
|
|
45
|
+
/**
|
|
46
|
+
* The 13F holder row that is a 13D/13G filer: the row whose matched 13F
|
|
47
|
+
* manager has the filer's CIK, else the one row whose name is the filer's once
|
|
48
|
+
* normalised. A parent or subsidiary with a longer name is not the filer, and
|
|
49
|
+
* two rows with the filer's name leave it unmatched. A manager's CIK can
|
|
50
|
+
* change (BlackRock's 13G filer did in 2024) while its 13F match keeps the
|
|
51
|
+
* old one, so an exact name is not overruled by a CIK.
|
|
52
|
+
*/
|
|
53
|
+
export function matchFilerToHolder<Row extends { id: string; name: string }>(
|
|
54
|
+
filer: { filerCik: string | null; filerName: string },
|
|
55
|
+
rows: readonly Row[],
|
|
56
|
+
fundMatches: ReadonlyMap<string, Pick<Holder13FMatch, "cik">> = new Map(),
|
|
57
|
+
): Row | undefined {
|
|
58
|
+
const cik = filer.filerCik ? normalizeCik(filer.filerCik) : null;
|
|
59
|
+
const matchedCik = (row: Row) => {
|
|
60
|
+
const match = fundMatches.get(row.id);
|
|
61
|
+
return match ? normalizeCik(match.cik) : null;
|
|
62
|
+
};
|
|
63
|
+
if (cik) {
|
|
64
|
+
const byCik = rows.filter((row) => matchedCik(row) === cik);
|
|
65
|
+
if (byCik.length === 1) return byCik[0];
|
|
66
|
+
}
|
|
67
|
+
const name = normalizeName(filer.filerName);
|
|
68
|
+
if (!name) return undefined;
|
|
69
|
+
const byName = rows.filter((row) => normalizeName(row.name) === name);
|
|
70
|
+
return byName.length === 1 ? byName[0] : undefined;
|
|
71
|
+
}
|
|
72
|
+
|
|
45
73
|
export async function loadHolder13FMatches(
|
|
46
74
|
rows: HolderRow[],
|
|
47
75
|
signal: AbortSignal,
|
|
@@ -2,7 +2,8 @@ import type { DataTableColumn } from "../../../components";
|
|
|
2
2
|
import type { HolderRecord } from "../../../types/financials";
|
|
3
3
|
import type { SortDirection } from "../../../utils/sort-values";
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
/** `13dg`: the Schedule 13D and 13G beneficial owners. */
|
|
6
|
+
export type ViewMode = "table" | "chart" | "13dg";
|
|
6
7
|
export type HolderColumnId = "holder" | "value" | "shares" | "changeShares" | "changePercent" | "percentHeld" | "reportDate";
|
|
7
8
|
export type HolderColumn = DataTableColumn & { id: HolderColumnId };
|
|
8
9
|
|
|
@@ -17,6 +17,7 @@ import {
|
|
|
17
17
|
} from "./model";
|
|
18
18
|
import { relevantInsiderAmendments } from "./amendments";
|
|
19
19
|
import { formatInsiderName } from "./display";
|
|
20
|
+
import { SEC_FILINGS } from "../shared/report-freshness";
|
|
20
21
|
|
|
21
22
|
const INSIDER_COLUMNS: HeadlessPaneColumn[] = [
|
|
22
23
|
{ key: "form", header: "Form" },
|
|
@@ -84,6 +85,7 @@ export function createInsiderHeadless(
|
|
|
84
85
|
): HeadlessPaneDefinition<"rows"> {
|
|
85
86
|
return {
|
|
86
87
|
shape: "rows",
|
|
88
|
+
freshness: { ...SEC_FILINGS, basis: "Form 4 filings", observedKey: "filingDate" },
|
|
87
89
|
argument: {
|
|
88
90
|
kind: "ticker",
|
|
89
91
|
placeholder: "ticker",
|
|
@@ -104,6 +104,7 @@ function projectIpoCalendarHeadless(payload: IpoCalendarPayload, args: HeadlessP
|
|
|
104
104
|
|
|
105
105
|
export const ipoCalendarHeadless: HeadlessPaneDefinition<"rows"> = {
|
|
106
106
|
shape: "rows",
|
|
107
|
+
freshness: { source: "Exchange listings", status: "not-a-feed", basis: "calendar" },
|
|
107
108
|
argument: {
|
|
108
109
|
kind: "free-text",
|
|
109
110
|
placeholder: "company or ticker",
|
|
@@ -11,6 +11,7 @@ const percent = (value: unknown) => typeof value === "number" ? formatVol(value)
|
|
|
11
11
|
|
|
12
12
|
export const ivHistoryHeadless: HeadlessPaneDefinition<"bundle"> = {
|
|
13
13
|
shape: "bundle", argument: { kind: "ticker", description: "US option underlying" },
|
|
14
|
+
freshness: { status: "not-a-feed", basis: "daily implied volatility", cadence: "daily", observedKey: "date", oldest: null },
|
|
14
15
|
describe: (args) => `HIVG ${args.symbols[0] ?? ""}`,
|
|
15
16
|
discovery: { aliases: ["HIVG"], screenshotReadiness: "live-dom", dataRequirements: ["Cloud stored implied volatility", "Daily price history"],
|
|
16
17
|
limitations: ["History starts February 2024 (OPRA daily trade closes)", "Rank and percentile use trade-close readings only"] },
|
|
@@ -57,6 +58,7 @@ export const ivHistoryHeadless: HeadlessPaneDefinition<"bundle"> = {
|
|
|
57
58
|
|
|
58
59
|
export const ivScreenHeadless: HeadlessPaneDefinition<"bundle"> = {
|
|
59
60
|
shape: "bundle",
|
|
61
|
+
freshness: { status: "not-a-feed", basis: "daily implied volatility", cadence: "daily" },
|
|
60
62
|
argument: { kind: "symbol-list", optional: true, maximum: VCA_LIMIT, description: "US option underlyings; defaults to index and sector ETFs." },
|
|
61
63
|
options: [{ key: "preset", type: "enum", values: [{ value: "etfs" }, { value: "megacaps" }], defaultValue: "etfs", description: "Preset when no symbols are given" }],
|
|
62
64
|
describe: "Volatility rich/cheap",
|
|
@@ -86,7 +88,8 @@ export const ivScreenHeadless: HeadlessPaneDefinition<"bundle"> = {
|
|
|
86
88
|
{ key: "ivHv", header: "IV/HV", format: (value: unknown) => typeof value === "number" ? value.toFixed(2) : "--" },
|
|
87
89
|
], rows: rows.map((row) => ({ ...row })) }],
|
|
88
90
|
complete: !queued.length && !universe.error, unavailableSymbols: queued,
|
|
89
|
-
errors: [universe.error
|
|
91
|
+
errors: [universe.error].filter((value): value is string => !!value),
|
|
92
|
+
...(queued.length ? { notes: [`Queued for backfill: ${queued.join(", ")}.`] } : {}),
|
|
90
93
|
metadata: { asOf: payload.asOf, presets: VCA_PRESETS, methodology: METHODOLOGY },
|
|
91
94
|
};
|
|
92
95
|
},
|
|
@@ -151,6 +151,7 @@ function companyBundle(symbol: string, state: JobsCompanyState, roleLimit: numbe
|
|
|
151
151
|
*/
|
|
152
152
|
export const jobsHeadless: HeadlessPaneDefinition<"bundle"> = {
|
|
153
153
|
shape: "bundle",
|
|
154
|
+
freshness: { source: "Company careers sites", status: "not-a-feed", basis: "observed job postings" },
|
|
154
155
|
argument: {
|
|
155
156
|
kind: "ticker",
|
|
156
157
|
placeholder: "ticker",
|
|
@@ -15,6 +15,7 @@ export const positionSizerModule: PluginModule = {
|
|
|
15
15
|
panes: [
|
|
16
16
|
{
|
|
17
17
|
id: KELLY_PANE_ID,
|
|
18
|
+
reportFreshness: { source: "Your inputs and Gloom Cloud", status: "not-a-feed", basis: "position sizing" },
|
|
18
19
|
name: "Position Sizer",
|
|
19
20
|
icon: "K",
|
|
20
21
|
component: KellySizerPane,
|
|
@@ -35,6 +35,7 @@ import { getSharedRegistry } from "../../registry";
|
|
|
35
35
|
import { resolveTickerOpenTarget } from "../../../tickers/open-target";
|
|
36
36
|
import { calculatePortfolioSummaryTotals } from "../portfolio-list/metrics";
|
|
37
37
|
import { resolvePortfolioNetLiquidation } from "../portfolio-list/account-metrics";
|
|
38
|
+
import { resolvePortfolioCash } from "../portfolio-list/allocation";
|
|
38
39
|
import {
|
|
39
40
|
buildTrackedCurrencies,
|
|
40
41
|
getCollectionTickersFromConfig,
|
|
@@ -71,7 +72,7 @@ import {
|
|
|
71
72
|
KellySensitivitySection,
|
|
72
73
|
buildKellyResultItems,
|
|
73
74
|
} from "./sections";
|
|
74
|
-
import { getPortfolioPositionValue, resolveActivePortfolioId } from "./portfolio";
|
|
75
|
+
import { getPortfolioPositionValue, resolveActivePortfolioId, resolveKellyBankroll } from "./portfolio";
|
|
75
76
|
import { useKellyCommonAssumptions } from "./state";
|
|
76
77
|
|
|
77
78
|
export function KellySizerPane({ focused, width, height }: PaneProps) {
|
|
@@ -214,9 +215,11 @@ export function KellySizerPane({ focused, width, height }: PaneProps) {
|
|
|
214
215
|
? portfolioFinancials.get(requestedSymbol!) ?? null
|
|
215
216
|
: financials;
|
|
216
217
|
const { accountState } = usePortfolioAccountState(activePortfolio, { brokerAccounts, config });
|
|
218
|
+
// Cash entered by hand counts toward a manual portfolio's bankroll; a broker's is in its Net Liq.
|
|
219
|
+
const manualCash = accountState ? null : resolvePortfolioCash(activePortfolio, null);
|
|
217
220
|
const trackedCurrencies = useMemo(
|
|
218
|
-
() => buildTrackedCurrencies(portfolioTickers, portfolioFinancials, accountState, config.baseCurrency),
|
|
219
|
-
[accountState, config.baseCurrency, portfolioFinancials, portfolioTickers],
|
|
221
|
+
() => buildTrackedCurrencies(portfolioTickers, portfolioFinancials, accountState, config.baseCurrency, manualCash?.currency),
|
|
222
|
+
[accountState, config.baseCurrency, manualCash?.currency, portfolioFinancials, portfolioTickers],
|
|
220
223
|
);
|
|
221
224
|
const exchangeRates = useFxRatesMap(trackedCurrencies);
|
|
222
225
|
const portfolioSummary = useMemo(
|
|
@@ -237,9 +240,12 @@ export function KellySizerPane({ focused, width, height }: PaneProps) {
|
|
|
237
240
|
(value) => convertCurrency(value, accountState?.account.currency ?? "", config.baseCurrency, exchangeRates),
|
|
238
241
|
accountState?.snapshotBasis,
|
|
239
242
|
);
|
|
240
|
-
const sourceBankroll =
|
|
241
|
-
|
|
242
|
-
:
|
|
243
|
+
const sourceBankroll = resolveKellyBankroll({
|
|
244
|
+
netLiquidation,
|
|
245
|
+
brokerPortfolio: !!activePortfolio?.brokerInstanceId,
|
|
246
|
+
holdings: portfolioSummary.allocationHoldings ?? [],
|
|
247
|
+
cashValue: manualCash ? convertCurrency(manualCash.amount, manualCash.currency, config.baseCurrency, exchangeRates) : null,
|
|
248
|
+
});
|
|
243
249
|
const sourceCurrentValue = getPortfolioPositionValue({
|
|
244
250
|
ticker,
|
|
245
251
|
financials: positionFinancials,
|
|
@@ -2,6 +2,7 @@ import type { AppConfig } from "../../../types/config";
|
|
|
2
2
|
import type { TickerFinancials } from "../../../types/financials";
|
|
3
3
|
import type { TickerRecord } from "../../../types/ticker";
|
|
4
4
|
import { convertCurrency } from "../../../utils/format";
|
|
5
|
+
import { allocationTotal, type AllocationHolding } from "../portfolio-list/allocation";
|
|
5
6
|
import { getCollectionTypeFromConfig } from "../portfolio-list/pane/data";
|
|
6
7
|
import { getPortfolioPositionMetrics, getPortfolioQuoteDisplay, resolvePortfolioMarketValue } from "../portfolio-list/position-metrics";
|
|
7
8
|
|
|
@@ -41,6 +42,30 @@ export function getPortfolioPositionValue({
|
|
|
41
42
|
?? (metrics.positionCount > 0 ? Number.NaN : 0);
|
|
42
43
|
}
|
|
43
44
|
|
|
45
|
+
/**
|
|
46
|
+
* What the portfolio is worth to bet with: its equity. A broker account's is
|
|
47
|
+
* its Net Liq. Otherwise it is the priced holdings at net value plus the cash
|
|
48
|
+
* entered for the portfolio, the portfolio header's Total. A broker portfolio
|
|
49
|
+
* with neither has no known equity: its positions alone are its gross, which
|
|
50
|
+
* margin puts above the equity, so it gives no bankroll.
|
|
51
|
+
*/
|
|
52
|
+
export function resolveKellyBankroll({
|
|
53
|
+
netLiquidation,
|
|
54
|
+
brokerPortfolio,
|
|
55
|
+
holdings,
|
|
56
|
+
cashValue,
|
|
57
|
+
}: {
|
|
58
|
+
netLiquidation: number | null;
|
|
59
|
+
brokerPortfolio: boolean;
|
|
60
|
+
holdings: readonly AllocationHolding[];
|
|
61
|
+
/** Cash entered by hand, in the bankroll currency; NaN when it cannot be converted. */
|
|
62
|
+
cashValue: number | null;
|
|
63
|
+
}): number {
|
|
64
|
+
if (netLiquidation != null && Number.isFinite(netLiquidation)) return netLiquidation;
|
|
65
|
+
if (brokerPortfolio && cashValue == null) return 0;
|
|
66
|
+
return allocationTotal(holdings, cashValue) ?? 0;
|
|
67
|
+
}
|
|
68
|
+
|
|
44
69
|
export function resolveActivePortfolioId({
|
|
45
70
|
requestedPortfolioId,
|
|
46
71
|
activeCollectionId,
|
|
@@ -11,6 +11,8 @@ const share = (value: unknown) => typeof value === "number" ? `${Math.round(valu
|
|
|
11
11
|
|
|
12
12
|
export const macroDayHeadless: HeadlessPaneDefinition<"bundle"> = {
|
|
13
13
|
shape: "bundle", argument: { kind: "ticker", description: "Ticker" },
|
|
14
|
+
// Dated by the maintained release list as much as by the closes, so no session schedule applies.
|
|
15
|
+
freshness: { status: "not-a-feed", basis: "release-day study on daily closes" },
|
|
14
16
|
describe: (args) => `MDAY ${args.symbols[0] ?? ""}`,
|
|
15
17
|
discovery: { screenshotReadiness: "live-dom", limitations: [
|
|
16
18
|
"US listings; close-to-close on the release day.",
|
|
@@ -6,6 +6,8 @@ export const MARKET_HEATMAP_UNIVERSES = [
|
|
|
6
6
|
{ id: "us-equity", label: "US Stocks" },
|
|
7
7
|
{ id: "us-etf", label: "US ETFs" },
|
|
8
8
|
] as const;
|
|
9
|
+
/** The 500 largest US stocks (an older server answers with its own maximum); ETFs stay flat and need fewer. */
|
|
10
|
+
export const MARKET_HEATMAP_REQUEST_COUNT: Record<MarketHeatmapUniverseId, number> = { "us-equity": 500, "us-etf": 160 };
|
|
9
11
|
export interface MarketHeatmapFetchOptions { count?: number; forceRefresh?: boolean; cache?: boolean; }
|
|
10
12
|
export interface MarketHeatmapSources { client?: Pick<typeof apiClient, "getMarketHeatmap">; }
|
|
11
13
|
const DEFAULT_COUNT = 80;
|