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
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { useEffect } from "react";
|
|
2
|
+
import { Box, useUiHost } from "../ui";
|
|
3
|
+
import { ConfirmDialog } from "../components/ui/confirm-dialog";
|
|
4
|
+
import { KeyValueRow } from "../components/ui/display";
|
|
5
|
+
import { useViewport } from "../react/input";
|
|
6
|
+
import type { DialogApi, PromptContext } from "../ui/dialog";
|
|
7
|
+
import type { RemoteChangePrompt } from "./types";
|
|
8
|
+
|
|
9
|
+
const WIDTH = 52;
|
|
10
|
+
const MIN_WIDTH = 24;
|
|
11
|
+
/** The terminal dialog's border and padding around its content. */
|
|
12
|
+
const TERMINAL_FRAME_COLUMNS = 8;
|
|
13
|
+
const LABEL_WIDTH = 11;
|
|
14
|
+
/** The change asks on its own, maybe mid-keystroke: Enter or `y` typed just before it opened do not approve it. */
|
|
15
|
+
const KEY_GRACE_MS = 600;
|
|
16
|
+
|
|
17
|
+
export function RemoteChangeDialog({
|
|
18
|
+
resolve,
|
|
19
|
+
dismiss,
|
|
20
|
+
dialogId,
|
|
21
|
+
prompt,
|
|
22
|
+
signal,
|
|
23
|
+
keyGraceMs = KEY_GRACE_MS,
|
|
24
|
+
}: PromptContext<boolean> & { prompt: RemoteChangePrompt; signal?: AbortSignal; keyGraceMs?: number }) {
|
|
25
|
+
const viewport = useViewport();
|
|
26
|
+
const terminal = useUiHost().kind === "opentui";
|
|
27
|
+
// A narrow terminal gets a narrower dialog rather than a clipped one.
|
|
28
|
+
const width = terminal ? Math.max(MIN_WIDTH, Math.min(WIDTH, viewport.width - TERMINAL_FRAME_COLUMNS)) : WIDTH;
|
|
29
|
+
|
|
30
|
+
useEffect(() => {
|
|
31
|
+
if (!signal) return;
|
|
32
|
+
const decline = () => resolve(false);
|
|
33
|
+
if (signal.aborted) {
|
|
34
|
+
decline();
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
signal.addEventListener("abort", decline, { once: true });
|
|
38
|
+
return () => signal.removeEventListener("abort", decline);
|
|
39
|
+
}, [resolve, signal]);
|
|
40
|
+
|
|
41
|
+
return (
|
|
42
|
+
<ConfirmDialog
|
|
43
|
+
resolve={resolve}
|
|
44
|
+
dismiss={dismiss}
|
|
45
|
+
dialogId={dialogId}
|
|
46
|
+
title={prompt.title}
|
|
47
|
+
body={(
|
|
48
|
+
<Box flexDirection="column" width={width}>
|
|
49
|
+
{prompt.lines.map((line) => (
|
|
50
|
+
<KeyValueRow
|
|
51
|
+
key={line.label}
|
|
52
|
+
label={line.label}
|
|
53
|
+
value={line.value}
|
|
54
|
+
width={width}
|
|
55
|
+
labelWidth={LABEL_WIDTH}
|
|
56
|
+
/>
|
|
57
|
+
))}
|
|
58
|
+
</Box>
|
|
59
|
+
)}
|
|
60
|
+
confirmLabel={prompt.confirmLabel}
|
|
61
|
+
confirmVariant={prompt.destructive ? "danger" : "primary"}
|
|
62
|
+
width={width}
|
|
63
|
+
keyGraceMs={keyGraceMs}
|
|
64
|
+
/>
|
|
65
|
+
);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Asks the person to approve one change a remote caller asked for. Resolves
|
|
70
|
+
* true only on Add or Remove; Cancel, Esc, a closed dialog or an aborted
|
|
71
|
+
* `signal` resolve false.
|
|
72
|
+
*/
|
|
73
|
+
export async function confirmRemoteChange(
|
|
74
|
+
dialog: DialogApi,
|
|
75
|
+
prompt: RemoteChangePrompt,
|
|
76
|
+
signal?: AbortSignal,
|
|
77
|
+
): Promise<boolean> {
|
|
78
|
+
if (signal?.aborted) return false;
|
|
79
|
+
const answer = await dialog.prompt<boolean>({
|
|
80
|
+
closeOnClickOutside: false,
|
|
81
|
+
closeOnEscape: true,
|
|
82
|
+
content: (context) => <RemoteChangeDialog {...context} prompt={prompt} signal={signal} />,
|
|
83
|
+
}).catch(() => false);
|
|
84
|
+
return answer === true;
|
|
85
|
+
}
|
|
@@ -18,11 +18,18 @@ export function ok<T>(data: T, rev?: string, state?: RemoteIncludedState): Remot
|
|
|
18
18
|
};
|
|
19
19
|
}
|
|
20
20
|
|
|
21
|
+
/** A failure with its own code, such as `unsupported` for an operation this app cannot run. */
|
|
22
|
+
export class RemoteOperationError extends Error {
|
|
23
|
+
constructor(readonly code: string, message: string) {
|
|
24
|
+
super(message);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
21
28
|
export function fail(code: string, error: unknown): RemoteControlResponse {
|
|
22
29
|
return {
|
|
23
30
|
ok: false,
|
|
24
31
|
error: {
|
|
25
|
-
code,
|
|
32
|
+
code: error instanceof RemoteOperationError ? error.code : code,
|
|
26
33
|
message: error instanceof Error ? error.message : String(error),
|
|
27
34
|
},
|
|
28
35
|
};
|
package/src/remote/controller.ts
CHANGED
|
@@ -19,9 +19,13 @@ import {
|
|
|
19
19
|
} from "../plugins/builtin/custom-view";
|
|
20
20
|
import { findPaneInstance, getPlacedPaneInstanceIds, type PaneInstanceConfig, resolvePaneInstance } from "../types/config";
|
|
21
21
|
import type { DesktopWindowBridge } from "../types/desktop-window";
|
|
22
|
+
import { settleTypedListingKey } from "../tickers/listing-venues";
|
|
23
|
+
import { isSharedExchangeCode, parsePublicTickerKey, typedExchangeCode } from "../utils/exchanges";
|
|
22
24
|
import { applyJsonPatch } from "./json-patch";
|
|
23
25
|
import { revisionFor } from "./revision";
|
|
24
26
|
import type {
|
|
27
|
+
RemoteCallContext,
|
|
28
|
+
RemoteChangePrompt,
|
|
25
29
|
RemoteControlRequest,
|
|
26
30
|
RemoteControlResponse,
|
|
27
31
|
RemoteJsonPatchOperation,
|
|
@@ -31,7 +35,7 @@ import type {
|
|
|
31
35
|
import type { RemoteUiRegistry } from "./semantic-tree";
|
|
32
36
|
import { commandBarResultsFromNodes, isCommandBarInputNode } from "./command-bar";
|
|
33
37
|
import { findCommandBarResult, findMatchingUiNode } from "./matching";
|
|
34
|
-
import { REMOTE_AGENT_HELP, remoteControlSchema } from "./schema";
|
|
38
|
+
import { REMOTE_AGENT_HELP, REMOTE_OPERATIONS, remoteControlSchema } from "./schema";
|
|
35
39
|
import {
|
|
36
40
|
fail,
|
|
37
41
|
mutationSummary,
|
|
@@ -39,8 +43,16 @@ import {
|
|
|
39
43
|
ok,
|
|
40
44
|
optionalNumber,
|
|
41
45
|
optionalString,
|
|
46
|
+
RemoteOperationError,
|
|
42
47
|
stringInput,
|
|
43
48
|
} from "./controller-utils";
|
|
49
|
+
import {
|
|
50
|
+
PANE_SCREENSHOT_MAX_BYTES,
|
|
51
|
+
PANE_SCREENSHOT_MAX_EDGE,
|
|
52
|
+
PANE_SCREENSHOT_MIN_WIDTH,
|
|
53
|
+
paneScreenshotScale,
|
|
54
|
+
type CapturePane,
|
|
55
|
+
} from "./pane-screenshot";
|
|
44
56
|
import {
|
|
45
57
|
buildGridDockRoot,
|
|
46
58
|
regionToDockPosition,
|
|
@@ -51,6 +63,14 @@ import { createRemoteResources } from "./resources";
|
|
|
51
63
|
import { dismissTopmostDialog, isDialogOpen as isAnyDialogOpen } from "../ui/dialog-stack";
|
|
52
64
|
import { asRecord } from "../utils/guards";
|
|
53
65
|
import { runAutomated } from "../telemetry/usage-counts";
|
|
66
|
+
import {
|
|
67
|
+
applyWatchlistChange,
|
|
68
|
+
declinedWatchlistResult,
|
|
69
|
+
describeWatchlistPlan,
|
|
70
|
+
planWatchlistChange,
|
|
71
|
+
unchangedWatchlistResult,
|
|
72
|
+
watchlistChangePrompt,
|
|
73
|
+
} from "./watchlist";
|
|
54
74
|
|
|
55
75
|
interface AppRemoteControllerOptions {
|
|
56
76
|
dispatch: Dispatch<AppAction>;
|
|
@@ -63,8 +83,20 @@ interface AppRemoteControllerOptions {
|
|
|
63
83
|
isDialogOpen?: () => boolean;
|
|
64
84
|
/** Closes the dialog on top as Esc would; false when none is open. */
|
|
65
85
|
closeTopmostDialog?: () => boolean;
|
|
86
|
+
/**
|
|
87
|
+
* Asks the person in the app to approve a change to their data; false when
|
|
88
|
+
* they decline or `signal` aborts. Without it such operations refuse.
|
|
89
|
+
*/
|
|
90
|
+
confirmChange?: (prompt: RemoteChangePrompt, signal?: AbortSignal) => Promise<boolean>;
|
|
91
|
+
/** Paints one pane of this window as a PNG; absent where there are no pixels (the TUI). */
|
|
92
|
+
capturePane?: CapturePane;
|
|
66
93
|
}
|
|
67
94
|
|
|
95
|
+
/** Operations whose dry run resolves what they would change instead of echoing the input. */
|
|
96
|
+
const PLANNED_OPERATIONS = new Set(["watchlist.add", "watchlist.remove"]);
|
|
97
|
+
/** Reads change nothing, so their answer carries no layout or command-bar state. */
|
|
98
|
+
const READ_OPERATIONS = new Set(REMOTE_OPERATIONS.filter((entry) => entry.sideEffectLevel === "none").map((entry) => entry.id));
|
|
99
|
+
|
|
68
100
|
// A command with a wizard closes the bar and opens its form, so every call says whether one is open.
|
|
69
101
|
const DEFAULT_MUTATION_INCLUDE: RemoteStateInclude[] = ["app", "layout", "panes", "commandBar", "form"];
|
|
70
102
|
const MAX_MARKET_DATA_SEARCH_RESULTS = 20;
|
|
@@ -97,6 +129,8 @@ export function createAppRemoteController({
|
|
|
97
129
|
afterMutation = () => {},
|
|
98
130
|
isDialogOpen = isAnyDialogOpen,
|
|
99
131
|
closeTopmostDialog = dismissTopmostDialog,
|
|
132
|
+
confirmChange,
|
|
133
|
+
capturePane,
|
|
100
134
|
}: AppRemoteControllerOptions) {
|
|
101
135
|
const { buildIncludedState, getResource, patchTarget } = createRemoteResources({
|
|
102
136
|
dispatch,
|
|
@@ -111,8 +145,26 @@ export function createAppRemoteController({
|
|
|
111
145
|
return mutationSummary(getState(), extra);
|
|
112
146
|
};
|
|
113
147
|
|
|
114
|
-
|
|
148
|
+
/**
|
|
149
|
+
* The listing a request names, a code that names several venues (7203:TSE,
|
|
150
|
+
* or 7203 with exchange TSE) read as the one its symbol trades on, as every
|
|
151
|
+
* command reads it.
|
|
152
|
+
*/
|
|
153
|
+
const settledListing = async (rawSymbol: string, rawExchange: string | undefined) => {
|
|
154
|
+
const symbol = normalizedMarketDataSymbol(rawSymbol);
|
|
155
|
+
const exchange = normalizedOptionalExchange(rawExchange);
|
|
156
|
+
const typed = exchange && isSharedExchangeCode(exchange) && !parsePublicTickerKey(symbol).exchange ? `${symbol}:${exchange}` : symbol;
|
|
157
|
+
if (!isSharedExchangeCode(typedExchangeCode(typed))) return { symbol, exchange };
|
|
158
|
+
const settled = (await settleTypedListingKey(typed, {
|
|
159
|
+
store: pluginRegistry.tickerRepository,
|
|
160
|
+
dataProvider: pluginRegistry.marketData,
|
|
161
|
+
})).toUpperCase();
|
|
162
|
+
return settled === typed ? { symbol, exchange } : { symbol: settled, exchange: parsePublicTickerKey(settled).exchange };
|
|
163
|
+
};
|
|
164
|
+
|
|
165
|
+
const queryMarketData = async (named: RemoteMarketDataRequest): Promise<unknown> => {
|
|
115
166
|
const marketData = pluginRegistry.marketData;
|
|
167
|
+
const request = "symbol" in named ? { ...named, ...await settledListing(named.symbol, named.exchange) } : named;
|
|
116
168
|
switch (request.operation) {
|
|
117
169
|
case "search":
|
|
118
170
|
return (await marketData.search(requiredMarketDataText(request.query, "query")))
|
|
@@ -264,9 +316,90 @@ export function createAppRemoteController({
|
|
|
264
316
|
return getAfterMutationSummary({ invokedNode: node, result });
|
|
265
317
|
};
|
|
266
318
|
|
|
319
|
+
/** The focused pane, or the one asked for, as the window draws it now. */
|
|
320
|
+
const screenshotPane = async (input: Record<string, unknown>): Promise<unknown> => {
|
|
321
|
+
if (!capturePane) {
|
|
322
|
+
throw new RemoteOperationError(
|
|
323
|
+
"unsupported",
|
|
324
|
+
"Pane screenshots need the Gloom desktop app: the terminal (TUI) app draws text, not pixels. Read the pane's content instead.",
|
|
325
|
+
);
|
|
326
|
+
}
|
|
327
|
+
const width = input.width;
|
|
328
|
+
if (width !== undefined && (
|
|
329
|
+
typeof width !== "number" || !Number.isInteger(width) || width < PANE_SCREENSHOT_MIN_WIDTH || width > PANE_SCREENSHOT_MAX_EDGE
|
|
330
|
+
)) {
|
|
331
|
+
throw new Error(`width must be a whole number of pixels from ${PANE_SCREENSHOT_MIN_WIDTH} to ${PANE_SCREENSHOT_MAX_EDGE}.`);
|
|
332
|
+
}
|
|
333
|
+
const state = getState();
|
|
334
|
+
const layout = state.config.layout;
|
|
335
|
+
const asked = optionalString(input, "paneId");
|
|
336
|
+
const instance = asked
|
|
337
|
+
? resolvePaneInstance(layout, asked)
|
|
338
|
+
: state.focusedPaneId ? findPaneInstance(layout, state.focusedPaneId) : undefined;
|
|
339
|
+
if (!instance) {
|
|
340
|
+
throw new Error(asked ? `No pane "${asked}" is open in this layout. Read app://panes for the open ones.` : "No pane is focused. Pass paneId.");
|
|
341
|
+
}
|
|
342
|
+
if ((layout.detached ?? []).some((entry) => entry.instanceId === instance.instanceId)) {
|
|
343
|
+
throw new Error(`Pane "${instance.instanceId}" is in its own window; dock it to capture it.`);
|
|
344
|
+
}
|
|
345
|
+
const shot = await capturePane({
|
|
346
|
+
instanceId: instance.instanceId,
|
|
347
|
+
scaleFor: (screen) => paneScreenshotScale(screen, width as number | undefined),
|
|
348
|
+
maxBytes: PANE_SCREENSHOT_MAX_BYTES,
|
|
349
|
+
minWidth: PANE_SCREENSHOT_MIN_WIDTH,
|
|
350
|
+
});
|
|
351
|
+
return {
|
|
352
|
+
pane: {
|
|
353
|
+
instanceId: instance.instanceId,
|
|
354
|
+
paneId: instance.paneId,
|
|
355
|
+
...(instance.title ? { title: instance.title } : {}),
|
|
356
|
+
},
|
|
357
|
+
image: { mimeType: "image/png", data: shot.pngBase64, width: shot.width, height: shot.height, bytes: shot.bytes },
|
|
358
|
+
screen: shot.screen,
|
|
359
|
+
...(shot.reduced ? { reduced: true } : {}),
|
|
360
|
+
};
|
|
361
|
+
};
|
|
362
|
+
|
|
363
|
+
const workflowDeps = () => ({
|
|
364
|
+
dataProvider: pluginRegistry.marketData,
|
|
365
|
+
tickerRepository: pluginRegistry.tickerRepository,
|
|
366
|
+
pluginRegistry,
|
|
367
|
+
dispatch,
|
|
368
|
+
getState,
|
|
369
|
+
});
|
|
370
|
+
|
|
371
|
+
/**
|
|
372
|
+
* Adds or removes one ticker on a personal watchlist, after the person
|
|
373
|
+
* approves that exact change in the app. A caller that already showed them
|
|
374
|
+
* the dry run's summary and got a yes passes its confirmKey instead.
|
|
375
|
+
*/
|
|
376
|
+
const changeWatchlist = async (
|
|
377
|
+
operation: string,
|
|
378
|
+
input: Record<string, unknown>,
|
|
379
|
+
dryRun: boolean | undefined,
|
|
380
|
+
context: RemoteCallContext,
|
|
381
|
+
): Promise<unknown> => {
|
|
382
|
+
const action = operation === "watchlist.add" ? "add" : "remove";
|
|
383
|
+
const plan = await planWatchlistChange(action, {
|
|
384
|
+
symbol: stringInput(input, "symbol"),
|
|
385
|
+
exchange: optionalString(input, "exchange"),
|
|
386
|
+
watchlist: optionalString(input, "watchlist"),
|
|
387
|
+
}, workflowDeps());
|
|
388
|
+
if (dryRun) return describeWatchlistPlan(plan);
|
|
389
|
+
if (!plan.changes) return unchangedWatchlistResult(plan);
|
|
390
|
+
if (context.confirmed !== plan.confirmKey) {
|
|
391
|
+
if (!confirmChange) throw new Error("This window cannot ask for confirmation, so nothing changed.");
|
|
392
|
+
if (!await confirmChange(watchlistChangePrompt(plan), context.signal)) return declinedWatchlistResult(plan);
|
|
393
|
+
}
|
|
394
|
+
return runAutomated(() => applyWatchlistChange(plan, workflowDeps()));
|
|
395
|
+
};
|
|
396
|
+
|
|
267
397
|
// What remote control opens is automation, not the user opening a function.
|
|
268
|
-
|
|
269
|
-
|
|
398
|
+
// A watchlist change waits on the person, so only its write is automated.
|
|
399
|
+
const call = (operation: string, rawInput: unknown, dryRun: boolean | undefined, context: RemoteCallContext): Promise<unknown> => (
|
|
400
|
+
PLANNED_OPERATIONS.has(operation)
|
|
401
|
+
? changeWatchlist(operation, asRecord(rawInput), dryRun, context)
|
|
402
|
+
: runAutomated(() => callOperation(operation, rawInput, dryRun))
|
|
270
403
|
);
|
|
271
404
|
|
|
272
405
|
const callOperation = async (operation: string, rawInput: unknown, dryRun?: boolean): Promise<unknown> => {
|
|
@@ -307,6 +440,8 @@ export function createAppRemoteController({
|
|
|
307
440
|
pluginRegistry.hidePane(paneId);
|
|
308
441
|
return getAfterMutationSummary({ affectedPaneIds: [paneId] });
|
|
309
442
|
}
|
|
443
|
+
case "pane.screenshot":
|
|
444
|
+
return screenshotPane(input);
|
|
310
445
|
case "pane.createFromTemplate":
|
|
311
446
|
await pluginRegistry.createPaneFromTemplateAsync(
|
|
312
447
|
stringInput(input, "templateId"),
|
|
@@ -499,7 +634,8 @@ export function createAppRemoteController({
|
|
|
499
634
|
}
|
|
500
635
|
};
|
|
501
636
|
|
|
502
|
-
|
|
637
|
+
/** `context` comes from in-process callers only; the local endpoint never passes one. */
|
|
638
|
+
const handle = async (request: RemoteControlRequest, context: RemoteCallContext = {}): Promise<RemoteControlResponse> => {
|
|
503
639
|
try {
|
|
504
640
|
switch (request.type) {
|
|
505
641
|
case "help":
|
|
@@ -513,8 +649,9 @@ export function createAppRemoteController({
|
|
|
513
649
|
case "data":
|
|
514
650
|
return ok(await queryMarketData(request));
|
|
515
651
|
case "call": {
|
|
516
|
-
const data = await call(request.operation, request.input, request.dryRun);
|
|
517
|
-
|
|
652
|
+
const data = await call(request.operation, request.input, request.dryRun, context);
|
|
653
|
+
const defaults = request.dryRun || READ_OPERATIONS.has(request.operation) ? [] : DEFAULT_MUTATION_INCLUDE;
|
|
654
|
+
return ok(data, undefined, buildIncludedState(request.include, defaults));
|
|
518
655
|
}
|
|
519
656
|
case "patch": {
|
|
520
657
|
const target = patchTarget(request.resource);
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* pane.screenshot: one pane as a PNG, painted from what the window shows now.
|
|
3
|
+
* The bounds keep the image legible for an assistant and small enough for one
|
|
4
|
+
* Gloom Cloud socket frame (the terminal relay carries it to the MCP).
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
/** Neither side of the image is longer; assistants shrink larger images anyway. */
|
|
8
|
+
export const PANE_SCREENSHOT_MAX_EDGE = 1600;
|
|
9
|
+
/** The narrowest image a caller can ask for, and the floor when shrinking to fit the byte cap. */
|
|
10
|
+
export const PANE_SCREENSHOT_MIN_WIDTH = 200;
|
|
11
|
+
/** The PNG never exceeds this; a larger paint is shrunk until it fits. */
|
|
12
|
+
export const PANE_SCREENSHOT_MAX_BYTES = 512 * 1024;
|
|
13
|
+
/** Pixels per screen point by default: as sharp as a Retina screen. */
|
|
14
|
+
const DEFAULT_SCALE = 2;
|
|
15
|
+
const MAX_SCALE = 3;
|
|
16
|
+
|
|
17
|
+
export interface PaneScreenshotRequest {
|
|
18
|
+
instanceId: string;
|
|
19
|
+
/** Device pixels per CSS pixel to paint a pane of this on-screen size at. */
|
|
20
|
+
scaleFor(screen: { width: number; height: number }): number;
|
|
21
|
+
maxBytes: number;
|
|
22
|
+
minWidth: number;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
interface PaneScreenshot {
|
|
26
|
+
pngBase64: string;
|
|
27
|
+
width: number;
|
|
28
|
+
height: number;
|
|
29
|
+
bytes: number;
|
|
30
|
+
/** The pane's size on screen, in CSS pixels. */
|
|
31
|
+
screen: { width: number; height: number };
|
|
32
|
+
/** Shrunk below the asked size so the PNG fits `maxBytes`. */
|
|
33
|
+
reduced: boolean;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/** Paints one pane of this window. Only renderers with pixels (the desktop app) have one. */
|
|
37
|
+
export type CapturePane = (request: PaneScreenshotRequest) => Promise<PaneScreenshot>;
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* The paint scale for a pane of `screen` size: `width` pixels wide when asked,
|
|
41
|
+
* otherwise twice its on-screen size, within the long-edge bound either way.
|
|
42
|
+
*/
|
|
43
|
+
export function paneScreenshotScale(screen: { width: number; height: number }, width?: number): number {
|
|
44
|
+
const longest = Math.max(1, screen.width, screen.height);
|
|
45
|
+
const wanted = width === undefined ? DEFAULT_SCALE : width / Math.max(1, screen.width);
|
|
46
|
+
return Math.min(wanted, MAX_SCALE, PANE_SCREENSHOT_MAX_EDGE / longest);
|
|
47
|
+
}
|
package/src/remote/schema.ts
CHANGED
|
@@ -7,6 +7,11 @@ import type {
|
|
|
7
7
|
RemoteSideEffectLevel,
|
|
8
8
|
RemoteWriteTier,
|
|
9
9
|
} from "./types";
|
|
10
|
+
import {
|
|
11
|
+
PANE_SCREENSHOT_MAX_BYTES,
|
|
12
|
+
PANE_SCREENSHOT_MAX_EDGE,
|
|
13
|
+
PANE_SCREENSHOT_MIN_WIDTH,
|
|
14
|
+
} from "./pane-screenshot";
|
|
10
15
|
|
|
11
16
|
export const REMOTE_RESOURCES: RemoteResourceSchema[] = [
|
|
12
17
|
{ uri: "app://snapshot", description: "Current app snapshot including layout, focus, panes, command bar, and plugin/capability catalogs. app.activePanel is deprecated and always \"left\"; read app.focusedPaneId." },
|
|
@@ -49,6 +54,21 @@ function objectSchema(
|
|
|
49
54
|
}
|
|
50
55
|
|
|
51
56
|
const paneIdInput = objectSchema({ paneId: requiredStringSchema }, ["paneId"]);
|
|
57
|
+
const watchlistChangeInput = objectSchema({
|
|
58
|
+
symbol: { type: "string", minLength: 1, maxLength: 32, description: "Ticker symbol, such as MSFT." },
|
|
59
|
+
exchange: {
|
|
60
|
+
type: "string",
|
|
61
|
+
minLength: 1,
|
|
62
|
+
maxLength: 16,
|
|
63
|
+
description: "Listing exchange, for a symbol that trades in several places, such as NASDAQ or LSE.",
|
|
64
|
+
},
|
|
65
|
+
watchlist: {
|
|
66
|
+
type: "string",
|
|
67
|
+
minLength: 1,
|
|
68
|
+
maxLength: 120,
|
|
69
|
+
description: "Watchlist id or name from app://config. Without it, the default watchlist: the first personal one.",
|
|
70
|
+
},
|
|
71
|
+
}, ["symbol"]);
|
|
52
72
|
|
|
53
73
|
export const REMOTE_OPERATIONS: RemoteOperationSchema[] = [
|
|
54
74
|
op(
|
|
@@ -113,6 +133,28 @@ export const REMOTE_OPERATIONS: RemoteOperationSchema[] = [
|
|
|
113
133
|
op("pane.show", "Show or focus a pane type.", "{ paneId: string }", "local-write", paneIdInput),
|
|
114
134
|
op("pane.focus", "Focus a pane instance or pane type.", "{ paneId: string }", "local-write", paneIdInput),
|
|
115
135
|
op("pane.close", "Close a pane instance or pane type.", "{ paneId: string }", "local-write", paneIdInput),
|
|
136
|
+
{
|
|
137
|
+
...op(
|
|
138
|
+
"pane.screenshot",
|
|
139
|
+
"Capture one pane as a PNG, as it looks on screen now: the focused pane, or paneId (an instance id or pane type from app://panes). "
|
|
140
|
+
+ "It only reads what is already on the person's own screen. Desktop app only: the terminal (TUI) app draws text, not pixels. "
|
|
141
|
+
+ `The image is twice the pane's on-screen size by default, at most ${PANE_SCREENSHOT_MAX_EDGE} px on its longer side and ${PANE_SCREENSHOT_MAX_BYTES / 1024} KB; `
|
|
142
|
+
+ `width asks for another width (${PANE_SCREENSHOT_MIN_WIDTH} to ${PANE_SCREENSHOT_MAX_EDGE} px). `
|
|
143
|
+
+ "A pane in its own window, behind another tab or in another layout is not drawn here and cannot be captured.",
|
|
144
|
+
"{ paneId?: string, width?: number }",
|
|
145
|
+
"none",
|
|
146
|
+
objectSchema({
|
|
147
|
+
paneId: { type: "string", minLength: 1, description: "Pane instance id or pane type. Defaults to the focused pane." },
|
|
148
|
+
width: {
|
|
149
|
+
type: "integer",
|
|
150
|
+
minimum: PANE_SCREENSHOT_MIN_WIDTH,
|
|
151
|
+
maximum: PANE_SCREENSHOT_MAX_EDGE,
|
|
152
|
+
description: "Image width in pixels; the height keeps the pane's proportions.",
|
|
153
|
+
},
|
|
154
|
+
}),
|
|
155
|
+
),
|
|
156
|
+
returnsImage: true,
|
|
157
|
+
},
|
|
116
158
|
op(
|
|
117
159
|
"pane.createFromTemplate",
|
|
118
160
|
"Open a pane from a registered template. It only opens the pane: it adds nothing to a portfolio or watchlist.",
|
|
@@ -151,7 +193,7 @@ export const REMOTE_OPERATIONS: RemoteOperationSchema[] = [
|
|
|
151
193
|
),
|
|
152
194
|
op(
|
|
153
195
|
"ticker.navigate",
|
|
154
|
-
"
|
|
196
|
+
"Show any ticker in the ticker research pane the user is on, or the best available one, as in \"switch to MSFT\".",
|
|
155
197
|
"{ symbol: string, sourcePaneId?: string }",
|
|
156
198
|
"local-write",
|
|
157
199
|
objectSchema({ symbol: requiredStringSchema, sourcePaneId: stringSchema }, ["symbol"]),
|
|
@@ -170,7 +212,8 @@ export const REMOTE_OPERATIONS: RemoteOperationSchema[] = [
|
|
|
170
212
|
),
|
|
171
213
|
op(
|
|
172
214
|
"ticker.select",
|
|
173
|
-
"
|
|
215
|
+
"Move the cursor of a portfolio or watchlist pane to a ticker on its list, so the panes that follow the list show it. "
|
|
216
|
+
+ "To show any ticker in a ticker pane, use ticker.navigate.",
|
|
174
217
|
"{ symbol: string, paneId?: string }",
|
|
175
218
|
"local-write",
|
|
176
219
|
objectSchema({ symbol: requiredStringSchema, paneId: stringSchema }, ["symbol"]),
|
|
@@ -182,6 +225,24 @@ export const REMOTE_OPERATIONS: RemoteOperationSchema[] = [
|
|
|
182
225
|
"local-write",
|
|
183
226
|
objectSchema({ tabId: requiredStringSchema, paneId: stringSchema }, ["tabId"]),
|
|
184
227
|
),
|
|
228
|
+
op(
|
|
229
|
+
"watchlist.add",
|
|
230
|
+
"Add a ticker to one of the person's own watchlists. The app asks them first, naming the list, ticker and exchange. "
|
|
231
|
+
+ "The result says what changed: added, already on the list, or declined. Team watchlists and portfolios are refused.",
|
|
232
|
+
"{ symbol: string, exchange?: string, watchlist?: string }",
|
|
233
|
+
"local-write",
|
|
234
|
+
watchlistChangeInput,
|
|
235
|
+
"user-data",
|
|
236
|
+
),
|
|
237
|
+
op(
|
|
238
|
+
"watchlist.remove",
|
|
239
|
+
"Remove a ticker from one of the person's own watchlists. The app asks them first, naming the list, ticker and exchange. "
|
|
240
|
+
+ "The result says what changed: removed, not on the list, or declined. Team watchlists and portfolios are refused.",
|
|
241
|
+
"{ symbol: string, exchange?: string, watchlist?: string }",
|
|
242
|
+
"local-write",
|
|
243
|
+
watchlistChangeInput,
|
|
244
|
+
"user-data",
|
|
245
|
+
),
|
|
185
246
|
op(
|
|
186
247
|
"layout.switch",
|
|
187
248
|
"Switch active layout by index.",
|
|
@@ -386,6 +447,8 @@ export const REMOTE_AGENT_HELP = {
|
|
|
386
447
|
"While a dialog is open (form.open or form.otherDialogOpen), app.openCommandBar and app.search fail; close a form or confirm with { role: 'form', action: 'cancel' }, and any dialog on top with app.closeDialog.",
|
|
387
448
|
"A form with covered: true has another dialog over it, such as a listing picker or a sign-in; its controls wait until that one is answered or closed with app.closeDialog.",
|
|
388
449
|
"Pane settings open in their own dialog, not as command-bar rows; change one with pane.setSetting, read them from app://pane-settings/{paneId}, and close the dialog with app.closeDialog.",
|
|
450
|
+
"watchlist.add and watchlist.remove wait while the person answers a confirmation in the app and return what changed; with dryRun they return what would change without asking.",
|
|
451
|
+
"pane.screenshot returns the pane's PNG as base64 in image.data, with its pixel size; the terminal (TUI) app answers that it needs the desktop app.",
|
|
389
452
|
"Use ui.invokeMatching only after checking app-level operations; it is intentionally generic and depends on visible semantic controls.",
|
|
390
453
|
],
|
|
391
454
|
};
|
package/src/remote/types.ts
CHANGED
|
@@ -62,6 +62,31 @@ export type RemoteControlRequest =
|
|
|
62
62
|
include?: RemoteStateInclude[];
|
|
63
63
|
};
|
|
64
64
|
|
|
65
|
+
/**
|
|
66
|
+
* What an in-process caller adds to a request. Never read from the request
|
|
67
|
+
* itself, so a client of the local endpoint cannot claim a confirmation.
|
|
68
|
+
*/
|
|
69
|
+
export interface RemoteCallContext {
|
|
70
|
+
/**
|
|
71
|
+
* The `confirmKey` of the change the person already approved in this app
|
|
72
|
+
* for this call, from the operation's dry run (Ask Gloom, the terminal
|
|
73
|
+
* relay). The operation then writes without asking again, and asks anyway
|
|
74
|
+
* when what it would change no longer has that key.
|
|
75
|
+
*/
|
|
76
|
+
confirmed?: string;
|
|
77
|
+
/** The caller gave up: a confirmation the operation opened closes as declined. */
|
|
78
|
+
signal?: AbortSignal;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/** One change the app asks the person to approve before it writes their data. */
|
|
82
|
+
export interface RemoteChangePrompt {
|
|
83
|
+
title: string;
|
|
84
|
+
lines: Array<{ label: string; value: string }>;
|
|
85
|
+
confirmLabel: string;
|
|
86
|
+
/** A change that takes something away. */
|
|
87
|
+
destructive?: boolean;
|
|
88
|
+
}
|
|
89
|
+
|
|
65
90
|
export interface RemoteIncludedState {
|
|
66
91
|
rev: string;
|
|
67
92
|
included: RemoteStateInclude[];
|
|
@@ -151,6 +176,11 @@ export interface RemoteOperationSchema {
|
|
|
151
176
|
writeTier: RemoteWriteTier;
|
|
152
177
|
requiresConfirmation?: boolean;
|
|
153
178
|
dryRun?: boolean;
|
|
179
|
+
/**
|
|
180
|
+
* The result carries a PNG in `image` ({ mimeType, data, width, height,
|
|
181
|
+
* bytes }). Text-only tool channels (Ask Gloom) leave such an operation out.
|
|
182
|
+
*/
|
|
183
|
+
returnsImage?: boolean;
|
|
154
184
|
}
|
|
155
185
|
|
|
156
186
|
/** Stable operation metadata suitable for advertising outside the process. */
|