gloomberb 0.18.3 → 0.18.4
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 +8 -8
- package/README.zh-CN.md +11 -11
- package/bin/{gloomberb → gloom} +3 -1
- package/package.json +6 -2
- package/src/account/checkout-handoff.tsx +225 -0
- package/src/account/device-signin-dialog.tsx +2 -2
- package/src/account/device-signin.ts +2 -2
- package/src/account/upgrade-dialog.tsx +1 -1
- package/src/api-client/askg.ts +2 -2
- package/src/api-client/auth.ts +2 -2
- package/src/api-client/central-bank-rates.ts +6 -0
- package/src/api-client/collections.ts +5 -1
- package/src/api-client/cot.ts +2 -0
- package/src/api-client/crypto-etf-flows.ts +37 -0
- package/src/api-client/crypto-markets.ts +60 -0
- package/src/api-client/data.ts +84 -5
- package/src/api-client/doe.ts +15 -0
- package/src/api-client/equity-screener.ts +28 -0
- package/src/api-client/exchange-announcements.ts +38 -0
- package/src/api-client/fund-facts.ts +39 -0
- package/src/api-client/futures-curve.ts +9 -1
- package/src/api-client/hiring.ts +301 -0
- package/src/api-client/index.ts +22 -5
- package/src/api-client/market-discovery.ts +14 -0
- package/src/api-client/members.ts +6 -0
- package/src/api-client/mna.ts +6 -0
- package/src/api-client/paths.ts +18 -1
- package/src/api-client/request.ts +21 -4
- package/src/api-client/short-side-publications.ts +37 -0
- package/src/api-client/socket.ts +64 -4
- package/src/api-client/swap-curve.ts +35 -0
- package/src/api-client/themes.ts +7 -1
- package/src/api-client/types.ts +90 -2
- package/src/app/pane-runtime/plugin-bindings.ts +9 -2
- package/src/app/runtime/desktop-deeplink.ts +5 -5
- package/src/app/runtime/plugin-bindings.ts +2 -2
- package/src/app/runtime/startup.ts +13 -0
- package/src/app/star-prompt/status-line.tsx +2 -2
- package/src/architecture/core-builtin-allowlist.json +5 -2
- package/src/architecture/ui-literals-allowlist.json +3 -3
- package/src/architecture/ui-tokens-allowlist.json +1 -1
- package/src/brokers/broker-portfolio-sync.ts +37 -0
- package/src/brokers/directory.ts +11 -0
- package/src/brokers/logos.ts +3 -1
- package/src/brokers/signed-in/adapter.ts +304 -26
- package/src/brokers/signed-in/client.ts +14 -2
- package/src/brokers/signed-in/connect.ts +10 -2
- package/src/brokers/sync-broker-instance.ts +9 -1
- package/src/capabilities/chart-series.ts +22 -6
- package/src/cli/bank-section.ts +1 -1
- package/src/cli/base-converter.ts +23 -14
- package/src/cli/central-bank-events.ts +1 -1
- package/src/cli/command-options.ts +59 -4
- package/src/cli/commands/api.ts +9 -6
- package/src/cli/commands/broker.ts +2 -2
- package/src/cli/commands/command-utils.ts +2 -2
- package/src/cli/commands/crypto-hints.ts +7 -20
- package/src/cli/commands/fred-series.ts +4 -2
- package/src/cli/commands/keybindings.ts +2 -2
- package/src/cli/commands/market.ts +1117 -264
- package/src/cli/commands/news-hints.ts +2 -2
- package/src/cli/commands/news-search.ts +59 -6
- package/src/cli/commands/options-leaps.ts +41 -26
- package/src/cli/commands/overview.ts +121 -48
- package/src/cli/commands/plugins.ts +9 -9
- package/src/cli/commands/remote.ts +13 -10
- package/src/cli/commands/search.ts +64 -44
- package/src/cli/commands/system.ts +27 -19
- package/src/cli/commands/themes.ts +1 -1
- package/src/cli/commands/ticker.ts +192 -47
- package/src/cli/context.ts +3 -2
- package/src/cli/desktop-pane-shot-view.ts +2 -2
- package/src/cli/desktop-pane-shot.ts +1 -1
- package/src/cli/earnings-calendar.ts +4 -4
- package/src/cli/entry.ts +18 -1
- package/src/cli/errors.ts +20 -2
- package/src/cli/exit-codes.ts +1 -1
- package/src/cli/export-source.ts +10 -4
- package/src/cli/freshness.ts +2 -8
- package/src/cli/fx-forward.ts +130 -0
- package/src/cli/fx-pair.ts +10 -9
- package/src/cli/glossary.ts +64 -20
- package/src/cli/help.ts +19 -13
- package/src/cli/history-export.ts +126 -0
- package/src/cli/history-rows.ts +196 -43
- package/src/cli/index-roots.ts +5 -45
- package/src/cli/index.ts +24 -18
- package/src/cli/known-gaps.ts +118 -25
- package/src/cli/listing-arg.ts +300 -41
- package/src/cli/name-entries.ts +30 -18
- package/src/cli/native-smoke.ts +2 -0
- package/src/cli/not-a-ticker.ts +19 -9
- package/src/cli/opentui-libc.ts +5 -0
- package/src/cli/options.ts +12 -0
- package/src/cli/pane-functions/capabilities.ts +75 -20
- package/src/cli/pane-functions/catalog.ts +24 -23
- package/src/cli/pane-functions/discovery.ts +1 -1
- package/src/cli/pane-functions/dom.ts +10 -7
- package/src/cli/pane-functions/financial-ratio-shot.ts +2 -2
- package/src/cli/pane-functions/freshness.ts +174 -23
- package/src/cli/pane-functions/function-help.ts +66 -27
- package/src/cli/pane-functions/headless.ts +24 -11
- package/src/cli/pane-functions/index.ts +18 -16
- package/src/cli/pane-functions/options.ts +22 -2
- package/src/cli/pane-functions/report-notices.ts +12 -4
- package/src/cli/pane-functions/report.ts +5 -5
- package/src/cli/pane-functions/resolver.ts +47 -10
- package/src/cli/pane-functions/screenshot-assessment.ts +322 -0
- package/src/cli/pane-functions/screenshot-bridge.ts +152 -0
- package/src/cli/pane-functions/screenshot-chart-evidence.ts +396 -0
- package/src/cli/pane-functions/screenshot-data-evidence.ts +383 -0
- package/src/cli/pane-functions/screenshot-evidence.ts +1 -1
- package/src/cli/pane-functions/screenshot-payload.ts +453 -0
- package/src/cli/pane-functions/screenshot-render.ts +316 -0
- package/src/cli/pane-functions/screenshot-types.ts +162 -0
- package/src/cli/pane-functions/shot-options.ts +8 -3
- package/src/cli/peso-dollar-rates.ts +79 -0
- package/src/cli/quote-answer.ts +38 -3
- package/src/cli/report-tables.ts +61 -16
- package/src/cli/restore-plugins.ts +29 -14
- package/src/cli/result.ts +111 -22
- package/src/cli/series-search.ts +5 -5
- package/src/cli/statement-filings.ts +19 -0
- package/src/cli/suffixed-listing-rows.ts +49 -0
- package/src/cli/symbol-args.ts +50 -15
- package/src/cli/symbol-cells.ts +120 -0
- package/src/cli/symbol-list.ts +198 -68
- package/src/cli/symbol-rows.ts +131 -25
- package/src/cli/ticker-resolution.ts +108 -11
- package/src/cli/treasury-yields.ts +5 -5
- package/src/cli/types.ts +2 -0
- package/src/cli/uncovered-instrument.ts +3 -3
- package/src/cli/unknown-command.ts +6 -6
- package/src/components/chart/composite/chart-layout.ts +131 -0
- package/src/components/chart/composite/composite-chart.tsx +373 -16
- package/src/components/chart/composite/interactions.ts +7 -2
- package/src/components/chart/composite/legend.tsx +75 -3
- package/src/components/chart/composite/levels.ts +5 -0
- package/src/components/chart/composite/panel-gestures.ts +41 -0
- package/src/components/chart/composite/panel-labels.ts +2 -1
- package/src/components/chart/composite/panel-surface.tsx +305 -11
- package/src/components/chart/composite/price-axis-labels.tsx +27 -3
- package/src/components/chart/composite/rasterizer.ts +44 -19
- package/src/components/chart/composite/scene.ts +16 -4
- package/src/components/chart/composite/text-renderer.ts +48 -21
- package/src/components/chart/composite/toolbar.tsx +52 -5
- package/src/components/chart/composite/types.ts +13 -0
- package/src/components/chart/composite/use-composite-chart-keyboard.ts +120 -13
- package/src/components/chart/composite/use-composite-value-scales.ts +44 -0
- package/src/components/chart/composite/use-composite-viewport.ts +12 -3
- package/src/components/chart/composite/value-scale.ts +149 -0
- package/src/components/chart/composite/volume-profile-paint.ts +6 -3
- package/src/components/chart/core/pointer.ts +2 -0
- package/src/components/chart-table/index.ts +2 -0
- package/src/components/chart-table/read.tsx +74 -0
- package/src/components/command-bar/commands/collection-list.ts +41 -19
- package/src/components/command-bar/commands/collection.ts +9 -3
- package/src/components/command-bar/commands/direct/index.ts +1 -1
- package/src/components/command-bar/commands/direct/runtime.ts +3 -2
- package/src/components/command-bar/pane-templates/items.ts +59 -6
- package/src/components/command-bar/pane-templates/workflow.ts +10 -1
- package/src/components/command-bar/routes/root/plugin-install.ts +1 -1
- package/src/components/command-bar/routes/root/provider-search.ts +42 -11
- package/src/components/command-bar/routes/root/results.ts +18 -4
- package/src/components/command-bar/routes/root/runtime.ts +15 -3
- package/src/components/command-bar/routes/root/search-providers.ts +25 -2
- package/src/components/command-bar/routes/root/selection.ts +6 -1
- package/src/components/command-bar/routes/root/shortcut-feedback.ts +4 -1
- package/src/components/command-bar/routes/root/shortcuts.ts +30 -3
- package/src/components/command-bar/routes/ticker-search/results.ts +73 -4
- package/src/components/command-bar/selection-runtime.ts +50 -10
- package/src/components/command-bar/surface/index.tsx +24 -2
- package/src/components/command-bar/view-model.ts +7 -0
- package/src/components/command-bar/workflow/broker.ts +2 -2
- package/src/components/command-bar/workflow/collection-actions.ts +46 -7
- package/src/components/command-bar/workflow/collection-ticker.ts +32 -4
- package/src/components/command-bar/workflow/fields.ts +8 -2
- package/src/components/command-bar/workflow/ops.ts +18 -4
- package/src/components/command-bar/workflow/portfolio-position.ts +53 -4
- package/src/components/command-bar/workflow/submit.ts +3 -2
- package/src/components/command-bar/workflow/tickers.ts +5 -1
- package/src/components/company-logo.tsx +39 -0
- package/src/components/data-table/sections.ts +4 -2
- package/src/components/form-modal/confirm.tsx +2 -1
- package/src/components/form-modal/request.ts +5 -0
- package/src/components/form-modal/routes.ts +4 -1
- package/src/components/index.ts +12 -6
- package/src/components/layout/header.tsx +7 -6
- package/src/components/layout/market-summary.ts +9 -6
- package/src/components/layout/pane/capture-status.ts +1 -1
- package/src/components/layout/pane/footer/model.ts +11 -5
- package/src/components/layout/shell/chrome.ts +19 -6
- package/src/components/layout/shell/index.tsx +2 -1
- package/src/components/layout/shell/pane/layers.tsx +19 -1
- package/src/components/layout/status-bar.tsx +2 -2
- package/src/components/market-board/index.tsx +11 -3
- package/src/components/onboarding/onboarding-wizard.tsx +1 -0
- package/src/components/onboarding/portfolio-step/broker-setup-panel.tsx +2 -2
- package/src/components/onboarding/wizard-broker-sync.ts +4 -1
- package/src/components/pane-settings-dialog/desktop.tsx +20 -7
- package/src/components/pane-settings-dialog/tui.tsx +17 -9
- package/src/components/pane-settings-dialog/value.ts +8 -1
- package/src/components/pane-settings-dialog.tsx +44 -13
- package/src/components/sign-in-code-panel.tsx +27 -19
- package/src/components/ui/column-grid.tsx +48 -4
- package/src/components/ui/country-flag-art.tsx +180 -0
- package/src/components/ui/country-flag.tsx +118 -12
- package/src/components/ui/data-table/opentui/index.tsx +61 -2
- package/src/components/ui/data-table/opentui/model.ts +109 -2
- package/src/components/ui/data-table/types.ts +1 -1
- package/src/components/ui/display.tsx +5 -1
- package/src/components/ui/index.ts +3 -1
- package/src/components/ui/logo-mark.tsx +11 -2
- package/src/components/ui/query-bar.tsx +1 -1
- package/src/components/ui/row-notes.ts +79 -0
- package/src/core/state/app/layout.ts +4 -4
- package/src/data/cached-query.ts +8 -1
- package/src/data/config/chart-settings.ts +3 -3
- package/src/data/config/home.ts +10 -2
- package/src/data/config/layout.ts +4 -1
- package/src/data/config/store/node.ts +4 -0
- package/src/data/config/store/normalize.ts +13 -3
- package/src/data/config/store/portfolio-as-of-column.ts +2 -2
- package/src/data/json-storage.ts +2 -0
- package/src/data/saved-copies.ts +84 -0
- package/src/docs/snapshot.json +65 -32
- package/src/i18n/es.ts +29 -12
- package/src/i18n/ja.ts +29 -12
- package/src/i18n/ko.ts +29 -12
- package/src/i18n/zh-cn.ts +29 -12
- package/src/i18n/zh-tw.ts +29 -12
- package/src/layout/desks.ts +1 -1
- package/src/layout/launch-layout.ts +1 -1
- package/src/layout/pane-manager/floating-actions.ts +5 -3
- package/src/layout/pane-manager/floating.ts +43 -1
- package/src/layout/pane-manager/index.ts +2 -0
- package/src/layout/selected-ticker.ts +74 -0
- package/src/market-data/depositary-pair.ts +251 -0
- package/src/market-data/futures-board.ts +1 -1
- package/src/market-data/futures-contract.ts +124 -40
- package/src/market-data/fx-closes.ts +17 -2
- package/src/market-data/hooks.tsx +19 -11
- package/src/market-data/market/change-basis.ts +49 -7
- package/src/market-data/market/freshness.ts +34 -5
- package/src/market-data/market/period-return.ts +163 -0
- package/src/market-data/market/trading-sessions.ts +13 -0
- package/src/market-data/market/year-to-date.ts +8 -13
- package/src/market-data/performance.ts +20 -14
- package/src/market-data/perpetual-premium.ts +32 -0
- package/src/market-data/published-apac-sessions.ts +2 -1
- package/src/market-data/published-futures-sessions.ts +69 -0
- package/src/market-data/quotes/contributions.ts +5 -1
- package/src/market-data/quotes/freshness.ts +42 -0
- package/src/market-data/quotes/intraday-bar.ts +37 -0
- package/src/market-data/quotes/regular-session-valuation.ts +13 -8
- package/src/market-data/quotes/resolution.ts +4 -2
- package/src/market-data/tax-equivalent.ts +1 -1
- package/src/market-data/ticker-price-returns.ts +3 -1
- package/src/news/aggregator.ts +5 -1
- package/src/news/news-model.ts +4 -0
- package/src/news/types.ts +11 -0
- package/src/notifications/app-notifier.ts +1 -1
- package/src/plugins/auto-update.ts +2 -2
- package/src/plugins/builtin/account-management/index.tsx +1 -0
- package/src/plugins/builtin/account-management/pane.tsx +9 -8
- package/src/plugins/builtin/alerts/alert-engine.ts +29 -19
- package/src/plugins/builtin/alerts/calendar-events.ts +378 -0
- package/src/plugins/builtin/alerts/cli.ts +485 -76
- package/src/plugins/builtin/alerts/command.ts +5 -10
- package/src/plugins/builtin/alerts/event-rows.ts +9 -5
- package/src/plugins/builtin/alerts/events-pane.tsx +71 -56
- package/src/plugins/builtin/alerts/events.ts +107 -5
- package/src/plugins/builtin/alerts/fired-log.ts +78 -0
- package/src/plugins/builtin/alerts/format.ts +2 -1
- package/src/plugins/builtin/alerts/headless.ts +100 -39
- package/src/plugins/builtin/alerts/history-pane.tsx +105 -62
- package/src/plugins/builtin/alerts/history-rows.ts +89 -0
- package/src/plugins/builtin/alerts/index.tsx +45 -18
- package/src/plugins/builtin/alerts/iv-level.ts +365 -0
- package/src/plugins/builtin/alerts/levels.ts +3 -3
- package/src/plugins/builtin/alerts/pane.tsx +97 -29
- package/src/plugins/builtin/alerts/price.ts +35 -0
- package/src/plugins/builtin/alerts/quotes.ts +24 -0
- package/src/plugins/builtin/alerts/research-builder.ts +84 -11
- package/src/plugins/builtin/alerts/research-rules.ts +76 -3
- package/src/plugins/builtin/alerts/scheduled-check.ts +206 -32
- package/src/plugins/builtin/alerts/scheduled-sources.ts +26 -3
- package/src/plugins/builtin/alerts/scheduled.ts +188 -29
- package/src/plugins/builtin/alerts/storage.ts +13 -10
- package/src/plugins/builtin/alerts/targets.ts +12 -3
- package/src/plugins/builtin/analytics/index.tsx +8 -2
- package/src/plugins/builtin/analytics/metrics.ts +1 -1
- package/src/plugins/builtin/analytics/risk-book.ts +215 -0
- package/src/plugins/builtin/analytics/risk-client.ts +13 -6
- package/src/plugins/builtin/analytics/risk-headless.ts +55 -21
- package/src/plugins/builtin/analytics/risk-math.ts +6 -3
- package/src/plugins/builtin/analytics/risk-model.ts +297 -104
- package/src/plugins/builtin/analytics/risk-options.ts +17 -2
- package/src/plugins/builtin/analytics/risk-pane.tsx +97 -36
- package/src/plugins/builtin/attention/pane.tsx +6 -2
- package/src/plugins/builtin/awards/headless.ts +7 -3
- package/src/plugins/builtin/awards/model.ts +18 -0
- package/src/plugins/builtin/awards/pane.tsx +6 -3
- package/src/plugins/builtin/backtest/headless.ts +3 -3
- package/src/plugins/builtin/backtest/rules.ts +41 -5
- package/src/plugins/builtin/broker-manager/add-flow.tsx +12 -7
- package/src/plugins/builtin/broker-manager/detail.tsx +47 -19
- package/src/plugins/builtin/broker-manager/footer.ts +27 -11
- package/src/plugins/builtin/broker-manager/index.tsx +21 -12
- package/src/plugins/builtin/broker-manager/keyboard.ts +1 -1
- package/src/plugins/builtin/broker-manager/model.ts +12 -2
- package/src/plugins/builtin/broker-manager/pane-actions.tsx +183 -57
- package/src/plugins/builtin/broker-manager/table.ts +28 -12
- package/src/plugins/builtin/broker-trading/account-picker.tsx +2 -1
- package/src/plugins/builtin/broker-trading/chart-levels.ts +82 -13
- package/src/plugins/builtin/broker-trading/controller.ts +45 -13
- package/src/plugins/builtin/broker-trading/dock.tsx +22 -4
- package/src/plugins/builtin/broker-trading/headless.ts +2 -1
- package/src/plugins/builtin/broker-trading/index.tsx +7 -1
- package/src/plugins/builtin/broker-trading/linked-orders.ts +148 -0
- package/src/plugins/builtin/broker-trading/order-feed.ts +75 -7
- package/src/plugins/builtin/broker-trading/orders.tsx +109 -31
- package/src/plugins/builtin/broker-trading/overview-orders.tsx +9 -3
- package/src/plugins/builtin/broker-trading/pane-model.ts +30 -2
- package/src/plugins/builtin/broker-trading/pane.tsx +110 -23
- package/src/plugins/builtin/broker-trading/ticket-parts.tsx +36 -7
- package/src/plugins/builtin/broker-trading/ticket.tsx +112 -31
- package/src/plugins/builtin/buildout/cells.tsx +4 -0
- package/src/plugins/builtin/buildout/detail/index.tsx +5 -1
- package/src/plugins/builtin/buildout/detail/ui.tsx +7 -4
- package/src/plugins/builtin/buildout/pane/index.tsx +25 -12
- package/src/plugins/builtin/buildout/pane/status.tsx +0 -4
- package/src/plugins/builtin/builtin-plugin-meta.ts +1 -1
- package/src/plugins/builtin/catalysts/detail.tsx +3 -2
- package/src/plugins/builtin/catalysts/index.tsx +1 -1
- package/src/plugins/builtin/catalysts/model.ts +49 -4
- package/src/plugins/builtin/catalysts/pane.tsx +6 -8
- package/src/plugins/builtin/central-bank-rates/client.ts +5 -0
- package/src/plugins/builtin/central-bank-rates/headless.ts +36 -10
- package/src/plugins/builtin/central-bank-rates/model.ts +33 -8
- package/src/plugins/builtin/changelog/index.tsx +1 -0
- package/src/plugins/builtin/chart-composer/catalog-inventory.ts +1 -0
- package/src/plugins/builtin/chart-composer/chart-spec-edit.ts +2 -1
- package/src/plugins/builtin/chart-composer/chart-spec.ts +7 -0
- package/src/plugins/builtin/chart-composer/cli-options.ts +2 -5
- package/src/plugins/builtin/chart-composer/data-catalog-pane.tsx +2 -1
- package/src/plugins/builtin/chart-composer/editor/controller.ts +2 -0
- package/src/plugins/builtin/chart-composer/editor.tsx +4 -1
- package/src/plugins/builtin/chart-composer/headless-schema.ts +28 -26
- package/src/plugins/builtin/chart-composer/headless.ts +253 -35
- package/src/plugins/builtin/chart-composer/index.tsx +12 -2
- package/src/plugins/builtin/chart-composer/leverage-overlay.ts +142 -0
- package/src/plugins/builtin/chart-composer/pane.tsx +127 -28
- package/src/plugins/builtin/chart-composer/series-catalog.ts +1 -0
- package/src/plugins/builtin/chart-composer/series-expression.ts +65 -6
- package/src/plugins/builtin/chart-composer/session-history.ts +15 -21
- package/src/plugins/builtin/chart-composer/session-range.ts +4 -2
- package/src/plugins/builtin/chart-composer/settings.ts +31 -19
- package/src/plugins/builtin/chart-composer/use-series-catalog.ts +5 -6
- package/src/plugins/builtin/chart-composer/viewport-labels.ts +18 -8
- package/src/plugins/builtin/chat/attachments/model.ts +3 -1
- package/src/plugins/builtin/chat/content/index.tsx +1 -1
- package/src/plugins/builtin/chat/pane-links/open.ts +1 -1
- package/src/plugins/builtin/chat/people.ts +1 -1
- package/src/plugins/builtin/clinical-trials/client.ts +5 -2
- package/src/plugins/builtin/clinical-trials/model.ts +13 -4
- package/src/plugins/builtin/clinical-trials/pane.tsx +32 -12
- package/src/plugins/builtin/clinical-trials/ticker-sponsor.ts +17 -0
- package/src/plugins/builtin/cloud/askg/controller.ts +1 -1
- package/src/plugins/builtin/cloud/askg/lock-note.ts +1 -1
- package/src/plugins/builtin/cloud/askg/tool-display.ts +1 -1
- package/src/plugins/builtin/cloud/auth-commands.ts +3 -3
- package/src/plugins/builtin/cloud/team/pane-sections.tsx +105 -47
- package/src/plugins/builtin/cloud/team/pane-ui.tsx +42 -4
- package/src/plugins/builtin/cloud/team/pane.tsx +204 -64
- package/src/plugins/builtin/cloud/thesis/store.ts +45 -22
- package/src/plugins/builtin/cloud-tweets/registration.ts +1 -0
- package/src/plugins/builtin/commodities-energy/index.tsx +29 -2
- package/src/plugins/builtin/commodities-energy/view-state.ts +2 -0
- package/src/plugins/builtin/commodity-balances/pane.tsx +11 -4
- package/src/plugins/builtin/company-attention/app-rank.tsx +7 -5
- package/src/plugins/builtin/company-attention/building-model.ts +222 -0
- package/src/plugins/builtin/company-attention/building.tsx +172 -0
- package/src/plugins/builtin/company-attention/client.ts +117 -1
- package/src/plugins/builtin/company-attention/evidence.ts +16 -3
- package/src/plugins/builtin/company-attention/headless.ts +101 -5
- package/src/plugins/builtin/company-attention/index.tsx +6 -3
- package/src/plugins/builtin/company-attention/model.ts +33 -7
- package/src/plugins/builtin/company-attention/moves-model.ts +253 -0
- package/src/plugins/builtin/company-attention/moves.tsx +159 -0
- package/src/plugins/builtin/company-attention/pane.tsx +79 -23
- package/src/plugins/builtin/company-attention/signals-model.ts +229 -0
- package/src/plugins/builtin/company-attention/signals.tsx +160 -0
- package/src/plugins/builtin/company-kpis/headless.ts +3 -2
- package/src/plugins/builtin/company-kpis/model.ts +2 -2
- package/src/plugins/builtin/company-kpis/pane.tsx +1 -1
- package/src/plugins/builtin/composite-plugins.ts +2 -1
- package/src/plugins/builtin/congress-trades/headless.ts +1 -1
- package/src/plugins/builtin/connections/index.ts +1 -0
- package/src/plugins/builtin/correlation/headless-schema.ts +3 -2
- package/src/plugins/builtin/correlation/headless.ts +5 -3
- package/src/plugins/builtin/cot/headless.ts +28 -6
- package/src/plugins/builtin/cot/model.ts +12 -0
- package/src/plugins/builtin/cot/pane.tsx +3 -2
- package/src/plugins/builtin/cpi/headless.ts +5 -1
- package/src/plugins/builtin/cpi/pane.tsx +11 -9
- package/src/plugins/builtin/credit-boards/model.ts +2 -0
- package/src/plugins/builtin/credit-documents/headless.ts +1 -1
- package/src/plugins/builtin/crypto-board/client.ts +86 -0
- package/src/plugins/builtin/crypto-board/defi-view.tsx +218 -0
- package/src/plugins/builtin/crypto-board/defi.ts +239 -0
- package/src/plugins/builtin/crypto-board/headless.ts +117 -6
- package/src/plugins/builtin/crypto-board/index.tsx +8 -3
- package/src/plugins/builtin/crypto-board/model.ts +40 -8
- package/src/plugins/builtin/crypto-board/pane.tsx +55 -21
- package/src/plugins/builtin/crypto-board/series.ts +19 -1
- package/src/plugins/builtin/crypto-etf-flows/client.ts +60 -0
- package/src/plugins/builtin/crypto-etf-flows/headless.ts +132 -0
- package/src/plugins/builtin/crypto-etf-flows/index.tsx +44 -0
- package/src/plugins/builtin/crypto-etf-flows/model.ts +121 -0
- package/src/plugins/builtin/crypto-etf-flows/pane.tsx +193 -0
- package/src/plugins/builtin/debug/index.tsx +1 -0
- package/src/plugins/builtin/dividend-yield/index.tsx +1 -1
- package/src/plugins/builtin/docs/index.tsx +1 -1
- package/src/plugins/builtin/docs/pane.tsx +2 -2
- package/src/plugins/builtin/docs/targets.ts +1 -1
- package/src/plugins/builtin/doe/client.ts +5 -1
- package/src/plugins/builtin/doe/headless.ts +12 -6
- package/src/plugins/builtin/doe/model.ts +43 -6
- package/src/plugins/builtin/doe/pane.tsx +18 -11
- package/src/plugins/builtin/earnings/board-model.ts +13 -6
- package/src/plugins/builtin/earnings/board-table.ts +4 -1
- package/src/plugins/builtin/earnings/board.tsx +253 -50
- package/src/plugins/builtin/earnings/calendar-model.ts +188 -0
- package/src/plugins/builtin/earnings/calendar.tsx +338 -0
- package/src/plugins/builtin/earnings/client.ts +4 -3
- package/src/plugins/builtin/earnings/headless.ts +53 -15
- package/src/plugins/builtin/earnings/history-model.ts +53 -36
- package/src/plugins/builtin/earnings/index.tsx +15 -22
- package/src/plugins/builtin/earnings/model.ts +17 -12
- package/src/plugins/builtin/earnings/scope.ts +89 -0
- package/src/plugins/builtin/earnings-calls/calendar.tsx +310 -0
- package/src/plugins/builtin/earnings-calls/data.ts +146 -2
- package/src/plugins/builtin/earnings-calls/headless.ts +151 -9
- package/src/plugins/builtin/earnings-calls/index.tsx +3 -3
- package/src/plugins/builtin/earnings-calls/lock-note.ts +1 -1
- package/src/plugins/builtin/earnings-calls/pane.tsx +149 -31
- package/src/plugins/builtin/earnings-calls/upcoming.ts +195 -0
- package/src/plugins/builtin/earnings-ripple/pane.tsx +10 -5
- package/src/plugins/builtin/econ/calendar-model.ts +132 -20
- package/src/plugins/builtin/econ/detail-view.tsx +48 -10
- package/src/plugins/builtin/econ/fred-catalog.ts +23 -6
- package/src/plugins/builtin/econ/fred-series-map.ts +4 -0
- package/src/plugins/builtin/econ/index.tsx +112 -25
- package/src/plugins/builtin/econ/print-watch.ts +2 -1
- package/src/plugins/builtin/econ/types.ts +32 -1
- package/src/plugins/builtin/econ-statistics/client.ts +16 -3
- package/src/plugins/builtin/econ-statistics/defs.ts +4 -0
- package/src/plugins/builtin/econ-statistics/detail.tsx +2 -2
- package/src/plugins/builtin/econ-statistics/headless.ts +13 -2
- package/src/plugins/builtin/econ-statistics/index.tsx +3 -3
- package/src/plugins/builtin/econ-statistics/pane.tsx +2 -1
- package/src/plugins/builtin/econ-statistics/stats.ts +103 -0
- package/src/plugins/builtin/econ-statistics/view.ts +16 -1
- package/src/plugins/builtin/equity-screener/client.ts +21 -3
- package/src/plugins/builtin/equity-screener/headless.ts +68 -6
- package/src/plugins/builtin/equity-screener/live.ts +1 -1
- package/src/plugins/builtin/equity-screener/model.ts +6 -0
- package/src/plugins/builtin/equity-screener/pane.tsx +45 -10
- package/src/plugins/builtin/equity-screener/screen-check.ts +90 -0
- package/src/plugins/builtin/equity-screener/ticker-check.tsx +148 -0
- package/src/plugins/builtin/estimate-revisions/headless.ts +3 -1
- package/src/plugins/builtin/estimate-revisions/lock-note.ts +3 -3
- package/src/plugins/builtin/estimate-revisions/model.ts +8 -10
- package/src/plugins/builtin/exposure/headless.ts +51 -6
- package/src/plugins/builtin/exposure/index.tsx +28 -2
- package/src/plugins/builtin/exposure/model.ts +7 -0
- package/src/plugins/builtin/exposure/pane.tsx +6 -1
- package/src/plugins/builtin/fear-greed/index.tsx +1 -1
- package/src/plugins/builtin/filing-events/index.tsx +1 -1
- package/src/plugins/builtin/futures/model.ts +10 -9
- package/src/plugins/builtin/futures/returns.ts +8 -36
- package/src/plugins/builtin/futures/table.tsx +1 -1
- package/src/plugins/builtin/futures-curve/client.ts +40 -9
- package/src/plugins/builtin/futures-curve/headless.ts +39 -17
- package/src/plugins/builtin/futures-curve/model.ts +258 -69
- package/src/plugins/builtin/futures-curve/pane.tsx +46 -17
- package/src/plugins/builtin/fx-matrix/client.ts +15 -8
- package/src/plugins/builtin/fx-matrix/headless.ts +32 -14
- package/src/plugins/builtin/fx-matrix/index.tsx +13 -11
- package/src/plugins/builtin/fx-matrix/live-legs.ts +22 -0
- package/src/plugins/builtin/fx-matrix/settings.ts +2 -1
- package/src/plugins/builtin/gpu/headless.ts +9 -4
- package/src/plugins/builtin/help/index.tsx +13 -3
- package/src/plugins/builtin/holders/beneficial-model.ts +8 -11
- package/src/plugins/builtin/holders/beneficial-report.ts +6 -5
- package/src/plugins/builtin/holders/beneficial-view.tsx +7 -3
- package/src/plugins/builtin/holders/client.ts +13 -1
- package/src/plugins/builtin/holders/format.ts +28 -17
- package/src/plugins/builtin/holders/headless.ts +46 -7
- package/src/plugins/builtin/holders/index-holders.ts +264 -0
- package/src/plugins/builtin/holders/pane.tsx +79 -15
- package/src/plugins/builtin/holders/report-rows.ts +35 -7
- package/src/plugins/builtin/holders/table-model.ts +2 -1
- package/src/plugins/builtin/holders/treemap.tsx +2 -2
- package/src/plugins/builtin/insider/headless.ts +1 -1
- package/src/plugins/builtin/insider/signals-client.ts +1 -1
- package/src/plugins/builtin/insider/signals.tsx +1 -1
- package/src/plugins/builtin/ipo-calendar/pane.tsx +7 -4
- package/src/plugins/builtin/iv-history/client.ts +20 -0
- package/src/plugins/builtin/iv-history/headless.ts +4 -4
- package/src/plugins/builtin/iv-history/index.tsx +1 -1
- package/src/plugins/builtin/iv-history/model.ts +13 -4
- package/src/plugins/builtin/iv-history/series.ts +3 -1
- package/src/plugins/builtin/jobs/lock-note.ts +1 -1
- package/src/plugins/builtin/jobs/model.ts +4 -15
- package/src/plugins/builtin/jobs/pane.tsx +7 -5
- package/src/plugins/builtin/jobs/share-bars.tsx +11 -5
- package/src/plugins/builtin/jodi/pane.tsx +10 -4
- package/src/plugins/builtin/layout-manager/index.tsx +1 -0
- package/src/plugins/builtin/macro-day/headless.ts +20 -7
- package/src/plugins/builtin/macro-day/index.tsx +3 -2
- package/src/plugins/builtin/macro-day/model.ts +29 -8
- package/src/plugins/builtin/macro-day/pane.tsx +46 -10
- package/src/plugins/builtin/macro-day/releases.ts +55 -13
- package/src/plugins/builtin/market-heatmap/data.ts +9 -2
- package/src/plugins/builtin/market-heatmap/evidence.ts +1 -1
- package/src/plugins/builtin/market-heatmap/headless.ts +9 -6
- package/src/plugins/builtin/market-heatmap/index.tsx +3 -3
- package/src/plugins/builtin/market-heatmap/model.ts +10 -7
- package/src/plugins/builtin/market-movers/client.ts +33 -19
- package/src/plugins/builtin/market-movers/headless.ts +8 -2
- package/src/plugins/builtin/market-movers/index.tsx +16 -10
- package/src/plugins/builtin/market-movers/screener.ts +29 -8
- package/src/plugins/builtin/market-movers/session-body.tsx +4 -2
- package/src/plugins/builtin/market-movers/session-table.ts +4 -2
- package/src/plugins/builtin/market-movers/table.ts +4 -1
- package/src/plugins/builtin/market-valuation/headless.ts +2 -0
- package/src/plugins/builtin/market-valuation/view.ts +5 -0
- package/src/plugins/builtin/members/headless.ts +6 -5
- package/src/plugins/builtin/members/pane.tsx +11 -4
- package/src/plugins/builtin/mna/client.ts +1 -0
- package/src/plugins/builtin/mna/detail.tsx +20 -32
- package/src/plugins/builtin/mna/distress/detail.tsx +16 -4
- package/src/plugins/builtin/mna/distress/model.ts +3 -2
- package/src/plugins/builtin/mna/distress/pane.tsx +7 -4
- package/src/plugins/builtin/mna/headless.ts +6 -13
- package/src/plugins/builtin/mna/model.ts +93 -15
- package/src/plugins/builtin/mna/pane.tsx +5 -4
- package/src/plugins/builtin/news/headless.ts +12 -6
- package/src/plugins/builtin/news/index.tsx +10 -1
- package/src/plugins/builtin/news/wire/index.tsx +3 -2
- package/src/plugins/builtin/news/wire/news/command-bar-search.ts +26 -10
- package/src/plugins/builtin/news/wire/news/query-presets.ts +6 -2
- package/src/plugins/builtin/news/wire/rss/cli.ts +3 -3
- package/src/plugins/builtin/notes/cli.ts +49 -14
- package/src/plugins/builtin/openfda/pane.tsx +1 -1
- package/src/plugins/builtin/options/carry.ts +2 -2
- package/src/plugins/builtin/options/index.tsx +1 -1
- package/src/plugins/builtin/options/view.tsx +10 -10
- package/src/plugins/builtin/options-calculator/headless.ts +46 -7
- package/src/plugins/builtin/options-scenario/client.ts +123 -28
- package/src/plugins/builtin/options-scenario/collar.ts +8 -6
- package/src/plugins/builtin/options-scenario/csp-screen-headless.ts +127 -0
- package/src/plugins/builtin/options-scenario/csp-screen-pane.tsx +165 -0
- package/src/plugins/builtin/options-scenario/csp-screen.ts +258 -0
- package/src/plugins/builtin/options-scenario/csp.ts +101 -21
- package/src/plugins/builtin/options-scenario/headless.ts +36 -15
- package/src/plugins/builtin/options-scenario/hedge.ts +20 -14
- package/src/plugins/builtin/options-scenario/index.tsx +28 -3
- package/src/plugins/builtin/options-scenario/model.ts +13 -0
- package/src/plugins/builtin/options-scenario/pane.tsx +9 -5
- package/src/plugins/builtin/perps/equity-row.tsx +11 -3
- package/src/plugins/builtin/perps/freshness.ts +8 -5
- package/src/plugins/builtin/perps/headless.ts +3 -1
- package/src/plugins/builtin/perps/list-perpetuals.ts +25 -4
- package/src/plugins/builtin/perps/live-rows.ts +161 -0
- package/src/plugins/builtin/perps/markets-section.tsx +154 -0
- package/src/plugins/builtin/perps/pane.tsx +36 -17
- package/src/plugins/builtin/perps/venue-markets.ts +96 -0
- package/src/plugins/builtin/plugin-marketplace/index.tsx +2 -1
- package/src/plugins/builtin/plugin-marketplace/pane.tsx +143 -59
- package/src/plugins/builtin/portfolio-list/cli/bulk-symbols.ts +72 -24
- package/src/plugins/builtin/portfolio-list/cli/portfolio-command.ts +158 -141
- package/src/plugins/builtin/portfolio-list/cli/render.ts +49 -20
- package/src/plugins/builtin/portfolio-list/cli/shared.ts +3 -3
- package/src/plugins/builtin/portfolio-list/cli/watchlist-command.ts +29 -24
- package/src/plugins/builtin/portfolio-list/headless.ts +6 -3
- package/src/plugins/builtin/portfolio-list/income.ts +13 -2
- package/src/plugins/builtin/portfolio-list/index.tsx +9 -2
- package/src/plugins/builtin/portfolio-list/pane/index.tsx +21 -8
- package/src/plugins/builtin/portfolio-list/pane/purchase-date-fx.ts +46 -0
- package/src/plugins/builtin/portfolio-list/summary/live-accounts.ts +16 -9
- package/src/plugins/builtin/portfolio-list/summary/totals.ts +2 -15
- package/src/plugins/builtin/power/client.ts +4 -1
- package/src/plugins/builtin/power/evidence.ts +22 -7
- package/src/plugins/builtin/power/gas.tsx +5 -1
- package/src/plugins/builtin/power/pane.tsx +8 -1
- package/src/plugins/builtin/power/prices.tsx +10 -3
- package/src/plugins/builtin/research/analyst-headless.ts +25 -8
- package/src/plugins/builtin/research/analyst-model.ts +68 -3
- package/src/plugins/builtin/research/corporate-actions-pane.tsx +63 -14
- package/src/plugins/builtin/research/event-model.ts +3 -1
- package/src/plugins/builtin/research/event-sources.ts +12 -4
- package/src/plugins/builtin/research/index.tsx +2 -1
- package/src/plugins/builtin/research/relative-valuation-basis.ts +58 -0
- package/src/plugins/builtin/research/relative-valuation-columns.ts +31 -2
- package/src/plugins/builtin/research/relative-valuation-currency.ts +12 -5
- package/src/plugins/builtin/research/relative-valuation-headless.ts +84 -26
- package/src/plugins/builtin/research/relative-valuation-model.ts +88 -19
- package/src/plugins/builtin/research/relative-valuation-pane.tsx +76 -9
- package/src/plugins/builtin/research/relative-valuation-peers.ts +1 -1
- package/src/plugins/builtin/reverse-dcf/model.ts +6 -2
- package/src/plugins/builtin/risk-factors/index.tsx +2 -2
- package/src/plugins/builtin/scanner/lock-note.ts +1 -1
- package/src/plugins/builtin/sec/forms.ts +13 -0
- package/src/plugins/builtin/sec/fund-abroad.ts +32 -0
- package/src/plugins/builtin/sec/fund-facts.ts +68 -8
- package/src/plugins/builtin/sec/headless.ts +85 -8
- package/src/plugins/builtin/sec/index.tsx +58 -12
- package/src/plugins/builtin/sectors/client.ts +2 -1
- package/src/plugins/builtin/sectors/sector-model.ts +11 -15
- package/src/plugins/builtin/series-inventory.ts +2 -0
- package/src/plugins/builtin/shared/broker-reconnect.ts +107 -22
- package/src/plugins/builtin/shared/cloud-upgrade.ts +34 -6
- package/src/plugins/builtin/shared/earnings-calendar.ts +375 -0
- package/src/plugins/builtin/{earnings/estimate-basis.ts → shared/earnings-estimate-basis.ts} +1 -1
- package/src/plugins/builtin/shared/earnings-report.ts +3 -3
- package/src/plugins/builtin/shared/fx-rate-freshness.ts +23 -1
- package/src/plugins/builtin/shared/job-posting.ts +129 -0
- package/src/plugins/builtin/shared/pro-lock-note.ts +3 -3
- package/src/plugins/builtin/shared/report-freshness.ts +3 -0
- package/src/plugins/builtin/shared/research-trading.tsx +21 -0
- package/src/plugins/builtin/shared/series-cache.ts +2 -0
- package/src/plugins/builtin/shared/ticker-surface.ts +2 -1
- package/src/plugins/builtin/short-interest/client.ts +2 -0
- package/src/plugins/builtin/short-interest/headless.ts +41 -12
- package/src/plugins/builtin/short-interest/index.tsx +23 -1
- package/src/plugins/builtin/short-interest/model.ts +70 -19
- package/src/plugins/builtin/short-interest/pane.tsx +19 -2
- package/src/plugins/builtin/short-interest/publications-client.ts +82 -0
- package/src/plugins/builtin/short-interest/publications-headless.ts +29 -0
- package/src/plugins/builtin/short-interest/publications-model.ts +50 -0
- package/src/plugins/builtin/short-interest/publications-pane.tsx +66 -0
- package/src/plugins/builtin/short-interest/schedule.ts +35 -2
- package/src/plugins/builtin/short-interest/surface.tsx +11 -4
- package/src/plugins/builtin/short-interest/types.ts +9 -0
- package/src/plugins/builtin/short-interest/watch-client.ts +14 -8
- package/src/plugins/builtin/short-interest/watch-model.ts +12 -25
- package/src/plugins/builtin/short-interest/watch-pane.tsx +5 -1
- package/src/plugins/builtin/supply-chain/flow.tsx +33 -9
- package/src/plugins/builtin/supply-chain/model.ts +51 -3
- package/src/plugins/builtin/supply-chain/pane.tsx +78 -39
- package/src/plugins/builtin/supply-chain/row-evidence.tsx +1 -1
- package/src/plugins/builtin/themes/headless.ts +8 -5
- package/src/plugins/builtin/themes/model.ts +14 -4
- package/src/plugins/builtin/themes/pane.tsx +24 -5
- package/src/plugins/builtin/thirteenf/headless.ts +5 -5
- package/src/plugins/builtin/thirteenf/signals.ts +3 -1
- package/src/plugins/builtin/ticker-detail/adr-pair/headless.ts +123 -0
- package/src/plugins/builtin/ticker-detail/adr-pair/model.ts +132 -0
- package/src/plugins/builtin/ticker-detail/adr-pair/tab.tsx +87 -0
- package/src/plugins/builtin/ticker-detail/data-panes/historical-prices.tsx +40 -26
- package/src/plugins/builtin/ticker-detail/data-panes/history-bars.ts +8 -4
- package/src/plugins/builtin/ticker-detail/data-panes/returns-history.ts +67 -3
- package/src/plugins/builtin/ticker-detail/data-panes/returns-model.ts +112 -5
- package/src/plugins/builtin/ticker-detail/data-panes/returns-pane.tsx +17 -2
- package/src/plugins/builtin/ticker-detail/financials/aggregation.ts +21 -7
- package/src/plugins/builtin/ticker-detail/financials/model.ts +36 -1
- package/src/plugins/builtin/ticker-detail/financials/offerings.ts +56 -0
- package/src/plugins/builtin/ticker-detail/financials/ratios.ts +62 -13
- package/src/plugins/builtin/ticker-detail/financials/tab.tsx +30 -4
- package/src/plugins/builtin/ticker-detail/headless-schema.ts +14 -2
- package/src/plugins/builtin/ticker-detail/headless.ts +148 -35
- package/src/plugins/builtin/ticker-detail/index.tsx +37 -5
- package/src/plugins/builtin/ticker-detail/overview/model.ts +65 -10
- package/src/plugins/builtin/ticker-detail/overview/pane.tsx +9 -1
- package/src/plugins/builtin/ticker-detail/overview-tab.tsx +68 -11
- package/src/plugins/builtin/ticker-detail/pane.tsx +11 -0
- package/src/plugins/builtin/ticker-detail/quote-footer.ts +8 -3
- package/src/plugins/builtin/ticker-detail/research-tabs.ts +11 -0
- package/src/plugins/builtin/vol-surface/client.ts +5 -4
- package/src/plugins/builtin/vol-surface/headless.ts +12 -3
- package/src/plugins/builtin/vol-surface/model.ts +4 -2
- package/src/plugins/builtin/volatility/model.ts +5 -10
- package/src/plugins/builtin/world-venue-map/basemap-layer.tsx +4 -3
- package/src/plugins/builtin/world-venue-map/basemap.ts +3 -1
- package/src/plugins/builtin/world-venue-map/chokepoint-chart.ts +40 -0
- package/src/plugins/builtin/world-venue-map/evidence.ts +1 -1
- package/src/plugins/builtin/world-venue-map/geo-series.ts +90 -11
- package/src/plugins/builtin/world-venue-map/headless.ts +1 -1
- package/src/plugins/builtin/world-venue-map/index.ts +3 -26
- package/src/plugins/builtin/world-venue-map/layers.ts +1 -1
- package/src/plugins/builtin/world-venue-map/map.tsx +2 -1
- package/src/plugins/builtin/world-venue-map/pane.tsx +4 -2
- package/src/plugins/builtin/world-venue-map/venue-header.tsx +15 -4
- package/src/plugins/builtin/yield-curve/client.ts +25 -0
- package/src/plugins/builtin/yield-curve/curves.ts +7 -4
- package/src/plugins/builtin/yield-curve/headless.ts +38 -4
- package/src/plugins/builtin/yield-curve/history.ts +4 -3
- package/src/plugins/builtin/yield-curve/index.tsx +12 -6
- package/src/plugins/builtin/yield-curve/swaps-model.ts +93 -0
- package/src/plugins/builtin/yield-curve/swaps.tsx +99 -0
- package/src/plugins/bundle.ts +1 -1
- package/src/plugins/catalog-browser.ts +2 -1
- package/src/plugins/compat.ts +3 -3
- package/src/plugins/dependencies.ts +75 -14
- package/src/plugins/extracted-plugins.ts +132 -34
- package/src/plugins/host-link.ts +149 -34
- package/src/plugins/installer.ts +35 -10
- package/src/plugins/loader.ts +206 -38
- package/src/plugins/manager-node.ts +2 -2
- package/src/plugins/marketplace/deactivation.ts +22 -0
- package/src/plugins/marketplace/model.ts +2 -2
- package/src/plugins/marketplace/packs.ts +1 -1
- package/src/plugins/ownership.ts +1 -1
- package/src/plugins/peer-retry.ts +155 -0
- package/src/plugins/registry/contributions.ts +3 -1
- package/src/plugins/registry/index.ts +4 -3
- package/src/plugins/registry/plugin-state.ts +3 -0
- package/src/plugins/seed-notice.ts +20 -0
- package/src/plugins/shortcut-argument.ts +39 -0
- package/src/portfolio/allocation.ts +1 -1
- package/src/portfolio/collection-name.ts +31 -0
- package/src/portfolio/column-values.ts +10 -8
- package/src/portfolio/cost-fx.ts +296 -19
- package/src/portfolio/manual-lots.ts +75 -0
- package/src/portfolio/mutations.ts +60 -22
- package/src/portfolio/suffixed-listings.ts +209 -0
- package/src/portfolio/totals-currency.ts +24 -0
- package/src/public/__snapshots__/public-api.test.ts.snap +14 -0
- package/src/public/time-series.ts +11 -8
- package/src/remote/schema.ts +1 -1
- package/src/renderers/browser/config-host.ts +3 -0
- package/src/renderers/browser/main.tsx +23 -3
- package/src/renderers/dom/boot-frame-page.ts +187 -0
- package/src/renderers/dom/boot-frame.ts +237 -0
- package/src/renderers/dom/build-assets.ts +46 -8
- package/src/renderers/dom/dom-ui-host.tsx +4 -29
- package/src/renderers/dom/host/ascii-text.ts +16 -2
- package/src/renderers/dom/host/box.tsx +43 -2
- package/src/renderers/dom/host/chart-surface.tsx +2 -0
- package/src/renderers/dom/host/hls.chunk.ts +3 -0
- package/src/renderers/dom/host/image-surface.tsx +49 -0
- package/src/renderers/dom/host/media-surface.tsx +24 -18
- package/src/renderers/dom/host/mouse.ts +30 -0
- package/src/renderers/dom/host/size-observer.ts +1 -1
- package/src/renderers/dom/host/style.ts +1 -1
- package/src/renderers/dom/styles.css +76 -0
- package/src/renderers/dom/test-utils.tsx +2 -1
- package/src/renderers/electrobun/bun/application-menu/index.ts +3 -3
- package/src/renderers/electrobun/bun/desktop/backend-requests.ts +3 -0
- package/src/renderers/electrobun/bun/desktop/backend.ts +46 -3
- package/src/renderers/electrobun/bun/desktop/detached-windows.ts +1 -1
- package/src/renderers/electrobun/bun/desktop/host-requests.ts +9 -3
- package/src/renderers/electrobun/bun/desktop/initialization.ts +81 -18
- package/src/renderers/electrobun/bun/external-plugins.ts +29 -7
- package/src/renderers/electrobun/bun/index.ts +11 -1
- package/src/renderers/electrobun/bun/window/boot-frame.ts +67 -0
- package/src/renderers/electrobun/bun/window/create.ts +4 -1
- package/src/renderers/electrobun/shared/boot-frame.ts +7 -0
- package/src/renderers/electrobun/shared/protocol.ts +6 -1
- package/src/renderers/electrobun/view/cli-pane-shot-entry.tsx +1 -1
- package/src/renderers/electrobun/view/config-host.ts +3 -0
- package/src/renderers/electrobun/view/fatal-screen.tsx +1 -1
- package/src/renderers/electrobun/view/main.tsx +30 -4
- package/src/renderers/electrobun/view/news-source.ts +5 -5
- package/src/renderers/electrobun/view/remote/asset-data-client.ts +1 -1
- package/src/renderers/electrobun/view/ui-host.tsx +1 -1
- package/src/renderers/opentui/browser-open.ts +88 -0
- package/src/renderers/opentui/host.tsx +5 -14
- package/src/renderers/opentui/image/loader.ts +3 -2
- package/src/renderers/opentui/native-smoke.ts +10 -1
- package/src/renderers/opentui/pane-image/index.ts +2 -1
- package/src/renderers/opentui/render-lib.ts +253 -0
- package/src/renderers/opentui/render-timing-smoke.ts +1 -1
- package/src/renderers/opentui/start.tsx +1 -1
- package/src/renderers/share/layout-view.tsx +2 -2
- package/src/renderers/share/main.tsx +4 -4
- package/src/renderers/share/view.tsx +1 -1
- package/src/series/resolve.ts +22 -6
- package/src/series/standalone.ts +30 -2
- package/src/series/types.ts +8 -1
- package/src/shares/api.ts +4 -1
- package/src/shares/pane.ts +1 -1
- package/src/sources/gloomberb-cloud/fred-series.ts +46 -1
- package/src/sources/gloomberb-cloud/index.ts +32 -16
- package/src/sources/gloomberb-cloud/news.ts +39 -0
- package/src/sources/gloomberb-cloud/normalizers.ts +14 -1
- package/src/sources/gloomberb-cloud/perpetuals.ts +49 -1
- package/src/sources/listing-symbols.ts +37 -0
- package/src/sources/provider-errors.ts +16 -2
- package/src/sources/provider-router/financial-routes.ts +21 -3
- package/src/sources/provider-router/financials.ts +15 -2
- package/src/sources/provider-router/history.ts +30 -8
- package/src/sources/provider-router/primary.ts +1 -1
- package/src/state/app/bootstrap.ts +23 -0
- package/src/state/hooks/inline-tickers.ts +30 -5
- package/src/sync/controller.ts +1 -1
- package/src/sync/core-contributors.ts +46 -14
- package/src/team/collections-sync.ts +2 -1
- package/src/team/collections.ts +178 -17
- package/src/telemetry/crash-reports.ts +17 -4
- package/src/test-support/builtin-panes.ts +1 -1
- package/src/theme/colors.ts +3 -30
- package/src/theme/ui-tokens.ts +37 -1
- package/src/tickers/company-name-listing.ts +210 -33
- package/src/tickers/index-roots.ts +47 -0
- package/src/tickers/instrument-label.ts +5 -1
- package/src/tickers/metadata.ts +10 -0
- package/src/tickers/perpetual-listing.ts +5 -2
- package/src/tickers/search/home-listing.ts +75 -0
- package/src/tickers/search/index.ts +76 -27
- package/src/tickers/search/ranking.ts +54 -4
- package/src/tickers/search/upsert.ts +29 -0
- package/src/tickers/terminal-codes.ts +416 -40
- package/src/time-series/bar-aggregation.ts +243 -0
- package/src/time-series/base-series.ts +307 -0
- package/src/time-series/chart-bounds.ts +349 -0
- package/src/time-series/chart-seed.ts +142 -0
- package/src/time-series/economic.ts +5 -0
- package/src/time-series/fundamentals.ts +18 -3
- package/src/time-series/history-acquisition.ts +499 -0
- package/src/time-series/leverage.ts +100 -0
- package/src/time-series/market-resolution.ts +4 -2
- package/src/time-series/market.ts +2 -1
- package/src/time-series/price-comparison.ts +175 -30
- package/src/time-series/range.ts +9 -1
- package/src/time-series/resolution.ts +174 -16
- package/src/time-series/resolve-context.ts +157 -0
- package/src/time-series/resolve.ts +126 -1577
- package/src/time-series/series-name.ts +38 -0
- package/src/time-series/series-presentation.ts +208 -0
- package/src/time-series/spec.ts +11 -6
- package/src/time-series/studies.ts +109 -12
- package/src/time-series/tail-reconcile.ts +121 -0
- package/src/time-series/types.ts +29 -2
- package/src/time-series/use-chart-resolution.ts +4 -5
- package/src/types/broker.ts +10 -0
- package/src/types/config.ts +14 -0
- package/src/types/data-provider.ts +14 -0
- package/src/types/exchange-rate.ts +6 -0
- package/src/types/financials.ts +104 -7
- package/src/types/headless.ts +76 -6
- package/src/types/instrument.ts +3 -0
- package/src/types/plugin.ts +65 -8
- package/src/types/price-history.ts +2 -0
- package/src/types/ticker.ts +13 -0
- package/src/types/trading.ts +59 -1
- package/src/ui/ascii-font.ts +13 -1
- package/src/ui/host.tsx +6 -1
- package/src/updater/command-names.ts +175 -0
- package/src/updater/index.ts +10 -5
- package/src/utils/calendar-date.ts +32 -15
- package/src/utils/cash-runway.ts +241 -0
- package/src/utils/central-banks.ts +42 -0
- package/src/utils/cli-output.ts +259 -80
- package/src/utils/contract-month.ts +16 -0
- package/src/utils/crypto-pair.ts +61 -3
- package/src/utils/currency-units.ts +29 -0
- package/src/utils/datetime-format.ts +10 -0
- package/src/utils/debug-log.ts +1 -1
- package/src/utils/decimal-comma.ts +39 -6
- package/src/utils/exchange-announcements.ts +71 -0
- package/src/utils/exchange-rate-snapshot.ts +10 -0
- package/src/utils/financial-statements.ts +83 -4
- package/src/utils/format.ts +34 -16
- package/src/utils/fundamentals.ts +150 -34
- package/src/utils/fx-market-hours.ts +10 -1
- package/src/utils/latest-financial-period.ts +8 -0
- package/src/utils/linux-libc.ts +54 -0
- package/src/utils/market-capitalization.ts +111 -15
- package/src/utils/max-drawdown.ts +64 -0
- package/src/utils/network-failure.ts +83 -0
- package/src/utils/option-expiry.ts +139 -7
- package/src/utils/price-earnings.ts +11 -5
- package/src/utils/price-history.ts +18 -8
- package/src/utils/price-window.ts +131 -0
- package/src/utils/release-date.ts +47 -0
- package/src/utils/sec.ts +3 -0
- package/src/utils/throttled-fetch.ts +11 -4
- package/src/utils/trailing-eps.ts +67 -0
- package/src/utils/typed-text.ts +21 -0
- package/src/utils/utc-time.ts +24 -1
- package/src/version.ts +6 -0
- package/src/cli/pane-functions/screenshot.ts +0 -2122
package/src/cli/help.ts
CHANGED
|
@@ -14,10 +14,10 @@ import {
|
|
|
14
14
|
/** `--section` of a command whose report has several tables. */
|
|
15
15
|
export const TABLE_SECTION_OPTION = {
|
|
16
16
|
flags: "--section <title|n>",
|
|
17
|
-
description: "With --csv or --ndjson, write only that table, by its title or number",
|
|
17
|
+
description: "With --csv or --ndjson, write only that table, by its title, the start of it, or its number",
|
|
18
18
|
};
|
|
19
19
|
|
|
20
|
-
/** Headings of `
|
|
20
|
+
/** Headings of `gloom help`, in display order. */
|
|
21
21
|
export const CLI_COMMAND_GROUPS = {
|
|
22
22
|
research: "Research",
|
|
23
23
|
companyData: "Company data",
|
|
@@ -37,10 +37,10 @@ const PIPED_HELP_WIDTH = 80;
|
|
|
37
37
|
|
|
38
38
|
/** Commands that run as written, for someone who has just installed it. */
|
|
39
39
|
const START_HERE: Array<[string, string]> = [
|
|
40
|
-
["
|
|
41
|
-
["
|
|
42
|
-
["
|
|
43
|
-
["
|
|
40
|
+
["gloom search apple", "Find a ticker from a company name"],
|
|
41
|
+
["gloom quote AAPL", "Show the latest price"],
|
|
42
|
+
["gloom ticker AAPL", "Open the full research report"],
|
|
43
|
+
["gloom catalog earnings", "Find a function, then run it with fn"],
|
|
44
44
|
];
|
|
45
45
|
|
|
46
46
|
const GLOBAL_OPTIONS: Array<[string, string]> = [
|
|
@@ -52,7 +52,8 @@ const GLOBAL_OPTIONS: Array<[string, string]> = [
|
|
|
52
52
|
["--refresh", "Fetch fresh data instead of reading the cache"],
|
|
53
53
|
["--dry-run", "Preview config, cache, notes, alerts, plugin on/off, and remote changes without saving"],
|
|
54
54
|
["-q, --quiet", "Print no results or errors in text mode, for commands that print results"],
|
|
55
|
-
["--color, --no-color", "Force or turn off colors (NO_COLOR
|
|
55
|
+
["--color, --no-color", "Force or turn off colors (NO_COLOR also turns them off)"],
|
|
56
|
+
["--plain, --no-plain", "Plain text for a screen reader or large text: no rule lines, arrows as words, every table column kept with a dash in empty cells. On by default when NO_COLOR is set or output is piped; --no-plain turns it off"],
|
|
56
57
|
["--width <n>", "Fit tables to n columns (default: the terminal width; piped output is not fitted). shot takes its own --width in pixels"],
|
|
57
58
|
];
|
|
58
59
|
|
|
@@ -75,8 +76,13 @@ function commandGroup(entry: CliHelpEntry): string {
|
|
|
75
76
|
return entry.command.help?.group ?? (entry.source === "plugin" ? PLUGIN_COMMANDS_GROUP : OTHER_GROUP);
|
|
76
77
|
}
|
|
77
78
|
|
|
79
|
+
/**
|
|
80
|
+
* A usage line as typed. Plugin help written before the rename may start
|
|
81
|
+
* with the old command name, which prints as `gloom`.
|
|
82
|
+
*/
|
|
78
83
|
function withProgramName(invocation: string): string {
|
|
79
|
-
|
|
84
|
+
if (invocation.startsWith("gloom ")) return invocation;
|
|
85
|
+
return `gloom ${invocation.startsWith("gloomberb ") ? invocation.slice("gloomberb ".length) : invocation}`;
|
|
80
86
|
}
|
|
81
87
|
|
|
82
88
|
function renderInvocation(invocation: string, width: number): string[] {
|
|
@@ -112,7 +118,7 @@ export function renderCliHelp(entries: CliHelpEntry[], version: string, descript
|
|
|
112
118
|
const listed = entries.filter(({ command }) => command.name !== "help");
|
|
113
119
|
const nameWidth = Math.max(0, ...listed.map(({ command }) => visibleLength(command.name)));
|
|
114
120
|
const lines = [
|
|
115
|
-
`${cliStyles.bold("
|
|
121
|
+
`${cliStyles.bold("gloom")} ${cliStyles.muted(version)}`,
|
|
116
122
|
...wrapText(description, width),
|
|
117
123
|
"",
|
|
118
124
|
renderSection("Start here"),
|
|
@@ -120,10 +126,10 @@ export function renderCliHelp(entries: CliHelpEntry[], version: string, descript
|
|
|
120
126
|
"",
|
|
121
127
|
renderSection("Usage"),
|
|
122
128
|
...renderDefinitions([
|
|
123
|
-
["
|
|
124
|
-
["
|
|
125
|
-
["
|
|
126
|
-
["
|
|
129
|
+
["gloom", "Open the terminal UI"],
|
|
130
|
+
["gloom <command> [args]", "Run a command and print the result"],
|
|
131
|
+
["gloom help <command>", "Show a command's usage, options, and examples"],
|
|
132
|
+
["gloom ticker SAN:EPA", "Name the listing of a symbol that trades in several places (or --exchange EPA)"],
|
|
127
133
|
], { width }),
|
|
128
134
|
];
|
|
129
135
|
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `history --csv` as one fixed table, whatever the symbol, its market's state
|
|
3
|
+
* or how many symbols were asked for: the prices, the bar's flag and marks,
|
|
4
|
+
* a coin's or one venue's volume, then the `status` column saying why a row
|
|
5
|
+
* has no figures and the five fixed columns naming what each row is. A list
|
|
6
|
+
* of symbols (`history --file`) writes every symbol's bars in one long table,
|
|
7
|
+
* its rows told apart by `symbol_or_series`, and a symbol that served no bars
|
|
8
|
+
* as one row with only its status.
|
|
9
|
+
*/
|
|
10
|
+
import type { CliResultColumn } from "./result";
|
|
11
|
+
import type { HistoryRow } from "./history-rows";
|
|
12
|
+
|
|
13
|
+
/** A bar of one symbol of a list, or the one row of a symbol that served none. */
|
|
14
|
+
export interface HistoryListRow extends HistoryRow {
|
|
15
|
+
/** The listing the bar is of (`AAPL`, `000660.KS`), as `symbol_or_series` names it. */
|
|
16
|
+
symbol: string;
|
|
17
|
+
/** Why the symbol has no bars, as its warning says it; only on a symbol's one row with no bar. */
|
|
18
|
+
status?: string;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
type ExportedRow = Record<string, unknown>;
|
|
22
|
+
|
|
23
|
+
/** A bar's mark as an export writes it: true or false on a bar, nothing on a symbol's row with no bar. */
|
|
24
|
+
function barMark(key: "partial" | "filled" | "unsettled") {
|
|
25
|
+
return (row: ExportedRow) => row.date ? row[key] === true : "";
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* The columns of every `history` export, in this order, in every market
|
|
30
|
+
* state: a bar still forming (Partial), rebuilt from hourly bars (Filled) or
|
|
31
|
+
* closing before its settlement (Unsettled) is marked in its own column
|
|
32
|
+
* whether or not any bar of this run has one, so files of different symbols
|
|
33
|
+
* or days line up when joined.
|
|
34
|
+
*/
|
|
35
|
+
export const HISTORY_EXPORT_COLUMNS: CliResultColumn<ExportedRow>[] = [
|
|
36
|
+
{ key: "date", header: "Date" },
|
|
37
|
+
{ key: "open", header: "Open" },
|
|
38
|
+
{ key: "high", header: "High" },
|
|
39
|
+
{ key: "low", header: "Low" },
|
|
40
|
+
{ key: "close", header: "Close" },
|
|
41
|
+
{ key: "volume", header: "Volume" },
|
|
42
|
+
{ key: "flag", header: "Flag" },
|
|
43
|
+
{ key: "partial", header: "Partial", value: barMark("partial") },
|
|
44
|
+
{ key: "filled", header: "Filled", value: barMark("filled") },
|
|
45
|
+
{ key: "unsettled", header: "Unsettled", value: barMark("unsettled") },
|
|
46
|
+
{ key: "volumeUnit", header: "Volume unit" },
|
|
47
|
+
{ key: "volumeNote", header: "Volume note" },
|
|
48
|
+
{ key: "venueVolume", header: "Venue volume" },
|
|
49
|
+
{ key: "volumeVenue", header: "Volume venue" },
|
|
50
|
+
];
|
|
51
|
+
|
|
52
|
+
/** Flags of a break before a bar, whose prices stay; every other code left the prices blank. */
|
|
53
|
+
const BREAK_FLAGS = new Set(["gap", "jump"]);
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Why an exported history row has no prices: the symbol's failure, or the
|
|
57
|
+
* contradiction its source's prices had (`prices left blank: high<open`).
|
|
58
|
+
* Empty for a bar with its prices.
|
|
59
|
+
*/
|
|
60
|
+
export function historyExportStatus(row: ExportedRow): string {
|
|
61
|
+
if (typeof row.status === "string" && row.status) return row.status;
|
|
62
|
+
const blanked = [row.open, row.high, row.low, row.close].every((value) => value == null);
|
|
63
|
+
const codes = (typeof row.flag === "string" ? row.flag : "").split(",").filter((code) => code && !BREAK_FLAGS.has(code));
|
|
64
|
+
return row.date && blanked && codes.length > 0 ? `prices left blank: ${codes.join(",")}` : "";
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/** The one row a symbol that served no bars exports: its symbol and why, every figure empty. */
|
|
68
|
+
export function historyFailureRow(symbol: string, status: string): HistoryListRow {
|
|
69
|
+
return {
|
|
70
|
+
symbol, date: "", open: null, high: null, low: null, close: null, volume: null,
|
|
71
|
+
currency: null, unit: null, interval: null, flag: null, status,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* A symbol's failure in one line, for its status cell and warning: the
|
|
77
|
+
* message, and the listings its details offer to choose between, as `quote`
|
|
78
|
+
* says it (`Choose an exchange for FP. Listings: FP:NEO, FP:TSXV.`).
|
|
79
|
+
*/
|
|
80
|
+
export function oneLineFailure(message: string, details: unknown): string {
|
|
81
|
+
if (typeof details !== "string") return message;
|
|
82
|
+
const lines = details.split("\n");
|
|
83
|
+
const heading = lines.findIndex((line) => /^\S.*:$/.test(line));
|
|
84
|
+
if (heading < 0) return message;
|
|
85
|
+
const listings = lines.slice(heading + 1).flatMap((line) => /^\s+([^\s(]+)\s/.exec(line)?.[1] ?? []);
|
|
86
|
+
return listings.length > 0 ? `${message} ${lines[heading]} ${listings.join(", ")}.` : message;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/** At most this many symbols are named before a shared warning counts the rest. */
|
|
90
|
+
const NAMED_SYMBOLS = 8;
|
|
91
|
+
|
|
92
|
+
function symbolList(symbols: readonly string[]): string {
|
|
93
|
+
if (symbols.length <= NAMED_SYMBOLS) return symbols.join(", ");
|
|
94
|
+
return `${symbols.slice(0, NAMED_SYMBOLS).join(", ")} and ${symbols.length - NAMED_SYMBOLS} more`;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Whether a warning names a symbol as a whole word, in the case symbols are
|
|
99
|
+
* written in: `F` is named in "Not a ticker: F." but not in "AAPL, FB". A
|
|
100
|
+
* one-letter symbol is also an article that opens a sentence ("A gap of ..."),
|
|
101
|
+
* so it counts only where prose would not put one.
|
|
102
|
+
*/
|
|
103
|
+
function namesSymbol(note: string, symbol: string): boolean {
|
|
104
|
+
const escaped = symbol.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
105
|
+
const after = symbol.length === 1 ? "(?![A-Za-z0-9]|\\s+[a-z])" : "(?![A-Za-z0-9])";
|
|
106
|
+
return new RegExp(`(?<![A-Za-z0-9])${escaped}${after}`).test(note);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* The warnings of a list of symbols, each said once with the symbols it is
|
|
111
|
+
* about (`AAPL, MSFT: 2026-10-23 is still forming (partial)`), in the order
|
|
112
|
+
* they first came up. A warning that already names its symbol, as `Not a
|
|
113
|
+
* ticker: ZZZZQQ.` does, stands alone.
|
|
114
|
+
*/
|
|
115
|
+
export function symbolListNotes(entries: ReadonlyArray<{ symbol: string; notes: readonly string[] }>): string[] {
|
|
116
|
+
const bySymbol = new Map<string, string[]>();
|
|
117
|
+
for (const { symbol, notes } of entries) {
|
|
118
|
+
for (const note of notes) {
|
|
119
|
+
const symbols = bySymbol.get(note) ?? [];
|
|
120
|
+
if (!symbols.includes(symbol)) bySymbol.set(note, [...symbols, symbol]);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return [...bySymbol].map(([note, symbols]) => (
|
|
124
|
+
symbols.length === 1 && namesSymbol(note, symbols[0]!) ? note : `${symbolList(symbols)}: ${note}`
|
|
125
|
+
));
|
|
126
|
+
}
|
package/src/cli/history-rows.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { INDEX_POINTS_EXPORT_UNIT, INDEX_POINTS_LABEL, isIndexLevel } from "../market-data/market/index-level";
|
|
2
2
|
import type { PricePoint } from "../types/financials";
|
|
3
|
-
import { marketPriceFractionDigitCeiling, resolveAssetDisplayKind } from "../market-data/market/format";
|
|
3
|
+
import { formatPriceObservation, marketPriceFractionDigitCeiling, resolveAssetDisplayKind } from "../market-data/market/format";
|
|
4
4
|
import { TIME_RANGES, type TimeRange } from "../time-series/range";
|
|
5
5
|
import { subtractTimeRange } from "../time-series/date-window";
|
|
6
6
|
import {
|
|
@@ -28,8 +28,6 @@ const INTRADAY_RESOLUTIONS = ["1m", "5m", "15m", "30m", "45m", "1h"] as const;
|
|
|
28
28
|
/** A first bar later than this after the range's start is a late start, not a weekend or holiday. */
|
|
29
29
|
const LATE_START_MIN_MS = 10 * DAY_MS;
|
|
30
30
|
const LATE_START_MIN_BARS = 3;
|
|
31
|
-
/** A bar with more than this many calendar periods (`barPeriod`) since the one before follows a gap in the series. */
|
|
32
|
-
const BREAK_GAP_PERIODS = 3;
|
|
33
31
|
/** A close more than this many times the close before it, or less than its hundredth, follows a jump. */
|
|
34
32
|
const BREAK_JUMP_RATIO = 100;
|
|
35
33
|
/** Flag codes for a break before a bar, whose prices stay as served; every other code blanks them. */
|
|
@@ -76,6 +74,9 @@ export interface HistoryRow {
|
|
|
76
74
|
volumeUnit?: string;
|
|
77
75
|
/** Why a coin's bar has no volume: `day in progress`, `rebuilt from hourly bars`, `latest trade` (not a bar), `not reported`. */
|
|
78
76
|
volumeNote?: string;
|
|
77
|
+
/** A bar without the market's volume: the trades of one venue alone (`volumeVenue`), never its volume. */
|
|
78
|
+
venueVolume?: number;
|
|
79
|
+
volumeVenue?: string;
|
|
79
80
|
}
|
|
80
81
|
|
|
81
82
|
/** A coin's volume: traded value in its quote currency, per UTC day on daily bars. */
|
|
@@ -148,8 +149,43 @@ function barPeriod(time: number, interval: ManualChartResolution): number {
|
|
|
148
149
|
}
|
|
149
150
|
|
|
150
151
|
/**
|
|
151
|
-
*
|
|
152
|
-
*
|
|
152
|
+
* How many periods (`barPeriod`) in a row without a bar break the series: a
|
|
153
|
+
* single month in monthly bars, since no market closes for a calendar month
|
|
154
|
+
* (GF=F's monthly chart went from 2002-08 to 2002-10); three weeks for weekly
|
|
155
|
+
* and finer bars, which a market's own closures do not reach.
|
|
156
|
+
*/
|
|
157
|
+
function breakGapPeriods(interval: ManualChartResolution): number {
|
|
158
|
+
return interval === "1mo" ? 1 : 3;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/** A run of periods without a bar: the bars on either side of it, and how many periods it spans. */
|
|
162
|
+
interface HistoryHole {
|
|
163
|
+
before: number;
|
|
164
|
+
after: number;
|
|
165
|
+
periods: number;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* The runs of periods without a bar between consecutive bars, oldest first:
|
|
170
|
+
* every missing month of monthly bars and every missing week of weekly bars,
|
|
171
|
+
* a closed week included, and for daily and finer bars each break in the
|
|
172
|
+
* series (breakGapPeriods), since their sessions follow a calendar the bars
|
|
173
|
+
* do not carry. `times` oldest first.
|
|
174
|
+
*/
|
|
175
|
+
function historyHoles(times: readonly number[], interval: ManualChartResolution): HistoryHole[] {
|
|
176
|
+
const least = interval === "1mo" || interval === "1wk" ? 1 : breakGapPeriods(interval);
|
|
177
|
+
const finite = times.filter(Number.isFinite);
|
|
178
|
+
return finite.slice(1).flatMap((after, index) => {
|
|
179
|
+
const before = finite[index]!;
|
|
180
|
+
const periods = barPeriod(after, interval) - barPeriod(before, interval) - 1;
|
|
181
|
+
return periods >= least ? [{ before, after, periods }] : [];
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* The breaks before each bar: `gap` after a month with no bar in monthly
|
|
187
|
+
* bars, or more than three weeks in finer ones (breakGapPeriods), `jump`
|
|
188
|
+
* when its close is over 100 times the last
|
|
153
189
|
* close before it, or under a hundredth of it. Closes that are blank, zero or
|
|
154
190
|
* negative are skipped.
|
|
155
191
|
*/
|
|
@@ -163,7 +199,7 @@ function historyBreakFlags(
|
|
|
163
199
|
return times.map((time, index) => {
|
|
164
200
|
const flags: string[] = [];
|
|
165
201
|
if (interval && Number.isFinite(time)) {
|
|
166
|
-
if (previousTime != null && barPeriod(time, interval) - barPeriod(previousTime, interval) >
|
|
202
|
+
if (previousTime != null && barPeriod(time, interval) - barPeriod(previousTime, interval) > breakGapPeriods(interval)) flags.push("gap");
|
|
167
203
|
previousTime = time;
|
|
168
204
|
}
|
|
169
205
|
const close = closes[index];
|
|
@@ -218,6 +254,9 @@ export function historyRows(
|
|
|
218
254
|
...(point.filled ? { filled: true as const } : {}),
|
|
219
255
|
...(point.unsettled ? { unsettled: true as const } : {}),
|
|
220
256
|
...(volume ? { volumeUnit: volume.unit } : {}),
|
|
257
|
+
...(values.volume == null && point.venueVolume
|
|
258
|
+
? { venueVolume: point.venueVolume.volume, volumeVenue: point.venueVolume.venue }
|
|
259
|
+
: {}),
|
|
221
260
|
// A coin trades every day, so a bar without volume says why.
|
|
222
261
|
...(volume && values.volume == null
|
|
223
262
|
? {
|
|
@@ -343,15 +382,28 @@ export function historyReportsVolume(rows: readonly Pick<HistoryRow, "volume">[]
|
|
|
343
382
|
* are said by their own notes and not counted.
|
|
344
383
|
*/
|
|
345
384
|
export function historyMissingVolumeNote(
|
|
346
|
-
rows: readonly Pick<HistoryRow, "date" | "volume" | "partial" | "filled" | "flag">[],
|
|
385
|
+
rows: readonly Pick<HistoryRow, "date" | "volume" | "venueVolume" | "partial" | "filled" | "flag">[],
|
|
347
386
|
): string | null {
|
|
348
387
|
if (!historyReportsVolume(rows)) return null;
|
|
349
388
|
const latestTrade = latestTradeIndex(rows.map((row) => Date.parse(row.date)));
|
|
350
|
-
const missing = rows.filter((row, index) => row.volume == null && !row.partial && !row.filled
|
|
389
|
+
const missing = rows.filter((row, index) => row.volume == null && row.venueVolume == null && !row.partial && !row.filled
|
|
351
390
|
&& !flagCodes(row).some((code) => !BREAK_FLAGS.has(code)) && index !== latestTrade).length;
|
|
352
391
|
return missingVolumeNotice(missing, rows.length) ?? null;
|
|
353
392
|
}
|
|
354
393
|
|
|
394
|
+
/**
|
|
395
|
+
* "9 of 9 bars count IEX trades only, not the market's volume" when bars carry one venue's count in place of the
|
|
396
|
+
* market's (`venueVolume`), or null.
|
|
397
|
+
*/
|
|
398
|
+
export function historyVenueVolumeNote(rows: readonly Pick<HistoryRow, "venueVolume" | "volumeVenue">[]): string | null {
|
|
399
|
+
const counted = rows.filter((row) => row.venueVolume != null);
|
|
400
|
+
if (!counted.length) return null;
|
|
401
|
+
const venues = [...new Set(counted.map((row) => row.volumeVenue).filter(Boolean))].join(", ") || "one venue";
|
|
402
|
+
const one = counted.length === 1;
|
|
403
|
+
return `${counted.length} of ${rows.length} ${one && rows.length === 1 ? "bar" : "bars"} ${one ? "counts" : "count"} ${venues} trades only, `
|
|
404
|
+
+ "not the market's volume";
|
|
405
|
+
}
|
|
406
|
+
|
|
355
407
|
function neededDecimals(value: number, cap: number): number {
|
|
356
408
|
for (let decimals = 0; decimals < cap; decimals++) {
|
|
357
409
|
if (Number(value.toFixed(decimals)) === value) return decimals;
|
|
@@ -383,6 +435,32 @@ export function historyPriceDecimals(rows: readonly Pick<HistoryRow, typeof PRIC
|
|
|
383
435
|
return largest >= 1 ? Math.max(2, decimals) : decimals;
|
|
384
436
|
}
|
|
385
437
|
|
|
438
|
+
/** A bar's prices as a table lists them; a bar without a close adds nothing to the decimals. */
|
|
439
|
+
interface BarPrices {
|
|
440
|
+
open?: number | null;
|
|
441
|
+
high?: number | null;
|
|
442
|
+
low?: number | null;
|
|
443
|
+
close?: number | null;
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
/**
|
|
447
|
+
* The decimals one table of bars prints its prices with (`history`, HP's pane
|
|
448
|
+
* and `fn HP`): historyPriceDecimals over the float32-cleaned prices, so a
|
|
449
|
+
* feed's 4013.39990234 reads as the 4013.4 it is and the count follows the
|
|
450
|
+
* asset's display rules (two for gold, three for silver, cents for a US equity).
|
|
451
|
+
*/
|
|
452
|
+
export function barPriceDecimals(bars: readonly BarPrices[], assetCategory?: string): number {
|
|
453
|
+
const clean = (value: number | null | undefined) => value == null ? null : cleanFloat32Price(value);
|
|
454
|
+
return historyPriceDecimals(bars.flatMap((bar) => bar.close == null ? [] : [{
|
|
455
|
+
date: "", open: clean(bar.open), high: clean(bar.high), low: clean(bar.low), close: clean(bar.close)!, volume: null,
|
|
456
|
+
}]), assetCategory);
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
/** A price at the table's decimal count (barPriceDecimals), within `maxWidth` when the pane gives one. */
|
|
460
|
+
export function formatBarPrice(value: number, decimals: number, maxWidth?: number): string {
|
|
461
|
+
return formatPriceObservation(Number(value.toFixed(Math.min(20, decimals))), { minimumFractionDigits: decimals, maxWidth });
|
|
462
|
+
}
|
|
463
|
+
|
|
386
464
|
/** How far back ALL reaches, in whole years, from the window a history request for it asks for. */
|
|
387
465
|
export function historyAllRangeYears(now = new Date()): number {
|
|
388
466
|
return Math.round((now.getTime() - subtractTimeRange(now, "ALL").getTime()) / (365.25 * DAY_MS));
|
|
@@ -459,16 +537,48 @@ export function historyFacts(unit: HistoryUnit, rows: readonly Pick<HistoryRow,
|
|
|
459
537
|
].filter(Boolean);
|
|
460
538
|
}
|
|
461
539
|
|
|
540
|
+
/** Whether a first bar dated `firstDate` lies well after the start of `range`: more than a few bars, weekends and holidays aside. */
|
|
541
|
+
function startsLate(range: TimeRange, interval: ManualChartResolution | null, firstDate: string, now: number): boolean {
|
|
542
|
+
const first = Date.parse(firstDate);
|
|
543
|
+
const tolerance = Math.max(LATE_START_MIN_MS, LATE_START_MIN_BARS * CHART_RESOLUTION_STEP_MS[interval ?? RANGE_HISTORY_RESOLUTION[range]]);
|
|
544
|
+
return Number.isFinite(first) && first - subtractTimeRange(new Date(now), range).getTime() > tolerance;
|
|
545
|
+
}
|
|
546
|
+
|
|
547
|
+
/**
|
|
548
|
+
* Where an ALL history starts when that is its source's first bar, well
|
|
549
|
+
* after the window ALL reaches back to (historyAllRangeYears): BTC-USD's
|
|
550
|
+
* monthly bars start 2014-09, though it traded from 2010. A monthly bar's
|
|
551
|
+
* month, otherwise its day. Null for other ranges, and for a history the
|
|
552
|
+
* window cuts.
|
|
553
|
+
*/
|
|
554
|
+
export function historyAllStart(
|
|
555
|
+
range: TimeRange,
|
|
556
|
+
interval: ManualChartResolution | null,
|
|
557
|
+
firstDate: string | undefined,
|
|
558
|
+
now = Date.now(),
|
|
559
|
+
): string | null {
|
|
560
|
+
if (range !== "ALL" || !firstDate || !startsLate(range, interval, firstDate, now)) return null;
|
|
561
|
+
return interval === "1mo" ? firstDate.slice(0, 7) : firstDate.slice(0, 10);
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
/** "ALL starts 2014-09; the source has no earlier bar", for the start historyAllStart finds. */
|
|
565
|
+
export function historyAllStartNote(start: string): string {
|
|
566
|
+
return `ALL starts ${start}; the source has no earlier bar`;
|
|
567
|
+
}
|
|
568
|
+
|
|
462
569
|
/**
|
|
463
570
|
* What an export should know that its rows do not show: bars coarser than the
|
|
464
|
-
* range is served in,
|
|
465
|
-
* listing younger than the range
|
|
571
|
+
* range is served in, a first bar well after the start asked for, as for a
|
|
572
|
+
* listing younger than the range, and where an ALL history starts when that
|
|
573
|
+
* is the source's first bar, unless a coverage line already says where the
|
|
574
|
+
* source starts (`coverageStated`). Weekends and holidays are within tolerance.
|
|
466
575
|
*/
|
|
467
576
|
export function historyNotes(
|
|
468
577
|
range: TimeRange,
|
|
469
578
|
interval: ManualChartResolution | null,
|
|
470
579
|
firstDate: string | undefined,
|
|
471
580
|
now = Date.now(),
|
|
581
|
+
coverageStated = false,
|
|
472
582
|
): string[] {
|
|
473
583
|
if (!firstDate) return [];
|
|
474
584
|
const notes: string[] = [];
|
|
@@ -477,13 +587,11 @@ export function historyNotes(
|
|
|
477
587
|
const from = interval === "1mo" ? firstDate.slice(0, 7) : firstDate.slice(0, 10);
|
|
478
588
|
notes.push(`Asked ${range}, got ${BAR_INTERVAL_LABELS[interval]} bars from ${from}`);
|
|
479
589
|
}
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
const tolerance = Math.max(LATE_START_MIN_MS, LATE_START_MIN_BARS * CHART_RESOLUTION_STEP_MS[interval ?? expected]);
|
|
483
|
-
if (first - subtractTimeRange(new Date(now), range).getTime() > tolerance) {
|
|
484
|
-
notes.push(`Asked ${range}, data starts ${firstDate.slice(0, 10)} (first available bar)`);
|
|
485
|
-
}
|
|
590
|
+
if (range !== "ALL" && startsLate(range, interval, firstDate, now)) {
|
|
591
|
+
notes.push(`Asked ${range}, data starts ${firstDate.slice(0, 10)} (first available bar)`);
|
|
486
592
|
}
|
|
593
|
+
const allStart = coverageStated ? null : historyAllStart(range, interval, firstDate, now);
|
|
594
|
+
if (allStart) notes.push(historyAllStartNote(allStart));
|
|
487
595
|
return notes;
|
|
488
596
|
}
|
|
489
597
|
|
|
@@ -511,36 +619,80 @@ function utcDay(time: number): string {
|
|
|
511
619
|
return new Date(time).toISOString().slice(0, 10);
|
|
512
620
|
}
|
|
513
621
|
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
622
|
+
function monthKey(year: number, month: number): string {
|
|
623
|
+
return utcDay(Date.UTC(year, month, 1)).slice(0, 7);
|
|
624
|
+
}
|
|
625
|
+
|
|
626
|
+
/** The first day of week `period` (`barPeriod`): its Monday. */
|
|
627
|
+
function weekStart(period: number): number {
|
|
628
|
+
return FIRST_MONDAY_MS + period * 7 * DAY_MS;
|
|
629
|
+
}
|
|
630
|
+
|
|
631
|
+
/** "2026-02", "2026-02 to 2026-03 (2 months)", "the week of 2025-09-29", "2015-06-27 to 2015-08-02 (5 weeks)". */
|
|
632
|
+
function holeText(hole: HistoryHole, interval: ManualChartResolution): string {
|
|
633
|
+
const { before, after, periods } = hole;
|
|
634
|
+
if (interval === "1mo") {
|
|
635
|
+
const period = barPeriod(before, interval) + 1;
|
|
636
|
+
const first = monthKey(Math.floor(period / 12), period % 12);
|
|
637
|
+
const last = monthKey(Math.floor((period + periods - 1) / 12), (period + periods - 1) % 12);
|
|
638
|
+
return periods === 1 ? first : `${first} to ${last} (${periods} months)`;
|
|
639
|
+
}
|
|
640
|
+
const length = `${periods} week${periods === 1 ? "" : "s"}`;
|
|
641
|
+
if (interval === "1wk") {
|
|
642
|
+
const first = barPeriod(before, interval) + 1;
|
|
643
|
+
return periods === 1 ? `the week of ${utcDay(weekStart(first))}`
|
|
644
|
+
: `${utcDay(weekStart(first))} to ${utcDay(weekStart(first + periods) - DAY_MS)} (${length})`;
|
|
645
|
+
}
|
|
646
|
+
return `${utcDay(before + DAY_MS)} to ${utcDay(after - DAY_MS)} (${length})`;
|
|
647
|
+
}
|
|
648
|
+
|
|
649
|
+
/**
|
|
650
|
+
* "No bar for 2026-02", "No bars for 2001-07, 2002-09 and 2026-02 to 2026-03
|
|
651
|
+
* (2 months)": every run of periods without a bar (historyHoles), oldest
|
|
652
|
+
* first, each named. `times` oldest first. Null when there is none.
|
|
653
|
+
*/
|
|
654
|
+
export function historyMissingPeriodsNote(times: readonly number[], interval: ManualChartResolution | null): string | null {
|
|
655
|
+
const holes = interval ? historyHoles(times, interval) : [];
|
|
656
|
+
if (!interval || holes.length === 0) return null;
|
|
657
|
+
const one = holes.length === 1 && holes[0]!.periods === 1 && (interval === "1mo" || interval === "1wk");
|
|
658
|
+
return `${one ? "No bar" : "No bars"} for ${listItems(holes.map((hole) => holeText(hole, interval)))}`;
|
|
659
|
+
}
|
|
660
|
+
|
|
661
|
+
/** A bar's date as a history table shows it: the month of a monthly bar, the day of a daily or weekly one, else the UTC time. */
|
|
662
|
+
function holeBarDate(time: number, interval: ManualChartResolution): string {
|
|
663
|
+
const iso = new Date(time).toISOString();
|
|
664
|
+
return interval === "1mo" ? iso.slice(0, 7) : isIntradayResolution(interval) ? formatUtcTime(iso) : iso.slice(0, 10);
|
|
665
|
+
}
|
|
666
|
+
|
|
667
|
+
/**
|
|
668
|
+
* For each bar, oldest first, whether a run of periods without a bar
|
|
669
|
+
* (historyHoles) lies between it and the bar before: its change from that
|
|
670
|
+
* bar spans them. `times` oldest first.
|
|
671
|
+
*/
|
|
672
|
+
export function historyBarsAfterHole(times: readonly number[], interval: ManualChartResolution | null): boolean[] {
|
|
673
|
+
const after = new Set(interval ? historyHoles(times, interval).map((hole) => hole.after) : []);
|
|
674
|
+
return times.map((time) => after.has(time));
|
|
675
|
+
}
|
|
676
|
+
|
|
677
|
+
/**
|
|
678
|
+
* "CHG marked * spans the missing bars: 2026-04 is from 2026-01": the bar
|
|
679
|
+
* each change after a run of periods without a bar (historyBarsAfterHole) is
|
|
680
|
+
* measured from. `times` oldest first. Null when there is none.
|
|
681
|
+
*/
|
|
682
|
+
export function historyChangeBaseNote(times: readonly number[], interval: ManualChartResolution | null): string | null {
|
|
683
|
+
const holes = interval ? historyHoles(times, interval) : [];
|
|
684
|
+
if (!interval || holes.length === 0) return null;
|
|
685
|
+
const bases = holes.map(({ before, after }, index) =>
|
|
686
|
+
`${holeBarDate(after, interval)}${index === 0 ? " is" : ""} from ${holeBarDate(before, interval)}`);
|
|
687
|
+
return `CHG marked * spans the missing bars: ${listItems(bases)}`;
|
|
517
688
|
}
|
|
518
689
|
|
|
519
690
|
/**
|
|
520
|
-
* "No bars for 1980-08 to 1992-11 (148 months)":
|
|
521
|
-
*
|
|
691
|
+
* "No bars for 1980-08 to 1992-11 (148 months)": every run of periods with
|
|
692
|
+
* no bar between two bars (historyMissingPeriodsNote).
|
|
522
693
|
*/
|
|
523
694
|
function historyBreakGapNote(rows: readonly Pick<HistoryRow, "date" | "interval" | "flag">[]): string | null {
|
|
524
|
-
|
|
525
|
-
const gaps = interval ? breaksFlagged(rows, "gap") : [];
|
|
526
|
-
if (!interval || gaps.length === 0) return null;
|
|
527
|
-
const monthly = interval === "1mo";
|
|
528
|
-
const spans = gaps.map(([before, after]) => {
|
|
529
|
-
const [from, to] = [Date.parse(before.date), Date.parse(after.date)];
|
|
530
|
-
const periods = barPeriod(to, interval) - barPeriod(from, interval) - 1;
|
|
531
|
-
const length = `${periods} ${monthly ? "month" : "week"}${periods === 1 ? "" : "s"}`;
|
|
532
|
-
if (monthly) {
|
|
533
|
-
const month = (time: number, step: number) => {
|
|
534
|
-
const date = new Date(time);
|
|
535
|
-
return utcDay(Date.UTC(date.getUTCFullYear(), date.getUTCMonth() + step, 1)).slice(0, 7);
|
|
536
|
-
};
|
|
537
|
-
return `${month(from, 1)} to ${month(to, -1)} (${length})`;
|
|
538
|
-
}
|
|
539
|
-
return `${utcDay(from + (interval === "1wk" ? 7 : 1) * DAY_MS)} to ${utcDay(to - DAY_MS)} (${length})`;
|
|
540
|
-
});
|
|
541
|
-
const shown = spans.slice(-LISTED_GAPS);
|
|
542
|
-
const earlier = spans.length - shown.length;
|
|
543
|
-
return `No bars for ${listItems([...earlier > 0 ? [`${earlier} earlier ${earlier === 1 ? "gap" : "gaps"}`] : [], ...shown])}`;
|
|
695
|
+
return historyMissingPeriodsNote(rows.map((row) => Date.parse(row.date)), rows[0]?.interval ?? null);
|
|
544
696
|
}
|
|
545
697
|
|
|
546
698
|
const closeFormat = new Intl.NumberFormat("en-US", { maximumSignificantDigits: 7, useGrouping: false });
|
|
@@ -573,8 +725,9 @@ export function historyJumpNote(rows: readonly Pick<HistoryRow, "date" | "close"
|
|
|
573
725
|
* "No bar for 2026-10-10": the days a coin, which trades every day, has no
|
|
574
726
|
* daily bar for between its first and last bar. Days before the first bar are
|
|
575
727
|
* before the listing. A market that closes skips weekends and holidays, so its
|
|
576
|
-
* gaps say nothing on their own: for it, and for a coin's other bar
|
|
577
|
-
* note names
|
|
728
|
+
* daily gaps say nothing on their own: for it, and for a coin's other bar
|
|
729
|
+
* sizes, the note names every month or week without a bar and each break in
|
|
730
|
+
* daily or finer bars (historyMissingPeriodsNote), "No bar for 2026-02".
|
|
578
731
|
*/
|
|
579
732
|
export function historyGapNote(
|
|
580
733
|
rows: readonly Pick<HistoryRow, "date" | "interval" | "flag">[],
|
package/src/cli/index-roots.ts
CHANGED
|
@@ -1,44 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
* Well-known index roots that people type bare. As a bare symbol each one is
|
|
3
|
-
* another instrument (MOVE is Corvex, MID a fund) or nothing at all (VIX); the
|
|
4
|
-
* index itself is quoted as ^ROOT. Every entry is offered as a command to run,
|
|
5
|
-
* so only roots whose ^ symbol returns a quote belong here.
|
|
6
|
-
*/
|
|
7
|
-
const INDEX_ROOTS = new Map([
|
|
8
|
-
["VIX", "Cboe Volatility Index"],
|
|
9
|
-
["VVIX", "Cboe VIX of VIX Index"],
|
|
10
|
-
["VIX9D", "Cboe S&P 500 9-Day Volatility Index"],
|
|
11
|
-
["VIX3M", "Cboe S&P 500 3-Month Volatility Index"],
|
|
12
|
-
["VXN", "Cboe Nasdaq-100 Volatility Index"],
|
|
13
|
-
["OVX", "Cboe Crude Oil ETF Volatility Index"],
|
|
14
|
-
["GVZ", "Cboe Gold ETF Volatility Index"],
|
|
15
|
-
["SKEW", "Cboe SKEW Index"],
|
|
16
|
-
["TNX", "Cboe 10-Year Treasury Yield Index"],
|
|
17
|
-
["SPX", "S&P 500 Index"],
|
|
18
|
-
["OEX", "S&P 100 Index"],
|
|
19
|
-
["MID", "S&P MidCap 400 Index"],
|
|
20
|
-
["DJI", "Dow Jones Industrial Average"],
|
|
21
|
-
["NDX", "Nasdaq-100 Index"],
|
|
22
|
-
["SOX", "PHLX Semiconductor Index"],
|
|
23
|
-
["RUT", "Russell 2000 Index"],
|
|
24
|
-
["RUI", "Russell 1000 Index"],
|
|
25
|
-
["RUA", "Russell 3000 Index"],
|
|
26
|
-
["MOVE", "ICE BofA MOVE Index"],
|
|
27
|
-
["NYA", "NYSE Composite Index"],
|
|
28
|
-
]);
|
|
29
|
-
|
|
30
|
-
export interface IndexRoot {
|
|
31
|
-
/** The index's own symbol: ^VIX. */
|
|
32
|
-
symbol: string;
|
|
33
|
-
name: string;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
/** The index a bare root names (VIX is ^VIX); null for any other symbol, ^VIX included. */
|
|
37
|
-
export function indexRootFor(symbol: string): IndexRoot | null {
|
|
38
|
-
const root = symbol.trim().toUpperCase();
|
|
39
|
-
const name = INDEX_ROOTS.get(root);
|
|
40
|
-
return name ? { symbol: `^${root}`, name } : null;
|
|
41
|
-
}
|
|
1
|
+
import { indexRootFor, type IndexRoot } from "../tickers/index-roots";
|
|
42
2
|
|
|
43
3
|
/** A broker's code for an index: VIX.X and $VIX.X as thinkorswim writes it, $VIX as Schwab does. */
|
|
44
4
|
export interface BrokerIndexCode extends IndexRoot {
|
|
@@ -66,14 +26,14 @@ export function brokerIndexReadAs(code: BrokerIndexCode): string {
|
|
|
66
26
|
return `Read ${code.typed} as ${code.symbol} (${code.name}).`;
|
|
67
27
|
}
|
|
68
28
|
|
|
69
|
-
/** "^VIX Cboe Volatility Index (try:
|
|
29
|
+
/** "^VIX Cboe Volatility Index (try: gloom quote ^VIX)", under a bare root that found nothing. */
|
|
70
30
|
export function indexRootTryLine(root: IndexRoot, command = "quote"): string {
|
|
71
|
-
return `${root.symbol} ${root.name} (try:
|
|
31
|
+
return `${root.symbol} ${root.name} (try: gloom ${command} ${root.symbol})`;
|
|
72
32
|
}
|
|
73
33
|
|
|
74
|
-
/** "also ^MOVE ICE BofA MOVE Index (
|
|
34
|
+
/** "also ^MOVE ICE BofA MOVE Index (gloom quote ^MOVE)", under a bare root that quoted another instrument. */
|
|
75
35
|
export function indexRootAlsoLine(root: IndexRoot, command = "quote"): string {
|
|
76
|
-
return `also ${root.symbol} ${root.name} (
|
|
36
|
+
return `also ${root.symbol} ${root.name} (gloom ${command} ${root.symbol})`;
|
|
77
37
|
}
|
|
78
38
|
|
|
79
39
|
/** Cboe's Treasury yield indices: 13-week bill, 5-, 10- and 30-year notes. Each level is a yield in percent. */
|