gloomberb 0.18.3 → 0.18.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -8
- package/README.zh-CN.md +11 -11
- package/bin/{gloomberb → gloom} +3 -1
- package/package.json +6 -2
- package/src/account/checkout-handoff.tsx +225 -0
- package/src/account/device-signin-dialog.tsx +2 -2
- package/src/account/device-signin.ts +2 -2
- package/src/account/upgrade-dialog.tsx +1 -1
- package/src/api-client/askg.ts +2 -2
- package/src/api-client/auth.ts +2 -2
- package/src/api-client/central-bank-rates.ts +6 -0
- package/src/api-client/collections.ts +5 -1
- package/src/api-client/cot.ts +2 -0
- package/src/api-client/crypto-etf-flows.ts +37 -0
- package/src/api-client/crypto-markets.ts +60 -0
- package/src/api-client/data.ts +84 -5
- package/src/api-client/doe.ts +15 -0
- package/src/api-client/equity-screener.ts +28 -0
- package/src/api-client/exchange-announcements.ts +38 -0
- package/src/api-client/fund-facts.ts +39 -0
- package/src/api-client/futures-curve.ts +9 -1
- package/src/api-client/hiring.ts +301 -0
- package/src/api-client/index.ts +22 -5
- package/src/api-client/market-discovery.ts +14 -0
- package/src/api-client/members.ts +6 -0
- package/src/api-client/mna.ts +6 -0
- package/src/api-client/paths.ts +18 -1
- package/src/api-client/request.ts +21 -4
- package/src/api-client/short-side-publications.ts +37 -0
- package/src/api-client/socket.ts +64 -4
- package/src/api-client/swap-curve.ts +35 -0
- package/src/api-client/themes.ts +7 -1
- package/src/api-client/types.ts +90 -2
- package/src/app/pane-runtime/plugin-bindings.ts +9 -2
- package/src/app/runtime/desktop-deeplink.ts +5 -5
- package/src/app/runtime/plugin-bindings.ts +2 -2
- package/src/app/runtime/startup.ts +13 -0
- package/src/app/star-prompt/status-line.tsx +2 -2
- package/src/architecture/core-builtin-allowlist.json +5 -2
- package/src/architecture/ui-literals-allowlist.json +3 -3
- package/src/architecture/ui-tokens-allowlist.json +1 -1
- package/src/brokers/broker-portfolio-sync.ts +37 -0
- package/src/brokers/directory.ts +11 -0
- package/src/brokers/logos.ts +3 -1
- package/src/brokers/signed-in/adapter.ts +304 -26
- package/src/brokers/signed-in/client.ts +14 -2
- package/src/brokers/signed-in/connect.ts +10 -2
- package/src/brokers/sync-broker-instance.ts +9 -1
- package/src/capabilities/chart-series.ts +22 -6
- package/src/cli/bank-section.ts +1 -1
- package/src/cli/base-converter.ts +23 -14
- package/src/cli/central-bank-events.ts +1 -1
- package/src/cli/command-options.ts +59 -4
- package/src/cli/commands/api.ts +9 -6
- package/src/cli/commands/broker.ts +2 -2
- package/src/cli/commands/command-utils.ts +2 -2
- package/src/cli/commands/crypto-hints.ts +7 -20
- package/src/cli/commands/fred-series.ts +4 -2
- package/src/cli/commands/keybindings.ts +2 -2
- package/src/cli/commands/market.ts +1117 -264
- package/src/cli/commands/news-hints.ts +2 -2
- package/src/cli/commands/news-search.ts +59 -6
- package/src/cli/commands/options-leaps.ts +41 -26
- package/src/cli/commands/overview.ts +121 -48
- package/src/cli/commands/plugins.ts +9 -9
- package/src/cli/commands/remote.ts +13 -10
- package/src/cli/commands/search.ts +64 -44
- package/src/cli/commands/system.ts +27 -19
- package/src/cli/commands/themes.ts +1 -1
- package/src/cli/commands/ticker.ts +192 -47
- package/src/cli/context.ts +3 -2
- package/src/cli/desktop-pane-shot-view.ts +2 -2
- package/src/cli/desktop-pane-shot.ts +1 -1
- package/src/cli/earnings-calendar.ts +4 -4
- package/src/cli/entry.ts +18 -1
- package/src/cli/errors.ts +20 -2
- package/src/cli/exit-codes.ts +1 -1
- package/src/cli/export-source.ts +10 -4
- package/src/cli/freshness.ts +2 -8
- package/src/cli/fx-forward.ts +130 -0
- package/src/cli/fx-pair.ts +10 -9
- package/src/cli/glossary.ts +64 -20
- package/src/cli/help.ts +19 -13
- package/src/cli/history-export.ts +126 -0
- package/src/cli/history-rows.ts +196 -43
- package/src/cli/index-roots.ts +5 -45
- package/src/cli/index.ts +24 -18
- package/src/cli/known-gaps.ts +118 -25
- package/src/cli/listing-arg.ts +300 -41
- package/src/cli/name-entries.ts +30 -18
- package/src/cli/native-smoke.ts +2 -0
- package/src/cli/not-a-ticker.ts +19 -9
- package/src/cli/opentui-libc.ts +5 -0
- package/src/cli/options.ts +12 -0
- package/src/cli/pane-functions/capabilities.ts +75 -20
- package/src/cli/pane-functions/catalog.ts +24 -23
- package/src/cli/pane-functions/discovery.ts +1 -1
- package/src/cli/pane-functions/dom.ts +10 -7
- package/src/cli/pane-functions/financial-ratio-shot.ts +2 -2
- package/src/cli/pane-functions/freshness.ts +174 -23
- package/src/cli/pane-functions/function-help.ts +66 -27
- package/src/cli/pane-functions/headless.ts +24 -11
- package/src/cli/pane-functions/index.ts +18 -16
- package/src/cli/pane-functions/options.ts +22 -2
- package/src/cli/pane-functions/report-notices.ts +12 -4
- package/src/cli/pane-functions/report.ts +5 -5
- package/src/cli/pane-functions/resolver.ts +47 -10
- package/src/cli/pane-functions/screenshot-assessment.ts +322 -0
- package/src/cli/pane-functions/screenshot-bridge.ts +152 -0
- package/src/cli/pane-functions/screenshot-chart-evidence.ts +396 -0
- package/src/cli/pane-functions/screenshot-data-evidence.ts +383 -0
- package/src/cli/pane-functions/screenshot-evidence.ts +1 -1
- package/src/cli/pane-functions/screenshot-payload.ts +453 -0
- package/src/cli/pane-functions/screenshot-render.ts +316 -0
- package/src/cli/pane-functions/screenshot-types.ts +162 -0
- package/src/cli/pane-functions/shot-options.ts +8 -3
- package/src/cli/peso-dollar-rates.ts +79 -0
- package/src/cli/quote-answer.ts +38 -3
- package/src/cli/report-tables.ts +61 -16
- package/src/cli/restore-plugins.ts +29 -14
- package/src/cli/result.ts +111 -22
- package/src/cli/series-search.ts +5 -5
- package/src/cli/statement-filings.ts +19 -0
- package/src/cli/suffixed-listing-rows.ts +49 -0
- package/src/cli/symbol-args.ts +50 -15
- package/src/cli/symbol-cells.ts +120 -0
- package/src/cli/symbol-list.ts +198 -68
- package/src/cli/symbol-rows.ts +131 -25
- package/src/cli/ticker-resolution.ts +108 -11
- package/src/cli/treasury-yields.ts +5 -5
- package/src/cli/types.ts +2 -0
- package/src/cli/uncovered-instrument.ts +3 -3
- package/src/cli/unknown-command.ts +6 -6
- package/src/components/chart/composite/chart-layout.ts +131 -0
- package/src/components/chart/composite/composite-chart.tsx +373 -16
- package/src/components/chart/composite/interactions.ts +7 -2
- package/src/components/chart/composite/legend.tsx +75 -3
- package/src/components/chart/composite/levels.ts +5 -0
- package/src/components/chart/composite/panel-gestures.ts +41 -0
- package/src/components/chart/composite/panel-labels.ts +2 -1
- package/src/components/chart/composite/panel-surface.tsx +305 -11
- package/src/components/chart/composite/price-axis-labels.tsx +27 -3
- package/src/components/chart/composite/rasterizer.ts +44 -19
- package/src/components/chart/composite/scene.ts +16 -4
- package/src/components/chart/composite/text-renderer.ts +48 -21
- package/src/components/chart/composite/toolbar.tsx +52 -5
- package/src/components/chart/composite/types.ts +13 -0
- package/src/components/chart/composite/use-composite-chart-keyboard.ts +120 -13
- package/src/components/chart/composite/use-composite-value-scales.ts +44 -0
- package/src/components/chart/composite/use-composite-viewport.ts +12 -3
- package/src/components/chart/composite/value-scale.ts +149 -0
- package/src/components/chart/composite/volume-profile-paint.ts +6 -3
- package/src/components/chart/core/pointer.ts +2 -0
- package/src/components/chart-table/index.ts +2 -0
- package/src/components/chart-table/read.tsx +74 -0
- package/src/components/command-bar/commands/collection-list.ts +41 -19
- package/src/components/command-bar/commands/collection.ts +9 -3
- package/src/components/command-bar/commands/direct/index.ts +1 -1
- package/src/components/command-bar/commands/direct/runtime.ts +3 -2
- package/src/components/command-bar/pane-templates/items.ts +59 -6
- package/src/components/command-bar/pane-templates/workflow.ts +10 -1
- package/src/components/command-bar/routes/root/plugin-install.ts +1 -1
- package/src/components/command-bar/routes/root/provider-search.ts +42 -11
- package/src/components/command-bar/routes/root/results.ts +18 -4
- package/src/components/command-bar/routes/root/runtime.ts +15 -3
- package/src/components/command-bar/routes/root/search-providers.ts +25 -2
- package/src/components/command-bar/routes/root/selection.ts +6 -1
- package/src/components/command-bar/routes/root/shortcut-feedback.ts +4 -1
- package/src/components/command-bar/routes/root/shortcuts.ts +30 -3
- package/src/components/command-bar/routes/ticker-search/results.ts +73 -4
- package/src/components/command-bar/selection-runtime.ts +50 -10
- package/src/components/command-bar/surface/index.tsx +24 -2
- package/src/components/command-bar/view-model.ts +7 -0
- package/src/components/command-bar/workflow/broker.ts +2 -2
- package/src/components/command-bar/workflow/collection-actions.ts +46 -7
- package/src/components/command-bar/workflow/collection-ticker.ts +32 -4
- package/src/components/command-bar/workflow/fields.ts +8 -2
- package/src/components/command-bar/workflow/ops.ts +18 -4
- package/src/components/command-bar/workflow/portfolio-position.ts +53 -4
- package/src/components/command-bar/workflow/submit.ts +3 -2
- package/src/components/command-bar/workflow/tickers.ts +5 -1
- package/src/components/company-logo.tsx +39 -0
- package/src/components/data-table/sections.ts +4 -2
- package/src/components/form-modal/confirm.tsx +2 -1
- package/src/components/form-modal/request.ts +5 -0
- package/src/components/form-modal/routes.ts +4 -1
- package/src/components/index.ts +12 -6
- package/src/components/layout/header.tsx +7 -6
- package/src/components/layout/market-summary.ts +9 -6
- package/src/components/layout/pane/capture-status.ts +1 -1
- package/src/components/layout/pane/footer/model.ts +11 -5
- package/src/components/layout/shell/chrome.ts +19 -6
- package/src/components/layout/shell/index.tsx +2 -1
- package/src/components/layout/shell/pane/layers.tsx +19 -1
- package/src/components/layout/status-bar.tsx +2 -2
- package/src/components/market-board/index.tsx +11 -3
- package/src/components/onboarding/onboarding-wizard.tsx +1 -0
- package/src/components/onboarding/portfolio-step/broker-setup-panel.tsx +2 -2
- package/src/components/onboarding/wizard-broker-sync.ts +4 -1
- package/src/components/pane-settings-dialog/desktop.tsx +20 -7
- package/src/components/pane-settings-dialog/tui.tsx +17 -9
- package/src/components/pane-settings-dialog/value.ts +8 -1
- package/src/components/pane-settings-dialog.tsx +44 -13
- package/src/components/sign-in-code-panel.tsx +27 -19
- package/src/components/ui/column-grid.tsx +48 -4
- package/src/components/ui/country-flag-art.tsx +180 -0
- package/src/components/ui/country-flag.tsx +118 -12
- package/src/components/ui/data-table/opentui/index.tsx +61 -2
- package/src/components/ui/data-table/opentui/model.ts +109 -2
- package/src/components/ui/data-table/types.ts +1 -1
- package/src/components/ui/display.tsx +5 -1
- package/src/components/ui/index.ts +3 -1
- package/src/components/ui/logo-mark.tsx +11 -2
- package/src/components/ui/query-bar.tsx +1 -1
- package/src/components/ui/row-notes.ts +79 -0
- package/src/core/state/app/layout.ts +4 -4
- package/src/data/cached-query.ts +8 -1
- package/src/data/config/chart-settings.ts +3 -3
- package/src/data/config/home.ts +10 -2
- package/src/data/config/layout.ts +4 -1
- package/src/data/config/store/node.ts +4 -0
- package/src/data/config/store/normalize.ts +13 -3
- package/src/data/config/store/portfolio-as-of-column.ts +2 -2
- package/src/data/json-storage.ts +2 -0
- package/src/data/saved-copies.ts +84 -0
- package/src/docs/snapshot.json +65 -32
- package/src/i18n/es.ts +29 -12
- package/src/i18n/ja.ts +29 -12
- package/src/i18n/ko.ts +29 -12
- package/src/i18n/zh-cn.ts +29 -12
- package/src/i18n/zh-tw.ts +29 -12
- package/src/layout/desks.ts +1 -1
- package/src/layout/launch-layout.ts +1 -1
- package/src/layout/pane-manager/floating-actions.ts +5 -3
- package/src/layout/pane-manager/floating.ts +43 -1
- package/src/layout/pane-manager/index.ts +2 -0
- package/src/layout/selected-ticker.ts +74 -0
- package/src/market-data/depositary-pair.ts +251 -0
- package/src/market-data/futures-board.ts +1 -1
- package/src/market-data/futures-contract.ts +124 -40
- package/src/market-data/fx-closes.ts +17 -2
- package/src/market-data/hooks.tsx +19 -11
- package/src/market-data/market/change-basis.ts +49 -7
- package/src/market-data/market/freshness.ts +34 -5
- package/src/market-data/market/period-return.ts +163 -0
- package/src/market-data/market/trading-sessions.ts +13 -0
- package/src/market-data/market/year-to-date.ts +8 -13
- package/src/market-data/performance.ts +20 -14
- package/src/market-data/perpetual-premium.ts +32 -0
- package/src/market-data/published-apac-sessions.ts +2 -1
- package/src/market-data/published-futures-sessions.ts +69 -0
- package/src/market-data/quotes/contributions.ts +5 -1
- package/src/market-data/quotes/freshness.ts +42 -0
- package/src/market-data/quotes/intraday-bar.ts +37 -0
- package/src/market-data/quotes/regular-session-valuation.ts +13 -8
- package/src/market-data/quotes/resolution.ts +4 -2
- package/src/market-data/tax-equivalent.ts +1 -1
- package/src/market-data/ticker-price-returns.ts +3 -1
- package/src/news/aggregator.ts +5 -1
- package/src/news/news-model.ts +4 -0
- package/src/news/types.ts +11 -0
- package/src/notifications/app-notifier.ts +1 -1
- package/src/plugins/auto-update.ts +2 -2
- package/src/plugins/builtin/account-management/index.tsx +1 -0
- package/src/plugins/builtin/account-management/pane.tsx +9 -8
- package/src/plugins/builtin/alerts/alert-engine.ts +29 -19
- package/src/plugins/builtin/alerts/calendar-events.ts +378 -0
- package/src/plugins/builtin/alerts/cli.ts +485 -76
- package/src/plugins/builtin/alerts/command.ts +5 -10
- package/src/plugins/builtin/alerts/event-rows.ts +9 -5
- package/src/plugins/builtin/alerts/events-pane.tsx +71 -56
- package/src/plugins/builtin/alerts/events.ts +107 -5
- package/src/plugins/builtin/alerts/fired-log.ts +78 -0
- package/src/plugins/builtin/alerts/format.ts +2 -1
- package/src/plugins/builtin/alerts/headless.ts +100 -39
- package/src/plugins/builtin/alerts/history-pane.tsx +105 -62
- package/src/plugins/builtin/alerts/history-rows.ts +89 -0
- package/src/plugins/builtin/alerts/index.tsx +45 -18
- package/src/plugins/builtin/alerts/iv-level.ts +365 -0
- package/src/plugins/builtin/alerts/levels.ts +3 -3
- package/src/plugins/builtin/alerts/pane.tsx +97 -29
- package/src/plugins/builtin/alerts/price.ts +35 -0
- package/src/plugins/builtin/alerts/quotes.ts +24 -0
- package/src/plugins/builtin/alerts/research-builder.ts +84 -11
- package/src/plugins/builtin/alerts/research-rules.ts +76 -3
- package/src/plugins/builtin/alerts/scheduled-check.ts +206 -32
- package/src/plugins/builtin/alerts/scheduled-sources.ts +26 -3
- package/src/plugins/builtin/alerts/scheduled.ts +188 -29
- package/src/plugins/builtin/alerts/storage.ts +13 -10
- package/src/plugins/builtin/alerts/targets.ts +12 -3
- package/src/plugins/builtin/analytics/index.tsx +8 -2
- package/src/plugins/builtin/analytics/metrics.ts +1 -1
- package/src/plugins/builtin/analytics/risk-book.ts +215 -0
- package/src/plugins/builtin/analytics/risk-client.ts +13 -6
- package/src/plugins/builtin/analytics/risk-headless.ts +55 -21
- package/src/plugins/builtin/analytics/risk-math.ts +6 -3
- package/src/plugins/builtin/analytics/risk-model.ts +297 -104
- package/src/plugins/builtin/analytics/risk-options.ts +17 -2
- package/src/plugins/builtin/analytics/risk-pane.tsx +97 -36
- package/src/plugins/builtin/attention/pane.tsx +6 -2
- package/src/plugins/builtin/awards/headless.ts +7 -3
- package/src/plugins/builtin/awards/model.ts +18 -0
- package/src/plugins/builtin/awards/pane.tsx +6 -3
- package/src/plugins/builtin/backtest/headless.ts +3 -3
- package/src/plugins/builtin/backtest/rules.ts +41 -5
- package/src/plugins/builtin/broker-manager/add-flow.tsx +12 -7
- package/src/plugins/builtin/broker-manager/detail.tsx +47 -19
- package/src/plugins/builtin/broker-manager/footer.ts +27 -11
- package/src/plugins/builtin/broker-manager/index.tsx +21 -12
- package/src/plugins/builtin/broker-manager/keyboard.ts +1 -1
- package/src/plugins/builtin/broker-manager/model.ts +12 -2
- package/src/plugins/builtin/broker-manager/pane-actions.tsx +183 -57
- package/src/plugins/builtin/broker-manager/table.ts +28 -12
- package/src/plugins/builtin/broker-trading/account-picker.tsx +2 -1
- package/src/plugins/builtin/broker-trading/chart-levels.ts +82 -13
- package/src/plugins/builtin/broker-trading/controller.ts +45 -13
- package/src/plugins/builtin/broker-trading/dock.tsx +22 -4
- package/src/plugins/builtin/broker-trading/headless.ts +2 -1
- package/src/plugins/builtin/broker-trading/index.tsx +7 -1
- package/src/plugins/builtin/broker-trading/linked-orders.ts +148 -0
- package/src/plugins/builtin/broker-trading/order-feed.ts +75 -7
- package/src/plugins/builtin/broker-trading/orders.tsx +109 -31
- package/src/plugins/builtin/broker-trading/overview-orders.tsx +9 -3
- package/src/plugins/builtin/broker-trading/pane-model.ts +30 -2
- package/src/plugins/builtin/broker-trading/pane.tsx +110 -23
- package/src/plugins/builtin/broker-trading/ticket-parts.tsx +36 -7
- package/src/plugins/builtin/broker-trading/ticket.tsx +112 -31
- package/src/plugins/builtin/buildout/cells.tsx +4 -0
- package/src/plugins/builtin/buildout/detail/index.tsx +5 -1
- package/src/plugins/builtin/buildout/detail/ui.tsx +7 -4
- package/src/plugins/builtin/buildout/pane/index.tsx +25 -12
- package/src/plugins/builtin/buildout/pane/status.tsx +0 -4
- package/src/plugins/builtin/builtin-plugin-meta.ts +1 -1
- package/src/plugins/builtin/catalysts/detail.tsx +3 -2
- package/src/plugins/builtin/catalysts/index.tsx +1 -1
- package/src/plugins/builtin/catalysts/model.ts +49 -4
- package/src/plugins/builtin/catalysts/pane.tsx +6 -8
- package/src/plugins/builtin/central-bank-rates/client.ts +5 -0
- package/src/plugins/builtin/central-bank-rates/headless.ts +36 -10
- package/src/plugins/builtin/central-bank-rates/model.ts +33 -8
- package/src/plugins/builtin/changelog/index.tsx +1 -0
- package/src/plugins/builtin/chart-composer/catalog-inventory.ts +1 -0
- package/src/plugins/builtin/chart-composer/chart-spec-edit.ts +2 -1
- package/src/plugins/builtin/chart-composer/chart-spec.ts +7 -0
- package/src/plugins/builtin/chart-composer/cli-options.ts +2 -5
- package/src/plugins/builtin/chart-composer/data-catalog-pane.tsx +2 -1
- package/src/plugins/builtin/chart-composer/editor/controller.ts +2 -0
- package/src/plugins/builtin/chart-composer/editor.tsx +4 -1
- package/src/plugins/builtin/chart-composer/headless-schema.ts +28 -26
- package/src/plugins/builtin/chart-composer/headless.ts +253 -35
- package/src/plugins/builtin/chart-composer/index.tsx +12 -2
- package/src/plugins/builtin/chart-composer/leverage-overlay.ts +142 -0
- package/src/plugins/builtin/chart-composer/pane.tsx +127 -28
- package/src/plugins/builtin/chart-composer/series-catalog.ts +1 -0
- package/src/plugins/builtin/chart-composer/series-expression.ts +65 -6
- package/src/plugins/builtin/chart-composer/session-history.ts +15 -21
- package/src/plugins/builtin/chart-composer/session-range.ts +4 -2
- package/src/plugins/builtin/chart-composer/settings.ts +31 -19
- package/src/plugins/builtin/chart-composer/use-series-catalog.ts +5 -6
- package/src/plugins/builtin/chart-composer/viewport-labels.ts +18 -8
- package/src/plugins/builtin/chat/attachments/model.ts +3 -1
- package/src/plugins/builtin/chat/content/index.tsx +1 -1
- package/src/plugins/builtin/chat/pane-links/open.ts +1 -1
- package/src/plugins/builtin/chat/people.ts +1 -1
- package/src/plugins/builtin/clinical-trials/client.ts +5 -2
- package/src/plugins/builtin/clinical-trials/model.ts +13 -4
- package/src/plugins/builtin/clinical-trials/pane.tsx +32 -12
- package/src/plugins/builtin/clinical-trials/ticker-sponsor.ts +17 -0
- package/src/plugins/builtin/cloud/askg/controller.ts +1 -1
- package/src/plugins/builtin/cloud/askg/lock-note.ts +1 -1
- package/src/plugins/builtin/cloud/askg/tool-display.ts +1 -1
- package/src/plugins/builtin/cloud/auth-commands.ts +3 -3
- package/src/plugins/builtin/cloud/team/pane-sections.tsx +105 -47
- package/src/plugins/builtin/cloud/team/pane-ui.tsx +42 -4
- package/src/plugins/builtin/cloud/team/pane.tsx +204 -64
- package/src/plugins/builtin/cloud/thesis/store.ts +45 -22
- package/src/plugins/builtin/cloud-tweets/registration.ts +1 -0
- package/src/plugins/builtin/commodities-energy/index.tsx +29 -2
- package/src/plugins/builtin/commodities-energy/view-state.ts +2 -0
- package/src/plugins/builtin/commodity-balances/pane.tsx +11 -4
- package/src/plugins/builtin/company-attention/app-rank.tsx +7 -5
- package/src/plugins/builtin/company-attention/building-model.ts +222 -0
- package/src/plugins/builtin/company-attention/building.tsx +172 -0
- package/src/plugins/builtin/company-attention/client.ts +117 -1
- package/src/plugins/builtin/company-attention/evidence.ts +16 -3
- package/src/plugins/builtin/company-attention/headless.ts +101 -5
- package/src/plugins/builtin/company-attention/index.tsx +6 -3
- package/src/plugins/builtin/company-attention/model.ts +33 -7
- package/src/plugins/builtin/company-attention/moves-model.ts +253 -0
- package/src/plugins/builtin/company-attention/moves.tsx +159 -0
- package/src/plugins/builtin/company-attention/pane.tsx +79 -23
- package/src/plugins/builtin/company-attention/signals-model.ts +229 -0
- package/src/plugins/builtin/company-attention/signals.tsx +160 -0
- package/src/plugins/builtin/company-kpis/headless.ts +3 -2
- package/src/plugins/builtin/company-kpis/model.ts +2 -2
- package/src/plugins/builtin/company-kpis/pane.tsx +1 -1
- package/src/plugins/builtin/composite-plugins.ts +2 -1
- package/src/plugins/builtin/congress-trades/headless.ts +1 -1
- package/src/plugins/builtin/connections/index.ts +1 -0
- package/src/plugins/builtin/correlation/headless-schema.ts +3 -2
- package/src/plugins/builtin/correlation/headless.ts +5 -3
- package/src/plugins/builtin/cot/headless.ts +28 -6
- package/src/plugins/builtin/cot/model.ts +12 -0
- package/src/plugins/builtin/cot/pane.tsx +3 -2
- package/src/plugins/builtin/cpi/headless.ts +5 -1
- package/src/plugins/builtin/cpi/pane.tsx +11 -9
- package/src/plugins/builtin/credit-boards/model.ts +2 -0
- package/src/plugins/builtin/credit-documents/headless.ts +1 -1
- package/src/plugins/builtin/crypto-board/client.ts +86 -0
- package/src/plugins/builtin/crypto-board/defi-view.tsx +218 -0
- package/src/plugins/builtin/crypto-board/defi.ts +239 -0
- package/src/plugins/builtin/crypto-board/headless.ts +117 -6
- package/src/plugins/builtin/crypto-board/index.tsx +8 -3
- package/src/plugins/builtin/crypto-board/model.ts +40 -8
- package/src/plugins/builtin/crypto-board/pane.tsx +55 -21
- package/src/plugins/builtin/crypto-board/series.ts +19 -1
- package/src/plugins/builtin/crypto-etf-flows/client.ts +60 -0
- package/src/plugins/builtin/crypto-etf-flows/headless.ts +132 -0
- package/src/plugins/builtin/crypto-etf-flows/index.tsx +44 -0
- package/src/plugins/builtin/crypto-etf-flows/model.ts +121 -0
- package/src/plugins/builtin/crypto-etf-flows/pane.tsx +193 -0
- package/src/plugins/builtin/debug/index.tsx +1 -0
- package/src/plugins/builtin/dividend-yield/index.tsx +1 -1
- package/src/plugins/builtin/docs/index.tsx +1 -1
- package/src/plugins/builtin/docs/pane.tsx +2 -2
- package/src/plugins/builtin/docs/targets.ts +1 -1
- package/src/plugins/builtin/doe/client.ts +5 -1
- package/src/plugins/builtin/doe/headless.ts +12 -6
- package/src/plugins/builtin/doe/model.ts +43 -6
- package/src/plugins/builtin/doe/pane.tsx +18 -11
- package/src/plugins/builtin/earnings/board-model.ts +13 -6
- package/src/plugins/builtin/earnings/board-table.ts +4 -1
- package/src/plugins/builtin/earnings/board.tsx +253 -50
- package/src/plugins/builtin/earnings/calendar-model.ts +188 -0
- package/src/plugins/builtin/earnings/calendar.tsx +338 -0
- package/src/plugins/builtin/earnings/client.ts +4 -3
- package/src/plugins/builtin/earnings/headless.ts +53 -15
- package/src/plugins/builtin/earnings/history-model.ts +53 -36
- package/src/plugins/builtin/earnings/index.tsx +15 -22
- package/src/plugins/builtin/earnings/model.ts +17 -12
- package/src/plugins/builtin/earnings/scope.ts +89 -0
- package/src/plugins/builtin/earnings-calls/calendar.tsx +310 -0
- package/src/plugins/builtin/earnings-calls/data.ts +146 -2
- package/src/plugins/builtin/earnings-calls/headless.ts +151 -9
- package/src/plugins/builtin/earnings-calls/index.tsx +3 -3
- package/src/plugins/builtin/earnings-calls/lock-note.ts +1 -1
- package/src/plugins/builtin/earnings-calls/pane.tsx +149 -31
- package/src/plugins/builtin/earnings-calls/upcoming.ts +195 -0
- package/src/plugins/builtin/earnings-ripple/pane.tsx +10 -5
- package/src/plugins/builtin/econ/calendar-model.ts +132 -20
- package/src/plugins/builtin/econ/detail-view.tsx +48 -10
- package/src/plugins/builtin/econ/fred-catalog.ts +23 -6
- package/src/plugins/builtin/econ/fred-series-map.ts +4 -0
- package/src/plugins/builtin/econ/index.tsx +112 -25
- package/src/plugins/builtin/econ/print-watch.ts +2 -1
- package/src/plugins/builtin/econ/types.ts +32 -1
- package/src/plugins/builtin/econ-statistics/client.ts +16 -3
- package/src/plugins/builtin/econ-statistics/defs.ts +4 -0
- package/src/plugins/builtin/econ-statistics/detail.tsx +2 -2
- package/src/plugins/builtin/econ-statistics/headless.ts +13 -2
- package/src/plugins/builtin/econ-statistics/index.tsx +3 -3
- package/src/plugins/builtin/econ-statistics/pane.tsx +2 -1
- package/src/plugins/builtin/econ-statistics/stats.ts +103 -0
- package/src/plugins/builtin/econ-statistics/view.ts +16 -1
- package/src/plugins/builtin/equity-screener/client.ts +21 -3
- package/src/plugins/builtin/equity-screener/headless.ts +68 -6
- package/src/plugins/builtin/equity-screener/live.ts +1 -1
- package/src/plugins/builtin/equity-screener/model.ts +6 -0
- package/src/plugins/builtin/equity-screener/pane.tsx +45 -10
- package/src/plugins/builtin/equity-screener/screen-check.ts +90 -0
- package/src/plugins/builtin/equity-screener/ticker-check.tsx +148 -0
- package/src/plugins/builtin/estimate-revisions/headless.ts +3 -1
- package/src/plugins/builtin/estimate-revisions/lock-note.ts +3 -3
- package/src/plugins/builtin/estimate-revisions/model.ts +8 -10
- package/src/plugins/builtin/exposure/headless.ts +51 -6
- package/src/plugins/builtin/exposure/index.tsx +28 -2
- package/src/plugins/builtin/exposure/model.ts +7 -0
- package/src/plugins/builtin/exposure/pane.tsx +6 -1
- package/src/plugins/builtin/fear-greed/index.tsx +1 -1
- package/src/plugins/builtin/filing-events/index.tsx +1 -1
- package/src/plugins/builtin/futures/model.ts +10 -9
- package/src/plugins/builtin/futures/returns.ts +8 -36
- package/src/plugins/builtin/futures/table.tsx +1 -1
- package/src/plugins/builtin/futures-curve/client.ts +40 -9
- package/src/plugins/builtin/futures-curve/headless.ts +39 -17
- package/src/plugins/builtin/futures-curve/model.ts +258 -69
- package/src/plugins/builtin/futures-curve/pane.tsx +46 -17
- package/src/plugins/builtin/fx-matrix/client.ts +15 -8
- package/src/plugins/builtin/fx-matrix/headless.ts +32 -14
- package/src/plugins/builtin/fx-matrix/index.tsx +13 -11
- package/src/plugins/builtin/fx-matrix/live-legs.ts +22 -0
- package/src/plugins/builtin/fx-matrix/settings.ts +2 -1
- package/src/plugins/builtin/gpu/headless.ts +9 -4
- package/src/plugins/builtin/help/index.tsx +13 -3
- package/src/plugins/builtin/holders/beneficial-model.ts +8 -11
- package/src/plugins/builtin/holders/beneficial-report.ts +6 -5
- package/src/plugins/builtin/holders/beneficial-view.tsx +7 -3
- package/src/plugins/builtin/holders/client.ts +13 -1
- package/src/plugins/builtin/holders/format.ts +28 -17
- package/src/plugins/builtin/holders/headless.ts +46 -7
- package/src/plugins/builtin/holders/index-holders.ts +264 -0
- package/src/plugins/builtin/holders/pane.tsx +79 -15
- package/src/plugins/builtin/holders/report-rows.ts +35 -7
- package/src/plugins/builtin/holders/table-model.ts +2 -1
- package/src/plugins/builtin/holders/treemap.tsx +2 -2
- package/src/plugins/builtin/insider/headless.ts +1 -1
- package/src/plugins/builtin/insider/signals-client.ts +1 -1
- package/src/plugins/builtin/insider/signals.tsx +1 -1
- package/src/plugins/builtin/ipo-calendar/pane.tsx +7 -4
- package/src/plugins/builtin/iv-history/client.ts +20 -0
- package/src/plugins/builtin/iv-history/headless.ts +4 -4
- package/src/plugins/builtin/iv-history/index.tsx +1 -1
- package/src/plugins/builtin/iv-history/model.ts +13 -4
- package/src/plugins/builtin/iv-history/series.ts +3 -1
- package/src/plugins/builtin/jobs/lock-note.ts +1 -1
- package/src/plugins/builtin/jobs/model.ts +4 -15
- package/src/plugins/builtin/jobs/pane.tsx +7 -5
- package/src/plugins/builtin/jobs/share-bars.tsx +11 -5
- package/src/plugins/builtin/jodi/pane.tsx +10 -4
- package/src/plugins/builtin/layout-manager/index.tsx +1 -0
- package/src/plugins/builtin/macro-day/headless.ts +20 -7
- package/src/plugins/builtin/macro-day/index.tsx +3 -2
- package/src/plugins/builtin/macro-day/model.ts +29 -8
- package/src/plugins/builtin/macro-day/pane.tsx +46 -10
- package/src/plugins/builtin/macro-day/releases.ts +55 -13
- package/src/plugins/builtin/market-heatmap/data.ts +9 -2
- package/src/plugins/builtin/market-heatmap/evidence.ts +1 -1
- package/src/plugins/builtin/market-heatmap/headless.ts +9 -6
- package/src/plugins/builtin/market-heatmap/index.tsx +3 -3
- package/src/plugins/builtin/market-heatmap/model.ts +10 -7
- package/src/plugins/builtin/market-movers/client.ts +33 -19
- package/src/plugins/builtin/market-movers/headless.ts +8 -2
- package/src/plugins/builtin/market-movers/index.tsx +16 -10
- package/src/plugins/builtin/market-movers/screener.ts +29 -8
- package/src/plugins/builtin/market-movers/session-body.tsx +4 -2
- package/src/plugins/builtin/market-movers/session-table.ts +4 -2
- package/src/plugins/builtin/market-movers/table.ts +4 -1
- package/src/plugins/builtin/market-valuation/headless.ts +2 -0
- package/src/plugins/builtin/market-valuation/view.ts +5 -0
- package/src/plugins/builtin/members/headless.ts +6 -5
- package/src/plugins/builtin/members/pane.tsx +11 -4
- package/src/plugins/builtin/mna/client.ts +1 -0
- package/src/plugins/builtin/mna/detail.tsx +20 -32
- package/src/plugins/builtin/mna/distress/detail.tsx +16 -4
- package/src/plugins/builtin/mna/distress/model.ts +3 -2
- package/src/plugins/builtin/mna/distress/pane.tsx +7 -4
- package/src/plugins/builtin/mna/headless.ts +6 -13
- package/src/plugins/builtin/mna/model.ts +93 -15
- package/src/plugins/builtin/mna/pane.tsx +5 -4
- package/src/plugins/builtin/news/headless.ts +12 -6
- package/src/plugins/builtin/news/index.tsx +10 -1
- package/src/plugins/builtin/news/wire/index.tsx +3 -2
- package/src/plugins/builtin/news/wire/news/command-bar-search.ts +26 -10
- package/src/plugins/builtin/news/wire/news/query-presets.ts +6 -2
- package/src/plugins/builtin/news/wire/rss/cli.ts +3 -3
- package/src/plugins/builtin/notes/cli.ts +49 -14
- package/src/plugins/builtin/openfda/pane.tsx +1 -1
- package/src/plugins/builtin/options/carry.ts +2 -2
- package/src/plugins/builtin/options/index.tsx +1 -1
- package/src/plugins/builtin/options/view.tsx +10 -10
- package/src/plugins/builtin/options-calculator/headless.ts +46 -7
- package/src/plugins/builtin/options-scenario/client.ts +123 -28
- package/src/plugins/builtin/options-scenario/collar.ts +8 -6
- package/src/plugins/builtin/options-scenario/csp-screen-headless.ts +127 -0
- package/src/plugins/builtin/options-scenario/csp-screen-pane.tsx +165 -0
- package/src/plugins/builtin/options-scenario/csp-screen.ts +258 -0
- package/src/plugins/builtin/options-scenario/csp.ts +101 -21
- package/src/plugins/builtin/options-scenario/headless.ts +36 -15
- package/src/plugins/builtin/options-scenario/hedge.ts +20 -14
- package/src/plugins/builtin/options-scenario/index.tsx +28 -3
- package/src/plugins/builtin/options-scenario/model.ts +13 -0
- package/src/plugins/builtin/options-scenario/pane.tsx +9 -5
- package/src/plugins/builtin/perps/equity-row.tsx +11 -3
- package/src/plugins/builtin/perps/freshness.ts +8 -5
- package/src/plugins/builtin/perps/headless.ts +3 -1
- package/src/plugins/builtin/perps/list-perpetuals.ts +25 -4
- package/src/plugins/builtin/perps/live-rows.ts +161 -0
- package/src/plugins/builtin/perps/markets-section.tsx +154 -0
- package/src/plugins/builtin/perps/pane.tsx +36 -17
- package/src/plugins/builtin/perps/venue-markets.ts +96 -0
- package/src/plugins/builtin/plugin-marketplace/index.tsx +2 -1
- package/src/plugins/builtin/plugin-marketplace/pane.tsx +143 -59
- package/src/plugins/builtin/portfolio-list/cli/bulk-symbols.ts +72 -24
- package/src/plugins/builtin/portfolio-list/cli/portfolio-command.ts +158 -141
- package/src/plugins/builtin/portfolio-list/cli/render.ts +49 -20
- package/src/plugins/builtin/portfolio-list/cli/shared.ts +3 -3
- package/src/plugins/builtin/portfolio-list/cli/watchlist-command.ts +29 -24
- package/src/plugins/builtin/portfolio-list/headless.ts +6 -3
- package/src/plugins/builtin/portfolio-list/income.ts +13 -2
- package/src/plugins/builtin/portfolio-list/index.tsx +9 -2
- package/src/plugins/builtin/portfolio-list/pane/index.tsx +21 -8
- package/src/plugins/builtin/portfolio-list/pane/purchase-date-fx.ts +46 -0
- package/src/plugins/builtin/portfolio-list/summary/live-accounts.ts +16 -9
- package/src/plugins/builtin/portfolio-list/summary/totals.ts +2 -15
- package/src/plugins/builtin/power/client.ts +4 -1
- package/src/plugins/builtin/power/evidence.ts +22 -7
- package/src/plugins/builtin/power/gas.tsx +5 -1
- package/src/plugins/builtin/power/pane.tsx +8 -1
- package/src/plugins/builtin/power/prices.tsx +10 -3
- package/src/plugins/builtin/research/analyst-headless.ts +25 -8
- package/src/plugins/builtin/research/analyst-model.ts +68 -3
- package/src/plugins/builtin/research/corporate-actions-pane.tsx +63 -14
- package/src/plugins/builtin/research/event-model.ts +3 -1
- package/src/plugins/builtin/research/event-sources.ts +12 -4
- package/src/plugins/builtin/research/index.tsx +2 -1
- package/src/plugins/builtin/research/relative-valuation-basis.ts +58 -0
- package/src/plugins/builtin/research/relative-valuation-columns.ts +31 -2
- package/src/plugins/builtin/research/relative-valuation-currency.ts +12 -5
- package/src/plugins/builtin/research/relative-valuation-headless.ts +84 -26
- package/src/plugins/builtin/research/relative-valuation-model.ts +88 -19
- package/src/plugins/builtin/research/relative-valuation-pane.tsx +76 -9
- package/src/plugins/builtin/research/relative-valuation-peers.ts +1 -1
- package/src/plugins/builtin/reverse-dcf/model.ts +6 -2
- package/src/plugins/builtin/risk-factors/index.tsx +2 -2
- package/src/plugins/builtin/scanner/lock-note.ts +1 -1
- package/src/plugins/builtin/sec/forms.ts +13 -0
- package/src/plugins/builtin/sec/fund-abroad.ts +32 -0
- package/src/plugins/builtin/sec/fund-facts.ts +68 -8
- package/src/plugins/builtin/sec/headless.ts +85 -8
- package/src/plugins/builtin/sec/index.tsx +58 -12
- package/src/plugins/builtin/sectors/client.ts +2 -1
- package/src/plugins/builtin/sectors/sector-model.ts +11 -15
- package/src/plugins/builtin/series-inventory.ts +2 -0
- package/src/plugins/builtin/shared/broker-reconnect.ts +107 -22
- package/src/plugins/builtin/shared/cloud-upgrade.ts +34 -6
- package/src/plugins/builtin/shared/earnings-calendar.ts +375 -0
- package/src/plugins/builtin/{earnings/estimate-basis.ts → shared/earnings-estimate-basis.ts} +1 -1
- package/src/plugins/builtin/shared/earnings-report.ts +3 -3
- package/src/plugins/builtin/shared/fx-rate-freshness.ts +23 -1
- package/src/plugins/builtin/shared/job-posting.ts +129 -0
- package/src/plugins/builtin/shared/pro-lock-note.ts +3 -3
- package/src/plugins/builtin/shared/report-freshness.ts +3 -0
- package/src/plugins/builtin/shared/research-trading.tsx +21 -0
- package/src/plugins/builtin/shared/series-cache.ts +2 -0
- package/src/plugins/builtin/shared/ticker-surface.ts +2 -1
- package/src/plugins/builtin/short-interest/client.ts +2 -0
- package/src/plugins/builtin/short-interest/headless.ts +41 -12
- package/src/plugins/builtin/short-interest/index.tsx +23 -1
- package/src/plugins/builtin/short-interest/model.ts +70 -19
- package/src/plugins/builtin/short-interest/pane.tsx +19 -2
- package/src/plugins/builtin/short-interest/publications-client.ts +82 -0
- package/src/plugins/builtin/short-interest/publications-headless.ts +29 -0
- package/src/plugins/builtin/short-interest/publications-model.ts +50 -0
- package/src/plugins/builtin/short-interest/publications-pane.tsx +66 -0
- package/src/plugins/builtin/short-interest/schedule.ts +35 -2
- package/src/plugins/builtin/short-interest/surface.tsx +11 -4
- package/src/plugins/builtin/short-interest/types.ts +9 -0
- package/src/plugins/builtin/short-interest/watch-client.ts +14 -8
- package/src/plugins/builtin/short-interest/watch-model.ts +12 -25
- package/src/plugins/builtin/short-interest/watch-pane.tsx +5 -1
- package/src/plugins/builtin/supply-chain/flow.tsx +33 -9
- package/src/plugins/builtin/supply-chain/model.ts +51 -3
- package/src/plugins/builtin/supply-chain/pane.tsx +78 -39
- package/src/plugins/builtin/supply-chain/row-evidence.tsx +1 -1
- package/src/plugins/builtin/themes/headless.ts +8 -5
- package/src/plugins/builtin/themes/model.ts +14 -4
- package/src/plugins/builtin/themes/pane.tsx +24 -5
- package/src/plugins/builtin/thirteenf/headless.ts +5 -5
- package/src/plugins/builtin/thirteenf/signals.ts +3 -1
- package/src/plugins/builtin/ticker-detail/adr-pair/headless.ts +123 -0
- package/src/plugins/builtin/ticker-detail/adr-pair/model.ts +132 -0
- package/src/plugins/builtin/ticker-detail/adr-pair/tab.tsx +87 -0
- package/src/plugins/builtin/ticker-detail/data-panes/historical-prices.tsx +40 -26
- package/src/plugins/builtin/ticker-detail/data-panes/history-bars.ts +8 -4
- package/src/plugins/builtin/ticker-detail/data-panes/returns-history.ts +67 -3
- package/src/plugins/builtin/ticker-detail/data-panes/returns-model.ts +112 -5
- package/src/plugins/builtin/ticker-detail/data-panes/returns-pane.tsx +17 -2
- package/src/plugins/builtin/ticker-detail/financials/aggregation.ts +21 -7
- package/src/plugins/builtin/ticker-detail/financials/model.ts +36 -1
- package/src/plugins/builtin/ticker-detail/financials/offerings.ts +56 -0
- package/src/plugins/builtin/ticker-detail/financials/ratios.ts +62 -13
- package/src/plugins/builtin/ticker-detail/financials/tab.tsx +30 -4
- package/src/plugins/builtin/ticker-detail/headless-schema.ts +14 -2
- package/src/plugins/builtin/ticker-detail/headless.ts +148 -35
- package/src/plugins/builtin/ticker-detail/index.tsx +37 -5
- package/src/plugins/builtin/ticker-detail/overview/model.ts +65 -10
- package/src/plugins/builtin/ticker-detail/overview/pane.tsx +9 -1
- package/src/plugins/builtin/ticker-detail/overview-tab.tsx +68 -11
- package/src/plugins/builtin/ticker-detail/pane.tsx +11 -0
- package/src/plugins/builtin/ticker-detail/quote-footer.ts +8 -3
- package/src/plugins/builtin/ticker-detail/research-tabs.ts +11 -0
- package/src/plugins/builtin/vol-surface/client.ts +5 -4
- package/src/plugins/builtin/vol-surface/headless.ts +12 -3
- package/src/plugins/builtin/vol-surface/model.ts +4 -2
- package/src/plugins/builtin/volatility/model.ts +5 -10
- package/src/plugins/builtin/world-venue-map/basemap-layer.tsx +4 -3
- package/src/plugins/builtin/world-venue-map/basemap.ts +3 -1
- package/src/plugins/builtin/world-venue-map/chokepoint-chart.ts +40 -0
- package/src/plugins/builtin/world-venue-map/evidence.ts +1 -1
- package/src/plugins/builtin/world-venue-map/geo-series.ts +90 -11
- package/src/plugins/builtin/world-venue-map/headless.ts +1 -1
- package/src/plugins/builtin/world-venue-map/index.ts +3 -26
- package/src/plugins/builtin/world-venue-map/layers.ts +1 -1
- package/src/plugins/builtin/world-venue-map/map.tsx +2 -1
- package/src/plugins/builtin/world-venue-map/pane.tsx +4 -2
- package/src/plugins/builtin/world-venue-map/venue-header.tsx +15 -4
- package/src/plugins/builtin/yield-curve/client.ts +25 -0
- package/src/plugins/builtin/yield-curve/curves.ts +7 -4
- package/src/plugins/builtin/yield-curve/headless.ts +38 -4
- package/src/plugins/builtin/yield-curve/history.ts +4 -3
- package/src/plugins/builtin/yield-curve/index.tsx +12 -6
- package/src/plugins/builtin/yield-curve/swaps-model.ts +93 -0
- package/src/plugins/builtin/yield-curve/swaps.tsx +99 -0
- package/src/plugins/bundle.ts +1 -1
- package/src/plugins/catalog-browser.ts +2 -1
- package/src/plugins/compat.ts +3 -3
- package/src/plugins/dependencies.ts +75 -14
- package/src/plugins/extracted-plugins.ts +132 -34
- package/src/plugins/host-link.ts +149 -34
- package/src/plugins/installer.ts +35 -10
- package/src/plugins/loader.ts +206 -38
- package/src/plugins/manager-node.ts +2 -2
- package/src/plugins/marketplace/deactivation.ts +22 -0
- package/src/plugins/marketplace/model.ts +2 -2
- package/src/plugins/marketplace/packs.ts +1 -1
- package/src/plugins/ownership.ts +1 -1
- package/src/plugins/peer-retry.ts +155 -0
- package/src/plugins/registry/contributions.ts +3 -1
- package/src/plugins/registry/index.ts +4 -3
- package/src/plugins/registry/plugin-state.ts +3 -0
- package/src/plugins/seed-notice.ts +20 -0
- package/src/plugins/shortcut-argument.ts +39 -0
- package/src/portfolio/allocation.ts +1 -1
- package/src/portfolio/collection-name.ts +31 -0
- package/src/portfolio/column-values.ts +10 -8
- package/src/portfolio/cost-fx.ts +296 -19
- package/src/portfolio/manual-lots.ts +75 -0
- package/src/portfolio/mutations.ts +60 -22
- package/src/portfolio/suffixed-listings.ts +209 -0
- package/src/portfolio/totals-currency.ts +24 -0
- package/src/public/__snapshots__/public-api.test.ts.snap +14 -0
- package/src/public/time-series.ts +11 -8
- package/src/remote/schema.ts +1 -1
- package/src/renderers/browser/config-host.ts +3 -0
- package/src/renderers/browser/main.tsx +23 -3
- package/src/renderers/dom/boot-frame-page.ts +187 -0
- package/src/renderers/dom/boot-frame.ts +237 -0
- package/src/renderers/dom/build-assets.ts +46 -8
- package/src/renderers/dom/dom-ui-host.tsx +4 -29
- package/src/renderers/dom/host/ascii-text.ts +16 -2
- package/src/renderers/dom/host/box.tsx +43 -2
- package/src/renderers/dom/host/chart-surface.tsx +2 -0
- package/src/renderers/dom/host/hls.chunk.ts +3 -0
- package/src/renderers/dom/host/image-surface.tsx +49 -0
- package/src/renderers/dom/host/media-surface.tsx +24 -18
- package/src/renderers/dom/host/mouse.ts +30 -0
- package/src/renderers/dom/host/size-observer.ts +1 -1
- package/src/renderers/dom/host/style.ts +1 -1
- package/src/renderers/dom/styles.css +76 -0
- package/src/renderers/dom/test-utils.tsx +2 -1
- package/src/renderers/electrobun/bun/application-menu/index.ts +3 -3
- package/src/renderers/electrobun/bun/desktop/backend-requests.ts +3 -0
- package/src/renderers/electrobun/bun/desktop/backend.ts +46 -3
- package/src/renderers/electrobun/bun/desktop/detached-windows.ts +1 -1
- package/src/renderers/electrobun/bun/desktop/host-requests.ts +9 -3
- package/src/renderers/electrobun/bun/desktop/initialization.ts +81 -18
- package/src/renderers/electrobun/bun/external-plugins.ts +29 -7
- package/src/renderers/electrobun/bun/index.ts +11 -1
- package/src/renderers/electrobun/bun/window/boot-frame.ts +67 -0
- package/src/renderers/electrobun/bun/window/create.ts +4 -1
- package/src/renderers/electrobun/shared/boot-frame.ts +7 -0
- package/src/renderers/electrobun/shared/protocol.ts +6 -1
- package/src/renderers/electrobun/view/cli-pane-shot-entry.tsx +1 -1
- package/src/renderers/electrobun/view/config-host.ts +3 -0
- package/src/renderers/electrobun/view/fatal-screen.tsx +1 -1
- package/src/renderers/electrobun/view/main.tsx +30 -4
- package/src/renderers/electrobun/view/news-source.ts +5 -5
- package/src/renderers/electrobun/view/remote/asset-data-client.ts +1 -1
- package/src/renderers/electrobun/view/ui-host.tsx +1 -1
- package/src/renderers/opentui/browser-open.ts +88 -0
- package/src/renderers/opentui/host.tsx +5 -14
- package/src/renderers/opentui/image/loader.ts +3 -2
- package/src/renderers/opentui/native-smoke.ts +10 -1
- package/src/renderers/opentui/pane-image/index.ts +2 -1
- package/src/renderers/opentui/render-lib.ts +253 -0
- package/src/renderers/opentui/render-timing-smoke.ts +1 -1
- package/src/renderers/opentui/start.tsx +1 -1
- package/src/renderers/share/layout-view.tsx +2 -2
- package/src/renderers/share/main.tsx +4 -4
- package/src/renderers/share/view.tsx +1 -1
- package/src/series/resolve.ts +22 -6
- package/src/series/standalone.ts +30 -2
- package/src/series/types.ts +8 -1
- package/src/shares/api.ts +4 -1
- package/src/shares/pane.ts +1 -1
- package/src/sources/gloomberb-cloud/fred-series.ts +46 -1
- package/src/sources/gloomberb-cloud/index.ts +32 -16
- package/src/sources/gloomberb-cloud/news.ts +39 -0
- package/src/sources/gloomberb-cloud/normalizers.ts +14 -1
- package/src/sources/gloomberb-cloud/perpetuals.ts +49 -1
- package/src/sources/listing-symbols.ts +37 -0
- package/src/sources/provider-errors.ts +16 -2
- package/src/sources/provider-router/financial-routes.ts +21 -3
- package/src/sources/provider-router/financials.ts +15 -2
- package/src/sources/provider-router/history.ts +30 -8
- package/src/sources/provider-router/primary.ts +1 -1
- package/src/state/app/bootstrap.ts +23 -0
- package/src/state/hooks/inline-tickers.ts +30 -5
- package/src/sync/controller.ts +1 -1
- package/src/sync/core-contributors.ts +46 -14
- package/src/team/collections-sync.ts +2 -1
- package/src/team/collections.ts +178 -17
- package/src/telemetry/crash-reports.ts +17 -4
- package/src/test-support/builtin-panes.ts +1 -1
- package/src/theme/colors.ts +3 -30
- package/src/theme/ui-tokens.ts +37 -1
- package/src/tickers/company-name-listing.ts +210 -33
- package/src/tickers/index-roots.ts +47 -0
- package/src/tickers/instrument-label.ts +5 -1
- package/src/tickers/metadata.ts +10 -0
- package/src/tickers/perpetual-listing.ts +5 -2
- package/src/tickers/search/home-listing.ts +75 -0
- package/src/tickers/search/index.ts +76 -27
- package/src/tickers/search/ranking.ts +54 -4
- package/src/tickers/search/upsert.ts +29 -0
- package/src/tickers/terminal-codes.ts +416 -40
- package/src/time-series/bar-aggregation.ts +243 -0
- package/src/time-series/base-series.ts +307 -0
- package/src/time-series/chart-bounds.ts +349 -0
- package/src/time-series/chart-seed.ts +142 -0
- package/src/time-series/economic.ts +5 -0
- package/src/time-series/fundamentals.ts +18 -3
- package/src/time-series/history-acquisition.ts +499 -0
- package/src/time-series/leverage.ts +100 -0
- package/src/time-series/market-resolution.ts +4 -2
- package/src/time-series/market.ts +2 -1
- package/src/time-series/price-comparison.ts +175 -30
- package/src/time-series/range.ts +9 -1
- package/src/time-series/resolution.ts +174 -16
- package/src/time-series/resolve-context.ts +157 -0
- package/src/time-series/resolve.ts +126 -1577
- package/src/time-series/series-name.ts +38 -0
- package/src/time-series/series-presentation.ts +208 -0
- package/src/time-series/spec.ts +11 -6
- package/src/time-series/studies.ts +109 -12
- package/src/time-series/tail-reconcile.ts +121 -0
- package/src/time-series/types.ts +29 -2
- package/src/time-series/use-chart-resolution.ts +4 -5
- package/src/types/broker.ts +10 -0
- package/src/types/config.ts +14 -0
- package/src/types/data-provider.ts +14 -0
- package/src/types/exchange-rate.ts +6 -0
- package/src/types/financials.ts +104 -7
- package/src/types/headless.ts +76 -6
- package/src/types/instrument.ts +3 -0
- package/src/types/plugin.ts +65 -8
- package/src/types/price-history.ts +2 -0
- package/src/types/ticker.ts +13 -0
- package/src/types/trading.ts +59 -1
- package/src/ui/ascii-font.ts +13 -1
- package/src/ui/host.tsx +6 -1
- package/src/updater/command-names.ts +175 -0
- package/src/updater/index.ts +10 -5
- package/src/utils/calendar-date.ts +32 -15
- package/src/utils/cash-runway.ts +241 -0
- package/src/utils/central-banks.ts +42 -0
- package/src/utils/cli-output.ts +259 -80
- package/src/utils/contract-month.ts +16 -0
- package/src/utils/crypto-pair.ts +61 -3
- package/src/utils/currency-units.ts +29 -0
- package/src/utils/datetime-format.ts +10 -0
- package/src/utils/debug-log.ts +1 -1
- package/src/utils/decimal-comma.ts +39 -6
- package/src/utils/exchange-announcements.ts +71 -0
- package/src/utils/exchange-rate-snapshot.ts +10 -0
- package/src/utils/financial-statements.ts +83 -4
- package/src/utils/format.ts +34 -16
- package/src/utils/fundamentals.ts +150 -34
- package/src/utils/fx-market-hours.ts +10 -1
- package/src/utils/latest-financial-period.ts +8 -0
- package/src/utils/linux-libc.ts +54 -0
- package/src/utils/market-capitalization.ts +111 -15
- package/src/utils/max-drawdown.ts +64 -0
- package/src/utils/network-failure.ts +83 -0
- package/src/utils/option-expiry.ts +139 -7
- package/src/utils/price-earnings.ts +11 -5
- package/src/utils/price-history.ts +18 -8
- package/src/utils/price-window.ts +131 -0
- package/src/utils/release-date.ts +47 -0
- package/src/utils/sec.ts +3 -0
- package/src/utils/throttled-fetch.ts +11 -4
- package/src/utils/trailing-eps.ts +67 -0
- package/src/utils/typed-text.ts +21 -0
- package/src/utils/utc-time.ts +24 -1
- package/src/version.ts +6 -0
- package/src/cli/pane-functions/screenshot.ts +0 -2122
package/src/cli/name-entries.ts
CHANGED
|
@@ -3,7 +3,9 @@ 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
11
|
* The entries of a list (`splitSymbolArgs`, or a file's lines) as the symbols
|
|
@@ -15,20 +17,25 @@ import { isProviderBusy } from "../sources/provider-errors";
|
|
|
15
17
|
* pasted line), and otherwise stays whole, a name nothing lists: its words
|
|
16
18
|
* are not taken for other companies' symbols (INTL, a fund, from a misspelt
|
|
17
19
|
* `phillip morris intl`). Only those entries cost a search. One search was
|
|
18
|
-
* too busy to look up
|
|
19
|
-
*
|
|
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.
|
|
20
24
|
*/
|
|
21
25
|
export async function readNameEntries(
|
|
22
26
|
entries: readonly string[],
|
|
23
27
|
dataProvider: Pick<DataProvider, "search"> & Partial<Pick<DataProvider, "getQuotesBatch" | "getQuote">>,
|
|
24
28
|
): Promise<string[]> {
|
|
25
29
|
const read = await Promise.all(entries.map(async (entry) => {
|
|
26
|
-
// A terminal's code for a listing ("JPM US Equity") is one entry, like a company's name
|
|
27
|
-
|
|
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];
|
|
28
33
|
if (!isCompanyNameInput(entry)) return splitSymbolWords([entry]);
|
|
29
|
-
|
|
34
|
+
const named = await findListingOfCompanyName(dataProvider, entry).catch(busyAsAnswer);
|
|
35
|
+
const busy = isProviderBusy(named);
|
|
36
|
+
if (named && !busy) return [entry];
|
|
30
37
|
const words = splitSymbolWords([entry]);
|
|
31
|
-
return await wordsAreSymbols(words, dataProvider) ? words : [entry];
|
|
38
|
+
return await wordsAreSymbols(words, dataProvider, { quoteEvery: busy }) ? words : [entry];
|
|
32
39
|
}));
|
|
33
40
|
return read.flat();
|
|
34
41
|
}
|
|
@@ -41,14 +48,17 @@ function writtenAsSymbol(word: string): boolean {
|
|
|
41
48
|
/**
|
|
42
49
|
* Whether the words of an entry search found no company for are symbols:
|
|
43
50
|
* each written as one (2222, BRK.B) or else with a quote, the others asked in
|
|
44
|
-
* one batch (`2222 amd pltr`).
|
|
45
|
-
*
|
|
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.
|
|
46
55
|
*/
|
|
47
56
|
async function wordsAreSymbols(
|
|
48
57
|
words: readonly string[],
|
|
49
58
|
dataProvider: Partial<Pick<DataProvider, "getQuotesBatch" | "getQuote">>,
|
|
59
|
+
{ quoteEvery = false }: { quoteEvery?: boolean } = {},
|
|
50
60
|
): Promise<boolean> {
|
|
51
|
-
const symbols = words.filter((word) => !writtenAsSymbol(word)).map((word) => word.replace(/^\$/, "").toUpperCase());
|
|
61
|
+
const symbols = words.filter((word) => quoteEvery ? !word.includes(":") : !writtenAsSymbol(word)).map((word) => word.replace(/^\$/, "").toUpperCase());
|
|
52
62
|
if (symbols.length === 0) return true;
|
|
53
63
|
if (dataProvider.getQuotesBatch) {
|
|
54
64
|
const results = await dataProvider.getQuotesBatch(symbols.map((symbol) => ({ symbol, exchange: "" })))
|
|
@@ -65,9 +75,9 @@ async function wordsAreSymbols(
|
|
|
65
75
|
return quoted.every(Boolean);
|
|
66
76
|
}
|
|
67
77
|
|
|
68
|
-
/** `findListingOfCompanyName`'s busy answer
|
|
69
|
-
function
|
|
70
|
-
if (isProviderBusy(error)) return
|
|
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;
|
|
71
81
|
throw error;
|
|
72
82
|
}
|
|
73
83
|
|
|
@@ -83,7 +93,8 @@ export type PhraseReading =
|
|
|
83
93
|
* word is one the source says is not a ticker (`"AAPL MSFT"`), else a phrase
|
|
84
94
|
* (`"10 year yield"`), which is never split into symbols such as YEAR and
|
|
85
95
|
* YIELD. The words are asked in one batch beside the name search, not a
|
|
86
|
-
* 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.
|
|
87
98
|
* When search is too busy to say whether it names a company, a line whose
|
|
88
99
|
* every word has a quote is still symbols; anything else throws
|
|
89
100
|
* `ProviderBusyError`, as its words may be other companies' symbols.
|
|
@@ -92,9 +103,10 @@ export async function readPhraseArgument(
|
|
|
92
103
|
phrase: string,
|
|
93
104
|
dataProvider: Pick<DataProvider, "search" | "getQuotesBatch">,
|
|
94
105
|
): Promise<PhraseReading> {
|
|
95
|
-
if (await readTerminalCodeArg(dataProvider, phrase)) return { kind: "symbols", symbols: [phrase] };
|
|
106
|
+
if (unknownBloombergMarket(phrase) || await readTerminalCodeArg(dataProvider, phrase)) return { kind: "symbols", symbols: [phrase] };
|
|
96
107
|
const words = splitSymbolWords([phrase]);
|
|
97
|
-
const
|
|
108
|
+
const numbered = words.some(isNumberCell);
|
|
109
|
+
const asked = words.filter((word) => !word.includes(":") && !isNumberCell(word)).map((word) => word.replace(/^\$/, "").toUpperCase());
|
|
98
110
|
const [named, results] = await Promise.all([
|
|
99
111
|
findListingOfCompanyName(dataProvider, phrase).catch((error: unknown) => {
|
|
100
112
|
if (isProviderBusy(error)) return error;
|
|
@@ -105,11 +117,11 @@ export async function readPhraseArgument(
|
|
|
105
117
|
: [],
|
|
106
118
|
]);
|
|
107
119
|
if (isProviderBusy(named)) {
|
|
108
|
-
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 };
|
|
109
121
|
throw named;
|
|
110
122
|
}
|
|
111
123
|
if (named) return { kind: "name", name: phrase };
|
|
112
124
|
// A word the source could not answer for (an outage) is given the benefit of the doubt, as the line was before.
|
|
113
|
-
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 ?? "")));
|
|
114
126
|
return notTicker ? { kind: "phrase", phrase } : { kind: "symbols", symbols: words };
|
|
115
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;
|
|
@@ -27,6 +27,8 @@ export interface PaneFunctionCapability {
|
|
|
27
27
|
dataRequirements: string[];
|
|
28
28
|
limitations: string[];
|
|
29
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;
|
|
30
32
|
}
|
|
31
33
|
|
|
32
34
|
const NON_DATA_PANE_IDS = new Set([
|
|
@@ -68,6 +70,7 @@ function fallbackCapability(
|
|
|
68
70
|
? RENDERED_VIEW_LIMITATION
|
|
69
71
|
: "This pane is an interactive surface and does not expose a data report."],
|
|
70
72
|
options: [...(pane.reportOptions ?? [])],
|
|
73
|
+
...pane.reportOptionsOnly ? { strictOptions: true } : {},
|
|
71
74
|
};
|
|
72
75
|
}
|
|
73
76
|
|
|
@@ -79,6 +82,14 @@ function optionToken(value: string): string {
|
|
|
79
82
|
return value.trim().toLowerCase().replace(/[\s_.-]+/g, "");
|
|
80
83
|
}
|
|
81
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
|
+
|
|
82
93
|
// Choices longer than this move from the flag into its description, where they can wrap.
|
|
83
94
|
export const MAX_INLINE_CHOICES = 24;
|
|
84
95
|
|
|
@@ -90,7 +101,7 @@ export function optionChoices(option: PaneFunctionOptionDef): string[] {
|
|
|
90
101
|
export function optionFlags(option: PaneFunctionOptionDef): string {
|
|
91
102
|
const choices = optionChoices(option).join("|");
|
|
92
103
|
const value = choices && choices.length <= MAX_INLINE_CHOICES ? choices : option.values?.length ? "value" : option.placeholder ?? option.type;
|
|
93
|
-
return
|
|
104
|
+
return `${optionFlag(option.key)} <${value}>`;
|
|
94
105
|
}
|
|
95
106
|
|
|
96
107
|
/** The option values a typed word is, by value or alias: `gas` is JODI's `--commodity gas`. */
|
|
@@ -99,18 +110,29 @@ function optionValueOf(options: readonly PaneFunctionOptionDef[], typed: string)
|
|
|
99
110
|
for (const option of options) {
|
|
100
111
|
const value = option.values?.find((candidate) => optionToken(candidate.value) === token
|
|
101
112
|
|| candidate.aliases?.some((alias) => optionToken(alias) === token));
|
|
102
|
-
if (value) return
|
|
113
|
+
if (value) return `${optionFlag(option.key)} ${value.value}`;
|
|
103
114
|
}
|
|
104
115
|
return null;
|
|
105
116
|
}
|
|
106
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
|
+
|
|
107
129
|
/** An option in use, as typed after the function: its own example, else a choice that is not the default. */
|
|
108
130
|
function optionExample(option: PaneFunctionOptionDef): string {
|
|
109
131
|
if (option.example) return option.example;
|
|
110
|
-
if (option.type === "boolean") return
|
|
132
|
+
if (option.type === "boolean") return optionFlag(option.key);
|
|
111
133
|
const choice = option.values?.find(({ value }) => value !== option.defaultValue);
|
|
112
|
-
if (choice) return
|
|
113
|
-
return
|
|
134
|
+
if (choice) return `${optionFlag(option.key)} ${choice.value}`;
|
|
135
|
+
return `${optionFlag(option.key)} <${option.placeholder ?? option.type}>`;
|
|
114
136
|
}
|
|
115
137
|
|
|
116
138
|
/** Options a no-argument error lists before it points at the catalog for the rest. */
|
|
@@ -119,7 +141,8 @@ const LISTED_OPTIONS = 6;
|
|
|
119
141
|
/**
|
|
120
142
|
* What a function that takes no argument answers one with: its options and a
|
|
121
143
|
* command to run. A word that is one of an option's values runs as that option
|
|
122
|
-
* (`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.
|
|
123
146
|
*/
|
|
124
147
|
export function noArgumentMessage(
|
|
125
148
|
options: readonly PaneFunctionOptionDef[],
|
|
@@ -128,11 +151,11 @@ export function noArgumentMessage(
|
|
|
128
151
|
command: "fn" | "shot" = "fn",
|
|
129
152
|
): string {
|
|
130
153
|
const head = `${code} does not accept an argument.`;
|
|
131
|
-
if (options.length === 0) return `${head} Run:
|
|
132
|
-
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);
|
|
133
156
|
const listed = options.slice(0, LISTED_OPTIONS).map(optionFlags).join(", ");
|
|
134
|
-
const more = options.length > LISTED_OPTIONS ? ` and ${options.length - LISTED_OPTIONS} more (
|
|
135
|
-
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]!)}`;
|
|
136
159
|
return `${head} Options: ${listed}${more}. ${run}`;
|
|
137
160
|
}
|
|
138
161
|
|
|
@@ -162,6 +185,30 @@ export function getHeadlessPaneDefinition(
|
|
|
162
185
|
return template?.headless ?? pane.headless;
|
|
163
186
|
}
|
|
164
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
|
+
|
|
165
212
|
export function getPaneFunctionCapability(
|
|
166
213
|
template: PaneTemplateDef | undefined,
|
|
167
214
|
pane: PaneDef,
|
|
@@ -209,7 +256,7 @@ function normalizeEnumValue(option: PaneFunctionOptionDef, rawValue: string, arg
|
|
|
209
256
|
if (match) return match.value;
|
|
210
257
|
const hint = option.invalidValueHint?.(rawValue, argument);
|
|
211
258
|
throw new Error(
|
|
212
|
-
`Invalid
|
|
259
|
+
`Invalid ${optionFlag(option.key)} value "${rawValue}".${hint ? ` ${hint}` : ""} Use one of: ${option.values?.map(({ value }) => value).join(", ") ?? ""}.`,
|
|
213
260
|
);
|
|
214
261
|
}
|
|
215
262
|
|
|
@@ -222,19 +269,19 @@ function normalizeOptionValue(
|
|
|
222
269
|
if (rawValue === true) return true;
|
|
223
270
|
if (/^true$/i.test(rawValue)) return true;
|
|
224
271
|
if (/^false$/i.test(rawValue)) return false;
|
|
225
|
-
throw new Error(`Invalid
|
|
272
|
+
throw new Error(`Invalid ${optionFlag(option.key)} value "${rawValue}". Use true or false.`);
|
|
226
273
|
}
|
|
227
|
-
if (rawValue === true) throw new Error(
|
|
274
|
+
if (rawValue === true) throw new Error(`${optionFlag(option.key)} requires a value.`);
|
|
228
275
|
if (option.normalize) return option.normalize(rawValue);
|
|
229
276
|
if (option.type === "enum") return normalizeEnumValue(option, rawValue, argument);
|
|
230
277
|
if (option.type === "integer") {
|
|
231
278
|
const value = Number(rawValue);
|
|
232
|
-
if (!Number.isInteger(value)) throw new Error(
|
|
279
|
+
if (!Number.isInteger(value)) throw new Error(`${optionFlag(option.key)} must be an integer.`);
|
|
233
280
|
if (option.minimum != null && value < option.minimum) {
|
|
234
|
-
throw new Error(
|
|
281
|
+
throw new Error(`${optionFlag(option.key)} must be at least ${option.minimum}.`);
|
|
235
282
|
}
|
|
236
283
|
if (option.maximum != null && value > option.maximum) {
|
|
237
|
-
throw new Error(
|
|
284
|
+
throw new Error(`${optionFlag(option.key)} must be at most ${option.maximum}.`);
|
|
238
285
|
}
|
|
239
286
|
return value;
|
|
240
287
|
}
|
|
@@ -250,7 +297,7 @@ export function normalizeCapabilityOptions(
|
|
|
250
297
|
*/
|
|
251
298
|
settings: { strict?: boolean; code?: string; argument?: string | null } = {},
|
|
252
299
|
): NormalizedPaneFunctionOptions {
|
|
253
|
-
if (!capability.botSafe) {
|
|
300
|
+
if (!capability.botSafe && !capability.strictOptions) {
|
|
254
301
|
// A rendered view takes any pane setting; the options it declares are checked.
|
|
255
302
|
return Object.fromEntries(Object.entries(options).map(([key, value]) => {
|
|
256
303
|
const option = findCapabilityOption(capability, key);
|
|
@@ -262,20 +309,27 @@ export function normalizeCapabilityOptions(
|
|
|
262
309
|
for (const option of capability.options) {
|
|
263
310
|
if (option.defaultValue !== undefined) normalized[option.key] = option.defaultValue;
|
|
264
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>();
|
|
265
314
|
for (const [rawKey, rawValue] of Object.entries(options)) {
|
|
266
315
|
const option = findCapabilityOption(capability, rawKey);
|
|
316
|
+
if (option) typed.set(option.key, rawKey);
|
|
267
317
|
if (!option) {
|
|
268
318
|
if (settings.strict === false) {
|
|
269
319
|
normalized[rawKey] = rawValue;
|
|
270
320
|
continue;
|
|
271
321
|
}
|
|
272
|
-
const supported = capability.options.map(({ key }) =>
|
|
322
|
+
const supported = capability.options.map(({ key }) => optionFlag(key)).join(", ");
|
|
273
323
|
throw new Error(
|
|
274
|
-
`${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."}`,
|
|
275
325
|
);
|
|
276
326
|
}
|
|
277
327
|
normalized[option.key] = normalizeOptionValue(option, rawValue, settings.argument);
|
|
278
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
|
+
}
|
|
279
333
|
return normalized;
|
|
280
334
|
}
|
|
281
335
|
|
|
@@ -285,7 +339,8 @@ export function capabilityPaneSettings(
|
|
|
285
339
|
): Record<string, unknown> {
|
|
286
340
|
const settings: Record<string, unknown> = {};
|
|
287
341
|
for (const option of capability.options) {
|
|
288
|
-
|
|
342
|
+
// An option read from pane state sets no setting, unless it also names one.
|
|
343
|
+
if (option.pluginState && !option.settingKey) continue;
|
|
289
344
|
const value = options[option.key];
|
|
290
345
|
if (value !== undefined) settings[option.settingKey ?? option.key] = value;
|
|
291
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
|
*/
|
|
@@ -259,6 +256,7 @@ async function buildTemplateCatalogEntry(
|
|
|
259
256
|
}
|
|
260
257
|
|
|
261
258
|
const headless = getHeadlessPaneDefinition(template, pane);
|
|
259
|
+
const argument = paneFunctionArgument(template, pane);
|
|
262
260
|
return {
|
|
263
261
|
token: template.shortcut?.prefix ?? template.id,
|
|
264
262
|
label: template.label,
|
|
@@ -268,8 +266,8 @@ async function buildTemplateCatalogEntry(
|
|
|
268
266
|
templateId: template.id,
|
|
269
267
|
shortcut: template.shortcut?.prefix,
|
|
270
268
|
aliases: [...(template.shortcut?.aliases ?? [])],
|
|
271
|
-
argKind:
|
|
272
|
-
argPlaceholder:
|
|
269
|
+
argKind: argument.kind,
|
|
270
|
+
argPlaceholder: argument.placeholder,
|
|
273
271
|
...(headless?.argument.examples?.length ? { argExamples: headless.argument.examples } : {}),
|
|
274
272
|
...(headless?.argument.kind === "tickers" && template.shortcut?.argKind === "ticker"
|
|
275
273
|
? { shotArgument: argumentHint({ argKind: "ticker", argPlaceholder: template.shortcut.argPlaceholder }) } : {}),
|
|
@@ -296,6 +294,7 @@ export async function buildPaneCatalogEntries(
|
|
|
296
294
|
for (const pane of registry.panes.values()) {
|
|
297
295
|
if (templatedPaneIds.has(pane.id)) continue;
|
|
298
296
|
const [shortcut, ...aliases] = builtInPanePrefixes(pane.id);
|
|
297
|
+
const argument = paneFunctionArgument(undefined, pane);
|
|
299
298
|
entries.push({
|
|
300
299
|
token: shortcut ?? pane.id,
|
|
301
300
|
label: pane.name,
|
|
@@ -304,8 +303,8 @@ export async function buildPaneCatalogEntries(
|
|
|
304
303
|
paneName: pane.name,
|
|
305
304
|
shortcut,
|
|
306
305
|
aliases,
|
|
307
|
-
argKind:
|
|
308
|
-
argPlaceholder:
|
|
306
|
+
argKind: argument.kind,
|
|
307
|
+
argPlaceholder: argument.placeholder,
|
|
309
308
|
...(pane.headless?.argument.examples?.length ? { argExamples: pane.headless.argument.examples } : {}),
|
|
310
309
|
keywords: [],
|
|
311
310
|
defaultSettings: {},
|
|
@@ -576,7 +575,8 @@ function readinessCell(readiness: PaneFunctionReadiness): string {
|
|
|
576
575
|
function optionDescription(option: PaneFunctionOptionDef): string {
|
|
577
576
|
const choices = optionChoices(option);
|
|
578
577
|
const parts = [option.description.replace(/\.$/, "")];
|
|
579
|
-
|
|
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(", ")}`);
|
|
580
580
|
if (option.defaultValue !== undefined && option.defaultValue !== "") parts.push(`Default ${String(option.defaultValue)}`);
|
|
581
581
|
return `${parts.join(". ")}.`;
|
|
582
582
|
}
|
|
@@ -622,14 +622,14 @@ function renderCatalogEntry(entry: PaneCatalogEntry): string {
|
|
|
622
622
|
|
|
623
623
|
lines.push("", renderSection("Examples"));
|
|
624
624
|
if (capability.reportReadiness !== "unsupported") {
|
|
625
|
-
lines.push(...wrapCommandLine(`
|
|
626
|
-
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));
|
|
627
627
|
for (const option of capability.options) {
|
|
628
|
-
if (option.example) lines.push(...wrapCommandLine(`
|
|
628
|
+
if (option.example) lines.push(...wrapCommandLine(`gloom fn ${option.exampleWithoutArgument ? entry.token : invocation} ${option.example}`, width));
|
|
629
629
|
}
|
|
630
630
|
}
|
|
631
631
|
const shotInvocation = entry.shotArgument ? `${entry.token} ${entry.shotArgument}` : invocation;
|
|
632
|
-
lines.push(...wrapCommandLine(`
|
|
632
|
+
lines.push(...wrapCommandLine(`gloom shot ${shotInvocation} --output ${entry.token.toLowerCase()}.png`, width));
|
|
633
633
|
return lines.join("\n");
|
|
634
634
|
}
|
|
635
635
|
|
|
@@ -638,10 +638,11 @@ function renderMatchesTable(shown: readonly PaneCatalogEntry[]): string {
|
|
|
638
638
|
return renderTable(
|
|
639
639
|
[
|
|
640
640
|
{ header: "Function", shrink: false },
|
|
641
|
-
{ header: "Name"
|
|
642
|
-
{ header: "Argument"
|
|
641
|
+
{ header: "Name" },
|
|
642
|
+
{ header: "Argument" },
|
|
643
643
|
{ header: "Report" },
|
|
644
|
-
|
|
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 },
|
|
645
646
|
],
|
|
646
647
|
shown.map((entry) => [
|
|
647
648
|
cliStyles.command(entry.token),
|
|
@@ -675,7 +676,7 @@ function renderAlsoMatches(exact: PaneCatalogEntry, entries: readonly PaneCatalo
|
|
|
675
676
|
*/
|
|
676
677
|
export function renderFunctionHelp(entry: PaneCatalogEntry, command: string): string {
|
|
677
678
|
const width = Math.min(cliTerminalWidth() ?? CATALOG_TEXT_WIDTH, CATALOG_TEXT_WIDTH);
|
|
678
|
-
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}.`;
|
|
679
680
|
return [renderCatalogEntry(entry), "", ...wrapText(note, width).map((line) => cliStyles.muted(line))].join("\n");
|
|
680
681
|
}
|
|
681
682
|
|
|
@@ -687,7 +688,7 @@ function renderCatalogGlossary(glossary: GlossaryLookup, width: number): string
|
|
|
687
688
|
const defined = glossary.exact.length > 0 ? [renderSection("Glossary"), ...renderGlossaryEntries(glossary.exact)] : [];
|
|
688
689
|
const others = glossary.partial.map((entry) => entry.term).join(", ");
|
|
689
690
|
const related = others
|
|
690
|
-
? wrapText(`${defined.length > 0 ? "Related" : "Glossary"}: ${others}.
|
|
691
|
+
? wrapText(`${defined.length > 0 ? "Related" : "Glossary"}: ${others}. gloom catalog glossary <term> explains one.`, width)
|
|
691
692
|
.map((line) => cliStyles.muted(line))
|
|
692
693
|
: [];
|
|
693
694
|
return [...defined, ...related].join("\n");
|
|
@@ -736,7 +737,7 @@ export function renderPaneCatalogReport(
|
|
|
736
737
|
if (charted) return withGap([charted, terms].filter(Boolean).join("\n\n"));
|
|
737
738
|
if (glossary.exact.length > 0 || gap || setting) return withGap(terms);
|
|
738
739
|
return withTerms(note(args.query
|
|
739
|
-
? `No functions match "${args.query}". Run
|
|
740
|
+
? `No functions match "${args.query}". Run gloom catalog to browse them all.`
|
|
740
741
|
: "No functions are available."));
|
|
741
742
|
}
|
|
742
743
|
|
|
@@ -752,7 +753,7 @@ export function renderPaneCatalogReport(
|
|
|
752
753
|
"",
|
|
753
754
|
note([
|
|
754
755
|
loose ? "No function carries every word of the query; these are the closest." : "",
|
|
755
|
-
"
|
|
756
|
+
"gloom catalog <function> shows its options and examples.",
|
|
756
757
|
hidden > 0 ? more : "",
|
|
757
758
|
].filter(Boolean).join(" ")),
|
|
758
759
|
];
|
|
@@ -37,7 +37,7 @@ function unavailable<T>(name: string): T {
|
|
|
37
37
|
* Context that collects `setup()`-registered panes and templates without
|
|
38
38
|
* booting the real plugin runtime or its polling engines. Keep this object
|
|
39
39
|
* exhaustively typed so additions to GloomPluginContext fail at compile time
|
|
40
|
-
* instead of crashing `
|
|
40
|
+
* instead of crashing `gloom catalog` at runtime.
|
|
41
41
|
*/
|
|
42
42
|
export function createPaneDiscoveryContext(options: PaneDiscoveryOptions): GloomPluginContext & {
|
|
43
43
|
panes: Map<string, PaneDef>;
|
|
@@ -9,7 +9,8 @@ import { lockNoteLines } from "./lock-note";
|
|
|
9
9
|
import { createHeadlessPaneContext } from "./headless";
|
|
10
10
|
import type { HeadlessPaneContext } from "../../types/headless";
|
|
11
11
|
import { lockNoteReason } from "../../plugins/builtin/shared/pro-lock-note";
|
|
12
|
-
import { renderDesktopShot
|
|
12
|
+
import { renderDesktopShot } from "./screenshot-render";
|
|
13
|
+
import type { PaneScreenshotResult } from "./screenshot-types";
|
|
13
14
|
import { deriveRenderedFreshness, formatFreshnessLine, type ReportFreshness } from "./freshness";
|
|
14
15
|
import { exportTextTable, reportFooterLines, type CliReportTables } from "../report-tables";
|
|
15
16
|
import { declaredReportFreshness, renderedReportFailure, renderedReportFreshness, renderedReportNotices, renderedReportObservations } from "./report-notices";
|
|
@@ -301,14 +302,13 @@ export async function buildDomPaneReportFromRender(
|
|
|
301
302
|
/** The report's closing lines; a locked view, which read nothing, cites no source. */
|
|
302
303
|
export function appendDomReportFooter(
|
|
303
304
|
text: string,
|
|
304
|
-
elapsedMs: number,
|
|
305
305
|
view: DomReportView,
|
|
306
306
|
freshness: ReportFreshness | undefined,
|
|
307
307
|
): string {
|
|
308
308
|
return [
|
|
309
309
|
text,
|
|
310
310
|
"",
|
|
311
|
-
domReportNote(
|
|
311
|
+
domReportNote(view),
|
|
312
312
|
...(freshness ? [cliStyles.muted(formatFreshnessLine(freshness))] : []),
|
|
313
313
|
].join("\n");
|
|
314
314
|
}
|
|
@@ -321,16 +321,19 @@ export function domReportView(data: Readonly<Record<string, unknown>>): DomRepor
|
|
|
321
321
|
return data.truncated === true ? "clipped" : data.everyRow === true ? "every-row" : data.wholePane === true ? "whole" : "visible";
|
|
322
322
|
}
|
|
323
323
|
|
|
324
|
-
/**
|
|
325
|
-
|
|
326
|
-
|
|
324
|
+
/**
|
|
325
|
+
* What a rendered-view report says about where its values come from. How long
|
|
326
|
+
* the render took is no part of it: that is the machine's, not the data's
|
|
327
|
+
* (`elapsedMs` in JSON keeps it).
|
|
328
|
+
*/
|
|
329
|
+
export function domReportNote(view: DomReportView): string {
|
|
330
|
+
return view === "locked"
|
|
327
331
|
? "Rendered view: the pane is locked, so no values were read."
|
|
328
332
|
: view === "every-row"
|
|
329
333
|
? "Rendered view: every row of the pane's table, including rows scrolled out of view."
|
|
330
334
|
: view === "whole"
|
|
331
335
|
? "Rendered view: the pane grown to fit the whole page."
|
|
332
336
|
: `Rendered view: values come from the visible pane. ${view === "clipped" ? "The rendered view is clipped." : "The rendered view may be clipped."}`;
|
|
333
|
-
return `${source} Render time: ${elapsedMs} ms.`;
|
|
334
337
|
}
|
|
335
338
|
|
|
336
339
|
function failedDomReport(
|