@gloom-sh/terminal 0.0.0-stage → 0.19.0
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/LICENSE +25 -0
- package/README.md +73 -2
- package/README.zh-CN.md +116 -0
- package/bin/gloom +13 -0
- package/package.json +144 -4
- package/patches/@opentui%2Fcore@0.3.2.patch +624 -0
- package/patches/electrobun@1.18.1.patch +504 -0
- package/patches/react-reconciler@0.33.0.patch +10 -0
- package/src/account/auth-dialog.tsx +88 -0
- package/src/account/auth-form.tsx +276 -0
- package/src/account/auth-model.ts +167 -0
- package/src/account/billing.ts +57 -0
- package/src/account/checkout-handoff.tsx +225 -0
- package/src/account/device-signin-dialog.tsx +210 -0
- package/src/account/device-signin.ts +235 -0
- package/src/account/email-auth-attempt.ts +173 -0
- package/src/account/session.ts +16 -0
- package/src/account/upgrade-dialog.tsx +286 -0
- package/src/account/upgrade-personalization.ts +57 -0
- package/src/account/upgrade-tickers.ts +124 -0
- package/src/account/verification-panel.tsx +63 -0
- package/src/api-client/app-attention.ts +147 -0
- package/src/api-client/askg.ts +710 -0
- package/src/api-client/attention.ts +26 -0
- package/src/api-client/auth.ts +361 -0
- package/src/api-client/awards.ts +215 -0
- package/src/api-client/bank-figures.ts +73 -0
- package/src/api-client/beneficial-owners.ts +96 -0
- package/src/api-client/catalysts.ts +161 -0
- package/src/api-client/central-bank-rates.ts +51 -0
- package/src/api-client/chat-pane-link.ts +47 -0
- package/src/api-client/chat.ts +370 -0
- package/src/api-client/collections.ts +45 -0
- package/src/api-client/commodity-balances.ts +83 -0
- package/src/api-client/company-kpis.ts +174 -0
- package/src/api-client/cot.ts +78 -0
- package/src/api-client/cpi.ts +52 -0
- package/src/api-client/credit-boards.ts +89 -0
- package/src/api-client/credit-documents.ts +113 -0
- package/src/api-client/crypto-etf-flows.ts +37 -0
- package/src/api-client/crypto-markets.ts +205 -0
- package/src/api-client/data.ts +1314 -0
- package/src/api-client/debt-maturities.ts +110 -0
- package/src/api-client/distress.ts +164 -0
- package/src/api-client/doe.ts +109 -0
- package/src/api-client/earnings.ts +98 -0
- package/src/api-client/equity-screener.ts +245 -0
- package/src/api-client/errors.ts +142 -0
- package/src/api-client/estimate-revisions.ts +113 -0
- package/src/api-client/europe-energy.ts +197 -0
- package/src/api-client/exchange-announcements.ts +38 -0
- package/src/api-client/exposure.ts +202 -0
- package/src/api-client/feedback.ts +34 -0
- package/src/api-client/fund-facts.ts +152 -0
- package/src/api-client/futures-curve.ts +186 -0
- package/src/api-client/geo.ts +373 -0
- package/src/api-client/gpu.ts +93 -0
- package/src/api-client/hiring.ts +411 -0
- package/src/api-client/index.ts +1090 -0
- package/src/api-client/insider-signals.ts +159 -0
- package/src/api-client/ipo.ts +99 -0
- package/src/api-client/letters.ts +41 -0
- package/src/api-client/live-scan.ts +91 -0
- package/src/api-client/market-discovery.ts +130 -0
- package/src/api-client/market-movers.ts +74 -0
- package/src/api-client/members.ts +44 -0
- package/src/api-client/mna.ts +124 -0
- package/src/api-client/money-markets.ts +57 -0
- package/src/api-client/normalizers.ts +266 -0
- package/src/api-client/notes.ts +75 -0
- package/src/api-client/organization-tickers.ts +44 -0
- package/src/api-client/paths.ts +648 -0
- package/src/api-client/perps.ts +219 -0
- package/src/api-client/plan-access.ts +27 -0
- package/src/api-client/plan-rules.ts +87 -0
- package/src/api-client/power.ts +148 -0
- package/src/api-client/rates.ts +56 -0
- package/src/api-client/request.ts +681 -0
- package/src/api-client/research-activity.ts +590 -0
- package/src/api-client/revenue-breakdown.ts +36 -0
- package/src/api-client/session-cookie.ts +6 -0
- package/src/api-client/short-side-publications.ts +37 -0
- package/src/api-client/short-volume.ts +55 -0
- package/src/api-client/social-mentions.ts +63 -0
- package/src/api-client/socket.ts +1109 -0
- package/src/api-client/supply-chain-graph.ts +40 -0
- package/src/api-client/supply-chain.ts +106 -0
- package/src/api-client/swap-curve.ts +35 -0
- package/src/api-client/tape.ts +56 -0
- package/src/api-client/teams.ts +216 -0
- package/src/api-client/telemetry.ts +226 -0
- package/src/api-client/themes.ts +55 -0
- package/src/api-client/theses.ts +150 -0
- package/src/api-client/types.ts +2409 -0
- package/src/api-client/upgrade-experiment.ts +91 -0
- package/src/api-client/views.ts +98 -0
- package/src/api-client/wall-experiments.ts +102 -0
- package/src/api-client/wall-summary.ts +51 -0
- package/src/api-client/web-experiments.ts +139 -0
- package/src/api-client/yield-curves.ts +72 -0
- package/src/app/app-bootstrap-state.ts +121 -0
- package/src/app/command-bar-intro.ts +38 -0
- package/src/app/dialog-bridge.tsx +33 -0
- package/src/app/global-shortcuts.ts +334 -0
- package/src/app/keybindings/actions.ts +298 -0
- package/src/app/keybindings/capture-request.ts +36 -0
- package/src/app/keybindings/chord.ts +304 -0
- package/src/app/keybindings/config.ts +83 -0
- package/src/app/keybindings/index.ts +51 -0
- package/src/app/keybindings/labels.ts +104 -0
- package/src/app/keybindings/react.tsx +35 -0
- package/src/app/keybindings/resolve.ts +295 -0
- package/src/app/language-observer.tsx +13 -0
- package/src/app/pane-runtime/index.tsx +320 -0
- package/src/app/pane-runtime/layout-placement.ts +56 -0
- package/src/app/pane-runtime/pane-settings-runtime.tsx +69 -0
- package/src/app/pane-runtime/pane-template-runtime.ts +123 -0
- package/src/app/pane-runtime/plugin-bindings.ts +541 -0
- package/src/app/pane-runtime/ticker-inspector-runtime.ts +190 -0
- package/src/app/pane-runtime/ticker-open-runtime.ts +238 -0
- package/src/app/pane-runtime/ticker-open-target.ts +31 -0
- package/src/app/runtime/broker-import.ts +187 -0
- package/src/app/runtime/desktop-deeplink.ts +641 -0
- package/src/app/runtime/desktop-menu.ts +95 -0
- package/src/app/runtime/layout-warmup.ts +124 -0
- package/src/app/runtime/plugin-bindings.ts +301 -0
- package/src/app/runtime/startup.ts +256 -0
- package/src/app/runtime/ticker-refresh.ts +206 -0
- package/src/app/runtime/update.ts +260 -0
- package/src/app/star-prompt/model.ts +98 -0
- package/src/app/star-prompt/runtime.ts +41 -0
- package/src/app/star-prompt/status-line.tsx +190 -0
- package/src/app.tsx +663 -0
- package/src/architecture/core-builtin-allowlist.json +39 -0
- package/src/architecture/dom-cell-metrics-allowlist.json +102 -0
- package/src/architecture/pane-tabs-allowlist.json +68 -0
- package/src/architecture/silent-catch-allowlist.json +3 -0
- package/src/architecture/ttl-caches-allowlist.json +19 -0
- package/src/architecture/ui-literals-allowlist.json +186 -0
- package/src/architecture/ui-tokens-allowlist.json +40 -0
- package/src/ask-gloom/pane-context.ts +130 -0
- package/src/ask-gloom/pane-request.ts +70 -0
- package/src/ask-gloom/pane-text.ts +201 -0
- package/src/assets/gloomberb-logo-windows.ico +0 -0
- package/src/assets/gloomberb-logo-windows.png +0 -0
- package/src/assets/gloomberb-logo.svg +1 -0
- package/src/assets/gloomberb-mark.ico +0 -0
- package/src/assets/gloomberb-mark.svg +1 -0
- package/src/brokers/account-cache.ts +218 -0
- package/src/brokers/broker-portfolio-sync.ts +357 -0
- package/src/brokers/broker-ticker-sync.ts +146 -0
- package/src/brokers/cloud-broker-link.ts +26 -0
- package/src/brokers/directory.ts +76 -0
- package/src/brokers/logos.ts +68 -0
- package/src/brokers/profile-form.ts +113 -0
- package/src/brokers/remote-broker-adapter.ts +115 -0
- package/src/brokers/remove-profile.ts +61 -0
- package/src/brokers/signed-in/adapter.ts +568 -0
- package/src/brokers/signed-in/catalog.ts +130 -0
- package/src/brokers/signed-in/client.ts +81 -0
- package/src/brokers/signed-in/connect.ts +90 -0
- package/src/brokers/signed-in/profile.ts +18 -0
- package/src/brokers/signed-in/sign-in-dialog.tsx +339 -0
- package/src/brokers/signed-in/sign-in.ts +237 -0
- package/src/brokers/sync-broker-instance.ts +473 -0
- package/src/capabilities/chart-series.ts +354 -0
- package/src/capabilities/factories.ts +168 -0
- package/src/capabilities/index.ts +42 -0
- package/src/capabilities/registry.ts +181 -0
- package/src/capabilities/service-capabilities.ts +78 -0
- package/src/capabilities/stream-client.ts +39 -0
- package/src/capabilities/types.ts +161 -0
- package/src/cli/bank-section.ts +147 -0
- package/src/cli/base-converter.ts +86 -0
- package/src/cli/board-coins.ts +70 -0
- package/src/cli/central-bank-events.ts +23 -0
- package/src/cli/command-options.ts +141 -0
- package/src/cli/commands/api.ts +142 -0
- package/src/cli/commands/broker.ts +49 -0
- package/src/cli/commands/command-utils.ts +83 -0
- package/src/cli/commands/crypto-hints.ts +119 -0
- package/src/cli/commands/fred-series.ts +319 -0
- package/src/cli/commands/keybindings.ts +125 -0
- package/src/cli/commands/market.ts +3569 -0
- package/src/cli/commands/news-hints.ts +62 -0
- package/src/cli/commands/news-search.ts +166 -0
- package/src/cli/commands/options-chain.ts +355 -0
- package/src/cli/commands/options-leaps.ts +845 -0
- package/src/cli/commands/overview.ts +965 -0
- package/src/cli/commands/plugins.ts +382 -0
- package/src/cli/commands/remote.ts +219 -0
- package/src/cli/commands/search.ts +653 -0
- package/src/cli/commands/system.ts +699 -0
- package/src/cli/commands/themes.ts +73 -0
- package/src/cli/commands/ticker.ts +1672 -0
- package/src/cli/company-name-hint.ts +41 -0
- package/src/cli/context.ts +159 -0
- package/src/cli/currency-hints.ts +27 -0
- package/src/cli/desktop-pane-shot-routes.ts +7 -0
- package/src/cli/desktop-pane-shot-view.ts +114 -0
- package/src/cli/desktop-pane-shot.ts +1010 -0
- package/src/cli/earnings-calendar.ts +72 -0
- package/src/cli/entry.ts +97 -0
- package/src/cli/errors.ts +170 -0
- package/src/cli/exit-codes.ts +8 -0
- package/src/cli/export-source.ts +150 -0
- package/src/cli/freshness.ts +84 -0
- package/src/cli/fx-forward.ts +130 -0
- package/src/cli/fx-pair.ts +189 -0
- package/src/cli/glossary.ts +1009 -0
- package/src/cli/help.ts +246 -0
- package/src/cli/helpers.ts +169 -0
- package/src/cli/history-export.ts +126 -0
- package/src/cli/history-rows.ts +847 -0
- package/src/cli/index-roots.ts +44 -0
- package/src/cli/index.ts +515 -0
- package/src/cli/issuer-membership.ts +103 -0
- package/src/cli/known-gaps.ts +402 -0
- package/src/cli/listing-arg.ts +1529 -0
- package/src/cli/listing-suggestion.ts +174 -0
- package/src/cli/name-entries.ts +127 -0
- package/src/cli/native-smoke.ts +43 -0
- package/src/cli/not-a-ticker.ts +83 -0
- package/src/cli/opentui-libc.ts +5 -0
- package/src/cli/options.ts +166 -0
- package/src/cli/output-file.ts +68 -0
- package/src/cli/pane-functions/access-gate.ts +75 -0
- package/src/cli/pane-functions/capabilities.ts +367 -0
- package/src/cli/pane-functions/catalog.ts +834 -0
- package/src/cli/pane-functions/cloud-session.ts +47 -0
- package/src/cli/pane-functions/data.ts +254 -0
- package/src/cli/pane-functions/discovery.ts +234 -0
- package/src/cli/pane-functions/dom.ts +425 -0
- package/src/cli/pane-functions/financial-ratio-shot.ts +160 -0
- package/src/cli/pane-functions/freshness.ts +1288 -0
- package/src/cli/pane-functions/function-help.ts +1450 -0
- package/src/cli/pane-functions/headless.ts +1059 -0
- package/src/cli/pane-functions/index.ts +636 -0
- package/src/cli/pane-functions/lock-note.ts +59 -0
- package/src/cli/pane-functions/market-session.ts +297 -0
- package/src/cli/pane-functions/options.ts +410 -0
- package/src/cli/pane-functions/report-notices.ts +121 -0
- package/src/cli/pane-functions/report.ts +102 -0
- package/src/cli/pane-functions/resolver.ts +428 -0
- package/src/cli/pane-functions/screenshot-assessment.ts +324 -0
- package/src/cli/pane-functions/screenshot-bridge.ts +152 -0
- package/src/cli/pane-functions/screenshot-chart-evidence.ts +396 -0
- package/src/cli/pane-functions/screenshot-data-evidence.ts +383 -0
- package/src/cli/pane-functions/screenshot-evidence.ts +131 -0
- package/src/cli/pane-functions/screenshot-payload.ts +453 -0
- package/src/cli/pane-functions/screenshot-render.ts +316 -0
- package/src/cli/pane-functions/screenshot-types.ts +167 -0
- package/src/cli/pane-functions/shot-options.ts +73 -0
- package/src/cli/perpetual-contract.ts +62 -0
- package/src/cli/peso-dollar-rates.ts +79 -0
- package/src/cli/quote-answer.ts +231 -0
- package/src/cli/registry.ts +178 -0
- package/src/cli/report-tables.ts +692 -0
- package/src/cli/restore-plugins.ts +77 -0
- package/src/cli/result.ts +670 -0
- package/src/cli/row-window.ts +76 -0
- package/src/cli/scoped-context.ts +41 -0
- package/src/cli/scroll-truncation.ts +38 -0
- package/src/cli/series-search.ts +117 -0
- package/src/cli/staged-tickers.ts +57 -0
- package/src/cli/statement-filings.ts +280 -0
- package/src/cli/suffixed-listing-rows.ts +49 -0
- package/src/cli/symbol-args.ts +158 -0
- package/src/cli/symbol-cells.ts +120 -0
- package/src/cli/symbol-list.ts +374 -0
- package/src/cli/symbol-rows.ts +517 -0
- package/src/cli/ticker-resolution.ts +566 -0
- package/src/cli/treasury-yields.ts +86 -0
- package/src/cli/types.ts +42 -0
- package/src/cli/uncovered-instrument.ts +20 -0
- package/src/cli/unknown-command.ts +88 -0
- package/src/cli/visible-key-values.ts +29 -0
- package/src/components/chart/composite/axis-overlays.tsx +452 -0
- package/src/components/chart/composite/bitmap.ts +71 -0
- package/src/components/chart/composite/chart-layout.ts +131 -0
- package/src/components/chart/composite/column-layout.ts +215 -0
- package/src/components/chart/composite/composite-chart.tsx +1248 -0
- package/src/components/chart/composite/downsample.ts +221 -0
- package/src/components/chart/composite/drawing-store.ts +79 -0
- package/src/components/chart/composite/format.ts +574 -0
- package/src/components/chart/composite/index.ts +16 -0
- package/src/components/chart/composite/interactions.ts +385 -0
- package/src/components/chart/composite/legend.tsx +623 -0
- package/src/components/chart/composite/level-labels.ts +30 -0
- package/src/components/chart/composite/levels.ts +172 -0
- package/src/components/chart/composite/panel-bitmap.ts +180 -0
- package/src/components/chart/composite/panel-gestures.ts +133 -0
- package/src/components/chart/composite/panel-labels.ts +147 -0
- package/src/components/chart/composite/panel-series.ts +106 -0
- package/src/components/chart/composite/panel-surface.tsx +1328 -0
- package/src/components/chart/composite/price-axis-labels.tsx +320 -0
- package/src/components/chart/composite/price-series.ts +83 -0
- package/src/components/chart/composite/range-statistics.ts +62 -0
- package/src/components/chart/composite/rasterizer.ts +645 -0
- package/src/components/chart/composite/scene.ts +971 -0
- package/src/components/chart/composite/series-axis-tags.tsx +74 -0
- package/src/components/chart/composite/series-cues.ts +85 -0
- package/src/components/chart/composite/session-shading.ts +100 -0
- package/src/components/chart/composite/text-renderer.ts +407 -0
- package/src/components/chart/composite/time-axis.ts +705 -0
- package/src/components/chart/composite/time-scale.ts +335 -0
- package/src/components/chart/composite/tool-catalog.ts +134 -0
- package/src/components/chart/composite/toolbar.tsx +238 -0
- package/src/components/chart/composite/tools.ts +769 -0
- package/src/components/chart/composite/types.ts +354 -0
- package/src/components/chart/composite/use-composite-chart-keyboard.ts +844 -0
- package/src/components/chart/composite/use-composite-value-scales.ts +44 -0
- package/src/components/chart/composite/use-composite-viewport.ts +180 -0
- package/src/components/chart/composite/value-scale.ts +149 -0
- package/src/components/chart/composite/volume-profile-paint.ts +80 -0
- package/src/components/chart/core/data.ts +9 -0
- package/src/components/chart/core/date-window.ts +179 -0
- package/src/components/chart/core/palette.ts +49 -0
- package/src/components/chart/core/pointer.ts +182 -0
- package/src/components/chart/core/types.ts +22 -0
- package/src/components/chart/core/view-reset.ts +46 -0
- package/src/components/chart/curve/curve-surface.tsx +280 -0
- package/src/components/chart/curve/index.ts +4 -0
- package/src/components/chart/curve/model.ts +354 -0
- package/src/components/chart/native/bitmap-support.ts +55 -0
- package/src/components/chart/native/chart-rasterizer.ts +16 -0
- package/src/components/chart/native/kitty/adapter.ts +9 -0
- package/src/components/chart/native/kitty/manager.ts +145 -0
- package/src/components/chart/native/kitty/protocol.ts +112 -0
- package/src/components/chart/native/kitty/support.ts +104 -0
- package/src/components/chart/native/raster/crosshair.ts +89 -0
- package/src/components/chart/native/raster/placement.ts +138 -0
- package/src/components/chart/native/raster/primitives.ts +209 -0
- package/src/components/chart/native/raster/types.ts +25 -0
- package/src/components/chart/native/renderer-selection.ts +154 -0
- package/src/components/chart/native/surface/manager.ts +290 -0
- package/src/components/chart/native/surface/visibility.ts +85 -0
- package/src/components/chart/native/use-chart-text-fallback.ts +19 -0
- package/src/components/chart/static/chart-surface.tsx +162 -0
- package/src/components/chart/static/index.ts +5 -0
- package/src/components/chart/static/scatter-chart-surface.tsx +184 -0
- package/src/components/chart/static/series.ts +91 -0
- package/src/components/chart/static/trail-chart-model.ts +105 -0
- package/src/components/chart/static/trail-chart-surface.tsx +422 -0
- package/src/components/chart/surface3d/chart.tsx +104 -0
- package/src/components/chart/surface3d/model.ts +426 -0
- package/src/components/chart/surface3d/software.ts +360 -0
- package/src/components/chart-table/axis.ts +49 -0
- package/src/components/chart-table/header.tsx +264 -0
- package/src/components/chart-table/index.ts +13 -0
- package/src/components/chart-table/layout.ts +154 -0
- package/src/components/chart-table/read.tsx +74 -0
- package/src/components/chart-table/selection.ts +145 -0
- package/src/components/command-bar/action-runtime.ts +268 -0
- package/src/components/command-bar/assist/inventory.ts +146 -0
- package/src/components/command-bar/assist/model.ts +279 -0
- package/src/components/command-bar/assist/runtime.ts +246 -0
- package/src/components/command-bar/commands/collection-list.ts +262 -0
- package/src/components/command-bar/commands/collection.ts +285 -0
- package/src/components/command-bar/commands/direct/index.ts +460 -0
- package/src/components/command-bar/commands/direct/runtime.ts +181 -0
- package/src/components/command-bar/commands/plugin/actions.ts +143 -0
- package/src/components/command-bar/commands/plugin/items.ts +178 -0
- package/src/components/command-bar/commands/registry.ts +362 -0
- package/src/components/command-bar/helpers.ts +86 -0
- package/src/components/command-bar/keyboard-handlers.ts +129 -0
- package/src/components/command-bar/keyboard-shortcuts.ts +165 -0
- package/src/components/command-bar/layout-items/current-layout.ts +210 -0
- package/src/components/command-bar/layout-items/focused-pane.ts +193 -0
- package/src/components/command-bar/layout-items/types.ts +26 -0
- package/src/components/command-bar/layout-items/window-mode.ts +72 -0
- package/src/components/command-bar/layout-items.ts +93 -0
- package/src/components/command-bar/list/badge.ts +63 -0
- package/src/components/command-bar/list/model.ts +213 -0
- package/src/components/command-bar/list/navigation.ts +121 -0
- package/src/components/command-bar/list/view.tsx +362 -0
- package/src/components/command-bar/pane-actions.ts +128 -0
- package/src/components/command-bar/pane-settings.ts +44 -0
- package/src/components/command-bar/pane-templates/items.ts +289 -0
- package/src/components/command-bar/pane-templates/workflow-route.ts +91 -0
- package/src/components/command-bar/pane-templates/workflow.ts +344 -0
- package/src/components/command-bar/panel/index.tsx +260 -0
- package/src/components/command-bar/panel/layout.ts +150 -0
- package/src/components/command-bar/panel/native-surface.ts +26 -0
- package/src/components/command-bar/panel/palette.ts +28 -0
- package/src/components/command-bar/panel/prompt-binding.ts +54 -0
- package/src/components/command-bar/panel/prompt-example.ts +22 -0
- package/src/components/command-bar/panel/runtime.ts +230 -0
- package/src/components/command-bar/panel/state.ts +161 -0
- package/src/components/command-bar/panel/types.ts +50 -0
- package/src/components/command-bar/picker-activation.ts +87 -0
- package/src/components/command-bar/routes/root/command-items.ts +253 -0
- package/src/components/command-bar/routes/root/help-items.ts +66 -0
- package/src/components/command-bar/routes/root/pick-prefetch.ts +38 -0
- package/src/components/command-bar/routes/root/plugin-install.ts +304 -0
- package/src/components/command-bar/routes/root/plugin-turn-on.ts +92 -0
- package/src/components/command-bar/routes/root/provider-search.ts +271 -0
- package/src/components/command-bar/routes/root/results.ts +439 -0
- package/src/components/command-bar/routes/root/runtime.ts +396 -0
- package/src/components/command-bar/routes/root/search-providers.ts +311 -0
- package/src/components/command-bar/routes/root/search-report.ts +247 -0
- package/src/components/command-bar/routes/root/selection.ts +250 -0
- package/src/components/command-bar/routes/root/shortcut-feedback.ts +116 -0
- package/src/components/command-bar/routes/root/shortcut-items.ts +161 -0
- package/src/components/command-bar/routes/root/shortcuts.ts +221 -0
- package/src/components/command-bar/routes/root/start-here.ts +90 -0
- package/src/components/command-bar/routes/ticker-search/actions.ts +248 -0
- package/src/components/command-bar/routes/ticker-search/results.ts +328 -0
- package/src/components/command-bar/routes/ticker-search/route.ts +151 -0
- package/src/components/command-bar/routing/actions.ts +194 -0
- package/src/components/command-bar/routing/confirm.ts +23 -0
- package/src/components/command-bar/routing/effects.ts +63 -0
- package/src/components/command-bar/routing/launch-request.ts +41 -0
- package/src/components/command-bar/routing/list-state.ts +196 -0
- package/src/components/command-bar/routing/navigation-state.ts +197 -0
- package/src/components/command-bar/selection-runtime.ts +411 -0
- package/src/components/command-bar/surface/environment.ts +136 -0
- package/src/components/command-bar/surface/index.tsx +633 -0
- package/src/components/command-bar/theme-picker.tsx +336 -0
- package/src/components/command-bar/theme-preview.ts +84 -0
- package/src/components/command-bar/view-model.ts +237 -0
- package/src/components/command-bar/workflow/alert.ts +170 -0
- package/src/components/command-bar/workflow/broker.ts +186 -0
- package/src/components/command-bar/workflow/builtin.ts +174 -0
- package/src/components/command-bar/workflow/collection-actions.ts +398 -0
- package/src/components/command-bar/workflow/collection-ticker.ts +93 -0
- package/src/components/command-bar/workflow/coordinator.ts +72 -0
- package/src/components/command-bar/workflow/fields.ts +252 -0
- package/src/components/command-bar/workflow/ops.ts +459 -0
- package/src/components/command-bar/workflow/pane-reuse.ts +178 -0
- package/src/components/command-bar/workflow/portfolio-position.ts +211 -0
- package/src/components/command-bar/workflow/route-builder.ts +56 -0
- package/src/components/command-bar/workflow/submit.ts +220 -0
- package/src/components/command-bar/workflow/ticker-listing-picker.ts +38 -0
- package/src/components/command-bar/workflow/tickers.ts +288 -0
- package/src/components/command-bar/workflow/types.ts +106 -0
- package/src/components/company-logo.tsx +112 -0
- package/src/components/data-table/export.ts +76 -0
- package/src/components/data-table/sections.ts +57 -0
- package/src/components/data-table/sort-menu.tsx +75 -0
- package/src/components/data-table/stack-view.tsx +114 -0
- package/src/components/data-table/table-pane.ts +46 -0
- package/src/components/data-table/view.tsx +767 -0
- package/src/components/feed-data-table/stack-view.tsx +304 -0
- package/src/components/feed-stack-controller.ts +39 -0
- package/src/components/feedback-dialog.tsx +341 -0
- package/src/components/form-modal/broker-step.tsx +63 -0
- package/src/components/form-modal/confirm.tsx +147 -0
- package/src/components/form-modal/content.tsx +703 -0
- package/src/components/form-modal/deps.ts +77 -0
- package/src/components/form-modal/field-row.tsx +316 -0
- package/src/components/form-modal/host.tsx +169 -0
- package/src/components/form-modal/index.ts +2 -0
- package/src/components/form-modal/model.ts +134 -0
- package/src/components/form-modal/request.ts +74 -0
- package/src/components/form-modal/routes.ts +157 -0
- package/src/components/index.ts +162 -0
- package/src/components/input-search-bar.tsx +171 -0
- package/src/components/layout/detached-pane-shell.tsx +487 -0
- package/src/components/layout/floating-pane.tsx +196 -0
- package/src/components/layout/header.tsx +967 -0
- package/src/components/layout/market-summary.ts +154 -0
- package/src/components/layout/missing-pane.tsx +172 -0
- package/src/components/layout/pane/capture-stamp.ts +41 -0
- package/src/components/layout/pane/capture-status.ts +12 -0
- package/src/components/layout/pane/content.tsx +113 -0
- package/src/components/layout/pane/cycle-order.ts +23 -0
- package/src/components/layout/pane/error-boundary.tsx +103 -0
- package/src/components/layout/pane/footer/index.tsx +406 -0
- package/src/components/layout/pane/footer/keyboard.ts +99 -0
- package/src/components/layout/pane/footer/model.ts +456 -0
- package/src/components/layout/pane/footer/registration.tsx +278 -0
- package/src/components/layout/pane/frame.tsx +56 -0
- package/src/components/layout/pane/header-tabs.tsx +135 -0
- package/src/components/layout/pane/header.tsx +471 -0
- package/src/components/layout/pane/index.tsx +148 -0
- package/src/components/layout/pane/instrument-coverage-gate.tsx +57 -0
- package/src/components/layout/pane/pane-tabs.tsx +50 -0
- package/src/components/layout/pane/sidebar-metrics.ts +65 -0
- package/src/components/layout/pane/sidebar.tsx +448 -0
- package/src/components/layout/pane/sizing.ts +100 -0
- package/src/components/layout/pane/status-footer.ts +92 -0
- package/src/components/layout/pane/surface.ts +26 -0
- package/src/components/layout/pane/ticker-fate-gate.tsx +62 -0
- package/src/components/layout/pane/title.ts +111 -0
- package/src/components/layout/presentation.ts +22 -0
- package/src/components/layout/shell/action-menu-overlay.tsx +149 -0
- package/src/components/layout/shell/active-drag.ts +266 -0
- package/src/components/layout/shell/chrome.ts +127 -0
- package/src/components/layout/shell/cursor-occlusion.ts +206 -0
- package/src/components/layout/shell/drag/index.ts +456 -0
- package/src/components/layout/shell/drag/live.ts +203 -0
- package/src/components/layout/shell/drag/overlays.tsx +222 -0
- package/src/components/layout/shell/drag/runtime.ts +347 -0
- package/src/components/layout/shell/drag/slide.ts +10 -0
- package/src/components/layout/shell/fullscreen.ts +10 -0
- package/src/components/layout/shell/index.tsx +970 -0
- package/src/components/layout/shell/layout-state.ts +86 -0
- package/src/components/layout/shell/menu.ts +303 -0
- package/src/components/layout/shell/native/pointer-runtime.ts +209 -0
- package/src/components/layout/shell/native/surfaces.ts +143 -0
- package/src/components/layout/shell/native/window-state.ts +208 -0
- package/src/components/layout/shell/pane/actions.ts +223 -0
- package/src/components/layout/shell/pane/ask.ts +136 -0
- package/src/components/layout/shell/pane/capture.ts +177 -0
- package/src/components/layout/shell/pane/layers.tsx +777 -0
- package/src/components/layout/shell/pane/management-shortcuts.ts +239 -0
- package/src/components/layout/shell/pane/new-layout.ts +116 -0
- package/src/components/layout/shell/pane-occlusion.ts +63 -0
- package/src/components/layout/shell/shortcuts.ts +124 -0
- package/src/components/layout/shell/terminal-pointer-runtime.ts +380 -0
- package/src/components/layout/shell/ticker-link-menu.ts +115 -0
- package/src/components/layout/shell/visible-layout.ts +60 -0
- package/src/components/layout/shell/window-mode/index.ts +271 -0
- package/src/components/layout/shell/window-mode/overlays.tsx +225 -0
- package/src/components/layout/status-bar-groups.ts +85 -0
- package/src/components/layout/status-bar.tsx +755 -0
- package/src/components/layout/status-widget-space.ts +72 -0
- package/src/components/layout/titlebar-overlay.ts +17 -0
- package/src/components/layout/transient-layout.tsx +60 -0
- package/src/components/layout/window-controls.tsx +104 -0
- package/src/components/layout/window-edit/mode.ts +509 -0
- package/src/components/layout/window-edit/presentation.ts +138 -0
- package/src/components/layout/window-edit/status.tsx +121 -0
- package/src/components/layout/window-fullscreen.ts +32 -0
- package/src/components/markdown-editor.tsx +150 -0
- package/src/components/markdown-text.tsx +645 -0
- package/src/components/market-board/index.tsx +224 -0
- package/src/components/metric-treemap/heat-surface.tsx +828 -0
- package/src/components/metric-treemap/heat-tiles.ts +261 -0
- package/src/components/metric-treemap/index.tsx +352 -0
- package/src/components/metric-treemap/layout.ts +484 -0
- package/src/components/metric-treemap/scene.ts +432 -0
- package/src/components/onboarding/account-step/form-panel.tsx +196 -0
- package/src/components/onboarding/account-step/index.tsx +51 -0
- package/src/components/onboarding/account-step/qr-panel.tsx +47 -0
- package/src/components/onboarding/account-step/signed-in-panel.tsx +28 -0
- package/src/components/onboarding/desks-step.tsx +43 -0
- package/src/components/onboarding/first-run-workspace.ts +223 -0
- package/src/components/onboarding/onboarding-frame.tsx +597 -0
- package/src/components/onboarding/onboarding-keyboard.ts +311 -0
- package/src/components/onboarding/onboarding-steps.tsx +2 -0
- package/src/components/onboarding/onboarding-wizard.tsx +745 -0
- package/src/components/onboarding/portfolio-step/broker-fields-panel.tsx +177 -0
- package/src/components/onboarding/portfolio-step/broker-setup-panel.tsx +121 -0
- package/src/components/onboarding/portfolio-step/broker-sync-panel.tsx +40 -0
- package/src/components/onboarding/portfolio-step/choose-panel.tsx +39 -0
- package/src/components/onboarding/portfolio-step/index.tsx +74 -0
- package/src/components/onboarding/portfolio-step/positions-panel.tsx +379 -0
- package/src/components/onboarding/portfolio-step/types.ts +34 -0
- package/src/components/onboarding/portfolio-step/utils.ts +15 -0
- package/src/components/onboarding/pro-step-layout.ts +86 -0
- package/src/components/onboarding/use-onboarding-broker-form.ts +266 -0
- package/src/components/onboarding/use-onboarding-progress.ts +298 -0
- package/src/components/onboarding/use-onboarding-upgrade.ts +87 -0
- package/src/components/onboarding/wizard-account.ts +182 -0
- package/src/components/onboarding/wizard-broker-sync.ts +281 -0
- package/src/components/onboarding/wizard-model.ts +161 -0
- package/src/components/onboarding/wizard-positions.ts +434 -0
- package/src/components/paged-rows.ts +217 -0
- package/src/components/pane-settings-dialog/desktop.tsx +261 -0
- package/src/components/pane-settings-dialog/field-dialogs.tsx +214 -0
- package/src/components/pane-settings-dialog/tui.tsx +121 -0
- package/src/components/pane-settings-dialog/value.ts +68 -0
- package/src/components/pane-settings-dialog.tsx +248 -0
- package/src/components/pane-template-wizard.tsx +60 -0
- package/src/components/price-performance.tsx +85 -0
- package/src/components/price-selector-dialog.tsx +215 -0
- package/src/components/price-sparkline/bitmap.ts +150 -0
- package/src/components/price-sparkline/index.ts +73 -0
- package/src/components/price-sparkline/model.ts +150 -0
- package/src/components/price-sparkline/view.tsx +226 -0
- package/src/components/quote-flash.ts +168 -0
- package/src/components/reader/article-reader.tsx +468 -0
- package/src/components/reader/article-text.ts +527 -0
- package/src/components/reader/detail-reader.tsx +239 -0
- package/src/components/reader/reader-text.tsx +281 -0
- package/src/components/sign-in-code-panel.tsx +203 -0
- package/src/components/sign-in-gate.tsx +169 -0
- package/src/components/speedometer-gauge/desktop.tsx +142 -0
- package/src/components/speedometer-gauge/index.tsx +42 -0
- package/src/components/speedometer-gauge/model.ts +57 -0
- package/src/components/speedometer-gauge/terminal.tsx +283 -0
- package/src/components/table-view-shared.tsx +243 -0
- package/src/components/textarea-keys.ts +13 -0
- package/src/components/ticker/badge/format.ts +121 -0
- package/src/components/ticker/badge/index.tsx +144 -0
- package/src/components/ticker/badge/list.tsx +146 -0
- package/src/components/ticker/badge/text.tsx +157 -0
- package/src/components/ticker/list-table-view.tsx +421 -0
- package/src/components/toggle-list.tsx +194 -0
- package/src/components/ui/action-row.tsx +36 -0
- package/src/components/ui/action-scope.tsx +96 -0
- package/src/components/ui/audio-player.tsx +70 -0
- package/src/components/ui/button.tsx +189 -0
- package/src/components/ui/card.tsx +75 -0
- package/src/components/ui/checkbox.tsx +80 -0
- package/src/components/ui/choice-dialog.tsx +125 -0
- package/src/components/ui/choice-groups.ts +18 -0
- package/src/components/ui/column-grid.tsx +250 -0
- package/src/components/ui/confirm-dialog.tsx +175 -0
- package/src/components/ui/country-flag-art.tsx +629 -0
- package/src/components/ui/country-flag.tsx +147 -0
- package/src/components/ui/data-table/hooks.ts +46 -0
- package/src/components/ui/data-table/index.tsx +179 -0
- package/src/components/ui/data-table/opentui/index.tsx +796 -0
- package/src/components/ui/data-table/opentui/model.ts +281 -0
- package/src/components/ui/data-table/stable-columns.ts +34 -0
- package/src/components/ui/data-table/types.ts +191 -0
- package/src/components/ui/data-table/visible-range.ts +47 -0
- package/src/components/ui/detail-scroll-body.tsx +75 -0
- package/src/components/ui/dialog-actions.tsx +44 -0
- package/src/components/ui/disclosure-marker.tsx +38 -0
- package/src/components/ui/display.tsx +260 -0
- package/src/components/ui/external-link.tsx +181 -0
- package/src/components/ui/field-grid.tsx +473 -0
- package/src/components/ui/field-ring.ts +125 -0
- package/src/components/ui/fields.tsx +425 -0
- package/src/components/ui/figure.tsx +96 -0
- package/src/components/ui/fill.ts +8 -0
- package/src/components/ui/frame.tsx +149 -0
- package/src/components/ui/header-case.ts +30 -0
- package/src/components/ui/icon.tsx +199 -0
- package/src/components/ui/index.ts +84 -0
- package/src/components/ui/inline-quick-add.tsx +144 -0
- package/src/components/ui/list-row-lines.tsx +87 -0
- package/src/components/ui/list-view.tsx +403 -0
- package/src/components/ui/loading.tsx +17 -0
- package/src/components/ui/logo-mark.tsx +73 -0
- package/src/components/ui/menu.tsx +152 -0
- package/src/components/ui/message-composer.tsx +172 -0
- package/src/components/ui/multi-select/dialog.tsx +643 -0
- package/src/components/ui/multi-select/index.ts +190 -0
- package/src/components/ui/number-prompt-dialog.tsx +71 -0
- package/src/components/ui/number-step.ts +54 -0
- package/src/components/ui/page-stack-view.tsx +137 -0
- package/src/components/ui/popover.tsx +10 -0
- package/src/components/ui/prose.tsx +280 -0
- package/src/components/ui/query-bar-keys.tsx +196 -0
- package/src/components/ui/query-bar.tsx +554 -0
- package/src/components/ui/quote.ts +42 -0
- package/src/components/ui/range-track.tsx +66 -0
- package/src/components/ui/ratio-bar.tsx +84 -0
- package/src/components/ui/remote-image.tsx +37 -0
- package/src/components/ui/reveal-in-scroll-box.ts +52 -0
- package/src/components/ui/row-notes.ts +79 -0
- package/src/components/ui/row-value-cache.ts +41 -0
- package/src/components/ui/select-button.tsx +219 -0
- package/src/components/ui/select-field.tsx +55 -0
- package/src/components/ui/shortcut-hint.tsx +69 -0
- package/src/components/ui/split-bar.tsx +69 -0
- package/src/components/ui/stat-grid.tsx +198 -0
- package/src/components/ui/status.tsx +347 -0
- package/src/components/ui/table-layout.ts +259 -0
- package/src/components/ui/tabs.tsx +587 -0
- package/src/components/ui/text-prompt-dialog.tsx +135 -0
- package/src/components/ui/toggle.tsx +136 -0
- package/src/components/ui/windowed-list.tsx +27 -0
- package/src/components/use-double-click-activation.ts +40 -0
- package/src/components/use-external-link-footer.ts +82 -0
- package/src/components/use-pane-notice-footer.tsx +128 -0
- package/src/components/use-pinned-moment.ts +19 -0
- package/src/components/use-scrollbox-layout.ts +17 -0
- package/src/core/app-runtime.ts +136 -0
- package/src/core/app-service-ports.ts +54 -0
- package/src/core/app-services.ts +48 -0
- package/src/core/connection-health.ts +293 -0
- package/src/core/state/app/instrument.ts +99 -0
- package/src/core/state/app/layout-reducer.ts +405 -0
- package/src/core/state/app/layout.ts +613 -0
- package/src/core/state/app/state.ts +401 -0
- package/src/core/state/app/types.ts +201 -0
- package/src/core/state/session-persistence.ts +150 -0
- package/src/data/app-persistence.ts +25 -0
- package/src/data/cached-query.ts +120 -0
- package/src/data/config/chart-settings.ts +709 -0
- package/src/data/config/home.ts +123 -0
- package/src/data/config/layout.ts +317 -0
- package/src/data/config/store/fold-panes.ts +340 -0
- package/src/data/config/store/index.ts +63 -0
- package/src/data/config/store/migrations.ts +294 -0
- package/src/data/config/store/node.ts +178 -0
- package/src/data/config/store/normalize.ts +517 -0
- package/src/data/config/store/pane-state.ts +47 -0
- package/src/data/config/store/portfolio-as-of-column.ts +57 -0
- package/src/data/json-persistence.ts +85 -0
- package/src/data/json-storage.ts +57 -0
- package/src/data/json-ticker-repository.ts +67 -0
- package/src/data/memory-resource-store.ts +152 -0
- package/src/data/plugin-cache.ts +119 -0
- package/src/data/plugin-state-store.ts +150 -0
- package/src/data/resource-store.ts +434 -0
- package/src/data/response-sequence.ts +6 -0
- package/src/data/saved-copies.ts +123 -0
- package/src/data/session-store.ts +59 -0
- package/src/data/sqlite/database.ts +80 -0
- package/src/data/sqlite/json.ts +18 -0
- package/src/data/sqlite/retry.ts +90 -0
- package/src/data/ticker-repository.ts +60 -0
- package/src/data/ticker-store.ts +65 -0
- package/src/data/ticker-writes.ts +81 -0
- package/src/data/ttl-cache.ts +165 -0
- package/src/docs/content.ts +215 -0
- package/src/docs/load.ts +139 -0
- package/src/docs/requests.ts +39 -0
- package/src/docs/snapshot.chunk.ts +8 -0
- package/src/docs/snapshot.json +8106 -0
- package/src/docs/topics.ts +216 -0
- package/src/feedback/diagnostics.ts +152 -0
- package/src/feedback/redact.ts +54 -0
- package/src/feedback/screenshot.ts +45 -0
- package/src/feedback/types.ts +60 -0
- package/src/i18n/es.ts +1690 -0
- package/src/i18n/index.ts +159 -0
- package/src/i18n/ja.ts +1686 -0
- package/src/i18n/ko.ts +1684 -0
- package/src/i18n/languages.ts +101 -0
- package/src/i18n/react.ts +6 -0
- package/src/i18n/zh-cn.ts +1686 -0
- package/src/i18n/zh-tw.ts +1686 -0
- package/src/layout/desk-keys.ts +7 -0
- package/src/layout/desks.ts +334 -0
- package/src/layout/launch-layout.ts +147 -0
- package/src/layout/pane-follow.ts +47 -0
- package/src/layout/pane-layout-move.ts +264 -0
- package/src/layout/pane-manager/dock-tree.ts +302 -0
- package/src/layout/pane-manager/docking.ts +209 -0
- package/src/layout/pane-manager/floating-actions.ts +160 -0
- package/src/layout/pane-manager/floating.ts +124 -0
- package/src/layout/pane-manager/gridlock-inference.ts +126 -0
- package/src/layout/pane-manager/gridlock.ts +143 -0
- package/src/layout/pane-manager/hidden-panes.ts +160 -0
- package/src/layout/pane-manager/index.ts +71 -0
- package/src/layout/pane-manager/layout-state.ts +203 -0
- package/src/layout/pane-manager/queries.ts +82 -0
- package/src/layout/pane-manager/types.ts +24 -0
- package/src/layout/pane-state.ts +48 -0
- package/src/layout/selected-ticker.ts +74 -0
- package/src/layout/ticker-navigation.ts +128 -0
- package/src/layout-marketplace/api.ts +65 -0
- package/src/layout-marketplace/cloud.ts +183 -0
- package/src/layout-marketplace/gallery-desktop.tsx +476 -0
- package/src/layout-marketplace/gallery-terminal.tsx +371 -0
- package/src/layout-marketplace/gallery.tsx +776 -0
- package/src/layout-marketplace/geometry.ts +80 -0
- package/src/layout-marketplace/linked-sync.ts +109 -0
- package/src/layout-marketplace/linked.ts +140 -0
- package/src/layout-marketplace/mini-workspace.tsx +428 -0
- package/src/layout-marketplace/model.ts +270 -0
- package/src/layout-marketplace/pane-imagery.ts +87 -0
- package/src/layout-marketplace/pane.tsx +20 -0
- package/src/layout-marketplace/use-marketplace.ts +130 -0
- package/src/market-data/bars-per-year.ts +43 -0
- package/src/market-data/bond-funds.ts +85 -0
- package/src/market-data/commodity-names.ts +80 -0
- package/src/market-data/coordinator/auxiliary.ts +275 -0
- package/src/market-data/coordinator/chart.ts +164 -0
- package/src/market-data/coordinator/entries.ts +180 -0
- package/src/market-data/coordinator/events.ts +103 -0
- package/src/market-data/coordinator/financials.ts +260 -0
- package/src/market-data/coordinator/fx-legs.ts +71 -0
- package/src/market-data/coordinator/index.ts +854 -0
- package/src/market-data/coordinator/quotes.ts +485 -0
- package/src/market-data/depositary-pair.ts +251 -0
- package/src/market-data/frame-scheduler.ts +335 -0
- package/src/market-data/fund-facts.ts +50 -0
- package/src/market-data/futures-board.ts +255 -0
- package/src/market-data/futures-contract.ts +486 -0
- package/src/market-data/fx-closes.ts +164 -0
- package/src/market-data/history-session.ts +97 -0
- package/src/market-data/hooks.tsx +630 -0
- package/src/market-data/market/bar-period.ts +107 -0
- package/src/market-data/market/change-basis.ts +302 -0
- package/src/market-data/market/dated-previous-close.ts +203 -0
- package/src/market-data/market/format.ts +713 -0
- package/src/market-data/market/freshness.ts +794 -0
- package/src/market-data/market/futures-week.ts +68 -0
- package/src/market-data/market/index-level.ts +51 -0
- package/src/market-data/market/period-return.ts +163 -0
- package/src/market-data/market/price-basis.ts +9 -0
- package/src/market-data/market/session-close-note.ts +58 -0
- package/src/market-data/market/status.ts +588 -0
- package/src/market-data/market/trading-sessions.ts +149 -0
- package/src/market-data/market/year-to-date.ts +41 -0
- package/src/market-data/model-dividend-yield.ts +117 -0
- package/src/market-data/options-alternatives.ts +206 -0
- package/src/market-data/performance.ts +125 -0
- package/src/market-data/perpetual-premium.ts +32 -0
- package/src/market-data/portfolio-financials.ts +37 -0
- package/src/market-data/published-apac-sessions.ts +99 -0
- package/src/market-data/published-cn-sessions.ts +25 -0
- package/src/market-data/published-futures-sessions.ts +69 -0
- package/src/market-data/published-jpx-sessions.ts +22 -0
- package/src/market-data/published-nse-sessions.ts +20 -0
- package/src/market-data/published-us-sessions.ts +87 -0
- package/src/market-data/query-store.ts +95 -0
- package/src/market-data/quote-subscription-target.ts +79 -0
- package/src/market-data/quotes/clock.ts +56 -0
- package/src/market-data/quotes/contributions.ts +336 -0
- package/src/market-data/quotes/day-range.ts +106 -0
- package/src/market-data/quotes/delisting.ts +34 -0
- package/src/market-data/quotes/freshness.ts +174 -0
- package/src/market-data/quotes/intraday-bar.ts +37 -0
- package/src/market-data/quotes/live-valuation.ts +235 -0
- package/src/market-data/quotes/metadata.ts +66 -0
- package/src/market-data/quotes/regular-session-valuation.ts +198 -0
- package/src/market-data/quotes/resolution.ts +653 -0
- package/src/market-data/quotes/screener-live-quotes.ts +283 -0
- package/src/market-data/quotes/time.ts +83 -0
- package/src/market-data/realized-volatility.ts +301 -0
- package/src/market-data/request-types.ts +127 -0
- package/src/market-data/result-types.ts +53 -0
- package/src/market-data/selectors.ts +131 -0
- package/src/market-data/snapshot-provider.ts +299 -0
- package/src/market-data/tax-equivalent.ts +352 -0
- package/src/market-data/ticker-price-returns.ts +20 -0
- package/src/market-data/trace.ts +7 -0
- package/src/news/aggregator.ts +689 -0
- package/src/news/cloud-session.ts +21 -0
- package/src/news/hooks.ts +67 -0
- package/src/news/news-model.ts +247 -0
- package/src/news/source-label.ts +22 -0
- package/src/news/ticker-symbols.ts +21 -0
- package/src/news/types.ts +110 -0
- package/src/notifications/app-badge.ts +30 -0
- package/src/notifications/app-notifier.ts +287 -0
- package/src/notifications/notification-log.ts +186 -0
- package/src/pane-settings.ts +89 -0
- package/src/plugins/absorbed.ts +33 -0
- package/src/plugins/auto-update-node.ts +115 -0
- package/src/plugins/auto-update.ts +281 -0
- package/src/plugins/builtin/account-management/calendar-tab.tsx +196 -0
- package/src/plugins/builtin/account-management/footer.ts +37 -0
- package/src/plugins/builtin/account-management/form-components.tsx +199 -0
- package/src/plugins/builtin/account-management/index.tsx +28 -0
- package/src/plugins/builtin/account-management/keyboard.ts +102 -0
- package/src/plugins/builtin/account-management/model.ts +358 -0
- package/src/plugins/builtin/account-management/navigation.ts +9 -0
- package/src/plugins/builtin/account-management/pane.tsx +1100 -0
- package/src/plugins/builtin/account-management/password-dialog.tsx +127 -0
- package/src/plugins/builtin/account-management/trial-cancel.ts +40 -0
- package/src/plugins/builtin/alerts/alert-engine.ts +138 -0
- package/src/plugins/builtin/alerts/alert-log.ts +33 -0
- package/src/plugins/builtin/alerts/calendar-events.ts +429 -0
- package/src/plugins/builtin/alerts/catalysts.ts +77 -0
- package/src/plugins/builtin/alerts/cli-forms.ts +216 -0
- package/src/plugins/builtin/alerts/cli.ts +1134 -0
- package/src/plugins/builtin/alerts/command.ts +112 -0
- package/src/plugins/builtin/alerts/constants.ts +12 -0
- package/src/plugins/builtin/alerts/event-rows.ts +20 -0
- package/src/plugins/builtin/alerts/events-pane.tsx +255 -0
- package/src/plugins/builtin/alerts/events.ts +260 -0
- package/src/plugins/builtin/alerts/fired-log.ts +183 -0
- package/src/plugins/builtin/alerts/focus.ts +27 -0
- package/src/plugins/builtin/alerts/format.ts +146 -0
- package/src/plugins/builtin/alerts/headless.ts +266 -0
- package/src/plugins/builtin/alerts/history-pane.tsx +161 -0
- package/src/plugins/builtin/alerts/history-rows.ts +93 -0
- package/src/plugins/builtin/alerts/history.ts +91 -0
- package/src/plugins/builtin/alerts/index.tsx +520 -0
- package/src/plugins/builtin/alerts/iv-level.ts +365 -0
- package/src/plugins/builtin/alerts/levels.ts +60 -0
- package/src/plugins/builtin/alerts/live.ts +136 -0
- package/src/plugins/builtin/alerts/metric-command.ts +134 -0
- package/src/plugins/builtin/alerts/metric-data.ts +111 -0
- package/src/plugins/builtin/alerts/metric-model.ts +324 -0
- package/src/plugins/builtin/alerts/metric-parity-fixture.json +725 -0
- package/src/plugins/builtin/alerts/pane.tsx +484 -0
- package/src/plugins/builtin/alerts/price.ts +35 -0
- package/src/plugins/builtin/alerts/quotes.ts +98 -0
- package/src/plugins/builtin/alerts/research-builder.ts +160 -0
- package/src/plugins/builtin/alerts/research-rules.ts +316 -0
- package/src/plugins/builtin/alerts/scheduled-check.ts +296 -0
- package/src/plugins/builtin/alerts/scheduled-sources.ts +48 -0
- package/src/plugins/builtin/alerts/scheduled.ts +413 -0
- package/src/plugins/builtin/alerts/storage.ts +66 -0
- package/src/plugins/builtin/alerts/targets.ts +101 -0
- package/src/plugins/builtin/alerts/types.ts +31 -0
- package/src/plugins/builtin/analytics/account-returns.ts +109 -0
- package/src/plugins/builtin/analytics/broker-performance.ts +131 -0
- package/src/plugins/builtin/analytics/display.ts +15 -0
- package/src/plugins/builtin/analytics/index.tsx +502 -0
- package/src/plugins/builtin/analytics/metrics.ts +218 -0
- package/src/plugins/builtin/analytics/pane-model.ts +487 -0
- package/src/plugins/builtin/analytics/portfolio-selection.ts +29 -0
- package/src/plugins/builtin/analytics/risk-book.ts +215 -0
- package/src/plugins/builtin/analytics/risk-client.ts +711 -0
- package/src/plugins/builtin/analytics/risk-evidence.ts +485 -0
- package/src/plugins/builtin/analytics/risk-fx.ts +218 -0
- package/src/plugins/builtin/analytics/risk-headless.ts +413 -0
- package/src/plugins/builtin/analytics/risk-math.ts +489 -0
- package/src/plugins/builtin/analytics/risk-model.ts +1288 -0
- package/src/plugins/builtin/analytics/risk-options.ts +265 -0
- package/src/plugins/builtin/analytics/risk-pane.tsx +839 -0
- package/src/plugins/builtin/analytics/risk-test-data.ts +262 -0
- package/src/plugins/builtin/analytics/sector-model.ts +187 -0
- package/src/plugins/builtin/analytics/sharpe-cadence.ts +136 -0
- package/src/plugins/builtin/analytics/view.tsx +186 -0
- package/src/plugins/builtin/attention/client.ts +80 -0
- package/src/plugins/builtin/attention/evidence.ts +30 -0
- package/src/plugins/builtin/attention/headless.ts +44 -0
- package/src/plugins/builtin/attention/index.tsx +21 -0
- package/src/plugins/builtin/attention/listing.ts +14 -0
- package/src/plugins/builtin/attention/model.ts +81 -0
- package/src/plugins/builtin/attention/pane.tsx +219 -0
- package/src/plugins/builtin/attention/series.ts +26 -0
- package/src/plugins/builtin/attention/trending.tsx +61 -0
- package/src/plugins/builtin/awards/alerts.ts +32 -0
- package/src/plugins/builtin/awards/client.ts +82 -0
- package/src/plugins/builtin/awards/detail.tsx +107 -0
- package/src/plugins/builtin/awards/evidence.ts +36 -0
- package/src/plugins/builtin/awards/headless.ts +135 -0
- package/src/plugins/builtin/awards/index.tsx +22 -0
- package/src/plugins/builtin/awards/model.ts +100 -0
- package/src/plugins/builtin/awards/pane.tsx +286 -0
- package/src/plugins/builtin/awards/series.ts +29 -0
- package/src/plugins/builtin/backtest/client.ts +92 -0
- package/src/plugins/builtin/backtest/engine.ts +185 -0
- package/src/plugins/builtin/backtest/export.ts +27 -0
- package/src/plugins/builtin/backtest/format.ts +52 -0
- package/src/plugins/builtin/backtest/headless.ts +81 -0
- package/src/plugins/builtin/backtest/index.tsx +33 -0
- package/src/plugins/builtin/backtest/pane.tsx +301 -0
- package/src/plugins/builtin/backtest/presets.ts +60 -0
- package/src/plugins/builtin/backtest/report.ts +160 -0
- package/src/plugins/builtin/backtest/rules.ts +209 -0
- package/src/plugins/builtin/backtest/window.ts +125 -0
- package/src/plugins/builtin/bond-calculator/client.ts +28 -0
- package/src/plugins/builtin/bond-calculator/headless.ts +56 -0
- package/src/plugins/builtin/bond-calculator/index.tsx +10 -0
- package/src/plugins/builtin/bond-calculator/math.ts +164 -0
- package/src/plugins/builtin/bond-calculator/model.ts +64 -0
- package/src/plugins/builtin/bond-calculator/pane.tsx +160 -0
- package/src/plugins/builtin/broker-manager/add-flow.tsx +662 -0
- package/src/plugins/builtin/broker-manager/add-request.ts +34 -0
- package/src/plugins/builtin/broker-manager/detail.tsx +380 -0
- package/src/plugins/builtin/broker-manager/footer.ts +89 -0
- package/src/plugins/builtin/broker-manager/index.tsx +411 -0
- package/src/plugins/builtin/broker-manager/keyboard.ts +59 -0
- package/src/plugins/builtin/broker-manager/model.ts +181 -0
- package/src/plugins/builtin/broker-manager/pane-actions.tsx +364 -0
- package/src/plugins/builtin/broker-manager/sign-in-end.ts +82 -0
- package/src/plugins/builtin/broker-manager/table.ts +86 -0
- package/src/plugins/builtin/broker-trading/account-picker.tsx +92 -0
- package/src/plugins/builtin/broker-trading/chart-levels.ts +123 -0
- package/src/plugins/builtin/broker-trading/command.ts +103 -0
- package/src/plugins/builtin/broker-trading/controller.ts +730 -0
- package/src/plugins/builtin/broker-trading/dock.tsx +202 -0
- package/src/plugins/builtin/broker-trading/headless.ts +77 -0
- package/src/plugins/builtin/broker-trading/index.tsx +95 -0
- package/src/plugins/builtin/broker-trading/linked-orders.ts +148 -0
- package/src/plugins/builtin/broker-trading/order-feed.ts +456 -0
- package/src/plugins/builtin/broker-trading/orders-data.ts +133 -0
- package/src/plugins/builtin/broker-trading/orders.tsx +515 -0
- package/src/plugins/builtin/broker-trading/overview-orders.tsx +127 -0
- package/src/plugins/builtin/broker-trading/pane-model.ts +235 -0
- package/src/plugins/builtin/broker-trading/pane.tsx +594 -0
- package/src/plugins/builtin/broker-trading/strategy.ts +153 -0
- package/src/plugins/builtin/broker-trading/ticket-parts.tsx +146 -0
- package/src/plugins/builtin/broker-trading/ticket.tsx +659 -0
- package/src/plugins/builtin/buildout/cells.tsx +206 -0
- package/src/plugins/builtin/buildout/data-runtime.ts +243 -0
- package/src/plugins/builtin/buildout/detail/company.tsx +279 -0
- package/src/plugins/builtin/buildout/detail/index.tsx +82 -0
- package/src/plugins/builtin/buildout/detail/intel.tsx +56 -0
- package/src/plugins/builtin/buildout/detail/satellite-images.tsx +80 -0
- package/src/plugins/builtin/buildout/detail/site.tsx +115 -0
- package/src/plugins/builtin/buildout/detail/ui.tsx +235 -0
- package/src/plugins/builtin/buildout/detail/values.ts +67 -0
- package/src/plugins/builtin/buildout/format.ts +224 -0
- package/src/plugins/builtin/buildout/index.tsx +24 -0
- package/src/plugins/builtin/buildout/model/index.ts +144 -0
- package/src/plugins/builtin/buildout/model/normalizers.ts +431 -0
- package/src/plugins/builtin/buildout/model/types.ts +321 -0
- package/src/plugins/builtin/buildout/pane/index.tsx +470 -0
- package/src/plugins/builtin/buildout/pane/status.tsx +87 -0
- package/src/plugins/builtin/buildout/table-model.ts +452 -0
- package/src/plugins/builtin/builtin-plugin-meta.ts +165 -0
- package/src/plugins/builtin/catalysts/client.ts +28 -0
- package/src/plugins/builtin/catalysts/detail.tsx +89 -0
- package/src/plugins/builtin/catalysts/evidence.ts +47 -0
- package/src/plugins/builtin/catalysts/headless.ts +59 -0
- package/src/plugins/builtin/catalysts/history.ts +26 -0
- package/src/plugins/builtin/catalysts/index.tsx +31 -0
- package/src/plugins/builtin/catalysts/model.ts +280 -0
- package/src/plugins/builtin/catalysts/pane.tsx +163 -0
- package/src/plugins/builtin/cds/client.ts +169 -0
- package/src/plugins/builtin/cds/headless.ts +367 -0
- package/src/plugins/builtin/cds/index.tsx +39 -0
- package/src/plugins/builtin/cds/model.ts +815 -0
- package/src/plugins/builtin/cds/pane.tsx +547 -0
- package/src/plugins/builtin/cds/series.ts +19 -0
- package/src/plugins/builtin/central-bank-rates/client.ts +66 -0
- package/src/plugins/builtin/central-bank-rates/headless.ts +81 -0
- package/src/plugins/builtin/central-bank-rates/index.tsx +20 -0
- package/src/plugins/builtin/central-bank-rates/model.ts +151 -0
- package/src/plugins/builtin/central-bank-rates/pane.tsx +73 -0
- package/src/plugins/builtin/central-bank-rates/series.ts +36 -0
- package/src/plugins/builtin/changelog/index.tsx +313 -0
- package/src/plugins/builtin/changelog/model.ts +88 -0
- package/src/plugins/builtin/chart-composer/catalog-inventory.ts +368 -0
- package/src/plugins/builtin/chart-composer/chart-spec-edit.ts +580 -0
- package/src/plugins/builtin/chart-composer/chart-spec.ts +159 -0
- package/src/plugins/builtin/chart-composer/cli-options.ts +131 -0
- package/src/plugins/builtin/chart-composer/data-catalog-pane.tsx +323 -0
- package/src/plugins/builtin/chart-composer/editor/controller.ts +657 -0
- package/src/plugins/builtin/chart-composer/editor/desktop-view.tsx +138 -0
- package/src/plugins/builtin/chart-composer/editor/model.ts +297 -0
- package/src/plugins/builtin/chart-composer/editor/opentui-view.tsx +111 -0
- package/src/plugins/builtin/chart-composer/editor.tsx +252 -0
- package/src/plugins/builtin/chart-composer/field-series.ts +40 -0
- package/src/plugins/builtin/chart-composer/follow-binding.ts +78 -0
- package/src/plugins/builtin/chart-composer/formula.ts +286 -0
- package/src/plugins/builtin/chart-composer/headless-schema.ts +256 -0
- package/src/plugins/builtin/chart-composer/headless.ts +807 -0
- package/src/plugins/builtin/chart-composer/index.tsx +544 -0
- package/src/plugins/builtin/chart-composer/leverage-overlay.ts +142 -0
- package/src/plugins/builtin/chart-composer/option-range.ts +39 -0
- package/src/plugins/builtin/chart-composer/pane.tsx +1477 -0
- package/src/plugins/builtin/chart-composer/presets.ts +320 -0
- package/src/plugins/builtin/chart-composer/price-levels.ts +80 -0
- package/src/plugins/builtin/chart-composer/quick-add.tsx +488 -0
- package/src/plugins/builtin/chart-composer/semantic.ts +113 -0
- package/src/plugins/builtin/chart-composer/series-catalog.ts +473 -0
- package/src/plugins/builtin/chart-composer/series-expression.ts +274 -0
- package/src/plugins/builtin/chart-composer/series-listings.ts +178 -0
- package/src/plugins/builtin/chart-composer/session-history.ts +382 -0
- package/src/plugins/builtin/chart-composer/session-range.ts +89 -0
- package/src/plugins/builtin/chart-composer/settings.ts +527 -0
- package/src/plugins/builtin/chart-composer/shortcuts.ts +27 -0
- package/src/plugins/builtin/chart-composer/studies.ts +242 -0
- package/src/plugins/builtin/chart-composer/use-series-catalog.ts +384 -0
- package/src/plugins/builtin/chart-composer/user-series.ts +84 -0
- package/src/plugins/builtin/chart-composer/viewport-labels.ts +93 -0
- package/src/plugins/builtin/chat/attachments/desktop.tsx +614 -0
- package/src/plugins/builtin/chat/attachments/files.ts +45 -0
- package/src/plugins/builtin/chat/attachments/model.ts +168 -0
- package/src/plugins/builtin/chat/attachments/terminal.tsx +72 -0
- package/src/plugins/builtin/chat/attachments/transfer.ts +165 -0
- package/src/plugins/builtin/chat/channel-labels.ts +67 -0
- package/src/plugins/builtin/chat/channels.ts +170 -0
- package/src/plugins/builtin/chat/command-bar.ts +136 -0
- package/src/plugins/builtin/chat/composer-commands.ts +54 -0
- package/src/plugins/builtin/chat/content/channel-navigation.ts +285 -0
- package/src/plugins/builtin/chat/content/command-suggestions.ts +93 -0
- package/src/plugins/builtin/chat/content/composer-cursor.ts +29 -0
- package/src/plugins/builtin/chat/content/composer-runtime.ts +471 -0
- package/src/plugins/builtin/chat/content/composer.tsx +310 -0
- package/src/plugins/builtin/chat/content/footer.tsx +321 -0
- package/src/plugins/builtin/chat/content/handle-prompt.tsx +326 -0
- package/src/plugins/builtin/chat/content/index.tsx +1289 -0
- package/src/plugins/builtin/chat/content/layout-metrics.ts +98 -0
- package/src/plugins/builtin/chat/content/mentions.ts +118 -0
- package/src/plugins/builtin/chat/content/new-dm-dialog.tsx +431 -0
- package/src/plugins/builtin/chat/content/new-messages.tsx +89 -0
- package/src/plugins/builtin/chat/content/open-targets.ts +80 -0
- package/src/plugins/builtin/chat/content/row-activity.ts +132 -0
- package/src/plugins/builtin/chat/content/scroll.ts +396 -0
- package/src/plugins/builtin/chat/content/selection-runtime.ts +66 -0
- package/src/plugins/builtin/chat/content/shortcuts.ts +344 -0
- package/src/plugins/builtin/chat/content/snapshot.ts +202 -0
- package/src/plugins/builtin/chat/content/transcript.tsx +296 -0
- package/src/plugins/builtin/chat/content/types.ts +35 -0
- package/src/plugins/builtin/chat/content/user-map.ts +23 -0
- package/src/plugins/builtin/chat/content/whole-message-copy.ts +112 -0
- package/src/plugins/builtin/chat/controller/attachments.ts +213 -0
- package/src/plugins/builtin/chat/controller/channel-actions.ts +97 -0
- package/src/plugins/builtin/chat/controller/channels.ts +180 -0
- package/src/plugins/builtin/chat/controller/connections.ts +110 -0
- package/src/plugins/builtin/chat/controller/draft-sync.ts +41 -0
- package/src/plugins/builtin/chat/controller/fetch.ts +85 -0
- package/src/plugins/builtin/chat/controller/index.ts +980 -0
- package/src/plugins/builtin/chat/controller/lifecycle.ts +153 -0
- package/src/plugins/builtin/chat/controller/mention-candidates.ts +104 -0
- package/src/plugins/builtin/chat/controller/message-loading.ts +104 -0
- package/src/plugins/builtin/chat/controller/messages.ts +243 -0
- package/src/plugins/builtin/chat/controller/notifications.ts +153 -0
- package/src/plugins/builtin/chat/controller/persistence.ts +170 -0
- package/src/plugins/builtin/chat/controller/realtime.ts +169 -0
- package/src/plugins/builtin/chat/controller/send.ts +250 -0
- package/src/plugins/builtin/chat/controller/session-runtime.ts +245 -0
- package/src/plugins/builtin/chat/controller/session.ts +41 -0
- package/src/plugins/builtin/chat/controller/state.ts +221 -0
- package/src/plugins/builtin/chat/controller/storage.ts +134 -0
- package/src/plugins/builtin/chat/controller/unread-people.ts +240 -0
- package/src/plugins/builtin/chat/controller/utils.ts +65 -0
- package/src/plugins/builtin/chat/controller/view.ts +103 -0
- package/src/plugins/builtin/chat/conversation-recency.ts +73 -0
- package/src/plugins/builtin/chat/conversations.ts +263 -0
- package/src/plugins/builtin/chat/direct-messages.ts +200 -0
- package/src/plugins/builtin/chat/discord-command.ts +91 -0
- package/src/plugins/builtin/chat/edit-window.ts +30 -0
- package/src/plugins/builtin/chat/ghost-user.ts +42 -0
- package/src/plugins/builtin/chat/handle-prompt.ts +128 -0
- package/src/plugins/builtin/chat/index.tsx +229 -0
- package/src/plugins/builtin/chat/layout.ts +570 -0
- package/src/plugins/builtin/chat/markdown.ts +94 -0
- package/src/plugins/builtin/chat/message/desktop.tsx +276 -0
- package/src/plugins/builtin/chat/message/header.tsx +209 -0
- package/src/plugins/builtin/chat/message/inline-tokens.tsx +315 -0
- package/src/plugins/builtin/chat/message/pane-chip.tsx +349 -0
- package/src/plugins/builtin/chat/message/pending-send.ts +35 -0
- package/src/plugins/builtin/chat/message/person-icons.tsx +53 -0
- package/src/plugins/builtin/chat/message/profile-popover.tsx +379 -0
- package/src/plugins/builtin/chat/message/reactions.tsx +210 -0
- package/src/plugins/builtin/chat/message/render-state.ts +151 -0
- package/src/plugins/builtin/chat/message/terminal.tsx +234 -0
- package/src/plugins/builtin/chat/message/types.ts +52 -0
- package/src/plugins/builtin/chat/pane-links/commands.ts +271 -0
- package/src/plugins/builtin/chat/pane-links/composer.ts +87 -0
- package/src/plugins/builtin/chat/pane-links/model.ts +158 -0
- package/src/plugins/builtin/chat/pane-links/open.ts +36 -0
- package/src/plugins/builtin/chat/pane-links/previews.ts +119 -0
- package/src/plugins/builtin/chat/pane-requests.ts +60 -0
- package/src/plugins/builtin/chat/pane-state.ts +115 -0
- package/src/plugins/builtin/chat/pane.tsx +145 -0
- package/src/plugins/builtin/chat/people.ts +202 -0
- package/src/plugins/builtin/chat/profile-popover.ts +207 -0
- package/src/plugins/builtin/chat/reactions.ts +197 -0
- package/src/plugins/builtin/chat/share/flow.tsx +32 -0
- package/src/plugins/builtin/chat/sidebar-rows.ts +109 -0
- package/src/plugins/builtin/chat/sidebar-store.ts +100 -0
- package/src/plugins/builtin/chat/sidebar.tsx +345 -0
- package/src/plugins/builtin/chat/status-widget.tsx +114 -0
- package/src/plugins/builtin/chat/unread-badge.ts +96 -0
- package/src/plugins/builtin/chat/unread-inbox-pane.tsx +281 -0
- package/src/plugins/builtin/chat/unread-inbox.ts +113 -0
- package/src/plugins/builtin/clinical-trials/client.ts +265 -0
- package/src/plugins/builtin/clinical-trials/index.tsx +83 -0
- package/src/plugins/builtin/clinical-trials/model.ts +269 -0
- package/src/plugins/builtin/clinical-trials/pane.tsx +423 -0
- package/src/plugins/builtin/clinical-trials/sponsor-tickers.ts +158 -0
- package/src/plugins/builtin/clinical-trials/types.ts +2 -0
- package/src/plugins/builtin/cloud/askg/attached-pane.tsx +69 -0
- package/src/plugins/builtin/cloud/askg/controller.ts +714 -0
- package/src/plugins/builtin/cloud/askg/conversation-store.ts +243 -0
- package/src/plugins/builtin/cloud/askg/executor.ts +476 -0
- package/src/plugins/builtin/cloud/askg/host.ts +94 -0
- package/src/plugins/builtin/cloud/askg/json.ts +31 -0
- package/src/plugins/builtin/cloud/askg/lock-note.ts +16 -0
- package/src/plugins/builtin/cloud/askg/manifest.ts +370 -0
- package/src/plugins/builtin/cloud/askg/model.ts +854 -0
- package/src/plugins/builtin/cloud/askg/notes.ts +100 -0
- package/src/plugins/builtin/cloud/askg/pane-attachment.ts +93 -0
- package/src/plugins/builtin/cloud/askg/pane.tsx +1749 -0
- package/src/plugins/builtin/cloud/askg/pending-question.ts +27 -0
- package/src/plugins/builtin/cloud/askg/protocol.ts +377 -0
- package/src/plugins/builtin/cloud/askg/result-budget.ts +156 -0
- package/src/plugins/builtin/cloud/askg/sidebar.tsx +184 -0
- package/src/plugins/builtin/cloud/askg/tool-display.ts +440 -0
- package/src/plugins/builtin/cloud/askg/tool-timeline.tsx +404 -0
- package/src/plugins/builtin/cloud/askg/undo.ts +254 -0
- package/src/plugins/builtin/cloud/askg/user-data.ts +89 -0
- package/src/plugins/builtin/cloud/auth-actions.tsx +158 -0
- package/src/plugins/builtin/cloud/auth-commands.ts +103 -0
- package/src/plugins/builtin/cloud/browser.tsx +3 -0
- package/src/plugins/builtin/cloud/company-picker.tsx +645 -0
- package/src/plugins/builtin/cloud/index.tsx +4 -0
- package/src/plugins/builtin/cloud/mcp-connect/command.ts +24 -0
- package/src/plugins/builtin/cloud/mcp-connect/dialog.tsx +366 -0
- package/src/plugins/builtin/cloud/mcp-connect/model.ts +135 -0
- package/src/plugins/builtin/cloud/mcp-connect/sections.ts +62 -0
- package/src/plugins/builtin/cloud/plugin.tsx +203 -0
- package/src/plugins/builtin/cloud/team/acm-tab.tsx +127 -0
- package/src/plugins/builtin/cloud/team/capability.ts +71 -0
- package/src/plugins/builtin/cloud/team/command.ts +313 -0
- package/src/plugins/builtin/cloud/team/module.tsx +81 -0
- package/src/plugins/builtin/cloud/team/pane-model.ts +185 -0
- package/src/plugins/builtin/cloud/team/pane-sections.tsx +576 -0
- package/src/plugins/builtin/cloud/team/pane-ui.tsx +362 -0
- package/src/plugins/builtin/cloud/team/pane.tsx +940 -0
- package/src/plugins/builtin/cloud/team/status-widget.tsx +78 -0
- package/src/plugins/builtin/cloud/team/team-state-host.ts +70 -0
- package/src/plugins/builtin/cloud/team/views.ts +192 -0
- package/src/plugins/builtin/cloud/terminal-relay/acm-tab.tsx +89 -0
- package/src/plugins/builtin/cloud/terminal-relay/client.ts +97 -0
- package/src/plugins/builtin/cloud/terminal-relay/connect-section.tsx +57 -0
- package/src/plugins/builtin/cloud/terminal-relay/engine.ts +739 -0
- package/src/plugins/builtin/cloud/terminal-relay/grants.ts +137 -0
- package/src/plugins/builtin/cloud/terminal-relay/host.tsx +81 -0
- package/src/plugins/builtin/cloud/terminal-relay/indicator.tsx +82 -0
- package/src/plugins/builtin/cloud/terminal-relay/manifest.ts +250 -0
- package/src/plugins/builtin/cloud/terminal-relay/policy.ts +162 -0
- package/src/plugins/builtin/cloud/terminal-relay/prompts.tsx +193 -0
- package/src/plugins/builtin/cloud/terminal-relay/redact.ts +73 -0
- package/src/plugins/builtin/cloud/terminal-relay/summary.ts +62 -0
- package/src/plugins/builtin/cloud/thesis/board-pane.tsx +484 -0
- package/src/plugins/builtin/cloud/thesis/detail.tsx +539 -0
- package/src/plugins/builtin/cloud/thesis/exposure.ts +145 -0
- package/src/plugins/builtin/cloud/thesis/flows.ts +553 -0
- package/src/plugins/builtin/cloud/thesis/model.ts +399 -0
- package/src/plugins/builtin/cloud/thesis/module.tsx +65 -0
- package/src/plugins/builtin/cloud/thesis/pane-request.ts +30 -0
- package/src/plugins/builtin/cloud/thesis/prompts.tsx +104 -0
- package/src/plugins/builtin/cloud/thesis/store.ts +302 -0
- package/src/plugins/builtin/cloud/thesis/ticker-tab.tsx +140 -0
- package/src/plugins/builtin/cloud/trial-offer-status-widget.tsx +203 -0
- package/src/plugins/builtin/cloud/upgrade-command.ts +35 -0
- package/src/plugins/builtin/cloud/upgrade-status-widget.tsx +45 -0
- package/src/plugins/builtin/cloud/verification-status-widget.tsx +75 -0
- package/src/plugins/builtin/cloud-tweets/footer.ts +40 -0
- package/src/plugins/builtin/cloud-tweets/index.ts +6 -0
- package/src/plugins/builtin/cloud-tweets/keyboard.ts +34 -0
- package/src/plugins/builtin/cloud-tweets/model.ts +280 -0
- package/src/plugins/builtin/cloud-tweets/pane.tsx +327 -0
- package/src/plugins/builtin/cloud-tweets/registration.ts +130 -0
- package/src/plugins/builtin/cloud-tweets/search-bar.tsx +38 -0
- package/src/plugins/builtin/cloud-tweets/table.tsx +551 -0
- package/src/plugins/builtin/cloud-tweets/tweet-text.ts +18 -0
- package/src/plugins/builtin/comment-letters/client.ts +340 -0
- package/src/plugins/builtin/comment-letters/index.tsx +75 -0
- package/src/plugins/builtin/comment-letters/pane.tsx +314 -0
- package/src/plugins/builtin/comment-letters/types.ts +43 -0
- package/src/plugins/builtin/commodities-energy/index.tsx +228 -0
- package/src/plugins/builtin/commodities-energy/view-state.ts +13 -0
- package/src/plugins/builtin/commodity-balances/client.ts +68 -0
- package/src/plugins/builtin/commodity-balances/headless.ts +107 -0
- package/src/plugins/builtin/commodity-balances/index.tsx +47 -0
- package/src/plugins/builtin/commodity-balances/model.ts +108 -0
- package/src/plugins/builtin/commodity-balances/pane.tsx +267 -0
- package/src/plugins/builtin/company-attention/app-rank.tsx +80 -0
- package/src/plugins/builtin/company-attention/building-model.ts +222 -0
- package/src/plugins/builtin/company-attention/building.tsx +176 -0
- package/src/plugins/builtin/company-attention/client.ts +184 -0
- package/src/plugins/builtin/company-attention/evidence.ts +61 -0
- package/src/plugins/builtin/company-attention/headless.ts +172 -0
- package/src/plugins/builtin/company-attention/index.tsx +35 -0
- package/src/plugins/builtin/company-attention/model.ts +270 -0
- package/src/plugins/builtin/company-attention/moves-model.ts +253 -0
- package/src/plugins/builtin/company-attention/moves.tsx +163 -0
- package/src/plugins/builtin/company-attention/pane.tsx +253 -0
- package/src/plugins/builtin/company-attention/series.ts +52 -0
- package/src/plugins/builtin/company-attention/signals-model.ts +229 -0
- package/src/plugins/builtin/company-attention/signals.tsx +164 -0
- package/src/plugins/builtin/company-kpis/client.ts +108 -0
- package/src/plugins/builtin/company-kpis/headless.ts +122 -0
- package/src/plugins/builtin/company-kpis/index.tsx +26 -0
- package/src/plugins/builtin/company-kpis/model.ts +229 -0
- package/src/plugins/builtin/company-kpis/pane.tsx +256 -0
- package/src/plugins/builtin/company-kpis/related.ts +11 -0
- package/src/plugins/builtin/company-kpis/screenshot-evidence.ts +51 -0
- package/src/plugins/builtin/composite-plugins.ts +284 -0
- package/src/plugins/builtin/congress-trades/aggregates.ts +69 -0
- package/src/plugins/builtin/congress-trades/client.ts +13 -0
- package/src/plugins/builtin/congress-trades/detail.tsx +340 -0
- package/src/plugins/builtin/congress-trades/filters.tsx +36 -0
- package/src/plugins/builtin/congress-trades/footer.ts +86 -0
- package/src/plugins/builtin/congress-trades/headless.ts +212 -0
- package/src/plugins/builtin/congress-trades/index.tsx +26 -0
- package/src/plugins/builtin/congress-trades/keyboard.ts +45 -0
- package/src/plugins/builtin/congress-trades/model.ts +399 -0
- package/src/plugins/builtin/congress-trades/pane.tsx +519 -0
- package/src/plugins/builtin/congress-trades/table.tsx +102 -0
- package/src/plugins/builtin/connections/index.ts +58 -0
- package/src/plugins/builtin/connections/pane.tsx +243 -0
- package/src/plugins/builtin/correlation/compute.ts +139 -0
- package/src/plugins/builtin/correlation/geo.ts +34 -0
- package/src/plugins/builtin/correlation/headless-schema.ts +73 -0
- package/src/plugins/builtin/correlation/headless.ts +158 -0
- package/src/plugins/builtin/correlation/history.ts +43 -0
- package/src/plugins/builtin/correlation/index.tsx +490 -0
- package/src/plugins/builtin/correlation/matrix/model.ts +199 -0
- package/src/plugins/builtin/correlation/matrix/pair-chart.tsx +48 -0
- package/src/plugins/builtin/correlation/matrix/selection.ts +79 -0
- package/src/plugins/builtin/correlation/matrix/symbol-cell.tsx +57 -0
- package/src/plugins/builtin/correlation/relationship/history.ts +46 -0
- package/src/plugins/builtin/correlation/relationship/model.ts +267 -0
- package/src/plugins/builtin/correlation/relationship/pane.tsx +354 -0
- package/src/plugins/builtin/correlation/relationship/view-model.ts +123 -0
- package/src/plugins/builtin/correlation/settings.ts +95 -0
- package/src/plugins/builtin/cot/client.ts +111 -0
- package/src/plugins/builtin/cot/headless.ts +96 -0
- package/src/plugins/builtin/cot/index.tsx +28 -0
- package/src/plugins/builtin/cot/model.ts +277 -0
- package/src/plugins/builtin/cot/pane.tsx +200 -0
- package/src/plugins/builtin/cot/series.ts +27 -0
- package/src/plugins/builtin/cpi/client.ts +66 -0
- package/src/plugins/builtin/cpi/headless.ts +86 -0
- package/src/plugins/builtin/cpi/index.tsx +31 -0
- package/src/plugins/builtin/cpi/model.ts +198 -0
- package/src/plugins/builtin/cpi/pane.tsx +160 -0
- package/src/plugins/builtin/credit-boards/cdx-pane.tsx +178 -0
- package/src/plugins/builtin/credit-boards/client.ts +115 -0
- package/src/plugins/builtin/credit-boards/headless.ts +218 -0
- package/src/plugins/builtin/credit-boards/index.tsx +54 -0
- package/src/plugins/builtin/credit-boards/model.ts +323 -0
- package/src/plugins/builtin/credit-boards/series.ts +66 -0
- package/src/plugins/builtin/credit-boards/sovr-pane.tsx +156 -0
- package/src/plugins/builtin/credit-conditions/client.ts +121 -0
- package/src/plugins/builtin/credit-conditions/headless.ts +74 -0
- package/src/plugins/builtin/credit-conditions/index.tsx +163 -0
- package/src/plugins/builtin/credit-conditions/model.ts +98 -0
- package/src/plugins/builtin/credit-conditions/series.ts +18 -0
- package/src/plugins/builtin/credit-documents/client.ts +99 -0
- package/src/plugins/builtin/credit-documents/detail.tsx +110 -0
- package/src/plugins/builtin/credit-documents/evidence.ts +64 -0
- package/src/plugins/builtin/credit-documents/export.ts +173 -0
- package/src/plugins/builtin/credit-documents/gauge.tsx +52 -0
- package/src/plugins/builtin/credit-documents/headless.ts +72 -0
- package/src/plugins/builtin/credit-documents/index.tsx +39 -0
- package/src/plugins/builtin/credit-documents/model.ts +419 -0
- package/src/plugins/builtin/credit-documents/pane.tsx +195 -0
- package/src/plugins/builtin/crypto-board/client.ts +369 -0
- package/src/plugins/builtin/crypto-board/defi-view.tsx +218 -0
- package/src/plugins/builtin/crypto-board/defi.ts +239 -0
- package/src/plugins/builtin/crypto-board/headless.ts +304 -0
- package/src/plugins/builtin/crypto-board/index.tsx +49 -0
- package/src/plugins/builtin/crypto-board/model.ts +521 -0
- package/src/plugins/builtin/crypto-board/pane.tsx +419 -0
- package/src/plugins/builtin/crypto-board/series.ts +117 -0
- package/src/plugins/builtin/crypto-board/supply.ts +123 -0
- package/src/plugins/builtin/crypto-etf-flows/client.ts +60 -0
- package/src/plugins/builtin/crypto-etf-flows/headless.ts +132 -0
- package/src/plugins/builtin/crypto-etf-flows/index.tsx +44 -0
- package/src/plugins/builtin/crypto-etf-flows/model.ts +121 -0
- package/src/plugins/builtin/crypto-etf-flows/pane.tsx +193 -0
- package/src/plugins/builtin/custom-view/index.tsx +69 -0
- package/src/plugins/builtin/custom-view/live-quotes.ts +143 -0
- package/src/plugins/builtin/custom-view/loader.ts +158 -0
- package/src/plugins/builtin/custom-view/pane.tsx +415 -0
- package/src/plugins/builtin/custom-view/sources.ts +148 -0
- package/src/plugins/builtin/custom-view/view-spec.ts +462 -0
- package/src/plugins/builtin/debt-maturities/client.ts +438 -0
- package/src/plugins/builtin/debt-maturities/headless.ts +125 -0
- package/src/plugins/builtin/debt-maturities/index.tsx +33 -0
- package/src/plugins/builtin/debt-maturities/model.ts +231 -0
- package/src/plugins/builtin/debt-maturities/pane.tsx +692 -0
- package/src/plugins/builtin/debt-maturities/series.ts +45 -0
- package/src/plugins/builtin/debt-maturities/wall-bar.tsx +36 -0
- package/src/plugins/builtin/debug/index.tsx +336 -0
- package/src/plugins/builtin/debug/template.ts +8 -0
- package/src/plugins/builtin/dividend-yield/browser.tsx +3 -0
- package/src/plugins/builtin/dividend-yield/client.ts +331 -0
- package/src/plugins/builtin/dividend-yield/headless.ts +340 -0
- package/src/plugins/builtin/dividend-yield/index.tsx +85 -0
- package/src/plugins/builtin/dividend-yield/model.ts +53 -0
- package/src/plugins/builtin/dividend-yield/pane.tsx +332 -0
- package/src/plugins/builtin/dividend-yield/provider-client.ts +52 -0
- package/src/plugins/builtin/dividend-yield/ranking.ts +210 -0
- package/src/plugins/builtin/dividend-yield/reference-price.ts +50 -0
- package/src/plugins/builtin/dividend-yield/series.ts +20 -0
- package/src/plugins/builtin/dividend-yield/types.ts +49 -0
- package/src/plugins/builtin/dividend-yield/view.ts +92 -0
- package/src/plugins/builtin/docs/blocks.tsx +239 -0
- package/src/plugins/builtin/docs/index.tsx +70 -0
- package/src/plugins/builtin/docs/pane.tsx +447 -0
- package/src/plugins/builtin/docs/targets.ts +78 -0
- package/src/plugins/builtin/docs/use-docs.ts +60 -0
- package/src/plugins/builtin/doe/client.ts +77 -0
- package/src/plugins/builtin/doe/headless.ts +110 -0
- package/src/plugins/builtin/doe/index.tsx +50 -0
- package/src/plugins/builtin/doe/model.ts +252 -0
- package/src/plugins/builtin/doe/pane.tsx +156 -0
- package/src/plugins/builtin/doe/prices.ts +84 -0
- package/src/plugins/builtin/doe/range-bar.tsx +15 -0
- package/src/plugins/builtin/doe/series.ts +65 -0
- package/src/plugins/builtin/earnings/board-model.ts +252 -0
- package/src/plugins/builtin/earnings/board-table.ts +147 -0
- package/src/plugins/builtin/earnings/board.tsx +466 -0
- package/src/plugins/builtin/earnings/calendar-model.ts +188 -0
- package/src/plugins/builtin/earnings/calendar.tsx +338 -0
- package/src/plugins/builtin/earnings/client.ts +99 -0
- package/src/plugins/builtin/earnings/data/cache.ts +84 -0
- package/src/plugins/builtin/earnings/format.ts +58 -0
- package/src/plugins/builtin/earnings/headless.ts +339 -0
- package/src/plugins/builtin/earnings/history-model.ts +213 -0
- package/src/plugins/builtin/earnings/history-table.ts +106 -0
- package/src/plugins/builtin/earnings/history.tsx +141 -0
- package/src/plugins/builtin/earnings/index.tsx +158 -0
- package/src/plugins/builtin/earnings/model.ts +22 -0
- package/src/plugins/builtin/earnings/no-earnings.ts +52 -0
- package/src/plugins/builtin/earnings/scope.ts +77 -0
- package/src/plugins/builtin/earnings-calls/calendar.tsx +310 -0
- package/src/plugins/builtin/earnings-calls/data.ts +515 -0
- package/src/plugins/builtin/earnings-calls/format.ts +72 -0
- package/src/plugins/builtin/earnings-calls/headless.ts +461 -0
- package/src/plugins/builtin/earnings-calls/index.tsx +82 -0
- package/src/plugins/builtin/earnings-calls/lock-note.ts +26 -0
- package/src/plugins/builtin/earnings-calls/model.ts +341 -0
- package/src/plugins/builtin/earnings-calls/pane.tsx +1125 -0
- package/src/plugins/builtin/earnings-calls/prose.ts +62 -0
- package/src/plugins/builtin/earnings-calls/transcript-view.tsx +457 -0
- package/src/plugins/builtin/earnings-calls/upcoming.ts +195 -0
- package/src/plugins/builtin/earnings-calls/use-call-playback.ts +194 -0
- package/src/plugins/builtin/earnings-ripple/client.ts +133 -0
- package/src/plugins/builtin/earnings-ripple/headless.ts +55 -0
- package/src/plugins/builtin/earnings-ripple/index.tsx +37 -0
- package/src/plugins/builtin/earnings-ripple/model.ts +188 -0
- package/src/plugins/builtin/earnings-ripple/pane.tsx +233 -0
- package/src/plugins/builtin/econ/calendar-model.ts +409 -0
- package/src/plugins/builtin/econ/calendar-source.ts +49 -0
- package/src/plugins/builtin/econ/detail-view.tsx +324 -0
- package/src/plugins/builtin/econ/figures.ts +72 -0
- package/src/plugins/builtin/econ/fred-catalog.ts +219 -0
- package/src/plugins/builtin/econ/fred-series-map.ts +103 -0
- package/src/plugins/builtin/econ/index.tsx +612 -0
- package/src/plugins/builtin/econ/print-watch.ts +280 -0
- package/src/plugins/builtin/econ/types.ts +49 -0
- package/src/plugins/builtin/econ-statistics/cache.ts +8 -0
- package/src/plugins/builtin/econ-statistics/client.ts +153 -0
- package/src/plugins/builtin/econ-statistics/defs.ts +100 -0
- package/src/plugins/builtin/econ-statistics/detail.tsx +85 -0
- package/src/plugins/builtin/econ-statistics/headless.ts +268 -0
- package/src/plugins/builtin/econ-statistics/index.tsx +54 -0
- package/src/plugins/builtin/econ-statistics/pane.tsx +219 -0
- package/src/plugins/builtin/econ-statistics/stats.ts +678 -0
- package/src/plugins/builtin/econ-statistics/view.ts +182 -0
- package/src/plugins/builtin/equity-screener/categories.ts +179 -0
- package/src/plugins/builtin/equity-screener/client.ts +103 -0
- package/src/plugins/builtin/equity-screener/criterion-editor.tsx +174 -0
- package/src/plugins/builtin/equity-screener/headless.ts +415 -0
- package/src/plugins/builtin/equity-screener/ideas.ts +49 -0
- package/src/plugins/builtin/equity-screener/index.tsx +38 -0
- package/src/plugins/builtin/equity-screener/live.ts +149 -0
- package/src/plugins/builtin/equity-screener/model.ts +728 -0
- package/src/plugins/builtin/equity-screener/pane.tsx +1127 -0
- package/src/plugins/builtin/equity-screener/results.ts +135 -0
- package/src/plugins/builtin/equity-screener/screen-check.ts +90 -0
- package/src/plugins/builtin/equity-screener/ticker-check.tsx +148 -0
- package/src/plugins/builtin/estimate-revisions/client.ts +283 -0
- package/src/plugins/builtin/estimate-revisions/headless.ts +108 -0
- package/src/plugins/builtin/estimate-revisions/index.tsx +92 -0
- package/src/plugins/builtin/estimate-revisions/lock-note.ts +45 -0
- package/src/plugins/builtin/estimate-revisions/model.ts +108 -0
- package/src/plugins/builtin/estimate-revisions/pane.tsx +601 -0
- package/src/plugins/builtin/estimate-revisions/sorting.ts +111 -0
- package/src/plugins/builtin/executives/data.ts +148 -0
- package/src/plugins/builtin/executives/format.ts +44 -0
- package/src/plugins/builtin/executives/index.tsx +68 -0
- package/src/plugins/builtin/executives/pane.tsx +448 -0
- package/src/plugins/builtin/exposure/charts.tsx +67 -0
- package/src/plugins/builtin/exposure/client.ts +56 -0
- package/src/plugins/builtin/exposure/drivers.ts +42 -0
- package/src/plugins/builtin/exposure/editor.tsx +61 -0
- package/src/plugins/builtin/exposure/evidence.ts +42 -0
- package/src/plugins/builtin/exposure/headless.ts +290 -0
- package/src/plugins/builtin/exposure/holdings.ts +58 -0
- package/src/plugins/builtin/exposure/index.tsx +40 -0
- package/src/plugins/builtin/exposure/model.ts +143 -0
- package/src/plugins/builtin/exposure/pane.tsx +276 -0
- package/src/plugins/builtin/fear-greed/cache.ts +100 -0
- package/src/plugins/builtin/fear-greed/charts.tsx +262 -0
- package/src/plugins/builtin/fear-greed/data.ts +376 -0
- package/src/plugins/builtin/fear-greed/format.ts +87 -0
- package/src/plugins/builtin/fear-greed/headless.ts +87 -0
- package/src/plugins/builtin/fear-greed/index.tsx +104 -0
- package/src/plugins/builtin/fear-greed/pane.tsx +105 -0
- package/src/plugins/builtin/fear-greed/series.ts +52 -0
- package/src/plugins/builtin/filing-events/feed.ts +169 -0
- package/src/plugins/builtin/filing-events/index.tsx +79 -0
- package/src/plugins/builtin/filing-events/pane.tsx +312 -0
- package/src/plugins/builtin/fixed-income/index.tsx +46 -0
- package/src/plugins/builtin/fixed-income/model.ts +27 -0
- package/src/plugins/builtin/fixed-income/pane.tsx +164 -0
- package/src/plugins/builtin/fixed-income/shortcut.ts +52 -0
- package/src/plugins/builtin/futures/index.tsx +436 -0
- package/src/plugins/builtin/futures/model.ts +257 -0
- package/src/plugins/builtin/futures/returns.ts +104 -0
- package/src/plugins/builtin/futures/series.ts +71 -0
- package/src/plugins/builtin/futures/table.tsx +274 -0
- package/src/plugins/builtin/futures/use-board-terms.ts +103 -0
- package/src/plugins/builtin/futures/use-front-returns.ts +137 -0
- package/src/plugins/builtin/futures-curve/client.ts +136 -0
- package/src/plugins/builtin/futures-curve/headless.ts +174 -0
- package/src/plugins/builtin/futures-curve/index.tsx +33 -0
- package/src/plugins/builtin/futures-curve/model.ts +769 -0
- package/src/plugins/builtin/futures-curve/pane.tsx +332 -0
- package/src/plugins/builtin/fx-matrix/client.ts +78 -0
- package/src/plugins/builtin/fx-matrix/direction.ts +81 -0
- package/src/plugins/builtin/fx-matrix/export.ts +33 -0
- package/src/plugins/builtin/fx-matrix/headless.ts +175 -0
- package/src/plugins/builtin/fx-matrix/index.tsx +304 -0
- package/src/plugins/builtin/fx-matrix/live-legs.ts +167 -0
- package/src/plugins/builtin/fx-matrix/pairs.ts +81 -0
- package/src/plugins/builtin/fx-matrix/settings.ts +103 -0
- package/src/plugins/builtin/gpu/board.tsx +169 -0
- package/src/plugins/builtin/gpu/changes.tsx +94 -0
- package/src/plugins/builtin/gpu/client.ts +148 -0
- package/src/plugins/builtin/gpu/equities.tsx +122 -0
- package/src/plugins/builtin/gpu/headless.ts +119 -0
- package/src/plugins/builtin/gpu/history.tsx +142 -0
- package/src/plugins/builtin/gpu/index.tsx +20 -0
- package/src/plugins/builtin/gpu/ladder.tsx +123 -0
- package/src/plugins/builtin/gpu/model.ts +437 -0
- package/src/plugins/builtin/gpu/pane.tsx +81 -0
- package/src/plugins/builtin/gpu/series.ts +38 -0
- package/src/plugins/builtin/help/feedback-tab.tsx +98 -0
- package/src/plugins/builtin/help/function-card.tsx +221 -0
- package/src/plugins/builtin/help/function-index.ts +198 -0
- package/src/plugins/builtin/help/functions-table.tsx +188 -0
- package/src/plugins/builtin/help/index.tsx +432 -0
- package/src/plugins/builtin/help/keybindings-editor.tsx +437 -0
- package/src/plugins/builtin/help/shortcut-model.ts +116 -0
- package/src/plugins/builtin/help/shortcut-table.tsx +130 -0
- package/src/plugins/builtin/help/table-cells.tsx +66 -0
- package/src/plugins/builtin/holders/beneficial-client.ts +231 -0
- package/src/plugins/builtin/holders/beneficial-model.ts +363 -0
- package/src/plugins/builtin/holders/beneficial-report.ts +179 -0
- package/src/plugins/builtin/holders/beneficial-view.tsx +293 -0
- package/src/plugins/builtin/holders/client.ts +58 -0
- package/src/plugins/builtin/holders/format.ts +100 -0
- package/src/plugins/builtin/holders/fund-holders.ts +51 -0
- package/src/plugins/builtin/holders/headless.ts +302 -0
- package/src/plugins/builtin/holders/index-holders.ts +264 -0
- package/src/plugins/builtin/holders/index.tsx +52 -0
- package/src/plugins/builtin/holders/pane.tsx +439 -0
- package/src/plugins/builtin/holders/report-header.ts +171 -0
- package/src/plugins/builtin/holders/report-rows.ts +268 -0
- package/src/plugins/builtin/holders/table-model.ts +86 -0
- package/src/plugins/builtin/holders/thirteenf-match.ts +117 -0
- package/src/plugins/builtin/holders/treemap.tsx +51 -0
- package/src/plugins/builtin/holders/types.ts +17 -0
- package/src/plugins/builtin/insider/amendments.ts +65 -0
- package/src/plugins/builtin/insider/base-values.ts +76 -0
- package/src/plugins/builtin/insider/client.ts +64 -0
- package/src/plugins/builtin/insider/detail.tsx +127 -0
- package/src/plugins/builtin/insider/display.ts +221 -0
- package/src/plugins/builtin/insider/headless.ts +574 -0
- package/src/plugins/builtin/insider/index.tsx +771 -0
- package/src/plugins/builtin/insider/insider-data.ts +176 -0
- package/src/plugins/builtin/insider/insiders.tsx +224 -0
- package/src/plugins/builtin/insider/issuer.ts +79 -0
- package/src/plugins/builtin/insider/model.ts +207 -0
- package/src/plugins/builtin/insider/signals-cells.tsx +52 -0
- package/src/plugins/builtin/insider/signals-client.ts +193 -0
- package/src/plugins/builtin/insider/signals-model.ts +718 -0
- package/src/plugins/builtin/insider/signals.tsx +376 -0
- package/src/plugins/builtin/insider/table-model.ts +248 -0
- package/src/plugins/builtin/insider/table.tsx +82 -0
- package/src/plugins/builtin/ipo-calendar/client.ts +93 -0
- package/src/plugins/builtin/ipo-calendar/headless.ts +170 -0
- package/src/plugins/builtin/ipo-calendar/index.tsx +67 -0
- package/src/plugins/builtin/ipo-calendar/model.ts +389 -0
- package/src/plugins/builtin/ipo-calendar/pane.tsx +248 -0
- package/src/plugins/builtin/iv-history/charts.tsx +64 -0
- package/src/plugins/builtin/iv-history/client.ts +254 -0
- package/src/plugins/builtin/iv-history/events.ts +145 -0
- package/src/plugins/builtin/iv-history/format.ts +77 -0
- package/src/plugins/builtin/iv-history/headless.ts +257 -0
- package/src/plugins/builtin/iv-history/index.tsx +50 -0
- package/src/plugins/builtin/iv-history/model.ts +532 -0
- package/src/plugins/builtin/iv-history/pane.tsx +141 -0
- package/src/plugins/builtin/iv-history/rank.ts +10 -0
- package/src/plugins/builtin/iv-history/screen-pane.tsx +193 -0
- package/src/plugins/builtin/iv-history/series.ts +31 -0
- package/src/plugins/builtin/iv-history/universe.ts +44 -0
- package/src/plugins/builtin/jobs/client.ts +81 -0
- package/src/plugins/builtin/jobs/headless.ts +221 -0
- package/src/plugins/builtin/jobs/index.tsx +88 -0
- package/src/plugins/builtin/jobs/lock-note.ts +27 -0
- package/src/plugins/builtin/jobs/model.ts +332 -0
- package/src/plugins/builtin/jobs/pages.ts +48 -0
- package/src/plugins/builtin/jobs/pane.tsx +781 -0
- package/src/plugins/builtin/jobs/series.ts +19 -0
- package/src/plugins/builtin/jobs/share-bars.tsx +76 -0
- package/src/plugins/builtin/jodi/client.ts +57 -0
- package/src/plugins/builtin/jodi/headless.ts +74 -0
- package/src/plugins/builtin/jodi/index.tsx +32 -0
- package/src/plugins/builtin/jodi/model.ts +50 -0
- package/src/plugins/builtin/jodi/pane.tsx +152 -0
- package/src/plugins/builtin/kelly-sizer/constants.ts +3 -0
- package/src/plugins/builtin/kelly-sizer/fields.ts +195 -0
- package/src/plugins/builtin/kelly-sizer/headless.ts +149 -0
- package/src/plugins/builtin/kelly-sizer/history.ts +82 -0
- package/src/plugins/builtin/kelly-sizer/index.tsx +49 -0
- package/src/plugins/builtin/kelly-sizer/model.ts +566 -0
- package/src/plugins/builtin/kelly-sizer/pane.tsx +650 -0
- package/src/plugins/builtin/kelly-sizer/portfolio.ts +55 -0
- package/src/plugins/builtin/kelly-sizer/sections.tsx +215 -0
- package/src/plugins/builtin/kelly-sizer/state.ts +67 -0
- package/src/plugins/builtin/kelly-sizer/test-support.tsx +165 -0
- package/src/plugins/builtin/kelly-sizer/types.ts +170 -0
- package/src/plugins/builtin/kelly-sizer/view.tsx +22 -0
- package/src/plugins/builtin/layout-manager/index.tsx +306 -0
- package/src/plugins/builtin/macro-day/client.ts +115 -0
- package/src/plugins/builtin/macro-day/headless.ts +72 -0
- package/src/plugins/builtin/macro-day/index.tsx +25 -0
- package/src/plugins/builtin/macro-day/model.ts +209 -0
- package/src/plugins/builtin/macro-day/pane.tsx +170 -0
- package/src/plugins/builtin/macro-day/release-table.ts +40 -0
- package/src/plugins/builtin/macro-day/releases.ts +118 -0
- package/src/plugins/builtin/macro-resources.ts +15 -0
- package/src/plugins/builtin/market-halts/client.ts +114 -0
- package/src/plugins/builtin/market-halts/index.tsx +42 -0
- package/src/plugins/builtin/market-halts/model.ts +361 -0
- package/src/plugins/builtin/market-halts/pane.tsx +240 -0
- package/src/plugins/builtin/market-heatmap/data.ts +92 -0
- package/src/plugins/builtin/market-heatmap/evidence.ts +99 -0
- package/src/plugins/builtin/market-heatmap/headless.ts +154 -0
- package/src/plugins/builtin/market-heatmap/index.tsx +845 -0
- package/src/plugins/builtin/market-heatmap/live.ts +89 -0
- package/src/plugins/builtin/market-heatmap/model.ts +248 -0
- package/src/plugins/builtin/market-heatmap/portfolio.ts +317 -0
- package/src/plugins/builtin/market-movers/client.ts +165 -0
- package/src/plugins/builtin/market-movers/footer.ts +19 -0
- package/src/plugins/builtin/market-movers/headless.ts +208 -0
- package/src/plugins/builtin/market-movers/index.tsx +392 -0
- package/src/plugins/builtin/market-movers/min-float.ts +74 -0
- package/src/plugins/builtin/market-movers/model.ts +373 -0
- package/src/plugins/builtin/market-movers/screener.ts +463 -0
- package/src/plugins/builtin/market-movers/session-body.tsx +263 -0
- package/src/plugins/builtin/market-movers/session-table.ts +99 -0
- package/src/plugins/builtin/market-movers/session.ts +248 -0
- package/src/plugins/builtin/market-movers/table.ts +137 -0
- package/src/plugins/builtin/market-valuation/align.ts +146 -0
- package/src/plugins/builtin/market-valuation/cache.ts +3 -0
- package/src/plugins/builtin/market-valuation/chart-projection.ts +196 -0
- package/src/plugins/builtin/market-valuation/chart-series.ts +59 -0
- package/src/plugins/builtin/market-valuation/client.ts +158 -0
- package/src/plugins/builtin/market-valuation/defs.ts +253 -0
- package/src/plugins/builtin/market-valuation/detail.tsx +93 -0
- package/src/plugins/builtin/market-valuation/headless.ts +172 -0
- package/src/plugins/builtin/market-valuation/index.tsx +83 -0
- package/src/plugins/builtin/market-valuation/indicators.ts +386 -0
- package/src/plugins/builtin/market-valuation/pane.tsx +197 -0
- package/src/plugins/builtin/market-valuation/series.ts +29 -0
- package/src/plugins/builtin/market-valuation/settings.ts +38 -0
- package/src/plugins/builtin/market-valuation/sources.ts +192 -0
- package/src/plugins/builtin/market-valuation/view.ts +154 -0
- package/src/plugins/builtin/market-valuation/zone-scale/desktop.tsx +97 -0
- package/src/plugins/builtin/market-valuation/zone-scale/index.tsx +12 -0
- package/src/plugins/builtin/market-valuation/zone-scale/model.ts +67 -0
- package/src/plugins/builtin/market-valuation/zone-scale/terminal.tsx +94 -0
- package/src/plugins/builtin/members/breadth-pane.tsx +82 -0
- package/src/plugins/builtin/members/client.ts +68 -0
- package/src/plugins/builtin/members/headless.ts +54 -0
- package/src/plugins/builtin/members/index.tsx +20 -0
- package/src/plugins/builtin/members/model.ts +115 -0
- package/src/plugins/builtin/members/pane.tsx +205 -0
- package/src/plugins/builtin/mna/client.ts +154 -0
- package/src/plugins/builtin/mna/detail.tsx +285 -0
- package/src/plugins/builtin/mna/distress/client.ts +326 -0
- package/src/plugins/builtin/mna/distress/detail.tsx +259 -0
- package/src/plugins/builtin/mna/distress/headless.ts +259 -0
- package/src/plugins/builtin/mna/distress/model.ts +479 -0
- package/src/plugins/builtin/mna/distress/pane.tsx +614 -0
- package/src/plugins/builtin/mna/headless.ts +100 -0
- package/src/plugins/builtin/mna/index.tsx +74 -0
- package/src/plugins/builtin/mna/model.ts +282 -0
- package/src/plugins/builtin/mna/pane.tsx +477 -0
- package/src/plugins/builtin/money-markets/client.ts +54 -0
- package/src/plugins/builtin/money-markets/headless.ts +29 -0
- package/src/plugins/builtin/money-markets/index.tsx +20 -0
- package/src/plugins/builtin/money-markets/model.ts +55 -0
- package/src/plugins/builtin/money-markets/pane.tsx +142 -0
- package/src/plugins/builtin/money-markets/series.ts +41 -0
- package/src/plugins/builtin/news/headless.ts +233 -0
- package/src/plugins/builtin/news/index.tsx +234 -0
- package/src/plugins/builtin/news/wire/breaking/filters.ts +110 -0
- package/src/plugins/builtin/news/wire/breaking/notifications.ts +202 -0
- package/src/plugins/builtin/news/wire/categories.ts +188 -0
- package/src/plugins/builtin/news/wire/default-feeds.ts +43 -0
- package/src/plugins/builtin/news/wire/feed-config.ts +251 -0
- package/src/plugins/builtin/news/wire/filter-articles.ts +54 -0
- package/src/plugins/builtin/news/wire/hash.ts +9 -0
- package/src/plugins/builtin/news/wire/index.tsx +252 -0
- package/src/plugins/builtin/news/wire/industry-pane.tsx +184 -0
- package/src/plugins/builtin/news/wire/letters/client.ts +109 -0
- package/src/plugins/builtin/news/wire/letters/model.ts +69 -0
- package/src/plugins/builtin/news/wire/letters/pane.tsx +155 -0
- package/src/plugins/builtin/news/wire/mutes.ts +254 -0
- package/src/plugins/builtin/news/wire/news/command-bar-search.ts +136 -0
- package/src/plugins/builtin/news/wire/news/detail-view.tsx +329 -0
- package/src/plugins/builtin/news/wire/news/footer.ts +104 -0
- package/src/plugins/builtin/news/wire/news/list-search.ts +34 -0
- package/src/plugins/builtin/news/wire/news/pop-out.tsx +158 -0
- package/src/plugins/builtin/news/wire/news/preset-pane.tsx +220 -0
- package/src/plugins/builtin/news/wire/news/query-presets.ts +126 -0
- package/src/plugins/builtin/news/wire/news/table.tsx +422 -0
- package/src/plugins/builtin/news/wire/persisted-articles.ts +123 -0
- package/src/plugins/builtin/news/wire/read-state.ts +29 -0
- package/src/plugins/builtin/news/wire/rss/cli.ts +48 -0
- package/src/plugins/builtin/news/wire/rss/feed-xml.ts +109 -0
- package/src/plugins/builtin/news/wire/rss/managed-feed.ts +20 -0
- package/src/plugins/builtin/news/wire/rss/parser.ts +182 -0
- package/src/plugins/builtin/news/wire/rss/source.ts +191 -0
- package/src/plugins/builtin/notes/cli.ts +172 -0
- package/src/plugins/builtin/notes/export.ts +114 -0
- package/src/plugins/builtin/notes/files.ts +315 -0
- package/src/plugins/builtin/notes/index.tsx +134 -0
- package/src/plugins/builtin/notes/markdown-note-preview.tsx +39 -0
- package/src/plugins/builtin/notes/migration.ts +94 -0
- package/src/plugins/builtin/notes/model.ts +36 -0
- package/src/plugins/builtin/notes/owner.tsx +131 -0
- package/src/plugins/builtin/notes/quick-notes-pane.tsx +503 -0
- package/src/plugins/builtin/notes/store.ts +314 -0
- package/src/plugins/builtin/notes/text-state.ts +11 -0
- package/src/plugins/builtin/notes/ticker-notes-tab.tsx +222 -0
- package/src/plugins/builtin/openfda/client.ts +420 -0
- package/src/plugins/builtin/openfda/index.tsx +73 -0
- package/src/plugins/builtin/openfda/model.ts +172 -0
- package/src/plugins/builtin/openfda/pane.tsx +462 -0
- package/src/plugins/builtin/openfda/types.ts +101 -0
- package/src/plugins/builtin/options/analytics-as-of.tsx +41 -0
- package/src/plugins/builtin/options/analytics.ts +258 -0
- package/src/plugins/builtin/options/calc-seed.ts +65 -0
- package/src/plugins/builtin/options/carry.ts +131 -0
- package/src/plugins/builtin/options/enrichment-client.ts +70 -0
- package/src/plugins/builtin/options/enrichment-model.ts +168 -0
- package/src/plugins/builtin/options/enrichment.ts +139 -0
- package/src/plugins/builtin/options/expiry-catalogue.ts +43 -0
- package/src/plugins/builtin/options/footer.ts +143 -0
- package/src/plugins/builtin/options/index.tsx +159 -0
- package/src/plugins/builtin/options/live-quotes.ts +295 -0
- package/src/plugins/builtin/options/market-reference.ts +92 -0
- package/src/plugins/builtin/options/model-spot.ts +163 -0
- package/src/plugins/builtin/options/open-interest-as-of.ts +74 -0
- package/src/plugins/builtin/options/quote-context.tsx +29 -0
- package/src/plugins/builtin/options/strike-window.ts +184 -0
- package/src/plugins/builtin/options/table.ts +365 -0
- package/src/plugins/builtin/options/types.ts +59 -0
- package/src/plugins/builtin/options/view.tsx +1055 -0
- package/src/plugins/builtin/options-calculator/binomial.ts +332 -0
- package/src/plugins/builtin/options-calculator/evidence.ts +228 -0
- package/src/plugins/builtin/options-calculator/headless.ts +137 -0
- package/src/plugins/builtin/options-calculator/index.tsx +37 -0
- package/src/plugins/builtin/options-calculator/inputs.ts +79 -0
- package/src/plugins/builtin/options-calculator/model.ts +119 -0
- package/src/plugins/builtin/options-calculator/pane.tsx +429 -0
- package/src/plugins/builtin/options-calculator/premium-history.ts +34 -0
- package/src/plugins/builtin/options-calculator/surface.ts +194 -0
- package/src/plugins/builtin/options-positioning/client.ts +149 -0
- package/src/plugins/builtin/options-positioning/headless.ts +255 -0
- package/src/plugins/builtin/options-positioning/index.tsx +72 -0
- package/src/plugins/builtin/options-positioning/model.ts +337 -0
- package/src/plugins/builtin/options-positioning/pane.tsx +669 -0
- package/src/plugins/builtin/options-scenario/charts.tsx +47 -0
- package/src/plugins/builtin/options-scenario/client.ts +645 -0
- package/src/plugins/builtin/options-scenario/collar.ts +143 -0
- package/src/plugins/builtin/options-scenario/csp-screen-headless.ts +259 -0
- package/src/plugins/builtin/options-scenario/csp-screen-pane.tsx +316 -0
- package/src/plugins/builtin/options-scenario/csp-screen.ts +298 -0
- package/src/plugins/builtin/options-scenario/csp.ts +254 -0
- package/src/plugins/builtin/options-scenario/editor.tsx +139 -0
- package/src/plugins/builtin/options-scenario/evidence.ts +127 -0
- package/src/plugins/builtin/options-scenario/freshness.ts +27 -0
- package/src/plugins/builtin/options-scenario/headless.ts +208 -0
- package/src/plugins/builtin/options-scenario/hedge.ts +291 -0
- package/src/plugins/builtin/options-scenario/index.tsx +64 -0
- package/src/plugins/builtin/options-scenario/live.ts +50 -0
- package/src/plugins/builtin/options-scenario/model.ts +407 -0
- package/src/plugins/builtin/options-scenario/pane.tsx +475 -0
- package/src/plugins/builtin/options-scenario/state.ts +71 -0
- package/src/plugins/builtin/options-scenario/strategy-screen.ts +532 -0
- package/src/plugins/builtin/pe-band/client.ts +133 -0
- package/src/plugins/builtin/pe-band/headless.ts +69 -0
- package/src/plugins/builtin/pe-band/index.tsx +20 -0
- package/src/plugins/builtin/pe-band/model.ts +297 -0
- package/src/plugins/builtin/pe-band/pane.tsx +177 -0
- package/src/plugins/builtin/pe-band/report-dates.ts +82 -0
- package/src/plugins/builtin/perps/cascade-tabs.tsx +161 -0
- package/src/plugins/builtin/perps/cascade.ts +236 -0
- package/src/plugins/builtin/perps/client.ts +326 -0
- package/src/plugins/builtin/perps/equity-identity.ts +16 -0
- package/src/plugins/builtin/perps/equity-row.tsx +76 -0
- package/src/plugins/builtin/perps/freshness.ts +71 -0
- package/src/plugins/builtin/perps/headless.ts +263 -0
- package/src/plugins/builtin/perps/index.tsx +35 -0
- package/src/plugins/builtin/perps/list-perpetuals.ts +139 -0
- package/src/plugins/builtin/perps/live-rows.ts +168 -0
- package/src/plugins/builtin/perps/markets-section.tsx +154 -0
- package/src/plugins/builtin/perps/model.ts +349 -0
- package/src/plugins/builtin/perps/open-market.ts +15 -0
- package/src/plugins/builtin/perps/pane.tsx +463 -0
- package/src/plugins/builtin/perps/series.ts +76 -0
- package/src/plugins/builtin/perps/status-line.ts +25 -0
- package/src/plugins/builtin/perps/venue-markets.ts +96 -0
- package/src/plugins/builtin/plugin-marketplace/index.tsx +44 -0
- package/src/plugins/builtin/plugin-marketplace/pane.tsx +1059 -0
- package/src/plugins/builtin/plugin-module.ts +209 -0
- package/src/plugins/builtin/portfolio-list/account-metrics.ts +206 -0
- package/src/plugins/builtin/portfolio-list/cached-account.ts +44 -0
- package/src/plugins/builtin/portfolio-list/cell-version.ts +79 -0
- package/src/plugins/builtin/portfolio-list/cli/bulk-symbols.ts +324 -0
- package/src/plugins/builtin/portfolio-list/cli/import-13f.ts +109 -0
- package/src/plugins/builtin/portfolio-list/cli/portfolio-command.ts +1151 -0
- package/src/plugins/builtin/portfolio-list/cli/render.ts +1404 -0
- package/src/plugins/builtin/portfolio-list/cli/shared.ts +151 -0
- package/src/plugins/builtin/portfolio-list/cli/watchlist-command.ts +297 -0
- package/src/plugins/builtin/portfolio-list/grid.tsx +288 -0
- package/src/plugins/builtin/portfolio-list/header.tsx +65 -0
- package/src/plugins/builtin/portfolio-list/headless.ts +552 -0
- package/src/plugins/builtin/portfolio-list/imported-from.ts +8 -0
- package/src/plugins/builtin/portfolio-list/income.ts +307 -0
- package/src/plugins/builtin/portfolio-list/index.tsx +125 -0
- package/src/plugins/builtin/portfolio-list/metrics.ts +25 -0
- package/src/plugins/builtin/portfolio-list/pane/data.ts +277 -0
- package/src/plugins/builtin/portfolio-list/pane/futures-front.ts +40 -0
- package/src/plugins/builtin/portfolio-list/pane/futures-terms.ts +58 -0
- package/src/plugins/builtin/portfolio-list/pane/index.tsx +846 -0
- package/src/plugins/builtin/portfolio-list/pane/purchase-date-fx.ts +46 -0
- package/src/plugins/builtin/portfolio-list/pane/remove-ticker.ts +85 -0
- package/src/plugins/builtin/portfolio-list/pane/streaming.ts +331 -0
- package/src/plugins/builtin/portfolio-list/pane/supplemental.ts +301 -0
- package/src/plugins/builtin/portfolio-list/quick-add/index.tsx +435 -0
- package/src/plugins/builtin/portfolio-list/quick-add/resolution.ts +210 -0
- package/src/plugins/builtin/portfolio-list/row-actions.ts +8 -0
- package/src/plugins/builtin/portfolio-list/settings.ts +409 -0
- package/src/plugins/builtin/portfolio-list/since-last-seen.ts +197 -0
- package/src/plugins/builtin/portfolio-list/summary/index.tsx +530 -0
- package/src/plugins/builtin/portfolio-list/summary/live-accounts.ts +167 -0
- package/src/plugins/builtin/portfolio-list/summary/totals.ts +280 -0
- package/src/plugins/builtin/portfolio-list/table.tsx +251 -0
- package/src/plugins/builtin/portfolio-list/use-column-clock.ts +41 -0
- package/src/plugins/builtin/portfolio-list/use-cursor-neighbor-prefetch.ts +87 -0
- package/src/plugins/builtin/portfolio-list/use-throttled-cursor-symbol.ts +26 -0
- package/src/plugins/builtin/portfolio-list/use-throttled-memo.ts +59 -0
- package/src/plugins/builtin/portfolio-list/use-throttled-ticker-order.ts +78 -0
- package/src/plugins/builtin/power/client.ts +119 -0
- package/src/plugins/builtin/power/detail.tsx +82 -0
- package/src/plugins/builtin/power/evidence.ts +153 -0
- package/src/plugins/builtin/power/gas-client.ts +110 -0
- package/src/plugins/builtin/power/gas-model.ts +194 -0
- package/src/plugins/builtin/power/gas.tsx +149 -0
- package/src/plugins/builtin/power/generation.tsx +37 -0
- package/src/plugins/builtin/power/headless.ts +116 -0
- package/src/plugins/builtin/power/index.tsx +51 -0
- package/src/plugins/builtin/power/model.ts +160 -0
- package/src/plugins/builtin/power/pane.tsx +248 -0
- package/src/plugins/builtin/power/prices-client.ts +139 -0
- package/src/plugins/builtin/power/prices-headless.ts +206 -0
- package/src/plugins/builtin/power/prices-model.ts +103 -0
- package/src/plugins/builtin/power/prices.tsx +209 -0
- package/src/plugins/builtin/power/query.ts +25 -0
- package/src/plugins/builtin/primary-dealers/client.ts +158 -0
- package/src/plugins/builtin/primary-dealers/headless.ts +78 -0
- package/src/plugins/builtin/primary-dealers/index.tsx +18 -0
- package/src/plugins/builtin/primary-dealers/model.ts +256 -0
- package/src/plugins/builtin/primary-dealers/pane.tsx +269 -0
- package/src/plugins/builtin/rate-path/client.ts +52 -0
- package/src/plugins/builtin/rate-path/headless.ts +93 -0
- package/src/plugins/builtin/rate-path/index.tsx +18 -0
- package/src/plugins/builtin/rate-path/model.ts +127 -0
- package/src/plugins/builtin/rate-path/pane.tsx +214 -0
- package/src/plugins/builtin/realized-vol/chart-model.ts +70 -0
- package/src/plugins/builtin/realized-vol/charts.tsx +44 -0
- package/src/plugins/builtin/realized-vol/client.ts +108 -0
- package/src/plugins/builtin/realized-vol/evidence.ts +103 -0
- package/src/plugins/builtin/realized-vol/headless.ts +86 -0
- package/src/plugins/builtin/realized-vol/index.tsx +34 -0
- package/src/plugins/builtin/realized-vol/model.ts +149 -0
- package/src/plugins/builtin/realized-vol/pane.tsx +211 -0
- package/src/plugins/builtin/realized-vol/settings.ts +16 -0
- package/src/plugins/builtin/relative-rotation/client.ts +204 -0
- package/src/plugins/builtin/relative-rotation/headless.ts +95 -0
- package/src/plugins/builtin/relative-rotation/index.tsx +92 -0
- package/src/plugins/builtin/relative-rotation/model.ts +301 -0
- package/src/plugins/builtin/relative-rotation/pane.tsx +386 -0
- package/src/plugins/builtin/research/analyst-headless.ts +200 -0
- package/src/plugins/builtin/research/analyst-model.ts +557 -0
- package/src/plugins/builtin/research/analyst-pane.tsx +319 -0
- package/src/plugins/builtin/research/client.ts +12 -0
- package/src/plugins/builtin/research/corporate-actions-pane.tsx +716 -0
- package/src/plugins/builtin/research/equity-diagnostic-pane.tsx +597 -0
- package/src/plugins/builtin/research/event-model.ts +525 -0
- package/src/plugins/builtin/research/event-sources.ts +72 -0
- package/src/plugins/builtin/research/events-headless.ts +82 -0
- package/src/plugins/builtin/research/headless-schema.ts +48 -0
- package/src/plugins/builtin/research/headless.ts +138 -0
- package/src/plugins/builtin/research/index.tsx +183 -0
- package/src/plugins/builtin/research/relative-valuation-basis.ts +58 -0
- package/src/plugins/builtin/research/relative-valuation-columns.ts +340 -0
- package/src/plugins/builtin/research/relative-valuation-currency.ts +171 -0
- package/src/plugins/builtin/research/relative-valuation-headless.ts +239 -0
- package/src/plugins/builtin/research/relative-valuation-model.ts +240 -0
- package/src/plugins/builtin/research/relative-valuation-pane.tsx +369 -0
- package/src/plugins/builtin/research/relative-valuation-peers.ts +302 -0
- package/src/plugins/builtin/research-search/article.ts +65 -0
- package/src/plugins/builtin/research-search/command-bar-search.ts +175 -0
- package/src/plugins/builtin/research-search/data.ts +116 -0
- package/src/plugins/builtin/research-search/document-view.tsx +74 -0
- package/src/plugins/builtin/research-search/focus-handoff.ts +47 -0
- package/src/plugins/builtin/research-search/index.tsx +87 -0
- package/src/plugins/builtin/research-search/model.ts +266 -0
- package/src/plugins/builtin/research-search/pane.tsx +690 -0
- package/src/plugins/builtin/research-search/saved-view.tsx +172 -0
- package/src/plugins/builtin/research-search/snippet-text.tsx +35 -0
- package/src/plugins/builtin/research-search/snippet.ts +105 -0
- package/src/plugins/builtin/revenue-breakdown/bars.tsx +113 -0
- package/src/plugins/builtin/revenue-breakdown/client.ts +121 -0
- package/src/plugins/builtin/revenue-breakdown/headless.ts +89 -0
- package/src/plugins/builtin/revenue-breakdown/index.tsx +60 -0
- package/src/plugins/builtin/revenue-breakdown/model.ts +157 -0
- package/src/plugins/builtin/revenue-breakdown/pane.tsx +293 -0
- package/src/plugins/builtin/reverse-dcf/client.ts +36 -0
- package/src/plugins/builtin/reverse-dcf/headless.ts +71 -0
- package/src/plugins/builtin/reverse-dcf/index.tsx +23 -0
- package/src/plugins/builtin/reverse-dcf/model.ts +229 -0
- package/src/plugins/builtin/reverse-dcf/pane.tsx +133 -0
- package/src/plugins/builtin/risk-factors/data.ts +135 -0
- package/src/plugins/builtin/risk-factors/headless.ts +82 -0
- package/src/plugins/builtin/risk-factors/index.tsx +93 -0
- package/src/plugins/builtin/risk-factors/pane.tsx +308 -0
- package/src/plugins/builtin/scanner/denied.tsx +20 -0
- package/src/plugins/builtin/scanner/feed.ts +118 -0
- package/src/plugins/builtin/scanner/flow-history.ts +98 -0
- package/src/plugins/builtin/scanner/flow-model.ts +318 -0
- package/src/plugins/builtin/scanner/flow-pane.tsx +562 -0
- package/src/plugins/builtin/scanner/flow-session.ts +146 -0
- package/src/plugins/builtin/scanner/headless.ts +418 -0
- package/src/plugins/builtin/scanner/hilo-bars.tsx +65 -0
- package/src/plugins/builtin/scanner/hilo-model.ts +96 -0
- package/src/plugins/builtin/scanner/hilo-pane.tsx +208 -0
- package/src/plugins/builtin/scanner/index.ts +153 -0
- package/src/plugins/builtin/scanner/live-condition-editor.tsx +222 -0
- package/src/plugins/builtin/scanner/live-feed.ts +168 -0
- package/src/plugins/builtin/scanner/live-headless.ts +138 -0
- package/src/plugins/builtin/scanner/live-model.ts +362 -0
- package/src/plugins/builtin/scanner/live-pane.tsx +677 -0
- package/src/plugins/builtin/scanner/live-track.ts +186 -0
- package/src/plugins/builtin/scanner/lock-note.ts +19 -0
- package/src/plugins/builtin/seasonality/client.ts +76 -0
- package/src/plugins/builtin/seasonality/headless.ts +73 -0
- package/src/plugins/builtin/seasonality/index.tsx +20 -0
- package/src/plugins/builtin/seasonality/model.ts +243 -0
- package/src/plugins/builtin/seasonality/pane.tsx +229 -0
- package/src/plugins/builtin/sec/client.ts +16 -0
- package/src/plugins/builtin/sec/command-bar-search.ts +227 -0
- package/src/plugins/builtin/sec/filing-content.ts +160 -0
- package/src/plugins/builtin/sec/filing-display.tsx +53 -0
- package/src/plugins/builtin/sec/filing-documents.ts +65 -0
- package/src/plugins/builtin/sec/forms.ts +75 -0
- package/src/plugins/builtin/sec/fund-abroad.ts +32 -0
- package/src/plugins/builtin/sec/fund-facts-view.tsx +56 -0
- package/src/plugins/builtin/sec/fund-facts.ts +470 -0
- package/src/plugins/builtin/sec/headless.ts +295 -0
- package/src/plugins/builtin/sec/index.tsx +690 -0
- package/src/plugins/builtin/sec/model.ts +266 -0
- package/src/plugins/builtin/sec/row-summaries.ts +105 -0
- package/src/plugins/builtin/sectors/client.ts +182 -0
- package/src/plugins/builtin/sectors/headless.ts +137 -0
- package/src/plugins/builtin/sectors/index.tsx +454 -0
- package/src/plugins/builtin/sectors/move-bar.tsx +21 -0
- package/src/plugins/builtin/sectors/sector-data.ts +75 -0
- package/src/plugins/builtin/sectors/sector-model.ts +536 -0
- package/src/plugins/builtin/series-inventory.ts +101 -0
- package/src/plugins/builtin/shared/broker-reconnect.ts +190 -0
- package/src/plugins/builtin/shared/cloud-denied.ts +47 -0
- package/src/plugins/builtin/shared/cloud-resource.ts +70 -0
- package/src/plugins/builtin/shared/cloud-upgrade.ts +367 -0
- package/src/plugins/builtin/shared/command-tab.ts +69 -0
- package/src/plugins/builtin/shared/crypto-pair.ts +14 -0
- package/src/plugins/builtin/shared/earnings-calendar.ts +379 -0
- package/src/plugins/builtin/shared/earnings-estimate-basis.ts +71 -0
- package/src/plugins/builtin/shared/earnings-report.ts +108 -0
- package/src/plugins/builtin/shared/filing-year-reader.tsx +123 -0
- package/src/plugins/builtin/shared/fred-points.ts +20 -0
- package/src/plugins/builtin/shared/free-preview.ts +47 -0
- package/src/plugins/builtin/shared/free-routes.ts +24 -0
- package/src/plugins/builtin/shared/futures-session.ts +34 -0
- package/src/plugins/builtin/shared/fx-rate-freshness.ts +123 -0
- package/src/plugins/builtin/shared/headless-market-data.ts +72 -0
- package/src/plugins/builtin/shared/headless-options.ts +54 -0
- package/src/plugins/builtin/shared/history-span.ts +55 -0
- package/src/plugins/builtin/shared/job-posting.ts +130 -0
- package/src/plugins/builtin/shared/locked-rows.tsx +58 -0
- package/src/plugins/builtin/shared/macro-releases.ts +65 -0
- package/src/plugins/builtin/shared/members-menu.tsx +261 -0
- package/src/plugins/builtin/shared/mine-tickers.ts +19 -0
- package/src/plugins/builtin/shared/move-rank.ts +108 -0
- package/src/plugins/builtin/shared/open-description.ts +29 -0
- package/src/plugins/builtin/shared/pane-request.ts +35 -0
- package/src/plugins/builtin/shared/pro-feature-wall.tsx +56 -0
- package/src/plugins/builtin/shared/pro-lock-note.ts +140 -0
- package/src/plugins/builtin/shared/public-pane.ts +9 -0
- package/src/plugins/builtin/shared/report-freshness.ts +149 -0
- package/src/plugins/builtin/shared/research-cells.tsx +102 -0
- package/src/plugins/builtin/shared/research-cloud-session.ts +18 -0
- package/src/plugins/builtin/shared/research-trading.tsx +85 -0
- package/src/plugins/builtin/shared/scanner-capture.ts +98 -0
- package/src/plugins/builtin/shared/series-cache.ts +140 -0
- package/src/plugins/builtin/shared/series-detail-chart.tsx +171 -0
- package/src/plugins/builtin/shared/series-list-detail.tsx +223 -0
- package/src/plugins/builtin/shared/series-warning.ts +5 -0
- package/src/plugins/builtin/shared/stat-transform.ts +94 -0
- package/src/plugins/builtin/shared/ticker-choice.tsx +35 -0
- package/src/plugins/builtin/shared/ticker-company.ts +77 -0
- package/src/plugins/builtin/shared/ticker-request.ts +71 -0
- package/src/plugins/builtin/shared/ticker-surface.ts +149 -0
- package/src/plugins/builtin/shared/treasury-cutoffs.ts +15 -0
- package/src/plugins/builtin/shared/trend.ts +81 -0
- package/src/plugins/builtin/shared/use-quote-board.ts +695 -0
- package/src/plugins/builtin/shared/volatility/index.ts +4 -0
- package/src/plugins/builtin/shared/volatility/live-session.ts +211 -0
- package/src/plugins/builtin/shared/volatility/options.ts +212 -0
- package/src/plugins/builtin/shared/volatility/pricing.ts +236 -0
- package/src/plugins/builtin/shared/volatility/smile.ts +413 -0
- package/src/plugins/builtin/shared/volatility-indices.ts +32 -0
- package/src/plugins/builtin/shared/wall-teaser-catalog.ts +80 -0
- package/src/plugins/builtin/shared/wall-teaser.tsx +192 -0
- package/src/plugins/builtin/shared/wall-view-lifecycle.ts +45 -0
- package/src/plugins/builtin/short-interest/client.ts +48 -0
- package/src/plugins/builtin/short-interest/headless.ts +166 -0
- package/src/plugins/builtin/short-interest/index.tsx +143 -0
- package/src/plugins/builtin/short-interest/model.ts +265 -0
- package/src/plugins/builtin/short-interest/pane.tsx +178 -0
- package/src/plugins/builtin/short-interest/publications-client.ts +82 -0
- package/src/plugins/builtin/short-interest/publications-headless.ts +29 -0
- package/src/plugins/builtin/short-interest/publications-model.ts +50 -0
- package/src/plugins/builtin/short-interest/publications-pane.tsx +66 -0
- package/src/plugins/builtin/short-interest/schedule.ts +140 -0
- package/src/plugins/builtin/short-interest/series.ts +36 -0
- package/src/plugins/builtin/short-interest/surface.tsx +49 -0
- package/src/plugins/builtin/short-interest/types.ts +16 -0
- package/src/plugins/builtin/short-interest/watch-client.ts +122 -0
- package/src/plugins/builtin/short-interest/watch-headless.ts +56 -0
- package/src/plugins/builtin/short-interest/watch-model.ts +214 -0
- package/src/plugins/builtin/short-interest/watch-pane.tsx +173 -0
- package/src/plugins/builtin/short-volume/client.ts +86 -0
- package/src/plugins/builtin/short-volume/headless.ts +31 -0
- package/src/plugins/builtin/short-volume/index.tsx +20 -0
- package/src/plugins/builtin/short-volume/model.ts +53 -0
- package/src/plugins/builtin/short-volume/pane.tsx +108 -0
- package/src/plugins/builtin/short-volume/series.ts +23 -0
- package/src/plugins/builtin/social-mentions/client.ts +93 -0
- package/src/plugins/builtin/social-mentions/headless.ts +33 -0
- package/src/plugins/builtin/social-mentions/index.tsx +24 -0
- package/src/plugins/builtin/social-mentions/lock-note.ts +15 -0
- package/src/plugins/builtin/social-mentions/model.ts +92 -0
- package/src/plugins/builtin/social-mentions/pane.tsx +158 -0
- package/src/plugins/builtin/social-mentions/series.ts +23 -0
- package/src/plugins/builtin/supply-chain/client.ts +113 -0
- package/src/plugins/builtin/supply-chain/disclosure-quote.tsx +21 -0
- package/src/plugins/builtin/supply-chain/evidence.ts +90 -0
- package/src/plugins/builtin/supply-chain/flow-layout.ts +134 -0
- package/src/plugins/builtin/supply-chain/flow.tsx +366 -0
- package/src/plugins/builtin/supply-chain/graph-client.ts +86 -0
- package/src/plugins/builtin/supply-chain/graph-evidence.ts +25 -0
- package/src/plugins/builtin/supply-chain/graph-model.ts +53 -0
- package/src/plugins/builtin/supply-chain/graph-pane.tsx +221 -0
- package/src/plugins/builtin/supply-chain/graph.tsx +167 -0
- package/src/plugins/builtin/supply-chain/headless.ts +185 -0
- package/src/plugins/builtin/supply-chain/index.tsx +26 -0
- package/src/plugins/builtin/supply-chain/model.ts +292 -0
- package/src/plugins/builtin/supply-chain/pane.tsx +373 -0
- package/src/plugins/builtin/supply-chain/row-evidence.tsx +97 -0
- package/src/plugins/builtin/supply-chain/trust.ts +34 -0
- package/src/plugins/builtin/themes/client.ts +39 -0
- package/src/plugins/builtin/themes/headless.ts +129 -0
- package/src/plugins/builtin/themes/model.ts +208 -0
- package/src/plugins/builtin/themes/pane.tsx +166 -0
- package/src/plugins/builtin/thirteenf/api.ts +434 -0
- package/src/plugins/builtin/thirteenf/data.ts +593 -0
- package/src/plugins/builtin/thirteenf/format.ts +56 -0
- package/src/plugins/builtin/thirteenf/headless.ts +927 -0
- package/src/plugins/builtin/thirteenf/index.tsx +94 -0
- package/src/plugins/builtin/thirteenf/model.ts +933 -0
- package/src/plugins/builtin/thirteenf/overlap-pane.tsx +207 -0
- package/src/plugins/builtin/thirteenf/overlap.ts +123 -0
- package/src/plugins/builtin/thirteenf/pane.tsx +781 -0
- package/src/plugins/builtin/thirteenf/report-notes.ts +329 -0
- package/src/plugins/builtin/thirteenf/signals-pane.tsx +153 -0
- package/src/plugins/builtin/thirteenf/signals.ts +74 -0
- package/src/plugins/builtin/thirteenf/table.ts +196 -0
- package/src/plugins/builtin/thirteenf/types.ts +254 -0
- package/src/plugins/builtin/ticker-detail/adr-pair/headless.ts +123 -0
- package/src/plugins/builtin/ticker-detail/adr-pair/model.ts +132 -0
- package/src/plugins/builtin/ticker-detail/adr-pair/tab.tsx +87 -0
- package/src/plugins/builtin/ticker-detail/data-panes/historical-prices.tsx +419 -0
- package/src/plugins/builtin/ticker-detail/data-panes/history-bars.ts +112 -0
- package/src/plugins/builtin/ticker-detail/data-panes/returns-history.ts +179 -0
- package/src/plugins/builtin/ticker-detail/data-panes/returns-model.ts +425 -0
- package/src/plugins/builtin/ticker-detail/data-panes/returns-pane.tsx +361 -0
- package/src/plugins/builtin/ticker-detail/financials/aggregation.ts +322 -0
- package/src/plugins/builtin/ticker-detail/financials/model.ts +643 -0
- package/src/plugins/builtin/ticker-detail/financials/offerings.ts +56 -0
- package/src/plugins/builtin/ticker-detail/financials/pane.tsx +29 -0
- package/src/plugins/builtin/ticker-detail/financials/period-end-history.ts +44 -0
- package/src/plugins/builtin/ticker-detail/financials/ratio-table.tsx +175 -0
- package/src/plugins/builtin/ticker-detail/financials/ratios.ts +830 -0
- package/src/plugins/builtin/ticker-detail/financials/schema.ts +389 -0
- package/src/plugins/builtin/ticker-detail/financials/tab.tsx +592 -0
- package/src/plugins/builtin/ticker-detail/headless-schema.ts +111 -0
- package/src/plugins/builtin/ticker-detail/headless.ts +591 -0
- package/src/plugins/builtin/ticker-detail/index.tsx +248 -0
- package/src/plugins/builtin/ticker-detail/overview/components.tsx +361 -0
- package/src/plugins/builtin/ticker-detail/overview/dividend.ts +60 -0
- package/src/plugins/builtin/ticker-detail/overview/futures-contract.ts +31 -0
- package/src/plugins/builtin/ticker-detail/overview/model.ts +446 -0
- package/src/plugins/builtin/ticker-detail/overview/option-contract.ts +64 -0
- package/src/plugins/builtin/ticker-detail/overview/pane.tsx +60 -0
- package/src/plugins/builtin/ticker-detail/overview/types.ts +40 -0
- package/src/plugins/builtin/ticker-detail/overview-tab.tsx +618 -0
- package/src/plugins/builtin/ticker-detail/pane.tsx +420 -0
- package/src/plugins/builtin/ticker-detail/quote-footer.ts +48 -0
- package/src/plugins/builtin/ticker-detail/quote-monitor/card.tsx +489 -0
- package/src/plugins/builtin/ticker-detail/quote-monitor/index.tsx +320 -0
- package/src/plugins/builtin/ticker-detail/research-tab-keys.tsx +58 -0
- package/src/plugins/builtin/ticker-detail/research-tab-navigation.tsx +14 -0
- package/src/plugins/builtin/ticker-detail/research-tabs.ts +43 -0
- package/src/plugins/builtin/ticker-detail/settings.ts +204 -0
- package/src/plugins/builtin/time-sales/client.ts +84 -0
- package/src/plugins/builtin/time-sales/headless.ts +117 -0
- package/src/plugins/builtin/time-sales/index.tsx +18 -0
- package/src/plugins/builtin/time-sales/model.ts +125 -0
- package/src/plugins/builtin/time-sales/pane.tsx +189 -0
- package/src/plugins/builtin/time-sales/snapshot-client.ts +28 -0
- package/src/plugins/builtin/time-sales/use-tape.ts +58 -0
- package/src/plugins/builtin/time-sales/window.ts +128 -0
- package/src/plugins/builtin/trace-bonds/client.ts +525 -0
- package/src/plugins/builtin/trace-bonds/headless.ts +107 -0
- package/src/plugins/builtin/trace-bonds/index.tsx +35 -0
- package/src/plugins/builtin/trace-bonds/model.ts +117 -0
- package/src/plugins/builtin/trace-bonds/pane.tsx +209 -0
- package/src/plugins/builtin/treasury-auctions/cache.ts +115 -0
- package/src/plugins/builtin/treasury-auctions/client.ts +230 -0
- package/src/plugins/builtin/treasury-auctions/headless.ts +172 -0
- package/src/plugins/builtin/treasury-auctions/index.tsx +88 -0
- package/src/plugins/builtin/treasury-auctions/model.ts +379 -0
- package/src/plugins/builtin/treasury-auctions/pane.tsx +413 -0
- package/src/plugins/builtin/treasury-auctions/types.ts +72 -0
- package/src/plugins/builtin/treasury-daily/client.ts +132 -0
- package/src/plugins/builtin/treasury-daily/headless.ts +69 -0
- package/src/plugins/builtin/treasury-daily/index.tsx +17 -0
- package/src/plugins/builtin/treasury-daily/model.ts +116 -0
- package/src/plugins/builtin/treasury-daily/pane.tsx +219 -0
- package/src/plugins/builtin/vol-surface/charts.tsx +117 -0
- package/src/plugins/builtin/vol-surface/client.ts +260 -0
- package/src/plugins/builtin/vol-surface/evidence.ts +207 -0
- package/src/plugins/builtin/vol-surface/headless.ts +286 -0
- package/src/plugins/builtin/vol-surface/heat-grid.tsx +113 -0
- package/src/plugins/builtin/vol-surface/index.tsx +47 -0
- package/src/plugins/builtin/vol-surface/live.ts +60 -0
- package/src/plugins/builtin/vol-surface/model.ts +661 -0
- package/src/plugins/builtin/vol-surface/pane.tsx +582 -0
- package/src/plugins/builtin/vol-surface/raster.ts +113 -0
- package/src/plugins/builtin/vol-surface/stored.ts +170 -0
- package/src/plugins/builtin/vol-surface/surface.tsx +59 -0
- package/src/plugins/builtin/vol-surface/tables.ts +166 -0
- package/src/plugins/builtin/volatility/chart-model.ts +163 -0
- package/src/plugins/builtin/volatility/charts.tsx +40 -0
- package/src/plugins/builtin/volatility/client.ts +256 -0
- package/src/plugins/builtin/volatility/dvol.ts +46 -0
- package/src/plugins/builtin/volatility/evidence.ts +144 -0
- package/src/plugins/builtin/volatility/headless.ts +78 -0
- package/src/plugins/builtin/volatility/index.tsx +27 -0
- package/src/plugins/builtin/volatility/model.ts +443 -0
- package/src/plugins/builtin/volatility/pane.tsx +254 -0
- package/src/plugins/builtin/volatility/series.ts +119 -0
- package/src/plugins/builtin/world-indices/client.ts +58 -0
- package/src/plugins/builtin/world-indices/footer.ts +25 -0
- package/src/plugins/builtin/world-indices/headless.ts +148 -0
- package/src/plugins/builtin/world-indices/index.tsx +189 -0
- package/src/plugins/builtin/world-indices/indices.ts +63 -0
- package/src/plugins/builtin/world-indices/model.ts +94 -0
- package/src/plugins/builtin/world-indices/table.tsx +105 -0
- package/src/plugins/builtin/world-venue-map/basemap-layer.tsx +161 -0
- package/src/plugins/builtin/world-venue-map/basemap.ts +237 -0
- package/src/plugins/builtin/world-venue-map/chokepoint-chart.ts +40 -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 +160 -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 +249 -0
- package/src/plugins/builtin/world-venue-map/geo-series.ts +255 -0
- package/src/plugins/builtin/world-venue-map/geo-svg.tsx +448 -0
- package/src/plugins/builtin/world-venue-map/headless.ts +166 -0
- package/src/plugins/builtin/world-venue-map/ids.ts +1 -0
- package/src/plugins/builtin/world-venue-map/index.ts +82 -0
- package/src/plugins/builtin/world-venue-map/layered-pane.tsx +576 -0
- package/src/plugins/builtin/world-venue-map/layers.ts +435 -0
- package/src/plugins/builtin/world-venue-map/map-symbols.ts +220 -0
- package/src/plugins/builtin/world-venue-map/map.tsx +1122 -0
- package/src/plugins/builtin/world-venue-map/model.ts +321 -0
- 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 +260 -0
- package/src/plugins/builtin/world-venue-map/use-geo.ts +55 -0
- package/src/plugins/builtin/world-venue-map/venue-header.tsx +43 -0
- package/src/plugins/builtin/world-venue-map/world-outlines.ts +2 -0
- package/src/plugins/builtin/yield-curve/chart.ts +159 -0
- package/src/plugins/builtin/yield-curve/client.ts +25 -0
- package/src/plugins/builtin/yield-curve/curves.ts +225 -0
- package/src/plugins/builtin/yield-curve/forward.ts +102 -0
- package/src/plugins/builtin/yield-curve/headless.ts +287 -0
- package/src/plugins/builtin/yield-curve/history.ts +166 -0
- package/src/plugins/builtin/yield-curve/index.tsx +494 -0
- package/src/plugins/builtin/yield-curve/series.ts +96 -0
- package/src/plugins/builtin/yield-curve/swaps-model.ts +93 -0
- package/src/plugins/builtin/yield-curve/swaps.tsx +99 -0
- package/src/plugins/builtin/yield-curve/treasury-data.ts +73 -0
- package/src/plugins/builtin/yield-curve/world.ts +57 -0
- package/src/plugins/builtin-editorial.ts +126 -0
- package/src/plugins/bundle.ts +200 -0
- package/src/plugins/catalog-backend.ts +37 -0
- package/src/plugins/catalog-browser.ts +344 -0
- package/src/plugins/catalog-manifest.ts +144 -0
- package/src/plugins/catalog-ui.ts +84 -0
- package/src/plugins/catalog.ts +44 -0
- package/src/plugins/compat.ts +225 -0
- package/src/plugins/current-target.ts +30 -0
- package/src/plugins/dependencies.ts +143 -0
- package/src/plugins/event-bus.ts +43 -0
- package/src/plugins/external-runtime.ts +54 -0
- package/src/plugins/extracted-plugins.ts +202 -0
- package/src/plugins/health.ts +21 -0
- package/src/plugins/host-link.ts +422 -0
- package/src/plugins/host-modules.ts +141 -0
- package/src/plugins/host-resolver.ts +100 -0
- package/src/plugins/host-smoke.ts +103 -0
- package/src/plugins/installer.ts +649 -0
- package/src/plugins/loader.ts +580 -0
- package/src/plugins/manager-node.ts +55 -0
- package/src/plugins/marketplace/activation.ts +95 -0
- package/src/plugins/marketplace/deactivation.ts +22 -0
- package/src/plugins/marketplace/feed.ts +92 -0
- package/src/plugins/marketplace/ids.ts +2 -0
- package/src/plugins/marketplace/model.ts +598 -0
- package/src/plugins/marketplace/packs.ts +118 -0
- package/src/plugins/marketplace/store.ts +130 -0
- package/src/plugins/ownership.ts +281 -0
- package/src/plugins/peer-retry.ts +155 -0
- package/src/plugins/plugin-export.ts +24 -0
- package/src/plugins/plugin-functions.ts +54 -0
- package/src/plugins/plugin-icon.ts +61 -0
- package/src/plugins/plugin-names.ts +32 -0
- package/src/plugins/plugin-off.ts +36 -0
- package/src/plugins/plugin-persistence.ts +84 -0
- package/src/plugins/registry/context-menu.ts +36 -0
- package/src/plugins/registry/contributions.ts +159 -0
- package/src/plugins/registry/host-actions.ts +276 -0
- package/src/plugins/registry/index.ts +777 -0
- package/src/plugins/registry/pane-settings.ts +188 -0
- package/src/plugins/registry/plugin-state.ts +135 -0
- package/src/plugins/registry/setup-command.ts +93 -0
- package/src/plugins/registry/shared.ts +28 -0
- package/src/plugins/registry/slots.ts +67 -0
- package/src/plugins/runtime/context.tsx +110 -0
- package/src/plugins/runtime/index.tsx +95 -0
- package/src/plugins/runtime/state.ts +256 -0
- package/src/plugins/seed-notice.ts +20 -0
- package/src/plugins/shortcut-argument.ts +39 -0
- package/src/plugins/team-state.ts +70 -0
- package/src/plugins/web-bundled.ts +33 -0
- package/src/portfolio/allocation.ts +316 -0
- package/src/portfolio/collection-name.ts +62 -0
- package/src/portfolio/column-values.ts +846 -0
- package/src/portfolio/cost-fx.ts +338 -0
- package/src/portfolio/futures-positions.ts +216 -0
- package/src/portfolio/futures-terms.ts +75 -0
- package/src/portfolio/manual-lots.ts +153 -0
- package/src/portfolio/mutations.ts +532 -0
- package/src/portfolio/position-metrics.ts +332 -0
- package/src/portfolio/position-quantity.ts +49 -0
- package/src/portfolio/position-value.ts +40 -0
- package/src/portfolio/suffixed-listings.ts +209 -0
- package/src/portfolio/totals-currency.ts +24 -0
- package/src/portfolio/valuation-basis.ts +89 -0
- package/src/public/__snapshots__/public-api.test.ts.snap +557 -0
- package/src/public/broker.ts +50 -0
- package/src/public/i18n.ts +17 -0
- package/src/public/index.ts +3 -0
- package/src/public/layout.ts +12 -0
- package/src/public/market-data.ts +43 -0
- package/src/public/pane-hooks.ts +72 -0
- package/src/public/quotes.ts +50 -0
- package/src/public/react.ts +130 -0
- package/src/public/remote.ts +23 -0
- package/src/public/test-support.ts +84 -0
- package/src/public/tickers.ts +40 -0
- package/src/public/time-series.ts +61 -0
- package/src/public/utils.ts +112 -0
- package/src/react/assign-ref.ts +10 -0
- package/src/react/async-resource.ts +79 -0
- package/src/react/auto-refresh.ts +107 -0
- package/src/react/input.ts +278 -0
- package/src/react/key-repeat.ts +86 -0
- package/src/react/plugins/plugin-slot.tsx +16 -0
- package/src/react/read-state.ts +104 -0
- package/src/react/ticker-source.ts +32 -0
- package/src/react/use-raf-callback.ts +44 -0
- package/src/react/use-throttled-commit-value.ts +133 -0
- package/src/remote/app-host.tsx +115 -0
- package/src/remote/client.ts +34 -0
- package/src/remote/command-bar.ts +98 -0
- package/src/remote/confirm-change.tsx +86 -0
- package/src/remote/controller-utils.ts +113 -0
- package/src/remote/controller.ts +727 -0
- package/src/remote/endpoint.ts +41 -0
- package/src/remote/form.ts +20 -0
- package/src/remote/json-patch.ts +103 -0
- package/src/remote/layout-helpers.ts +55 -0
- package/src/remote/matching.ts +69 -0
- package/src/remote/pane-screenshot.ts +47 -0
- package/src/remote/resources.ts +236 -0
- package/src/remote/revision.ts +5 -0
- package/src/remote/schema.ts +544 -0
- package/src/remote/semantic-helpers.ts +161 -0
- package/src/remote/semantic-tree.tsx +167 -0
- package/src/remote/server.ts +131 -0
- package/src/remote/types.ts +211 -0
- package/src/remote/watchlist.ts +314 -0
- package/src/renderers/browser/app-services.ts +33 -0
- package/src/renderers/browser/bundled-plugins.ts +91 -0
- package/src/renderers/browser/cloud-transport.ts +111 -0
- package/src/renderers/browser/config-host.ts +146 -0
- package/src/renderers/browser/deeplink-bridge.ts +52 -0
- package/src/renderers/browser/http-proxy-transport.ts +55 -0
- package/src/renderers/browser/main.tsx +142 -0
- package/src/renderers/browser/research-entry.ts +23 -0
- package/src/renderers/browser/ui-host.tsx +51 -0
- package/src/renderers/cloudflare/http-proxy.ts +289 -0
- package/src/renderers/cloudflare/proxy-session.ts +270 -0
- package/src/renderers/cloudflare/worker.ts +145 -0
- package/src/renderers/dom/boot-frame-page.ts +187 -0
- package/src/renderers/dom/boot-frame.ts +237 -0
- package/src/renderers/dom/build-assets.ts +273 -0
- package/src/renderers/dom/data-frames.ts +24 -0
- package/src/renderers/dom/data-table/dom.ts +253 -0
- package/src/renderers/dom/data-table/frozen-column.ts +24 -0
- package/src/renderers/dom/data-table/index.tsx +558 -0
- package/src/renderers/dom/data-table/row.tsx +506 -0
- package/src/renderers/dom/desktop/audio-player.tsx +312 -0
- package/src/renderers/dom/desktop/control-styles.ts +90 -0
- package/src/renderers/dom/desktop/controls.tsx +706 -0
- package/src/renderers/dom/desktop/dialog-actions.tsx +130 -0
- package/src/renderers/dom/desktop/icons.tsx +258 -0
- package/src/renderers/dom/desktop/list-view.tsx +334 -0
- package/src/renderers/dom/desktop/menu.tsx +115 -0
- package/src/renderers/dom/desktop/popover.tsx +249 -0
- package/src/renderers/dom/desktop/query-bar.tsx +352 -0
- package/src/renderers/dom/desktop/select-field.tsx +155 -0
- package/src/renderers/dom/desktop/stack-header.ts +22 -0
- package/src/renderers/dom/dialog-host.tsx +148 -0
- package/src/renderers/dom/dom-host-providers.tsx +64 -0
- package/src/renderers/dom/dom-ui-host.tsx +121 -0
- package/src/renderers/dom/host/ascii-text.ts +51 -0
- package/src/renderers/dom/host/block-glyph-canvas.tsx +118 -0
- package/src/renderers/dom/host/box.tsx +368 -0
- package/src/renderers/dom/host/chart-surface.tsx +331 -0
- package/src/renderers/dom/host/drag-shield.ts +35 -0
- package/src/renderers/dom/host/focus-scope.ts +105 -0
- package/src/renderers/dom/host/hls.chunk.ts +3 -0
- package/src/renderers/dom/host/image-surface.tsx +49 -0
- package/src/renderers/dom/host/input.tsx +403 -0
- package/src/renderers/dom/host/live-frame.ts +66 -0
- package/src/renderers/dom/host/media-surface.tsx +270 -0
- package/src/renderers/dom/host/mouse.ts +183 -0
- package/src/renderers/dom/host/overflow-fade.ts +89 -0
- package/src/renderers/dom/host/resize-rows.ts +111 -0
- package/src/renderers/dom/host/scroll-box.tsx +344 -0
- package/src/renderers/dom/host/size-observer.ts +70 -0
- package/src/renderers/dom/host/sticky-scroll.ts +147 -0
- package/src/renderers/dom/host/style.ts +148 -0
- package/src/renderers/dom/host/surface-3d.tsx +707 -0
- package/src/renderers/dom/host/surface-fit.ts +413 -0
- package/src/renderers/dom/host/tabs.tsx +380 -0
- package/src/renderers/dom/host/text.tsx +174 -0
- package/src/renderers/dom/host/top-surface.ts +127 -0
- package/src/renderers/dom/input-host.tsx +163 -0
- package/src/renderers/dom/key-event.ts +186 -0
- package/src/renderers/dom/native-renderer.ts +114 -0
- package/src/renderers/dom/scrollbar-activity.ts +23 -0
- package/src/renderers/dom/styles.css +1633 -0
- package/src/renderers/dom/test-utils.tsx +79 -0
- package/src/renderers/dom/toast-host.tsx +95 -0
- package/src/renderers/dom/windowed-list.tsx +201 -0
- package/src/renderers/dom/windowed-rows.ts +65 -0
- package/src/renderers/electrobun/bun/application-menu/click.ts +66 -0
- package/src/renderers/electrobun/bun/application-menu/index.ts +137 -0
- package/src/renderers/electrobun/bun/context-menu/click.ts +42 -0
- package/src/renderers/electrobun/bun/context-menu/normalize.ts +62 -0
- package/src/renderers/electrobun/bun/core-capabilities.ts +241 -0
- package/src/renderers/electrobun/bun/desktop/app-badge.ts +37 -0
- package/src/renderers/electrobun/bun/desktop/app-icon.ts +127 -0
- package/src/renderers/electrobun/bun/desktop/app-name.ts +222 -0
- package/src/renderers/electrobun/bun/desktop/backend-requests.ts +119 -0
- package/src/renderers/electrobun/bun/desktop/backend.ts +603 -0
- package/src/renderers/electrobun/bun/desktop/capability-bridge.ts +144 -0
- package/src/renderers/electrobun/bun/desktop/detached-windows.ts +275 -0
- package/src/renderers/electrobun/bun/desktop/host-requests.ts +184 -0
- package/src/renderers/electrobun/bun/desktop/http-fetch.ts +84 -0
- package/src/renderers/electrobun/bun/desktop/http-stream.ts +191 -0
- package/src/renderers/electrobun/bun/desktop/initialization.ts +198 -0
- package/src/renderers/electrobun/bun/desktop/macos-dock-badge.ts +38 -0
- package/src/renderers/electrobun/bun/desktop/macos-dock-icon.ts +52 -0
- package/src/renderers/electrobun/bun/desktop/macos-objc.ts +52 -0
- package/src/renderers/electrobun/bun/desktop/plugin-state.ts +90 -0
- package/src/renderers/electrobun/bun/desktop/relaunch.ts +97 -0
- package/src/renderers/electrobun/bun/desktop/rpc-registry.ts +43 -0
- package/src/renderers/electrobun/bun/desktop/state-broadcaster.ts +119 -0
- package/src/renderers/electrobun/bun/desktop/update.ts +722 -0
- package/src/renderers/electrobun/bun/desktop/view-ids.ts +52 -0
- package/src/renderers/electrobun/bun/desktop/workspace/index.ts +256 -0
- package/src/renderers/electrobun/bun/desktop/workspace/requests.ts +74 -0
- package/src/renderers/electrobun/bun/external-plugins.ts +242 -0
- package/src/renderers/electrobun/bun/index.ts +185 -0
- package/src/renderers/electrobun/bun/menu-event.ts +17 -0
- package/src/renderers/electrobun/bun/tui-entry.ts +18 -0
- package/src/renderers/electrobun/bun/window/boot-frame.ts +67 -0
- package/src/renderers/electrobun/bun/window/controls.ts +69 -0
- package/src/renderers/electrobun/bun/window/create.ts +87 -0
- package/src/renderers/electrobun/bun/window/events.ts +49 -0
- package/src/renderers/electrobun/bun/window/focus.ts +42 -0
- package/src/renderers/electrobun/bun/window/frame.ts +51 -0
- package/src/renderers/electrobun/bun/window/remembered-frame.ts +122 -0
- package/src/renderers/electrobun/bun/window/windows-custom-chrome.ts +43 -0
- package/src/renderers/electrobun/bun/window/windows-icons.ts +55 -0
- package/src/renderers/electrobun/bun/window/windows-native.ts +96 -0
- package/src/renderers/electrobun/shared/app-name.ts +30 -0
- package/src/renderers/electrobun/shared/boot-frame.ts +7 -0
- package/src/renderers/electrobun/shared/protocol.ts +372 -0
- package/src/renderers/electrobun/shared/quote-event-batch.ts +103 -0
- package/src/renderers/electrobun/shared/rpc-codec.ts +94 -0
- package/src/renderers/electrobun/view/app-badge-host.ts +17 -0
- package/src/renderers/electrobun/view/app-services.ts +38 -0
- package/src/renderers/electrobun/view/backend-rpc.ts +235 -0
- package/src/renderers/electrobun/view/broker-remote-client.ts +157 -0
- package/src/renderers/electrobun/view/capability-stream-client.ts +31 -0
- package/src/renderers/electrobun/view/capability-subscription.ts +50 -0
- package/src/renderers/electrobun/view/cli-pane-shot-entry.tsx +546 -0
- package/src/renderers/electrobun/view/cli-pane-shot-frame.tsx +179 -0
- package/src/renderers/electrobun/view/cli-pane-shot-health.ts +15 -0
- package/src/renderers/electrobun/view/config-host.ts +38 -0
- package/src/renderers/electrobun/view/context-menu.ts +147 -0
- package/src/renderers/electrobun/view/desktop/window/bridge.ts +68 -0
- package/src/renderers/electrobun/view/desktop/window/snapshot.ts +60 -0
- package/src/renderers/electrobun/view/external-plugins.ts +88 -0
- package/src/renderers/electrobun/view/fatal-screen.tsx +76 -0
- package/src/renderers/electrobun/view/host/native.ts +33 -0
- package/src/renderers/electrobun/view/host/window-move.ts +28 -0
- package/src/renderers/electrobun/view/http-fetch.ts +199 -0
- package/src/renderers/electrobun/view/main.tsx +309 -0
- package/src/renderers/electrobun/view/native-stubs/backend-rpc.ts +34 -0
- package/src/renderers/electrobun/view/news-source.ts +46 -0
- package/src/renderers/electrobun/view/remote/asset-data-client.ts +156 -0
- package/src/renderers/electrobun/view/remote/backend-quote-subscription.ts +127 -0
- package/src/renderers/electrobun/view/remote/capability-invoker.ts +57 -0
- package/src/renderers/electrobun/view/remote/connection-health.ts +31 -0
- package/src/renderers/electrobun/view/remote/persistence.ts +149 -0
- package/src/renderers/electrobun/view/remote/quote-subscription-registry.ts +74 -0
- package/src/renderers/electrobun/view/remote/ticker-repository.ts +33 -0
- package/src/renderers/electrobun/view/renderer-window-error.ts +18 -0
- package/src/renderers/electrobun/view/rpc-timeout.ts +70 -0
- package/src/renderers/electrobun/view/screenshot-watermark.ts +105 -0
- package/src/renderers/electrobun/view/ui-host.tsx +80 -0
- package/src/renderers/electrobun/view/update-host.ts +62 -0
- package/src/renderers/electrobun/view/view-ids.ts +85 -0
- package/src/renderers/electrobun/view/window-fullscreen.ts +57 -0
- package/src/renderers/opentui/browser-open.ts +88 -0
- package/src/renderers/opentui/chart-surface.tsx +152 -0
- package/src/renderers/opentui/dialog-host.tsx +229 -0
- package/src/renderers/opentui/frame-capture.ts +33 -0
- package/src/renderers/opentui/host.tsx +280 -0
- package/src/renderers/opentui/image/loader.ts +116 -0
- package/src/renderers/opentui/image/surface.tsx +107 -0
- package/src/renderers/opentui/input-host.tsx +41 -0
- package/src/renderers/opentui/interaction-performance.ts +214 -0
- package/src/renderers/opentui/kitty-services.ts +15 -0
- package/src/renderers/opentui/native-smoke.ts +10 -0
- package/src/renderers/opentui/native-surface.ts +176 -0
- package/src/renderers/opentui/pane-image/glyphs-license.txt +107 -0
- package/src/renderers/opentui/pane-image/glyphs.json +1 -0
- package/src/renderers/opentui/pane-image/index.ts +108 -0
- package/src/renderers/opentui/pane-image/raster.ts +428 -0
- package/src/renderers/opentui/render-lib.ts +253 -0
- package/src/renderers/opentui/render-timing-smoke.ts +20 -0
- package/src/renderers/opentui/scrollbox-layout.ts +35 -0
- package/src/renderers/opentui/start.tsx +191 -0
- package/src/renderers/opentui/terminal-input-reset.ts +25 -0
- package/src/renderers/opentui/terminal-media.ts +234 -0
- package/src/renderers/opentui/test-utils.tsx +310 -0
- package/src/renderers/opentui/toast-host.tsx +129 -0
- package/src/renderers/opentui/ui-host.tsx +271 -0
- package/src/renderers/share/chart.ts +74 -0
- package/src/renderers/share/layout-view.tsx +133 -0
- package/src/renderers/share/main.tsx +110 -0
- package/src/renderers/share/styles.css +83 -0
- package/src/renderers/share/view.tsx +159 -0
- package/src/series/capability.ts +76 -0
- package/src/series/csv.ts +160 -0
- package/src/series/files.ts +113 -0
- package/src/series/registry.ts +225 -0
- package/src/series/resolve.ts +227 -0
- package/src/series/standalone.ts +77 -0
- package/src/series/types.ts +220 -0
- package/src/series/validate.ts +216 -0
- package/src/shares/api.ts +150 -0
- package/src/shares/bug-report-dialog.tsx +162 -0
- package/src/shares/bug-report-flow.tsx +81 -0
- package/src/shares/bug-report.ts +42 -0
- package/src/shares/capture-flow.ts +20 -0
- package/src/shares/capture-preview.tsx +129 -0
- package/src/shares/chat.ts +23 -0
- package/src/shares/flow.tsx +98 -0
- package/src/shares/location.ts +40 -0
- package/src/shares/open.ts +26 -0
- package/src/shares/pane-image.ts +166 -0
- package/src/shares/pane.ts +60 -0
- package/src/shares/payload.ts +206 -0
- package/src/shares/personal-pane.ts +86 -0
- package/src/shares/portable-layout.ts +734 -0
- package/src/shares/prepare.ts +20 -0
- package/src/shares/ready.ts +42 -0
- package/src/shares/test-harness.ts +62 -0
- package/src/sources/gloomberb-cloud/batched-lookups.ts +73 -0
- package/src/sources/gloomberb-cloud/fred-series.ts +202 -0
- package/src/sources/gloomberb-cloud/index.ts +987 -0
- package/src/sources/gloomberb-cloud/news.ts +210 -0
- package/src/sources/gloomberb-cloud/normalizers.ts +464 -0
- package/src/sources/gloomberb-cloud/perpetuals.ts +316 -0
- package/src/sources/history-coverage.ts +56 -0
- package/src/sources/history-omitted.ts +34 -0
- package/src/sources/history-result.ts +88 -0
- package/src/sources/history-retention.ts +177 -0
- package/src/sources/listing-symbols.ts +206 -0
- package/src/sources/listing-target.ts +45 -0
- package/src/sources/provider-errors.ts +170 -0
- package/src/sources/provider-router/batches.ts +233 -0
- package/src/sources/provider-router/brokers.ts +104 -0
- package/src/sources/provider-router/cache.ts +229 -0
- package/src/sources/provider-router/cached-routes.ts +261 -0
- package/src/sources/provider-router/connection-health.ts +48 -0
- package/src/sources/provider-router/financial-routes.ts +383 -0
- package/src/sources/provider-router/financials.ts +627 -0
- package/src/sources/provider-router/history.ts +973 -0
- package/src/sources/provider-router/index.ts +713 -0
- package/src/sources/provider-router/news.ts +51 -0
- package/src/sources/provider-router/primary.ts +228 -0
- package/src/sources/provider-router/quote-route.ts +70 -0
- package/src/sources/provider-router/realtime-access.ts +64 -0
- package/src/sources/provider-router/route-types.ts +34 -0
- package/src/sources/provider-router/routing.ts +44 -0
- package/src/sources/provider-router/search.ts +272 -0
- package/src/sources/provider-router/sources.ts +55 -0
- package/src/sources/provider-router/statement-history.ts +15 -0
- package/src/sources/provider-router/streaming.ts +359 -0
- package/src/sources/provider-router/supplemental.ts +53 -0
- package/src/sources/provider-router/test-support.ts +47 -0
- package/src/sources/sec-edgar/acceptance-time.ts +11 -0
- package/src/sources/sec-edgar/content.ts +207 -0
- package/src/sources/sec-edgar/fourth-quarter.ts +179 -0
- package/src/sources/sec-edgar/identity.ts +36 -0
- package/src/sources/sec-edgar.ts +890 -0
- package/src/sources/sec-registrant.ts +75 -0
- package/src/state/app/activity.ts +216 -0
- package/src/state/app/bootstrap.ts +418 -0
- package/src/state/app/context/index.tsx +656 -0
- package/src/state/app/input-capture.ts +12 -0
- package/src/state/app/tab-cursor.ts +222 -0
- package/src/state/config-save-scheduler.ts +38 -0
- package/src/state/hooks/inline-ticker-failures.ts +100 -0
- package/src/state/hooks/inline-tickers.ts +545 -0
- package/src/state/hooks/live-streaming.ts +60 -0
- package/src/state/hooks/live-ticker-financials.ts +171 -0
- package/src/state/hooks/pane-ticker.ts +58 -0
- package/src/state/hooks/quote-streaming.ts +326 -0
- package/src/state/hooks/session-snapshot.ts +101 -0
- package/src/state/pane-scroll-registry.tsx +299 -0
- package/src/state/pane-table-export-registry.ts +50 -0
- package/src/state/persist-scheduler.ts +123 -0
- package/src/state/ticker-cleanup.ts +50 -0
- package/src/state/ticker-refresh-queue.ts +89 -0
- package/src/sync/auth-transition.ts +32 -0
- package/src/sync/baseline.ts +43 -0
- package/src/sync/controller.ts +575 -0
- package/src/sync/core-contributors.ts +1550 -0
- package/src/sync/local-only.ts +121 -0
- package/src/sync/profile-analytics.ts +42 -0
- package/src/sync/react.ts +89 -0
- package/src/sync/types.ts +142 -0
- package/src/team/collections-sync.ts +235 -0
- package/src/team/collections.ts +369 -0
- package/src/team/model.ts +210 -0
- package/src/team/pane-request.ts +30 -0
- package/src/team/store.ts +324 -0
- package/src/telemetry/attention-counts.ts +170 -0
- package/src/telemetry/benign-window-error.ts +7 -0
- package/src/telemetry/crash-reports-dom.ts +79 -0
- package/src/telemetry/crash-reports-node.ts +173 -0
- package/src/telemetry/crash-reports.ts +373 -0
- package/src/telemetry/live-config.ts +26 -0
- package/src/telemetry/stall-reports-dom.ts +38 -0
- package/src/telemetry/stall-reports-node.ts +75 -0
- package/src/telemetry/stall-reports.ts +214 -0
- package/src/telemetry/update-failures-node.ts +59 -0
- package/src/telemetry/update-failures.ts +307 -0
- package/src/telemetry/usage-counts-dom.ts +22 -0
- package/src/telemetry/usage-counts.ts +393 -0
- package/src/test-support/app-store.ts +21 -0
- package/src/test-support/broker.ts +81 -0
- package/src/test-support/builtin-panes.ts +31 -0
- package/src/test-support/cli-context.ts +37 -0
- package/src/test-support/cloud-api.ts +85 -0
- package/src/test-support/config-store.ts +31 -0
- package/src/test-support/console.ts +40 -0
- package/src/test-support/daily-nav.ts +25 -0
- package/src/test-support/data-provider.ts +85 -0
- package/src/test-support/headless.ts +32 -0
- package/src/test-support/margin-account.ts +108 -0
- package/src/test-support/market-session.ts +12 -0
- package/src/test-support/moved-symbols.ts +64 -0
- package/src/test-support/network-guard.ts +35 -0
- package/src/test-support/news.ts +21 -0
- package/src/test-support/pane.tsx +72 -0
- package/src/test-support/plugin-persistence.ts +112 -0
- package/src/test-support/plugin-runtime.ts +145 -0
- package/src/test-support/preload.ts +14 -0
- package/src/test-support/quote-store.ts +49 -0
- package/src/test-support/renderer-host.ts +10 -0
- package/src/test-support/rpc-loopback.ts +26 -0
- package/src/test-support/shell-pane-keys.tsx +36 -0
- package/src/test-support/temp-db.ts +19 -0
- package/src/test-support/ticker.ts +15 -0
- package/src/test-support/time-series.ts +27 -0
- package/src/theme/color-utils.ts +126 -0
- package/src/theme/colors.ts +311 -0
- package/src/theme/font-scale.ts +71 -0
- package/src/theme/heat-colors.ts +455 -0
- package/src/theme/series-colors.ts +46 -0
- package/src/theme/theme-context.tsx +44 -0
- package/src/theme/themes.ts +822 -0
- package/src/theme/ui-tokens.ts +107 -0
- package/src/tickers/batched-lookups.ts +186 -0
- package/src/tickers/company-name-listing.ts +276 -0
- package/src/tickers/company-name.ts +231 -0
- package/src/tickers/index-roots.ts +47 -0
- package/src/tickers/instrument-coverage.ts +112 -0
- package/src/tickers/instrument-kind.ts +165 -0
- package/src/tickers/instrument-label.ts +15 -0
- package/src/tickers/list.ts +36 -0
- package/src/tickers/listing-fate.ts +331 -0
- package/src/tickers/listing-name.ts +34 -0
- package/src/tickers/listing-venues.ts +208 -0
- package/src/tickers/metadata.ts +74 -0
- package/src/tickers/open-target.ts +183 -0
- package/src/tickers/perpetual-listing.ts +154 -0
- package/src/tickers/prediction-listing.ts +26 -0
- package/src/tickers/search/asset-classes.ts +106 -0
- package/src/tickers/search/bare-symbol.ts +36 -0
- package/src/tickers/search/home-listing.ts +75 -0
- package/src/tickers/search/identity.ts +19 -0
- package/src/tickers/search/index.ts +977 -0
- package/src/tickers/search/ranking.ts +1002 -0
- package/src/tickers/search/result.ts +27 -0
- package/src/tickers/search/types.ts +63 -0
- package/src/tickers/search/upsert.ts +156 -0
- package/src/tickers/selection.ts +21 -0
- package/src/tickers/starter-symbols.ts +8 -0
- package/src/tickers/terminal-codes.ts +474 -0
- package/src/tickers/ticker-changes.ts +301 -0
- package/src/tickers/tokenizer.ts +37 -0
- package/src/tickers/us-listing.ts +35 -0
- package/src/time-series/alignment.ts +173 -0
- package/src/time-series/bar-aggregation.ts +243 -0
- package/src/time-series/bar-spacing.ts +19 -0
- package/src/time-series/base-series.ts +315 -0
- package/src/time-series/chart-bounds.ts +349 -0
- package/src/time-series/chart-data.ts +329 -0
- package/src/time-series/chart-seed.ts +142 -0
- package/src/time-series/daily-valuation.ts +62 -0
- package/src/time-series/date-window.ts +41 -0
- package/src/time-series/economic.ts +106 -0
- package/src/time-series/field-catalog.ts +318 -0
- package/src/time-series/filed-trailing-eps.ts +197 -0
- package/src/time-series/financial-period-coverage.ts +59 -0
- package/src/time-series/forward-valuation.ts +285 -0
- package/src/time-series/fundamentals.ts +1275 -0
- package/src/time-series/history-acquisition.ts +499 -0
- package/src/time-series/history-quality.ts +68 -0
- package/src/time-series/history-window.ts +21 -0
- package/src/time-series/hooks.ts +88 -0
- package/src/time-series/ice-credit.ts +57 -0
- package/src/time-series/leverage.ts +100 -0
- package/src/time-series/live-bars.ts +428 -0
- package/src/time-series/live-quotes.ts +234 -0
- package/src/time-series/market-resolution.ts +55 -0
- package/src/time-series/market.ts +177 -0
- package/src/time-series/parsed-history-cache.ts +79 -0
- package/src/time-series/price-comparison.ts +346 -0
- package/src/time-series/price-units.ts +139 -0
- package/src/time-series/range.ts +29 -0
- package/src/time-series/reporting-currency.ts +37 -0
- package/src/time-series/reporting.ts +134 -0
- package/src/time-series/resolution.ts +554 -0
- package/src/time-series/resolve-context.ts +163 -0
- package/src/time-series/resolve.ts +1190 -0
- package/src/time-series/series-name.ts +38 -0
- package/src/time-series/series-presentation.ts +242 -0
- package/src/time-series/session-bar.ts +149 -0
- package/src/time-series/spec.ts +558 -0
- package/src/time-series/studies.ts +1628 -0
- package/src/time-series/tail-reconcile.ts +121 -0
- package/src/time-series/total-return.ts +160 -0
- package/src/time-series/trader-studies.ts +188 -0
- package/src/time-series/transforms.ts +173 -0
- package/src/time-series/types.ts +346 -0
- package/src/time-series/use-chart-resolution.ts +549 -0
- package/src/time-series/valuation-currency.ts +48 -0
- package/src/time-series/valuation-price.ts +81 -0
- package/src/time-series/valuation-releases.ts +39 -0
- package/src/types/broker.ts +237 -0
- package/src/types/capability-route-source.ts +25 -0
- package/src/types/config.ts +1046 -0
- package/src/types/context-menu.ts +101 -0
- package/src/types/data-provider.ts +355 -0
- package/src/types/desktop-deeplink.ts +8 -0
- package/src/types/desktop-menu.ts +16 -0
- package/src/types/desktop-window.ts +39 -0
- package/src/types/exchange-rate.ts +19 -0
- package/src/types/financials.ts +1108 -0
- package/src/types/headless.ts +782 -0
- package/src/types/instrument.ts +90 -0
- package/src/types/issuer-listings.ts +28 -0
- package/src/types/news-source.ts +9 -0
- package/src/types/persistence.ts +22 -0
- package/src/types/plugin.ts +1160 -0
- package/src/types/price-history.ts +52 -0
- package/src/types/ticker-changes.ts +45 -0
- package/src/types/ticker.ts +126 -0
- package/src/types/trading.ts +253 -0
- package/src/ui/ascii-font.ts +97 -0
- package/src/ui/context-menu.tsx +481 -0
- package/src/ui/dialog-bridge.tsx +50 -0
- package/src/ui/dialog-context.ts +24 -0
- package/src/ui/dialog-stack.ts +126 -0
- package/src/ui/dialog.tsx +98 -0
- package/src/ui/host.tsx +830 -0
- package/src/ui/index.tsx +313 -0
- package/src/ui/live-resize.ts +91 -0
- package/src/ui/live-stretch.ts +153 -0
- package/src/ui/measured-cells.ts +64 -0
- package/src/ui/pointer-drag.ts +12 -0
- package/src/ui/qr.ts +84 -0
- package/src/ui/resize-settle.ts +128 -0
- package/src/ui/scroll-box-axis.ts +26 -0
- package/src/ui/sticky-scroll.ts +7 -0
- package/src/ui/toast.tsx +147 -0
- package/src/updater/channel.ts +51 -0
- package/src/updater/command-names.ts +180 -0
- package/src/updater/failure.ts +166 -0
- package/src/updater/github-releases.ts +142 -0
- package/src/updater/index.ts +677 -0
- package/src/utils/asset-category.ts +20 -0
- package/src/utils/async-deadline.ts +81 -0
- package/src/utils/back-navigation.ts +52 -0
- package/src/utils/base-currency.ts +108 -0
- package/src/utils/basis-points.ts +17 -0
- package/src/utils/broker-instances.ts +47 -0
- package/src/utils/calendar-date.ts +163 -0
- package/src/utils/cash-runway.ts +241 -0
- package/src/utils/central-banks.ts +118 -0
- package/src/utils/cli-output.ts +687 -0
- package/src/utils/concurrency.ts +25 -0
- package/src/utils/contract-month.ts +16 -0
- package/src/utils/crypto-pair.ts +163 -0
- package/src/utils/csv.ts +54 -0
- package/src/utils/currency-names.ts +128 -0
- package/src/utils/currency-pair.ts +112 -0
- package/src/utils/currency-units.ts +255 -0
- package/src/utils/datetime-format.ts +174 -0
- package/src/utils/debug-log.ts +201 -0
- package/src/utils/decimal-comma.ts +238 -0
- package/src/utils/declared-dividends.ts +39 -0
- package/src/utils/depositary-receipt.ts +70 -0
- package/src/utils/display-number.ts +63 -0
- package/src/utils/dividend-cash.ts +48 -0
- package/src/utils/dom-screenshot-css.ts +265 -0
- package/src/utils/dom-screenshot-rasters.ts +278 -0
- package/src/utils/dom-screenshot.ts +860 -0
- package/src/utils/double-escape-close.ts +82 -0
- package/src/utils/errors.ts +4 -0
- package/src/utils/exchange-announcements.ts +71 -0
- package/src/utils/exchange-notation.generated.ts +360 -0
- package/src/utils/exchange-rate-snapshot.ts +82 -0
- package/src/utils/exchanges.ts +214 -0
- package/src/utils/external-url.ts +24 -0
- package/src/utils/financial-statements.ts +342 -0
- package/src/utils/fire-and-forget.ts +24 -0
- package/src/utils/fiscal-period.ts +47 -0
- package/src/utils/format.ts +446 -0
- package/src/utils/forward-dividend.ts +218 -0
- package/src/utils/fundamentals.ts +290 -0
- package/src/utils/futures-generic.ts +221 -0
- package/src/utils/fuzzy-search.ts +105 -0
- package/src/utils/fx-market-hours.ts +118 -0
- package/src/utils/fx-status.ts +47 -0
- package/src/utils/guards.ts +62 -0
- package/src/utils/hash.ts +23 -0
- package/src/utils/html-entities.ts +45 -0
- package/src/utils/http-proxy-response.ts +257 -0
- package/src/utils/http-transport.ts +31 -0
- package/src/utils/income-statement.ts +46 -0
- package/src/utils/inline-content-tokenizer.ts +116 -0
- package/src/utils/instrument-identity.ts +72 -0
- package/src/utils/keyboard.ts +31 -0
- package/src/utils/latest-financial-period.ts +34 -0
- package/src/utils/link-tokenizer.ts +93 -0
- package/src/utils/linux-libc.ts +54 -0
- package/src/utils/local-utc-offset.ts +39 -0
- package/src/utils/log-failure.ts +31 -0
- package/src/utils/main-thread-stall.ts +97 -0
- package/src/utils/markdown.ts +180 -0
- package/src/utils/market-capitalization.ts +207 -0
- package/src/utils/math.ts +12 -0
- package/src/utils/max-drawdown.ts +64 -0
- package/src/utils/network-failure.ts +86 -0
- package/src/utils/object-version.ts +17 -0
- package/src/utils/one-shot.ts +73 -0
- package/src/utils/option-expiry.ts +321 -0
- package/src/utils/options.ts +170 -0
- package/src/utils/perf-marks.ts +96 -0
- package/src/utils/platform.ts +34 -0
- package/src/utils/plugin-proxy-hosts.json +23 -0
- package/src/utils/plugin-proxy-hosts.ts +28 -0
- package/src/utils/price-earnings.ts +86 -0
- package/src/utils/price-history-integrity.ts +127 -0
- package/src/utils/price-history.ts +534 -0
- package/src/utils/price-window.ts +131 -0
- package/src/utils/release-date.ts +47 -0
- package/src/utils/reported-money.ts +35 -0
- package/src/utils/rpc-timeout-error.ts +31 -0
- package/src/utils/save-text-file.ts +36 -0
- package/src/utils/screenshot-watermark.ts +27 -0
- package/src/utils/search-focus-navigation.ts +24 -0
- package/src/utils/sec-eps-basis.ts +294 -0
- package/src/utils/sec-filings.ts +245 -0
- package/src/utils/sec.ts +258 -0
- package/src/utils/selection-clipboard.ts +99 -0
- package/src/utils/semver.ts +108 -0
- package/src/utils/shell-word.ts +8 -0
- package/src/utils/shortcut-labels.ts +42 -0
- package/src/utils/slugify.ts +4 -0
- package/src/utils/sort-values.ts +78 -0
- package/src/utils/statement-gaps.ts +94 -0
- package/src/utils/text-wrap.ts +107 -0
- package/src/utils/throttled-fetch.ts +253 -0
- package/src/utils/timestamp.ts +54 -0
- package/src/utils/trailing-dividend.ts +179 -0
- package/src/utils/trailing-eps.ts +67 -0
- package/src/utils/typed-text.ts +21 -0
- package/src/utils/typo-distance.ts +22 -0
- package/src/utils/url.ts +12 -0
- package/src/utils/utc-time.ts +183 -0
- package/src/utils/zoned-date-time.ts +146 -0
- package/src/version.ts +9 -0
|
@@ -0,0 +1,1529 @@
|
|
|
1
|
+
import { logFailure } from "../utils/log-failure";
|
|
2
|
+
import type { DataProvider } from "../types/data-provider";
|
|
3
|
+
import type { Quote } from "../types/financials";
|
|
4
|
+
import type { CliCommandContext } from "../types/plugin";
|
|
5
|
+
import type { TickerRecord } from "../types/ticker";
|
|
6
|
+
import { perpetualListingOfMarket, typedPerpetualListing } from "../tickers/perpetual-listing";
|
|
7
|
+
import {
|
|
8
|
+
listingVenues,
|
|
9
|
+
quotedOnVenue,
|
|
10
|
+
readAmbiguousCurrencyPair,
|
|
11
|
+
readSharedCode,
|
|
12
|
+
savedRowOfBareSymbol,
|
|
13
|
+
type ListingDeps,
|
|
14
|
+
type ListingStore,
|
|
15
|
+
type ListingVenue,
|
|
16
|
+
} from "../tickers/listing-venues";
|
|
17
|
+
import { findUsListingOfCompany, type UsListing } from "../tickers/us-listing";
|
|
18
|
+
import { findListingOfCompanyName, isCompanyNameInput, readTerminalCodeArg, type CompanyNameListing } from "../tickers/company-name-listing";
|
|
19
|
+
import { movedAwayChange, startTickerChangeLookup, type MovedTickerChange } from "../tickers/ticker-changes";
|
|
20
|
+
import { loadListingFate, MovedSymbolError, type ListingFate } from "../tickers/listing-fate";
|
|
21
|
+
import { quotedListingName } from "../tickers/listing-name";
|
|
22
|
+
import { cliStyles } from "../utils/cli-output";
|
|
23
|
+
import { groupByCompany, namesDepositaryReceipt, sameCompany, sameListedName, shortCompanyName } from "../tickers/company-name";
|
|
24
|
+
import {
|
|
25
|
+
canonicalExchange,
|
|
26
|
+
exchangeCodeVenues,
|
|
27
|
+
exchangeLabel,
|
|
28
|
+
isKnownExchangeCode,
|
|
29
|
+
isSharedExchangeCode,
|
|
30
|
+
isUsListingExchange,
|
|
31
|
+
parsePublicTickerKey,
|
|
32
|
+
publicTickerKey,
|
|
33
|
+
typedExchangeCode,
|
|
34
|
+
} from "../utils/exchanges";
|
|
35
|
+
import { withMarketData } from "./scoped-context";
|
|
36
|
+
import { failWithFields } from "./errors";
|
|
37
|
+
import { stripStrayEdges } from "./symbol-args";
|
|
38
|
+
import { isNoProviderMessage, isNoSourceAnswer, isProviderBusy } from "../sources/provider-errors";
|
|
39
|
+
import { dashedCoinPair, MAJOR_COIN_NAMES } from "../utils/crypto-pair";
|
|
40
|
+
import { boardCoinFor, primeBoardCoins } from "./board-coins";
|
|
41
|
+
import { knownGapMessage } from "./known-gaps";
|
|
42
|
+
import { currencyPairSpelling } from "../utils/currency-pair";
|
|
43
|
+
import { bareFuturesCode, futuresContractByCode } from "../market-data/futures-board";
|
|
44
|
+
import { classifyInstrumentType, kindFromListingSyntax } from "../tickers/instrument-kind";
|
|
45
|
+
import type { InstrumentOfKind } from "../tickers/instrument-coverage";
|
|
46
|
+
import { brokerIndexCode, brokerIndexReadAs } from "./index-roots";
|
|
47
|
+
import {
|
|
48
|
+
bloombergCodeOf,
|
|
49
|
+
bloombergMarketHint,
|
|
50
|
+
endsInLegalForm,
|
|
51
|
+
isSearchOnlyVenue,
|
|
52
|
+
readLondonDottedSymbol,
|
|
53
|
+
readNearMissListing,
|
|
54
|
+
readTerminalListingCode,
|
|
55
|
+
terminalCodeReadAs,
|
|
56
|
+
unknownBloombergMarket,
|
|
57
|
+
type NearMissListing,
|
|
58
|
+
type TerminalListingCode,
|
|
59
|
+
} from "../tickers/terminal-codes";
|
|
60
|
+
import { listingAbroadVenue } from "../utils/sec";
|
|
61
|
+
import { savedAbroadForBareSymbol, savedUsListingOf } from "../tickers/search/bare-symbol";
|
|
62
|
+
import { listingSuffixCandidate, listingSuffixVenue, tickerHasListingSuffix } from "../sources/listing-symbols";
|
|
63
|
+
import { notTheCoinNote } from "./commands/crypto-hints";
|
|
64
|
+
|
|
65
|
+
/** The `--exchange` option of every command that takes a ticker. */
|
|
66
|
+
export const EXCHANGE_OPTION = {
|
|
67
|
+
flags: "--exchange <code>",
|
|
68
|
+
description: "Listing exchange, for a symbol that trades in several places (same as SYMBOL:CODE)",
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
/** One listing a symbol's question names: BDI:TSX and its company. */
|
|
72
|
+
export interface ListingChoice {
|
|
73
|
+
key: string;
|
|
74
|
+
name: string | null;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export class ListingArgError extends Error {
|
|
78
|
+
constructor(
|
|
79
|
+
message: string,
|
|
80
|
+
readonly details?: string,
|
|
81
|
+
/** The listings it asks to choose between, when it asks which. */
|
|
82
|
+
readonly choices?: readonly ListingChoice[],
|
|
83
|
+
) {
|
|
84
|
+
super(message);
|
|
85
|
+
this.name = "ListingArgError";
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export interface ListingArg {
|
|
90
|
+
/** The symbol without a venue: SAN. */
|
|
91
|
+
symbol: string;
|
|
92
|
+
/** The canonical code of the exchange the user named, or "" when none was. */
|
|
93
|
+
exchange: string;
|
|
94
|
+
/** SAN:EPA, or SAN when no exchange was named. */
|
|
95
|
+
key: string;
|
|
96
|
+
/**
|
|
97
|
+
* The code as typed when it names several venues (TSE: Toronto or Tokyo),
|
|
98
|
+
* until `resolveCliListing` reads it as the one the symbol trades on.
|
|
99
|
+
* `exchange` is meanwhile the code's first venue.
|
|
100
|
+
*/
|
|
101
|
+
sharedCode?: string;
|
|
102
|
+
/** What a shared code was read as, when not its first venue: "Read 7203:TSE as 7203:JPX: ...". */
|
|
103
|
+
readAs?: string;
|
|
104
|
+
/**
|
|
105
|
+
* The company's common stock a name read as a fund or an index means
|
|
106
|
+
* (`CompanyNameListing.meant`): JPM for "JP Morgan" read as ^JTEK:NIM.
|
|
107
|
+
* `readAs` asks about it, and a command the listing fails asks too.
|
|
108
|
+
*/
|
|
109
|
+
meant?: { symbol: string; name: string };
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/** "Did you mean JPM (JPMorgan Chase & Co.)?", for a name read as a fund or an index; empty for any other listing. */
|
|
113
|
+
export function meantQuestion(listing: Pick<ListingArg, "meant">): string {
|
|
114
|
+
const meant = listing.meant;
|
|
115
|
+
if (!meant) return "";
|
|
116
|
+
return `Did you mean ${meant.name && meant.name.toUpperCase() !== meant.symbol ? `${meant.symbol} (${meant.name})` : meant.symbol}?`;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* `SAN:EPA` and `SAN --exchange EPA` name the same listing. Both spellings of
|
|
121
|
+
* an exchange go through the app's alias table, so `SAN:XPAR` is `SAN:EPA`.
|
|
122
|
+
* A symbol's own exchange and `--exchange` that disagree are an error, unless
|
|
123
|
+
* the command takes several symbols and `--exchange` only fills in the ones
|
|
124
|
+
* without an exchange of their own. A code that names several venues (TSE)
|
|
125
|
+
* agrees with any of them. A futures board code no listed security uses is
|
|
126
|
+
* its future: TTF is TTF=F, while NG stays NovaGold. A currency pair is the
|
|
127
|
+
* one listing the service has for it, however it is written: EUR/USD,
|
|
128
|
+
* EURUSD:CCY and JPY=X are EURUSD=X and USDJPY=X, so every spelling asks for
|
|
129
|
+
* the same quote. USD-NGN and USDNGN could be a security's symbol, so
|
|
130
|
+
* `resolveCliListing` asks search before reading them as USDNGN=X.
|
|
131
|
+
*/
|
|
132
|
+
export function parseListingArg(
|
|
133
|
+
rawArg: string,
|
|
134
|
+
exchangeOption?: string | null,
|
|
135
|
+
{ ownExchangeWins = false, terminalCode, listingSuffix = false }: {
|
|
136
|
+
ownExchangeWins?: boolean;
|
|
137
|
+
/**
|
|
138
|
+
* The terminal code `readTerminalCodeArg` read the text as, or null for
|
|
139
|
+
* words that read as a Bloomberg code but are a name. Read here when not given.
|
|
140
|
+
*/
|
|
141
|
+
terminalCode?: TerminalListingCode | null;
|
|
142
|
+
/**
|
|
143
|
+
* Read a vendor's venue suffix as the venue it names (GARAN.IS as
|
|
144
|
+
* GARAN:BIST, `listingSuffixVenue`), so what is saved, found or removed is
|
|
145
|
+
* the listing's one row. Commands that store a listing ask for it.
|
|
146
|
+
*/
|
|
147
|
+
listingSuffix?: boolean;
|
|
148
|
+
} = {},
|
|
149
|
+
): ListingArg {
|
|
150
|
+
// A pasted ticker can bring the separator or quote marks that sat beside it (`UPST;`); search would ask for them.
|
|
151
|
+
const stripped = stripStrayEdges(rawArg);
|
|
152
|
+
const raw = stripped.text || rawArg;
|
|
153
|
+
// A terminal's code (WFC.N, "VOD LN", "JPM US Equity") is that listing (WFC:NYSE, VOD:LSE, JPM), and a symbol
|
|
154
|
+
// written nearly as one is (700.HK, 6758.JP, BRK/B) its working form (0700.HK, 6758.T, BRK-B).
|
|
155
|
+
const terminal = terminalCode === undefined ? readTerminalListingCode(raw) : terminalCode;
|
|
156
|
+
const nearMiss = terminal ? null : readNearMissListing(raw);
|
|
157
|
+
const reading = terminal ?? (nearMiss ? { typed: nearMiss.typed, key: nearMiss.symbol } : null);
|
|
158
|
+
const parsed = parseCleanListingArg(reading?.key ?? raw, exchangeOption, { ownExchangeWins });
|
|
159
|
+
const listing = listingSuffix ? readListingSuffix(parsed) ?? parsed : parsed;
|
|
160
|
+
const notes = [...stripped.text ? stripped.notes : [], ...reading ? [terminalCodeReadAs(reading)] : []];
|
|
161
|
+
return notes.length > 0 ? { ...listing, readAs: notes.join(" ") } : listing;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
function parseCleanListingArg(
|
|
165
|
+
raw: string,
|
|
166
|
+
exchangeOption: string | null | undefined,
|
|
167
|
+
{ ownExchangeWins }: { ownExchangeWins: boolean },
|
|
168
|
+
): ListingArg {
|
|
169
|
+
const optionCode = (exchangeOption ?? "").trim().toUpperCase();
|
|
170
|
+
const option = canonicalExchange(optionCode);
|
|
171
|
+
// VIX.X and $VIX.X, a broker's code for an index, are its own symbol ^VIX; $VIX is read in `resolveCliListing`.
|
|
172
|
+
const index = option ? null : brokerIndexCode(raw);
|
|
173
|
+
if (index && !index.bare) return { symbol: index.symbol, exchange: "", key: index.symbol, readAs: brokerIndexReadAs(index) };
|
|
174
|
+
// A perpetual's market id (binance:BZUSDT, as PERP names it) is its listing on that venue (BZUSDT:BINANCE).
|
|
175
|
+
let typed = (typedPerpetualListing(raw)?.key ?? raw).trim().replace(/^\$/, "").toUpperCase();
|
|
176
|
+
// `SAN:` asks which listing; with --exchange it has its answer.
|
|
177
|
+
if (option && typed.endsWith(":")) typed = typed.slice(0, -1);
|
|
178
|
+
const venueKey = parsePublicTickerKey(typed);
|
|
179
|
+
// BTC/USD, as crypto venues write a pair, is the coin's own BTC-USD.
|
|
180
|
+
const parsed = { ...venueKey, symbol: dashedCoinPair(venueKey.symbol) ?? venueKey.symbol };
|
|
181
|
+
const ownCode = parsed.exchange ? typedExchangeCode(typed) : "";
|
|
182
|
+
let exchange = parsed.exchange ?? option;
|
|
183
|
+
let code = ownCode || optionCode;
|
|
184
|
+
if (parsed.exchange && option) {
|
|
185
|
+
const named = exchangeCodeVenues(optionCode);
|
|
186
|
+
const agreed = exchangeCodeVenues(ownCode).filter((venue) => named.includes(venue));
|
|
187
|
+
if (agreed.length === 0 && !ownExchangeWins) {
|
|
188
|
+
throw new ListingArgError(
|
|
189
|
+
`${typed} names exchange ${parsed.exchange}, but --exchange names ${option}.`,
|
|
190
|
+
`Name the exchange once, as ${parsed.symbol}:${parsed.exchange} or ${parsed.symbol} --exchange ${option}.`,
|
|
191
|
+
);
|
|
192
|
+
}
|
|
193
|
+
// TSE and --exchange JPX agree on Tokyo.
|
|
194
|
+
if (agreed.length === 1) [exchange, code] = [agreed[0]!, agreed[0]!];
|
|
195
|
+
}
|
|
196
|
+
const pair = currencyPairSpelling(parsed.symbol, exchange);
|
|
197
|
+
if (pair && !pair.ambiguous) return { symbol: pair.symbol, exchange: "", key: pair.symbol };
|
|
198
|
+
const shared = isSharedExchangeCode(code) ? { sharedCode: code } : {};
|
|
199
|
+
if (exchange) return { symbol: parsed.symbol, exchange, key: `${parsed.symbol}:${exchange}`, ...shared };
|
|
200
|
+
// A futures board code no security uses is its future: TTF is TTF=F.
|
|
201
|
+
const symbol = bareFuturesCode(parsed.symbol)?.symbol ?? parsed.symbol;
|
|
202
|
+
return { symbol, exchange, key: symbol };
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
export { listingVenues, type ListingDeps, type ListingVenue };
|
|
206
|
+
|
|
207
|
+
function tradesOn(symbol: string, venues: readonly ListingVenue[]): string {
|
|
208
|
+
return venues.length > 0 ? ` ${symbol} trades on: ${venues.map((venue) => venue.exchange).join(", ")}.` : "";
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/** "Toronto Stock Exchange (TSX) or Tokyo Stock Exchange (JPX)". */
|
|
212
|
+
function venueChoices(venues: readonly string[]): string {
|
|
213
|
+
const labels = venues.map(exchangeLabel);
|
|
214
|
+
return labels.length > 1 ? `${labels.slice(0, -1).join(", ")} or ${labels.at(-1)}` : labels[0] ?? "";
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
/**
|
|
218
|
+
* A listing typed with a code that names several venues (7203:TSE), read as
|
|
219
|
+
* the one of them its symbol trades on: the venues the `7203:` picker lists,
|
|
220
|
+
* else the one its own quote prices (search can leave a venue out). The
|
|
221
|
+
* listing says so in `readAs` when that is not the code's first venue. A
|
|
222
|
+
* symbol on several of them asks which; one on none of them says where it
|
|
223
|
+
* trades. When neither search nor a quote knows the symbol, the code's first
|
|
224
|
+
* venue stands and the request's own failure speaks.
|
|
225
|
+
*/
|
|
226
|
+
async function settleSharedCode(listing: ListingArg, deps: ListingDeps): Promise<ListingArg> {
|
|
227
|
+
const code = listing.sharedCode;
|
|
228
|
+
if (!code) return listing;
|
|
229
|
+
const { symbol } = listing;
|
|
230
|
+
const meanings = exchangeCodeVenues(code);
|
|
231
|
+
const reading = await readSharedCode(symbol, code, deps);
|
|
232
|
+
if (reading.kind === "several") {
|
|
233
|
+
throw new ListingArgError(
|
|
234
|
+
`${code} is ${venueChoices(meanings)}, and ${symbol} trades on ${reading.venues.join(" and ")}.`,
|
|
235
|
+
`Name one: ${reading.venues.map((venue) => `${symbol}:${venue}`).join(" or ")}.`,
|
|
236
|
+
);
|
|
237
|
+
}
|
|
238
|
+
if (reading.kind === "unknown") return listing;
|
|
239
|
+
if (reading.kind === "none") {
|
|
240
|
+
throw new ListingArgError(`${code} is ${venueChoices(meanings)}, and ${symbol} trades on none of them.${tradesOn(symbol, reading.venues)}`);
|
|
241
|
+
}
|
|
242
|
+
const { exchange } = reading;
|
|
243
|
+
const key = `${symbol}:${exchange}`;
|
|
244
|
+
const readAs = [
|
|
245
|
+
listing.readAs,
|
|
246
|
+
exchange === meanings[0] ? null : `Read ${symbol}:${code} as ${key}: ${code} is ${venueChoices(meanings)}, and ${symbol} trades on ${exchange}.`,
|
|
247
|
+
].filter(Boolean).join(" ");
|
|
248
|
+
return { symbol, exchange, key, ...readAs ? { readAs } : {} };
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
/**
|
|
252
|
+
* The keys a listing can be saved under: SAN:EPA, or for a code that names
|
|
253
|
+
* several venues (7203:TSE) each of theirs, as local rows are looked up before
|
|
254
|
+
* the code is read.
|
|
255
|
+
*/
|
|
256
|
+
export function listingKeys(listing: ListingArg): string[] {
|
|
257
|
+
return listing.sharedCode
|
|
258
|
+
? exchangeCodeVenues(listing.sharedCode).map((exchange) => `${listing.symbol}:${exchange}`)
|
|
259
|
+
: [listing.key];
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
/**
|
|
263
|
+
* An exchange code the app does not know is accepted only when the symbol is
|
|
264
|
+
* listed there, so a typo never falls back to another venue's line.
|
|
265
|
+
*/
|
|
266
|
+
async function checkListingExchange(listing: ListingArg, deps: ListingDeps): Promise<void> {
|
|
267
|
+
if (listing.symbol.endsWith(":")) {
|
|
268
|
+
const symbol = listing.symbol.slice(0, -1);
|
|
269
|
+
throw new ListingArgError(`Choose an exchange for ${symbol}.${tradesOn(symbol, await listingVenues(symbol, deps))}`);
|
|
270
|
+
}
|
|
271
|
+
if (!listing.exchange || isKnownExchangeCode(listing.exchange)) return;
|
|
272
|
+
// A row saved on that venue says it is real (GARAN:BIST, which the exchange table lacks), with no request.
|
|
273
|
+
if (await loadSavedListing(deps.store, listing)) return;
|
|
274
|
+
const venues = await listingVenues(listing.symbol, deps);
|
|
275
|
+
if (venues.some((venue) => venue.exchange === listing.exchange)) return;
|
|
276
|
+
// Search busy, or missing the venue: the listing's own quote there settles it, as `quote` reads it.
|
|
277
|
+
if (await quotedOnVenue(listing, deps)) return;
|
|
278
|
+
throw new ListingArgError(
|
|
279
|
+
`Unknown exchange ${listing.exchange} for ${listing.symbol}.${tradesOn(listing.symbol, venues)}`,
|
|
280
|
+
venues.length > 0 ? undefined : `No listings of ${listing.symbol} were found.`,
|
|
281
|
+
);
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
/**
|
|
285
|
+
* "SAN does not trade on TSX. SAN trades on: NYSE, EPA." for a listing whose
|
|
286
|
+
* exchange the symbol is not listed on, from the same picker `SAN:` opens.
|
|
287
|
+
* A venue the picker leaves out but the listing's quote prices (CAR:ASX) is
|
|
288
|
+
* traded, as `quote` says. Null when no exchange was named, when the symbol is
|
|
289
|
+
* listed there, or when its venues cannot be found, so the request's own
|
|
290
|
+
* failure stands. It searches, so ask only after a request came back empty.
|
|
291
|
+
*/
|
|
292
|
+
export async function notTradedMessage(
|
|
293
|
+
listing: Pick<ListingArg, "symbol" | "exchange">,
|
|
294
|
+
deps: ListingDeps,
|
|
295
|
+
): Promise<string | null> {
|
|
296
|
+
if (!listing.exchange) return null;
|
|
297
|
+
const venues = await listingVenues(listing.symbol, deps).catch(logFailure("cli.listing-arg", "Read listing venues failed", []));
|
|
298
|
+
if (venues.length === 0 || venues.some((venue) => venue.exchange === listing.exchange)) return null;
|
|
299
|
+
if (await quotedOnVenue(listing, deps)) return null;
|
|
300
|
+
return `${listing.symbol} does not trade on ${listing.exchange}.${tradesOn(listing.symbol, venues)}`;
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
/** Fails the command with `notTradedMessage`; returns when the symbol does trade there. */
|
|
304
|
+
export async function failIfNotTraded(
|
|
305
|
+
listing: Pick<ListingArg, "symbol" | "exchange">,
|
|
306
|
+
deps: ListingDeps,
|
|
307
|
+
ctx: Pick<CliCommandContext, "fail">,
|
|
308
|
+
): Promise<void> {
|
|
309
|
+
const message = await notTradedMessage(listing, deps);
|
|
310
|
+
if (message) ctx.fail(message);
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
/** What a command asked a listing for, to name it when the listing has none: `history` asks for "history". */
|
|
314
|
+
export interface ListingDataRequest {
|
|
315
|
+
/** The command a retry runs, with any options to repeat: `history`, `history --range 5Y`. */
|
|
316
|
+
command: string;
|
|
317
|
+
/** What the listing has none of: "history", "a quote". */
|
|
318
|
+
noun: string;
|
|
319
|
+
/**
|
|
320
|
+
* The retry for one listing, when the key does not go right after the
|
|
321
|
+
* command (`gloom watchlist add Growth SAN:EPA`); null names the listings alone.
|
|
322
|
+
*/
|
|
323
|
+
retry?: ((key: string) => string) | null;
|
|
324
|
+
/**
|
|
325
|
+
* What became of the symbol (`loadListingFate`), for a command a listing
|
|
326
|
+
* that stopped trading has nothing for (history, options): a request no
|
|
327
|
+
* source serves fails with `fate.note` instead of the source's miss, and the
|
|
328
|
+
* change line leads any listings the failure names. A symbol whose company
|
|
329
|
+
* moved, with nothing new listed under it, fails naming its new symbol
|
|
330
|
+
* whatever came back (`failMovedSymbol`).
|
|
331
|
+
*/
|
|
332
|
+
fate?: () => Promise<ListingFate>;
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
/**
|
|
336
|
+
* The router's answer when no source serves a symbol: "No history provider available for 2222",
|
|
337
|
+
* or "Not a ticker: 2222." when the service found no listing for it.
|
|
338
|
+
*/
|
|
339
|
+
export function isNoProviderError(error: unknown): boolean {
|
|
340
|
+
return isNoProviderMessage(error instanceof Error ? error.message : String(error ?? ""));
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
/**
|
|
344
|
+
* The router's answer that no source served a request because one failed (a
|
|
345
|
+
* timeout, a rate limit, a refused session) rather than missed: it says
|
|
346
|
+
* nothing about whether the symbol exists, unlike "Not a ticker".
|
|
347
|
+
*/
|
|
348
|
+
export function isUnsettledNoProvider(error: unknown): boolean {
|
|
349
|
+
return isNoProviderError(error) && !isNoSourceAnswer(error);
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
const MAX_OTHER_LISTINGS = 5;
|
|
353
|
+
|
|
354
|
+
type BareListing = Pick<CliListing, "symbol" | "exchange"> & Partial<Pick<CliListing, "saved">>;
|
|
355
|
+
|
|
356
|
+
/** Where a bare symbol went and where else it trades, in the order they are tried and named. */
|
|
357
|
+
interface BareListingVenues {
|
|
358
|
+
/** Canonical code of the venue the symbol went to; "" when it went nowhere (`choose`). */
|
|
359
|
+
exchange: string;
|
|
360
|
+
/** That venue as search lists it; null for a saved venue search no longer lists. */
|
|
361
|
+
resolved: ListingVenue | null;
|
|
362
|
+
/** The symbol's other venues, in search order; every venue when `choose`. */
|
|
363
|
+
others: ListingVenue[];
|
|
364
|
+
/** Several companies list the symbol, so no venue is the one it means: the user picks. */
|
|
365
|
+
choose: boolean;
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
/** Whether the venues' companies differ by name. A venue with no name is no other company. */
|
|
369
|
+
function listsSeveralCompanies(venues: readonly ListingVenue[]): boolean {
|
|
370
|
+
return groupByCompany(venues, (venue) => venue.name).length > 1;
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
/**
|
|
374
|
+
* Every other company or fund that lists the symbol, once, at its first venue
|
|
375
|
+
* in search order. A venue is another's only when its name says so: one with
|
|
376
|
+
* no name, or a depositary receipt named unlike the company (a CEDEAR's short
|
|
377
|
+
* form of its fund's name), is left out rather than guessed at, and one
|
|
378
|
+
* fund's venues are one fund however each words it (`sameListedName`).
|
|
379
|
+
*/
|
|
380
|
+
function otherCompanies(venues: readonly ListingVenue[], company: string): ListingVenue[] {
|
|
381
|
+
if (!company.trim()) return [];
|
|
382
|
+
const known = venues.filter((venue) => !namesDepositaryReceipt(venue.name) || sameListedName(venue.name, company));
|
|
383
|
+
return groupByCompany(known, (venue) => venue.name, sameListedName)
|
|
384
|
+
.filter((group) => !group.some((venue) => sameListedName(venue.name, company)))
|
|
385
|
+
.map((group) => group[0]!);
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
/**
|
|
389
|
+
* "CAR = Avis Budget Group, NASDAQ (different companies on XETRA, ASX)": the
|
|
390
|
+
* listing a bare symbol several companies list was read on, and where the
|
|
391
|
+
* others list it. Null when no other company is known to list it, so a symbol
|
|
392
|
+
* that means one thing (XLK, and its receipt in Buenos Aires) says nothing.
|
|
393
|
+
*/
|
|
394
|
+
export function listingChoiceNote(
|
|
395
|
+
symbol: string,
|
|
396
|
+
chosen: { exchange: string; name?: string | null },
|
|
397
|
+
venues: readonly ListingVenue[],
|
|
398
|
+
): string | null {
|
|
399
|
+
if (!chosen.exchange) return null;
|
|
400
|
+
const chosenVenue = venues.find((venue) => venue.exchange === chosen.exchange);
|
|
401
|
+
const name = chosen.name?.trim() || chosenVenue?.name || "";
|
|
402
|
+
const others = otherCompanies(venues, chosenVenue?.name || name).map((venue) => venue.exchange)
|
|
403
|
+
.filter((exchange) => exchange !== chosen.exchange);
|
|
404
|
+
if (others.length === 0) return null;
|
|
405
|
+
const more = others.length - MAX_OTHER_LISTINGS;
|
|
406
|
+
const named = `${others.slice(0, MAX_OTHER_LISTINGS).join(", ")}${more > 0 ? ` and ${more} more: gloom search ${symbol}` : ""}`;
|
|
407
|
+
const which = others.length === 1 ? "a different company" : "different companies";
|
|
408
|
+
return `${symbol} = ${name ? `${shortCompanyName(name)}, ` : ""}${chosen.exchange} (${which} on ${named})`;
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
// Quotes of these never name a company's listing, so they are never a choice between companies.
|
|
412
|
+
export const UNLISTED_TYPES = new Set(["FUTURE", "INDEX", "CURRENCY", "CRYPTOCURRENCY", "OPTION"]);
|
|
413
|
+
|
|
414
|
+
/** Whether the data service chose the listing: a bare symbol, with no venue named and none saved. */
|
|
415
|
+
function isBareListing(listing: Pick<CliListing, "exchange" | "saved">): boolean {
|
|
416
|
+
return !listing.exchange && !listing.saved;
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
/**
|
|
420
|
+
* The venues of a bare listing, started beside its data request so naming the
|
|
421
|
+
* choice costs no wait; null for a listing whose venue was named or saved.
|
|
422
|
+
*/
|
|
423
|
+
export function loadBareVenues(listing: Pick<CliListing, "symbol" | "exchange" | "saved">, deps: ListingDeps): Promise<ListingVenue[]> | null {
|
|
424
|
+
return isBareListing(listing) ? listingVenues(listing.symbol, deps).catch(logFailure("cli.listing-arg", "Read listing venues failed", [])) : null;
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
/** What the resolver read a typed listing as (7203:TSE as 7203:JPX), for a command's warnings. */
|
|
428
|
+
export function listingReadNotes(listing: Pick<ListingArg, "readAs">): string[] {
|
|
429
|
+
return listing.readAs ? [listing.readAs] : [];
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
/**
|
|
433
|
+
* The coin line for a bare coin ticker (SOL, ETH) a command read as a listing that is
|
|
434
|
+
* not the coin, from the quote it was read on (`notTheCoinNote`). A list, so a command can
|
|
435
|
+
* spread it into its warnings. A named listing (`ETH:ARCA`, `--exchange`) asked for that
|
|
436
|
+
* listing on purpose and gets none.
|
|
437
|
+
*/
|
|
438
|
+
export function coinListingNotes(
|
|
439
|
+
listing: Pick<CliListing, "symbol" | "exchange">,
|
|
440
|
+
quote: Pick<Quote, "name" | "instrumentType" | "stale" | "delisting"> | null | undefined,
|
|
441
|
+
): string[] {
|
|
442
|
+
const note = listing.exchange ? null : notTheCoinNote(listing.symbol, quote);
|
|
443
|
+
return note ? [note] : [];
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
/**
|
|
447
|
+
* `listingChoiceNote` for a listing a command resolved, from the quote it was
|
|
448
|
+
* read on: only a bare symbol went where the data service chose. A named
|
|
449
|
+
* listing whose code names several venues says which it was read as
|
|
450
|
+
* (`listingReadNotes`). A bare coin ticker read as another listing ends with
|
|
451
|
+
* the coin's pair (`coinListingNotes`). A list, so a command can spread it into
|
|
452
|
+
* its warnings.
|
|
453
|
+
*/
|
|
454
|
+
export async function listingChoiceNotes(
|
|
455
|
+
listing: Pick<CliListing, "symbol" | "exchange" | "saved" | "readAs">,
|
|
456
|
+
deps: ListingDeps,
|
|
457
|
+
quote: Pick<Quote, "name" | "listingExchangeName" | "exchangeName" | "instrumentType" | "stale" | "delisting"> | null | undefined,
|
|
458
|
+
/** The venues `loadBareVenues` already started; looked up here when not given. */
|
|
459
|
+
venues?: Promise<ListingVenue[]> | null,
|
|
460
|
+
): Promise<string[]> {
|
|
461
|
+
const coin = coinListingNotes(listing, quote);
|
|
462
|
+
if (!isBareListing(listing)) return [...listingReadNotes(listing), ...coin];
|
|
463
|
+
if (!quote || UNLISTED_TYPES.has(quote.instrumentType?.trim().toUpperCase() ?? "")) return coin;
|
|
464
|
+
const exchange = canonicalExchange(quote.listingExchangeName || quote.exchangeName);
|
|
465
|
+
if (!exchange) return coin;
|
|
466
|
+
const listed = await (venues ?? loadBareVenues(listing, deps) ?? []);
|
|
467
|
+
const note = listingChoiceNote(listing.symbol, { exchange, name: quote.name }, listed);
|
|
468
|
+
return [...note ? [note] : [], ...coin];
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
/**
|
|
472
|
+
* `listingChoiceNotes` for a command with no quote of its own to read the
|
|
473
|
+
* listing from (`fn`): it loads the listing's quote, and only for a bare
|
|
474
|
+
* symbol, so a named or saved listing costs nothing. A bare coin ticker read
|
|
475
|
+
* as another listing (BTC, the Grayscale trust) ends with the coin's pair.
|
|
476
|
+
*/
|
|
477
|
+
export async function quotedListingChoiceNotes(
|
|
478
|
+
listing: Pick<CliListing, "symbol" | "exchange" | "saved" | "request" | "readAs">,
|
|
479
|
+
deps: ListingDeps,
|
|
480
|
+
): Promise<string[]> {
|
|
481
|
+
const venues = loadBareVenues(listing, deps);
|
|
482
|
+
if (!venues) return listingReadNotes(listing);
|
|
483
|
+
return listingChoiceNotes(listing, deps, await loadListingQuote(deps.dataProvider, listing), venues);
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
/**
|
|
487
|
+
* The same company's line on a US exchange, under the same symbol: SAN:MCE's
|
|
488
|
+
* New York receipt. Null when the US line is another company (SAN:EPA is
|
|
489
|
+
* Sanofi, SAN in New York is Banco Santander) or there is none.
|
|
490
|
+
*/
|
|
491
|
+
export async function usLineOfListing(
|
|
492
|
+
listing: Pick<ListingArg, "symbol" | "exchange">,
|
|
493
|
+
company: string | null | undefined,
|
|
494
|
+
deps: ListingDeps,
|
|
495
|
+
): Promise<ListingVenue | null> {
|
|
496
|
+
if (!listing.exchange || isUsListingExchange(listing.exchange) || !company) return null;
|
|
497
|
+
const venues = await listingVenues(listing.symbol, deps).catch(logFailure("cli.listing-arg", "Read listing venues failed", []));
|
|
498
|
+
return venues.find((venue) => isUsListingExchange(venue.exchange) && sameCompany(venue.name, company)) ?? null;
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
/**
|
|
502
|
+
* The company's own listing on a US exchange: its line under the same symbol
|
|
503
|
+
* (SAN:MCE's New York receipt), else the one search finds by its name
|
|
504
|
+
* (Sanofi's SNY for SAN:EPA, Toyota's TM for 7203:JPX). Funds and contracts
|
|
505
|
+
* that carry its name are not its listing. Null for a listing in the US or
|
|
506
|
+
* with no venue, and when the company has no US line search knows.
|
|
507
|
+
*/
|
|
508
|
+
async function usListingOfCompany(
|
|
509
|
+
listing: Pick<ListingArg, "symbol" | "exchange">,
|
|
510
|
+
company: string | null | undefined,
|
|
511
|
+
deps: ListingDeps,
|
|
512
|
+
): Promise<UsListing | null> {
|
|
513
|
+
const sameSymbol = await usLineOfListing(listing, company, deps);
|
|
514
|
+
if (sameSymbol) return { ...sameSymbol, symbol: listing.symbol };
|
|
515
|
+
if (!listing.exchange || isUsListingExchange(listing.exchange)) return null;
|
|
516
|
+
return findUsListingOfCompany(deps.dataProvider, company);
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
/**
|
|
520
|
+
* What a function whose data covers US listings only (the US earnings board,
|
|
521
|
+
* US options and trades, FINRA short interest) says for a listing abroad,
|
|
522
|
+
* instead of a bare error or another company's numbers under the same
|
|
523
|
+
* symbol: "Time and sales covers US listings only, and SAN:EPA is Sanofi on
|
|
524
|
+
* Euronext Paris (EPA).", then the company's US listing with the command that
|
|
525
|
+
* asks for it ("Sanofi's US listing: SNY (try: gloom fn TAS SNY)"), or that
|
|
526
|
+
* none was found.
|
|
527
|
+
*/
|
|
528
|
+
export async function usListingsOnlyMessage(
|
|
529
|
+
what: string,
|
|
530
|
+
listing: Pick<CliListing, "symbol" | "exchange" | "key" | "request" | "saved">,
|
|
531
|
+
deps: ListingDeps,
|
|
532
|
+
retry: (key: string) => string | null,
|
|
533
|
+
): Promise<{ message: string; details: string }> {
|
|
534
|
+
const quote = await loadListingQuote(deps.dataProvider, listing);
|
|
535
|
+
const company = listingIdentity(listing, quote).name;
|
|
536
|
+
const named = company ? `${shortCompanyName(company)} on ${exchangeLabel(listing.exchange)}` : exchangeLabel(listing.exchange);
|
|
537
|
+
const us = await usListingOfCompany(listing, company, deps);
|
|
538
|
+
const owner = company ? shortCompanyName(company) : listing.key;
|
|
539
|
+
const command = us ? retry(us.symbol) : null;
|
|
540
|
+
return {
|
|
541
|
+
message: `${what} covers US listings only, and ${listing.key} is ${named}.`,
|
|
542
|
+
details: us
|
|
543
|
+
? `${owner}'s US listing: ${us.symbol}${command ? ` (try: ${command})` : ""}`
|
|
544
|
+
: `No US listing of ${owner} was found.`,
|
|
545
|
+
};
|
|
546
|
+
}
|
|
547
|
+
|
|
548
|
+
/**
|
|
549
|
+
* A bare symbol goes to its saved listing, else to the one search lists first,
|
|
550
|
+
* unless several companies list it (2222 is Kotobuki Spirits in Tokyo and Saudi
|
|
551
|
+
* Aramco in Riyadh): then it asks, and none of the venues is the answer. Null
|
|
552
|
+
* when it named its exchange.
|
|
553
|
+
*/
|
|
554
|
+
async function bareListingVenues(listing: BareListing, deps: ListingDeps): Promise<BareListingVenues | null> {
|
|
555
|
+
if (listing.exchange) return null;
|
|
556
|
+
const venues = await listingVenues(listing.symbol, deps).catch(logFailure("cli.listing-arg", "Read listing venues failed", []));
|
|
557
|
+
const savedExchange = canonicalExchange(listing.saved?.metadata.exchange);
|
|
558
|
+
if (!savedExchange && listsSeveralCompanies(venues)) return { exchange: "", resolved: null, others: venues, choose: true };
|
|
559
|
+
const resolved = venues.find((venue) => venue.exchange === savedExchange) ?? (savedExchange ? null : venues[0] ?? null);
|
|
560
|
+
const exchange = resolved?.exchange ?? savedExchange;
|
|
561
|
+
if (!exchange) return null;
|
|
562
|
+
return { exchange, resolved, others: venues.filter((venue) => venue !== resolved && venue.exchange !== savedExchange), choose: false };
|
|
563
|
+
}
|
|
564
|
+
|
|
565
|
+
interface OtherListingsMessage {
|
|
566
|
+
message: string;
|
|
567
|
+
details: string;
|
|
568
|
+
/** What `listings` are, as a sentence names them: "Other listings", or "Listings" when none is the one the symbol went to. */
|
|
569
|
+
heading: string;
|
|
570
|
+
/** SAN:EPA, for each other listing. */
|
|
571
|
+
listings: string[];
|
|
572
|
+
/** Each other listing and its company. */
|
|
573
|
+
choices: ListingChoice[];
|
|
574
|
+
/** Several companies list the symbol, so it went to none of them and the message asks which. */
|
|
575
|
+
choose: boolean;
|
|
576
|
+
}
|
|
577
|
+
|
|
578
|
+
/**
|
|
579
|
+
* The command that asks again for another listing: `gloom history SAN:EPA
|
|
580
|
+
* --range 5Y` keeps the options. Null where the request names listings alone.
|
|
581
|
+
*/
|
|
582
|
+
function retryCommand(request: Pick<ListingDataRequest, "command" | "retry">, key: string): string | null {
|
|
583
|
+
if (request.retry !== undefined) return request.retry?.(key) ?? null;
|
|
584
|
+
const [command, ...options] = request.command.split(" ");
|
|
585
|
+
return ["gloom", command, key, ...options].join(" ");
|
|
586
|
+
}
|
|
587
|
+
|
|
588
|
+
/**
|
|
589
|
+
* "GC=F Gold future (try: gloom quote GC=F)", under a bare futures board
|
|
590
|
+
* code a security keeps (GC, NG) when that security has no data: the future is
|
|
591
|
+
* the other thing the code names. Null for any other symbol.
|
|
592
|
+
*/
|
|
593
|
+
export function futuresTryLine(symbol: string, request: ListingDataRequest): string | null {
|
|
594
|
+
const future = futuresContractByCode(symbol);
|
|
595
|
+
if (!future) return null;
|
|
596
|
+
const retry = retryCommand(request, future.symbol);
|
|
597
|
+
return `${future.symbol} ${future.name} future${retry ? ` (try: ${retry})` : ""}`;
|
|
598
|
+
}
|
|
599
|
+
|
|
600
|
+
/** A venue's listing as its key names it: under its own symbol there (BP:LSE for `BP.`), else the one asked for. */
|
|
601
|
+
function venueKey(symbol: string, venue: Pick<ListingVenue, "exchange" | "symbol">): string {
|
|
602
|
+
return `${venue.symbol ?? symbol}:${venue.exchange}`;
|
|
603
|
+
}
|
|
604
|
+
|
|
605
|
+
function describeOtherListings(
|
|
606
|
+
listing: BareListing,
|
|
607
|
+
{ exchange, resolved, others, choose }: BareListingVenues,
|
|
608
|
+
request: ListingDataRequest,
|
|
609
|
+
/** Listings just asked that had none: named as having none, never offered to try. */
|
|
610
|
+
without: readonly ListingVenue[] = [],
|
|
611
|
+
): OtherListingsMessage | null {
|
|
612
|
+
const future = futuresTryLine(listing.symbol, request);
|
|
613
|
+
const offered = others.filter((venue) => !without.includes(venue));
|
|
614
|
+
if (offered.length === 0 && !future && without.length === 0) return null;
|
|
615
|
+
const name = resolved?.name || listing.saved?.metadata.name?.trim() || "";
|
|
616
|
+
const lines = offered.slice(0, MAX_OTHER_LISTINGS).map((venue) => {
|
|
617
|
+
const key = venueKey(listing.symbol, venue);
|
|
618
|
+
const retry = retryCommand(request, key);
|
|
619
|
+
return `${key}${venue.name ? ` ${venue.name}` : ""}${retry ? ` (try: ${retry})` : ""}`;
|
|
620
|
+
});
|
|
621
|
+
if (offered.length > MAX_OTHER_LISTINGS) lines.push(`and ${offered.length - MAX_OTHER_LISTINGS} more: gloom search ${listing.symbol}`);
|
|
622
|
+
if (future) lines.push(future);
|
|
623
|
+
// Every other listing was asked and had nothing: they are named as such, with nothing to try.
|
|
624
|
+
const heading = choose ? "Listings" : lines.length === 0 ? `No ${request.noun} on its other listings either` : "Other listings";
|
|
625
|
+
const named = lines.length === 0 ? without : offered;
|
|
626
|
+
const details = lines.length === 0 ? `${heading}: ${without.map((venue) => venueKey(listing.symbol, venue)).join(", ")}.`
|
|
627
|
+
: lines.length === 1 ? `${heading}: ${lines[0]}` : [`${heading}:`, ...lines.map((line) => ` ${line}`)].join("\n");
|
|
628
|
+
return {
|
|
629
|
+
// The symbol went to no venue, so none of them is said to lack the data.
|
|
630
|
+
message: choose
|
|
631
|
+
? `Choose an exchange for ${listing.symbol}.`
|
|
632
|
+
: `${listing.symbol} resolved to ${name ? `${name} (${exchange})` : exchange}, which has no ${request.noun}.`,
|
|
633
|
+
details,
|
|
634
|
+
heading,
|
|
635
|
+
listings: [...named.map((venue) => venueKey(listing.symbol, venue)), ...future ? [futuresContractByCode(listing.symbol)!.symbol] : []],
|
|
636
|
+
choices: offered.slice(0, MAX_OTHER_LISTINGS).map((venue) => ({ key: venueKey(listing.symbol, venue), name: venue.name || null })),
|
|
637
|
+
choose,
|
|
638
|
+
};
|
|
639
|
+
}
|
|
640
|
+
|
|
641
|
+
/**
|
|
642
|
+
* For a bare symbol whose request found no source: the listing it went to and
|
|
643
|
+
* the symbol's other listings, each with the command that asks for it, such
|
|
644
|
+
* as "SXR8 resolved to iShares Core S&P 500 UCITS ETF USD (Acc) (XETRA), which has
|
|
645
|
+
* no history." and "SXR8:BUD iShares Core S&P 500 UCITS ETF USD (Acc) (try:
|
|
646
|
+
* gloom history SXR8:BUD)". When several
|
|
647
|
+
* companies list the code, it went to none of them: "Choose an exchange for
|
|
648
|
+
* 2222." and every listing with its retry command, as `2222:` asks. Null when
|
|
649
|
+
* the symbol named its exchange or has no other listing. It searches, so ask
|
|
650
|
+
* only after a request failed.
|
|
651
|
+
*/
|
|
652
|
+
async function otherListingsMessage(
|
|
653
|
+
listing: BareListing,
|
|
654
|
+
deps: ListingDeps,
|
|
655
|
+
request: ListingDataRequest,
|
|
656
|
+
): Promise<OtherListingsMessage | null> {
|
|
657
|
+
const venues = await bareListingVenues(listing, deps);
|
|
658
|
+
return venues && describeOtherListings(listing, venues, request);
|
|
659
|
+
}
|
|
660
|
+
|
|
661
|
+
/** The listing on one venue, as `SYM:EXCH` names it, under the venue's own symbol when search lists one. */
|
|
662
|
+
function namedListing(listing: CliListing, venue: Pick<ListingVenue, "exchange" | "symbol">): CliListing {
|
|
663
|
+
const { exchange } = venue;
|
|
664
|
+
const symbol = venue.symbol ?? listing.symbol;
|
|
665
|
+
const key = `${symbol}:${exchange}`;
|
|
666
|
+
const saved = canonicalExchange(listing.saved?.metadata.exchange) === exchange ? listing.saved : null;
|
|
667
|
+
return { symbol, exchange, key, saved, request: { symbol: key, exchange } };
|
|
668
|
+
}
|
|
669
|
+
|
|
670
|
+
/**
|
|
671
|
+
* Each listing's quote, null where it has none; `undefined` where the request
|
|
672
|
+
* itself failed, which says nothing of whether it has one.
|
|
673
|
+
*/
|
|
674
|
+
async function quoteListings(
|
|
675
|
+
dataProvider: DataProvider,
|
|
676
|
+
listings: readonly CliListing[],
|
|
677
|
+
refresh: boolean,
|
|
678
|
+
datesChangeBasis = false,
|
|
679
|
+
): Promise<Array<Quote | null | undefined>> {
|
|
680
|
+
if (listings.length === 0) return [];
|
|
681
|
+
const targets = listings.map((listing) => listing.request);
|
|
682
|
+
if (dataProvider.getQuotesBatch) {
|
|
683
|
+
const results = await dataProvider.getQuotesBatch(targets, { forceRefresh: refresh, ...(datesChangeBasis ? { datesChangeBasis } : {}) })
|
|
684
|
+
.catch(logFailure("cli.listing-arg", "Read listing quote batch failed", null));
|
|
685
|
+
if (!results) return targets.map(() => undefined);
|
|
686
|
+
return targets.map((target, index) => {
|
|
687
|
+
const result = results.find((entry) => entry.target === target) ?? results[index];
|
|
688
|
+
// No source quotes it, which is an answer; any other failure is none.
|
|
689
|
+
return result?.quote ?? (result && (result.error == null || isNoProviderError(result.error)) ? null : undefined);
|
|
690
|
+
});
|
|
691
|
+
}
|
|
692
|
+
return Promise.all(targets.map((target) => dataProvider.getQuote(target.symbol, target.exchange, {
|
|
693
|
+
cacheMode: refresh ? "refresh" : "default",
|
|
694
|
+
...(datesChangeBasis ? { datesChangeBasis } : {}),
|
|
695
|
+
}).catch((error: unknown) => {
|
|
696
|
+
logFailure("cli.listing-arg", "Read listing quote failed")(error);
|
|
697
|
+
return isNoProviderError(error) ? null : undefined;
|
|
698
|
+
})));
|
|
699
|
+
}
|
|
700
|
+
|
|
701
|
+
export type BareListingQuote =
|
|
702
|
+
| {
|
|
703
|
+
kind: "quoted";
|
|
704
|
+
/** The listing that has a quote: SXR8:XETRA. */
|
|
705
|
+
listing: CliListing;
|
|
706
|
+
quote: Quote;
|
|
707
|
+
/** "SXR8 -> XETRA (other listings: BUD, MUNICH)". */
|
|
708
|
+
note: string;
|
|
709
|
+
}
|
|
710
|
+
| ({ kind: "missing" } & OtherListingsMessage);
|
|
711
|
+
|
|
712
|
+
/**
|
|
713
|
+
* The quote for a bare symbol no source quoted. The data service reads a
|
|
714
|
+
* symbol with no US listing on its home listing abroad (`bareListingNote`),
|
|
715
|
+
* so this is left for one it reads on none, and for a home listing with no
|
|
716
|
+
* quote. Search knows where the symbol trades: each listing is asked again by
|
|
717
|
+
* its own key (SXR8:XETRA), as a named one is. The listing the symbol resolved
|
|
718
|
+
* to goes first, then the others together, and the first in search order with a
|
|
719
|
+
* quote is the answer. When none has one, the `otherListingsMessage` failure.
|
|
720
|
+
* A code several companies list (2222) is never answered from one of them: it is
|
|
721
|
+
* that failure, asking which. Null when the symbol named its exchange (a named
|
|
722
|
+
* venue never switches) or search knows no listing of it. It searches, so ask
|
|
723
|
+
* only after a request failed.
|
|
724
|
+
*/
|
|
725
|
+
export async function quoteBareListing(
|
|
726
|
+
listing: CliListing,
|
|
727
|
+
deps: ListingDeps,
|
|
728
|
+
request: ListingDataRequest,
|
|
729
|
+
{ refresh = false, datesChangeBasis = false }: { refresh?: boolean; datesChangeBasis?: boolean } = {},
|
|
730
|
+
): Promise<BareListingQuote | null> {
|
|
731
|
+
const venues = await bareListingVenues(listing, deps);
|
|
732
|
+
if (!venues) return null;
|
|
733
|
+
if (venues.choose) {
|
|
734
|
+
const other = describeOtherListings(listing, venues, request);
|
|
735
|
+
return other && { kind: "missing", ...other };
|
|
736
|
+
}
|
|
737
|
+
const first = [namedListing(listing, venues.resolved ?? { exchange: venues.exchange })];
|
|
738
|
+
const rest = venues.others.map((venue) => namedListing(listing, venue));
|
|
739
|
+
let tried = first;
|
|
740
|
+
let quotes = await quoteListings(deps.dataProvider, first, refresh, datesChangeBasis);
|
|
741
|
+
if (!quotes[0] && rest.length > 0) {
|
|
742
|
+
tried = [...first, ...rest];
|
|
743
|
+
quotes = [...quotes, ...await quoteListings(deps.dataProvider, rest, refresh, datesChangeBasis)];
|
|
744
|
+
}
|
|
745
|
+
const found = quotes.findIndex(Boolean);
|
|
746
|
+
if (found < 0) {
|
|
747
|
+
// A listing just asked that had no quote is no listing to try.
|
|
748
|
+
const without = venues.others.filter((_venue, index) => quotes[index + 1] === null);
|
|
749
|
+
const other = describeOtherListings(listing, venues, request, without);
|
|
750
|
+
return other && { kind: "missing", ...other };
|
|
751
|
+
}
|
|
752
|
+
const answer = tried[found]!;
|
|
753
|
+
const without = tried.slice(0, found).map((entry) => entry.exchange);
|
|
754
|
+
// Listings not asked, or asked and quoted, are still there to name.
|
|
755
|
+
const others = [...first, ...rest]
|
|
756
|
+
.filter((entry, index) => entry !== answer && (index >= tried.length || quotes[index]))
|
|
757
|
+
.map((entry) => entry.exchange);
|
|
758
|
+
return {
|
|
759
|
+
kind: "quoted",
|
|
760
|
+
listing: answer,
|
|
761
|
+
quote: quotes[found]!,
|
|
762
|
+
// Under the venue's own symbol (BP:LSE for `BP.`), the note names the listing, not only its venue.
|
|
763
|
+
note: chosenListingNote(listing.symbol, answer.symbol === listing.symbol ? answer.exchange : answer.key, others, without),
|
|
764
|
+
};
|
|
765
|
+
}
|
|
766
|
+
|
|
767
|
+
/** A bare symbol as `quote` reads it (`readBareListing`). */
|
|
768
|
+
export interface ReadListing {
|
|
769
|
+
symbol: string;
|
|
770
|
+
/** The venue it was read on: the one it is saved on, or the listing that quoted it; empty when its own quote answered on none named. */
|
|
771
|
+
exchange: string;
|
|
772
|
+
/** The listing's company, from its quote. */
|
|
773
|
+
name: string | null;
|
|
774
|
+
/** A bare coin ticker read as a listing that is not the coin (`coinListingNotes`); null otherwise. */
|
|
775
|
+
coinNote: string | null;
|
|
776
|
+
}
|
|
777
|
+
|
|
778
|
+
/**
|
|
779
|
+
* A bare symbol read as `quote` reads it, for a command that draws its data
|
|
780
|
+
* without asking for a quote (a chart's series): its own quote answers it, a
|
|
781
|
+
* symbol no source quotes is read on the first of its listings that has one
|
|
782
|
+
* (`quoteBareListing`), and a code several companies list (BDI is Black
|
|
783
|
+
* Diamond Group in Toronto and B. D. Industries in Pune) fails asking which,
|
|
784
|
+
* with `quote`'s message and each listing's retry. Null when nothing better
|
|
785
|
+
* than the symbol itself is known, so the command's own request speaks.
|
|
786
|
+
*/
|
|
787
|
+
export async function readBareListing(
|
|
788
|
+
symbol: string,
|
|
789
|
+
deps: ListingDeps,
|
|
790
|
+
request: ListingDataRequest,
|
|
791
|
+
{ refresh = false }: { refresh?: boolean } = {},
|
|
792
|
+
): Promise<ReadListing | null> {
|
|
793
|
+
const listing = await resolveCliListing(symbol, null, deps);
|
|
794
|
+
if (listing.exchange) return null;
|
|
795
|
+
const answer = await loadListingQuoteAnswer(deps.dataProvider, listing);
|
|
796
|
+
if (answer.quote) {
|
|
797
|
+
return { symbol: listing.symbol, exchange: listing.request.exchange, name: answer.quote.name?.trim() || null, coinNote: coinListingNotes(listing, answer.quote)[0] ?? null };
|
|
798
|
+
}
|
|
799
|
+
if (!isNoProviderError(answer.error)) return null;
|
|
800
|
+
const other = await quoteBareListing(listing, deps, request, { refresh });
|
|
801
|
+
if (other?.kind === "quoted") {
|
|
802
|
+
return { symbol: listing.symbol, exchange: other.listing.exchange, name: other.quote.name?.trim() || null, coinNote: coinListingNotes(listing, other.quote)[0] ?? null };
|
|
803
|
+
}
|
|
804
|
+
if (other?.choose) throw new ListingArgError(other.message, other.details, other.choices);
|
|
805
|
+
return null;
|
|
806
|
+
}
|
|
807
|
+
|
|
808
|
+
/**
|
|
809
|
+
* "IEO -> BATS (other listings: IEX, BMV)": the venue a bare symbol went to,
|
|
810
|
+
* the venues it was not quoted on, and the ones it also trades on.
|
|
811
|
+
*/
|
|
812
|
+
export function chosenListingNote(symbol: string, exchange: string, others: readonly string[], without: readonly string[] = []): string {
|
|
813
|
+
const more = others.length - MAX_OTHER_LISTINGS;
|
|
814
|
+
const aside = [
|
|
815
|
+
without.length > 0 ? `no quote on ${without.join(", ")}` : "",
|
|
816
|
+
others.length > 0
|
|
817
|
+
? `other listings: ${others.slice(0, MAX_OTHER_LISTINGS).join(", ")}${more > 0 ? ` and ${more} more: gloom search ${symbol}` : ""}`
|
|
818
|
+
: "",
|
|
819
|
+
].filter(Boolean).join("; ");
|
|
820
|
+
return `${symbol} -> ${exchange}${aside ? ` (${aside})` : ""}`;
|
|
821
|
+
}
|
|
822
|
+
|
|
823
|
+
/**
|
|
824
|
+
* "HFC became DINO on 2022-03-15: `gloom history DINO`": a symbol whose
|
|
825
|
+
* company moved, with the command that asks for it under its new symbol.
|
|
826
|
+
*/
|
|
827
|
+
export function movedSymbolLine(change: MovedTickerChange, retry: string | null): string {
|
|
828
|
+
return retry ? `${change.note}: \`${retry}\`` : change.note;
|
|
829
|
+
}
|
|
830
|
+
|
|
831
|
+
/**
|
|
832
|
+
* Fails a command that has nothing to serve for a symbol whose company
|
|
833
|
+
* moved (`ListingFate.moved`) with `movedSymbolLine`; `--json` reads the
|
|
834
|
+
* change as quote rows carry it (`tickerChange`) and the command that asks
|
|
835
|
+
* for the new symbol (`retry`). Exits as any failure does.
|
|
836
|
+
*/
|
|
837
|
+
export function failMovedSymbol(change: MovedTickerChange, request: Pick<ListingDataRequest, "command" | "retry">): never {
|
|
838
|
+
const retry = retryCommand(request, change.tradesAs);
|
|
839
|
+
return failWithFields(movedSymbolLine(change, retry), "ticker_moved", { tickerChange: change, retry });
|
|
840
|
+
}
|
|
841
|
+
|
|
842
|
+
/**
|
|
843
|
+
* `loadListingFate` for a command's listing, looked up once whenever it is
|
|
844
|
+
* asked for: the change lookup starts now, beside the command's own request,
|
|
845
|
+
* and the fate reads the quote the command loads.
|
|
846
|
+
*/
|
|
847
|
+
export function listingFateLoader(
|
|
848
|
+
listing: Pick<CliListing, "symbol" | "exchange" | "request">,
|
|
849
|
+
deps: Pick<ListingDeps, "dataProvider">,
|
|
850
|
+
quote: Promise<Quote | null>,
|
|
851
|
+
): () => Promise<ListingFate> {
|
|
852
|
+
const changes = startTickerChangeLookup(deps.dataProvider, listing.symbol, listing.exchange);
|
|
853
|
+
let fate: Promise<ListingFate> | null = null;
|
|
854
|
+
return () => fate ??= loadListingFate(listing, deps.dataProvider, { quote, changes });
|
|
855
|
+
}
|
|
856
|
+
|
|
857
|
+
/**
|
|
858
|
+
* A command's load for one listing beside its fate (`listingFateLoader`): a
|
|
859
|
+
* symbol whose company moved serves nothing, whatever came back or failed,
|
|
860
|
+
* and the command fails naming its new symbol (`failMovedSymbol`). A loader
|
|
861
|
+
* that finds that itself (`MovedSymbolError`) fails the same way.
|
|
862
|
+
*/
|
|
863
|
+
export async function refuseMovedListing<T>(
|
|
864
|
+
fate: (() => Promise<ListingFate>) | null,
|
|
865
|
+
request: Pick<ListingDataRequest, "command" | "retry">,
|
|
866
|
+
load: () => Promise<T>,
|
|
867
|
+
): Promise<T> {
|
|
868
|
+
let value: T;
|
|
869
|
+
try {
|
|
870
|
+
value = await load();
|
|
871
|
+
} catch (error) {
|
|
872
|
+
if (error instanceof MovedSymbolError) failMovedSymbol(error.change, request);
|
|
873
|
+
const moved = (await fate?.())?.moved;
|
|
874
|
+
if (moved) failMovedSymbol(moved, request);
|
|
875
|
+
throw error;
|
|
876
|
+
}
|
|
877
|
+
const moved = (await fate?.())?.moved;
|
|
878
|
+
if (moved) failMovedSymbol(moved, request);
|
|
879
|
+
return value;
|
|
880
|
+
}
|
|
881
|
+
|
|
882
|
+
/**
|
|
883
|
+
* "Read 247540:KRX on KOSDAQ, where 247540 trades." for a listing Gloom Cloud
|
|
884
|
+
* quoted from the board its symbol trades on rather than the one asked for: a
|
|
885
|
+
* KOSDAQ code saved on KRX before search listed it on KOSDAQ. Null when the
|
|
886
|
+
* quote is the listing's own line.
|
|
887
|
+
*/
|
|
888
|
+
export function tradingBoardNote(
|
|
889
|
+
listing: Pick<CliListing, "symbol" | "request">,
|
|
890
|
+
quote: Pick<Quote, "tradingExchangeName" | "listingExchangeName" | "exchangeName"> | null | undefined,
|
|
891
|
+
): string | null {
|
|
892
|
+
const board = canonicalExchange(quote?.tradingExchangeName);
|
|
893
|
+
const asked = canonicalExchange(listing.request.exchange || quote?.listingExchangeName || quote?.exchangeName);
|
|
894
|
+
return board && asked && board !== asked ? `Read ${listing.symbol}:${asked} on ${board}, where ${listing.symbol} trades.` : null;
|
|
895
|
+
}
|
|
896
|
+
|
|
897
|
+
/**
|
|
898
|
+
* Ends a command with what it says for a bare symbol no source serves: a
|
|
899
|
+
* company that moved is under its new symbol, else the listing the symbol went
|
|
900
|
+
* to and the others (`other`, from `otherListingsMessage`), else what became of
|
|
901
|
+
* it. Returns when there is nothing to say.
|
|
902
|
+
*/
|
|
903
|
+
async function failUnservedListing(
|
|
904
|
+
ctx: Pick<CliCommandContext, "fail">,
|
|
905
|
+
request: ListingDataRequest,
|
|
906
|
+
other: Promise<OtherListingsMessage | null>,
|
|
907
|
+
): Promise<void> {
|
|
908
|
+
const [listings, fate] = await Promise.all([other, request.fate?.() ?? null]);
|
|
909
|
+
// Nothing served either way: a company that moved is under its new symbol, before any other listing.
|
|
910
|
+
const moved = movedAwayChange(fate?.change);
|
|
911
|
+
if (moved) failMovedSymbol(moved, request);
|
|
912
|
+
if (listings) ctx.fail(listings.message, [fate?.note, listings.details].filter(Boolean).join("\n"));
|
|
913
|
+
if (fate?.note) ctx.fail(`${fate.note}.`);
|
|
914
|
+
}
|
|
915
|
+
|
|
916
|
+
/**
|
|
917
|
+
* Refuses a bare symbol several companies list (FP is a newspaper group in
|
|
918
|
+
* Toronto and Fondul Proprietatea in Bucharest) with the message `quote`
|
|
919
|
+
* gives it, whatever the command's own request served: the data service answers
|
|
920
|
+
* a history for the bare symbol from one of the listings, which is a pick the
|
|
921
|
+
* user never made. Asked once the symbol's own quote (`loadListingQuoteAnswer`)
|
|
922
|
+
* failed with no provider, so a symbol with a quote, a named or saved listing,
|
|
923
|
+
* and a symbol one company lists go on as they were. It searches, so ask only then.
|
|
924
|
+
*/
|
|
925
|
+
export async function failUnchosenListing(
|
|
926
|
+
listing: BareListing,
|
|
927
|
+
deps: ListingDeps,
|
|
928
|
+
ctx: Pick<CliCommandContext, "fail">,
|
|
929
|
+
request: ListingDataRequest,
|
|
930
|
+
quoteError: unknown,
|
|
931
|
+
): Promise<void> {
|
|
932
|
+
if (!isNoProviderError(quoteError)) return;
|
|
933
|
+
const venues = await bareListingVenues(listing, deps);
|
|
934
|
+
if (venues?.choose) await failUnservedListing(ctx, request, Promise.resolve(describeOtherListings(listing, venues, request)));
|
|
935
|
+
}
|
|
936
|
+
|
|
937
|
+
/**
|
|
938
|
+
* A data request for the listings a command named. When it throws, or `isMiss`
|
|
939
|
+
* calls what it returned empty, and a listing's exchange is one its symbol does
|
|
940
|
+
* not trade on, the command ends in that message instead of the request's own
|
|
941
|
+
* "unavailable". With `request`, a bare symbol no source serves ends naming
|
|
942
|
+
* its other listings (`otherListingsMessage`), and with `request.fate` a symbol
|
|
943
|
+
* whose company moved ends naming its new symbol, served or not. A request
|
|
944
|
+
* that succeeds costs no extra lookup beyond the fate the command reads anyway.
|
|
945
|
+
*/
|
|
946
|
+
export async function loadForListing<T>(
|
|
947
|
+
listings: ListingForLoad | readonly ListingForLoad[],
|
|
948
|
+
deps: ListingDeps,
|
|
949
|
+
ctx: Pick<CliCommandContext, "fail">,
|
|
950
|
+
load: () => Promise<T>,
|
|
951
|
+
isMiss?: (value: T) => boolean,
|
|
952
|
+
request?: ListingDataRequest,
|
|
953
|
+
): Promise<T> {
|
|
954
|
+
const all = "symbol" in listings ? [listings] : listings;
|
|
955
|
+
const named = all.filter((listing) => listing.exchange);
|
|
956
|
+
const checkVenues = () => Promise.all(named.map((listing) => failIfNotTraded(listing, deps, ctx)));
|
|
957
|
+
let value: T;
|
|
958
|
+
try {
|
|
959
|
+
value = await load();
|
|
960
|
+
} catch (error) {
|
|
961
|
+
await checkVenues();
|
|
962
|
+
if (request && all.length === 1 && isNoProviderError(error)) await failUnservedListing(ctx, request, otherListingsMessage(all[0]!, deps, request));
|
|
963
|
+
throw error;
|
|
964
|
+
}
|
|
965
|
+
if (isMiss?.(value)) await checkVenues();
|
|
966
|
+
// Data came back, but the symbol's company moved and nothing new lists there: the data is another security's.
|
|
967
|
+
if (request?.fate && all.length === 1) {
|
|
968
|
+
const { moved } = await request.fate();
|
|
969
|
+
if (moved) failMovedSymbol(moved, request);
|
|
970
|
+
}
|
|
971
|
+
return value;
|
|
972
|
+
}
|
|
973
|
+
|
|
974
|
+
type ListingForLoad = Pick<ListingArg, "symbol" | "exchange"> & Partial<Pick<CliListing, "saved">>;
|
|
975
|
+
|
|
976
|
+
/** The saved ticker for a listing: under its own key, or a saved symbol whose venue it is. */
|
|
977
|
+
export async function loadSavedListing(store: ListingStore, listing: ListingArg): Promise<TickerRecord | null> {
|
|
978
|
+
if (!listing.exchange) return store.loadTicker(listing.symbol);
|
|
979
|
+
if (listing.sharedCode) {
|
|
980
|
+
// 7203:TSE is the row saved on any venue TSE names.
|
|
981
|
+
for (const exchange of exchangeCodeVenues(listing.sharedCode)) {
|
|
982
|
+
const saved = await loadSavedListing(store, { symbol: listing.symbol, exchange, key: `${listing.symbol}:${exchange}` });
|
|
983
|
+
if (saved) return saved;
|
|
984
|
+
}
|
|
985
|
+
return null;
|
|
986
|
+
}
|
|
987
|
+
for (const key of new Set([listing.key, publicTickerKey(listing.symbol, listing.exchange), listing.symbol])) {
|
|
988
|
+
const ticker = await store.loadTicker(key);
|
|
989
|
+
if (ticker && (key === listing.key || canonicalExchange(ticker.metadata.exchange) === listing.exchange)) return ticker;
|
|
990
|
+
}
|
|
991
|
+
return null;
|
|
992
|
+
}
|
|
993
|
+
|
|
994
|
+
/**
|
|
995
|
+
* The listings a typed symbol may be saved as, most likely first. With a
|
|
996
|
+
* vendor's suffix, its venue's listing (GARAN.IS as GARAN:BIST, 7203.T as
|
|
997
|
+
* 7203:JPX), then the suffixed key as typed, for a row saved under it: a
|
|
998
|
+
* broker's, or MKC.V, a US share class the suffix only looks like. A
|
|
999
|
+
* one-letter suffix's venue is a guess that a row saved there confirms
|
|
1000
|
+
* (`loadSavedListingOf`). One listing for anything else.
|
|
1001
|
+
*/
|
|
1002
|
+
export function savedListingCandidates(raw: string, exchangeOption?: string | null, options: { ownExchangeWins?: boolean } = {}): ListingArg[] {
|
|
1003
|
+
const literal = parseListingArg(raw, exchangeOption, options);
|
|
1004
|
+
const venue = literal.exchange ? null : listingSuffixCandidate(literal.symbol);
|
|
1005
|
+
if (!venue) return [literal];
|
|
1006
|
+
return [{ symbol: venue.symbol, exchange: venue.exchange, key: `${venue.symbol}:${venue.exchange}`, ...literal.readAs ? { readAs: literal.readAs } : {} }, literal];
|
|
1007
|
+
}
|
|
1008
|
+
|
|
1009
|
+
/**
|
|
1010
|
+
* The first of the listings that is saved, with its row; one `wanted` says is
|
|
1011
|
+
* meant (held in the list a command changes) before any other. Null when none is.
|
|
1012
|
+
*/
|
|
1013
|
+
export async function loadSavedListingOf(
|
|
1014
|
+
store: ListingStore,
|
|
1015
|
+
listings: readonly ListingArg[],
|
|
1016
|
+
wanted?: (ticker: TickerRecord) => boolean,
|
|
1017
|
+
): Promise<{ listing: ListingArg; ticker: TickerRecord } | null> {
|
|
1018
|
+
const found: Array<{ listing: ListingArg; ticker: TickerRecord }> = [];
|
|
1019
|
+
const add = (listing: ListingArg, ticker: TickerRecord | null | undefined) => {
|
|
1020
|
+
if (ticker && !found.some((entry) => entry.ticker.metadata.ticker === ticker.metadata.ticker)) found.push({ listing, ticker });
|
|
1021
|
+
};
|
|
1022
|
+
for (const listing of listings) {
|
|
1023
|
+
if (found.some((entry) => entry.listing.key === listing.key)) continue;
|
|
1024
|
+
const ticker = await loadSavedListing(store, listing);
|
|
1025
|
+
// A bare symbol's US listing comes before a row abroad saved under its bare key (SHEL, saved from SHEL.L).
|
|
1026
|
+
if (ticker && !listing.exchange && savedAbroadForBareSymbol(listing.symbol, ticker)) {
|
|
1027
|
+
add(listing, savedUsListingOf(listing.symbol, await store.loadAllTickers()));
|
|
1028
|
+
}
|
|
1029
|
+
add(listing, ticker);
|
|
1030
|
+
// A suffixed key as typed may be saved with a venue (7203.T:JPX, GARAN.IS:XNYS): any row of that symbol.
|
|
1031
|
+
if (!ticker && !listing.exchange && tickerHasListingSuffix(listing.symbol)) {
|
|
1032
|
+
for (const row of await store.loadAllTickers()) {
|
|
1033
|
+
if (parsePublicTickerKey(row.metadata.ticker).symbol === listing.symbol) add(listing, row);
|
|
1034
|
+
}
|
|
1035
|
+
}
|
|
1036
|
+
}
|
|
1037
|
+
return (wanted && found.find((entry) => wanted(entry.ticker))) || found[0] || null;
|
|
1038
|
+
}
|
|
1039
|
+
|
|
1040
|
+
/**
|
|
1041
|
+
* The saved row a command that changes a list names, and the listing it was
|
|
1042
|
+
* found as: one of `savedListingCandidates`, with no request when one is
|
|
1043
|
+
* saved (a broker's GARAN.IS while GARAN:BIST has no row), else the typed
|
|
1044
|
+
* listing as `requireListingArg` checks it, which fails the command when it
|
|
1045
|
+
* is no listing. The row is null when that listing has none.
|
|
1046
|
+
*/
|
|
1047
|
+
export async function requireSavedListing(
|
|
1048
|
+
raw: string,
|
|
1049
|
+
exchangeOption: string | null | undefined,
|
|
1050
|
+
ctx: Pick<CliCommandContext, "fail" | "initMarketData">,
|
|
1051
|
+
store: ListingStore,
|
|
1052
|
+
wanted?: (ticker: TickerRecord) => boolean,
|
|
1053
|
+
): Promise<{ listing: ListingArg; ticker: TickerRecord | null }> {
|
|
1054
|
+
let candidates: ListingArg[] = [];
|
|
1055
|
+
try {
|
|
1056
|
+
candidates = savedListingCandidates(raw, exchangeOption);
|
|
1057
|
+
} catch {
|
|
1058
|
+
// Intentional ignore: requireListingArg below fails with what is wrong with the text.
|
|
1059
|
+
}
|
|
1060
|
+
const saved = await loadSavedListingOf(store, candidates, wanted);
|
|
1061
|
+
if (saved) return saved;
|
|
1062
|
+
const listing = await requireListingArg(raw, exchangeOption, ctx, { listingSuffix: true });
|
|
1063
|
+
return { listing, ticker: (await loadSavedListingOf(store, [listing], wanted))?.ticker ?? null };
|
|
1064
|
+
}
|
|
1065
|
+
|
|
1066
|
+
/** A row saved under a vendor's suffixed key (RY.TO) for the listing it was read as: on that venue, or on none it names. */
|
|
1067
|
+
async function loadSuffixedRow(store: ListingStore, key: string, exchange: string): Promise<TickerRecord | null> {
|
|
1068
|
+
const ticker = await store.loadTicker(key);
|
|
1069
|
+
const savedExchange = canonicalExchange(ticker?.metadata.exchange);
|
|
1070
|
+
return ticker && (!savedExchange || savedExchange === exchange) ? ticker : null;
|
|
1071
|
+
}
|
|
1072
|
+
|
|
1073
|
+
export interface CliListing extends ListingArg {
|
|
1074
|
+
saved: TickerRecord | null;
|
|
1075
|
+
/** What was typed for it, as written (`Apple`), so a word no listing trades as can be read as a company's name. */
|
|
1076
|
+
typed?: string;
|
|
1077
|
+
/**
|
|
1078
|
+
* What data requests take: a named listing goes by its key (SAN:EPA), never
|
|
1079
|
+
* the bare symbol's cache; a bare symbol goes on its saved venue, as the
|
|
1080
|
+
* command bar opens it.
|
|
1081
|
+
*/
|
|
1082
|
+
request: { symbol: string; exchange: string };
|
|
1083
|
+
}
|
|
1084
|
+
|
|
1085
|
+
/**
|
|
1086
|
+
* `XYZ:BRENTOIL`, which reads as a symbol on an exchange no venue has, as Hyperliquid's name for a market on one
|
|
1087
|
+
* of its builder dexes (`xyz:BRENTOIL`, its listing XYZ-BRENTOIL:HYPERLIQUID), when that market exists. Asked only
|
|
1088
|
+
* after the exchange was not found, so a mistyped exchange still says so.
|
|
1089
|
+
*/
|
|
1090
|
+
async function builderDexMarket(listing: ListingArg, deps: ListingDeps): Promise<ListingArg | null> {
|
|
1091
|
+
if (!/^[A-Z][A-Z0-9]{0,11}$/.test(listing.symbol) || !/^[A-Z0-9]{1,32}$/.test(listing.exchange)) return null;
|
|
1092
|
+
const market = perpetualListingOfMarket(`hyperliquid:${listing.symbol.toLowerCase()}:${listing.exchange}`);
|
|
1093
|
+
if (!market) return null;
|
|
1094
|
+
const found = await deps.dataProvider.search(market.key).catch(logFailure("cli.listing-arg", "Search market listing failed", []));
|
|
1095
|
+
return found.some((result) => result.symbol.toUpperCase() === market.key)
|
|
1096
|
+
? { symbol: market.symbol, exchange: market.exchange, key: market.key }
|
|
1097
|
+
: null;
|
|
1098
|
+
}
|
|
1099
|
+
|
|
1100
|
+
/** A symbol written with a venue's suffix, as data vendors write a listing abroad: RY.TO, 7203.T, VOD.L, 0700.HK. */
|
|
1101
|
+
const VENUE_SUFFIX = /^([A-Z0-9][A-Z0-9&-]*)\.([A-Z]{1,3})$/;
|
|
1102
|
+
|
|
1103
|
+
/**
|
|
1104
|
+
* RY.TO, 7203.T, VOD.L: a listing abroad written with a data vendor's venue
|
|
1105
|
+
* suffix, read as the listing its own quote names (RY:TSX, 7203:JPX,
|
|
1106
|
+
* VOD:LSE), the way `quote` names it, so data that is read by venue (a
|
|
1107
|
+
* company's SEC filings, data that covers US listings only) finds the same
|
|
1108
|
+
* listing the quote is for. A US share class (BRK.B, quoted on NYSE), a
|
|
1109
|
+
* suffix no quote answers and a named venue stay as typed.
|
|
1110
|
+
*/
|
|
1111
|
+
async function readVenueSuffix(listing: ListingArg, deps: Pick<ListingDeps, "dataProvider">): Promise<ListingArg | null> {
|
|
1112
|
+
const match = listing.exchange ? null : VENUE_SUFFIX.exec(listing.symbol);
|
|
1113
|
+
if (!match) return null;
|
|
1114
|
+
let quote: Quote | null;
|
|
1115
|
+
try {
|
|
1116
|
+
quote = await deps.dataProvider.getQuote(listing.symbol, "");
|
|
1117
|
+
} catch (error) {
|
|
1118
|
+
// The command's own request then says what is wrong with the symbol.
|
|
1119
|
+
if (!isNoProviderError(error)) logFailure("cli.listing-arg", "Quote venue suffix failed")(error);
|
|
1120
|
+
return null;
|
|
1121
|
+
}
|
|
1122
|
+
const venue = canonicalExchange(quote?.listingExchangeName || quote?.exchangeName);
|
|
1123
|
+
const key = `${match[1]}:${venue}`;
|
|
1124
|
+
if (!venue || !isKnownExchangeCode(venue) || !listingAbroadVenue(key)) return null;
|
|
1125
|
+
return { symbol: match[1]!, exchange: venue, key, readAs: `Read ${listing.symbol} as ${key}.` };
|
|
1126
|
+
}
|
|
1127
|
+
|
|
1128
|
+
/** 7203.T as 7203:JPX when a row of 7203 on JPX is saved: a suffix `readListingSuffix` leaves to be confirmed. Null otherwise. */
|
|
1129
|
+
async function savedSuffixVenue(listing: ListingArg, store: ListingStore): Promise<ListingArg | null> {
|
|
1130
|
+
const venue = listing.exchange ? null : listingSuffixCandidate(listing.symbol);
|
|
1131
|
+
if (!venue) return null;
|
|
1132
|
+
const candidate = { symbol: venue.symbol, exchange: venue.exchange, key: `${venue.symbol}:${venue.exchange}` };
|
|
1133
|
+
if (!await loadSavedListing(store, candidate)) return null;
|
|
1134
|
+
return listing.readAs ? { ...candidate, readAs: listing.readAs } : candidate;
|
|
1135
|
+
}
|
|
1136
|
+
|
|
1137
|
+
/** GARAN.IS as GARAN:BIST: a vendor's venue suffix read as the venue it names (`listingSuffixVenue`), with no request. */
|
|
1138
|
+
function readListingSuffix(listing: ListingArg): ListingArg | null {
|
|
1139
|
+
const venue = listing.exchange ? null : listingSuffixVenue(listing.symbol);
|
|
1140
|
+
return venue ? { symbol: venue.symbol, exchange: venue.exchange, key: `${venue.symbol}:${venue.exchange}` } : null;
|
|
1141
|
+
}
|
|
1142
|
+
|
|
1143
|
+
export async function resolveCliListing(
|
|
1144
|
+
raw: string,
|
|
1145
|
+
exchangeOption: string | null | undefined,
|
|
1146
|
+
deps: ListingDeps,
|
|
1147
|
+
options: {
|
|
1148
|
+
ownExchangeWins?: boolean;
|
|
1149
|
+
/**
|
|
1150
|
+
* Read a venue suffix (RY.TO) as the listing its quote names (RY:TSX).
|
|
1151
|
+
* Only pane functions ask for it (`applyListingArgument`, which `fn` and
|
|
1152
|
+
* `shot` run through), as their data is read by venue.
|
|
1153
|
+
*/
|
|
1154
|
+
venueSuffix?: boolean;
|
|
1155
|
+
/** Read a venue suffix as the venue it names, with no request (`parseListingArg`). */
|
|
1156
|
+
listingSuffix?: boolean;
|
|
1157
|
+
} = {},
|
|
1158
|
+
): Promise<CliListing> {
|
|
1159
|
+
// "JPM US Equity" is Bloomberg's code for JPM; "Putnam US Equity", whose root is no US ticker, is a name.
|
|
1160
|
+
const typed = stripStrayEdges(raw).text || raw;
|
|
1161
|
+
const read = await readTerminalCodeArg(deps.dataProvider, typed);
|
|
1162
|
+
// A company's name, an entry of a comma list (`WHR, Whirlpool Corporation`), is the listing search names for it.
|
|
1163
|
+
// A name before a legal form ("SAP SE", "SIEMENS AG") is looked up first: SE is also SIX Swiss's market code.
|
|
1164
|
+
const named = !read || endsInLegalForm(typed) ? await companyNameListingArg(raw, deps) : null;
|
|
1165
|
+
const terminal = named ? null : read;
|
|
1166
|
+
// "AAPL GP" is written as a code, with a market code no venue answers to and no company's name: one entry, never AAPL and GP.
|
|
1167
|
+
if (!terminal && !named) await refuseUnknownMarketCode(typed, deps);
|
|
1168
|
+
// `BP.` is London's code for BP: its London line where London lists it, and `GE.` a US ticker with a stray dot.
|
|
1169
|
+
const dotted = terminal || named || exchangeOption?.trim() ? null : readLondonDottedSymbol(typed);
|
|
1170
|
+
let parsed = named ?? (dotted ? await londonDottedListing(dotted, deps) : parseListingArg(raw, exchangeOption, { ...options, terminalCode: terminal }));
|
|
1171
|
+
if (!parsed.symbol) throw new ListingArgError("Ticker symbol is required.");
|
|
1172
|
+
// $VIX is Schwab's code for ^VIX, unless a security trades as VIX: $AAPL is a cashtag.
|
|
1173
|
+
const index = named || parsed.exchange ? null : await readDollarIndexCode(raw, deps);
|
|
1174
|
+
if (index) parsed = index;
|
|
1175
|
+
// USD-NGN and USDNGN are the pair USDNGN=X unless a security is listed under those letters.
|
|
1176
|
+
const pair = parsed.exchange ? null : await readAmbiguousCurrencyPair(parsed.symbol, deps);
|
|
1177
|
+
if (pair) parsed = { symbol: pair, exchange: "", key: pair };
|
|
1178
|
+
// A one-letter suffix (7203.T) is read as its venue only when a row saved there says so; the listing's quote may later.
|
|
1179
|
+
const venueRow = options.listingSuffix && !pair && !named ? await savedSuffixVenue(parsed, deps.store) : null;
|
|
1180
|
+
if (venueRow) parsed = venueRow;
|
|
1181
|
+
const suffixed = pair || named || venueRow || !options.venueSuffix ? null : await readVenueSuffix(parsed, deps);
|
|
1182
|
+
// The row may be saved under the suffixed key itself: a link or a layout's key is kept as it came.
|
|
1183
|
+
const typedKey = suffixed ? parsed.symbol : null;
|
|
1184
|
+
if (suffixed) {
|
|
1185
|
+
const readAs = [parsed.readAs, suffixed.readAs].filter(Boolean).join(" ");
|
|
1186
|
+
parsed = { ...suffixed, ...readAs ? { readAs } : {} };
|
|
1187
|
+
}
|
|
1188
|
+
try {
|
|
1189
|
+
// A code's venue is one the app reads; where search alone knows it (`BBCA IJ`) or the codes differ (`DBS SP`), search says what trades there.
|
|
1190
|
+
if (terminal?.market && parsed.exchange === terminal.exchange) await checkTerminalCodeVenue(parsed, terminal.market, deps);
|
|
1191
|
+
else await checkListingExchange(parsed, deps);
|
|
1192
|
+
} catch (error) {
|
|
1193
|
+
const market = error instanceof ListingArgError ? await builderDexMarket(parsed, deps) : null;
|
|
1194
|
+
if (!market) throw error;
|
|
1195
|
+
parsed = market;
|
|
1196
|
+
}
|
|
1197
|
+
let listing = await settleSharedCode(parsed, deps);
|
|
1198
|
+
const found = await loadSavedListing(deps.store, listing) ?? (typedKey ? await loadSuffixedRow(deps.store, typedKey, listing.exchange) : null);
|
|
1199
|
+
// A bare symbol is its US listing when it has one, whatever row abroad holds the bare key (SHEL saved from SHEL.L).
|
|
1200
|
+
const saved = listing.exchange ? found : await savedRowOfBareSymbol(listing.symbol, found, deps);
|
|
1201
|
+
// A code nothing could read stays the venue it is saved on.
|
|
1202
|
+
const savedExchange = canonicalExchange(saved?.metadata.exchange);
|
|
1203
|
+
if (listing.sharedCode && savedExchange) listing = { symbol: listing.symbol, exchange: savedExchange, key: `${listing.symbol}:${savedExchange}` };
|
|
1204
|
+
return {
|
|
1205
|
+
...listing,
|
|
1206
|
+
saved,
|
|
1207
|
+
typed: typed.trim(),
|
|
1208
|
+
request: listing.exchange
|
|
1209
|
+
? { symbol: listing.key, exchange: listing.exchange }
|
|
1210
|
+
: { symbol: listing.symbol, exchange: saved?.metadata.exchange ?? "" },
|
|
1211
|
+
};
|
|
1212
|
+
}
|
|
1213
|
+
|
|
1214
|
+
/**
|
|
1215
|
+
* A two-letter symbol written with London's trailing dot (`BP.`, `RR.`) as its
|
|
1216
|
+
* London line, said as "Read BP. as BP:LSE.", where search lists it on LSE or
|
|
1217
|
+
* its quote there says it trades. Elsewhere the dot was a slip after the
|
|
1218
|
+
* ticker, dropped as a stray edge is (`GE.` is GE).
|
|
1219
|
+
*/
|
|
1220
|
+
async function londonDottedListing(dotted: NearMissListing, deps: ListingDeps): Promise<ListingArg> {
|
|
1221
|
+
const london = { symbol: dotted.symbol, exchange: "LSE" };
|
|
1222
|
+
const venues = await listingVenues(dotted.symbol, deps).catch(logFailure("cli.listing-arg", "Read listing venues failed", []));
|
|
1223
|
+
const listed = venues.some((venue) => venue.exchange === london.exchange) || await quotedOnVenue(london, deps);
|
|
1224
|
+
if (!listed) return parseListingArg(dotted.symbol);
|
|
1225
|
+
const key = `${london.symbol}:${london.exchange}`;
|
|
1226
|
+
return { ...parseListingArg(key), readAs: `Read ${dotted.typed} as ${key}.` };
|
|
1227
|
+
}
|
|
1228
|
+
|
|
1229
|
+
/**
|
|
1230
|
+
* Fails a line written as a Bloomberg code whose market code no venue answers
|
|
1231
|
+
* to (`AAPL GP`), suggesting the code of the symbol's own listing (`AAPL
|
|
1232
|
+
* US`), where else it trades, and, when the words could be two symbols, how
|
|
1233
|
+
* to write them as two. A real market no source quotes (`SM PM`) says so.
|
|
1234
|
+
* Run once no company's name was found in the words. Returns for anything else.
|
|
1235
|
+
*/
|
|
1236
|
+
async function refuseUnknownMarketCode(typed: string, deps: ListingDeps): Promise<void> {
|
|
1237
|
+
const unknown = unknownBloombergMarket(typed);
|
|
1238
|
+
if (!unknown) return;
|
|
1239
|
+
const twoSymbols = unknown.keyed ? null : `For two symbols, separate them with a comma: ${unknown.symbol}, ${unknown.market}.`;
|
|
1240
|
+
// A real market no source quotes (PM): the symbol's listings elsewhere are as likely another company's (SM US is SM Energy).
|
|
1241
|
+
if (unknown.unquoted) throw new ListingArgError(`${unknown.market} is the ${unknown.unquoted}, which has no quotes here.`, twoSymbols ?? undefined);
|
|
1242
|
+
const venues = await listingVenues(unknown.symbol, deps).catch(logFailure("cli.listing-arg", "Read listing venues failed", []));
|
|
1243
|
+
const codes = [...new Set(venues.flatMap((venue) => bloombergCodeOf(unknown.symbol, venue.exchange) ?? []))];
|
|
1244
|
+
const also = codes.slice(1, 1 + MAX_OTHER_LISTINGS);
|
|
1245
|
+
const details = [also.length > 0 ? `${unknown.symbol} also trades as ${also.join(", ")}.` : null, twoSymbols].filter(Boolean).join("\n");
|
|
1246
|
+
throw new ListingArgError(`${unknown.market} is not a market code; did you mean ${codes[0] ?? unknown.symbol}?`, details || undefined);
|
|
1247
|
+
}
|
|
1248
|
+
|
|
1249
|
+
/**
|
|
1250
|
+
* A code's venue where the exchange table has no entry for it (`BBCA IJ` is
|
|
1251
|
+
* JAKARTA) or Bloomberg's ticker is not the venue's code (`MAY MK`, Bursa's
|
|
1252
|
+
* 1155): "MAY does not trade on BURSAMY", with where it does and what to
|
|
1253
|
+
* type instead, rather than an unknown exchange. Returns for a venue the table
|
|
1254
|
+
* knows, which the listing's own request checks, and when search lists the
|
|
1255
|
+
* symbol there or cannot say.
|
|
1256
|
+
*/
|
|
1257
|
+
async function checkTerminalCodeVenue(listing: ListingArg, market: string, deps: ListingDeps): Promise<void> {
|
|
1258
|
+
const hint = bloombergMarketHint(market);
|
|
1259
|
+
if (!hint && !isSearchOnlyVenue(listing.exchange)) return;
|
|
1260
|
+
const venues = await listingVenues(listing.symbol, deps).catch(logFailure("cli.listing-arg", "Read listing venues failed", []));
|
|
1261
|
+
if (venues.length === 0 || venues.some((venue) => venue.exchange === listing.exchange)) return;
|
|
1262
|
+
throw new ListingArgError(`${listing.symbol} does not trade on ${listing.exchange}.${tradesOn(listing.symbol, venues)}`, hint ?? undefined);
|
|
1263
|
+
}
|
|
1264
|
+
|
|
1265
|
+
/**
|
|
1266
|
+
* The index a broker's code names, as a listing: VIX.X and $VIX.X at once,
|
|
1267
|
+
* $VIX when the sources answer that nothing trades as VIX. `$MOVE` stays
|
|
1268
|
+
* Corvex, whose quote then names the index beside it, and `$AAPL` is AAPL, as
|
|
1269
|
+
* no index is rooted at it. A quote that fails another way (a timeout, the
|
|
1270
|
+
* network) says nothing about what trades, so `$MID` stays MID as typed.
|
|
1271
|
+
* Null for anything else.
|
|
1272
|
+
*/
|
|
1273
|
+
export async function readBrokerIndexCode(raw: string, deps: Pick<ListingDeps, "dataProvider">): Promise<ListingArg | null> {
|
|
1274
|
+
const code = brokerIndexCode(stripStrayEdges(raw).text || raw);
|
|
1275
|
+
if (!code) return null;
|
|
1276
|
+
if (code.bare && !await nothingTradesAs(code.bare, deps)) return null;
|
|
1277
|
+
return { symbol: code.symbol, exchange: "", key: code.symbol, readAs: brokerIndexReadAs(code) };
|
|
1278
|
+
}
|
|
1279
|
+
|
|
1280
|
+
/** Whether the sources answer that no security trades as `symbol`: no quote, or a no-provider miss. */
|
|
1281
|
+
async function nothingTradesAs(symbol: string, deps: Pick<ListingDeps, "dataProvider">): Promise<boolean> {
|
|
1282
|
+
try {
|
|
1283
|
+
return !await deps.dataProvider.getQuote(symbol, "");
|
|
1284
|
+
} catch (error) {
|
|
1285
|
+
if (isNoProviderError(error)) return true;
|
|
1286
|
+
logFailure("cli.listing-arg", "Quote broker index root failed")(error);
|
|
1287
|
+
return false;
|
|
1288
|
+
}
|
|
1289
|
+
}
|
|
1290
|
+
|
|
1291
|
+
/** `readBrokerIndexCode` for a `$ROOT` code only: the `ROOT.X` codes are read where the listing is parsed. */
|
|
1292
|
+
function readDollarIndexCode(raw: string, deps: Pick<ListingDeps, "dataProvider">): Promise<ListingArg | null> {
|
|
1293
|
+
return brokerIndexCode(stripStrayEdges(raw).text || raw)?.bare ? readBrokerIndexCode(raw, deps) : Promise.resolve(null);
|
|
1294
|
+
}
|
|
1295
|
+
|
|
1296
|
+
/**
|
|
1297
|
+
* The listing a company's name typed where a symbol goes stands for
|
|
1298
|
+
* (`findListingOfCompanyName`), saying which one it was read as; null for a
|
|
1299
|
+
* symbol, and for a name search finds no listing for, which then fails as a
|
|
1300
|
+
* symbol would.
|
|
1301
|
+
*/
|
|
1302
|
+
async function companyNameListingArg(raw: string, deps: ListingDeps): Promise<ListingArg | null> {
|
|
1303
|
+
const typed = stripStrayEdges(raw).text || raw;
|
|
1304
|
+
return isCompanyNameInput(typed) ? readCompanyName(typed, deps) : null;
|
|
1305
|
+
}
|
|
1306
|
+
|
|
1307
|
+
/** One word that can be a company's name: letters first, no venue, pair or index mark (`Apple`, `Petrobras`, `Coca-Cola`). */
|
|
1308
|
+
const ONE_WORD_NAME = /^\p{L}[\p{L}\p{N}&'’.-]*$/u;
|
|
1309
|
+
|
|
1310
|
+
/**
|
|
1311
|
+
* A company's name typed as one word (`Apple`) where a symbol goes, once the
|
|
1312
|
+
* sources said no listing trades as it, read as the listing search names for
|
|
1313
|
+
* it the way a name of several words is (`companyNameListingArg`): "Read
|
|
1314
|
+
* "Apple" as AAPL:NASDAQ (Apple Inc.).". A real ticker never gets here, so it
|
|
1315
|
+
* always wins over a name. A word many names share (`oil`) is a name only
|
|
1316
|
+
* when search puts it first, the service marks it, or a listing's name is
|
|
1317
|
+
* the word alone (`findListingOfCompanyName` with `oneWord`). A coin's name
|
|
1318
|
+
* (`bitcoin`, or any the crypto board lists) and a subject the app knows of
|
|
1319
|
+
* (`carbon`, `freight`) are never read as a company: they keep their own
|
|
1320
|
+
* hint, the coin's pair (BTC-USD) or the search that says where it is. Null
|
|
1321
|
+
* for anything else, and when search names no company or is too busy to say.
|
|
1322
|
+
*/
|
|
1323
|
+
export async function oneWordCompanyName(typed: string, deps: Pick<ListingDeps, "dataProvider">): Promise<ListingArg | null> {
|
|
1324
|
+
const found = await findOneWordCompany(typed, deps);
|
|
1325
|
+
return found ? companyListingArg(typed, found) : null;
|
|
1326
|
+
}
|
|
1327
|
+
|
|
1328
|
+
/** The company `oneWordCompanyName` reads a word as, before it is read as a listing. */
|
|
1329
|
+
async function findOneWordCompany(typed: string, deps: Pick<ListingDeps, "dataProvider">): Promise<CompanyNameListing | null> {
|
|
1330
|
+
const word = typed.trim();
|
|
1331
|
+
if (!ONE_WORD_NAME.test(word) || knownGapMessage(word) || isMajorCoinName(word)) return null;
|
|
1332
|
+
const found = await findCompanyName(word, deps, { oneWord: true }).catch((error: unknown) => {
|
|
1333
|
+
if (!isProviderBusy(error)) throw error;
|
|
1334
|
+
// Intentional ignore: a busy search says nothing about the name, so the word keeps its own "Not a ticker".
|
|
1335
|
+
return null;
|
|
1336
|
+
});
|
|
1337
|
+
if (!found) return null;
|
|
1338
|
+
// The board is read only for a word that names a company, and once for the run (`primeBoardCoins`).
|
|
1339
|
+
if (/^[A-Za-z0-9]+$/.test(word)) await primeBoardCoins([`Not a ticker: ${word.toUpperCase()}.`]);
|
|
1340
|
+
return boardCoinFor(word) ? null : found;
|
|
1341
|
+
}
|
|
1342
|
+
|
|
1343
|
+
function isMajorCoinName(word: string): boolean {
|
|
1344
|
+
const wanted = word.toLowerCase();
|
|
1345
|
+
return [...MAJOR_COIN_NAMES.values()].some((name) => name.toLowerCase() === wanted);
|
|
1346
|
+
}
|
|
1347
|
+
|
|
1348
|
+
function findCompanyName(typed: string, deps: Pick<ListingDeps, "dataProvider">, options: { oneWord?: boolean } = {}): Promise<CompanyNameListing | null> {
|
|
1349
|
+
return findListingOfCompanyName(deps.dataProvider, typed, { meant: true, quoted: true, ...options });
|
|
1350
|
+
}
|
|
1351
|
+
|
|
1352
|
+
async function readCompanyName(typed: string, deps: Pick<ListingDeps, "dataProvider">, options: { oneWord?: boolean } = {}): Promise<ListingArg | null> {
|
|
1353
|
+
const found = await findCompanyName(typed, deps, options);
|
|
1354
|
+
return found ? companyListingArg(typed, found) : null;
|
|
1355
|
+
}
|
|
1356
|
+
|
|
1357
|
+
function companyListingArg(typed: string, found: CompanyNameListing): ListingArg {
|
|
1358
|
+
const key = `${found.symbol}:${found.exchange}`;
|
|
1359
|
+
// A fund or an index carrying the name asks about the company's stock: "Did you mean JPM (JPMorgan Chase & Co.)?".
|
|
1360
|
+
const meant = found.meant ? { symbol: found.meant.symbol, name: found.meant.name } : null;
|
|
1361
|
+
const question = meant ? ` ${meantQuestion({ meant })}` : "";
|
|
1362
|
+
return { ...parseListingArg(key), readAs: `Read "${typed.trim()}" as ${key} (${found.name}).${question}`, ...meant ? { meant } : {} };
|
|
1363
|
+
}
|
|
1364
|
+
|
|
1365
|
+
/**
|
|
1366
|
+
* The listing search names for a company's name typed where a ticker goes,
|
|
1367
|
+
* as a sentence offers it: `PLTR (Palantir Technologies Inc.)`, a listing
|
|
1368
|
+
* abroad with its venue (`SIE:XETRA (Siemens AG)`), a fund or an index that
|
|
1369
|
+
* carries the name as the company's stock it means. Null when the words name
|
|
1370
|
+
* no company, search is busy, or the listing found is the word itself: a
|
|
1371
|
+
* real ticker is never a company's name. Never throws.
|
|
1372
|
+
*/
|
|
1373
|
+
export async function companyNameSuggestion(typed: string, deps: Pick<ListingDeps, "dataProvider">): Promise<{ symbol: string; name: string } | null> {
|
|
1374
|
+
const words = typed.trim().replace(/^\$/, "");
|
|
1375
|
+
if (!words) return null;
|
|
1376
|
+
try {
|
|
1377
|
+
const found = isCompanyNameInput(words) ? await findCompanyName(words, deps).catch(busyAsMiss) : await findOneWordCompany(words, deps);
|
|
1378
|
+
const listing = found?.meant ?? found;
|
|
1379
|
+
if (!listing || listing.symbol.toUpperCase() === words.toUpperCase()) return null;
|
|
1380
|
+
return { symbol: isUsListingExchange(listing.exchange) ? listing.symbol : `${listing.symbol}:${listing.exchange}`, name: listing.name };
|
|
1381
|
+
} catch (error) {
|
|
1382
|
+
logFailure("cli.listing-arg", "Search a company name for a suggestion failed")(error);
|
|
1383
|
+
return null;
|
|
1384
|
+
}
|
|
1385
|
+
}
|
|
1386
|
+
|
|
1387
|
+
/** A search too busy to answer is no company, as a name that matches none. */
|
|
1388
|
+
function busyAsMiss(error: unknown): null {
|
|
1389
|
+
if (!isProviderBusy(error)) throw error;
|
|
1390
|
+
// Intentional ignore: a busy search says nothing about the name, so no company is suggested.
|
|
1391
|
+
return null;
|
|
1392
|
+
}
|
|
1393
|
+
|
|
1394
|
+
/** `resolveCliListing` for a command: a bad exchange fails the command with its message. */
|
|
1395
|
+
export async function requireCliListing(
|
|
1396
|
+
raw: string,
|
|
1397
|
+
exchangeOption: string | null | undefined,
|
|
1398
|
+
deps: ListingDeps,
|
|
1399
|
+
ctx: Pick<CliCommandContext, "fail">,
|
|
1400
|
+
options: { ownExchangeWins?: boolean; venueSuffix?: boolean } = {},
|
|
1401
|
+
): Promise<CliListing> {
|
|
1402
|
+
try {
|
|
1403
|
+
return await resolveCliListing(raw, exchangeOption, deps, options);
|
|
1404
|
+
} catch (error) {
|
|
1405
|
+
if (error instanceof ListingArgError) ctx.fail(error.message, error.details);
|
|
1406
|
+
throw error;
|
|
1407
|
+
}
|
|
1408
|
+
}
|
|
1409
|
+
|
|
1410
|
+
/**
|
|
1411
|
+
* The listing for commands that store things by symbol (notes, alerts). The
|
|
1412
|
+
* data sources are only opened to check an exchange the app does not know.
|
|
1413
|
+
*/
|
|
1414
|
+
export async function requireListingArg(
|
|
1415
|
+
raw: string,
|
|
1416
|
+
exchangeOption: string | null | undefined,
|
|
1417
|
+
ctx: Pick<CliCommandContext, "fail" | "initMarketData">,
|
|
1418
|
+
options: { listingSuffix?: boolean } = {},
|
|
1419
|
+
): Promise<ListingArg> {
|
|
1420
|
+
try {
|
|
1421
|
+
const listing = parseListingArg(raw, exchangeOption, options);
|
|
1422
|
+
if (listing.symbol.endsWith(":") || (listing.exchange && !isKnownExchangeCode(listing.exchange)) || listing.sharedCode) {
|
|
1423
|
+
return await withMarketData(ctx, async (market) => {
|
|
1424
|
+
await checkListingExchange(listing, market);
|
|
1425
|
+
return settleSharedCode(listing, market);
|
|
1426
|
+
});
|
|
1427
|
+
}
|
|
1428
|
+
return listing;
|
|
1429
|
+
} catch (error) {
|
|
1430
|
+
if (error instanceof ListingArgError) ctx.fail(error.message, error.details);
|
|
1431
|
+
throw error;
|
|
1432
|
+
}
|
|
1433
|
+
}
|
|
1434
|
+
|
|
1435
|
+
export interface ListingIdentity {
|
|
1436
|
+
symbol: string;
|
|
1437
|
+
/** Canonical code of the venue the data is for. */
|
|
1438
|
+
exchange: string;
|
|
1439
|
+
/** The listing's company, from its own quote. */
|
|
1440
|
+
name: string | null;
|
|
1441
|
+
}
|
|
1442
|
+
|
|
1443
|
+
export function listingIdentity(
|
|
1444
|
+
listing: Pick<CliListing, "symbol" | "exchange" | "saved">,
|
|
1445
|
+
quote?: Pick<Quote, "name" | "listingExchangeName" | "exchangeName"> | null,
|
|
1446
|
+
): ListingIdentity {
|
|
1447
|
+
const quoteExchange = canonicalExchange(quote?.listingExchangeName || quote?.exchangeName);
|
|
1448
|
+
const exchange = listing.exchange || quoteExchange || canonicalExchange(listing.saved?.metadata.exchange);
|
|
1449
|
+
// The listing's own quote names it, as a portfolio and search do; a quote that prices another venue names another listing's company.
|
|
1450
|
+
return { symbol: listing.symbol, exchange, name: quotedListingName(exchange, quote) || listing.saved?.metadata.name?.trim() || null };
|
|
1451
|
+
}
|
|
1452
|
+
|
|
1453
|
+
/** The listing's own quote, for its company name and venue; null when it has none. */
|
|
1454
|
+
export async function loadListingQuote(dataProvider: DataProvider, listing: Pick<CliListing, "request">): Promise<Quote | null> {
|
|
1455
|
+
return (await loadListingQuoteAnswer(dataProvider, listing)).quote;
|
|
1456
|
+
}
|
|
1457
|
+
|
|
1458
|
+
/** The listing's own quote, or the error its request failed with: "Not a ticker: PALANTIR." for a name typed as a symbol. */
|
|
1459
|
+
export async function loadListingQuoteAnswer(
|
|
1460
|
+
dataProvider: DataProvider,
|
|
1461
|
+
listing: Pick<CliListing, "request">,
|
|
1462
|
+
): Promise<{ quote: Quote | null; error?: unknown }> {
|
|
1463
|
+
try {
|
|
1464
|
+
return { quote: await dataProvider.getQuote(listing.request.symbol, listing.request.exchange) };
|
|
1465
|
+
} catch (error) {
|
|
1466
|
+
return { quote: null, error };
|
|
1467
|
+
}
|
|
1468
|
+
}
|
|
1469
|
+
|
|
1470
|
+
/**
|
|
1471
|
+
* What a listing is: an index, a pair, a future or a coin by its symbol
|
|
1472
|
+
* (^VIX, EURUSD=X), anything else by its quote's type, then its saved record's.
|
|
1473
|
+
* A specific kind outranks a generic equity type, as brokers file funds as
|
|
1474
|
+
* stocks. Null when nothing says, as for a symbol whose quote fails.
|
|
1475
|
+
*/
|
|
1476
|
+
export async function listingInstrument(
|
|
1477
|
+
listing: Pick<CliListing, "key" | "exchange" | "request" | "saved">,
|
|
1478
|
+
deps: Pick<ListingDeps, "dataProvider">,
|
|
1479
|
+
): Promise<InstrumentOfKind | null> {
|
|
1480
|
+
const syntax = kindFromListingSyntax(listing.key, listing.exchange);
|
|
1481
|
+
if (syntax) return { symbol: listing.key, kind: syntax };
|
|
1482
|
+
const quote = await loadListingQuote(deps.dataProvider, listing);
|
|
1483
|
+
const types = [quote?.instrumentType, listing.saved?.metadata.broker_contracts?.[0]?.secType, listing.saved?.metadata.assetCategory];
|
|
1484
|
+
const typed = types.flatMap((type) => {
|
|
1485
|
+
const kind = classifyInstrumentType(type);
|
|
1486
|
+
return kind ? [{ kind, type }] : [];
|
|
1487
|
+
});
|
|
1488
|
+
const found = typed.find(({ kind }) => kind !== "equity") ?? typed[0];
|
|
1489
|
+
return found ? { symbol: listing.key, kind: found.kind, type: found.type ?? null } : null;
|
|
1490
|
+
}
|
|
1491
|
+
|
|
1492
|
+
/** One line above a table naming what it is about: "Sanofi · Euronext Paris (EPA)". */
|
|
1493
|
+
export function listingHeading(identity: ListingIdentity): string {
|
|
1494
|
+
const venue = identity.exchange ? cliStyles.muted(` · ${exchangeLabel(identity.exchange)}`) : "";
|
|
1495
|
+
return `${cliStyles.bold(identity.name || identity.symbol)}${venue}`;
|
|
1496
|
+
}
|
|
1497
|
+
|
|
1498
|
+
/** "Sanofi (EPA)", for sentences. */
|
|
1499
|
+
export function listingTitle(identity: ListingIdentity): string {
|
|
1500
|
+
const name = identity.name || identity.symbol;
|
|
1501
|
+
return identity.exchange ? `${name} (${identity.exchange})` : name;
|
|
1502
|
+
}
|
|
1503
|
+
|
|
1504
|
+
export interface SavedListingName {
|
|
1505
|
+
symbol: string;
|
|
1506
|
+
/** Canonical code of the venue the row is saved for, or "" when it has none. */
|
|
1507
|
+
exchange: string;
|
|
1508
|
+
/** SAN:EPA, whichever way the row is stored (SAN, SAN:XNYS). */
|
|
1509
|
+
key: string;
|
|
1510
|
+
name: string | null;
|
|
1511
|
+
/** "SAN:EPA (Sanofi)", for sentences. */
|
|
1512
|
+
label: string;
|
|
1513
|
+
}
|
|
1514
|
+
|
|
1515
|
+
/** What every collection command reports about the listing it changed, as JSON and as the sentence's subject. */
|
|
1516
|
+
export function listingFields(saved: Pick<SavedListingName, "key" | "symbol" | "exchange" | "name">) {
|
|
1517
|
+
return { listing: saved.key, symbol: saved.symbol, exchange: saved.exchange || null, name: saved.name };
|
|
1518
|
+
}
|
|
1519
|
+
|
|
1520
|
+
/** The listing a saved ticker row is, as a collection command names it after adding or removing it. */
|
|
1521
|
+
export function savedListingName(ticker: TickerRecord): SavedListingName {
|
|
1522
|
+
const { symbol } = parsePublicTickerKey(ticker.metadata.ticker);
|
|
1523
|
+
const exchange = canonicalExchange(ticker.metadata.exchange);
|
|
1524
|
+
const key = exchange ? `${symbol}:${exchange}` : symbol;
|
|
1525
|
+
// A row saved without a company carries its symbol as the name.
|
|
1526
|
+
const typed = ticker.metadata.name?.trim();
|
|
1527
|
+
const name = typed && typed !== symbol && typed !== ticker.metadata.ticker ? typed : null;
|
|
1528
|
+
return { symbol, exchange, key, name, label: name ? `${key} (${name})` : key };
|
|
1529
|
+
}
|