gloomberb 0.18.3 → 0.18.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -8
- package/README.zh-CN.md +11 -11
- package/bin/{gloomberb → gloom} +3 -1
- package/package.json +6 -2
- package/src/account/checkout-handoff.tsx +225 -0
- package/src/account/device-signin-dialog.tsx +2 -2
- package/src/account/device-signin.ts +2 -2
- package/src/account/upgrade-dialog.tsx +1 -1
- package/src/api-client/askg.ts +2 -2
- package/src/api-client/auth.ts +2 -2
- package/src/api-client/central-bank-rates.ts +6 -0
- package/src/api-client/collections.ts +5 -1
- package/src/api-client/cot.ts +2 -0
- package/src/api-client/crypto-etf-flows.ts +37 -0
- package/src/api-client/crypto-markets.ts +60 -0
- package/src/api-client/data.ts +84 -5
- package/src/api-client/doe.ts +15 -0
- package/src/api-client/equity-screener.ts +28 -0
- package/src/api-client/exchange-announcements.ts +38 -0
- package/src/api-client/fund-facts.ts +39 -0
- package/src/api-client/futures-curve.ts +9 -1
- package/src/api-client/hiring.ts +301 -0
- package/src/api-client/index.ts +22 -5
- package/src/api-client/market-discovery.ts +14 -0
- package/src/api-client/members.ts +6 -0
- package/src/api-client/mna.ts +6 -0
- package/src/api-client/paths.ts +18 -1
- package/src/api-client/request.ts +21 -4
- package/src/api-client/short-side-publications.ts +37 -0
- package/src/api-client/socket.ts +64 -4
- package/src/api-client/swap-curve.ts +35 -0
- package/src/api-client/themes.ts +7 -1
- package/src/api-client/types.ts +90 -2
- package/src/app/pane-runtime/plugin-bindings.ts +9 -2
- package/src/app/runtime/desktop-deeplink.ts +5 -5
- package/src/app/runtime/plugin-bindings.ts +2 -2
- package/src/app/runtime/startup.ts +13 -0
- package/src/app/star-prompt/status-line.tsx +2 -2
- package/src/architecture/core-builtin-allowlist.json +5 -2
- package/src/architecture/ui-literals-allowlist.json +3 -3
- package/src/architecture/ui-tokens-allowlist.json +1 -1
- package/src/brokers/broker-portfolio-sync.ts +37 -0
- package/src/brokers/directory.ts +11 -0
- package/src/brokers/logos.ts +3 -1
- package/src/brokers/signed-in/adapter.ts +304 -26
- package/src/brokers/signed-in/client.ts +14 -2
- package/src/brokers/signed-in/connect.ts +10 -2
- package/src/brokers/sync-broker-instance.ts +9 -1
- package/src/capabilities/chart-series.ts +22 -6
- package/src/cli/bank-section.ts +1 -1
- package/src/cli/base-converter.ts +23 -14
- package/src/cli/central-bank-events.ts +1 -1
- package/src/cli/command-options.ts +59 -4
- package/src/cli/commands/api.ts +9 -6
- package/src/cli/commands/broker.ts +2 -2
- package/src/cli/commands/command-utils.ts +2 -2
- package/src/cli/commands/crypto-hints.ts +7 -20
- package/src/cli/commands/fred-series.ts +4 -2
- package/src/cli/commands/keybindings.ts +2 -2
- package/src/cli/commands/market.ts +1117 -264
- package/src/cli/commands/news-hints.ts +2 -2
- package/src/cli/commands/news-search.ts +59 -6
- package/src/cli/commands/options-leaps.ts +41 -26
- package/src/cli/commands/overview.ts +121 -48
- package/src/cli/commands/plugins.ts +9 -9
- package/src/cli/commands/remote.ts +13 -10
- package/src/cli/commands/search.ts +64 -44
- package/src/cli/commands/system.ts +27 -19
- package/src/cli/commands/themes.ts +1 -1
- package/src/cli/commands/ticker.ts +192 -47
- package/src/cli/context.ts +3 -2
- package/src/cli/desktop-pane-shot-view.ts +2 -2
- package/src/cli/desktop-pane-shot.ts +1 -1
- package/src/cli/earnings-calendar.ts +4 -4
- package/src/cli/entry.ts +18 -1
- package/src/cli/errors.ts +20 -2
- package/src/cli/exit-codes.ts +1 -1
- package/src/cli/export-source.ts +10 -4
- package/src/cli/freshness.ts +2 -8
- package/src/cli/fx-forward.ts +130 -0
- package/src/cli/fx-pair.ts +10 -9
- package/src/cli/glossary.ts +64 -20
- package/src/cli/help.ts +19 -13
- package/src/cli/history-export.ts +126 -0
- package/src/cli/history-rows.ts +196 -43
- package/src/cli/index-roots.ts +5 -45
- package/src/cli/index.ts +24 -18
- package/src/cli/known-gaps.ts +118 -25
- package/src/cli/listing-arg.ts +300 -41
- package/src/cli/name-entries.ts +30 -18
- package/src/cli/native-smoke.ts +2 -0
- package/src/cli/not-a-ticker.ts +19 -9
- package/src/cli/opentui-libc.ts +5 -0
- package/src/cli/options.ts +12 -0
- package/src/cli/pane-functions/capabilities.ts +75 -20
- package/src/cli/pane-functions/catalog.ts +24 -23
- package/src/cli/pane-functions/discovery.ts +1 -1
- package/src/cli/pane-functions/dom.ts +10 -7
- package/src/cli/pane-functions/financial-ratio-shot.ts +2 -2
- package/src/cli/pane-functions/freshness.ts +174 -23
- package/src/cli/pane-functions/function-help.ts +66 -27
- package/src/cli/pane-functions/headless.ts +24 -11
- package/src/cli/pane-functions/index.ts +18 -16
- package/src/cli/pane-functions/options.ts +22 -2
- package/src/cli/pane-functions/report-notices.ts +12 -4
- package/src/cli/pane-functions/report.ts +5 -5
- package/src/cli/pane-functions/resolver.ts +47 -10
- package/src/cli/pane-functions/screenshot-assessment.ts +322 -0
- package/src/cli/pane-functions/screenshot-bridge.ts +152 -0
- package/src/cli/pane-functions/screenshot-chart-evidence.ts +396 -0
- package/src/cli/pane-functions/screenshot-data-evidence.ts +383 -0
- package/src/cli/pane-functions/screenshot-evidence.ts +1 -1
- package/src/cli/pane-functions/screenshot-payload.ts +453 -0
- package/src/cli/pane-functions/screenshot-render.ts +316 -0
- package/src/cli/pane-functions/screenshot-types.ts +162 -0
- package/src/cli/pane-functions/shot-options.ts +8 -3
- package/src/cli/peso-dollar-rates.ts +79 -0
- package/src/cli/quote-answer.ts +38 -3
- package/src/cli/report-tables.ts +61 -16
- package/src/cli/restore-plugins.ts +29 -14
- package/src/cli/result.ts +111 -22
- package/src/cli/series-search.ts +5 -5
- package/src/cli/statement-filings.ts +19 -0
- package/src/cli/suffixed-listing-rows.ts +49 -0
- package/src/cli/symbol-args.ts +50 -15
- package/src/cli/symbol-cells.ts +120 -0
- package/src/cli/symbol-list.ts +198 -68
- package/src/cli/symbol-rows.ts +131 -25
- package/src/cli/ticker-resolution.ts +108 -11
- package/src/cli/treasury-yields.ts +5 -5
- package/src/cli/types.ts +2 -0
- package/src/cli/uncovered-instrument.ts +3 -3
- package/src/cli/unknown-command.ts +6 -6
- package/src/components/chart/composite/chart-layout.ts +131 -0
- package/src/components/chart/composite/composite-chart.tsx +373 -16
- package/src/components/chart/composite/interactions.ts +7 -2
- package/src/components/chart/composite/legend.tsx +75 -3
- package/src/components/chart/composite/levels.ts +5 -0
- package/src/components/chart/composite/panel-gestures.ts +41 -0
- package/src/components/chart/composite/panel-labels.ts +2 -1
- package/src/components/chart/composite/panel-surface.tsx +305 -11
- package/src/components/chart/composite/price-axis-labels.tsx +27 -3
- package/src/components/chart/composite/rasterizer.ts +44 -19
- package/src/components/chart/composite/scene.ts +16 -4
- package/src/components/chart/composite/text-renderer.ts +48 -21
- package/src/components/chart/composite/toolbar.tsx +52 -5
- package/src/components/chart/composite/types.ts +13 -0
- package/src/components/chart/composite/use-composite-chart-keyboard.ts +120 -13
- package/src/components/chart/composite/use-composite-value-scales.ts +44 -0
- package/src/components/chart/composite/use-composite-viewport.ts +12 -3
- package/src/components/chart/composite/value-scale.ts +149 -0
- package/src/components/chart/composite/volume-profile-paint.ts +6 -3
- package/src/components/chart/core/pointer.ts +2 -0
- package/src/components/chart-table/index.ts +2 -0
- package/src/components/chart-table/read.tsx +74 -0
- package/src/components/command-bar/commands/collection-list.ts +41 -19
- package/src/components/command-bar/commands/collection.ts +9 -3
- package/src/components/command-bar/commands/direct/index.ts +1 -1
- package/src/components/command-bar/commands/direct/runtime.ts +3 -2
- package/src/components/command-bar/pane-templates/items.ts +59 -6
- package/src/components/command-bar/pane-templates/workflow.ts +10 -1
- package/src/components/command-bar/routes/root/plugin-install.ts +1 -1
- package/src/components/command-bar/routes/root/provider-search.ts +42 -11
- package/src/components/command-bar/routes/root/results.ts +18 -4
- package/src/components/command-bar/routes/root/runtime.ts +15 -3
- package/src/components/command-bar/routes/root/search-providers.ts +25 -2
- package/src/components/command-bar/routes/root/selection.ts +6 -1
- package/src/components/command-bar/routes/root/shortcut-feedback.ts +4 -1
- package/src/components/command-bar/routes/root/shortcuts.ts +30 -3
- package/src/components/command-bar/routes/ticker-search/results.ts +73 -4
- package/src/components/command-bar/selection-runtime.ts +50 -10
- package/src/components/command-bar/surface/index.tsx +24 -2
- package/src/components/command-bar/view-model.ts +7 -0
- package/src/components/command-bar/workflow/broker.ts +2 -2
- package/src/components/command-bar/workflow/collection-actions.ts +46 -7
- package/src/components/command-bar/workflow/collection-ticker.ts +32 -4
- package/src/components/command-bar/workflow/fields.ts +8 -2
- package/src/components/command-bar/workflow/ops.ts +18 -4
- package/src/components/command-bar/workflow/portfolio-position.ts +53 -4
- package/src/components/command-bar/workflow/submit.ts +3 -2
- package/src/components/command-bar/workflow/tickers.ts +5 -1
- package/src/components/company-logo.tsx +39 -0
- package/src/components/data-table/sections.ts +4 -2
- package/src/components/form-modal/confirm.tsx +2 -1
- package/src/components/form-modal/request.ts +5 -0
- package/src/components/form-modal/routes.ts +4 -1
- package/src/components/index.ts +12 -6
- package/src/components/layout/header.tsx +7 -6
- package/src/components/layout/market-summary.ts +9 -6
- package/src/components/layout/pane/capture-status.ts +1 -1
- package/src/components/layout/pane/footer/model.ts +11 -5
- package/src/components/layout/shell/chrome.ts +19 -6
- package/src/components/layout/shell/index.tsx +2 -1
- package/src/components/layout/shell/pane/layers.tsx +19 -1
- package/src/components/layout/status-bar.tsx +2 -2
- package/src/components/market-board/index.tsx +11 -3
- package/src/components/onboarding/onboarding-wizard.tsx +1 -0
- package/src/components/onboarding/portfolio-step/broker-setup-panel.tsx +2 -2
- package/src/components/onboarding/wizard-broker-sync.ts +4 -1
- package/src/components/pane-settings-dialog/desktop.tsx +20 -7
- package/src/components/pane-settings-dialog/tui.tsx +17 -9
- package/src/components/pane-settings-dialog/value.ts +8 -1
- package/src/components/pane-settings-dialog.tsx +44 -13
- package/src/components/sign-in-code-panel.tsx +27 -19
- package/src/components/ui/column-grid.tsx +48 -4
- package/src/components/ui/country-flag-art.tsx +180 -0
- package/src/components/ui/country-flag.tsx +118 -12
- package/src/components/ui/data-table/opentui/index.tsx +61 -2
- package/src/components/ui/data-table/opentui/model.ts +109 -2
- package/src/components/ui/data-table/types.ts +1 -1
- package/src/components/ui/display.tsx +5 -1
- package/src/components/ui/index.ts +3 -1
- package/src/components/ui/logo-mark.tsx +11 -2
- package/src/components/ui/query-bar.tsx +1 -1
- package/src/components/ui/row-notes.ts +79 -0
- package/src/core/state/app/layout.ts +4 -4
- package/src/data/cached-query.ts +8 -1
- package/src/data/config/chart-settings.ts +3 -3
- package/src/data/config/home.ts +10 -2
- package/src/data/config/layout.ts +4 -1
- package/src/data/config/store/node.ts +4 -0
- package/src/data/config/store/normalize.ts +13 -3
- package/src/data/config/store/portfolio-as-of-column.ts +2 -2
- package/src/data/json-storage.ts +2 -0
- package/src/data/saved-copies.ts +84 -0
- package/src/docs/snapshot.json +65 -32
- package/src/i18n/es.ts +29 -12
- package/src/i18n/ja.ts +29 -12
- package/src/i18n/ko.ts +29 -12
- package/src/i18n/zh-cn.ts +29 -12
- package/src/i18n/zh-tw.ts +29 -12
- package/src/layout/desks.ts +1 -1
- package/src/layout/launch-layout.ts +1 -1
- package/src/layout/pane-manager/floating-actions.ts +5 -3
- package/src/layout/pane-manager/floating.ts +43 -1
- package/src/layout/pane-manager/index.ts +2 -0
- package/src/layout/selected-ticker.ts +74 -0
- package/src/market-data/depositary-pair.ts +251 -0
- package/src/market-data/futures-board.ts +1 -1
- package/src/market-data/futures-contract.ts +124 -40
- package/src/market-data/fx-closes.ts +17 -2
- package/src/market-data/hooks.tsx +19 -11
- package/src/market-data/market/change-basis.ts +49 -7
- package/src/market-data/market/freshness.ts +34 -5
- package/src/market-data/market/period-return.ts +163 -0
- package/src/market-data/market/trading-sessions.ts +13 -0
- package/src/market-data/market/year-to-date.ts +8 -13
- package/src/market-data/performance.ts +20 -14
- package/src/market-data/perpetual-premium.ts +32 -0
- package/src/market-data/published-apac-sessions.ts +2 -1
- package/src/market-data/published-futures-sessions.ts +69 -0
- package/src/market-data/quotes/contributions.ts +5 -1
- package/src/market-data/quotes/freshness.ts +42 -0
- package/src/market-data/quotes/intraday-bar.ts +37 -0
- package/src/market-data/quotes/regular-session-valuation.ts +13 -8
- package/src/market-data/quotes/resolution.ts +4 -2
- package/src/market-data/tax-equivalent.ts +1 -1
- package/src/market-data/ticker-price-returns.ts +3 -1
- package/src/news/aggregator.ts +5 -1
- package/src/news/news-model.ts +4 -0
- package/src/news/types.ts +11 -0
- package/src/notifications/app-notifier.ts +1 -1
- package/src/plugins/auto-update.ts +2 -2
- package/src/plugins/builtin/account-management/index.tsx +1 -0
- package/src/plugins/builtin/account-management/pane.tsx +9 -8
- package/src/plugins/builtin/alerts/alert-engine.ts +29 -19
- package/src/plugins/builtin/alerts/calendar-events.ts +378 -0
- package/src/plugins/builtin/alerts/cli.ts +485 -76
- package/src/plugins/builtin/alerts/command.ts +5 -10
- package/src/plugins/builtin/alerts/event-rows.ts +9 -5
- package/src/plugins/builtin/alerts/events-pane.tsx +71 -56
- package/src/plugins/builtin/alerts/events.ts +107 -5
- package/src/plugins/builtin/alerts/fired-log.ts +78 -0
- package/src/plugins/builtin/alerts/format.ts +2 -1
- package/src/plugins/builtin/alerts/headless.ts +100 -39
- package/src/plugins/builtin/alerts/history-pane.tsx +105 -62
- package/src/plugins/builtin/alerts/history-rows.ts +89 -0
- package/src/plugins/builtin/alerts/index.tsx +45 -18
- package/src/plugins/builtin/alerts/iv-level.ts +365 -0
- package/src/plugins/builtin/alerts/levels.ts +3 -3
- package/src/plugins/builtin/alerts/pane.tsx +97 -29
- package/src/plugins/builtin/alerts/price.ts +35 -0
- package/src/plugins/builtin/alerts/quotes.ts +24 -0
- package/src/plugins/builtin/alerts/research-builder.ts +84 -11
- package/src/plugins/builtin/alerts/research-rules.ts +76 -3
- package/src/plugins/builtin/alerts/scheduled-check.ts +206 -32
- package/src/plugins/builtin/alerts/scheduled-sources.ts +26 -3
- package/src/plugins/builtin/alerts/scheduled.ts +188 -29
- package/src/plugins/builtin/alerts/storage.ts +13 -10
- package/src/plugins/builtin/alerts/targets.ts +12 -3
- package/src/plugins/builtin/analytics/index.tsx +8 -2
- package/src/plugins/builtin/analytics/metrics.ts +1 -1
- package/src/plugins/builtin/analytics/risk-book.ts +215 -0
- package/src/plugins/builtin/analytics/risk-client.ts +13 -6
- package/src/plugins/builtin/analytics/risk-headless.ts +55 -21
- package/src/plugins/builtin/analytics/risk-math.ts +6 -3
- package/src/plugins/builtin/analytics/risk-model.ts +297 -104
- package/src/plugins/builtin/analytics/risk-options.ts +17 -2
- package/src/plugins/builtin/analytics/risk-pane.tsx +97 -36
- package/src/plugins/builtin/attention/pane.tsx +6 -2
- package/src/plugins/builtin/awards/headless.ts +7 -3
- package/src/plugins/builtin/awards/model.ts +18 -0
- package/src/plugins/builtin/awards/pane.tsx +6 -3
- package/src/plugins/builtin/backtest/headless.ts +3 -3
- package/src/plugins/builtin/backtest/rules.ts +41 -5
- package/src/plugins/builtin/broker-manager/add-flow.tsx +12 -7
- package/src/plugins/builtin/broker-manager/detail.tsx +47 -19
- package/src/plugins/builtin/broker-manager/footer.ts +27 -11
- package/src/plugins/builtin/broker-manager/index.tsx +21 -12
- package/src/plugins/builtin/broker-manager/keyboard.ts +1 -1
- package/src/plugins/builtin/broker-manager/model.ts +12 -2
- package/src/plugins/builtin/broker-manager/pane-actions.tsx +183 -57
- package/src/plugins/builtin/broker-manager/table.ts +28 -12
- package/src/plugins/builtin/broker-trading/account-picker.tsx +2 -1
- package/src/plugins/builtin/broker-trading/chart-levels.ts +82 -13
- package/src/plugins/builtin/broker-trading/controller.ts +45 -13
- package/src/plugins/builtin/broker-trading/dock.tsx +22 -4
- package/src/plugins/builtin/broker-trading/headless.ts +2 -1
- package/src/plugins/builtin/broker-trading/index.tsx +7 -1
- package/src/plugins/builtin/broker-trading/linked-orders.ts +148 -0
- package/src/plugins/builtin/broker-trading/order-feed.ts +75 -7
- package/src/plugins/builtin/broker-trading/orders.tsx +109 -31
- package/src/plugins/builtin/broker-trading/overview-orders.tsx +9 -3
- package/src/plugins/builtin/broker-trading/pane-model.ts +30 -2
- package/src/plugins/builtin/broker-trading/pane.tsx +110 -23
- package/src/plugins/builtin/broker-trading/ticket-parts.tsx +36 -7
- package/src/plugins/builtin/broker-trading/ticket.tsx +112 -31
- package/src/plugins/builtin/buildout/cells.tsx +4 -0
- package/src/plugins/builtin/buildout/detail/index.tsx +5 -1
- package/src/plugins/builtin/buildout/detail/ui.tsx +7 -4
- package/src/plugins/builtin/buildout/pane/index.tsx +25 -12
- package/src/plugins/builtin/buildout/pane/status.tsx +0 -4
- package/src/plugins/builtin/builtin-plugin-meta.ts +1 -1
- package/src/plugins/builtin/catalysts/detail.tsx +3 -2
- package/src/plugins/builtin/catalysts/index.tsx +1 -1
- package/src/plugins/builtin/catalysts/model.ts +49 -4
- package/src/plugins/builtin/catalysts/pane.tsx +6 -8
- package/src/plugins/builtin/central-bank-rates/client.ts +5 -0
- package/src/plugins/builtin/central-bank-rates/headless.ts +36 -10
- package/src/plugins/builtin/central-bank-rates/model.ts +33 -8
- package/src/plugins/builtin/changelog/index.tsx +1 -0
- package/src/plugins/builtin/chart-composer/catalog-inventory.ts +1 -0
- package/src/plugins/builtin/chart-composer/chart-spec-edit.ts +2 -1
- package/src/plugins/builtin/chart-composer/chart-spec.ts +7 -0
- package/src/plugins/builtin/chart-composer/cli-options.ts +2 -5
- package/src/plugins/builtin/chart-composer/data-catalog-pane.tsx +2 -1
- package/src/plugins/builtin/chart-composer/editor/controller.ts +2 -0
- package/src/plugins/builtin/chart-composer/editor.tsx +4 -1
- package/src/plugins/builtin/chart-composer/headless-schema.ts +28 -26
- package/src/plugins/builtin/chart-composer/headless.ts +253 -35
- package/src/plugins/builtin/chart-composer/index.tsx +12 -2
- package/src/plugins/builtin/chart-composer/leverage-overlay.ts +142 -0
- package/src/plugins/builtin/chart-composer/pane.tsx +127 -28
- package/src/plugins/builtin/chart-composer/series-catalog.ts +1 -0
- package/src/plugins/builtin/chart-composer/series-expression.ts +65 -6
- package/src/plugins/builtin/chart-composer/session-history.ts +15 -21
- package/src/plugins/builtin/chart-composer/session-range.ts +4 -2
- package/src/plugins/builtin/chart-composer/settings.ts +31 -19
- package/src/plugins/builtin/chart-composer/use-series-catalog.ts +5 -6
- package/src/plugins/builtin/chart-composer/viewport-labels.ts +18 -8
- package/src/plugins/builtin/chat/attachments/model.ts +3 -1
- package/src/plugins/builtin/chat/content/index.tsx +1 -1
- package/src/plugins/builtin/chat/pane-links/open.ts +1 -1
- package/src/plugins/builtin/chat/people.ts +1 -1
- package/src/plugins/builtin/clinical-trials/client.ts +5 -2
- package/src/plugins/builtin/clinical-trials/model.ts +13 -4
- package/src/plugins/builtin/clinical-trials/pane.tsx +32 -12
- package/src/plugins/builtin/clinical-trials/ticker-sponsor.ts +17 -0
- package/src/plugins/builtin/cloud/askg/controller.ts +1 -1
- package/src/plugins/builtin/cloud/askg/lock-note.ts +1 -1
- package/src/plugins/builtin/cloud/askg/tool-display.ts +1 -1
- package/src/plugins/builtin/cloud/auth-commands.ts +3 -3
- package/src/plugins/builtin/cloud/team/pane-sections.tsx +105 -47
- package/src/plugins/builtin/cloud/team/pane-ui.tsx +42 -4
- package/src/plugins/builtin/cloud/team/pane.tsx +204 -64
- package/src/plugins/builtin/cloud/thesis/store.ts +45 -22
- package/src/plugins/builtin/cloud-tweets/registration.ts +1 -0
- package/src/plugins/builtin/commodities-energy/index.tsx +29 -2
- package/src/plugins/builtin/commodities-energy/view-state.ts +2 -0
- package/src/plugins/builtin/commodity-balances/pane.tsx +11 -4
- package/src/plugins/builtin/company-attention/app-rank.tsx +7 -5
- package/src/plugins/builtin/company-attention/building-model.ts +222 -0
- package/src/plugins/builtin/company-attention/building.tsx +172 -0
- package/src/plugins/builtin/company-attention/client.ts +117 -1
- package/src/plugins/builtin/company-attention/evidence.ts +16 -3
- package/src/plugins/builtin/company-attention/headless.ts +101 -5
- package/src/plugins/builtin/company-attention/index.tsx +6 -3
- package/src/plugins/builtin/company-attention/model.ts +33 -7
- package/src/plugins/builtin/company-attention/moves-model.ts +253 -0
- package/src/plugins/builtin/company-attention/moves.tsx +159 -0
- package/src/plugins/builtin/company-attention/pane.tsx +79 -23
- package/src/plugins/builtin/company-attention/signals-model.ts +229 -0
- package/src/plugins/builtin/company-attention/signals.tsx +160 -0
- package/src/plugins/builtin/company-kpis/headless.ts +3 -2
- package/src/plugins/builtin/company-kpis/model.ts +2 -2
- package/src/plugins/builtin/company-kpis/pane.tsx +1 -1
- package/src/plugins/builtin/composite-plugins.ts +2 -1
- package/src/plugins/builtin/congress-trades/headless.ts +1 -1
- package/src/plugins/builtin/connections/index.ts +1 -0
- package/src/plugins/builtin/correlation/headless-schema.ts +3 -2
- package/src/plugins/builtin/correlation/headless.ts +5 -3
- package/src/plugins/builtin/cot/headless.ts +28 -6
- package/src/plugins/builtin/cot/model.ts +12 -0
- package/src/plugins/builtin/cot/pane.tsx +3 -2
- package/src/plugins/builtin/cpi/headless.ts +5 -1
- package/src/plugins/builtin/cpi/pane.tsx +11 -9
- package/src/plugins/builtin/credit-boards/model.ts +2 -0
- package/src/plugins/builtin/credit-documents/headless.ts +1 -1
- package/src/plugins/builtin/crypto-board/client.ts +86 -0
- package/src/plugins/builtin/crypto-board/defi-view.tsx +218 -0
- package/src/plugins/builtin/crypto-board/defi.ts +239 -0
- package/src/plugins/builtin/crypto-board/headless.ts +117 -6
- package/src/plugins/builtin/crypto-board/index.tsx +8 -3
- package/src/plugins/builtin/crypto-board/model.ts +40 -8
- package/src/plugins/builtin/crypto-board/pane.tsx +55 -21
- package/src/plugins/builtin/crypto-board/series.ts +19 -1
- package/src/plugins/builtin/crypto-etf-flows/client.ts +60 -0
- package/src/plugins/builtin/crypto-etf-flows/headless.ts +132 -0
- package/src/plugins/builtin/crypto-etf-flows/index.tsx +44 -0
- package/src/plugins/builtin/crypto-etf-flows/model.ts +121 -0
- package/src/plugins/builtin/crypto-etf-flows/pane.tsx +193 -0
- package/src/plugins/builtin/debug/index.tsx +1 -0
- package/src/plugins/builtin/dividend-yield/index.tsx +1 -1
- package/src/plugins/builtin/docs/index.tsx +1 -1
- package/src/plugins/builtin/docs/pane.tsx +2 -2
- package/src/plugins/builtin/docs/targets.ts +1 -1
- package/src/plugins/builtin/doe/client.ts +5 -1
- package/src/plugins/builtin/doe/headless.ts +12 -6
- package/src/plugins/builtin/doe/model.ts +43 -6
- package/src/plugins/builtin/doe/pane.tsx +18 -11
- package/src/plugins/builtin/earnings/board-model.ts +13 -6
- package/src/plugins/builtin/earnings/board-table.ts +4 -1
- package/src/plugins/builtin/earnings/board.tsx +253 -50
- package/src/plugins/builtin/earnings/calendar-model.ts +188 -0
- package/src/plugins/builtin/earnings/calendar.tsx +338 -0
- package/src/plugins/builtin/earnings/client.ts +4 -3
- package/src/plugins/builtin/earnings/headless.ts +53 -15
- package/src/plugins/builtin/earnings/history-model.ts +53 -36
- package/src/plugins/builtin/earnings/index.tsx +15 -22
- package/src/plugins/builtin/earnings/model.ts +17 -12
- package/src/plugins/builtin/earnings/scope.ts +89 -0
- package/src/plugins/builtin/earnings-calls/calendar.tsx +310 -0
- package/src/plugins/builtin/earnings-calls/data.ts +146 -2
- package/src/plugins/builtin/earnings-calls/headless.ts +151 -9
- package/src/plugins/builtin/earnings-calls/index.tsx +3 -3
- package/src/plugins/builtin/earnings-calls/lock-note.ts +1 -1
- package/src/plugins/builtin/earnings-calls/pane.tsx +149 -31
- package/src/plugins/builtin/earnings-calls/upcoming.ts +195 -0
- package/src/plugins/builtin/earnings-ripple/pane.tsx +10 -5
- package/src/plugins/builtin/econ/calendar-model.ts +132 -20
- package/src/plugins/builtin/econ/detail-view.tsx +48 -10
- package/src/plugins/builtin/econ/fred-catalog.ts +23 -6
- package/src/plugins/builtin/econ/fred-series-map.ts +4 -0
- package/src/plugins/builtin/econ/index.tsx +112 -25
- package/src/plugins/builtin/econ/print-watch.ts +2 -1
- package/src/plugins/builtin/econ/types.ts +32 -1
- package/src/plugins/builtin/econ-statistics/client.ts +16 -3
- package/src/plugins/builtin/econ-statistics/defs.ts +4 -0
- package/src/plugins/builtin/econ-statistics/detail.tsx +2 -2
- package/src/plugins/builtin/econ-statistics/headless.ts +13 -2
- package/src/plugins/builtin/econ-statistics/index.tsx +3 -3
- package/src/plugins/builtin/econ-statistics/pane.tsx +2 -1
- package/src/plugins/builtin/econ-statistics/stats.ts +103 -0
- package/src/plugins/builtin/econ-statistics/view.ts +16 -1
- package/src/plugins/builtin/equity-screener/client.ts +21 -3
- package/src/plugins/builtin/equity-screener/headless.ts +68 -6
- package/src/plugins/builtin/equity-screener/live.ts +1 -1
- package/src/plugins/builtin/equity-screener/model.ts +6 -0
- package/src/plugins/builtin/equity-screener/pane.tsx +45 -10
- package/src/plugins/builtin/equity-screener/screen-check.ts +90 -0
- package/src/plugins/builtin/equity-screener/ticker-check.tsx +148 -0
- package/src/plugins/builtin/estimate-revisions/headless.ts +3 -1
- package/src/plugins/builtin/estimate-revisions/lock-note.ts +3 -3
- package/src/plugins/builtin/estimate-revisions/model.ts +8 -10
- package/src/plugins/builtin/exposure/headless.ts +51 -6
- package/src/plugins/builtin/exposure/index.tsx +28 -2
- package/src/plugins/builtin/exposure/model.ts +7 -0
- package/src/plugins/builtin/exposure/pane.tsx +6 -1
- package/src/plugins/builtin/fear-greed/index.tsx +1 -1
- package/src/plugins/builtin/filing-events/index.tsx +1 -1
- package/src/plugins/builtin/futures/model.ts +10 -9
- package/src/plugins/builtin/futures/returns.ts +8 -36
- package/src/plugins/builtin/futures/table.tsx +1 -1
- package/src/plugins/builtin/futures-curve/client.ts +40 -9
- package/src/plugins/builtin/futures-curve/headless.ts +39 -17
- package/src/plugins/builtin/futures-curve/model.ts +258 -69
- package/src/plugins/builtin/futures-curve/pane.tsx +46 -17
- package/src/plugins/builtin/fx-matrix/client.ts +15 -8
- package/src/plugins/builtin/fx-matrix/headless.ts +32 -14
- package/src/plugins/builtin/fx-matrix/index.tsx +13 -11
- package/src/plugins/builtin/fx-matrix/live-legs.ts +22 -0
- package/src/plugins/builtin/fx-matrix/settings.ts +2 -1
- package/src/plugins/builtin/gpu/headless.ts +9 -4
- package/src/plugins/builtin/help/index.tsx +13 -3
- package/src/plugins/builtin/holders/beneficial-model.ts +8 -11
- package/src/plugins/builtin/holders/beneficial-report.ts +6 -5
- package/src/plugins/builtin/holders/beneficial-view.tsx +7 -3
- package/src/plugins/builtin/holders/client.ts +13 -1
- package/src/plugins/builtin/holders/format.ts +28 -17
- package/src/plugins/builtin/holders/headless.ts +46 -7
- package/src/plugins/builtin/holders/index-holders.ts +264 -0
- package/src/plugins/builtin/holders/pane.tsx +79 -15
- package/src/plugins/builtin/holders/report-rows.ts +35 -7
- package/src/plugins/builtin/holders/table-model.ts +2 -1
- package/src/plugins/builtin/holders/treemap.tsx +2 -2
- package/src/plugins/builtin/insider/headless.ts +1 -1
- package/src/plugins/builtin/insider/signals-client.ts +1 -1
- package/src/plugins/builtin/insider/signals.tsx +1 -1
- package/src/plugins/builtin/ipo-calendar/pane.tsx +7 -4
- package/src/plugins/builtin/iv-history/client.ts +20 -0
- package/src/plugins/builtin/iv-history/headless.ts +4 -4
- package/src/plugins/builtin/iv-history/index.tsx +1 -1
- package/src/plugins/builtin/iv-history/model.ts +13 -4
- package/src/plugins/builtin/iv-history/series.ts +3 -1
- package/src/plugins/builtin/jobs/lock-note.ts +1 -1
- package/src/plugins/builtin/jobs/model.ts +4 -15
- package/src/plugins/builtin/jobs/pane.tsx +7 -5
- package/src/plugins/builtin/jobs/share-bars.tsx +11 -5
- package/src/plugins/builtin/jodi/pane.tsx +10 -4
- package/src/plugins/builtin/layout-manager/index.tsx +1 -0
- package/src/plugins/builtin/macro-day/headless.ts +20 -7
- package/src/plugins/builtin/macro-day/index.tsx +3 -2
- package/src/plugins/builtin/macro-day/model.ts +29 -8
- package/src/plugins/builtin/macro-day/pane.tsx +46 -10
- package/src/plugins/builtin/macro-day/releases.ts +55 -13
- package/src/plugins/builtin/market-heatmap/data.ts +9 -2
- package/src/plugins/builtin/market-heatmap/evidence.ts +1 -1
- package/src/plugins/builtin/market-heatmap/headless.ts +9 -6
- package/src/plugins/builtin/market-heatmap/index.tsx +3 -3
- package/src/plugins/builtin/market-heatmap/model.ts +10 -7
- package/src/plugins/builtin/market-movers/client.ts +33 -19
- package/src/plugins/builtin/market-movers/headless.ts +8 -2
- package/src/plugins/builtin/market-movers/index.tsx +16 -10
- package/src/plugins/builtin/market-movers/screener.ts +29 -8
- package/src/plugins/builtin/market-movers/session-body.tsx +4 -2
- package/src/plugins/builtin/market-movers/session-table.ts +4 -2
- package/src/plugins/builtin/market-movers/table.ts +4 -1
- package/src/plugins/builtin/market-valuation/headless.ts +2 -0
- package/src/plugins/builtin/market-valuation/view.ts +5 -0
- package/src/plugins/builtin/members/headless.ts +6 -5
- package/src/plugins/builtin/members/pane.tsx +11 -4
- package/src/plugins/builtin/mna/client.ts +1 -0
- package/src/plugins/builtin/mna/detail.tsx +20 -32
- package/src/plugins/builtin/mna/distress/detail.tsx +16 -4
- package/src/plugins/builtin/mna/distress/model.ts +3 -2
- package/src/plugins/builtin/mna/distress/pane.tsx +7 -4
- package/src/plugins/builtin/mna/headless.ts +6 -13
- package/src/plugins/builtin/mna/model.ts +93 -15
- package/src/plugins/builtin/mna/pane.tsx +5 -4
- package/src/plugins/builtin/news/headless.ts +12 -6
- package/src/plugins/builtin/news/index.tsx +10 -1
- package/src/plugins/builtin/news/wire/index.tsx +3 -2
- package/src/plugins/builtin/news/wire/news/command-bar-search.ts +26 -10
- package/src/plugins/builtin/news/wire/news/query-presets.ts +6 -2
- package/src/plugins/builtin/news/wire/rss/cli.ts +3 -3
- package/src/plugins/builtin/notes/cli.ts +49 -14
- package/src/plugins/builtin/openfda/pane.tsx +1 -1
- package/src/plugins/builtin/options/carry.ts +2 -2
- package/src/plugins/builtin/options/index.tsx +1 -1
- package/src/plugins/builtin/options/view.tsx +10 -10
- package/src/plugins/builtin/options-calculator/headless.ts +46 -7
- package/src/plugins/builtin/options-scenario/client.ts +123 -28
- package/src/plugins/builtin/options-scenario/collar.ts +8 -6
- package/src/plugins/builtin/options-scenario/csp-screen-headless.ts +127 -0
- package/src/plugins/builtin/options-scenario/csp-screen-pane.tsx +165 -0
- package/src/plugins/builtin/options-scenario/csp-screen.ts +258 -0
- package/src/plugins/builtin/options-scenario/csp.ts +101 -21
- package/src/plugins/builtin/options-scenario/headless.ts +36 -15
- package/src/plugins/builtin/options-scenario/hedge.ts +20 -14
- package/src/plugins/builtin/options-scenario/index.tsx +28 -3
- package/src/plugins/builtin/options-scenario/model.ts +13 -0
- package/src/plugins/builtin/options-scenario/pane.tsx +9 -5
- package/src/plugins/builtin/perps/equity-row.tsx +11 -3
- package/src/plugins/builtin/perps/freshness.ts +8 -5
- package/src/plugins/builtin/perps/headless.ts +3 -1
- package/src/plugins/builtin/perps/list-perpetuals.ts +25 -4
- package/src/plugins/builtin/perps/live-rows.ts +161 -0
- package/src/plugins/builtin/perps/markets-section.tsx +154 -0
- package/src/plugins/builtin/perps/pane.tsx +36 -17
- package/src/plugins/builtin/perps/venue-markets.ts +96 -0
- package/src/plugins/builtin/plugin-marketplace/index.tsx +2 -1
- package/src/plugins/builtin/plugin-marketplace/pane.tsx +143 -59
- package/src/plugins/builtin/portfolio-list/cli/bulk-symbols.ts +72 -24
- package/src/plugins/builtin/portfolio-list/cli/portfolio-command.ts +158 -141
- package/src/plugins/builtin/portfolio-list/cli/render.ts +49 -20
- package/src/plugins/builtin/portfolio-list/cli/shared.ts +3 -3
- package/src/plugins/builtin/portfolio-list/cli/watchlist-command.ts +29 -24
- package/src/plugins/builtin/portfolio-list/headless.ts +6 -3
- package/src/plugins/builtin/portfolio-list/income.ts +13 -2
- package/src/plugins/builtin/portfolio-list/index.tsx +9 -2
- package/src/plugins/builtin/portfolio-list/pane/index.tsx +21 -8
- package/src/plugins/builtin/portfolio-list/pane/purchase-date-fx.ts +46 -0
- package/src/plugins/builtin/portfolio-list/summary/live-accounts.ts +16 -9
- package/src/plugins/builtin/portfolio-list/summary/totals.ts +2 -15
- package/src/plugins/builtin/power/client.ts +4 -1
- package/src/plugins/builtin/power/evidence.ts +22 -7
- package/src/plugins/builtin/power/gas.tsx +5 -1
- package/src/plugins/builtin/power/pane.tsx +8 -1
- package/src/plugins/builtin/power/prices.tsx +10 -3
- package/src/plugins/builtin/research/analyst-headless.ts +25 -8
- package/src/plugins/builtin/research/analyst-model.ts +68 -3
- package/src/plugins/builtin/research/corporate-actions-pane.tsx +63 -14
- package/src/plugins/builtin/research/event-model.ts +3 -1
- package/src/plugins/builtin/research/event-sources.ts +12 -4
- package/src/plugins/builtin/research/index.tsx +2 -1
- package/src/plugins/builtin/research/relative-valuation-basis.ts +58 -0
- package/src/plugins/builtin/research/relative-valuation-columns.ts +31 -2
- package/src/plugins/builtin/research/relative-valuation-currency.ts +12 -5
- package/src/plugins/builtin/research/relative-valuation-headless.ts +84 -26
- package/src/plugins/builtin/research/relative-valuation-model.ts +88 -19
- package/src/plugins/builtin/research/relative-valuation-pane.tsx +76 -9
- package/src/plugins/builtin/research/relative-valuation-peers.ts +1 -1
- package/src/plugins/builtin/reverse-dcf/model.ts +6 -2
- package/src/plugins/builtin/risk-factors/index.tsx +2 -2
- package/src/plugins/builtin/scanner/lock-note.ts +1 -1
- package/src/plugins/builtin/sec/forms.ts +13 -0
- package/src/plugins/builtin/sec/fund-abroad.ts +32 -0
- package/src/plugins/builtin/sec/fund-facts.ts +68 -8
- package/src/plugins/builtin/sec/headless.ts +85 -8
- package/src/plugins/builtin/sec/index.tsx +58 -12
- package/src/plugins/builtin/sectors/client.ts +2 -1
- package/src/plugins/builtin/sectors/sector-model.ts +11 -15
- package/src/plugins/builtin/series-inventory.ts +2 -0
- package/src/plugins/builtin/shared/broker-reconnect.ts +107 -22
- package/src/plugins/builtin/shared/cloud-upgrade.ts +34 -6
- package/src/plugins/builtin/shared/earnings-calendar.ts +375 -0
- package/src/plugins/builtin/{earnings/estimate-basis.ts → shared/earnings-estimate-basis.ts} +1 -1
- package/src/plugins/builtin/shared/earnings-report.ts +3 -3
- package/src/plugins/builtin/shared/fx-rate-freshness.ts +23 -1
- package/src/plugins/builtin/shared/job-posting.ts +129 -0
- package/src/plugins/builtin/shared/pro-lock-note.ts +3 -3
- package/src/plugins/builtin/shared/report-freshness.ts +3 -0
- package/src/plugins/builtin/shared/research-trading.tsx +21 -0
- package/src/plugins/builtin/shared/series-cache.ts +2 -0
- package/src/plugins/builtin/shared/ticker-surface.ts +2 -1
- package/src/plugins/builtin/short-interest/client.ts +2 -0
- package/src/plugins/builtin/short-interest/headless.ts +41 -12
- package/src/plugins/builtin/short-interest/index.tsx +23 -1
- package/src/plugins/builtin/short-interest/model.ts +70 -19
- package/src/plugins/builtin/short-interest/pane.tsx +19 -2
- package/src/plugins/builtin/short-interest/publications-client.ts +82 -0
- package/src/plugins/builtin/short-interest/publications-headless.ts +29 -0
- package/src/plugins/builtin/short-interest/publications-model.ts +50 -0
- package/src/plugins/builtin/short-interest/publications-pane.tsx +66 -0
- package/src/plugins/builtin/short-interest/schedule.ts +35 -2
- package/src/plugins/builtin/short-interest/surface.tsx +11 -4
- package/src/plugins/builtin/short-interest/types.ts +9 -0
- package/src/plugins/builtin/short-interest/watch-client.ts +14 -8
- package/src/plugins/builtin/short-interest/watch-model.ts +12 -25
- package/src/plugins/builtin/short-interest/watch-pane.tsx +5 -1
- package/src/plugins/builtin/supply-chain/flow.tsx +33 -9
- package/src/plugins/builtin/supply-chain/model.ts +51 -3
- package/src/plugins/builtin/supply-chain/pane.tsx +78 -39
- package/src/plugins/builtin/supply-chain/row-evidence.tsx +1 -1
- package/src/plugins/builtin/themes/headless.ts +8 -5
- package/src/plugins/builtin/themes/model.ts +14 -4
- package/src/plugins/builtin/themes/pane.tsx +24 -5
- package/src/plugins/builtin/thirteenf/headless.ts +5 -5
- package/src/plugins/builtin/thirteenf/signals.ts +3 -1
- package/src/plugins/builtin/ticker-detail/adr-pair/headless.ts +123 -0
- package/src/plugins/builtin/ticker-detail/adr-pair/model.ts +132 -0
- package/src/plugins/builtin/ticker-detail/adr-pair/tab.tsx +87 -0
- package/src/plugins/builtin/ticker-detail/data-panes/historical-prices.tsx +40 -26
- package/src/plugins/builtin/ticker-detail/data-panes/history-bars.ts +8 -4
- package/src/plugins/builtin/ticker-detail/data-panes/returns-history.ts +67 -3
- package/src/plugins/builtin/ticker-detail/data-panes/returns-model.ts +112 -5
- package/src/plugins/builtin/ticker-detail/data-panes/returns-pane.tsx +17 -2
- package/src/plugins/builtin/ticker-detail/financials/aggregation.ts +21 -7
- package/src/plugins/builtin/ticker-detail/financials/model.ts +36 -1
- package/src/plugins/builtin/ticker-detail/financials/offerings.ts +56 -0
- package/src/plugins/builtin/ticker-detail/financials/ratios.ts +62 -13
- package/src/plugins/builtin/ticker-detail/financials/tab.tsx +30 -4
- package/src/plugins/builtin/ticker-detail/headless-schema.ts +14 -2
- package/src/plugins/builtin/ticker-detail/headless.ts +148 -35
- package/src/plugins/builtin/ticker-detail/index.tsx +37 -5
- package/src/plugins/builtin/ticker-detail/overview/model.ts +65 -10
- package/src/plugins/builtin/ticker-detail/overview/pane.tsx +9 -1
- package/src/plugins/builtin/ticker-detail/overview-tab.tsx +68 -11
- package/src/plugins/builtin/ticker-detail/pane.tsx +11 -0
- package/src/plugins/builtin/ticker-detail/quote-footer.ts +8 -3
- package/src/plugins/builtin/ticker-detail/research-tabs.ts +11 -0
- package/src/plugins/builtin/vol-surface/client.ts +5 -4
- package/src/plugins/builtin/vol-surface/headless.ts +12 -3
- package/src/plugins/builtin/vol-surface/model.ts +4 -2
- package/src/plugins/builtin/volatility/model.ts +5 -10
- package/src/plugins/builtin/world-venue-map/basemap-layer.tsx +4 -3
- package/src/plugins/builtin/world-venue-map/basemap.ts +3 -1
- package/src/plugins/builtin/world-venue-map/chokepoint-chart.ts +40 -0
- package/src/plugins/builtin/world-venue-map/evidence.ts +1 -1
- package/src/plugins/builtin/world-venue-map/geo-series.ts +90 -11
- package/src/plugins/builtin/world-venue-map/headless.ts +1 -1
- package/src/plugins/builtin/world-venue-map/index.ts +3 -26
- package/src/plugins/builtin/world-venue-map/layers.ts +1 -1
- package/src/plugins/builtin/world-venue-map/map.tsx +2 -1
- package/src/plugins/builtin/world-venue-map/pane.tsx +4 -2
- package/src/plugins/builtin/world-venue-map/venue-header.tsx +15 -4
- package/src/plugins/builtin/yield-curve/client.ts +25 -0
- package/src/plugins/builtin/yield-curve/curves.ts +7 -4
- package/src/plugins/builtin/yield-curve/headless.ts +38 -4
- package/src/plugins/builtin/yield-curve/history.ts +4 -3
- package/src/plugins/builtin/yield-curve/index.tsx +12 -6
- package/src/plugins/builtin/yield-curve/swaps-model.ts +93 -0
- package/src/plugins/builtin/yield-curve/swaps.tsx +99 -0
- package/src/plugins/bundle.ts +1 -1
- package/src/plugins/catalog-browser.ts +2 -1
- package/src/plugins/compat.ts +3 -3
- package/src/plugins/dependencies.ts +75 -14
- package/src/plugins/extracted-plugins.ts +132 -34
- package/src/plugins/host-link.ts +149 -34
- package/src/plugins/installer.ts +35 -10
- package/src/plugins/loader.ts +206 -38
- package/src/plugins/manager-node.ts +2 -2
- package/src/plugins/marketplace/deactivation.ts +22 -0
- package/src/plugins/marketplace/model.ts +2 -2
- package/src/plugins/marketplace/packs.ts +1 -1
- package/src/plugins/ownership.ts +1 -1
- package/src/plugins/peer-retry.ts +155 -0
- package/src/plugins/registry/contributions.ts +3 -1
- package/src/plugins/registry/index.ts +4 -3
- package/src/plugins/registry/plugin-state.ts +3 -0
- package/src/plugins/seed-notice.ts +20 -0
- package/src/plugins/shortcut-argument.ts +39 -0
- package/src/portfolio/allocation.ts +1 -1
- package/src/portfolio/collection-name.ts +31 -0
- package/src/portfolio/column-values.ts +10 -8
- package/src/portfolio/cost-fx.ts +296 -19
- package/src/portfolio/manual-lots.ts +75 -0
- package/src/portfolio/mutations.ts +60 -22
- package/src/portfolio/suffixed-listings.ts +209 -0
- package/src/portfolio/totals-currency.ts +24 -0
- package/src/public/__snapshots__/public-api.test.ts.snap +14 -0
- package/src/public/time-series.ts +11 -8
- package/src/remote/schema.ts +1 -1
- package/src/renderers/browser/config-host.ts +3 -0
- package/src/renderers/browser/main.tsx +23 -3
- package/src/renderers/dom/boot-frame-page.ts +187 -0
- package/src/renderers/dom/boot-frame.ts +237 -0
- package/src/renderers/dom/build-assets.ts +46 -8
- package/src/renderers/dom/dom-ui-host.tsx +4 -29
- package/src/renderers/dom/host/ascii-text.ts +16 -2
- package/src/renderers/dom/host/box.tsx +43 -2
- package/src/renderers/dom/host/chart-surface.tsx +2 -0
- package/src/renderers/dom/host/hls.chunk.ts +3 -0
- package/src/renderers/dom/host/image-surface.tsx +49 -0
- package/src/renderers/dom/host/media-surface.tsx +24 -18
- package/src/renderers/dom/host/mouse.ts +30 -0
- package/src/renderers/dom/host/size-observer.ts +1 -1
- package/src/renderers/dom/host/style.ts +1 -1
- package/src/renderers/dom/styles.css +76 -0
- package/src/renderers/dom/test-utils.tsx +2 -1
- package/src/renderers/electrobun/bun/application-menu/index.ts +3 -3
- package/src/renderers/electrobun/bun/desktop/backend-requests.ts +3 -0
- package/src/renderers/electrobun/bun/desktop/backend.ts +46 -3
- package/src/renderers/electrobun/bun/desktop/detached-windows.ts +1 -1
- package/src/renderers/electrobun/bun/desktop/host-requests.ts +9 -3
- package/src/renderers/electrobun/bun/desktop/initialization.ts +81 -18
- package/src/renderers/electrobun/bun/external-plugins.ts +29 -7
- package/src/renderers/electrobun/bun/index.ts +11 -1
- package/src/renderers/electrobun/bun/window/boot-frame.ts +67 -0
- package/src/renderers/electrobun/bun/window/create.ts +4 -1
- package/src/renderers/electrobun/shared/boot-frame.ts +7 -0
- package/src/renderers/electrobun/shared/protocol.ts +6 -1
- package/src/renderers/electrobun/view/cli-pane-shot-entry.tsx +1 -1
- package/src/renderers/electrobun/view/config-host.ts +3 -0
- package/src/renderers/electrobun/view/fatal-screen.tsx +1 -1
- package/src/renderers/electrobun/view/main.tsx +30 -4
- package/src/renderers/electrobun/view/news-source.ts +5 -5
- package/src/renderers/electrobun/view/remote/asset-data-client.ts +1 -1
- package/src/renderers/electrobun/view/ui-host.tsx +1 -1
- package/src/renderers/opentui/browser-open.ts +88 -0
- package/src/renderers/opentui/host.tsx +5 -14
- package/src/renderers/opentui/image/loader.ts +3 -2
- package/src/renderers/opentui/native-smoke.ts +10 -1
- package/src/renderers/opentui/pane-image/index.ts +2 -1
- package/src/renderers/opentui/render-lib.ts +253 -0
- package/src/renderers/opentui/render-timing-smoke.ts +1 -1
- package/src/renderers/opentui/start.tsx +1 -1
- package/src/renderers/share/layout-view.tsx +2 -2
- package/src/renderers/share/main.tsx +4 -4
- package/src/renderers/share/view.tsx +1 -1
- package/src/series/resolve.ts +22 -6
- package/src/series/standalone.ts +30 -2
- package/src/series/types.ts +8 -1
- package/src/shares/api.ts +4 -1
- package/src/shares/pane.ts +1 -1
- package/src/sources/gloomberb-cloud/fred-series.ts +46 -1
- package/src/sources/gloomberb-cloud/index.ts +32 -16
- package/src/sources/gloomberb-cloud/news.ts +39 -0
- package/src/sources/gloomberb-cloud/normalizers.ts +14 -1
- package/src/sources/gloomberb-cloud/perpetuals.ts +49 -1
- package/src/sources/listing-symbols.ts +37 -0
- package/src/sources/provider-errors.ts +16 -2
- package/src/sources/provider-router/financial-routes.ts +21 -3
- package/src/sources/provider-router/financials.ts +15 -2
- package/src/sources/provider-router/history.ts +30 -8
- package/src/sources/provider-router/primary.ts +1 -1
- package/src/state/app/bootstrap.ts +23 -0
- package/src/state/hooks/inline-tickers.ts +30 -5
- package/src/sync/controller.ts +1 -1
- package/src/sync/core-contributors.ts +46 -14
- package/src/team/collections-sync.ts +2 -1
- package/src/team/collections.ts +178 -17
- package/src/telemetry/crash-reports.ts +17 -4
- package/src/test-support/builtin-panes.ts +1 -1
- package/src/theme/colors.ts +3 -30
- package/src/theme/ui-tokens.ts +37 -1
- package/src/tickers/company-name-listing.ts +210 -33
- package/src/tickers/index-roots.ts +47 -0
- package/src/tickers/instrument-label.ts +5 -1
- package/src/tickers/metadata.ts +10 -0
- package/src/tickers/perpetual-listing.ts +5 -2
- package/src/tickers/search/home-listing.ts +75 -0
- package/src/tickers/search/index.ts +76 -27
- package/src/tickers/search/ranking.ts +54 -4
- package/src/tickers/search/upsert.ts +29 -0
- package/src/tickers/terminal-codes.ts +416 -40
- package/src/time-series/bar-aggregation.ts +243 -0
- package/src/time-series/base-series.ts +307 -0
- package/src/time-series/chart-bounds.ts +349 -0
- package/src/time-series/chart-seed.ts +142 -0
- package/src/time-series/economic.ts +5 -0
- package/src/time-series/fundamentals.ts +18 -3
- package/src/time-series/history-acquisition.ts +499 -0
- package/src/time-series/leverage.ts +100 -0
- package/src/time-series/market-resolution.ts +4 -2
- package/src/time-series/market.ts +2 -1
- package/src/time-series/price-comparison.ts +175 -30
- package/src/time-series/range.ts +9 -1
- package/src/time-series/resolution.ts +174 -16
- package/src/time-series/resolve-context.ts +157 -0
- package/src/time-series/resolve.ts +126 -1577
- package/src/time-series/series-name.ts +38 -0
- package/src/time-series/series-presentation.ts +208 -0
- package/src/time-series/spec.ts +11 -6
- package/src/time-series/studies.ts +109 -12
- package/src/time-series/tail-reconcile.ts +121 -0
- package/src/time-series/types.ts +29 -2
- package/src/time-series/use-chart-resolution.ts +4 -5
- package/src/types/broker.ts +10 -0
- package/src/types/config.ts +14 -0
- package/src/types/data-provider.ts +14 -0
- package/src/types/exchange-rate.ts +6 -0
- package/src/types/financials.ts +104 -7
- package/src/types/headless.ts +76 -6
- package/src/types/instrument.ts +3 -0
- package/src/types/plugin.ts +65 -8
- package/src/types/price-history.ts +2 -0
- package/src/types/ticker.ts +13 -0
- package/src/types/trading.ts +59 -1
- package/src/ui/ascii-font.ts +13 -1
- package/src/ui/host.tsx +6 -1
- package/src/updater/command-names.ts +175 -0
- package/src/updater/index.ts +10 -5
- package/src/utils/calendar-date.ts +32 -15
- package/src/utils/cash-runway.ts +241 -0
- package/src/utils/central-banks.ts +42 -0
- package/src/utils/cli-output.ts +259 -80
- package/src/utils/contract-month.ts +16 -0
- package/src/utils/crypto-pair.ts +61 -3
- package/src/utils/currency-units.ts +29 -0
- package/src/utils/datetime-format.ts +10 -0
- package/src/utils/debug-log.ts +1 -1
- package/src/utils/decimal-comma.ts +39 -6
- package/src/utils/exchange-announcements.ts +71 -0
- package/src/utils/exchange-rate-snapshot.ts +10 -0
- package/src/utils/financial-statements.ts +83 -4
- package/src/utils/format.ts +34 -16
- package/src/utils/fundamentals.ts +150 -34
- package/src/utils/fx-market-hours.ts +10 -1
- package/src/utils/latest-financial-period.ts +8 -0
- package/src/utils/linux-libc.ts +54 -0
- package/src/utils/market-capitalization.ts +111 -15
- package/src/utils/max-drawdown.ts +64 -0
- package/src/utils/network-failure.ts +83 -0
- package/src/utils/option-expiry.ts +139 -7
- package/src/utils/price-earnings.ts +11 -5
- package/src/utils/price-history.ts +18 -8
- package/src/utils/price-window.ts +131 -0
- package/src/utils/release-date.ts +47 -0
- package/src/utils/sec.ts +3 -0
- package/src/utils/throttled-fetch.ts +11 -4
- package/src/utils/trailing-eps.ts +67 -0
- package/src/utils/typed-text.ts +21 -0
- package/src/utils/utc-time.ts +24 -1
- package/src/version.ts +6 -0
- package/src/cli/pane-functions/screenshot.ts +0 -2122
|
@@ -24,8 +24,8 @@ export const SHOT_VIEW_SCRIPT = "cli-pane-shot-entry.js";
|
|
|
24
24
|
export const SHOT_VIEW_STYLESHEET = "styles.css";
|
|
25
25
|
export const SHOT_VIEW_ARCHIVE = "shot-view.json.gz";
|
|
26
26
|
|
|
27
|
-
const MISSING_VIEW_MESSAGE = "This copy of
|
|
28
|
-
+ "Reinstall or update
|
|
27
|
+
const MISSING_VIEW_MESSAGE = "This copy of Gloom cannot draw panes: it was built without the page they are drawn in. "
|
|
28
|
+
+ "Reinstall or update Gloom. The standalone gloom binary "
|
|
29
29
|
+ "(https://github.com/gloom-sh/gloomberb/releases/latest) also includes it.";
|
|
30
30
|
|
|
31
31
|
let prebuiltArchive: string | null = null;
|
|
@@ -257,7 +257,7 @@ function shotPageHtml(view: ShotViewFiles, payload: DesktopPaneShotPayload): str
|
|
|
257
257
|
return renderElectrobunViewHtml({
|
|
258
258
|
stylesheet: view.get(SHOT_VIEW_STYLESHEET) ?? "",
|
|
259
259
|
entrySrc: `./${SHOT_VIEW_SCRIPT}`,
|
|
260
|
-
title: "
|
|
260
|
+
title: "Gloom Pane Shot",
|
|
261
261
|
loadingText: "Rendering pane...",
|
|
262
262
|
bootstrapScript: `
|
|
263
263
|
window.__GLOOM_CLI_SHOT_PAYLOAD__ = ${payloadJson};
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import { logFailure } from "../utils/log-failure";
|
|
2
2
|
import type { EarningsEvent } from "../types/data-provider";
|
|
3
|
+
import type { EarningsDateStatus } from "../types/financials";
|
|
3
4
|
import { isUsListingExchange } from "../utils/exchanges";
|
|
4
5
|
import { listingChoiceNote, loadListingQuote, usLineOfListing, type CliListing, type ListingDeps, type ListingVenue } from "./listing-arg";
|
|
5
6
|
import { sameCompany } from "../tickers/company-name";
|
|
6
7
|
|
|
7
8
|
const DAY_MS = 86_400_000;
|
|
8
9
|
|
|
9
|
-
/** How firm a report date is
|
|
10
|
-
export function earningsDateLabel(
|
|
11
|
-
|
|
12
|
-
return event.isDateEstimate === true ? "est" : event.isDateEstimate === false ? "confirmed" : "";
|
|
10
|
+
/** How firm a report date is, as resolved (shared/earnings-calendar): reported, confirmed, or est for a projected one. */
|
|
11
|
+
export function earningsDateLabel(status: EarningsDateStatus | null): string {
|
|
12
|
+
return status === "projected" ? "est" : status ?? "";
|
|
13
13
|
}
|
|
14
14
|
|
|
15
15
|
/** Whether the listing trades abroad, where the calendar is the listing's own exchange's rather than the US one. */
|
package/src/cli/entry.ts
CHANGED
|
@@ -1,12 +1,15 @@
|
|
|
1
|
-
import
|
|
1
|
+
import "./opentui-libc";
|
|
2
2
|
import { inferCliErrorOptions, printCliError } from "./errors";
|
|
3
3
|
import { isCliHelpFlag } from "./options";
|
|
4
|
+
import { plainByDefault, setCliPlainOverride } from "../utils/cli-output";
|
|
4
5
|
import { loadExternalPlugins } from "../plugins/loader";
|
|
5
6
|
import { restoreExtractedPlugins } from "./restore-plugins";
|
|
6
7
|
import { measurePerfAsync } from "../utils/perf-marks";
|
|
7
8
|
import { flushCrashReports, reportCrash } from "../telemetry/crash-reports";
|
|
8
9
|
import { CRASH_REPORT_EXIT_FLUSH_MS } from "../telemetry/crash-reports-node";
|
|
9
10
|
import type { CliLaunchRequest } from "../types/plugin";
|
|
11
|
+
import { detectUpdateAction } from "../updater";
|
|
12
|
+
import { linkStandaloneCommand } from "../updater/command-names";
|
|
10
13
|
import {
|
|
11
14
|
OPEN_TUI_NATIVE_SMOKE_COMMAND,
|
|
12
15
|
OPEN_TUI_RUNTIME_SMOKE_COMMAND,
|
|
@@ -19,6 +22,10 @@ import {
|
|
|
19
22
|
} from "./native-smoke";
|
|
20
23
|
|
|
21
24
|
async function launchOpenTuiApp(cliLaunchRequest: CliLaunchRequest | null = null): Promise<void> {
|
|
25
|
+
// Before anything in the app can reach for the render library, so a temp
|
|
26
|
+
// folder that cannot run it is worked around (or named) first.
|
|
27
|
+
const { loadRenderLib } = await import("../renderers/opentui/render-lib");
|
|
28
|
+
await measurePerfAsync("startup.opentui.render-lib", loadRenderLib);
|
|
22
29
|
const { startOpenTuiApp } = await import("../renderers/opentui/start");
|
|
23
30
|
// Before the catalog is read, so a plugin that moved out of this repository is
|
|
24
31
|
// available in the same session rather than only after a restart.
|
|
@@ -58,11 +65,21 @@ export async function runCliEntrypoint(rawArgs = process.argv.slice(2)): Promise
|
|
|
58
65
|
process.exit(0);
|
|
59
66
|
}
|
|
60
67
|
|
|
68
|
+
// The standalone binary updates by replacing itself, so one installed as
|
|
69
|
+
// `gloomberb` before the rename gets `gloom` beside it here.
|
|
70
|
+
if (detectUpdateAction()?.kind === "self") linkStandaloneCommand(process.execPath);
|
|
71
|
+
|
|
61
72
|
if (!command || ((command === "launch-ui" || command === "ui") && !rawArgs.some(isCliHelpFlag))) {
|
|
62
73
|
await launchOpenTuiApp();
|
|
63
74
|
return;
|
|
64
75
|
}
|
|
65
76
|
|
|
77
|
+
// Loaded only for a command: a bare launch never reads the commands, and
|
|
78
|
+
// their modules are a noticeable part of what it would load before drawing.
|
|
79
|
+
const { dispatchCli, failUnknownCliCommand } = await import("./index");
|
|
80
|
+
// For a screen reader, a pipe or NO_COLOR: no rule lines, arrows in words, fixed table columns. Set
|
|
81
|
+
// for this process only; `--plain` / `--no-plain` decide it in dispatchCli, and commands run in-process keep theirs.
|
|
82
|
+
setCliPlainOverride(plainByDefault());
|
|
66
83
|
const externalPlugins = await loadExternalPlugins();
|
|
67
84
|
const dispatchResult = await dispatchCli(rawArgs, { externalPlugins });
|
|
68
85
|
if (dispatchResult.kind === "handled") return;
|
package/src/cli/errors.ts
CHANGED
|
@@ -5,17 +5,29 @@ import { serializeCliError, type CliErrorObject } from "./result";
|
|
|
5
5
|
import { cliStyles, cliTerminalWidth, wrapText } from "../utils/cli-output";
|
|
6
6
|
import { withSearchHints, type FredSeriesCheck } from "./not-a-ticker";
|
|
7
7
|
import { isProviderBusy, SEARCH_BUSY_CODE, SEARCH_BUSY_MESSAGE } from "../sources/provider-errors";
|
|
8
|
+
import { DATA_SERVICE_UNREACHABLE_MESSAGE, isNetworkFailure } from "../utils/network-failure";
|
|
8
9
|
|
|
9
10
|
const USAGE_PREFIX = "Usage: ";
|
|
10
11
|
/** The code of every error a command fails with: bad input, nothing found, an option it does not take. */
|
|
11
12
|
const CLI_ERROR_CODE = "cli_error";
|
|
13
|
+
/** The code of a command whose requests never reached the data service. */
|
|
14
|
+
const SERVICE_UNREACHABLE_CODE = "service_unreachable";
|
|
15
|
+
|
|
16
|
+
/** What to check when nothing answered: the connection, and the proxy when one is set. */
|
|
17
|
+
function unreachableHint(): string {
|
|
18
|
+
const env = typeof process === "undefined" ? {} : process.env;
|
|
19
|
+
const proxy = ["HTTPS_PROXY", "https_proxy", "ALL_PROXY", "all_proxy"].find((name) => env[name]?.trim());
|
|
20
|
+
return proxy
|
|
21
|
+
? `Check the internet connection and the proxy in ${proxy}, then try again.`
|
|
22
|
+
: "Check the internet connection, then try again.";
|
|
23
|
+
}
|
|
12
24
|
|
|
13
25
|
export interface CliErrorContext {
|
|
14
26
|
/** The command that failed, used to point at its help. */
|
|
15
27
|
command?: string;
|
|
16
28
|
/** What the user typed after the command, so a hint can repeat their own spelling of a symbol. */
|
|
17
29
|
args?: readonly string[];
|
|
18
|
-
/** Which symbols are FRED series the catalog charts, so their hint is `
|
|
30
|
+
/** Which symbols are FRED series the catalog charts, so their hint is `gloom fred`. */
|
|
19
31
|
isFredSeries?: FredSeriesCheck;
|
|
20
32
|
}
|
|
21
33
|
|
|
@@ -82,6 +94,10 @@ function cliErrorObject(error: unknown): CliErrorObject {
|
|
|
82
94
|
if (isProviderBusy(error)) {
|
|
83
95
|
return { code: SEARCH_BUSY_CODE, message: SEARCH_BUSY_MESSAGE, retryable: true };
|
|
84
96
|
}
|
|
97
|
+
// No answer came back at all: in Gloom's words, whichever fetch failed (Bun's "Unable to connect", a refused proxy).
|
|
98
|
+
if (isNetworkFailure(error)) {
|
|
99
|
+
return { code: SERVICE_UNREACHABLE_CODE, message: DATA_SERVICE_UNREACHABLE_MESSAGE, details: unreachableHint(), retryable: true };
|
|
100
|
+
}
|
|
85
101
|
// Gloom Cloud refused what was asked (an unknown series, a bad date): the input was wrong, not the program.
|
|
86
102
|
if (error instanceof ApiRequestError && error.status === 400) {
|
|
87
103
|
return { code: CLI_ERROR_CODE, message: error.message };
|
|
@@ -102,6 +118,8 @@ export function inferCliErrorOptions(rawArgs: string[]): CliGlobalOptions {
|
|
|
102
118
|
if (arg === "--quiet" || arg === "-q") options.quiet = true;
|
|
103
119
|
if (arg === "--no-color") options.color = false;
|
|
104
120
|
if (arg === "--color") options.color = true;
|
|
121
|
+
if (arg === "--plain") options.plain = true;
|
|
122
|
+
if (arg === "--no-plain") options.plain = false;
|
|
105
123
|
}
|
|
106
124
|
return options;
|
|
107
125
|
}
|
|
@@ -117,7 +135,7 @@ function formatCliErrorText(error: CliErrorObject, context: CliErrorContext): st
|
|
|
117
135
|
...details.map((line) => cliStyles.muted(line)),
|
|
118
136
|
];
|
|
119
137
|
if (context.command) {
|
|
120
|
-
lines.push(cliStyles.muted(`Run
|
|
138
|
+
lines.push(cliStyles.muted(`Run gloom help ${context.command} for details.`));
|
|
121
139
|
}
|
|
122
140
|
return lines.join("\n");
|
|
123
141
|
}
|
package/src/cli/exit-codes.ts
CHANGED
package/src/cli/export-source.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* writes CSV or JSON, so an export can go in an audit file as it is: CSV ends
|
|
4
4
|
* with `#` lines and JSON carries a `source` object with the same fields.
|
|
5
5
|
* CSV and NDJSON rows also end with five fixed columns naming what each row
|
|
6
|
-
* is (`EXPORT_IDENTITY_COLUMNS`).
|
|
6
|
+
* is (`EXPORT_IDENTITY_COLUMNS`), less any the table already has by name.
|
|
7
7
|
*/
|
|
8
8
|
import { formatFreshnessLine, type ReportFreshness } from "./pane-functions/freshness";
|
|
9
9
|
import { parseReportTime } from "../utils/utc-time";
|
|
@@ -28,16 +28,20 @@ export interface ExportSource {
|
|
|
28
28
|
publicationTime: string | null;
|
|
29
29
|
/** When the data was retrieved for this export: an ISO instant in UTC. */
|
|
30
30
|
retrievalTime: string;
|
|
31
|
+
/** Refreshing the data failed and a copy saved earlier answered: when it was saved, an ISO instant in UTC. */
|
|
32
|
+
savedTime?: string;
|
|
31
33
|
}
|
|
32
34
|
|
|
33
35
|
export function exportSource(freshness: ReportFreshness): ExportSource {
|
|
34
36
|
return {
|
|
35
37
|
name: freshness.source,
|
|
36
38
|
publisher: freshness.publisher ?? null,
|
|
37
|
-
|
|
39
|
+
// A figure as of its release is still dated by the period it covers; the release is its publication time.
|
|
40
|
+
observationDate: freshness.referencePeriod ?? freshness.asOf,
|
|
38
41
|
...(freshness.oldestObservation ? { oldestObservationDate: freshness.oldestObservation } : {}),
|
|
39
|
-
publicationTime: freshness.publishedAt ?? null,
|
|
42
|
+
publicationTime: freshness.publishedAt ?? (freshness.referencePeriod ? freshness.asOf : null),
|
|
40
43
|
retrievalTime: freshness.retrievedAt,
|
|
44
|
+
...(freshness.savedAt ? { savedTime: freshness.savedAt } : {}),
|
|
41
45
|
};
|
|
42
46
|
}
|
|
43
47
|
|
|
@@ -100,7 +104,8 @@ export function exportIdentityFields(freshness: ReportFreshness, identity: Expor
|
|
|
100
104
|
* The lines an export ends with: the source line the text report ends with,
|
|
101
105
|
* then the publisher, observation date (the newest; the oldest follows when
|
|
102
106
|
* the data cites it), publication time and retrieval time, each `not
|
|
103
|
-
* published` when the data does not say
|
|
107
|
+
* published` when the data does not say, and when the copy was saved when a
|
|
108
|
+
* saved copy answered because refreshing it failed.
|
|
104
109
|
*/
|
|
105
110
|
export function exportSourceLines(freshness: ReportFreshness): string[] {
|
|
106
111
|
const source = exportSource(freshness);
|
|
@@ -112,5 +117,6 @@ export function exportSourceLines(freshness: ReportFreshness): string[] {
|
|
|
112
117
|
...(source.oldestObservationDate ? [`Oldest observation: ${source.oldestObservationDate}`] : []),
|
|
113
118
|
`Publication time: ${stated(source.publicationTime)}`,
|
|
114
119
|
`Retrieval time: ${source.retrievalTime}`,
|
|
120
|
+
...(source.savedTime ? [`Saved time: ${source.savedTime}`] : []),
|
|
115
121
|
];
|
|
116
122
|
}
|
package/src/cli/freshness.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { Quote, TickerFinancials } from "../types/financials";
|
|
2
2
|
import type { HeadlessPaneFreshness, HeadlessPaneRow } from "../types/headless";
|
|
3
3
|
import { deriveHeadlessFreshness, type ReportFreshness } from "./pane-functions/freshness";
|
|
4
4
|
import { fxPairObservation, fxRateObservations, type FxRateTiming } from "../plugins/builtin/shared/fx-rate-freshness";
|
|
5
5
|
import { quoteObservation, REPORTED_DATA } from "../plugins/builtin/shared/report-freshness";
|
|
6
|
-
import {
|
|
6
|
+
import { latestReportedPeriod } from "../utils/latest-financial-period";
|
|
7
7
|
|
|
8
8
|
/**
|
|
9
9
|
* The source, as-of and status line of a plain CLI command, derived exactly as
|
|
@@ -53,12 +53,6 @@ export function fxPairFreshness(
|
|
|
53
53
|
return observation ? rowsFreshness([observation], undefined, undefined, now) : undefined;
|
|
54
54
|
}
|
|
55
55
|
|
|
56
|
-
/** The newest reported period end in the statements, the period the trailing figures run through. */
|
|
57
|
-
function latestReportedPeriod(financials: Pick<TickerFinancials, "annualStatements" | "quarterlyStatements">): string | null {
|
|
58
|
-
const rows: FinancialStatement[] = [...financials.annualStatements, ...financials.quarterlyStatements];
|
|
59
|
-
return latestFinancialPeriod(rows, (row) => row.date)?.date ?? null;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
56
|
/**
|
|
63
57
|
* Fundamentals: reported figures, not a feed. Dated by when the statistics
|
|
64
58
|
* block was observed, with the newest statement period they run through
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import type { CloudShortRate } from "../api-client/types";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* An FX forward implied by covered interest parity: the spot carried by each
|
|
5
|
+
* currency's short rate over the tenor. Not a dealer's quote, and said so
|
|
6
|
+
* wherever it is shown.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
/** What every forward says about itself. */
|
|
10
|
+
export const IMPLIED_FORWARD_LABEL = "implied by rates, not a dealer quote";
|
|
11
|
+
|
|
12
|
+
/** The longest tenor offered: past a year the short rates say little about the term rates a forward prices from. */
|
|
13
|
+
const MAX_FORWARD_DAYS = 366;
|
|
14
|
+
const DAY_MS = 86_400_000;
|
|
15
|
+
|
|
16
|
+
export interface ForwardTenor {
|
|
17
|
+
/** As typed, normalised: `30d`, `3m`. */
|
|
18
|
+
label: string;
|
|
19
|
+
/** Calendar days from today to the forward date. */
|
|
20
|
+
days: number;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* A tenor as days (`30d`), weeks (`4w`), months (`3m`) or years (`1y`). Months
|
|
25
|
+
* and years count calendar days from `today` to the same day that many months
|
|
26
|
+
* on (the month's last day when it has no such day), as a dated forward runs.
|
|
27
|
+
*/
|
|
28
|
+
export function parseForwardTenor(text: string, today: Date = new Date()): ForwardTenor | { error: string } {
|
|
29
|
+
const match = /^\s*(\d{1,3})\s*([dwmy])\s*$/i.exec(text);
|
|
30
|
+
if (!match) return { error: `"${text}" is not a tenor; write it as days, weeks, months or years, such as 30d, 2w, 3m or 1y.` };
|
|
31
|
+
const count = Number(match[1]);
|
|
32
|
+
const unit = match[2]!.toLowerCase();
|
|
33
|
+
if (count <= 0) return { error: "A forward tenor is at least one day." };
|
|
34
|
+
const start = Date.UTC(today.getUTCFullYear(), today.getUTCMonth(), today.getUTCDate());
|
|
35
|
+
let days: number;
|
|
36
|
+
if (unit === "d") days = count;
|
|
37
|
+
else if (unit === "w") days = count * 7;
|
|
38
|
+
else {
|
|
39
|
+
const months = unit === "m" ? count : count * 12;
|
|
40
|
+
const target = new Date(Date.UTC(today.getUTCFullYear(), today.getUTCMonth() + months, 1));
|
|
41
|
+
const lastDay = new Date(Date.UTC(target.getUTCFullYear(), target.getUTCMonth() + 1, 0)).getUTCDate();
|
|
42
|
+
target.setUTCDate(Math.min(today.getUTCDate(), lastDay));
|
|
43
|
+
days = Math.round((target.getTime() - start) / DAY_MS);
|
|
44
|
+
}
|
|
45
|
+
if (days > MAX_FORWARD_DAYS) return { error: "Forwards run to 1y: past a year, short rates say little about the term rates a forward prices from." };
|
|
46
|
+
return { label: `${count}${unit}`, days };
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/** The size of one forward point: a pip, 0.01 for a pair quoted in yen and 0.0001 otherwise. */
|
|
50
|
+
export function forwardPointSize(quoteCurrency: string): number {
|
|
51
|
+
return quoteCurrency === "JPY" ? 0.01 : 0.0001;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export interface ImpliedForward {
|
|
55
|
+
spot: number;
|
|
56
|
+
forward: number;
|
|
57
|
+
/** Forward less spot, in points of `pointSize`. */
|
|
58
|
+
points: number;
|
|
59
|
+
pointSize: number;
|
|
60
|
+
/** The forward's premium (positive) or discount over spot across the tenor, percent. */
|
|
61
|
+
premiumPercent: number;
|
|
62
|
+
/** The same premium a year: `premiumPercent` × 360 / days. */
|
|
63
|
+
annualizedPercent: number;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Covered interest parity for BASE/QUOTE (`spot` QUOTE per BASE): money in
|
|
68
|
+
* either currency earns its own rate as simple interest over `days` on its
|
|
69
|
+
* day count, so F = S × (1 + r_quote × d / basis_quote) / (1 + r_base × d / basis_base).
|
|
70
|
+
* Rates are percent a year.
|
|
71
|
+
*/
|
|
72
|
+
export function impliedForward(
|
|
73
|
+
spot: number,
|
|
74
|
+
days: number,
|
|
75
|
+
base: Pick<CloudShortRate, "dayCountBasis"> & { value: number },
|
|
76
|
+
quote: Pick<CloudShortRate, "dayCountBasis"> & { value: number; currency: string },
|
|
77
|
+
): ImpliedForward {
|
|
78
|
+
const growth = (rate: { value: number; dayCountBasis: number }) => 1 + (rate.value / 100) * days / rate.dayCountBasis;
|
|
79
|
+
const forward = spot * growth(quote) / growth(base);
|
|
80
|
+
const pointSize = forwardPointSize(quote.currency);
|
|
81
|
+
const premiumPercent = (forward / spot - 1) * 100;
|
|
82
|
+
return {
|
|
83
|
+
spot,
|
|
84
|
+
forward,
|
|
85
|
+
points: (forward - spot) / pointSize,
|
|
86
|
+
pointSize,
|
|
87
|
+
premiumPercent,
|
|
88
|
+
annualizedPercent: premiumPercent * 360 / days,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/** A rate the forward can use: listed for the currency, with a value. */
|
|
93
|
+
export type ShortRateLookup = { rate: CloudShortRate & { value: number } } | { error: string };
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* The currency's short rate, or the sentence naming which rate is missing
|
|
97
|
+
* and why: none served for the currency, or the one served not read.
|
|
98
|
+
*/
|
|
99
|
+
export function shortRateFor(currency: string, rates: readonly CloudShortRate[]): ShortRateLookup {
|
|
100
|
+
const rate = rates.find((candidate) => candidate.currency === currency);
|
|
101
|
+
if (!rate) {
|
|
102
|
+
const served = [...new Set(rates.map((candidate) => candidate.currency))].sort();
|
|
103
|
+
return { error: `No short rate for ${currency}${served.length > 0 ? `; forwards are implied for ${served.join(", ")}` : ""}.` };
|
|
104
|
+
}
|
|
105
|
+
if (rate.value == null || !Number.isFinite(rate.value)) {
|
|
106
|
+
return { error: `${rate.name} (${currency}) could not be read${rate.unavailableReason ? `: ${rate.unavailableReason}` : ""}.` };
|
|
107
|
+
}
|
|
108
|
+
return { rate: rate as CloudShortRate & { value: number } };
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/** `6.776%`: a rate as its publisher prints it, to four decimals at most. */
|
|
112
|
+
export function formatRatePercent(value: number): string {
|
|
113
|
+
return `${Number(value.toFixed(4))}%`;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/** `+0.2416%`, signed, to four decimals. */
|
|
117
|
+
export function formatSignedPercent(value: number, decimals = 4): string {
|
|
118
|
+
const fixed = value.toFixed(decimals);
|
|
119
|
+
return `${value >= 0 ? "+" : ""}${fixed}%`;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/** Forward points to a tenth of a point, signed: `+430.6`. */
|
|
123
|
+
export function formatForwardPoints(points: number): string {
|
|
124
|
+
return `${points >= 0 ? "+" : ""}${points.toFixed(1)}`;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/** `TIIE 28d 6.776% (Banco de México, 2026-10-20; ACT/360)`. */
|
|
128
|
+
export function describeShortRate(rate: CloudShortRate & { value: number }): string {
|
|
129
|
+
return `${rate.name} ${formatRatePercent(rate.value)} (${rate.publisher}, ${rate.asOf ?? "undated"}; ACT/${rate.dayCountBasis})`;
|
|
130
|
+
}
|
package/src/cli/fx-pair.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { currencyMinorDigits } from "../market-data/market/format";
|
|
2
|
-
import { parseTypedNumber,
|
|
2
|
+
import { parseTypedNumber, readConvertedAmount } from "../utils/decimal-comma";
|
|
3
3
|
import { currenciesNamed } from "../utils/currency-names";
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
|
-
* What `
|
|
6
|
+
* What `gloom fx` is asked for. A bare code is one unit of it in the base
|
|
7
7
|
* currency (`NGN`: USD per 1 NGN). A pair is market convention, BASE/QUOTE:
|
|
8
8
|
* `USD/NGN` is how many NGN one USD buys, and `ZAR/NGN` a cross of two codes
|
|
9
9
|
* with neither in USD.
|
|
@@ -74,7 +74,7 @@ export function parseFxRequest(raw: string, baseCurrency: string): FxRequest | {
|
|
|
74
74
|
return readAs.length > 0 ? { ...request, readAs } : request;
|
|
75
75
|
}
|
|
76
76
|
|
|
77
|
-
/** What `
|
|
77
|
+
/** What `gloom fx` is asked for, with the amount to convert when one comes first. */
|
|
78
78
|
export interface FxArgs {
|
|
79
79
|
request: FxRequest;
|
|
80
80
|
/** The amount of `currency` to convert into `baseCurrency`; absent for a rate alone. */
|
|
@@ -97,10 +97,11 @@ function joinNameWords(args: readonly string[]): readonly string[] {
|
|
|
97
97
|
* `fx` arguments: a currency or a pair (`EUR`, `USD/NGN`), or an amount and
|
|
98
98
|
* what to convert it from and to (`1234.5 EUR/USD`, `1234,5 EUR USD`). The
|
|
99
99
|
* amount is an amount of the first currency and reads as cash does
|
|
100
|
-
* (`
|
|
101
|
-
*
|
|
102
|
-
* refused naming both readings
|
|
103
|
-
* (`toUsdByDefault`). The error
|
|
100
|
+
* (`readConvertedAmount`): `1.234,5` and `1,234.5` are 1234.5, and `1.234` is
|
|
101
|
+
* 1234 unless that currency has three decimals. A comma before exactly three
|
|
102
|
+
* digits (`1,234`) is refused naming both readings, as `alerts add` refuses it.
|
|
103
|
+
* An amount and one currency converts to USD (`toUsdByDefault`). The error
|
|
104
|
+
* sentence otherwise.
|
|
104
105
|
*/
|
|
105
106
|
export function parseFxArgs(words: readonly string[], baseCurrency: string): FxArgs | { error: string } {
|
|
106
107
|
const args = joinNameWords(words);
|
|
@@ -129,10 +130,10 @@ export function parseFxArgs(words: readonly string[], baseCurrency: string): FxA
|
|
|
129
130
|
const toUsdByDefault = codes.length === 1 && !codes[0]!.includes("/");
|
|
130
131
|
const request = parseFxRequest(codes.join("/"), "USD");
|
|
131
132
|
if ("error" in request) return request;
|
|
132
|
-
// The amount is in the currency converted from, so its units say what 1,234
|
|
133
|
+
// The amount is in the currency converted from, so its units say what 1.234 means; 1,234 could be either.
|
|
133
134
|
let amount: number;
|
|
134
135
|
try {
|
|
135
|
-
amount =
|
|
136
|
+
amount = readConvertedAmount(first, "The amount", request.currency);
|
|
136
137
|
} catch (error) {
|
|
137
138
|
return { error: error instanceof Error ? error.message : String(error) };
|
|
138
139
|
}
|
package/src/cli/glossary.ts
CHANGED
|
@@ -2,7 +2,7 @@ import { cliStyles, cliTerminalWidth, renderDefinitions, renderSection, wrapText
|
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* Plain-words meanings of the rates, auction, credit and bond yield, energy, perpetual-futures, portfolio,
|
|
5
|
-
* fund, bond fund (SEC yield, tax-equivalent yield, muni/Treasury ratio), short interest, quote-board, futures (basis, contango, roll yield), VIX curve (term structure, 3M/30D, VVIX), CFTC positioning (COT trader classes, net % of open interest) and economic-calendar terms the functions
|
|
5
|
+
* fund, bond fund (SEC yield, tax-equivalent yield, muni/Treasury ratio), short interest, quote-board, futures (basis, contango, roll yield), VIX curve (term structure, 3M/30D, VVIX), CFTC positioning (COT trader classes, net % of open interest), depositary receipt (ADR ratio, premium, implied FX, the peso's CCL and MEP rates) and economic-calendar terms the functions
|
|
6
6
|
* show in their rows, headers and footers.
|
|
7
7
|
* `catalog glossary` lists them, `catalog explain <term>` prints one, and
|
|
8
8
|
* `fn <function> --explain` and `portfolio show --explain` follow a report with
|
|
@@ -430,6 +430,37 @@ export const GLOSSARY: readonly GlossaryEntry[] = [
|
|
|
430
430
|
definition: "How loosely a fund follows its index: how much the gap between the fund's return and the index's swings, usually over a year. "
|
|
431
431
|
+ "Fees, cash and holdings that differ from the index widen it.",
|
|
432
432
|
},
|
|
433
|
+
// A depositary receipt beside its home listing (ADR, DES), and the peso's market dollar rates `fx USD/ARS` lists.
|
|
434
|
+
{
|
|
435
|
+
term: "ADR ratio", aliases: ["adr", "adrs", "depositary receipt", "american depositary receipt", "depositary ratio", "ads ratio"],
|
|
436
|
+
functions: ["ADR", "DES"], shown: ["Ratio", "ADR Ratio", "ADR ratio"],
|
|
437
|
+
definition: "How many ordinary shares one depositary receipt holds: 1 ADR = 10 ordinary shares means one GGAL in New York is ten GGAL.BA shares in Buenos Aires. "
|
|
438
|
+
+ "A receipt's price compares with its home price only once the home price is multiplied by the ratio.",
|
|
439
|
+
},
|
|
440
|
+
{
|
|
441
|
+
term: "ADR premium", aliases: ["adr discount", "adr vs home", "receipt premium", "adr premium/discount"],
|
|
442
|
+
functions: ["ADR"], shown: ["ADR vs home", "premium", "discount"],
|
|
443
|
+
definition: "How far a receipt trades above (a premium) or below (a discount) the home shares it holds, at the spot rate: spot / implied rate - 1. "
|
|
444
|
+
+ "Arbitrage keeps it small where money moves freely; where it cannot (Argentina's controls, Taiwan's limits on foreign buying) it runs to several percent.",
|
|
445
|
+
},
|
|
446
|
+
{
|
|
447
|
+
term: "Implied FX", aliases: ["implied exchange rate", "implied dollar rate", "implied fx rate", "adr implied rate"],
|
|
448
|
+
functions: ["ADR"], shown: ["Implied"],
|
|
449
|
+
definition: "The exchange rate at which a receipt and its home shares cost the same: home price × ratio / ADR price. "
|
|
450
|
+
+ "GGAL.BA at ARS 6,260, 10 shares a receipt and GGAL at $37.91 imply 6,260 × 10 / 37.91 = 1,651 pesos a dollar.",
|
|
451
|
+
},
|
|
452
|
+
{
|
|
453
|
+
term: "Contado con liquidación", short: "CCL", aliases: ["contado con liquidacion", "contado con liqui", "dolar ccl", "ccl rate", "blue chip swap"],
|
|
454
|
+
functions: ["ADR"],
|
|
455
|
+
definition: "The peso's dollar rate for moving money abroad through securities: buy shares in pesos in Buenos Aires, sell them (or their ADR) for dollars abroad. "
|
|
456
|
+
+ "Read from an ADR pair (home × ratio / ADR) or a BYMA C line (peso price / C-line dollar price); it runs above the official wholesale rate.",
|
|
457
|
+
},
|
|
458
|
+
{
|
|
459
|
+
term: "Mercado electrónico de pagos", short: "MEP", aliases: ["mercado electronico de pagos", "dolar mep", "dolar bolsa", "mep rate"],
|
|
460
|
+
functions: ["ADR"],
|
|
461
|
+
definition: "The peso's dollar rate inside Argentina through securities: buy shares in pesos and sell their BYMA D line for dollars paid in Argentina. "
|
|
462
|
+
+ "Read as the peso price over the D line's dollar price; it sits near the CCL rate, usually a little under it.",
|
|
463
|
+
},
|
|
433
464
|
// Bond spreads and yields (CRD, the data catalog's ICE BofA yields, TRACE), a fund's SEC yield, which DVD's cash yield is not,
|
|
434
465
|
// and the bond fund figures and tax-equivalent maths DVD and fundamentals give with --tax-rate.
|
|
435
466
|
{
|
|
@@ -474,7 +505,7 @@ export const GLOSSARY: readonly GlossaryEntry[] = [
|
|
|
474
505
|
functions: ["DVD"], shown: ["Tax-equivalent yield", "Tax-Equivalent Yield"],
|
|
475
506
|
definition: "The yield a taxable bond needs to match a tax-exempt muni fund after tax: yield / (1 - (federal rate + state rate)), on the SEC yield, "
|
|
476
507
|
+ "else the distribution yield. At 40.8% (37% plus the 3.8% net investment income tax), MUB's 4.04% is 6.83%. A state rate counts only for a "
|
|
477
|
-
+ "single-state fund of that state (CMF, VTEC for California).
|
|
508
|
+
+ "single-state fund of that state (CMF, VTEC for California). gloom fn DVD and fundamentals take --tax-rate, --state-rate and --state.",
|
|
478
509
|
},
|
|
479
510
|
{
|
|
480
511
|
term: "Muni/Treasury ratio", aliases: ["muni treasury ratio", "muni-to-treasury ratio", "muni/ust ratio", "muni ratio", "municipal treasury ratio"],
|
|
@@ -561,8 +592,9 @@ export const GLOSSARY: readonly GlossaryEntry[] = [
|
|
|
561
592
|
term: "Float", aliases: ["free float", "public float", "float shares", "floating stock", "% float", "percent of float"],
|
|
562
593
|
functions: ["SI", "SIW"], shown: ["Float"],
|
|
563
594
|
definition: "The shares open to public trading: those outstanding less shares held by insiders and strategic holders, never more than the shares outstanding. "
|
|
564
|
-
+ "
|
|
565
|
-
+ "
|
|
595
|
+
+ "The float is the source's own, held within the 10-K or 10-Q cover count and undated; a float held at that count is the count, dated by it. "
|
|
596
|
+
+ "SIW's % Float is the latest settlement's shares short over today's float; SI reads each earlier settlement over the float when FINRA published it: "
|
|
597
|
+
+ "the cover count known that day, at the share of today's count that floats.",
|
|
566
598
|
},
|
|
567
599
|
{
|
|
568
600
|
// SIW's Setup column prints these two words.
|
|
@@ -622,7 +654,7 @@ export const GLOSSARY: readonly GlossaryEntry[] = [
|
|
|
622
654
|
{
|
|
623
655
|
term: "Futures contract", aliases: ["futures", "future", "futures contracts", "contract", "contract month", "expiry", "expiration"],
|
|
624
656
|
functions: ["FUT", "CTM"], shown: ["CONTRACT", "Contract"],
|
|
625
|
-
definition: "An agreement to buy or sell something, such as oil, gold or the S&P 500, at a set price on a set date. Each contract has a month (Dec
|
|
657
|
+
definition: "An agreement to buy or sell something, such as oil, gold or the S&P 500, at a set price on a set date. Each contract has a month (Dec 2026) and expires, "
|
|
626
658
|
+ "and most traders close out before then. A contract's own Settlement line says how it ends: in cash or by physical delivery.",
|
|
627
659
|
},
|
|
628
660
|
{
|
|
@@ -694,8 +726,16 @@ export const GLOSSARY: readonly GlossaryEntry[] = [
|
|
|
694
726
|
{
|
|
695
727
|
term: "Annualised basis", aliases: ["annualized basis", "ann basis", "ann. basis", "basis annualised"], functions: ["CTM", "PERP"], shown: ["Ann Basis", "ANN BASIS"],
|
|
696
728
|
definition: "The basis restated as a yearly rate, so contracts of different length compare with each other and with a perpetual's funding APR: "
|
|
697
|
-
+ "(Last / spot - 1) × 365 / days to expiry, simple rather than compounded
|
|
698
|
-
+ "
|
|
729
|
+
+ "(Last / spot - 1) × 365 / days to expiry, simple rather than compounded. CTM reads each last trade against spot in the same minute "
|
|
730
|
+
+ "and counts days to final settlement to the hour. Inside a week a few basis points of spot noise move it by whole points "
|
|
731
|
+
+ "(10 bp is about ±5 points at 7 days), so CTM greys it there and Vs Spot is the figure to read.",
|
|
732
|
+
},
|
|
733
|
+
{
|
|
734
|
+
term: "Crypto composite price", aliases: ["CCC", "crypto composite", "composite price", "composite crypto price"], functions: ["CTM"],
|
|
735
|
+
shown: ["crypto composite price"],
|
|
736
|
+
definition: "A coin's dollar price blended from trading on several crypto exchanges rather than taken from one, quoted around the clock; "
|
|
737
|
+
+ "quotes list it under the code CCC. CTM reads CME crypto futures against it, while the futures settle to CME's own reference rate, "
|
|
738
|
+
+ "so a small gap at expiry is expected.",
|
|
699
739
|
},
|
|
700
740
|
{
|
|
701
741
|
term: "Contango", aliases: ["contango curve", "upward curve"], functions: ["CTM", "FUT"], shown: ["contango", "Contango"],
|
|
@@ -776,8 +816,8 @@ export interface GlossaryLookup {
|
|
|
776
816
|
/** The entries the query names: by the term, its abbreviation or an alias. */
|
|
777
817
|
exact: GlossaryEntry[];
|
|
778
818
|
/**
|
|
779
|
-
* The others whose names
|
|
780
|
-
*
|
|
819
|
+
* The others whose names hold each word of the query: `stop-out` finds stop-out vs average. Beside a term the
|
|
820
|
+
* query names they hold the words whole; otherwise a word start is enough, and the whole ones come first.
|
|
781
821
|
*/
|
|
782
822
|
partial: GlossaryEntry[];
|
|
783
823
|
}
|
|
@@ -785,22 +825,26 @@ export interface GlossaryLookup {
|
|
|
785
825
|
// Shorter words (the `b` and `c` of `B/C`) would find half the glossary.
|
|
786
826
|
const MIN_PARTIAL_WORD = 3;
|
|
787
827
|
|
|
828
|
+
/** A name's word holds a query word whole, or as its plural: `assets` holds `asset`, `floating` does not hold `float`. */
|
|
829
|
+
const wholeWord = (have: string, word: string) => have === word || have === `${word}s` || have === `${word}es`;
|
|
830
|
+
|
|
788
831
|
export function lookupGlossary(query: string): GlossaryLookup {
|
|
789
832
|
const key = lookupKey(query);
|
|
790
833
|
if (!key) return { exact: [], partial: [] };
|
|
791
834
|
const exact = GLOSSARY.filter((entry) => names(entry).some((name) => lookupKey(name) === key));
|
|
792
835
|
const wanted = words(query).filter((word) => word.length >= MIN_PARTIAL_WORD);
|
|
793
|
-
|
|
794
|
-
|
|
836
|
+
if (wanted.length === 0) return { exact, partial: [] };
|
|
837
|
+
const others = GLOSSARY.filter((entry) => !exact.includes(entry));
|
|
838
|
+
const holding = (match: (have: string, word: string) => boolean) => others.filter((entry) => {
|
|
795
839
|
const have = names(entry).flatMap(words);
|
|
796
|
-
return wanted.every((word) => have.some((name) => name
|
|
840
|
+
return wanted.every((word) => have.some((name) => match(name, word)));
|
|
797
841
|
});
|
|
798
|
-
//
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
};
|
|
803
|
-
return { exact, partial:
|
|
842
|
+
// Related to a term the query names are only the terms that hold its words whole: `float` is the float of a
|
|
843
|
+
// stock, and the floating rate note only starts with the same letters. A query that names no term is a search,
|
|
844
|
+
// where a word start (`vol` for volume) still finds a term, after those that hold it whole.
|
|
845
|
+
const whole = holding(wholeWord);
|
|
846
|
+
if (exact.length > 0) return { exact, partial: whole };
|
|
847
|
+
return { exact, partial: [...whole, ...holding((name, word) => name.startsWith(word)).filter((entry) => !whole.includes(entry))] };
|
|
804
848
|
}
|
|
805
849
|
|
|
806
850
|
function escapeRegExp(text: string): string {
|
|
@@ -839,7 +883,7 @@ export function renderGlossaryEntries(entries: readonly GlossaryEntry[]): string
|
|
|
839
883
|
/** What `--explain` adds under a report: the terms it shows, or a note that it shows none. */
|
|
840
884
|
export function renderReportGlossary(token: string, entries: readonly GlossaryEntry[]): string {
|
|
841
885
|
if (entries.length === 0) {
|
|
842
|
-
return wrapText(`${token} shows no glossary terms.
|
|
886
|
+
return wrapText(`${token} shows no glossary terms. gloom catalog glossary lists every term.`, textWidth())
|
|
843
887
|
.map((line) => cliStyles.muted(line)).join("\n");
|
|
844
888
|
}
|
|
845
889
|
return [renderSection("Terms"), ...renderGlossaryEntries(entries)].join("\n");
|
|
@@ -876,7 +920,7 @@ export function renderGlossaryIndex(): string {
|
|
|
876
920
|
index === 0 ? ` ${cliStyles.command(owner)}${" ".repeat(labelWidth - 2 - owner.length)}${line}` : `${" ".repeat(labelWidth)}${line}`
|
|
877
921
|
))),
|
|
878
922
|
"",
|
|
879
|
-
...wrapText("
|
|
923
|
+
...wrapText("gloom catalog glossary <term> explains one; fn <function> --explain and portfolio show --explain add the terms a report shows.", width)
|
|
880
924
|
.map((line) => cliStyles.muted(line)),
|
|
881
925
|
].join("\n");
|
|
882
926
|
}
|