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
|
@@ -2,11 +2,11 @@ import { logFailure } from "../../utils/log-failure";
|
|
|
2
2
|
import { apiClient } from "../../api-client";
|
|
3
3
|
import { ApiRequestError } from "../../api-client/errors";
|
|
4
4
|
import type { CliCommandDef } from "../../types/plugin";
|
|
5
|
-
import { withCliServices } from "../context";
|
|
5
|
+
import { withCliServices, withMarketData } from "../context";
|
|
6
6
|
import { formatCompact } from "../../utils/format";
|
|
7
7
|
import { DATE_OPTION_EXAMPLES, DATE_OPTION_FORMATS, dateOptionError, readCalendarDate } from "../../utils/calendar-date";
|
|
8
8
|
import {
|
|
9
|
-
|
|
9
|
+
fetchPreferredMarketMovers,
|
|
10
10
|
fetchTrending,
|
|
11
11
|
MARKET_SUMMARY_SYMBOLS,
|
|
12
12
|
type ScreenerCategory,
|
|
@@ -22,18 +22,24 @@ import {
|
|
|
22
22
|
} from "../../plugins/builtin/market-movers/model";
|
|
23
23
|
import { MOVER_CANDIDATES } from "../../plugins/builtin/market-movers/client";
|
|
24
24
|
import { fetchEconCalendarFrom } from "../../plugins/builtin/econ/calendar-source";
|
|
25
|
-
import { seriesNotOnFred } from "../../sources/gloomberb-cloud/fred-series";
|
|
25
|
+
import { computedFredSeriesNote, seriesNotOnFred } from "../../sources/gloomberb-cloud/fred-series";
|
|
26
26
|
import { EXTENDED_SESSION_LABELS, getQuoteSessionFields, type ExtendedSession } from "../../market-data/market/status";
|
|
27
27
|
import {
|
|
28
28
|
COUNTRY_CYCLE,
|
|
29
|
+
COUNTRY_FILTER_HINT,
|
|
30
|
+
countriesWithoutEvents,
|
|
29
31
|
FILTER_CYCLE,
|
|
30
32
|
loadCalendar,
|
|
33
|
+
eventCountry,
|
|
31
34
|
matchesCountry,
|
|
32
35
|
matchesImpact,
|
|
36
|
+
noScheduledReleasesMessage,
|
|
37
|
+
parseCountryFilter,
|
|
33
38
|
shortCalendarEnd,
|
|
34
39
|
type CountryFilter,
|
|
35
40
|
type ImpactFilter,
|
|
36
41
|
} from "../../plugins/builtin/econ/calendar-model";
|
|
42
|
+
import { hasNoReleaseTime, hasNoStatedTime } from "../../plugins/builtin/econ/types";
|
|
37
43
|
import { isoDate, rejectExtraArgs, requireArg, requireOneArg, takeFlag, takeOption } from "./command-utils";
|
|
38
44
|
import { buildCorrelationSeries } from "../../plugins/builtin/correlation/matrix/model";
|
|
39
45
|
import { alignDailyCloses, correlateDailyCloses } from "../../plugins/builtin/correlation/compute";
|
|
@@ -45,7 +51,7 @@ import { formatChangePercentCell, formatCompactCell } from "../helpers";
|
|
|
45
51
|
import { WORLD_INDICES } from "../../plugins/builtin/world-indices/indices";
|
|
46
52
|
import { getSectorCollection, SECTOR_COLLECTIONS } from "../../plugins/builtin/sectors/sector-data";
|
|
47
53
|
import { DAILY_CLOSES } from "../../plugins/builtin/shared/report-freshness";
|
|
48
|
-
import { localTimeSuffix, newestReportTime, oldestReportTime } from "../../utils/utc-time";
|
|
54
|
+
import { canonicalTimeZone, localTimeSuffix, newestReportTime, oldestReportTime, timeZoneCity, zonedClock } from "../../utils/utc-time";
|
|
49
55
|
import { quotesFreshness, rowsFreshness } from "../freshness";
|
|
50
56
|
import { periodicityOf } from "../pane-functions/freshness";
|
|
51
57
|
import { formatBasisPoints, toBasisPoints } from "../../utils/basis-points";
|
|
@@ -134,6 +140,8 @@ const MOVER_LISTS: Record<string, ScreenerCategory | "trending"> = {
|
|
|
134
140
|
const MOVERS_USAGE = "movers [gainers|losers|active|trending] [--session regular|extended]";
|
|
135
141
|
/** The most rows the movers list serves in one request. */
|
|
136
142
|
const MOVER_REQUEST_CAP = 100;
|
|
143
|
+
/** A one-shot list waits this long for its rows' average volumes and sizes, as `fn MOST` does. */
|
|
144
|
+
const MOVER_METADATA_WAIT_MS = 10_000;
|
|
137
145
|
|
|
138
146
|
function moverRankBasis(value: string | undefined, ctx: Parameters<CliCommandDef["execute"]>[1]): MoverRankBasis {
|
|
139
147
|
if (value == null) return "regular";
|
|
@@ -210,12 +218,14 @@ async function runMoverCommand(rawArgs: string[], ctx: Parameters<CliCommandDef[
|
|
|
210
218
|
// After the close a price list keeps only the rows moving its way on the basis
|
|
211
219
|
// asked for, so it reads more candidates than it shows.
|
|
212
220
|
const count = category === "most_actives" ? limit : Math.min(MOVER_REQUEST_CAP, Math.max(limit, MOVER_CANDIDATES));
|
|
213
|
-
|
|
221
|
+
// With the saved session, as MOST reads it: a Pro account gets the real-time lists, anyone else the delayed ones.
|
|
222
|
+
const movers = await withMarketData(ctx, () =>
|
|
223
|
+
fetchPreferredMarketMovers(category, count, { forceRefresh: ctx.cliOptions.refresh, session: basis, metadataWaitMs: MOVER_METADATA_WAIT_MS }));
|
|
214
224
|
// Last and Chg% are the regular session, as `ticker` reads it, and a
|
|
215
225
|
// pre-market or after-hours print is its own column. The list is ranked by
|
|
216
226
|
// the regular session's move (its close's after the close), or with
|
|
217
227
|
// --session extended by the extended print's move from that close.
|
|
218
|
-
const { quotes, rankedBy } = rankMoverQuotes(category,
|
|
228
|
+
const { quotes, rankedBy } = rankMoverQuotes(category, movers.quotes.map(moverRegularSession), basis);
|
|
219
229
|
const rows = quotes.slice(0, limit).map((quote) => {
|
|
220
230
|
const { extended, ...row } = quote;
|
|
221
231
|
return {
|
|
@@ -227,12 +237,12 @@ async function runMoverCommand(rawArgs: string[], ctx: Parameters<CliCommandDef[
|
|
|
227
237
|
};
|
|
228
238
|
});
|
|
229
239
|
const fellBack = basis === "extended" && rankedBy === "regular";
|
|
230
|
-
//
|
|
240
|
+
// As the MOST report reads it: real-time for a Pro account, delayed otherwise, each row dated by its own last price.
|
|
231
241
|
ctx.printResult({
|
|
232
242
|
data: rows,
|
|
233
243
|
metadata: { category, rankedBy },
|
|
234
244
|
...(fellBack ? { warnings: ["No pre-market or after-hours prints now, so the list is ranked by the regular-session move."] } : {}),
|
|
235
|
-
freshness: rowsFreshness(rows, { status: "delayed" }, { stale:
|
|
245
|
+
freshness: rowsFreshness(rows, { status: movers.source === "cloud" ? "live" : "delayed" }, { stale: movers.stale }),
|
|
236
246
|
}, {
|
|
237
247
|
heading: `Ranked by ${MOVER_RANKING_LABELS[rankedBy]}`,
|
|
238
248
|
columns: [
|
|
@@ -263,15 +273,30 @@ async function runQuoteBasket(symbols: string[], ctx: Parameters<CliCommandDef["
|
|
|
263
273
|
});
|
|
264
274
|
}
|
|
265
275
|
|
|
266
|
-
/**
|
|
267
|
-
|
|
276
|
+
/**
|
|
277
|
+
* The UTC date, or the UTC time with its zone named, of an event's timestamp;
|
|
278
|
+
* with `readerClock`, the reader's configured clock beside it.
|
|
279
|
+
*/
|
|
280
|
+
function utcDateTimePart(value: unknown, part: "date" | "time", readerClock = true): string {
|
|
268
281
|
const date = new Date(String(value));
|
|
269
282
|
if (Number.isNaN(date.getTime())) return "";
|
|
270
283
|
const iso = date.toISOString();
|
|
271
|
-
return part === "date" ? iso.slice(0, 10) : `${iso.slice(11, 16)} UTC${localTimeSuffix(date.getTime())}`;
|
|
284
|
+
return part === "date" ? iso.slice(0, 10) : `${iso.slice(11, 16)} UTC${readerClock ? localTimeSuffix(date.getTime()) : ""}`;
|
|
272
285
|
}
|
|
273
286
|
|
|
274
|
-
const ECON_USAGE = "econ [--country <
|
|
287
|
+
const ECON_USAGE = "econ [--country <regions or countries>] [--impact <level>] [--from <date>] [--tz <zone>]";
|
|
288
|
+
const WEEKDAYS = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"] as const;
|
|
289
|
+
/** "Sat" for 2026-10-31. */
|
|
290
|
+
const weekdayOf = (date: string) => WEEKDAYS[new Date(`${date}T00:00:00Z`).getUTCDay()]!;
|
|
291
|
+
|
|
292
|
+
/** Mon to Sun, so a release on a weekend (China's PMI on a Saturday) reads as one. */
|
|
293
|
+
const ECON_DAY_COLUMN = { key: "day", header: "Day", shrink: false };
|
|
294
|
+
|
|
295
|
+
/** A publisher's clock for a row it times itself: `13:00 Mexico City` from 13:00 in America/Mexico_City. */
|
|
296
|
+
function publisherClock(localTime: unknown, timeZone: unknown): string {
|
|
297
|
+
if (typeof localTime !== "string" || !localTime || typeof timeZone !== "string" || !timeZone) return "";
|
|
298
|
+
return `${localTime} ${timeZoneCity(timeZone)}`;
|
|
299
|
+
}
|
|
275
300
|
const DAY_MS = 86_400_000;
|
|
276
301
|
|
|
277
302
|
/**
|
|
@@ -312,22 +337,24 @@ function parseFilter<T extends string>(value: string | undefined, values: readon
|
|
|
312
337
|
return match;
|
|
313
338
|
}
|
|
314
339
|
|
|
315
|
-
/**
|
|
340
|
+
/** The pane's regions and ISO country codes, comma separated (`MX,BR,ZA`, `G7,MX`); upper-cased. */
|
|
316
341
|
function parseCountry(value: string | undefined, ctx: Parameters<CliCommandDef["execute"]>[1]): CountryFilter {
|
|
317
342
|
if (value == null) return COUNTRY_CYCLE[0]!;
|
|
318
|
-
const
|
|
319
|
-
|
|
320
|
-
if (region) return region;
|
|
321
|
-
if (/^[a-z]{2}$/i.test(text)) return text.toUpperCase();
|
|
322
|
-
return ctx.fail(`Unknown country "${value}".`, `Use ${COUNTRY_CYCLE.join(", ")}, or a two-letter country code such as TR.`);
|
|
343
|
+
const parsed = parseCountryFilter(value);
|
|
344
|
+
return "error" in parsed ? ctx.fail(parsed.error, COUNTRY_FILTER_HINT) : parsed.filter;
|
|
323
345
|
}
|
|
324
346
|
|
|
325
|
-
/**
|
|
326
|
-
function
|
|
327
|
-
|
|
328
|
-
const
|
|
329
|
-
|
|
330
|
-
|
|
347
|
+
/** Blank times, each with why: a bank whose calendar gives the day and not the time. */
|
|
348
|
+
function blankTimeNotes(rows: ReadonlyArray<{ event: string; country: string; timeNote: string | null }>): string[] {
|
|
349
|
+
const byNote = new Map<string, string[]>();
|
|
350
|
+
for (const row of rows) {
|
|
351
|
+
if (!row.timeNote) continue;
|
|
352
|
+
const named = `${row.event} (${row.country})`;
|
|
353
|
+
const events = byNote.get(row.timeNote) ?? [];
|
|
354
|
+
if (!events.includes(named)) events.push(named);
|
|
355
|
+
byNote.set(row.timeNote, events);
|
|
356
|
+
}
|
|
357
|
+
return [...byNote].map(([note, events]) => `No time for ${events.join(", ")}: ${note.charAt(0).toLowerCase()}${note.slice(1)}.`);
|
|
331
358
|
}
|
|
332
359
|
|
|
333
360
|
async function runEcon(args: string[], ctx: Parameters<CliCommandDef["execute"]>[1]) {
|
|
@@ -335,6 +362,11 @@ async function runEcon(args: string[], ctx: Parameters<CliCommandDef["execute"]>
|
|
|
335
362
|
const country = parseCountry(takeOption(rawArgs, "--country"), ctx);
|
|
336
363
|
const impact: ImpactFilter = parseFilter(takeOption(rawArgs, "--impact"), FILTER_CYCLE, "impact", ctx);
|
|
337
364
|
const fromOption = parseDateOption(takeOption(rawArgs, "--from"), "--from", ctx);
|
|
365
|
+
const tzOption = takeOption(rawArgs, "--tz");
|
|
366
|
+
const viewerZone = tzOption == null ? null : canonicalTimeZone(tzOption);
|
|
367
|
+
if (tzOption != null && !viewerZone) {
|
|
368
|
+
ctx.fail(`Unknown time zone "${tzOption}".`, "Use an IANA zone name, such as America/New_York, Europe/London or Asia/Tokyo.");
|
|
369
|
+
}
|
|
338
370
|
rejectArgs(rawArgs, ECON_USAGE, ctx, "Filter with --country and --impact.");
|
|
339
371
|
await withCliServices(ctx, async () => {
|
|
340
372
|
const todayStart = Math.floor(Date.now() / DAY_MS) * DAY_MS;
|
|
@@ -359,41 +391,76 @@ async function runEcon(args: string[], ctx: Parameters<CliCommandDef["execute"]>
|
|
|
359
391
|
const listedBefore = !startsLater ? null
|
|
360
392
|
: past?.storedFrom ? `The stored calendar starts ${past.storedFrom}; nothing earlier is listed`
|
|
361
393
|
: `No events are stored before ${listedFrom ?? isoDate(new Date(todayStart))}`;
|
|
362
|
-
|
|
363
|
-
const
|
|
364
|
-
|
|
394
|
+
// Countries asked for that nothing in the window is for: a quiet week there, not an unknown country.
|
|
395
|
+
const inWindow = events.filter((event) => event.date.getTime() >= fromTime);
|
|
396
|
+
const unscheduled = countriesWithoutEvents(country, inWindow);
|
|
397
|
+
const rows = inWindow
|
|
398
|
+
.filter((event) => matchesCountry(event, country) && matchesImpact(event, impact))
|
|
365
399
|
.sort((left, right) => left.date.getTime() - right.date.getTime())
|
|
366
|
-
.map((event) =>
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
400
|
+
.map((event) => {
|
|
401
|
+
// The viewer's clock (--tz) for a row with a time: its date and time there.
|
|
402
|
+
const clock = viewerZone && !hasNoReleaseTime(event) ? zonedClock(event.date.getTime(), viewerZone) : null;
|
|
403
|
+
return {
|
|
404
|
+
date: isoDate(event.date),
|
|
405
|
+
// The weekday on the viewer's clock (--tz), else the UTC day's; a row with no time is its day's.
|
|
406
|
+
day: weekdayOf(clock?.date ?? isoDate(event.date).slice(0, 10)),
|
|
407
|
+
time: hasNoStatedTime(event) ? "" : event.time,
|
|
408
|
+
...(viewerZone ? { viewerDate: clock?.date ?? null, viewerTime: clock?.time ?? null } : {}),
|
|
409
|
+
country: eventCountry(event),
|
|
410
|
+
impact: event.impact,
|
|
411
|
+
event: event.event,
|
|
412
|
+
actual: event.actual ?? "",
|
|
413
|
+
forecast: event.forecast ?? "",
|
|
414
|
+
prior: event.prior ?? "",
|
|
415
|
+
// The publisher's own clock, for rows Gloom Cloud adds from a bank's or a statistics office's calendar.
|
|
416
|
+
localTime: event.localTime ?? null,
|
|
417
|
+
timeZone: event.timeZone ?? null,
|
|
418
|
+
timeNote: event.timeNote ?? null,
|
|
419
|
+
priorAsOf: event.priorAsOf ?? null,
|
|
420
|
+
// Who publishes the figure (Freddie Mac for the 30-year mortgage rate), the period it covers and its page.
|
|
421
|
+
publisher: event.source?.name ?? null,
|
|
422
|
+
referencePeriod: event.referencePeriod ?? null,
|
|
423
|
+
source: event.source?.name ?? null,
|
|
424
|
+
sourceUrl: event.source?.url ?? null,
|
|
425
|
+
};
|
|
426
|
+
});
|
|
427
|
+
// A filter of countries only, none of which has anything in the window, says so as its empty list.
|
|
428
|
+
const allUnscheduled = unscheduled.length > 0 && unscheduled.length === country.split(",").length;
|
|
429
|
+
const footnote = [listedBefore, listedAfter, ...(rows.length > 0 ? blankTimeNotes(rows) : []),
|
|
430
|
+
rows.length > 0 && unscheduled.length > 0 ? noScheduledReleasesMessage(unscheduled) : null]
|
|
431
|
+
.filter((note): note is string => !!note).join("\n");
|
|
376
432
|
ctx.printResult({
|
|
377
433
|
data: rows,
|
|
378
434
|
...(unread ? { warnings: [unread] } : {}),
|
|
379
|
-
metadata: { country, impact, from, listedThrough, storedFrom: past?.storedFrom ?? null },
|
|
435
|
+
metadata: { country, impact, from, listedThrough, storedFrom: past?.storedFrom ?? null, ...(viewerZone ? { timeZone: viewerZone } : {}) },
|
|
380
436
|
// The calendar as read, not its rows: those are scheduled, mostly ahead.
|
|
381
437
|
freshness: rowsFreshness([], { status: "not-a-feed", basis: "calendar", asOf: fetchedAt }, { stale }),
|
|
382
438
|
}, {
|
|
383
439
|
dateKey: "date",
|
|
384
440
|
defaultLimit: 50,
|
|
385
|
-
empty:
|
|
441
|
+
empty: allUnscheduled ? noScheduledReleasesMessage(unscheduled) : econEmptyMessage(from, listedThrough, listedAfter != null),
|
|
386
442
|
...(footnote ? { footnote } : {}),
|
|
387
443
|
columns: [
|
|
388
444
|
// Text shows both halves of the event timestamp in UTC, never the host's zone; exports keep the source values.
|
|
389
445
|
{ key: "date", header: "Date", format: (value) => utcDateTimePart(value, "date") },
|
|
390
|
-
|
|
446
|
+
// The weekday sits before the clock it is on: the UTC time's, or with --tz the viewer's.
|
|
447
|
+
...viewerZone ? [] : [ECON_DAY_COLUMN],
|
|
448
|
+
// With --tz the viewer's clock has its own column, so the UTC time does not repeat it.
|
|
449
|
+
{ key: "time", header: "Time", format: (value, row) => value === "All Day" ? "All day" : value === ""
|
|
450
|
+
? "" : utcDateTimePart(row.date, "time", !viewerZone) },
|
|
451
|
+
...viewerZone ? [ECON_DAY_COLUMN] : [],
|
|
452
|
+
// Only --tz fills it: the viewer's clock, its weekday in Day before it.
|
|
453
|
+
{ key: "viewerTime", header: viewerZone ? timeZoneCity(viewerZone) : "Viewer", shrink: false,
|
|
454
|
+
format: (value) => typeof value === "string" && viewerZone ? value : "" },
|
|
455
|
+
// Only rows a publisher times itself fill it, so the feeds' calendar prints as before.
|
|
456
|
+
{ key: "localTime", header: "Local", optional: true, dropPriority: 1, format: (value, row) => publisherClock(value, row.timeZone) },
|
|
391
457
|
{ key: "country", header: "Country" },
|
|
392
458
|
{ key: "impact", header: "Impact" },
|
|
393
459
|
{ key: "event", header: "Event" },
|
|
394
460
|
{ key: "actual", header: "Actual" },
|
|
395
461
|
{ key: "forecast", header: "Forecast" },
|
|
396
462
|
{ key: "prior", header: "Prior" },
|
|
463
|
+
{ key: "publisher", header: "Publisher", format: (value) => typeof value === "string" ? value : "" },
|
|
397
464
|
],
|
|
398
465
|
});
|
|
399
466
|
});
|
|
@@ -439,7 +506,7 @@ async function runFredList(filter: string, ctx: Parameters<CliCommandDef["execut
|
|
|
439
506
|
{ key: "title", header: "Title", minWidth: 30, stackPriority: 1 },
|
|
440
507
|
{ key: "group", header: "Group", shrink: false },
|
|
441
508
|
],
|
|
442
|
-
empty: filter ? `No supported FRED series match "${filter}". Run
|
|
509
|
+
empty: filter ? `No supported FRED series match "${filter}". Run gloom fred --list to see them all.` : "No FRED series are listed.",
|
|
443
510
|
});
|
|
444
511
|
}
|
|
445
512
|
|
|
@@ -453,7 +520,7 @@ async function runFred(rawArgs: string[], ctx: Parameters<CliCommandDef["execute
|
|
|
453
520
|
// Bare `fred` lists the series it can fetch, grouped by topic, as `fred --list` does.
|
|
454
521
|
if (list || rawArgs.length === 0) {
|
|
455
522
|
if (start != null || sort != null || changeGiven) {
|
|
456
|
-
ctx.fail("--list takes a filter, not --start, --sort or --change.", `Usage:
|
|
523
|
+
ctx.fail("--list takes a filter, not --start, --sort or --change.", `Usage: gloom ${FRED_LIST_USAGE}`);
|
|
457
524
|
}
|
|
458
525
|
return runFredList(args.join(" ").trim(), ctx);
|
|
459
526
|
}
|
|
@@ -468,7 +535,7 @@ async function runFred(rawArgs: string[], ctx: Parameters<CliCommandDef["execute
|
|
|
468
535
|
// A change needs the observation it is measured from: the fetch reaches back before the first row shown.
|
|
469
536
|
const fetchStart = horizon ? fredChangeFetchStart(startDate) : startDate;
|
|
470
537
|
const data = await apiClient.getCloudFredSeries(seriesId, { startDate: fetchStart, sortOrder }).catch((error: unknown) => {
|
|
471
|
-
if (isUnsupportedSeries(error)) ctx.fail(`Unsupported FRED series ${seriesId}. List supported series with:
|
|
538
|
+
if (isUnsupportedSeries(error)) ctx.fail(`Unsupported FRED series ${seriesId}. List supported series with: gloom fred --list`);
|
|
472
539
|
throw error;
|
|
473
540
|
});
|
|
474
541
|
// Every observation exports as `value`, a spread in basis points; its unit goes in the `currency_or_unit` column.
|
|
@@ -493,6 +560,7 @@ async function runFred(rawArgs: string[], ctx: Parameters<CliCommandDef["execute
|
|
|
493
560
|
const notes = [
|
|
494
561
|
...fredHistoryNotes({ startDate, startGiven: start != null, seriesStart: data.info?.observationStart }),
|
|
495
562
|
laggingSeriesNote(seriesId),
|
|
563
|
+
computedFredSeriesNote(seriesId),
|
|
496
564
|
].filter((note): note is string => note != null);
|
|
497
565
|
// Nothing on or after the start: name where the series ends, so an empty answer is not a dead end.
|
|
498
566
|
const latest = rows.length > 0 ? null : await apiClient.getCloudFredSeries(seriesId, { limit: 1, sortOrder: "desc" })
|
|
@@ -508,6 +576,8 @@ async function runFred(rawArgs: string[], ctx: Parameters<CliCommandDef["execute
|
|
|
508
576
|
// FRED names the series' publisher when Gloom Cloud passes it on, and when it last updated the series.
|
|
509
577
|
const publisher = ahead?.publisher ?? data.info?.source?.trim();
|
|
510
578
|
const publishedAt = ahead ? ahead.publishedAt : fredPublicationTime(data.info, newestDate);
|
|
579
|
+
// When the newest figure was released: the report is as of then, `Sep 2026, released Tue 20 Oct`.
|
|
580
|
+
const releasedOn = ahead ? undefined : data.observations.find((observation) => observation.date === newestDate)?.releasedOn;
|
|
511
581
|
ctx.printResult({
|
|
512
582
|
data: rows,
|
|
513
583
|
metadata: {
|
|
@@ -520,6 +590,7 @@ async function runFred(rawArgs: string[], ctx: Parameters<CliCommandDef["execute
|
|
|
520
590
|
source: ahead?.source ?? notOnFredSource(seriesId) ?? "FRED", status: "not-a-feed", basis: "published statistics", observedKey: "date", oldest: null,
|
|
521
591
|
// A monthly or quarterly observation is dated the first of its period, not a day it was seen.
|
|
522
592
|
...(periodicity ? { periodicity } : {}),
|
|
593
|
+
...(releasedOn ? { releasedOn } : {}),
|
|
523
594
|
...(publisher ? { publisher } : {}),
|
|
524
595
|
...(publishedAt ? { publishedAt } : {}),
|
|
525
596
|
}),
|
|
@@ -605,8 +676,8 @@ async function runCorrelation(rawArgs: string[], ctx: Parameters<CliCommandDef["
|
|
|
605
676
|
const args = [...rawArgs];
|
|
606
677
|
const exchange = takeOption(args, "--exchange");
|
|
607
678
|
const usage = "correlation <symbol-a> <symbol-b>";
|
|
608
|
-
requireArg(args[0], `Usage:
|
|
609
|
-
requireArg(args[1], `Usage:
|
|
679
|
+
requireArg(args[0], `Usage: gloom ${usage}`, ctx);
|
|
680
|
+
requireArg(args[1], `Usage: gloom ${usage}`, ctx);
|
|
610
681
|
rejectExtraArgs(args, 2, { usage, takes: "two symbols", advice: "Run it once per pair." }, ctx);
|
|
611
682
|
await withCliServices(ctx, async (services) => {
|
|
612
683
|
// --exchange is for a symbol that names no exchange of its own.
|
|
@@ -697,11 +768,13 @@ export const overviewCliCommands: CliCommandDef[] = [
|
|
|
697
768
|
group: CLI_COMMAND_GROUPS.markets,
|
|
698
769
|
usage: [ECON_USAGE],
|
|
699
770
|
options: [
|
|
700
|
-
{ flags: "--country <
|
|
771
|
+
{ flags: "--country <regions or countries>", description: "US, G7, EU, all (default), or countries by their two-letter codes, comma separated, such as MX or MX,BR,ZA" },
|
|
701
772
|
{ flags: "--impact <level>", description: "high, medium, low, or all (default all)" },
|
|
702
773
|
{ flags: "--from <date>", description: `First day listed, as ${DATE_OPTION_EXAMPLES} (default today, UTC); an earlier day lists past events from the stored calendar and says where it starts` },
|
|
774
|
+
{ flags: "--tz <zone>", description: "Add a column with each release's time on that clock, an IANA zone such as America/New_York; with the weekday when it falls on another day than the UTC date" },
|
|
703
775
|
],
|
|
704
|
-
examples: ["econ", "econ --country US --impact high", "econ --country
|
|
776
|
+
examples: ["econ", "econ --country US --impact high", "econ --country MX,BR,ZA,IN,KR", "econ --from 2026-10-12 --country US",
|
|
777
|
+
"econ --country BR --tz America/New_York", "econ --tail 20"],
|
|
705
778
|
},
|
|
706
779
|
execute: runEcon,
|
|
707
780
|
},
|
|
@@ -723,7 +796,7 @@ export const overviewCliCommands: CliCommandDef[] = [
|
|
|
723
796
|
sections: [{
|
|
724
797
|
title: "Series",
|
|
725
798
|
lines: [
|
|
726
|
-
"Gloom Cloud serves a curated set of FRED series and needs no sign-in for them.
|
|
799
|
+
"Gloom Cloud serves a curated set of FRED series and needs no sign-in for them. gloom fred (or fred --list) prints them by topic; any other ID fails with that pointer.",
|
|
727
800
|
],
|
|
728
801
|
}],
|
|
729
802
|
examples: ["fred CPIAUCSL", "fred DGS10 --tail 5", "fred DGS10 --change 1D --tail 5", "fred UNRATE --start 2020-01-01 --csv", "fred", "fred --list credit", "fred --list fx"],
|
|
@@ -54,8 +54,8 @@ const PLUGINS_DIR = getPluginsDir();
|
|
|
54
54
|
* not removed for the user: an older Gloomberb sharing it may still load it.
|
|
55
55
|
*/
|
|
56
56
|
function absorbedNotice(absorbed: AbsorbedPlugin, directory: string | null): string {
|
|
57
|
-
const built = `${absorbed.name} is built into
|
|
58
|
-
return directory ? `${built}; remove this copy with "
|
|
57
|
+
const built = `${absorbed.name} is built into Gloom now`;
|
|
58
|
+
return directory ? `${built}; remove this copy with "gloom remove ${directory}".` : `${built}.`;
|
|
59
59
|
}
|
|
60
60
|
|
|
61
61
|
export async function updatePlugins(name?: string) {
|
|
@@ -71,7 +71,7 @@ export async function updatePlugins(name?: string) {
|
|
|
71
71
|
const targetDir = join(PLUGINS_DIR, dir);
|
|
72
72
|
const absorbed = findAbsorbedCheckout(targetDir);
|
|
73
73
|
if (absorbed) {
|
|
74
|
-
console.log(cliStyles.muted(`Skipping ${dir} (${absorbed.name} is built into
|
|
74
|
+
console.log(cliStyles.muted(`Skipping ${dir} (${absorbed.name} is built into Gloom now)`));
|
|
75
75
|
continue;
|
|
76
76
|
}
|
|
77
77
|
if (lstatSync(targetDir, { throwIfNoEntry: false })?.isSymbolicLink()) {
|
|
@@ -86,7 +86,7 @@ export async function updatePlugins(name?: string) {
|
|
|
86
86
|
const listing = remote ? listings.get(remote.toLowerCase()) : undefined;
|
|
87
87
|
const required = requiredGloomberb(listing?.minGloomberb);
|
|
88
88
|
if (required) {
|
|
89
|
-
console.log(cliStyles.warning(`Skipping ${dir} (needs
|
|
89
|
+
console.log(cliStyles.warning(`Skipping ${dir} (needs Gloom ${required}, this is ${VERSION})`));
|
|
90
90
|
continue;
|
|
91
91
|
}
|
|
92
92
|
try {
|
|
@@ -188,16 +188,16 @@ async function doctorPlugin(nameOrPath: string): Promise<PluginDoctorReport> {
|
|
|
188
188
|
add("entry", "ok", basename(entryFile));
|
|
189
189
|
|
|
190
190
|
const link = linkHostPackages(candidate);
|
|
191
|
-
if (link.error) add("host-link", "fail", `
|
|
191
|
+
if (link.error) add("host-link", "fail", `Gloom runtime is not linked: ${link.error}`);
|
|
192
192
|
else if (link.provider === "process") add("host-link", "ok", "served by the host process");
|
|
193
193
|
else add("host-link", "ok", `linked ${link.linked.join(", ")}`);
|
|
194
194
|
|
|
195
195
|
const incompatible = checkPluginCompatibility(candidate);
|
|
196
196
|
const declaredMin = readPluginManifest(candidate).minGloomberb;
|
|
197
197
|
// The loader skips this check for a linked checkout, so it only warns there.
|
|
198
|
-
if (incompatible) add("
|
|
199
|
-
else if (declaredMin) add("
|
|
200
|
-
else add("
|
|
198
|
+
if (incompatible) add("gloom", linked ? "warn" : "fail", incompatible.error);
|
|
199
|
+
else if (declaredMin) add("gloom", "ok", `${formatVersion(declaredMin)} or newer`);
|
|
200
|
+
else add("gloom", "warn", "Declares no minimum Gloom: set minGloom in gloom.json.");
|
|
201
201
|
|
|
202
202
|
// Before the import: a removed export is exactly what makes it fail.
|
|
203
203
|
const sources = pluginSourceFiles(candidate).map((file) => readFileSync(file, "utf-8"));
|
|
@@ -363,7 +363,7 @@ export async function listPlugins(ctx: CliCommandContext, options: { check?: boo
|
|
|
363
363
|
columns,
|
|
364
364
|
text: (rows) => {
|
|
365
365
|
if (rows.length === 0) {
|
|
366
|
-
return cliStyles.muted("No plugins installed. Install one with
|
|
366
|
+
return cliStyles.muted("No plugins installed. Install one with gloom install <user/repo>.");
|
|
367
367
|
}
|
|
368
368
|
return [
|
|
369
369
|
renderTable(
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { getDataDir } from "../../data/config/store";
|
|
2
|
-
import type { CliCommandContext
|
|
2
|
+
import type { CliCommandContext } from "../../types/plugin";
|
|
3
3
|
import { sendRemoteControlRequest } from "../../remote/client";
|
|
4
4
|
import type { RemoteAppKind, RemoteControlRequest, RemoteControlResponse } from "../../remote/types";
|
|
5
5
|
import { CLI_COMMAND_GROUPS } from "../help";
|
|
6
|
+
import type { BuiltinCliCommandDef } from "../command-options";
|
|
6
7
|
|
|
7
8
|
interface RemoteArgs {
|
|
8
9
|
args: string[];
|
|
@@ -11,9 +12,11 @@ interface RemoteArgs {
|
|
|
11
12
|
intervalMs: number;
|
|
12
13
|
}
|
|
13
14
|
|
|
14
|
-
export const remoteCliCommand:
|
|
15
|
+
export const remoteCliCommand: BuiltinCliCommandDef = {
|
|
15
16
|
name: "remote",
|
|
16
|
-
description: "Drive a running
|
|
17
|
+
description: "Drive a running Gloom app through its remote API",
|
|
18
|
+
// Resources, operations and JSON go to the app as typed.
|
|
19
|
+
keepsArgAsTyped: () => true,
|
|
17
20
|
help: {
|
|
18
21
|
group: CLI_COMMAND_GROUPS.app,
|
|
19
22
|
usage: [
|
|
@@ -37,21 +40,21 @@ export const remoteCliCommand: CliCommandDef = {
|
|
|
37
40
|
const parsed = parseRemoteArgs(rawArgs);
|
|
38
41
|
const action = parsed.args[0];
|
|
39
42
|
if (!action) {
|
|
40
|
-
ctx.fail("Usage:
|
|
43
|
+
ctx.fail("Usage: gloom remote <schema|help|get|call|patch|batch|watch>");
|
|
41
44
|
return;
|
|
42
45
|
}
|
|
43
46
|
|
|
44
47
|
// No data folder means this profile never opened the app, so none is running to drive.
|
|
45
48
|
const dataDir = await getDataDir();
|
|
46
49
|
if (!dataDir) {
|
|
47
|
-
ctx.fail("No running
|
|
50
|
+
ctx.fail("No running Gloom app found.", "Open the desktop app or run gloom, then try again.");
|
|
48
51
|
return;
|
|
49
52
|
}
|
|
50
53
|
|
|
51
54
|
if (action === "watch") {
|
|
52
55
|
const resource = parsed.args[1];
|
|
53
56
|
if (!resource) {
|
|
54
|
-
ctx.fail("Usage:
|
|
57
|
+
ctx.fail("Usage: gloom remote watch <resource>");
|
|
55
58
|
return;
|
|
56
59
|
}
|
|
57
60
|
const limit = ctx.cliOptions.limit ?? Number.POSITIVE_INFINITY;
|
|
@@ -125,12 +128,12 @@ function buildRemoteRequest(action: string, parsed: RemoteArgs, dryRun: boolean)
|
|
|
125
128
|
return { type: "help" };
|
|
126
129
|
case "get": {
|
|
127
130
|
const resource = parsed.args[1];
|
|
128
|
-
if (!resource) throw new Error("Usage:
|
|
131
|
+
if (!resource) throw new Error("Usage: gloom remote get <resource>");
|
|
129
132
|
return { type: "get", resource };
|
|
130
133
|
}
|
|
131
134
|
case "call": {
|
|
132
135
|
const operation = parsed.args[1];
|
|
133
|
-
if (!operation) throw new Error("Usage:
|
|
136
|
+
if (!operation) throw new Error("Usage: gloom remote call <operation> [json]");
|
|
134
137
|
return {
|
|
135
138
|
type: "call",
|
|
136
139
|
operation,
|
|
@@ -141,7 +144,7 @@ function buildRemoteRequest(action: string, parsed: RemoteArgs, dryRun: boolean)
|
|
|
141
144
|
case "patch": {
|
|
142
145
|
const resource = parsed.args[1];
|
|
143
146
|
const patchRaw = parsed.args[2];
|
|
144
|
-
if (!resource || !patchRaw) throw new Error("Usage:
|
|
147
|
+
if (!resource || !patchRaw) throw new Error("Usage: gloom remote patch <resource> <json-patch>");
|
|
145
148
|
const patch = parseJsonValue(patchRaw, []);
|
|
146
149
|
if (!Array.isArray(patch)) throw new Error("Remote patch payload must be a JSON array.");
|
|
147
150
|
return {
|
|
@@ -154,7 +157,7 @@ function buildRemoteRequest(action: string, parsed: RemoteArgs, dryRun: boolean)
|
|
|
154
157
|
}
|
|
155
158
|
case "batch": {
|
|
156
159
|
const payload = parseJsonValue(parsed.args[1], null);
|
|
157
|
-
if (!payload) throw new Error("Usage:
|
|
160
|
+
if (!payload) throw new Error("Usage: gloom remote batch <json>");
|
|
158
161
|
if (Array.isArray(payload)) return { type: "batch", requests: payload as RemoteControlRequest[], dryRun };
|
|
159
162
|
return withCliDryRun(payload as RemoteControlRequest, dryRun);
|
|
160
163
|
}
|