gloomberb 0.16.4 → 0.16.6
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 +14 -91
- package/package.json +5 -1
- package/src/{plugins/builtin/cloud → account}/auth-form.tsx +9 -9
- package/src/{plugins/builtin/cloud → account}/auth-model.ts +4 -4
- package/src/account/billing.ts +57 -0
- package/src/{plugins/builtin/cloud → account}/device-signin-dialog.tsx +18 -12
- package/src/{plugins/builtin/cloud → account}/device-signin.ts +2 -2
- package/src/{plugins/builtin/cloud → account}/email-auth-attempt.ts +2 -2
- package/src/account/session.ts +16 -0
- package/src/{plugins/builtin/cloud → account}/upgrade-dialog.tsx +16 -15
- package/src/{plugins/builtin/cloud → account}/upgrade-personalization.ts +7 -7
- package/src/{plugins/builtin/cloud → account}/upgrade-tickers.ts +6 -6
- package/src/{plugins/builtin/cloud → account}/verification-panel.tsx +6 -6
- package/src/api-client/central-bank-rates.ts +6 -1
- package/src/api-client/chat.ts +26 -0
- package/src/api-client/credit-boards.ts +2 -0
- package/src/api-client/data.ts +73 -3
- package/src/api-client/earnings.ts +6 -0
- package/src/api-client/europe-energy.ts +106 -0
- package/src/api-client/futures-curve.ts +56 -0
- package/src/api-client/index.ts +13 -1
- package/src/api-client/market-discovery.ts +13 -1
- package/src/api-client/normalizers.ts +32 -0
- package/src/api-client/paths.ts +7 -0
- package/src/api-client/perps.ts +8 -0
- package/src/api-client/request.ts +9 -2
- package/src/api-client/research-activity.ts +15 -10
- package/src/api-client/socket.ts +29 -0
- package/src/api-client/themes.ts +22 -1
- package/src/api-client/types.ts +78 -2
- package/src/api-client/yield-curves.ts +8 -0
- package/src/app/global-shortcuts.ts +50 -2
- package/src/app/keybindings/actions.ts +12 -1
- package/src/app/pane-runtime/plugin-bindings.ts +2 -2
- package/src/app/pane-runtime/ticker-open-runtime.ts +16 -6
- package/src/app/runtime/desktop-deeplink.ts +10 -5
- package/src/app/runtime/startup.ts +1 -1
- package/src/app.tsx +6 -0
- package/src/architecture/core-builtin-allowlist.json +8 -26
- package/src/ask-gloom/pane-context.ts +114 -0
- package/src/ask-gloom/pane-request.ts +70 -0
- package/src/ask-gloom/pane-text.ts +201 -0
- package/src/brokers/signed-in/sign-in-dialog.tsx +11 -5
- package/src/capabilities/chart-series.ts +19 -2
- package/src/capabilities/factories.ts +1 -0
- package/src/cli/central-bank-events.ts +23 -0
- package/src/cli/command-options.ts +17 -5
- package/src/cli/commands/crypto-hints.ts +35 -2
- package/src/cli/commands/fred-series.ts +146 -0
- package/src/cli/commands/market.ts +501 -115
- package/src/cli/commands/news-hints.ts +62 -0
- package/src/cli/commands/news-search.ts +53 -0
- package/src/cli/commands/options-leaps.ts +5 -2
- package/src/cli/commands/overview.ts +132 -26
- package/src/cli/commands/remote.ts +2 -1
- package/src/cli/commands/search.ts +317 -13
- package/src/cli/commands/system.ts +55 -8
- package/src/cli/commands/ticker.ts +155 -18
- package/src/cli/context.ts +45 -14
- package/src/cli/desktop-pane-shot.ts +76 -7
- package/src/cli/earnings-calendar.ts +71 -0
- package/src/cli/errors.ts +7 -5
- package/src/cli/exit-codes.ts +8 -0
- package/src/cli/export-source.ts +58 -0
- package/src/cli/freshness.ts +18 -7
- package/src/cli/glossary.ts +483 -0
- package/src/cli/help.ts +10 -0
- package/src/cli/helpers.ts +2 -5
- package/src/cli/history-rows.ts +118 -7
- package/src/cli/index-roots.ts +7 -0
- package/src/cli/index.ts +29 -9
- package/src/cli/known-gaps.ts +84 -0
- package/src/cli/listing-arg.ts +551 -97
- package/src/cli/not-a-ticker.ts +24 -9
- package/src/cli/pane-functions/access-gate.ts +13 -2
- package/src/cli/pane-functions/capabilities.ts +4 -3
- package/src/cli/pane-functions/catalog.ts +214 -40
- package/src/cli/pane-functions/data.ts +42 -8
- package/src/cli/pane-functions/discovery.ts +1 -0
- package/src/cli/pane-functions/dom.ts +37 -8
- package/src/cli/pane-functions/freshness.ts +393 -49
- package/src/cli/pane-functions/function-help.ts +31 -15
- package/src/cli/pane-functions/headless.ts +98 -30
- package/src/cli/pane-functions/index.ts +101 -19
- package/src/cli/pane-functions/market-session.ts +22 -8
- package/src/cli/pane-functions/options.ts +71 -22
- package/src/cli/pane-functions/report-notices.ts +25 -7
- package/src/cli/pane-functions/report.ts +15 -8
- package/src/cli/pane-functions/resolver.ts +74 -19
- package/src/cli/pane-functions/screenshot.ts +250 -27
- package/src/cli/perpetual-contract.ts +60 -0
- package/src/cli/registry.ts +3 -1
- package/src/cli/report-tables.ts +26 -7
- package/src/cli/result.ts +45 -11
- package/src/cli/series-search.ts +111 -0
- package/src/cli/staged-tickers.ts +52 -0
- package/src/cli/symbol-args.ts +27 -0
- package/src/cli/symbol-list.ts +154 -0
- package/src/cli/symbol-rows.ts +154 -0
- package/src/cli/ticker-resolution.ts +311 -27
- package/src/cli/types.ts +5 -0
- package/src/components/chart/composite/axis-overlays.tsx +14 -3
- package/src/components/chart/composite/composite-chart.tsx +71 -11
- package/src/components/chart/composite/crosshair-readout.tsx +150 -0
- package/src/components/chart/composite/downsample.ts +1 -1
- package/src/components/chart/composite/format.ts +29 -0
- package/src/components/chart/composite/interactions.ts +9 -2
- package/src/components/chart/composite/legend.tsx +100 -33
- package/src/components/chart/composite/panel-bitmap.ts +70 -35
- package/src/components/chart/composite/panel-labels.ts +18 -17
- package/src/components/chart/composite/panel-series.ts +1 -0
- package/src/components/chart/composite/panel-surface.tsx +46 -21
- package/src/components/chart/composite/price-axis-labels.tsx +3 -1
- package/src/components/chart/composite/rasterizer.ts +50 -8
- package/src/components/chart/composite/scene.ts +2 -1
- package/src/components/chart/composite/time-scale.ts +26 -9
- package/src/components/chart/composite/types.ts +18 -0
- package/src/components/chart/composite/use-composite-viewport.ts +30 -2
- package/src/components/chart/native/raster/crosshair.ts +8 -3
- package/src/components/chart/native/raster/primitives.ts +85 -21
- package/src/components/chart/native/surface/manager.ts +33 -8
- package/src/components/chart/surface3d/chart.tsx +1 -1
- package/src/components/command-bar/action-runtime.ts +1 -1
- package/src/components/command-bar/commands/collection-list.ts +210 -0
- package/src/components/command-bar/commands/collection.ts +40 -1
- package/src/components/command-bar/commands/direct/index.ts +4 -0
- package/src/components/command-bar/commands/registry.ts +8 -0
- package/src/components/command-bar/panel/index.tsx +11 -3
- package/src/components/command-bar/panel/runtime.ts +3 -0
- package/src/components/command-bar/panel/types.ts +2 -0
- package/src/components/command-bar/routes/root/plugin-install.ts +4 -4
- package/src/components/command-bar/routes/root/provider-search.ts +4 -3
- package/src/components/command-bar/routes/ticker-search/results.ts +12 -11
- package/src/components/command-bar/routes/ticker-search/route.ts +4 -3
- package/src/components/command-bar/routing/actions.ts +1 -1
- package/src/components/command-bar/workflow/tickers.ts +42 -17
- package/src/components/layout/detached-pane-shell.tsx +68 -39
- package/src/components/layout/floating-pane.tsx +10 -1
- package/src/components/layout/header.tsx +25 -5
- package/src/components/layout/missing-pane.tsx +3 -3
- package/src/components/layout/pane/capture-stamp.ts +41 -0
- package/src/components/layout/pane/capture-status.ts +12 -0
- package/src/components/layout/pane/content.tsx +7 -13
- package/src/components/layout/pane/footer/index.tsx +6 -2
- package/src/components/layout/pane/footer/keyboard.ts +3 -0
- package/src/components/layout/pane/footer/model.ts +41 -1
- package/src/components/layout/pane/header.tsx +50 -1
- package/src/components/layout/pane/index.tsx +21 -3
- package/src/components/layout/pane/sidebar.tsx +88 -21
- package/src/components/layout/shell/active-drag.ts +21 -5
- package/src/components/layout/shell/cursor-occlusion.ts +2 -1
- package/src/components/layout/shell/drag/index.ts +39 -9
- package/src/components/layout/shell/drag/live.ts +61 -51
- package/src/components/layout/shell/drag/runtime.ts +54 -12
- package/src/components/layout/shell/index.tsx +84 -65
- package/src/components/layout/shell/menu.ts +14 -1
- package/src/components/layout/shell/native/pointer-runtime.ts +3 -1
- package/src/components/layout/shell/pane/actions.ts +32 -10
- package/src/components/layout/shell/pane/ask.ts +131 -0
- package/src/components/layout/shell/pane/capture.ts +162 -0
- package/src/components/layout/shell/pane/layers.tsx +218 -50
- package/src/components/layout/shell/pane/management-shortcuts.ts +46 -1
- package/src/components/layout/shell/shortcuts.ts +21 -4
- package/src/components/layout/shell/terminal-pointer-runtime.ts +24 -0
- package/src/components/markdown-text.tsx +62 -20
- package/src/components/metric-treemap/heat-surface.tsx +8 -1
- package/src/components/onboarding/account-step/form-panel.tsx +1 -1
- package/src/components/onboarding/account-step/index.tsx +1 -1
- package/src/components/onboarding/account-step/qr-panel.tsx +1 -1
- package/src/components/onboarding/account-step/signed-in-panel.tsx +1 -1
- package/src/components/onboarding/onboarding-keyboard.ts +1 -1
- package/src/components/onboarding/onboarding-wizard.tsx +2 -2
- package/src/components/onboarding/use-onboarding-upgrade.ts +3 -3
- package/src/components/onboarding/wizard-account.ts +2 -2
- package/src/components/pane-template-wizard.tsx +9 -1
- package/src/components/price-selector-dialog.tsx +11 -2
- package/src/components/reader/article-reader.tsx +642 -0
- package/src/components/reader/article-text.ts +527 -0
- package/src/components/sign-in-gate.tsx +3 -3
- package/src/components/ticker/list-table-view.tsx +43 -2
- package/src/components/ui/action-row.tsx +2 -1
- package/src/components/ui/button.tsx +7 -1
- package/src/components/ui/choice-dialog.tsx +6 -4
- package/src/components/ui/confirm-dialog.tsx +28 -18
- package/src/components/ui/data-table/index.tsx +18 -6
- package/src/components/ui/data-table/opentui/index.tsx +37 -6
- package/src/components/ui/data-table/types.ts +12 -0
- package/src/components/ui/dialog-actions.tsx +64 -0
- package/src/components/ui/display.tsx +17 -3
- package/src/components/ui/frame.tsx +35 -2
- package/src/components/ui/icon.tsx +6 -1
- package/src/components/ui/query-bar.tsx +10 -1
- package/src/components/ui/text-prompt-dialog.tsx +11 -9
- package/src/data/cached-query.ts +2 -0
- package/src/data/config/store/migrations.ts +7 -0
- package/src/data/config/store/normalize.ts +7 -2
- package/src/data/config/store/portfolio-as-of-column.ts +57 -0
- package/src/data/ticker-repository.ts +5 -0
- package/src/data/ticker-store.ts +15 -0
- package/src/docs/content.ts +215 -0
- package/src/docs/load.ts +139 -0
- package/src/docs/requests.ts +39 -0
- package/src/docs/snapshot.chunk.ts +8 -0
- package/src/docs/snapshot.json +7555 -0
- package/src/docs/topics.ts +216 -0
- package/src/i18n/es.ts +65 -5
- package/src/i18n/ja.ts +65 -5
- package/src/i18n/ko.ts +65 -5
- package/src/i18n/zh-cn.ts +65 -5
- package/src/i18n/zh-tw.ts +65 -5
- package/src/layout/desks.ts +1 -1
- package/src/layout/pane-manager/dock-tree.ts +18 -0
- package/src/layout/pane-manager/index.ts +1 -0
- package/src/layout-marketplace/gallery.tsx +1 -1
- package/src/market-data/coordinator/chart.ts +10 -4
- package/src/market-data/coordinator/index.ts +6 -3
- package/src/{plugins/builtin/futures/contracts.ts → market-data/futures-board.ts} +81 -28
- package/src/market-data/futures-contract.ts +151 -0
- package/src/market-data/hooks.tsx +10 -2
- package/src/market-data/market/format.ts +39 -21
- package/src/market-data/market/freshness.ts +84 -20
- package/src/market-data/market/session-close-note.ts +3 -2
- package/src/market-data/market/status.ts +19 -23
- package/src/market-data/published-apac-sessions.ts +23 -1
- package/src/market-data/quotes/contributions.ts +5 -0
- package/src/market-data/quotes/metadata.ts +19 -24
- package/src/market-data/quotes/resolution.ts +5 -0
- package/src/market-data/quotes/screener-live-quotes.ts +5 -4
- package/src/market-data/result-types.ts +2 -0
- package/src/notifications/app-notifier.ts +17 -1
- package/src/notifications/notification-log.ts +180 -0
- package/src/plugins/auto-update-node.ts +2 -2
- package/src/plugins/auto-update.ts +2 -2
- package/src/plugins/builtin/account-management/index.tsx +1 -0
- package/src/plugins/builtin/account-management/model.ts +1 -56
- package/src/plugins/builtin/account-management/pane.tsx +6 -4
- package/src/plugins/builtin/account-management/password-dialog.tsx +1 -1
- package/src/plugins/builtin/alerts/catalysts.ts +1 -1
- package/src/plugins/builtin/alerts/cli.ts +313 -47
- package/src/plugins/builtin/alerts/events-pane.tsx +45 -7
- package/src/plugins/builtin/alerts/events.ts +23 -2
- package/src/plugins/builtin/alerts/focus.ts +27 -0
- package/src/plugins/builtin/alerts/history-pane.tsx +7 -2
- package/src/plugins/builtin/alerts/history.ts +2 -0
- package/src/plugins/builtin/alerts/index.tsx +47 -11
- package/src/plugins/builtin/alerts/pane.tsx +27 -1
- package/src/plugins/builtin/alerts/research-builder.ts +8 -3
- package/src/plugins/builtin/alerts/research-rules.ts +18 -2
- package/src/plugins/builtin/alerts/scheduled-check.ts +122 -0
- package/src/plugins/builtin/alerts/scheduled-sources.ts +25 -0
- package/src/plugins/builtin/alerts/scheduled.ts +254 -0
- package/src/plugins/builtin/alerts/targets.ts +92 -0
- package/src/plugins/builtin/analytics/index.tsx +8 -3
- package/src/plugins/builtin/analytics/risk-headless.ts +60 -27
- package/src/plugins/builtin/analytics/risk-math.ts +91 -27
- package/src/plugins/builtin/analytics/risk-model.ts +35 -5
- package/src/plugins/builtin/analytics/risk-pane.tsx +15 -8
- package/src/plugins/builtin/attention/headless.ts +1 -1
- package/src/plugins/builtin/attention/index.tsx +2 -0
- package/src/plugins/builtin/attention/pane.tsx +3 -1
- package/src/plugins/builtin/attention/series.ts +26 -0
- package/src/plugins/builtin/awards/headless.ts +88 -18
- package/src/plugins/builtin/awards/index.tsx +2 -0
- package/src/plugins/builtin/awards/model.ts +41 -1
- package/src/plugins/builtin/awards/pane.tsx +22 -13
- package/src/plugins/builtin/awards/series.ts +29 -0
- package/src/plugins/builtin/backtest/headless.ts +2 -2
- package/src/plugins/builtin/bond-calculator/model.ts +2 -1
- package/src/plugins/builtin/broker-manager/index.tsx +1 -0
- package/src/plugins/builtin/catalysts/headless.ts +1 -1
- package/src/plugins/builtin/catalysts/pane.tsx +3 -1
- package/src/plugins/builtin/cds/client.ts +49 -12
- package/src/plugins/builtin/cds/headless.ts +119 -19
- package/src/plugins/builtin/cds/index.tsx +3 -1
- package/src/plugins/builtin/cds/model.ts +214 -32
- package/src/plugins/builtin/cds/pane.tsx +58 -14
- package/src/plugins/builtin/cds/series.ts +19 -0
- package/src/plugins/builtin/central-bank-rates/client.ts +4 -0
- package/src/plugins/builtin/central-bank-rates/headless.ts +46 -16
- package/src/plugins/builtin/central-bank-rates/index.tsx +3 -1
- package/src/plugins/builtin/central-bank-rates/model.ts +99 -0
- package/src/plugins/builtin/central-bank-rates/pane.tsx +1 -1
- package/src/plugins/builtin/central-bank-rates/series.ts +36 -0
- package/src/plugins/builtin/chart-composer/catalog-inventory.ts +193 -255
- package/src/plugins/builtin/chart-composer/data-catalog-pane.tsx +84 -46
- package/src/plugins/builtin/chart-composer/editor.tsx +5 -4
- package/src/plugins/builtin/chart-composer/field-series.ts +40 -0
- package/src/plugins/builtin/chart-composer/headless-schema.ts +1 -1
- package/src/plugins/builtin/chart-composer/headless.ts +70 -5
- package/src/plugins/builtin/chart-composer/index.tsx +15 -3
- package/src/plugins/builtin/chart-composer/pane.tsx +81 -38
- package/src/plugins/builtin/chart-composer/series-catalog.ts +58 -50
- package/src/plugins/builtin/chart-composer/series-expression.ts +18 -10
- package/src/plugins/builtin/chart-composer/use-series-catalog.ts +59 -3
- package/src/plugins/builtin/chart-composer/user-series.ts +84 -0
- package/src/plugins/builtin/chat/content/composer-runtime.ts +6 -1
- package/src/plugins/builtin/chat/content/composer.tsx +5 -1
- package/src/plugins/builtin/chat/content/footer.tsx +12 -0
- package/src/plugins/builtin/chat/content/index.tsx +89 -5
- package/src/plugins/builtin/chat/content/new-dm-dialog.tsx +10 -2
- package/src/plugins/builtin/chat/content/new-messages.tsx +89 -0
- package/src/plugins/builtin/chat/content/row-activity.ts +132 -0
- package/src/plugins/builtin/chat/content/scroll.ts +127 -27
- package/src/plugins/builtin/chat/content/shortcuts.ts +2 -2
- package/src/plugins/builtin/chat/content/transcript.tsx +145 -78
- package/src/plugins/builtin/chat/content/types.ts +1 -0
- package/src/plugins/builtin/chat/controller/fetch.ts +8 -2
- package/src/plugins/builtin/chat/controller/index.ts +123 -1
- package/src/plugins/builtin/chat/controller/message-loading.ts +3 -0
- package/src/plugins/builtin/chat/controller/messages.ts +7 -2
- package/src/plugins/builtin/chat/controller/realtime.ts +10 -1
- package/src/plugins/builtin/chat/controller/send.ts +61 -1
- package/src/plugins/builtin/chat/controller/state.ts +8 -0
- package/src/plugins/builtin/chat/ghost-user.ts +20 -0
- package/src/plugins/builtin/chat/index.tsx +23 -5
- package/src/plugins/builtin/chat/layout.ts +78 -5
- package/src/plugins/builtin/chat/message/ai-badge.tsx +18 -0
- package/src/plugins/builtin/chat/message/desktop.tsx +55 -6
- package/src/plugins/builtin/chat/message/header.tsx +16 -4
- package/src/plugins/builtin/chat/message/profile-popover.tsx +5 -1
- package/src/plugins/builtin/chat/message/reactions.tsx +210 -0
- package/src/plugins/builtin/chat/message/render-state.ts +18 -2
- package/src/plugins/builtin/chat/message/terminal.tsx +43 -4
- package/src/plugins/builtin/chat/message/types.ts +12 -0
- package/src/plugins/builtin/chat/reactions.ts +197 -0
- package/src/plugins/builtin/chat/share/flow.tsx +87 -0
- package/src/plugins/builtin/chat/share/targets.ts +27 -0
- package/src/plugins/builtin/chat/status-widget.tsx +6 -3
- package/src/plugins/builtin/chat/unread-inbox-pane.tsx +148 -27
- package/src/plugins/builtin/chat/unread-inbox.ts +22 -0
- package/src/plugins/builtin/cloud/askg/attached-pane.tsx +69 -0
- package/src/plugins/builtin/cloud/askg/controller.ts +111 -19
- package/src/plugins/builtin/cloud/askg/executor.ts +57 -3
- package/src/plugins/builtin/cloud/askg/manifest.ts +32 -7
- package/src/plugins/builtin/cloud/askg/model.ts +27 -8
- package/src/plugins/builtin/cloud/askg/pane-attachment.ts +94 -0
- package/src/plugins/builtin/cloud/askg/pane.tsx +141 -12
- package/src/plugins/builtin/cloud/askg/pending-question.ts +11 -0
- package/src/plugins/builtin/cloud/askg/protocol.ts +10 -1
- package/src/plugins/builtin/cloud/askg/tool-display.ts +3 -0
- package/src/plugins/builtin/cloud/askg/undo.ts +2 -0
- package/src/plugins/builtin/cloud/auth-actions.tsx +1 -1
- package/src/plugins/builtin/cloud/auth-commands.ts +1 -1
- package/src/plugins/builtin/cloud/auth-dialog.tsx +3 -3
- package/src/plugins/builtin/cloud/company-picker.tsx +1 -1
- package/src/plugins/builtin/cloud/mcp-connect/dialog.tsx +3 -0
- package/src/plugins/builtin/cloud/plugin.tsx +19 -2
- package/src/plugins/builtin/cloud/team/model.ts +5 -0
- package/src/plugins/builtin/cloud/team/module.tsx +1 -0
- package/src/plugins/builtin/cloud/team/store.ts +8 -3
- package/src/plugins/builtin/cloud/terminal-relay/engine.ts +77 -9
- package/src/plugins/builtin/cloud/terminal-relay/manifest.ts +6 -1
- package/src/plugins/builtin/cloud/terminal-relay/policy.ts +9 -0
- package/src/plugins/builtin/cloud/terminal-relay/prompts.tsx +35 -11
- package/src/plugins/builtin/cloud/thesis/exposure.ts +1 -1
- package/src/plugins/builtin/cloud/thesis/module.tsx +1 -0
- package/src/plugins/builtin/cloud/thesis/prompts.tsx +2 -1
- package/src/plugins/builtin/company-attention/app-rank.tsx +1 -1
- package/src/plugins/builtin/company-attention/headless.ts +21 -7
- package/src/plugins/builtin/company-attention/index.tsx +2 -0
- package/src/plugins/builtin/company-attention/model.ts +26 -7
- package/src/plugins/builtin/company-attention/pane.tsx +12 -9
- package/src/plugins/builtin/company-attention/series.ts +52 -0
- package/src/plugins/builtin/company-kpis/headless.ts +97 -10
- package/src/plugins/builtin/company-kpis/model.ts +24 -2
- package/src/plugins/builtin/company-kpis/pane.tsx +17 -16
- package/src/plugins/builtin/composite-plugins.ts +19 -13
- package/src/plugins/builtin/connections/index.ts +1 -0
- package/src/plugins/builtin/cot/headless.ts +1 -1
- package/src/plugins/builtin/cot/index.tsx +3 -1
- package/src/plugins/builtin/cot/model.ts +40 -11
- package/src/plugins/builtin/cot/series.ts +27 -0
- package/src/plugins/builtin/cpi/headless.ts +3 -3
- package/src/plugins/builtin/credit-boards/cdx-pane.tsx +10 -1
- package/src/plugins/builtin/credit-boards/client.ts +6 -2
- package/src/plugins/builtin/credit-boards/headless.ts +108 -31
- package/src/plugins/builtin/credit-boards/index.tsx +2 -0
- package/src/plugins/builtin/credit-boards/model.ts +11 -1
- package/src/plugins/builtin/credit-boards/series.ts +66 -0
- package/src/plugins/builtin/credit-conditions/client.ts +12 -9
- package/src/plugins/builtin/credit-conditions/headless.ts +13 -2
- package/src/plugins/builtin/credit-conditions/index.tsx +18 -9
- package/src/plugins/builtin/credit-conditions/model.ts +19 -11
- package/src/plugins/builtin/credit-conditions/series.ts +16 -0
- package/src/plugins/builtin/credit-documents/headless.ts +33 -3
- package/src/plugins/builtin/credit-documents/pane.tsx +3 -1
- package/src/plugins/builtin/crypto-board/headless.ts +2 -3
- package/src/plugins/builtin/crypto-board/index.tsx +2 -0
- package/src/plugins/builtin/crypto-board/model.ts +12 -0
- package/src/plugins/builtin/crypto-board/pane.tsx +19 -12
- package/src/plugins/builtin/crypto-board/series.ts +48 -0
- package/src/plugins/builtin/custom-view/live-quotes.ts +2 -2
- package/src/plugins/builtin/debt-maturities/headless.ts +17 -11
- package/src/plugins/builtin/debt-maturities/index.tsx +2 -0
- package/src/plugins/builtin/debt-maturities/series.ts +45 -0
- package/src/plugins/builtin/dividend-yield/client.ts +3 -0
- package/src/plugins/builtin/dividend-yield/headless.ts +7 -4
- package/src/plugins/builtin/dividend-yield/index.tsx +3 -1
- package/src/plugins/builtin/dividend-yield/pane.tsx +3 -1
- package/src/plugins/builtin/dividend-yield/series.ts +20 -0
- package/src/plugins/builtin/dividend-yield/types.ts +2 -0
- package/src/plugins/builtin/docs/blocks.tsx +181 -0
- package/src/plugins/builtin/docs/index.tsx +68 -0
- package/src/plugins/builtin/docs/pane.tsx +426 -0
- package/src/plugins/builtin/docs/targets.ts +72 -0
- package/src/plugins/builtin/docs/use-docs.ts +60 -0
- package/src/plugins/builtin/doe/headless.ts +12 -8
- package/src/plugins/builtin/doe/index.tsx +2 -0
- package/src/plugins/builtin/doe/series.ts +62 -0
- package/src/plugins/builtin/earnings/client.ts +3 -2
- package/src/plugins/builtin/earnings/format.ts +1 -5
- package/src/plugins/builtin/earnings/headless.ts +58 -6
- package/src/plugins/builtin/earnings/history-model.ts +15 -1
- package/src/plugins/builtin/earnings/history-table.ts +13 -2
- package/src/plugins/builtin/earnings/history.tsx +7 -3
- package/src/plugins/builtin/earnings/index.tsx +9 -0
- package/src/plugins/builtin/earnings-calls/headless.ts +28 -2
- package/src/plugins/builtin/earnings-calls/index.tsx +1 -1
- package/src/plugins/builtin/earnings-ripple/index.tsx +2 -0
- package/src/plugins/builtin/econ/fred-catalog.ts +198 -0
- package/src/plugins/builtin/econ/fred-series-map.ts +0 -46
- package/src/plugins/builtin/econ/index.tsx +2 -0
- package/src/plugins/builtin/econ-statistics/defs.ts +5 -0
- package/src/plugins/builtin/econ-statistics/headless.ts +19 -4
- package/src/plugins/builtin/econ-statistics/stats.ts +1 -0
- package/src/plugins/builtin/equity-screener/headless.ts +3 -3
- package/src/plugins/builtin/equity-screener/pane.tsx +4 -11
- package/src/plugins/builtin/estimate-revisions/headless.ts +3 -3
- package/src/plugins/builtin/exposure/drivers.ts +13 -0
- package/src/plugins/builtin/exposure/headless.ts +205 -13
- package/src/plugins/builtin/exposure/holdings.ts +1 -1
- package/src/plugins/builtin/exposure/index.tsx +1 -0
- package/src/plugins/builtin/exposure/model.ts +23 -3
- package/src/plugins/builtin/exposure/pane.tsx +14 -12
- package/src/plugins/builtin/fear-greed/index.tsx +18 -10
- package/src/plugins/builtin/fear-greed/series.ts +52 -0
- package/src/plugins/builtin/futures/index.tsx +43 -3
- package/src/plugins/builtin/futures/model.ts +1 -1
- package/src/plugins/builtin/futures/returns.ts +1 -1
- package/src/plugins/builtin/futures/series.ts +13 -0
- package/src/plugins/builtin/futures/table.tsx +1 -1
- package/src/plugins/builtin/futures/use-front-returns.ts +1 -1
- package/src/plugins/builtin/futures-curve/client.ts +12 -3
- package/src/plugins/builtin/futures-curve/headless.ts +71 -10
- package/src/plugins/builtin/futures-curve/index.tsx +1 -1
- package/src/plugins/builtin/futures-curve/model.ts +66 -11
- package/src/plugins/builtin/futures-curve/pane.tsx +52 -18
- package/src/plugins/builtin/fx-matrix/client.ts +63 -0
- package/src/plugins/builtin/fx-matrix/export.ts +2 -1
- package/src/plugins/builtin/fx-matrix/headless.ts +154 -0
- package/src/plugins/builtin/fx-matrix/index.tsx +4 -4
- package/src/plugins/builtin/gpu/board.tsx +13 -10
- package/src/plugins/builtin/gpu/changes.tsx +4 -4
- package/src/plugins/builtin/gpu/client.ts +19 -1
- package/src/plugins/builtin/gpu/equities.tsx +14 -10
- package/src/plugins/builtin/gpu/headless.ts +58 -27
- package/src/plugins/builtin/gpu/history.tsx +3 -3
- package/src/plugins/builtin/gpu/index.tsx +2 -0
- package/src/plugins/builtin/gpu/model.ts +101 -16
- package/src/plugins/builtin/gpu/pane.tsx +28 -12
- package/src/plugins/builtin/gpu/series.ts +38 -0
- package/src/plugins/builtin/help/function-card.tsx +25 -6
- package/src/plugins/builtin/help/function-index.ts +2 -0
- package/src/plugins/builtin/help/index.tsx +31 -9
- package/src/plugins/builtin/holders/beneficial-model.ts +90 -3
- package/src/plugins/builtin/holders/beneficial-report.ts +57 -5
- package/src/plugins/builtin/holders/beneficial-view.tsx +55 -11
- package/src/plugins/builtin/holders/client.ts +22 -3
- package/src/plugins/builtin/holders/format.ts +18 -3
- package/src/plugins/builtin/holders/headless.ts +36 -133
- package/src/plugins/builtin/holders/pane.tsx +11 -4
- package/src/plugins/builtin/holders/report-header.ts +40 -5
- package/src/plugins/builtin/holders/report-rows.ts +240 -0
- package/src/plugins/builtin/insider/client.ts +35 -20
- package/src/plugins/builtin/insider/headless.ts +41 -11
- package/src/plugins/builtin/insider/index.tsx +26 -9
- package/src/plugins/builtin/insider/insider-data.ts +10 -0
- package/src/plugins/builtin/insider/issuer.ts +49 -0
- package/src/plugins/builtin/insider/model.ts +3 -0
- package/src/plugins/builtin/ipo-calendar/headless.ts +1 -1
- package/src/plugins/builtin/iv-history/client.ts +20 -6
- package/src/plugins/builtin/iv-history/format.ts +9 -0
- package/src/plugins/builtin/iv-history/headless.ts +56 -21
- package/src/plugins/builtin/iv-history/index.tsx +2 -0
- package/src/plugins/builtin/iv-history/model.ts +143 -8
- package/src/plugins/builtin/iv-history/screen-pane.tsx +5 -9
- package/src/plugins/builtin/iv-history/series.ts +29 -0
- package/src/plugins/builtin/jobs/headless.ts +26 -3
- package/src/plugins/builtin/jobs/index.tsx +3 -1
- package/src/plugins/builtin/jobs/series.ts +19 -0
- package/src/plugins/builtin/kelly-sizer/index.tsx +2 -0
- package/src/plugins/builtin/kelly-sizer/pane.tsx +2 -1
- package/src/plugins/builtin/kelly-sizer/portfolio.ts +0 -39
- package/src/plugins/builtin/macro-day/client.ts +44 -3
- package/src/plugins/builtin/macro-day/headless.ts +13 -10
- package/src/plugins/builtin/macro-day/model.ts +56 -10
- package/src/plugins/builtin/macro-day/pane.tsx +30 -20
- package/src/plugins/builtin/market-heatmap/headless.ts +20 -5
- package/src/plugins/builtin/market-heatmap/index.tsx +6 -0
- package/src/plugins/builtin/market-heatmap/model.ts +19 -11
- package/src/plugins/builtin/market-heatmap/portfolio.ts +2 -2
- package/src/plugins/builtin/market-movers/client.ts +7 -5
- package/src/plugins/builtin/market-movers/index.tsx +3 -2
- package/src/plugins/builtin/market-movers/model.ts +30 -0
- package/src/plugins/builtin/market-movers/screener.ts +31 -0
- package/src/plugins/builtin/market-valuation/chart-series.ts +29 -69
- package/src/plugins/builtin/market-valuation/index.tsx +3 -3
- package/src/plugins/builtin/market-valuation/indicators.ts +0 -5
- package/src/plugins/builtin/members/headless.ts +8 -3
- package/src/plugins/builtin/members/model.ts +31 -3
- package/src/plugins/builtin/members/pane.tsx +6 -8
- package/src/plugins/builtin/mna/distress/headless.ts +4 -4
- package/src/plugins/builtin/mna/headless.ts +18 -6
- package/src/plugins/builtin/money-markets/headless.ts +5 -4
- package/src/plugins/builtin/money-markets/index.tsx +2 -0
- package/src/plugins/builtin/money-markets/series.ts +41 -0
- package/src/plugins/builtin/news/index.tsx +0 -2
- package/src/plugins/builtin/news/wire/news/detail-view.tsx +53 -104
- package/src/plugins/builtin/news/wire/news/footer.ts +2 -25
- package/src/plugins/builtin/news/wire/news/preset-pane.tsx +0 -2
- package/src/plugins/builtin/notes/cli.ts +12 -7
- package/src/plugins/builtin/notes/index.tsx +1 -0
- package/src/plugins/builtin/options/index.tsx +3 -0
- package/src/plugins/builtin/options/view.tsx +1 -1
- package/src/plugins/builtin/options-calculator/inputs.ts +2 -1
- package/src/plugins/builtin/options-positioning/client.ts +7 -3
- package/src/plugins/builtin/options-positioning/headless.ts +4 -3
- package/src/plugins/builtin/options-positioning/pane.tsx +2 -2
- package/src/plugins/builtin/options-scenario/client.ts +2 -1
- package/src/plugins/builtin/options-scenario/headless.ts +1 -0
- package/src/plugins/builtin/options-scenario/hedge.ts +2 -1
- package/src/plugins/builtin/perps/client.ts +90 -16
- package/src/plugins/builtin/perps/equity-row.tsx +52 -17
- package/src/plugins/builtin/perps/freshness.ts +66 -0
- package/src/plugins/builtin/perps/headless.ts +47 -32
- package/src/plugins/builtin/perps/index.tsx +23 -4
- package/src/plugins/builtin/perps/list-perpetuals.ts +118 -0
- package/src/plugins/builtin/perps/model.ts +20 -5
- package/src/plugins/builtin/perps/open-market.ts +15 -0
- package/src/plugins/builtin/perps/pane.tsx +76 -20
- package/src/plugins/builtin/perps/series.ts +76 -0
- package/src/plugins/builtin/plugin-marketplace/index.tsx +1 -1
- package/src/plugins/builtin/plugin-marketplace/pane.tsx +73 -67
- package/src/plugins/builtin/plugin-module.ts +3 -0
- package/src/plugins/builtin/portfolio-list/account-metrics.ts +1 -1
- package/src/plugins/builtin/portfolio-list/allocation.ts +5 -4
- package/src/plugins/builtin/portfolio-list/cell-version.ts +8 -1
- package/src/plugins/builtin/portfolio-list/cli/bulk-symbols.ts +161 -0
- package/src/plugins/builtin/portfolio-list/cli/import-13f.ts +109 -0
- package/src/plugins/builtin/portfolio-list/cli/portfolio-command.ts +384 -74
- package/src/plugins/builtin/portfolio-list/cli/render.ts +437 -71
- package/src/plugins/builtin/portfolio-list/cli/shared.ts +21 -4
- package/src/plugins/builtin/portfolio-list/cli/watchlist-command.ts +121 -47
- package/src/plugins/builtin/portfolio-list/column-values.ts +104 -26
- package/src/plugins/builtin/portfolio-list/grid.tsx +1 -1
- package/src/plugins/builtin/portfolio-list/headless.ts +84 -18
- package/src/plugins/builtin/portfolio-list/imported-from.ts +8 -0
- package/src/plugins/builtin/portfolio-list/index.tsx +5 -1
- package/src/plugins/builtin/portfolio-list/live-valuation.ts +6 -2
- package/src/plugins/builtin/portfolio-list/mutations.ts +2 -9
- package/src/plugins/builtin/portfolio-list/pane/data.ts +5 -1
- package/src/plugins/builtin/portfolio-list/pane/index.tsx +52 -9
- package/src/plugins/builtin/portfolio-list/quick-add/index.tsx +33 -11
- package/src/plugins/builtin/portfolio-list/quick-add/resolution.ts +21 -1
- package/src/plugins/builtin/portfolio-list/settings.ts +17 -0
- package/src/plugins/builtin/portfolio-list/summary/index.tsx +12 -0
- package/src/plugins/builtin/portfolio-list/summary/totals.ts +9 -4
- package/src/plugins/builtin/portfolio-list/table.tsx +37 -7
- package/src/plugins/builtin/power/client.ts +16 -0
- package/src/plugins/builtin/power/evidence.ts +63 -10
- package/src/plugins/builtin/power/headless.ts +77 -9
- package/src/plugins/builtin/power/index.tsx +28 -3
- package/src/plugins/builtin/power/model.ts +73 -2
- package/src/plugins/builtin/power/pane.tsx +37 -9
- package/src/plugins/builtin/power/prices-client.ts +139 -0
- package/src/plugins/builtin/power/prices-headless.ts +137 -0
- package/src/plugins/builtin/power/prices-model.ts +103 -0
- package/src/plugins/builtin/power/prices.tsx +179 -0
- package/src/plugins/builtin/rate-path/headless.ts +46 -18
- package/src/plugins/builtin/realized-vol/headless.ts +5 -0
- package/src/plugins/builtin/relative-rotation/headless.ts +3 -3
- package/src/plugins/builtin/research/corporate-actions-pane.tsx +5 -2
- package/src/plugins/builtin/research/event-model.ts +68 -24
- package/src/plugins/builtin/research/events-headless.ts +2 -1
- package/src/plugins/builtin/research/headless.ts +2 -1
- package/src/plugins/builtin/research/index.tsx +2 -0
- package/src/plugins/builtin/research-search/article.ts +65 -0
- package/src/plugins/builtin/research-search/document-view.tsx +33 -215
- package/src/plugins/builtin/research-search/model.ts +0 -9
- package/src/plugins/builtin/research-search/pane.tsx +41 -30
- package/src/plugins/builtin/research-search/snippet.ts +0 -29
- package/src/plugins/builtin/revenue-breakdown/headless.ts +18 -6
- package/src/plugins/builtin/seasonality/client.ts +15 -7
- package/src/plugins/builtin/seasonality/headless.ts +36 -12
- package/src/plugins/builtin/seasonality/index.tsx +2 -2
- package/src/plugins/builtin/seasonality/model.ts +119 -0
- package/src/plugins/builtin/seasonality/pane.tsx +108 -37
- package/src/plugins/builtin/sec/headless.ts +25 -3
- package/src/plugins/builtin/sec/index.tsx +2 -1
- package/src/plugins/builtin/series-inventory.ts +93 -0
- package/src/plugins/builtin/shared/cloud-denied.ts +15 -0
- package/src/plugins/builtin/shared/cloud-upgrade.ts +1 -1
- package/src/plugins/builtin/shared/command-tab.ts +30 -12
- package/src/plugins/builtin/shared/earnings-report.ts +55 -0
- package/src/plugins/builtin/shared/fred-points.ts +20 -0
- package/src/plugins/builtin/shared/free-preview.ts +47 -0
- package/src/plugins/builtin/shared/fx-rate-freshness.ts +101 -0
- package/src/plugins/builtin/shared/open-description.ts +29 -0
- package/src/plugins/builtin/shared/report-freshness.ts +12 -1
- package/src/plugins/builtin/shared/series-warning.ts +5 -0
- package/src/plugins/builtin/shared/volatility/options.ts +4 -1
- package/src/plugins/builtin/short-interest/headless.ts +1 -0
- package/src/plugins/builtin/short-interest/index.tsx +2 -0
- package/src/plugins/builtin/short-interest/series.ts +36 -0
- package/src/plugins/builtin/short-interest/watch-headless.ts +3 -2
- package/src/plugins/builtin/short-interest/watch-model.ts +9 -5
- package/src/plugins/builtin/short-volume/headless.ts +2 -1
- package/src/plugins/builtin/short-volume/index.tsx +2 -0
- package/src/plugins/builtin/short-volume/series.ts +23 -0
- package/src/plugins/builtin/social-mentions/headless.ts +1 -1
- package/src/plugins/builtin/social-mentions/index.tsx +2 -0
- package/src/plugins/builtin/social-mentions/series.ts +23 -0
- package/src/plugins/builtin/supply-chain/graph-pane.tsx +3 -2
- package/src/plugins/builtin/supply-chain/headless.ts +43 -11
- package/src/plugins/builtin/supply-chain/model.ts +13 -0
- package/src/plugins/builtin/supply-chain/pane.tsx +8 -6
- package/src/plugins/builtin/themes/headless.ts +74 -10
- package/src/plugins/builtin/themes/model.ts +71 -4
- package/src/plugins/builtin/themes/pane.tsx +22 -5
- package/src/plugins/builtin/thirteenf/api.ts +1 -0
- package/src/plugins/builtin/thirteenf/data.ts +6 -4
- package/src/plugins/builtin/thirteenf/headless.ts +217 -36
- package/src/plugins/builtin/thirteenf/model.ts +39 -1
- package/src/plugins/builtin/thirteenf/overlap.ts +75 -0
- package/src/plugins/builtin/thirteenf/pane.tsx +10 -1
- package/src/plugins/builtin/thirteenf/report-notes.ts +103 -1
- package/src/plugins/builtin/thirteenf/types.ts +2 -0
- package/src/plugins/builtin/ticker-detail/data-panes/returns-history.ts +114 -0
- package/src/plugins/builtin/ticker-detail/data-panes/returns-model.ts +57 -2
- package/src/plugins/builtin/ticker-detail/data-panes/returns-pane.tsx +19 -55
- package/src/plugins/builtin/ticker-detail/headless-schema.ts +30 -0
- package/src/plugins/builtin/ticker-detail/headless.ts +86 -0
- package/src/plugins/builtin/ticker-detail/index.tsx +26 -11
- package/src/plugins/builtin/ticker-detail/overview/components.tsx +1 -1
- package/src/plugins/builtin/ticker-detail/overview/futures-contract.ts +31 -0
- package/src/plugins/builtin/ticker-detail/overview/model.ts +3 -3
- package/src/plugins/builtin/ticker-detail/overview/pane.tsx +2 -1
- package/src/plugins/builtin/ticker-detail/overview-tab.tsx +49 -5
- package/src/plugins/builtin/ticker-detail/quote-monitor/index.tsx +13 -3
- package/src/plugins/builtin/time-sales/headless.ts +2 -1
- package/src/plugins/builtin/time-sales/index.tsx +2 -1
- package/src/plugins/builtin/treasury-auctions/headless.ts +16 -2
- package/src/plugins/builtin/treasury-auctions/index.tsx +1 -0
- package/src/plugins/builtin/treasury-auctions/model.ts +8 -0
- package/src/plugins/builtin/vol-surface/evidence.ts +7 -1
- package/src/plugins/builtin/vol-surface/headless.ts +51 -17
- package/src/plugins/builtin/vol-surface/heat-grid.tsx +113 -0
- package/src/plugins/builtin/vol-surface/model.ts +39 -6
- package/src/plugins/builtin/vol-surface/pane.tsx +14 -13
- package/src/plugins/builtin/vol-surface/stored.ts +63 -3
- package/src/plugins/builtin/vol-surface/surface.tsx +30 -2
- package/src/plugins/builtin/volatility/index.tsx +2 -0
- package/src/plugins/builtin/volatility/series.ts +84 -0
- package/src/plugins/builtin/world-venue-map/basemap-layer.tsx +6 -5
- package/src/plugins/builtin/world-venue-map/basemap.ts +6 -3
- package/src/plugins/builtin/world-venue-map/geo-draw.tsx +2 -1
- package/src/plugins/builtin/world-venue-map/geo-series.ts +26 -1
- package/src/plugins/builtin/world-venue-map/geo-svg.tsx +6 -6
- package/src/plugins/builtin/world-venue-map/headless.ts +4 -1
- package/src/plugins/builtin/world-venue-map/index.ts +2 -1
- package/src/plugins/builtin/world-venue-map/layered-pane.tsx +24 -13
- package/src/plugins/builtin/world-venue-map/layers.ts +29 -0
- package/src/plugins/builtin/world-venue-map/map.tsx +144 -13
- package/src/plugins/builtin/world-venue-map/model.ts +56 -19
- package/src/plugins/builtin/world-venue-map/pane.tsx +5 -2
- package/src/plugins/builtin/yield-curve/chart.ts +2 -2
- package/src/plugins/builtin/yield-curve/curves.ts +21 -8
- package/src/plugins/builtin/yield-curve/headless.ts +71 -18
- package/src/plugins/builtin/yield-curve/index.tsx +4 -2
- package/src/plugins/builtin/yield-curve/series.ts +86 -0
- package/src/plugins/catalog-browser.ts +2 -1
- package/src/plugins/installer.ts +2 -2
- package/src/plugins/loader.ts +15 -0
- package/src/plugins/manager-node.ts +1 -1
- package/src/plugins/{builtin/plugin-marketplace → marketplace}/feed.ts +2 -2
- package/src/plugins/{builtin/plugin-marketplace → marketplace}/model.ts +6 -6
- package/src/plugins/{builtin/plugin-marketplace → marketplace}/store.ts +1 -1
- package/src/plugins/registry/host-actions.ts +11 -0
- package/src/plugins/registry/index.ts +89 -4
- package/src/portfolio/collection-name.ts +31 -0
- package/src/{plugins/builtin/portfolio-list → portfolio}/position-metrics.ts +6 -6
- package/src/portfolio/position-value.ts +40 -0
- package/src/portfolio/valuation-basis.ts +79 -0
- package/src/public/__snapshots__/public-api.test.ts.snap +7 -0
- package/src/public/time-series.ts +17 -0
- package/src/react/auto-refresh.ts +13 -3
- package/src/react/input.ts +33 -1
- package/src/react/key-repeat.ts +86 -0
- package/src/remote/app-host.tsx +20 -4
- package/src/remote/confirm-change.tsx +85 -0
- package/src/remote/controller-utils.ts +8 -1
- package/src/remote/controller.ts +144 -7
- package/src/remote/pane-screenshot.ts +47 -0
- package/src/remote/schema.ts +65 -2
- package/src/remote/types.ts +30 -0
- package/src/remote/watchlist.ts +306 -0
- package/src/renderers/browser/main.tsx +4 -3
- package/src/renderers/browser/research-entry.ts +4 -2
- package/src/renderers/cloudflare/worker.ts +1 -1
- package/src/renderers/dom/data-table/frozen-column.ts +3 -1
- package/src/renderers/dom/data-table/index.tsx +33 -6
- package/src/renderers/dom/data-table/row.tsx +30 -1
- package/src/renderers/dom/desktop/control-styles.ts +63 -1
- package/src/renderers/dom/desktop/controls.tsx +30 -23
- package/src/renderers/dom/desktop/dialog-actions.tsx +170 -0
- package/src/renderers/dom/desktop/icons.tsx +16 -0
- package/src/renderers/dom/dom-ui-host.tsx +3 -0
- package/src/renderers/dom/host/block-glyph-canvas.tsx +6 -3
- package/src/renderers/dom/host/box.tsx +8 -0
- package/src/renderers/dom/host/chart-surface.tsx +33 -2
- package/src/renderers/dom/host/live-frame.ts +6 -2
- package/src/renderers/dom/host/overflow-fade.ts +14 -1
- package/src/renderers/dom/host/scroll-box.tsx +32 -0
- package/src/renderers/dom/host/size-observer.ts +41 -0
- package/src/renderers/dom/host/sticky-scroll.ts +128 -0
- package/src/renderers/dom/host/style.ts +1 -1
- package/src/renderers/dom/host/surface-3d.tsx +19 -7
- package/src/renderers/dom/host/surface-fit.ts +406 -0
- package/src/renderers/dom/host/text.tsx +1 -1
- package/src/renderers/dom/input-host.tsx +1 -0
- package/src/renderers/dom/styles.css +102 -5
- package/src/renderers/electrobun/bun/application-menu/click.ts +18 -0
- package/src/renderers/electrobun/bun/index.ts +3 -2
- package/src/renderers/electrobun/shared/protocol.ts +1 -1
- package/src/renderers/electrobun/view/cli-pane-shot-entry.tsx +29 -2
- package/src/renderers/electrobun/view/cli-pane-shot-frame.tsx +63 -20
- package/src/renderers/electrobun/view/cli-pane-shot-health.ts +10 -26
- package/src/renderers/electrobun/view/main.tsx +5 -3
- package/src/renderers/electrobun/view/remote/asset-data-client.ts +2 -0
- package/src/renderers/opentui/chart-surface.tsx +1 -0
- package/src/renderers/opentui/frame-capture.ts +33 -0
- package/src/renderers/opentui/host.tsx +10 -13
- package/src/renderers/opentui/pane-image/glyphs-license.txt +107 -0
- package/src/renderers/opentui/pane-image/glyphs.json +1 -0
- package/src/renderers/opentui/pane-image/index.ts +107 -0
- package/src/renderers/opentui/pane-image/raster.ts +428 -0
- package/src/renderers/opentui/start.tsx +3 -3
- package/src/renderers/opentui/test-utils.tsx +3 -0
- package/src/renderers/opentui/ui-host.tsx +29 -1
- package/src/series/capability.ts +75 -0
- package/src/series/csv.ts +160 -0
- package/src/series/files.ts +107 -0
- package/src/series/registry.ts +198 -0
- package/src/series/resolve.ts +108 -0
- package/src/series/standalone.ts +48 -0
- package/src/series/types.ts +153 -0
- package/src/series/validate.ts +171 -0
- package/src/shares/chat.ts +34 -0
- package/src/shares/dialog.tsx +295 -0
- package/src/shares/flow.tsx +56 -0
- package/src/shares/live.ts +14 -22
- package/src/shares/pane-image.ts +152 -0
- package/src/shares/personal-pane.ts +64 -0
- package/src/shares/portable-layout.ts +4 -2
- package/src/shares/prepare.ts +20 -0
- package/src/sources/gloomberb-cloud/index.ts +109 -10
- package/src/sources/gloomberb-cloud/normalizers.ts +3 -0
- package/src/sources/gloomberb-cloud/perpetuals.ts +249 -0
- package/src/sources/history-result.ts +1 -0
- package/src/sources/history-retention.ts +11 -0
- package/src/sources/listing-symbols.ts +4 -1
- package/src/sources/listing-target.ts +4 -0
- package/src/sources/provider-router/batches.ts +4 -1
- package/src/sources/provider-router/cache.ts +4 -2
- package/src/sources/provider-router/cached-routes.ts +1 -1
- package/src/sources/provider-router/financial-routes.ts +1 -0
- package/src/sources/provider-router/financials.ts +13 -0
- package/src/sources/provider-router/history.ts +43 -25
- package/src/sources/provider-router/index.ts +14 -0
- package/src/sources/provider-router/search.ts +1 -0
- package/src/state/hooks/inline-tickers.ts +49 -11
- package/src/sync/core-contributors.ts +1 -0
- package/src/test-support/shell-pane-keys.tsx +1 -0
- package/src/theme/theme-context.tsx +15 -1
- package/src/tickers/company-name.ts +75 -0
- package/src/tickers/instrument-kind.ts +34 -1
- package/src/tickers/listing-name.ts +34 -0
- package/src/tickers/listing-venues.ts +132 -0
- package/src/tickers/open-target.ts +13 -4
- package/src/tickers/perpetual-listing.ts +151 -0
- package/src/tickers/prediction-listing.ts +26 -0
- package/src/tickers/search/index.ts +72 -11
- package/src/tickers/search/ranking.ts +98 -20
- package/src/tickers/search/types.ts +7 -1
- package/src/tickers/ticker-changes.ts +213 -0
- package/src/tickers/us-listing.ts +34 -0
- package/src/time-series/economic.ts +2 -6
- package/src/time-series/hooks.ts +9 -0
- package/src/time-series/ice-credit.ts +39 -0
- package/src/time-series/resolve.ts +211 -29
- package/src/time-series/studies.ts +1 -0
- package/src/time-series/types.ts +12 -2
- package/src/time-series/use-chart-resolution.ts +32 -0
- package/src/types/config.ts +10 -2
- package/src/types/data-provider.ts +11 -0
- package/src/types/financials.ts +62 -1
- package/src/types/headless.ts +113 -0
- package/src/types/instrument.ts +4 -0
- package/src/types/plugin.ts +52 -2
- package/src/types/price-history.ts +7 -0
- package/src/types/ticker-changes.ts +26 -0
- package/src/types/ticker.ts +14 -0
- package/src/ui/context-menu.tsx +13 -1
- package/src/ui/host.tsx +57 -3
- package/src/ui/live-resize.ts +91 -0
- package/src/ui/live-stretch.ts +153 -0
- package/src/ui/measured-cells.ts +58 -0
- package/src/ui/sticky-scroll.ts +7 -0
- package/src/utils/basis-points.ts +17 -0
- package/src/utils/central-banks.ts +76 -0
- package/src/utils/cli-output.ts +131 -15
- package/src/utils/concurrency.ts +25 -0
- package/src/utils/crypto-pair.ts +20 -0
- package/src/utils/currency-pair.ts +19 -0
- package/src/utils/currency-units.ts +11 -0
- package/src/utils/datetime-format.ts +27 -6
- package/src/utils/decimal-comma.ts +19 -0
- package/src/utils/dom-screenshot-css.ts +265 -0
- package/src/utils/dom-screenshot-rasters.ts +276 -0
- package/src/utils/dom-screenshot.ts +439 -52
- package/src/utils/double-escape-close.ts +15 -1
- package/src/utils/exchange-rate-snapshot.ts +6 -2
- package/src/utils/exchanges.ts +143 -1
- package/src/utils/format.ts +35 -5
- package/src/utils/forward-dividend.ts +14 -0
- package/src/utils/fundamentals.ts +66 -0
- package/src/utils/futures-generic.ts +6 -12
- package/src/utils/fx-market-hours.ts +15 -5
- package/src/utils/fx-status.ts +6 -1
- package/src/utils/inline-content-tokenizer.ts +22 -3
- package/src/utils/market-capitalization.ts +8 -0
- package/src/utils/one-shot.ts +73 -0
- package/src/utils/options.ts +37 -8
- package/src/utils/price-history.ts +99 -42
- package/src/utils/sec-eps-basis.ts +24 -11
- package/src/utils/sec.ts +61 -7
- package/src/utils/utc-time.ts +63 -4
- package/src/plugins/builtin/fx-matrix/freshness.ts +0 -65
- /package/src/plugins/{builtin/plugin-marketplace → marketplace}/activation.ts +0 -0
- /package/src/plugins/{builtin/plugin-marketplace → marketplace}/ids.ts +0 -0
- /package/src/plugins/{builtin/plugin-marketplace → marketplace}/packs.ts +0 -0
- /package/src/{plugins/builtin/cloud → tickers}/starter-symbols.ts +0 -0
|
@@ -2,16 +2,15 @@
|
|
|
2
2
|
"src/api-client/askg.ts": ["cloud"],
|
|
3
3
|
"src/app.tsx": ["cloud"],
|
|
4
4
|
"src/app/global-shortcuts.ts": ["help"],
|
|
5
|
-
"src/app/pane-runtime/plugin-bindings.ts": ["broker-manager","layout-manager"
|
|
5
|
+
"src/app/pane-runtime/plugin-bindings.ts": ["broker-manager","layout-manager"],
|
|
6
6
|
"src/app/runtime/broker-import.ts": ["portfolio-list"],
|
|
7
7
|
"src/app/runtime/desktop-deeplink.ts": ["account-management","chat","cloud"],
|
|
8
|
-
"src/app/runtime/startup.ts": ["chat"
|
|
9
|
-
"src/
|
|
10
|
-
"src/cli/commands/market.ts": ["holders","research","sec"],
|
|
8
|
+
"src/app/runtime/startup.ts": ["chat"],
|
|
9
|
+
"src/cli/commands/market.ts": ["holders","insider","research","sec"],
|
|
11
10
|
"src/cli/commands/options-chain.ts": ["options","options-calculator"],
|
|
12
11
|
"src/cli/commands/options-leaps.ts": ["options","vol-surface"],
|
|
13
12
|
"src/cli/commands/overview.ts": ["correlation","econ","market-movers","sectors","world-indices"],
|
|
14
|
-
"src/cli/commands/ticker.ts": ["notes"
|
|
13
|
+
"src/cli/commands/ticker.ts": ["notes"],
|
|
15
14
|
"src/cli/desktop-pane-shot.ts": ["market-valuation","time-sales"],
|
|
16
15
|
"src/cli/pane-functions/data.ts": ["chart-composer","correlation","seasonality","ticker-detail"],
|
|
17
16
|
"src/cli/pane-functions/financial-ratio-shot.ts": ["ticker-detail"],
|
|
@@ -24,7 +23,6 @@
|
|
|
24
23
|
"src/components/command-bar/commands/direct/index.ts": ["broker-manager","portfolio-list"],
|
|
25
24
|
"src/components/command-bar/routes/root/command-items.ts": ["portfolio-list"],
|
|
26
25
|
"src/components/command-bar/routes/root/help-items.ts": ["help"],
|
|
27
|
-
"src/components/command-bar/routes/root/plugin-install.ts": ["plugin-marketplace"],
|
|
28
26
|
"src/components/command-bar/routes/root/shortcut-items.ts": ["portfolio-list"],
|
|
29
27
|
"src/components/command-bar/workflow/builtin.ts": ["cloud","portfolio-list"],
|
|
30
28
|
"src/components/command-bar/workflow/collection-actions.ts": ["cloud","portfolio-list"],
|
|
@@ -33,38 +31,22 @@
|
|
|
33
31
|
"src/components/feedback-dialog.tsx": ["cloud"],
|
|
34
32
|
"src/components/form-modal/routes.ts": ["portfolio-list"],
|
|
35
33
|
"src/components/index.ts": ["portfolio-list"],
|
|
36
|
-
"src/components/layout/missing-pane.tsx": ["plugin-marketplace"],
|
|
37
34
|
"src/components/layout/shell/index.tsx": ["cloud"],
|
|
38
35
|
"src/components/layout/status-bar-groups.ts": ["cloud"],
|
|
39
36
|
"src/components/layout/status-bar.tsx": ["cloud"],
|
|
40
|
-
"src/components/onboarding/
|
|
41
|
-
"src/components/onboarding/account-step/index.tsx": ["cloud"],
|
|
42
|
-
"src/components/onboarding/account-step/qr-panel.tsx": ["cloud"],
|
|
43
|
-
"src/components/onboarding/account-step/signed-in-panel.tsx": ["cloud"],
|
|
44
|
-
"src/components/onboarding/onboarding-keyboard.ts": ["account-management"],
|
|
45
|
-
"src/components/onboarding/onboarding-wizard.tsx": ["account-management","cloud"],
|
|
46
|
-
"src/components/onboarding/use-onboarding-upgrade.ts": ["account-management","chat","cloud"],
|
|
47
|
-
"src/components/onboarding/wizard-account.ts": ["cloud"],
|
|
37
|
+
"src/components/onboarding/use-onboarding-upgrade.ts": ["chat"],
|
|
48
38
|
"src/components/onboarding/wizard-model.ts": ["portfolio-list"],
|
|
49
39
|
"src/components/onboarding/wizard-positions.ts": ["portfolio-list"],
|
|
50
|
-
"src/
|
|
51
|
-
"src/layout-marketplace/gallery.tsx": ["cloud","plugin-marketplace"],
|
|
40
|
+
"src/layout-marketplace/gallery.tsx": ["cloud"],
|
|
52
41
|
"src/layout-marketplace/linked-sync.ts": ["cloud"],
|
|
53
42
|
"src/layout/desks.ts": ["chart-composer"],
|
|
54
|
-
"src/plugins/
|
|
55
|
-
"src/plugins/auto-update.ts": ["plugin-marketplace"],
|
|
56
|
-
"src/plugins/catalog-browser.ts": ["alerts","analytics","attention","awards","backtest","bond-calculator","catalysts","cds","central-bank-rates","changelog","chart-composer","clinical-trials","cloud","comment-letters","company-attention","company-kpis","connections","correlation","cot","cpi","credit-boards","credit-conditions","credit-documents","crypto-board","debt-maturities","dividend-yield","doe","earnings-calls","earnings-ripple","econ","econ-statistics","equity-screener","estimate-revisions","executives","exposure","fear-greed","filing-events","futures","futures-curve","fx-matrix","gpu","help","insider","ipo-calendar","iv-history","jobs","kelly-sizer","layout-manager","macro-day","market-halts","market-heatmap","market-valuation","members","mna","money-markets","news","openfda","options","options-calculator","options-positioning","options-scenario","pe-band","perps","portfolio-list","power","rate-path","realized-vol","relative-rotation","research","research-search","revenue-breakdown","reverse-dcf","risk-factors","scanner","seasonality","sec","sectors","short-interest","short-volume","social-mentions","supply-chain","ticker-detail","time-sales","treasury-auctions","vol-surface","volatility","world-indices","world-venue-map","yield-curve"],
|
|
43
|
+
"src/plugins/catalog-browser.ts": ["alerts","analytics","attention","awards","backtest","bond-calculator","catalysts","cds","central-bank-rates","changelog","chart-composer","clinical-trials","cloud","comment-letters","company-attention","company-kpis","connections","correlation","cot","cpi","credit-boards","credit-conditions","credit-documents","crypto-board","debt-maturities","dividend-yield","docs","doe","earnings-calls","earnings-ripple","econ","econ-statistics","equity-screener","estimate-revisions","executives","exposure","fear-greed","filing-events","futures","futures-curve","fx-matrix","gpu","help","insider","ipo-calendar","iv-history","jobs","kelly-sizer","layout-manager","macro-day","market-halts","market-heatmap","market-valuation","members","mna","money-markets","news","openfda","options","options-calculator","options-positioning","options-scenario","pe-band","perps","portfolio-list","power","rate-path","realized-vol","relative-rotation","research","research-search","revenue-breakdown","reverse-dcf","risk-factors","scanner","seasonality","sec","sectors","short-interest","short-volume","social-mentions","supply-chain","ticker-detail","time-sales","treasury-auctions","vol-surface","volatility","world-indices","world-venue-map","yield-curve"],
|
|
57
44
|
"src/plugins/catalog-ui.ts": ["alerts","clinical-trials","cloud","comment-letters","custom-view","fear-greed","ipo-calendar","market-halts","market-heatmap","members","news","notes","openfda","research-search"],
|
|
58
45
|
"src/plugins/catalog.ts": ["debug"],
|
|
59
|
-
"src/plugins/installer.ts": ["plugin-marketplace"],
|
|
60
|
-
"src/plugins/manager-node.ts": ["plugin-marketplace"],
|
|
61
46
|
"src/remote/controller.ts": ["custom-view"],
|
|
62
|
-
"src/renderers/browser/main.tsx": ["plugin-marketplace"],
|
|
63
47
|
"src/renderers/electrobun/bun/core-capabilities.ts": ["notes"],
|
|
64
|
-
"src/renderers/electrobun/shared/protocol.ts": ["plugin-marketplace"],
|
|
65
48
|
"src/renderers/electrobun/view/cli-pane-shot-entry.tsx": ["econ-statistics","market-valuation","time-sales"],
|
|
66
|
-
"src/renderers/electrobun/view/main.tsx": ["notes"
|
|
49
|
+
"src/renderers/electrobun/view/main.tsx": ["notes"],
|
|
67
50
|
"src/renderers/electrobun/view/remote/connection-health.ts": ["connections"],
|
|
68
|
-
"src/renderers/opentui/start.tsx": ["plugin-marketplace"],
|
|
69
51
|
"src/sync/core-contributors.ts": ["analytics","portfolio-list"]
|
|
70
52
|
}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import type { PluginRegistry } from "../plugins/registry";
|
|
2
|
+
import { paneShowsPersonalData } from "../shares/personal-pane";
|
|
3
|
+
import type { AppConfig, PaneInstanceConfig } from "../types/config";
|
|
4
|
+
import type { PaneSharePrivateFields } from "../types/plugin";
|
|
5
|
+
import type { TickerRecord } from "../types/ticker";
|
|
6
|
+
import type { AskGloomPaneAttachment } from "./pane-request";
|
|
7
|
+
|
|
8
|
+
/** A handful of the pane's own settings is enough to say how it is set up. */
|
|
9
|
+
const MAX_ARGS = 8;
|
|
10
|
+
const MAX_ARG_KEY_LENGTH = 32;
|
|
11
|
+
const MAX_ARG_VALUE_LENGTH = 48;
|
|
12
|
+
/** Layout and view bookkeeping, not what the pane shows. */
|
|
13
|
+
const BOOKKEEPING_KEYS = [
|
|
14
|
+
/scroll|width|height|offset|index|expanded|collapsed|focus|hover|sidebar|column|sort|order|version|draft/i,
|
|
15
|
+
// The cursor's position, but not the symbol it is on.
|
|
16
|
+
/^cursor(?!Symbol)/,
|
|
17
|
+
// Timestamps such as `updatedAt`.
|
|
18
|
+
/[a-z]At$/,
|
|
19
|
+
];
|
|
20
|
+
|
|
21
|
+
type ArgSource = Readonly<Record<string, unknown>> | undefined;
|
|
22
|
+
|
|
23
|
+
function isPrivate(fields: PaneSharePrivateFields | undefined, key: string): boolean {
|
|
24
|
+
return fields === true || (Array.isArray(fields) && fields.includes(key));
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function scalarArgs(source: ArgSource, privateFields: PaneSharePrivateFields | undefined): Array<[string, string]> {
|
|
28
|
+
if (!source || privateFields === true) return [];
|
|
29
|
+
return Object.entries(source).flatMap(([key, value]): Array<[string, string]> => {
|
|
30
|
+
if (key.length > MAX_ARG_KEY_LENGTH || BOOKKEEPING_KEYS.some((pattern) => pattern.test(key)) || isPrivate(privateFields, key)) return [];
|
|
31
|
+
if (typeof value === "number" && Number.isFinite(value)) return [[key, String(value)]];
|
|
32
|
+
if (typeof value !== "string") return [];
|
|
33
|
+
const trimmed = value.trim();
|
|
34
|
+
return trimmed && trimmed.length <= MAX_ARG_VALUE_LENGTH ? [[key, trimmed]] : [];
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* The function code a pane is opened by: the one its title starts with when
|
|
40
|
+
* that opens this pane (a chart opened with `GP` stays `GP`), else the first
|
|
41
|
+
* template that opens it.
|
|
42
|
+
*/
|
|
43
|
+
function functionCode(registry: Pick<PluginRegistry, "paneTemplates">, paneType: string, title: string): string | null {
|
|
44
|
+
const prefixes = [...registry.paneTemplates.values()]
|
|
45
|
+
.filter((template) => template.paneId === paneType && template.shortcut?.prefix)
|
|
46
|
+
.map((template) => template.shortcut!.prefix.toUpperCase());
|
|
47
|
+
const token = title.trim().split(/\s+/)[0]?.toUpperCase() ?? "";
|
|
48
|
+
if (token && prefixes.includes(token)) return token;
|
|
49
|
+
return prefixes[0] ?? null;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export interface PaneAttachmentSource {
|
|
53
|
+
registry: Pick<PluginRegistry, "panes" | "paneTemplates" | "brokers" | "getPanePluginId" | "getBrokerPluginId">;
|
|
54
|
+
instance: PaneInstanceConfig;
|
|
55
|
+
/** What the header calls it. */
|
|
56
|
+
title: string;
|
|
57
|
+
symbol: string | null;
|
|
58
|
+
paneState?: Readonly<Record<string, unknown>>;
|
|
59
|
+
config: Pick<AppConfig, "portfolios" | "brokerInstances">;
|
|
60
|
+
tickers?: ReadonlyMap<string, TickerRecord>;
|
|
61
|
+
/** The tab each of its tab strips has open, outermost first. */
|
|
62
|
+
activeTabs?: readonly string[];
|
|
63
|
+
visibleText: string | null;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* What Ask Gloom is told about a pane: its function and arguments as the
|
|
68
|
+
* user set them, and its text as drawn. Fields the pane keeps to itself when
|
|
69
|
+
* shared (`portableShare.private`) stay out of its arguments.
|
|
70
|
+
*/
|
|
71
|
+
export function buildAskGloomPaneAttachment({
|
|
72
|
+
registry,
|
|
73
|
+
instance,
|
|
74
|
+
title,
|
|
75
|
+
symbol,
|
|
76
|
+
paneState,
|
|
77
|
+
config,
|
|
78
|
+
tickers,
|
|
79
|
+
activeTabs = [],
|
|
80
|
+
visibleText,
|
|
81
|
+
}: PaneAttachmentSource): AskGloomPaneAttachment {
|
|
82
|
+
const privateFields = registry.panes.get(instance.paneId)?.portableShare?.private;
|
|
83
|
+
const args: Record<string, string> = {};
|
|
84
|
+
const tabs = activeTabs.map((tab) => tab.trim()).filter(Boolean);
|
|
85
|
+
if (tabs.length > 0) args.tab = tabs.join(" > ").slice(0, MAX_ARG_VALUE_LENGTH);
|
|
86
|
+
for (const [key, value] of [
|
|
87
|
+
...scalarArgs(instance.params, privateFields?.params),
|
|
88
|
+
...scalarArgs(instance.settings, privateFields?.settings),
|
|
89
|
+
...scalarArgs(paneState, privateFields?.state),
|
|
90
|
+
]) {
|
|
91
|
+
if (Object.keys(args).length >= MAX_ARGS) break;
|
|
92
|
+
if (key in args || value === symbol) continue;
|
|
93
|
+
args[key] = value;
|
|
94
|
+
}
|
|
95
|
+
return {
|
|
96
|
+
paneId: instance.instanceId,
|
|
97
|
+
paneType: instance.paneId,
|
|
98
|
+
title,
|
|
99
|
+
code: functionCode(registry, instance.paneId, title),
|
|
100
|
+
symbol,
|
|
101
|
+
args,
|
|
102
|
+
visibleText,
|
|
103
|
+
personal: showsPersonalData({ registry, instance, paneState, symbol, config, tickers }),
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/** A pane that cannot be read for it counts as personal: its contents then wait for a yes. */
|
|
108
|
+
function showsPersonalData(source: Parameters<typeof paneShowsPersonalData>[0]): boolean {
|
|
109
|
+
try {
|
|
110
|
+
return paneShowsPersonalData(source);
|
|
111
|
+
} catch {
|
|
112
|
+
return true;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Asking Ask Gloom about a pane. Every pane offers it the same way, with no
|
|
3
|
+
* code of its own: the button beside the `?` in a desktop pane header, Ask
|
|
4
|
+
* Gloom in the pane menu, and the pane-ask key. The shell describes the pane
|
|
5
|
+
* here, and Ask Gloom, while its plugin is on, opens a new conversation with
|
|
6
|
+
* the pane attached.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
/** A pane as Ask Gloom receives it: what it is and what it showed when asked. */
|
|
10
|
+
export interface AskGloomPaneAttachment {
|
|
11
|
+
/** The pane instance. */
|
|
12
|
+
paneId: string;
|
|
13
|
+
/** Its pane type. */
|
|
14
|
+
paneType: string;
|
|
15
|
+
/** What its header calls it, such as `DES AAPL`. */
|
|
16
|
+
title: string;
|
|
17
|
+
/** The function code that opens it, such as `DES`, when one does. */
|
|
18
|
+
code: string | null;
|
|
19
|
+
/** The ticker it shows, when it shows one. */
|
|
20
|
+
symbol: string | null;
|
|
21
|
+
/** How it is set up as the user sees it: its tab, range or view. Short values only. */
|
|
22
|
+
args: Readonly<Record<string, string>>;
|
|
23
|
+
/** Its text as drawn when asked, bounded; null when none could be read. */
|
|
24
|
+
visibleText: string | null;
|
|
25
|
+
/**
|
|
26
|
+
* It shows holdings, balances or account data, so Ask Gloom asks before
|
|
27
|
+
* anything it shows leaves the device.
|
|
28
|
+
*/
|
|
29
|
+
personal: boolean;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
type AskGloomPaneHandler = (attachment: AskGloomPaneAttachment) => void;
|
|
33
|
+
|
|
34
|
+
const handlers = new Set<AskGloomPaneHandler>();
|
|
35
|
+
const listeners = new Set<() => void>();
|
|
36
|
+
|
|
37
|
+
function changed(): void {
|
|
38
|
+
for (const listener of [...listeners]) listener();
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Ask Gloom takes pane questions while it is registered. The shell offers the
|
|
43
|
+
* button, the menu entry and the key only then, so a profile with the cloud
|
|
44
|
+
* plugin off shows none of them.
|
|
45
|
+
*/
|
|
46
|
+
export function registerAskGloomPaneHandler(handler: AskGloomPaneHandler): () => void {
|
|
47
|
+
handlers.add(handler);
|
|
48
|
+
changed();
|
|
49
|
+
return () => {
|
|
50
|
+
if (handlers.delete(handler)) changed();
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export function canAskGloomAboutPanes(): boolean {
|
|
55
|
+
return handlers.size > 0;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export function subscribeAskGloomAboutPanes(listener: () => void): () => void {
|
|
59
|
+
listeners.add(listener);
|
|
60
|
+
return () => {
|
|
61
|
+
listeners.delete(listener);
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/** Hands the pane to Ask Gloom. False when nothing takes it. */
|
|
66
|
+
export function askGloomAboutPane(attachment: AskGloomPaneAttachment): boolean {
|
|
67
|
+
if (handlers.size === 0) return false;
|
|
68
|
+
for (const handler of [...handlers]) handler(attachment);
|
|
69
|
+
return true;
|
|
70
|
+
}
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
import type { NativeFrameCapture } from "../ui/host";
|
|
2
|
+
import { displayWidth } from "../utils/format";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* At most this much of a pane's text goes with a question: a summary of what
|
|
6
|
+
* it shows, not a dump. It leaves room in the terminal context Gloom reads,
|
|
7
|
+
* which keeps 2,000 characters of it.
|
|
8
|
+
*/
|
|
9
|
+
export const PANE_TEXT_MAX_CHARS = 1_500;
|
|
10
|
+
const PANE_TEXT_MAX_LINES = 50;
|
|
11
|
+
|
|
12
|
+
export interface CellRect {
|
|
13
|
+
x: number;
|
|
14
|
+
y: number;
|
|
15
|
+
width: number;
|
|
16
|
+
height: number;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/** The frame's sides and rules: lines of them say nothing, and an edge cell is not content. */
|
|
20
|
+
const RULE_LINE = /^[\s│┃║┆┊╎─━═┄┈╌┌┐└┘├┤┬┴┼╭╮╯╰▏▕█▐▌░▒▓]*$/u;
|
|
21
|
+
const LEADING_EDGE = /^[│┃║▏▕]\s?/u;
|
|
22
|
+
const TRAILING_EDGE = /\s?[│┃║▏▕█▐▌░▒▓]+$/u;
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* A pane's text, trimmed to what it says: no frame edges, rules or trailing
|
|
26
|
+
* blanks, runs of padding cut to two spaces so columns stay apart, blank
|
|
27
|
+
* lines folded, and the whole bounded. Null when nothing is left.
|
|
28
|
+
*/
|
|
29
|
+
export function normalizePaneText(raw: string): string | null {
|
|
30
|
+
const lines: string[] = [];
|
|
31
|
+
let blank = false;
|
|
32
|
+
for (const rawLine of raw.split(/\r?\n/)) {
|
|
33
|
+
if (RULE_LINE.test(rawLine)) {
|
|
34
|
+
blank = lines.length > 0;
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
const line = rawLine
|
|
38
|
+
.replace(LEADING_EDGE, "")
|
|
39
|
+
.replace(TRAILING_EDGE, "")
|
|
40
|
+
.replace(/\s+$/u, "")
|
|
41
|
+
.replace(/\s{3,}/gu, " ");
|
|
42
|
+
if (!line.trim()) {
|
|
43
|
+
blank = lines.length > 0;
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
if (blank) lines.push("");
|
|
47
|
+
blank = false;
|
|
48
|
+
lines.push(line);
|
|
49
|
+
}
|
|
50
|
+
if (lines.length === 0) return null;
|
|
51
|
+
|
|
52
|
+
const kept: string[] = [];
|
|
53
|
+
let used = 0;
|
|
54
|
+
for (const line of lines.slice(0, PANE_TEXT_MAX_LINES)) {
|
|
55
|
+
if (used + line.length + 1 > PANE_TEXT_MAX_CHARS) break;
|
|
56
|
+
kept.push(line);
|
|
57
|
+
used += line.length + 1;
|
|
58
|
+
}
|
|
59
|
+
if (kept.length === 0) kept.push(lines[0]!.slice(0, PANE_TEXT_MAX_CHARS - 1));
|
|
60
|
+
const cut = kept.length < lines.length || kept[0] !== lines[0];
|
|
61
|
+
return cut ? `${kept.join("\n")}\n…` : kept.join("\n");
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function covers(rect: CellRect, x: number, y: number): boolean {
|
|
65
|
+
return x >= rect.x && x < rect.x + rect.width && y >= rect.y && y < rect.y + rect.height;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* A terminal pane's text from the frame on screen: the rows under its header,
|
|
70
|
+
* the columns it spans. Cells another surface covers (a floating pane above
|
|
71
|
+
* it, the menu it was asked from) are left blank, so only this pane's own
|
|
72
|
+
* text goes. `rect` and `covered` are in the pane area's cells, which starts
|
|
73
|
+
* `offsetX` columns and `offsetY` rows into the screen (under the app header).
|
|
74
|
+
*/
|
|
75
|
+
export function terminalPaneText(
|
|
76
|
+
frame: NativeFrameCapture,
|
|
77
|
+
rect: CellRect,
|
|
78
|
+
{ offsetX = 0, offsetY = 0, covered = [] }: { offsetX?: number; offsetY?: number; covered?: readonly CellRect[] } = {},
|
|
79
|
+
): string | null {
|
|
80
|
+
const rows: string[] = [];
|
|
81
|
+
const left = Math.max(0, Math.floor(rect.x + offsetX));
|
|
82
|
+
const right = Math.floor(rect.x + offsetX + rect.width);
|
|
83
|
+
const top = Math.floor(rect.y) + 1;
|
|
84
|
+
const bottom = Math.floor(rect.y + rect.height);
|
|
85
|
+
for (let row = top; row < bottom; row += 1) {
|
|
86
|
+
const spans = frame.lines[row + offsetY];
|
|
87
|
+
if (!spans) continue;
|
|
88
|
+
let column = 0;
|
|
89
|
+
let text = "";
|
|
90
|
+
for (const span of spans) {
|
|
91
|
+
// One code point per cell; a wide one is followed by an empty continuation cell.
|
|
92
|
+
for (const char of span.text) {
|
|
93
|
+
const start = column;
|
|
94
|
+
const width = displayWidth(char) >= 2 ? 2 : 1;
|
|
95
|
+
column += width;
|
|
96
|
+
if (start < left || start >= right) continue;
|
|
97
|
+
text += covered.some((other) => covers(other, start - offsetX, row)) ? " ".repeat(width) : char;
|
|
98
|
+
}
|
|
99
|
+
if (column >= right) break;
|
|
100
|
+
}
|
|
101
|
+
rows.push(text);
|
|
102
|
+
}
|
|
103
|
+
return normalizePaneText(rows.join("\n"));
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
function attributeValue(value: string): string {
|
|
107
|
+
return value.replace(/\\/g, "\\\\").replace(/"/g, "\\\"");
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
interface PixelRect {
|
|
111
|
+
left: number;
|
|
112
|
+
top: number;
|
|
113
|
+
right: number;
|
|
114
|
+
bottom: number;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
function intersect(a: PixelRect, b: PixelRect): PixelRect | null {
|
|
118
|
+
const rect = {
|
|
119
|
+
left: Math.max(a.left, b.left),
|
|
120
|
+
top: Math.max(a.top, b.top),
|
|
121
|
+
right: Math.min(a.right, b.right),
|
|
122
|
+
bottom: Math.min(a.bottom, b.bottom),
|
|
123
|
+
};
|
|
124
|
+
return rect.right > rect.left && rect.bottom > rect.top ? rect : null;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Where an element's content can be seen: the pane body cut down by every box
|
|
129
|
+
* between them that clips (a scrolled list, a table body), or null when one
|
|
130
|
+
* of them hides it.
|
|
131
|
+
*/
|
|
132
|
+
function visibleArea(element: Element, body: HTMLElement, cache: Map<Element, PixelRect | null>): PixelRect | null {
|
|
133
|
+
const cached = cache.get(element);
|
|
134
|
+
if (cached !== undefined) return cached;
|
|
135
|
+
let area: PixelRect | null;
|
|
136
|
+
if (element === body) {
|
|
137
|
+
area = body.getBoundingClientRect();
|
|
138
|
+
} else {
|
|
139
|
+
const parent = element.parentElement;
|
|
140
|
+
area = parent ? visibleArea(parent, body, cache) : null;
|
|
141
|
+
const view = element.ownerDocument.defaultView;
|
|
142
|
+
const style = view?.getComputedStyle(element);
|
|
143
|
+
if (area && style) {
|
|
144
|
+
if (style.visibility === "hidden" || style.display === "none" || style.opacity === "0") area = null;
|
|
145
|
+
else if (style.overflowX !== "visible" || style.overflowY !== "visible") area = intersect(area, element.getBoundingClientRect());
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
cache.set(element, area);
|
|
149
|
+
return area;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* A desktop or web pane's text as it is on screen: its body, without the
|
|
154
|
+
* header or footer, and only what can be seen, so rows scrolled out of a list
|
|
155
|
+
* and anything clipped stay out. Text on one line is joined in reading order.
|
|
156
|
+
*/
|
|
157
|
+
export function domPaneText(paneId: string): string | null {
|
|
158
|
+
const doc = (globalThis as { document?: Document }).document;
|
|
159
|
+
if (!doc) return null;
|
|
160
|
+
const pane = doc.querySelector<HTMLElement>(`[data-gloom-pane-id="${attributeValue(paneId)}"]`);
|
|
161
|
+
const body = pane?.querySelector<HTMLElement>("[data-gloom-role=pane-body]") ?? pane;
|
|
162
|
+
if (!body) return null;
|
|
163
|
+
|
|
164
|
+
const areas = new Map<Element, PixelRect | null>();
|
|
165
|
+
const pieces: Array<{ top: number; bottom: number; left: number; right: number; text: string }> = [];
|
|
166
|
+
const range = doc.createRange();
|
|
167
|
+
const walker = doc.createTreeWalker(body, 4 /* NodeFilter.SHOW_TEXT */);
|
|
168
|
+
for (let node = walker.nextNode(); node; node = walker.nextNode()) {
|
|
169
|
+
const text = node.textContent?.replace(/\s+/g, " ").trim();
|
|
170
|
+
const parent = node.parentElement;
|
|
171
|
+
if (!text || !parent) continue;
|
|
172
|
+
const area = visibleArea(parent, body, areas);
|
|
173
|
+
if (!area) continue;
|
|
174
|
+
range.selectNodeContents(node);
|
|
175
|
+
const rects = Array.from(range.getClientRects()).filter((rect) => rect.width > 0 && intersect(area, rect));
|
|
176
|
+
const first = rects[0];
|
|
177
|
+
if (!first) continue;
|
|
178
|
+
pieces.push({ top: first.top, bottom: first.bottom, left: first.left, right: first.right, text });
|
|
179
|
+
}
|
|
180
|
+
range.detach?.();
|
|
181
|
+
|
|
182
|
+
// Pieces whose middles share a line read as one, left to right, with a
|
|
183
|
+
// gap where the pane leaves one between them.
|
|
184
|
+
pieces.sort((a, b) => (a.top + a.bottom) / 2 - (b.top + b.bottom) / 2 || a.left - b.left);
|
|
185
|
+
const lines: Array<{ middle: number; height: number; parts: typeof pieces }> = [];
|
|
186
|
+
for (const piece of pieces) {
|
|
187
|
+
const middle = (piece.top + piece.bottom) / 2;
|
|
188
|
+
const line = lines[lines.length - 1];
|
|
189
|
+
if (line && Math.abs(line.middle - middle) < Math.max(4, line.height / 2)) line.parts.push(piece);
|
|
190
|
+
else lines.push({ middle, height: piece.bottom - piece.top, parts: [piece] });
|
|
191
|
+
}
|
|
192
|
+
const text = lines.map((line) => {
|
|
193
|
+
const parts = [...line.parts].sort((a, b) => a.left - b.left);
|
|
194
|
+
return parts.reduce((out, part, index) => {
|
|
195
|
+
if (index === 0) return part.text;
|
|
196
|
+
const gap = part.left - parts[index - 1]!.right;
|
|
197
|
+
return `${out}${gap > 6 ? " " : gap > 0.5 ? " " : ""}${part.text}`;
|
|
198
|
+
}, "");
|
|
199
|
+
}).join("\n");
|
|
200
|
+
return normalizePaneText(text);
|
|
201
|
+
}
|
|
@@ -13,10 +13,11 @@ import { t, tf } from "../../i18n";
|
|
|
13
13
|
import { useAppLanguage } from "../../i18n/react";
|
|
14
14
|
import { useViewport } from "../../react/input";
|
|
15
15
|
import { colors } from "../../theme/colors";
|
|
16
|
-
import { Box, Text, TextAttributes } from "../../ui";
|
|
16
|
+
import { Box, Text, TextAttributes, useUiCapabilities } from "../../ui";
|
|
17
|
+
import { DialogHints } from "../../components/ui/dialog-actions";
|
|
17
18
|
import { useDialog, useDialogKeyboard, type DialogApi, type PromptContext } from "../../ui/dialog";
|
|
18
19
|
import { isPlainKey } from "../../utils/keyboard";
|
|
19
|
-
import { DeviceSignInDialog } from "../../
|
|
20
|
+
import { DeviceSignInDialog } from "../../account/device-signin-dialog";
|
|
20
21
|
import type { SignedInBroker } from "./client";
|
|
21
22
|
import {
|
|
22
23
|
BrokerSignInController,
|
|
@@ -115,6 +116,7 @@ function BrokerSignInDialog({
|
|
|
115
116
|
renew,
|
|
116
117
|
}: PromptContext<BrokerSignInOutcome> & { broker: SignedInBroker; write: boolean; renew: boolean }) {
|
|
117
118
|
useAppLanguage();
|
|
119
|
+
const { nativePaneChrome } = useUiCapabilities();
|
|
118
120
|
const { height: termHeight } = useViewport();
|
|
119
121
|
// Close after a beat so "Connected" is visible; enter skips the wait. Signed
|
|
120
122
|
// out closes at once, for the host to sign in to Gloom.
|
|
@@ -162,9 +164,13 @@ function BrokerSignInDialog({
|
|
|
162
164
|
</>
|
|
163
165
|
)}
|
|
164
166
|
<Box height={1} />
|
|
165
|
-
|
|
166
|
-
<
|
|
167
|
-
|
|
167
|
+
{nativePaneChrome ? (
|
|
168
|
+
<DialogHints keys={[{ key: "r", label: "new code" }, { key: "Esc", label: "cancel" }]} />
|
|
169
|
+
) : (
|
|
170
|
+
<Box height={1}>
|
|
171
|
+
<Text fg={colors.textMuted}>{t("r for a new code · esc to cancel")}</Text>
|
|
172
|
+
</Box>
|
|
173
|
+
)}
|
|
168
174
|
</Box>
|
|
169
175
|
);
|
|
170
176
|
}
|
|
@@ -202,7 +202,7 @@ function resolvedOutput(value: unknown): ResolvedSeries {
|
|
|
202
202
|
const input = object(value, "resolve output");
|
|
203
203
|
onlyKeys(input, "resolve output", [
|
|
204
204
|
"id", "label", "color", "unit", "unitGroup", "nativeFrequency", "timestampMode", "dataShape", "style", "transform",
|
|
205
|
-
"axis", "panelId", "interpolation", "timeBasis", "latestChangePercent", "points", "warning", "hidden",
|
|
205
|
+
"axis", "panelId", "interpolation", "timeBasis", "latestChangePercent", "points", "warning", "hidden", "attribution",
|
|
206
206
|
]);
|
|
207
207
|
if (!Array.isArray(input.points)) fail("resolve output points", "expected an array.");
|
|
208
208
|
if (input.points.length > MAX_CHART_SERIES_POINTS) {
|
|
@@ -212,6 +212,9 @@ function resolvedOutput(value: unknown): ResolvedSeries {
|
|
|
212
212
|
if (timeBasis) onlyKeys(timeBasis, "resolve output time basis", ["kind", "timeZone", "cadenceMs"]);
|
|
213
213
|
const kind = timeBasis?.kind === undefined ? undefined : enumValue<"market">(timeBasis.kind, "time basis kind", new Set(["market"]));
|
|
214
214
|
const warning = optionalString(input.warning, "resolve output warning", 500);
|
|
215
|
+
const attribution = input.attribution === undefined ? undefined : object(input.attribution, "resolve output attribution");
|
|
216
|
+
if (attribution) onlyKeys(attribution, "resolve output attribution", ["source", "publisher"]);
|
|
217
|
+
const publisher = attribution ? optionalString(attribution.publisher, "resolve output publisher", 160) : undefined;
|
|
215
218
|
return {
|
|
216
219
|
id: boundedString(input.id, "resolve output ID", 160),
|
|
217
220
|
label: boundedString(input.label, "resolve output label", 160),
|
|
@@ -242,6 +245,10 @@ function resolvedOutput(value: unknown): ResolvedSeries {
|
|
|
242
245
|
: {}),
|
|
243
246
|
points: input.points.map(point),
|
|
244
247
|
...(warning !== undefined ? { warning } : {}),
|
|
248
|
+
...(attribution ? { attribution: {
|
|
249
|
+
source: boundedString(attribution.source, "resolve output source", 160),
|
|
250
|
+
...(publisher !== undefined ? { publisher } : {}),
|
|
251
|
+
} } : {}),
|
|
245
252
|
...(input.hidden !== undefined
|
|
246
253
|
? typeof input.hidden === "boolean" ? { hidden: input.hidden } : fail("resolve output hidden", "expected a boolean.")
|
|
247
254
|
: {}),
|
|
@@ -253,17 +260,27 @@ export const chartSeriesCatalogOutputSchema: CapabilitySchema<ChartSeriesCatalog
|
|
|
253
260
|
export const chartSeriesResolveRequestSchema: CapabilitySchema<ChartSeriesResolveRequest> = { parse: resolveRequest };
|
|
254
261
|
export const chartSeriesResolveOutputSchema: CapabilitySchema<ResolvedSeries> = { parse: resolvedOutput };
|
|
255
262
|
|
|
263
|
+
/**
|
|
264
|
+
* Set on the capabilities registered series resolve through. The composer
|
|
265
|
+
* searches those series in the series registry, so capability search skips them.
|
|
266
|
+
*/
|
|
267
|
+
export const REGISTERED_SERIES_SOURCE_ID = "registered-series";
|
|
268
|
+
|
|
256
269
|
export function chartSeriesCapabilityManifests(invoker: CapabilityInvoker) {
|
|
257
270
|
return invoker.capabilityManifests(CHART_SERIES_CAPABILITY_KIND);
|
|
258
271
|
}
|
|
259
272
|
|
|
273
|
+
function searchableChartSeriesManifests(invoker: CapabilityInvoker) {
|
|
274
|
+
return chartSeriesCapabilityManifests(invoker).filter((manifest) => manifest.sourceId !== REGISTERED_SERIES_SOURCE_ID);
|
|
275
|
+
}
|
|
276
|
+
|
|
260
277
|
export async function searchChartSeriesCapabilities(
|
|
261
278
|
invoker: CapabilityInvoker,
|
|
262
279
|
query: string,
|
|
263
280
|
limit = 8,
|
|
264
281
|
signal?: AbortSignal,
|
|
265
282
|
): Promise<Array<ChartSeriesCatalogItem & { capabilityId: string; capabilityName: string }>> {
|
|
266
|
-
const manifests =
|
|
283
|
+
const manifests = searchableChartSeriesManifests(invoker);
|
|
267
284
|
const results = await Promise.allSettled(manifests.map(async (manifest) => {
|
|
268
285
|
const items = await invoker.invokeCapability<ChartSeriesCatalogItem[]>(
|
|
269
286
|
manifest.id,
|
|
@@ -61,6 +61,7 @@ export function assetDataProvider(provider: AssetDataProvider): AssetDataCapabil
|
|
|
61
61
|
if (!provider.getCorporateActions) throw new Error(`${provider.name} does not provide corporate actions.`);
|
|
62
62
|
return provider.getCorporateActions(input.ticker, input.exchange, input.context);
|
|
63
63
|
}, "query"),
|
|
64
|
+
getTickerChanges: op((input: any) => provider.getTickerChanges?.(input.symbol) ?? Promise.resolve(null), "query"),
|
|
64
65
|
getEarningsCalendar: op((input: any) => {
|
|
65
66
|
if (!provider.getEarningsCalendar) throw new Error(`${provider.name} does not provide earnings calendar.`);
|
|
66
67
|
return provider.getEarningsCalendar(input.symbols ?? [], input.context);
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { centralBankNamed } from "../utils/central-banks";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Central bank acronyms that are also the symbol of a listing people ask
|
|
5
|
+
* about (BOE is a NYSE fund, RBI Raiffeisen Bank in Vienna), so `events BOE`
|
|
6
|
+
* stays that listing's. ECB S.A. in Warsaw is reached as ECB:WSE.
|
|
7
|
+
*/
|
|
8
|
+
const LISTED_SYMBOLS = new Set(["BOE", "BOC", "RBA", "PBOC", "RBI", "BOK"]);
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* What `events` says for a central bank named on its own ("ECB", "Norges
|
|
12
|
+
* Bank"): its meetings are no company's corporate events, and CBR has its
|
|
13
|
+
* rate and the next decision from the bank's own calendar (China's next LPR
|
|
14
|
+
* fixing; SAMA publishes none). Null for anything else, a symbol with a venue
|
|
15
|
+
* included.
|
|
16
|
+
*/
|
|
17
|
+
export function centralBankEventsMessage(typed: string): string | null {
|
|
18
|
+
const bank = centralBankNamed(typed);
|
|
19
|
+
if (!bank || LISTED_SYMBOLS.has(typed.trim().replace(/^\$/, "").toUpperCase())) return null;
|
|
20
|
+
const next = bank.id === "US" ? " and the next FOMC date" : bank.id === "CN" ? " and the next LPR fixing"
|
|
21
|
+
: bank.id === "SA" ? "" : " and the next decision";
|
|
22
|
+
return `${bank.id === "US" ? "Fed" : bank.short} meetings are not listed; CBR shows the rate${next} (gloomberb fn CBR).`;
|
|
23
|
+
}
|
|
@@ -4,8 +4,11 @@ import { suggestCliOption } from "./help";
|
|
|
4
4
|
|
|
5
5
|
/** A built-in command, which may say more about an option it does not take than the list of those it does. */
|
|
6
6
|
export interface BuiltinCliCommandDef extends CliCommandDef {
|
|
7
|
-
/**
|
|
8
|
-
|
|
7
|
+
/**
|
|
8
|
+
* A sentence for an unknown option people reach for, such as `--from` on
|
|
9
|
+
* `history`; null for the rest. `args` are the command's, to name what it was given.
|
|
10
|
+
*/
|
|
11
|
+
unknownOptionHint?(flag: string, args: readonly string[]): string | null;
|
|
9
12
|
}
|
|
10
13
|
|
|
11
14
|
interface DeclaredOption {
|
|
@@ -34,12 +37,21 @@ function declaredOptions(command: CliCommandDef): Map<string, DeclaredOption> |
|
|
|
34
37
|
return declared;
|
|
35
38
|
}
|
|
36
39
|
|
|
37
|
-
|
|
40
|
+
/** `--explain` on a command that has no glossary of its own points at the commands that do, and at the glossary. */
|
|
41
|
+
const EXPLAIN_HINT = "--explain follows the reports of fn <function> and portfolio show. "
|
|
42
|
+
+ "gloomberb catalog explain <term> prints what one term means; gloomberb catalog glossary lists every term.";
|
|
43
|
+
|
|
44
|
+
function failUnknownOption(
|
|
45
|
+
command: BuiltinCliCommandDef,
|
|
46
|
+
flag: string,
|
|
47
|
+
declared: Map<string, DeclaredOption>,
|
|
48
|
+
args: readonly string[],
|
|
49
|
+
): never {
|
|
38
50
|
const flags = [...declared.keys()];
|
|
39
51
|
const suggestion = suggestCliOption(flag, flags);
|
|
40
52
|
const help = `See gloomberb help ${command.name}.`;
|
|
41
53
|
fail(`Unknown option ${flag} for ${command.name}.`, [
|
|
42
|
-
command.unknownOptionHint?.(flag) ?? "",
|
|
54
|
+
command.unknownOptionHint?.(flag, args) ?? (flag === "--explain" ? EXPLAIN_HINT : ""),
|
|
43
55
|
suggestion ? `Did you mean ${suggestion}?` : "",
|
|
44
56
|
flags.length > 0 ? `Options: ${flags.join(", ")}. ${help}` : `${command.name} takes no options. ${help}`,
|
|
45
57
|
].filter(Boolean).join("\n"));
|
|
@@ -65,7 +77,7 @@ export function checkCliCommandOptions(
|
|
|
65
77
|
const equals = arg.indexOf("=");
|
|
66
78
|
const flag = equals >= 0 ? arg.slice(0, equals) : arg;
|
|
67
79
|
const option = declared.get(flag);
|
|
68
|
-
if (!option) failUnknownOption(command, flag, declared);
|
|
80
|
+
if (!option) failUnknownOption(command, flag, declared, args);
|
|
69
81
|
if (!option.takesValue && equals >= 0) {
|
|
70
82
|
fail(`${flag} takes no value.`, `Write it alone, as ${flag}. See gloomberb help ${command.name}.`);
|
|
71
83
|
}
|