gloomberb 0.18.2 → 0.18.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -8
- package/README.zh-CN.md +11 -11
- package/bin/{gloomberb → gloom} +3 -1
- package/package.json +6 -2
- package/patches/electrobun@1.18.1.patch +106 -5
- package/src/account/checkout-handoff.tsx +225 -0
- package/src/account/device-signin-dialog.tsx +2 -2
- package/src/account/device-signin.ts +2 -2
- package/src/account/upgrade-dialog.tsx +1 -1
- package/src/api-client/askg.ts +2 -2
- package/src/api-client/auth.ts +2 -2
- package/src/api-client/central-bank-rates.ts +6 -0
- package/src/api-client/collections.ts +5 -1
- package/src/api-client/cot.ts +2 -0
- package/src/api-client/crypto-etf-flows.ts +37 -0
- package/src/api-client/crypto-markets.ts +60 -0
- package/src/api-client/data.ts +99 -5
- package/src/api-client/doe.ts +15 -0
- package/src/api-client/equity-screener.ts +28 -0
- package/src/api-client/exchange-announcements.ts +38 -0
- package/src/api-client/fund-facts.ts +39 -0
- package/src/api-client/futures-curve.ts +9 -1
- package/src/api-client/hiring.ts +301 -0
- package/src/api-client/index.ts +24 -5
- package/src/api-client/market-discovery.ts +14 -0
- package/src/api-client/members.ts +6 -0
- package/src/api-client/mna.ts +6 -0
- package/src/api-client/paths.ts +18 -1
- package/src/api-client/request.ts +26 -7
- package/src/api-client/short-side-publications.ts +37 -0
- package/src/api-client/socket.ts +64 -4
- package/src/api-client/swap-curve.ts +35 -0
- package/src/api-client/telemetry.ts +17 -0
- package/src/api-client/themes.ts +7 -1
- package/src/api-client/types.ts +90 -2
- package/src/app/global-shortcuts.ts +1 -16
- package/src/app/pane-runtime/plugin-bindings.ts +9 -2
- package/src/app/runtime/desktop-deeplink.ts +5 -5
- package/src/app/runtime/plugin-bindings.ts +2 -2
- package/src/app/runtime/startup.ts +13 -0
- package/src/app/runtime/update.ts +28 -8
- package/src/app/star-prompt/status-line.tsx +2 -2
- package/src/architecture/core-builtin-allowlist.json +5 -2
- package/src/architecture/pane-tabs-allowlist.json +65 -0
- package/src/architecture/ui-literals-allowlist.json +3 -3
- package/src/architecture/ui-tokens-allowlist.json +1 -1
- package/src/brokers/broker-portfolio-sync.ts +37 -0
- package/src/brokers/directory.ts +11 -0
- package/src/brokers/logos.ts +3 -1
- package/src/brokers/signed-in/adapter.ts +304 -26
- package/src/brokers/signed-in/client.ts +14 -2
- package/src/brokers/signed-in/connect.ts +10 -2
- package/src/brokers/sync-broker-instance.ts +9 -1
- package/src/capabilities/chart-series.ts +22 -6
- package/src/cli/bank-section.ts +1 -1
- package/src/cli/base-converter.ts +23 -14
- package/src/cli/central-bank-events.ts +1 -1
- package/src/cli/command-options.ts +59 -4
- package/src/cli/commands/api.ts +9 -6
- package/src/cli/commands/broker.ts +2 -2
- package/src/cli/commands/command-utils.ts +2 -2
- package/src/cli/commands/crypto-hints.ts +7 -20
- package/src/cli/commands/fred-series.ts +4 -2
- package/src/cli/commands/keybindings.ts +2 -2
- package/src/cli/commands/market.ts +1189 -296
- package/src/cli/commands/news-hints.ts +2 -2
- package/src/cli/commands/news-search.ts +59 -6
- package/src/cli/commands/options-leaps.ts +41 -26
- package/src/cli/commands/overview.ts +121 -48
- package/src/cli/commands/plugins.ts +9 -9
- package/src/cli/commands/remote.ts +13 -10
- package/src/cli/commands/search.ts +64 -44
- package/src/cli/commands/system.ts +27 -19
- package/src/cli/commands/themes.ts +1 -1
- package/src/cli/commands/ticker.ts +272 -70
- package/src/cli/context.ts +3 -2
- package/src/cli/desktop-pane-shot-view.ts +2 -2
- package/src/cli/desktop-pane-shot.ts +1 -1
- package/src/cli/earnings-calendar.ts +4 -4
- package/src/cli/entry.ts +18 -1
- package/src/cli/errors.ts +20 -2
- package/src/cli/exit-codes.ts +1 -1
- package/src/cli/export-source.ts +10 -4
- package/src/cli/freshness.ts +2 -8
- package/src/cli/fx-forward.ts +130 -0
- package/src/cli/fx-pair.ts +10 -9
- package/src/cli/glossary.ts +64 -20
- package/src/cli/help.ts +20 -14
- package/src/cli/history-export.ts +126 -0
- package/src/cli/history-rows.ts +196 -43
- package/src/cli/index-roots.ts +5 -45
- package/src/cli/index.ts +32 -18
- package/src/cli/issuer-membership.ts +103 -0
- package/src/cli/known-gaps.ts +118 -25
- package/src/cli/listing-arg.ts +315 -43
- package/src/cli/name-entries.ts +73 -22
- package/src/cli/native-smoke.ts +2 -0
- package/src/cli/not-a-ticker.ts +19 -9
- package/src/cli/opentui-libc.ts +5 -0
- package/src/cli/options.ts +12 -0
- package/src/cli/pane-functions/capabilities.ts +77 -20
- package/src/cli/pane-functions/catalog.ts +40 -23
- package/src/cli/pane-functions/discovery.ts +1 -1
- package/src/cli/pane-functions/dom.ts +12 -8
- package/src/cli/pane-functions/financial-ratio-shot.ts +2 -2
- package/src/cli/pane-functions/freshness.ts +174 -23
- package/src/cli/pane-functions/function-help.ts +66 -27
- package/src/cli/pane-functions/headless.ts +48 -16
- package/src/cli/pane-functions/index.ts +82 -21
- package/src/cli/pane-functions/options.ts +22 -2
- package/src/cli/pane-functions/report-notices.ts +12 -4
- package/src/cli/pane-functions/report.ts +5 -5
- package/src/cli/pane-functions/resolver.ts +65 -14
- package/src/cli/pane-functions/screenshot-assessment.ts +322 -0
- package/src/cli/pane-functions/screenshot-bridge.ts +152 -0
- package/src/cli/pane-functions/screenshot-chart-evidence.ts +396 -0
- package/src/cli/pane-functions/screenshot-data-evidence.ts +383 -0
- package/src/cli/pane-functions/screenshot-evidence.ts +1 -1
- package/src/cli/pane-functions/screenshot-payload.ts +453 -0
- package/src/cli/pane-functions/screenshot-render.ts +316 -0
- package/src/cli/pane-functions/screenshot-types.ts +162 -0
- package/src/cli/pane-functions/shot-options.ts +8 -3
- package/src/cli/peso-dollar-rates.ts +79 -0
- package/src/cli/quote-answer.ts +38 -3
- package/src/cli/report-tables.ts +190 -27
- package/src/cli/restore-plugins.ts +29 -14
- package/src/cli/result.ts +122 -25
- package/src/cli/series-search.ts +5 -5
- package/src/cli/statement-filings.ts +19 -0
- package/src/cli/suffixed-listing-rows.ts +49 -0
- package/src/cli/symbol-args.ts +50 -15
- package/src/cli/symbol-cells.ts +120 -0
- package/src/cli/symbol-list.ts +226 -60
- package/src/cli/symbol-rows.ts +131 -25
- package/src/cli/ticker-resolution.ts +108 -11
- package/src/cli/treasury-yields.ts +5 -5
- package/src/cli/types.ts +2 -0
- package/src/cli/uncovered-instrument.ts +3 -3
- package/src/cli/unknown-command.ts +6 -6
- package/src/components/chart/composite/chart-layout.ts +131 -0
- package/src/components/chart/composite/composite-chart.tsx +387 -21
- package/src/components/chart/composite/drawing-store.ts +26 -6
- package/src/components/chart/composite/interactions.ts +9 -3
- package/src/components/chart/composite/legend.tsx +75 -3
- package/src/components/chart/composite/levels.ts +5 -0
- package/src/components/chart/composite/panel-gestures.ts +41 -0
- package/src/components/chart/composite/panel-labels.ts +2 -1
- package/src/components/chart/composite/panel-surface.tsx +316 -11
- package/src/components/chart/composite/price-axis-labels.tsx +27 -3
- package/src/components/chart/composite/rasterizer.ts +44 -19
- package/src/components/chart/composite/scene.ts +16 -4
- package/src/components/chart/composite/text-renderer.ts +48 -21
- package/src/components/chart/composite/toolbar.tsx +52 -5
- package/src/components/chart/composite/types.ts +19 -0
- package/src/components/chart/composite/use-composite-chart-keyboard.ts +120 -13
- package/src/components/chart/composite/use-composite-value-scales.ts +44 -0
- package/src/components/chart/composite/use-composite-viewport.ts +12 -3
- package/src/components/chart/composite/value-scale.ts +149 -0
- package/src/components/chart/composite/volume-profile-paint.ts +6 -3
- package/src/components/chart/core/pointer.ts +2 -0
- package/src/components/chart-table/index.ts +2 -0
- package/src/components/chart-table/read.tsx +74 -0
- package/src/components/command-bar/commands/collection-list.ts +41 -19
- package/src/components/command-bar/commands/collection.ts +9 -3
- package/src/components/command-bar/commands/direct/index.ts +1 -1
- package/src/components/command-bar/commands/direct/runtime.ts +3 -2
- package/src/components/command-bar/pane-templates/items.ts +59 -6
- package/src/components/command-bar/pane-templates/workflow.ts +10 -1
- package/src/components/command-bar/routes/root/command-items.ts +32 -6
- package/src/components/command-bar/routes/root/plugin-install.ts +1 -1
- package/src/components/command-bar/routes/root/provider-search.ts +42 -11
- package/src/components/command-bar/routes/root/results.ts +18 -4
- package/src/components/command-bar/routes/root/runtime.ts +15 -3
- package/src/components/command-bar/routes/root/search-providers.ts +25 -2
- package/src/components/command-bar/routes/root/selection.ts +6 -1
- package/src/components/command-bar/routes/root/shortcut-feedback.ts +4 -1
- package/src/components/command-bar/routes/root/shortcuts.ts +30 -3
- package/src/components/command-bar/routes/ticker-search/results.ts +73 -4
- package/src/components/command-bar/selection-runtime.ts +50 -10
- package/src/components/command-bar/surface/index.tsx +24 -2
- package/src/components/command-bar/view-model.ts +7 -0
- package/src/components/command-bar/workflow/broker.ts +2 -2
- package/src/components/command-bar/workflow/collection-actions.ts +46 -7
- package/src/components/command-bar/workflow/collection-ticker.ts +32 -4
- package/src/components/command-bar/workflow/fields.ts +8 -2
- package/src/components/command-bar/workflow/ops.ts +18 -4
- package/src/components/command-bar/workflow/portfolio-position.ts +53 -4
- package/src/components/command-bar/workflow/submit.ts +3 -2
- package/src/components/command-bar/workflow/tickers.ts +5 -1
- package/src/components/company-logo.tsx +39 -0
- package/src/components/data-table/sections.ts +4 -2
- package/src/components/data-table/view.tsx +23 -3
- package/src/components/form-modal/confirm.tsx +2 -1
- package/src/components/form-modal/request.ts +5 -0
- package/src/components/form-modal/routes.ts +4 -1
- package/src/components/index.ts +13 -6
- package/src/components/layout/detached-pane-shell.tsx +1 -0
- package/src/components/layout/floating-pane.tsx +1 -0
- package/src/components/layout/header.tsx +234 -60
- package/src/components/layout/market-summary.ts +9 -6
- package/src/components/layout/pane/capture-status.ts +1 -1
- package/src/components/layout/pane/footer/model.ts +11 -5
- package/src/components/layout/pane/header.tsx +10 -3
- package/src/components/layout/pane/index.tsx +1 -0
- package/src/components/layout/pane/pane-tabs.tsx +9 -1
- package/src/components/layout/shell/chrome.ts +19 -6
- package/src/components/layout/shell/index.tsx +2 -1
- package/src/components/layout/shell/pane/layers.tsx +19 -1
- package/src/components/layout/status-bar.tsx +2 -2
- package/src/components/market-board/index.tsx +11 -3
- package/src/components/onboarding/onboarding-wizard.tsx +1 -0
- package/src/components/onboarding/portfolio-step/broker-setup-panel.tsx +2 -2
- package/src/components/onboarding/wizard-broker-sync.ts +4 -1
- package/src/components/pane-settings-dialog/desktop.tsx +20 -7
- package/src/components/pane-settings-dialog/tui.tsx +17 -9
- package/src/components/pane-settings-dialog/value.ts +8 -1
- package/src/components/pane-settings-dialog.tsx +44 -13
- package/src/components/sign-in-code-panel.tsx +27 -19
- package/src/components/ui/column-grid.tsx +48 -4
- package/src/components/ui/country-flag-art.tsx +180 -0
- package/src/components/ui/country-flag.tsx +118 -12
- package/src/components/ui/data-table/opentui/index.tsx +61 -2
- package/src/components/ui/data-table/opentui/model.ts +109 -2
- package/src/components/ui/data-table/types.ts +1 -1
- package/src/components/ui/display.tsx +5 -1
- package/src/components/ui/index.ts +3 -1
- package/src/components/ui/logo-mark.tsx +11 -2
- package/src/components/ui/query-bar.tsx +1 -1
- package/src/components/ui/row-notes.ts +79 -0
- package/src/components/ui/stat-grid.tsx +28 -3
- package/src/components/ui/status.tsx +3 -1
- package/src/core/app-services.ts +4 -0
- package/src/core/state/app/layout.ts +4 -4
- package/src/data/cached-query.ts +8 -1
- package/src/data/config/chart-settings.ts +3 -3
- package/src/data/config/home.ts +10 -2
- package/src/data/config/layout.ts +4 -1
- package/src/data/config/store/node.ts +4 -0
- package/src/data/config/store/normalize.ts +13 -3
- package/src/data/config/store/portfolio-as-of-column.ts +2 -2
- package/src/data/json-storage.ts +2 -0
- package/src/data/saved-copies.ts +84 -0
- package/src/docs/snapshot.json +65 -32
- package/src/i18n/es.ts +51 -12
- package/src/i18n/ja.ts +51 -12
- package/src/i18n/ko.ts +51 -12
- package/src/i18n/zh-cn.ts +51 -12
- package/src/i18n/zh-tw.ts +51 -12
- package/src/layout/desks.ts +1 -1
- package/src/layout/launch-layout.ts +1 -1
- package/src/layout/pane-manager/floating-actions.ts +5 -3
- package/src/layout/pane-manager/floating.ts +43 -1
- package/src/layout/pane-manager/index.ts +2 -0
- package/src/layout/selected-ticker.ts +74 -0
- package/src/market-data/depositary-pair.ts +251 -0
- package/src/market-data/futures-board.ts +1 -1
- package/src/market-data/futures-contract.ts +124 -40
- package/src/market-data/fx-closes.ts +17 -2
- package/src/market-data/hooks.tsx +19 -11
- package/src/market-data/market/change-basis.ts +49 -7
- package/src/market-data/market/freshness.ts +34 -5
- package/src/market-data/market/period-return.ts +163 -0
- package/src/market-data/market/trading-sessions.ts +13 -0
- package/src/market-data/market/year-to-date.ts +8 -13
- package/src/market-data/performance.ts +20 -14
- package/src/market-data/perpetual-premium.ts +32 -0
- package/src/market-data/published-apac-sessions.ts +2 -1
- package/src/market-data/published-futures-sessions.ts +69 -0
- package/src/market-data/quotes/contributions.ts +5 -1
- package/src/market-data/quotes/freshness.ts +42 -0
- package/src/market-data/quotes/intraday-bar.ts +37 -0
- package/src/market-data/quotes/regular-session-valuation.ts +13 -8
- package/src/market-data/quotes/resolution.ts +4 -2
- package/src/market-data/tax-equivalent.ts +1 -1
- package/src/market-data/ticker-price-returns.ts +3 -1
- package/src/news/aggregator.ts +5 -1
- package/src/news/news-model.ts +4 -0
- package/src/news/types.ts +11 -0
- package/src/notifications/app-notifier.ts +1 -1
- package/src/plugins/auto-update.ts +2 -2
- package/src/plugins/builtin/account-management/index.tsx +1 -0
- package/src/plugins/builtin/account-management/pane.tsx +9 -8
- package/src/plugins/builtin/alerts/alert-engine.ts +30 -18
- package/src/plugins/builtin/alerts/calendar-events.ts +378 -0
- package/src/plugins/builtin/alerts/cli.ts +485 -76
- package/src/plugins/builtin/alerts/command.ts +5 -10
- package/src/plugins/builtin/alerts/event-rows.ts +9 -5
- package/src/plugins/builtin/alerts/events-pane.tsx +71 -56
- package/src/plugins/builtin/alerts/events.ts +108 -5
- package/src/plugins/builtin/alerts/fired-log.ts +78 -0
- package/src/plugins/builtin/alerts/format.ts +2 -1
- package/src/plugins/builtin/alerts/headless.ts +100 -39
- package/src/plugins/builtin/alerts/history-pane.tsx +105 -62
- package/src/plugins/builtin/alerts/history-rows.ts +89 -0
- package/src/plugins/builtin/alerts/index.tsx +45 -18
- package/src/plugins/builtin/alerts/iv-level.ts +365 -0
- package/src/plugins/builtin/alerts/levels.ts +3 -3
- package/src/plugins/builtin/alerts/pane.tsx +97 -29
- package/src/plugins/builtin/alerts/price.ts +35 -0
- package/src/plugins/builtin/alerts/quotes.ts +24 -0
- package/src/plugins/builtin/alerts/research-builder.ts +84 -11
- package/src/plugins/builtin/alerts/research-rules.ts +77 -3
- package/src/plugins/builtin/alerts/scheduled-check.ts +206 -32
- package/src/plugins/builtin/alerts/scheduled-sources.ts +26 -3
- package/src/plugins/builtin/alerts/scheduled.ts +188 -29
- package/src/plugins/builtin/alerts/storage.ts +13 -10
- package/src/plugins/builtin/alerts/targets.ts +12 -3
- package/src/plugins/builtin/analytics/index.tsx +8 -2
- package/src/plugins/builtin/analytics/metrics.ts +1 -1
- package/src/plugins/builtin/analytics/risk-book.ts +215 -0
- package/src/plugins/builtin/analytics/risk-client.ts +13 -6
- package/src/plugins/builtin/analytics/risk-headless.ts +55 -21
- package/src/plugins/builtin/analytics/risk-math.ts +6 -3
- package/src/plugins/builtin/analytics/risk-model.ts +297 -104
- package/src/plugins/builtin/analytics/risk-options.ts +17 -2
- package/src/plugins/builtin/analytics/risk-pane.tsx +107 -43
- package/src/plugins/builtin/attention/pane.tsx +22 -16
- package/src/plugins/builtin/awards/headless.ts +7 -3
- package/src/plugins/builtin/awards/model.ts +18 -0
- package/src/plugins/builtin/awards/pane.tsx +12 -9
- package/src/plugins/builtin/backtest/export.ts +1 -1
- package/src/plugins/builtin/backtest/headless.ts +3 -3
- package/src/plugins/builtin/backtest/rules.ts +41 -5
- package/src/plugins/builtin/broker-manager/add-flow.tsx +12 -7
- package/src/plugins/builtin/broker-manager/detail.tsx +47 -19
- package/src/plugins/builtin/broker-manager/footer.ts +27 -11
- package/src/plugins/builtin/broker-manager/index.tsx +21 -12
- package/src/plugins/builtin/broker-manager/keyboard.ts +1 -1
- package/src/plugins/builtin/broker-manager/model.ts +12 -2
- package/src/plugins/builtin/broker-manager/pane-actions.tsx +183 -57
- package/src/plugins/builtin/broker-manager/table.ts +28 -12
- package/src/plugins/builtin/broker-trading/account-picker.tsx +2 -1
- package/src/plugins/builtin/broker-trading/chart-levels.ts +82 -13
- package/src/plugins/builtin/broker-trading/controller.ts +45 -13
- package/src/plugins/builtin/broker-trading/dock.tsx +24 -4
- package/src/plugins/builtin/broker-trading/headless.ts +2 -1
- package/src/plugins/builtin/broker-trading/index.tsx +7 -1
- package/src/plugins/builtin/broker-trading/linked-orders.ts +148 -0
- package/src/plugins/builtin/broker-trading/order-feed.ts +75 -7
- package/src/plugins/builtin/broker-trading/orders.tsx +109 -31
- package/src/plugins/builtin/broker-trading/overview-orders.tsx +9 -3
- package/src/plugins/builtin/broker-trading/pane-model.ts +30 -2
- package/src/plugins/builtin/broker-trading/pane.tsx +115 -26
- package/src/plugins/builtin/broker-trading/ticket-parts.tsx +36 -7
- package/src/plugins/builtin/broker-trading/ticket.tsx +122 -36
- package/src/plugins/builtin/buildout/cells.tsx +4 -0
- package/src/plugins/builtin/buildout/detail/index.tsx +5 -1
- package/src/plugins/builtin/buildout/detail/ui.tsx +7 -4
- package/src/plugins/builtin/buildout/pane/index.tsx +34 -18
- package/src/plugins/builtin/buildout/pane/status.tsx +0 -4
- package/src/plugins/builtin/builtin-plugin-meta.ts +1 -1
- package/src/plugins/builtin/catalysts/client.ts +2 -2
- package/src/plugins/builtin/catalysts/detail.tsx +3 -2
- package/src/plugins/builtin/catalysts/index.tsx +1 -1
- package/src/plugins/builtin/catalysts/model.ts +49 -4
- package/src/plugins/builtin/catalysts/pane.tsx +9 -11
- package/src/plugins/builtin/central-bank-rates/client.ts +5 -0
- package/src/plugins/builtin/central-bank-rates/headless.ts +36 -10
- package/src/plugins/builtin/central-bank-rates/model.ts +33 -8
- package/src/plugins/builtin/changelog/index.tsx +1 -0
- package/src/plugins/builtin/chart-composer/catalog-inventory.ts +1 -0
- package/src/plugins/builtin/chart-composer/chart-spec-edit.ts +2 -1
- package/src/plugins/builtin/chart-composer/chart-spec.ts +7 -0
- package/src/plugins/builtin/chart-composer/cli-options.ts +2 -5
- package/src/plugins/builtin/chart-composer/data-catalog-pane.tsx +2 -1
- package/src/plugins/builtin/chart-composer/editor/controller.ts +2 -0
- package/src/plugins/builtin/chart-composer/editor.tsx +4 -1
- package/src/plugins/builtin/chart-composer/headless-schema.ts +28 -26
- package/src/plugins/builtin/chart-composer/headless.ts +253 -35
- package/src/plugins/builtin/chart-composer/index.tsx +12 -2
- package/src/plugins/builtin/chart-composer/leverage-overlay.ts +142 -0
- package/src/plugins/builtin/chart-composer/pane.tsx +128 -28
- package/src/plugins/builtin/chart-composer/series-catalog.ts +1 -0
- package/src/plugins/builtin/chart-composer/series-expression.ts +65 -6
- package/src/plugins/builtin/chart-composer/session-history.ts +15 -21
- package/src/plugins/builtin/chart-composer/session-range.ts +4 -2
- package/src/plugins/builtin/chart-composer/settings.ts +31 -19
- package/src/plugins/builtin/chart-composer/use-series-catalog.ts +5 -6
- package/src/plugins/builtin/chart-composer/viewport-labels.ts +18 -8
- package/src/plugins/builtin/chat/attachments/model.ts +3 -1
- package/src/plugins/builtin/chat/content/index.tsx +1 -1
- package/src/plugins/builtin/chat/pane-links/open.ts +1 -1
- package/src/plugins/builtin/chat/people.ts +1 -1
- package/src/plugins/builtin/clinical-trials/client.ts +5 -2
- package/src/plugins/builtin/clinical-trials/model.ts +13 -4
- package/src/plugins/builtin/clinical-trials/pane.tsx +32 -12
- package/src/plugins/builtin/clinical-trials/ticker-sponsor.ts +17 -0
- package/src/plugins/builtin/cloud/askg/controller.ts +1 -1
- package/src/plugins/builtin/cloud/askg/lock-note.ts +1 -1
- package/src/plugins/builtin/cloud/askg/tool-display.ts +1 -1
- package/src/plugins/builtin/cloud/auth-commands.ts +3 -3
- package/src/plugins/builtin/cloud/team/pane-sections.tsx +105 -47
- package/src/plugins/builtin/cloud/team/pane-ui.tsx +42 -4
- package/src/plugins/builtin/cloud/team/pane.tsx +204 -64
- package/src/plugins/builtin/cloud/thesis/store.ts +45 -22
- package/src/plugins/builtin/cloud-tweets/registration.ts +1 -0
- package/src/plugins/builtin/commodities-energy/index.tsx +29 -2
- package/src/plugins/builtin/commodities-energy/view-state.ts +2 -0
- package/src/plugins/builtin/commodity-balances/pane.tsx +14 -8
- package/src/plugins/builtin/company-attention/app-rank.tsx +11 -10
- package/src/plugins/builtin/company-attention/building-model.ts +222 -0
- package/src/plugins/builtin/company-attention/building.tsx +172 -0
- package/src/plugins/builtin/company-attention/client.ts +117 -1
- package/src/plugins/builtin/company-attention/evidence.ts +16 -3
- package/src/plugins/builtin/company-attention/headless.ts +101 -5
- package/src/plugins/builtin/company-attention/index.tsx +6 -3
- package/src/plugins/builtin/company-attention/model.ts +33 -7
- package/src/plugins/builtin/company-attention/moves-model.ts +253 -0
- package/src/plugins/builtin/company-attention/moves.tsx +159 -0
- package/src/plugins/builtin/company-attention/pane.tsx +89 -31
- package/src/plugins/builtin/company-attention/signals-model.ts +229 -0
- package/src/plugins/builtin/company-attention/signals.tsx +160 -0
- package/src/plugins/builtin/company-kpis/headless.ts +3 -2
- package/src/plugins/builtin/company-kpis/model.ts +2 -2
- package/src/plugins/builtin/company-kpis/pane.tsx +5 -4
- package/src/plugins/builtin/composite-plugins.ts +2 -1
- package/src/plugins/builtin/congress-trades/headless.ts +1 -1
- package/src/plugins/builtin/connections/index.ts +1 -0
- package/src/plugins/builtin/correlation/headless-schema.ts +3 -2
- package/src/plugins/builtin/correlation/headless.ts +7 -4
- package/src/plugins/builtin/correlation/relationship/model.ts +1 -0
- package/src/plugins/builtin/correlation/settings.ts +1 -0
- package/src/plugins/builtin/cot/headless.ts +28 -6
- package/src/plugins/builtin/cot/model.ts +12 -0
- package/src/plugins/builtin/cot/pane.tsx +7 -5
- package/src/plugins/builtin/cpi/headless.ts +5 -1
- package/src/plugins/builtin/cpi/pane.tsx +11 -9
- package/src/plugins/builtin/credit-boards/model.ts +2 -0
- package/src/plugins/builtin/credit-documents/headless.ts +1 -1
- package/src/plugins/builtin/credit-documents/pane.tsx +8 -7
- package/src/plugins/builtin/crypto-board/client.ts +86 -0
- package/src/plugins/builtin/crypto-board/defi-view.tsx +218 -0
- package/src/plugins/builtin/crypto-board/defi.ts +239 -0
- package/src/plugins/builtin/crypto-board/headless.ts +117 -6
- package/src/plugins/builtin/crypto-board/index.tsx +8 -3
- package/src/plugins/builtin/crypto-board/model.ts +40 -8
- package/src/plugins/builtin/crypto-board/pane.tsx +55 -21
- package/src/plugins/builtin/crypto-board/series.ts +19 -1
- package/src/plugins/builtin/crypto-etf-flows/client.ts +60 -0
- package/src/plugins/builtin/crypto-etf-flows/headless.ts +132 -0
- package/src/plugins/builtin/crypto-etf-flows/index.tsx +44 -0
- package/src/plugins/builtin/crypto-etf-flows/model.ts +121 -0
- package/src/plugins/builtin/crypto-etf-flows/pane.tsx +193 -0
- package/src/plugins/builtin/debt-maturities/pane.tsx +4 -3
- package/src/plugins/builtin/debug/index.tsx +1 -0
- package/src/plugins/builtin/dividend-yield/index.tsx +1 -1
- package/src/plugins/builtin/docs/index.tsx +1 -1
- package/src/plugins/builtin/docs/pane.tsx +2 -2
- package/src/plugins/builtin/docs/targets.ts +1 -1
- package/src/plugins/builtin/doe/client.ts +5 -1
- package/src/plugins/builtin/doe/headless.ts +12 -6
- package/src/plugins/builtin/doe/model.ts +43 -6
- package/src/plugins/builtin/doe/pane.tsx +19 -12
- package/src/plugins/builtin/earnings/board-model.ts +13 -6
- package/src/plugins/builtin/earnings/board-table.ts +4 -1
- package/src/plugins/builtin/earnings/board.tsx +253 -50
- package/src/plugins/builtin/earnings/calendar-model.ts +188 -0
- package/src/plugins/builtin/earnings/calendar.tsx +338 -0
- package/src/plugins/builtin/earnings/client.ts +4 -3
- package/src/plugins/builtin/earnings/headless.ts +53 -15
- package/src/plugins/builtin/earnings/history-model.ts +53 -36
- package/src/plugins/builtin/earnings/index.tsx +15 -22
- package/src/plugins/builtin/earnings/model.ts +17 -12
- package/src/plugins/builtin/earnings/scope.ts +89 -0
- package/src/plugins/builtin/earnings-calls/calendar.tsx +310 -0
- package/src/plugins/builtin/earnings-calls/data.ts +146 -2
- package/src/plugins/builtin/earnings-calls/headless.ts +151 -9
- package/src/plugins/builtin/earnings-calls/index.tsx +3 -3
- package/src/plugins/builtin/earnings-calls/lock-note.ts +1 -1
- package/src/plugins/builtin/earnings-calls/pane.tsx +149 -31
- package/src/plugins/builtin/earnings-calls/upcoming.ts +195 -0
- package/src/plugins/builtin/earnings-ripple/pane.tsx +10 -5
- package/src/plugins/builtin/econ/calendar-model.ts +132 -20
- package/src/plugins/builtin/econ/detail-view.tsx +48 -10
- package/src/plugins/builtin/econ/fred-catalog.ts +23 -6
- package/src/plugins/builtin/econ/fred-series-map.ts +4 -0
- package/src/plugins/builtin/econ/index.tsx +112 -25
- package/src/plugins/builtin/econ/print-watch.ts +2 -1
- package/src/plugins/builtin/econ/types.ts +32 -1
- package/src/plugins/builtin/econ-statistics/client.ts +16 -3
- package/src/plugins/builtin/econ-statistics/defs.ts +4 -0
- package/src/plugins/builtin/econ-statistics/detail.tsx +2 -2
- package/src/plugins/builtin/econ-statistics/headless.ts +13 -2
- package/src/plugins/builtin/econ-statistics/index.tsx +3 -3
- package/src/plugins/builtin/econ-statistics/pane.tsx +2 -1
- package/src/plugins/builtin/econ-statistics/stats.ts +103 -0
- package/src/plugins/builtin/econ-statistics/view.ts +16 -1
- package/src/plugins/builtin/equity-screener/client.ts +21 -3
- package/src/plugins/builtin/equity-screener/headless.ts +77 -5
- package/src/plugins/builtin/equity-screener/live.ts +1 -1
- package/src/plugins/builtin/equity-screener/model.ts +34 -0
- package/src/plugins/builtin/equity-screener/pane.tsx +148 -106
- package/src/plugins/builtin/equity-screener/screen-check.ts +90 -0
- package/src/plugins/builtin/equity-screener/ticker-check.tsx +148 -0
- package/src/plugins/builtin/estimate-revisions/headless.ts +3 -1
- package/src/plugins/builtin/estimate-revisions/lock-note.ts +3 -3
- package/src/plugins/builtin/estimate-revisions/model.ts +8 -10
- package/src/plugins/builtin/exposure/headless.ts +51 -6
- package/src/plugins/builtin/exposure/index.tsx +28 -2
- package/src/plugins/builtin/exposure/model.ts +7 -0
- package/src/plugins/builtin/exposure/pane.tsx +16 -10
- package/src/plugins/builtin/fear-greed/index.tsx +1 -1
- package/src/plugins/builtin/filing-events/index.tsx +1 -1
- package/src/plugins/builtin/futures/model.ts +10 -9
- package/src/plugins/builtin/futures/returns.ts +8 -36
- package/src/plugins/builtin/futures/table.tsx +1 -1
- package/src/plugins/builtin/futures-curve/client.ts +40 -9
- package/src/plugins/builtin/futures-curve/headless.ts +39 -17
- package/src/plugins/builtin/futures-curve/model.ts +258 -69
- package/src/plugins/builtin/futures-curve/pane.tsx +46 -17
- package/src/plugins/builtin/fx-matrix/client.ts +15 -8
- package/src/plugins/builtin/fx-matrix/headless.ts +32 -14
- package/src/plugins/builtin/fx-matrix/index.tsx +13 -11
- package/src/plugins/builtin/fx-matrix/live-legs.ts +22 -0
- package/src/plugins/builtin/fx-matrix/settings.ts +2 -1
- package/src/plugins/builtin/gpu/board.tsx +4 -1
- package/src/plugins/builtin/gpu/changes.tsx +10 -10
- package/src/plugins/builtin/gpu/equities.tsx +4 -1
- package/src/plugins/builtin/gpu/headless.ts +9 -4
- package/src/plugins/builtin/gpu/history.tsx +4 -2
- package/src/plugins/builtin/gpu/pane.tsx +5 -3
- package/src/plugins/builtin/help/index.tsx +13 -3
- package/src/plugins/builtin/holders/beneficial-model.ts +8 -11
- package/src/plugins/builtin/holders/beneficial-report.ts +6 -5
- package/src/plugins/builtin/holders/beneficial-view.tsx +7 -3
- package/src/plugins/builtin/holders/client.ts +15 -2
- package/src/plugins/builtin/holders/format.ts +28 -17
- package/src/plugins/builtin/holders/headless.ts +48 -8
- package/src/plugins/builtin/holders/index-holders.ts +264 -0
- package/src/plugins/builtin/holders/pane.tsx +79 -15
- package/src/plugins/builtin/holders/report-rows.ts +35 -7
- package/src/plugins/builtin/holders/table-model.ts +2 -1
- package/src/plugins/builtin/holders/thirteenf-match.ts +3 -1
- package/src/plugins/builtin/holders/treemap.tsx +2 -2
- package/src/plugins/builtin/insider/base-values.ts +11 -7
- package/src/plugins/builtin/insider/client.ts +3 -0
- package/src/plugins/builtin/insider/headless.ts +20 -7
- package/src/plugins/builtin/insider/index.tsx +17 -8
- package/src/plugins/builtin/insider/issuer.ts +34 -4
- package/src/plugins/builtin/insider/signals-client.ts +3 -3
- package/src/plugins/builtin/insider/signals.tsx +1 -1
- package/src/plugins/builtin/insider/table-model.ts +35 -13
- package/src/plugins/builtin/insider/table.tsx +5 -2
- package/src/plugins/builtin/ipo-calendar/pane.tsx +7 -4
- package/src/plugins/builtin/iv-history/client.ts +20 -0
- package/src/plugins/builtin/iv-history/events.ts +145 -0
- package/src/plugins/builtin/iv-history/format.ts +3 -0
- package/src/plugins/builtin/iv-history/headless.ts +91 -7
- package/src/plugins/builtin/iv-history/index.tsx +1 -1
- package/src/plugins/builtin/iv-history/model.ts +13 -4
- package/src/plugins/builtin/iv-history/series.ts +3 -1
- package/src/plugins/builtin/jobs/lock-note.ts +1 -1
- package/src/plugins/builtin/jobs/model.ts +4 -15
- package/src/plugins/builtin/jobs/pane.tsx +7 -5
- package/src/plugins/builtin/jobs/share-bars.tsx +11 -5
- package/src/plugins/builtin/jodi/pane.tsx +14 -8
- package/src/plugins/builtin/layout-manager/index.tsx +1 -0
- package/src/plugins/builtin/macro-day/headless.ts +20 -7
- package/src/plugins/builtin/macro-day/index.tsx +3 -2
- package/src/plugins/builtin/macro-day/model.ts +29 -8
- package/src/plugins/builtin/macro-day/pane.tsx +46 -10
- package/src/plugins/builtin/macro-day/releases.ts +55 -13
- package/src/plugins/builtin/market-heatmap/data.ts +9 -2
- package/src/plugins/builtin/market-heatmap/evidence.ts +1 -1
- package/src/plugins/builtin/market-heatmap/headless.ts +9 -6
- package/src/plugins/builtin/market-heatmap/index.tsx +3 -3
- package/src/plugins/builtin/market-heatmap/model.ts +10 -7
- package/src/plugins/builtin/market-movers/client.ts +36 -21
- package/src/plugins/builtin/market-movers/headless.ts +8 -2
- package/src/plugins/builtin/market-movers/index.tsx +16 -10
- package/src/plugins/builtin/market-movers/screener.ts +33 -11
- package/src/plugins/builtin/market-movers/session-body.tsx +4 -2
- package/src/plugins/builtin/market-movers/session-table.ts +4 -2
- package/src/plugins/builtin/market-movers/table.ts +4 -1
- package/src/plugins/builtin/market-valuation/headless.ts +2 -0
- package/src/plugins/builtin/market-valuation/view.ts +5 -0
- package/src/plugins/builtin/members/headless.ts +6 -5
- package/src/plugins/builtin/members/pane.tsx +11 -4
- package/src/plugins/builtin/mna/client.ts +1 -0
- package/src/plugins/builtin/mna/detail.tsx +20 -32
- package/src/plugins/builtin/mna/distress/detail.tsx +16 -4
- package/src/plugins/builtin/mna/distress/model.ts +3 -2
- package/src/plugins/builtin/mna/distress/pane.tsx +7 -4
- package/src/plugins/builtin/mna/headless.ts +6 -13
- package/src/plugins/builtin/mna/model.ts +93 -15
- package/src/plugins/builtin/mna/pane.tsx +5 -4
- package/src/plugins/builtin/news/headless.ts +12 -6
- package/src/plugins/builtin/news/index.tsx +10 -1
- package/src/plugins/builtin/news/wire/index.tsx +3 -2
- package/src/plugins/builtin/news/wire/news/command-bar-search.ts +26 -10
- package/src/plugins/builtin/news/wire/news/query-presets.ts +6 -2
- package/src/plugins/builtin/news/wire/rss/cli.ts +3 -3
- package/src/plugins/builtin/notes/cli.ts +50 -15
- package/src/plugins/builtin/notes/export.ts +17 -6
- package/src/plugins/builtin/notes/files.ts +16 -5
- package/src/plugins/builtin/openfda/pane.tsx +1 -1
- package/src/plugins/builtin/options/carry.ts +2 -2
- package/src/plugins/builtin/options/enrichment-model.ts +10 -9
- package/src/plugins/builtin/options/index.tsx +1 -1
- package/src/plugins/builtin/options/model-spot.ts +70 -4
- package/src/plugins/builtin/options/view.tsx +51 -23
- package/src/plugins/builtin/options-calculator/headless.ts +46 -7
- package/src/plugins/builtin/options-calculator/pane.tsx +3 -2
- package/src/plugins/builtin/options-positioning/headless.ts +11 -3
- package/src/plugins/builtin/options-positioning/model.ts +24 -0
- package/src/plugins/builtin/options-positioning/pane.tsx +10 -12
- package/src/plugins/builtin/options-scenario/client.ts +142 -29
- package/src/plugins/builtin/options-scenario/collar.ts +8 -6
- package/src/plugins/builtin/options-scenario/csp-screen-headless.ts +127 -0
- package/src/plugins/builtin/options-scenario/csp-screen-pane.tsx +165 -0
- package/src/plugins/builtin/options-scenario/csp-screen.ts +258 -0
- package/src/plugins/builtin/options-scenario/csp.ts +101 -21
- package/src/plugins/builtin/options-scenario/headless.ts +49 -21
- package/src/plugins/builtin/options-scenario/hedge.ts +20 -14
- package/src/plugins/builtin/options-scenario/index.tsx +28 -3
- package/src/plugins/builtin/options-scenario/model.ts +13 -0
- package/src/plugins/builtin/options-scenario/pane.tsx +22 -10
- package/src/plugins/builtin/perps/equity-row.tsx +11 -3
- package/src/plugins/builtin/perps/freshness.ts +8 -5
- package/src/plugins/builtin/perps/headless.ts +3 -1
- package/src/plugins/builtin/perps/list-perpetuals.ts +25 -4
- package/src/plugins/builtin/perps/live-rows.ts +161 -0
- package/src/plugins/builtin/perps/markets-section.tsx +154 -0
- package/src/plugins/builtin/perps/pane.tsx +36 -17
- package/src/plugins/builtin/perps/venue-markets.ts +96 -0
- package/src/plugins/builtin/plugin-marketplace/index.tsx +2 -1
- package/src/plugins/builtin/plugin-marketplace/pane.tsx +145 -60
- package/src/plugins/builtin/portfolio-list/cli/bulk-symbols.ts +78 -27
- package/src/plugins/builtin/portfolio-list/cli/portfolio-command.ts +158 -141
- package/src/plugins/builtin/portfolio-list/cli/render.ts +49 -20
- package/src/plugins/builtin/portfolio-list/cli/shared.ts +3 -3
- package/src/plugins/builtin/portfolio-list/cli/watchlist-command.ts +29 -24
- package/src/plugins/builtin/portfolio-list/headless.ts +6 -3
- package/src/plugins/builtin/portfolio-list/income.ts +13 -2
- package/src/plugins/builtin/portfolio-list/index.tsx +9 -2
- package/src/plugins/builtin/portfolio-list/pane/index.tsx +21 -8
- package/src/plugins/builtin/portfolio-list/pane/purchase-date-fx.ts +46 -0
- package/src/plugins/builtin/portfolio-list/summary/live-accounts.ts +16 -9
- package/src/plugins/builtin/portfolio-list/summary/totals.ts +2 -15
- package/src/plugins/builtin/power/client.ts +6 -3
- package/src/plugins/builtin/power/evidence.ts +22 -7
- package/src/plugins/builtin/power/gas.tsx +5 -1
- package/src/plugins/builtin/power/pane.tsx +44 -32
- package/src/plugins/builtin/power/prices.tsx +10 -3
- package/src/plugins/builtin/research/analyst-headless.ts +25 -8
- package/src/plugins/builtin/research/analyst-model.ts +68 -3
- package/src/plugins/builtin/research/corporate-actions-pane.tsx +63 -14
- package/src/plugins/builtin/research/event-model.ts +3 -1
- package/src/plugins/builtin/research/event-sources.ts +12 -4
- package/src/plugins/builtin/research/index.tsx +2 -1
- package/src/plugins/builtin/research/relative-valuation-basis.ts +58 -0
- package/src/plugins/builtin/research/relative-valuation-columns.ts +31 -2
- package/src/plugins/builtin/research/relative-valuation-currency.ts +12 -5
- package/src/plugins/builtin/research/relative-valuation-headless.ts +84 -26
- package/src/plugins/builtin/research/relative-valuation-model.ts +88 -19
- package/src/plugins/builtin/research/relative-valuation-pane.tsx +76 -9
- package/src/plugins/builtin/research/relative-valuation-peers.ts +1 -1
- package/src/plugins/builtin/reverse-dcf/client.ts +2 -1
- package/src/plugins/builtin/reverse-dcf/model.ts +10 -5
- package/src/plugins/builtin/risk-factors/index.tsx +2 -2
- package/src/plugins/builtin/scanner/lock-note.ts +1 -1
- package/src/plugins/builtin/seasonality/client.ts +2 -1
- package/src/plugins/builtin/sec/forms.ts +13 -0
- package/src/plugins/builtin/sec/fund-abroad.ts +32 -0
- package/src/plugins/builtin/sec/fund-facts.ts +68 -8
- package/src/plugins/builtin/sec/headless.ts +85 -8
- package/src/plugins/builtin/sec/index.tsx +58 -12
- package/src/plugins/builtin/sectors/client.ts +6 -4
- package/src/plugins/builtin/sectors/sector-model.ts +11 -15
- package/src/plugins/builtin/series-inventory.ts +2 -0
- package/src/plugins/builtin/shared/broker-reconnect.ts +107 -22
- package/src/plugins/builtin/shared/cloud-resource.ts +15 -2
- package/src/plugins/builtin/shared/cloud-upgrade.ts +34 -6
- package/src/plugins/builtin/shared/earnings-calendar.ts +375 -0
- package/src/plugins/builtin/{earnings/estimate-basis.ts → shared/earnings-estimate-basis.ts} +1 -1
- package/src/plugins/builtin/shared/earnings-report.ts +3 -3
- package/src/plugins/builtin/shared/fx-rate-freshness.ts +23 -1
- package/src/plugins/builtin/shared/job-posting.ts +129 -0
- package/src/plugins/builtin/shared/pro-lock-note.ts +3 -3
- package/src/plugins/builtin/shared/report-freshness.ts +3 -0
- package/src/plugins/builtin/shared/research-trading.tsx +23 -0
- package/src/plugins/builtin/shared/series-cache.ts +2 -0
- package/src/plugins/builtin/shared/series-list-detail.tsx +3 -1
- package/src/plugins/builtin/shared/ticker-surface.ts +2 -1
- package/src/plugins/builtin/shared/volatility/options.ts +2 -1
- package/src/plugins/builtin/short-interest/client.ts +2 -0
- package/src/plugins/builtin/short-interest/headless.ts +41 -12
- package/src/plugins/builtin/short-interest/index.tsx +23 -1
- package/src/plugins/builtin/short-interest/model.ts +70 -19
- package/src/plugins/builtin/short-interest/pane.tsx +19 -2
- package/src/plugins/builtin/short-interest/publications-client.ts +82 -0
- package/src/plugins/builtin/short-interest/publications-headless.ts +29 -0
- package/src/plugins/builtin/short-interest/publications-model.ts +50 -0
- package/src/plugins/builtin/short-interest/publications-pane.tsx +66 -0
- package/src/plugins/builtin/short-interest/schedule.ts +35 -2
- package/src/plugins/builtin/short-interest/surface.tsx +11 -4
- package/src/plugins/builtin/short-interest/types.ts +9 -0
- package/src/plugins/builtin/short-interest/watch-client.ts +14 -8
- package/src/plugins/builtin/short-interest/watch-model.ts +12 -25
- package/src/plugins/builtin/short-interest/watch-pane.tsx +5 -1
- package/src/plugins/builtin/social-mentions/client.ts +2 -1
- package/src/plugins/builtin/supply-chain/flow.tsx +33 -9
- package/src/plugins/builtin/supply-chain/model.ts +51 -3
- package/src/plugins/builtin/supply-chain/pane.tsx +78 -39
- package/src/plugins/builtin/supply-chain/row-evidence.tsx +1 -1
- package/src/plugins/builtin/themes/headless.ts +8 -5
- package/src/plugins/builtin/themes/model.ts +14 -4
- package/src/plugins/builtin/themes/pane.tsx +24 -5
- package/src/plugins/builtin/thirteenf/headless.ts +5 -5
- package/src/plugins/builtin/thirteenf/signals.ts +3 -1
- package/src/plugins/builtin/ticker-detail/adr-pair/headless.ts +123 -0
- package/src/plugins/builtin/ticker-detail/adr-pair/model.ts +132 -0
- package/src/plugins/builtin/ticker-detail/adr-pair/tab.tsx +87 -0
- package/src/plugins/builtin/ticker-detail/data-panes/historical-prices.tsx +40 -26
- package/src/plugins/builtin/ticker-detail/data-panes/history-bars.ts +8 -4
- package/src/plugins/builtin/ticker-detail/data-panes/returns-history.ts +67 -3
- package/src/plugins/builtin/ticker-detail/data-panes/returns-model.ts +112 -5
- package/src/plugins/builtin/ticker-detail/data-panes/returns-pane.tsx +17 -2
- package/src/plugins/builtin/ticker-detail/financials/aggregation.ts +21 -7
- package/src/plugins/builtin/ticker-detail/financials/model.ts +36 -1
- package/src/plugins/builtin/ticker-detail/financials/offerings.ts +56 -0
- package/src/plugins/builtin/ticker-detail/financials/ratios.ts +62 -13
- package/src/plugins/builtin/ticker-detail/financials/tab.tsx +30 -4
- package/src/plugins/builtin/ticker-detail/headless-schema.ts +14 -2
- package/src/plugins/builtin/ticker-detail/headless.ts +148 -35
- package/src/plugins/builtin/ticker-detail/index.tsx +37 -5
- package/src/plugins/builtin/ticker-detail/overview/model.ts +65 -10
- package/src/plugins/builtin/ticker-detail/overview/pane.tsx +9 -1
- package/src/plugins/builtin/ticker-detail/overview-tab.tsx +68 -11
- package/src/plugins/builtin/ticker-detail/pane.tsx +11 -0
- package/src/plugins/builtin/ticker-detail/quote-footer.ts +8 -3
- package/src/plugins/builtin/ticker-detail/research-tabs.ts +11 -0
- package/src/plugins/builtin/vol-surface/client.ts +28 -7
- package/src/plugins/builtin/vol-surface/headless.ts +43 -15
- package/src/plugins/builtin/vol-surface/model.ts +34 -12
- package/src/plugins/builtin/vol-surface/pane.tsx +33 -13
- package/src/plugins/builtin/vol-surface/stored.ts +34 -3
- package/src/plugins/builtin/vol-surface/tables.ts +14 -0
- package/src/plugins/builtin/volatility/model.ts +5 -10
- package/src/plugins/builtin/world-venue-map/basemap-layer.tsx +4 -3
- package/src/plugins/builtin/world-venue-map/basemap.ts +3 -1
- package/src/plugins/builtin/world-venue-map/chokepoint-chart.ts +40 -0
- package/src/plugins/builtin/world-venue-map/evidence.ts +1 -1
- package/src/plugins/builtin/world-venue-map/geo-series.ts +90 -11
- package/src/plugins/builtin/world-venue-map/headless.ts +1 -1
- package/src/plugins/builtin/world-venue-map/index.ts +3 -26
- package/src/plugins/builtin/world-venue-map/layers.ts +1 -1
- package/src/plugins/builtin/world-venue-map/map.tsx +2 -1
- package/src/plugins/builtin/world-venue-map/pane.tsx +4 -2
- package/src/plugins/builtin/world-venue-map/venue-header.tsx +15 -4
- package/src/plugins/builtin/yield-curve/client.ts +25 -0
- package/src/plugins/builtin/yield-curve/curves.ts +7 -4
- package/src/plugins/builtin/yield-curve/headless.ts +38 -4
- package/src/plugins/builtin/yield-curve/history.ts +4 -3
- package/src/plugins/builtin/yield-curve/index.tsx +12 -6
- package/src/plugins/builtin/yield-curve/swaps-model.ts +93 -0
- package/src/plugins/builtin/yield-curve/swaps.tsx +99 -0
- package/src/plugins/bundle.ts +1 -1
- package/src/plugins/catalog-browser.ts +2 -1
- package/src/plugins/compat.ts +3 -3
- package/src/plugins/dependencies.ts +75 -14
- package/src/plugins/extracted-plugins.ts +132 -34
- package/src/plugins/host-link.ts +149 -34
- package/src/plugins/installer.ts +35 -10
- package/src/plugins/loader.ts +206 -38
- package/src/plugins/manager-node.ts +2 -2
- package/src/plugins/marketplace/deactivation.ts +22 -0
- package/src/plugins/marketplace/model.ts +2 -2
- package/src/plugins/marketplace/packs.ts +1 -1
- package/src/plugins/ownership.ts +1 -1
- package/src/plugins/peer-retry.ts +155 -0
- package/src/plugins/registry/contributions.ts +3 -1
- package/src/plugins/registry/index.ts +4 -3
- package/src/plugins/registry/plugin-state.ts +3 -0
- package/src/plugins/seed-notice.ts +20 -0
- package/src/plugins/shortcut-argument.ts +39 -0
- package/src/portfolio/allocation.ts +1 -1
- package/src/portfolio/collection-name.ts +31 -0
- package/src/portfolio/column-values.ts +10 -8
- package/src/portfolio/cost-fx.ts +296 -19
- package/src/portfolio/manual-lots.ts +75 -0
- package/src/portfolio/mutations.ts +60 -22
- package/src/portfolio/suffixed-listings.ts +209 -0
- package/src/portfolio/totals-currency.ts +24 -0
- package/src/public/__snapshots__/public-api.test.ts.snap +14 -0
- package/src/public/time-series.ts +11 -8
- package/src/remote/schema.ts +1 -1
- package/src/renderers/browser/config-host.ts +3 -0
- package/src/renderers/browser/main.tsx +23 -3
- package/src/renderers/dom/boot-frame-page.ts +187 -0
- package/src/renderers/dom/boot-frame.ts +237 -0
- package/src/renderers/dom/build-assets.ts +46 -8
- package/src/renderers/dom/desktop/controls.tsx +1 -1
- package/src/renderers/dom/desktop/query-bar.tsx +2 -0
- package/src/renderers/dom/dom-ui-host.tsx +4 -29
- package/src/renderers/dom/host/ascii-text.ts +16 -2
- package/src/renderers/dom/host/box.tsx +43 -2
- package/src/renderers/dom/host/chart-surface.tsx +2 -0
- package/src/renderers/dom/host/hls.chunk.ts +3 -0
- package/src/renderers/dom/host/image-surface.tsx +49 -0
- package/src/renderers/dom/host/media-surface.tsx +24 -18
- package/src/renderers/dom/host/mouse.ts +30 -0
- package/src/renderers/dom/host/size-observer.ts +1 -1
- package/src/renderers/dom/host/style.ts +1 -1
- package/src/renderers/dom/host/tabs.tsx +16 -5
- package/src/renderers/dom/host/top-surface.ts +127 -0
- package/src/renderers/dom/styles.css +115 -0
- package/src/renderers/dom/test-utils.tsx +2 -1
- package/src/renderers/electrobun/bun/application-menu/index.ts +3 -3
- package/src/renderers/electrobun/bun/core-capabilities.ts +9 -1
- package/src/renderers/electrobun/bun/desktop/backend-requests.ts +3 -0
- package/src/renderers/electrobun/bun/desktop/backend.ts +56 -3
- package/src/renderers/electrobun/bun/desktop/detached-windows.ts +1 -1
- package/src/renderers/electrobun/bun/desktop/host-requests.ts +9 -3
- package/src/renderers/electrobun/bun/desktop/initialization.ts +81 -18
- package/src/renderers/electrobun/bun/desktop/update.ts +210 -30
- package/src/renderers/electrobun/bun/external-plugins.ts +29 -7
- package/src/renderers/electrobun/bun/index.ts +11 -1
- package/src/renderers/electrobun/bun/window/boot-frame.ts +67 -0
- package/src/renderers/electrobun/bun/window/create.ts +4 -1
- package/src/renderers/electrobun/shared/boot-frame.ts +7 -0
- package/src/renderers/electrobun/shared/protocol.ts +6 -1
- package/src/renderers/electrobun/view/cli-pane-shot-entry.tsx +1 -1
- package/src/renderers/electrobun/view/config-host.ts +3 -0
- package/src/renderers/electrobun/view/fatal-screen.tsx +1 -1
- package/src/renderers/electrobun/view/main.tsx +30 -4
- package/src/renderers/electrobun/view/news-source.ts +9 -7
- package/src/renderers/electrobun/view/remote/asset-data-client.ts +9 -2
- package/src/renderers/electrobun/view/ui-host.tsx +1 -1
- package/src/renderers/opentui/browser-open.ts +88 -0
- package/src/renderers/opentui/host.tsx +5 -14
- package/src/renderers/opentui/image/loader.ts +3 -2
- package/src/renderers/opentui/native-smoke.ts +10 -1
- package/src/renderers/opentui/pane-image/index.ts +2 -1
- package/src/renderers/opentui/render-lib.ts +253 -0
- package/src/renderers/opentui/render-timing-smoke.ts +1 -1
- package/src/renderers/opentui/start.tsx +8 -1
- package/src/renderers/share/layout-view.tsx +2 -2
- package/src/renderers/share/main.tsx +4 -4
- package/src/renderers/share/view.tsx +1 -1
- package/src/series/resolve.ts +22 -6
- package/src/series/standalone.ts +30 -2
- package/src/series/types.ts +8 -1
- package/src/shares/api.ts +4 -1
- package/src/shares/pane.ts +1 -1
- package/src/sources/gloomberb-cloud/fred-series.ts +46 -1
- package/src/sources/gloomberb-cloud/index.ts +39 -16
- package/src/sources/gloomberb-cloud/news.ts +39 -0
- package/src/sources/gloomberb-cloud/normalizers.ts +14 -1
- package/src/sources/gloomberb-cloud/perpetuals.ts +49 -1
- package/src/sources/listing-symbols.ts +37 -0
- package/src/sources/provider-errors.ts +16 -2
- package/src/sources/provider-router/financial-routes.ts +21 -3
- package/src/sources/provider-router/financials.ts +15 -2
- package/src/sources/provider-router/history.ts +30 -8
- package/src/sources/provider-router/index.ts +16 -0
- package/src/sources/provider-router/primary.ts +1 -1
- package/src/state/app/bootstrap.ts +23 -0
- package/src/state/hooks/inline-tickers.ts +30 -5
- package/src/sync/controller.ts +1 -1
- package/src/sync/core-contributors.ts +46 -14
- package/src/team/collections-sync.ts +2 -1
- package/src/team/collections.ts +178 -17
- package/src/telemetry/crash-reports.ts +21 -4
- package/src/telemetry/update-failures-node.ts +59 -0
- package/src/telemetry/update-failures.ts +307 -0
- package/src/test-support/builtin-panes.ts +1 -1
- package/src/theme/colors.ts +3 -30
- package/src/theme/ui-tokens.ts +37 -1
- package/src/tickers/company-name-listing.ts +215 -36
- package/src/tickers/company-name.ts +43 -0
- package/src/tickers/index-roots.ts +47 -0
- package/src/tickers/instrument-label.ts +5 -1
- package/src/tickers/listing-fate.ts +30 -0
- package/src/tickers/metadata.ts +10 -0
- package/src/tickers/perpetual-listing.ts +5 -2
- package/src/tickers/search/home-listing.ts +75 -0
- package/src/tickers/search/index.ts +76 -27
- package/src/tickers/search/ranking.ts +54 -4
- package/src/tickers/search/upsert.ts +29 -0
- package/src/tickers/terminal-codes.ts +416 -40
- package/src/time-series/bar-aggregation.ts +243 -0
- package/src/time-series/base-series.ts +307 -0
- package/src/time-series/chart-bounds.ts +349 -0
- package/src/time-series/chart-seed.ts +142 -0
- package/src/time-series/economic.ts +5 -0
- package/src/time-series/fundamentals.ts +18 -3
- package/src/time-series/history-acquisition.ts +499 -0
- package/src/time-series/leverage.ts +100 -0
- package/src/time-series/market-resolution.ts +4 -2
- package/src/time-series/market.ts +2 -1
- package/src/time-series/price-comparison.ts +175 -30
- package/src/time-series/range.ts +9 -1
- package/src/time-series/resolution.ts +174 -16
- package/src/time-series/resolve-context.ts +157 -0
- package/src/time-series/resolve.ts +126 -1577
- package/src/time-series/series-name.ts +38 -0
- package/src/time-series/series-presentation.ts +208 -0
- package/src/time-series/spec.ts +11 -6
- package/src/time-series/studies.ts +109 -12
- package/src/time-series/tail-reconcile.ts +121 -0
- package/src/time-series/types.ts +29 -2
- package/src/time-series/use-chart-resolution.ts +4 -5
- package/src/types/broker.ts +10 -0
- package/src/types/config.ts +14 -0
- package/src/types/data-provider.ts +20 -0
- package/src/types/exchange-rate.ts +6 -0
- package/src/types/financials.ts +104 -7
- package/src/types/headless.ts +83 -6
- package/src/types/instrument.ts +3 -0
- package/src/types/issuer-listings.ts +28 -0
- package/src/types/plugin.ts +65 -8
- package/src/types/price-history.ts +2 -0
- package/src/types/ticker.ts +13 -0
- package/src/types/trading.ts +59 -1
- package/src/ui/ascii-font.ts +13 -1
- package/src/ui/host.tsx +6 -1
- package/src/updater/command-names.ts +175 -0
- package/src/updater/failure.ts +163 -0
- package/src/updater/index.ts +97 -28
- package/src/utils/calendar-date.ts +32 -15
- package/src/utils/cash-runway.ts +241 -0
- package/src/utils/central-banks.ts +42 -0
- package/src/utils/cli-output.ts +259 -80
- package/src/utils/contract-month.ts +16 -0
- package/src/utils/crypto-pair.ts +61 -3
- package/src/utils/currency-pair.ts +26 -0
- package/src/utils/currency-units.ts +29 -0
- package/src/utils/datetime-format.ts +10 -0
- package/src/utils/debug-log.ts +1 -1
- package/src/utils/decimal-comma.ts +39 -6
- package/src/utils/exchange-announcements.ts +71 -0
- package/src/utils/exchange-rate-snapshot.ts +10 -0
- package/src/utils/financial-statements.ts +83 -4
- package/src/utils/format.ts +34 -16
- package/src/utils/fundamentals.ts +150 -34
- package/src/utils/fx-market-hours.ts +10 -1
- package/src/utils/latest-financial-period.ts +8 -0
- package/src/utils/linux-libc.ts +54 -0
- package/src/utils/market-capitalization.ts +111 -15
- package/src/utils/max-drawdown.ts +64 -0
- package/src/utils/network-failure.ts +83 -0
- package/src/utils/option-expiry.ts +139 -7
- package/src/utils/price-earnings.ts +11 -5
- package/src/utils/price-history.ts +18 -8
- package/src/utils/price-window.ts +131 -0
- package/src/utils/release-date.ts +47 -0
- package/src/utils/sec.ts +71 -0
- package/src/utils/throttled-fetch.ts +11 -4
- package/src/utils/trailing-eps.ts +67 -0
- package/src/utils/typed-text.ts +21 -0
- package/src/utils/utc-time.ts +24 -1
- package/src/version.ts +6 -0
- package/src/cli/pane-functions/screenshot.ts +0 -2122
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import type { AppState } from "../../../state/app/context";
|
|
2
2
|
import type { TickerRecord } from "../../../types/ticker";
|
|
3
3
|
import { splitSymbolArgs, splitSymbolWords, symbolInputKey, uniqueSymbols } from "../../../cli/symbol-args";
|
|
4
|
+
import { protectFigureCommas } from "../../../cli/symbol-cells";
|
|
5
|
+
import { readSymbolList } from "../../../cli/symbol-list";
|
|
4
6
|
import { readNameEntries } from "../../../cli/name-entries";
|
|
5
7
|
import {
|
|
6
8
|
addSymbols,
|
|
@@ -42,17 +44,17 @@ export interface PastedSymbolList {
|
|
|
42
44
|
}
|
|
43
45
|
|
|
44
46
|
/**
|
|
45
|
-
* The entries of text typed or pasted after `AW`, split as `
|
|
47
|
+
* The entries of text typed or pasted after `AW`, split as `gloom quote`
|
|
46
48
|
* splits its arguments (`splitSymbolArgs`): on commas, semicolons, tabs and
|
|
47
49
|
* lines when it has them, where an entry with spaces may be a company's name
|
|
48
|
-
* or several symbols, else on spaces.
|
|
49
|
-
*
|
|
50
|
-
* Networks`), which is why
|
|
51
|
-
* a list.
|
|
50
|
+
* or several symbols, else on spaces. A decimal comma (`2.582,52`) splits
|
|
51
|
+
* nothing. Null for one word or none, which keep the single add. Spaces alone
|
|
52
|
+
* also separate a company's name (`Palo Alto Networks`), which is why
|
|
53
|
+
* `separated` says when the text left no doubt it is a list.
|
|
52
54
|
*/
|
|
53
55
|
export function pastedSymbolList(raw: string | undefined): PastedSymbolList | null {
|
|
54
56
|
if (!raw || splitSymbolWords([raw]).length < 2) return null;
|
|
55
|
-
return { ...uniqueSymbols(splitSymbolArgs([raw])), separated: /[,;\t\r\n]/.test(raw) };
|
|
57
|
+
return { ...uniqueSymbols(splitSymbolArgs([raw])), separated: /[,;\t\r\n]/.test(protectFigureCommas(raw)) };
|
|
56
58
|
}
|
|
57
59
|
|
|
58
60
|
/**
|
|
@@ -86,30 +88,45 @@ function reasonLine(row: SymbolRow): string | null {
|
|
|
86
88
|
if (row.hint && row.status === "added") return row.hint;
|
|
87
89
|
// Another company had the symbol: say which, beside the listing added.
|
|
88
90
|
if (row.changeNote && row.status === "added") return row.changeNote;
|
|
91
|
+
// Listed only abroad: the venue and currency it was added on.
|
|
92
|
+
if (row.abroad && row.status === "added") return row.abroad;
|
|
89
93
|
if (row.readAs && (row.status === "added" || row.status === "already_listed")) return row.readAs;
|
|
90
94
|
// Why the match was left out, and the symbol it trades as now when there is one.
|
|
91
95
|
if (row.status === "needs_choice") return row.message ?? typed;
|
|
96
|
+
// Not a symbol, or not looked up: the summary names them, and the notice says what to do about the second.
|
|
92
97
|
if (row.status !== "failed" && !(row.status === "not_found" && row.message && !NO_MATCH.test(row.message))) return null;
|
|
93
98
|
const text = reason(row.message ?? "", typed);
|
|
94
99
|
return text.includes(typed) ? text : `${typed}: ${text}`;
|
|
95
100
|
}
|
|
96
101
|
|
|
102
|
+
/** Rows that did not join the watchlist and say why, which keep the report up longer. */
|
|
103
|
+
const UNRESOLVED = new Set<SymbolRow["status"]>(["not_found", "needs_choice", "failed", "not_a_symbol", "not_looked_up"]);
|
|
104
|
+
|
|
97
105
|
/**
|
|
98
106
|
* What a list add says, in the words the CLI's summary uses: the counts, the
|
|
99
107
|
* symbols that found nothing or were not added, and under it the reason for
|
|
100
|
-
* each that has one
|
|
108
|
+
* each that has one, what the reader left out (the prices beside the
|
|
109
|
+
* symbols, in one line), and one line for the symbols Gloom Cloud did not
|
|
110
|
+
* answer for. Skipped symbols keep the report up longer.
|
|
101
111
|
*/
|
|
102
112
|
function describeListAdd(
|
|
103
113
|
rows: readonly SymbolRow[],
|
|
104
114
|
watchlistName: string,
|
|
105
115
|
repeated: number,
|
|
116
|
+
notes: readonly string[] = [],
|
|
106
117
|
): { body: string; type: "success" | "info" | "error"; duration?: number } {
|
|
107
118
|
const summary = `Watchlist "${watchlistName}": ${summarizeSymbolRows(rows, "add", repeated)}`;
|
|
108
119
|
const reasons = rows.map(reasonLine).filter((line): line is string => !!line);
|
|
120
|
+
const unanswered = rows.filter((row) => row.status === "not_looked_up").length;
|
|
109
121
|
const added = rows.some((row) => row.status === "added");
|
|
110
|
-
const unresolved = rows.some((row) =>
|
|
122
|
+
const unresolved = rows.some((row) => UNRESOLVED.has(row.status));
|
|
111
123
|
return {
|
|
112
|
-
body: [
|
|
124
|
+
body: [
|
|
125
|
+
summary,
|
|
126
|
+
...reasons,
|
|
127
|
+
...notes,
|
|
128
|
+
...unanswered > 0 ? [`Gloom Cloud did not answer for ${unanswered === 1 ? "one symbol" : `${unanswered} symbols`}; add ${unanswered === 1 ? "it" : "them"} again in a minute.`] : [],
|
|
129
|
+
].join("\n"),
|
|
113
130
|
type: added && !unresolved ? "success" : unresolved && !added ? "error" : "info",
|
|
114
131
|
duration: unresolved ? SKIPPED_REPORT_MS : undefined,
|
|
115
132
|
};
|
|
@@ -118,12 +135,14 @@ function describeListAdd(
|
|
|
118
135
|
/**
|
|
119
136
|
* A symbol typed to add on its own that a pasted list would leave for a
|
|
120
137
|
* choice (`typedSymbolChoice`: its company moved or merged away, the match is
|
|
121
|
-
* abroad
|
|
122
|
-
* what to add instead or to keep the
|
|
138
|
+
* abroad while the symbol names a US listing, or it stopped trading) is not
|
|
139
|
+
* added either. The notice says why, and what to add instead or to keep the
|
|
140
|
+
* match; `refused` says it did. One listed only abroad is added, and `abroad`
|
|
141
|
+
* is the line naming its venue and currency, for the add to say.
|
|
123
142
|
*/
|
|
124
|
-
export async function refuseTypedChoice(rawInput: string, deps: SharedWorkflowDeps, notify: Notify): Promise<boolean> {
|
|
143
|
+
export async function refuseTypedChoice(rawInput: string, deps: SharedWorkflowDeps, notify: Notify): Promise<{ refused: boolean; abroad: string | null }> {
|
|
125
144
|
const row = await typedSymbolChoice(rawInput, deps.tickerRepository, deps.dataProvider);
|
|
126
|
-
if (
|
|
145
|
+
if (row?.status !== "needs_choice") return { refused: false, abroad: row?.abroad ?? null };
|
|
127
146
|
const message = row.message ?? symbolInputKey(row.input);
|
|
128
147
|
const offers = [
|
|
129
148
|
...row.tradesAs ? [`${row.tradesAs} for what it trades as now`] : [],
|
|
@@ -131,12 +150,12 @@ export async function refuseTypedChoice(rawInput: string, deps: SharedWorkflowDe
|
|
|
131
150
|
];
|
|
132
151
|
notify([/[.!?]$/.test(message) ? message : `${message}.`, ...offers.length > 0 ? [`Add ${offers.join(", or ")}.`] : []].join("\n"),
|
|
133
152
|
{ type: "error", duration: SKIPPED_REPORT_MS });
|
|
134
|
-
return true;
|
|
153
|
+
return { refused: true, abroad: null };
|
|
135
154
|
}
|
|
136
155
|
|
|
137
156
|
/**
|
|
138
157
|
* Adds every symbol of a pasted list to a watchlist in one step. Each symbol
|
|
139
|
-
* resolves as `
|
|
158
|
+
* resolves as `gloom watchlist add` resolves it (Gloom Cloud search and
|
|
140
159
|
* quote, the venue its own quote is on), except that a symbol several listings
|
|
141
160
|
* carry is never given the first: it is left out and named, for the single add
|
|
142
161
|
* to ask which. One that is unknown or already listed does not stop the rest.
|
|
@@ -159,10 +178,13 @@ export async function addPastedListToWatchlist(options: {
|
|
|
159
178
|
const deps = options.buildWorkflowDeps();
|
|
160
179
|
// Spaces alone also separate the words of a name, which belongs to search.
|
|
161
180
|
if (!list.separated && await namesOneCompany(list.symbols, deps.dataProvider)) return false;
|
|
162
|
-
//
|
|
163
|
-
|
|
181
|
+
// Read as `watchlist add` reads a list: an entry with spaces is a company's name search finds, or the symbols it
|
|
182
|
+
// holds, and a price beside a symbol (`ED 2.582,52`) is left out and named.
|
|
183
|
+
const read = await readSymbolList({
|
|
184
|
+
args: [options.rawInput], stdinPiped: false, readEntries: (entries) => readNameEntries(entries, deps.dataProvider),
|
|
185
|
+
});
|
|
164
186
|
const symbols = read.symbols;
|
|
165
|
-
const repeated =
|
|
187
|
+
const repeated = read.repeated;
|
|
166
188
|
const state = options.getState();
|
|
167
189
|
const known = options.explicitTargetId && state.config.watchlists.some((entry) => entry.id === options.explicitTargetId)
|
|
168
190
|
? options.explicitTargetId
|
|
@@ -233,7 +255,7 @@ export async function addPastedListToWatchlist(options: {
|
|
|
233
255
|
recordAttention(publicTickerKey(ticker.metadata.ticker, ticker.metadata.exchange), "watchlist_add");
|
|
234
256
|
}
|
|
235
257
|
}
|
|
236
|
-
const report = describeListAdd(rows, watchlistName, repeated);
|
|
258
|
+
const report = describeListAdd(rows, watchlistName, repeated, read.notes);
|
|
237
259
|
notify(report.body, { type: report.type, duration: report.duration });
|
|
238
260
|
options.closeAll({ revertThemePreview: false });
|
|
239
261
|
return true;
|
|
@@ -62,8 +62,10 @@ export async function executeCollectionCommandAction(options: {
|
|
|
62
62
|
});
|
|
63
63
|
if (list?.separated && await addList(list)) return;
|
|
64
64
|
// One typed symbol is decided as a symbol of a pasted list is: a match the list would leave for a choice is not added.
|
|
65
|
-
|
|
66
|
-
|
|
65
|
+
const typed = action === "add" && !options.selectedTicker && !list && options.rawInput?.trim()
|
|
66
|
+
? await refuseTypedChoice(options.rawInput, deps, options.notify)
|
|
67
|
+
: null;
|
|
68
|
+
if (typed?.refused) {
|
|
67
69
|
options.closeAll({ revertThemePreview: false });
|
|
68
70
|
return;
|
|
69
71
|
}
|
|
@@ -246,7 +248,11 @@ export async function executeCollectionCommandAction(options: {
|
|
|
246
248
|
`${action === "add" ? "Added" : "Removed"} ${resolvedTicker.symbol} ${action === "add" ? "to" : "from"} "${targetName}".`,
|
|
247
249
|
{ type: "success" },
|
|
248
250
|
);
|
|
249
|
-
if (action === "add")
|
|
251
|
+
if (action === "add") {
|
|
252
|
+
// Listed only abroad: the venue and currency it went to, as `watchlist add` says it.
|
|
253
|
+
if (typed?.abroad) options.notify(typed.abroad, { type: "info" });
|
|
254
|
+
notifyTickerChange(deps.dataProvider, resolvedTicker.ticker, options.notify);
|
|
255
|
+
}
|
|
250
256
|
} else {
|
|
251
257
|
options.notify(
|
|
252
258
|
action === "add"
|
|
@@ -220,7 +220,7 @@ export function runDirectCommandAction(options: {
|
|
|
220
220
|
title: "Reset All Data",
|
|
221
221
|
body: [
|
|
222
222
|
"This will permanently delete all portfolios, tickers, notes, broker credentials, and settings.",
|
|
223
|
-
"
|
|
223
|
+
"Gloom will quit and show the setup wizard on next launch.",
|
|
224
224
|
],
|
|
225
225
|
confirmLabel: "Reset Everything",
|
|
226
226
|
cancelLabel: "Back",
|
|
@@ -81,12 +81,12 @@ export function useCommandBarDirectCommandRuntime({
|
|
|
81
81
|
// A confirm it opens (Reset All Data) runs after the bar closed.
|
|
82
82
|
const getState = useAppGetState();
|
|
83
83
|
const rendererHost = useRendererHost();
|
|
84
|
-
const runSecurityDescriptionShortcut = useCallback(async (query?: string) => {
|
|
84
|
+
const runSecurityDescriptionShortcut = useCallback(async (query?: string, options?: { forceNewPane?: boolean }) => {
|
|
85
85
|
const trimmed = query?.trim() || "";
|
|
86
86
|
if (!trimmed) {
|
|
87
87
|
const inferred = normalizeTickerInput(activeTickerSymbol, query);
|
|
88
88
|
if (inferred) {
|
|
89
|
-
focusTicker(inferred);
|
|
89
|
+
focusTicker(inferred, options);
|
|
90
90
|
closeAll({ revertThemePreview: false });
|
|
91
91
|
return;
|
|
92
92
|
}
|
|
@@ -103,6 +103,7 @@ export function useCommandBarDirectCommandRuntime({
|
|
|
103
103
|
);
|
|
104
104
|
if (resolvedTicker) {
|
|
105
105
|
focusTicker(resolvedTicker.symbol, {
|
|
106
|
+
...options,
|
|
106
107
|
instrument: resolvedTicker.instrument,
|
|
107
108
|
listing: resolvedTicker.listing,
|
|
108
109
|
});
|
|
@@ -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,
|
|
@@ -3,11 +3,26 @@ import type { TickerRecord } from "../../../../types/ticker";
|
|
|
3
3
|
import { isManualPortfolio } from "../../../../portfolio/mutations";
|
|
4
4
|
import type { Command } from "../../commands/registry";
|
|
5
5
|
import type { ResultItem } from "../../list/model";
|
|
6
|
-
import { canRestartToApply } from "../../../../updater";
|
|
6
|
+
import { canRestartToApply, type UpdateProgress } from "../../../../updater";
|
|
7
7
|
import { NIGHTLY_CHANNEL_SUMMARY, resolveUpdateChannel } from "../../../../updater/channel";
|
|
8
|
+
import { updateFailureReason } from "../../../../updater/failure";
|
|
9
|
+
import { t, tf } from "../../../../i18n";
|
|
8
10
|
import { isPrereleaseVersion } from "../../../../utils/semver";
|
|
9
11
|
import { VERSION } from "../../../../version";
|
|
10
12
|
|
|
13
|
+
/** "Update failed: download interrupted", as the header says it. */
|
|
14
|
+
function failedUpdateLabel(progress: UpdateProgress): string {
|
|
15
|
+
const reason = progress.failure ? t(updateFailureReason(progress.failure)) : (progress.error ?? "").replace(/\s+/g, " ").trim();
|
|
16
|
+
return tf("Update failed: {error}", { error: reason });
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/** The whole error under the failed update's row, unless the label already says all of it. */
|
|
20
|
+
function failedUpdateLines(progress: UpdateProgress): ResultItem["lines"] {
|
|
21
|
+
const error = (progress.error ?? "").replace(/\s+/g, " ").trim();
|
|
22
|
+
if (!progress.failure || !error) return undefined;
|
|
23
|
+
return [{ segments: [{ text: error, emphasis: "muted" }] }];
|
|
24
|
+
}
|
|
25
|
+
|
|
11
26
|
interface RootCommandItemBuilderOptions {
|
|
12
27
|
activeCollectionId: string | null;
|
|
13
28
|
activeTickerData: TickerRecord | null | undefined;
|
|
@@ -88,9 +103,12 @@ export function createRootCommandItemBuilder({
|
|
|
88
103
|
return activeTickerSymbol ? `Remove ${activeTickerSymbol} from Portfolio` : command.label;
|
|
89
104
|
case "set-portfolio-position":
|
|
90
105
|
return activeTickerSymbol ? `Set Position for ${activeTickerSymbol}` : command.label;
|
|
91
|
-
// The row only shows its label, so a downloaded update is announced there
|
|
106
|
+
// The row only shows its label, so a downloaded update is announced there,
|
|
107
|
+
// and a failed one with its reason; Enter restarts into the one and retries the other.
|
|
92
108
|
case "check-for-updates":
|
|
93
|
-
|
|
109
|
+
if (state.updateProgress?.phase === "ready") return "Update ready, restart to apply";
|
|
110
|
+
if (state.updateProgress?.phase === "error") return failedUpdateLabel(state.updateProgress);
|
|
111
|
+
return command.label;
|
|
94
112
|
default:
|
|
95
113
|
return command.label;
|
|
96
114
|
}
|
|
@@ -140,7 +158,7 @@ export function createRootCommandItemBuilder({
|
|
|
140
158
|
return state.updateProgress.message ?? "Update ready, restart to apply";
|
|
141
159
|
}
|
|
142
160
|
if (state.updateProgress?.phase === "error") {
|
|
143
|
-
return
|
|
161
|
+
return `${failedUpdateLabel(state.updateProgress)}. ${state.updateProgress.error ?? ""}`.trim();
|
|
144
162
|
}
|
|
145
163
|
if (state.updateCheckInProgress) return "Checking releases now";
|
|
146
164
|
if (state.updateAvailable) {
|
|
@@ -198,8 +216,11 @@ export function createRootCommandItemBuilder({
|
|
|
198
216
|
// "update" is a whole word here so it lands on this command before Set
|
|
199
217
|
// Portfolio Position (whose keywords say "update position") and Release
|
|
200
218
|
// Channel, which keeps the word further back.
|
|
219
|
+
// Ready and failed rename the row; its own name still finds it.
|
|
201
220
|
case "check-for-updates":
|
|
202
|
-
|
|
221
|
+
if (state.updateProgress?.phase === "ready") return "update check for updates restart relaunch";
|
|
222
|
+
if (state.updateProgress?.phase === "error") return "update check for updates retry";
|
|
223
|
+
return "update";
|
|
203
224
|
case "release-channel":
|
|
204
225
|
return "nightly stable beta prerelease update updates channel";
|
|
205
226
|
default:
|
|
@@ -218,9 +239,14 @@ export function createRootCommandItemBuilder({
|
|
|
218
239
|
right: smartRight(command, arg),
|
|
219
240
|
shortcutQuery: command.prefix || undefined,
|
|
220
241
|
searchText: smartSearchText(command),
|
|
242
|
+
...(command.id === "check-for-updates" && state.updateProgress?.phase === "error"
|
|
243
|
+
? { lines: failedUpdateLines(state.updateProgress) }
|
|
244
|
+
: {}),
|
|
245
|
+
// Busy while it checks, downloads or installs; a failed update is retried from here.
|
|
221
246
|
disabled:
|
|
222
247
|
command.id === "check-for-updates" &&
|
|
223
|
-
(state.updateCheckInProgress
|
|
248
|
+
(state.updateCheckInProgress
|
|
249
|
+
|| (!!state.updateProgress && !canRestartToApply(state.updateProgress) && state.updateProgress.phase !== "error")),
|
|
224
250
|
action: () => runDirectCommand(command, arg),
|
|
225
251
|
};
|
|
226
252
|
};
|
|
@@ -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
|
: [];
|