gloomberb 0.16.4 → 0.16.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -91
- package/package.json +5 -1
- package/src/{plugins/builtin/cloud → account}/auth-form.tsx +9 -9
- package/src/{plugins/builtin/cloud → account}/auth-model.ts +4 -4
- package/src/account/billing.ts +57 -0
- package/src/{plugins/builtin/cloud → account}/device-signin-dialog.tsx +18 -12
- package/src/{plugins/builtin/cloud → account}/device-signin.ts +2 -2
- package/src/{plugins/builtin/cloud → account}/email-auth-attempt.ts +2 -2
- package/src/account/session.ts +16 -0
- package/src/{plugins/builtin/cloud → account}/upgrade-dialog.tsx +16 -15
- package/src/{plugins/builtin/cloud → account}/upgrade-personalization.ts +7 -7
- package/src/{plugins/builtin/cloud → account}/upgrade-tickers.ts +6 -6
- package/src/{plugins/builtin/cloud → account}/verification-panel.tsx +6 -6
- package/src/api-client/central-bank-rates.ts +6 -1
- package/src/api-client/chat.ts +26 -0
- package/src/api-client/credit-boards.ts +2 -0
- package/src/api-client/data.ts +73 -3
- package/src/api-client/earnings.ts +6 -0
- package/src/api-client/europe-energy.ts +106 -0
- package/src/api-client/futures-curve.ts +56 -0
- package/src/api-client/index.ts +13 -1
- package/src/api-client/market-discovery.ts +13 -1
- package/src/api-client/normalizers.ts +32 -0
- package/src/api-client/paths.ts +7 -0
- package/src/api-client/perps.ts +8 -0
- package/src/api-client/request.ts +9 -2
- package/src/api-client/research-activity.ts +15 -10
- package/src/api-client/socket.ts +29 -0
- package/src/api-client/themes.ts +22 -1
- package/src/api-client/types.ts +78 -2
- package/src/api-client/yield-curves.ts +8 -0
- package/src/app/global-shortcuts.ts +50 -2
- package/src/app/keybindings/actions.ts +12 -1
- package/src/app/pane-runtime/plugin-bindings.ts +2 -2
- package/src/app/pane-runtime/ticker-open-runtime.ts +16 -6
- package/src/app/runtime/desktop-deeplink.ts +10 -5
- package/src/app/runtime/startup.ts +1 -1
- package/src/app.tsx +6 -0
- package/src/architecture/core-builtin-allowlist.json +8 -26
- package/src/ask-gloom/pane-context.ts +114 -0
- package/src/ask-gloom/pane-request.ts +70 -0
- package/src/ask-gloom/pane-text.ts +201 -0
- package/src/brokers/signed-in/sign-in-dialog.tsx +11 -5
- package/src/capabilities/chart-series.ts +19 -2
- package/src/capabilities/factories.ts +1 -0
- package/src/cli/central-bank-events.ts +23 -0
- package/src/cli/command-options.ts +17 -5
- package/src/cli/commands/crypto-hints.ts +35 -2
- package/src/cli/commands/fred-series.ts +146 -0
- package/src/cli/commands/market.ts +501 -115
- package/src/cli/commands/news-hints.ts +62 -0
- package/src/cli/commands/news-search.ts +53 -0
- package/src/cli/commands/options-leaps.ts +5 -2
- package/src/cli/commands/overview.ts +132 -26
- package/src/cli/commands/remote.ts +2 -1
- package/src/cli/commands/search.ts +317 -13
- package/src/cli/commands/system.ts +55 -8
- package/src/cli/commands/ticker.ts +155 -18
- package/src/cli/context.ts +45 -14
- package/src/cli/desktop-pane-shot.ts +76 -7
- package/src/cli/earnings-calendar.ts +71 -0
- package/src/cli/errors.ts +7 -5
- package/src/cli/exit-codes.ts +8 -0
- package/src/cli/export-source.ts +58 -0
- package/src/cli/freshness.ts +18 -7
- package/src/cli/glossary.ts +483 -0
- package/src/cli/help.ts +10 -0
- package/src/cli/helpers.ts +2 -5
- package/src/cli/history-rows.ts +118 -7
- package/src/cli/index-roots.ts +7 -0
- package/src/cli/index.ts +29 -9
- package/src/cli/known-gaps.ts +84 -0
- package/src/cli/listing-arg.ts +551 -97
- package/src/cli/not-a-ticker.ts +24 -9
- package/src/cli/pane-functions/access-gate.ts +13 -2
- package/src/cli/pane-functions/capabilities.ts +4 -3
- package/src/cli/pane-functions/catalog.ts +214 -40
- package/src/cli/pane-functions/data.ts +42 -8
- package/src/cli/pane-functions/discovery.ts +1 -0
- package/src/cli/pane-functions/dom.ts +37 -8
- package/src/cli/pane-functions/freshness.ts +393 -49
- package/src/cli/pane-functions/function-help.ts +31 -15
- package/src/cli/pane-functions/headless.ts +98 -30
- package/src/cli/pane-functions/index.ts +101 -19
- package/src/cli/pane-functions/market-session.ts +22 -8
- package/src/cli/pane-functions/options.ts +71 -22
- package/src/cli/pane-functions/report-notices.ts +25 -7
- package/src/cli/pane-functions/report.ts +15 -8
- package/src/cli/pane-functions/resolver.ts +74 -19
- package/src/cli/pane-functions/screenshot.ts +250 -27
- package/src/cli/perpetual-contract.ts +60 -0
- package/src/cli/registry.ts +3 -1
- package/src/cli/report-tables.ts +26 -7
- package/src/cli/result.ts +45 -11
- package/src/cli/series-search.ts +111 -0
- package/src/cli/staged-tickers.ts +52 -0
- package/src/cli/symbol-args.ts +27 -0
- package/src/cli/symbol-list.ts +154 -0
- package/src/cli/symbol-rows.ts +154 -0
- package/src/cli/ticker-resolution.ts +311 -27
- package/src/cli/types.ts +5 -0
- package/src/components/chart/composite/axis-overlays.tsx +14 -3
- package/src/components/chart/composite/composite-chart.tsx +71 -11
- package/src/components/chart/composite/crosshair-readout.tsx +150 -0
- package/src/components/chart/composite/downsample.ts +1 -1
- package/src/components/chart/composite/format.ts +29 -0
- package/src/components/chart/composite/interactions.ts +9 -2
- package/src/components/chart/composite/legend.tsx +100 -33
- package/src/components/chart/composite/panel-bitmap.ts +70 -35
- package/src/components/chart/composite/panel-labels.ts +18 -17
- package/src/components/chart/composite/panel-series.ts +1 -0
- package/src/components/chart/composite/panel-surface.tsx +46 -21
- package/src/components/chart/composite/price-axis-labels.tsx +3 -1
- package/src/components/chart/composite/rasterizer.ts +50 -8
- package/src/components/chart/composite/scene.ts +2 -1
- package/src/components/chart/composite/time-scale.ts +26 -9
- package/src/components/chart/composite/types.ts +18 -0
- package/src/components/chart/composite/use-composite-viewport.ts +30 -2
- package/src/components/chart/native/raster/crosshair.ts +8 -3
- package/src/components/chart/native/raster/primitives.ts +85 -21
- package/src/components/chart/native/surface/manager.ts +33 -8
- package/src/components/chart/surface3d/chart.tsx +1 -1
- package/src/components/command-bar/action-runtime.ts +1 -1
- package/src/components/command-bar/commands/collection-list.ts +210 -0
- package/src/components/command-bar/commands/collection.ts +40 -1
- package/src/components/command-bar/commands/direct/index.ts +4 -0
- package/src/components/command-bar/commands/registry.ts +8 -0
- package/src/components/command-bar/panel/index.tsx +11 -3
- package/src/components/command-bar/panel/runtime.ts +3 -0
- package/src/components/command-bar/panel/types.ts +2 -0
- package/src/components/command-bar/routes/root/plugin-install.ts +4 -4
- package/src/components/command-bar/routes/root/provider-search.ts +4 -3
- package/src/components/command-bar/routes/ticker-search/results.ts +12 -11
- package/src/components/command-bar/routes/ticker-search/route.ts +4 -3
- package/src/components/command-bar/routing/actions.ts +1 -1
- package/src/components/command-bar/workflow/tickers.ts +42 -17
- package/src/components/layout/detached-pane-shell.tsx +68 -39
- package/src/components/layout/floating-pane.tsx +10 -1
- package/src/components/layout/header.tsx +25 -5
- package/src/components/layout/missing-pane.tsx +3 -3
- 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 +7 -13
- package/src/components/layout/pane/footer/index.tsx +6 -2
- package/src/components/layout/pane/footer/keyboard.ts +3 -0
- package/src/components/layout/pane/footer/model.ts +41 -1
- package/src/components/layout/pane/header.tsx +50 -1
- package/src/components/layout/pane/index.tsx +21 -3
- package/src/components/layout/pane/sidebar.tsx +88 -21
- package/src/components/layout/shell/active-drag.ts +21 -5
- package/src/components/layout/shell/cursor-occlusion.ts +2 -1
- package/src/components/layout/shell/drag/index.ts +39 -9
- package/src/components/layout/shell/drag/live.ts +61 -51
- package/src/components/layout/shell/drag/runtime.ts +54 -12
- package/src/components/layout/shell/index.tsx +84 -65
- package/src/components/layout/shell/menu.ts +14 -1
- package/src/components/layout/shell/native/pointer-runtime.ts +3 -1
- package/src/components/layout/shell/pane/actions.ts +32 -10
- package/src/components/layout/shell/pane/ask.ts +131 -0
- package/src/components/layout/shell/pane/capture.ts +162 -0
- package/src/components/layout/shell/pane/layers.tsx +218 -50
- package/src/components/layout/shell/pane/management-shortcuts.ts +46 -1
- package/src/components/layout/shell/shortcuts.ts +21 -4
- package/src/components/layout/shell/terminal-pointer-runtime.ts +24 -0
- package/src/components/markdown-text.tsx +62 -20
- package/src/components/metric-treemap/heat-surface.tsx +8 -1
- package/src/components/onboarding/account-step/form-panel.tsx +1 -1
- package/src/components/onboarding/account-step/index.tsx +1 -1
- package/src/components/onboarding/account-step/qr-panel.tsx +1 -1
- package/src/components/onboarding/account-step/signed-in-panel.tsx +1 -1
- package/src/components/onboarding/onboarding-keyboard.ts +1 -1
- package/src/components/onboarding/onboarding-wizard.tsx +2 -2
- package/src/components/onboarding/use-onboarding-upgrade.ts +3 -3
- package/src/components/onboarding/wizard-account.ts +2 -2
- package/src/components/pane-template-wizard.tsx +9 -1
- package/src/components/price-selector-dialog.tsx +11 -2
- package/src/components/reader/article-reader.tsx +642 -0
- package/src/components/reader/article-text.ts +527 -0
- package/src/components/sign-in-gate.tsx +3 -3
- package/src/components/ticker/list-table-view.tsx +43 -2
- package/src/components/ui/action-row.tsx +2 -1
- package/src/components/ui/button.tsx +7 -1
- package/src/components/ui/choice-dialog.tsx +6 -4
- package/src/components/ui/confirm-dialog.tsx +28 -18
- package/src/components/ui/data-table/index.tsx +18 -6
- package/src/components/ui/data-table/opentui/index.tsx +37 -6
- package/src/components/ui/data-table/types.ts +12 -0
- package/src/components/ui/dialog-actions.tsx +64 -0
- package/src/components/ui/display.tsx +17 -3
- package/src/components/ui/frame.tsx +35 -2
- package/src/components/ui/icon.tsx +6 -1
- package/src/components/ui/query-bar.tsx +10 -1
- package/src/components/ui/text-prompt-dialog.tsx +11 -9
- package/src/data/cached-query.ts +2 -0
- package/src/data/config/store/migrations.ts +7 -0
- package/src/data/config/store/normalize.ts +7 -2
- package/src/data/config/store/portfolio-as-of-column.ts +57 -0
- package/src/data/ticker-repository.ts +5 -0
- package/src/data/ticker-store.ts +15 -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 +7555 -0
- package/src/docs/topics.ts +216 -0
- package/src/i18n/es.ts +65 -5
- package/src/i18n/ja.ts +65 -5
- package/src/i18n/ko.ts +65 -5
- package/src/i18n/zh-cn.ts +65 -5
- package/src/i18n/zh-tw.ts +65 -5
- package/src/layout/desks.ts +1 -1
- package/src/layout/pane-manager/dock-tree.ts +18 -0
- package/src/layout/pane-manager/index.ts +1 -0
- package/src/layout-marketplace/gallery.tsx +1 -1
- package/src/market-data/coordinator/chart.ts +10 -4
- package/src/market-data/coordinator/index.ts +6 -3
- package/src/{plugins/builtin/futures/contracts.ts → market-data/futures-board.ts} +81 -28
- package/src/market-data/futures-contract.ts +151 -0
- package/src/market-data/hooks.tsx +10 -2
- package/src/market-data/market/format.ts +39 -21
- package/src/market-data/market/freshness.ts +84 -20
- package/src/market-data/market/session-close-note.ts +3 -2
- package/src/market-data/market/status.ts +19 -23
- package/src/market-data/published-apac-sessions.ts +23 -1
- package/src/market-data/quotes/contributions.ts +5 -0
- package/src/market-data/quotes/metadata.ts +19 -24
- package/src/market-data/quotes/resolution.ts +5 -0
- package/src/market-data/quotes/screener-live-quotes.ts +5 -4
- package/src/market-data/result-types.ts +2 -0
- package/src/notifications/app-notifier.ts +17 -1
- package/src/notifications/notification-log.ts +180 -0
- package/src/plugins/auto-update-node.ts +2 -2
- package/src/plugins/auto-update.ts +2 -2
- package/src/plugins/builtin/account-management/index.tsx +1 -0
- package/src/plugins/builtin/account-management/model.ts +1 -56
- package/src/plugins/builtin/account-management/pane.tsx +6 -4
- package/src/plugins/builtin/account-management/password-dialog.tsx +1 -1
- package/src/plugins/builtin/alerts/catalysts.ts +1 -1
- package/src/plugins/builtin/alerts/cli.ts +313 -47
- package/src/plugins/builtin/alerts/events-pane.tsx +45 -7
- package/src/plugins/builtin/alerts/events.ts +23 -2
- package/src/plugins/builtin/alerts/focus.ts +27 -0
- package/src/plugins/builtin/alerts/history-pane.tsx +7 -2
- package/src/plugins/builtin/alerts/history.ts +2 -0
- package/src/plugins/builtin/alerts/index.tsx +47 -11
- package/src/plugins/builtin/alerts/pane.tsx +27 -1
- package/src/plugins/builtin/alerts/research-builder.ts +8 -3
- package/src/plugins/builtin/alerts/research-rules.ts +18 -2
- package/src/plugins/builtin/alerts/scheduled-check.ts +122 -0
- package/src/plugins/builtin/alerts/scheduled-sources.ts +25 -0
- package/src/plugins/builtin/alerts/scheduled.ts +254 -0
- package/src/plugins/builtin/alerts/targets.ts +92 -0
- package/src/plugins/builtin/analytics/index.tsx +8 -3
- package/src/plugins/builtin/analytics/risk-headless.ts +60 -27
- package/src/plugins/builtin/analytics/risk-math.ts +91 -27
- package/src/plugins/builtin/analytics/risk-model.ts +35 -5
- package/src/plugins/builtin/analytics/risk-pane.tsx +15 -8
- package/src/plugins/builtin/attention/headless.ts +1 -1
- package/src/plugins/builtin/attention/index.tsx +2 -0
- package/src/plugins/builtin/attention/pane.tsx +3 -1
- package/src/plugins/builtin/attention/series.ts +26 -0
- package/src/plugins/builtin/awards/headless.ts +88 -18
- package/src/plugins/builtin/awards/index.tsx +2 -0
- package/src/plugins/builtin/awards/model.ts +41 -1
- package/src/plugins/builtin/awards/pane.tsx +22 -13
- package/src/plugins/builtin/awards/series.ts +29 -0
- package/src/plugins/builtin/backtest/headless.ts +2 -2
- package/src/plugins/builtin/bond-calculator/model.ts +2 -1
- package/src/plugins/builtin/broker-manager/index.tsx +1 -0
- package/src/plugins/builtin/catalysts/headless.ts +1 -1
- package/src/plugins/builtin/catalysts/pane.tsx +3 -1
- package/src/plugins/builtin/cds/client.ts +49 -12
- package/src/plugins/builtin/cds/headless.ts +119 -19
- package/src/plugins/builtin/cds/index.tsx +3 -1
- package/src/plugins/builtin/cds/model.ts +214 -32
- package/src/plugins/builtin/cds/pane.tsx +58 -14
- package/src/plugins/builtin/cds/series.ts +19 -0
- package/src/plugins/builtin/central-bank-rates/client.ts +4 -0
- package/src/plugins/builtin/central-bank-rates/headless.ts +46 -16
- package/src/plugins/builtin/central-bank-rates/index.tsx +3 -1
- package/src/plugins/builtin/central-bank-rates/model.ts +99 -0
- package/src/plugins/builtin/central-bank-rates/pane.tsx +1 -1
- package/src/plugins/builtin/central-bank-rates/series.ts +36 -0
- package/src/plugins/builtin/chart-composer/catalog-inventory.ts +193 -255
- package/src/plugins/builtin/chart-composer/data-catalog-pane.tsx +84 -46
- package/src/plugins/builtin/chart-composer/editor.tsx +5 -4
- package/src/plugins/builtin/chart-composer/field-series.ts +40 -0
- package/src/plugins/builtin/chart-composer/headless-schema.ts +1 -1
- package/src/plugins/builtin/chart-composer/headless.ts +70 -5
- package/src/plugins/builtin/chart-composer/index.tsx +15 -3
- package/src/plugins/builtin/chart-composer/pane.tsx +81 -38
- package/src/plugins/builtin/chart-composer/series-catalog.ts +58 -50
- package/src/plugins/builtin/chart-composer/series-expression.ts +18 -10
- package/src/plugins/builtin/chart-composer/use-series-catalog.ts +59 -3
- package/src/plugins/builtin/chart-composer/user-series.ts +84 -0
- package/src/plugins/builtin/chat/content/composer-runtime.ts +6 -1
- package/src/plugins/builtin/chat/content/composer.tsx +5 -1
- package/src/plugins/builtin/chat/content/footer.tsx +12 -0
- package/src/plugins/builtin/chat/content/index.tsx +89 -5
- package/src/plugins/builtin/chat/content/new-dm-dialog.tsx +10 -2
- package/src/plugins/builtin/chat/content/new-messages.tsx +89 -0
- package/src/plugins/builtin/chat/content/row-activity.ts +132 -0
- package/src/plugins/builtin/chat/content/scroll.ts +127 -27
- package/src/plugins/builtin/chat/content/shortcuts.ts +2 -2
- package/src/plugins/builtin/chat/content/transcript.tsx +145 -78
- package/src/plugins/builtin/chat/content/types.ts +1 -0
- package/src/plugins/builtin/chat/controller/fetch.ts +8 -2
- package/src/plugins/builtin/chat/controller/index.ts +123 -1
- package/src/plugins/builtin/chat/controller/message-loading.ts +3 -0
- package/src/plugins/builtin/chat/controller/messages.ts +7 -2
- package/src/plugins/builtin/chat/controller/realtime.ts +10 -1
- package/src/plugins/builtin/chat/controller/send.ts +61 -1
- package/src/plugins/builtin/chat/controller/state.ts +8 -0
- package/src/plugins/builtin/chat/ghost-user.ts +20 -0
- package/src/plugins/builtin/chat/index.tsx +23 -5
- package/src/plugins/builtin/chat/layout.ts +78 -5
- package/src/plugins/builtin/chat/message/ai-badge.tsx +18 -0
- package/src/plugins/builtin/chat/message/desktop.tsx +55 -6
- package/src/plugins/builtin/chat/message/header.tsx +16 -4
- package/src/plugins/builtin/chat/message/profile-popover.tsx +5 -1
- package/src/plugins/builtin/chat/message/reactions.tsx +210 -0
- package/src/plugins/builtin/chat/message/render-state.ts +18 -2
- package/src/plugins/builtin/chat/message/terminal.tsx +43 -4
- package/src/plugins/builtin/chat/message/types.ts +12 -0
- package/src/plugins/builtin/chat/reactions.ts +197 -0
- package/src/plugins/builtin/chat/share/flow.tsx +87 -0
- package/src/plugins/builtin/chat/share/targets.ts +27 -0
- package/src/plugins/builtin/chat/status-widget.tsx +6 -3
- package/src/plugins/builtin/chat/unread-inbox-pane.tsx +148 -27
- package/src/plugins/builtin/chat/unread-inbox.ts +22 -0
- package/src/plugins/builtin/cloud/askg/attached-pane.tsx +69 -0
- package/src/plugins/builtin/cloud/askg/controller.ts +111 -19
- package/src/plugins/builtin/cloud/askg/executor.ts +57 -3
- package/src/plugins/builtin/cloud/askg/manifest.ts +32 -7
- package/src/plugins/builtin/cloud/askg/model.ts +27 -8
- package/src/plugins/builtin/cloud/askg/pane-attachment.ts +94 -0
- package/src/plugins/builtin/cloud/askg/pane.tsx +141 -12
- package/src/plugins/builtin/cloud/askg/pending-question.ts +11 -0
- package/src/plugins/builtin/cloud/askg/protocol.ts +10 -1
- package/src/plugins/builtin/cloud/askg/tool-display.ts +3 -0
- package/src/plugins/builtin/cloud/askg/undo.ts +2 -0
- package/src/plugins/builtin/cloud/auth-actions.tsx +1 -1
- package/src/plugins/builtin/cloud/auth-commands.ts +1 -1
- package/src/plugins/builtin/cloud/auth-dialog.tsx +3 -3
- package/src/plugins/builtin/cloud/company-picker.tsx +1 -1
- package/src/plugins/builtin/cloud/mcp-connect/dialog.tsx +3 -0
- package/src/plugins/builtin/cloud/plugin.tsx +19 -2
- package/src/plugins/builtin/cloud/team/model.ts +5 -0
- package/src/plugins/builtin/cloud/team/module.tsx +1 -0
- package/src/plugins/builtin/cloud/team/store.ts +8 -3
- package/src/plugins/builtin/cloud/terminal-relay/engine.ts +77 -9
- package/src/plugins/builtin/cloud/terminal-relay/manifest.ts +6 -1
- package/src/plugins/builtin/cloud/terminal-relay/policy.ts +9 -0
- package/src/plugins/builtin/cloud/terminal-relay/prompts.tsx +35 -11
- package/src/plugins/builtin/cloud/thesis/exposure.ts +1 -1
- package/src/plugins/builtin/cloud/thesis/module.tsx +1 -0
- package/src/plugins/builtin/cloud/thesis/prompts.tsx +2 -1
- package/src/plugins/builtin/company-attention/app-rank.tsx +1 -1
- package/src/plugins/builtin/company-attention/headless.ts +21 -7
- package/src/plugins/builtin/company-attention/index.tsx +2 -0
- package/src/plugins/builtin/company-attention/model.ts +26 -7
- package/src/plugins/builtin/company-attention/pane.tsx +12 -9
- package/src/plugins/builtin/company-attention/series.ts +52 -0
- package/src/plugins/builtin/company-kpis/headless.ts +97 -10
- package/src/plugins/builtin/company-kpis/model.ts +24 -2
- package/src/plugins/builtin/company-kpis/pane.tsx +17 -16
- package/src/plugins/builtin/composite-plugins.ts +19 -13
- package/src/plugins/builtin/connections/index.ts +1 -0
- package/src/plugins/builtin/cot/headless.ts +1 -1
- package/src/plugins/builtin/cot/index.tsx +3 -1
- package/src/plugins/builtin/cot/model.ts +40 -11
- package/src/plugins/builtin/cot/series.ts +27 -0
- package/src/plugins/builtin/cpi/headless.ts +3 -3
- package/src/plugins/builtin/credit-boards/cdx-pane.tsx +10 -1
- package/src/plugins/builtin/credit-boards/client.ts +6 -2
- package/src/plugins/builtin/credit-boards/headless.ts +108 -31
- package/src/plugins/builtin/credit-boards/index.tsx +2 -0
- package/src/plugins/builtin/credit-boards/model.ts +11 -1
- package/src/plugins/builtin/credit-boards/series.ts +66 -0
- package/src/plugins/builtin/credit-conditions/client.ts +12 -9
- package/src/plugins/builtin/credit-conditions/headless.ts +13 -2
- package/src/plugins/builtin/credit-conditions/index.tsx +18 -9
- package/src/plugins/builtin/credit-conditions/model.ts +19 -11
- package/src/plugins/builtin/credit-conditions/series.ts +16 -0
- package/src/plugins/builtin/credit-documents/headless.ts +33 -3
- package/src/plugins/builtin/credit-documents/pane.tsx +3 -1
- package/src/plugins/builtin/crypto-board/headless.ts +2 -3
- package/src/plugins/builtin/crypto-board/index.tsx +2 -0
- package/src/plugins/builtin/crypto-board/model.ts +12 -0
- package/src/plugins/builtin/crypto-board/pane.tsx +19 -12
- package/src/plugins/builtin/crypto-board/series.ts +48 -0
- package/src/plugins/builtin/custom-view/live-quotes.ts +2 -2
- package/src/plugins/builtin/debt-maturities/headless.ts +17 -11
- package/src/plugins/builtin/debt-maturities/index.tsx +2 -0
- package/src/plugins/builtin/debt-maturities/series.ts +45 -0
- package/src/plugins/builtin/dividend-yield/client.ts +3 -0
- package/src/plugins/builtin/dividend-yield/headless.ts +7 -4
- package/src/plugins/builtin/dividend-yield/index.tsx +3 -1
- package/src/plugins/builtin/dividend-yield/pane.tsx +3 -1
- package/src/plugins/builtin/dividend-yield/series.ts +20 -0
- package/src/plugins/builtin/dividend-yield/types.ts +2 -0
- package/src/plugins/builtin/docs/blocks.tsx +181 -0
- package/src/plugins/builtin/docs/index.tsx +68 -0
- package/src/plugins/builtin/docs/pane.tsx +426 -0
- package/src/plugins/builtin/docs/targets.ts +72 -0
- package/src/plugins/builtin/docs/use-docs.ts +60 -0
- package/src/plugins/builtin/doe/headless.ts +12 -8
- package/src/plugins/builtin/doe/index.tsx +2 -0
- package/src/plugins/builtin/doe/series.ts +62 -0
- package/src/plugins/builtin/earnings/client.ts +3 -2
- package/src/plugins/builtin/earnings/format.ts +1 -5
- package/src/plugins/builtin/earnings/headless.ts +58 -6
- package/src/plugins/builtin/earnings/history-model.ts +15 -1
- package/src/plugins/builtin/earnings/history-table.ts +13 -2
- package/src/plugins/builtin/earnings/history.tsx +7 -3
- package/src/plugins/builtin/earnings/index.tsx +9 -0
- package/src/plugins/builtin/earnings-calls/headless.ts +28 -2
- package/src/plugins/builtin/earnings-calls/index.tsx +1 -1
- package/src/plugins/builtin/earnings-ripple/index.tsx +2 -0
- package/src/plugins/builtin/econ/fred-catalog.ts +198 -0
- package/src/plugins/builtin/econ/fred-series-map.ts +0 -46
- package/src/plugins/builtin/econ/index.tsx +2 -0
- package/src/plugins/builtin/econ-statistics/defs.ts +5 -0
- package/src/plugins/builtin/econ-statistics/headless.ts +19 -4
- package/src/plugins/builtin/econ-statistics/stats.ts +1 -0
- package/src/plugins/builtin/equity-screener/headless.ts +3 -3
- package/src/plugins/builtin/equity-screener/pane.tsx +4 -11
- package/src/plugins/builtin/estimate-revisions/headless.ts +3 -3
- package/src/plugins/builtin/exposure/drivers.ts +13 -0
- package/src/plugins/builtin/exposure/headless.ts +205 -13
- package/src/plugins/builtin/exposure/holdings.ts +1 -1
- package/src/plugins/builtin/exposure/index.tsx +1 -0
- package/src/plugins/builtin/exposure/model.ts +23 -3
- package/src/plugins/builtin/exposure/pane.tsx +14 -12
- package/src/plugins/builtin/fear-greed/index.tsx +18 -10
- package/src/plugins/builtin/fear-greed/series.ts +52 -0
- package/src/plugins/builtin/futures/index.tsx +43 -3
- package/src/plugins/builtin/futures/model.ts +1 -1
- package/src/plugins/builtin/futures/returns.ts +1 -1
- package/src/plugins/builtin/futures/series.ts +13 -0
- package/src/plugins/builtin/futures/table.tsx +1 -1
- package/src/plugins/builtin/futures/use-front-returns.ts +1 -1
- package/src/plugins/builtin/futures-curve/client.ts +12 -3
- package/src/plugins/builtin/futures-curve/headless.ts +71 -10
- package/src/plugins/builtin/futures-curve/index.tsx +1 -1
- package/src/plugins/builtin/futures-curve/model.ts +66 -11
- package/src/plugins/builtin/futures-curve/pane.tsx +52 -18
- package/src/plugins/builtin/fx-matrix/client.ts +63 -0
- package/src/plugins/builtin/fx-matrix/export.ts +2 -1
- package/src/plugins/builtin/fx-matrix/headless.ts +154 -0
- package/src/plugins/builtin/fx-matrix/index.tsx +4 -4
- package/src/plugins/builtin/gpu/board.tsx +13 -10
- package/src/plugins/builtin/gpu/changes.tsx +4 -4
- package/src/plugins/builtin/gpu/client.ts +19 -1
- package/src/plugins/builtin/gpu/equities.tsx +14 -10
- package/src/plugins/builtin/gpu/headless.ts +58 -27
- package/src/plugins/builtin/gpu/history.tsx +3 -3
- package/src/plugins/builtin/gpu/index.tsx +2 -0
- package/src/plugins/builtin/gpu/model.ts +101 -16
- package/src/plugins/builtin/gpu/pane.tsx +28 -12
- package/src/plugins/builtin/gpu/series.ts +38 -0
- package/src/plugins/builtin/help/function-card.tsx +25 -6
- package/src/plugins/builtin/help/function-index.ts +2 -0
- package/src/plugins/builtin/help/index.tsx +31 -9
- package/src/plugins/builtin/holders/beneficial-model.ts +90 -3
- package/src/plugins/builtin/holders/beneficial-report.ts +57 -5
- package/src/plugins/builtin/holders/beneficial-view.tsx +55 -11
- package/src/plugins/builtin/holders/client.ts +22 -3
- package/src/plugins/builtin/holders/format.ts +18 -3
- package/src/plugins/builtin/holders/headless.ts +36 -133
- package/src/plugins/builtin/holders/pane.tsx +11 -4
- package/src/plugins/builtin/holders/report-header.ts +40 -5
- package/src/plugins/builtin/holders/report-rows.ts +240 -0
- package/src/plugins/builtin/insider/client.ts +35 -20
- package/src/plugins/builtin/insider/headless.ts +41 -11
- package/src/plugins/builtin/insider/index.tsx +26 -9
- package/src/plugins/builtin/insider/insider-data.ts +10 -0
- package/src/plugins/builtin/insider/issuer.ts +49 -0
- package/src/plugins/builtin/insider/model.ts +3 -0
- package/src/plugins/builtin/ipo-calendar/headless.ts +1 -1
- package/src/plugins/builtin/iv-history/client.ts +20 -6
- package/src/plugins/builtin/iv-history/format.ts +9 -0
- package/src/plugins/builtin/iv-history/headless.ts +56 -21
- package/src/plugins/builtin/iv-history/index.tsx +2 -0
- package/src/plugins/builtin/iv-history/model.ts +143 -8
- package/src/plugins/builtin/iv-history/screen-pane.tsx +5 -9
- package/src/plugins/builtin/iv-history/series.ts +29 -0
- package/src/plugins/builtin/jobs/headless.ts +26 -3
- package/src/plugins/builtin/jobs/index.tsx +3 -1
- package/src/plugins/builtin/jobs/series.ts +19 -0
- package/src/plugins/builtin/kelly-sizer/index.tsx +2 -0
- package/src/plugins/builtin/kelly-sizer/pane.tsx +2 -1
- package/src/plugins/builtin/kelly-sizer/portfolio.ts +0 -39
- package/src/plugins/builtin/macro-day/client.ts +44 -3
- package/src/plugins/builtin/macro-day/headless.ts +13 -10
- package/src/plugins/builtin/macro-day/model.ts +56 -10
- package/src/plugins/builtin/macro-day/pane.tsx +30 -20
- package/src/plugins/builtin/market-heatmap/headless.ts +20 -5
- package/src/plugins/builtin/market-heatmap/index.tsx +6 -0
- package/src/plugins/builtin/market-heatmap/model.ts +19 -11
- package/src/plugins/builtin/market-heatmap/portfolio.ts +2 -2
- package/src/plugins/builtin/market-movers/client.ts +7 -5
- package/src/plugins/builtin/market-movers/index.tsx +3 -2
- package/src/plugins/builtin/market-movers/model.ts +30 -0
- package/src/plugins/builtin/market-movers/screener.ts +31 -0
- package/src/plugins/builtin/market-valuation/chart-series.ts +29 -69
- package/src/plugins/builtin/market-valuation/index.tsx +3 -3
- package/src/plugins/builtin/market-valuation/indicators.ts +0 -5
- package/src/plugins/builtin/members/headless.ts +8 -3
- package/src/plugins/builtin/members/model.ts +31 -3
- package/src/plugins/builtin/members/pane.tsx +6 -8
- package/src/plugins/builtin/mna/distress/headless.ts +4 -4
- package/src/plugins/builtin/mna/headless.ts +18 -6
- package/src/plugins/builtin/money-markets/headless.ts +5 -4
- package/src/plugins/builtin/money-markets/index.tsx +2 -0
- package/src/plugins/builtin/money-markets/series.ts +41 -0
- package/src/plugins/builtin/news/index.tsx +0 -2
- package/src/plugins/builtin/news/wire/news/detail-view.tsx +53 -104
- package/src/plugins/builtin/news/wire/news/footer.ts +2 -25
- package/src/plugins/builtin/news/wire/news/preset-pane.tsx +0 -2
- package/src/plugins/builtin/notes/cli.ts +12 -7
- package/src/plugins/builtin/notes/index.tsx +1 -0
- package/src/plugins/builtin/options/index.tsx +3 -0
- package/src/plugins/builtin/options/view.tsx +1 -1
- package/src/plugins/builtin/options-calculator/inputs.ts +2 -1
- package/src/plugins/builtin/options-positioning/client.ts +7 -3
- package/src/plugins/builtin/options-positioning/headless.ts +4 -3
- package/src/plugins/builtin/options-positioning/pane.tsx +2 -2
- package/src/plugins/builtin/options-scenario/client.ts +2 -1
- package/src/plugins/builtin/options-scenario/headless.ts +1 -0
- package/src/plugins/builtin/options-scenario/hedge.ts +2 -1
- package/src/plugins/builtin/perps/client.ts +90 -16
- package/src/plugins/builtin/perps/equity-row.tsx +52 -17
- package/src/plugins/builtin/perps/freshness.ts +66 -0
- package/src/plugins/builtin/perps/headless.ts +47 -32
- package/src/plugins/builtin/perps/index.tsx +23 -4
- package/src/plugins/builtin/perps/list-perpetuals.ts +118 -0
- package/src/plugins/builtin/perps/model.ts +20 -5
- package/src/plugins/builtin/perps/open-market.ts +15 -0
- package/src/plugins/builtin/perps/pane.tsx +76 -20
- package/src/plugins/builtin/perps/series.ts +76 -0
- package/src/plugins/builtin/plugin-marketplace/index.tsx +1 -1
- package/src/plugins/builtin/plugin-marketplace/pane.tsx +73 -67
- package/src/plugins/builtin/plugin-module.ts +3 -0
- package/src/plugins/builtin/portfolio-list/account-metrics.ts +1 -1
- package/src/plugins/builtin/portfolio-list/allocation.ts +5 -4
- package/src/plugins/builtin/portfolio-list/cell-version.ts +8 -1
- package/src/plugins/builtin/portfolio-list/cli/bulk-symbols.ts +161 -0
- package/src/plugins/builtin/portfolio-list/cli/import-13f.ts +109 -0
- package/src/plugins/builtin/portfolio-list/cli/portfolio-command.ts +384 -74
- package/src/plugins/builtin/portfolio-list/cli/render.ts +437 -71
- package/src/plugins/builtin/portfolio-list/cli/shared.ts +21 -4
- package/src/plugins/builtin/portfolio-list/cli/watchlist-command.ts +121 -47
- package/src/plugins/builtin/portfolio-list/column-values.ts +104 -26
- package/src/plugins/builtin/portfolio-list/grid.tsx +1 -1
- package/src/plugins/builtin/portfolio-list/headless.ts +84 -18
- package/src/plugins/builtin/portfolio-list/imported-from.ts +8 -0
- package/src/plugins/builtin/portfolio-list/index.tsx +5 -1
- package/src/plugins/builtin/portfolio-list/live-valuation.ts +6 -2
- package/src/plugins/builtin/portfolio-list/mutations.ts +2 -9
- package/src/plugins/builtin/portfolio-list/pane/data.ts +5 -1
- package/src/plugins/builtin/portfolio-list/pane/index.tsx +52 -9
- package/src/plugins/builtin/portfolio-list/quick-add/index.tsx +33 -11
- package/src/plugins/builtin/portfolio-list/quick-add/resolution.ts +21 -1
- package/src/plugins/builtin/portfolio-list/settings.ts +17 -0
- package/src/plugins/builtin/portfolio-list/summary/index.tsx +12 -0
- package/src/plugins/builtin/portfolio-list/summary/totals.ts +9 -4
- package/src/plugins/builtin/portfolio-list/table.tsx +37 -7
- package/src/plugins/builtin/power/client.ts +16 -0
- package/src/plugins/builtin/power/evidence.ts +63 -10
- package/src/plugins/builtin/power/headless.ts +77 -9
- package/src/plugins/builtin/power/index.tsx +28 -3
- package/src/plugins/builtin/power/model.ts +73 -2
- package/src/plugins/builtin/power/pane.tsx +37 -9
- package/src/plugins/builtin/power/prices-client.ts +139 -0
- package/src/plugins/builtin/power/prices-headless.ts +137 -0
- package/src/plugins/builtin/power/prices-model.ts +103 -0
- package/src/plugins/builtin/power/prices.tsx +179 -0
- package/src/plugins/builtin/rate-path/headless.ts +46 -18
- package/src/plugins/builtin/realized-vol/headless.ts +5 -0
- package/src/plugins/builtin/relative-rotation/headless.ts +3 -3
- package/src/plugins/builtin/research/corporate-actions-pane.tsx +5 -2
- package/src/plugins/builtin/research/event-model.ts +68 -24
- package/src/plugins/builtin/research/events-headless.ts +2 -1
- package/src/plugins/builtin/research/headless.ts +2 -1
- package/src/plugins/builtin/research/index.tsx +2 -0
- package/src/plugins/builtin/research-search/article.ts +65 -0
- package/src/plugins/builtin/research-search/document-view.tsx +33 -215
- package/src/plugins/builtin/research-search/model.ts +0 -9
- package/src/plugins/builtin/research-search/pane.tsx +41 -30
- package/src/plugins/builtin/research-search/snippet.ts +0 -29
- package/src/plugins/builtin/revenue-breakdown/headless.ts +18 -6
- package/src/plugins/builtin/seasonality/client.ts +15 -7
- package/src/plugins/builtin/seasonality/headless.ts +36 -12
- package/src/plugins/builtin/seasonality/index.tsx +2 -2
- package/src/plugins/builtin/seasonality/model.ts +119 -0
- package/src/plugins/builtin/seasonality/pane.tsx +108 -37
- package/src/plugins/builtin/sec/headless.ts +25 -3
- package/src/plugins/builtin/sec/index.tsx +2 -1
- package/src/plugins/builtin/series-inventory.ts +93 -0
- package/src/plugins/builtin/shared/cloud-denied.ts +15 -0
- package/src/plugins/builtin/shared/cloud-upgrade.ts +1 -1
- package/src/plugins/builtin/shared/command-tab.ts +30 -12
- package/src/plugins/builtin/shared/earnings-report.ts +55 -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/fx-rate-freshness.ts +101 -0
- package/src/plugins/builtin/shared/open-description.ts +29 -0
- package/src/plugins/builtin/shared/report-freshness.ts +12 -1
- package/src/plugins/builtin/shared/series-warning.ts +5 -0
- package/src/plugins/builtin/shared/volatility/options.ts +4 -1
- package/src/plugins/builtin/short-interest/headless.ts +1 -0
- package/src/plugins/builtin/short-interest/index.tsx +2 -0
- package/src/plugins/builtin/short-interest/series.ts +36 -0
- package/src/plugins/builtin/short-interest/watch-headless.ts +3 -2
- package/src/plugins/builtin/short-interest/watch-model.ts +9 -5
- package/src/plugins/builtin/short-volume/headless.ts +2 -1
- package/src/plugins/builtin/short-volume/index.tsx +2 -0
- package/src/plugins/builtin/short-volume/series.ts +23 -0
- package/src/plugins/builtin/social-mentions/headless.ts +1 -1
- package/src/plugins/builtin/social-mentions/index.tsx +2 -0
- package/src/plugins/builtin/social-mentions/series.ts +23 -0
- package/src/plugins/builtin/supply-chain/graph-pane.tsx +3 -2
- package/src/plugins/builtin/supply-chain/headless.ts +43 -11
- package/src/plugins/builtin/supply-chain/model.ts +13 -0
- package/src/plugins/builtin/supply-chain/pane.tsx +8 -6
- package/src/plugins/builtin/themes/headless.ts +74 -10
- package/src/plugins/builtin/themes/model.ts +71 -4
- package/src/plugins/builtin/themes/pane.tsx +22 -5
- package/src/plugins/builtin/thirteenf/api.ts +1 -0
- package/src/plugins/builtin/thirteenf/data.ts +6 -4
- package/src/plugins/builtin/thirteenf/headless.ts +217 -36
- package/src/plugins/builtin/thirteenf/model.ts +39 -1
- package/src/plugins/builtin/thirteenf/overlap.ts +75 -0
- package/src/plugins/builtin/thirteenf/pane.tsx +10 -1
- package/src/plugins/builtin/thirteenf/report-notes.ts +103 -1
- package/src/plugins/builtin/thirteenf/types.ts +2 -0
- package/src/plugins/builtin/ticker-detail/data-panes/returns-history.ts +114 -0
- package/src/plugins/builtin/ticker-detail/data-panes/returns-model.ts +57 -2
- package/src/plugins/builtin/ticker-detail/data-panes/returns-pane.tsx +19 -55
- package/src/plugins/builtin/ticker-detail/headless-schema.ts +30 -0
- package/src/plugins/builtin/ticker-detail/headless.ts +86 -0
- package/src/plugins/builtin/ticker-detail/index.tsx +26 -11
- package/src/plugins/builtin/ticker-detail/overview/components.tsx +1 -1
- package/src/plugins/builtin/ticker-detail/overview/futures-contract.ts +31 -0
- package/src/plugins/builtin/ticker-detail/overview/model.ts +3 -3
- package/src/plugins/builtin/ticker-detail/overview/pane.tsx +2 -1
- package/src/plugins/builtin/ticker-detail/overview-tab.tsx +49 -5
- package/src/plugins/builtin/ticker-detail/quote-monitor/index.tsx +13 -3
- package/src/plugins/builtin/time-sales/headless.ts +2 -1
- package/src/plugins/builtin/time-sales/index.tsx +2 -1
- package/src/plugins/builtin/treasury-auctions/headless.ts +16 -2
- package/src/plugins/builtin/treasury-auctions/index.tsx +1 -0
- package/src/plugins/builtin/treasury-auctions/model.ts +8 -0
- package/src/plugins/builtin/vol-surface/evidence.ts +7 -1
- package/src/plugins/builtin/vol-surface/headless.ts +51 -17
- package/src/plugins/builtin/vol-surface/heat-grid.tsx +113 -0
- package/src/plugins/builtin/vol-surface/model.ts +39 -6
- package/src/plugins/builtin/vol-surface/pane.tsx +14 -13
- package/src/plugins/builtin/vol-surface/stored.ts +63 -3
- package/src/plugins/builtin/vol-surface/surface.tsx +30 -2
- package/src/plugins/builtin/volatility/index.tsx +2 -0
- package/src/plugins/builtin/volatility/series.ts +84 -0
- package/src/plugins/builtin/world-venue-map/basemap-layer.tsx +6 -5
- package/src/plugins/builtin/world-venue-map/basemap.ts +6 -3
- package/src/plugins/builtin/world-venue-map/geo-draw.tsx +2 -1
- package/src/plugins/builtin/world-venue-map/geo-series.ts +26 -1
- package/src/plugins/builtin/world-venue-map/geo-svg.tsx +6 -6
- package/src/plugins/builtin/world-venue-map/headless.ts +4 -1
- package/src/plugins/builtin/world-venue-map/index.ts +2 -1
- package/src/plugins/builtin/world-venue-map/layered-pane.tsx +24 -13
- package/src/plugins/builtin/world-venue-map/layers.ts +29 -0
- package/src/plugins/builtin/world-venue-map/map.tsx +144 -13
- package/src/plugins/builtin/world-venue-map/model.ts +56 -19
- package/src/plugins/builtin/world-venue-map/pane.tsx +5 -2
- package/src/plugins/builtin/yield-curve/chart.ts +2 -2
- package/src/plugins/builtin/yield-curve/curves.ts +21 -8
- package/src/plugins/builtin/yield-curve/headless.ts +71 -18
- package/src/plugins/builtin/yield-curve/index.tsx +4 -2
- package/src/plugins/builtin/yield-curve/series.ts +86 -0
- package/src/plugins/catalog-browser.ts +2 -1
- package/src/plugins/installer.ts +2 -2
- package/src/plugins/loader.ts +15 -0
- package/src/plugins/manager-node.ts +1 -1
- package/src/plugins/{builtin/plugin-marketplace → marketplace}/feed.ts +2 -2
- package/src/plugins/{builtin/plugin-marketplace → marketplace}/model.ts +6 -6
- package/src/plugins/{builtin/plugin-marketplace → marketplace}/store.ts +1 -1
- package/src/plugins/registry/host-actions.ts +11 -0
- package/src/plugins/registry/index.ts +89 -4
- package/src/portfolio/collection-name.ts +31 -0
- package/src/{plugins/builtin/portfolio-list → portfolio}/position-metrics.ts +6 -6
- package/src/portfolio/position-value.ts +40 -0
- package/src/portfolio/valuation-basis.ts +79 -0
- package/src/public/__snapshots__/public-api.test.ts.snap +7 -0
- package/src/public/time-series.ts +17 -0
- package/src/react/auto-refresh.ts +13 -3
- package/src/react/input.ts +33 -1
- package/src/react/key-repeat.ts +86 -0
- package/src/remote/app-host.tsx +20 -4
- package/src/remote/confirm-change.tsx +85 -0
- package/src/remote/controller-utils.ts +8 -1
- package/src/remote/controller.ts +144 -7
- package/src/remote/pane-screenshot.ts +47 -0
- package/src/remote/schema.ts +65 -2
- package/src/remote/types.ts +30 -0
- package/src/remote/watchlist.ts +306 -0
- package/src/renderers/browser/main.tsx +4 -3
- package/src/renderers/browser/research-entry.ts +4 -2
- package/src/renderers/cloudflare/worker.ts +1 -1
- package/src/renderers/dom/data-table/frozen-column.ts +3 -1
- package/src/renderers/dom/data-table/index.tsx +33 -6
- package/src/renderers/dom/data-table/row.tsx +30 -1
- package/src/renderers/dom/desktop/control-styles.ts +63 -1
- package/src/renderers/dom/desktop/controls.tsx +30 -23
- package/src/renderers/dom/desktop/dialog-actions.tsx +170 -0
- package/src/renderers/dom/desktop/icons.tsx +16 -0
- package/src/renderers/dom/dom-ui-host.tsx +3 -0
- package/src/renderers/dom/host/block-glyph-canvas.tsx +6 -3
- package/src/renderers/dom/host/box.tsx +8 -0
- package/src/renderers/dom/host/chart-surface.tsx +33 -2
- package/src/renderers/dom/host/live-frame.ts +6 -2
- package/src/renderers/dom/host/overflow-fade.ts +14 -1
- package/src/renderers/dom/host/scroll-box.tsx +32 -0
- package/src/renderers/dom/host/size-observer.ts +41 -0
- package/src/renderers/dom/host/sticky-scroll.ts +128 -0
- package/src/renderers/dom/host/style.ts +1 -1
- package/src/renderers/dom/host/surface-3d.tsx +19 -7
- package/src/renderers/dom/host/surface-fit.ts +406 -0
- package/src/renderers/dom/host/text.tsx +1 -1
- package/src/renderers/dom/input-host.tsx +1 -0
- package/src/renderers/dom/styles.css +102 -5
- package/src/renderers/electrobun/bun/application-menu/click.ts +18 -0
- package/src/renderers/electrobun/bun/index.ts +3 -2
- package/src/renderers/electrobun/shared/protocol.ts +1 -1
- package/src/renderers/electrobun/view/cli-pane-shot-entry.tsx +29 -2
- package/src/renderers/electrobun/view/cli-pane-shot-frame.tsx +63 -20
- package/src/renderers/electrobun/view/cli-pane-shot-health.ts +10 -26
- package/src/renderers/electrobun/view/main.tsx +5 -3
- package/src/renderers/electrobun/view/remote/asset-data-client.ts +2 -0
- package/src/renderers/opentui/chart-surface.tsx +1 -0
- package/src/renderers/opentui/frame-capture.ts +33 -0
- package/src/renderers/opentui/host.tsx +10 -13
- 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 +107 -0
- package/src/renderers/opentui/pane-image/raster.ts +428 -0
- package/src/renderers/opentui/start.tsx +3 -3
- package/src/renderers/opentui/test-utils.tsx +3 -0
- package/src/renderers/opentui/ui-host.tsx +29 -1
- package/src/series/capability.ts +75 -0
- package/src/series/csv.ts +160 -0
- package/src/series/files.ts +107 -0
- package/src/series/registry.ts +198 -0
- package/src/series/resolve.ts +108 -0
- package/src/series/standalone.ts +48 -0
- package/src/series/types.ts +153 -0
- package/src/series/validate.ts +171 -0
- package/src/shares/chat.ts +34 -0
- package/src/shares/dialog.tsx +295 -0
- package/src/shares/flow.tsx +56 -0
- package/src/shares/live.ts +14 -22
- package/src/shares/pane-image.ts +152 -0
- package/src/shares/personal-pane.ts +64 -0
- package/src/shares/portable-layout.ts +4 -2
- package/src/shares/prepare.ts +20 -0
- package/src/sources/gloomberb-cloud/index.ts +109 -10
- package/src/sources/gloomberb-cloud/normalizers.ts +3 -0
- package/src/sources/gloomberb-cloud/perpetuals.ts +249 -0
- package/src/sources/history-result.ts +1 -0
- package/src/sources/history-retention.ts +11 -0
- package/src/sources/listing-symbols.ts +4 -1
- package/src/sources/listing-target.ts +4 -0
- package/src/sources/provider-router/batches.ts +4 -1
- package/src/sources/provider-router/cache.ts +4 -2
- package/src/sources/provider-router/cached-routes.ts +1 -1
- package/src/sources/provider-router/financial-routes.ts +1 -0
- package/src/sources/provider-router/financials.ts +13 -0
- package/src/sources/provider-router/history.ts +43 -25
- package/src/sources/provider-router/index.ts +14 -0
- package/src/sources/provider-router/search.ts +1 -0
- package/src/state/hooks/inline-tickers.ts +49 -11
- package/src/sync/core-contributors.ts +1 -0
- package/src/test-support/shell-pane-keys.tsx +1 -0
- package/src/theme/theme-context.tsx +15 -1
- package/src/tickers/company-name.ts +75 -0
- package/src/tickers/instrument-kind.ts +34 -1
- package/src/tickers/listing-name.ts +34 -0
- package/src/tickers/listing-venues.ts +132 -0
- package/src/tickers/open-target.ts +13 -4
- package/src/tickers/perpetual-listing.ts +151 -0
- package/src/tickers/prediction-listing.ts +26 -0
- package/src/tickers/search/index.ts +72 -11
- package/src/tickers/search/ranking.ts +98 -20
- package/src/tickers/search/types.ts +7 -1
- package/src/tickers/ticker-changes.ts +213 -0
- package/src/tickers/us-listing.ts +34 -0
- package/src/time-series/economic.ts +2 -6
- package/src/time-series/hooks.ts +9 -0
- package/src/time-series/ice-credit.ts +39 -0
- package/src/time-series/resolve.ts +211 -29
- package/src/time-series/studies.ts +1 -0
- package/src/time-series/types.ts +12 -2
- package/src/time-series/use-chart-resolution.ts +32 -0
- package/src/types/config.ts +10 -2
- package/src/types/data-provider.ts +11 -0
- package/src/types/financials.ts +62 -1
- package/src/types/headless.ts +113 -0
- package/src/types/instrument.ts +4 -0
- package/src/types/plugin.ts +52 -2
- package/src/types/price-history.ts +7 -0
- package/src/types/ticker-changes.ts +26 -0
- package/src/types/ticker.ts +14 -0
- package/src/ui/context-menu.tsx +13 -1
- package/src/ui/host.tsx +57 -3
- package/src/ui/live-resize.ts +91 -0
- package/src/ui/live-stretch.ts +153 -0
- package/src/ui/measured-cells.ts +58 -0
- package/src/ui/sticky-scroll.ts +7 -0
- package/src/utils/basis-points.ts +17 -0
- package/src/utils/central-banks.ts +76 -0
- package/src/utils/cli-output.ts +131 -15
- package/src/utils/concurrency.ts +25 -0
- package/src/utils/crypto-pair.ts +20 -0
- package/src/utils/currency-pair.ts +19 -0
- package/src/utils/currency-units.ts +11 -0
- package/src/utils/datetime-format.ts +27 -6
- package/src/utils/decimal-comma.ts +19 -0
- package/src/utils/dom-screenshot-css.ts +265 -0
- package/src/utils/dom-screenshot-rasters.ts +276 -0
- package/src/utils/dom-screenshot.ts +439 -52
- package/src/utils/double-escape-close.ts +15 -1
- package/src/utils/exchange-rate-snapshot.ts +6 -2
- package/src/utils/exchanges.ts +143 -1
- package/src/utils/format.ts +35 -5
- package/src/utils/forward-dividend.ts +14 -0
- package/src/utils/fundamentals.ts +66 -0
- package/src/utils/futures-generic.ts +6 -12
- package/src/utils/fx-market-hours.ts +15 -5
- package/src/utils/fx-status.ts +6 -1
- package/src/utils/inline-content-tokenizer.ts +22 -3
- package/src/utils/market-capitalization.ts +8 -0
- package/src/utils/one-shot.ts +73 -0
- package/src/utils/options.ts +37 -8
- package/src/utils/price-history.ts +99 -42
- package/src/utils/sec-eps-basis.ts +24 -11
- package/src/utils/sec.ts +61 -7
- package/src/utils/utc-time.ts +63 -4
- package/src/plugins/builtin/fx-matrix/freshness.ts +0 -65
- /package/src/plugins/{builtin/plugin-marketplace → marketplace}/activation.ts +0 -0
- /package/src/plugins/{builtin/plugin-marketplace → marketplace}/ids.ts +0 -0
- /package/src/plugins/{builtin/plugin-marketplace → marketplace}/packs.ts +0 -0
- /package/src/{plugins/builtin/cloud → tickers}/starter-symbols.ts +0 -0
|
@@ -1,138 +1,161 @@
|
|
|
1
|
-
import { fredSeriesUrl } from "../../../sources/gloomberb-cloud/fred-series";
|
|
2
1
|
import { resolveAssetDisplayKind } from "../../../market-data/market/format";
|
|
3
2
|
import {
|
|
4
3
|
getTimeSeriesField,
|
|
5
|
-
isMarketFieldId,
|
|
6
4
|
listTimeSeriesFields,
|
|
7
5
|
} from "../../../time-series/field-catalog";
|
|
6
|
+
import type { SeriesCatalogEntry, SeriesFrequency, SeriesInput } from "../../../series/types";
|
|
8
7
|
import { parseOptionSymbol } from "../../../utils/options";
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
FUTURES_CONTRACTS,
|
|
12
|
-
FUTURES_SECTOR_LABELS,
|
|
13
|
-
} from "../futures/contracts";
|
|
14
|
-
import { INDICATORS as VALUATION_INDICATORS } from "../market-valuation/indicators";
|
|
15
|
-
import { MARKET_VALUATION_CAPABILITY_ID } from "../market-valuation/chart-series";
|
|
16
|
-
import { TREASURY_MATURITIES } from "../yield-curve/treasury-data";
|
|
17
|
-
import { fieldCategory, type SeriesCatalogInstrument } from "./series-catalog";
|
|
8
|
+
import type { SeriesCatalogInstrument } from "./series-catalog";
|
|
18
9
|
|
|
19
10
|
export const CHART_COMPOSER_TEMPLATE_ID = "chart-composer-pane";
|
|
20
11
|
export const DATA_CATALOG_PANE_ID = "data-catalog";
|
|
21
12
|
export const DATA_CATALOG_TEMPLATE_ID = "data-catalog-pane";
|
|
22
13
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
| "option"
|
|
26
|
-
| "crypto"
|
|
27
|
-
| "fred"
|
|
28
|
-
| "futures"
|
|
29
|
-
| "treasury"
|
|
30
|
-
| "valuation";
|
|
31
|
-
|
|
32
|
-
export type CatalogFilterId =
|
|
33
|
-
| "all"
|
|
34
|
-
| "securities"
|
|
35
|
-
| "options"
|
|
36
|
-
| "crypto"
|
|
37
|
-
| "fred"
|
|
38
|
-
| "futures"
|
|
39
|
-
| "valuation";
|
|
14
|
+
/** "all", or a catalog group such as "Credit". */
|
|
15
|
+
export type CatalogFilterId = string;
|
|
40
16
|
|
|
41
17
|
export interface CatalogSeriesRow {
|
|
42
18
|
id: string;
|
|
43
19
|
label: string;
|
|
20
|
+
group: string;
|
|
21
|
+
unit: string;
|
|
22
|
+
frequency: SeriesFrequency;
|
|
44
23
|
/**
|
|
45
|
-
* The official publisher
|
|
46
|
-
*
|
|
24
|
+
* The official publisher for public data (FRED, the BLS), blank for market
|
|
25
|
+
* data: the catalog says what a series is, never which vendor serves it.
|
|
47
26
|
*/
|
|
48
27
|
publisher: string;
|
|
49
|
-
|
|
50
|
-
kind: string;
|
|
28
|
+
/** What the EXPRESSION column shows: `TICKER` where a symbol goes. */
|
|
51
29
|
expression: string;
|
|
30
|
+
/** The registered expression, `{ticker}` where a symbol goes. */
|
|
31
|
+
template: string;
|
|
52
32
|
url?: string;
|
|
33
|
+
/** Asks for a symbol before charting. */
|
|
34
|
+
input?: SeriesInput;
|
|
35
|
+
/** The plugin that registered the series. */
|
|
36
|
+
pluginId: string;
|
|
53
37
|
searchText: string;
|
|
54
|
-
|
|
55
|
-
|
|
38
|
+
/** Position in the default order: by group, then by name. */
|
|
39
|
+
order: number;
|
|
56
40
|
}
|
|
57
41
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
42
|
+
/** The order catalog tabs and the default sort follow; other groups come after, by name. */
|
|
43
|
+
const GROUP_ORDER = [
|
|
44
|
+
"Securities",
|
|
45
|
+
"Options",
|
|
46
|
+
"Crypto",
|
|
47
|
+
"Futures",
|
|
48
|
+
"Rates",
|
|
49
|
+
"Credit",
|
|
50
|
+
"Economy",
|
|
51
|
+
"Defense & fiscal",
|
|
52
|
+
"Inflation",
|
|
53
|
+
"FX",
|
|
54
|
+
"Energy",
|
|
55
|
+
"Volatility",
|
|
56
|
+
"Sentiment",
|
|
57
|
+
"Positioning",
|
|
58
|
+
"Valuation",
|
|
59
|
+
"Alternative data",
|
|
60
|
+
"Your series",
|
|
61
|
+
] as const;
|
|
62
|
+
const OTHER_GROUP = "Other";
|
|
63
|
+
const GROUP_RANK = new Map<string, number>(GROUP_ORDER.map((group, index) => [group, index]));
|
|
64
|
+
const FREQUENCY_ORDER: readonly SeriesFrequency[] = [
|
|
65
|
+
"intraday", "daily", "weekly", "monthly", "quarterly", "annual", "irregular",
|
|
66
66
|
];
|
|
67
|
+
const TICKER_PLACEHOLDER = "{ticker}";
|
|
68
|
+
const collator = new Intl.Collator("en", { numeric: true, sensitivity: "base" });
|
|
67
69
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
securities:
|
|
71
|
-
options:
|
|
72
|
-
crypto:
|
|
73
|
-
fred:
|
|
74
|
-
futures:
|
|
75
|
-
valuation:
|
|
70
|
+
/** Tabs saved before the catalog was grouped, mapped onto the groups that replaced them. */
|
|
71
|
+
const LEGACY_FILTERS: Readonly<Record<string, string>> = {
|
|
72
|
+
securities: "Securities",
|
|
73
|
+
options: "Options",
|
|
74
|
+
crypto: "Crypto",
|
|
75
|
+
fred: "Economy",
|
|
76
|
+
futures: "Futures",
|
|
77
|
+
valuation: "Valuation",
|
|
76
78
|
};
|
|
77
79
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
{ symbol: "SOL-USD", name: "Solana" },
|
|
82
|
-
{ symbol: "XRP-USD", name: "XRP" },
|
|
83
|
-
{ symbol: "BNB-USD", name: "BNB" },
|
|
84
|
-
{ symbol: "DOGE-USD", name: "Dogecoin" },
|
|
85
|
-
{ symbol: "ADA-USD", name: "Cardano" },
|
|
86
|
-
{ symbol: "AVAX-USD", name: "Avalanche" },
|
|
87
|
-
{ symbol: "LINK-USD", name: "Chainlink" },
|
|
88
|
-
{ symbol: "DOT-USD", name: "Polkadot" },
|
|
89
|
-
{ symbol: "LTC-USD", name: "Litecoin" },
|
|
90
|
-
{ symbol: "UNI-USD", name: "Uniswap" },
|
|
91
|
-
{ symbol: "ATOM-USD", name: "Cosmos" },
|
|
92
|
-
{ symbol: "NEAR-USD", name: "NEAR" },
|
|
93
|
-
{ symbol: "APT-USD", name: "Aptos" },
|
|
94
|
-
{ symbol: "SUI-USD", name: "Sui" },
|
|
95
|
-
{ symbol: "TON-USD", name: "Toncoin" },
|
|
96
|
-
{ symbol: "SHIB-USD", name: "Shiba Inu" },
|
|
97
|
-
];
|
|
80
|
+
function groupRank(group: string): number {
|
|
81
|
+
return GROUP_RANK.get(group) ?? GROUP_ORDER.length;
|
|
82
|
+
}
|
|
98
83
|
|
|
99
|
-
function
|
|
100
|
-
|
|
101
|
-
return category === "OPT" || parseOptionSymbol(instrument.symbol) != null;
|
|
84
|
+
export function frequencyRank(frequency: SeriesFrequency): number {
|
|
85
|
+
return FREQUENCY_ORDER.indexOf(frequency);
|
|
102
86
|
}
|
|
103
87
|
|
|
104
|
-
function
|
|
105
|
-
|
|
106
|
-
return fieldId.split(".").at(-1) ?? fieldId;
|
|
88
|
+
export function compareCatalogGroups(left: string, right: string): number {
|
|
89
|
+
return groupRank(left) - groupRank(right) || collator.compare(left, right);
|
|
107
90
|
}
|
|
108
91
|
|
|
109
|
-
function
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
const { searchExtra, publisher = "", ...fields } = entry;
|
|
92
|
+
export function compareCatalogText(left: string, right: string): number {
|
|
93
|
+
return collator.compare(left, right);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
function displayExpression(template: string): string {
|
|
97
|
+
return template.replaceAll(TICKER_PLACEHOLDER, "TICKER");
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
function rowFromEntry(entry: SeriesCatalogEntry): Omit<CatalogSeriesRow, "order"> {
|
|
101
|
+
const group = entry.group?.trim() || OTHER_GROUP;
|
|
102
|
+
const publisher = entry.publisher ?? "";
|
|
103
|
+
const expression = displayExpression(entry.expression);
|
|
122
104
|
return {
|
|
123
|
-
|
|
105
|
+
id: entry.id,
|
|
106
|
+
label: entry.name,
|
|
107
|
+
group,
|
|
108
|
+
unit: entry.unit,
|
|
109
|
+
frequency: entry.frequency,
|
|
124
110
|
publisher,
|
|
111
|
+
expression,
|
|
112
|
+
template: entry.expression,
|
|
113
|
+
...(entry.url ? { url: entry.url } : {}),
|
|
114
|
+
...(entry.input ? { input: entry.input } : {}),
|
|
115
|
+
pluginId: entry.pluginId,
|
|
125
116
|
searchText: [
|
|
126
|
-
entry.
|
|
127
|
-
|
|
128
|
-
entry.kind,
|
|
129
|
-
entry.expression,
|
|
130
|
-
entry.sourceId,
|
|
131
|
-
searchExtra,
|
|
117
|
+
entry.name, publisher, group, entry.unit, entry.frequency, expression, entry.id,
|
|
118
|
+
entry.description, ...(entry.tags ?? []),
|
|
132
119
|
].filter(Boolean).join(" ").toLowerCase(),
|
|
133
120
|
};
|
|
134
121
|
}
|
|
135
122
|
|
|
123
|
+
const rowsByEntries = new WeakMap<readonly SeriesCatalogEntry[], readonly CatalogSeriesRow[]>();
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* The catalog's rows in their default order (group, then name), computed once
|
|
127
|
+
* per registry snapshot so typing in the search only filters.
|
|
128
|
+
*/
|
|
129
|
+
export function catalogRowsFromEntries(entries: readonly SeriesCatalogEntry[]): readonly CatalogSeriesRow[] {
|
|
130
|
+
const cached = rowsByEntries.get(entries);
|
|
131
|
+
if (cached) return cached;
|
|
132
|
+
const rows = entries.map(rowFromEntry).sort((left, right) => (
|
|
133
|
+
compareCatalogGroups(left.group, right.group)
|
|
134
|
+
|| collator.compare(left.label, right.label)
|
|
135
|
+
|| (left.id < right.id ? -1 : left.id > right.id ? 1 : 0)
|
|
136
|
+
)).map((row, order): CatalogSeriesRow => ({ ...row, order }));
|
|
137
|
+
rowsByEntries.set(entries, rows);
|
|
138
|
+
return rows;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/** All, then each group the rows hold, in catalog order. */
|
|
142
|
+
export function catalogTabs(rows: readonly CatalogSeriesRow[]): Array<{ id: CatalogFilterId; label: string }> {
|
|
143
|
+
const groups = [...new Set(rows.map((row) => row.group))].sort(compareCatalogGroups);
|
|
144
|
+
return [{ id: "all", label: "All" }, ...groups.map((group) => ({ id: group, label: group }))];
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/** A saved tab the catalog still has, else All. */
|
|
148
|
+
export function normalizeCatalogFilter(saved: string | null | undefined, rows: readonly CatalogSeriesRow[]): CatalogFilterId {
|
|
149
|
+
if (!saved || saved === "all") return "all";
|
|
150
|
+
const group = LEGACY_FILTERS[saved] ?? saved;
|
|
151
|
+
return rows.some((row) => row.group === group) ? group : "all";
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
function isOptionInstrument(instrument: SeriesCatalogInstrument): boolean {
|
|
155
|
+
const category = instrument.assetCategory?.trim().toUpperCase();
|
|
156
|
+
return category === "OPT" || parseOptionSymbol(instrument.symbol) != null;
|
|
157
|
+
}
|
|
158
|
+
|
|
136
159
|
function isCatalogCryptoInstrument(instrument: SeriesCatalogInstrument): boolean {
|
|
137
160
|
if (isOptionInstrument(instrument)) return false;
|
|
138
161
|
const exchange = instrument.exchange?.trim().toUpperCase();
|
|
@@ -141,6 +164,11 @@ function isCatalogCryptoInstrument(instrument: SeriesCatalogInstrument): boolean
|
|
|
141
164
|
return /^[A-Z0-9]{2,10}[-/]USD$/i.test(instrument.symbol.trim());
|
|
142
165
|
}
|
|
143
166
|
|
|
167
|
+
function instrumentInput(instrument: SeriesCatalogInstrument): SeriesInput {
|
|
168
|
+
if (isCatalogCryptoInstrument(instrument)) return "crypto";
|
|
169
|
+
return isOptionInstrument(instrument) ? "option" : "ticker";
|
|
170
|
+
}
|
|
171
|
+
|
|
144
172
|
const COMPACT_OCC_RE = /^([A-Z]{1,6})(\d{6}[CP]\d{8})$/;
|
|
145
173
|
|
|
146
174
|
function compactOccSymbol(value: string): string | null {
|
|
@@ -160,8 +188,16 @@ function compactOccSymbol(value: string): string | null {
|
|
|
160
188
|
function catalogTickerFromInput(value: string): string | null {
|
|
161
189
|
const option = compactOccSymbol(value);
|
|
162
190
|
if (option) return option;
|
|
163
|
-
const symbol = value.trim().toUpperCase();
|
|
164
|
-
return /^[A-Z0-9^][A-Z0-9.^_
|
|
191
|
+
const symbol = value.trim().toUpperCase().replace("/", "-");
|
|
192
|
+
return /^[A-Z0-9^][A-Z0-9.^_=-]{0,31}$/.test(symbol) ? symbol : null;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/** The template with the symbol in place; a loaded series' symbol is URL-encoded, like its id. */
|
|
196
|
+
function fillTemplate(template: string, symbol: string): string {
|
|
197
|
+
return template.replaceAll(
|
|
198
|
+
TICKER_PLACEHOLDER,
|
|
199
|
+
template.startsWith("CAP:") ? encodeURIComponent(symbol) : symbol,
|
|
200
|
+
);
|
|
165
201
|
}
|
|
166
202
|
|
|
167
203
|
function isCatalogFieldNameQuery(query: string): boolean {
|
|
@@ -194,173 +230,55 @@ export function catalogInstrumentMatchesQuery(
|
|
|
194
230
|
return (instrument.name ?? "").toLowerCase().includes(needle);
|
|
195
231
|
}
|
|
196
232
|
|
|
233
|
+
/**
|
|
234
|
+
* Each series that asks for a symbol, filled in for each instrument it fits:
|
|
235
|
+
* a stock gets the ticker series, an option contract the option series, a
|
|
236
|
+
* crypto pair the crypto series. Typing AAPL lists AAPL · Close next to AAPL's
|
|
237
|
+
* short interest.
|
|
238
|
+
*/
|
|
197
239
|
export function catalogRowsForResolvedInstruments(
|
|
240
|
+
rows: readonly CatalogSeriesRow[],
|
|
198
241
|
instruments: readonly SeriesCatalogInstrument[],
|
|
199
242
|
): CatalogSeriesRow[] {
|
|
200
|
-
const
|
|
201
|
-
|
|
202
|
-
return instruments.flatMap((instrument) => {
|
|
203
|
-
if (isCatalogCryptoInstrument(instrument)) {
|
|
204
|
-
return [cryptoPairRow(catalogSecuritySymbol(instrument), instrument.name)];
|
|
205
|
-
}
|
|
206
|
-
if (isOptionInstrument(instrument)) {
|
|
207
|
-
const symbol = compactOccSymbol(instrument.symbol)
|
|
208
|
-
?? catalogTickerFromInput(instrument.symbol);
|
|
209
|
-
if (!symbol) return [];
|
|
210
|
-
return marketFields.map((field) => {
|
|
211
|
-
const token = chartFieldToken(field.id);
|
|
212
|
-
return row({
|
|
213
|
-
id: `option:${symbol}:${field.id}`,
|
|
214
|
-
label: `${symbol} · ${field.label}`,
|
|
215
|
-
sourceId: "option",
|
|
216
|
-
kind: "Options",
|
|
217
|
-
expression: `${symbol}:${token}`,
|
|
218
|
-
searchExtra: [instrument.name, "option", field.shortLabel].filter(Boolean).join(" "),
|
|
219
|
-
});
|
|
220
|
-
});
|
|
221
|
-
}
|
|
243
|
+
const templates = rows.filter((row) => row.input);
|
|
244
|
+
return instruments.flatMap((instrument, index) => {
|
|
222
245
|
const symbol = catalogTickerFromInput(instrument.symbol);
|
|
223
246
|
if (!symbol) return [];
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
expression
|
|
232
|
-
|
|
233
|
-
|
|
247
|
+
const input = instrumentInput(instrument);
|
|
248
|
+
return templates.filter((row) => row.input === input).map((row): CatalogSeriesRow => {
|
|
249
|
+
const expression = fillTemplate(row.template, symbol);
|
|
250
|
+
return {
|
|
251
|
+
...row,
|
|
252
|
+
id: `${row.id}@${symbol}`,
|
|
253
|
+
label: `${symbol} · ${row.label}`,
|
|
254
|
+
expression,
|
|
255
|
+
template: expression,
|
|
256
|
+
input: undefined,
|
|
257
|
+
// Right after the series it fills in, instruments in the order given.
|
|
258
|
+
order: row.order + (index + 1) / (instruments.length + 1),
|
|
259
|
+
searchText: `${symbol.toLowerCase()} ${(instrument.name ?? "").toLowerCase()} ${row.searchText} ${expression.toLowerCase()}`,
|
|
260
|
+
};
|
|
234
261
|
});
|
|
235
262
|
});
|
|
236
263
|
}
|
|
237
264
|
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
function catalogSecuritySymbol(instrument: SeriesCatalogInstrument): string {
|
|
246
|
-
return instrument.symbol.trim();
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
function securityFieldRows(): CatalogSeriesRow[] {
|
|
250
|
-
return listTimeSeriesFields().map((field) => {
|
|
251
|
-
const token = chartFieldToken(field.id);
|
|
252
|
-
return row({
|
|
253
|
-
id: `field:${field.id}`,
|
|
254
|
-
label: field.label,
|
|
255
|
-
sourceId: "security",
|
|
256
|
-
kind: fieldCategory(field),
|
|
257
|
-
expression: `TICKER:${token}`,
|
|
258
|
-
needsTicker: true,
|
|
259
|
-
fieldToken: token,
|
|
260
|
-
searchExtra: field.shortLabel,
|
|
261
|
-
});
|
|
262
|
-
});
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
function optionFieldRows(): CatalogSeriesRow[] {
|
|
266
|
-
return listTimeSeriesFields().flatMap((field) => {
|
|
267
|
-
if (!isMarketFieldId(field.id)) return [];
|
|
268
|
-
const token = chartFieldToken(field.id);
|
|
269
|
-
return [row({
|
|
270
|
-
id: `option:${field.id}`,
|
|
271
|
-
label: field.label,
|
|
272
|
-
sourceId: "option",
|
|
273
|
-
kind: "Options",
|
|
274
|
-
expression: `TICKER:${token}`,
|
|
275
|
-
needsTicker: true,
|
|
276
|
-
fieldToken: token,
|
|
277
|
-
searchExtra: `option ${field.shortLabel}`,
|
|
278
|
-
})];
|
|
279
|
-
});
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
function cryptoPairRow(symbol: string, name?: string): CatalogSeriesRow {
|
|
283
|
-
return row({
|
|
284
|
-
id: `crypto:${symbol.toUpperCase()}`,
|
|
285
|
-
label: name ? `${symbol} · ${name}` : symbol,
|
|
286
|
-
sourceId: "crypto",
|
|
287
|
-
kind: "Crypto",
|
|
288
|
-
expression: `${symbol}:price`,
|
|
289
|
-
searchExtra: name,
|
|
290
|
-
});
|
|
291
|
-
}
|
|
292
|
-
|
|
293
|
-
function cryptoRows(instruments: readonly SeriesCatalogInstrument[]): CatalogSeriesRow[] {
|
|
294
|
-
const seen = new Set<string>();
|
|
295
|
-
const rows: CatalogSeriesRow[] = [];
|
|
296
|
-
const add = (symbol: string, name?: string) => {
|
|
297
|
-
const key = symbol.trim().toUpperCase().replace("/", "-");
|
|
298
|
-
if (!key || seen.has(key)) return;
|
|
299
|
-
seen.add(key);
|
|
300
|
-
rows.push(cryptoPairRow(key, name));
|
|
301
|
-
};
|
|
302
|
-
for (const instrument of instruments) {
|
|
303
|
-
if (!isCatalogCryptoInstrument(instrument)) continue;
|
|
304
|
-
add(catalogSecuritySymbol(instrument), instrument.name);
|
|
305
|
-
}
|
|
306
|
-
for (const entry of CRYPTO_CATALOG) add(entry.symbol, entry.name);
|
|
307
|
-
return rows;
|
|
308
|
-
}
|
|
309
|
-
|
|
310
|
-
let staticInventory: readonly CatalogSeriesRow[] | null = null;
|
|
311
|
-
|
|
312
|
-
function staticCatalogInventory(): readonly CatalogSeriesRow[] {
|
|
313
|
-
staticInventory ??= buildStaticCatalogInventory();
|
|
314
|
-
return staticInventory;
|
|
265
|
+
/** The crypto series of the pairs on the user's lists, which the catalog shows without a search. */
|
|
266
|
+
export function catalogRowsForListedCrypto(
|
|
267
|
+
rows: readonly CatalogSeriesRow[],
|
|
268
|
+
instruments: readonly SeriesCatalogInstrument[],
|
|
269
|
+
): CatalogSeriesRow[] {
|
|
270
|
+
return catalogRowsForResolvedInstruments(rows, instruments.filter(isCatalogCryptoInstrument));
|
|
315
271
|
}
|
|
316
272
|
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
id: `fred:${entry.seriesId}`,
|
|
322
|
-
label: entry.label,
|
|
323
|
-
publisher: "FRED",
|
|
324
|
-
sourceId: "fred",
|
|
325
|
-
kind: "Economic",
|
|
326
|
-
expression: `FRED:${entry.seriesId}`,
|
|
327
|
-
url: fredSeriesUrl(entry.seriesId),
|
|
328
|
-
})),
|
|
329
|
-
...TREASURY_MATURITIES.map((entry) => row({
|
|
330
|
-
id: `ust:${entry.maturity}`,
|
|
331
|
-
label: `${entry.maturity} Treasury Yield`,
|
|
332
|
-
publisher: "FRED",
|
|
333
|
-
sourceId: "treasury",
|
|
334
|
-
kind: "Treasury",
|
|
335
|
-
expression: `UST:${entry.maturity}`,
|
|
336
|
-
url: fredSeriesUrl(entry.seriesId),
|
|
337
|
-
})),
|
|
338
|
-
...VALUATION_INDICATORS.map((entry) => row({
|
|
339
|
-
id: `valuation:${entry.id}`,
|
|
340
|
-
label: entry.label,
|
|
341
|
-
sourceId: "valuation",
|
|
342
|
-
kind: "Valuation",
|
|
343
|
-
expression: `CAP:${MARKET_VALUATION_CAPABILITY_ID}:${entry.id}`,
|
|
344
|
-
})),
|
|
345
|
-
...FUTURES_CONTRACTS.map((entry) => row({
|
|
346
|
-
id: `fut:${entry.code}`,
|
|
347
|
-
label: `${entry.name} (${entry.code})`,
|
|
348
|
-
sourceId: "futures",
|
|
349
|
-
kind: FUTURES_SECTOR_LABELS[entry.sector],
|
|
350
|
-
expression: `FUT:${entry.code}`,
|
|
351
|
-
})),
|
|
352
|
-
];
|
|
353
|
-
|
|
354
|
-
export function listStaticCatalogInventory(
|
|
355
|
-
instruments: readonly SeriesCatalogInstrument[] = [],
|
|
356
|
-
): CatalogSeriesRow[] {
|
|
357
|
-
return [...staticCatalogInventory(), ...cryptoRows(instruments)];
|
|
273
|
+
export function catalogExpressionForRow(entry: CatalogSeriesRow, ticker?: string): string | null {
|
|
274
|
+
if (!entry.input) return entry.template;
|
|
275
|
+
const symbol = ticker ? catalogTickerFromInput(ticker) : null;
|
|
276
|
+
return symbol ? fillTemplate(entry.template, symbol) : null;
|
|
358
277
|
}
|
|
359
278
|
|
|
360
|
-
function matchesCatalogQuery(entry: CatalogSeriesRow,
|
|
361
|
-
const
|
|
362
|
-
|
|
363
|
-
return normalized.split(/\s+/).every((token) => entry.searchText.includes(token));
|
|
279
|
+
function matchesCatalogQuery(entry: CatalogSeriesRow, tokens: readonly string[]): boolean {
|
|
280
|
+
for (const token of tokens) if (!entry.searchText.includes(token)) return false;
|
|
281
|
+
return true;
|
|
364
282
|
}
|
|
365
283
|
|
|
366
284
|
export function filterCatalogRows(
|
|
@@ -368,13 +286,33 @@ export function filterCatalogRows(
|
|
|
368
286
|
filter: CatalogFilterId,
|
|
369
287
|
query: string,
|
|
370
288
|
): CatalogSeriesRow[] {
|
|
371
|
-
const
|
|
289
|
+
const tokens = query.trim().toLowerCase().split(/\s+/).filter(Boolean);
|
|
290
|
+
const group = filter === "all" ? null : filter;
|
|
372
291
|
return rows.filter((entry) => (
|
|
373
|
-
(
|
|
374
|
-
&& matchesCatalogQuery(entry,
|
|
292
|
+
(group === null || entry.group === group)
|
|
293
|
+
&& matchesCatalogQuery(entry, tokens)
|
|
375
294
|
));
|
|
376
295
|
}
|
|
377
296
|
|
|
297
|
+
/**
|
|
298
|
+
* The registered rows with the filled-in ones slotted after the series they
|
|
299
|
+
* fill in, one row per chart: a registered row (Bitcoin) wins over the same
|
|
300
|
+
* chart filled in for a listed pair (BTC-USD · Price).
|
|
301
|
+
*/
|
|
302
|
+
export function mergeCatalogRows(
|
|
303
|
+
rows: readonly CatalogSeriesRow[],
|
|
304
|
+
filled: readonly CatalogSeriesRow[],
|
|
305
|
+
): readonly CatalogSeriesRow[] {
|
|
306
|
+
if (filled.length === 0) return rows;
|
|
307
|
+
const charted = new Set(rows.flatMap((row) => row.input ? [] : [row.template]));
|
|
308
|
+
const added = filled.filter((row) => {
|
|
309
|
+
if (charted.has(row.template)) return false;
|
|
310
|
+
charted.add(row.template);
|
|
311
|
+
return true;
|
|
312
|
+
});
|
|
313
|
+
return [...rows, ...added].sort((left, right) => left.order - right.order);
|
|
314
|
+
}
|
|
315
|
+
|
|
378
316
|
export function catalogEmptyCopy(
|
|
379
317
|
loading: boolean,
|
|
380
318
|
searchQuery: string,
|