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
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
import { logFailure } from "../../utils/log-failure";
|
|
2
|
+
import { apiClient } from "../../api-client";
|
|
3
|
+
import { loadResolvedHeadlessPaneModel, reportCoverage, reportGaps, type LoadedHeadlessPaneModel } from "./headless";
|
|
4
|
+
import { dirname } from "path";
|
|
5
|
+
import { mkdir } from "fs/promises";
|
|
6
|
+
import type { Quote } from "../../types/financials";
|
|
7
|
+
import { isRecord } from "../../utils/guards";
|
|
8
|
+
import {
|
|
9
|
+
renderDesktopPaneScreenshot,
|
|
10
|
+
type DesktopPaneShotBridge,
|
|
11
|
+
type DesktopPaneShotPayload,
|
|
12
|
+
type DesktopPaneShotRenderResult,
|
|
13
|
+
} from "../desktop-pane-shot";
|
|
14
|
+
import type { ResolvedPaneFunction } from "./resolver";
|
|
15
|
+
import type { MarketContext } from "../types";
|
|
16
|
+
import type { RemoteUiNodeSnapshot } from "../../remote/types";
|
|
17
|
+
import { declaredReportFreshness, renderedReportFreshness, renderedReportObservations } from "./report-notices";
|
|
18
|
+
import {
|
|
19
|
+
captureStatusLine,
|
|
20
|
+
deriveCaptureReport,
|
|
21
|
+
deriveHeadlessFreshness,
|
|
22
|
+
deriveRenderedFreshness,
|
|
23
|
+
type CaptureReport,
|
|
24
|
+
type CaptureStatusLine,
|
|
25
|
+
type ReportFreshness,
|
|
26
|
+
} from "./freshness";
|
|
27
|
+
import { quotesFreshness } from "../freshness";
|
|
28
|
+
import { paneFitsRows, shotMaxHeightCells, buildDesktopShotPayload } from "./screenshot-payload";
|
|
29
|
+
import { resolveDesktopShotApiProxy, createDesktopShotBridge } from "./screenshot-bridge";
|
|
30
|
+
import type { PaneScreenshotResult } from "./screenshot-types";
|
|
31
|
+
import { assessPaneScreenshot } from "./screenshot-assessment";
|
|
32
|
+
|
|
33
|
+
/** The bridge, keeping every quote it serves the page: what a pane that loads its own quotes (WEI) shows. */
|
|
34
|
+
function recordBridgedQuotes(bridge: DesktopPaneShotBridge): { bridge: DesktopPaneShotBridge; quotes: Quote[] } {
|
|
35
|
+
const quotes: Quote[] = [];
|
|
36
|
+
const keep = (value: unknown) => {
|
|
37
|
+
if (isRecord(value) && typeof value.symbol === "string" && typeof value.price === "number") quotes.push(value as unknown as Quote);
|
|
38
|
+
};
|
|
39
|
+
return {
|
|
40
|
+
quotes,
|
|
41
|
+
bridge: {
|
|
42
|
+
...bridge,
|
|
43
|
+
async marketData(operation, args) {
|
|
44
|
+
const result = await bridge.marketData(operation, args);
|
|
45
|
+
if (operation === "getQuote") keep(result);
|
|
46
|
+
if (operation === "getQuotesBatch" && Array.isArray(result)) {
|
|
47
|
+
for (const entry of result) keep(isRecord(entry) ? entry.quote : null);
|
|
48
|
+
}
|
|
49
|
+
return result;
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* How current a capture's data is (`captureStatusLine`). A pane that dates its
|
|
57
|
+
* view itself (the news wire's delay, FXC's rates) is taken at its word, and so
|
|
58
|
+
* is a report that says what its data is (EE's estimates, MDAY's study): the
|
|
59
|
+
* quotes the page loaded beside them do not date them. A pane that declares a
|
|
60
|
+
* status is never dated by the quotes it shows; otherwise those quotes date it,
|
|
61
|
+
* with their delay and where their markets stand. Then the pane's report, as
|
|
62
|
+
* `fn` ends; then what the rendered view carries. A function that opens one
|
|
63
|
+
* view of a pane hosting several declares it on its template (DDIS in Fixed
|
|
64
|
+
* Income), so its filings, not the issuer's stock quote, date the capture.
|
|
65
|
+
*/
|
|
66
|
+
export function shotFreshness(
|
|
67
|
+
resolved: Pick<ResolvedPaneFunction, "pane" | "template">,
|
|
68
|
+
payload: Pick<DesktopPaneShotPayload, "financials" | "instrumentFinancials">,
|
|
69
|
+
render: Pick<DesktopPaneShotRenderResult, "semanticUi" | "footerText" | "rows">,
|
|
70
|
+
bridgedQuotes: readonly Quote[],
|
|
71
|
+
report: CaptureReport | undefined,
|
|
72
|
+
now = Date.now(),
|
|
73
|
+
): CaptureStatusLine {
|
|
74
|
+
const published = renderedReportFreshness(render.semanticUi ?? []);
|
|
75
|
+
const declared = { ...declaredReportFreshness(resolved), ...published };
|
|
76
|
+
const quotes = [
|
|
77
|
+
...payload.financials.map(([, financials]) => financials.quote),
|
|
78
|
+
...(payload.instrumentFinancials ?? []).map(({ financials }) => financials.quote),
|
|
79
|
+
...bridgedQuotes,
|
|
80
|
+
];
|
|
81
|
+
// A pane that publishes the observations behind its figures (FXC's rates) dates itself.
|
|
82
|
+
const observed = renderedReportObservations(render.semanticUi ?? []);
|
|
83
|
+
const quoted = declared.status || observed.length > 0
|
|
84
|
+
? undefined
|
|
85
|
+
: quotesFreshness(quotes, declared.source ? { source: declared.source } : undefined, now);
|
|
86
|
+
return captureStatusLine({
|
|
87
|
+
report,
|
|
88
|
+
selfDated: Object.keys(published).length > 0 || observed.length > 0,
|
|
89
|
+
quoted,
|
|
90
|
+
rendered: () => deriveRenderedFreshness(declared, {
|
|
91
|
+
footerText: render.footerText ?? "",
|
|
92
|
+
cellTimes: render.rows.flatMap((row) => row.cells.flatMap((cell) => (cell.instant ? [cell.instant] : []))),
|
|
93
|
+
observed,
|
|
94
|
+
}, now),
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* A capture's data dated as its `fn` report dates it, from the same loader:
|
|
100
|
+
* COT's weekly report, CHOKE's transits, GPU's prices. Undefined for a pane
|
|
101
|
+
* without a report, or when it did not load.
|
|
102
|
+
*/
|
|
103
|
+
async function reportShotFreshness(
|
|
104
|
+
resolved: Pick<ResolvedPaneFunction, "headless">,
|
|
105
|
+
loadModel: () => Promise<LoadedHeadlessPaneModel>,
|
|
106
|
+
now = Date.now(),
|
|
107
|
+
): Promise<CaptureReport | undefined> {
|
|
108
|
+
if (!resolved.headless) return undefined;
|
|
109
|
+
try {
|
|
110
|
+
const loaded = await loadModel();
|
|
111
|
+
return deriveCaptureReport(loaded.definition, loaded.result, now);
|
|
112
|
+
} catch (error) {
|
|
113
|
+
logFailure("cli.screenshot", "Read screenshot report freshness failed")(error);
|
|
114
|
+
return undefined;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/** What a capture's report says about its own completeness (`fn`'s `complete`), as `reportCoverage` derives it. */
|
|
119
|
+
export interface ShotReportCoverage {
|
|
120
|
+
complete: boolean;
|
|
121
|
+
unavailableSymbols: string[];
|
|
122
|
+
gaps?: string;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Whether the pane's report covers what was asked, loaded once with the
|
|
127
|
+
* capture's other uses of it. Undefined for a pane without a report, or when
|
|
128
|
+
* it did not load.
|
|
129
|
+
*/
|
|
130
|
+
export async function reportShotCoverage(
|
|
131
|
+
resolved: Pick<ResolvedPaneFunction, "headless">,
|
|
132
|
+
loadModel: () => Promise<LoadedHeadlessPaneModel>,
|
|
133
|
+
): Promise<ShotReportCoverage | undefined> {
|
|
134
|
+
if (!resolved.headless) return undefined;
|
|
135
|
+
try {
|
|
136
|
+
const loaded = await loadModel();
|
|
137
|
+
const { complete, unavailableSymbols } = reportCoverage(loaded);
|
|
138
|
+
const gaps = reportGaps(loaded, deriveHeadlessFreshness(loaded.definition, loaded.result));
|
|
139
|
+
return { complete, unavailableSymbols, ...(gaps ? { gaps } : {}) };
|
|
140
|
+
} catch (error) {
|
|
141
|
+
logFailure("cli.screenshot", "Read screenshot report coverage failed")(error);
|
|
142
|
+
return undefined;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* The capture's result with its report's completeness: a capture of a partial
|
|
148
|
+
* report is partial too, whatever the rendered view shows. Whether the image
|
|
149
|
+
* is fit to use stays what the render says.
|
|
150
|
+
*/
|
|
151
|
+
export function withReportCoverage(result: PaneScreenshotResult, coverage: ShotReportCoverage | undefined): PaneScreenshotResult {
|
|
152
|
+
if (!coverage || coverage.complete) return result;
|
|
153
|
+
return {
|
|
154
|
+
...result,
|
|
155
|
+
complete: false,
|
|
156
|
+
unavailableSymbols: [...new Set([...result.unavailableSymbols, ...coverage.unavailableSymbols])],
|
|
157
|
+
...(coverage.gaps ? { gaps: coverage.gaps } : {}),
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/** How long a rendered capture waits for its report's freshness before dating itself without it. */
|
|
162
|
+
const SHOT_REPORT_WAIT_MS = 20_000;
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* The value of the report's `tab` option for the tab the capture shows, when
|
|
166
|
+
* it was asked for another: `DOE --tab all` draws Crude, so it is dated by
|
|
167
|
+
* Wednesday's petroleum report, not by Thursday's gas storage. Undefined when
|
|
168
|
+
* it shows the tab asked for.
|
|
169
|
+
*/
|
|
170
|
+
export function shownReportTab(
|
|
171
|
+
resolved: Pick<ResolvedPaneFunction, "headless" | "options">,
|
|
172
|
+
semanticUi: readonly RemoteUiNodeSnapshot[],
|
|
173
|
+
): string | undefined {
|
|
174
|
+
const asked = resolved.options.tab;
|
|
175
|
+
const values = resolved.headless?.options?.find(({ key }) => key === "tab")?.values?.map(({ value }) => value) ?? [];
|
|
176
|
+
if (asked == null || values.length === 0) return undefined;
|
|
177
|
+
for (const node of semanticUi) {
|
|
178
|
+
const active = node.role === "tabs" ? node.metadata?.activeValue : undefined;
|
|
179
|
+
if (typeof active === "string" && values.includes(active)) return active === String(asked) ? undefined : active;
|
|
180
|
+
}
|
|
181
|
+
return undefined;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/** `pending`'s value, or undefined when it has not settled within `ms`; a later result is dropped. */
|
|
185
|
+
function settledWithin<T>(pending: Promise<T>, ms: number): Promise<T | undefined> {
|
|
186
|
+
let cancel = () => {};
|
|
187
|
+
const expired = new Promise<undefined>((resolve) => {
|
|
188
|
+
const timer = setTimeout(() => resolve(undefined), ms);
|
|
189
|
+
cancel = () => clearTimeout(timer);
|
|
190
|
+
});
|
|
191
|
+
return Promise.race([pending, expired]).finally(() => cancel());
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/** One load of the pane's report per capture, shared by the payload and the status line. */
|
|
195
|
+
function onceLoader(load: () => Promise<LoadedHeadlessPaneModel>): () => Promise<LoadedHeadlessPaneModel> {
|
|
196
|
+
let pending: Promise<LoadedHeadlessPaneModel> | undefined;
|
|
197
|
+
return () => (pending ??= load());
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
export async function renderDesktopShot({
|
|
201
|
+
resolved,
|
|
202
|
+
context,
|
|
203
|
+
rawArg,
|
|
204
|
+
outputPath,
|
|
205
|
+
width,
|
|
206
|
+
height,
|
|
207
|
+
theme,
|
|
208
|
+
scale,
|
|
209
|
+
watermark,
|
|
210
|
+
statusLine = false,
|
|
211
|
+
fitRows = false,
|
|
212
|
+
fitReader = false,
|
|
213
|
+
maxHeightCells,
|
|
214
|
+
options,
|
|
215
|
+
captureImage = true,
|
|
216
|
+
onStalledReport,
|
|
217
|
+
}: {
|
|
218
|
+
resolved: ResolvedPaneFunction;
|
|
219
|
+
context: MarketContext;
|
|
220
|
+
rawArg: string;
|
|
221
|
+
outputPath: string;
|
|
222
|
+
width: number;
|
|
223
|
+
height: number;
|
|
224
|
+
theme?: string | null;
|
|
225
|
+
scale?: number;
|
|
226
|
+
watermark?: string | null;
|
|
227
|
+
/** Draw the dated status line in the capture's footer. Reports and `--no-status` leave it out. */
|
|
228
|
+
statusLine?: boolean;
|
|
229
|
+
/** No `--height` was asked for: a pane that fits its rows (FUT) grows to show them all. */
|
|
230
|
+
fitRows?: boolean;
|
|
231
|
+
/** A pane whose reader has a page open grows to show all of its text (a report's, which saves no image). */
|
|
232
|
+
fitReader?: boolean;
|
|
233
|
+
/** How tall a pane that fits its rows or its reader may grow, in cells, where the height limit of a saved image does not apply. */
|
|
234
|
+
maxHeightCells?: number;
|
|
235
|
+
options: Record<string, string | true>;
|
|
236
|
+
captureImage?: boolean;
|
|
237
|
+
/**
|
|
238
|
+
* Called when the report behind the status line was still loading at the
|
|
239
|
+
* wait's end: the load was aborted, but a loader that ignores the signal
|
|
240
|
+
* may keep the process alive.
|
|
241
|
+
*/
|
|
242
|
+
onStalledReport?: () => void;
|
|
243
|
+
}): Promise<PaneScreenshotResult> {
|
|
244
|
+
if (captureImage) await mkdir(dirname(outputPath), { recursive: true });
|
|
245
|
+
const apiProxy = resolveDesktopShotApiProxy(context);
|
|
246
|
+
const previousSessionToken = apiClient.getSessionToken();
|
|
247
|
+
let payload: DesktopPaneShotPayload;
|
|
248
|
+
let render: DesktopPaneShotRenderResult;
|
|
249
|
+
let freshness: ReportFreshness | undefined;
|
|
250
|
+
let coverage: Promise<ShotReportCoverage | undefined> | undefined;
|
|
251
|
+
let covered: ShotReportCoverage | undefined;
|
|
252
|
+
// A report still loading when the status line stops waiting for it is
|
|
253
|
+
// aborted, and the caller told: a loader that ignores the signal goes on.
|
|
254
|
+
const reportLoads = new AbortController();
|
|
255
|
+
let loading = 0;
|
|
256
|
+
const loadReport = (target: ResolvedPaneFunction) => {
|
|
257
|
+
loading += 1;
|
|
258
|
+
return loadResolvedHeadlessPaneModel(target, context, rawArg, reportLoads.signal).finally(() => { loading -= 1; });
|
|
259
|
+
};
|
|
260
|
+
const abandonReports = () => {
|
|
261
|
+
if (loading === 0 || reportLoads.signal.aborted) return;
|
|
262
|
+
reportLoads.abort(new Error("The capture stopped waiting for its report."));
|
|
263
|
+
onStalledReport?.();
|
|
264
|
+
};
|
|
265
|
+
apiClient.setSessionToken(apiProxy.sessionToken);
|
|
266
|
+
try {
|
|
267
|
+
const loadModel = onceLoader(() => loadReport(resolved));
|
|
268
|
+
payload = await buildDesktopShotPayload(
|
|
269
|
+
resolved,
|
|
270
|
+
context,
|
|
271
|
+
rawArg,
|
|
272
|
+
options,
|
|
273
|
+
width,
|
|
274
|
+
height,
|
|
275
|
+
theme ?? null,
|
|
276
|
+
scale ?? 1,
|
|
277
|
+
watermark ?? null,
|
|
278
|
+
loadModel,
|
|
279
|
+
);
|
|
280
|
+
if (statusLine && captureImage) payload.statusLine = true;
|
|
281
|
+
const fitRoles = [
|
|
282
|
+
...(fitRows && paneFitsRows(resolved) ? ["data-table-body-scroll"] : []),
|
|
283
|
+
...(fitReader && resolved.pane.shotFitsReader ? ["detail-scroll-body"] : []),
|
|
284
|
+
];
|
|
285
|
+
if (fitRoles.length > 0) {
|
|
286
|
+
payload.maxHeightCells = maxHeightCells ?? shotMaxHeightCells(scale ?? 1);
|
|
287
|
+
payload.fitRoles = fitRoles;
|
|
288
|
+
}
|
|
289
|
+
// Loads while the page renders.
|
|
290
|
+
const report = payload.statusLine ? reportShotFreshness(resolved, loadModel) : undefined;
|
|
291
|
+
// The same load says whether the report is complete, with or without a status line.
|
|
292
|
+
coverage = captureImage ? reportShotCoverage(resolved, loadModel) : undefined;
|
|
293
|
+
const recorded = recordBridgedQuotes(createDesktopShotBridge(context));
|
|
294
|
+
const shotPayload = payload;
|
|
295
|
+
render = await renderDesktopPaneScreenshot(payload, outputPath, apiProxy, {
|
|
296
|
+
captureImage,
|
|
297
|
+
bridge: recorded.bridge,
|
|
298
|
+
statusLine: async (rendered) => {
|
|
299
|
+
const tab = report && shownReportTab(resolved, rendered.semanticUi);
|
|
300
|
+
const shown = tab ? reportShotFreshness(resolved, () => loadReport({ ...resolved, options: { ...resolved.options, tab } })) : report;
|
|
301
|
+
const line = shotFreshness(resolved, shotPayload, rendered, recorded.quotes, shown && await settledWithin(shown, SHOT_REPORT_WAIT_MS));
|
|
302
|
+
abandonReports();
|
|
303
|
+
freshness = line.freshness;
|
|
304
|
+
return { variants: line.variants, dates: line.dates };
|
|
305
|
+
},
|
|
306
|
+
});
|
|
307
|
+
covered = coverage && await settledWithin(coverage, SHOT_REPORT_WAIT_MS);
|
|
308
|
+
} finally {
|
|
309
|
+
apiClient.setSessionToken(previousSessionToken);
|
|
310
|
+
abandonReports();
|
|
311
|
+
}
|
|
312
|
+
const renderedInstance = payload.config.layout.instances.find(({ instanceId }) => instanceId === payload.paneId);
|
|
313
|
+
if (renderedInstance) resolved = { ...resolved, instance: renderedInstance };
|
|
314
|
+
const assessed = withReportCoverage(assessPaneScreenshot(resolved, payload, render, rawArg, outputPath), covered);
|
|
315
|
+
return freshness ? { ...assessed, freshness } : assessed;
|
|
316
|
+
}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import type { DesktopPaneShotRenderResult } from "../desktop-pane-shot";
|
|
2
|
+
import type { ResolvedPaneFunction } from "./resolver";
|
|
3
|
+
import type { FundamentalPeriod } from "../../time-series/reporting";
|
|
4
|
+
import type { PaneScreenshotEvidence } from "./screenshot-evidence";
|
|
5
|
+
import type { ReportFreshness } from "./freshness";
|
|
6
|
+
import type { PaneScreenshotFinancialRatioEvidence } from "./financial-ratio-shot";
|
|
7
|
+
|
|
8
|
+
export interface PaneScreenshotExpectedSelection {
|
|
9
|
+
control: "metric" | "statement" | "ratio" | "period";
|
|
10
|
+
value?: string;
|
|
11
|
+
label?: string;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export interface PaneScreenshotChartPointEvidence {
|
|
15
|
+
date: string;
|
|
16
|
+
close: number;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export interface PaneScreenshotChartSeriesEvidence {
|
|
20
|
+
symbol: string;
|
|
21
|
+
pointCount: number;
|
|
22
|
+
first: PaneScreenshotChartPointEvidence | null;
|
|
23
|
+
last: PaneScreenshotChartPointEvidence | null;
|
|
24
|
+
projectionBaseValue?: number | null;
|
|
25
|
+
projectionLatestRawValue?: number | null;
|
|
26
|
+
projectionLatestValue?: number | null;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export interface PaneScreenshotExpectedChartEvidence {
|
|
30
|
+
kind: "stock-price" | "price-comparison" | "chart-composer";
|
|
31
|
+
symbols: string[];
|
|
32
|
+
rangePreset: string;
|
|
33
|
+
axisMode?: string;
|
|
34
|
+
resolution?: string;
|
|
35
|
+
sourceSeries?: PaneScreenshotChartSeriesEvidence[];
|
|
36
|
+
baseSeries?: Array<{
|
|
37
|
+
id: string;
|
|
38
|
+
sourceKind: "security" | "economic" | "capability";
|
|
39
|
+
symbol?: string;
|
|
40
|
+
fieldId?: string;
|
|
41
|
+
economicSeriesId?: string;
|
|
42
|
+
capabilityId?: string;
|
|
43
|
+
providerSeriesId?: string;
|
|
44
|
+
first?: { date: string; value: number | null } | null;
|
|
45
|
+
last?: { date: string; value: number | null } | null;
|
|
46
|
+
style: string;
|
|
47
|
+
transform: string;
|
|
48
|
+
panelId: string;
|
|
49
|
+
visible: boolean;
|
|
50
|
+
}>;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
interface PaneScreenshotPriceComparisonEvidence {
|
|
54
|
+
kind: "price-comparison";
|
|
55
|
+
symbols: string[];
|
|
56
|
+
range: string;
|
|
57
|
+
series: Array<{
|
|
58
|
+
symbol: string;
|
|
59
|
+
base: { date: string; value: number };
|
|
60
|
+
latest: { date: string; value: number };
|
|
61
|
+
returnPercent: number;
|
|
62
|
+
}>;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
interface PaneScreenshotPriceSeriesEvidence {
|
|
66
|
+
kind: "price-series";
|
|
67
|
+
symbol: string;
|
|
68
|
+
range: string;
|
|
69
|
+
pointCount: number;
|
|
70
|
+
first: PaneScreenshotChartPointEvidence;
|
|
71
|
+
last: PaneScreenshotChartPointEvidence;
|
|
72
|
+
resolution?: string;
|
|
73
|
+
sessionDates?: string[];
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
interface PaneScreenshotFundamentalSeriesEvidence {
|
|
77
|
+
kind: "fundamental-series";
|
|
78
|
+
metric: string;
|
|
79
|
+
period: FundamentalPeriod;
|
|
80
|
+
series: Array<{
|
|
81
|
+
symbol: string;
|
|
82
|
+
rows: Array<{ date: string; value: number }>;
|
|
83
|
+
}>;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
interface PaneScreenshotFinancialStatementEvidence {
|
|
87
|
+
kind: "financial-statement";
|
|
88
|
+
symbol: string;
|
|
89
|
+
statement: string;
|
|
90
|
+
period: FundamentalPeriod;
|
|
91
|
+
latest: {
|
|
92
|
+
date: string;
|
|
93
|
+
metrics: Array<{
|
|
94
|
+
id: string;
|
|
95
|
+
key: string;
|
|
96
|
+
label: string;
|
|
97
|
+
value: number;
|
|
98
|
+
}>;
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
export type PaneScreenshotDataEvidence =
|
|
103
|
+
| PaneScreenshotPriceSeriesEvidence
|
|
104
|
+
| PaneScreenshotPriceComparisonEvidence
|
|
105
|
+
| PaneScreenshotFundamentalSeriesEvidence
|
|
106
|
+
| PaneScreenshotFinancialStatementEvidence
|
|
107
|
+
| PaneScreenshotFinancialRatioEvidence
|
|
108
|
+
| PaneScreenshotEvidence;
|
|
109
|
+
|
|
110
|
+
export interface PaneScreenshotReadinessSignals {
|
|
111
|
+
rowCount: number;
|
|
112
|
+
loadingStateDetected: boolean;
|
|
113
|
+
errorStateDetected: boolean;
|
|
114
|
+
emptyStateDetected: boolean;
|
|
115
|
+
complete: boolean;
|
|
116
|
+
semanticMismatch: boolean;
|
|
117
|
+
requiresStructuredDataEvidence: boolean;
|
|
118
|
+
hasStructuredDataEvidence: boolean;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
export interface PaneScreenshotResult {
|
|
122
|
+
kind: "pane-screenshot";
|
|
123
|
+
target: string;
|
|
124
|
+
capability: {
|
|
125
|
+
id: string;
|
|
126
|
+
botSafe: boolean;
|
|
127
|
+
outputKind: string;
|
|
128
|
+
reportReadiness: ResolvedPaneFunction["capability"]["reportReadiness"];
|
|
129
|
+
screenshotReadiness: ResolvedPaneFunction["capability"]["screenshotReadiness"];
|
|
130
|
+
};
|
|
131
|
+
symbols: string[];
|
|
132
|
+
options: Record<string, string | number | boolean>;
|
|
133
|
+
rowCount: number;
|
|
134
|
+
empty: boolean;
|
|
135
|
+
complete: boolean;
|
|
136
|
+
unavailableSymbols: string[];
|
|
137
|
+
semanticMismatch: boolean;
|
|
138
|
+
usable: boolean;
|
|
139
|
+
unusableReason: string | null;
|
|
140
|
+
dataEvidence: PaneScreenshotDataEvidence | null;
|
|
141
|
+
/** What the pane says its view leaves out, such as OMON's "21 of 145 strikes". */
|
|
142
|
+
notices?: string[];
|
|
143
|
+
/**
|
|
144
|
+
* For a pane that grows to show every row (FUT): how many of the rows its
|
|
145
|
+
* table reports the image shows, section headers left out. `shown` is less
|
|
146
|
+
* than `total` when the height limit or `--height` cut the board.
|
|
147
|
+
*/
|
|
148
|
+
tableRows?: { shown: number; total: number };
|
|
149
|
+
/** What the pane's report leaves out when it is not complete, as `fn` words it: `2 stale`. */
|
|
150
|
+
gaps?: string;
|
|
151
|
+
/** How current the captured data is, as the capture's status line says it; absent with `--no-status`. */
|
|
152
|
+
freshness?: ReportFreshness;
|
|
153
|
+
outputPath: string;
|
|
154
|
+
render: DesktopPaneShotRenderResult & {
|
|
155
|
+
expectedText: string[];
|
|
156
|
+
missingExpectedText: string[];
|
|
157
|
+
expectedSelections: PaneScreenshotExpectedSelection[];
|
|
158
|
+
missingExpectedSelections: PaneScreenshotExpectedSelection[];
|
|
159
|
+
expectedChart: PaneScreenshotExpectedChartEvidence | null;
|
|
160
|
+
chartEvidenceMismatches: string[];
|
|
161
|
+
};
|
|
162
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { typoDistance } from "../../utils/typo-distance";
|
|
2
|
-
import { findCapabilityOption } from "./capabilities";
|
|
2
|
+
import { findCapabilityOption, optionFlag } from "./capabilities";
|
|
3
3
|
import type { ResolvedPaneFunction } from "./resolver";
|
|
4
4
|
|
|
5
5
|
/** An argument as a shell reads it back: bare when it is one word, in quotes when it is not. */
|
|
@@ -40,13 +40,18 @@ export function shotOptionRefusal(
|
|
|
40
40
|
options: Record<string, string | true>,
|
|
41
41
|
{ explain = false }: { explain?: boolean } = {},
|
|
42
42
|
): string | null {
|
|
43
|
-
const report = (...flags: string[]) => ["
|
|
43
|
+
const report = (...flags: string[]) => ["gloom fn", resolved.token, rawArgument.trim() && shellWord(rawArgument.trim()), ...flags]
|
|
44
44
|
.filter(Boolean).join(" ");
|
|
45
45
|
const given: Array<[string, string | true]> = [...explain ? [["explain", true] as [string, true]] : [], ...Object.entries(options)];
|
|
46
|
+
// The report is run with every option only it reads, so HP's `--from 2007 --to 2009` keeps its end.
|
|
47
|
+
const reportFlags = given.flatMap(([key, value]) => {
|
|
48
|
+
const option = findCapabilityOption(resolved.capability, key);
|
|
49
|
+
return option?.shot ? [optionFlag(option.key), value === true ? "" : shellWord(value)] : [];
|
|
50
|
+
});
|
|
46
51
|
for (const [key, value] of given) {
|
|
47
52
|
const option = findCapabilityOption(resolved.capability, key);
|
|
48
53
|
if (option?.shot) {
|
|
49
|
-
return `${resolved.token}'s pane does not draw --${option.key}: it ${option.shot.reportOnly}. Drop it from shot, or run the report: ${report(
|
|
54
|
+
return `${resolved.token}'s pane does not draw --${option.key}: it ${option.shot.reportOnly}. Drop it from shot, or run the report: ${report(...reportFlags)}`;
|
|
50
55
|
}
|
|
51
56
|
if (option) continue;
|
|
52
57
|
const row = GLOBAL_ROW_OPTIONS[key];
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import type { Quote } from "../types/financials";
|
|
2
|
+
import type { QuoteBatchResult, QuoteSubscriptionTarget } from "../types/data-provider";
|
|
3
|
+
import {
|
|
4
|
+
bymaDollarLineKeys, formatPairRate, listingDepositaryPair, pairPriceInput, pairTimeText, pesoImpliedRates,
|
|
5
|
+
PESO_REFERENCE_RECEIPT, spotRateKind, type ImpliedDollarRate,
|
|
6
|
+
} from "../market-data/depositary-pair";
|
|
7
|
+
|
|
8
|
+
/** Galicia's peso line, which the receipt and both Buenos Aires dollar lines are compared with. */
|
|
9
|
+
const PESO_REFERENCE_HOME = "GGAL.BA";
|
|
10
|
+
|
|
11
|
+
export interface PesoDollarRates {
|
|
12
|
+
/** `official wholesale`: what the served USD/ARS rate is. */
|
|
13
|
+
spotKind: string;
|
|
14
|
+
rates: ImpliedDollarRate[];
|
|
15
|
+
/** The listings no price came back for. */
|
|
16
|
+
missing: string[];
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/** Whether a pair is the peso against the dollar, either way round. */
|
|
20
|
+
export function isPesoDollarPair(currency: string, baseCurrency: string): boolean {
|
|
21
|
+
const codes = new Set([currency, baseCurrency]);
|
|
22
|
+
return codes.has("ARS") && codes.has("USD");
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* The peso's market dollar rates beside the official one: the CCL rate
|
|
27
|
+
* Galicia's receipt implies against its peso line, and the CCL and MEP rates
|
|
28
|
+
* of its Buenos Aires C and D lines. The four quotes are read in one batch,
|
|
29
|
+
* through the same quote path as `quote`. The receipt's ratio is the one
|
|
30
|
+
* Gloom Cloud serves on it; without it that row is left out.
|
|
31
|
+
*/
|
|
32
|
+
export async function loadPesoDollarRates(
|
|
33
|
+
getQuotesBatch: (targets: QuoteSubscriptionTarget[]) => Promise<QuoteBatchResult[]>,
|
|
34
|
+
): Promise<PesoDollarRates> {
|
|
35
|
+
const lines = bymaDollarLineKeys(PESO_REFERENCE_HOME)!;
|
|
36
|
+
const keys = [PESO_REFERENCE_RECEIPT, PESO_REFERENCE_HOME, lines.ccl, lines.mep];
|
|
37
|
+
const results = await getQuotesBatch(keys.map((symbol) => ({ symbol, exchange: "" })));
|
|
38
|
+
const quotes = new Map<string, Quote | null>(keys.map((key, index) => [key, results[index]?.quote ?? null]));
|
|
39
|
+
const receiptQuote = quotes.get(PESO_REFERENCE_RECEIPT) ?? null;
|
|
40
|
+
const pair = listingDepositaryPair({ quote: receiptQuote });
|
|
41
|
+
const pairsWithHome = pair?.ordinary.some((line) => line.toUpperCase() === PESO_REFERENCE_HOME) ?? false;
|
|
42
|
+
const input = (key: string) => pairPriceInput(key, quotes.get(key));
|
|
43
|
+
// A ratio not on record leaves the receipt's rate out rather than guess it.
|
|
44
|
+
const rates = pesoImpliedRates(pair && pairsWithHome ? pair.ratio : null, {
|
|
45
|
+
home: input(PESO_REFERENCE_HOME),
|
|
46
|
+
receipt: input(PESO_REFERENCE_RECEIPT),
|
|
47
|
+
ccl: input(lines.ccl),
|
|
48
|
+
mep: input(lines.mep),
|
|
49
|
+
});
|
|
50
|
+
return { spotKind: spotRateKind("ARS")!, rates, missing: keys.filter((key) => !input(key)) };
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/** `CCL via GGAL ADR 1,651.28 = 6,260 × 10 / 37.91 (GGAL.BA Fri 23 Oct 20:00 UTC, GGAL Fri 23 Oct 20:00 UTC)`. */
|
|
54
|
+
export function pesoDollarRateLines(report: PesoDollarRates, now = Date.now()): string[] {
|
|
55
|
+
if (report.rates.length === 0) return [];
|
|
56
|
+
const labelWidth = Math.max(...report.rates.map((rate) => rate.label.length));
|
|
57
|
+
const valueWidth = Math.max(...report.rates.map((rate) => formatPairRate(rate.rate).length));
|
|
58
|
+
return [
|
|
59
|
+
"Market rates implied by Buenos Aires prices, pesos per dollar:",
|
|
60
|
+
...report.rates.map((rate) => {
|
|
61
|
+
const times = rate.inputs.map((input) => `${input.symbol} ${input.observedAt == null ? "undated" : pairTimeText(input.observedAt, now)}${input.open ? "" : ", closed"}`);
|
|
62
|
+
return ` ${rate.label.padEnd(labelWidth)} ${formatPairRate(rate.rate).padStart(valueWidth)} = ${rate.formula} (${times.join("; ")})`;
|
|
63
|
+
}),
|
|
64
|
+
];
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/** The rates as `fx --json` gives them. */
|
|
68
|
+
export function pesoDollarRatesJson(report: PesoDollarRates) {
|
|
69
|
+
return {
|
|
70
|
+
spotKind: report.spotKind,
|
|
71
|
+
impliedRates: report.rates.map((rate) => ({
|
|
72
|
+
kind: rate.kind, label: rate.label, rate: rate.rate, formula: rate.formula,
|
|
73
|
+
inputs: rate.inputs.map((input) => ({
|
|
74
|
+
symbol: input.symbol, price: input.price, currency: input.currency,
|
|
75
|
+
observedAt: input.observedAt == null ? null : new Date(input.observedAt).toISOString(), sessionOpen: input.open,
|
|
76
|
+
})),
|
|
77
|
+
})),
|
|
78
|
+
};
|
|
79
|
+
}
|
package/src/cli/quote-answer.ts
CHANGED
|
@@ -7,7 +7,8 @@ import { canonicalExchange } from "../utils/exchanges";
|
|
|
7
7
|
import type { CliCommandDef } from "../types/plugin";
|
|
8
8
|
import { currencyCodeNote } from "./currency-hints";
|
|
9
9
|
import { describeSuggestion, suggestListing, suggestUsTicker, type ListingSuggestion } from "./listing-suggestion";
|
|
10
|
-
import { indexRootAlsoLine,
|
|
10
|
+
import { indexRootAlsoLine, indexRootTryLine } from "./index-roots";
|
|
11
|
+
import { indexRootFor } from "../tickers/index-roots";
|
|
11
12
|
import { treasuryYieldLine, treasuryYieldTenor } from "./treasury-yields";
|
|
12
13
|
import { knownGapForTicker } from "./known-gaps";
|
|
13
14
|
import {
|
|
@@ -15,10 +16,13 @@ import {
|
|
|
15
16
|
isNoProviderError,
|
|
16
17
|
listingChoiceNotes,
|
|
17
18
|
listingReadNotes,
|
|
19
|
+
ListingArgError,
|
|
18
20
|
loadBareVenues,
|
|
19
21
|
notTradedMessage,
|
|
22
|
+
oneWordCompanyName,
|
|
20
23
|
quoteBareListing,
|
|
21
24
|
requireCliListing,
|
|
25
|
+
resolveCliListing,
|
|
22
26
|
tradingBoardNote,
|
|
23
27
|
type CliListing,
|
|
24
28
|
type ListingDataRequest,
|
|
@@ -105,7 +109,10 @@ export async function answerQuote(
|
|
|
105
109
|
// BDI asks which exchange (Black Diamond Group) and says nowhere that the Baltic Dry Index is not here.
|
|
106
110
|
listing.exchange ? null : knownGapForTicker(listing.symbol),
|
|
107
111
|
].filter((line): line is string => !!line);
|
|
108
|
-
if (!other && tryLines.length === 0)
|
|
112
|
+
if (!other && tryLines.length === 0) {
|
|
113
|
+
return await answerCompanyName(result, listing, market, request, refresh)
|
|
114
|
+
?? { result: await withCurrencyPairHint(result, market), listing, notes: [] };
|
|
115
|
+
}
|
|
109
116
|
const message = other?.message ?? `${listing.symbol} has no ${request.noun}.`;
|
|
110
117
|
const details = [other?.details, ...tryLines].filter(Boolean).join("\n");
|
|
111
118
|
const oneLine = [
|
|
@@ -116,6 +123,34 @@ export async function answerQuote(
|
|
|
116
123
|
return { result, listing, failure: { message, details, oneLine }, notes: [] };
|
|
117
124
|
}
|
|
118
125
|
|
|
126
|
+
/**
|
|
127
|
+
* A company's name typed as one word (`Apple`) that the source says is not a
|
|
128
|
+
* ticker, answered as the listing search names for it with the line saying so
|
|
129
|
+
* ("Read "Apple" as AAPL:NASDAQ (Apple Inc.)."), as a name of several words
|
|
130
|
+
* is. Null when the word names no company, or that listing has no quote
|
|
131
|
+
* either: the word keeps its own "Not a ticker".
|
|
132
|
+
*/
|
|
133
|
+
async function answerCompanyName(
|
|
134
|
+
result: QuoteBatchResult,
|
|
135
|
+
listing: CliListing,
|
|
136
|
+
market: MarketContext,
|
|
137
|
+
request: ListingDataRequest,
|
|
138
|
+
refresh: boolean,
|
|
139
|
+
): Promise<QuoteAnswer | null> {
|
|
140
|
+
if (!listing.typed || listing.exchange || !notATickerSymbol(errorMessage(result.error) ?? "")) return null;
|
|
141
|
+
const named = await oneWordCompanyName(listing.typed, market);
|
|
142
|
+
if (!named) return null;
|
|
143
|
+
// A listing on a venue the app cannot read is no answer: the word keeps its own "Not a ticker".
|
|
144
|
+
const resolved = await resolveCliListing(named.key, null, market).catch((error: unknown) => {
|
|
145
|
+
if (error instanceof ListingArgError) return null;
|
|
146
|
+
throw error;
|
|
147
|
+
});
|
|
148
|
+
if (!resolved) return null;
|
|
149
|
+
const found = { ...resolved, readAs: named.readAs, ...named.meant ? { meant: named.meant } : {} };
|
|
150
|
+
const [quoted] = await market.dataProvider.getQuotesBatch([found.request], { forceRefresh: refresh, revalidate: true });
|
|
151
|
+
return quoted?.quote ? answerQuote(quoted, found, market, request, refresh, null) : null;
|
|
152
|
+
}
|
|
153
|
+
|
|
119
154
|
/** A listing a command found a quote for, with what `quote` says beside it. */
|
|
120
155
|
interface QuotedListing {
|
|
121
156
|
/** The listing the quote is of: the one typed, or the venue a bare symbol was quoted on. */
|
|
@@ -164,7 +199,7 @@ export async function requireQuotedListing(
|
|
|
164
199
|
|
|
165
200
|
/**
|
|
166
201
|
* A symbol written like a currency pair that is not a ticker (USD_NGN, as some
|
|
167
|
-
* FX feeds write a pair) names the listing `
|
|
202
|
+
* FX feeds write a pair) names the listing `gloom search` finds nearest to
|
|
168
203
|
* it, as `watchlist add` does: "Did you mean USDNGN=X (US Dollar/Nigerian
|
|
169
204
|
* Naira)?". When search finds nothing near, the row keeps its own error and its
|
|
170
205
|
* search hint.
|