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
|
@@ -3,6 +3,7 @@ import type {
|
|
|
3
3
|
PaneTemplateContext,
|
|
4
4
|
PaneTemplateCreateOptions,
|
|
5
5
|
PaneTemplateDef,
|
|
6
|
+
ShortcutArgError,
|
|
6
7
|
} from "../../../types/plugin";
|
|
7
8
|
import { fuzzyFilter } from "../../../utils/fuzzy-search";
|
|
8
9
|
import { summarizeError } from "../helpers";
|
|
@@ -38,6 +39,16 @@ export function recentPaneTemplateArg(template: PaneTemplateDef, arg: string | u
|
|
|
38
39
|
return arg?.trim().toUpperCase() || undefined;
|
|
39
40
|
}
|
|
40
41
|
|
|
42
|
+
/** Why a typed argument opens nothing for the template (`PF Nope`), or null. */
|
|
43
|
+
export function paneTemplateArgError(
|
|
44
|
+
template: PaneTemplateDef,
|
|
45
|
+
arg: string | undefined,
|
|
46
|
+
context: PaneTemplateContext,
|
|
47
|
+
): ShortcutArgError | null {
|
|
48
|
+
const trimmed = arg?.trim();
|
|
49
|
+
return trimmed ? template.shortcut?.argError?.(trimmed, context) ?? null : null;
|
|
50
|
+
}
|
|
51
|
+
|
|
41
52
|
export function canPromptForPaneTemplateArg(template: PaneTemplateDef): boolean {
|
|
42
53
|
const argKind = getPaneTemplateArgKind(template);
|
|
43
54
|
return argKind === "ticker"
|
|
@@ -95,6 +106,22 @@ export function getAvailablePaneTemplatesForState(options: {
|
|
|
95
106
|
});
|
|
96
107
|
}
|
|
97
108
|
|
|
109
|
+
/**
|
|
110
|
+
* "ETF flows" spells out ETFF (Crypto ETF Flows), not ETF for a ticker called
|
|
111
|
+
* FLOWS: a query that is word for word a keyword of a template whose own code
|
|
112
|
+
* extends the typed one is no ticker argument, and is left to the search,
|
|
113
|
+
* which ranks that template first. "JOBS DAY" stays Jobs for Dayforce, since
|
|
114
|
+
* the template that lists "jobs day" (MDAY) does not extend JOBS.
|
|
115
|
+
*/
|
|
116
|
+
function spellsOutLongerCode(query: string, code: string, templates: readonly PaneTemplateDef[]): boolean {
|
|
117
|
+
const phrase = query.toLowerCase().replace(/\s+/g, " ");
|
|
118
|
+
return templates.some((template) => {
|
|
119
|
+
const longer = template.shortcut?.prefix?.trim().toUpperCase() ?? "";
|
|
120
|
+
return longer.length > code.length && longer.startsWith(code)
|
|
121
|
+
&& !!template.keywords?.some((keyword) => keyword.toLowerCase() === phrase);
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
|
|
98
125
|
export function getAvailablePaneShortcutTemplatesForQuery(options: {
|
|
99
126
|
pluginRegistry: PluginRegistry;
|
|
100
127
|
disabledPlugins: readonly string[];
|
|
@@ -105,9 +132,11 @@ export function getAvailablePaneShortcutTemplatesForQuery(options: {
|
|
|
105
132
|
const trimmed = options.query.trim();
|
|
106
133
|
const upper = trimmed.toUpperCase();
|
|
107
134
|
const disabledPluginIds = new Set(options.disabledPlugins);
|
|
108
|
-
|
|
135
|
+
const enabled = [...options.pluginRegistry.paneTemplates.values()].filter((template) => {
|
|
109
136
|
const pluginId = options.pluginRegistry.getPaneTemplatePluginId(template.id);
|
|
110
|
-
|
|
137
|
+
return !pluginId || !disabledPluginIds.has(pluginId);
|
|
138
|
+
});
|
|
139
|
+
return enabled.filter((template) => {
|
|
111
140
|
const argKind = getPaneTemplateArgKind(template);
|
|
112
141
|
// The longest matching mnemonic wins, so an alias sharing a stem cannot shadow the typed one.
|
|
113
142
|
const prefix = paneTemplateShortcutPrefixes(template).map((value) => value.toUpperCase())
|
|
@@ -115,14 +144,16 @@ export function getAvailablePaneShortcutTemplatesForQuery(options: {
|
|
|
115
144
|
.sort((a, b) => b.length - a.length)[0];
|
|
116
145
|
if (!prefix) return false;
|
|
117
146
|
const arg = trimmed.slice(prefix.length).trim();
|
|
147
|
+
if (argKind === "ticker" && arg && spellsOutLongerCode(trimmed, prefix, enabled)) return false;
|
|
118
148
|
if (!template.canCreate) return true;
|
|
119
149
|
try {
|
|
120
150
|
const canCreate = template.canCreate(options.context, arg ? { arg } : undefined);
|
|
121
151
|
if (canCreate) return true;
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
return
|
|
152
|
+
// A code typed with an argument it cannot open (`CMP AAPL` compares two
|
|
153
|
+
// or more) is still that function: its row opens the form or says why,
|
|
154
|
+
// where dropping it would leave the text to search and Ask AI.
|
|
155
|
+
if (arg) return canPromptForPaneTemplateArg(template);
|
|
156
|
+
return !options.context.activeTicker && canPromptForPaneTemplateArg(template);
|
|
126
157
|
} catch (error) {
|
|
127
158
|
options.logError?.("Pane shortcut canCreate failed", {
|
|
128
159
|
templateId: template.id,
|
|
@@ -141,6 +172,8 @@ export function buildPaneTemplateItem(options: {
|
|
|
141
172
|
createOptions?: PaneTemplateCreateOptions;
|
|
142
173
|
showShortcut?: boolean;
|
|
143
174
|
shortcutExecution?: boolean;
|
|
175
|
+
/** Why `createOptions.arg` opens nothing; the row then says so instead of opening the pane. */
|
|
176
|
+
argError?: ShortcutArgError | null;
|
|
144
177
|
runPaneTemplateShortcut: (template: PaneTemplateDef, rawArg?: string) => void;
|
|
145
178
|
shouldOpenTemplateConfig: (template: PaneTemplateDef, arg?: string) => boolean;
|
|
146
179
|
openPaneTemplateWorkflow: (template: PaneTemplateDef, options?: { arg?: string }) => void;
|
|
@@ -169,6 +202,26 @@ export function buildPaneTemplateItem(options: {
|
|
|
169
202
|
pluginName || "",
|
|
170
203
|
].filter(Boolean).join(" ");
|
|
171
204
|
|
|
205
|
+
if (options.argError) {
|
|
206
|
+
return {
|
|
207
|
+
id: `pane-template-arg-error:${options.template.id}:${arg || ""}`,
|
|
208
|
+
label: options.argError.message,
|
|
209
|
+
detail: options.argError.detail ?? "",
|
|
210
|
+
// Under the label, where the bar shows a row's second line: what to type instead.
|
|
211
|
+
...(options.argError.detail ? { lines: [{ segments: [{ text: options.argError.detail }] }] } : {}),
|
|
212
|
+
category: options.category ?? (pluginName ? `${pluginName} Panes` : "Panes"),
|
|
213
|
+
// The function's own row, disabled: its code sits in the code column as on
|
|
214
|
+
// the row that opens it, where an info row would carry it on the right.
|
|
215
|
+
kind: "action",
|
|
216
|
+
right: options.showShortcut ? options.template.shortcut?.prefix : undefined,
|
|
217
|
+
shortcutQuery: options.template.shortcut?.prefix,
|
|
218
|
+
searchText,
|
|
219
|
+
defaultSelectable: false,
|
|
220
|
+
disabled: true,
|
|
221
|
+
action: () => {},
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
|
|
172
225
|
const action = () => {
|
|
173
226
|
if (
|
|
174
227
|
options.template.shortcut
|
|
@@ -6,6 +6,7 @@ import type {
|
|
|
6
6
|
PaneTemplateDef,
|
|
7
7
|
} from "../../../types/plugin";
|
|
8
8
|
import { normalizeTickerInput } from "../../../tickers/search";
|
|
9
|
+
import { commandPromptTicker } from "../../../layout/selected-ticker";
|
|
9
10
|
import { debugLog } from "../../../utils/debug-log";
|
|
10
11
|
import {
|
|
11
12
|
isCollectionCommand,
|
|
@@ -20,6 +21,7 @@ import {
|
|
|
20
21
|
getAvailablePaneShortcutTemplatesForQuery,
|
|
21
22
|
getAvailablePaneTemplatesForState,
|
|
22
23
|
getPaneTemplateDisplayLabel,
|
|
24
|
+
paneTemplateArgError,
|
|
23
25
|
recentPaneTemplateArg,
|
|
24
26
|
} from "./items";
|
|
25
27
|
import type { FormModalRequest } from "../../form-modal";
|
|
@@ -126,13 +128,18 @@ export function useCommandBarPaneTemplateActions({
|
|
|
126
128
|
) => {
|
|
127
129
|
const trimmedArg = rawArg?.trim() || "";
|
|
128
130
|
const argKind = template.shortcut?.argKind ?? template.shortcut?.argPlaceholder;
|
|
131
|
+
// Required ticker panes use the instrument already in the command prompt
|
|
132
|
+
// when nothing was typed. Optional panes stay unbound.
|
|
133
|
+
const promptSymbol = template.shortcut?.argOptional
|
|
134
|
+
? null
|
|
135
|
+
: commandPromptTicker(buildWorkflowDeps().getState())?.symbol ?? null;
|
|
129
136
|
if (argKind === "ticker") {
|
|
130
137
|
if (!trimmedArg && template.shortcut?.argOptional) {
|
|
131
138
|
await openPaneTemplateDirect(template);
|
|
132
139
|
return;
|
|
133
140
|
}
|
|
134
141
|
const resolvedTicker = await resolveTickerInput(
|
|
135
|
-
trimmedArg || undefined,
|
|
142
|
+
trimmedArg || promptSymbol || undefined,
|
|
136
143
|
activeTickerSymbol,
|
|
137
144
|
activeCollectionId,
|
|
138
145
|
buildWorkflowDeps(),
|
|
@@ -285,6 +292,7 @@ export function useCommandBarPaneTemplateActions({
|
|
|
285
292
|
shortcutExecution?: boolean;
|
|
286
293
|
},
|
|
287
294
|
): ResultItem => buildPaneTemplateItem({
|
|
295
|
+
argError: paneTemplateArgError(template, options?.createOptions?.arg, getPaneTemplateContext()),
|
|
288
296
|
category: options?.category,
|
|
289
297
|
createOptions: options?.createOptions,
|
|
290
298
|
openPaneTemplateDirect,
|
|
@@ -296,6 +304,7 @@ export function useCommandBarPaneTemplateActions({
|
|
|
296
304
|
showShortcut: options?.showShortcut,
|
|
297
305
|
template,
|
|
298
306
|
}), [
|
|
307
|
+
getPaneTemplateContext,
|
|
299
308
|
openPaneTemplateDirect,
|
|
300
309
|
openPaneTemplateWorkflow,
|
|
301
310
|
pluginRegistry,
|
|
@@ -195,7 +195,7 @@ function buildPluginInstallItem(
|
|
|
195
195
|
const actionLine = !installable
|
|
196
196
|
? `Get it in ${whereItRuns(plugin)}: ${pageUrl.replace(/^https:\/\//, "")}`
|
|
197
197
|
: required
|
|
198
|
-
? `Needs
|
|
198
|
+
? `Needs Gloom ${required}. Update Gloom first.`
|
|
199
199
|
: `Install ${plugin.name}`;
|
|
200
200
|
|
|
201
201
|
const install = () => {
|
|
@@ -9,11 +9,34 @@ import {
|
|
|
9
9
|
QUICK_LOOK_TICKER_SEARCH_OPTIONS,
|
|
10
10
|
tickerSearchFailureItems,
|
|
11
11
|
venueDropdownResults,
|
|
12
|
+
type RootTickerReading,
|
|
12
13
|
} from "../ticker-search/results";
|
|
14
|
+
import { ProviderBusyError, SEARCH_BUSY_MESSAGE } from "../../../../sources/provider-errors";
|
|
15
|
+
import { OperationTimeoutError, withDeadline } from "../../../../utils/async-deadline";
|
|
13
16
|
import { orderListResults, type ResultItem } from "../../list/model";
|
|
14
17
|
import type { CommandBarCategoryPriorities, CommandBarSectionOrder } from "../../view-model";
|
|
15
18
|
import type { CommandBarRoute } from "../../workflow/types";
|
|
16
19
|
|
|
20
|
+
/**
|
|
21
|
+
* How long the root symbol search may take. Gloom Cloud gives up after ten
|
|
22
|
+
* seconds, so a search still going at this point is stuck on something else (a
|
|
23
|
+
* broker that never answers) and the bar stops searching for it.
|
|
24
|
+
*/
|
|
25
|
+
const ROOT_SEARCH_TIMEOUT_MS = 15_000;
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* The search's answer, or a busy service once `timeoutMs` passes: the same row a
|
|
29
|
+
* rate-limited search gets, since nothing was found and a retry may find it.
|
|
30
|
+
*/
|
|
31
|
+
export async function searchWithinDeadline<T>(search: Promise<T>, timeoutMs = ROOT_SEARCH_TIMEOUT_MS): Promise<T> {
|
|
32
|
+
try {
|
|
33
|
+
return await withDeadline(search, timeoutMs, "Symbol search timed out");
|
|
34
|
+
} catch (error) {
|
|
35
|
+
if (error instanceof OperationTimeoutError) throw new ProviderBusyError(SEARCH_BUSY_MESSAGE, { cause: error });
|
|
36
|
+
throw error;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
17
40
|
export function useRootProviderSearch(options: {
|
|
18
41
|
activeCollectionId: string | null;
|
|
19
42
|
buildTickerSearchResultItems: (candidates: TickerSearchCandidate[], query: string) => ResultItem[];
|
|
@@ -30,6 +53,8 @@ export function useRootProviderSearch(options: {
|
|
|
30
53
|
rootPlainTickerSearchArg: string | null;
|
|
31
54
|
/** Set when the query is `NET:` or `NET:N`. Empty string lists every venue. */
|
|
32
55
|
listingSuffix: string | null;
|
|
56
|
+
/** What a plain query written as a terminal's code or a near miss reads as (`VOD LN`, `700.HK`). */
|
|
57
|
+
reading?: RootTickerReading | null;
|
|
33
58
|
rootResultItems: ResultItem[];
|
|
34
59
|
rootTickerSearchArg: string | null;
|
|
35
60
|
tickers: AppState["tickers"];
|
|
@@ -58,6 +83,7 @@ export function useRootProviderSearch(options: {
|
|
|
58
83
|
readTickerSearchCache,
|
|
59
84
|
rootPlainTickerSearchArg,
|
|
60
85
|
listingSuffix,
|
|
86
|
+
reading = null,
|
|
61
87
|
rootResultItems,
|
|
62
88
|
rootTickerSearchArg,
|
|
63
89
|
tickers,
|
|
@@ -116,16 +142,18 @@ export function useRootProviderSearch(options: {
|
|
|
116
142
|
|
|
117
143
|
const requestId = ++rootSearchRequestIdRef.current;
|
|
118
144
|
rootSearchTimerRef.current = setTimeout(async () => {
|
|
145
|
+
let published = false;
|
|
146
|
+
const publish = (candidates: TickerSearchCandidate[]) => {
|
|
147
|
+
published = true;
|
|
148
|
+
setRootProviderResults(mergeTickerSearchResultItems(
|
|
149
|
+
searchQuery,
|
|
150
|
+
buildTickerSearchResultItems(candidates, searchQuery),
|
|
151
|
+
localTickerSearchResultItems(searchQuery, { limit: 6 }),
|
|
152
|
+
));
|
|
153
|
+
setRootProviderResultsQuery(searchQuery);
|
|
154
|
+
};
|
|
119
155
|
try {
|
|
120
|
-
const
|
|
121
|
-
setRootProviderResults(mergeTickerSearchResultItems(
|
|
122
|
-
searchQuery,
|
|
123
|
-
buildTickerSearchResultItems(candidates, searchQuery),
|
|
124
|
-
localTickerSearchResultItems(searchQuery, { limit: 6 }),
|
|
125
|
-
));
|
|
126
|
-
setRootProviderResultsQuery(searchQuery);
|
|
127
|
-
};
|
|
128
|
-
const combined = await searchTickerCandidates({
|
|
156
|
+
const combined = await searchWithinDeadline(searchTickerCandidates({
|
|
129
157
|
query: searchQuery,
|
|
130
158
|
tickers,
|
|
131
159
|
dataProvider,
|
|
@@ -145,7 +173,7 @@ export function useRootProviderSearch(options: {
|
|
|
145
173
|
// The rows the CLI reads a symbol's listings from, so `CAR:` offers CAR Group on ASX (its eleventh).
|
|
146
174
|
totalLimit: LISTING_SEARCH_LIMIT,
|
|
147
175
|
...QUICK_LOOK_TICKER_SEARCH_OPTIONS,
|
|
148
|
-
});
|
|
176
|
+
}));
|
|
149
177
|
if (requestId !== rootSearchRequestIdRef.current) return;
|
|
150
178
|
writeTickerSearchCache(
|
|
151
179
|
searchQuery,
|
|
@@ -156,6 +184,8 @@ export function useRootProviderSearch(options: {
|
|
|
156
184
|
publish(combined);
|
|
157
185
|
} catch (error) {
|
|
158
186
|
if (requestId !== rootSearchRequestIdRef.current) return;
|
|
187
|
+
// Rows a faster source already put up are the answer a search that went quiet leaves.
|
|
188
|
+
if (published && error instanceof ProviderBusyError && error.cause instanceof OperationTimeoutError) return;
|
|
159
189
|
setRootProviderResults(tickerSearchFailureItems(error, searchQuery, localTickerSearchResultItems(searchQuery, { limit: 6 })));
|
|
160
190
|
setRootProviderResultsQuery(searchQuery);
|
|
161
191
|
} finally {
|
|
@@ -191,13 +221,14 @@ export function useRootProviderSearch(options: {
|
|
|
191
221
|
}
|
|
192
222
|
if (rootTickerSearchArg && rootProviderResultsQuery === rootTickerSearchArg && rootProviderResults) {
|
|
193
223
|
if (rootPlainTickerSearchArg) {
|
|
194
|
-
return mergePlainRootTickerResults(rootPlainTickerSearchArg, rootProviderResults, rootResultItems);
|
|
224
|
+
return mergePlainRootTickerResults(rootPlainTickerSearchArg, rootProviderResults, rootResultItems, reading);
|
|
195
225
|
}
|
|
196
226
|
return rootProviderResults;
|
|
197
227
|
}
|
|
198
228
|
return rootResultItems;
|
|
199
229
|
}, [
|
|
200
230
|
listingSuffix,
|
|
231
|
+
reading,
|
|
201
232
|
rootPlainTickerSearchArg,
|
|
202
233
|
rootProviderResults,
|
|
203
234
|
rootProviderResultsQuery,
|
|
@@ -8,6 +8,7 @@ import type { TickerRecord } from "../../../../types/ticker";
|
|
|
8
8
|
import { fuzzyFilter } from "../../../../utils/fuzzy-search";
|
|
9
9
|
import {
|
|
10
10
|
buildAssistResultItems,
|
|
11
|
+
isQuestionLike,
|
|
11
12
|
shouldShowAssistRow,
|
|
12
13
|
type AssistRowHandlers,
|
|
13
14
|
} from "../../assist/model";
|
|
@@ -66,6 +67,8 @@ export interface RootResultModelOptions {
|
|
|
66
67
|
rawInput?: string,
|
|
67
68
|
) => void | Promise<void>;
|
|
68
69
|
getAvailablePaneShortcutTemplates: (query: string) => PaneTemplateDef[];
|
|
70
|
+
/** The function code the query starts with, claimed by the parser or not (`leadingShortcutCode`). */
|
|
71
|
+
leadingShortcutCode?: string | null;
|
|
69
72
|
/** Looks a recorded `pane-template:<id>` entry back up among the templates the bar offers now. */
|
|
70
73
|
getRecentPaneTemplate?: (id: string, arg?: string) => PaneTemplateDef | undefined;
|
|
71
74
|
hasPaneSettings: (paneId: string) => boolean;
|
|
@@ -106,15 +109,21 @@ function isAssistSectionVisible(
|
|
|
106
109
|
query: string,
|
|
107
110
|
resultCount: number,
|
|
108
111
|
hasShortcutIntent: boolean,
|
|
112
|
+
leadingCode: string | null,
|
|
109
113
|
): boolean {
|
|
110
114
|
if (!query.trim()) return false;
|
|
111
115
|
if (assist.state.status !== "idle" && assist.state.query === query.trim()) return true;
|
|
112
116
|
// A resolved shortcut is the user speaking the command language, so nothing is
|
|
113
117
|
// asked of the AI, and a sign-up offer must not outrank that exact match.
|
|
114
118
|
if (hasShortcutIntent) return false;
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
119
|
+
if (!assist.enabled) {
|
|
120
|
+
// Text led by a function code (`MOST foo`) is a command gone wrong, not a
|
|
121
|
+
// question, so the sign-up offer would be the only row and take Enter.
|
|
122
|
+
if (leadingCode && !isQuestionLike(query)) return false;
|
|
123
|
+
// Signed out there is nothing to wait for, so the older heuristic still picks
|
|
124
|
+
// the queries worth offering a sign-up row for.
|
|
125
|
+
return shouldShowAssistRow({ query, resultCount });
|
|
126
|
+
}
|
|
118
127
|
return assist.auto;
|
|
119
128
|
}
|
|
120
129
|
|
|
@@ -235,6 +244,7 @@ export function buildRootResultModel(options: RootResultModelOptions): RootResul
|
|
|
235
244
|
getAvailablePaneShortcutTemplates,
|
|
236
245
|
getRecentPaneTemplate,
|
|
237
246
|
hasPaneSettings,
|
|
247
|
+
leadingShortcutCode = null,
|
|
238
248
|
localTickerSearchResultItems,
|
|
239
249
|
nonShortcutPaneTemplateItems,
|
|
240
250
|
openModeRoute,
|
|
@@ -268,6 +278,8 @@ export function buildRootResultModel(options: RootResultModelOptions): RootResul
|
|
|
268
278
|
const items: ResultItem[] = [];
|
|
269
279
|
const match = matchPrefix(rootQuery, availableCommands);
|
|
270
280
|
let initialIdx = 0;
|
|
281
|
+
// Off when the code's own rows only say why the argument opens nothing (`PF Nope`).
|
|
282
|
+
let shortcutRuns = true;
|
|
271
283
|
const shortcutItem = buildRootShortcutItem({
|
|
272
284
|
activeCollectionId,
|
|
273
285
|
activeTickerSymbol,
|
|
@@ -289,6 +301,7 @@ export function buildRootResultModel(options: RootResultModelOptions): RootResul
|
|
|
289
301
|
shortcutExecution: true,
|
|
290
302
|
}))
|
|
291
303
|
: [shortcutItem];
|
|
304
|
+
shortcutRuns = templateItems.some((item) => !item.disabled);
|
|
292
305
|
const relatedTemplateItems = rootQuery.trim().toUpperCase() === rootShortcutIntent.prefix
|
|
293
306
|
? paneShortcutItems({
|
|
294
307
|
filterQuery: rootQuery,
|
|
@@ -393,7 +406,7 @@ export function buildRootResultModel(options: RootResultModelOptions): RootResul
|
|
|
393
406
|
// Text the parser can run is text a key can run, so the offer sits under the
|
|
394
407
|
// match it would replay. Never the default selection: Enter still runs the
|
|
395
408
|
// command itself.
|
|
396
|
-
if (bindKey && shortcutClaimedQuery && rootShortcutIntent.kind !== "ambiguous") {
|
|
409
|
+
if (bindKey && shortcutClaimedQuery && shortcutRuns && rootShortcutIntent.kind !== "ambiguous") {
|
|
397
410
|
items.push(buildBindKeyItem(rootShortcutIntent, bindKey));
|
|
398
411
|
}
|
|
399
412
|
// A resolved prefix means the user is speaking the command language, so
|
|
@@ -414,6 +427,7 @@ export function buildRootResultModel(options: RootResultModelOptions): RootResul
|
|
|
414
427
|
rootQuery,
|
|
415
428
|
matchCount,
|
|
416
429
|
shortcutClaimedQuery,
|
|
430
|
+
leadingShortcutCode,
|
|
417
431
|
)
|
|
418
432
|
? buildAssistResultItems({ ...assist, query: rootQuery })
|
|
419
433
|
: [];
|
|
@@ -10,7 +10,8 @@ import { matchPrefix, type Command } from "../../commands/registry";
|
|
|
10
10
|
import type { ResultItem } from "../../list/model";
|
|
11
11
|
import type { CommandBarCategoryPriorities } from "../../view-model";
|
|
12
12
|
import type { CommandBarRoute } from "../../workflow/types";
|
|
13
|
-
import { normalizeCommandTickerSearchText } from "../ticker-search/results";
|
|
13
|
+
import { normalizeCommandTickerSearchText, readRootTickerQuery } from "../ticker-search/results";
|
|
14
|
+
import { endsInLegalForm, readNearMissListing, readTerminalListingCode } from "../../../../tickers/terminal-codes";
|
|
14
15
|
import { useTickerSearchRouteResults } from "../ticker-search/route";
|
|
15
16
|
import { buildRootResultModel, type RootResultModel } from "./results";
|
|
16
17
|
import { useRootProviderSearch } from "./provider-search";
|
|
@@ -52,6 +53,7 @@ interface UseCommandBarRootRuntimeOptions {
|
|
|
52
53
|
): void | Promise<void>;
|
|
53
54
|
getAvailablePaneShortcutTemplates(query: string): PaneTemplateDef[];
|
|
54
55
|
getRecentPaneTemplate?: (id: string, arg?: string) => PaneTemplateDef | undefined;
|
|
56
|
+
leadingShortcutCode?: string | null;
|
|
55
57
|
getTickers(): AppState["tickers"];
|
|
56
58
|
hasPaneSettings(paneId: string): boolean;
|
|
57
59
|
localTickerSearchResultItems(query?: string, options?: { category?: string; limit?: number }): ResultItem[];
|
|
@@ -114,6 +116,7 @@ export function useCommandBarRootRuntime({
|
|
|
114
116
|
executeCollectionCommand,
|
|
115
117
|
getAvailablePaneShortcutTemplates,
|
|
116
118
|
getRecentPaneTemplate,
|
|
119
|
+
leadingShortcutCode,
|
|
117
120
|
getTickers,
|
|
118
121
|
hasPaneSettings,
|
|
119
122
|
localTickerSearchResultItems,
|
|
@@ -196,6 +199,7 @@ export function useCommandBarRootRuntime({
|
|
|
196
199
|
getAvailablePaneShortcutTemplates,
|
|
197
200
|
getRecentPaneTemplate,
|
|
198
201
|
hasPaneSettings,
|
|
202
|
+
leadingShortcutCode,
|
|
199
203
|
localTickerSearchResultItems,
|
|
200
204
|
nonShortcutPaneTemplateItems,
|
|
201
205
|
openModeRoute,
|
|
@@ -229,6 +233,7 @@ export function useCommandBarRootRuntime({
|
|
|
229
233
|
getAvailablePaneShortcutTemplates,
|
|
230
234
|
getRecentPaneTemplate,
|
|
231
235
|
hasPaneSettings,
|
|
236
|
+
leadingShortcutCode,
|
|
232
237
|
localTickerSearchResultItems,
|
|
233
238
|
nonShortcutPaneTemplateItems,
|
|
234
239
|
openModeRoute,
|
|
@@ -246,8 +251,9 @@ export function useCommandBarRootRuntime({
|
|
|
246
251
|
tickerActionItems,
|
|
247
252
|
]);
|
|
248
253
|
|
|
254
|
+
// `DES VOD LN` searches the listing the code names, as Enter opens it; `DES SAP SE` the company.
|
|
249
255
|
const rootSecurityDescriptionArg = activeMatch?.command.id === "security-description" && activeMatch.arg.length >= 1
|
|
250
|
-
? activeMatch.arg
|
|
256
|
+
? (endsInLegalForm(activeMatch.arg) ? null : readTerminalListingCode(activeMatch.arg)?.key) ?? readNearMissListing(activeMatch.arg)?.symbol ?? activeMatch.arg
|
|
251
257
|
: null;
|
|
252
258
|
// Free text that no prefix claims also goes to symbol search, so "nvidia"
|
|
253
259
|
// finds NVDA without the backtick. Skipped when a local row already carries
|
|
@@ -257,10 +263,15 @@ export function useCommandBarRootRuntime({
|
|
|
257
263
|
if (currentRoute || activeMatch || rootShortcutIntent.kind !== "none") return null;
|
|
258
264
|
return listingChoiceQuery(rootQuery);
|
|
259
265
|
}, [activeMatch, currentRoute, rootQuery, rootShortcutIntent.kind]);
|
|
266
|
+
// `VOD LN`, `AAPL GP` and `700.HK` search the symbol they are read as, and the rows say which listing they name.
|
|
267
|
+
const rootTickerReading = useMemo(() => (
|
|
268
|
+
currentRoute || activeMatch || rootShortcutIntent.kind !== "none" || rootListingChoice ? null : readRootTickerQuery(rootQuery)
|
|
269
|
+
), [activeMatch, currentRoute, rootListingChoice, rootQuery, rootShortcutIntent.kind]);
|
|
260
270
|
const rootPlainTickerSearchArg = useMemo(() => {
|
|
261
271
|
if (currentRoute || activeMatch || rootShortcutIntent.kind !== "none") return null;
|
|
262
272
|
// An explicit venue choice also searches one-letter symbols and names shared with local actions.
|
|
263
273
|
if (rootListingChoice) return rootListingChoice.symbol;
|
|
274
|
+
if (rootTickerReading) return rootTickerReading.search;
|
|
264
275
|
const trimmed = rootQuery.trim();
|
|
265
276
|
const symbolQuery = symbolSearchQuery(trimmed);
|
|
266
277
|
if (symbolQuery.length < 2) return null;
|
|
@@ -277,7 +288,7 @@ export function useCommandBarRootRuntime({
|
|
|
277
288
|
&& normalizeCommandTickerSearchText(item.label) === normalizedQuery
|
|
278
289
|
));
|
|
279
290
|
return hasExactLocalRow ? null : symbolQuery;
|
|
280
|
-
}, [activeMatch, currentRoute, pluginInstallItem, rootListingChoice, rootQuery, rootResultModel.items, rootShortcutIntent.kind]);
|
|
291
|
+
}, [activeMatch, currentRoute, pluginInstallItem, rootListingChoice, rootQuery, rootResultModel.items, rootShortcutIntent.kind, rootTickerReading]);
|
|
281
292
|
const rootTickerSearchArg = rootSecurityDescriptionArg ?? rootPlainTickerSearchArg;
|
|
282
293
|
|
|
283
294
|
const {
|
|
@@ -297,6 +308,7 @@ export function useCommandBarRootRuntime({
|
|
|
297
308
|
readTickerSearchCache,
|
|
298
309
|
rootPlainTickerSearchArg,
|
|
299
310
|
listingSuffix: rootPlainTickerSearchArg && rootListingChoice ? rootListingChoice.suffix : null,
|
|
311
|
+
reading: rootPlainTickerSearchArg ? rootTickerReading : null,
|
|
300
312
|
rootResultItems: rootResultModel.items,
|
|
301
313
|
rootTickerSearchArg,
|
|
302
314
|
tickers: state.tickers,
|
|
@@ -9,6 +9,8 @@ import type { ResultItem } from "../../list/model";
|
|
|
9
9
|
|
|
10
10
|
const DEFAULT_MIN_QUERY_LENGTH = 3;
|
|
11
11
|
const DEFAULT_DEBOUNCE_MS = 300;
|
|
12
|
+
/** The corpus answers in well under a second; past this a provider is stuck, not slow. */
|
|
13
|
+
const DEFAULT_PROVIDER_TIMEOUT_MS = 8_000;
|
|
12
14
|
const PROVIDER_ROW_PREFIX = "search-provider:";
|
|
13
15
|
|
|
14
16
|
/** A row a plugin search provider contributed, as opposed to one the bar resolved itself. */
|
|
@@ -135,7 +137,9 @@ function useProviderMatchItems({
|
|
|
135
137
|
* Runs plugin search providers for the root list. Each provider debounces and
|
|
136
138
|
* aborts on its own, answers are memoized for the life of the bar, and rows are
|
|
137
139
|
* only ever added to the static list: a provider that fails, hangs, or answers
|
|
138
|
-
* late leaves what the command bar already resolved exactly as it was.
|
|
140
|
+
* late leaves what the command bar already resolved exactly as it was. Every
|
|
141
|
+
* provider settles: one that has not answered within its `timeoutMs` is
|
|
142
|
+
* aborted and counts as empty, so the bar never keeps searching for it.
|
|
139
143
|
* Providers that answer from memory skip all of that and come back as
|
|
140
144
|
* `providerMatchItems`, for the bar to rank with its own matches.
|
|
141
145
|
*/
|
|
@@ -235,9 +239,27 @@ export function useCommandBarSearchProviders({
|
|
|
235
239
|
const controller = new AbortController();
|
|
236
240
|
abortsRef.current.set(provider.id, controller);
|
|
237
241
|
void (async () => {
|
|
242
|
+
let deadline: ReturnType<typeof setTimeout> | undefined;
|
|
243
|
+
// Ends the wait on the deadline, and on an abort, so a provider that
|
|
244
|
+
// ignores its signal does not hold the request for the full deadline.
|
|
245
|
+
const timedOut = new Promise<null>((resolve) => {
|
|
246
|
+
deadline = setTimeout(() => resolve(null), provider.timeoutMs ?? DEFAULT_PROVIDER_TIMEOUT_MS);
|
|
247
|
+
controller.signal.addEventListener("abort", () => resolve(null), { once: true });
|
|
248
|
+
});
|
|
238
249
|
try {
|
|
239
|
-
const results = await
|
|
250
|
+
const results = await Promise.race([
|
|
251
|
+
provider.provide(trimmed, contextRef.current, controller.signal),
|
|
252
|
+
timedOut,
|
|
253
|
+
]);
|
|
240
254
|
if (controller.signal.aborted) return;
|
|
255
|
+
if (!results) {
|
|
256
|
+
// A provider that never answers is a provider with nothing to
|
|
257
|
+
// say: the bar stops searching for it, and what it sends later is
|
|
258
|
+
// dropped. Nothing is memoized, so a later visit to the text asks again.
|
|
259
|
+
controller.abort();
|
|
260
|
+
publish(provider, trimmed, []);
|
|
261
|
+
return;
|
|
262
|
+
}
|
|
241
263
|
cacheRef.current.set(`${provider.id}\n${trimmed}`, results);
|
|
242
264
|
publish(provider, trimmed, results);
|
|
243
265
|
} catch {
|
|
@@ -246,6 +268,7 @@ export function useCommandBarSearchProviders({
|
|
|
246
268
|
if (controller.signal.aborted) return;
|
|
247
269
|
publish(provider, trimmed, []);
|
|
248
270
|
} finally {
|
|
271
|
+
clearTimeout(deadline);
|
|
249
272
|
if (abortsRef.current.get(provider.id) === controller) {
|
|
250
273
|
abortsRef.current.delete(provider.id);
|
|
251
274
|
setLoading(provider.id, false);
|
|
@@ -26,6 +26,7 @@ interface PaneTemplateItemOptions {
|
|
|
26
26
|
|
|
27
27
|
interface RootSelectionCommandOptions {
|
|
28
28
|
activeTickerSymbol: string | null;
|
|
29
|
+
promptTickerSymbol?: string | null;
|
|
29
30
|
availableCommands: Command[];
|
|
30
31
|
createPaneTemplateItem: (template: PaneTemplateDef, options?: PaneTemplateItemOptions) => ResultItem;
|
|
31
32
|
createPluginCommandItem: (command: CommandDef, options?: { shortcutArg?: string }) => ResultItem;
|
|
@@ -40,7 +41,7 @@ interface RootSelectionCommandOptions {
|
|
|
40
41
|
openPaneTemplateWorkflow: (template: PaneTemplateDef, options?: { arg?: string }) => void;
|
|
41
42
|
pluginCommandResultItems: (command: CommandDef, shortcutArg: string) => ResultItem[];
|
|
42
43
|
runDirectCommand: (command: Command, arg: string) => void;
|
|
43
|
-
runSecurityDescriptionShortcut: (query?: string) => void | Promise<void>;
|
|
44
|
+
runSecurityDescriptionShortcut: (query?: string, options?: { forceNewPane?: boolean }) => void | Promise<void>;
|
|
44
45
|
setRootQuery: (query: string) => void;
|
|
45
46
|
startThemePicker: (arg: string) => void;
|
|
46
47
|
}
|
|
@@ -54,6 +55,7 @@ export function acceptRootShortcutTabAction(options: RootSelectionCommandOptions
|
|
|
54
55
|
pluginCommands: options.getAvailablePluginCommands(),
|
|
55
56
|
paneTemplates: options.getAvailablePaneShortcutTemplates(options.query),
|
|
56
57
|
activeTicker: options.activeTickerSymbol,
|
|
58
|
+
promptTicker: options.promptTickerSymbol,
|
|
57
59
|
});
|
|
58
60
|
if (intent.kind === "none") return false;
|
|
59
61
|
if (intent.kind === "inferred-complete" && intent.completionQuery) {
|
|
@@ -103,6 +105,7 @@ export function buildImmediateRootSelection(options: RootSelectionCommandOptions
|
|
|
103
105
|
pluginCommands: options.getAvailablePluginCommands(),
|
|
104
106
|
paneTemplates: options.getAvailablePaneShortcutTemplates(options.query),
|
|
105
107
|
activeTicker: options.activeTickerSymbol,
|
|
108
|
+
promptTicker: options.promptTickerSymbol,
|
|
106
109
|
});
|
|
107
110
|
if (intent.kind !== "none" && intent.source === "pane-template") {
|
|
108
111
|
return options.createPaneTemplateItem(intent.template, {
|
|
@@ -139,6 +142,7 @@ export function buildImmediateRootSelection(options: RootSelectionCommandOptions
|
|
|
139
142
|
right: match.command.prefix,
|
|
140
143
|
shortcutQuery: match.command.prefix,
|
|
141
144
|
action: () => { void options.runSecurityDescriptionShortcut(inferredTicker); },
|
|
145
|
+
secondaryAction: () => { void options.runSecurityDescriptionShortcut(inferredTicker, { forceNewPane: true }); },
|
|
142
146
|
};
|
|
143
147
|
}
|
|
144
148
|
return {
|
|
@@ -159,6 +163,7 @@ export function buildImmediateRootSelection(options: RootSelectionCommandOptions
|
|
|
159
163
|
right: match.command.prefix,
|
|
160
164
|
shortcutQuery: match.command.prefix,
|
|
161
165
|
action: () => { void options.runSecurityDescriptionShortcut(match.arg); },
|
|
166
|
+
secondaryAction: () => { void options.runSecurityDescriptionShortcut(match.arg, { forceNewPane: true }); },
|
|
162
167
|
};
|
|
163
168
|
}
|
|
164
169
|
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { AppState } from "../../../../state/app/context";
|
|
2
|
+
import { commandPromptTicker } from "../../../../layout/selected-ticker";
|
|
2
3
|
import { normalizeTickerInput } from "../../../../tickers/search";
|
|
3
4
|
import {
|
|
4
5
|
getCollectionCommandAction,
|
|
@@ -37,7 +38,9 @@ export function buildRootShortcutFeedback({
|
|
|
37
38
|
if (rootShortcutIntent.template.shortcut?.argOptional && !rootShortcutIntent.argText) {
|
|
38
39
|
return `Shortcut: ${rootShortcutIntent.label}`;
|
|
39
40
|
}
|
|
40
|
-
|
|
41
|
+
// Same ticker the intent inferred: the prompt's, so a linked desk counts.
|
|
42
|
+
const inferFrom = commandPromptTicker(state)?.symbol ?? activeTickerSymbol;
|
|
43
|
+
const symbol = normalizeTickerInput(inferFrom, rootShortcutIntent.argText);
|
|
41
44
|
if (symbol) {
|
|
42
45
|
return rootShortcutIntent.kind === "inferred-complete"
|
|
43
46
|
? `Shortcut: ${rootShortcutIntent.label} for ${symbol} · Tab to accept`
|
|
@@ -121,18 +121,42 @@ function buildShortcutCandidates(
|
|
|
121
121
|
].sort((a, b) => b.prefix.length - a.prefix.length);
|
|
122
122
|
}
|
|
123
123
|
|
|
124
|
+
/**
|
|
125
|
+
* The function code the text starts with, whatever follows it: `MOST foo`
|
|
126
|
+
* leads with MOST though MOST takes no argument. Null for any other text.
|
|
127
|
+
*/
|
|
128
|
+
export function leadingShortcutCode({
|
|
129
|
+
query,
|
|
130
|
+
commands,
|
|
131
|
+
pluginCommands = [],
|
|
132
|
+
paneTemplates,
|
|
133
|
+
}: {
|
|
134
|
+
query: string;
|
|
135
|
+
commands: Command[];
|
|
136
|
+
pluginCommands?: CommandDef[];
|
|
137
|
+
paneTemplates: PaneTemplateDef[];
|
|
138
|
+
}): string | null {
|
|
139
|
+
const first = query.trim().split(/\s+/)[0]?.toUpperCase();
|
|
140
|
+
if (!first) return null;
|
|
141
|
+
return buildShortcutCandidates(commands, pluginCommands, paneTemplates)
|
|
142
|
+
.find((candidate) => candidate.prefix === first)?.prefix ?? null;
|
|
143
|
+
}
|
|
144
|
+
|
|
124
145
|
export function parseRootShortcutIntent({
|
|
125
146
|
query,
|
|
126
147
|
commands,
|
|
127
148
|
pluginCommands = [],
|
|
128
149
|
paneTemplates,
|
|
129
150
|
activeTicker,
|
|
151
|
+
promptTicker = null,
|
|
130
152
|
}: {
|
|
131
153
|
query: string;
|
|
132
154
|
commands: Command[];
|
|
133
155
|
pluginCommands?: CommandDef[];
|
|
134
156
|
paneTemplates: PaneTemplateDef[];
|
|
135
157
|
activeTicker: string | null;
|
|
158
|
+
/** The command prompt's instrument, used when a pane requires a ticker and the focused pane has none. */
|
|
159
|
+
promptTicker?: string | null;
|
|
136
160
|
}): ShortcutIntent {
|
|
137
161
|
const trimmed = query.trim();
|
|
138
162
|
if (!trimmed) return { kind: "none" };
|
|
@@ -145,9 +169,12 @@ export function parseRootShortcutIntent({
|
|
|
145
169
|
if (!match) return { kind: "none" };
|
|
146
170
|
|
|
147
171
|
const argText = trimmed.slice(match.prefix.length).trim();
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
172
|
+
// A pane that requires a ticker takes the one already in the prompt. An
|
|
173
|
+
// optional ticker stays unbound, and other commands keep the focused ticker.
|
|
174
|
+
const inferFrom = match.source === "pane-template"
|
|
175
|
+
? (match.template?.shortcut?.argOptional ? null : (promptTicker ?? activeTicker))
|
|
176
|
+
: activeTicker;
|
|
177
|
+
const inferredArg = inferShortcutArg(match.argKind, inferFrom);
|
|
151
178
|
const completionQuery = inferredArg ? `${match.prefix} ${inferredArg}` : null;
|
|
152
179
|
|
|
153
180
|
let kind: Exclude<ShortcutIntentKind, "none">;
|