gloomberb 0.16.1 → 0.16.2
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 +24 -0
- package/src/cli/commands/command-utils.ts +8 -0
- package/src/cli/commands/crypto-hints.ts +75 -0
- package/src/cli/commands/market.ts +414 -106
- package/src/cli/commands/overview.ts +77 -32
- package/src/cli/commands/ticker.ts +101 -43
- package/src/cli/desktop-pane-shot.ts +34 -4
- package/src/cli/freshness.ts +61 -0
- package/src/cli/help.ts +1 -0
- package/src/cli/helpers.ts +4 -8
- package/src/cli/index.ts +12 -2
- package/src/cli/listing-arg.ts +321 -0
- package/src/cli/pane-functions/access-gate.ts +42 -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 +20 -2
- package/src/cli/pane-functions/freshness.ts +400 -0
- package/src/cli/pane-functions/function-help.ts +27 -20
- package/src/cli/pane-functions/headless.ts +39 -11
- package/src/cli/pane-functions/index.ts +15 -4
- package/src/cli/pane-functions/options.ts +3 -0
- package/src/cli/pane-functions/report.ts +4 -0
- package/src/cli/pane-functions/resolver.ts +35 -7
- package/src/cli/pane-functions/screenshot-evidence.ts +2 -0
- package/src/cli/pane-functions/screenshot.ts +7 -3
- package/src/cli/result.ts +41 -27
- 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/view.tsx +29 -10
- 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/menu.ts +2 -1
- package/src/components/layout/shell/pane/actions.ts +2 -1
- package/src/components/layout/shell/pane/layers.tsx +14 -3
- 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/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 +78 -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/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/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 +1 -1
- 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/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 +1 -1
- 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/headless.ts +139 -5
- package/src/plugins/builtin/holders/index.tsx +10 -3
- package/src/plugins/builtin/holders/pane.tsx +20 -3
- package/src/plugins/builtin/holders/report-header.ts +95 -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/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 +13 -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 +248 -47
- package/src/plugins/builtin/portfolio-list/allocation.ts +245 -0
- package/src/plugins/builtin/portfolio-list/cached-account.ts +33 -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 +230 -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 +98 -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 +47 -13
- package/src/plugins/builtin/portfolio-list/settings.ts +33 -2
- package/src/plugins/builtin/portfolio-list/summary/index.tsx +24 -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 +11 -3
- 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/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/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/social-mentions/headless.ts +1 -0
- 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/thirteenf/headless.ts +110 -25
- package/src/plugins/builtin/thirteenf/report-notes.ts +149 -0
- package/src/plugins/builtin/ticker-detail/headless.ts +7 -1
- package/src/plugins/builtin/ticker-detail/index.tsx +1 -0
- package/src/plugins/builtin/ticker-detail/overview/model.ts +9 -2
- package/src/plugins/builtin/ticker-detail/overview-tab.tsx +26 -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 +157 -0
- package/src/plugins/builtin/world-venue-map/basemap.ts +214 -0
- package/src/plugins/builtin/world-venue-map/client.ts +45 -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 +447 -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 +67 -4
- package/src/plugins/builtin/world-venue-map/layered-pane.tsx +552 -0
- package/src/plugins/builtin/world-venue-map/layers.ts +348 -0
- package/src/plugins/builtin/world-venue-map/map-symbols.ts +220 -0
- package/src/plugins/builtin/world-venue-map/map.tsx +381 -45
- package/src/plugins/builtin/world-venue-map/model.ts +7 -4
- package/src/plugins/builtin/world-venue-map/natural-earth/index.chunk.ts +199 -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 +28 -43
- 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/dom/build-assets.ts +81 -3
- 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/input.tsx +14 -3
- package/src/renderers/dom/styles.css +6 -7
- package/src/renderers/electrobun/view/backend-rpc.ts +10 -4
- package/src/renderers/electrobun/view/cli-pane-shot-entry.tsx +1 -0
- package/src/renderers/electrobun/view/rpc-timeout.ts +14 -3
- package/src/renderers/opentui/host.tsx +5 -0
- package/src/sources/gloomberb-cloud/index.ts +25 -4
- package/src/sources/gloomberb-cloud/normalizers.ts +27 -3
- package/src/sources/provider-router/cached-routes.ts +4 -1
- package/src/sources/provider-router/financials.ts +8 -7
- package/src/sources/provider-router/history.ts +15 -10
- 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/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/theme/heat-colors.ts +266 -84
- 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 +3 -0
- 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 +14 -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 +14 -0
- package/src/utils/depositary-receipt.ts +26 -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/price-earnings.ts +70 -3
- 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/README.md
CHANGED
|
@@ -86,7 +86,8 @@ Press `Ctrl+P` to open the command bar, or press `` ` `` to search for a ticker.
|
|
|
86
86
|
| `TOP` | Market stories |
|
|
87
87
|
| `WIRP` / `FFIP` | US rate path and conditional FOMC probabilities |
|
|
88
88
|
| `BTMM` | Funding rates, bill curves and Federal Reserve liquidity |
|
|
89
|
-
| `CTM [root]` | Futures contract curve, historical ghosts, roll yield and open interest, including `CTM VX` |
|
|
89
|
+
| `CTM [root]` | Futures contract curve, historical ghosts, roll yield and open interest, including `CTM VX` and CME crypto (`CTM BTC`) |
|
|
90
|
+
| `MAP ships` / `CHOKE` | Ships, ports, energy and airports on one map, and chokepoint transits as chart series ([guide](docs/world-map.md)) |
|
|
90
91
|
| `PF` | Portfolios and watchlists |
|
|
91
92
|
| `HELP` | Commands and keyboard shortcuts |
|
|
92
93
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "gloomberb",
|
|
3
|
-
"version": "0.16.
|
|
3
|
+
"version": "0.16.2",
|
|
4
4
|
"packageManager": "bun@1.3.11",
|
|
5
5
|
"description": "Market research and portfolio tracker for the terminal",
|
|
6
6
|
"module": "src/public/index.ts",
|
|
@@ -66,6 +66,7 @@
|
|
|
66
66
|
"plugins:manifest:check": "bun run scripts/generate-plugin-manifest.ts --check",
|
|
67
67
|
"plugins:registry:check": "bun run scripts/check-registry-plugins.ts",
|
|
68
68
|
"web:proxy-hosts": "bun run scripts/generate-web-proxy-hosts.ts",
|
|
69
|
+
"map:data": "bun run scripts/generate-world-map-data.ts",
|
|
69
70
|
"web:proxy-hosts:check": "bun run scripts/generate-web-proxy-hosts.ts --check",
|
|
70
71
|
"typecheck": "bun run typecheck:opentui && bun run typecheck:dom && bun run typecheck:cloudflare && bun run typecheck:scripts && bun run typecheck:plugin-tests",
|
|
71
72
|
"typecheck:opentui": "tsc --project tsconfig.opentui.json",
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schedule 13D and 13G beneficial ownership reports about one issuer, as
|
|
3
|
+
* `GET /cloud/sec/beneficial-owners` returns them. Percentages are percent
|
|
4
|
+
* points (7.3 means 7.3% of the class) and dates are `YYYY-MM-DD`.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
type BeneficialOwnerKind = "13D" | "13G";
|
|
8
|
+
/**
|
|
9
|
+
* What the filer's latest report says it holds: `below-threshold` is a
|
|
10
|
+
* reported stake under 5% (still a stake, no longer reportable), `exited` a
|
|
11
|
+
* report of zero shares or 0%.
|
|
12
|
+
*/
|
|
13
|
+
export type BeneficialOwnerStatus = "holder" | "below-threshold" | "exited";
|
|
14
|
+
/** Which reports to list; the route takes the kind in capitals. */
|
|
15
|
+
export type BeneficialOwnersForm = "all" | BeneficialOwnerKind;
|
|
16
|
+
|
|
17
|
+
export interface BeneficialOwnerReportingPerson {
|
|
18
|
+
name: string;
|
|
19
|
+
cik: string | null;
|
|
20
|
+
percentOfClass: number | null;
|
|
21
|
+
shares: number | null;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* One report: the latest per filer in `owners`, every report in `filings`.
|
|
26
|
+
* The previous-report fields and `status` come only with `owners`.
|
|
27
|
+
*/
|
|
28
|
+
export interface BeneficialOwnerFiling {
|
|
29
|
+
filerCik: string | null;
|
|
30
|
+
filerName: string;
|
|
31
|
+
/** The EDGAR form type as filed, such as `SCHEDULE 13G/A`. */
|
|
32
|
+
form: string;
|
|
33
|
+
kind: BeneficialOwnerKind;
|
|
34
|
+
amendment: boolean;
|
|
35
|
+
amendmentNo: number | null;
|
|
36
|
+
percentOfClass: number | null;
|
|
37
|
+
shares: number | null;
|
|
38
|
+
classTitle: string | null;
|
|
39
|
+
cusip: string | null;
|
|
40
|
+
eventDate: string | null;
|
|
41
|
+
filingDate: string;
|
|
42
|
+
accessionNumber: string;
|
|
43
|
+
filingUrl: string;
|
|
44
|
+
/** The same filer's percentage in its report before this one. */
|
|
45
|
+
previousPercent?: number | null;
|
|
46
|
+
previousFilingDate?: string | null;
|
|
47
|
+
status?: BeneficialOwnerStatus;
|
|
48
|
+
/**
|
|
49
|
+
* Only with `owners`: a filing the route could not read may be this filer's
|
|
50
|
+
* newer report or its real previous one, so the row and its change may be off.
|
|
51
|
+
*/
|
|
52
|
+
provisional?: boolean;
|
|
53
|
+
/** `text` and `index` reports could not be read in full; their missing numbers stay null. */
|
|
54
|
+
source: "xml" | "text" | "index";
|
|
55
|
+
reportingPersons: BeneficialOwnerReportingPerson[];
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export interface BeneficialOwnersCoverage {
|
|
59
|
+
from: string | null;
|
|
60
|
+
/** Reports listed for the issuer in the window. */
|
|
61
|
+
filings: number;
|
|
62
|
+
/** Reports whose cover page was read. */
|
|
63
|
+
parsed: number;
|
|
64
|
+
/** Reports known only from the EDGAR index: listed, with their figures missing. */
|
|
65
|
+
unparsed: number;
|
|
66
|
+
/** Reports that could not be read this time and are left out until a later request. */
|
|
67
|
+
unavailable?: number;
|
|
68
|
+
/** Every report in the window was read; when false the owners are provisional. */
|
|
69
|
+
complete?: boolean;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export interface BeneficialOwnersPayload {
|
|
73
|
+
ticker: string;
|
|
74
|
+
cik: string;
|
|
75
|
+
companyName: string;
|
|
76
|
+
/** When the server assembled the list, an ISO time. */
|
|
77
|
+
asOf: string | null;
|
|
78
|
+
owners: BeneficialOwnerFiling[];
|
|
79
|
+
/** Only when the request asked for the history. Newest first. */
|
|
80
|
+
filings?: BeneficialOwnerFiling[];
|
|
81
|
+
hasMore: boolean;
|
|
82
|
+
nextOffset: number | null;
|
|
83
|
+
coverage: BeneficialOwnersCoverage | null;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
export interface CloudBeneficialOwnersParams {
|
|
87
|
+
ticker: string;
|
|
88
|
+
form?: BeneficialOwnersForm;
|
|
89
|
+
history?: boolean;
|
|
90
|
+
limit?: number;
|
|
91
|
+
offset?: number;
|
|
92
|
+
}
|
package/src/api-client/data.ts
CHANGED
|
@@ -30,6 +30,7 @@ import type { MoneyMarketsPayload } from "./money-markets";
|
|
|
30
30
|
import type { CloudCurveId, CloudCurveView, CloudWorldCurves } from "./yield-curves";
|
|
31
31
|
import type { CdxBoardPayload, CloudCreditBoardParams, SovrBoardPayload } from "./credit-boards";
|
|
32
32
|
import type { ShortVolumePayload, ShortVolumeScope } from "./short-volume";
|
|
33
|
+
import type { BeneficialOwnersPayload, CloudBeneficialOwnersParams } from "./beneficial-owners";
|
|
33
34
|
import type { SocialMentionDayPosts, SocialMentionsPayload, SocialMentionsRange } from "./social-mentions";
|
|
34
35
|
import type { FuturesCurveAsOfPayload, FuturesCurvePayload } from "./futures-curve";
|
|
35
36
|
import type { CotBoardPayload, CotContractPayload, CotFamily, CotClass } from "./cot";
|
|
@@ -37,6 +38,7 @@ import type { DoeBoardPayload } from "./doe";
|
|
|
37
38
|
import type { GpuBoardPayload, GpuEventsPayload, GpuHistoryPayload, GpuHistoryQuery } from "./gpu";
|
|
38
39
|
import type { CpiBoardPayload } from "./cpi";
|
|
39
40
|
import type { TapeSnapshot } from "./tape";
|
|
41
|
+
import { signalWithTimeout } from "../utils/async-deadline";
|
|
40
42
|
import type { ExchangeRateSnapshot } from "../types/exchange-rate";
|
|
41
43
|
import type { RatePathPayload } from "./rates";
|
|
42
44
|
import type { EarningsCalendarPayload, EarningsCalendarQuery, EarningsHistoryPayload } from "./earnings";
|
|
@@ -70,6 +72,7 @@ import {
|
|
|
70
72
|
cloudProxyStatementsPath,
|
|
71
73
|
cloudExchangeRatePath,
|
|
72
74
|
cloudSec13FPath,
|
|
75
|
+
cloudSecBeneficialOwnersPath,
|
|
73
76
|
cloudSecFilingContentPath,
|
|
74
77
|
cloudSecFilingDocumentsPath,
|
|
75
78
|
cloudSecFilingsPath,
|
|
@@ -434,6 +437,11 @@ export class CloudDataApi {
|
|
|
434
437
|
return this.request<CotContractPayload>(`/cloud/cot/contracts/${encodeURIComponent(code)}?${new URLSearchParams({ report })}`);
|
|
435
438
|
}
|
|
436
439
|
|
|
440
|
+
/** Geo layers (the map's layers, entities and series); one prefix-scoped method, like EQS. */
|
|
441
|
+
geo<T>(path: string, init?: RequestInit): Promise<T> {
|
|
442
|
+
return this.request<T>(`/cloud/geo/${path}`, init);
|
|
443
|
+
}
|
|
444
|
+
|
|
437
445
|
/** Credit-document paths stay with their pane; keep the shared client small. */
|
|
438
446
|
creditDocuments<T>(path: string): Promise<T> {
|
|
439
447
|
return this.request<T>(`/cloud/credit-documents/${path}`);
|
|
@@ -572,7 +580,7 @@ export class CloudDataApi {
|
|
|
572
580
|
}
|
|
573
581
|
|
|
574
582
|
async getCloudTape(symbol: string, exchange: string, signal?: AbortSignal): Promise<TapeSnapshot> {
|
|
575
|
-
return this.request<TapeSnapshot>(`/cloud/tape/${encodeURIComponent(symbol)}?exchange=${encodeURIComponent(exchange)}`, { signal: signal
|
|
583
|
+
return this.request<TapeSnapshot>(`/cloud/tape/${encodeURIComponent(symbol)}?exchange=${encodeURIComponent(exchange)}`, { signal: signalWithTimeout(signal, 30_000) });
|
|
576
584
|
}
|
|
577
585
|
|
|
578
586
|
async getCloudYieldCurve(): Promise<CloudYieldPointPayload[]> {
|
|
@@ -628,29 +636,29 @@ export class CloudDataApi {
|
|
|
628
636
|
}
|
|
629
637
|
const text = query.toString();
|
|
630
638
|
const suffix = text ? `?${text}` : "";
|
|
631
|
-
return this.request<MnaDealsPayload>(`/cloud/mna/deals${suffix}`, { signal: options?.signal
|
|
639
|
+
return this.request<MnaDealsPayload>(`/cloud/mna/deals${suffix}`, { signal: signalWithTimeout(options?.signal, 30_000) });
|
|
632
640
|
}
|
|
633
641
|
|
|
634
642
|
async getCloudMnaDeal(id: string, options?: { signal?: AbortSignal }): Promise<MnaDealPayload> {
|
|
635
|
-
return this.request<MnaDealPayload>(`/cloud/mna/deals/${encodeURIComponent(id)}`, { signal: options?.signal
|
|
643
|
+
return this.request<MnaDealPayload>(`/cloud/mna/deals/${encodeURIComponent(id)}`, { signal: signalWithTimeout(options?.signal, 30_000) });
|
|
636
644
|
}
|
|
637
645
|
|
|
638
646
|
// Public records about companies in difficulty. The answers are unchecked
|
|
639
647
|
// JSON: the distress tab's parsers validate them before anything is drawn.
|
|
640
648
|
async getPublicDistressFilings(params: DistressFilingsParams, options?: { signal?: AbortSignal }): Promise<unknown> {
|
|
641
|
-
return this.request<unknown>(`/public/events${distressQuery(params)}`, { signal: options?.signal
|
|
649
|
+
return this.request<unknown>(`/public/events${distressQuery(params)}`, { signal: signalWithTimeout(options?.signal, 30_000) });
|
|
642
650
|
}
|
|
643
651
|
|
|
644
652
|
async getPublicGoingConcern(params: GoingConcernParams = {}, options?: { signal?: AbortSignal }): Promise<unknown> {
|
|
645
|
-
return this.request<unknown>(`/public/going-concern${distressQuery(params)}`, { signal: options?.signal
|
|
653
|
+
return this.request<unknown>(`/public/going-concern${distressQuery(params)}`, { signal: signalWithTimeout(options?.signal, 30_000) });
|
|
646
654
|
}
|
|
647
655
|
|
|
648
656
|
async getPublicDistressDesignations(params: DistressDesignationsParams = {}, options?: { signal?: AbortSignal }): Promise<unknown> {
|
|
649
|
-
return this.request<unknown>(`/public/distress-designations${distressQuery(params)}`, { signal: options?.signal
|
|
657
|
+
return this.request<unknown>(`/public/distress-designations${distressQuery(params)}`, { signal: signalWithTimeout(options?.signal, 30_000) });
|
|
650
658
|
}
|
|
651
659
|
|
|
652
660
|
async getPublicInsolvencyNotices(params: InsolvencyNoticesParams = {}, options?: { signal?: AbortSignal }): Promise<unknown> {
|
|
653
|
-
return this.request<unknown>(`/public/insolvency-notices${distressQuery(params)}`, { signal: options?.signal
|
|
661
|
+
return this.request<unknown>(`/public/insolvency-notices${distressQuery(params)}`, { signal: signalWithTimeout(options?.signal, 30_000) });
|
|
654
662
|
}
|
|
655
663
|
|
|
656
664
|
async getCloudIpoCalendar(params: IpoCalendarParams = {}, options?: { signal?: AbortSignal }): Promise<IpoCalendarPayload> {
|
|
@@ -660,7 +668,7 @@ export class CloudDataApi {
|
|
|
660
668
|
}
|
|
661
669
|
const text = query.toString();
|
|
662
670
|
const suffix = text ? `?${text}` : "";
|
|
663
|
-
return this.request<IpoCalendarPayload>(`/cloud/ipo/calendar${suffix}`, { signal: options?.signal
|
|
671
|
+
return this.request<IpoCalendarPayload>(`/cloud/ipo/calendar${suffix}`, { signal: signalWithTimeout(options?.signal, 30_000) });
|
|
664
672
|
}
|
|
665
673
|
|
|
666
674
|
async getCloudShortVolume(symbol: string, scope: ShortVolumeScope = "nms"): Promise<ShortVolumePayload> {
|
|
@@ -795,6 +803,16 @@ export class CloudDataApi {
|
|
|
795
803
|
return this.request<CloudSecFilingsResponse>(cloudSecFilingsPath(params));
|
|
796
804
|
}
|
|
797
805
|
|
|
806
|
+
/** Schedule 13D/13G reports about an issuer. Unknown tickers answer 404; no reports is an empty `owners`. */
|
|
807
|
+
async getCloudSecBeneficialOwners(
|
|
808
|
+
params: CloudBeneficialOwnersParams,
|
|
809
|
+
options?: { signal?: AbortSignal },
|
|
810
|
+
): Promise<BeneficialOwnersPayload> {
|
|
811
|
+
return this.request<BeneficialOwnersPayload>(cloudSecBeneficialOwnersPath(params), {
|
|
812
|
+
signal: options?.signal,
|
|
813
|
+
});
|
|
814
|
+
}
|
|
815
|
+
|
|
798
816
|
async getCloudSecFilingDocuments(
|
|
799
817
|
params: CloudSecFilingParams,
|
|
800
818
|
): Promise<CloudSecDocumentsResponse> {
|
package/src/api-client/errors.ts
CHANGED
|
@@ -12,6 +12,8 @@ export class ApiRequestError extends Error {
|
|
|
12
12
|
readonly retryAfterMs?: number,
|
|
13
13
|
/** The body's `error` field, e.g. a broker route's "unsupported" or "tool_error". */
|
|
14
14
|
readonly code?: string,
|
|
15
|
+
/** The rest of a JSON error body, for a route that says more, e.g. which user refused a chat. */
|
|
16
|
+
readonly details?: Readonly<Record<string, unknown>>,
|
|
15
17
|
) {
|
|
16
18
|
super(message);
|
|
17
19
|
this.name = "ApiRequestError";
|
|
@@ -79,6 +81,16 @@ export function parseApiErrorMessage(body: string): string {
|
|
|
79
81
|
}
|
|
80
82
|
}
|
|
81
83
|
|
|
84
|
+
/** A JSON error body as an object, or undefined for any other body. */
|
|
85
|
+
export function parseApiErrorDetails(body: string): Readonly<Record<string, unknown>> | undefined {
|
|
86
|
+
try {
|
|
87
|
+
const parsed = JSON.parse(body) as unknown;
|
|
88
|
+
return parsed && typeof parsed === "object" && !Array.isArray(parsed) ? parsed as Record<string, unknown> : undefined;
|
|
89
|
+
} catch {
|
|
90
|
+
return undefined;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
82
94
|
/** The JSON body's `error` field, which routes that name their failures set to a code. */
|
|
83
95
|
export function parseApiErrorCode(body: string): string | undefined {
|
|
84
96
|
try {
|
|
@@ -0,0 +1,363 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Geo layers, as GET /cloud/geo/* serves them: anything with a place (a ship,
|
|
3
|
+
* a port, a pipeline) as map features, an entity table and chart series. The
|
|
4
|
+
* types mirror the server's wire contract field for field. The app knows only
|
|
5
|
+
* this contract, so a layer the server adds needs no release.
|
|
6
|
+
*
|
|
7
|
+
* Failures carry `{ error, message }`: 404 `not_found`, 400 `invalid_bbox`,
|
|
8
|
+
* 403 `pro_required`, 429 `geo_rate_limited` with Retry-After, 503
|
|
9
|
+
* `geo_unavailable`. A layer that cannot serve still answers 200 with an
|
|
10
|
+
* empty body and its `status` and `statusNote`.
|
|
11
|
+
*/
|
|
12
|
+
type Lon = number;
|
|
13
|
+
type Lat = number;
|
|
14
|
+
|
|
15
|
+
type GeoGeometry =
|
|
16
|
+
| { type: "Point"; coordinates: [Lon, Lat] }
|
|
17
|
+
| { type: "LineString"; coordinates: [Lon, Lat][] }
|
|
18
|
+
| { type: "MultiLineString"; coordinates: [Lon, Lat][][] }
|
|
19
|
+
| { type: "Polygon"; coordinates: [Lon, Lat][][] };
|
|
20
|
+
|
|
21
|
+
export interface GeoTickerLink {
|
|
22
|
+
symbol: string;
|
|
23
|
+
exchange?: string;
|
|
24
|
+
/** How the entity relates to the company. */
|
|
25
|
+
via: "owner" | "operator" | "route" | "sector";
|
|
26
|
+
confidence: "reviewed" | "inferred";
|
|
27
|
+
/** Short, e.g. "Operates the pipeline". */
|
|
28
|
+
note?: string;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export type GeoPropValue = string | number | boolean | null;
|
|
32
|
+
|
|
33
|
+
export interface GeoFeature {
|
|
34
|
+
/** Stable within the layer, e.g. "mmsi:123456789", "iata:JFK", "choke:suez". */
|
|
35
|
+
id: string;
|
|
36
|
+
layer: string;
|
|
37
|
+
entityKind: string;
|
|
38
|
+
label: string;
|
|
39
|
+
geometry: GeoGeometry;
|
|
40
|
+
/** ISO time of the observation; null for static layers. */
|
|
41
|
+
ts: string | null;
|
|
42
|
+
/** Flat, display-ready values. */
|
|
43
|
+
props: Record<string, GeoPropValue>;
|
|
44
|
+
tickers?: GeoTickerLink[];
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/** `percent1` values are percentage points: 12.3 reads 12.3%. */
|
|
48
|
+
export type GeoColumnFormat = "text" | "int" | "decimal1" | "percent1" | "datetime" | "knots" | "km";
|
|
49
|
+
|
|
50
|
+
export interface GeoColumn {
|
|
51
|
+
key: string;
|
|
52
|
+
label: string;
|
|
53
|
+
align?: "left" | "right";
|
|
54
|
+
format?: GeoColumnFormat;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export interface GeoSeriesInfo {
|
|
58
|
+
id: string;
|
|
59
|
+
name: string;
|
|
60
|
+
unit: string;
|
|
61
|
+
frequency: "daily" | "weekly" | "monthly";
|
|
62
|
+
entityId?: string;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
type GeoLayerGroup = "ships" | "air" | "energy" | "ports" | "infrastructure";
|
|
66
|
+
type GeoLayerStatus = "ok" | "partial" | "unavailable";
|
|
67
|
+
|
|
68
|
+
export interface GeoLayerInfo {
|
|
69
|
+
id: string;
|
|
70
|
+
name: string;
|
|
71
|
+
/** A group the app does not know yet still lists, under its own name. */
|
|
72
|
+
group: GeoLayerGroup | (string & {});
|
|
73
|
+
geometry: "point" | "line" | "area";
|
|
74
|
+
cadence: "live" | "daily" | "static";
|
|
75
|
+
/** How often a client should re-request features; null for static layers. */
|
|
76
|
+
refreshSeconds: number | null;
|
|
77
|
+
asOf: string | null;
|
|
78
|
+
count: number | null;
|
|
79
|
+
status: GeoLayerStatus;
|
|
80
|
+
/** Short plain words, never a source name. */
|
|
81
|
+
statusNote?: string;
|
|
82
|
+
access: "free" | "pro";
|
|
83
|
+
/** The entity table's columns; the first is the label. */
|
|
84
|
+
columns: GeoColumn[];
|
|
85
|
+
series: GeoSeriesInfo[];
|
|
86
|
+
defaultVisible: boolean;
|
|
87
|
+
/** Below this zoom the client requests nothing. */
|
|
88
|
+
minZoom?: number;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
export interface GeoLayersPayload {
|
|
92
|
+
layers: GeoLayerInfo[];
|
|
93
|
+
asOf: string | null;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export interface GeoCluster {
|
|
97
|
+
id: string;
|
|
98
|
+
lon: Lon;
|
|
99
|
+
lat: Lat;
|
|
100
|
+
count: number;
|
|
101
|
+
kinds?: Record<string, number>;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* A clustering answer has no features: everything is in `clusters`. Closer
|
|
106
|
+
* in, a capped answer keeps the top features by rank and sets `truncated`.
|
|
107
|
+
*/
|
|
108
|
+
export interface GeoFeaturesPayload {
|
|
109
|
+
layer: string;
|
|
110
|
+
asOf: string | null;
|
|
111
|
+
features: GeoFeature[];
|
|
112
|
+
total: number;
|
|
113
|
+
truncated: boolean;
|
|
114
|
+
clusters?: GeoCluster[];
|
|
115
|
+
/** Present when the layer cannot serve right now, with the same words as the catalog. */
|
|
116
|
+
status?: GeoLayerStatus;
|
|
117
|
+
statusNote?: string;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
export interface GeoEntityRow {
|
|
121
|
+
id: string;
|
|
122
|
+
label: string;
|
|
123
|
+
lon: Lon;
|
|
124
|
+
lat: Lat;
|
|
125
|
+
props: Record<string, GeoPropValue>;
|
|
126
|
+
tickers?: GeoTickerLink[];
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
export interface GeoEntitiesPayload {
|
|
130
|
+
layer: string;
|
|
131
|
+
asOf: string | null;
|
|
132
|
+
columns: GeoColumn[];
|
|
133
|
+
rows: GeoEntityRow[];
|
|
134
|
+
total: number;
|
|
135
|
+
status?: GeoLayerStatus;
|
|
136
|
+
statusNote?: string;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/** Longitude, latitude and the ISO time the entity was seen there. */
|
|
140
|
+
type GeoTrailPoint = [Lon, Lat, string];
|
|
141
|
+
|
|
142
|
+
export interface GeoEntityPayload {
|
|
143
|
+
feature: GeoFeature;
|
|
144
|
+
detail: Record<string, GeoPropValue>;
|
|
145
|
+
/** Oldest first. */
|
|
146
|
+
trail?: GeoTrailPoint[];
|
|
147
|
+
series?: GeoSeriesInfo[];
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/** `alias` is the short form G takes (SUEZ, HORMUZ.TANKER); ids are the server's own. */
|
|
151
|
+
export type GeoSeriesSearchHit = GeoSeriesInfo & { layer: string; alias?: string };
|
|
152
|
+
|
|
153
|
+
export interface GeoSeriesSearchPayload {
|
|
154
|
+
series: GeoSeriesSearchHit[];
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
export interface GeoSeriesPayload {
|
|
158
|
+
id: string;
|
|
159
|
+
name: string;
|
|
160
|
+
unit: string;
|
|
161
|
+
frequency: GeoSeriesInfo["frequency"];
|
|
162
|
+
/** [YYYY-MM-DD, value], oldest first. */
|
|
163
|
+
points: [string, number][];
|
|
164
|
+
asOf: string | null;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/** West, south, east, north in degrees. */
|
|
168
|
+
export type GeoBbox = [number, number, number, number];
|
|
169
|
+
|
|
170
|
+
/** A request under /cloud/geo/, through the shared Cloud client (`apiClient.geo`). */
|
|
171
|
+
export type GeoRequest = <T>(path: string, init?: RequestInit) => Promise<T>;
|
|
172
|
+
|
|
173
|
+
/** The server's default cap on one features answer; above it a point layer answers clusters. */
|
|
174
|
+
export const GEO_FEATURE_LIMIT = 1500;
|
|
175
|
+
const GEO_FEATURE_LIMIT_MAX = 5000;
|
|
176
|
+
/** Live layers a client may keep refreshing at once. */
|
|
177
|
+
export const GEO_MAX_LIVE_LAYERS = 2;
|
|
178
|
+
const CATALOG_TTL_MS = 5 * 60_000;
|
|
179
|
+
/** A server without geo layers is asked again only after this long. */
|
|
180
|
+
const ABSENT_TTL_MS = 10 * 60_000;
|
|
181
|
+
|
|
182
|
+
function query(params: Record<string, string | number | undefined | null>): string {
|
|
183
|
+
const search = new URLSearchParams();
|
|
184
|
+
for (const [key, value] of Object.entries(params)) {
|
|
185
|
+
if (value === undefined || value === null || value === "") continue;
|
|
186
|
+
search.set(key, String(value));
|
|
187
|
+
}
|
|
188
|
+
// Commas stay literal (bbox=w,s,e,n), as the contract writes them and caches key them.
|
|
189
|
+
const text = search.toString().replaceAll("%2C", ",");
|
|
190
|
+
return text ? `?${text}` : "";
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
function segment(value: string): string {
|
|
194
|
+
return encodeURIComponent(value);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
function bboxParam(bbox: GeoBbox | undefined): string | undefined {
|
|
198
|
+
return bbox ? bbox.map((value) => Number(value.toFixed(3))).join(",") : undefined;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
export interface GeoFeaturesQuery {
|
|
202
|
+
bbox?: GeoBbox;
|
|
203
|
+
zoom?: number;
|
|
204
|
+
limit?: number;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
export function getGeoFeatures(
|
|
208
|
+
request: GeoRequest,
|
|
209
|
+
layerId: string,
|
|
210
|
+
options: GeoFeaturesQuery = {},
|
|
211
|
+
signal?: AbortSignal,
|
|
212
|
+
): Promise<GeoFeaturesPayload> {
|
|
213
|
+
const limit = Math.max(1, Math.min(options.limit ?? GEO_FEATURE_LIMIT, GEO_FEATURE_LIMIT_MAX));
|
|
214
|
+
return request<GeoFeaturesPayload>(
|
|
215
|
+
`layers/${segment(layerId)}/features${query({ bbox: bboxParam(options.bbox), zoom: options.zoom, limit })}`,
|
|
216
|
+
signal ? { signal } : undefined,
|
|
217
|
+
);
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
export interface GeoEntitiesQuery {
|
|
221
|
+
q?: string;
|
|
222
|
+
sort?: string;
|
|
223
|
+
dir?: "asc" | "desc";
|
|
224
|
+
limit?: number;
|
|
225
|
+
offset?: number;
|
|
226
|
+
bbox?: GeoBbox;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
export function getGeoEntities(
|
|
230
|
+
request: GeoRequest,
|
|
231
|
+
layerId: string,
|
|
232
|
+
options: GeoEntitiesQuery = {},
|
|
233
|
+
signal?: AbortSignal,
|
|
234
|
+
): Promise<GeoEntitiesPayload> {
|
|
235
|
+
return request<GeoEntitiesPayload>(
|
|
236
|
+
`layers/${segment(layerId)}/entities${query({
|
|
237
|
+
q: options.q?.trim(),
|
|
238
|
+
sort: options.sort,
|
|
239
|
+
dir: options.sort ? options.dir : undefined,
|
|
240
|
+
limit: options.limit,
|
|
241
|
+
offset: options.offset,
|
|
242
|
+
bbox: bboxParam(options.bbox),
|
|
243
|
+
})}`,
|
|
244
|
+
signal ? { signal } : undefined,
|
|
245
|
+
);
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
export function getGeoEntity(
|
|
249
|
+
request: GeoRequest,
|
|
250
|
+
layerId: string,
|
|
251
|
+
entityId: string,
|
|
252
|
+
signal?: AbortSignal,
|
|
253
|
+
): Promise<GeoEntityPayload> {
|
|
254
|
+
return request<GeoEntityPayload>(`entities/${segment(layerId)}/${segment(entityId)}`, signal ? { signal } : undefined);
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
export function searchGeoSeries(request: GeoRequest, q: string, signal?: AbortSignal): Promise<GeoSeriesSearchPayload> {
|
|
258
|
+
return request<GeoSeriesSearchPayload>(`series${query({ q: q.trim() })}`, signal ? { signal } : undefined);
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
export function getGeoSeries(
|
|
262
|
+
request: GeoRequest,
|
|
263
|
+
seriesId: string,
|
|
264
|
+
range: { from?: string; to?: string } = {},
|
|
265
|
+
signal?: AbortSignal,
|
|
266
|
+
): Promise<GeoSeriesPayload> {
|
|
267
|
+
return request<GeoSeriesPayload>(`series/${segment(seriesId)}${query(range)}`, signal ? { signal } : undefined);
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
/**
|
|
271
|
+
* Finds a series by id or short alias (SUEZ). Exact matches win over a series
|
|
272
|
+
* whose name merely contains the text.
|
|
273
|
+
*/
|
|
274
|
+
export async function resolveGeoSeries(
|
|
275
|
+
request: GeoRequest,
|
|
276
|
+
token: string,
|
|
277
|
+
signal?: AbortSignal,
|
|
278
|
+
): Promise<GeoSeriesSearchHit | null> {
|
|
279
|
+
const needle = token.trim().toLowerCase();
|
|
280
|
+
if (!needle) return null;
|
|
281
|
+
const { series } = await searchGeoSeries(request, token, signal);
|
|
282
|
+
return series.find((hit) => hit.id.toLowerCase() === needle)
|
|
283
|
+
?? series.find((hit) => hit.alias?.toLowerCase() === needle)
|
|
284
|
+
?? null;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
interface CatalogEntry {
|
|
288
|
+
at: number;
|
|
289
|
+
payload: GeoLayersPayload | null;
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
let catalogEntry: CatalogEntry | null = null;
|
|
293
|
+
let catalogInFlight: Promise<GeoLayersPayload | null> | null = null;
|
|
294
|
+
|
|
295
|
+
function validLayer(value: unknown): value is GeoLayerInfo {
|
|
296
|
+
if (!value || typeof value !== "object") return false;
|
|
297
|
+
const layer = value as Partial<GeoLayerInfo>;
|
|
298
|
+
return typeof layer.id === "string" && !!layer.id && typeof layer.name === "string"
|
|
299
|
+
&& (layer.geometry === "point" || layer.geometry === "line" || layer.geometry === "area")
|
|
300
|
+
&& Array.isArray(layer.columns);
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
function normalizeCatalog(payload: unknown): GeoLayersPayload | null {
|
|
304
|
+
if (!payload || typeof payload !== "object" || !Array.isArray((payload as GeoLayersPayload).layers)) return null;
|
|
305
|
+
const raw = payload as GeoLayersPayload;
|
|
306
|
+
const layers = raw.layers.filter(validLayer).map((layer) => ({
|
|
307
|
+
...layer,
|
|
308
|
+
series: Array.isArray(layer.series) ? layer.series : [],
|
|
309
|
+
refreshSeconds: typeof layer.refreshSeconds === "number" && layer.refreshSeconds > 0 ? layer.refreshSeconds : null,
|
|
310
|
+
}));
|
|
311
|
+
return layers.length ? { layers, asOf: raw.asOf ?? null } : null;
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
/**
|
|
315
|
+
* The layer catalog, or null when this server has no geo layers. A 404, a
|
|
316
|
+
* failed request or an empty answer all read as "no layers", so the map stays
|
|
317
|
+
* the venue map it was, without errors. Answers are kept for a few minutes.
|
|
318
|
+
*/
|
|
319
|
+
export async function loadGeoCatalog(
|
|
320
|
+
request: GeoRequest,
|
|
321
|
+
options: { force?: boolean; signal?: AbortSignal; now?: number } = {},
|
|
322
|
+
): Promise<GeoLayersPayload | null> {
|
|
323
|
+
const now = options.now ?? Date.now();
|
|
324
|
+
if (!options.force && catalogEntry) {
|
|
325
|
+
const ttl = catalogEntry.payload ? CATALOG_TTL_MS : ABSENT_TTL_MS;
|
|
326
|
+
if (now - catalogEntry.at < ttl) return catalogEntry.payload;
|
|
327
|
+
}
|
|
328
|
+
if (!catalogInFlight) {
|
|
329
|
+
catalogInFlight = request<unknown>("layers")
|
|
330
|
+
.then(normalizeCatalog)
|
|
331
|
+
// A missing route or a refusal is an answer; a network blip is too, for a while.
|
|
332
|
+
.catch(() => null)
|
|
333
|
+
.then((payload) => {
|
|
334
|
+
catalogEntry = { at: options.now ?? Date.now(), payload };
|
|
335
|
+
return payload;
|
|
336
|
+
})
|
|
337
|
+
.finally(() => {
|
|
338
|
+
catalogInFlight = null;
|
|
339
|
+
});
|
|
340
|
+
}
|
|
341
|
+
const pending = catalogInFlight;
|
|
342
|
+
if (!options.signal) return pending;
|
|
343
|
+
return new Promise((resolve, reject) => {
|
|
344
|
+
const abort = () => reject(options.signal!.reason ?? new DOMException("Aborted", "AbortError"));
|
|
345
|
+
if (options.signal!.aborted) return abort();
|
|
346
|
+
options.signal!.addEventListener("abort", abort, { once: true });
|
|
347
|
+
void pending.then((value) => {
|
|
348
|
+
options.signal!.removeEventListener("abort", abort);
|
|
349
|
+
resolve(value);
|
|
350
|
+
});
|
|
351
|
+
});
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
/** The last catalog answer without asking the server, for synchronous readers such as pane settings. */
|
|
355
|
+
export function peekGeoCatalog(): GeoLayersPayload | null {
|
|
356
|
+
return catalogEntry?.payload ?? null;
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
/** Test seam: forget what the server answered. */
|
|
360
|
+
export function resetGeoCatalogCache(): void {
|
|
361
|
+
catalogEntry = null;
|
|
362
|
+
catalogInFlight = null;
|
|
363
|
+
}
|
package/src/api-client/index.ts
CHANGED
|
@@ -768,6 +768,7 @@ class GloomApiClient {
|
|
|
768
768
|
getCloudCotBoard = this.data.getCloudCotBoard.bind(this.data);
|
|
769
769
|
getCloudCotContract = this.data.getCloudCotContract.bind(this.data);
|
|
770
770
|
creditDocuments = this.data.creditDocuments.bind(this.data);
|
|
771
|
+
geo = this.data.geo.bind(this.data);
|
|
771
772
|
getCloudHiring = this.data.getCloudHiring.bind(this.data);
|
|
772
773
|
getCloudAppRankHistory = this.data.getCloudAppRankHistory.bind(this.data);
|
|
773
774
|
getCloudAppAttention = this.data.getCloudAppAttention.bind(this.data);
|
|
@@ -819,6 +820,7 @@ class GloomApiClient {
|
|
|
819
820
|
getRiskReports = this.data.getRiskReports.bind(this.data);
|
|
820
821
|
getRiskReport = this.data.getRiskReport.bind(this.data);
|
|
821
822
|
getCloudSecFilings = this.data.getCloudSecFilings.bind(this.data);
|
|
823
|
+
getCloudSecBeneficialOwners = this.data.getCloudSecBeneficialOwners.bind(this.data);
|
|
822
824
|
getCloudSecFilingDocuments = this.data.getCloudSecFilingDocuments.bind(this.data);
|
|
823
825
|
getCloudSecFilingContent = this.data.getCloudSecFilingContent.bind(this.data);
|
|
824
826
|
getCloudSec13F = this.data.getCloudSec13F.bind(this.data);
|
|
@@ -46,6 +46,12 @@ export interface MarketHeatmapAsset {
|
|
|
46
46
|
industry: string | null;
|
|
47
47
|
marketState: string | null;
|
|
48
48
|
source: MarketHeatmapSource;
|
|
49
|
+
/**
|
|
50
|
+
* The move of the last completed regular session, which `price`, `change`
|
|
51
|
+
* and `changePercent` then are. Null while the regular session trades, and
|
|
52
|
+
* for a name without that session's close.
|
|
53
|
+
*/
|
|
54
|
+
regularChangePercent?: number | null;
|
|
49
55
|
}
|
|
50
56
|
|
|
51
57
|
export interface MarketHeatmapResult {
|
|
@@ -53,6 +59,10 @@ export interface MarketHeatmapResult {
|
|
|
53
59
|
universe: MarketHeatmapUniverseId;
|
|
54
60
|
source: MarketHeatmapSource;
|
|
55
61
|
fetchedAt: number;
|
|
62
|
+
/** The US market session the snapshot describes; null when the server cannot tell. */
|
|
63
|
+
session?: "REGULAR" | "PRE" | "POST" | "CLOSED" | null;
|
|
64
|
+
/** The completed regular session every stored tile describes outside the regular session, as a New York date; null while it trades. */
|
|
65
|
+
regularSessionDate?: string | null;
|
|
56
66
|
assets: MarketHeatmapAsset[];
|
|
57
67
|
}
|
|
58
68
|
|