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
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import type { FinancialStatement, Quote, TickerFinancials } from "../types/financials";
|
|
2
|
+
import type { HeadlessPaneFreshness, HeadlessPaneRow } from "../types/headless";
|
|
3
|
+
import { deriveHeadlessFreshness, type ReportFreshness } from "./pane-functions/freshness";
|
|
4
|
+
import { quoteFreshnessFields, REPORTED_DATA } from "../plugins/builtin/shared/report-freshness";
|
|
5
|
+
import { latestFinancialPeriod } from "../utils/latest-financial-period";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* The source, as-of and status line of a plain CLI command, derived exactly as
|
|
9
|
+
* an `fn` report derives it: rows read like a headless report's rows (quote
|
|
10
|
+
* `dataSource`, `delayMinutes`, `stale` flags, observation times, worst of
|
|
11
|
+
* across rows) under what the command declares about them. Nothing to cite, no line.
|
|
12
|
+
*/
|
|
13
|
+
export function rowsFreshness(
|
|
14
|
+
rows: readonly object[],
|
|
15
|
+
declared?: HeadlessPaneFreshness,
|
|
16
|
+
metadata?: Record<string, unknown>,
|
|
17
|
+
now = Date.now(),
|
|
18
|
+
): ReportFreshness | undefined {
|
|
19
|
+
if (rows.length === 0 && !metadata && !declared) return undefined;
|
|
20
|
+
return deriveHeadlessFreshness(
|
|
21
|
+
{ shape: "rows", freshness: declared },
|
|
22
|
+
{ rows: rows as HeadlessPaneRow[], ...(metadata ? { metadata } : {}) },
|
|
23
|
+
now,
|
|
24
|
+
);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/** One row per quote shown, as `fn` quote reports carry them: live, delayed or stale for its session. */
|
|
28
|
+
function quoteFreshnessRow(quote: Quote): HeadlessPaneRow {
|
|
29
|
+
return { ...quoteFreshnessFields(quote), updatedAt: quote.lastUpdated };
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/** Worst of across the quotes shown, dated by the newest. Quotes that failed to load say nothing. */
|
|
33
|
+
export function quotesFreshness(
|
|
34
|
+
quotes: Iterable<Quote | null | undefined>,
|
|
35
|
+
declared?: HeadlessPaneFreshness,
|
|
36
|
+
now = Date.now(),
|
|
37
|
+
): ReportFreshness | undefined {
|
|
38
|
+
const rows = [...quotes].filter((quote): quote is Quote => quote != null).map(quoteFreshnessRow);
|
|
39
|
+
return rows.length > 0 ? rowsFreshness(rows, declared, undefined, now) : undefined;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/** The newest reported period end in the statements, the period the trailing figures run through. */
|
|
43
|
+
function latestReportedPeriod(financials: Pick<TickerFinancials, "annualStatements" | "quarterlyStatements">): string | null {
|
|
44
|
+
const rows: FinancialStatement[] = [...financials.annualStatements, ...financials.quarterlyStatements];
|
|
45
|
+
return latestFinancialPeriod(rows, (row) => row.date)?.date ?? null;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Fundamentals and valuation: reported figures, not a feed. Dated by when the
|
|
50
|
+
* statistics block was observed, with the newest statement period they run
|
|
51
|
+
* through named in the status; stale only when the block says so.
|
|
52
|
+
*/
|
|
53
|
+
export function fundamentalsFreshness(financials: TickerFinancials, now = Date.now()): ReportFreshness {
|
|
54
|
+
const fundamentals = financials.fundamentals;
|
|
55
|
+
const period = latestReportedPeriod(financials);
|
|
56
|
+
return rowsFreshness([], {
|
|
57
|
+
...REPORTED_DATA,
|
|
58
|
+
basis: period ? `reported through ${period}` : REPORTED_DATA.basis,
|
|
59
|
+
asOf: fundamentals?.fetchedAt ?? null,
|
|
60
|
+
}, { stale: fundamentals?.stale === true }, now)!;
|
|
61
|
+
}
|
package/src/cli/help.ts
CHANGED
|
@@ -10,6 +10,12 @@ import {
|
|
|
10
10
|
wrapText,
|
|
11
11
|
} from "../utils/cli-output";
|
|
12
12
|
|
|
13
|
+
/** `--section` of a command whose report has several tables. */
|
|
14
|
+
export const TABLE_SECTION_OPTION = {
|
|
15
|
+
flags: "--section <title|n>",
|
|
16
|
+
description: "With --csv or --ndjson, write only that table, by its title or number",
|
|
17
|
+
};
|
|
18
|
+
|
|
13
19
|
/** Headings of `gloomberb help`, in display order. */
|
|
14
20
|
export const CLI_COMMAND_GROUPS = {
|
|
15
21
|
research: "Research",
|
|
@@ -29,7 +35,9 @@ const MAX_HELP_WIDTH = 100;
|
|
|
29
35
|
const PIPED_HELP_WIDTH = 80;
|
|
30
36
|
|
|
31
37
|
const GLOBAL_OPTIONS: Array<[string, string]> = [
|
|
32
|
-
["--json
|
|
38
|
+
["--json", "Print the full result as JSON"],
|
|
39
|
+
["--csv", "Print rows as CSV under the columns the text shows; fn reports and fundamentals put each table under # section: and end with # source lines"],
|
|
40
|
+
["--ndjson", "Print one JSON object per table row"],
|
|
33
41
|
["--limit <n>", "Show at most n rows"],
|
|
34
42
|
["--refresh", "Fetch fresh data instead of reading the cache"],
|
|
35
43
|
["--dry-run", "Preview config, cache, notes, alerts, plugin on/off, and remote changes without saving"],
|
|
@@ -95,6 +103,7 @@ export function renderCliHelp(entries: CliHelpEntry[], version: string, descript
|
|
|
95
103
|
["gloomberb", "Open the terminal UI"],
|
|
96
104
|
["gloomberb <command> [args]", "Run a command and print the result"],
|
|
97
105
|
["gloomberb help <command>", "Show a command's usage, options, and examples"],
|
|
106
|
+
["gloomberb ticker SAN:EPA", "Name the listing of a symbol that trades in several places (or --exchange EPA)"],
|
|
98
107
|
], { width }),
|
|
99
108
|
];
|
|
100
109
|
|
|
@@ -177,14 +186,10 @@ function editDistance(left: string, right: string): number {
|
|
|
177
186
|
return previous[right.length]!;
|
|
178
187
|
}
|
|
179
188
|
|
|
180
|
-
|
|
181
|
-
export function suggestCliCommand(token: string, candidates: Iterable<string>): string | null {
|
|
182
|
-
const needle = token.trim().toLowerCase();
|
|
183
|
-
if (!needle || needle.startsWith("-")) return null;
|
|
189
|
+
function closestName(needle: string, candidates: Iterable<string>): string | null {
|
|
184
190
|
const allowed = needle.length <= 4 ? 1 : 2;
|
|
185
191
|
let best: { name: string; score: number } | null = null;
|
|
186
192
|
for (const candidate of candidates) {
|
|
187
|
-
if (candidate.startsWith("-")) continue;
|
|
188
193
|
// A clear prefix ("tick" for "ticker") beats an edit of the same size.
|
|
189
194
|
const score = needle.length >= 3 && candidate.startsWith(needle)
|
|
190
195
|
? 0.5
|
|
@@ -194,3 +199,19 @@ export function suggestCliCommand(token: string, candidates: Iterable<string>):
|
|
|
194
199
|
}
|
|
195
200
|
return best?.name ?? null;
|
|
196
201
|
}
|
|
202
|
+
|
|
203
|
+
/** The closest command token to a mistyped one, or null when nothing is plausibly meant. */
|
|
204
|
+
export function suggestCliCommand(token: string, candidates: Iterable<string>): string | null {
|
|
205
|
+
const needle = token.trim().toLowerCase();
|
|
206
|
+
if (!needle || needle.startsWith("-")) return null;
|
|
207
|
+
return closestName(needle, [...candidates].filter((candidate) => !candidate.startsWith("-")));
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
/** The closest of a command's options to a mistyped one (`--rnage` for `--range`), or null. */
|
|
211
|
+
export function suggestCliOption(flag: string, options: Iterable<string>): string | null {
|
|
212
|
+
const needle = flag.trim().toLowerCase().replace(/^-+/, "");
|
|
213
|
+
if (!needle) return null;
|
|
214
|
+
const byName = new Map([...options].map((option) => [option.replace(/^-+/, ""), option] as const));
|
|
215
|
+
const name = closestName(needle, byName.keys());
|
|
216
|
+
return name == null ? null : byName.get(name)!;
|
|
217
|
+
}
|
package/src/cli/helpers.ts
CHANGED
|
@@ -9,6 +9,7 @@ import { cliStyles, colorBySign } from "../utils/cli-output";
|
|
|
9
9
|
import type { AppConfig } from "../types/config";
|
|
10
10
|
import type { Watchlist, TickerRecord } from "../types/ticker";
|
|
11
11
|
import { isFiniteNumber } from "../utils/guards";
|
|
12
|
+
import { formatUtcTime } from "../utils/utc-time";
|
|
12
13
|
|
|
13
14
|
export function formatSignedCurrency(value: number, currency: string): string {
|
|
14
15
|
return value > 0 ? `+${formatCurrency(value, currency)}` : formatCurrency(value, currency);
|
|
@@ -87,15 +88,10 @@ export function formatPriceRange(
|
|
|
87
88
|
return `${format(low, { fixedFractionDigits: digits })}${separator}${format(high, { fixedFractionDigits: digits })}`;
|
|
88
89
|
}
|
|
89
90
|
|
|
91
|
+
/** A timestamp in CLI text: UTC with the zone named, the same on every machine. */
|
|
90
92
|
export function formatTimestamp(timestamp: number | undefined): string {
|
|
91
|
-
if (!timestamp) return "—";
|
|
92
|
-
return new Date(timestamp)
|
|
93
|
-
month: "short",
|
|
94
|
-
day: "numeric",
|
|
95
|
-
year: "numeric",
|
|
96
|
-
hour: "numeric",
|
|
97
|
-
minute: "2-digit",
|
|
98
|
-
});
|
|
93
|
+
if (!timestamp || !Number.isFinite(timestamp)) return "—";
|
|
94
|
+
return formatUtcTime(new Date(timestamp)) || "—";
|
|
99
95
|
}
|
|
100
96
|
|
|
101
97
|
export function formatBidAsk(
|
package/src/cli/history-rows.ts
CHANGED
|
@@ -1,19 +1,52 @@
|
|
|
1
1
|
import type { PricePoint } from "../types/financials";
|
|
2
2
|
import { marketPriceFractionDigitCeiling, resolveAssetDisplayKind } from "../market-data/market/format";
|
|
3
|
-
import {
|
|
3
|
+
import { TIME_RANGES, type TimeRange } from "../time-series/range";
|
|
4
|
+
import { subtractTimeRange } from "../time-series/date-window";
|
|
5
|
+
import {
|
|
6
|
+
CHART_RESOLUTION_STEP_MS,
|
|
7
|
+
isIntradayResolution,
|
|
8
|
+
RANGE_HISTORY_RESOLUTION,
|
|
9
|
+
type ManualChartResolution,
|
|
10
|
+
} from "../time-series/resolution";
|
|
11
|
+
import { currencyUnitLabel } from "../utils/currency-units";
|
|
4
12
|
import { getPricePointTimestamp } from "../utils/price-history";
|
|
13
|
+
import { pricePointIntegrityFlags, pricePointValues } from "../utils/price-history-integrity";
|
|
14
|
+
import { formatUtcTime } from "../utils/utc-time";
|
|
5
15
|
|
|
6
16
|
const PRICE_KEYS = ["open", "high", "low", "close"] as const;
|
|
17
|
+
const DAY_MS = 24 * 60 * 60 * 1000;
|
|
7
18
|
/** Daily bars are a day apart even when stamped at the session open. */
|
|
8
19
|
const INTRADAY_MAX_GAP_MS = 20 * 60 * 60 * 1000;
|
|
20
|
+
const INTRADAY_RESOLUTIONS = ["1m", "5m", "15m", "30m", "45m", "1h"] as const;
|
|
21
|
+
/** A first bar later than this after the range's start is a late start, not a weekend or holiday. */
|
|
22
|
+
const LATE_START_MIN_MS = 10 * DAY_MS;
|
|
23
|
+
const LATE_START_MIN_BARS = 3;
|
|
9
24
|
|
|
10
|
-
|
|
25
|
+
const BAR_INTERVAL_LABELS: Record<ManualChartResolution, string> = {
|
|
26
|
+
"1m": "1-minute",
|
|
27
|
+
"5m": "5-minute",
|
|
28
|
+
"15m": "15-minute",
|
|
29
|
+
"30m": "30-minute",
|
|
30
|
+
"45m": "45-minute",
|
|
31
|
+
"1h": "hourly",
|
|
32
|
+
"1d": "daily",
|
|
33
|
+
"1wk": "weekly",
|
|
34
|
+
"1mo": "monthly",
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
export interface HistoryRow {
|
|
11
38
|
date: string;
|
|
12
39
|
open: number | null;
|
|
13
40
|
high: number | null;
|
|
14
41
|
low: number | null;
|
|
15
|
-
close: number;
|
|
42
|
+
close: number | null;
|
|
16
43
|
volume: number | null;
|
|
44
|
+
/** Currency code of the prices; null for index points or when no source says. */
|
|
45
|
+
currency: string | null;
|
|
46
|
+
/** Bar size, in the codes of `resolution`: 5m, 1h, 1d, 1wk, 1mo. */
|
|
47
|
+
interval: ManualChartResolution | null;
|
|
48
|
+
/** Each way the bar's prices contradict each other, such as `high<open`; null when they agree. */
|
|
49
|
+
flag: string | null;
|
|
17
50
|
}
|
|
18
51
|
|
|
19
52
|
function decimalPlaces(value: number): number {
|
|
@@ -43,29 +76,63 @@ function isUtcMidnight(time: number): boolean {
|
|
|
43
76
|
return new Date(time).toISOString().endsWith("T00:00:00.000Z");
|
|
44
77
|
}
|
|
45
78
|
|
|
79
|
+
function medianGap(times: readonly number[]): number | null {
|
|
80
|
+
const finite = times.filter(Number.isFinite).sort((left, right) => left - right);
|
|
81
|
+
const gaps = finite.slice(1).map((time, index) => time - finite[index]!).filter((gap) => gap > 0).sort((left, right) => left - right);
|
|
82
|
+
return gaps.length > 0 ? gaps[Math.floor((gaps.length - 1) / 2)]! : null;
|
|
83
|
+
}
|
|
84
|
+
|
|
46
85
|
/** Without a declared cadence, bar spacing decides: daily bars may be stamped at the session open. */
|
|
47
86
|
function looksIntraday(times: readonly number[]): boolean {
|
|
48
|
-
const finite = times.filter(Number.isFinite)
|
|
87
|
+
const finite = times.filter(Number.isFinite);
|
|
49
88
|
if (finite.length < 2) return finite.some((time) => !isUtcMidnight(time));
|
|
50
|
-
const
|
|
51
|
-
return
|
|
89
|
+
const gap = medianGap(finite);
|
|
90
|
+
return gap != null && gap < INTRADAY_MAX_GAP_MS;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/** The bar size served: as the source declared it, otherwise read from the typical spacing of the bars. */
|
|
94
|
+
function historyInterval(times: readonly number[], resolution: ManualChartResolution | null): ManualChartResolution | null {
|
|
95
|
+
if (resolution) return resolution;
|
|
96
|
+
const gap = medianGap(times);
|
|
97
|
+
if (gap == null) return null;
|
|
98
|
+
if (gap < INTRADAY_MAX_GAP_MS) {
|
|
99
|
+
return INTRADAY_RESOLUTIONS.reduce((best, candidate) => (
|
|
100
|
+
Math.abs(CHART_RESOLUTION_STEP_MS[candidate] - gap) < Math.abs(CHART_RESOLUTION_STEP_MS[best] - gap) ? candidate : best
|
|
101
|
+
));
|
|
102
|
+
}
|
|
103
|
+
const days = gap / DAY_MS;
|
|
104
|
+
return days >= 25 ? "1mo" : days >= 6 ? "1wk" : "1d";
|
|
52
105
|
}
|
|
53
106
|
|
|
54
|
-
/**
|
|
55
|
-
|
|
107
|
+
/**
|
|
108
|
+
* Intraday bars keep their UTC time; daily and longer bars are trading dates.
|
|
109
|
+
* A bar whose prices contradict each other is blanked exactly as HP blanks it,
|
|
110
|
+
* and says why in `flag`.
|
|
111
|
+
*/
|
|
112
|
+
export function historyRows(
|
|
113
|
+
points: readonly PricePoint[],
|
|
114
|
+
resolution: ManualChartResolution | null,
|
|
115
|
+
currency: string | null = null,
|
|
116
|
+
): HistoryRow[] {
|
|
56
117
|
const times = points.map(getPricePointTimestamp);
|
|
57
118
|
const intraday = resolution ? isIntradayResolution(resolution) : looksIntraday(times);
|
|
119
|
+
const interval = historyInterval(times, resolution);
|
|
58
120
|
return points.map((point, index) => {
|
|
59
121
|
const time = times[index]!;
|
|
60
122
|
const iso = Number.isFinite(time) ? new Date(time).toISOString() : "";
|
|
61
|
-
const
|
|
123
|
+
const values = pricePointValues(point);
|
|
124
|
+
const flags = pricePointIntegrityFlags(point);
|
|
125
|
+
const price = (value: number | null) => value == null ? null : cleanFloat32Price(value);
|
|
62
126
|
return {
|
|
63
127
|
date: intraday ? iso.replace(".000Z", "Z") : iso.slice(0, 10),
|
|
64
|
-
open: price(
|
|
65
|
-
high: price(
|
|
66
|
-
low: price(
|
|
67
|
-
close:
|
|
68
|
-
volume:
|
|
128
|
+
open: price(values.open),
|
|
129
|
+
high: price(values.high),
|
|
130
|
+
low: price(values.low),
|
|
131
|
+
close: price(values.close),
|
|
132
|
+
volume: values.volume,
|
|
133
|
+
currency,
|
|
134
|
+
interval,
|
|
135
|
+
flag: flags.length > 0 ? flags.join(",") : null,
|
|
69
136
|
};
|
|
70
137
|
});
|
|
71
138
|
}
|
|
@@ -84,7 +151,7 @@ function neededDecimals(value: number, cap: number): number {
|
|
|
84
151
|
* one, the largest price sets a seven significant digit ceiling (BTC keeps
|
|
85
152
|
* cents, FX keeps pips, sub-cent coins keep their digits). Cents at least above 1.
|
|
86
153
|
*/
|
|
87
|
-
export function historyPriceDecimals(rows: readonly HistoryRow[], assetCategory?: string): number {
|
|
154
|
+
export function historyPriceDecimals(rows: readonly Pick<HistoryRow, typeof PRICE_KEYS[number]>[], assetCategory?: string): number {
|
|
88
155
|
const values = rows.flatMap((row) => PRICE_KEYS.flatMap((key) => {
|
|
89
156
|
const value = row[key];
|
|
90
157
|
return value != null && Number.isFinite(value) && value !== 0 ? [Math.abs(value)] : [];
|
|
@@ -100,3 +167,108 @@ export function historyPriceDecimals(rows: readonly HistoryRow[], assetCategory?
|
|
|
100
167
|
const decimals = needed[Math.floor(0.9 * (needed.length - 1))]!;
|
|
101
168
|
return largest >= 1 ? Math.max(2, decimals) : decimals;
|
|
102
169
|
}
|
|
170
|
+
|
|
171
|
+
/** How far back ALL reaches, in whole years, from the window a history request for it asks for. */
|
|
172
|
+
export function historyAllRangeYears(now = new Date()): number {
|
|
173
|
+
return Math.round((now.getTime() - subtractTimeRange(now, "ALL").getTime()) / (365.25 * DAY_MS));
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/** "1D 5-minute, 1W hourly, 1M to 1Y daily, 5Y weekly, ALL monthly", from the table history requests use. */
|
|
177
|
+
export function historyIntervalsByRange(): string {
|
|
178
|
+
const groups: Array<{ ranges: TimeRange[]; resolution: ManualChartResolution }> = [];
|
|
179
|
+
for (const range of TIME_RANGES) {
|
|
180
|
+
const resolution = RANGE_HISTORY_RESOLUTION[range];
|
|
181
|
+
const last = groups.at(-1);
|
|
182
|
+
if (last?.resolution === resolution) last.ranges.push(range);
|
|
183
|
+
else groups.push({ ranges: [range], resolution });
|
|
184
|
+
}
|
|
185
|
+
return groups.map(({ ranges, resolution }) => (
|
|
186
|
+
`${ranges.length > 1 ? `${ranges[0]} to ${ranges.at(-1)}` : ranges[0]} ${BAR_INTERVAL_LABELS[resolution]}`
|
|
187
|
+
)).join(", ");
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
export interface HistoryUnit {
|
|
191
|
+
kind: "currency" | "pair" | "points" | "unknown";
|
|
192
|
+
/** Currency code of the prices; null for index points or when no source says. */
|
|
193
|
+
currency: string | null;
|
|
194
|
+
/** What one price is: "USD", "ILA (agorot, 1/100 ILS)", "ZAR per USD", "index points"; null when unknown. */
|
|
195
|
+
unit: string | null;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/**
|
|
199
|
+
* What the prices are in. An FX pair is named by its symbol (ZAR=X is ZAR per
|
|
200
|
+
* USD, EURUSD=X is USD per EUR), an index is in points, and anything else is
|
|
201
|
+
* in the currency its quote states, a sub-unit named as such. Without one the
|
|
202
|
+
* unit is unknown rather than guessed from the exchange.
|
|
203
|
+
*/
|
|
204
|
+
export function historyUnit(symbol: string, quote: { currency?: string; instrumentType?: string } | null | undefined): HistoryUnit {
|
|
205
|
+
const pair = /^([A-Z]{3})([A-Z]{3})?=X$/.exec(symbol.trim().toUpperCase());
|
|
206
|
+
if (pair) {
|
|
207
|
+
const [base, counter] = pair[2] ? [pair[1]!, pair[2]] : ["USD", pair[1]!];
|
|
208
|
+
return { kind: "pair", currency: counter, unit: `${counter} per ${base}` };
|
|
209
|
+
}
|
|
210
|
+
if (quote?.instrumentType?.trim().toUpperCase() === "INDEX") return { kind: "points", currency: null, unit: "index points" };
|
|
211
|
+
const code = quote?.currency?.trim();
|
|
212
|
+
return code
|
|
213
|
+
? { kind: "currency", currency: code, unit: currencyUnitLabel(code, { ofMajor: true }) }
|
|
214
|
+
: { kind: "unknown", currency: null, unit: null };
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
function historyDate(value: string): string {
|
|
218
|
+
return value.length > 10 ? formatUtcTime(value) : value;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/** The facts line under a history heading: "Currency USD", "daily bars", "2025-10-09 to 2026-10-08", "251 bars". */
|
|
222
|
+
export function historyFacts(unit: HistoryUnit, rows: readonly Pick<HistoryRow, "date" | "interval">[]): string[] {
|
|
223
|
+
const first = rows[0]?.date;
|
|
224
|
+
const last = rows.at(-1)?.date;
|
|
225
|
+
const interval = rows[0]?.interval;
|
|
226
|
+
return [
|
|
227
|
+
unit.kind === "pair" ? unit.unit! : unit.kind === "points" ? "Index points" : `Currency ${unit.unit ?? "unknown"}`,
|
|
228
|
+
interval ? `${BAR_INTERVAL_LABELS[interval]} bars` : "",
|
|
229
|
+
first && last ? (first === last ? historyDate(first) : `${historyDate(first)} to ${historyDate(last)}`) : "",
|
|
230
|
+
`${rows.length} ${rows.length === 1 ? "bar" : "bars"}`,
|
|
231
|
+
].filter(Boolean);
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
/**
|
|
235
|
+
* What an export should know that its rows do not show: bars coarser than the
|
|
236
|
+
* range is served in, or a first bar well after the start asked for, as for a
|
|
237
|
+
* listing younger than the range. Weekends and holidays are within tolerance.
|
|
238
|
+
*/
|
|
239
|
+
export function historyNotes(
|
|
240
|
+
range: TimeRange,
|
|
241
|
+
interval: ManualChartResolution | null,
|
|
242
|
+
firstDate: string | undefined,
|
|
243
|
+
now = Date.now(),
|
|
244
|
+
): string[] {
|
|
245
|
+
if (!firstDate) return [];
|
|
246
|
+
const notes: string[] = [];
|
|
247
|
+
const expected = RANGE_HISTORY_RESOLUTION[range];
|
|
248
|
+
if (interval && CHART_RESOLUTION_STEP_MS[interval] > CHART_RESOLUTION_STEP_MS[expected]) {
|
|
249
|
+
const from = interval === "1mo" ? firstDate.slice(0, 7) : firstDate.slice(0, 10);
|
|
250
|
+
notes.push(`Asked ${range}, got ${BAR_INTERVAL_LABELS[interval]} bars from ${from}`);
|
|
251
|
+
}
|
|
252
|
+
const first = Date.parse(firstDate);
|
|
253
|
+
if (range !== "ALL" && Number.isFinite(first)) {
|
|
254
|
+
const tolerance = Math.max(LATE_START_MIN_MS, LATE_START_MIN_BARS * CHART_RESOLUTION_STEP_MS[interval ?? expected]);
|
|
255
|
+
if (first - subtractTimeRange(new Date(now), range).getTime() > tolerance) {
|
|
256
|
+
notes.push(`Asked ${range}, data starts ${firstDate.slice(0, 10)} (first available bar)`);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
return notes;
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
/** "37 of 251 bars have high below open or close in the source data; ...", or null when every bar agrees. */
|
|
263
|
+
export function historyFlagNote(rows: readonly Pick<HistoryRow, "flag">[]): string | null {
|
|
264
|
+
const flagged = rows.filter((row) => row.flag);
|
|
265
|
+
if (flagged.length === 0) return null;
|
|
266
|
+
const codes = new Set(flagged.flatMap((row) => row.flag!.split(",")));
|
|
267
|
+
const kinds = [
|
|
268
|
+
codes.has("high<open") || codes.has("high<close") ? "high below open or close" : "",
|
|
269
|
+
codes.has("low>open") || codes.has("low>close") ? "low above open or close" : "",
|
|
270
|
+
codes.has("low>high") ? "low above high" : "",
|
|
271
|
+
].filter(Boolean);
|
|
272
|
+
const count = `${flagged.length} of ${rows.length} ${flagged.length === 1 && rows.length === 1 ? "bar" : "bars"}`;
|
|
273
|
+
return `${count} ${flagged.length === 1 ? "has" : "have"} ${kinds.join(", or ")} in the source data; their prices are left blank`;
|
|
274
|
+
}
|
package/src/cli/index.ts
CHANGED
|
@@ -16,13 +16,17 @@ import {
|
|
|
16
16
|
renderCliHelp,
|
|
17
17
|
renderCommandHelp,
|
|
18
18
|
suggestCliCommand,
|
|
19
|
+
TABLE_SECTION_OPTION,
|
|
19
20
|
type CliHelpEntry,
|
|
20
21
|
} from "./help";
|
|
21
22
|
import { parsePaneFunctionArgs } from "./pane-functions/options";
|
|
23
|
+
import { checkCliCommandOptions } from "./command-options";
|
|
22
24
|
import { fail, inferCliErrorOptions, printCliError } from "./errors";
|
|
23
25
|
import { setCliColorEnabledOverride } from "../utils/cli-output";
|
|
24
26
|
import { search, searchCandidatesForCli, buildSearchReport } from "./commands/search";
|
|
25
27
|
import { ticker } from "./commands/ticker";
|
|
28
|
+
import { requireOneArg, takeOption } from "./commands/command-utils";
|
|
29
|
+
import { EXCHANGE_OPTION } from "./listing-arg";
|
|
26
30
|
import { apiCliCommand } from "./commands/api";
|
|
27
31
|
import { marketDataCliCommands } from "./commands/market";
|
|
28
32
|
import { overviewCliCommands } from "./commands/overview";
|
|
@@ -99,14 +103,15 @@ function createCoreCliCommands(
|
|
|
99
103
|
help: {
|
|
100
104
|
group: CLI_COMMAND_GROUPS.research,
|
|
101
105
|
usage: ["ticker <symbol>"],
|
|
102
|
-
|
|
106
|
+
options: [EXCHANGE_OPTION],
|
|
107
|
+
examples: ["ticker AAPL", "ticker SAN:EPA", "ticker 7203.T", "ticker AAPL --json"],
|
|
103
108
|
},
|
|
104
|
-
execute: async (
|
|
105
|
-
const
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
109
|
+
execute: async (rawArgs, ctx) => {
|
|
110
|
+
const args = [...rawArgs];
|
|
111
|
+
const exchange = takeOption(args, "--exchange");
|
|
112
|
+
const symbol = requireOneArg(args, "ticker <symbol>", "symbol", ctx);
|
|
113
|
+
await ticker(symbol, {
|
|
114
|
+
exchange,
|
|
110
115
|
initMarketData: ctx.initMarketData,
|
|
111
116
|
fail: ctx.fail,
|
|
112
117
|
...(ctx.cliOptions.format === "text" ? {} : { printResult: ctx.printResult }),
|
|
@@ -122,7 +127,7 @@ function createCoreCliCommands(
|
|
|
122
127
|
usage: ["catalog [query] [--all] [--bot-safe]"],
|
|
123
128
|
options: [
|
|
124
129
|
{ flags: "--all", description: "List every match instead of the first 25" },
|
|
125
|
-
{ flags: "--bot-safe", description: "Only functions with a verified unattended report" },
|
|
130
|
+
{ flags: "--bot-safe, --botsafe", description: "Only functions with a verified unattended report" },
|
|
126
131
|
],
|
|
127
132
|
examples: ["catalog", "catalog options", "catalog HP"],
|
|
128
133
|
},
|
|
@@ -140,10 +145,17 @@ function createCoreCliCommands(
|
|
|
140
145
|
options: [
|
|
141
146
|
{ flags: "--<option> <value>", description: "A function setting; gloomberb catalog <function> lists them" },
|
|
142
147
|
{ flags: "--require-bot-safe", description: "Fail unless the function has a verified, complete report" },
|
|
148
|
+
{
|
|
149
|
+
...TABLE_SECTION_OPTION,
|
|
150
|
+
description: `${TABLE_SECTION_OPTION.description} (CALLS keeps --section for the transcript part)`,
|
|
151
|
+
},
|
|
152
|
+
EXCHANGE_OPTION,
|
|
143
153
|
],
|
|
144
154
|
examples: [
|
|
145
155
|
"fn HP AAPL",
|
|
156
|
+
"fn ANR SAN:EPA",
|
|
146
157
|
"fn CBR --json",
|
|
158
|
+
"fn WEI --csv --section europe > europe.csv",
|
|
147
159
|
"fn 13F AAPL --view=ticker-holdings",
|
|
148
160
|
"fn OVME --spot 100 --strike 100 --days 30 --volatility 25",
|
|
149
161
|
],
|
|
@@ -168,9 +180,11 @@ function createCoreCliCommands(
|
|
|
168
180
|
{ flags: "--scale <n>", description: "Text scale from 0.5 to 4 (default 1)" },
|
|
169
181
|
{ flags: "--watermark <label>", description: "Label drawn in the pane title bar" },
|
|
170
182
|
{ flags: "--<option> <value>", description: "A function setting; gloomberb catalog <function> lists them" },
|
|
183
|
+
EXCHANGE_OPTION,
|
|
171
184
|
],
|
|
172
185
|
examples: [
|
|
173
186
|
"shot TAS AAPL --output tape.png",
|
|
187
|
+
"shot HP BHP:ASX",
|
|
174
188
|
"shot DDIS MSFT --tab history",
|
|
175
189
|
"shot HP NVDA --width 1600 --theme green",
|
|
176
190
|
],
|
|
@@ -344,6 +358,7 @@ export async function dispatchCli(args: string[], options: DispatchCliOptions =
|
|
|
344
358
|
const target = helpOnly ? registry.lookup.get("help")! : resolved;
|
|
345
359
|
const commandArgs = helpOnly ? [resolved.command.name] : parsed.args.slice(1);
|
|
346
360
|
try {
|
|
361
|
+
if (!helpOnly && resolved.builtin) checkCliCommandOptions(resolved.command, commandArgs, parsed.literalStart - 1);
|
|
347
362
|
const result = await target.command.execute(
|
|
348
363
|
commandArgs,
|
|
349
364
|
createCliCommandContext(target.ownerId, registry, parsed.options),
|