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
package/src/api-client/paths.ts
CHANGED
|
@@ -4,7 +4,9 @@ import type {
|
|
|
4
4
|
CloudTweetQueryType,
|
|
5
5
|
} from "./types";
|
|
6
6
|
import { isUsListingExchange, normalizeSymbol, parsePublicTickerKey, publicTickerKey } from "../utils/exchanges";
|
|
7
|
+
import { nonUsSecListingVenue } from "../utils/sec";
|
|
7
8
|
import type { HistoryRetention } from "../sources/history-retention";
|
|
9
|
+
import type { CloudBeneficialOwnersParams } from "./beneficial-owners";
|
|
8
10
|
|
|
9
11
|
export type CloudHistoryParams = {
|
|
10
12
|
interval?: string;
|
|
@@ -228,6 +230,10 @@ export function cloudCreditBoardPath(board: "cdx" | "sovr", params: { days?: num
|
|
|
228
230
|
|
|
229
231
|
export type CloudSecFilingsParams = {
|
|
230
232
|
ticker: string;
|
|
233
|
+
/** The listing's venue. Sent only for a venue outside the US, with `name`. */
|
|
234
|
+
exchange?: string;
|
|
235
|
+
/** The listing's company name, from its own quote. */
|
|
236
|
+
name?: string;
|
|
231
237
|
limit?: number;
|
|
232
238
|
offset?: number;
|
|
233
239
|
};
|
|
@@ -343,13 +349,36 @@ export function cloudProxyStatementPath(ticker: string, year: number): string {
|
|
|
343
349
|
return `/cloud/proxies/${encodeURIComponent(normalizeIssuerResearchTicker(ticker))}/${year}`;
|
|
344
350
|
}
|
|
345
351
|
|
|
352
|
+
/**
|
|
353
|
+
* A US listing, or a symbol with no venue, looks up its US ticker as before.
|
|
354
|
+
* A listing elsewhere sends its bare symbol with the venue and company name:
|
|
355
|
+
* its symbol can be another company's US ticker.
|
|
356
|
+
*/
|
|
346
357
|
export function cloudSecFilingsPath(params: CloudSecFilingsParams): string {
|
|
347
|
-
const
|
|
358
|
+
const venue = nonUsSecListingVenue(params.ticker, params.exchange);
|
|
359
|
+
const search = new URLSearchParams({
|
|
360
|
+
ticker: venue ? parsePublicTickerKey(params.ticker).symbol : normalizeIssuerResearchTicker(params.ticker),
|
|
361
|
+
});
|
|
348
362
|
if (params.limit != null) search.set("limit", String(params.limit));
|
|
349
363
|
if (params.offset != null) search.set("offset", String(params.offset));
|
|
364
|
+
if (venue) {
|
|
365
|
+
search.set("exchange", venue);
|
|
366
|
+
const name = params.name?.trim();
|
|
367
|
+
if (name) search.set("name", name);
|
|
368
|
+
}
|
|
350
369
|
return appendQuery("/cloud/sec/filings", search);
|
|
351
370
|
}
|
|
352
371
|
|
|
372
|
+
/** Schedule 13D and 13G reports about the issuer behind `ticker`. */
|
|
373
|
+
export function cloudSecBeneficialOwnersPath(params: CloudBeneficialOwnersParams): string {
|
|
374
|
+
const search = new URLSearchParams({ ticker: normalizeIssuerResearchTicker(params.ticker) });
|
|
375
|
+
if (params.form) search.set("form", params.form);
|
|
376
|
+
if (params.history) search.set("history", "1");
|
|
377
|
+
if (params.limit != null) search.set("limit", String(params.limit));
|
|
378
|
+
if (params.offset != null) search.set("offset", String(params.offset));
|
|
379
|
+
return appendQuery("/cloud/sec/beneficial-owners", search);
|
|
380
|
+
}
|
|
381
|
+
|
|
353
382
|
export function cloudSecFilingDocumentsPath(
|
|
354
383
|
params: CloudSecFilingParams,
|
|
355
384
|
): string {
|
package/src/api-client/perps.ts
CHANGED
|
@@ -79,6 +79,28 @@ interface UnderlyingReference {
|
|
|
79
79
|
sourceUrl: string
|
|
80
80
|
}
|
|
81
81
|
|
|
82
|
+
/**
|
|
83
|
+
* The venue's latest long/short account reading for one contract, in its own hourly bucket. Shares are
|
|
84
|
+
* fractions and may sum to less than one (flat accounts); OKX publishes only the ratio, so its shares are derived.
|
|
85
|
+
*/
|
|
86
|
+
export interface PerpLongShortRatio {
|
|
87
|
+
venue: string
|
|
88
|
+
/** Key of what is counted, such as `accounts_all`; `definitionText` says it in words. */
|
|
89
|
+
definition: string
|
|
90
|
+
definitionText: string
|
|
91
|
+
period: string
|
|
92
|
+
longShare: number
|
|
93
|
+
shortShare: number
|
|
94
|
+
ratio: number | null
|
|
95
|
+
derived: boolean
|
|
96
|
+
bucketAt: string
|
|
97
|
+
observedAt: string
|
|
98
|
+
/** The bucket is more than three hours old. */
|
|
99
|
+
stale: boolean
|
|
100
|
+
}
|
|
101
|
+
/** Why a row has no reading: the venue publishes none, collection is off, or nothing is stored yet. */
|
|
102
|
+
type PerpLongShortReason = "unsupported" | "off" | "collecting"
|
|
103
|
+
|
|
82
104
|
export interface PerpBoardRow extends PerpMarket {
|
|
83
105
|
equityMatch?: { listing: PerpEquityListing; underlying: PerpEquityListing; basis: "listing" | "issuer" }
|
|
84
106
|
stale: boolean
|
|
@@ -89,6 +111,19 @@ export interface PerpBoardRow extends PerpMarket {
|
|
|
89
111
|
underlying: UnderlyingReference | null
|
|
90
112
|
underlyingPremium: number | null
|
|
91
113
|
closedMarketPremium: number | null
|
|
114
|
+
/** Absent from servers older than the long/short series: read as null. */
|
|
115
|
+
longShortRatio?: PerpLongShortRatio | null
|
|
116
|
+
longShortRatioReason?: PerpLongShortReason | null
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
export type PerpLongShortPoint = {
|
|
120
|
+
time: string
|
|
121
|
+
definition: string
|
|
122
|
+
longShare: number
|
|
123
|
+
shortShare: number
|
|
124
|
+
ratio: number | null
|
|
125
|
+
derived: boolean
|
|
126
|
+
observedAt: string
|
|
92
127
|
}
|
|
93
128
|
|
|
94
129
|
type PerpHistoryPoint = {
|
|
@@ -114,6 +149,8 @@ export interface PerpBoardPayload {
|
|
|
114
149
|
export interface PerpEquityListing { symbol: string; exchange: string }
|
|
115
150
|
export interface PerpHistoryPayload {
|
|
116
151
|
status: string; marketId: string; rows: PerpHistoryPoint[]; funding: PerpFunding[]; candles: PerpCandle[];
|
|
152
|
+
/** Absent from servers older than the long/short series: read as empty. */
|
|
153
|
+
longShortRatio?: PerpLongShortPoint[];
|
|
117
154
|
locked: boolean; access: "pro" | "preview"; asOf: string | null;
|
|
118
155
|
from?: string; to?: string; resolution?: "minute" | "hour" | "day"; truncated?: boolean;
|
|
119
156
|
}
|
|
@@ -3,6 +3,7 @@ import { withDeadline } from "../utils/async-deadline";
|
|
|
3
3
|
import {
|
|
4
4
|
ApiRequestError,
|
|
5
5
|
parseApiErrorCode,
|
|
6
|
+
parseApiErrorDetails,
|
|
6
7
|
parseApiErrorMessage,
|
|
7
8
|
parseRetryAfterMs,
|
|
8
9
|
type RevisionConflictError,
|
|
@@ -391,6 +392,7 @@ export class CloudApiRequestTransport {
|
|
|
391
392
|
res.status,
|
|
392
393
|
parseRetryAfterMs(res.headers.get("Retry-After")),
|
|
393
394
|
parseApiErrorCode(text),
|
|
395
|
+
parseApiErrorDetails(text),
|
|
394
396
|
);
|
|
395
397
|
}
|
|
396
398
|
|
|
@@ -404,8 +406,9 @@ export class CloudApiRequestTransport {
|
|
|
404
406
|
};
|
|
405
407
|
// Crash reports, usage counts and command-search reports are background
|
|
406
408
|
// traffic: a rate-limited, timed-out or missing one must not show up as a
|
|
407
|
-
// Cloud outage in the connections pane.
|
|
408
|
-
|
|
409
|
+
// Cloud outage in the connections pane. Nor must the map's probe for geo
|
|
410
|
+
// layers, which a server without them answers with 404.
|
|
411
|
+
if (path.startsWith("/telemetry/") || path === "/assist/searches" || path === "/cloud/geo/layers") return request();
|
|
409
412
|
return this.connectionHealth.track(
|
|
410
413
|
GLOOM_CLOUD_HTTP_CONNECTION_ID,
|
|
411
414
|
operation,
|
package/src/api-client/types.ts
CHANGED
|
@@ -12,6 +12,8 @@ import type { SyncSettings, SyncSnapshot } from "../sync/types";
|
|
|
12
12
|
|
|
13
13
|
export interface ChatUserSummary {
|
|
14
14
|
id: string;
|
|
15
|
+
/** A person, a managed assistant (Gloombot), or a Discord user bridged into public channels. */
|
|
16
|
+
accountType?: "human" | "managed_llm" | "discord";
|
|
15
17
|
username: string | null;
|
|
16
18
|
displayName: string;
|
|
17
19
|
bio?: string | null;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { AppResourceStorePort } from "../core/app-service-ports";
|
|
2
|
+
import type { CachedResourceRecord, ResourceCacheKey } from "../data/resource-store";
|
|
2
3
|
import type { BrokerAdapter } from "../types/broker";
|
|
3
4
|
import type { BrokerInstanceConfig } from "../types/config";
|
|
4
5
|
import type { CachePolicy } from "../types/persistence";
|
|
@@ -21,6 +22,50 @@ function brokerAccountNamespace(instance: BrokerInstanceConfig): string {
|
|
|
21
22
|
return `plugin:${instance.brokerType}`;
|
|
22
23
|
}
|
|
23
24
|
|
|
25
|
+
/** A saved account snapshot, which a renderer without the cache database has to keep elsewhere. */
|
|
26
|
+
export function isBrokerAccountSnapshotKey(key: Pick<ResourceCacheKey, "namespace" | "kind">): boolean {
|
|
27
|
+
return key.kind === BROKER_ACCOUNT_SNAPSHOT_KIND && key.namespace.startsWith("plugin:");
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Saves an account snapshot written by a process without the cache database
|
|
32
|
+
* (the desktop view), keeping its own times. Anything else is refused.
|
|
33
|
+
*/
|
|
34
|
+
export function saveBrokerAccountRecord(
|
|
35
|
+
resources: Pick<AppResourceStorePort, "set">,
|
|
36
|
+
record: CachedResourceRecord | null | undefined,
|
|
37
|
+
): boolean {
|
|
38
|
+
if (!record || typeof record.namespace !== "string" || typeof record.entityKey !== "string"
|
|
39
|
+
|| !isBrokerAccountSnapshotKey(record)
|
|
40
|
+
|| ![record.fetchedAt, record.staleAt, record.expiresAt].every(Number.isFinite)) return false;
|
|
41
|
+
resources.set(record, record.value, {
|
|
42
|
+
schemaVersion: record.schemaVersion,
|
|
43
|
+
provenance: record.provenance,
|
|
44
|
+
fetchedAt: record.fetchedAt,
|
|
45
|
+
cachePolicy: { staleMs: record.staleAt - record.fetchedAt, expireMs: record.expiresAt - record.fetchedAt },
|
|
46
|
+
});
|
|
47
|
+
return true;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export function deleteBrokerAccountRecord(resources: Pick<AppResourceStorePort, "delete">, key: ResourceCacheKey): void {
|
|
51
|
+
if (isBrokerAccountSnapshotKey(key)) resources.delete(key);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/** Every unexpired account snapshot saved for these profiles, as stored. */
|
|
55
|
+
export function listPersistedBrokerAccountRecords(
|
|
56
|
+
resources: Pick<AppResourceStorePort, "list">,
|
|
57
|
+
brokerInstances: readonly BrokerInstanceConfig[],
|
|
58
|
+
): CachedResourceRecord[] {
|
|
59
|
+
return brokerInstances.flatMap((instance) => resources.list<PersistedBrokerAccountSnapshot>({
|
|
60
|
+
namespace: brokerAccountNamespace(instance),
|
|
61
|
+
kind: BROKER_ACCOUNT_SNAPSHOT_KIND,
|
|
62
|
+
entityKey: instance.id,
|
|
63
|
+
}, {
|
|
64
|
+
schemaVersion: BROKER_ACCOUNT_SNAPSHOT_SCHEMA_VERSION,
|
|
65
|
+
touch: false,
|
|
66
|
+
}));
|
|
67
|
+
}
|
|
68
|
+
|
|
24
69
|
export function getBrokerAccountCacheSourceKey(
|
|
25
70
|
instance: BrokerInstanceConfig,
|
|
26
71
|
broker?: BrokerAdapter | null,
|
|
@@ -84,6 +129,30 @@ export function loadPersistedBrokerAccounts(
|
|
|
84
129
|
})?.value.accounts ?? null;
|
|
85
130
|
}
|
|
86
131
|
|
|
132
|
+
/**
|
|
133
|
+
* The newest saved account snapshot of a profile, for readers without its
|
|
134
|
+
* adapter such as the CLI. Read only: without the adapter the current source
|
|
135
|
+
* key is unknown, so nothing is pruned.
|
|
136
|
+
*/
|
|
137
|
+
export function peekPersistedBrokerAccounts(
|
|
138
|
+
resources: Pick<AppResourceStorePort, "list">,
|
|
139
|
+
instance: BrokerInstanceConfig,
|
|
140
|
+
): BrokerAccount[] | null {
|
|
141
|
+
const records = resources.list<PersistedBrokerAccountSnapshot>({
|
|
142
|
+
namespace: brokerAccountNamespace(instance),
|
|
143
|
+
kind: BROKER_ACCOUNT_SNAPSHOT_KIND,
|
|
144
|
+
entityKey: instance.id,
|
|
145
|
+
}, {
|
|
146
|
+
schemaVersion: BROKER_ACCOUNT_SNAPSHOT_SCHEMA_VERSION,
|
|
147
|
+
allowExpired: true,
|
|
148
|
+
});
|
|
149
|
+
const newest = records.reduce<(typeof records)[number] | null>(
|
|
150
|
+
(latest, record) => (!latest || record.fetchedAt > latest.fetchedAt ? record : latest),
|
|
151
|
+
null,
|
|
152
|
+
);
|
|
153
|
+
return newest?.value.accounts ?? null;
|
|
154
|
+
}
|
|
155
|
+
|
|
87
156
|
export function persistBrokerAccounts(
|
|
88
157
|
resources: AppResourceStorePort,
|
|
89
158
|
instance: BrokerInstanceConfig,
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import type { CliCommandDef } from "../types/plugin";
|
|
2
|
+
import { fail } from "./errors";
|
|
3
|
+
import { suggestCliOption } from "./help";
|
|
4
|
+
|
|
5
|
+
/** A built-in command, which may say more about an option it does not take than the list of those it does. */
|
|
6
|
+
export interface BuiltinCliCommandDef extends CliCommandDef {
|
|
7
|
+
/** A sentence for an unknown option people reach for, such as `--from` on `history`; null for the rest. */
|
|
8
|
+
unknownOptionHint?(flag: string): string | null;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
interface DeclaredOption {
|
|
12
|
+
flag: string;
|
|
13
|
+
takesValue: boolean;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/** `--range`, `--range=5Y`: an option. `-5`, `---`, `--` and plain words are not. */
|
|
17
|
+
const OPTION_TOKEN = /^--[a-z]/i;
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* The options a command's help declares, from each spelling such as
|
|
21
|
+
* `--range <range>` (takes a value) or `--all` (a switch). Null when it takes
|
|
22
|
+
* any option: `--<option> <value>` on `fn` and `shot`.
|
|
23
|
+
*/
|
|
24
|
+
function declaredOptions(command: CliCommandDef): Map<string, DeclaredOption> | null {
|
|
25
|
+
const declared = new Map<string, DeclaredOption>();
|
|
26
|
+
for (const option of command.help?.options ?? []) {
|
|
27
|
+
for (const spelling of option.flags.split(",")) {
|
|
28
|
+
const trimmed = spelling.trim();
|
|
29
|
+
if (trimmed.startsWith("--<")) return null;
|
|
30
|
+
const match = /^(--?[a-z][\w-]*)(?:[ =](.+))?$/i.exec(trimmed);
|
|
31
|
+
if (match) declared.set(match[1]!, { flag: match[1]!, takesValue: match[2] != null });
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return declared;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function failUnknownOption(command: BuiltinCliCommandDef, flag: string, declared: Map<string, DeclaredOption>): never {
|
|
38
|
+
const flags = [...declared.keys()];
|
|
39
|
+
const suggestion = suggestCliOption(flag, flags);
|
|
40
|
+
const help = `See gloomberb help ${command.name}.`;
|
|
41
|
+
fail(`Unknown option ${flag} for ${command.name}.`, [
|
|
42
|
+
command.unknownOptionHint?.(flag) ?? "",
|
|
43
|
+
suggestion ? `Did you mean ${suggestion}?` : "",
|
|
44
|
+
flags.length > 0 ? `Options: ${flags.join(", ")}. ${help}` : `${command.name} takes no options. ${help}`,
|
|
45
|
+
].filter(Boolean).join("\n"));
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Fails on the first `--option` a built-in command does not declare, which it
|
|
50
|
+
* would otherwise ignore and answer as if it had not been given: `history
|
|
51
|
+
* --from 1995-01-01` printing the default year. Global flags are already out
|
|
52
|
+
* of `args`; a declared option's value is skipped whatever it looks like, and
|
|
53
|
+
* nothing from `literalStart` on (after a bare `--`) is read as an option.
|
|
54
|
+
*/
|
|
55
|
+
export function checkCliCommandOptions(
|
|
56
|
+
command: BuiltinCliCommandDef,
|
|
57
|
+
args: readonly string[],
|
|
58
|
+
literalStart = args.length,
|
|
59
|
+
): void {
|
|
60
|
+
const declared = declaredOptions(command);
|
|
61
|
+
if (!declared) return;
|
|
62
|
+
for (let index = 0; index < Math.min(literalStart, args.length); index += 1) {
|
|
63
|
+
const arg = args[index]!;
|
|
64
|
+
if (!OPTION_TOKEN.test(arg)) continue;
|
|
65
|
+
const equals = arg.indexOf("=");
|
|
66
|
+
const flag = equals >= 0 ? arg.slice(0, equals) : arg;
|
|
67
|
+
const option = declared.get(flag);
|
|
68
|
+
if (!option) failUnknownOption(command, flag, declared);
|
|
69
|
+
if (!option.takesValue && equals >= 0) {
|
|
70
|
+
fail(`${flag} takes no value.`, `Write it alone, as ${flag}. See gloomberb help ${command.name}.`);
|
|
71
|
+
}
|
|
72
|
+
if (option.takesValue && equals < 0) index += 1;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
@@ -15,6 +15,14 @@ export function takeOption(args: string[], name: string): string | undefined {
|
|
|
15
15
|
return value;
|
|
16
16
|
}
|
|
17
17
|
|
|
18
|
+
/** Removes a boolean flag (`--history`) from `args` and says whether it was there. */
|
|
19
|
+
export function takeFlag(args: string[], name: string): boolean {
|
|
20
|
+
const index = args.indexOf(name);
|
|
21
|
+
if (index < 0) return false;
|
|
22
|
+
args.splice(index, 1);
|
|
23
|
+
return true;
|
|
24
|
+
}
|
|
25
|
+
|
|
18
26
|
export function parseJsonPayload(value: string | undefined, ctx: CliCommandContext): unknown {
|
|
19
27
|
if (!value) return {};
|
|
20
28
|
try {
|
|
@@ -38,6 +46,35 @@ export function requireArg(value: string | undefined, usage: string, ctx: CliCom
|
|
|
38
46
|
return value;
|
|
39
47
|
}
|
|
40
48
|
|
|
49
|
+
/**
|
|
50
|
+
* Fails on arguments past the `max` a command takes rather than dropping them:
|
|
51
|
+
* `fx NGN ZAR` printing NGN alone reads as an answer for both. `usage` is the
|
|
52
|
+
* command's usage line without `gloomberb`, `takes` what it takes ("one
|
|
53
|
+
* currency", "no arguments").
|
|
54
|
+
*/
|
|
55
|
+
export function rejectExtraArgs(
|
|
56
|
+
args: readonly string[],
|
|
57
|
+
max: number,
|
|
58
|
+
{ usage, takes, advice }: { usage: string; takes: string; advice?: string },
|
|
59
|
+
ctx: Pick<CliCommandContext, "fail">,
|
|
60
|
+
): void {
|
|
61
|
+
if (args.length <= max) return;
|
|
62
|
+
const command = usage.split(" ")[0];
|
|
63
|
+
ctx.fail(`${command} takes ${takes}; got ${args.join(" ")}.`, [advice, `Usage: gloomberb ${usage}`].filter(Boolean).join("\n"));
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/** The one argument a command takes, such as a symbol: missing fails with the usage line, extras are not dropped. */
|
|
67
|
+
export function requireOneArg(
|
|
68
|
+
args: readonly string[],
|
|
69
|
+
usage: string,
|
|
70
|
+
noun: string,
|
|
71
|
+
ctx: CliCommandContext,
|
|
72
|
+
): string {
|
|
73
|
+
const value = requireArg(args[0], `Usage: gloomberb ${usage}`, ctx);
|
|
74
|
+
rejectExtraArgs(args, 1, { usage, takes: `one ${noun}`, advice: `Run it once per ${noun}.` }, ctx);
|
|
75
|
+
return value;
|
|
76
|
+
}
|
|
77
|
+
|
|
41
78
|
export function isoDate(value: unknown): string {
|
|
42
79
|
if (value instanceof Date) return value.toISOString();
|
|
43
80
|
if (typeof value === "number") return new Date(value).toISOString();
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { isCryptoInstrumentType } from "../../tickers/search/ranking";
|
|
2
|
+
import type { Quote } from "../../types/financials";
|
|
3
|
+
import { isCryptoPairSymbol } from "../../utils/crypto-pair";
|
|
4
|
+
|
|
5
|
+
/** Where a crypto pair that will not load can still be read. `fn CRYP` takes no argument. */
|
|
6
|
+
export const CRYPTO_BOARD_HINT = "Crypto prices may be briefly unavailable; the CRYP function (gloomberb fn CRYP) shows the crypto board.";
|
|
7
|
+
|
|
8
|
+
// The coins whose bare ticker is most often typed for the coin itself. The label is how the note
|
|
9
|
+
// names the coin and what a listing's name has to say before the note applies.
|
|
10
|
+
const MAJOR_COINS = new Map([
|
|
11
|
+
["BTC", "bitcoin"],
|
|
12
|
+
["ETH", "ethereum"],
|
|
13
|
+
["SOL", "solana"],
|
|
14
|
+
["XRP", "XRP"],
|
|
15
|
+
["DOGE", "dogecoin"],
|
|
16
|
+
["ADA", "cardano"],
|
|
17
|
+
["LTC", "litecoin"],
|
|
18
|
+
["BCH", "bitcoin cash"],
|
|
19
|
+
["AVAX", "avalanche"],
|
|
20
|
+
["DOT", "polkadot"],
|
|
21
|
+
["LINK", "chainlink"],
|
|
22
|
+
["BNB", "BNB"],
|
|
23
|
+
]);
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* A bare coin ticker usually resolves to a listed fund, not the coin. The note applies only when
|
|
27
|
+
* the listing is not crypto and its own name says the coin (a "Bitcoin" trust), so a company that
|
|
28
|
+
* happens to share the letters (Interlink Electronics on LINK) is left alone.
|
|
29
|
+
*/
|
|
30
|
+
function notTheCoinNote(symbol: string, quote: Pick<Quote, "name" | "instrumentType"> | null | undefined): string | null {
|
|
31
|
+
const coin = MAJOR_COINS.get(symbol);
|
|
32
|
+
const type = quote?.instrumentType?.trim();
|
|
33
|
+
const name = quote?.name?.trim();
|
|
34
|
+
if (!coin || !name || !type || isCryptoInstrumentType(type)) return null;
|
|
35
|
+
if (!new RegExp(`\\b${coin}\\b`, "i").test(name)) return null;
|
|
36
|
+
return `${symbol} is ${name}, not ${coin}. For ${coin} use ${symbol}-USD.`;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
interface QuoteNoteResult {
|
|
40
|
+
target: { symbol: string };
|
|
41
|
+
quote: Pick<Quote, "name" | "instrumentType"> | null;
|
|
42
|
+
error: string | null;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/** The router words a failure as "<reason> for <symbol>"; drop the symbol so equal reasons group. */
|
|
46
|
+
function failureReason(message: string, symbol: string): string {
|
|
47
|
+
const line = (message.split("\n")[0] ?? "").trim().replace(/\.+$/, "");
|
|
48
|
+
const suffix = ` for ${symbol}`;
|
|
49
|
+
return line.toLowerCase().endsWith(suffix.toLowerCase()) ? line.slice(0, -suffix.length) : line;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Text-mode notes under a quote table: one line per distinct failure reason (with the crypto board
|
|
54
|
+
* pointer when a failed symbol is a crypto pair), then a line for each bare coin ticker that
|
|
55
|
+
* resolved to something else. `--exchange` names the listing on purpose, so it gets no coin note.
|
|
56
|
+
*/
|
|
57
|
+
export function quoteNotes(results: QuoteNoteResult[], options: { exchange?: string } = {}): string[] {
|
|
58
|
+
const failures = new Map<string, string[]>();
|
|
59
|
+
for (const result of results) {
|
|
60
|
+
if (!result.error || result.quote) continue;
|
|
61
|
+
const reason = failureReason(result.error, result.target.symbol);
|
|
62
|
+
const symbols = failures.get(reason) ?? [];
|
|
63
|
+
if (!symbols.includes(result.target.symbol)) failures.set(reason, [...symbols, result.target.symbol]);
|
|
64
|
+
}
|
|
65
|
+
const notes = [...failures].map(([reason, symbols]) => (
|
|
66
|
+
`${symbols.join(", ")}: ${reason}${symbols.some(isCryptoPairSymbol) ? `. ${CRYPTO_BOARD_HINT}` : ""}`
|
|
67
|
+
));
|
|
68
|
+
if (!options.exchange) {
|
|
69
|
+
for (const result of results) {
|
|
70
|
+
const note = notTheCoinNote(result.target.symbol, result.quote);
|
|
71
|
+
if (note) notes.push(note);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return notes;
|
|
75
|
+
}
|