gloomberb 0.18.2 → 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/patches/electrobun@1.18.1.patch +106 -5
- 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 +99 -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 +24 -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 +26 -7
- 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/telemetry.ts +17 -0
- package/src/api-client/themes.ts +7 -1
- package/src/api-client/types.ts +90 -2
- package/src/app/global-shortcuts.ts +1 -16
- 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/runtime/update.ts +28 -8
- package/src/app/star-prompt/status-line.tsx +2 -2
- package/src/architecture/core-builtin-allowlist.json +5 -2
- package/src/architecture/pane-tabs-allowlist.json +65 -0
- 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 +1189 -296
- 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 +272 -70
- 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 +20 -14
- 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 +32 -18
- package/src/cli/issuer-membership.ts +103 -0
- package/src/cli/known-gaps.ts +118 -25
- package/src/cli/listing-arg.ts +315 -43
- package/src/cli/name-entries.ts +73 -22
- 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 +77 -20
- package/src/cli/pane-functions/catalog.ts +40 -23
- package/src/cli/pane-functions/discovery.ts +1 -1
- package/src/cli/pane-functions/dom.ts +12 -8
- 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 +48 -16
- package/src/cli/pane-functions/index.ts +82 -21
- 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 +65 -14
- 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 +190 -27
- package/src/cli/restore-plugins.ts +29 -14
- package/src/cli/result.ts +122 -25
- 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 +226 -60
- 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 +387 -21
- package/src/components/chart/composite/drawing-store.ts +26 -6
- package/src/components/chart/composite/interactions.ts +9 -3
- 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 +316 -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 +19 -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/command-items.ts +32 -6
- 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/data-table/view.tsx +23 -3
- 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 +13 -6
- package/src/components/layout/detached-pane-shell.tsx +1 -0
- package/src/components/layout/floating-pane.tsx +1 -0
- package/src/components/layout/header.tsx +234 -60
- 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/pane/header.tsx +10 -3
- package/src/components/layout/pane/index.tsx +1 -0
- package/src/components/layout/pane/pane-tabs.tsx +9 -1
- 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/components/ui/stat-grid.tsx +28 -3
- package/src/components/ui/status.tsx +3 -1
- package/src/core/app-services.ts +4 -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 +51 -12
- package/src/i18n/ja.ts +51 -12
- package/src/i18n/ko.ts +51 -12
- package/src/i18n/zh-cn.ts +51 -12
- package/src/i18n/zh-tw.ts +51 -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 +30 -18
- 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 +108 -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 +77 -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 +107 -43
- package/src/plugins/builtin/attention/pane.tsx +22 -16
- 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 +12 -9
- package/src/plugins/builtin/backtest/export.ts +1 -1
- 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 +24 -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 +115 -26
- package/src/plugins/builtin/broker-trading/ticket-parts.tsx +36 -7
- package/src/plugins/builtin/broker-trading/ticket.tsx +122 -36
- 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 +34 -18
- 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/client.ts +2 -2
- 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 +9 -11
- 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 +128 -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 +14 -8
- package/src/plugins/builtin/company-attention/app-rank.tsx +11 -10
- 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 +89 -31
- 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 +5 -4
- 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 +7 -4
- package/src/plugins/builtin/correlation/relationship/model.ts +1 -0
- package/src/plugins/builtin/correlation/settings.ts +1 -0
- 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 +7 -5
- 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/credit-documents/pane.tsx +8 -7
- 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/debt-maturities/pane.tsx +4 -3
- 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 +19 -12
- 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 +77 -5
- package/src/plugins/builtin/equity-screener/live.ts +1 -1
- package/src/plugins/builtin/equity-screener/model.ts +34 -0
- package/src/plugins/builtin/equity-screener/pane.tsx +148 -106
- 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 +16 -10
- 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/board.tsx +4 -1
- package/src/plugins/builtin/gpu/changes.tsx +10 -10
- package/src/plugins/builtin/gpu/equities.tsx +4 -1
- package/src/plugins/builtin/gpu/headless.ts +9 -4
- package/src/plugins/builtin/gpu/history.tsx +4 -2
- package/src/plugins/builtin/gpu/pane.tsx +5 -3
- 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 +15 -2
- package/src/plugins/builtin/holders/format.ts +28 -17
- package/src/plugins/builtin/holders/headless.ts +48 -8
- 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/thirteenf-match.ts +3 -1
- package/src/plugins/builtin/holders/treemap.tsx +2 -2
- package/src/plugins/builtin/insider/base-values.ts +11 -7
- package/src/plugins/builtin/insider/client.ts +3 -0
- package/src/plugins/builtin/insider/headless.ts +20 -7
- package/src/plugins/builtin/insider/index.tsx +17 -8
- package/src/plugins/builtin/insider/issuer.ts +34 -4
- package/src/plugins/builtin/insider/signals-client.ts +3 -3
- package/src/plugins/builtin/insider/signals.tsx +1 -1
- package/src/plugins/builtin/insider/table-model.ts +35 -13
- package/src/plugins/builtin/insider/table.tsx +5 -2
- 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/events.ts +145 -0
- package/src/plugins/builtin/iv-history/format.ts +3 -0
- package/src/plugins/builtin/iv-history/headless.ts +91 -7
- 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 +14 -8
- 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 +36 -21
- 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 +33 -11
- 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 +50 -15
- package/src/plugins/builtin/notes/export.ts +17 -6
- package/src/plugins/builtin/notes/files.ts +16 -5
- package/src/plugins/builtin/openfda/pane.tsx +1 -1
- package/src/plugins/builtin/options/carry.ts +2 -2
- package/src/plugins/builtin/options/enrichment-model.ts +10 -9
- package/src/plugins/builtin/options/index.tsx +1 -1
- package/src/plugins/builtin/options/model-spot.ts +70 -4
- package/src/plugins/builtin/options/view.tsx +51 -23
- package/src/plugins/builtin/options-calculator/headless.ts +46 -7
- package/src/plugins/builtin/options-calculator/pane.tsx +3 -2
- package/src/plugins/builtin/options-positioning/headless.ts +11 -3
- package/src/plugins/builtin/options-positioning/model.ts +24 -0
- package/src/plugins/builtin/options-positioning/pane.tsx +10 -12
- package/src/plugins/builtin/options-scenario/client.ts +142 -29
- 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 +49 -21
- 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 +22 -10
- 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 +145 -60
- package/src/plugins/builtin/portfolio-list/cli/bulk-symbols.ts +78 -27
- 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 +6 -3
- 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 +44 -32
- 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/client.ts +2 -1
- package/src/plugins/builtin/reverse-dcf/model.ts +10 -5
- package/src/plugins/builtin/risk-factors/index.tsx +2 -2
- package/src/plugins/builtin/scanner/lock-note.ts +1 -1
- package/src/plugins/builtin/seasonality/client.ts +2 -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 +6 -4
- 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-resource.ts +15 -2
- 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 +23 -0
- package/src/plugins/builtin/shared/series-cache.ts +2 -0
- package/src/plugins/builtin/shared/series-list-detail.tsx +3 -1
- package/src/plugins/builtin/shared/ticker-surface.ts +2 -1
- package/src/plugins/builtin/shared/volatility/options.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/social-mentions/client.ts +2 -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 +28 -7
- package/src/plugins/builtin/vol-surface/headless.ts +43 -15
- package/src/plugins/builtin/vol-surface/model.ts +34 -12
- package/src/plugins/builtin/vol-surface/pane.tsx +33 -13
- package/src/plugins/builtin/vol-surface/stored.ts +34 -3
- package/src/plugins/builtin/vol-surface/tables.ts +14 -0
- 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/desktop/controls.tsx +1 -1
- package/src/renderers/dom/desktop/query-bar.tsx +2 -0
- 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/host/tabs.tsx +16 -5
- package/src/renderers/dom/host/top-surface.ts +127 -0
- package/src/renderers/dom/styles.css +115 -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/core-capabilities.ts +9 -1
- package/src/renderers/electrobun/bun/desktop/backend-requests.ts +3 -0
- package/src/renderers/electrobun/bun/desktop/backend.ts +56 -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/desktop/update.ts +210 -30
- 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 +9 -7
- package/src/renderers/electrobun/view/remote/asset-data-client.ts +9 -2
- 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 +8 -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 +39 -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/index.ts +16 -0
- 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 +21 -4
- package/src/telemetry/update-failures-node.ts +59 -0
- package/src/telemetry/update-failures.ts +307 -0
- 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 +215 -36
- package/src/tickers/company-name.ts +43 -0
- package/src/tickers/index-roots.ts +47 -0
- package/src/tickers/instrument-label.ts +5 -1
- package/src/tickers/listing-fate.ts +30 -0
- 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 +20 -0
- package/src/types/exchange-rate.ts +6 -0
- package/src/types/financials.ts +104 -7
- package/src/types/headless.ts +83 -6
- package/src/types/instrument.ts +3 -0
- package/src/types/issuer-listings.ts +28 -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/failure.ts +163 -0
- package/src/updater/index.ts +97 -28
- 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-pair.ts +26 -0
- 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 +71 -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/name-entries.ts
CHANGED
|
@@ -3,32 +3,81 @@ import type { DataProvider } from "../types/data-provider";
|
|
|
3
3
|
import { findListingOfCompanyName, isCompanyNameInput, readTerminalCodeArg } from "../tickers/company-name-listing";
|
|
4
4
|
import { isNotATickerMessage } from "./not-a-ticker";
|
|
5
5
|
import { splitSymbolWords } from "./symbol-args";
|
|
6
|
-
import {
|
|
6
|
+
import { isNumberCell } from "./symbol-cells";
|
|
7
|
+
import { isProviderBusy, type ProviderBusyError } from "../sources/provider-errors";
|
|
8
|
+
import { unknownBloombergMarket } from "../tickers/terminal-codes";
|
|
7
9
|
|
|
8
10
|
/**
|
|
9
|
-
* The entries of a list (`splitSymbolArgs
|
|
10
|
-
* resolves. An entry with a space in it is a company's name when
|
|
11
|
-
* the company (`Whirlpool Corporation`),
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
11
|
+
* The entries of a list (`splitSymbolArgs`, or a file's lines) as the symbols
|
|
12
|
+
* a command resolves. An entry with a space in it is a company's name when
|
|
13
|
+
* search finds the company (`Whirlpool Corporation`, `philip morris intl`),
|
|
14
|
+
* and stays whole for its listing to say what it was read as. One search
|
|
15
|
+
* finds no company for is its words, each a symbol, when each is written as
|
|
16
|
+
* a symbol or has a quote (`AAPL MSFT`, `brk.b bf-b`, `aapl msft` on a
|
|
17
|
+
* pasted line), and otherwise stays whole, a name nothing lists: its words
|
|
18
|
+
* are not taken for other companies' symbols (INTL, a fund, from a misspelt
|
|
19
|
+
* `phillip morris intl`). Only those entries cost a search. One search was
|
|
20
|
+
* too busy to look up is its words only when each has a quote (`GME AMC`),
|
|
21
|
+
* as `readPhraseArgument` reads a quoted line, and otherwise stays whole, so
|
|
22
|
+
* its lookup says so instead of resolving its words as symbols of other
|
|
23
|
+
* companies.
|
|
16
24
|
*/
|
|
17
25
|
export async function readNameEntries(
|
|
18
26
|
entries: readonly string[],
|
|
19
|
-
dataProvider: Pick<DataProvider, "search"
|
|
27
|
+
dataProvider: Pick<DataProvider, "search"> & Partial<Pick<DataProvider, "getQuotesBatch" | "getQuote">>,
|
|
20
28
|
): Promise<string[]> {
|
|
21
|
-
const read = await Promise.all(entries.map(async (entry) =>
|
|
22
|
-
// A terminal's code for a listing ("JPM US Equity") is one entry, like a company's name
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
29
|
+
const read = await Promise.all(entries.map(async (entry) => {
|
|
30
|
+
// A terminal's code for a listing ("JPM US Equity", "VOD LN") is one entry, like a company's name, and so is a
|
|
31
|
+
// line written as one whose market code is unknown ("AAPL GP"): its lookup refuses it, never AAPL and GP.
|
|
32
|
+
if (unknownBloombergMarket(entry) || await readTerminalCodeArg(dataProvider, entry)) return [entry];
|
|
33
|
+
if (!isCompanyNameInput(entry)) return splitSymbolWords([entry]);
|
|
34
|
+
const named = await findListingOfCompanyName(dataProvider, entry).catch(busyAsAnswer);
|
|
35
|
+
const busy = isProviderBusy(named);
|
|
36
|
+
if (named && !busy) return [entry];
|
|
37
|
+
const words = splitSymbolWords([entry]);
|
|
38
|
+
return await wordsAreSymbols(words, dataProvider, { quoteEvery: busy }) ? words : [entry];
|
|
39
|
+
}));
|
|
26
40
|
return read.flat();
|
|
27
41
|
}
|
|
28
42
|
|
|
29
|
-
/**
|
|
30
|
-
function
|
|
31
|
-
|
|
43
|
+
/** A word typed as a ticker is: in capitals (AAPL, 7203.T), with a venue or class mark (brk.b, bf-b, SAN:EPA), or after a $. */
|
|
44
|
+
function writtenAsSymbol(word: string): boolean {
|
|
45
|
+
return /^\$|[:.\-/=^]/.test(word) || /\d/.test(word) || (/\p{Lu}/u.test(word) && !/\p{Ll}/u.test(word));
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Whether the words of an entry search found no company for are symbols:
|
|
50
|
+
* each written as one (2222, BRK.B) or else with a quote, the others asked in
|
|
51
|
+
* one batch (`2222 amd pltr`). With `quoteEvery`, for an entry search was too
|
|
52
|
+
* busy to look up, each but a listing (SAN:EPA) needs a quote, as words in
|
|
53
|
+
* capitals can be a name too (BANK OF AMERICA). A batch that fails says
|
|
54
|
+
* nothing, and the entry stays a name.
|
|
55
|
+
*/
|
|
56
|
+
async function wordsAreSymbols(
|
|
57
|
+
words: readonly string[],
|
|
58
|
+
dataProvider: Partial<Pick<DataProvider, "getQuotesBatch" | "getQuote">>,
|
|
59
|
+
{ quoteEvery = false }: { quoteEvery?: boolean } = {},
|
|
60
|
+
): Promise<boolean> {
|
|
61
|
+
const symbols = words.filter((word) => quoteEvery ? !word.includes(":") : !writtenAsSymbol(word)).map((word) => word.replace(/^\$/, "").toUpperCase());
|
|
62
|
+
if (symbols.length === 0) return true;
|
|
63
|
+
if (dataProvider.getQuotesBatch) {
|
|
64
|
+
const results = await dataProvider.getQuotesBatch(symbols.map((symbol) => ({ symbol, exchange: "" })))
|
|
65
|
+
.catch(logFailure("cli.name-entries", "Read quotes for a pasted line failed", []));
|
|
66
|
+
return results.length === symbols.length && results.every(({ quote }) => !!quote);
|
|
67
|
+
}
|
|
68
|
+
// A source without batches is asked a quote at a time: the few words not written as symbols.
|
|
69
|
+
const { getQuote } = dataProvider;
|
|
70
|
+
if (!getQuote) return false;
|
|
71
|
+
const quoted = await Promise.all(symbols.map((symbol) => getQuote(symbol, "").then(
|
|
72
|
+
(quote) => !!quote,
|
|
73
|
+
logFailure("cli.name-entries", "Read a quote for a pasted line failed", false),
|
|
74
|
+
)));
|
|
75
|
+
return quoted.every(Boolean);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/** `findListingOfCompanyName`'s busy answer, returned for the words to be read without it; any other failure as it is. */
|
|
79
|
+
function busyAsAnswer(error: unknown): ProviderBusyError {
|
|
80
|
+
if (isProviderBusy(error)) return error;
|
|
32
81
|
throw error;
|
|
33
82
|
}
|
|
34
83
|
|
|
@@ -44,7 +93,8 @@ export type PhraseReading =
|
|
|
44
93
|
* word is one the source says is not a ticker (`"AAPL MSFT"`), else a phrase
|
|
45
94
|
* (`"10 year yield"`), which is never split into symbols such as YEAR and
|
|
46
95
|
* YIELD. The words are asked in one batch beside the name search, not a
|
|
47
|
-
* request each; a word written as a listing (`SAN:EPA`) is taken as one
|
|
96
|
+
* request each; a word written as a listing (`SAN:EPA`) is taken as one, and
|
|
97
|
+
* a number (`10.5`, `5.25%`) is never asked: it makes the line a phrase.
|
|
48
98
|
* When search is too busy to say whether it names a company, a line whose
|
|
49
99
|
* every word has a quote is still symbols; anything else throws
|
|
50
100
|
* `ProviderBusyError`, as its words may be other companies' symbols.
|
|
@@ -53,9 +103,10 @@ export async function readPhraseArgument(
|
|
|
53
103
|
phrase: string,
|
|
54
104
|
dataProvider: Pick<DataProvider, "search" | "getQuotesBatch">,
|
|
55
105
|
): Promise<PhraseReading> {
|
|
56
|
-
if (await readTerminalCodeArg(dataProvider, phrase)) return { kind: "symbols", symbols: [phrase] };
|
|
106
|
+
if (unknownBloombergMarket(phrase) || await readTerminalCodeArg(dataProvider, phrase)) return { kind: "symbols", symbols: [phrase] };
|
|
57
107
|
const words = splitSymbolWords([phrase]);
|
|
58
|
-
const
|
|
108
|
+
const numbered = words.some(isNumberCell);
|
|
109
|
+
const asked = words.filter((word) => !word.includes(":") && !isNumberCell(word)).map((word) => word.replace(/^\$/, "").toUpperCase());
|
|
59
110
|
const [named, results] = await Promise.all([
|
|
60
111
|
findListingOfCompanyName(dataProvider, phrase).catch((error: unknown) => {
|
|
61
112
|
if (isProviderBusy(error)) return error;
|
|
@@ -66,11 +117,11 @@ export async function readPhraseArgument(
|
|
|
66
117
|
: [],
|
|
67
118
|
]);
|
|
68
119
|
if (isProviderBusy(named)) {
|
|
69
|
-
if (results.length === asked.length && results.every(({ quote }) => !!quote)) return { kind: "symbols", symbols: words };
|
|
120
|
+
if (!numbered && results.length === asked.length && results.every(({ quote }) => !!quote)) return { kind: "symbols", symbols: words };
|
|
70
121
|
throw named;
|
|
71
122
|
}
|
|
72
123
|
if (named) return { kind: "name", name: phrase };
|
|
73
124
|
// A word the source could not answer for (an outage) is given the benefit of the doubt, as the line was before.
|
|
74
|
-
const notTicker = results.some(({ quote, error }) => !quote && isNotATickerMessage(error instanceof Error ? error.message : String(error ?? "")));
|
|
125
|
+
const notTicker = numbered || results.some(({ quote, error }) => !quote && isNotATickerMessage(error instanceof Error ? error.message : String(error ?? "")));
|
|
75
126
|
return notTicker ? { kind: "phrase", phrase } : { kind: "symbols", symbols: words };
|
|
76
127
|
}
|
package/src/cli/native-smoke.ts
CHANGED
|
@@ -7,6 +7,8 @@ export async function smokeOpenTuiNative(): Promise<void> {
|
|
|
7
7
|
}
|
|
8
8
|
|
|
9
9
|
export async function smokeOpenTuiRuntime(): Promise<void> {
|
|
10
|
+
const { loadRenderLib } = await import("../renderers/opentui/render-lib");
|
|
11
|
+
await loadRenderLib();
|
|
10
12
|
await import("../renderers/opentui/start");
|
|
11
13
|
const { assertRendersLeaveNoTimingEntries } = await import("../renderers/opentui/render-timing-smoke");
|
|
12
14
|
await assertRendersLeaveNoTimingEntries();
|
package/src/cli/not-a-ticker.ts
CHANGED
|
@@ -5,7 +5,7 @@ import { treasuryYieldHint, treasuryYieldTenor } from "./treasury-yields";
|
|
|
5
5
|
|
|
6
6
|
// "Not a ticker: APPLE." as the router words it; the symbol ends at the sentence's own period.
|
|
7
7
|
// One that already names what to try (a search, a FRED series, a yield, the pair search offered) is left alone.
|
|
8
|
-
const NOT_A_TICKER_SENTENCE = /Not a ticker: ((?:(?!\.\s)[^\n`\x1b])+?)\.(?=\s|\x1b|$)(?! Try `
|
|
8
|
+
const NOT_A_TICKER_SENTENCE = /Not a ticker: ((?:(?!\.\s)[^\n`\x1b])+?)\.(?=\s|\x1b|$)(?! Try `gloom (?:search|fred|quote) | Did you mean )/g;
|
|
9
9
|
|
|
10
10
|
/**
|
|
11
11
|
* The symbol as the user typed it on the command line (`Apple`), not as the router saw it (`APPLE`).
|
|
@@ -25,13 +25,13 @@ function typedSymbol(symbol: string, args: readonly string[]): string {
|
|
|
25
25
|
return symbol;
|
|
26
26
|
}
|
|
27
27
|
|
|
28
|
-
/** "Try `
|
|
28
|
+
/** "Try `gloom search Apple`." naming what the user typed; a venue (`Apple:NYSE`) is not part of a search. */
|
|
29
29
|
function searchHint(typed: string): string {
|
|
30
30
|
const query = typed.split(":")[0]!.trim() || typed;
|
|
31
|
-
return `Try \`
|
|
31
|
+
return `Try \`gloom search ${/\s/.test(query) ? JSON.stringify(query) : query}\`.`;
|
|
32
32
|
}
|
|
33
33
|
|
|
34
|
-
/** Whether an id is a FRED series the catalog charts (DFEDTARU), which `
|
|
34
|
+
/** Whether an id is a FRED series the catalog charts (DFEDTARU), which `gloom fred` prints. */
|
|
35
35
|
export type FredSeriesCheck = (seriesId: string) => boolean;
|
|
36
36
|
|
|
37
37
|
/**
|
|
@@ -40,20 +40,30 @@ export type FredSeriesCheck = (seriesId: string) => boolean;
|
|
|
40
40
|
* series id (DFEDTARU) is no ticker search finds, so its hint is the `fred` command instead, a
|
|
41
41
|
* coin on the crypto board typed bare (USDT, TETHER) names its one symbol, USDT-USD, once
|
|
42
42
|
* `primeBoardCoins` has read the board, and a Treasury yield typed as a ticker (US10Y) names the
|
|
43
|
-
* commands that have it.
|
|
43
|
+
* commands that have it. A one-word company name a line says was read as a listing ("Read
|
|
44
|
+
* "APPLE" as AAPL:NASDAQ") is put back in the user's spelling too.
|
|
44
45
|
*/
|
|
45
46
|
export function withSearchHints(text: string, args: readonly string[], isFredSeries: FredSeriesCheck = () => false): string {
|
|
46
|
-
|
|
47
|
-
|
|
47
|
+
const named = withTypedNames(text, args);
|
|
48
|
+
return named.includes("Not a ticker: ")
|
|
49
|
+
? named.replace(NOT_A_TICKER_SENTENCE, (sentence, symbol: string) => {
|
|
48
50
|
const typed = typedSymbol(symbol, args);
|
|
49
51
|
const id = typed.toUpperCase();
|
|
50
|
-
if (/^[A-Z0-9]+$/.test(id) && isFredSeries(id)) return `${sentence} Try \`
|
|
52
|
+
if (/^[A-Z0-9]+$/.test(id) && isFredSeries(id)) return `${sentence} Try \`gloom fred ${id}\`.`;
|
|
51
53
|
const coin = boardCoinFor(id);
|
|
52
54
|
if (coin) return `${sentence} Did you mean ${coin.symbol}${coin.name && coin.name.toUpperCase() !== coin.symbol ? ` (${coin.name})` : ""}?`;
|
|
53
55
|
const tenor = treasuryYieldTenor(typed);
|
|
54
56
|
return `${sentence} ${tenor ? treasuryYieldHint(tenor) : searchHint(typed)}`;
|
|
55
57
|
})
|
|
56
|
-
:
|
|
58
|
+
: named;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// "Read "APPLE" as AAPL:NASDAQ (Apple Inc.)." as a list reads a one-word name, upper-cased like a symbol.
|
|
62
|
+
const READ_AS_NAME = /Read "([^"\n]+)" as /g;
|
|
63
|
+
|
|
64
|
+
/** A company's name the line says was read as a listing, in the user's own spelling from `args` (`Apple`). */
|
|
65
|
+
function withTypedNames(text: string, args: readonly string[]): string {
|
|
66
|
+
return text.includes("Read \"") ? text.replace(READ_AS_NAME, (_line, name: string) => `Read "${typedSymbol(name, args)}" as `) : text;
|
|
57
67
|
}
|
|
58
68
|
|
|
59
69
|
/**
|
package/src/cli/options.ts
CHANGED
|
@@ -4,6 +4,13 @@ export interface CliGlobalOptions {
|
|
|
4
4
|
format: CliOutputFormat;
|
|
5
5
|
quiet: boolean;
|
|
6
6
|
color: boolean | null;
|
|
7
|
+
/**
|
|
8
|
+
* `--plain`: tables without rules, arrows in words, every column kept with
|
|
9
|
+
* "—" for an empty cell (`setCliPlainOverride`); `--no-plain` turns it
|
|
10
|
+
* off. Null leaves it to the environment: on with NO_COLOR set to a value,
|
|
11
|
+
* or when stdout is not a terminal (`plainByDefault`).
|
|
12
|
+
*/
|
|
13
|
+
plain: boolean | null;
|
|
7
14
|
limit?: number;
|
|
8
15
|
/** `--tail <n>`: the newest n rows of a dated series, in their printed order. Never set with `limit`. */
|
|
9
16
|
tail?: number;
|
|
@@ -31,6 +38,7 @@ export const DEFAULT_CLI_OPTIONS: CliGlobalOptions = {
|
|
|
31
38
|
format: "text",
|
|
32
39
|
quiet: false,
|
|
33
40
|
color: null,
|
|
41
|
+
plain: null,
|
|
34
42
|
refresh: false,
|
|
35
43
|
dryRun: false,
|
|
36
44
|
yes: false,
|
|
@@ -110,6 +118,10 @@ export function parseCliGlobalArgs(rawArgs: string[]): ParsedCliArgs {
|
|
|
110
118
|
options.color = true;
|
|
111
119
|
continue;
|
|
112
120
|
}
|
|
121
|
+
if (arg === "--plain" || arg === "--no-plain") {
|
|
122
|
+
options.plain = arg === "--plain";
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
113
125
|
if (arg === "--refresh") {
|
|
114
126
|
options.refresh = true;
|
|
115
127
|
continue;
|
|
@@ -18,6 +18,8 @@ export interface PaneFunctionCapability {
|
|
|
18
18
|
botSafe: boolean;
|
|
19
19
|
tickerCardinality: PaneFunctionTickerCardinality;
|
|
20
20
|
aliases: string[];
|
|
21
|
+
/** Words that are no code but ask for this function's data: `fn` and `catalog` answer them with it. */
|
|
22
|
+
suggestFor?: string[];
|
|
21
23
|
intents: string[];
|
|
22
24
|
outputKind: string;
|
|
23
25
|
reportReadiness: PaneFunctionReadiness;
|
|
@@ -25,6 +27,8 @@ export interface PaneFunctionCapability {
|
|
|
25
27
|
dataRequirements: string[];
|
|
26
28
|
limitations: string[];
|
|
27
29
|
options: PaneFunctionOptionDef[];
|
|
30
|
+
/** A rendered view that refuses any option it does not declare (PaneDef.reportOptionsOnly), as a headless report does. */
|
|
31
|
+
strictOptions?: boolean;
|
|
28
32
|
}
|
|
29
33
|
|
|
30
34
|
const NON_DATA_PANE_IDS = new Set([
|
|
@@ -66,6 +70,7 @@ function fallbackCapability(
|
|
|
66
70
|
? RENDERED_VIEW_LIMITATION
|
|
67
71
|
: "This pane is an interactive surface and does not expose a data report."],
|
|
68
72
|
options: [...(pane.reportOptions ?? [])],
|
|
73
|
+
...pane.reportOptionsOnly ? { strictOptions: true } : {},
|
|
69
74
|
};
|
|
70
75
|
}
|
|
71
76
|
|
|
@@ -77,6 +82,14 @@ function optionToken(value: string): string {
|
|
|
77
82
|
return value.trim().toLowerCase().replace(/[\s_.-]+/g, "");
|
|
78
83
|
}
|
|
79
84
|
|
|
85
|
+
/**
|
|
86
|
+
* An option as an error names it, the way it is typed on the command line:
|
|
87
|
+
* `--as-of` for the `asOf` the parser reads `--as-of` (or `--asOf`) into.
|
|
88
|
+
*/
|
|
89
|
+
export function optionFlag(key: string): string {
|
|
90
|
+
return `--${key.replace(/([a-z0-9])([A-Z])/g, "$1-$2").toLowerCase()}`;
|
|
91
|
+
}
|
|
92
|
+
|
|
80
93
|
// Choices longer than this move from the flag into its description, where they can wrap.
|
|
81
94
|
export const MAX_INLINE_CHOICES = 24;
|
|
82
95
|
|
|
@@ -88,7 +101,7 @@ export function optionChoices(option: PaneFunctionOptionDef): string[] {
|
|
|
88
101
|
export function optionFlags(option: PaneFunctionOptionDef): string {
|
|
89
102
|
const choices = optionChoices(option).join("|");
|
|
90
103
|
const value = choices && choices.length <= MAX_INLINE_CHOICES ? choices : option.values?.length ? "value" : option.placeholder ?? option.type;
|
|
91
|
-
return
|
|
104
|
+
return `${optionFlag(option.key)} <${value}>`;
|
|
92
105
|
}
|
|
93
106
|
|
|
94
107
|
/** The option values a typed word is, by value or alias: `gas` is JODI's `--commodity gas`. */
|
|
@@ -97,18 +110,29 @@ function optionValueOf(options: readonly PaneFunctionOptionDef[], typed: string)
|
|
|
97
110
|
for (const option of options) {
|
|
98
111
|
const value = option.values?.find((candidate) => optionToken(candidate.value) === token
|
|
99
112
|
|| candidate.aliases?.some((alias) => optionToken(alias) === token));
|
|
100
|
-
if (value) return
|
|
113
|
+
if (value) return `${optionFlag(option.key)} ${value.value}`;
|
|
101
114
|
}
|
|
102
115
|
return null;
|
|
103
116
|
}
|
|
104
117
|
|
|
118
|
+
/** Options that name an underlying listing, which a ticker typed after the function is meant for. */
|
|
119
|
+
const LISTING_OPTION_KEYS = new Set(["symbol", "ticker", "underlying"]);
|
|
120
|
+
|
|
121
|
+
/** `--symbol NEM` for a word that reads as a ticker (NEM, BHP:ASX, 7203.T), when the function takes one as an option. */
|
|
122
|
+
function listingOptionOf(options: readonly PaneFunctionOptionDef[], typed: string): string | null {
|
|
123
|
+
const word = typed.trim();
|
|
124
|
+
if (!/^[A-Za-z0-9^][A-Za-z0-9.:=^&-]{0,23}$/.test(word) || !/[A-Za-z]/.test(word)) return null;
|
|
125
|
+
const option = options.find(({ key, type }) => type === "string" && LISTING_OPTION_KEYS.has(optionToken(key)));
|
|
126
|
+
return option ? `${optionFlag(option.key)} ${word}` : null;
|
|
127
|
+
}
|
|
128
|
+
|
|
105
129
|
/** An option in use, as typed after the function: its own example, else a choice that is not the default. */
|
|
106
130
|
function optionExample(option: PaneFunctionOptionDef): string {
|
|
107
131
|
if (option.example) return option.example;
|
|
108
|
-
if (option.type === "boolean") return
|
|
132
|
+
if (option.type === "boolean") return optionFlag(option.key);
|
|
109
133
|
const choice = option.values?.find(({ value }) => value !== option.defaultValue);
|
|
110
|
-
if (choice) return
|
|
111
|
-
return
|
|
134
|
+
if (choice) return `${optionFlag(option.key)} ${choice.value}`;
|
|
135
|
+
return `${optionFlag(option.key)} <${option.placeholder ?? option.type}>`;
|
|
112
136
|
}
|
|
113
137
|
|
|
114
138
|
/** Options a no-argument error lists before it points at the catalog for the rest. */
|
|
@@ -117,7 +141,8 @@ const LISTED_OPTIONS = 6;
|
|
|
117
141
|
/**
|
|
118
142
|
* What a function that takes no argument answers one with: its options and a
|
|
119
143
|
* command to run. A word that is one of an option's values runs as that option
|
|
120
|
-
* (`fn JODI gas` is `fn JODI --commodity gas`)
|
|
144
|
+
* (`fn JODI gas` is `fn JODI --commodity gas`), and a ticker runs as the option that takes one
|
|
145
|
+
* (`fn OVME NEM` is `fn OVME --symbol NEM`); anything else gets an option's example.
|
|
121
146
|
*/
|
|
122
147
|
export function noArgumentMessage(
|
|
123
148
|
options: readonly PaneFunctionOptionDef[],
|
|
@@ -126,11 +151,11 @@ export function noArgumentMessage(
|
|
|
126
151
|
command: "fn" | "shot" = "fn",
|
|
127
152
|
): string {
|
|
128
153
|
const head = `${code} does not accept an argument.`;
|
|
129
|
-
if (options.length === 0) return `${head} Run:
|
|
130
|
-
const asOption = optionValueOf(options, typed);
|
|
154
|
+
if (options.length === 0) return `${head} Run: gloom ${command} ${code}`;
|
|
155
|
+
const asOption = optionValueOf(options, typed) ?? listingOptionOf(options, typed);
|
|
131
156
|
const listed = options.slice(0, LISTED_OPTIONS).map(optionFlags).join(", ");
|
|
132
|
-
const more = options.length > LISTED_OPTIONS ? ` and ${options.length - LISTED_OPTIONS} more (
|
|
133
|
-
const run = asOption ? `Run:
|
|
157
|
+
const more = options.length > LISTED_OPTIONS ? ` and ${options.length - LISTED_OPTIONS} more (gloom catalog ${code})` : "";
|
|
158
|
+
const run = asOption ? `Run: gloom ${command} ${code} ${asOption}` : `Example: gloom ${command} ${code} ${optionExample(options[0]!)}`;
|
|
134
159
|
return `${head} Options: ${listed}${more}. ${run}`;
|
|
135
160
|
}
|
|
136
161
|
|
|
@@ -160,6 +185,30 @@ export function getHeadlessPaneDefinition(
|
|
|
160
185
|
return template?.headless ?? pane.headless;
|
|
161
186
|
}
|
|
162
187
|
|
|
188
|
+
/** What a function takes after its code: its kind and the name the catalog gives it. */
|
|
189
|
+
export interface PaneFunctionArgument {
|
|
190
|
+
kind?: string;
|
|
191
|
+
placeholder?: string;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
* The argument a function takes, as the catalog writes it and `fn` checks it:
|
|
196
|
+
* the `headless` model's, else the template shortcut's, else the one a
|
|
197
|
+
* rendered view declares (`reportArgument`).
|
|
198
|
+
*/
|
|
199
|
+
export function paneFunctionArgument(template: PaneTemplateDef | undefined, pane: PaneDef): PaneFunctionArgument {
|
|
200
|
+
const headless = getHeadlessPaneDefinition(template, pane);
|
|
201
|
+
return {
|
|
202
|
+
kind: headless?.argument.kind ?? template?.shortcut?.argKind ?? pane.reportArgument?.kind,
|
|
203
|
+
placeholder: headless?.argument.placeholder ?? template?.shortcut?.argPlaceholder ?? pane.reportArgument?.placeholder,
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/** A function the catalog lists with no argument, which refuses one as CBR does. */
|
|
208
|
+
export function takesNoArgument({ kind, placeholder }: PaneFunctionArgument): boolean {
|
|
209
|
+
return !placeholder && (!kind || kind === "none");
|
|
210
|
+
}
|
|
211
|
+
|
|
163
212
|
export function getPaneFunctionCapability(
|
|
164
213
|
template: PaneTemplateDef | undefined,
|
|
165
214
|
pane: PaneDef,
|
|
@@ -207,7 +256,7 @@ function normalizeEnumValue(option: PaneFunctionOptionDef, rawValue: string, arg
|
|
|
207
256
|
if (match) return match.value;
|
|
208
257
|
const hint = option.invalidValueHint?.(rawValue, argument);
|
|
209
258
|
throw new Error(
|
|
210
|
-
`Invalid
|
|
259
|
+
`Invalid ${optionFlag(option.key)} value "${rawValue}".${hint ? ` ${hint}` : ""} Use one of: ${option.values?.map(({ value }) => value).join(", ") ?? ""}.`,
|
|
211
260
|
);
|
|
212
261
|
}
|
|
213
262
|
|
|
@@ -220,19 +269,19 @@ function normalizeOptionValue(
|
|
|
220
269
|
if (rawValue === true) return true;
|
|
221
270
|
if (/^true$/i.test(rawValue)) return true;
|
|
222
271
|
if (/^false$/i.test(rawValue)) return false;
|
|
223
|
-
throw new Error(`Invalid
|
|
272
|
+
throw new Error(`Invalid ${optionFlag(option.key)} value "${rawValue}". Use true or false.`);
|
|
224
273
|
}
|
|
225
|
-
if (rawValue === true) throw new Error(
|
|
274
|
+
if (rawValue === true) throw new Error(`${optionFlag(option.key)} requires a value.`);
|
|
226
275
|
if (option.normalize) return option.normalize(rawValue);
|
|
227
276
|
if (option.type === "enum") return normalizeEnumValue(option, rawValue, argument);
|
|
228
277
|
if (option.type === "integer") {
|
|
229
278
|
const value = Number(rawValue);
|
|
230
|
-
if (!Number.isInteger(value)) throw new Error(
|
|
279
|
+
if (!Number.isInteger(value)) throw new Error(`${optionFlag(option.key)} must be an integer.`);
|
|
231
280
|
if (option.minimum != null && value < option.minimum) {
|
|
232
|
-
throw new Error(
|
|
281
|
+
throw new Error(`${optionFlag(option.key)} must be at least ${option.minimum}.`);
|
|
233
282
|
}
|
|
234
283
|
if (option.maximum != null && value > option.maximum) {
|
|
235
|
-
throw new Error(
|
|
284
|
+
throw new Error(`${optionFlag(option.key)} must be at most ${option.maximum}.`);
|
|
236
285
|
}
|
|
237
286
|
return value;
|
|
238
287
|
}
|
|
@@ -248,7 +297,7 @@ export function normalizeCapabilityOptions(
|
|
|
248
297
|
*/
|
|
249
298
|
settings: { strict?: boolean; code?: string; argument?: string | null } = {},
|
|
250
299
|
): NormalizedPaneFunctionOptions {
|
|
251
|
-
if (!capability.botSafe) {
|
|
300
|
+
if (!capability.botSafe && !capability.strictOptions) {
|
|
252
301
|
// A rendered view takes any pane setting; the options it declares are checked.
|
|
253
302
|
return Object.fromEntries(Object.entries(options).map(([key, value]) => {
|
|
254
303
|
const option = findCapabilityOption(capability, key);
|
|
@@ -260,20 +309,27 @@ export function normalizeCapabilityOptions(
|
|
|
260
309
|
for (const option of capability.options) {
|
|
261
310
|
if (option.defaultValue !== undefined) normalized[option.key] = option.defaultValue;
|
|
262
311
|
}
|
|
312
|
+
// Each option typed, by its key, as the user wrote it (`--window` for RETURN's --range).
|
|
313
|
+
const typed = new Map<string, string>();
|
|
263
314
|
for (const [rawKey, rawValue] of Object.entries(options)) {
|
|
264
315
|
const option = findCapabilityOption(capability, rawKey);
|
|
316
|
+
if (option) typed.set(option.key, rawKey);
|
|
265
317
|
if (!option) {
|
|
266
318
|
if (settings.strict === false) {
|
|
267
319
|
normalized[rawKey] = rawValue;
|
|
268
320
|
continue;
|
|
269
321
|
}
|
|
270
|
-
const supported = capability.options.map(({ key }) =>
|
|
322
|
+
const supported = capability.options.map(({ key }) => optionFlag(key)).join(", ");
|
|
271
323
|
throw new Error(
|
|
272
|
-
`${settings.code ?? capability.id} does not support
|
|
324
|
+
`${settings.code ?? capability.id} does not support ${optionFlag(rawKey)}.${supported ? ` Supported options: ${supported}.` : " It has no options."}`,
|
|
273
325
|
);
|
|
274
326
|
}
|
|
275
327
|
normalized[option.key] = normalizeOptionValue(option, rawValue, settings.argument);
|
|
276
328
|
}
|
|
329
|
+
for (const [key, rawKey] of typed) {
|
|
330
|
+
const replaced = findCapabilityOption(capability, key)?.replaces?.find((other) => typed.has(other));
|
|
331
|
+
if (replaced) throw new Error(`${optionFlag(rawKey)} replaces ${optionFlag(typed.get(replaced)!)}; give one of them.`);
|
|
332
|
+
}
|
|
277
333
|
return normalized;
|
|
278
334
|
}
|
|
279
335
|
|
|
@@ -283,7 +339,8 @@ export function capabilityPaneSettings(
|
|
|
283
339
|
): Record<string, unknown> {
|
|
284
340
|
const settings: Record<string, unknown> = {};
|
|
285
341
|
for (const option of capability.options) {
|
|
286
|
-
|
|
342
|
+
// An option read from pane state sets no setting, unless it also names one.
|
|
343
|
+
if (option.pluginState && !option.settingKey) continue;
|
|
287
344
|
const value = options[option.key];
|
|
288
345
|
if (value !== undefined) settings[option.settingKey ?? option.key] = value;
|
|
289
346
|
}
|
|
@@ -13,6 +13,7 @@ import {
|
|
|
13
13
|
MAX_INLINE_CHOICES,
|
|
14
14
|
optionChoices,
|
|
15
15
|
optionFlags,
|
|
16
|
+
paneFunctionArgument,
|
|
16
17
|
type PaneFunctionCapability,
|
|
17
18
|
type PaneFunctionOptionDef,
|
|
18
19
|
type PaneFunctionReadiness,
|
|
@@ -153,12 +154,8 @@ export function findFunctionCode(registry: PaneFunctionCatalog, token: string):
|
|
|
153
154
|
...(headless?.discovery?.aliases ?? []),
|
|
154
155
|
];
|
|
155
156
|
if (!codes.some((code) => code && normalizeLookupToken(code) === wanted)) return null;
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
argKind: headless?.argument.kind ?? found.shortcut?.argKind,
|
|
159
|
-
argPlaceholder: headless?.argument.placeholder ?? found.shortcut?.argPlaceholder,
|
|
160
|
-
}),
|
|
161
|
-
};
|
|
157
|
+
const argument = pane ? paneFunctionArgument(found, pane) : { kind: found.shortcut?.argKind, placeholder: found.shortcut?.argPlaceholder };
|
|
158
|
+
return { argument: argumentHint({ argKind: argument.kind, argPlaceholder: argument.placeholder }) };
|
|
162
159
|
}
|
|
163
160
|
|
|
164
161
|
/** A function code a typed one is a slip away from: what to type, and the function's name. */
|
|
@@ -184,7 +181,7 @@ const NEAR_CODE_LIMIT = 3;
|
|
|
184
181
|
* among the mnemonics the command bar takes, each named by the code it is
|
|
185
182
|
* near (`DES` for Ticker Research, whose code is T). Empty when none is that
|
|
186
183
|
* close, the name is too short to tell, or so many are that none stands out.
|
|
187
|
-
* A word typed as a command (`commandWord`, `
|
|
184
|
+
* A word typed as a command (`commandWord`, `gloom RCDF PLTR`) is held to
|
|
188
185
|
* MIN_COMMAND_WORD_TYPO_LENGTH and the code's first letter, so a ticker typed
|
|
189
186
|
* there is not taken for a code.
|
|
190
187
|
*/
|
|
@@ -210,6 +207,21 @@ export function nearFunctionCodes(
|
|
|
210
207
|
.sort((left, right) => left.code.localeCompare(right.code));
|
|
211
208
|
}
|
|
212
209
|
|
|
210
|
+
/**
|
|
211
|
+
* The functions a word that is no code asks for (`IVOL`, `IV`: HIVG and
|
|
212
|
+
* OVDV), as their `discovery.suggestFor` lists it, each by its code.
|
|
213
|
+
*/
|
|
214
|
+
export function suggestedFunctionCodes(registry: PaneFunctionCatalog, name: string): NearFunctionCode[] {
|
|
215
|
+
const wanted = normalizeLookupToken(name);
|
|
216
|
+
if (!wanted) return [];
|
|
217
|
+
return [...registry.paneTemplates.values()].flatMap((template) => {
|
|
218
|
+
const pane = registry.panes.get(template.paneId);
|
|
219
|
+
const words = pane ? getHeadlessPaneDefinition(template, pane)?.discovery?.suggestFor ?? [] : [];
|
|
220
|
+
const code = template.shortcut?.prefix;
|
|
221
|
+
return code && words.some((word) => normalizeLookupToken(word) === wanted) ? [{ code: code.toUpperCase(), label: template.label }] : [];
|
|
222
|
+
}).sort((left, right) => left.code.localeCompare(right.code));
|
|
223
|
+
}
|
|
224
|
+
|
|
213
225
|
function sampleArgForTemplate(template: PaneTemplateDef): string {
|
|
214
226
|
switch (template.shortcut?.argKind) {
|
|
215
227
|
case "ticker":
|
|
@@ -244,6 +256,7 @@ async function buildTemplateCatalogEntry(
|
|
|
244
256
|
}
|
|
245
257
|
|
|
246
258
|
const headless = getHeadlessPaneDefinition(template, pane);
|
|
259
|
+
const argument = paneFunctionArgument(template, pane);
|
|
247
260
|
return {
|
|
248
261
|
token: template.shortcut?.prefix ?? template.id,
|
|
249
262
|
label: template.label,
|
|
@@ -253,8 +266,8 @@ async function buildTemplateCatalogEntry(
|
|
|
253
266
|
templateId: template.id,
|
|
254
267
|
shortcut: template.shortcut?.prefix,
|
|
255
268
|
aliases: [...(template.shortcut?.aliases ?? [])],
|
|
256
|
-
argKind:
|
|
257
|
-
argPlaceholder:
|
|
269
|
+
argKind: argument.kind,
|
|
270
|
+
argPlaceholder: argument.placeholder,
|
|
258
271
|
...(headless?.argument.examples?.length ? { argExamples: headless.argument.examples } : {}),
|
|
259
272
|
...(headless?.argument.kind === "tickers" && template.shortcut?.argKind === "ticker"
|
|
260
273
|
? { shotArgument: argumentHint({ argKind: "ticker", argPlaceholder: template.shortcut.argPlaceholder }) } : {}),
|
|
@@ -281,6 +294,7 @@ export async function buildPaneCatalogEntries(
|
|
|
281
294
|
for (const pane of registry.panes.values()) {
|
|
282
295
|
if (templatedPaneIds.has(pane.id)) continue;
|
|
283
296
|
const [shortcut, ...aliases] = builtInPanePrefixes(pane.id);
|
|
297
|
+
const argument = paneFunctionArgument(undefined, pane);
|
|
284
298
|
entries.push({
|
|
285
299
|
token: shortcut ?? pane.id,
|
|
286
300
|
label: pane.name,
|
|
@@ -289,8 +303,8 @@ export async function buildPaneCatalogEntries(
|
|
|
289
303
|
paneName: pane.name,
|
|
290
304
|
shortcut,
|
|
291
305
|
aliases,
|
|
292
|
-
argKind:
|
|
293
|
-
argPlaceholder:
|
|
306
|
+
argKind: argument.kind,
|
|
307
|
+
argPlaceholder: argument.placeholder,
|
|
294
308
|
...(pane.headless?.argument.examples?.length ? { argExamples: pane.headless.argument.examples } : {}),
|
|
295
309
|
keywords: [],
|
|
296
310
|
defaultSettings: {},
|
|
@@ -391,6 +405,7 @@ function scorePaneCatalogEntry(entry: PaneCatalogEntry, query: string): CatalogM
|
|
|
391
405
|
entry.token,
|
|
392
406
|
entry.shortcut,
|
|
393
407
|
...entry.aliases,
|
|
408
|
+
...entry.capability.suggestFor ?? [],
|
|
394
409
|
entry.templateId,
|
|
395
410
|
entry.paneId,
|
|
396
411
|
].filter((value): value is string => !!value).map((value) => normalizeLookupToken(value));
|
|
@@ -560,7 +575,8 @@ function readinessCell(readiness: PaneFunctionReadiness): string {
|
|
|
560
575
|
function optionDescription(option: PaneFunctionOptionDef): string {
|
|
561
576
|
const choices = optionChoices(option);
|
|
562
577
|
const parts = [option.description.replace(/\.$/, "")];
|
|
563
|
-
|
|
578
|
+
// An enum that also reads other values (a bar size of any length) lists its values as examples.
|
|
579
|
+
if (choices.join("|").length > MAX_INLINE_CHOICES) parts.push(`${option.normalize ? "Such as" : "One of"} ${choices.join(", ")}`);
|
|
564
580
|
if (option.defaultValue !== undefined && option.defaultValue !== "") parts.push(`Default ${String(option.defaultValue)}`);
|
|
565
581
|
return `${parts.join(". ")}.`;
|
|
566
582
|
}
|
|
@@ -606,14 +622,14 @@ function renderCatalogEntry(entry: PaneCatalogEntry): string {
|
|
|
606
622
|
|
|
607
623
|
lines.push("", renderSection("Examples"));
|
|
608
624
|
if (capability.reportReadiness !== "unsupported") {
|
|
609
|
-
lines.push(...wrapCommandLine(`
|
|
610
|
-
for (const example of entry.argExamples ?? []) lines.push(...wrapCommandLine(`
|
|
625
|
+
lines.push(...wrapCommandLine(`gloom fn ${invocation}`, width));
|
|
626
|
+
for (const example of entry.argExamples ?? []) lines.push(...wrapCommandLine(`gloom fn ${entry.token} ${example}`, width));
|
|
611
627
|
for (const option of capability.options) {
|
|
612
|
-
if (option.example) lines.push(...wrapCommandLine(`
|
|
628
|
+
if (option.example) lines.push(...wrapCommandLine(`gloom fn ${option.exampleWithoutArgument ? entry.token : invocation} ${option.example}`, width));
|
|
613
629
|
}
|
|
614
630
|
}
|
|
615
631
|
const shotInvocation = entry.shotArgument ? `${entry.token} ${entry.shotArgument}` : invocation;
|
|
616
|
-
lines.push(...wrapCommandLine(`
|
|
632
|
+
lines.push(...wrapCommandLine(`gloom shot ${shotInvocation} --output ${entry.token.toLowerCase()}.png`, width));
|
|
617
633
|
return lines.join("\n");
|
|
618
634
|
}
|
|
619
635
|
|
|
@@ -622,10 +638,11 @@ function renderMatchesTable(shown: readonly PaneCatalogEntry[]): string {
|
|
|
622
638
|
return renderTable(
|
|
623
639
|
[
|
|
624
640
|
{ header: "Function", shrink: false },
|
|
625
|
-
{ header: "Name"
|
|
626
|
-
{ header: "Argument"
|
|
641
|
+
{ header: "Name" },
|
|
642
|
+
{ header: "Argument" },
|
|
627
643
|
{ header: "Report" },
|
|
628
|
-
|
|
644
|
+
// A scan list: the description is cut where it does not fit, and `catalog <function>` prints it whole.
|
|
645
|
+
{ header: "Description", shrink: true, minWidth: 20 },
|
|
629
646
|
],
|
|
630
647
|
shown.map((entry) => [
|
|
631
648
|
cliStyles.command(entry.token),
|
|
@@ -659,7 +676,7 @@ function renderAlsoMatches(exact: PaneCatalogEntry, entries: readonly PaneCatalo
|
|
|
659
676
|
*/
|
|
660
677
|
export function renderFunctionHelp(entry: PaneCatalogEntry, command: string): string {
|
|
661
678
|
const width = Math.min(cliTerminalWidth() ?? CATALOG_TEXT_WIDTH, CATALOG_TEXT_WIDTH);
|
|
662
|
-
const note = `The options every function takes, and the output formats, are in
|
|
679
|
+
const note = `The options every function takes, and the output formats, are in gloom help ${command}.`;
|
|
663
680
|
return [renderCatalogEntry(entry), "", ...wrapText(note, width).map((line) => cliStyles.muted(line))].join("\n");
|
|
664
681
|
}
|
|
665
682
|
|
|
@@ -671,7 +688,7 @@ function renderCatalogGlossary(glossary: GlossaryLookup, width: number): string
|
|
|
671
688
|
const defined = glossary.exact.length > 0 ? [renderSection("Glossary"), ...renderGlossaryEntries(glossary.exact)] : [];
|
|
672
689
|
const others = glossary.partial.map((entry) => entry.term).join(", ");
|
|
673
690
|
const related = others
|
|
674
|
-
? wrapText(`${defined.length > 0 ? "Related" : "Glossary"}: ${others}.
|
|
691
|
+
? wrapText(`${defined.length > 0 ? "Related" : "Glossary"}: ${others}. gloom catalog glossary <term> explains one.`, width)
|
|
675
692
|
.map((line) => cliStyles.muted(line))
|
|
676
693
|
: [];
|
|
677
694
|
return [...defined, ...related].join("\n");
|
|
@@ -720,7 +737,7 @@ export function renderPaneCatalogReport(
|
|
|
720
737
|
if (charted) return withGap([charted, terms].filter(Boolean).join("\n\n"));
|
|
721
738
|
if (glossary.exact.length > 0 || gap || setting) return withGap(terms);
|
|
722
739
|
return withTerms(note(args.query
|
|
723
|
-
? `No functions match "${args.query}". Run
|
|
740
|
+
? `No functions match "${args.query}". Run gloom catalog to browse them all.`
|
|
724
741
|
: "No functions are available."));
|
|
725
742
|
}
|
|
726
743
|
|
|
@@ -736,7 +753,7 @@ export function renderPaneCatalogReport(
|
|
|
736
753
|
"",
|
|
737
754
|
note([
|
|
738
755
|
loose ? "No function carries every word of the query; these are the closest." : "",
|
|
739
|
-
"
|
|
756
|
+
"gloom catalog <function> shows its options and examples.",
|
|
740
757
|
hidden > 0 ? more : "",
|
|
741
758
|
].filter(Boolean).join(" ")),
|
|
742
759
|
];
|