gloomberb 0.18.3 → 0.18.5
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 +32 -1
- package/src/account/auth-model.ts +7 -3
- 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 +11 -6
- package/src/api-client/catalysts.ts +2 -1
- 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 +98 -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 +182 -16
- package/src/api-client/live-scan.ts +91 -0
- package/src/api-client/market-discovery.ts +14 -0
- package/src/api-client/members.ts +18 -0
- package/src/api-client/mna.ts +6 -0
- package/src/api-client/paths.ts +18 -1
- package/src/api-client/request.ts +224 -26
- package/src/api-client/research-activity.ts +3 -10
- 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 +96 -2
- package/src/app/keybindings/index.ts +3 -0
- package/src/app/keybindings/labels.ts +18 -1
- package/src/app/keybindings/resolve.ts +14 -0
- package/src/app/pane-runtime/plugin-bindings.ts +9 -2
- package/src/app/runtime/broker-import.ts +43 -26
- 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 +9 -2
- package/src/cli/commands/keybindings.ts +25 -2
- package/src/cli/commands/market.ts +1177 -278
- package/src/cli/commands/news-hints.ts +2 -2
- package/src/cli/commands/news-search.ts +59 -6
- package/src/cli/commands/options-chain.ts +59 -3
- package/src/cli/commands/options-leaps.ts +41 -26
- package/src/cli/commands/overview.ts +222 -61
- package/src/cli/commands/plugins.ts +9 -9
- package/src/cli/commands/remote.ts +13 -10
- package/src/cli/commands/search.ts +82 -46
- package/src/cli/commands/system.ts +27 -19
- package/src/cli/commands/themes.ts +1 -1
- package/src/cli/commands/ticker.ts +194 -48
- 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 +21 -3
- package/src/cli/exit-codes.ts +1 -1
- package/src/cli/export-source.ts +38 -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 +113 -20
- package/src/cli/help.ts +19 -13
- package/src/cli/history-export.ts +126 -0
- package/src/cli/history-rows.ts +226 -50
- package/src/cli/index-roots.ts +5 -45
- package/src/cli/index.ts +24 -18
- package/src/cli/known-gaps.ts +123 -27
- package/src/cli/listing-arg.ts +316 -46
- 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 +193 -30
- package/src/cli/pane-functions/function-help.ts +76 -30
- package/src/cli/pane-functions/headless.ts +59 -12
- package/src/cli/pane-functions/index.ts +28 -19
- package/src/cli/pane-functions/market-session.ts +15 -5
- 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 +10 -6
- package/src/cli/pane-functions/resolver.ts +64 -11
- 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 +45 -4
- package/src/cli/report-tables.ts +75 -19
- package/src/cli/restore-plugins.ts +42 -15
- package/src/cli/result.ts +164 -23
- 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 +395 -20
- package/src/components/chart/composite/format.ts +27 -0
- 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 +7 -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-series.ts +1 -0
- package/src/components/chart/composite/panel-surface.tsx +314 -13
- package/src/components/chart/composite/price-axis-labels.tsx +27 -3
- package/src/components/chart/composite/range-statistics.ts +62 -0
- package/src/components/chart/composite/rasterizer.ts +44 -19
- package/src/components/chart/composite/scene.ts +20 -4
- package/src/components/chart/composite/series-axis-tags.tsx +16 -9
- 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 +17 -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/panel/prompt-binding.ts +0 -8
- 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/alert.ts +1 -1
- 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 +33 -46
- 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/index.tsx +1 -0
- package/src/components/layout/pane/footer/model.ts +38 -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-frame.tsx +1 -1
- 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/portfolio-step/positions-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 +10 -2
- 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 +6 -4
- package/src/core/state/app/state.ts +9 -0
- package/src/core/state/app/types.ts +3 -0
- 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 +123 -0
- package/src/docs/snapshot.json +422 -112
- package/src/i18n/es.ts +30 -13
- package/src/i18n/ja.ts +30 -13
- package/src/i18n/ko.ts +30 -13
- package/src/i18n/zh-cn.ts +30 -13
- package/src/i18n/zh-tw.ts +30 -13
- 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/coordinator/financials.ts +10 -2
- package/src/market-data/coordinator/index.ts +3 -1
- package/src/market-data/coordinator/quotes.ts +4 -2
- 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 +81 -11
- package/src/market-data/market/dated-previous-close.ts +203 -0
- package/src/market-data/market/freshness.ts +34 -5
- package/src/market-data/market/futures-week.ts +68 -0
- package/src/market-data/market/period-return.ts +163 -0
- package/src/market-data/market/status.ts +16 -4
- 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/options-alternatives.ts +60 -0
- 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 +25 -3
- 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 +7 -2
- package/src/market-data/selectors.ts +3 -0
- 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/notifications/notification-log.ts +6 -4
- 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 +34 -20
- package/src/plugins/builtin/alerts/calendar-events.ts +429 -0
- package/src/plugins/builtin/alerts/cli.ts +533 -85
- package/src/plugins/builtin/alerts/command.ts +12 -10
- package/src/plugins/builtin/alerts/constants.ts +1 -1
- 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 +119 -0
- package/src/plugins/builtin/alerts/format.ts +10 -3
- package/src/plugins/builtin/alerts/headless.ts +107 -41
- package/src/plugins/builtin/alerts/history-pane.tsx +105 -62
- package/src/plugins/builtin/alerts/history-rows.ts +92 -0
- package/src/plugins/builtin/alerts/history.ts +2 -0
- package/src/plugins/builtin/alerts/index.tsx +107 -30
- package/src/plugins/builtin/alerts/iv-level.ts +365 -0
- package/src/plugins/builtin/alerts/levels.ts +3 -3
- package/src/plugins/builtin/alerts/live.ts +3 -3
- package/src/plugins/builtin/alerts/metric-command.ts +61 -0
- package/src/plugins/builtin/alerts/metric-data.ts +70 -0
- package/src/plugins/builtin/alerts/metric-model.ts +175 -0
- package/src/plugins/builtin/alerts/metric-parity-fixture.json +725 -0
- package/src/plugins/builtin/alerts/pane.tsx +130 -49
- 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 +38 -12
- package/src/plugins/builtin/alerts/targets.ts +12 -3
- package/src/plugins/builtin/alerts/types.ts +3 -0
- 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 +13 -8
- package/src/plugins/builtin/backtest/pane.tsx +9 -4
- package/src/plugins/builtin/backtest/presets.ts +29 -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 +24 -14
- package/src/plugins/builtin/broker-manager/keyboard.ts +1 -1
- package/src/plugins/builtin/broker-manager/model.ts +18 -3
- 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 +66 -24
- 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 +19 -1
- package/src/plugins/builtin/broker-trading/linked-orders.ts +148 -0
- package/src/plugins/builtin/broker-trading/order-feed.ts +83 -10
- 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 +111 -24
- 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 +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 +51 -5
- 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 +4 -1
- package/src/plugins/builtin/chart-composer/chart-spec-edit.ts +3 -2
- package/src/plugins/builtin/chart-composer/chart-spec.ts +7 -0
- package/src/plugins/builtin/chart-composer/cli-options.ts +7 -10
- package/src/plugins/builtin/chart-composer/data-catalog-pane.tsx +7 -3
- package/src/plugins/builtin/chart-composer/editor/controller.ts +4 -0
- package/src/plugins/builtin/chart-composer/editor/model.ts +2 -0
- package/src/plugins/builtin/chart-composer/editor.tsx +9 -4
- package/src/plugins/builtin/chart-composer/formula.ts +71 -18
- package/src/plugins/builtin/chart-composer/headless-schema.ts +42 -29
- package/src/plugins/builtin/chart-composer/headless.ts +266 -37
- 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 +144 -30
- package/src/plugins/builtin/chart-composer/presets.ts +50 -15
- package/src/plugins/builtin/chart-composer/quick-add.tsx +40 -25
- 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 +31 -28
- 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 +44 -31
- 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/command-suggestions.ts +92 -0
- package/src/plugins/builtin/chat/content/composer.tsx +13 -6
- package/src/plugins/builtin/chat/content/footer.tsx +6 -3
- package/src/plugins/builtin/chat/content/index.tsx +51 -22
- package/src/plugins/builtin/chat/content/open-targets.ts +14 -3
- package/src/plugins/builtin/chat/controller/session-runtime.ts +4 -2
- package/src/plugins/builtin/chat/index.tsx +23 -0
- package/src/plugins/builtin/chat/message/desktop.tsx +1 -0
- package/src/plugins/builtin/chat/message/inline-tokens.tsx +23 -0
- package/src/plugins/builtin/chat/message/pane-chip.tsx +50 -20
- package/src/plugins/builtin/chat/pane-links/commands.ts +265 -0
- package/src/plugins/builtin/chat/pane-links/model.ts +12 -3
- package/src/plugins/builtin/chat/pane-links/open.ts +9 -2
- package/src/plugins/builtin/chat/people.ts +1 -1
- package/src/plugins/builtin/chat/unread-inbox-pane.tsx +10 -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/plugin.tsx +1 -1
- 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 +144 -27
- package/src/plugins/builtin/econ/detail-view.tsx +48 -10
- package/src/plugins/builtin/econ/figures.ts +72 -0
- 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 +144 -27
- package/src/plugins/builtin/econ/print-watch.ts +2 -1
- package/src/plugins/builtin/econ/types.ts +34 -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 +87 -28
- 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 +104 -0
- package/src/plugins/builtin/econ-statistics/view.ts +19 -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 +47 -12
- 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/charts.tsx +2 -2
- 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 +20 -1
- package/src/plugins/builtin/exposure/pane.tsx +10 -5
- 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/index.tsx +1 -0
- package/src/plugins/builtin/futures/model.ts +12 -10
- package/src/plugins/builtin/futures/returns.ts +8 -36
- package/src/plugins/builtin/futures/table.tsx +3 -3
- 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 +20 -8
- package/src/plugins/builtin/fx-matrix/headless.ts +37 -16
- package/src/plugins/builtin/fx-matrix/index.tsx +25 -13
- package/src/plugins/builtin/fx-matrix/live-legs.ts +34 -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/help/keybindings-editor.tsx +18 -14
- 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 +7 -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 +51 -13
- 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/footer.ts +2 -2
- 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/breadth-pane.tsx +81 -0
- package/src/plugins/builtin/members/client.ts +19 -4
- package/src/plugins/builtin/members/headless.ts +24 -10
- package/src/plugins/builtin/members/index.tsx +9 -9
- package/src/plugins/builtin/members/model.ts +23 -4
- package/src/plugins/builtin/members/pane.tsx +31 -14
- 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/analytics.ts +26 -2
- package/src/plugins/builtin/options/carry.ts +2 -2
- package/src/plugins/builtin/options/index.tsx +1 -1
- package/src/plugins/builtin/options/model-spot.ts +5 -2
- package/src/plugins/builtin/options/strike-window.ts +2 -1
- package/src/plugins/builtin/options/table.ts +1 -7
- package/src/plugins/builtin/options/view.tsx +30 -13
- package/src/plugins/builtin/options-calculator/headless.ts +46 -7
- package/src/plugins/builtin/options-positioning/client.ts +19 -0
- package/src/plugins/builtin/options-positioning/headless.ts +54 -14
- package/src/plugins/builtin/options-positioning/index.tsx +3 -3
- package/src/plugins/builtin/options-positioning/model.ts +47 -8
- package/src/plugins/builtin/options-positioning/pane.tsx +68 -38
- 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 +14 -9
- 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 +168 -0
- package/src/plugins/builtin/perps/markets-section.tsx +154 -0
- package/src/plugins/builtin/perps/pane.tsx +49 -26
- 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 +54 -22
- 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 +7 -4
- 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/index.tsx +11 -8
- 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/rate-path/pane.tsx +2 -2
- 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 +80 -13
- 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/feed.ts +2 -2
- package/src/plugins/builtin/scanner/index.ts +24 -1
- package/src/plugins/builtin/scanner/live-condition-editor.tsx +222 -0
- package/src/plugins/builtin/scanner/live-feed.ts +168 -0
- package/src/plugins/builtin/scanner/live-headless.ts +114 -0
- package/src/plugins/builtin/scanner/live-model.ts +351 -0
- package/src/plugins/builtin/scanner/live-pane.tsx +677 -0
- package/src/plugins/builtin/scanner/live-track.ts +186 -0
- 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 +3 -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/macro-releases.ts +65 -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/scanner-capture.ts +3 -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/shared/use-quote-board.ts +8 -2
- package/src/plugins/builtin/shared/volatility/pricing.ts +7 -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 +11 -6
- package/src/plugins/builtin/themes/model.ts +15 -5
- package/src/plugins/builtin/themes/pane.tsx +27 -8
- 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 +14 -4
- package/src/plugins/builtin/ticker-detail/research-tabs.ts +11 -0
- package/src/plugins/builtin/vol-surface/charts.tsx +9 -4
- package/src/plugins/builtin/vol-surface/client.ts +7 -4
- package/src/plugins/builtin/vol-surface/headless.ts +71 -13
- package/src/plugins/builtin/vol-surface/index.tsx +2 -2
- package/src/plugins/builtin/vol-surface/model.ts +26 -9
- package/src/plugins/builtin/vol-surface/pane.tsx +44 -7
- package/src/plugins/builtin/vol-surface/tables.ts +31 -3
- package/src/plugins/builtin/volatility/dvol.ts +46 -0
- package/src/plugins/builtin/volatility/model.ts +5 -10
- package/src/plugins/builtin/volatility/pane.tsx +2 -2
- package/src/plugins/builtin/volatility/series.ts +26 -0
- package/src/plugins/builtin/world-indices/footer.ts +1 -1
- 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 +15 -9
- 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 +15 -13
- 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 +15 -0
- package/src/public/time-series.ts +11 -8
- package/src/remote/schema.ts +1 -1
- package/src/renderers/browser/app-services.ts +1 -7
- package/src/renderers/browser/config-host.ts +5 -55
- package/src/renderers/browser/main.tsx +30 -60
- 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/app-name.ts +222 -0
- 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/relaunch.ts +74 -25
- package/src/renderers/electrobun/bun/desktop/state-broadcaster.ts +1 -0
- package/src/renderers/electrobun/bun/desktop/update.ts +70 -3
- package/src/renderers/electrobun/bun/desktop/workspace/index.ts +2 -0
- package/src/renderers/electrobun/bun/external-plugins.ts +29 -7
- package/src/renderers/electrobun/bun/index.ts +36 -2
- 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/app-name.ts +17 -0
- 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/cli-pane-shot-frame.tsx +3 -3
- package/src/renderers/electrobun/view/config-host.ts +3 -0
- package/src/renderers/electrobun/view/desktop/window/snapshot.ts +1 -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/opentui/toast-host.tsx +71 -43
- 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 +16 -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/batches.ts +10 -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 +58 -15
- package/src/sources/provider-router/index.ts +146 -10
- package/src/sources/provider-router/primary.ts +1 -1
- package/src/sources/provider-router/search.ts +13 -2
- package/src/state/app/bootstrap.ts +23 -0
- package/src/state/app/context/index.tsx +3 -0
- package/src/state/hooks/inline-tickers.ts +30 -5
- package/src/sync/auth-transition.ts +19 -9
- package/src/sync/baseline.ts +10 -4
- package/src/sync/controller.ts +67 -17
- package/src/sync/core-contributors.ts +46 -14
- package/src/sync/react.ts +4 -1
- package/src/sync/types.ts +3 -0
- 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/telemetry/usage-counts.ts +0 -18
- package/src/test-support/builtin-panes.ts +1 -1
- package/src/theme/colors.ts +11 -30
- package/src/theme/ui-tokens.ts +37 -1
- package/src/tickers/company-name-listing.ts +210 -33
- package/src/tickers/company-name.ts +59 -0
- package/src/tickers/index-roots.ts +47 -0
- package/src/tickers/instrument-label.ts +5 -1
- package/src/tickers/listing-venues.ts +23 -0
- package/src/tickers/metadata.ts +10 -0
- package/src/tickers/perpetual-listing.ts +5 -2
- package/src/tickers/search/bare-symbol.ts +36 -0
- package/src/tickers/search/home-listing.ts +75 -0
- package/src/tickers/search/index.ts +111 -33
- package/src/tickers/search/ranking.ts +64 -5
- package/src/tickers/search/types.ts +5 -0
- 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 +315 -0
- package/src/time-series/chart-bounds.ts +349 -0
- package/src/time-series/chart-seed.ts +142 -0
- package/src/time-series/daily-valuation.ts +62 -0
- package/src/time-series/economic.ts +5 -0
- package/src/time-series/field-catalog.ts +1 -3
- package/src/time-series/forward-valuation.ts +32 -0
- package/src/time-series/fundamentals.ts +173 -10
- package/src/time-series/history-acquisition.ts +499 -0
- package/src/time-series/hooks.ts +1 -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/price-units.ts +72 -2
- package/src/time-series/range.ts +9 -1
- package/src/time-series/resolution.ts +174 -16
- package/src/time-series/resolve-context.ts +161 -0
- package/src/time-series/resolve.ts +185 -1587
- package/src/time-series/series-name.ts +38 -0
- package/src/time-series/series-presentation.ts +242 -0
- package/src/time-series/spec.ts +13 -7
- package/src/time-series/studies.ts +377 -82
- package/src/time-series/tail-reconcile.ts +121 -0
- package/src/time-series/transforms.ts +1 -0
- package/src/time-series/types.ts +34 -2
- package/src/time-series/use-chart-resolution.ts +4 -5
- package/src/time-series/valuation-releases.ts +39 -0
- package/src/types/broker.ts +10 -0
- package/src/types/config.ts +14 -0
- package/src/types/data-provider.ts +23 -1
- package/src/types/desktop-window.ts +2 -0
- package/src/types/exchange-rate.ts +6 -0
- package/src/types/financials.ts +145 -8
- package/src/types/headless.ts +117 -9
- package/src/types/instrument.ts +6 -0
- package/src/types/plugin.ts +66 -9
- 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 +180 -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 +89 -5
- 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 +86 -0
- package/src/utils/option-expiry.ts +186 -7
- package/src/utils/options.ts +10 -0
- package/src/utils/plugin-proxy-hosts.json +1 -0
- package/src/utils/price-earnings.ts +11 -5
- package/src/utils/price-history.ts +23 -8
- package/src/utils/price-window.ts +131 -0
- package/src/utils/release-date.ts +47 -0
- package/src/utils/sec.ts +3 -0
- package/src/utils/throttled-fetch.ts +11 -4
- package/src/utils/trailing-eps.ts +67 -0
- package/src/utils/typed-text.ts +21 -0
- package/src/utils/utc-time.ts +24 -1
- package/src/version.ts +6 -0
- package/src/cli/pane-functions/screenshot.ts +0 -2122
- package/src/renderers/browser/first-screen.ts +0 -193
|
@@ -31,6 +31,8 @@ export function signedInBrokerForProfile(instance: BrokerInstanceConfig, fallbac
|
|
|
31
31
|
export interface ConnectSignedInBrokerDeps<T> {
|
|
32
32
|
getConfig(): AppConfig;
|
|
33
33
|
createBrokerInstance(brokerType: string, label: string, values: Record<string, unknown>): Promise<BrokerInstanceConfig>;
|
|
34
|
+
/** Turns a profile that was turned off back on. */
|
|
35
|
+
enableBrokerInstance(instanceId: string): Promise<void>;
|
|
34
36
|
syncBrokerInstance(instanceId: string): Promise<T>;
|
|
35
37
|
/** Asks the user to connect: a form's own connect step, or the connect dialog when missing. */
|
|
36
38
|
requestSignIn?: (broker: SignedInBroker) => Promise<boolean>;
|
|
@@ -39,6 +41,9 @@ export interface ConnectSignedInBrokerDeps<T> {
|
|
|
39
41
|
/**
|
|
40
42
|
* Asks the user to connect `broker`, then syncs its profile, creating it the
|
|
41
43
|
* first time. Resolves null when the broker was not connected.
|
|
44
|
+
*
|
|
45
|
+
* Connecting a broker whose profile is turned off turns it back on first:
|
|
46
|
+
* nothing syncs a disabled profile, and connecting it again is asking for it.
|
|
42
47
|
*/
|
|
43
48
|
export async function connectSignedInBrokerProfile<T>(
|
|
44
49
|
broker: SignedInBroker,
|
|
@@ -46,8 +51,11 @@ export async function connectSignedInBrokerProfile<T>(
|
|
|
46
51
|
): Promise<{ instance: BrokerInstanceConfig; synced: T } | null> {
|
|
47
52
|
const connected = await (deps.requestSignIn ?? requestBrokerSignIn)(broker);
|
|
48
53
|
if (!connected) return null;
|
|
49
|
-
const
|
|
50
|
-
|
|
54
|
+
const existing = findSignedInBrokerProfile(deps.getConfig().brokerInstances, broker.id);
|
|
55
|
+
if (existing?.enabled === false) await deps.enableBrokerInstance(existing.id);
|
|
56
|
+
const instance = existing
|
|
57
|
+
? { ...existing, enabled: true }
|
|
58
|
+
: await deps.createBrokerInstance(SIGNED_IN_BROKER_TYPE, broker.name, { connectionMode: broker.id, broker: broker.id });
|
|
51
59
|
return { instance, synced: await deps.syncBrokerInstance(instance.id) };
|
|
52
60
|
}
|
|
53
61
|
|
|
@@ -7,6 +7,7 @@ import type { BrokerAccount } from "../types/trading";
|
|
|
7
7
|
import type { TickerRecord } from "../types/ticker";
|
|
8
8
|
import { getBrokerInstance } from "../utils/broker-instances";
|
|
9
9
|
import {
|
|
10
|
+
accountsHeldUnderOwnNumber,
|
|
10
11
|
clearBrokerInstanceTickerData,
|
|
11
12
|
clearLeftoverBrokerHoldings,
|
|
12
13
|
ensureBrokerPortfolio,
|
|
@@ -248,6 +249,13 @@ export async function syncBrokerInstance({
|
|
|
248
249
|
throwIfBrokerImportCancelled(signal);
|
|
249
250
|
}
|
|
250
251
|
|
|
252
|
+
// An account another profile holds under its own number stays with it.
|
|
253
|
+
const heldUnderOwnNumber = accountsHeldUnderOwnNumber(config, instance, brokerAccounts);
|
|
254
|
+
if (heldUnderOwnNumber.size > 0) {
|
|
255
|
+
brokerAccounts = brokerAccounts.filter((account) => !heldUnderOwnNumber.has(account.accountId));
|
|
256
|
+
positions = positions.filter((position) => !position.accountId || !heldUnderOwnNumber.has(position.accountId));
|
|
257
|
+
}
|
|
258
|
+
|
|
251
259
|
const accountMetadata = new Map(
|
|
252
260
|
brokerAccounts.map((account) => [
|
|
253
261
|
account.accountId,
|
|
@@ -301,7 +309,7 @@ export async function syncBrokerInstance({
|
|
|
301
309
|
const account = accountMetadata.get(accountId);
|
|
302
310
|
claimPortfolio(portfolioId, account?.name || accountId, account?.currency || "USD", accountId);
|
|
303
311
|
}
|
|
304
|
-
} else {
|
|
312
|
+
} else if (heldUnderOwnNumber.size === 0) {
|
|
305
313
|
const defaultAccount = brokerAccounts[0];
|
|
306
314
|
const portfolioId = findReusableBrokerPortfolioId(nextConfig, instance, defaultAccount?.accountId, portfolioBrokerId);
|
|
307
315
|
const fallbackName = defaultAccount?.name || defaultAccount?.accountId || instance.label || broker.name;
|
|
@@ -9,7 +9,8 @@ import type {
|
|
|
9
9
|
SeriesTransform,
|
|
10
10
|
TimeSeriesPoint,
|
|
11
11
|
} from "../time-series/types";
|
|
12
|
-
import {
|
|
12
|
+
import { TIME_RANGES } from "../time-series/range";
|
|
13
|
+
import { isChartResolution } from "../time-series/resolution";
|
|
13
14
|
import type {
|
|
14
15
|
CapabilityInvoker,
|
|
15
16
|
CapabilitySchema,
|
|
@@ -26,7 +27,6 @@ const CAPABILITY_ID_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._-]{0,79}$/;
|
|
|
26
27
|
const SERIES_ID_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._~%:/-]{0,239}$/;
|
|
27
28
|
const chartSeriesLog = debugLog.createLogger("chart-series");
|
|
28
29
|
const ranges = new Set<string>(TIME_RANGES);
|
|
29
|
-
const resolutions = new Set<string>(CHART_RESOLUTIONS);
|
|
30
30
|
const periods = new Set(["auto", "daily", "weekly", "monthly", "quarterly", "annual", "ttm"]);
|
|
31
31
|
const styles = new Set(["line", "area", "step", "columns", "points", "candles", "ohlc", "hlc"]);
|
|
32
32
|
const transforms = new Set(["raw", "percent", "index100", "yoy", "qoq", "log"]);
|
|
@@ -103,7 +103,8 @@ function viewport(value: unknown): ChartViewportSpec {
|
|
|
103
103
|
const input = object(value, "resolve viewport");
|
|
104
104
|
onlyKeys(input, "resolve viewport", ["range", "resolution", "dateWindow", "maxPoints"]);
|
|
105
105
|
const range = enumValue<ChartViewportSpec["range"]>(input.range, "viewport range", ranges);
|
|
106
|
-
|
|
106
|
+
if (!isChartResolution(input.resolution)) fail("viewport resolution", `unsupported value ${String(input.resolution)}.`);
|
|
107
|
+
const resolution = input.resolution;
|
|
107
108
|
let dateWindow: ChartViewportSpec["dateWindow"];
|
|
108
109
|
if (input.dateWindow !== undefined) {
|
|
109
110
|
const window = object(input.dateWindow, "viewport date window");
|
|
@@ -276,12 +277,15 @@ function searchableChartSeriesManifests(invoker: CapabilityInvoker) {
|
|
|
276
277
|
return chartSeriesCapabilityManifests(invoker).filter((manifest) => manifest.sourceId !== REGISTERED_SERIES_SOURCE_ID);
|
|
277
278
|
}
|
|
278
279
|
|
|
279
|
-
|
|
280
|
+
type CatalogSuggestion = ChartSeriesCatalogItem & { capabilityId: string; capabilityName: string };
|
|
281
|
+
|
|
282
|
+
/** Partial search results retain failures for the shared picker error state. */
|
|
283
|
+
export async function searchChartSeriesCatalogs(
|
|
280
284
|
invoker: CapabilityInvoker,
|
|
281
285
|
query: string,
|
|
282
286
|
limit = 8,
|
|
283
287
|
signal?: AbortSignal,
|
|
284
|
-
): Promise<
|
|
288
|
+
): Promise<{ items: CatalogSuggestion[]; errors: string[] }> {
|
|
285
289
|
const manifests = searchableChartSeriesManifests(invoker);
|
|
286
290
|
const results = await Promise.allSettled(manifests.map(async (manifest) => {
|
|
287
291
|
const items = await invoker.invokeCapability<ChartSeriesCatalogItem[]>(
|
|
@@ -297,15 +301,27 @@ export async function searchChartSeriesCapabilities(
|
|
|
297
301
|
}));
|
|
298
302
|
}));
|
|
299
303
|
if (signal?.aborted) throw signal.reason ?? new DOMException("Aborted", "AbortError");
|
|
304
|
+
const errors: string[] = [];
|
|
300
305
|
for (const [index, result] of results.entries()) {
|
|
301
306
|
if (result.status === "rejected") {
|
|
307
|
+
errors.push(`${manifests[index]!.name} search unavailable.`);
|
|
302
308
|
chartSeriesLog.warn("Chart series provider catalog failed", {
|
|
303
309
|
capabilityId: manifests[index]?.id,
|
|
304
310
|
error: result.reason instanceof Error ? result.reason.message : String(result.reason),
|
|
305
311
|
});
|
|
306
312
|
}
|
|
307
313
|
}
|
|
308
|
-
return results.flatMap((result) => result.status === "fulfilled" ? result.value : []).slice(0, limit);
|
|
314
|
+
return { items: results.flatMap((result) => result.status === "fulfilled" ? result.value : []).slice(0, limit), errors };
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
/** The public list-only API keeps its existing partial-results contract. */
|
|
318
|
+
export async function searchChartSeriesCapabilities(
|
|
319
|
+
invoker: CapabilityInvoker,
|
|
320
|
+
query: string,
|
|
321
|
+
limit = 8,
|
|
322
|
+
signal?: AbortSignal,
|
|
323
|
+
): Promise<CatalogSuggestion[]> {
|
|
324
|
+
return (await searchChartSeriesCatalogs(invoker, query, limit, signal)).items;
|
|
309
325
|
}
|
|
310
326
|
|
|
311
327
|
export function chartSeriesSourceKey(
|
package/src/cli/bank-section.ts
CHANGED
|
@@ -31,7 +31,7 @@ export function nimCommand(symbol: string): string {
|
|
|
31
31
|
const definition = JSON.stringify({
|
|
32
32
|
version: 1, currency: null, criteria: [{ field: "symbol", op: "in", value: [symbol] }], sort: { field: "symbol", direction: "asc" },
|
|
33
33
|
});
|
|
34
|
-
return `
|
|
34
|
+
return `gloom fn EQS --metric kpiNimPercent --definition '${definition}'`;
|
|
35
35
|
}
|
|
36
36
|
|
|
37
37
|
/** Gloom Cloud's note for a company with no US GAAP deposits tag, which reads as if it filed 10-Qs; a foreign issuer files neither. */
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import type { DataProvider } from "../types/data-provider";
|
|
2
|
-
import { fixedUsdRate } from "../utils/currency-units";
|
|
2
|
+
import { fixedUsdRate, heldCurrencyUnit } from "../utils/currency-units";
|
|
3
3
|
import { logFailure } from "../utils/log-failure";
|
|
4
4
|
|
|
5
5
|
/** One rate a converter used: units of `baseCurrency` per unit of `currency`, and when it was observed. */
|
|
6
|
-
|
|
6
|
+
interface BaseConversion {
|
|
7
7
|
currency: string;
|
|
8
8
|
baseCurrency: string;
|
|
9
9
|
rate: number;
|
|
@@ -14,6 +14,8 @@ export interface BaseConversion {
|
|
|
14
14
|
/** Converts an amount into the base currency, and lists the rates it used so a report can state them. */
|
|
15
15
|
export type BaseConverter = ((value: number, fromCurrency: string) => Promise<number>) & {
|
|
16
16
|
conversions(): BaseConversion[];
|
|
17
|
+
/** A currency's US dollar rate as the converter reads it, so another conversion on the report uses the same rate; null when unusable. */
|
|
18
|
+
usdRate(currency: string): Promise<UsdRate | null>;
|
|
17
19
|
};
|
|
18
20
|
|
|
19
21
|
interface UsdRate {
|
|
@@ -56,22 +58,29 @@ export function createBaseConverter(
|
|
|
56
58
|
return pending;
|
|
57
59
|
};
|
|
58
60
|
|
|
61
|
+
// A minor unit converts as its major currency: pence (GBp, GBX) are a hundredth of a pound, and US cents of a dollar.
|
|
62
|
+
const base = heldCurrencyUnit(baseCurrency);
|
|
59
63
|
const convert = async (value: number, fromCurrency: string): Promise<number> => {
|
|
60
|
-
const
|
|
61
|
-
|
|
62
|
-
if (normalizedFrom === normalizedBase) return value;
|
|
64
|
+
const from = heldCurrencyUnit(fromCurrency);
|
|
65
|
+
if (from.currency === base.currency) return from.divisor === base.divisor ? value : (value / from.divisor) * base.divisor;
|
|
63
66
|
|
|
64
|
-
const [
|
|
65
|
-
if (!Number.isFinite(
|
|
66
|
-
const dates = [
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
67
|
+
const [fromRate, baseRate] = await Promise.all([getRate(from.currency), getRate(base.currency)]);
|
|
68
|
+
if (!Number.isFinite(fromRate.rate) || !Number.isFinite(baseRate.rate) || baseRate.rate <= 0) return Number.NaN;
|
|
69
|
+
const dates = [fromRate.asOf, baseRate.asOf].filter((time): time is number => time != null);
|
|
70
|
+
// The rate a report states is the major currencies' (GBP/USD), which pence convert at a hundredth of.
|
|
71
|
+
used.set(from.currency, {
|
|
72
|
+
currency: from.currency,
|
|
73
|
+
baseCurrency: base.currency,
|
|
74
|
+
rate: fromRate.rate / baseRate.rate,
|
|
71
75
|
asOf: dates.length > 0 ? Math.min(...dates) : null,
|
|
72
76
|
});
|
|
73
|
-
return (value
|
|
77
|
+
return (value / from.divisor * fromRate.rate) / baseRate.rate * base.divisor;
|
|
74
78
|
};
|
|
75
79
|
|
|
76
|
-
|
|
80
|
+
const usdRate = async (currency: string): Promise<UsdRate | null> => {
|
|
81
|
+
const leg = await getRate(heldCurrencyUnit(currency).currency);
|
|
82
|
+
return Number.isFinite(leg.rate) && leg.rate > 0 ? leg : null;
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
return Object.assign(convert, { conversions: () => [...used.values()], usdRate });
|
|
77
86
|
}
|
|
@@ -19,5 +19,5 @@ export function centralBankEventsMessage(typed: string): string | null {
|
|
|
19
19
|
if (!bank || LISTED_SYMBOLS.has(typed.trim().replace(/^\$/, "").toUpperCase())) return null;
|
|
20
20
|
const next = bank.id === "US" ? " and the next FOMC date" : bank.id === "CN" ? " and the next LPR fixing"
|
|
21
21
|
: bank.id === "SA" ? "" : " and the next decision";
|
|
22
|
-
return `${bank.id === "US" ? "Fed" : bank.short} meetings are not listed; CBR shows the rate${next} (
|
|
22
|
+
return `${bank.id === "US" ? "Fed" : bank.short} meetings are not listed; CBR shows the rate${next} (gloom fn CBR).`;
|
|
23
23
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { CliCommandDef } from "../types/plugin";
|
|
2
|
+
import { foldTypedText } from "../utils/typed-text";
|
|
2
3
|
import { fail } from "./errors";
|
|
3
4
|
import { suggestCliOption } from "./help";
|
|
4
5
|
|
|
@@ -9,13 +10,26 @@ export interface BuiltinCliCommandDef extends CliCommandDef {
|
|
|
9
10
|
* `history`; null for the rest. `args` are the command's, to name what it was given.
|
|
10
11
|
*/
|
|
11
12
|
unknownOptionHint?(flag: string, args: readonly string[]): string | null;
|
|
13
|
+
/**
|
|
14
|
+
* Whether the argument at `index` of the command's positional arguments
|
|
15
|
+
* (options and their values left out) is taken exactly as typed: a path, a
|
|
16
|
+
* note's text, JSON. Every other argument is folded (`foldCommandArgs`).
|
|
17
|
+
*/
|
|
18
|
+
keepsArgAsTyped?(positionals: readonly string[], index: number): boolean;
|
|
12
19
|
}
|
|
13
20
|
|
|
14
21
|
interface DeclaredOption {
|
|
15
22
|
flag: string;
|
|
16
23
|
takesValue: boolean;
|
|
24
|
+
/** The value names a file or a folder (`--file <path>`), which folding would rename. */
|
|
25
|
+
path: boolean;
|
|
17
26
|
}
|
|
18
27
|
|
|
28
|
+
/** A value placeholder that names a file or a folder. */
|
|
29
|
+
const PATH_VALUE = /<(?:path|file|dir)>/i;
|
|
30
|
+
/** Options whose value is a path on every command, including those that take any option (`fn`, `shot`). */
|
|
31
|
+
const PATH_OPTIONS = new Set(["--file", "--output", "--out"]);
|
|
32
|
+
|
|
19
33
|
/** `--range`, `--range=5Y`: an option. `-5`, `---`, `--` and plain words are not. */
|
|
20
34
|
const OPTION_TOKEN = /^--[a-z]/i;
|
|
21
35
|
|
|
@@ -31,7 +45,7 @@ function declaredOptions(command: CliCommandDef): Map<string, DeclaredOption> |
|
|
|
31
45
|
const trimmed = spelling.trim();
|
|
32
46
|
if (trimmed.startsWith("--<")) return null;
|
|
33
47
|
const match = /^(--?[a-z][\w-]*)(?:[ =](.+))?$/i.exec(trimmed);
|
|
34
|
-
if (match) declared.set(match[1]!, { flag: match[1]!, takesValue: match[2] != null });
|
|
48
|
+
if (match) declared.set(match[1]!, { flag: match[1]!, takesValue: match[2] != null, path: PATH_VALUE.test(match[2] ?? "") });
|
|
35
49
|
}
|
|
36
50
|
}
|
|
37
51
|
return declared;
|
|
@@ -39,7 +53,7 @@ function declaredOptions(command: CliCommandDef): Map<string, DeclaredOption> |
|
|
|
39
53
|
|
|
40
54
|
/** `--explain` on a command that has no glossary of its own points at the commands that do, and at the glossary. */
|
|
41
55
|
const EXPLAIN_HINT = "--explain follows the reports of fn <function> and portfolio show. "
|
|
42
|
-
+ "
|
|
56
|
+
+ "gloom catalog explain <term> prints what one term means; gloom catalog glossary lists every term.";
|
|
43
57
|
|
|
44
58
|
function failUnknownOption(
|
|
45
59
|
command: BuiltinCliCommandDef,
|
|
@@ -49,7 +63,7 @@ function failUnknownOption(
|
|
|
49
63
|
): never {
|
|
50
64
|
const flags = [...declared.keys()];
|
|
51
65
|
const suggestion = suggestCliOption(flag, flags);
|
|
52
|
-
const help = `See
|
|
66
|
+
const help = `See gloom help ${command.name}.`;
|
|
53
67
|
fail(`Unknown option ${flag} for ${command.name}.`, [
|
|
54
68
|
command.unknownOptionHint?.(flag, args) ?? (flag === "--explain" ? EXPLAIN_HINT : ""),
|
|
55
69
|
suggestion ? `Did you mean ${suggestion}?` : "",
|
|
@@ -79,8 +93,49 @@ export function checkCliCommandOptions(
|
|
|
79
93
|
const option = declared.get(flag);
|
|
80
94
|
if (!option) failUnknownOption(command, flag, declared, args);
|
|
81
95
|
if (!option.takesValue && equals >= 0) {
|
|
82
|
-
fail(`${flag} takes no value.`, `Write it alone, as ${flag}. See
|
|
96
|
+
fail(`${flag} takes no value.`, `Write it alone, as ${flag}. See gloom help ${command.name}.`);
|
|
83
97
|
}
|
|
84
98
|
if (option.takesValue && equals < 0) index += 1;
|
|
85
99
|
}
|
|
86
100
|
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* A command's arguments as its lookups read them: each folded once, here,
|
|
104
|
+
* before any symbol, number, date or search reads it (`foldTypedText`), so
|
|
105
|
+
* `quote GME`, `--date 2026-10-13` and `fn SIW "GME AMC"` read as
|
|
106
|
+
* typed in ASCII. A path (`--file <path>`, `--output`) and what the command
|
|
107
|
+
* keeps as typed (`keepsArgAsTyped`: a note's text, JSON) are left alone.
|
|
108
|
+
*/
|
|
109
|
+
export function foldCommandArgs(
|
|
110
|
+
command: BuiltinCliCommandDef,
|
|
111
|
+
args: readonly string[],
|
|
112
|
+
literalStart = args.length,
|
|
113
|
+
): string[] {
|
|
114
|
+
const declared = declaredOptions(command);
|
|
115
|
+
const asTyped = new Set<number>();
|
|
116
|
+
const positionals: number[] = [];
|
|
117
|
+
for (let index = 0; index < args.length; index += 1) {
|
|
118
|
+
const arg = args[index]!;
|
|
119
|
+
if (index >= literalStart || !OPTION_TOKEN.test(arg)) {
|
|
120
|
+
positionals.push(index);
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
const equals = arg.indexOf("=");
|
|
124
|
+
const flag = equals >= 0 ? arg.slice(0, equals) : arg;
|
|
125
|
+
const option = declared?.get(flag);
|
|
126
|
+
const path = option?.path || PATH_OPTIONS.has(flag);
|
|
127
|
+
if (equals >= 0) {
|
|
128
|
+
if (path) asTyped.add(index);
|
|
129
|
+
} else if (option?.takesValue || path) {
|
|
130
|
+
if (path) asTyped.add(index + 1);
|
|
131
|
+
index += 1;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
if (command.keepsArgAsTyped) {
|
|
135
|
+
const words = positionals.map((index) => foldTypedText(args[index]!));
|
|
136
|
+
positionals.forEach((index, at) => {
|
|
137
|
+
if (command.keepsArgAsTyped!(words, at)) asTyped.add(index);
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
return args.map((arg, index) => asTyped.has(index) ? arg : foldTypedText(arg));
|
|
141
|
+
}
|
package/src/cli/commands/api.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { CliCommandDef } from "../../types/plugin";
|
|
2
|
+
import type { BuiltinCliCommandDef } from "../command-options";
|
|
2
3
|
import { withCliServices } from "../context";
|
|
3
4
|
import { parseJsonPayload, requireArg, takeOption } from "./command-utils";
|
|
4
5
|
import { CLI_COMMAND_GROUPS } from "../help";
|
|
@@ -23,9 +24,11 @@ function parseOperationTarget(target: string, ctx: Parameters<CliCommandDef["exe
|
|
|
23
24
|
}
|
|
24
25
|
}
|
|
25
26
|
|
|
26
|
-
export const apiCliCommand:
|
|
27
|
+
export const apiCliCommand: BuiltinCliCommandDef = {
|
|
27
28
|
name: "api",
|
|
28
29
|
description: "List, inspect, call, or subscribe to plugin capabilities",
|
|
30
|
+
// Capability ids and JSON payloads go to the plugin as typed.
|
|
31
|
+
keepsArgAsTyped: () => true,
|
|
29
32
|
help: {
|
|
30
33
|
group: CLI_COMMAND_GROUPS.app,
|
|
31
34
|
usage: [
|
|
@@ -67,11 +70,11 @@ export const apiCliCommand: CliCommandDef = {
|
|
|
67
70
|
}
|
|
68
71
|
|
|
69
72
|
if (action === "get") {
|
|
70
|
-
const capabilityId = requireArg(args[0], "Usage:
|
|
73
|
+
const capabilityId = requireArg(args[0], "Usage: gloom api get <capability-id>", ctx);
|
|
71
74
|
const manifest = services.services.pluginRegistry.capabilities
|
|
72
75
|
.manifests()
|
|
73
76
|
.find((entry) => entry.id === capabilityId);
|
|
74
|
-
if (!manifest) ctx.fail(`Capability "${capabilityId}" is not available.`, "Run
|
|
77
|
+
if (!manifest) ctx.fail(`Capability "${capabilityId}" is not available.`, "Run gloom api list to see them.");
|
|
75
78
|
ctx.printResult({ data: manifest }, {
|
|
76
79
|
text: (data) => [
|
|
77
80
|
renderStats([
|
|
@@ -92,7 +95,7 @@ export const apiCliCommand: CliCommandDef = {
|
|
|
92
95
|
}
|
|
93
96
|
|
|
94
97
|
if (action === "invoke") {
|
|
95
|
-
const target = requireArg(args[0], "Usage:
|
|
98
|
+
const target = requireArg(args[0], "Usage: gloom api invoke <capability.operation> [json-payload]", ctx);
|
|
96
99
|
const operationTarget = parseOperationTarget(target, ctx);
|
|
97
100
|
const payload = parseJsonPayload(args[1], ctx);
|
|
98
101
|
const data = await services.services.pluginRegistry.capabilities.invoke(
|
|
@@ -105,7 +108,7 @@ export const apiCliCommand: CliCommandDef = {
|
|
|
105
108
|
}
|
|
106
109
|
|
|
107
110
|
if (action === "subscribe") {
|
|
108
|
-
const target = requireArg(args[0], "Usage:
|
|
111
|
+
const target = requireArg(args[0], "Usage: gloom api subscribe <capability.operation> [json-payload] [--limit n]", ctx);
|
|
109
112
|
const operationTarget = parseOperationTarget(target, ctx);
|
|
110
113
|
const limit = ctx.cliOptions.limit ?? 10;
|
|
111
114
|
const payload = parseJsonPayload(args[1], ctx);
|
|
@@ -133,7 +136,7 @@ export const apiCliCommand: CliCommandDef = {
|
|
|
133
136
|
return;
|
|
134
137
|
}
|
|
135
138
|
|
|
136
|
-
ctx.fail("Usage:
|
|
139
|
+
ctx.fail("Usage: gloom api list|get|invoke|subscribe");
|
|
137
140
|
});
|
|
138
141
|
},
|
|
139
142
|
};
|
|
@@ -18,7 +18,7 @@ export const brokerCliCommand: CliCommandDef = {
|
|
|
18
18
|
const type = takeOption(args, "--type");
|
|
19
19
|
const action = args[0] ?? "list";
|
|
20
20
|
if (action !== "list" && action !== "status") {
|
|
21
|
-
ctx.fail("Usage:
|
|
21
|
+
ctx.fail("Usage: gloom broker list|status [--type <broker>]");
|
|
22
22
|
}
|
|
23
23
|
await withCliServices(ctx, async (services) => {
|
|
24
24
|
ctx.printResult({
|
|
@@ -41,7 +41,7 @@ export const brokerCliCommand: CliCommandDef = {
|
|
|
41
41
|
},
|
|
42
42
|
};
|
|
43
43
|
|
|
44
|
-
/** `
|
|
44
|
+
/** `gloom ibkr` predates `broker list --type`; old scripts still run it, but help leaves it out. */
|
|
45
45
|
export const ibkrCliCommand: CliCommandDef = {
|
|
46
46
|
name: "ibkr",
|
|
47
47
|
description: "List Interactive Brokers profiles, like broker list --type ibkr",
|
|
@@ -60,7 +60,7 @@ export function rejectExtraArgs(
|
|
|
60
60
|
): void {
|
|
61
61
|
if (args.length <= max) return;
|
|
62
62
|
const command = usage.split(" ")[0];
|
|
63
|
-
ctx.fail(`${command} takes ${takes}; got ${args.join(" ")}.`, [advice, `Usage:
|
|
63
|
+
ctx.fail(`${command} takes ${takes}; got ${args.join(" ")}.`, [advice, `Usage: gloom ${usage}`].filter(Boolean).join("\n"));
|
|
64
64
|
}
|
|
65
65
|
|
|
66
66
|
/** The one argument a command takes, such as a symbol: missing fails with the usage line, extras are not dropped. */
|
|
@@ -70,7 +70,7 @@ export function requireOneArg(
|
|
|
70
70
|
noun: string,
|
|
71
71
|
ctx: CliCommandContext,
|
|
72
72
|
): string {
|
|
73
|
-
const value = requireArg(args[0], `Usage:
|
|
73
|
+
const value = requireArg(args[0], `Usage: gloom ${usage}`, ctx);
|
|
74
74
|
rejectExtraArgs(args, 1, { usage, takes: `one ${noun}`, advice: `Run it once per ${noun}.` }, ctx);
|
|
75
75
|
return value;
|
|
76
76
|
}
|
|
@@ -1,30 +1,17 @@
|
|
|
1
1
|
import { isCryptoInstrumentType } from "../../tickers/search/ranking";
|
|
2
2
|
import { isCryptoVenuePerpetual } from "../../tickers/instrument-kind";
|
|
3
3
|
import type { Quote } from "../../types/financials";
|
|
4
|
-
import { isCryptoPairSymbol } from "../../utils/crypto-pair";
|
|
4
|
+
import { isCryptoPairSymbol, MAJOR_COIN_NAMES } from "../../utils/crypto-pair";
|
|
5
5
|
import { isNotATickerMessage } from "../not-a-ticker";
|
|
6
6
|
import { groupByCompany } from "../../tickers/company-name";
|
|
7
|
+
import { DATA_SERVICE_UNREACHABLE_MESSAGE } from "../../utils/network-failure";
|
|
7
8
|
import type { TickerRecord } from "../../types/ticker";
|
|
8
9
|
|
|
9
10
|
/** Where a crypto pair that will not load can still be read. `fn CRYP` takes no argument. */
|
|
10
|
-
export const CRYPTO_BOARD_HINT = "Crypto prices may be briefly unavailable; the CRYP function (
|
|
11
|
+
export const CRYPTO_BOARD_HINT = "Crypto prices may be briefly unavailable; the CRYP function (gloom fn CRYP) shows the crypto board.";
|
|
11
12
|
|
|
12
|
-
//
|
|
13
|
-
|
|
14
|
-
const MAJOR_COINS = new Map([
|
|
15
|
-
["BTC", "bitcoin"],
|
|
16
|
-
["ETH", "ethereum"],
|
|
17
|
-
["SOL", "solana"],
|
|
18
|
-
["XRP", "XRP"],
|
|
19
|
-
["DOGE", "dogecoin"],
|
|
20
|
-
["ADA", "cardano"],
|
|
21
|
-
["LTC", "litecoin"],
|
|
22
|
-
["BCH", "bitcoin cash"],
|
|
23
|
-
["AVAX", "avalanche"],
|
|
24
|
-
["DOT", "polkadot"],
|
|
25
|
-
["LINK", "chainlink"],
|
|
26
|
-
["BNB", "BNB"],
|
|
27
|
-
]);
|
|
13
|
+
// How the note names the coin, and what a listing's name has to say before the note applies.
|
|
14
|
+
const MAJOR_COINS = MAJOR_COIN_NAMES;
|
|
28
15
|
|
|
29
16
|
/**
|
|
30
17
|
* A bare coin ticker usually resolves to a listed fund, not the coin. The note applies only when
|
|
@@ -83,7 +70,7 @@ function failureReason(message: string, symbol: string): string {
|
|
|
83
70
|
|
|
84
71
|
/**
|
|
85
72
|
* Text-mode notes under a quote table: one line per distinct failure reason (with the crypto board
|
|
86
|
-
* pointer when a failed symbol is a crypto pair), then a line for each bare coin ticker that
|
|
73
|
+
* pointer when a failed symbol is a crypto pair, unless nothing could be reached), then a line for each bare coin ticker that
|
|
87
74
|
* resolved to something else. `--exchange` names the listing on purpose, so it gets no coin note.
|
|
88
75
|
*/
|
|
89
76
|
export function quoteNotes(results: QuoteNoteResult[], options: { exchange?: string } = {}): string[] {
|
|
@@ -98,7 +85,7 @@ export function quoteNotes(results: QuoteNoteResult[], options: { exchange?: str
|
|
|
98
85
|
// "Not a ticker: APPLE." already names its symbol.
|
|
99
86
|
isNotATickerMessage(reason)
|
|
100
87
|
? reason
|
|
101
|
-
: `${symbols.join(", ")}: ${reason}${symbols.some(isCryptoPairSymbol) ? `${/[.!?]$/.test(reason) ? "" : "."} ${CRYPTO_BOARD_HINT}` : ""}`
|
|
88
|
+
: `${symbols.join(", ")}: ${reason}${symbols.some(isCryptoPairSymbol) && reason !== DATA_SERVICE_UNREACHABLE_MESSAGE ? `${/[.!?]$/.test(reason) ? "" : "."} ${CRYPTO_BOARD_HINT}` : ""}`
|
|
102
89
|
));
|
|
103
90
|
if (!options.exchange) {
|
|
104
91
|
for (const result of results) {
|
|
@@ -13,6 +13,8 @@ export const DEFAULT_FRED_START = "2021-01-01";
|
|
|
13
13
|
*/
|
|
14
14
|
const SPREAD_SERIES: ReadonlySet<string> = new Set([
|
|
15
15
|
"T10Y2Y", "T10Y3M",
|
|
16
|
+
// The 30-year mortgage rate less the 10-year Treasury, which Gloom Cloud computes on each PMMS date.
|
|
17
|
+
"MORTGAGE30US10Y",
|
|
16
18
|
...ICE_SPREAD_SERIES.map((series) => series.seriesId),
|
|
17
19
|
]);
|
|
18
20
|
|
|
@@ -42,6 +44,11 @@ export function fredInterval(frequency: string | null | undefined): string | nul
|
|
|
42
44
|
return word || null;
|
|
43
45
|
}
|
|
44
46
|
|
|
47
|
+
/** Whether a series' dates are days it was observed on (FRED's `Daily`, `Weekly, Ending Friday`), not the start of a period; false when it does not say. */
|
|
48
|
+
export function fredObservesDays(frequency: string | null | undefined): boolean {
|
|
49
|
+
return /^(?:daily|weekly)\b/i.test(frequency?.trim() ?? "");
|
|
50
|
+
}
|
|
51
|
+
|
|
45
52
|
/**
|
|
46
53
|
* The observations from the series' first one on: Gloom Cloud answers a
|
|
47
54
|
* `--start` before a series begins with a blank row for every day in between
|
|
@@ -269,8 +276,8 @@ export function fredEmptyMessage(startDate: string, latest: { date: string; valu
|
|
|
269
276
|
/** What an export of nothing on or after `--start` says to try instead: a start that reaches the latest observation. */
|
|
270
277
|
export function fredEmptyAdvice(seriesId: string, latest: { date: string } | null): string {
|
|
271
278
|
return latest
|
|
272
|
-
? `Latest observation: ${latest.date}. Try:
|
|
273
|
-
: `No observations came back for ${seriesId}. Try an earlier --start, or
|
|
279
|
+
? `Latest observation: ${latest.date}. Try: gloom fred ${seriesId} --start ${latest.date.slice(0, 4)}`
|
|
280
|
+
: `No observations came back for ${seriesId}. Try an earlier --start, or gloom fred --list for the series served.`;
|
|
274
281
|
}
|
|
275
282
|
|
|
276
283
|
/** A series as `fred --list` shows it. */
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import {
|
|
2
2
|
applyActionBinding,
|
|
3
|
+
coreActionOnChord,
|
|
3
4
|
describeKeybindingIssue,
|
|
5
|
+
formatChordForHost,
|
|
4
6
|
isCoreKeybindingActionId,
|
|
5
7
|
isTypingChord,
|
|
6
8
|
parseKeyChord,
|
|
@@ -9,7 +11,9 @@ import {
|
|
|
9
11
|
resolveKeybindings,
|
|
10
12
|
serializeKeyChord,
|
|
11
13
|
setCommandBinding,
|
|
14
|
+
takenChordMessage,
|
|
12
15
|
updateKeybindingsConfig,
|
|
16
|
+
type KeyChord,
|
|
13
17
|
} from "../../app/keybindings";
|
|
14
18
|
import type { AppConfig } from "../../types/config";
|
|
15
19
|
|
|
@@ -34,6 +38,21 @@ export function describeKeybindingsForCli(config: AppConfig): Record<string, unk
|
|
|
34
38
|
};
|
|
35
39
|
}
|
|
36
40
|
|
|
41
|
+
/**
|
|
42
|
+
* Why the first of `chords` a built-in action other than `exceptId` already
|
|
43
|
+
* uses is refused, as the shortcuts editor says it; null when none is. The
|
|
44
|
+
* table is the terminal's and the desktop's at once, so an action either has
|
|
45
|
+
* keeps its key.
|
|
46
|
+
*/
|
|
47
|
+
function takenByCoreAction(config: AppConfig, chords: readonly KeyChord[], exceptId?: string): string | null {
|
|
48
|
+
const resolved = resolveKeybindings(config.keybindings);
|
|
49
|
+
for (const chord of chords) {
|
|
50
|
+
const core = coreActionOnChord(resolved, chord, exceptId);
|
|
51
|
+
if (core) return takenChordMessage(formatChordForHost(chord, "terminal"), core);
|
|
52
|
+
}
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
|
|
37
56
|
export type KeybindingCliSetResult =
|
|
38
57
|
| { ok: true; config: AppConfig; value: unknown }
|
|
39
58
|
| { ok: false; message: string };
|
|
@@ -49,12 +68,12 @@ export function applyKeybindingCliSet(config: AppConfig, key: string, rawValue:
|
|
|
49
68
|
const target = rest.join(".");
|
|
50
69
|
const value = rawValue.trim();
|
|
51
70
|
if (!target) {
|
|
52
|
-
return { ok: false, message: `Usage:
|
|
71
|
+
return { ok: false, message: `Usage: gloom config set ${KEYBINDINGS_CONFIG_KEY}.actions.<action> <chord> or ${KEYBINDINGS_CONFIG_KEY}.commands.<chord> <query>` };
|
|
53
72
|
}
|
|
54
73
|
|
|
55
74
|
if (section === "actions") {
|
|
56
75
|
if (!isCoreKeybindingActionId(target) && !target.startsWith(PLUGIN_ACTION_PREFIX)) {
|
|
57
|
-
return { ok: false, message: `"${target}" is not a keybinding action. Run "
|
|
76
|
+
return { ok: false, message: `"${target}" is not a keybinding action. Run "gloom config get keybindings" for the list.` };
|
|
58
77
|
}
|
|
59
78
|
const lowered = value.toLowerCase();
|
|
60
79
|
if (DEFAULT_WORDS.has(lowered)) {
|
|
@@ -71,6 +90,8 @@ export function applyKeybindingCliSet(config: AppConfig, key: string, rawValue:
|
|
|
71
90
|
if (!chord) return { ok: false, message: `"${text}" is not a key chord. Examples: Ctrl+T, CmdOrCtrl+Shift+F, Alt+1, F5, \`` };
|
|
72
91
|
chords.push(chord);
|
|
73
92
|
}
|
|
93
|
+
const taken = takenByCoreAction(config, chords, target);
|
|
94
|
+
if (taken) return { ok: false, message: taken };
|
|
74
95
|
return {
|
|
75
96
|
ok: true,
|
|
76
97
|
config: updateKeybindingsConfig(config, applyActionBinding(config.keybindings, target, chords)),
|
|
@@ -91,6 +112,8 @@ export function applyKeybindingCliSet(config: AppConfig, key: string, rawValue:
|
|
|
91
112
|
if (isTypingChord(chord)) {
|
|
92
113
|
return { ok: false, message: `"${target}" would fire while typing; command bindings need Ctrl, Cmd, Alt or a function key.` };
|
|
93
114
|
}
|
|
115
|
+
const taken = takenByCoreAction(config, [chord]);
|
|
116
|
+
if (taken) return { ok: false, message: taken };
|
|
94
117
|
return {
|
|
95
118
|
ok: true,
|
|
96
119
|
config: updateKeybindingsConfig(config, setCommandBinding(config.keybindings, chord, value)),
|