gloomberb 0.18.2 → 0.18.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -8
- package/README.zh-CN.md +11 -11
- package/bin/{gloomberb → gloom} +3 -1
- package/package.json +6 -2
- package/patches/electrobun@1.18.1.patch +106 -5
- package/src/account/checkout-handoff.tsx +225 -0
- package/src/account/device-signin-dialog.tsx +2 -2
- package/src/account/device-signin.ts +2 -2
- package/src/account/upgrade-dialog.tsx +1 -1
- package/src/api-client/askg.ts +2 -2
- package/src/api-client/auth.ts +2 -2
- package/src/api-client/central-bank-rates.ts +6 -0
- package/src/api-client/collections.ts +5 -1
- package/src/api-client/cot.ts +2 -0
- package/src/api-client/crypto-etf-flows.ts +37 -0
- package/src/api-client/crypto-markets.ts +60 -0
- package/src/api-client/data.ts +99 -5
- package/src/api-client/doe.ts +15 -0
- package/src/api-client/equity-screener.ts +28 -0
- package/src/api-client/exchange-announcements.ts +38 -0
- package/src/api-client/fund-facts.ts +39 -0
- package/src/api-client/futures-curve.ts +9 -1
- package/src/api-client/hiring.ts +301 -0
- package/src/api-client/index.ts +24 -5
- package/src/api-client/market-discovery.ts +14 -0
- package/src/api-client/members.ts +6 -0
- package/src/api-client/mna.ts +6 -0
- package/src/api-client/paths.ts +18 -1
- package/src/api-client/request.ts +26 -7
- package/src/api-client/short-side-publications.ts +37 -0
- package/src/api-client/socket.ts +64 -4
- package/src/api-client/swap-curve.ts +35 -0
- package/src/api-client/telemetry.ts +17 -0
- package/src/api-client/themes.ts +7 -1
- package/src/api-client/types.ts +90 -2
- package/src/app/global-shortcuts.ts +1 -16
- package/src/app/pane-runtime/plugin-bindings.ts +9 -2
- package/src/app/runtime/desktop-deeplink.ts +5 -5
- package/src/app/runtime/plugin-bindings.ts +2 -2
- package/src/app/runtime/startup.ts +13 -0
- package/src/app/runtime/update.ts +28 -8
- package/src/app/star-prompt/status-line.tsx +2 -2
- package/src/architecture/core-builtin-allowlist.json +5 -2
- package/src/architecture/pane-tabs-allowlist.json +65 -0
- package/src/architecture/ui-literals-allowlist.json +3 -3
- package/src/architecture/ui-tokens-allowlist.json +1 -1
- package/src/brokers/broker-portfolio-sync.ts +37 -0
- package/src/brokers/directory.ts +11 -0
- package/src/brokers/logos.ts +3 -1
- package/src/brokers/signed-in/adapter.ts +304 -26
- package/src/brokers/signed-in/client.ts +14 -2
- package/src/brokers/signed-in/connect.ts +10 -2
- package/src/brokers/sync-broker-instance.ts +9 -1
- package/src/capabilities/chart-series.ts +22 -6
- package/src/cli/bank-section.ts +1 -1
- package/src/cli/base-converter.ts +23 -14
- package/src/cli/central-bank-events.ts +1 -1
- package/src/cli/command-options.ts +59 -4
- package/src/cli/commands/api.ts +9 -6
- package/src/cli/commands/broker.ts +2 -2
- package/src/cli/commands/command-utils.ts +2 -2
- package/src/cli/commands/crypto-hints.ts +7 -20
- package/src/cli/commands/fred-series.ts +4 -2
- package/src/cli/commands/keybindings.ts +2 -2
- package/src/cli/commands/market.ts +1189 -296
- package/src/cli/commands/news-hints.ts +2 -2
- package/src/cli/commands/news-search.ts +59 -6
- package/src/cli/commands/options-leaps.ts +41 -26
- package/src/cli/commands/overview.ts +121 -48
- package/src/cli/commands/plugins.ts +9 -9
- package/src/cli/commands/remote.ts +13 -10
- package/src/cli/commands/search.ts +64 -44
- package/src/cli/commands/system.ts +27 -19
- package/src/cli/commands/themes.ts +1 -1
- package/src/cli/commands/ticker.ts +272 -70
- package/src/cli/context.ts +3 -2
- package/src/cli/desktop-pane-shot-view.ts +2 -2
- package/src/cli/desktop-pane-shot.ts +1 -1
- package/src/cli/earnings-calendar.ts +4 -4
- package/src/cli/entry.ts +18 -1
- package/src/cli/errors.ts +20 -2
- package/src/cli/exit-codes.ts +1 -1
- package/src/cli/export-source.ts +10 -4
- package/src/cli/freshness.ts +2 -8
- package/src/cli/fx-forward.ts +130 -0
- package/src/cli/fx-pair.ts +10 -9
- package/src/cli/glossary.ts +64 -20
- package/src/cli/help.ts +20 -14
- package/src/cli/history-export.ts +126 -0
- package/src/cli/history-rows.ts +196 -43
- package/src/cli/index-roots.ts +5 -45
- package/src/cli/index.ts +32 -18
- package/src/cli/issuer-membership.ts +103 -0
- package/src/cli/known-gaps.ts +118 -25
- package/src/cli/listing-arg.ts +315 -43
- package/src/cli/name-entries.ts +73 -22
- package/src/cli/native-smoke.ts +2 -0
- package/src/cli/not-a-ticker.ts +19 -9
- package/src/cli/opentui-libc.ts +5 -0
- package/src/cli/options.ts +12 -0
- package/src/cli/pane-functions/capabilities.ts +77 -20
- package/src/cli/pane-functions/catalog.ts +40 -23
- package/src/cli/pane-functions/discovery.ts +1 -1
- package/src/cli/pane-functions/dom.ts +12 -8
- package/src/cli/pane-functions/financial-ratio-shot.ts +2 -2
- package/src/cli/pane-functions/freshness.ts +174 -23
- package/src/cli/pane-functions/function-help.ts +66 -27
- package/src/cli/pane-functions/headless.ts +48 -16
- package/src/cli/pane-functions/index.ts +82 -21
- package/src/cli/pane-functions/options.ts +22 -2
- package/src/cli/pane-functions/report-notices.ts +12 -4
- package/src/cli/pane-functions/report.ts +5 -5
- package/src/cli/pane-functions/resolver.ts +65 -14
- package/src/cli/pane-functions/screenshot-assessment.ts +322 -0
- package/src/cli/pane-functions/screenshot-bridge.ts +152 -0
- package/src/cli/pane-functions/screenshot-chart-evidence.ts +396 -0
- package/src/cli/pane-functions/screenshot-data-evidence.ts +383 -0
- package/src/cli/pane-functions/screenshot-evidence.ts +1 -1
- package/src/cli/pane-functions/screenshot-payload.ts +453 -0
- package/src/cli/pane-functions/screenshot-render.ts +316 -0
- package/src/cli/pane-functions/screenshot-types.ts +162 -0
- package/src/cli/pane-functions/shot-options.ts +8 -3
- package/src/cli/peso-dollar-rates.ts +79 -0
- package/src/cli/quote-answer.ts +38 -3
- package/src/cli/report-tables.ts +190 -27
- package/src/cli/restore-plugins.ts +29 -14
- package/src/cli/result.ts +122 -25
- package/src/cli/series-search.ts +5 -5
- package/src/cli/statement-filings.ts +19 -0
- package/src/cli/suffixed-listing-rows.ts +49 -0
- package/src/cli/symbol-args.ts +50 -15
- package/src/cli/symbol-cells.ts +120 -0
- package/src/cli/symbol-list.ts +226 -60
- package/src/cli/symbol-rows.ts +131 -25
- package/src/cli/ticker-resolution.ts +108 -11
- package/src/cli/treasury-yields.ts +5 -5
- package/src/cli/types.ts +2 -0
- package/src/cli/uncovered-instrument.ts +3 -3
- package/src/cli/unknown-command.ts +6 -6
- package/src/components/chart/composite/chart-layout.ts +131 -0
- package/src/components/chart/composite/composite-chart.tsx +387 -21
- package/src/components/chart/composite/drawing-store.ts +26 -6
- package/src/components/chart/composite/interactions.ts +9 -3
- package/src/components/chart/composite/legend.tsx +75 -3
- package/src/components/chart/composite/levels.ts +5 -0
- package/src/components/chart/composite/panel-gestures.ts +41 -0
- package/src/components/chart/composite/panel-labels.ts +2 -1
- package/src/components/chart/composite/panel-surface.tsx +316 -11
- package/src/components/chart/composite/price-axis-labels.tsx +27 -3
- package/src/components/chart/composite/rasterizer.ts +44 -19
- package/src/components/chart/composite/scene.ts +16 -4
- package/src/components/chart/composite/text-renderer.ts +48 -21
- package/src/components/chart/composite/toolbar.tsx +52 -5
- package/src/components/chart/composite/types.ts +19 -0
- package/src/components/chart/composite/use-composite-chart-keyboard.ts +120 -13
- package/src/components/chart/composite/use-composite-value-scales.ts +44 -0
- package/src/components/chart/composite/use-composite-viewport.ts +12 -3
- package/src/components/chart/composite/value-scale.ts +149 -0
- package/src/components/chart/composite/volume-profile-paint.ts +6 -3
- package/src/components/chart/core/pointer.ts +2 -0
- package/src/components/chart-table/index.ts +2 -0
- package/src/components/chart-table/read.tsx +74 -0
- package/src/components/command-bar/commands/collection-list.ts +41 -19
- package/src/components/command-bar/commands/collection.ts +9 -3
- package/src/components/command-bar/commands/direct/index.ts +1 -1
- package/src/components/command-bar/commands/direct/runtime.ts +3 -2
- package/src/components/command-bar/pane-templates/items.ts +59 -6
- package/src/components/command-bar/pane-templates/workflow.ts +10 -1
- package/src/components/command-bar/routes/root/command-items.ts +32 -6
- package/src/components/command-bar/routes/root/plugin-install.ts +1 -1
- package/src/components/command-bar/routes/root/provider-search.ts +42 -11
- package/src/components/command-bar/routes/root/results.ts +18 -4
- package/src/components/command-bar/routes/root/runtime.ts +15 -3
- package/src/components/command-bar/routes/root/search-providers.ts +25 -2
- package/src/components/command-bar/routes/root/selection.ts +6 -1
- package/src/components/command-bar/routes/root/shortcut-feedback.ts +4 -1
- package/src/components/command-bar/routes/root/shortcuts.ts +30 -3
- package/src/components/command-bar/routes/ticker-search/results.ts +73 -4
- package/src/components/command-bar/selection-runtime.ts +50 -10
- package/src/components/command-bar/surface/index.tsx +24 -2
- package/src/components/command-bar/view-model.ts +7 -0
- package/src/components/command-bar/workflow/broker.ts +2 -2
- package/src/components/command-bar/workflow/collection-actions.ts +46 -7
- package/src/components/command-bar/workflow/collection-ticker.ts +32 -4
- package/src/components/command-bar/workflow/fields.ts +8 -2
- package/src/components/command-bar/workflow/ops.ts +18 -4
- package/src/components/command-bar/workflow/portfolio-position.ts +53 -4
- package/src/components/command-bar/workflow/submit.ts +3 -2
- package/src/components/command-bar/workflow/tickers.ts +5 -1
- package/src/components/company-logo.tsx +39 -0
- package/src/components/data-table/sections.ts +4 -2
- package/src/components/data-table/view.tsx +23 -3
- package/src/components/form-modal/confirm.tsx +2 -1
- package/src/components/form-modal/request.ts +5 -0
- package/src/components/form-modal/routes.ts +4 -1
- package/src/components/index.ts +13 -6
- package/src/components/layout/detached-pane-shell.tsx +1 -0
- package/src/components/layout/floating-pane.tsx +1 -0
- package/src/components/layout/header.tsx +234 -60
- package/src/components/layout/market-summary.ts +9 -6
- package/src/components/layout/pane/capture-status.ts +1 -1
- package/src/components/layout/pane/footer/model.ts +11 -5
- package/src/components/layout/pane/header.tsx +10 -3
- package/src/components/layout/pane/index.tsx +1 -0
- package/src/components/layout/pane/pane-tabs.tsx +9 -1
- package/src/components/layout/shell/chrome.ts +19 -6
- package/src/components/layout/shell/index.tsx +2 -1
- package/src/components/layout/shell/pane/layers.tsx +19 -1
- package/src/components/layout/status-bar.tsx +2 -2
- package/src/components/market-board/index.tsx +11 -3
- package/src/components/onboarding/onboarding-wizard.tsx +1 -0
- package/src/components/onboarding/portfolio-step/broker-setup-panel.tsx +2 -2
- package/src/components/onboarding/wizard-broker-sync.ts +4 -1
- package/src/components/pane-settings-dialog/desktop.tsx +20 -7
- package/src/components/pane-settings-dialog/tui.tsx +17 -9
- package/src/components/pane-settings-dialog/value.ts +8 -1
- package/src/components/pane-settings-dialog.tsx +44 -13
- package/src/components/sign-in-code-panel.tsx +27 -19
- package/src/components/ui/column-grid.tsx +48 -4
- package/src/components/ui/country-flag-art.tsx +180 -0
- package/src/components/ui/country-flag.tsx +118 -12
- package/src/components/ui/data-table/opentui/index.tsx +61 -2
- package/src/components/ui/data-table/opentui/model.ts +109 -2
- package/src/components/ui/data-table/types.ts +1 -1
- package/src/components/ui/display.tsx +5 -1
- package/src/components/ui/index.ts +3 -1
- package/src/components/ui/logo-mark.tsx +11 -2
- package/src/components/ui/query-bar.tsx +1 -1
- package/src/components/ui/row-notes.ts +79 -0
- package/src/components/ui/stat-grid.tsx +28 -3
- package/src/components/ui/status.tsx +3 -1
- package/src/core/app-services.ts +4 -0
- package/src/core/state/app/layout.ts +4 -4
- package/src/data/cached-query.ts +8 -1
- package/src/data/config/chart-settings.ts +3 -3
- package/src/data/config/home.ts +10 -2
- package/src/data/config/layout.ts +4 -1
- package/src/data/config/store/node.ts +4 -0
- package/src/data/config/store/normalize.ts +13 -3
- package/src/data/config/store/portfolio-as-of-column.ts +2 -2
- package/src/data/json-storage.ts +2 -0
- package/src/data/saved-copies.ts +84 -0
- package/src/docs/snapshot.json +65 -32
- package/src/i18n/es.ts +51 -12
- package/src/i18n/ja.ts +51 -12
- package/src/i18n/ko.ts +51 -12
- package/src/i18n/zh-cn.ts +51 -12
- package/src/i18n/zh-tw.ts +51 -12
- package/src/layout/desks.ts +1 -1
- package/src/layout/launch-layout.ts +1 -1
- package/src/layout/pane-manager/floating-actions.ts +5 -3
- package/src/layout/pane-manager/floating.ts +43 -1
- package/src/layout/pane-manager/index.ts +2 -0
- package/src/layout/selected-ticker.ts +74 -0
- package/src/market-data/depositary-pair.ts +251 -0
- package/src/market-data/futures-board.ts +1 -1
- package/src/market-data/futures-contract.ts +124 -40
- package/src/market-data/fx-closes.ts +17 -2
- package/src/market-data/hooks.tsx +19 -11
- package/src/market-data/market/change-basis.ts +49 -7
- package/src/market-data/market/freshness.ts +34 -5
- package/src/market-data/market/period-return.ts +163 -0
- package/src/market-data/market/trading-sessions.ts +13 -0
- package/src/market-data/market/year-to-date.ts +8 -13
- package/src/market-data/performance.ts +20 -14
- package/src/market-data/perpetual-premium.ts +32 -0
- package/src/market-data/published-apac-sessions.ts +2 -1
- package/src/market-data/published-futures-sessions.ts +69 -0
- package/src/market-data/quotes/contributions.ts +5 -1
- package/src/market-data/quotes/freshness.ts +42 -0
- package/src/market-data/quotes/intraday-bar.ts +37 -0
- package/src/market-data/quotes/regular-session-valuation.ts +13 -8
- package/src/market-data/quotes/resolution.ts +4 -2
- package/src/market-data/tax-equivalent.ts +1 -1
- package/src/market-data/ticker-price-returns.ts +3 -1
- package/src/news/aggregator.ts +5 -1
- package/src/news/news-model.ts +4 -0
- package/src/news/types.ts +11 -0
- package/src/notifications/app-notifier.ts +1 -1
- package/src/plugins/auto-update.ts +2 -2
- package/src/plugins/builtin/account-management/index.tsx +1 -0
- package/src/plugins/builtin/account-management/pane.tsx +9 -8
- package/src/plugins/builtin/alerts/alert-engine.ts +30 -18
- package/src/plugins/builtin/alerts/calendar-events.ts +378 -0
- package/src/plugins/builtin/alerts/cli.ts +485 -76
- package/src/plugins/builtin/alerts/command.ts +5 -10
- package/src/plugins/builtin/alerts/event-rows.ts +9 -5
- package/src/plugins/builtin/alerts/events-pane.tsx +71 -56
- package/src/plugins/builtin/alerts/events.ts +108 -5
- package/src/plugins/builtin/alerts/fired-log.ts +78 -0
- package/src/plugins/builtin/alerts/format.ts +2 -1
- package/src/plugins/builtin/alerts/headless.ts +100 -39
- package/src/plugins/builtin/alerts/history-pane.tsx +105 -62
- package/src/plugins/builtin/alerts/history-rows.ts +89 -0
- package/src/plugins/builtin/alerts/index.tsx +45 -18
- package/src/plugins/builtin/alerts/iv-level.ts +365 -0
- package/src/plugins/builtin/alerts/levels.ts +3 -3
- package/src/plugins/builtin/alerts/pane.tsx +97 -29
- package/src/plugins/builtin/alerts/price.ts +35 -0
- package/src/plugins/builtin/alerts/quotes.ts +24 -0
- package/src/plugins/builtin/alerts/research-builder.ts +84 -11
- package/src/plugins/builtin/alerts/research-rules.ts +77 -3
- package/src/plugins/builtin/alerts/scheduled-check.ts +206 -32
- package/src/plugins/builtin/alerts/scheduled-sources.ts +26 -3
- package/src/plugins/builtin/alerts/scheduled.ts +188 -29
- package/src/plugins/builtin/alerts/storage.ts +13 -10
- package/src/plugins/builtin/alerts/targets.ts +12 -3
- package/src/plugins/builtin/analytics/index.tsx +8 -2
- package/src/plugins/builtin/analytics/metrics.ts +1 -1
- package/src/plugins/builtin/analytics/risk-book.ts +215 -0
- package/src/plugins/builtin/analytics/risk-client.ts +13 -6
- package/src/plugins/builtin/analytics/risk-headless.ts +55 -21
- package/src/plugins/builtin/analytics/risk-math.ts +6 -3
- package/src/plugins/builtin/analytics/risk-model.ts +297 -104
- package/src/plugins/builtin/analytics/risk-options.ts +17 -2
- package/src/plugins/builtin/analytics/risk-pane.tsx +107 -43
- package/src/plugins/builtin/attention/pane.tsx +22 -16
- package/src/plugins/builtin/awards/headless.ts +7 -3
- package/src/plugins/builtin/awards/model.ts +18 -0
- package/src/plugins/builtin/awards/pane.tsx +12 -9
- package/src/plugins/builtin/backtest/export.ts +1 -1
- package/src/plugins/builtin/backtest/headless.ts +3 -3
- package/src/plugins/builtin/backtest/rules.ts +41 -5
- package/src/plugins/builtin/broker-manager/add-flow.tsx +12 -7
- package/src/plugins/builtin/broker-manager/detail.tsx +47 -19
- package/src/plugins/builtin/broker-manager/footer.ts +27 -11
- package/src/plugins/builtin/broker-manager/index.tsx +21 -12
- package/src/plugins/builtin/broker-manager/keyboard.ts +1 -1
- package/src/plugins/builtin/broker-manager/model.ts +12 -2
- package/src/plugins/builtin/broker-manager/pane-actions.tsx +183 -57
- package/src/plugins/builtin/broker-manager/table.ts +28 -12
- package/src/plugins/builtin/broker-trading/account-picker.tsx +2 -1
- package/src/plugins/builtin/broker-trading/chart-levels.ts +82 -13
- package/src/plugins/builtin/broker-trading/controller.ts +45 -13
- package/src/plugins/builtin/broker-trading/dock.tsx +24 -4
- package/src/plugins/builtin/broker-trading/headless.ts +2 -1
- package/src/plugins/builtin/broker-trading/index.tsx +7 -1
- package/src/plugins/builtin/broker-trading/linked-orders.ts +148 -0
- package/src/plugins/builtin/broker-trading/order-feed.ts +75 -7
- package/src/plugins/builtin/broker-trading/orders.tsx +109 -31
- package/src/plugins/builtin/broker-trading/overview-orders.tsx +9 -3
- package/src/plugins/builtin/broker-trading/pane-model.ts +30 -2
- package/src/plugins/builtin/broker-trading/pane.tsx +115 -26
- package/src/plugins/builtin/broker-trading/ticket-parts.tsx +36 -7
- package/src/plugins/builtin/broker-trading/ticket.tsx +122 -36
- package/src/plugins/builtin/buildout/cells.tsx +4 -0
- package/src/plugins/builtin/buildout/detail/index.tsx +5 -1
- package/src/plugins/builtin/buildout/detail/ui.tsx +7 -4
- package/src/plugins/builtin/buildout/pane/index.tsx +34 -18
- package/src/plugins/builtin/buildout/pane/status.tsx +0 -4
- package/src/plugins/builtin/builtin-plugin-meta.ts +1 -1
- package/src/plugins/builtin/catalysts/client.ts +2 -2
- package/src/plugins/builtin/catalysts/detail.tsx +3 -2
- package/src/plugins/builtin/catalysts/index.tsx +1 -1
- package/src/plugins/builtin/catalysts/model.ts +49 -4
- package/src/plugins/builtin/catalysts/pane.tsx +9 -11
- package/src/plugins/builtin/central-bank-rates/client.ts +5 -0
- package/src/plugins/builtin/central-bank-rates/headless.ts +36 -10
- package/src/plugins/builtin/central-bank-rates/model.ts +33 -8
- package/src/plugins/builtin/changelog/index.tsx +1 -0
- package/src/plugins/builtin/chart-composer/catalog-inventory.ts +1 -0
- package/src/plugins/builtin/chart-composer/chart-spec-edit.ts +2 -1
- package/src/plugins/builtin/chart-composer/chart-spec.ts +7 -0
- package/src/plugins/builtin/chart-composer/cli-options.ts +2 -5
- package/src/plugins/builtin/chart-composer/data-catalog-pane.tsx +2 -1
- package/src/plugins/builtin/chart-composer/editor/controller.ts +2 -0
- package/src/plugins/builtin/chart-composer/editor.tsx +4 -1
- package/src/plugins/builtin/chart-composer/headless-schema.ts +28 -26
- package/src/plugins/builtin/chart-composer/headless.ts +253 -35
- package/src/plugins/builtin/chart-composer/index.tsx +12 -2
- package/src/plugins/builtin/chart-composer/leverage-overlay.ts +142 -0
- package/src/plugins/builtin/chart-composer/pane.tsx +128 -28
- package/src/plugins/builtin/chart-composer/series-catalog.ts +1 -0
- package/src/plugins/builtin/chart-composer/series-expression.ts +65 -6
- package/src/plugins/builtin/chart-composer/session-history.ts +15 -21
- package/src/plugins/builtin/chart-composer/session-range.ts +4 -2
- package/src/plugins/builtin/chart-composer/settings.ts +31 -19
- package/src/plugins/builtin/chart-composer/use-series-catalog.ts +5 -6
- package/src/plugins/builtin/chart-composer/viewport-labels.ts +18 -8
- package/src/plugins/builtin/chat/attachments/model.ts +3 -1
- package/src/plugins/builtin/chat/content/index.tsx +1 -1
- package/src/plugins/builtin/chat/pane-links/open.ts +1 -1
- package/src/plugins/builtin/chat/people.ts +1 -1
- package/src/plugins/builtin/clinical-trials/client.ts +5 -2
- package/src/plugins/builtin/clinical-trials/model.ts +13 -4
- package/src/plugins/builtin/clinical-trials/pane.tsx +32 -12
- package/src/plugins/builtin/clinical-trials/ticker-sponsor.ts +17 -0
- package/src/plugins/builtin/cloud/askg/controller.ts +1 -1
- package/src/plugins/builtin/cloud/askg/lock-note.ts +1 -1
- package/src/plugins/builtin/cloud/askg/tool-display.ts +1 -1
- package/src/plugins/builtin/cloud/auth-commands.ts +3 -3
- package/src/plugins/builtin/cloud/team/pane-sections.tsx +105 -47
- package/src/plugins/builtin/cloud/team/pane-ui.tsx +42 -4
- package/src/plugins/builtin/cloud/team/pane.tsx +204 -64
- package/src/plugins/builtin/cloud/thesis/store.ts +45 -22
- package/src/plugins/builtin/cloud-tweets/registration.ts +1 -0
- package/src/plugins/builtin/commodities-energy/index.tsx +29 -2
- package/src/plugins/builtin/commodities-energy/view-state.ts +2 -0
- package/src/plugins/builtin/commodity-balances/pane.tsx +14 -8
- package/src/plugins/builtin/company-attention/app-rank.tsx +11 -10
- package/src/plugins/builtin/company-attention/building-model.ts +222 -0
- package/src/plugins/builtin/company-attention/building.tsx +172 -0
- package/src/plugins/builtin/company-attention/client.ts +117 -1
- package/src/plugins/builtin/company-attention/evidence.ts +16 -3
- package/src/plugins/builtin/company-attention/headless.ts +101 -5
- package/src/plugins/builtin/company-attention/index.tsx +6 -3
- package/src/plugins/builtin/company-attention/model.ts +33 -7
- package/src/plugins/builtin/company-attention/moves-model.ts +253 -0
- package/src/plugins/builtin/company-attention/moves.tsx +159 -0
- package/src/plugins/builtin/company-attention/pane.tsx +89 -31
- package/src/plugins/builtin/company-attention/signals-model.ts +229 -0
- package/src/plugins/builtin/company-attention/signals.tsx +160 -0
- package/src/plugins/builtin/company-kpis/headless.ts +3 -2
- package/src/plugins/builtin/company-kpis/model.ts +2 -2
- package/src/plugins/builtin/company-kpis/pane.tsx +5 -4
- package/src/plugins/builtin/composite-plugins.ts +2 -1
- package/src/plugins/builtin/congress-trades/headless.ts +1 -1
- package/src/plugins/builtin/connections/index.ts +1 -0
- package/src/plugins/builtin/correlation/headless-schema.ts +3 -2
- package/src/plugins/builtin/correlation/headless.ts +7 -4
- package/src/plugins/builtin/correlation/relationship/model.ts +1 -0
- package/src/plugins/builtin/correlation/settings.ts +1 -0
- package/src/plugins/builtin/cot/headless.ts +28 -6
- package/src/plugins/builtin/cot/model.ts +12 -0
- package/src/plugins/builtin/cot/pane.tsx +7 -5
- package/src/plugins/builtin/cpi/headless.ts +5 -1
- package/src/plugins/builtin/cpi/pane.tsx +11 -9
- package/src/plugins/builtin/credit-boards/model.ts +2 -0
- package/src/plugins/builtin/credit-documents/headless.ts +1 -1
- package/src/plugins/builtin/credit-documents/pane.tsx +8 -7
- package/src/plugins/builtin/crypto-board/client.ts +86 -0
- package/src/plugins/builtin/crypto-board/defi-view.tsx +218 -0
- package/src/plugins/builtin/crypto-board/defi.ts +239 -0
- package/src/plugins/builtin/crypto-board/headless.ts +117 -6
- package/src/plugins/builtin/crypto-board/index.tsx +8 -3
- package/src/plugins/builtin/crypto-board/model.ts +40 -8
- package/src/plugins/builtin/crypto-board/pane.tsx +55 -21
- package/src/plugins/builtin/crypto-board/series.ts +19 -1
- package/src/plugins/builtin/crypto-etf-flows/client.ts +60 -0
- package/src/plugins/builtin/crypto-etf-flows/headless.ts +132 -0
- package/src/plugins/builtin/crypto-etf-flows/index.tsx +44 -0
- package/src/plugins/builtin/crypto-etf-flows/model.ts +121 -0
- package/src/plugins/builtin/crypto-etf-flows/pane.tsx +193 -0
- package/src/plugins/builtin/debt-maturities/pane.tsx +4 -3
- package/src/plugins/builtin/debug/index.tsx +1 -0
- package/src/plugins/builtin/dividend-yield/index.tsx +1 -1
- package/src/plugins/builtin/docs/index.tsx +1 -1
- package/src/plugins/builtin/docs/pane.tsx +2 -2
- package/src/plugins/builtin/docs/targets.ts +1 -1
- package/src/plugins/builtin/doe/client.ts +5 -1
- package/src/plugins/builtin/doe/headless.ts +12 -6
- package/src/plugins/builtin/doe/model.ts +43 -6
- package/src/plugins/builtin/doe/pane.tsx +19 -12
- package/src/plugins/builtin/earnings/board-model.ts +13 -6
- package/src/plugins/builtin/earnings/board-table.ts +4 -1
- package/src/plugins/builtin/earnings/board.tsx +253 -50
- package/src/plugins/builtin/earnings/calendar-model.ts +188 -0
- package/src/plugins/builtin/earnings/calendar.tsx +338 -0
- package/src/plugins/builtin/earnings/client.ts +4 -3
- package/src/plugins/builtin/earnings/headless.ts +53 -15
- package/src/plugins/builtin/earnings/history-model.ts +53 -36
- package/src/plugins/builtin/earnings/index.tsx +15 -22
- package/src/plugins/builtin/earnings/model.ts +17 -12
- package/src/plugins/builtin/earnings/scope.ts +89 -0
- package/src/plugins/builtin/earnings-calls/calendar.tsx +310 -0
- package/src/plugins/builtin/earnings-calls/data.ts +146 -2
- package/src/plugins/builtin/earnings-calls/headless.ts +151 -9
- package/src/plugins/builtin/earnings-calls/index.tsx +3 -3
- package/src/plugins/builtin/earnings-calls/lock-note.ts +1 -1
- package/src/plugins/builtin/earnings-calls/pane.tsx +149 -31
- package/src/plugins/builtin/earnings-calls/upcoming.ts +195 -0
- package/src/plugins/builtin/earnings-ripple/pane.tsx +10 -5
- package/src/plugins/builtin/econ/calendar-model.ts +132 -20
- package/src/plugins/builtin/econ/detail-view.tsx +48 -10
- package/src/plugins/builtin/econ/fred-catalog.ts +23 -6
- package/src/plugins/builtin/econ/fred-series-map.ts +4 -0
- package/src/plugins/builtin/econ/index.tsx +112 -25
- package/src/plugins/builtin/econ/print-watch.ts +2 -1
- package/src/plugins/builtin/econ/types.ts +32 -1
- package/src/plugins/builtin/econ-statistics/client.ts +16 -3
- package/src/plugins/builtin/econ-statistics/defs.ts +4 -0
- package/src/plugins/builtin/econ-statistics/detail.tsx +2 -2
- package/src/plugins/builtin/econ-statistics/headless.ts +13 -2
- package/src/plugins/builtin/econ-statistics/index.tsx +3 -3
- package/src/plugins/builtin/econ-statistics/pane.tsx +2 -1
- package/src/plugins/builtin/econ-statistics/stats.ts +103 -0
- package/src/plugins/builtin/econ-statistics/view.ts +16 -1
- package/src/plugins/builtin/equity-screener/client.ts +21 -3
- package/src/plugins/builtin/equity-screener/headless.ts +77 -5
- package/src/plugins/builtin/equity-screener/live.ts +1 -1
- package/src/plugins/builtin/equity-screener/model.ts +34 -0
- package/src/plugins/builtin/equity-screener/pane.tsx +148 -106
- package/src/plugins/builtin/equity-screener/screen-check.ts +90 -0
- package/src/plugins/builtin/equity-screener/ticker-check.tsx +148 -0
- package/src/plugins/builtin/estimate-revisions/headless.ts +3 -1
- package/src/plugins/builtin/estimate-revisions/lock-note.ts +3 -3
- package/src/plugins/builtin/estimate-revisions/model.ts +8 -10
- package/src/plugins/builtin/exposure/headless.ts +51 -6
- package/src/plugins/builtin/exposure/index.tsx +28 -2
- package/src/plugins/builtin/exposure/model.ts +7 -0
- package/src/plugins/builtin/exposure/pane.tsx +16 -10
- package/src/plugins/builtin/fear-greed/index.tsx +1 -1
- package/src/plugins/builtin/filing-events/index.tsx +1 -1
- package/src/plugins/builtin/futures/model.ts +10 -9
- package/src/plugins/builtin/futures/returns.ts +8 -36
- package/src/plugins/builtin/futures/table.tsx +1 -1
- package/src/plugins/builtin/futures-curve/client.ts +40 -9
- package/src/plugins/builtin/futures-curve/headless.ts +39 -17
- package/src/plugins/builtin/futures-curve/model.ts +258 -69
- package/src/plugins/builtin/futures-curve/pane.tsx +46 -17
- package/src/plugins/builtin/fx-matrix/client.ts +15 -8
- package/src/plugins/builtin/fx-matrix/headless.ts +32 -14
- package/src/plugins/builtin/fx-matrix/index.tsx +13 -11
- package/src/plugins/builtin/fx-matrix/live-legs.ts +22 -0
- package/src/plugins/builtin/fx-matrix/settings.ts +2 -1
- package/src/plugins/builtin/gpu/board.tsx +4 -1
- package/src/plugins/builtin/gpu/changes.tsx +10 -10
- package/src/plugins/builtin/gpu/equities.tsx +4 -1
- package/src/plugins/builtin/gpu/headless.ts +9 -4
- package/src/plugins/builtin/gpu/history.tsx +4 -2
- package/src/plugins/builtin/gpu/pane.tsx +5 -3
- package/src/plugins/builtin/help/index.tsx +13 -3
- package/src/plugins/builtin/holders/beneficial-model.ts +8 -11
- package/src/plugins/builtin/holders/beneficial-report.ts +6 -5
- package/src/plugins/builtin/holders/beneficial-view.tsx +7 -3
- package/src/plugins/builtin/holders/client.ts +15 -2
- package/src/plugins/builtin/holders/format.ts +28 -17
- package/src/plugins/builtin/holders/headless.ts +48 -8
- package/src/plugins/builtin/holders/index-holders.ts +264 -0
- package/src/plugins/builtin/holders/pane.tsx +79 -15
- package/src/plugins/builtin/holders/report-rows.ts +35 -7
- package/src/plugins/builtin/holders/table-model.ts +2 -1
- package/src/plugins/builtin/holders/thirteenf-match.ts +3 -1
- package/src/plugins/builtin/holders/treemap.tsx +2 -2
- package/src/plugins/builtin/insider/base-values.ts +11 -7
- package/src/plugins/builtin/insider/client.ts +3 -0
- package/src/plugins/builtin/insider/headless.ts +20 -7
- package/src/plugins/builtin/insider/index.tsx +17 -8
- package/src/plugins/builtin/insider/issuer.ts +34 -4
- package/src/plugins/builtin/insider/signals-client.ts +3 -3
- package/src/plugins/builtin/insider/signals.tsx +1 -1
- package/src/plugins/builtin/insider/table-model.ts +35 -13
- package/src/plugins/builtin/insider/table.tsx +5 -2
- package/src/plugins/builtin/ipo-calendar/pane.tsx +7 -4
- package/src/plugins/builtin/iv-history/client.ts +20 -0
- package/src/plugins/builtin/iv-history/events.ts +145 -0
- package/src/plugins/builtin/iv-history/format.ts +3 -0
- package/src/plugins/builtin/iv-history/headless.ts +91 -7
- package/src/plugins/builtin/iv-history/index.tsx +1 -1
- package/src/plugins/builtin/iv-history/model.ts +13 -4
- package/src/plugins/builtin/iv-history/series.ts +3 -1
- package/src/plugins/builtin/jobs/lock-note.ts +1 -1
- package/src/plugins/builtin/jobs/model.ts +4 -15
- package/src/plugins/builtin/jobs/pane.tsx +7 -5
- package/src/plugins/builtin/jobs/share-bars.tsx +11 -5
- package/src/plugins/builtin/jodi/pane.tsx +14 -8
- package/src/plugins/builtin/layout-manager/index.tsx +1 -0
- package/src/plugins/builtin/macro-day/headless.ts +20 -7
- package/src/plugins/builtin/macro-day/index.tsx +3 -2
- package/src/plugins/builtin/macro-day/model.ts +29 -8
- package/src/plugins/builtin/macro-day/pane.tsx +46 -10
- package/src/plugins/builtin/macro-day/releases.ts +55 -13
- package/src/plugins/builtin/market-heatmap/data.ts +9 -2
- package/src/plugins/builtin/market-heatmap/evidence.ts +1 -1
- package/src/plugins/builtin/market-heatmap/headless.ts +9 -6
- package/src/plugins/builtin/market-heatmap/index.tsx +3 -3
- package/src/plugins/builtin/market-heatmap/model.ts +10 -7
- package/src/plugins/builtin/market-movers/client.ts +36 -21
- package/src/plugins/builtin/market-movers/headless.ts +8 -2
- package/src/plugins/builtin/market-movers/index.tsx +16 -10
- package/src/plugins/builtin/market-movers/screener.ts +33 -11
- package/src/plugins/builtin/market-movers/session-body.tsx +4 -2
- package/src/plugins/builtin/market-movers/session-table.ts +4 -2
- package/src/plugins/builtin/market-movers/table.ts +4 -1
- package/src/plugins/builtin/market-valuation/headless.ts +2 -0
- package/src/plugins/builtin/market-valuation/view.ts +5 -0
- package/src/plugins/builtin/members/headless.ts +6 -5
- package/src/plugins/builtin/members/pane.tsx +11 -4
- package/src/plugins/builtin/mna/client.ts +1 -0
- package/src/plugins/builtin/mna/detail.tsx +20 -32
- package/src/plugins/builtin/mna/distress/detail.tsx +16 -4
- package/src/plugins/builtin/mna/distress/model.ts +3 -2
- package/src/plugins/builtin/mna/distress/pane.tsx +7 -4
- package/src/plugins/builtin/mna/headless.ts +6 -13
- package/src/plugins/builtin/mna/model.ts +93 -15
- package/src/plugins/builtin/mna/pane.tsx +5 -4
- package/src/plugins/builtin/news/headless.ts +12 -6
- package/src/plugins/builtin/news/index.tsx +10 -1
- package/src/plugins/builtin/news/wire/index.tsx +3 -2
- package/src/plugins/builtin/news/wire/news/command-bar-search.ts +26 -10
- package/src/plugins/builtin/news/wire/news/query-presets.ts +6 -2
- package/src/plugins/builtin/news/wire/rss/cli.ts +3 -3
- package/src/plugins/builtin/notes/cli.ts +50 -15
- package/src/plugins/builtin/notes/export.ts +17 -6
- package/src/plugins/builtin/notes/files.ts +16 -5
- package/src/plugins/builtin/openfda/pane.tsx +1 -1
- package/src/plugins/builtin/options/carry.ts +2 -2
- package/src/plugins/builtin/options/enrichment-model.ts +10 -9
- package/src/plugins/builtin/options/index.tsx +1 -1
- package/src/plugins/builtin/options/model-spot.ts +70 -4
- package/src/plugins/builtin/options/view.tsx +51 -23
- package/src/plugins/builtin/options-calculator/headless.ts +46 -7
- package/src/plugins/builtin/options-calculator/pane.tsx +3 -2
- package/src/plugins/builtin/options-positioning/headless.ts +11 -3
- package/src/plugins/builtin/options-positioning/model.ts +24 -0
- package/src/plugins/builtin/options-positioning/pane.tsx +10 -12
- package/src/plugins/builtin/options-scenario/client.ts +142 -29
- package/src/plugins/builtin/options-scenario/collar.ts +8 -6
- package/src/plugins/builtin/options-scenario/csp-screen-headless.ts +127 -0
- package/src/plugins/builtin/options-scenario/csp-screen-pane.tsx +165 -0
- package/src/plugins/builtin/options-scenario/csp-screen.ts +258 -0
- package/src/plugins/builtin/options-scenario/csp.ts +101 -21
- package/src/plugins/builtin/options-scenario/headless.ts +49 -21
- package/src/plugins/builtin/options-scenario/hedge.ts +20 -14
- package/src/plugins/builtin/options-scenario/index.tsx +28 -3
- package/src/plugins/builtin/options-scenario/model.ts +13 -0
- package/src/plugins/builtin/options-scenario/pane.tsx +22 -10
- package/src/plugins/builtin/perps/equity-row.tsx +11 -3
- package/src/plugins/builtin/perps/freshness.ts +8 -5
- package/src/plugins/builtin/perps/headless.ts +3 -1
- package/src/plugins/builtin/perps/list-perpetuals.ts +25 -4
- package/src/plugins/builtin/perps/live-rows.ts +161 -0
- package/src/plugins/builtin/perps/markets-section.tsx +154 -0
- package/src/plugins/builtin/perps/pane.tsx +36 -17
- package/src/plugins/builtin/perps/venue-markets.ts +96 -0
- package/src/plugins/builtin/plugin-marketplace/index.tsx +2 -1
- package/src/plugins/builtin/plugin-marketplace/pane.tsx +145 -60
- package/src/plugins/builtin/portfolio-list/cli/bulk-symbols.ts +78 -27
- package/src/plugins/builtin/portfolio-list/cli/portfolio-command.ts +158 -141
- package/src/plugins/builtin/portfolio-list/cli/render.ts +49 -20
- package/src/plugins/builtin/portfolio-list/cli/shared.ts +3 -3
- package/src/plugins/builtin/portfolio-list/cli/watchlist-command.ts +29 -24
- package/src/plugins/builtin/portfolio-list/headless.ts +6 -3
- package/src/plugins/builtin/portfolio-list/income.ts +13 -2
- package/src/plugins/builtin/portfolio-list/index.tsx +9 -2
- package/src/plugins/builtin/portfolio-list/pane/index.tsx +21 -8
- package/src/plugins/builtin/portfolio-list/pane/purchase-date-fx.ts +46 -0
- package/src/plugins/builtin/portfolio-list/summary/live-accounts.ts +16 -9
- package/src/plugins/builtin/portfolio-list/summary/totals.ts +2 -15
- package/src/plugins/builtin/power/client.ts +6 -3
- package/src/plugins/builtin/power/evidence.ts +22 -7
- package/src/plugins/builtin/power/gas.tsx +5 -1
- package/src/plugins/builtin/power/pane.tsx +44 -32
- package/src/plugins/builtin/power/prices.tsx +10 -3
- package/src/plugins/builtin/research/analyst-headless.ts +25 -8
- package/src/plugins/builtin/research/analyst-model.ts +68 -3
- package/src/plugins/builtin/research/corporate-actions-pane.tsx +63 -14
- package/src/plugins/builtin/research/event-model.ts +3 -1
- package/src/plugins/builtin/research/event-sources.ts +12 -4
- package/src/plugins/builtin/research/index.tsx +2 -1
- package/src/plugins/builtin/research/relative-valuation-basis.ts +58 -0
- package/src/plugins/builtin/research/relative-valuation-columns.ts +31 -2
- package/src/plugins/builtin/research/relative-valuation-currency.ts +12 -5
- package/src/plugins/builtin/research/relative-valuation-headless.ts +84 -26
- package/src/plugins/builtin/research/relative-valuation-model.ts +88 -19
- package/src/plugins/builtin/research/relative-valuation-pane.tsx +76 -9
- package/src/plugins/builtin/research/relative-valuation-peers.ts +1 -1
- package/src/plugins/builtin/reverse-dcf/client.ts +2 -1
- package/src/plugins/builtin/reverse-dcf/model.ts +10 -5
- package/src/plugins/builtin/risk-factors/index.tsx +2 -2
- package/src/plugins/builtin/scanner/lock-note.ts +1 -1
- package/src/plugins/builtin/seasonality/client.ts +2 -1
- package/src/plugins/builtin/sec/forms.ts +13 -0
- package/src/plugins/builtin/sec/fund-abroad.ts +32 -0
- package/src/plugins/builtin/sec/fund-facts.ts +68 -8
- package/src/plugins/builtin/sec/headless.ts +85 -8
- package/src/plugins/builtin/sec/index.tsx +58 -12
- package/src/plugins/builtin/sectors/client.ts +6 -4
- package/src/plugins/builtin/sectors/sector-model.ts +11 -15
- package/src/plugins/builtin/series-inventory.ts +2 -0
- package/src/plugins/builtin/shared/broker-reconnect.ts +107 -22
- package/src/plugins/builtin/shared/cloud-resource.ts +15 -2
- package/src/plugins/builtin/shared/cloud-upgrade.ts +34 -6
- package/src/plugins/builtin/shared/earnings-calendar.ts +375 -0
- package/src/plugins/builtin/{earnings/estimate-basis.ts → shared/earnings-estimate-basis.ts} +1 -1
- package/src/plugins/builtin/shared/earnings-report.ts +3 -3
- package/src/plugins/builtin/shared/fx-rate-freshness.ts +23 -1
- package/src/plugins/builtin/shared/job-posting.ts +129 -0
- package/src/plugins/builtin/shared/pro-lock-note.ts +3 -3
- package/src/plugins/builtin/shared/report-freshness.ts +3 -0
- package/src/plugins/builtin/shared/research-trading.tsx +23 -0
- package/src/plugins/builtin/shared/series-cache.ts +2 -0
- package/src/plugins/builtin/shared/series-list-detail.tsx +3 -1
- package/src/plugins/builtin/shared/ticker-surface.ts +2 -1
- package/src/plugins/builtin/shared/volatility/options.ts +2 -1
- package/src/plugins/builtin/short-interest/client.ts +2 -0
- package/src/plugins/builtin/short-interest/headless.ts +41 -12
- package/src/plugins/builtin/short-interest/index.tsx +23 -1
- package/src/plugins/builtin/short-interest/model.ts +70 -19
- package/src/plugins/builtin/short-interest/pane.tsx +19 -2
- package/src/plugins/builtin/short-interest/publications-client.ts +82 -0
- package/src/plugins/builtin/short-interest/publications-headless.ts +29 -0
- package/src/plugins/builtin/short-interest/publications-model.ts +50 -0
- package/src/plugins/builtin/short-interest/publications-pane.tsx +66 -0
- package/src/plugins/builtin/short-interest/schedule.ts +35 -2
- package/src/plugins/builtin/short-interest/surface.tsx +11 -4
- package/src/plugins/builtin/short-interest/types.ts +9 -0
- package/src/plugins/builtin/short-interest/watch-client.ts +14 -8
- package/src/plugins/builtin/short-interest/watch-model.ts +12 -25
- package/src/plugins/builtin/short-interest/watch-pane.tsx +5 -1
- package/src/plugins/builtin/social-mentions/client.ts +2 -1
- package/src/plugins/builtin/supply-chain/flow.tsx +33 -9
- package/src/plugins/builtin/supply-chain/model.ts +51 -3
- package/src/plugins/builtin/supply-chain/pane.tsx +78 -39
- package/src/plugins/builtin/supply-chain/row-evidence.tsx +1 -1
- package/src/plugins/builtin/themes/headless.ts +8 -5
- package/src/plugins/builtin/themes/model.ts +14 -4
- package/src/plugins/builtin/themes/pane.tsx +24 -5
- package/src/plugins/builtin/thirteenf/headless.ts +5 -5
- package/src/plugins/builtin/thirteenf/signals.ts +3 -1
- package/src/plugins/builtin/ticker-detail/adr-pair/headless.ts +123 -0
- package/src/plugins/builtin/ticker-detail/adr-pair/model.ts +132 -0
- package/src/plugins/builtin/ticker-detail/adr-pair/tab.tsx +87 -0
- package/src/plugins/builtin/ticker-detail/data-panes/historical-prices.tsx +40 -26
- package/src/plugins/builtin/ticker-detail/data-panes/history-bars.ts +8 -4
- package/src/plugins/builtin/ticker-detail/data-panes/returns-history.ts +67 -3
- package/src/plugins/builtin/ticker-detail/data-panes/returns-model.ts +112 -5
- package/src/plugins/builtin/ticker-detail/data-panes/returns-pane.tsx +17 -2
- package/src/plugins/builtin/ticker-detail/financials/aggregation.ts +21 -7
- package/src/plugins/builtin/ticker-detail/financials/model.ts +36 -1
- package/src/plugins/builtin/ticker-detail/financials/offerings.ts +56 -0
- package/src/plugins/builtin/ticker-detail/financials/ratios.ts +62 -13
- package/src/plugins/builtin/ticker-detail/financials/tab.tsx +30 -4
- package/src/plugins/builtin/ticker-detail/headless-schema.ts +14 -2
- package/src/plugins/builtin/ticker-detail/headless.ts +148 -35
- package/src/plugins/builtin/ticker-detail/index.tsx +37 -5
- package/src/plugins/builtin/ticker-detail/overview/model.ts +65 -10
- package/src/plugins/builtin/ticker-detail/overview/pane.tsx +9 -1
- package/src/plugins/builtin/ticker-detail/overview-tab.tsx +68 -11
- package/src/plugins/builtin/ticker-detail/pane.tsx +11 -0
- package/src/plugins/builtin/ticker-detail/quote-footer.ts +8 -3
- package/src/plugins/builtin/ticker-detail/research-tabs.ts +11 -0
- package/src/plugins/builtin/vol-surface/client.ts +28 -7
- package/src/plugins/builtin/vol-surface/headless.ts +43 -15
- package/src/plugins/builtin/vol-surface/model.ts +34 -12
- package/src/plugins/builtin/vol-surface/pane.tsx +33 -13
- package/src/plugins/builtin/vol-surface/stored.ts +34 -3
- package/src/plugins/builtin/vol-surface/tables.ts +14 -0
- package/src/plugins/builtin/volatility/model.ts +5 -10
- package/src/plugins/builtin/world-venue-map/basemap-layer.tsx +4 -3
- package/src/plugins/builtin/world-venue-map/basemap.ts +3 -1
- package/src/plugins/builtin/world-venue-map/chokepoint-chart.ts +40 -0
- package/src/plugins/builtin/world-venue-map/evidence.ts +1 -1
- package/src/plugins/builtin/world-venue-map/geo-series.ts +90 -11
- package/src/plugins/builtin/world-venue-map/headless.ts +1 -1
- package/src/plugins/builtin/world-venue-map/index.ts +3 -26
- package/src/plugins/builtin/world-venue-map/layers.ts +1 -1
- package/src/plugins/builtin/world-venue-map/map.tsx +2 -1
- package/src/plugins/builtin/world-venue-map/pane.tsx +4 -2
- package/src/plugins/builtin/world-venue-map/venue-header.tsx +15 -4
- package/src/plugins/builtin/yield-curve/client.ts +25 -0
- package/src/plugins/builtin/yield-curve/curves.ts +7 -4
- package/src/plugins/builtin/yield-curve/headless.ts +38 -4
- package/src/plugins/builtin/yield-curve/history.ts +4 -3
- package/src/plugins/builtin/yield-curve/index.tsx +12 -6
- package/src/plugins/builtin/yield-curve/swaps-model.ts +93 -0
- package/src/plugins/builtin/yield-curve/swaps.tsx +99 -0
- package/src/plugins/bundle.ts +1 -1
- package/src/plugins/catalog-browser.ts +2 -1
- package/src/plugins/compat.ts +3 -3
- package/src/plugins/dependencies.ts +75 -14
- package/src/plugins/extracted-plugins.ts +132 -34
- package/src/plugins/host-link.ts +149 -34
- package/src/plugins/installer.ts +35 -10
- package/src/plugins/loader.ts +206 -38
- package/src/plugins/manager-node.ts +2 -2
- package/src/plugins/marketplace/deactivation.ts +22 -0
- package/src/plugins/marketplace/model.ts +2 -2
- package/src/plugins/marketplace/packs.ts +1 -1
- package/src/plugins/ownership.ts +1 -1
- package/src/plugins/peer-retry.ts +155 -0
- package/src/plugins/registry/contributions.ts +3 -1
- package/src/plugins/registry/index.ts +4 -3
- package/src/plugins/registry/plugin-state.ts +3 -0
- package/src/plugins/seed-notice.ts +20 -0
- package/src/plugins/shortcut-argument.ts +39 -0
- package/src/portfolio/allocation.ts +1 -1
- package/src/portfolio/collection-name.ts +31 -0
- package/src/portfolio/column-values.ts +10 -8
- package/src/portfolio/cost-fx.ts +296 -19
- package/src/portfolio/manual-lots.ts +75 -0
- package/src/portfolio/mutations.ts +60 -22
- package/src/portfolio/suffixed-listings.ts +209 -0
- package/src/portfolio/totals-currency.ts +24 -0
- package/src/public/__snapshots__/public-api.test.ts.snap +14 -0
- package/src/public/time-series.ts +11 -8
- package/src/remote/schema.ts +1 -1
- package/src/renderers/browser/config-host.ts +3 -0
- package/src/renderers/browser/main.tsx +23 -3
- package/src/renderers/dom/boot-frame-page.ts +187 -0
- package/src/renderers/dom/boot-frame.ts +237 -0
- package/src/renderers/dom/build-assets.ts +46 -8
- package/src/renderers/dom/desktop/controls.tsx +1 -1
- package/src/renderers/dom/desktop/query-bar.tsx +2 -0
- package/src/renderers/dom/dom-ui-host.tsx +4 -29
- package/src/renderers/dom/host/ascii-text.ts +16 -2
- package/src/renderers/dom/host/box.tsx +43 -2
- package/src/renderers/dom/host/chart-surface.tsx +2 -0
- package/src/renderers/dom/host/hls.chunk.ts +3 -0
- package/src/renderers/dom/host/image-surface.tsx +49 -0
- package/src/renderers/dom/host/media-surface.tsx +24 -18
- package/src/renderers/dom/host/mouse.ts +30 -0
- package/src/renderers/dom/host/size-observer.ts +1 -1
- package/src/renderers/dom/host/style.ts +1 -1
- package/src/renderers/dom/host/tabs.tsx +16 -5
- package/src/renderers/dom/host/top-surface.ts +127 -0
- package/src/renderers/dom/styles.css +115 -0
- package/src/renderers/dom/test-utils.tsx +2 -1
- package/src/renderers/electrobun/bun/application-menu/index.ts +3 -3
- package/src/renderers/electrobun/bun/core-capabilities.ts +9 -1
- package/src/renderers/electrobun/bun/desktop/backend-requests.ts +3 -0
- package/src/renderers/electrobun/bun/desktop/backend.ts +56 -3
- package/src/renderers/electrobun/bun/desktop/detached-windows.ts +1 -1
- package/src/renderers/electrobun/bun/desktop/host-requests.ts +9 -3
- package/src/renderers/electrobun/bun/desktop/initialization.ts +81 -18
- package/src/renderers/electrobun/bun/desktop/update.ts +210 -30
- package/src/renderers/electrobun/bun/external-plugins.ts +29 -7
- package/src/renderers/electrobun/bun/index.ts +11 -1
- package/src/renderers/electrobun/bun/window/boot-frame.ts +67 -0
- package/src/renderers/electrobun/bun/window/create.ts +4 -1
- package/src/renderers/electrobun/shared/boot-frame.ts +7 -0
- package/src/renderers/electrobun/shared/protocol.ts +6 -1
- package/src/renderers/electrobun/view/cli-pane-shot-entry.tsx +1 -1
- package/src/renderers/electrobun/view/config-host.ts +3 -0
- package/src/renderers/electrobun/view/fatal-screen.tsx +1 -1
- package/src/renderers/electrobun/view/main.tsx +30 -4
- package/src/renderers/electrobun/view/news-source.ts +9 -7
- package/src/renderers/electrobun/view/remote/asset-data-client.ts +9 -2
- package/src/renderers/electrobun/view/ui-host.tsx +1 -1
- package/src/renderers/opentui/browser-open.ts +88 -0
- package/src/renderers/opentui/host.tsx +5 -14
- package/src/renderers/opentui/image/loader.ts +3 -2
- package/src/renderers/opentui/native-smoke.ts +10 -1
- package/src/renderers/opentui/pane-image/index.ts +2 -1
- package/src/renderers/opentui/render-lib.ts +253 -0
- package/src/renderers/opentui/render-timing-smoke.ts +1 -1
- package/src/renderers/opentui/start.tsx +8 -1
- package/src/renderers/share/layout-view.tsx +2 -2
- package/src/renderers/share/main.tsx +4 -4
- package/src/renderers/share/view.tsx +1 -1
- package/src/series/resolve.ts +22 -6
- package/src/series/standalone.ts +30 -2
- package/src/series/types.ts +8 -1
- package/src/shares/api.ts +4 -1
- package/src/shares/pane.ts +1 -1
- package/src/sources/gloomberb-cloud/fred-series.ts +46 -1
- package/src/sources/gloomberb-cloud/index.ts +39 -16
- package/src/sources/gloomberb-cloud/news.ts +39 -0
- package/src/sources/gloomberb-cloud/normalizers.ts +14 -1
- package/src/sources/gloomberb-cloud/perpetuals.ts +49 -1
- package/src/sources/listing-symbols.ts +37 -0
- package/src/sources/provider-errors.ts +16 -2
- package/src/sources/provider-router/financial-routes.ts +21 -3
- package/src/sources/provider-router/financials.ts +15 -2
- package/src/sources/provider-router/history.ts +30 -8
- package/src/sources/provider-router/index.ts +16 -0
- package/src/sources/provider-router/primary.ts +1 -1
- package/src/state/app/bootstrap.ts +23 -0
- package/src/state/hooks/inline-tickers.ts +30 -5
- package/src/sync/controller.ts +1 -1
- package/src/sync/core-contributors.ts +46 -14
- package/src/team/collections-sync.ts +2 -1
- package/src/team/collections.ts +178 -17
- package/src/telemetry/crash-reports.ts +21 -4
- package/src/telemetry/update-failures-node.ts +59 -0
- package/src/telemetry/update-failures.ts +307 -0
- package/src/test-support/builtin-panes.ts +1 -1
- package/src/theme/colors.ts +3 -30
- package/src/theme/ui-tokens.ts +37 -1
- package/src/tickers/company-name-listing.ts +215 -36
- package/src/tickers/company-name.ts +43 -0
- package/src/tickers/index-roots.ts +47 -0
- package/src/tickers/instrument-label.ts +5 -1
- package/src/tickers/listing-fate.ts +30 -0
- package/src/tickers/metadata.ts +10 -0
- package/src/tickers/perpetual-listing.ts +5 -2
- package/src/tickers/search/home-listing.ts +75 -0
- package/src/tickers/search/index.ts +76 -27
- package/src/tickers/search/ranking.ts +54 -4
- package/src/tickers/search/upsert.ts +29 -0
- package/src/tickers/terminal-codes.ts +416 -40
- package/src/time-series/bar-aggregation.ts +243 -0
- package/src/time-series/base-series.ts +307 -0
- package/src/time-series/chart-bounds.ts +349 -0
- package/src/time-series/chart-seed.ts +142 -0
- package/src/time-series/economic.ts +5 -0
- package/src/time-series/fundamentals.ts +18 -3
- package/src/time-series/history-acquisition.ts +499 -0
- package/src/time-series/leverage.ts +100 -0
- package/src/time-series/market-resolution.ts +4 -2
- package/src/time-series/market.ts +2 -1
- package/src/time-series/price-comparison.ts +175 -30
- package/src/time-series/range.ts +9 -1
- package/src/time-series/resolution.ts +174 -16
- package/src/time-series/resolve-context.ts +157 -0
- package/src/time-series/resolve.ts +126 -1577
- package/src/time-series/series-name.ts +38 -0
- package/src/time-series/series-presentation.ts +208 -0
- package/src/time-series/spec.ts +11 -6
- package/src/time-series/studies.ts +109 -12
- package/src/time-series/tail-reconcile.ts +121 -0
- package/src/time-series/types.ts +29 -2
- package/src/time-series/use-chart-resolution.ts +4 -5
- package/src/types/broker.ts +10 -0
- package/src/types/config.ts +14 -0
- package/src/types/data-provider.ts +20 -0
- package/src/types/exchange-rate.ts +6 -0
- package/src/types/financials.ts +104 -7
- package/src/types/headless.ts +83 -6
- package/src/types/instrument.ts +3 -0
- package/src/types/issuer-listings.ts +28 -0
- package/src/types/plugin.ts +65 -8
- package/src/types/price-history.ts +2 -0
- package/src/types/ticker.ts +13 -0
- package/src/types/trading.ts +59 -1
- package/src/ui/ascii-font.ts +13 -1
- package/src/ui/host.tsx +6 -1
- package/src/updater/command-names.ts +175 -0
- package/src/updater/failure.ts +163 -0
- package/src/updater/index.ts +97 -28
- package/src/utils/calendar-date.ts +32 -15
- package/src/utils/cash-runway.ts +241 -0
- package/src/utils/central-banks.ts +42 -0
- package/src/utils/cli-output.ts +259 -80
- package/src/utils/contract-month.ts +16 -0
- package/src/utils/crypto-pair.ts +61 -3
- package/src/utils/currency-pair.ts +26 -0
- package/src/utils/currency-units.ts +29 -0
- package/src/utils/datetime-format.ts +10 -0
- package/src/utils/debug-log.ts +1 -1
- package/src/utils/decimal-comma.ts +39 -6
- package/src/utils/exchange-announcements.ts +71 -0
- package/src/utils/exchange-rate-snapshot.ts +10 -0
- package/src/utils/financial-statements.ts +83 -4
- package/src/utils/format.ts +34 -16
- package/src/utils/fundamentals.ts +150 -34
- package/src/utils/fx-market-hours.ts +10 -1
- package/src/utils/latest-financial-period.ts +8 -0
- package/src/utils/linux-libc.ts +54 -0
- package/src/utils/market-capitalization.ts +111 -15
- package/src/utils/max-drawdown.ts +64 -0
- package/src/utils/network-failure.ts +83 -0
- package/src/utils/option-expiry.ts +139 -7
- package/src/utils/price-earnings.ts +11 -5
- package/src/utils/price-history.ts +18 -8
- package/src/utils/price-window.ts +131 -0
- package/src/utils/release-date.ts +47 -0
- package/src/utils/sec.ts +71 -0
- package/src/utils/throttled-fetch.ts +11 -4
- package/src/utils/trailing-eps.ts +67 -0
- package/src/utils/typed-text.ts +21 -0
- package/src/utils/utc-time.ts +24 -1
- package/src/version.ts +6 -0
- package/src/cli/pane-functions/screenshot.ts +0 -2122
package/src/types/plugin.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { ReactNode } from "react";
|
|
2
2
|
import type { AppTickerRepositoryPort } from "../core/app-service-ports";
|
|
3
|
-
import type { HeadlessPaneContext, HeadlessPaneDefinition, HeadlessPaneFreshness, HeadlessPaneOptionDef } from "./headless";
|
|
3
|
+
import type { HeadlessPaneArgumentDef, HeadlessPaneContext, HeadlessPaneDefinition, HeadlessPaneFreshness, HeadlessPaneOptionDef } from "./headless";
|
|
4
4
|
|
|
5
5
|
export type {
|
|
6
6
|
HeadlessArgumentExpansion,
|
|
@@ -186,9 +186,23 @@ export interface PaneDef {
|
|
|
186
186
|
/**
|
|
187
187
|
* Options a rendered-view report takes (`fn OMON AAPL --strikes 10`):
|
|
188
188
|
* each sets the pane setting of its key, is checked by its `normalize`, and
|
|
189
|
-
* is listed with its example by `
|
|
189
|
+
* is listed with its example by `gloom catalog`.
|
|
190
190
|
*/
|
|
191
191
|
reportOptions?: readonly PaneReportOptionDef[];
|
|
192
|
+
/**
|
|
193
|
+
* A rendered-view report that takes its `reportOptions` and nothing else:
|
|
194
|
+
* any other option is refused with the ones it takes (`fn FUT --bogus 1`),
|
|
195
|
+
* as a `headless` report refuses one, instead of being set as a pane
|
|
196
|
+
* setting of that name.
|
|
197
|
+
*/
|
|
198
|
+
reportOptionsOnly?: boolean;
|
|
199
|
+
/**
|
|
200
|
+
* What a rendered-view report takes after the function, for a pane whose
|
|
201
|
+
* template reads it with no shortcut to say so (X Feed's query): the
|
|
202
|
+
* catalog lists it, and `fn` refuses an argument from a function that
|
|
203
|
+
* declares none here, in its shortcut or in a `headless` model.
|
|
204
|
+
*/
|
|
205
|
+
reportArgument?: Pick<HeadlessPaneArgumentDef, "kind" | "placeholder" | "description" | "optional">;
|
|
192
206
|
/**
|
|
193
207
|
* Lines a rendered-view report prints above its table, from the settings it
|
|
194
208
|
* ran with: what the default view leaves out and how to see more. `--json`
|
|
@@ -207,7 +221,7 @@ export interface PaneDef {
|
|
|
207
221
|
reportLockNote?(lock: PaneLock): string | Promise<string>;
|
|
208
222
|
/**
|
|
209
223
|
* What a rendered-view report needs before it shows anything, such as a
|
|
210
|
-
* sign-in: `
|
|
224
|
+
* sign-in: `gloom catalog` lists it under Requires, as it does a
|
|
211
225
|
* `headless` model's `discovery.dataRequirements`.
|
|
212
226
|
*/
|
|
213
227
|
reportRequirements?: readonly string[];
|
|
@@ -260,9 +274,11 @@ export type PanePersonalData = "holdings" | "account" | "messages" | "personal";
|
|
|
260
274
|
/**
|
|
261
275
|
* An option of a rendered-view report, which sets the pane setting of its key,
|
|
262
276
|
* or of `settingKey` when the flag reads better than the setting's name
|
|
263
|
-
* (`--columns` for `optionColumnIds`)
|
|
277
|
+
* (`--columns` for `optionColumnIds`); with `pluginState`, the pane state the
|
|
278
|
+
* view reads it from (a workspace's tab), and the setting too when it also
|
|
279
|
+
* names a `settingKey`.
|
|
264
280
|
*/
|
|
265
|
-
export interface PaneReportOptionDef extends
|
|
281
|
+
export interface PaneReportOptionDef extends HeadlessPaneOptionDef {
|
|
266
282
|
/** The value's name in the catalog's flag, `--currencies <codes>`; the type when absent. */
|
|
267
283
|
placeholder?: string;
|
|
268
284
|
/** The option in use as typed after the function, such as `--currencies USD,ZAR,NGN`; the catalog shows it as an example. */
|
|
@@ -349,11 +365,29 @@ interface PaneSettingOrderedMultiSelectField extends PaneSettingFieldBase {
|
|
|
349
365
|
searchable?: boolean;
|
|
350
366
|
}
|
|
351
367
|
|
|
368
|
+
/** What an action row says of its own action (docs/pane-conventions.md, "Row messages"). */
|
|
369
|
+
export interface PaneSettingRowNote {
|
|
370
|
+
/** A short state, where the row's action label is: `Connecting…`, `Sign-in failed`. */
|
|
371
|
+
status: string;
|
|
372
|
+
/** The full reason or the next step, in place of the row's description. */
|
|
373
|
+
text?: string;
|
|
374
|
+
tone: "warning" | "negative";
|
|
375
|
+
}
|
|
376
|
+
|
|
352
377
|
export interface PaneSettingActionContext extends PaneSettingsContext {
|
|
353
378
|
surface: "pane-dialog" | "command-bar";
|
|
354
379
|
close(): void;
|
|
355
380
|
openCommandBar(query?: string): void;
|
|
356
381
|
notify(notification: AppNotificationRequest): void;
|
|
382
|
+
/**
|
|
383
|
+
* Says on the row the action runs from what it is doing or what stopped it,
|
|
384
|
+
* or clears that with null. A success the row's own description and label
|
|
385
|
+
* show once they change needs no note. False once the row is off screen
|
|
386
|
+
* (the dialog closed, or the action removed its own field): say it with
|
|
387
|
+
* `notify` then, as a row that has left a list is a toast. Older hosts do
|
|
388
|
+
* not pass it.
|
|
389
|
+
*/
|
|
390
|
+
setRowNote?(note: PaneSettingRowNote | null): boolean;
|
|
357
391
|
}
|
|
358
392
|
|
|
359
393
|
export type PaneSettingActionHandler = (
|
|
@@ -404,12 +438,22 @@ export interface ShortcutArgOption {
|
|
|
404
438
|
label: string;
|
|
405
439
|
}
|
|
406
440
|
|
|
441
|
+
/** Why a typed argument opens nothing: the row's text, and the line under it saying what to type instead. */
|
|
442
|
+
export interface ShortcutArgError {
|
|
443
|
+
message: string;
|
|
444
|
+
detail?: string;
|
|
445
|
+
}
|
|
446
|
+
|
|
407
447
|
interface PaneTemplateShortcut {
|
|
408
448
|
prefix: string;
|
|
409
449
|
/** Other mnemonics for the same view (FFIP for WIRP). They open it when typed but are not listed as separate rows. */
|
|
410
450
|
aliases?: readonly string[];
|
|
411
451
|
/** Keep this shortcut executable when typed, but omit its pane from command-bar browse rows. Defaults to true. */
|
|
412
452
|
showInBrowse?: boolean;
|
|
453
|
+
/**
|
|
454
|
+
* What the shortcut takes after the prefix. Left out, it takes the argument
|
|
455
|
+
* the template's `headless` definition declares, as `gloom catalog` lists it.
|
|
456
|
+
*/
|
|
413
457
|
argPlaceholder?: string;
|
|
414
458
|
argKind?: "text" | "ticker" | "ticker-list";
|
|
415
459
|
/**
|
|
@@ -430,6 +474,12 @@ interface PaneTemplateShortcut {
|
|
|
430
474
|
* from it instead of guessing the text; the command may accept others too.
|
|
431
475
|
*/
|
|
432
476
|
argOptions?: () => readonly ShortcutArgOption[];
|
|
477
|
+
/**
|
|
478
|
+
* Why a typed argument opens nothing, or null when it opens the view:
|
|
479
|
+
* `PF Nope` names no portfolio or watchlist. The command bar shows it in
|
|
480
|
+
* place of the function's row, and the pane does not open for it.
|
|
481
|
+
*/
|
|
482
|
+
argError?: (arg: string, context: PaneTemplateContext) => ShortcutArgError | null;
|
|
433
483
|
}
|
|
434
484
|
|
|
435
485
|
export interface PaneTemplateCreateOptions {
|
|
@@ -507,7 +557,8 @@ export interface WizardStep {
|
|
|
507
557
|
required?: boolean;
|
|
508
558
|
type?: "text" | "password" | "info" | "select" | "number" | "textarea";
|
|
509
559
|
options?: Array<{ label: string; value: string }>;
|
|
510
|
-
|
|
560
|
+
/** Shown only while the earlier answer holds the value; with several, while every one does. */
|
|
561
|
+
dependsOn?: { key: string; value: string } | ReadonlyArray<{ key: string; value: string }>;
|
|
511
562
|
/** Later wizard values to clear when this selection changes from its default. */
|
|
512
563
|
clearOnChange?: string[];
|
|
513
564
|
body?: string[];
|
|
@@ -583,6 +634,12 @@ export interface CommandBarSearchProvider {
|
|
|
583
634
|
minQueryLength?: number;
|
|
584
635
|
/** Default 300. Ignored by `match`. */
|
|
585
636
|
debounceMs?: number;
|
|
637
|
+
/**
|
|
638
|
+
* How long `provide` may take once it starts, in ms. Default 8000. Past it
|
|
639
|
+
* the bar aborts `signal`, drops a late answer and stops showing Searching.
|
|
640
|
+
* Ignored by `match`.
|
|
641
|
+
*/
|
|
642
|
+
timeoutMs?: number;
|
|
586
643
|
/**
|
|
587
644
|
* Codes (`CHAT`) after which the provider is still asked, typed alone or
|
|
588
645
|
* with text after them, with the whole query. Every other provider stays
|
|
@@ -624,14 +681,14 @@ interface CliCommandHelpOption {
|
|
|
624
681
|
}
|
|
625
682
|
|
|
626
683
|
interface CliCommandHelp {
|
|
627
|
-
/** Heading `
|
|
684
|
+
/** Heading `gloom help` lists the command under. Plugin commands without one share a plugin heading. */
|
|
628
685
|
group?: string;
|
|
629
686
|
/** Invocations without the leading `gloomberb`, e.g. `quote <symbol...>`. */
|
|
630
687
|
usage?: string[];
|
|
631
688
|
options?: CliCommandHelpOption[];
|
|
632
689
|
/** Complete invocations without the leading `gloomberb`. */
|
|
633
690
|
examples?: string[];
|
|
634
|
-
/** Extra blocks shown only in the command's own help (`
|
|
691
|
+
/** Extra blocks shown only in the command's own help (`gloom help <command>`). */
|
|
635
692
|
sections?: CliCommandHelpSection[];
|
|
636
693
|
}
|
|
637
694
|
|
|
@@ -24,6 +24,8 @@ export interface PriceHistoryResult {
|
|
|
24
24
|
session?: HistorySession;
|
|
25
25
|
/** Router-selected provider or broker, never its preferred/default source. */
|
|
26
26
|
sourceKey?: string;
|
|
27
|
+
/** The name of that provider or broker ("Gloom Cloud", a broker), set by the router as it answers. */
|
|
28
|
+
sourceName?: string;
|
|
27
29
|
/** First date (YYYY-MM-DD) the source vouches for; it excluded earlier prices. */
|
|
28
30
|
coverageStart?: string;
|
|
29
31
|
/** Why nothing before `coverageStart` is served, when the source says: "old-shekel quotes before 1992 are not served". */
|
package/src/types/ticker.ts
CHANGED
|
@@ -48,6 +48,13 @@ export interface TickerMetadata {
|
|
|
48
48
|
broker_contracts?: BrokerContractRef[];
|
|
49
49
|
custom: Record<string, unknown>;
|
|
50
50
|
tags: string[];
|
|
51
|
+
/**
|
|
52
|
+
* Lots this listing's row took from rows saved under a vendor's suffixed
|
|
53
|
+
* key (GARAN.IS:BIST into GARAN:BIST), by that key, each as the fields sync
|
|
54
|
+
* keeps: a copy an older build or sync brings back is not counted twice.
|
|
55
|
+
* Bookkeeping, never shown, and no reason on its own to keep a row.
|
|
56
|
+
*/
|
|
57
|
+
mergedLots?: Record<string, string[]>;
|
|
51
58
|
}
|
|
52
59
|
|
|
53
60
|
export interface TickerRecord {
|
|
@@ -59,6 +66,12 @@ export interface Portfolio {
|
|
|
59
66
|
name: string;
|
|
60
67
|
description?: string;
|
|
61
68
|
currency: string;
|
|
69
|
+
/**
|
|
70
|
+
* Set on a manual portfolio created in a currency (`portfolio create
|
|
71
|
+
* --currency`): it totals in `currency` whatever the base currency, and its
|
|
72
|
+
* first holding does not change it.
|
|
73
|
+
*/
|
|
74
|
+
fixedCurrency?: boolean;
|
|
62
75
|
brokerId?: string;
|
|
63
76
|
brokerInstanceId?: string;
|
|
64
77
|
brokerAccountId?: string;
|
package/src/types/trading.ts
CHANGED
|
@@ -1,7 +1,19 @@
|
|
|
1
1
|
import type { BrokerContractRef } from "./instrument";
|
|
2
2
|
|
|
3
3
|
type BrokerOrderAction = "BUY" | "SELL";
|
|
4
|
-
|
|
4
|
+
/** `TRAIL` is a trailing stop: its trigger follows the market by `trailingAmount` or `trailingPercent`. */
|
|
5
|
+
export type BrokerOrderType = "MKT" | "LMT" | "STP" | "STP LMT" | "TRAIL";
|
|
6
|
+
/**
|
|
7
|
+
* Orders a broker holds together as one, and runs itself.
|
|
8
|
+
* - `bracket`: the order is an entry, with a take-profit limit and a stop-loss stop (one or both) on the other side
|
|
9
|
+
* for the same quantity. They work once the entry fills, and one filling cancels the other.
|
|
10
|
+
* - `oco`: a limit order and a stop order on the same side for the same quantity; one filling cancels the other.
|
|
11
|
+
*/
|
|
12
|
+
export type BrokerOrderClass = "bracket" | "oco";
|
|
13
|
+
/** A trailing stop's distance, in price or in percent of the price. */
|
|
14
|
+
export type BrokerTrailingUnit = "amount" | "percent";
|
|
15
|
+
/** What an order is to the others the broker holds it with. */
|
|
16
|
+
export type BrokerOrderLinkRole = "entry" | "takeProfit" | "stopLoss";
|
|
5
17
|
|
|
6
18
|
/** Explicit account classification for order confirmation. Missing values are treated as unknown. */
|
|
7
19
|
export type BrokerTradingMode = "simulation" | "live" | "unknown";
|
|
@@ -31,6 +43,14 @@ export interface BrokerTradingCapabilities {
|
|
|
31
43
|
* for a combo contract (`secType: "BAG"`); omit when the broker takes none.
|
|
32
44
|
*/
|
|
33
45
|
maxLegs?: number;
|
|
46
|
+
/**
|
|
47
|
+
* Linked orders the broker places and runs itself. The ticket never makes one
|
|
48
|
+
* from separate orders: a class missing here is shown unavailable, and an
|
|
49
|
+
* adapter that omits it never receives it.
|
|
50
|
+
*/
|
|
51
|
+
orderClasses?: BrokerOrderClass[];
|
|
52
|
+
/** How a trailing stop (`TRAIL` in `orderTypes`) can be set: by price, by percent or both. */
|
|
53
|
+
trailing?: BrokerTrailingUnit[];
|
|
34
54
|
}
|
|
35
55
|
|
|
36
56
|
export interface BrokerCashBalance {
|
|
@@ -49,6 +69,11 @@ export interface BrokerAccount {
|
|
|
49
69
|
currency?: string;
|
|
50
70
|
/** "cloud" is a connection held by the user's Gloom Cloud account. */
|
|
51
71
|
source?: "gateway" | "flex" | "cloud";
|
|
72
|
+
/**
|
|
73
|
+
* The account's own number at its brokerage, for one held through an
|
|
74
|
+
* aggregator (SnapTrade). Another profile that holds that number keeps it.
|
|
75
|
+
*/
|
|
76
|
+
brokerageAccountId?: string;
|
|
52
77
|
updatedAt?: number;
|
|
53
78
|
asOfDate?: string;
|
|
54
79
|
netLiquidation?: number;
|
|
@@ -128,6 +153,20 @@ export interface BrokerOrderRequest {
|
|
|
128
153
|
* `limitPrice` is the positive net price of one spread.
|
|
129
154
|
*/
|
|
130
155
|
legs?: BrokerOrderLeg[];
|
|
156
|
+
/** A trailing stop's distance in price. Exactly one of this and `trailingPercent` with `TRAIL`. */
|
|
157
|
+
trailingAmount?: number;
|
|
158
|
+
/** A trailing stop's distance in percent, such as 2 for 2%. */
|
|
159
|
+
trailingPercent?: number;
|
|
160
|
+
/**
|
|
161
|
+
* Orders placed with this one and held together by the broker. A bracket
|
|
162
|
+
* takes `takeProfitPrice`, `stopLossPrice` or both; an OCO is this limit order
|
|
163
|
+
* (`orderType: "LMT"`) with a stop at `stopLossPrice`.
|
|
164
|
+
*/
|
|
165
|
+
orderClass?: BrokerOrderClass;
|
|
166
|
+
/** A bracket's take-profit limit. */
|
|
167
|
+
takeProfitPrice?: number;
|
|
168
|
+
/** A bracket's stop-loss trigger, or an OCO's stop. */
|
|
169
|
+
stopLossPrice?: number;
|
|
131
170
|
}
|
|
132
171
|
|
|
133
172
|
export interface BrokerOrderPreview {
|
|
@@ -149,6 +188,17 @@ export interface BrokerOrderPreview {
|
|
|
149
188
|
commission?: number;
|
|
150
189
|
commissionCurrency?: string;
|
|
151
190
|
warningText?: string;
|
|
191
|
+
/**
|
|
192
|
+
* Where the figures come from, for a broker that says: its own preview, or none for this order
|
|
193
|
+
* (the ticket then names each figure "Not available", never zero). Omitted by a broker that does not say.
|
|
194
|
+
*/
|
|
195
|
+
impactSource?: "broker" | "unavailable";
|
|
196
|
+
/** Whom the figures are credited to, e.g. "Robinhood via SnapTrade". */
|
|
197
|
+
impactSourceLabel?: string;
|
|
198
|
+
cashBefore?: number;
|
|
199
|
+
cashAfter?: number;
|
|
200
|
+
/** The broker's terms for these figures, shown with them before the order is confirmed. */
|
|
201
|
+
disclosure?: string;
|
|
152
202
|
}
|
|
153
203
|
|
|
154
204
|
export interface BrokerOrder {
|
|
@@ -174,6 +224,14 @@ export interface BrokerOrder {
|
|
|
174
224
|
contract: BrokerContractRef;
|
|
175
225
|
/** A multi-leg order's legs, as on its request. */
|
|
176
226
|
legs?: BrokerOrderLeg[];
|
|
227
|
+
trailingAmount?: number;
|
|
228
|
+
trailingPercent?: number;
|
|
229
|
+
/**
|
|
230
|
+
* Orders the broker holds together (a bracket's entry and exits, an OCO
|
|
231
|
+
* pair) share this id; the broker cancels or activates them as one fills.
|
|
232
|
+
*/
|
|
233
|
+
linkGroup?: string;
|
|
234
|
+
linkRole?: BrokerOrderLinkRole;
|
|
177
235
|
}
|
|
178
236
|
|
|
179
237
|
export interface BrokerExecution {
|
package/src/ui/ascii-font.ts
CHANGED
|
@@ -69,9 +69,21 @@ const GLOOMBERB_WORDMARK = [
|
|
|
69
69
|
"▝▀ ▘▝▀ ▝▀ ▘▝ ▘▀▀ ▝▀▘▘ ▀▀ ",
|
|
70
70
|
];
|
|
71
71
|
|
|
72
|
+
/** The first five letters of the wordmark above. */
|
|
73
|
+
const GLOOM_WORDMARK = GLOOMBERB_WORDMARK.map((line) => line.slice(0, 15));
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* The drawn wordmarks, by the text they spell. The app is Gloom; chart
|
|
77
|
+
* screenshots keep the Gloomberb watermark.
|
|
78
|
+
*/
|
|
79
|
+
const WORDMARKS = new Map<string, string[]>([
|
|
80
|
+
["gloom", GLOOM_WORDMARK],
|
|
81
|
+
["gloomberb", GLOOMBERB_WORDMARK],
|
|
82
|
+
]);
|
|
83
|
+
|
|
72
84
|
export function renderAsciiText(text: string, font: AsciiFontName = "tiny"): string[] {
|
|
73
85
|
if (font === "wordmark") {
|
|
74
|
-
return text.trim().toLowerCase()
|
|
86
|
+
return WORDMARKS.get(text.trim().toLowerCase()) ?? [text];
|
|
75
87
|
}
|
|
76
88
|
|
|
77
89
|
const lines = ["", ""];
|
package/src/ui/host.tsx
CHANGED
|
@@ -708,7 +708,12 @@ export interface RendererHost {
|
|
|
708
708
|
requestExit(): void;
|
|
709
709
|
startWindowDrag?(): Promise<void> | void;
|
|
710
710
|
controlWindow?(action: "minimize" | "toggle-maximize" | "close"): Promise<void> | void;
|
|
711
|
-
|
|
711
|
+
/**
|
|
712
|
+
* Opens a link in the person's browser. Resolves false when no browser could
|
|
713
|
+
* be shown from here (a terminal over SSH, or no opener installed), so the
|
|
714
|
+
* caller can show the link instead; void when the host cannot tell.
|
|
715
|
+
*/
|
|
716
|
+
openExternal(url: string): Promise<boolean | void>;
|
|
712
717
|
copyText(text: string): Promise<void>;
|
|
713
718
|
copyPngImage?(pngBase64: string): Promise<void>;
|
|
714
719
|
readText(): Promise<string>;
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import { lstatSync, symlinkSync } from "fs";
|
|
2
|
+
import { lstat, readFile, readlink, stat, symlink, writeFile } from "fs/promises";
|
|
3
|
+
import { basename, dirname, join, resolve } from "path";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* The terminal command is `gloom`. `gloomberb`, its name before 0.19, keeps
|
|
7
|
+
* working beside it, for scripts and habits.
|
|
8
|
+
*
|
|
9
|
+
* An install from before the rename has only `gloomberb`, and the ways it
|
|
10
|
+
* updates (the standalone binary replacing itself, the desktop app replacing
|
|
11
|
+
* its bundle) never add a command. So the new build adds `gloom` beside
|
|
12
|
+
* `gloomberb` when it runs. A `gloom` that is already there, whatever it is,
|
|
13
|
+
* is left alone, and a folder this user cannot write is skipped.
|
|
14
|
+
*
|
|
15
|
+
* The desktop app looks through PATH, which can hold a slow or unreachable
|
|
16
|
+
* network folder, so its half only reads and writes asynchronously and runs
|
|
17
|
+
* once the app is up.
|
|
18
|
+
*/
|
|
19
|
+
const COMMAND_NAME = "gloom";
|
|
20
|
+
const LEGACY_COMMAND_NAME = "gloomberb";
|
|
21
|
+
|
|
22
|
+
/** The file the desktop app's Windows command runs, which tells its `gloomberb.cmd` from another program's. */
|
|
23
|
+
const WINDOWS_SHIM_ENTRY = "gloomberb-tui\\tui-entry.js";
|
|
24
|
+
|
|
25
|
+
function pathExists(path: string): boolean {
|
|
26
|
+
try {
|
|
27
|
+
lstatSync(path);
|
|
28
|
+
return true;
|
|
29
|
+
} catch {
|
|
30
|
+
// Intentional ignore: a missing path, or one this user cannot see; either way nothing is added there.
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function addSymlink(target: string, path: string): string | null {
|
|
36
|
+
try {
|
|
37
|
+
symlinkSync(target, path);
|
|
38
|
+
return path;
|
|
39
|
+
} catch {
|
|
40
|
+
// Intentional ignore: a read-only or root-owned folder keeps the command it has.
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* For the standalone binary, which updates by replacing itself: links the
|
|
47
|
+
* other name to it in its own folder, `gloom` beside a `gloomberb` installed
|
|
48
|
+
* before the rename (or `gloomberb` beside a `gloom`). Returns the link it
|
|
49
|
+
* added, or null. A binary under any other name is left as it is.
|
|
50
|
+
*/
|
|
51
|
+
export function linkStandaloneCommand(execPath: string): string | null {
|
|
52
|
+
const name = basename(execPath);
|
|
53
|
+
const other = name === COMMAND_NAME ? LEGACY_COMMAND_NAME : name === LEGACY_COMMAND_NAME ? COMMAND_NAME : null;
|
|
54
|
+
if (!other) return null;
|
|
55
|
+
const path = join(dirname(execPath), other);
|
|
56
|
+
if (pathExists(path)) return null;
|
|
57
|
+
// Relative, as install.sh links it, so the pair still works if the folder moves.
|
|
58
|
+
return addSymlink(name, path);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/** Homebrew's command folders on Apple Silicon and on Intel. */
|
|
62
|
+
const HOMEBREW_BINS = ["/opt/homebrew/bin", "/usr/local/bin"];
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Where a Mac keeps the desktop app's command: install.sh's folder, Homebrew's,
|
|
66
|
+
* then the rest of PATH. A GUI app's PATH rarely has the first ones, so they
|
|
67
|
+
* are named outright.
|
|
68
|
+
*/
|
|
69
|
+
function macCommandFolders(homeDir: string, pathEnv: string, homebrewBins: readonly string[]): string[] {
|
|
70
|
+
return [...new Set([
|
|
71
|
+
homeDir ? join(homeDir, ".local", "bin") : "",
|
|
72
|
+
...homebrewBins,
|
|
73
|
+
...pathEnv.split(":"),
|
|
74
|
+
].filter(Boolean))];
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
async function pathExistsAsync(path: string, followLinks = false): Promise<boolean> {
|
|
78
|
+
try {
|
|
79
|
+
await (followLinks ? stat(path) : lstat(path));
|
|
80
|
+
return true;
|
|
81
|
+
} catch {
|
|
82
|
+
// Intentional ignore: a missing path, or one this user cannot see; either way nothing is added there.
|
|
83
|
+
return false;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Next to a `gloomberb` link into an app bundle, adds `gloom` linked to the
|
|
89
|
+
* same bundle's `gloom`. The target is written the way Homebrew writes its
|
|
90
|
+
* own links, so a later `brew upgrade` sees the link as its own.
|
|
91
|
+
*/
|
|
92
|
+
async function linkMacCommand(folder: string): Promise<string | null> {
|
|
93
|
+
let target: string;
|
|
94
|
+
try {
|
|
95
|
+
target = await readlink(join(folder, LEGACY_COMMAND_NAME));
|
|
96
|
+
} catch {
|
|
97
|
+
// Intentional ignore: not there, or not a link; a standalone binary adds its own when it runs.
|
|
98
|
+
return null;
|
|
99
|
+
}
|
|
100
|
+
const absolute = resolve(folder, target);
|
|
101
|
+
if (!absolute.endsWith(`.app/Contents/Resources/${LEGACY_COMMAND_NAME}`)) return null;
|
|
102
|
+
const bundleCommand = join(dirname(absolute), COMMAND_NAME);
|
|
103
|
+
const path = join(folder, COMMAND_NAME);
|
|
104
|
+
if (!(await pathExistsAsync(bundleCommand, true)) || await pathExistsAsync(path)) return null;
|
|
105
|
+
try {
|
|
106
|
+
await symlink(bundleCommand, path);
|
|
107
|
+
return path;
|
|
108
|
+
} catch {
|
|
109
|
+
// Intentional ignore: a read-only or root-owned folder keeps the command it has.
|
|
110
|
+
return null;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Next to the desktop app's `gloomberb.cmd`, adds a `gloom.cmd` with the same
|
|
116
|
+
* contents. The command finds the app from its own folder, so the copy runs
|
|
117
|
+
* the same app.
|
|
118
|
+
*/
|
|
119
|
+
async function copyWindowsCommand(folder: string): Promise<string | null> {
|
|
120
|
+
let shim: string;
|
|
121
|
+
try {
|
|
122
|
+
shim = await readFile(join(folder, `${LEGACY_COMMAND_NAME}.cmd`), "utf8");
|
|
123
|
+
} catch {
|
|
124
|
+
// Intentional ignore: no gloomberb.cmd, so this PATH folder belongs to another program.
|
|
125
|
+
return null;
|
|
126
|
+
}
|
|
127
|
+
if (!shim.includes(WINDOWS_SHIM_ENTRY)) return null;
|
|
128
|
+
const path = join(folder, `${COMMAND_NAME}.cmd`);
|
|
129
|
+
if (await pathExistsAsync(path)) return null;
|
|
130
|
+
try {
|
|
131
|
+
await writeFile(path, shim, { flag: "wx" });
|
|
132
|
+
return path;
|
|
133
|
+
} catch {
|
|
134
|
+
// Intentional ignore: a folder this user cannot write keeps the command it has.
|
|
135
|
+
return null;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
interface DesktopCommandOptions {
|
|
140
|
+
platform: string;
|
|
141
|
+
homeDir: string;
|
|
142
|
+
/** PATH as the app sees it. */
|
|
143
|
+
pathEnv: string;
|
|
144
|
+
/** `%LOCALAPPDATA%`, where the Windows installer puts the app by default. */
|
|
145
|
+
localAppData?: string;
|
|
146
|
+
/** Homebrew's command folders; tests pass none. */
|
|
147
|
+
homebrewBins?: readonly string[];
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* For the desktop app, which updates by replacing its bundle: adds `gloom`
|
|
152
|
+
* wherever an installer put the app's `gloomberb` command (install.sh and
|
|
153
|
+
* Homebrew links on a Mac, the installer's PATH folder on Windows). Resolves
|
|
154
|
+
* to the commands it added. Folders are looked at side by side, so a slow one
|
|
155
|
+
* holds up only itself.
|
|
156
|
+
*/
|
|
157
|
+
export async function linkDesktopCommands({
|
|
158
|
+
platform,
|
|
159
|
+
homeDir,
|
|
160
|
+
pathEnv,
|
|
161
|
+
localAppData,
|
|
162
|
+
homebrewBins = HOMEBREW_BINS,
|
|
163
|
+
}: DesktopCommandOptions): Promise<string[]> {
|
|
164
|
+
let added: Array<string | null> = [];
|
|
165
|
+
if (platform === "darwin") {
|
|
166
|
+
added = await Promise.all(macCommandFolders(homeDir, pathEnv, homebrewBins).map(linkMacCommand));
|
|
167
|
+
} else if (platform === "win32") {
|
|
168
|
+
const folders = new Set([
|
|
169
|
+
localAppData ? join(localAppData, "Programs", "Gloomberb", "bin") : "",
|
|
170
|
+
...pathEnv.split(";"),
|
|
171
|
+
].filter(Boolean));
|
|
172
|
+
added = await Promise.all([...folders].map(copyWindowsCommand));
|
|
173
|
+
}
|
|
174
|
+
return added.filter((path): path is string => path !== null);
|
|
175
|
+
}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Why an update step failed, as a fixed phase and code rather than the error
|
|
3
|
+
* text: the header says the reason in a few words, and error tracking gets
|
|
4
|
+
* the same two values, which carry no path, URL or account name.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
/** The step that failed. `relaunch` is getting back into the app after an install. */
|
|
8
|
+
export type UpdateFailurePhase = "check" | "download" | "verify" | "apply" | "relaunch";
|
|
9
|
+
|
|
10
|
+
const UPDATE_FAILURE_CODES = [
|
|
11
|
+
/** No route to the release server: offline, DNS, refused, TLS. */
|
|
12
|
+
"offline",
|
|
13
|
+
"timeout",
|
|
14
|
+
/** GitHub answered 403 or 429, its limit for requests without an account. */
|
|
15
|
+
"rate_limited",
|
|
16
|
+
"server_error",
|
|
17
|
+
/** The release has no such file (404). */
|
|
18
|
+
"not_found",
|
|
19
|
+
/** Any other refusal from the release server. */
|
|
20
|
+
"http_error",
|
|
21
|
+
/** The release list or manifest did not read as one. */
|
|
22
|
+
"bad_response",
|
|
23
|
+
/** The release has no build for this platform, or none with a checksum. */
|
|
24
|
+
"no_build",
|
|
25
|
+
/** The download stopped before the whole file arrived. */
|
|
26
|
+
"interrupted",
|
|
27
|
+
/** The file arrived whole but does not match its checksum, or does not unpack. */
|
|
28
|
+
"corrupt",
|
|
29
|
+
"permission_denied",
|
|
30
|
+
/** The macOS app runs from where it cannot be replaced: a disk image, App Translocation, another volume. */
|
|
31
|
+
"wrong_location",
|
|
32
|
+
/** The downloaded update and the installed app are on different disks, so the one cannot be moved onto the other. */
|
|
33
|
+
"cross_device",
|
|
34
|
+
"read_only",
|
|
35
|
+
"disk_full",
|
|
36
|
+
/** Another process holds the files being replaced. */
|
|
37
|
+
"file_in_use",
|
|
38
|
+
/** The update downloaded earlier is no longer where the install expects it. */
|
|
39
|
+
"staged_missing",
|
|
40
|
+
/** A restart into the update came back on the old version. */
|
|
41
|
+
"not_applied",
|
|
42
|
+
/** The app quit with a downloaded update waiting and was opened again on the old version. */
|
|
43
|
+
"not_restarted",
|
|
44
|
+
/** The install finished but the app did not come back by itself. */
|
|
45
|
+
"relaunch_missed",
|
|
46
|
+
"unknown",
|
|
47
|
+
] as const;
|
|
48
|
+
|
|
49
|
+
export type UpdateFailureCode = typeof UPDATE_FAILURE_CODES[number];
|
|
50
|
+
|
|
51
|
+
export interface UpdateFailure {
|
|
52
|
+
phase: UpdateFailurePhase;
|
|
53
|
+
code: UpdateFailureCode;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/** What an HTTP status from the release server means for an update. */
|
|
57
|
+
export function httpStatusFailureCode(status: number): UpdateFailureCode {
|
|
58
|
+
if (status === 403 || status === 429) return "rate_limited";
|
|
59
|
+
if (status === 404 || status === 410) return "not_found";
|
|
60
|
+
if (status >= 500) return "server_error";
|
|
61
|
+
return "http_error";
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
const OFFLINE_ERRNO = new Set([
|
|
65
|
+
"ENOTFOUND",
|
|
66
|
+
"EAI_AGAIN",
|
|
67
|
+
"ECONNREFUSED",
|
|
68
|
+
"ENETUNREACH",
|
|
69
|
+
"EHOSTUNREACH",
|
|
70
|
+
"ENETDOWN",
|
|
71
|
+
// Bun's fetch
|
|
72
|
+
"ConnectionRefused",
|
|
73
|
+
"FailedToOpenSocket",
|
|
74
|
+
"UnableToConnect",
|
|
75
|
+
"CERT_HAS_EXPIRED",
|
|
76
|
+
"UNABLE_TO_GET_ISSUER_CERT_LOCALLY",
|
|
77
|
+
"SELF_SIGNED_CERT_IN_CHAIN",
|
|
78
|
+
]);
|
|
79
|
+
const INTERRUPTED_ERRNO = new Set(["ECONNRESET", "EPIPE", "ECONNABORTED", "ConnectionClosed"]);
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* The code for an error a step threw, from its system error code first and its
|
|
83
|
+
* message second. Only the code leaves the machine; the message stays local.
|
|
84
|
+
*/
|
|
85
|
+
export function classifyUpdateError(error: unknown): UpdateFailureCode {
|
|
86
|
+
const record = (error && typeof error === "object" ? error : {}) as { code?: unknown; name?: unknown; message?: unknown };
|
|
87
|
+
const message = typeof record.message === "string" ? record.message : typeof error === "string" ? error : "";
|
|
88
|
+
// A system error code, or one named in the message ("Failed to replace app: EACCES: ...").
|
|
89
|
+
const errno = typeof record.code === "string" ? record.code : /\b(E[A-Z]{3,})\b/.exec(message)?.[1] ?? "";
|
|
90
|
+
switch (errno) {
|
|
91
|
+
case "EACCES":
|
|
92
|
+
case "EPERM":
|
|
93
|
+
return "permission_denied";
|
|
94
|
+
case "EROFS":
|
|
95
|
+
return "read_only";
|
|
96
|
+
case "ENOSPC":
|
|
97
|
+
case "EDQUOT":
|
|
98
|
+
return "disk_full";
|
|
99
|
+
case "EBUSY":
|
|
100
|
+
case "ETXTBSY":
|
|
101
|
+
return "file_in_use";
|
|
102
|
+
case "EXDEV":
|
|
103
|
+
return "cross_device";
|
|
104
|
+
case "ETIMEDOUT":
|
|
105
|
+
return "timeout";
|
|
106
|
+
}
|
|
107
|
+
if (OFFLINE_ERRNO.has(errno)) return "offline";
|
|
108
|
+
if (INTERRUPTED_ERRNO.has(errno)) return "interrupted";
|
|
109
|
+
if (record.name === "TimeoutError" || record.name === "AbortError") return "timeout";
|
|
110
|
+
|
|
111
|
+
const status = /\b(?:HTTP|returned|status|failed:?)\s*\(?(\d{3})\b/i.exec(message)?.[1];
|
|
112
|
+
if (status) return httpStatusFailureCode(Number(status));
|
|
113
|
+
if (/checksum mismatch|hash mismatch/i.test(message)) return "corrupt";
|
|
114
|
+
if (/zstd|decompress|gunzip|incorrect header|unexpected end of (?:file|data)/i.test(message)) return "corrupt";
|
|
115
|
+
if (/timed? ?out/i.test(message)) return "timeout";
|
|
116
|
+
if (/rate limit/i.test(message)) return "rate_limited";
|
|
117
|
+
if (/read-only file system/i.test(message)) return "read_only";
|
|
118
|
+
if (/cross-device/i.test(message)) return "cross_device";
|
|
119
|
+
if (/permission denied|operation not permitted|access is denied/i.test(message)) return "permission_denied";
|
|
120
|
+
if (/no space left|disk full/i.test(message)) return "disk_full";
|
|
121
|
+
if (/resource busy|text file busy|being used by another process/i.test(message)) return "file_in_use";
|
|
122
|
+
if (/connection (?:reset|closed|aborted)|socket hang up|premature close|terminated/i.test(message)) return "interrupted";
|
|
123
|
+
if (/unable to connect|fetch failed|failed to fetch|network|getaddrinfo|could not resolve|certificate/i.test(message)) return "offline";
|
|
124
|
+
if (/invalid update\.json|unexpected .*payload|json/i.test(message)) return "bad_response";
|
|
125
|
+
return "unknown";
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/** When the failure has no more specific reason: what the step was. */
|
|
129
|
+
const PHASE_REASONS: Record<UpdateFailurePhase, string> = {
|
|
130
|
+
check: "check failed",
|
|
131
|
+
download: "download failed",
|
|
132
|
+
verify: "could not verify the download",
|
|
133
|
+
apply: "could not install",
|
|
134
|
+
relaunch: "could not restart",
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
const CODE_REASONS: Partial<Record<UpdateFailureCode, string>> = {
|
|
138
|
+
offline: "no connection",
|
|
139
|
+
timeout: "connection timed out",
|
|
140
|
+
rate_limited: "GitHub rate limit",
|
|
141
|
+
server_error: "release server error",
|
|
142
|
+
not_found: "release server error",
|
|
143
|
+
http_error: "release server error",
|
|
144
|
+
bad_response: "unreadable release data",
|
|
145
|
+
no_build: "no build for this system",
|
|
146
|
+
interrupted: "download interrupted",
|
|
147
|
+
corrupt: "download corrupted",
|
|
148
|
+
permission_denied: "no permission to replace the app",
|
|
149
|
+
wrong_location: "move the app to Applications",
|
|
150
|
+
cross_device: "app and update on different disks",
|
|
151
|
+
read_only: "install folder is read-only",
|
|
152
|
+
disk_full: "disk full",
|
|
153
|
+
file_in_use: "app files in use",
|
|
154
|
+
staged_missing: "downloaded update missing",
|
|
155
|
+
};
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* The reason in a few words, in English (the caller translates it), sized
|
|
159
|
+
* for the header: "download interrupted", "no permission to replace the app".
|
|
160
|
+
*/
|
|
161
|
+
export function updateFailureReason(failure: UpdateFailure): string {
|
|
162
|
+
return CODE_REASONS[failure.code] ?? PHASE_REASONS[failure.phase];
|
|
163
|
+
}
|