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
|
@@ -12,13 +12,115 @@ export const THIRTEENF_MAX_LIMIT = 200;
|
|
|
12
12
|
|
|
13
13
|
export const AS_FILED_VALUE = "Value (USD) as reported at period end, not today's price";
|
|
14
14
|
|
|
15
|
+
/** What a 13F filing leaves out and how late it arrives; the text reports' note and the catalog's limitation. */
|
|
16
|
+
export const THIRTEENF_LIMITS = "Long US-listed equity positions only: shorts, cash and most foreign stocks are absent. Filed up to 45 days after quarter end.";
|
|
17
|
+
|
|
18
|
+
/** The value basis of option rows, for exports. */
|
|
19
|
+
export const THIRTEENF_OPTIONS_NOTE = "CALL/PUT rows: Value and Shares are the underlying stock's (notional), not the option premium.";
|
|
20
|
+
|
|
21
|
+
/** The marker the text reports put on an option row's type, explained by `OPTION_ROWS_NOTE`. */
|
|
22
|
+
const OPTION_MARK = "*";
|
|
23
|
+
export const OPTION_ROWS_NOTE = `${OPTION_MARK} ${THIRTEENF_OPTIONS_NOTE}`;
|
|
24
|
+
|
|
25
|
+
export function isOptionType(type: unknown): boolean {
|
|
26
|
+
const text = typeof type === "string" ? type.trim().toUpperCase() : "";
|
|
27
|
+
return text === "CALL" || text === "PUT";
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/** A position type as the text report prints it: `CALL*` for an option, which `OPTION_ROWS_NOTE` explains. */
|
|
31
|
+
export function markedPositionType(type: unknown): string {
|
|
32
|
+
const text = typeof type === "string" && type ? type : "--";
|
|
33
|
+
return isOptionType(type) ? `${text}${OPTION_MARK}` : text;
|
|
34
|
+
}
|
|
35
|
+
|
|
15
36
|
const count = (value: number) => value.toLocaleString("en-US");
|
|
16
37
|
|
|
17
|
-
|
|
38
|
+
function periodText(period: string | null | undefined, previousPeriod?: string | null): string {
|
|
18
39
|
if (!period) return "";
|
|
19
40
|
return previousPeriod ? `Period ${period} vs ${previousPeriod}` : `Period ${period}`;
|
|
20
41
|
}
|
|
21
42
|
|
|
43
|
+
const MONTHS = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"] as const;
|
|
44
|
+
const DAY_MS = 86_400_000;
|
|
45
|
+
|
|
46
|
+
function calendarDay(date: string | null | undefined): Date | null {
|
|
47
|
+
if (!date || !/^\d{4}-\d{2}-\d{2}$/.test(date)) return null;
|
|
48
|
+
const day = new Date(`${date}T00:00:00Z`);
|
|
49
|
+
return Number.isFinite(day.getTime()) ? day : null;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/** "30 Jun 2026", or "30 Jun" in `omitYear`. */
|
|
53
|
+
export function filingDayText(date: string, omitYear?: number): string {
|
|
54
|
+
const day = calendarDay(date);
|
|
55
|
+
if (!day) return date;
|
|
56
|
+
const text = `${day.getUTCDate()} ${MONTHS[day.getUTCMonth()]}`;
|
|
57
|
+
return day.getUTCFullYear() === omitYear ? text : `${text} ${day.getUTCFullYear()}`;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/** Whole days from a quarter end to the filing, or null when either date is unreadable. */
|
|
61
|
+
export function filingLagDays(period: string | null | undefined, filed: string | null | undefined): number | null {
|
|
62
|
+
const end = calendarDay(period);
|
|
63
|
+
const day = calendarDay(filed);
|
|
64
|
+
return end && day ? Math.round((day.getTime() - end.getTime()) / DAY_MS) : null;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* "Period 30 Jun · filed 14 Aug 2026 (45 days after quarter end) | QoQ vs 31 Mar":
|
|
69
|
+
* when the positions date from and when they became public. A date in the
|
|
70
|
+
* filing's year leaves its year out.
|
|
71
|
+
*/
|
|
72
|
+
export function filedPeriodText(
|
|
73
|
+
period: string | null | undefined,
|
|
74
|
+
filed: string | null | undefined,
|
|
75
|
+
previousPeriod?: string | null,
|
|
76
|
+
): string {
|
|
77
|
+
if (!period) return "";
|
|
78
|
+
const filedDay = calendarDay(filed);
|
|
79
|
+
if (!filed || !filedDay) return periodText(period, previousPeriod);
|
|
80
|
+
const year = filedDay.getUTCFullYear();
|
|
81
|
+
const lag = filingLagDays(period, filed);
|
|
82
|
+
const after = lag != null && lag >= 0 ? ` (${count(lag)} ${lag === 1 ? "day" : "days"} after quarter end)` : "";
|
|
83
|
+
return [
|
|
84
|
+
`Period ${filingDayText(period, year)} · filed ${filingDayText(filed)}${after}`,
|
|
85
|
+
previousPeriod ? `QoQ vs ${filingDayText(previousPeriod, year)}` : "",
|
|
86
|
+
].filter(Boolean).join(" | ");
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* The quarters whose filings Gloom Cloud restated to dollars, in its own words:
|
|
91
|
+
* "Values restated from thousands: 30 Jun 2026". Empty when none was.
|
|
92
|
+
*/
|
|
93
|
+
export function restatedValuesText(forms: readonly { periodOfReport: string; valueNote?: string }[]): string {
|
|
94
|
+
const noted = forms.filter((form) => form.valueNote);
|
|
95
|
+
if (noted.length === 0) return "";
|
|
96
|
+
const note = noted[0]!.valueNote!;
|
|
97
|
+
const periods = [...new Set(noted.map((form) => form.periodOfReport))].sort().reverse();
|
|
98
|
+
return `${note[0]!.toUpperCase()}${note.slice(1)}: ${periods.map((period) => filingDayText(period)).join(", ")}`;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/** A filer this many quarters behind the reporting cycle has missed a filing, not just filed late. */
|
|
102
|
+
export function isStaleFiling(quartersBehind: number | null | undefined): quartersBehind is number {
|
|
103
|
+
return quartersBehind != null && quartersBehind > 1;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
export function quartersOldText(quarters: number): string {
|
|
107
|
+
return `${count(quarters)} quarters old`;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
const NOTHING_LATER = "nothing filed for a later quarter";
|
|
111
|
+
|
|
112
|
+
export function staleFilingText(quarters: number): string {
|
|
113
|
+
return `Latest filing is ${quartersOldText(quarters)}; ${NOTHING_LATER}`;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/** The funds in a list whose latest filing is stale, the first few by name. */
|
|
117
|
+
export function staleFundsText(funds: readonly { name: string; quarters: number }[], shown = 3): string {
|
|
118
|
+
if (funds.length === 0) return "";
|
|
119
|
+
if (funds.length === 1) return `${funds[0]!.name}: latest filing is ${quartersOldText(funds[0]!.quarters)}; ${NOTHING_LATER}`;
|
|
120
|
+
const named = funds.slice(0, shown).map((fund) => `${fund.name} (${quartersOldText(fund.quarters)})`).join(", ");
|
|
121
|
+
return `Latest filing 2+ quarters old: ${named}${funds.length > shown ? ` and ${count(funds.length - shown)} more` : ""}`;
|
|
122
|
+
}
|
|
123
|
+
|
|
22
124
|
/** "showing 50 of 374" from the start of the list, "showing 51-100 of 374" past it. */
|
|
23
125
|
function shownRangeText(offset: number, end: number, total: number): string {
|
|
24
126
|
return offset > 0
|
|
@@ -29,6 +29,8 @@ export interface ThirteenFFormSummary {
|
|
|
29
29
|
tableEntryTotal: number | null;
|
|
30
30
|
isAmendment: boolean;
|
|
31
31
|
amendmentType?: string;
|
|
32
|
+
/** Set by Gloom Cloud when it restated the filing's values to dollars ("values restated from thousands"). */
|
|
33
|
+
valueNote?: string;
|
|
32
34
|
}
|
|
33
35
|
|
|
34
36
|
export interface ThirteenFHoldingRecord {
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { fetchHistoryResult, InvalidHistoryResultError } from "../../../../sources/history-result";
|
|
2
|
+
import { historyRetentionNotice, isHistoryRetentionError } from "../../../../sources/history-retention";
|
|
3
|
+
import {
|
|
4
|
+
getChartResolutionLabel,
|
|
5
|
+
type ChartResolutionSupport,
|
|
6
|
+
type ManualChartResolution,
|
|
7
|
+
} from "../../../../time-series/resolution";
|
|
8
|
+
import type { DataProvider } from "../../../../types/data-provider";
|
|
9
|
+
import type { PricePoint } from "../../../../types/financials";
|
|
10
|
+
import { isRoundTheClockCoin } from "../../../../utils/crypto-pair";
|
|
11
|
+
import { isCurrencyPairListing } from "../../../../utils/fx-market-hours";
|
|
12
|
+
import {
|
|
13
|
+
effectiveReturnResolution,
|
|
14
|
+
endsAtLatestBar,
|
|
15
|
+
latestBarTime,
|
|
16
|
+
returnLookbackMs,
|
|
17
|
+
returnSupportRange,
|
|
18
|
+
returnVisibleFrom,
|
|
19
|
+
returnWindowEnd,
|
|
20
|
+
type ReturnRange,
|
|
21
|
+
} from "./returns-model";
|
|
22
|
+
|
|
23
|
+
export interface ReturnSeries {
|
|
24
|
+
points: PricePoint[];
|
|
25
|
+
visibleFrom: number;
|
|
26
|
+
visibleTo: number;
|
|
27
|
+
coverageStart?: string;
|
|
28
|
+
range: ReturnRange;
|
|
29
|
+
resolution: ManualChartResolution;
|
|
30
|
+
/** The market is shut: the local date of its last session, which the window ends at. */
|
|
31
|
+
lastSession?: string;
|
|
32
|
+
/** The venue whose sessions the window follows; empty when none is known. */
|
|
33
|
+
venue: string;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export interface ReturnSeriesRequest {
|
|
37
|
+
symbol: string;
|
|
38
|
+
exchange: string;
|
|
39
|
+
range: ReturnRange;
|
|
40
|
+
/** The chosen interval; a range it cannot cover loads the nearest coarser one. */
|
|
41
|
+
resolution: ManualChartResolution;
|
|
42
|
+
/** What the source serves; empty uses the default intervals. */
|
|
43
|
+
support: readonly ChartResolutionSupport[];
|
|
44
|
+
now: number;
|
|
45
|
+
forceRefresh?: boolean;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function historyErrorMessage(error: unknown, resolution: ManualChartResolution): Error {
|
|
49
|
+
const label = getChartResolutionLabel(resolution);
|
|
50
|
+
if (isHistoryRetentionError(error)) return new Error(historyRetentionNotice(error.retention, label, null));
|
|
51
|
+
// The source answered at another cadence than asked: those bars are not this interval's returns.
|
|
52
|
+
if (error instanceof InvalidHistoryResultError) return new Error(`${label} bars are unavailable for this ticker`);
|
|
53
|
+
return error instanceof Error ? error : new Error(String(error));
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* The venue whose sessions set where the window ends: the one the ticker
|
|
58
|
+
* names, else the listing its quote names, so a bare VTI ends at the NYSE
|
|
59
|
+
* Arca close on a weekend. Coins and currency pairs need none.
|
|
60
|
+
*/
|
|
61
|
+
async function sessionVenue(provider: DataProvider, symbol: string, exchange: string): Promise<string> {
|
|
62
|
+
if (exchange || isRoundTheClockCoin(symbol) || isCurrencyPairListing(symbol, exchange)) return exchange;
|
|
63
|
+
try {
|
|
64
|
+
const metadata = provider.getQuoteMetadata
|
|
65
|
+
? await provider.getQuoteMetadata(symbol, exchange)
|
|
66
|
+
: await provider.getQuote(symbol, exchange);
|
|
67
|
+
return metadata?.listingExchangeName ?? "";
|
|
68
|
+
} catch {
|
|
69
|
+
return "";
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* The bars of a return window and where it starts and ends, as RETURN, its
|
|
75
|
+
* report and its capture all load them: the window ends now while the
|
|
76
|
+
* market trades and at its last session's close while it is shut
|
|
77
|
+
* (`returnWindowEnd`); the request reaches back far enough for the bar
|
|
78
|
+
* before the window, which every return is measured from.
|
|
79
|
+
*/
|
|
80
|
+
export async function loadReturnSeries(provider: DataProvider, request: ReturnSeriesRequest): Promise<ReturnSeries> {
|
|
81
|
+
const { symbol, exchange, range, support, now } = request;
|
|
82
|
+
const interval = effectiveReturnResolution(range, request.resolution, support);
|
|
83
|
+
const venue = await sessionVenue(provider, symbol, exchange);
|
|
84
|
+
const windowEnd = returnWindowEnd({ symbol, exchange: venue }, now);
|
|
85
|
+
const visibleFrom = returnVisibleFrom(range, interval, windowEnd.end);
|
|
86
|
+
const start = new Date(visibleFrom - returnLookbackMs(range, interval, support));
|
|
87
|
+
const end = new Date(now);
|
|
88
|
+
const context = request.forceRefresh ? { cacheMode: "refresh" as const } : undefined;
|
|
89
|
+
let result;
|
|
90
|
+
try {
|
|
91
|
+
// Exact bounds first, then the interval's range history, as charts do
|
|
92
|
+
// when a source keeps no bars for the exact window.
|
|
93
|
+
result = await fetchHistoryResult(provider, symbol, exchange, { kind: "detail", start, end, interval }, context);
|
|
94
|
+
if (!result?.points.length) {
|
|
95
|
+
result = await fetchHistoryResult(provider, symbol, exchange, { kind: "resolution", range: returnSupportRange(range), resolution: interval }, context) ?? result;
|
|
96
|
+
}
|
|
97
|
+
} catch (error) {
|
|
98
|
+
throw historyErrorMessage(error, interval);
|
|
99
|
+
}
|
|
100
|
+
if (!result) throw new Error("Price history unavailable");
|
|
101
|
+
const latest = latestBarTime(result.points);
|
|
102
|
+
return {
|
|
103
|
+
points: result.points,
|
|
104
|
+
visibleFrom: endsAtLatestBar(range) && latest !== null && latest < windowEnd.end
|
|
105
|
+
? returnVisibleFrom(range, interval, latest)
|
|
106
|
+
: visibleFrom,
|
|
107
|
+
visibleTo: now,
|
|
108
|
+
...(result.coverageStart ? { coverageStart: result.coverageStart } : {}),
|
|
109
|
+
range,
|
|
110
|
+
resolution: interval,
|
|
111
|
+
...(windowEnd.lastSession ? { lastSession: windowEnd.lastSession } : {}),
|
|
112
|
+
venue,
|
|
113
|
+
};
|
|
114
|
+
}
|
|
@@ -9,12 +9,29 @@ import {
|
|
|
9
9
|
type ManualChartResolution,
|
|
10
10
|
} from "../../../../time-series/resolution";
|
|
11
11
|
import type { PricePoint } from "../../../../types/financials";
|
|
12
|
+
import { isAlwaysOpenExchange, isRegularSessionTime, latestRegularSessionClose } from "../../../../market-data/market/freshness";
|
|
13
|
+
import { isRoundTheClockCoin } from "../../../../utils/crypto-pair";
|
|
14
|
+
import { currentFxClosureStart, isCurrencyPairListing } from "../../../../utils/fx-market-hours";
|
|
12
15
|
import { pricePointValues } from "../../../../utils/price-history-integrity";
|
|
16
|
+
import { zonedDateKey } from "../../../../utils/zoned-date-time";
|
|
13
17
|
|
|
14
18
|
export type ReturnRange = "6H" | "1D" | "5D" | TimeRange;
|
|
15
19
|
|
|
16
20
|
export const RETURN_RANGES: readonly ReturnRange[] = ["6H", "1D", "5D", "1W", "1M", "3M", "6M", "1Y", "5Y", "ALL"];
|
|
17
21
|
|
|
22
|
+
/** The bar sizes RETURN takes, as `--interval` reads them. */
|
|
23
|
+
export const RETURN_INTERVAL_VALUES: Array<{ value: ManualChartResolution; aliases?: string[] }> = [
|
|
24
|
+
{ value: "1m", aliases: ["1min"] },
|
|
25
|
+
{ value: "5m", aliases: ["5min"] },
|
|
26
|
+
{ value: "15m", aliases: ["15min"] },
|
|
27
|
+
{ value: "30m", aliases: ["30min"] },
|
|
28
|
+
{ value: "45m", aliases: ["45min"] },
|
|
29
|
+
{ value: "1h", aliases: ["60m", "hour", "hourly"] },
|
|
30
|
+
{ value: "1d", aliases: ["day", "daily"] },
|
|
31
|
+
{ value: "1wk", aliases: ["1w", "week", "weekly"] },
|
|
32
|
+
{ value: "1mo", aliases: ["month", "monthly"] },
|
|
33
|
+
];
|
|
34
|
+
|
|
18
35
|
const HOUR_MS = 60 * 60_000;
|
|
19
36
|
const DAY_MS = 24 * HOUR_MS;
|
|
20
37
|
|
|
@@ -46,13 +63,51 @@ export function returnVisibleFrom(range: ReturnRange, resolution: ManualChartRes
|
|
|
46
63
|
}
|
|
47
64
|
|
|
48
65
|
/**
|
|
49
|
-
*
|
|
50
|
-
*
|
|
66
|
+
* These windows are shorter than a closed market's gap, so they also end at
|
|
67
|
+
* the latest bar when it is earlier: a venue whose sessions the app does not
|
|
68
|
+
* know (an index, a future) still shows its last session on a weekend.
|
|
51
69
|
*/
|
|
52
70
|
export function endsAtLatestBar(range: ReturnRange): boolean {
|
|
53
71
|
return range === "6H" || range === "1D";
|
|
54
72
|
}
|
|
55
73
|
|
|
74
|
+
/** Where a return window ends, and why. */
|
|
75
|
+
export interface ReturnWindowEnd {
|
|
76
|
+
end: number;
|
|
77
|
+
/** The market is shut: the local date of its last session, whose close the window ends at. */
|
|
78
|
+
lastSession?: string;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Where a return window ends: now while the market trades, and always for a
|
|
83
|
+
* coin, which trades around the clock. A market shut for the weekend, a
|
|
84
|
+
* holiday or the night ends it at its last session's close, so 5D on a Sunday
|
|
85
|
+
* is Monday to Friday rather than Wednesday to Friday and a gap. Spot FX
|
|
86
|
+
* closes for the weekend at 17:00 New York on Friday. A venue whose hours the
|
|
87
|
+
* app does not know ends now.
|
|
88
|
+
*/
|
|
89
|
+
export function returnWindowEnd(market: { symbol: string; exchange: string }, now: number): ReturnWindowEnd {
|
|
90
|
+
if (isRoundTheClockCoin(market.symbol, market.exchange) || isAlwaysOpenExchange(market.exchange)) return { end: now };
|
|
91
|
+
if (isCurrencyPairListing(market.symbol, market.exchange)) {
|
|
92
|
+
const closure = currentFxClosureStart(now);
|
|
93
|
+
return closure == null ? { end: now } : { end: closure, lastSession: zonedDateKey(closure - 1, "America/New_York") };
|
|
94
|
+
}
|
|
95
|
+
if (isRegularSessionTime(market.exchange, now) !== false) return { end: now };
|
|
96
|
+
const last = latestRegularSessionClose(market.exchange, now);
|
|
97
|
+
return last ? { end: last.close, lastSession: last.date } : { end: now };
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
const WEEKDAYS = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"] as const;
|
|
101
|
+
const MONTHS = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"] as const;
|
|
102
|
+
|
|
103
|
+
/** `market closed, last session Fri 9 Oct`; the year only when it is not the current one. */
|
|
104
|
+
export function closedMarketNote(lastSession: string, now: number): string {
|
|
105
|
+
const day = new Date(`${lastSession}T00:00:00Z`);
|
|
106
|
+
if (!Number.isFinite(day.getTime())) return "market closed";
|
|
107
|
+
const year = day.getUTCFullYear() === new Date(now).getUTCFullYear() ? "" : ` ${day.getUTCFullYear()}`;
|
|
108
|
+
return `market closed, last session ${WEEKDAYS[day.getUTCDay()]} ${day.getUTCDate()} ${MONTHS[day.getUTCMonth()]}${year}`;
|
|
109
|
+
}
|
|
110
|
+
|
|
56
111
|
const WINDOW_DAYS: Record<ReturnRange, number> = {
|
|
57
112
|
"6H": 0.25, "1D": 1, "5D": 5, "1W": 7, "1M": 31, "3M": 92, "6M": 183, "1Y": 366, "5Y": 1827, ALL: Number.POSITIVE_INFINITY,
|
|
58
113
|
};
|
|
@@ -10,6 +10,7 @@ import {
|
|
|
10
10
|
useQueryBarSearch,
|
|
11
11
|
type DataTableCell,
|
|
12
12
|
type DataTableColumn,
|
|
13
|
+
type PaneFooterSegment,
|
|
13
14
|
type PaneHint,
|
|
14
15
|
} from "../../../../components";
|
|
15
16
|
import { usePaneRefreshKey } from "../../../../components/data-table/table-pane";
|
|
@@ -19,14 +20,11 @@ import {
|
|
|
19
20
|
type ChartResolutionSupport,
|
|
20
21
|
type ManualChartResolution,
|
|
21
22
|
} from "../../../../time-series/resolution";
|
|
22
|
-
import { fetchHistoryResult, InvalidHistoryResultError } from "../../../../sources/history-result";
|
|
23
23
|
import { historyCoverageNotice } from "../../../../sources/history-coverage";
|
|
24
|
-
import { historyRetentionNotice, isHistoryRetentionError } from "../../../../sources/history-retention";
|
|
25
24
|
import { cleanFloat32Price, historyPriceDecimals } from "../../../../cli/history-rows";
|
|
26
25
|
import { formatPriceObservation, quoteFormatOptions } from "../../../../market-data/market/format";
|
|
27
26
|
import { usePaneTicker } from "../../../../state/app/context";
|
|
28
27
|
import type { PaneProps } from "../../../../types/plugin";
|
|
29
|
-
import type { PricePoint } from "../../../../types/financials";
|
|
30
28
|
import { colors, priceColor } from "../../../../theme/colors";
|
|
31
29
|
import { formatPercent } from "../../../../utils/format";
|
|
32
30
|
import { publicTickerKey } from "../../../../utils/exchanges";
|
|
@@ -37,16 +35,13 @@ import { useBoundTicker, useTickerRequest } from "../../shared/ticker-request";
|
|
|
37
35
|
import {
|
|
38
36
|
availableReturnResolutions,
|
|
39
37
|
buildReturnRows,
|
|
38
|
+
closedMarketNote,
|
|
40
39
|
effectiveReturnResolution,
|
|
41
|
-
endsAtLatestBar,
|
|
42
|
-
latestBarTime,
|
|
43
40
|
RETURN_RANGES,
|
|
44
|
-
returnLookbackMs,
|
|
45
|
-
returnSupportRange,
|
|
46
|
-
returnVisibleFrom,
|
|
47
41
|
type ReturnRange,
|
|
48
42
|
type ReturnRow,
|
|
49
43
|
} from "./returns-model";
|
|
44
|
+
import { loadReturnSeries, type ReturnSeries } from "./returns-history";
|
|
50
45
|
|
|
51
46
|
type ReturnColumnId = "time" | "price" | "intervalChange" | "intervalPercent" | "cumulativeChange" | "cumulativePercent";
|
|
52
47
|
type ReturnColumn = DataTableColumn & { id: ReturnColumnId };
|
|
@@ -64,15 +59,6 @@ const COLUMNS: ReturnColumn[] = [
|
|
|
64
59
|
{ id: "cumulativePercent", label: "TOTAL %", width: 9, align: "right", flexGrow: 1 },
|
|
65
60
|
];
|
|
66
61
|
|
|
67
|
-
interface ReturnSeries {
|
|
68
|
-
points: PricePoint[];
|
|
69
|
-
visibleFrom: number;
|
|
70
|
-
visibleTo: number;
|
|
71
|
-
coverageStart?: string;
|
|
72
|
-
range: ReturnRange;
|
|
73
|
-
resolution: ManualChartResolution;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
62
|
function formatDateTime(date: Date): string {
|
|
77
63
|
const iso = date.toISOString();
|
|
78
64
|
const hasTime = date.getUTCHours() !== 0 || date.getUTCMinutes() !== 0 || date.getUTCSeconds() !== 0;
|
|
@@ -121,14 +107,6 @@ function sortValue(row: ReturnRow, id: ReturnColumnId): number | null {
|
|
|
121
107
|
}
|
|
122
108
|
}
|
|
123
109
|
|
|
124
|
-
function historyErrorMessage(error: unknown, resolution: ManualChartResolution): Error {
|
|
125
|
-
const label = getChartResolutionLabel(resolution);
|
|
126
|
-
if (isHistoryRetentionError(error)) return new Error(historyRetentionNotice(error.retention, label, null));
|
|
127
|
-
// The source answered at another cadence than asked: those bars are not this interval's returns.
|
|
128
|
-
if (error instanceof InvalidHistoryResultError) return new Error(`${label} bars are unavailable for this ticker`);
|
|
129
|
-
return error instanceof Error ? error : new Error(String(error));
|
|
130
|
-
}
|
|
131
|
-
|
|
132
110
|
export function ReturnsPane({ focused, width, height }: PaneProps) {
|
|
133
111
|
const dataProvider = useAssetData();
|
|
134
112
|
const { symbol, exchange, ticker } = useBoundTicker();
|
|
@@ -162,36 +140,15 @@ export function ReturnsPane({ focused, width, height }: PaneProps) {
|
|
|
162
140
|
|
|
163
141
|
const loader = useCallback(async (nextSymbol: string, nextExchange: string, forceRefresh: boolean): Promise<ReturnSeries> => {
|
|
164
142
|
if (!dataProvider) throw new Error("Market data unavailable");
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
const visibleFrom = returnVisibleFrom(range, interval, now);
|
|
169
|
-
const start = new Date(visibleFrom - returnLookbackMs(range, interval, sourceSupport));
|
|
170
|
-
const end = new Date(now);
|
|
171
|
-
const context = forceRefresh ? { cacheMode: "refresh" as const } : undefined;
|
|
172
|
-
let result;
|
|
173
|
-
try {
|
|
174
|
-
// Exact bounds first, then the interval's range history, as charts do
|
|
175
|
-
// when a source keeps no bars for the exact window.
|
|
176
|
-
result = await fetchHistoryResult(dataProvider, nextSymbol, nextExchange, { kind: "detail", start, end, interval }, context);
|
|
177
|
-
if (!result?.points.length) {
|
|
178
|
-
result = await fetchHistoryResult(dataProvider, nextSymbol, nextExchange, { kind: "resolution", range: returnSupportRange(range), resolution: interval }, context) ?? result;
|
|
179
|
-
}
|
|
180
|
-
} catch (error) {
|
|
181
|
-
throw historyErrorMessage(error, interval);
|
|
182
|
-
}
|
|
183
|
-
if (!result) throw new Error("Price history unavailable");
|
|
184
|
-
const latest = latestBarTime(result.points);
|
|
185
|
-
return {
|
|
186
|
-
points: result.points,
|
|
187
|
-
// A closed market leaves a short window ending now without bars, so it
|
|
188
|
-
// ends at the latest bar instead.
|
|
189
|
-
visibleFrom: endsAtLatestBar(range) && latest !== null ? returnVisibleFrom(range, interval, latest) : visibleFrom,
|
|
190
|
-
visibleTo: now,
|
|
191
|
-
...(result.coverageStart ? { coverageStart: result.coverageStart } : {}),
|
|
143
|
+
return loadReturnSeries(dataProvider, {
|
|
144
|
+
symbol: nextSymbol,
|
|
145
|
+
exchange: nextExchange,
|
|
192
146
|
range,
|
|
193
|
-
resolution
|
|
194
|
-
|
|
147
|
+
resolution,
|
|
148
|
+
support: await supportRequest,
|
|
149
|
+
now: Date.now(),
|
|
150
|
+
forceRefresh,
|
|
151
|
+
});
|
|
195
152
|
}, [dataProvider, range, resolution, supportRequest]);
|
|
196
153
|
const { data, loading, error, reload } = useTickerRequest(loader, symbol, exchange);
|
|
197
154
|
usePaneRefreshKey(reload, { focused: focused && !searchActive });
|
|
@@ -228,7 +185,13 @@ export function ReturnsPane({ focused, width, height }: PaneProps) {
|
|
|
228
185
|
const hints = useMemo<PaneHint[]>(() => (
|
|
229
186
|
table.searchable ? [{ id: "search", key: "/", label: "search", onPress: focusSearch }] : []
|
|
230
187
|
), [focusSearch, table.searchable]);
|
|
231
|
-
|
|
188
|
+
// A shut market's window ends at its last session, which the footer names.
|
|
189
|
+
const marketInfo = useMemo<PaneFooterSegment[]>(() => (
|
|
190
|
+
data?.lastSession
|
|
191
|
+
? [{ id: "market", parts: [{ text: closedMarketNote(data.lastSession, data.visibleTo), tone: "muted" }] }]
|
|
192
|
+
: []
|
|
193
|
+
), [data]);
|
|
194
|
+
usePaneStatusFooter({ registrationId: "returns", loading, error, hints, info: marketInfo });
|
|
232
195
|
|
|
233
196
|
const integrityNotice = priceHistoryIntegrityNotice(returnRows.filter((row) => row.inconsistent).length);
|
|
234
197
|
const coverageNotice = data ? historyCoverageNotice(data.coverageStart, data.visibleFrom) : null;
|
|
@@ -308,6 +271,7 @@ export function ReturnsPane({ focused, width, height }: PaneProps) {
|
|
|
308
271
|
["Range", data?.range ?? range],
|
|
309
272
|
["Interval", getChartResolutionLabel(data?.resolution ?? shownResolution)],
|
|
310
273
|
["Window", data ? `after ${new Date(data.visibleFrom).toISOString()} through ${new Date(data.visibleTo).toISOString()}` : ""],
|
|
274
|
+
...(data?.lastSession ? [["Market", closedMarketNote(data.lastSession, data.visibleTo)]] : []),
|
|
311
275
|
["Time zone", "UTC, bar open"],
|
|
312
276
|
["Basis", "Price returns of bar closes; dividends are not included"],
|
|
313
277
|
...(coverageNotice ? [["Coverage", coverageNotice]] : []),
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { HeadlessPaneDefinition } from "../../../types/headless";
|
|
2
2
|
import { FINANCIAL_PERIOD_OPTION, HISTORY_RANGE_VALUES } from "../shared/headless-options";
|
|
3
|
+
import { RETURN_INTERVAL_VALUES, RETURN_RANGES } from "./data-panes/returns-model";
|
|
3
4
|
|
|
4
5
|
type PaneSchema = Pick<HeadlessPaneDefinition, "argument" | "options" | "discovery">;
|
|
5
6
|
|
|
@@ -64,4 +65,33 @@ export const paneSchemas = {
|
|
|
64
65
|
screenshotReadiness: "partial",
|
|
65
66
|
},
|
|
66
67
|
},
|
|
68
|
+
"returns-pane": {
|
|
69
|
+
argument: { kind: "ticker" },
|
|
70
|
+
options: [
|
|
71
|
+
{
|
|
72
|
+
key: "range",
|
|
73
|
+
description: "Window the returns cover, ending now, or at the last session's close while the market is shut.",
|
|
74
|
+
type: "enum",
|
|
75
|
+
aliases: ["window", "period"],
|
|
76
|
+
values: RETURN_RANGES.map((value) => ({ value })),
|
|
77
|
+
defaultValue: "5D",
|
|
78
|
+
pluginState: { pluginId: "ticker-research" },
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
key: "interval",
|
|
82
|
+
description: "Bar size of each return; a range it does not reach uses the nearest longer bar the source keeps.",
|
|
83
|
+
type: "enum",
|
|
84
|
+
aliases: ["bar", "granularity", "resolution"],
|
|
85
|
+
values: RETURN_INTERVAL_VALUES,
|
|
86
|
+
defaultValue: "1h",
|
|
87
|
+
pluginState: { pluginId: "ticker-research" },
|
|
88
|
+
},
|
|
89
|
+
],
|
|
90
|
+
discovery: {
|
|
91
|
+
id: "returns",
|
|
92
|
+
aliases: ["returns", "interval returns", "cumulative return", "performance"],
|
|
93
|
+
// A capture is read from the rendered table, as before the report existed.
|
|
94
|
+
screenshotReadiness: "live-dom",
|
|
95
|
+
},
|
|
96
|
+
},
|
|
67
97
|
} satisfies Record<string, PaneSchema>;
|
|
@@ -30,6 +30,11 @@ import {
|
|
|
30
30
|
loadHeadlessFinancials, loadHeadlessPriceHistory, loadHeadlessSymbols, resolveHeadlessInstrument,
|
|
31
31
|
} from "../shared/headless-market-data";
|
|
32
32
|
import { barHistoryFreshness, barResolutionFromDates, quoteFreshnessFields, REPORTED_DATA } from "../shared/report-freshness";
|
|
33
|
+
import { cleanFloat32Price, historyPriceDecimals } from "../../../cli/history-rows";
|
|
34
|
+
import { historyCoverageNotice } from "../../../sources/history-coverage";
|
|
35
|
+
import { getChartResolutionLabel, isIntradayResolution, type ManualChartResolution } from "../../../time-series/resolution";
|
|
36
|
+
import { buildReturnRows, closedMarketNote, type ReturnRange } from "./data-panes/returns-model";
|
|
37
|
+
import { loadReturnSeries } from "./data-panes/returns-history";
|
|
33
38
|
|
|
34
39
|
export const financialStatementsHeadless: HeadlessPaneDefinition<"rows"> = {
|
|
35
40
|
...paneSchemas["financial-analysis-pane"],
|
|
@@ -286,3 +291,84 @@ export const historicalPricesHeadless: HeadlessPaneDefinition<"rows"> = {
|
|
|
286
291
|
return { rows, freshness, ...(notice ? { complete: false } : {}), unavailableSymbols: rows.some((row) => row.close !== null) ? [] : [symbol], metadata: { symbol, range, ...(notice ? { notices: [notice] } : {}) } };
|
|
287
292
|
},
|
|
288
293
|
};
|
|
294
|
+
|
|
295
|
+
/** A percent with its sign, two decimals: `+0.63%`; a dash for a gap. */
|
|
296
|
+
function signedPercentCell(value: unknown): string {
|
|
297
|
+
if (typeof value !== "number" || !Number.isFinite(value)) return "-";
|
|
298
|
+
return `${value >= 0 ? "+" : ""}${value.toFixed(2)}%`;
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
export const returnsHeadless: HeadlessPaneDefinition<"rows"> = {
|
|
302
|
+
...paneSchemas["returns-pane"],
|
|
303
|
+
shape: "rows",
|
|
304
|
+
description: "Interval and cumulative price returns of one ticker's bars over a range: each bar's close, its move from the bar before, and its move from the bar before the window.",
|
|
305
|
+
describe: ({ symbols, options }) => `Returns | ${symbols[0]} | ${options.range ?? "5D"} | ${options.interval ?? "1h"}`,
|
|
306
|
+
async load({ symbols, options }, ctx) {
|
|
307
|
+
const key = symbols[0]!;
|
|
308
|
+
const { symbol, exchange } = await resolveHeadlessInstrument(ctx, key);
|
|
309
|
+
const range = (options.range ?? "5D") as ReturnRange;
|
|
310
|
+
const requested = (options.interval ?? "1h") as ManualChartResolution;
|
|
311
|
+
const support = await Promise.resolve(ctx.marketData.getChartResolutionSupport?.(symbol, exchange ?? "") ?? []).catch(() => []);
|
|
312
|
+
const series = await loadReturnSeries(ctx.marketData, {
|
|
313
|
+
symbol, exchange: exchange ?? "", range, resolution: requested, support, now: Date.now(), forceRefresh: ctx.refresh,
|
|
314
|
+
});
|
|
315
|
+
const returns = buildReturnRows(series.points, series.visibleFrom, series.visibleTo).reverse();
|
|
316
|
+
const decimals = historyPriceDecimals(returns.flatMap((row) => row.price === null ? [] : [{
|
|
317
|
+
open: null, high: null, low: null, close: cleanFloat32Price(row.price),
|
|
318
|
+
}]));
|
|
319
|
+
const rounded = (value: number | null) => value === null || !Number.isFinite(value) ? null : Number(value.toFixed(Math.min(20, decimals)));
|
|
320
|
+
const percent = (value: number | null) => value === null ? null : value * 100;
|
|
321
|
+
const intraday = isIntradayResolution(series.resolution);
|
|
322
|
+
// A daily or longer bar is a trading date; an intraday one its UTC open.
|
|
323
|
+
const rows = returns.map((row) => ({
|
|
324
|
+
time: intraday ? new Date(row.timestamp).toISOString() : new Date(row.timestamp).toISOString().slice(0, 10),
|
|
325
|
+
close: rounded(row.price),
|
|
326
|
+
intervalChange: rounded(row.intervalChange),
|
|
327
|
+
intervalReturnPct: percent(row.intervalPercent),
|
|
328
|
+
totalChange: rounded(row.cumulativeChange),
|
|
329
|
+
totalReturnPct: percent(row.cumulativePercent),
|
|
330
|
+
...(row.inconsistent ? { inconsistent: true } : {}),
|
|
331
|
+
}));
|
|
332
|
+
const price = (value: unknown) => typeof value === "number" && Number.isFinite(value) ? value.toFixed(decimals) : "-";
|
|
333
|
+
const columns: HeadlessPaneColumn[] = [
|
|
334
|
+
{ key: "time", header: intraday ? "Time (UTC)" : "Date", format: (value) => String(value).slice(0, 16).replace("T", " ") },
|
|
335
|
+
{ key: "close", header: "Price", align: "right", format: price },
|
|
336
|
+
{ key: "intervalChange", header: "Int $", align: "right", format: price },
|
|
337
|
+
{ key: "intervalReturnPct", header: "Int %", align: "right", format: signedPercentCell },
|
|
338
|
+
{ key: "totalChange", header: "Total $", align: "right", format: price },
|
|
339
|
+
{ key: "totalReturnPct", header: "Total %", align: "right", format: signedPercentCell },
|
|
340
|
+
];
|
|
341
|
+
// An interval the range is too long for is served in the nearest longer bar; say so rather than switch silently.
|
|
342
|
+
const notices = [
|
|
343
|
+
series.resolution !== requested
|
|
344
|
+
? `${getChartResolutionLabel(requested)} bars do not reach back ${range}; these are ${getChartResolutionLabel(series.resolution)} bars.`
|
|
345
|
+
: null,
|
|
346
|
+
historyCoverageNotice(series.coverageStart, series.visibleFrom),
|
|
347
|
+
priceHistoryIntegrityNotice(rows.filter((row) => row.inconsistent).length) ?? null,
|
|
348
|
+
].filter((notice): notice is string => !!notice);
|
|
349
|
+
return {
|
|
350
|
+
rows,
|
|
351
|
+
columns,
|
|
352
|
+
unavailableSymbols: rows.length ? [] : [key],
|
|
353
|
+
...(rows.length ? {} : { errors: [`${key}: No bars in this window.`] }),
|
|
354
|
+
freshness: {
|
|
355
|
+
...barHistoryFreshness(intraday ? null : series.resolution),
|
|
356
|
+
observedKey: "time",
|
|
357
|
+
oldest: null,
|
|
358
|
+
...(series.venue ? { cadenceExchange: series.venue } : {}),
|
|
359
|
+
// The window ends at the last session while the market is shut, which the status line says.
|
|
360
|
+
...(series.lastSession ? { note: closedMarketNote(series.lastSession, series.visibleTo) } : {}),
|
|
361
|
+
},
|
|
362
|
+
metadata: {
|
|
363
|
+
symbol: key,
|
|
364
|
+
range,
|
|
365
|
+
interval: series.resolution,
|
|
366
|
+
requestedInterval: requested,
|
|
367
|
+
window: { after: new Date(series.visibleFrom).toISOString(), through: new Date(series.visibleTo).toISOString() },
|
|
368
|
+
...(series.lastSession ? { marketClosed: true, lastSession: series.lastSession } : {}),
|
|
369
|
+
basis: "Price returns of bar closes; dividends are not included",
|
|
370
|
+
...(notices.length ? { notices } : {}),
|
|
371
|
+
},
|
|
372
|
+
};
|
|
373
|
+
},
|
|
374
|
+
};
|