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
|
@@ -23,7 +23,7 @@ export const catalystsModule: PluginModule = {
|
|
|
23
23
|
instruments: ["equity", "fund"], tableExport: true, headless: litigationHeadless },
|
|
24
24
|
],
|
|
25
25
|
paneTemplates: [
|
|
26
|
-
{ id: "catalysts-pane", paneId: "catalysts", label: "Catalysts", description: "Pro regulatory, clinical, legal and trade-policy calendar with source evidence and revision history.", keywords: ["catalysts", "calendar", "FDA", "clinical", "regulatory", "deadlines", "antitrust", "sanctions"],
|
|
26
|
+
{ id: "catalysts-pane", paneId: "catalysts", label: "Catalysts", description: "Pro regulatory, clinical, legal and trade-policy calendar with source evidence and revision history.", keywords: ["catalysts", "calendar", "FDA", "clinical", "regulatory", "deadlines", "antitrust", "sanctions", "PDUFA", "FDA decision", "approval", "approvals"],
|
|
27
27
|
shortcut: { prefix: "CATL", argKind: "ticker", argPlaceholder: "ticker", argOptional: true, openWithoutArg: true }, headless: catalystsHeadless,
|
|
28
28
|
createInstance: (_context, options) => { const symbol = (options?.symbol ?? options?.arg ?? "").trim().toUpperCase(); const event = options?.values?.event; const open = event && /^[a-zA-Z0-9:_-]{1,160}$/.test(event) ? event : undefined; return { title: symbol ? `CATL ${symbol}` : "Catalysts", placement: "floating", ...(symbol ? { binding: { kind: "fixed" as const, symbol } } : {}), settings: { symbol, ...(open ? { open } : {}) } }; } },
|
|
29
29
|
{ ...createTickerSurfacePaneTemplate({ id: "litigation-pane", paneId: "litigation", label: "Litigation", description: "Pro company litigation, enforcement and antitrust dockets with dated source evidence.", keywords: ["litigation", "legal", "docket", "court", "enforcement", "antitrust"], shortcut: "LITI" }), headless: litigationHeadless },
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { CatalystEvent, CatalystFilters, CatalystResponse, CatalystType } from "../../../api-client/catalysts";
|
|
2
|
-
import type { DataTableColumn } from "../../../components";
|
|
2
|
+
import type { DataTableColumn, TableSection } from "../../../components";
|
|
3
3
|
import { publicTickerKey } from "../../../utils/exchanges";
|
|
4
4
|
import { humanLabel, type StateTone } from "../shared/research-cells";
|
|
5
5
|
|
|
@@ -13,8 +13,17 @@ export const catalystSymbol = (event: CatalystEvent): string | null => {
|
|
|
13
13
|
return party?.ticker ? publicTickerKey(party.ticker, party.exchange ?? undefined) : null;
|
|
14
14
|
};
|
|
15
15
|
export const catalystTickers = (event: CatalystEvent) => [...new Set(event.parties.filter((p) => p.ticker).map((p) => publicTickerKey(p.ticker!, p.exchange ?? undefined)))].join(", ");
|
|
16
|
+
/**
|
|
17
|
+
* A source named the event but withheld its date (a company's PDUFA target
|
|
18
|
+
* without the day). The filing's date is when it was said, so the row has no
|
|
19
|
+
* date of its own; only the announcement and observation dates stand.
|
|
20
|
+
*/
|
|
21
|
+
export const catalystDateWithheld = (event: Pick<CatalystEvent, "metadata">, field: CatalystFilters["dateField"] = "any") =>
|
|
22
|
+
event.metadata?.dateWithheld === true && field !== "announced" && field !== "observed";
|
|
23
|
+
export const CATALYST_DATE_WITHHELD = "Date not disclosed";
|
|
16
24
|
export const catalystDate = (event: CatalystEvent, field: CatalystFilters["dateField"] = "any"): string => {
|
|
17
25
|
if (field === "observed") return event.observedAt.slice(0, 16).replace("T", " ");
|
|
26
|
+
if (catalystDateWithheld(event, field)) return "--";
|
|
18
27
|
const key = field === "announced" || field === "effective" || field === "deadline" ? field
|
|
19
28
|
: event.deadlineDate ? "deadline" : event.effectiveDate ? "effective" : "announced";
|
|
20
29
|
const value = event[`${key}Date`];
|
|
@@ -35,15 +44,22 @@ function fitColumns(columns: FitColumn[], width: number): DataTableColumn[] {
|
|
|
35
44
|
let kept = columns;
|
|
36
45
|
const drop = (id: string) => { if (tableNeed(kept) > width) kept = kept.filter((column) => column.id !== id); };
|
|
37
46
|
for (const id of ["country", "agency", "type"]) drop(id);
|
|
47
|
+
// A long date basis gives up only the cells the table lacks before every column shrinks.
|
|
48
|
+
const over = tableNeed(kept) - width;
|
|
49
|
+
if (over > 0) kept = kept.map((column) => column.id === "basis" ? { ...column, width: Math.max(column.min ?? column.width, column.width - over) } : column);
|
|
38
50
|
if (tableNeed(kept) > width) kept = kept.map((column) => ({ ...column, width: column.min ?? column.width }));
|
|
39
51
|
for (const id of ["basis", "parties"]) drop(id);
|
|
40
52
|
return kept.map(({ min: _min, ...column }) => column);
|
|
41
53
|
}
|
|
42
54
|
|
|
43
|
-
|
|
55
|
+
/** The date basis column as wide as its longest label on screen ("Primary completion (actual)"), never narrower than its heading. */
|
|
56
|
+
export const catalystBasisWidth = (events: readonly CatalystEvent[], field: CatalystFilters["dateField"]) =>
|
|
57
|
+
Math.min(27, events.reduce((widest, event) => Math.max(widest, catalystDateBasis(event, field).length), 10));
|
|
58
|
+
|
|
59
|
+
export function catalystColumns(width: number, changes: boolean, litigation: boolean, basisWidth = 10): DataTableColumn[] {
|
|
44
60
|
return fitColumns([
|
|
45
61
|
{ id: "date", label: changes ? "Observed (UTC)" : "Date", width: changes ? 16 : 10, align: "left" },
|
|
46
|
-
...(!changes ? [{ id: "basis", label: "Date basis", width: 10, align: "left" as const }] : []),
|
|
62
|
+
...(!changes ? [{ id: "basis", label: "Date basis", width: basisWidth, min: 10, align: "left" as const }] : []),
|
|
47
63
|
...(!litigation ? [{ id: "ticker", label: "Ticker", width: width < 110 ? 12 : 14, min: 10, align: "left" as const }] : []),
|
|
48
64
|
// The entity the event is about, which the title alone buries.
|
|
49
65
|
{ id: "parties", label: "Parties", width: Math.max(16, Math.min(28, Math.round(width * 0.16))), min: 14, align: "left" },
|
|
@@ -151,9 +167,30 @@ export function catalystChangeText(change: CatalystEvent["changes"][number]): st
|
|
|
151
167
|
return `${field}: ${changeValue(change.before)} → ${changeValue(change.after)}`;
|
|
152
168
|
}
|
|
153
169
|
const MONTHS = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
|
|
170
|
+
/**
|
|
171
|
+
* Rows under their section headings in the order the server sends them:
|
|
172
|
+
* upcoming dates first, then past ones. A heading starts wherever the label
|
|
173
|
+
* changes, so a month today falls in heads its upcoming days and again its
|
|
174
|
+
* past days, after the later months, never pulling a past day ahead of them.
|
|
175
|
+
*/
|
|
176
|
+
export function catalystSections(rows: readonly CatalystEvent[], field: CatalystFilters["dateField"], changes: boolean): TableSection<CatalystEvent>[] {
|
|
177
|
+
const sections: TableSection<CatalystEvent>[] = [];
|
|
178
|
+
const seen = new Map<string, number>();
|
|
179
|
+
for (const event of rows) {
|
|
180
|
+
const label = catalystSection(event, field, changes);
|
|
181
|
+
const last = sections.at(-1);
|
|
182
|
+
if (last?.label === label) { last.items.push(event); continue; }
|
|
183
|
+
const repeat = seen.get(label) ?? 0;
|
|
184
|
+
seen.set(label, repeat + 1);
|
|
185
|
+
sections.push({ label, key: repeat ? `${label}:${repeat}` : label, items: [event] });
|
|
186
|
+
}
|
|
187
|
+
return sections;
|
|
188
|
+
}
|
|
189
|
+
|
|
154
190
|
/** The calendar groups by the month of the date it shows; the change feed by the day a change was observed. */
|
|
155
191
|
export function catalystSection(event: CatalystEvent, field: CatalystFilters["dateField"], changes: boolean): string {
|
|
156
192
|
if (changes) return event.observedAt.slice(0, 10);
|
|
193
|
+
if (catalystDateWithheld(event, field)) return CATALYST_DATE_WITHHELD;
|
|
157
194
|
const date = catalystDate(event, field);
|
|
158
195
|
if (date === "--") return "Undated";
|
|
159
196
|
return /^\d{4}-\d{2}/.test(date) ? `${MONTHS[Number(date.slice(5, 7)) - 1]} ${date.slice(0, 4)}` : date;
|
|
@@ -206,10 +243,18 @@ export function catalystEmptyTitle(data: Pick<CatalystResponse, "coverage"> | nu
|
|
|
206
243
|
return `No cases linked to ${query.symbol}.${courts.length ? ` ${courts.join(" and ")} are not collected yet, so only agency and regulator actions show.` : ""}`;
|
|
207
244
|
}
|
|
208
245
|
|
|
246
|
+
/** "Primary completion (est.)" or "(actual)", as the registry types the date; never a bare "Completion". */
|
|
247
|
+
function primaryCompletionLabel(event: Pick<CatalystEvent, "metadata">): string {
|
|
248
|
+
const completion = event.metadata?.primaryCompletion;
|
|
249
|
+
const type = completion && typeof completion === "object" && "type" in completion ? String(completion.type).toUpperCase() : "";
|
|
250
|
+
return type === "ESTIMATED" ? "Primary completion (est.)" : type === "ACTUAL" ? "Primary completion (actual)" : "Primary completion";
|
|
251
|
+
}
|
|
252
|
+
|
|
209
253
|
export function catalystDateBasis(event: CatalystEvent, field: CatalystFilters["dateField"] = "any"): string {
|
|
254
|
+
if (catalystDateWithheld(event, field)) return CATALYST_DATE_WITHHELD;
|
|
210
255
|
const basis = field === "any" || !field ? event.deadlineDate ? "deadline" : event.effectiveDate ? "effective" : event.announcedDate ? "announced" : "undated" : field;
|
|
211
256
|
const meaning = String(event.metadata?.[`${basis}Meaning`] ?? event.metadata?.[`${basis}DateMeaning`] ?? "");
|
|
212
|
-
if (/primary completion/i.test(meaning)) return
|
|
257
|
+
if (/primary completion/i.test(meaning)) return primaryCompletionLabel(event);
|
|
213
258
|
if (/comment/i.test(meaning)) return "Comments";
|
|
214
259
|
if (/meeting/i.test(meaning)) return "Meeting";
|
|
215
260
|
return catalystLabel(basis);
|
|
@@ -12,6 +12,7 @@ import { usePaneTickerIdentity } from "../../../state/hooks/pane-ticker";
|
|
|
12
12
|
import { useThemeColors } from "../../../theme/theme-context";
|
|
13
13
|
import type { PaneProps } from "../../../types/plugin";
|
|
14
14
|
import { Box, Text, useUiCapabilities, type ScrollBoxRenderable } from "../../../ui";
|
|
15
|
+
import { withCountryFlag } from "../../../components/ui/country-flag";
|
|
15
16
|
import { SignInWall } from "../cloud/auth-actions";
|
|
16
17
|
import { CLOUD_PLAN_KEY, useCloudUpgradeAction } from "../shared/cloud-upgrade";
|
|
17
18
|
import { useOpenDescription } from "../shared/open-description";
|
|
@@ -20,7 +21,7 @@ import { listingCell, toneColor } from "../shared/research-cells";
|
|
|
20
21
|
import { isCloudSessionRequired, useResearchCloudSession } from "../shared/research-cloud-session";
|
|
21
22
|
import { loadCatalystDetail, loadCatalysts, validateCatalysts } from "./client";
|
|
22
23
|
import { CatalystEventDetail } from "./detail";
|
|
23
|
-
import { catalystAgency, catalystCell, catalystColumns, catalystEmptyTitle, catalystLabel, catalystQuery,
|
|
24
|
+
import { catalystAgency, catalystBasisWidth, catalystCell, catalystColumns, catalystEmptyTitle, catalystLabel, catalystQuery, catalystSections, catalystStatusTone, catalystSymbol, catalystTab, catalystTypeTone, CATALYST_TABS } from "./model";
|
|
24
25
|
|
|
25
26
|
type Row = SectionedRow<CatalystEvent> | { kind: "locked"; key: string };
|
|
26
27
|
const rowKey = (row: Row) => row.key;
|
|
@@ -81,12 +82,7 @@ export function CatalystView({ width, height, focused, symbol, litigation = fals
|
|
|
81
82
|
const lockedRows = Math.min(3, data?.access?.lockedRows ?? 0);
|
|
82
83
|
// Grouped by month on the calendar and by day in the change feed, in the order the server sends them.
|
|
83
84
|
const items = useMemo<Row[]>(() => {
|
|
84
|
-
|
|
85
|
-
for (const event of rows) {
|
|
86
|
-
const label = catalystSection(event, query.dateField, tab === "changes");
|
|
87
|
-
groups.set(label, [...(groups.get(label) ?? []), event]);
|
|
88
|
-
}
|
|
89
|
-
return [...buildSectionedRows([...groups].map(([label, events]) => ({ label, items: events })), (event) => event.id),
|
|
85
|
+
return [...buildSectionedRows(catalystSections(rows, query.dateField, tab === "changes"), (event) => event.id),
|
|
90
86
|
...Array.from({ length: lockedRows }, (_, index): Row => ({ kind: "locked", key: `locked:${index}` }))];
|
|
91
87
|
}, [rows, query.dateField, tab, lockedRows]);
|
|
92
88
|
const listedOpen = rows.find((event) => event.id === openId) ?? null;
|
|
@@ -124,7 +120,7 @@ export function CatalystView({ width, height, focused, symbol, litigation = fals
|
|
|
124
120
|
...(tab === "calendar" ? [{ id: "upcoming", kind: "toggle" as const, label: "Upcoming", value: filters.upcoming === true, onChange: (value: boolean) => changeFilter("upcoming", value) },
|
|
125
121
|
{ id: "date", label: "Date", value: String(filters.dateField ?? "any"), options: [{ value: "any", label: "Any date" }, { value: "announced", label: "Announced" }, { value: "effective", label: "Effective" }, { value: "deadline", label: "Deadlines" }], onChange: (value: string) => changeFilter("dateField", value) }] : []),
|
|
126
122
|
]} />;
|
|
127
|
-
const columns = catalystColumns(width, tab === "changes", litigation);
|
|
123
|
+
const columns = catalystColumns(width, tab === "changes", litigation, catalystBasisWidth(rows, query.dateField));
|
|
128
124
|
const renderCell = (row: Row, column: (typeof columns)[number], _index: number, state: { selected: boolean }): DataTableCell => {
|
|
129
125
|
if (row.kind === "locked") {
|
|
130
126
|
if (!desktop && column.id === "title" && row.key === "locked:0") return { text: "Upgrade for every catalyst and its history", content: <UpgradeLabel text="Upgrade for every catalyst and its history" onPress={openUpgrade} role="catalysts-upgrade" />, onMouseDown: openUpgrade };
|
|
@@ -141,6 +137,8 @@ export function CatalystView({ width, height, focused, symbol, litigation = fals
|
|
|
141
137
|
}
|
|
142
138
|
if (column.id === "parties") return { text, color: text === "--" ? colors.textMuted : colors.textBright };
|
|
143
139
|
if (column.id === "type") return { text, color: toneColor(catalystTypeTone(event.type), colors) };
|
|
140
|
+
// The column has room for the flag beside a code.
|
|
141
|
+
if (column.id === "country") return withCountryFlag({ text, color: colors.textDim }, text, desktop);
|
|
144
142
|
if (column.id === "status") return { text, color: tab === "changes" ? colors.text : toneColor(catalystStatusTone(event.status), colors) };
|
|
145
143
|
return { text, color: column.id === "title" || column.id === "date" ? colors.text : colors.textDim };
|
|
146
144
|
};
|
|
@@ -49,6 +49,11 @@ export function validateCentralBankRates(payload: CentralBankRatesPayload): Cent
|
|
|
49
49
|
if (row.nextMeeting && row.nextMeeting.kind !== undefined && row.nextMeeting.kind !== "decision" && row.nextMeeting.kind !== "fixing") delete row.nextMeeting.kind;
|
|
50
50
|
if (row.nextMeetingStatus !== undefined && !["scheduled", "not-published", "not-verified", "no-policy-rate"].includes(row.nextMeetingStatus)) delete row.nextMeetingStatus;
|
|
51
51
|
if (row.seriesNotes !== undefined && !strings(row.seriesNotes)) delete row.seriesNotes;
|
|
52
|
+
// A decision date is a citation: one that is not a real day on or before the change it is for, from an https page, is left out.
|
|
53
|
+
const decision = row.lastDecision;
|
|
54
|
+
if (decision !== undefined && decision !== null && (typeof decision !== "object" || decision.date == null || !dateOrNull(decision.date)
|
|
55
|
+
|| row.lastChangeDate == null || decision.date > row.lastChangeDate || decision.sourceUrl == null || !urlOrNull(decision.sourceUrl)
|
|
56
|
+
|| !Number.isFinite(Date.parse(decision.verifiedAt)) || decision.kind !== undefined && decision.kind !== "decision" && decision.kind !== "fixing")) delete row.lastDecision;
|
|
52
57
|
}
|
|
53
58
|
return payload;
|
|
54
59
|
}
|
|
@@ -1,10 +1,17 @@
|
|
|
1
1
|
import type { HeadlessPaneColumn, HeadlessPaneDefinition } from "../../../types/plugin";
|
|
2
|
+
import { CENTRAL_BANKS, centralBankNames } from "../../../utils/central-banks";
|
|
2
3
|
import { fetchCentralBankRates } from "./client";
|
|
3
|
-
import {
|
|
4
|
+
import {
|
|
5
|
+
hasNoPolicyRate, policyExportRow, policyLastDecisionText, policyNextMeetingText, policyNotices, policyRate, policyUnlistedNote,
|
|
6
|
+
} from "./model";
|
|
4
7
|
|
|
5
|
-
/**
|
|
8
|
+
/**
|
|
9
|
+
* The citation block every export row carries, headed as a journalist's
|
|
10
|
+
* spreadsheet names it. `source` and `as_of` are the row's own, so the
|
|
11
|
+
* export's fixed columns of the same names are not added again.
|
|
12
|
+
*/
|
|
6
13
|
const CITATION_FIELDS = [
|
|
7
|
-
"central_bank", "source", "series_id", "source_url", "as_of",
|
|
14
|
+
"central_bank", "source", "series_id", "source_url", "as_of", "last_decision",
|
|
8
15
|
"next_meeting", "next_meeting_kind", "next_meeting_source_url", "next_meeting_verified_at", "citation",
|
|
9
16
|
];
|
|
10
17
|
|
|
@@ -16,8 +23,22 @@ const BOARD_COLUMNS: HeadlessPaneColumn[] = [
|
|
|
16
23
|
{ key: "asOf", header: "As of", shrink: false }, { key: "status", header: "Status", stackPriority: 2 }, { key: "instrument", header: "Instrument", stackPriority: 3 },
|
|
17
24
|
];
|
|
18
25
|
|
|
26
|
+
const percentCell = (value: unknown) => policyRate(typeof value === "number" ? value : null);
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* The board's columns as CSV and NDJSON write them: the rate as a number (a
|
|
30
|
+
* target range's midpoint, which the board ranks and charts) with the range's
|
|
31
|
+
* bounds beside it, where the text draws "3.75-4.00%".
|
|
32
|
+
*/
|
|
33
|
+
const EXPORT_BOARD_COLUMNS: HeadlessPaneColumn[] = BOARD_COLUMNS.flatMap((column): HeadlessPaneColumn[] => column.key !== "valueText" ? [column] : [
|
|
34
|
+
{ key: "value", header: "Rate", align: "right", format: percentCell },
|
|
35
|
+
{ key: "rangeLower", header: "Range lower", align: "right", format: percentCell },
|
|
36
|
+
{ key: "rangeUpper", header: "Range upper", align: "right", format: percentCell },
|
|
37
|
+
]);
|
|
38
|
+
|
|
19
39
|
export const centralBankRatesHeadless: HeadlessPaneDefinition<"bundle"> = {
|
|
20
|
-
|
|
40
|
+
// A bank's name or short form typed as a function (`fn ECB`, `fn BOJ`) points here, unless a function owns the word (FOMC is WIRP).
|
|
41
|
+
discovery: { aliases: ["CBR", "CBRT"], suggestFor: CENTRAL_BANKS.flatMap(centralBankNames), dataRequirements: ["Gloom Cloud central-bank-rates endpoint"],
|
|
21
42
|
limitations: ["Published policy observations with individual dates.", "Policy instruments differ.",
|
|
22
43
|
"Next meetings come from each bank's published calendar; SAMA publishes none, and China's date is the monthly LPR fixing."] },
|
|
23
44
|
shape: "bundle",
|
|
@@ -33,19 +54,24 @@ export const centralBankRatesHeadless: HeadlessPaneDefinition<"bundle"> = {
|
|
|
33
54
|
// A row says "stale" in its status, not in a `stale` flag: hand the report its rows' staleness so its status line and a capture count them.
|
|
34
55
|
const observations = data.rows.filter((row) => row.status !== "unavailable")
|
|
35
56
|
.map((row) => ({ asOf: row.asOf, stale: row.status === "stale" }));
|
|
36
|
-
|
|
57
|
+
// Members with no policy rate stay off the board, as the pane keeps them, so every output counts the same rows; a note says why.
|
|
58
|
+
const listed = data.rows.filter((row) => !hasNoPolicyRate(row));
|
|
59
|
+
const exported = listed.map(policyExportRow);
|
|
37
60
|
// A caveat on most rows ("Change date is the first observed new level...") is said once for the report.
|
|
38
61
|
const shared = [...new Set(exported.flatMap((row) => row.notes))]
|
|
39
62
|
.filter((note) => exported.filter((row) => row.notes.includes(note)).length > 1);
|
|
40
63
|
const rows = exported.map((row) => ({ ...row, notes: row.notes.filter((note) => !shared.includes(note)) }));
|
|
41
|
-
|
|
42
|
-
|
|
64
|
+
const notes = [...shared, ...data.rows.filter(hasNoPolicyRate).map(policyUnlistedNote)];
|
|
65
|
+
return { complete, freshness: { observations }, ...(notes.length ? { notes } : {}), sections: [{ title: "Policy rates",
|
|
66
|
+
columns: [...EXPORT_BOARD_COLUMNS, ...CITATION_FIELDS.map((key): HeadlessPaneColumn => ({ key, header: key, literalHeader: true })),
|
|
67
|
+
{ key: "notes", header: "notes", literalHeader: true, format: (value) => Array.isArray(value) ? value.join(" ") : "" }],
|
|
43
68
|
rows,
|
|
44
|
-
// The text keeps the board's table; each row's bank, next
|
|
69
|
+
// The text keeps the board's table; each row's bank, last and next decision, citation and own caveats go under it.
|
|
45
70
|
textColumns: [...BOARD_COLUMNS, { key: "detail", header: "Detail", underRow: true }],
|
|
46
71
|
textRows: rows.map((row, index) => {
|
|
47
|
-
const source =
|
|
48
|
-
|
|
72
|
+
const source = listed[index]!;
|
|
73
|
+
const detail = [`${row.central_bank ?? "No central bank"} · ${policyLastDecisionText(source)}${policyNextMeetingText(source)}`, row.citation];
|
|
74
|
+
return { ...row, detail: [...detail, ...(row.notes.length ? [row.notes.join(" ")] : [])].join("\n") };
|
|
49
75
|
}),
|
|
50
76
|
}], errors, unavailableSymbols: data.rows.filter((row) => row.status === "unavailable" && !hasNoPolicyRate(row)).map((row) => row.id),
|
|
51
77
|
// A year of daily history per row is most of the payload, so JSON carries it only on request.
|
|
@@ -20,7 +20,9 @@ export function policyHistory(row: CentralBankRow) {
|
|
|
20
20
|
}
|
|
21
21
|
export interface PolicyBoardRow extends MarketBoardRow { observation: CentralBankRow }
|
|
22
22
|
export function policyBoardRow(row: CentralBankRow): PolicyBoardRow {
|
|
23
|
-
|
|
23
|
+
// One country's bank leads with its flag; the euro area's with the EU's.
|
|
24
|
+
const country = row.countryCodes.length === 1 ? row.countryCodes[0]! : row.label;
|
|
25
|
+
return { id: row.id, label: row.label, labelDetail: row.instrument, country, value: row.value, valueText: policyLevel(row),
|
|
24
26
|
change: row.changeBps, changeText: policyChange(row), changeAsOf: row.lastChangeDate,
|
|
25
27
|
percentile: row.percentile.value, asOf: row.asOf, status: row.status, observation: row,
|
|
26
28
|
history: policyHistory(row).flatMap((point) => point.value == null ? [] : [{ date: new Date(point.date), close: point.value }]) };
|
|
@@ -97,27 +99,50 @@ export function policyNextMeetingText(row: CentralBankRow): string {
|
|
|
97
99
|
}
|
|
98
100
|
|
|
99
101
|
/**
|
|
100
|
-
*
|
|
101
|
-
* a
|
|
102
|
-
|
|
103
|
-
|
|
102
|
+
* `last decision 2026-09-18 · ` (or `last LPR fixing`) before the next
|
|
103
|
+
* meeting on a row's detail line; nothing when the server gives no date.
|
|
104
|
+
*/
|
|
105
|
+
export function policyLastDecisionText(row: CentralBankRow): string {
|
|
106
|
+
const decision = row.lastDecision;
|
|
107
|
+
if (!decision) return "";
|
|
108
|
+
return `last ${decision.kind === "fixing" ? "LPR fixing" : "decision"} ${decision.date} · `;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* What an export says about one row, history aside: the board's figures, a
|
|
113
|
+
* target range's bounds as numbers (`rangeLower`, `rangeUpper`; the rate is
|
|
114
|
+
* its midpoint) and a citation block, `central_bank` to `citation`, named as
|
|
115
|
+
* CSV heads them. `last_decision` is the bank's latest kept decision on or
|
|
116
|
+
* before the observed change. Notes keep the caveats on the latest rate; the
|
|
117
|
+
* BIS series definition goes with the history (`--history`).
|
|
104
118
|
*/
|
|
105
119
|
export function policyExportRow(row: CentralBankRow) {
|
|
106
120
|
const board = policyBoardRow({ ...row, history: [] });
|
|
107
121
|
const meeting = policyNextMeeting(row);
|
|
108
122
|
return {
|
|
109
123
|
id: row.id, label: row.label, instrument: row.instrument, central_bank: row.centralBank,
|
|
110
|
-
value: row.value, unit: row.unit, range: row.range,
|
|
111
|
-
changeBps: row.changeBps, changeText: board.changeText, lastChangeDate: row.lastChangeDate,
|
|
124
|
+
value: row.value, unit: row.unit, range: row.range, rangeLower: row.range?.lower ?? null, rangeUpper: row.range?.upper ?? null,
|
|
125
|
+
valueText: board.valueText, changeBps: row.changeBps, changeText: board.changeText, lastChangeDate: row.lastChangeDate,
|
|
112
126
|
previousValue: row.previousValue, percentileValue: row.percentile.value,
|
|
113
127
|
asOf: row.asOf, lagDays: row.lagDays, status: row.status, unavailableReason: row.unavailableReason,
|
|
114
128
|
source: policySource(row), series_id: row.sourceSeriesIds.join(", ") || null, source_url: policySeriesUrls(row).join(" ") || null,
|
|
115
|
-
as_of: row.asOf, next_meeting: meeting.text, next_meeting_kind: meeting.kind,
|
|
129
|
+
as_of: row.asOf, last_decision: row.lastDecision?.date ?? null, next_meeting: meeting.text, next_meeting_kind: meeting.kind,
|
|
116
130
|
next_meeting_source_url: meeting.sourceUrl, next_meeting_verified_at: meeting.verifiedAt,
|
|
117
131
|
citation: policyCitation(row), notes: row.notes.filter((note) => !row.seriesNotes?.includes(note)),
|
|
118
132
|
};
|
|
119
133
|
}
|
|
120
134
|
|
|
135
|
+
/**
|
|
136
|
+
* Why a member with no policy rate is left off the board and its exports:
|
|
137
|
+
* `Argentina is not listed: no adopted policy rate (BIS series D.AR, https://...).`
|
|
138
|
+
*/
|
|
139
|
+
export function policyUnlistedNote(row: CentralBankRow): string {
|
|
140
|
+
const source = policySource(row);
|
|
141
|
+
const urls = policySeriesUrls(row);
|
|
142
|
+
const series = source && row.sourceSeriesIds.length > 0 ? `${source} series ${row.sourceSeriesIds.join(" and ")}${urls.length ? `, ${urls.join(" ")}` : ""}` : null;
|
|
143
|
+
return `${row.label} is not listed: ${row.instrument.toLowerCase()}${series ? ` (${series})` : ""}.`;
|
|
144
|
+
}
|
|
145
|
+
|
|
121
146
|
/** Who a chart of the row's series cites: `FRED series ECBDFR`, published by the European Central Bank. */
|
|
122
147
|
export function policySeriesAttribution(row: CentralBankRow): { source: string; publisher?: string } | null {
|
|
123
148
|
const source = policySource(row);
|
|
@@ -286,6 +286,7 @@ export const changelogModule: PluginModule = {
|
|
|
286
286
|
name: "Changelog",
|
|
287
287
|
icon: "L",
|
|
288
288
|
component: ChangelogPane,
|
|
289
|
+
reportFreshness: { status: "not-a-feed", basis: "release notes" },
|
|
289
290
|
defaultPosition: "right",
|
|
290
291
|
defaultMode: "floating",
|
|
291
292
|
defaultFloatingSize: { width: 100, height: 32 },
|
|
@@ -416,6 +416,7 @@ export function panelsForSeries(series: readonly ChartSeriesSpec[], studies: rea
|
|
|
416
416
|
...(id === "rsi" || id === "macd" || id === "atr" ? { label: id.toUpperCase(), height: 0.28 } : {}),
|
|
417
417
|
...(id === "formula" ? { label: "Formula", height: 0.3 } : {}),
|
|
418
418
|
...(id === "correlation" ? { label: "Correlation", height: 0.3 } : {}),
|
|
419
|
+
...(id === "decay" ? { label: "Decay", height: 0.3 } : {}),
|
|
419
420
|
...(id === "realized-vol" ? { label: "Realized Volatility", height: 0.3 } : {}),
|
|
420
421
|
...(/^panel-\d+$/.test(id) ? { label: `Panel ${id.slice("panel-".length)}`, height: 0.35 } : {}),
|
|
421
422
|
}));
|
|
@@ -495,7 +496,7 @@ export function reconcilePanels(
|
|
|
495
496
|
): ChartPanelSpec[] {
|
|
496
497
|
const defaults = panelsForSeries(series, studies);
|
|
497
498
|
const requiredIds = new Set(defaults.map((panel) => panel.id));
|
|
498
|
-
const managedStudyPanelIds = new Set(["volume", "rsi", "macd", "atr", "formula", "correlation", "realized-vol"]);
|
|
499
|
+
const managedStudyPanelIds = new Set(["volume", "rsi", "macd", "atr", "formula", "correlation", "realized-vol", "decay"]);
|
|
499
500
|
const retained = existing.filter((panel) => (
|
|
500
501
|
requiredIds.has(panel.id) || !managedStudyPanelIds.has(panel.id)
|
|
501
502
|
));
|
|
@@ -10,6 +10,12 @@ import { isRecord } from "../../../utils/guards";
|
|
|
10
10
|
|
|
11
11
|
export const CHART_SPEC_SETTING_KEY = "chartSpec";
|
|
12
12
|
export const CHART_INTERACTION_VIEWPORT_SETTING_KEY = "chartInteractionViewport";
|
|
13
|
+
/**
|
|
14
|
+
* Set on a comparison CMP opens until its funds' facts have been read: the
|
|
15
|
+
* pane then draws each leveraged or inverse fund's daily objective once, and
|
|
16
|
+
* drops the flag, so a line the researcher removes stays removed.
|
|
17
|
+
*/
|
|
18
|
+
export const CHART_LEVERAGE_PENDING_SETTING_KEY = "leverageObjectivesPending";
|
|
13
19
|
/** A shared link's pinned crosshair: the chart pins its tab there once on open, then drops it. */
|
|
14
20
|
export const CHART_PINNED_MOMENT_SETTING_KEY = "chartPinnedMoment";
|
|
15
21
|
/** The earliest history a chart reads (FRED series from 1900), and how far ahead one runs. */
|
|
@@ -105,6 +111,7 @@ function decodeSpec(value: unknown): unknown {
|
|
|
105
111
|
try {
|
|
106
112
|
return JSON.parse(trimmed);
|
|
107
113
|
} catch {
|
|
114
|
+
// Intentional ignore: malformed serialized specifications fail validation with null for the caller.
|
|
108
115
|
return null;
|
|
109
116
|
}
|
|
110
117
|
}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import type { HeadlessPaneOptionValues } from "../../../types/headless";
|
|
2
2
|
import {
|
|
3
|
-
CHART_RESOLUTIONS,
|
|
4
3
|
TIME_RANGES,
|
|
5
4
|
type ChartResolution,
|
|
6
5
|
type TimeRange,
|
|
7
6
|
} from "../../../time-series/range";
|
|
7
|
+
import { parseChartResolution } from "../../../time-series/resolution";
|
|
8
8
|
import {
|
|
9
9
|
coerceSeriesTransformForStyle,
|
|
10
10
|
normalizeChartSpec,
|
|
@@ -36,10 +36,7 @@ export function yearToDateWindow(spec: ChartSpec, now = Date.now()): { start: st
|
|
|
36
36
|
}
|
|
37
37
|
|
|
38
38
|
function chartResolution(options: HeadlessPaneOptionValues): ChartResolution | null {
|
|
39
|
-
|
|
40
|
-
return typeof value === "string" && (CHART_RESOLUTIONS as readonly string[]).includes(value)
|
|
41
|
-
? value as ChartResolution
|
|
42
|
-
: null;
|
|
39
|
+
return parseChartResolution(options.chartResolution ?? options.resolution);
|
|
43
40
|
}
|
|
44
41
|
|
|
45
42
|
function financialPeriod(value: unknown): SeriesPeriod | null {
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { logFailure } from "../../../utils/log-failure";
|
|
1
2
|
import { useCallback, useEffect, useMemo, useState } from "react";
|
|
2
3
|
import { Box } from "../../../ui";
|
|
3
4
|
import {
|
|
@@ -194,7 +195,7 @@ export function DataCatalogPane({ focused, width, height }: PaneProps) {
|
|
|
194
195
|
}}
|
|
195
196
|
/>
|
|
196
197
|
),
|
|
197
|
-
}).catch((
|
|
198
|
+
}).catch(logFailure("chart-composer.data-catalog-pane", "Open chart ticker prompt failed"));
|
|
198
199
|
if (chartPlacedSeries(row, ticker)) return;
|
|
199
200
|
const expression = catalogExpressionForRow(row, ticker);
|
|
200
201
|
if (!expression) return;
|
|
@@ -189,6 +189,7 @@ export function useSeriesEditorController({
|
|
|
189
189
|
const {
|
|
190
190
|
suggestions: quickAddSuggestions,
|
|
191
191
|
loading: quickAddLoading,
|
|
192
|
+
error: quickAddError,
|
|
192
193
|
} = useSeriesCatalogSuggestions({
|
|
193
194
|
query: quickAddQuery,
|
|
194
195
|
defaultInstrument,
|
|
@@ -636,6 +637,7 @@ export function useSeriesEditorController({
|
|
|
636
637
|
quickAddActive,
|
|
637
638
|
quickAddItems,
|
|
638
639
|
quickAddLoading,
|
|
640
|
+
quickAddError,
|
|
639
641
|
quickAddQuery,
|
|
640
642
|
quickAddRef,
|
|
641
643
|
quickAddSelection,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Box, Text, useNativeRenderer, useUiCapabilities } from "../../../ui";
|
|
2
|
-
import { DialogFrame, ListView, TextField } from "../../../components/ui";
|
|
2
|
+
import { EmptyState, DialogFrame, ListView, TextField } from "../../../components/ui";
|
|
3
3
|
import type { PromptContext } from "../../../ui/dialog";
|
|
4
4
|
import { colors } from "../../../theme/colors";
|
|
5
5
|
import type { ChartSpec } from "../../../time-series/types";
|
|
@@ -49,6 +49,7 @@ export function SeriesEditorDialog({ dialogId, resolve, initialSpec }: SeriesEdi
|
|
|
49
49
|
quickAddActive,
|
|
50
50
|
quickAddItems,
|
|
51
51
|
quickAddLoading,
|
|
52
|
+
quickAddError,
|
|
52
53
|
quickAddQuery,
|
|
53
54
|
quickAddRef,
|
|
54
55
|
quickAddSelection,
|
|
@@ -137,6 +138,8 @@ export function SeriesEditorDialog({ dialogId, resolve, initialSpec }: SeriesEdi
|
|
|
137
138
|
onActivate={(_, index) => { beginQuickAdd(); addCatalogSuggestion(quickAddSuggestions[index]); }}
|
|
138
139
|
/>
|
|
139
140
|
</Box>
|
|
141
|
+
) : !quickAddLoading && quickAddError ? (
|
|
142
|
+
<EmptyState title={quickAddError} status="error" />
|
|
140
143
|
) : (
|
|
141
144
|
<Text fg={colors.textMuted}>
|
|
142
145
|
{quickAddLoading ? "Searching instruments…" : "No matching security or metric."}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import type { HeadlessPaneDefinition, HeadlessPaneOptionDef } from "../../../types/headless";
|
|
2
2
|
import { isSubMinuteInterval, subMinuteDataMessage } from "../../../cli/known-gaps";
|
|
3
|
+
import { CHART_BAR_SIZE_PRESETS, parseChartBarSize } from "../../../time-series/resolution";
|
|
3
4
|
import { FINANCIAL_PERIOD_OPTION, FINANCIAL_PERIOD_COUNT_OPTION, HISTORY_RANGE_VALUES, RETURN_RANGE_VALUES } from "../shared/headless-options";
|
|
5
|
+
import { DATE_OPTION_EXAMPLES } from "../../../utils/calendar-date";
|
|
4
6
|
|
|
5
7
|
type PaneSchema = Pick<HeadlessPaneDefinition, "argument" | "options" | "discovery">;
|
|
6
8
|
|
|
@@ -11,6 +13,25 @@ type PaneSchema = Pick<HeadlessPaneDefinition, "argument" | "options" | "discove
|
|
|
11
13
|
*/
|
|
12
14
|
const FUNDAMENTAL_PERIOD_OPTION: HeadlessPaneOptionDef = { ...FINANCIAL_PERIOD_OPTION, defaultValue: "quarterly" };
|
|
13
15
|
|
|
16
|
+
const BAR_SIZES = CHART_BAR_SIZE_PRESETS.map((value) => ({ value }));
|
|
17
|
+
|
|
18
|
+
const BAR_SIZE_DESCRIPTION = "Bar size: any count of minutes, hours, days, weeks or months; one the source does not serve is built from its shorter bars";
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* A typed bar size as the chart stores it. A listed one matches in any case,
|
|
22
|
+
* so `1M` stays one minute; any other is read by `parseChartBarSize`.
|
|
23
|
+
*/
|
|
24
|
+
function normalizeBarSize(value: string, auto: boolean): string {
|
|
25
|
+
const listed = (auto ? ["auto"] : []).concat(BAR_SIZES.map((entry) => entry.value)).find((entry) => entry === value.trim().toLowerCase());
|
|
26
|
+
if (listed) return listed;
|
|
27
|
+
const parsed = parseChartBarSize(value);
|
|
28
|
+
if (parsed) return parsed;
|
|
29
|
+
const count = /^\s*(\d+)\s*M\s*$/.exec(value)?.[1];
|
|
30
|
+
throw new Error(count
|
|
31
|
+
? `Invalid --chart-resolution value "${value}". Write ${count}m for ${count} minutes or ${count}mo for ${count} months.`
|
|
32
|
+
: `Invalid --chart-resolution value "${value}". Use ${auto ? "auto, or " : ""}a count and a unit: 10m, 4h, 2d, 1wk, 3mo (up to a day of minutes or hours, a year of days or weeks, 12 months).`);
|
|
33
|
+
}
|
|
34
|
+
|
|
14
35
|
export const paneSchemas = {
|
|
15
36
|
"chart-composer-pane": {
|
|
16
37
|
argument: { kind: "free-text", optional: true },
|
|
@@ -24,21 +45,11 @@ export const paneSchemas = {
|
|
|
24
45
|
},
|
|
25
46
|
{
|
|
26
47
|
key: "chartResolution",
|
|
27
|
-
description:
|
|
48
|
+
description: BAR_SIZE_DESCRIPTION,
|
|
28
49
|
type: "enum",
|
|
29
50
|
aliases: ["resolution"],
|
|
30
|
-
values: [
|
|
31
|
-
|
|
32
|
-
{ value: "1m" },
|
|
33
|
-
{ value: "5m" },
|
|
34
|
-
{ value: "15m" },
|
|
35
|
-
{ value: "30m" },
|
|
36
|
-
{ value: "45m" },
|
|
37
|
-
{ value: "1h" },
|
|
38
|
-
{ value: "1d" },
|
|
39
|
-
{ value: "1wk" },
|
|
40
|
-
{ value: "1mo" },
|
|
41
|
-
],
|
|
51
|
+
values: [{ value: "auto" }, ...BAR_SIZES],
|
|
52
|
+
normalize: (value) => normalizeBarSize(value, true),
|
|
42
53
|
},
|
|
43
54
|
],
|
|
44
55
|
discovery: {
|
|
@@ -95,7 +106,7 @@ export const paneSchemas = {
|
|
|
95
106
|
},
|
|
96
107
|
{
|
|
97
108
|
key: "session",
|
|
98
|
-
description:
|
|
109
|
+
description: `Specific exchange-local session, as ${DATE_OPTION_EXAMPLES}. Overrides the session window.`,
|
|
99
110
|
type: "string",
|
|
100
111
|
},
|
|
101
112
|
],
|
|
@@ -129,21 +140,12 @@ export const paneSchemas = {
|
|
|
129
140
|
},
|
|
130
141
|
{
|
|
131
142
|
key: "chartResolution",
|
|
132
|
-
description:
|
|
143
|
+
description: BAR_SIZE_DESCRIPTION,
|
|
133
144
|
type: "enum",
|
|
134
145
|
aliases: ["resolution"],
|
|
135
|
-
values:
|
|
136
|
-
{ value: "1m" },
|
|
137
|
-
{ value: "5m" },
|
|
138
|
-
{ value: "15m" },
|
|
139
|
-
{ value: "30m" },
|
|
140
|
-
{ value: "45m" },
|
|
141
|
-
{ value: "1h" },
|
|
142
|
-
{ value: "1d" },
|
|
143
|
-
{ value: "1wk" },
|
|
144
|
-
{ value: "1mo" },
|
|
145
|
-
],
|
|
146
|
+
values: BAR_SIZES,
|
|
146
147
|
defaultValue: "1d",
|
|
148
|
+
normalize: (value) => normalizeBarSize(value, false),
|
|
147
149
|
},
|
|
148
150
|
],
|
|
149
151
|
discovery: {
|