gloomberb 0.17.0 → 0.17.2

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.
Files changed (201) hide show
  1. package/package.json +1 -1
  2. package/src/{plugins/builtin/cloud → account}/auth-dialog.tsx +7 -7
  3. package/src/api-client/data.ts +5 -1
  4. package/src/api-client/doe.ts +19 -0
  5. package/src/api-client/earnings.ts +4 -2
  6. package/src/api-client/index.ts +1 -0
  7. package/src/app/global-shortcuts.ts +10 -0
  8. package/src/app/keybindings/actions.ts +16 -0
  9. package/src/app/runtime/desktop-deeplink.ts +1 -1
  10. package/src/app/runtime/update.ts +16 -0
  11. package/src/app.tsx +1 -1
  12. package/src/architecture/core-builtin-allowlist.json +4 -9
  13. package/src/architecture/dom-cell-metrics-allowlist.json +100 -26
  14. package/src/cli/commands/market.ts +87 -17
  15. package/src/cli/commands/options-chain.ts +93 -23
  16. package/src/cli/commands/options-leaps.ts +462 -63
  17. package/src/cli/commands/search.ts +10 -7
  18. package/src/cli/commands/ticker.ts +19 -10
  19. package/src/cli/glossary.ts +1 -1
  20. package/src/cli/index.ts +14 -6
  21. package/src/cli/known-gaps.ts +22 -0
  22. package/src/cli/pane-functions/catalog.ts +45 -10
  23. package/src/cli/pane-functions/dom.ts +36 -10
  24. package/src/cli/pane-functions/function-help.ts +4 -2
  25. package/src/cli/pane-functions/headless.ts +12 -1
  26. package/src/cli/pane-functions/index.ts +44 -3
  27. package/src/cli/pane-functions/lock-note.ts +56 -0
  28. package/src/cli/pane-functions/report-notices.ts +15 -0
  29. package/src/cli/symbol-args.ts +19 -0
  30. package/src/components/command-bar/list/view.tsx +2 -1
  31. package/src/components/command-bar/workflow/builtin.ts +2 -2
  32. package/src/components/command-bar/workflow/collection-actions.ts +1 -1
  33. package/src/components/feedback-dialog.tsx +1 -1
  34. package/src/components/index.ts +3 -2
  35. package/src/components/layout/header.tsx +58 -14
  36. package/src/components/layout/shell/chrome.ts +10 -4
  37. package/src/components/layout/shell/index.tsx +1 -1
  38. package/src/components/layout/status-bar-groups.ts +1 -1
  39. package/src/components/layout/status-bar.tsx +2 -2
  40. package/src/components/markdown-text.tsx +14 -2
  41. package/src/components/reader/article-reader.tsx +1 -1
  42. package/src/components/reader/detail-reader.tsx +10 -7
  43. package/src/components/reader/reader-text.tsx +32 -17
  44. package/src/components/ui/column-grid.tsx +206 -0
  45. package/src/components/ui/display.tsx +40 -3
  46. package/src/components/ui/fill.ts +8 -0
  47. package/src/components/ui/index.ts +2 -0
  48. package/src/layout-marketplace/gallery.tsx +2 -2
  49. package/src/layout-marketplace/linked-sync.ts +1 -1
  50. package/src/market-data/market/freshness.ts +3 -0
  51. package/src/market-data/published-apac-sessions.ts +12 -2
  52. package/src/market-data/quotes/screener-live-quotes.ts +31 -7
  53. package/src/plugins/builtin/account-management/form-components.tsx +4 -7
  54. package/src/plugins/builtin/account-management/password-dialog.tsx +3 -2
  55. package/src/plugins/builtin/backtest/pane.tsx +9 -3
  56. package/src/plugins/builtin/buildout/detail/company.tsx +4 -3
  57. package/src/plugins/builtin/buildout/detail/ui.tsx +9 -12
  58. package/src/plugins/builtin/chart-composer/index.tsx +1 -1
  59. package/src/plugins/builtin/chart-composer/presets.ts +33 -1
  60. package/src/plugins/builtin/chat/channel-labels.ts +2 -2
  61. package/src/plugins/builtin/chat/content/channel-navigation.ts +1 -1
  62. package/src/plugins/builtin/chat/content/index.tsx +2 -2
  63. package/src/plugins/builtin/chat/conversations.ts +1 -1
  64. package/src/plugins/builtin/chat/index.tsx +2 -2
  65. package/src/plugins/builtin/chat/share/flow.tsx +1 -1
  66. package/src/plugins/builtin/chat/sidebar-rows.ts +1 -1
  67. package/src/plugins/builtin/chat/sidebar.tsx +2 -2
  68. package/src/plugins/builtin/chat/unread-inbox-pane.tsx +2 -2
  69. package/src/plugins/builtin/cloud/askg/pane.tsx +2 -1
  70. package/src/plugins/builtin/cloud/askg/tool-timeline.tsx +3 -2
  71. package/src/plugins/builtin/cloud/auth-actions.tsx +1 -1
  72. package/src/plugins/builtin/cloud/auth-commands.ts +1 -1
  73. package/src/plugins/builtin/cloud/mcp-connect/dialog.tsx +1 -1
  74. package/src/plugins/builtin/cloud/team/acm-tab.tsx +3 -3
  75. package/src/plugins/builtin/cloud/team/capability.ts +2 -2
  76. package/src/plugins/builtin/cloud/team/command.ts +4 -4
  77. package/src/plugins/builtin/cloud/team/module.tsx +3 -3
  78. package/src/plugins/builtin/cloud/team/pane-model.ts +2 -2
  79. package/src/plugins/builtin/cloud/team/pane-sections.tsx +1 -1
  80. package/src/plugins/builtin/cloud/team/pane-ui.tsx +1 -1
  81. package/src/plugins/builtin/cloud/team/pane.tsx +3 -3
  82. package/src/plugins/builtin/cloud/team/status-widget.tsx +3 -3
  83. package/src/plugins/builtin/cloud/team/team-state-host.ts +1 -1
  84. package/src/plugins/builtin/cloud/team/views.ts +2 -2
  85. package/src/plugins/builtin/cloud/thesis/board-pane.tsx +1 -1
  86. package/src/plugins/builtin/cloud/thesis/detail.tsx +12 -10
  87. package/src/plugins/builtin/cloud/thesis/ticker-tab.tsx +1 -1
  88. package/src/plugins/builtin/cloud/upgrade-command.ts +1 -1
  89. package/src/plugins/builtin/congress-trades/detail.tsx +8 -4
  90. package/src/plugins/builtin/connections/pane.tsx +16 -5
  91. package/src/plugins/builtin/cpi/pane.tsx +5 -4
  92. package/src/plugins/builtin/custom-view/pane.tsx +2 -2
  93. package/src/plugins/builtin/dividend-yield/headless.ts +8 -2
  94. package/src/plugins/builtin/dividend-yield/pane.tsx +4 -2
  95. package/src/plugins/builtin/docs/blocks.tsx +13 -2
  96. package/src/plugins/builtin/docs/pane.tsx +6 -5
  97. package/src/plugins/builtin/doe/index.tsx +11 -4
  98. package/src/plugins/builtin/doe/pane.tsx +5 -4
  99. package/src/plugins/builtin/doe/prices.ts +84 -0
  100. package/src/plugins/builtin/doe/series.ts +4 -1
  101. package/src/plugins/builtin/earnings/board-model.ts +18 -1
  102. package/src/plugins/builtin/earnings/board-table.ts +18 -3
  103. package/src/plugins/builtin/earnings/headless.ts +13 -2
  104. package/src/plugins/builtin/earnings/history-model.ts +1 -1
  105. package/src/plugins/builtin/earnings/history-table.ts +2 -2
  106. package/src/plugins/builtin/earnings-calls/headless.ts +7 -21
  107. package/src/plugins/builtin/earnings-calls/index.tsx +2 -0
  108. package/src/plugins/builtin/earnings-calls/lock-note.ts +17 -0
  109. package/src/plugins/builtin/equity-screener/headless.ts +59 -1
  110. package/src/plugins/builtin/equity-screener/live.ts +82 -31
  111. package/src/plugins/builtin/equity-screener/pane.tsx +60 -23
  112. package/src/plugins/builtin/estimate-revisions/client.ts +1 -1
  113. package/src/plugins/builtin/estimate-revisions/headless.ts +9 -2
  114. package/src/plugins/builtin/estimate-revisions/index.tsx +3 -0
  115. package/src/plugins/builtin/estimate-revisions/lock-note.ts +23 -0
  116. package/src/plugins/builtin/executives/index.tsx +18 -0
  117. package/src/plugins/builtin/exposure/charts.tsx +4 -3
  118. package/src/plugins/builtin/filing-events/index.tsx +8 -10
  119. package/src/plugins/builtin/fixed-income/pane.tsx +2 -1
  120. package/src/plugins/builtin/gpu/equities.tsx +9 -6
  121. package/src/plugins/builtin/help/feedback-tab.tsx +1 -1
  122. package/src/plugins/builtin/iv-history/format.ts +3 -0
  123. package/src/plugins/builtin/iv-history/headless.ts +3 -1
  124. package/src/plugins/builtin/iv-history/index.tsx +3 -1
  125. package/src/plugins/builtin/iv-history/model.ts +3 -1
  126. package/src/plugins/builtin/iv-history/screen-pane.tsx +3 -1
  127. package/src/plugins/builtin/iv-history/universe.ts +1 -1
  128. package/src/plugins/builtin/jobs/headless.ts +6 -20
  129. package/src/plugins/builtin/jobs/index.tsx +2 -0
  130. package/src/plugins/builtin/jobs/lock-note.ts +16 -0
  131. package/src/plugins/builtin/notes/index.tsx +1 -1
  132. package/src/plugins/builtin/notes/owner.tsx +2 -2
  133. package/src/plugins/builtin/options/carry.ts +36 -0
  134. package/src/plugins/builtin/options/index.tsx +2 -1
  135. package/src/plugins/builtin/options/model-spot.ts +94 -0
  136. package/src/plugins/builtin/options/open-interest-as-of.ts +74 -0
  137. package/src/plugins/builtin/options/view.tsx +69 -11
  138. package/src/plugins/builtin/options-calculator/pane.tsx +56 -1
  139. package/src/plugins/builtin/options-calculator/premium-history.ts +34 -0
  140. package/src/plugins/builtin/options-scenario/client.ts +33 -9
  141. package/src/plugins/builtin/options-scenario/csp.ts +168 -0
  142. package/src/plugins/builtin/options-scenario/evidence.ts +3 -0
  143. package/src/plugins/builtin/options-scenario/headless.ts +24 -8
  144. package/src/plugins/builtin/options-scenario/index.tsx +3 -1
  145. package/src/plugins/builtin/options-scenario/pane.tsx +32 -6
  146. package/src/plugins/builtin/portfolio-list/mutations.ts +1 -1
  147. package/src/plugins/builtin/portfolio-list/pane/remove-ticker.ts +1 -1
  148. package/src/plugins/builtin/research/corporate-actions-pane.tsx +4 -2
  149. package/src/plugins/builtin/research/event-model.ts +7 -4
  150. package/src/plugins/builtin/risk-factors/index.tsx +18 -0
  151. package/src/plugins/builtin/risk-factors/pane.tsx +2 -1
  152. package/src/plugins/builtin/scanner/headless.ts +9 -2
  153. package/src/plugins/builtin/scanner/index.ts +3 -0
  154. package/src/plugins/builtin/scanner/lock-note.ts +17 -0
  155. package/src/plugins/builtin/series-inventory.ts +2 -1
  156. package/src/plugins/builtin/shared/cloud-denied.ts +39 -8
  157. package/src/plugins/builtin/shared/earnings-report.ts +10 -4
  158. package/src/plugins/builtin/shared/pro-lock-note.ts +58 -0
  159. package/src/plugins/builtin/shared/series-list-detail.tsx +10 -5
  160. package/src/plugins/builtin/social-mentions/client.ts +3 -3
  161. package/src/plugins/builtin/social-mentions/headless.ts +6 -2
  162. package/src/plugins/builtin/social-mentions/index.tsx +2 -1
  163. package/src/plugins/builtin/social-mentions/lock-note.ts +15 -0
  164. package/src/plugins/builtin/supply-chain/flow.tsx +15 -13
  165. package/src/plugins/builtin/supply-chain/graph.tsx +6 -4
  166. package/src/plugins/builtin/supply-chain/pane.tsx +8 -5
  167. package/src/plugins/builtin/ticker-detail/financials/aggregation.ts +14 -1
  168. package/src/plugins/builtin/ticker-detail/financials/ratios.ts +9 -7
  169. package/src/plugins/builtin/ticker-detail/headless.ts +4 -1
  170. package/src/plugins/builtin/ticker-detail/overview/components.tsx +105 -104
  171. package/src/plugins/builtin/ticker-detail/overview/model.ts +9 -2
  172. package/src/plugins/builtin/ticker-detail/overview-tab.tsx +34 -8
  173. package/src/plugins/builtin/vol-surface/pane.tsx +6 -3
  174. package/src/public/__snapshots__/public-api.test.ts.snap +2 -0
  175. package/src/renderers/dom/data-table/index.tsx +48 -15
  176. package/src/renderers/dom/data-table/row.tsx +1 -1
  177. package/src/renderers/dom/desktop/popover.tsx +6 -15
  178. package/src/renderers/dom/host/input.tsx +27 -3
  179. package/src/renderers/dom/host/surface-3d.tsx +6 -4
  180. package/src/renderers/dom/styles.css +26 -6
  181. package/src/renderers/electrobun/view/app-services.ts +2 -22
  182. package/src/renderers/electrobun/view/news-source.ts +42 -0
  183. package/src/series/validate.ts +5 -0
  184. package/src/shares/dialog.tsx +2 -1
  185. package/src/sources/gloomberb-cloud/normalizers.ts +2 -0
  186. package/src/sources/provider-router/financials.ts +5 -0
  187. package/src/{plugins/builtin/cloud/team → team}/collections-sync.ts +6 -6
  188. package/src/{plugins/builtin/cloud/team → team}/collections.ts +3 -3
  189. package/src/{plugins/builtin/cloud/team → team}/model.ts +2 -2
  190. package/src/{plugins/builtin/cloud/team → team}/pane-request.ts +1 -1
  191. package/src/{plugins/builtin/cloud/team → team}/store.ts +3 -3
  192. package/src/types/data-provider.ts +3 -0
  193. package/src/types/financials.ts +28 -0
  194. package/src/types/plugin.ts +17 -4
  195. package/src/utils/decimal-comma.ts +18 -0
  196. package/src/utils/exchanges.ts +7 -0
  197. package/src/utils/financial-statements.ts +25 -0
  198. package/src/utils/forward-dividend.ts +39 -9
  199. package/src/utils/fundamentals.ts +41 -1
  200. package/src/utils/option-expiry.ts +16 -0
  201. package/src/utils/sec.ts +2 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gloomberb",
3
- "version": "0.17.0",
3
+ "version": "0.17.2",
4
4
  "packageManager": "bun@1.3.11",
5
5
  "description": "Market research and portfolio tracker for the terminal",
6
6
  "module": "src/public/index.ts",
@@ -6,13 +6,13 @@
6
6
  * hosted terminal's sign-in gate reuses.
7
7
  */
8
8
  import { useEffect, useRef, useState } from "react";
9
- import type { AuthUser } from "../../../api-client";
10
- import { DialogFrame } from "../../../components/ui/frame";
11
- import { useAppLanguage } from "../../../i18n/react";
12
- import { useDialog, type PromptContext } from "../../../ui/dialog";
13
- import { AuthForm, authFormTitle } from "../../../account/auth-form";
14
- import type { AccountMode } from "../../../account/auth-model";
15
- import { CloudVerificationPanel } from "../../../account/verification-panel";
9
+ import type { AuthUser } from "../api-client";
10
+ import { DialogFrame } from "../components/ui/frame";
11
+ import { useAppLanguage } from "../i18n/react";
12
+ import { useDialog, type PromptContext } from "../ui/dialog";
13
+ import { AuthForm, authFormTitle } from "./auth-form";
14
+ import type { AccountMode } from "./auth-model";
15
+ import { CloudVerificationPanel } from "./verification-panel";
16
16
 
17
17
  function AuthDialog({
18
18
  initialMode,
@@ -38,7 +38,7 @@ import type { BeneficialOwnersPayload, CloudBeneficialOwnersParams } from "./ben
38
38
  import type { SocialMentionDayPosts, SocialMentionsPayload, SocialMentionsRange } from "./social-mentions";
39
39
  import type { FuturesContractTermsPayload, FuturesCurveAsOfPayload, FuturesCurvePayload } from "./futures-curve";
40
40
  import type { CotBoardPayload, CotContractPayload, CotFamily, CotClass } from "./cot";
41
- import type { DoeBoardPayload } from "./doe";
41
+ import type { DoeBoardPayload, DoePricesPayload } from "./doe";
42
42
  import type { CarbonBoard, CarbonHistory, EuropePowerBoard, EuropePowerHistory, GasStorageBoard, GasStorageHistory, GasStorageSeasonal } from "./europe-energy";
43
43
  import type { GpuBoardPayload, GpuEventsPayload, GpuHistoryPayload, GpuHistoryQuery } from "./gpu";
44
44
  import type { CpiBoardPayload } from "./cpi";
@@ -586,6 +586,10 @@ export class CloudDataApi {
586
586
  return this.request<DoeBoardPayload>("/cloud/doe/board");
587
587
  }
588
588
 
589
+ async getCloudDoePrices(): Promise<DoePricesPayload> {
590
+ return this.request<DoePricesPayload>("/cloud/doe/prices");
591
+ }
592
+
589
593
  async getCloudAttention(window: AttentionWindow = "now", symbol?: string): Promise<AttentionPayload> {
590
594
  const path = symbol ? `/cloud/attention/${encodeURIComponent(symbol)}` : "/cloud/attention";
591
595
  return this.request<AttentionPayload>(`${path}?window=${window}`);
@@ -73,3 +73,22 @@ export interface DoeBoardPayload {
73
73
  reports: DoeReportStatus[];
74
74
  series: DoeSeriesRow[];
75
75
  }
76
+
77
+ /** One EIA weekly US retail price series, as GET /cloud/doe/prices serves it. */
78
+ interface DoePriceSeries {
79
+ id: string;
80
+ /** The EIA source key, which a report cites. */
81
+ key: string;
82
+ label: string;
83
+ unit: "usd-per-gallon";
84
+ /** [Monday the EIA surveyed, dollars per gallon], oldest first, the last five years. */
85
+ points: Array<[string, number]>;
86
+ }
87
+
88
+ export interface DoePricesPayload {
89
+ source: "EIA";
90
+ generatedAt: string;
91
+ status: "available" | "partial" | "unavailable";
92
+ gaps: string[];
93
+ series: DoePriceSeries[];
94
+ }
@@ -38,7 +38,9 @@ export interface EarningsReport {
38
38
  reportedAt: string | null;
39
39
  /** Fiscal quarter end month, YYYY-MM. */
40
40
  fiscalPeriod: string | null;
41
+ /** The company's cap as RV reads it: its latest snapshot at the regular session's price. */
41
42
  marketCap: number | null;
43
+ /** For an upcoming report, the consensus every earnings view shows, with `epsAnalysts` behind it. */
42
44
  epsEstimate: number | null;
43
45
  epsActual: number | null;
44
46
  epsAnalysts: number | null;
@@ -48,6 +50,8 @@ export interface EarningsReport {
48
50
  realized: EarningsRealizedMove | null;
49
51
  /** Whether the date is out, announced or projected; absent from older servers. */
50
52
  dateStatus?: EarningsDateStatus;
53
+ /** The reported figure's basis, null when it cannot be determined; absent from older servers. */
54
+ epsBasis?: EarningsEpsBasis | null;
51
55
  }
52
56
 
53
57
  export interface EarningsCalendarReport extends EarningsReport {
@@ -65,8 +69,6 @@ export interface EarningsCalendarPayload {
65
69
 
66
70
  interface EarningsHistoryReport extends EarningsReport {
67
71
  revenueActual: number | null;
68
- /** Null when the basis cannot be determined; absent from older servers. */
69
- epsBasis?: EarningsEpsBasis | null;
70
72
  }
71
73
 
72
74
  export interface EarningsHistoryPayload {
@@ -812,6 +812,7 @@ class GloomApiClient {
812
812
  getCloudAwards = this.data.getCloudAwards.bind(this.data);
813
813
  getCloudAward = this.data.getCloudAward.bind(this.data);
814
814
  getCloudDoeBoard = this.data.getCloudDoeBoard.bind(this.data);
815
+ getCloudDoePrices = this.data.getCloudDoePrices.bind(this.data);
815
816
  getCloudAttention = this.data.getCloudAttention.bind(this.data);
816
817
  getCloudPowerBoard = this.data.getCloudPowerBoard.bind(this.data);
817
818
  getCloudPowerHistory = this.data.getCloudPowerHistory.bind(this.data);
@@ -212,6 +212,16 @@ export function useAppGlobalShortcuts({
212
212
  return;
213
213
  }
214
214
 
215
+ // Text fields keep Cmd+Z. Everywhere else it restores the previous layout.
216
+ // A detached window has no layout history of its own.
217
+ if (action === "layout-undo" || action === "layout-redo") {
218
+ if (isDetachedWindow || dialogOpen || state.commandBarOpen || state.inputCaptured || event.targetEditable === true) return;
219
+ event.preventDefault();
220
+ event.stopPropagation();
221
+ dispatch({ type: action === "layout-undo" ? "UNDO_LAYOUT" : "REDO_LAYOUT" });
222
+ return;
223
+ }
224
+
215
225
  if (dialogOpen) return;
216
226
 
217
227
  if (!isDetachedWindow && action === "command-bar") {
@@ -30,6 +30,8 @@ export type CoreKeybindingActionId =
30
30
  | "pane-share"
31
31
  | "pane-ask"
32
32
  | "layout-gallery"
33
+ | "layout-undo"
34
+ | "layout-redo"
33
35
  | "tidy-windows"
34
36
  | "window-move-mode"
35
37
  | "window-resize-mode";
@@ -62,6 +64,8 @@ export const PANE_ACTION_IDS = new Set<CoreKeybindingActionId>([
62
64
  "pane-share",
63
65
  "pane-ask",
64
66
  "layout-gallery",
67
+ "layout-undo",
68
+ "layout-redo",
65
69
  "tidy-windows",
66
70
  "window-move-mode",
67
71
  "window-resize-mode",
@@ -245,6 +249,18 @@ export const KEYBINDING_ACTIONS: readonly KeybindingActionDef[] = [
245
249
  description: "Open layout actions.",
246
250
  defaults: ["CmdOrCtrl+Shift+L"],
247
251
  },
252
+ {
253
+ id: "layout-undo",
254
+ category: "Pane Management",
255
+ description: "Undo the last layout change.",
256
+ defaults: ["CmdOrCtrl+Z"],
257
+ },
258
+ {
259
+ id: "layout-redo",
260
+ category: "Pane Management",
261
+ description: "Redo the last undone layout change.",
262
+ defaults: ["CmdOrCtrl+Shift+Z"],
263
+ },
248
264
  {
249
265
  id: "tidy-windows",
250
266
  category: "Pane Management",
@@ -11,7 +11,7 @@ import {
11
11
  import type { DesktopDeepLinkBridge } from "../../types/desktop-deeplink";
12
12
  import type { DesktopWindowBridge } from "../../types/desktop-window";
13
13
  import { requestAccountManagementTab } from "../../plugins/builtin/account-management/navigation";
14
- import { openTeamPane } from "../../plugins/builtin/cloud/team/pane-request";
14
+ import { openTeamPane } from "../../team/pane-request";
15
15
  import { chatController } from "../../plugins/builtin/chat/controller";
16
16
  import { getShare, type ShareRecord } from "../../shares/api";
17
17
  import { openShareLink, registerShareOpener } from "../../shares/open";
@@ -10,13 +10,25 @@ import {
10
10
  performUpdate,
11
11
  type ReleaseInfo,
12
12
  type UpdateCheckResult,
13
+ type UpdateProgress,
13
14
  } from "../../updater";
14
15
  import { VERSION } from "../../version";
16
+ import { debugLog } from "../../utils/debug-log";
15
17
  import { reportCrash } from "../../telemetry/crash-reports";
16
18
  import { runAutomated } from "../../telemetry/usage-counts";
17
19
 
18
20
  const UPDATE_CHECK_INTERVAL_MS = 60 * 60_000; // hourly
19
21
 
22
+ const updateLog = debugLog.createLogger("update");
23
+
24
+ /**
25
+ * The header and the command bar show a failed update's message, and the header
26
+ * cuts it to its room: the log keeps what the updater actually said.
27
+ */
28
+ function logUpdateFailure(progress: UpdateProgress): void {
29
+ if (progress.phase === "error") updateLog.error("update failed", { error: progress.error });
30
+ }
31
+
20
32
  /** An update is being downloaded, applied, or is downloaded and waiting for a restart. */
21
33
  function updateInFlight(progress: AppState["updateProgress"]): boolean {
22
34
  return progress?.phase === "downloading" || progress?.phase === "replacing" || progress?.phase === "ready";
@@ -53,6 +65,7 @@ export function useAppUpdateRuntime({
53
65
  const startUpdate = useCallback((release: ReleaseInfo) => {
54
66
  dispatch({ type: "SET_UPDATE_PROGRESS", progress: { phase: "downloading", percent: 0 } });
55
67
  void performUpdate(release, (progress) => {
68
+ logUpdateFailure(progress);
56
69
  dispatch({ type: "SET_UPDATE_PROGRESS", progress });
57
70
  });
58
71
  }, [dispatch]);
@@ -66,6 +79,7 @@ export function useAppUpdateRuntime({
66
79
  dispatch({ type: "SET_UPDATE_PROGRESS", progress: { phase: "replacing" } });
67
80
  void applyUpdate((progress) => {
68
81
  if (progress.phase === "error") restartingRef.current = false;
82
+ logUpdateFailure(progress);
69
83
  dispatch({ type: "SET_UPDATE_PROGRESS", progress });
70
84
  });
71
85
  }, [dispatch, enabled, isDetachedWindow, stateRef]);
@@ -91,6 +105,8 @@ export function useAppUpdateRuntime({
91
105
  return { kind: "error", error: message || "Update check failed" };
92
106
  });
93
107
 
108
+ if (result.kind === "error") updateLog.warn("update check failed", { error: result.error });
109
+
94
110
  if (!manual) {
95
111
  if (result.kind === "available") {
96
112
  dispatch({ type: "SET_UPDATE_AVAILABLE", release: result.release });
package/src/app.tsx CHANGED
@@ -14,7 +14,7 @@ import { Header } from "./components/layout/header";
14
14
  import { StatusBar } from "./components/layout/status-bar";
15
15
  import { useAppChromeShown } from "./components/layout/presentation";
16
16
  import { useLinkedLayoutSync } from "./layout-marketplace/linked-sync";
17
- import { useTeamCollectionsSync } from "./plugins/builtin/cloud/team/collections-sync";
17
+ import { useTeamCollectionsSync } from "./team/collections-sync";
18
18
  import { Shell } from "./components/layout/shell";
19
19
  import { DetachedPaneShell } from "./components/layout/detached-pane-shell";
20
20
  import { TransientLayoutProvider } from "./components/layout/transient-layout";
@@ -4,11 +4,11 @@
4
4
  "src/app/global-shortcuts.ts": ["help"],
5
5
  "src/app/pane-runtime/plugin-bindings.ts": ["broker-manager","layout-manager"],
6
6
  "src/app/runtime/broker-import.ts": ["portfolio-list"],
7
- "src/app/runtime/desktop-deeplink.ts": ["account-management","chat","cloud"],
7
+ "src/app/runtime/desktop-deeplink.ts": ["account-management","chat"],
8
8
  "src/app/runtime/startup.ts": ["chat"],
9
9
  "src/cli/commands/market.ts": ["holders","insider","research","sec"],
10
10
  "src/cli/commands/options-chain.ts": ["options","options-calculator"],
11
- "src/cli/commands/options-leaps.ts": ["options","vol-surface"],
11
+ "src/cli/commands/options-leaps.ts": ["iv-history","options","vol-surface"],
12
12
  "src/cli/commands/overview.ts": ["correlation","econ","market-movers","sectors","world-indices"],
13
13
  "src/cli/commands/ticker.ts": ["notes"],
14
14
  "src/cli/desktop-pane-shot.ts": ["market-valuation","time-sales"],
@@ -24,21 +24,16 @@
24
24
  "src/components/command-bar/routes/root/command-items.ts": ["portfolio-list"],
25
25
  "src/components/command-bar/routes/root/help-items.ts": ["help"],
26
26
  "src/components/command-bar/routes/root/shortcut-items.ts": ["portfolio-list"],
27
- "src/components/command-bar/workflow/builtin.ts": ["cloud","portfolio-list"],
28
- "src/components/command-bar/workflow/collection-actions.ts": ["cloud","portfolio-list"],
27
+ "src/components/command-bar/workflow/builtin.ts": ["portfolio-list"],
28
+ "src/components/command-bar/workflow/collection-actions.ts": ["portfolio-list"],
29
29
  "src/components/command-bar/workflow/ops.ts": ["correlation","portfolio-list","ticker-detail"],
30
30
  "src/components/command-bar/workflow/tickers.ts": ["portfolio-list"],
31
- "src/components/feedback-dialog.tsx": ["cloud"],
32
31
  "src/components/form-modal/routes.ts": ["portfolio-list"],
33
32
  "src/components/index.ts": ["portfolio-list"],
34
33
  "src/components/layout/shell/index.tsx": ["cloud"],
35
- "src/components/layout/status-bar-groups.ts": ["cloud"],
36
- "src/components/layout/status-bar.tsx": ["cloud"],
37
34
  "src/components/onboarding/use-onboarding-upgrade.ts": ["chat"],
38
35
  "src/components/onboarding/wizard-model.ts": ["portfolio-list"],
39
36
  "src/components/onboarding/wizard-positions.ts": ["portfolio-list"],
40
- "src/layout-marketplace/gallery.tsx": ["cloud"],
41
- "src/layout-marketplace/linked-sync.ts": ["cloud"],
42
37
  "src/layout/desks.ts": ["chart-composer"],
43
38
  "src/plugins/catalog-browser.ts": ["alerts","analytics","attention","awards","backtest","bond-calculator","catalysts","cds","central-bank-rates","changelog","chart-composer","clinical-trials","cloud","comment-letters","commodities-energy","commodity-balances","company-attention","company-kpis","connections","correlation","cot","cpi","credit-boards","credit-conditions","credit-documents","crypto-board","debt-maturities","dividend-yield","docs","doe","earnings-calls","earnings-ripple","econ","econ-statistics","equity-screener","estimate-revisions","executives","exposure","fear-greed","filing-events","fixed-income","futures","futures-curve","fx-matrix","gpu","help","insider","ipo-calendar","iv-history","jobs","jodi","kelly-sizer","layout-manager","macro-day","market-halts","market-heatmap","market-valuation","members","mna","money-markets","news","openfda","options","options-calculator","options-positioning","options-scenario","pe-band","perps","portfolio-list","power","primary-dealers","rate-path","realized-vol","relative-rotation","research","research-search","revenue-breakdown","reverse-dcf","risk-factors","scanner","seasonality","sec","sectors","short-interest","short-volume","social-mentions","supply-chain","ticker-detail","time-sales","trace-bonds","treasury-auctions","treasury-daily","vol-surface","volatility","world-indices","world-venue-map","yield-curve"],
44
39
  "src/plugins/catalog-ui.ts": ["alerts","clinical-trials","cloud","comment-letters","custom-view","fear-greed","ipo-calendar","market-halts","market-heatmap","members","news","notes","openfda","research-search"],
@@ -1,28 +1,102 @@
1
1
  {
2
- "src/components/layout/pane/header.tsx": 2,
3
- "src/components/layout/pane/sizing.ts": 3,
4
- "src/components/layout/shell/drag/slide.ts": 4,
5
- "src/components/layout/shell/pane/layers.tsx": 6,
6
- "src/components/ui/select-button.tsx": 2,
7
- "src/renderers/dom/data-table/dom.ts": 26,
8
- "src/renderers/dom/data-table/index.tsx": 21,
9
- "src/renderers/dom/data-table/row.tsx": 11,
10
- "src/renderers/dom/desktop/controls.tsx": 6,
11
- "src/renderers/dom/desktop/list-view.tsx": 2,
12
- "src/renderers/dom/desktop/popover.tsx": 6,
13
- "src/renderers/dom/desktop/query-bar.tsx": 1,
14
- "src/renderers/dom/desktop/select-field.tsx": 2,
15
- "src/renderers/dom/dom-ui-host.tsx": 6,
16
- "src/renderers/dom/host/input.tsx": 5,
17
- "src/renderers/dom/host/live-frame.ts": 8,
18
- "src/renderers/dom/host/mouse.ts": 10,
19
- "src/renderers/dom/host/scroll-box.tsx": 22,
20
- "src/renderers/dom/host/size-observer.ts": 6,
21
- "src/renderers/dom/host/style.ts": 27,
22
- "src/renderers/dom/host/surface-fit.ts": 4,
23
- "src/renderers/dom/host/tabs.tsx": 2,
24
- "src/renderers/dom/host/text.tsx": 2,
25
- "src/renderers/dom/input-host.tsx": 4,
26
- "src/renderers/dom/native-renderer.ts": 4,
27
- "src/renderers/dom/styles.css": 17
2
+ "src/components/layout/pane/header.tsx": {
3
+ "uses": 2,
4
+ "why": "The title bar's inset for the window controls comes from the shell's header geometry, which the terminal shares, in cells."
5
+ },
6
+ "src/components/layout/pane/sizing.ts": {
7
+ "uses": 3,
8
+ "why": "Panes receive their size in cells (PaneProps); this gives the desktop's taller chrome row in those cells."
9
+ },
10
+ "src/components/layout/shell/drag/slide.ts": {
11
+ "uses": 4,
12
+ "why": "A dragged pane moves by offsets of the saved layout, which is kept in cells."
13
+ },
14
+ "src/components/layout/shell/pane/layers.tsx": {
15
+ "uses": 6,
16
+ "why": "Pane rectangles in the saved layout are in cells; this is where they become pixels."
17
+ },
18
+ "src/components/ui/select-button.tsx": {
19
+ "uses": 2,
20
+ "why": "A select's width is given in cells by the pane, as its terminal button's is."
21
+ },
22
+ "src/renderers/dom/data-table/dom.ts": {
23
+ "uses": 26,
24
+ "why": "The table's scroll and pointer API speaks rows and columns to callers shared with the terminal (j/k, paging, visible range); a row of text is one line tall."
25
+ },
26
+ "src/renderers/dom/data-table/index.tsx": {
27
+ "uses": 19,
28
+ "why": "Every pane gives its columns in cells (DataTableColumn.width) and rows are one line tall: the horizontal extent, the overflow decision, virtualization and paging follow from them."
29
+ },
30
+ "src/renderers/dom/data-table/row.tsx": {
31
+ "uses": 10,
32
+ "why": "Column widths and gaps are cells in the column model every pane uses; a row is one line tall."
33
+ },
34
+ "src/renderers/dom/desktop/controls.tsx": {
35
+ "uses": 6,
36
+ "why": "Callers give a button's size in cells; a framed field keeps its text one cell off its frame, as the terminal's does."
37
+ },
38
+ "src/renderers/dom/desktop/list-view.tsx": {
39
+ "uses": 2,
40
+ "why": "The caller gives a list's height in rows."
41
+ },
42
+ "src/renderers/dom/desktop/query-bar.tsx": {
43
+ "uses": 1,
44
+ "why": "The pane gives its search field's width in cells."
45
+ },
46
+ "src/renderers/dom/desktop/select-field.tsx": {
47
+ "uses": 2,
48
+ "why": "An inline select is one row tall, the row it sits in."
49
+ },
50
+ "src/renderers/dom/dom-ui-host.tsx": {
51
+ "uses": 6,
52
+ "why": "Exposes the cell size to components that still size in cells (chart bitmaps, the company logo)."
53
+ },
54
+ "src/renderers/dom/host/input.tsx": {
55
+ "uses": 3,
56
+ "why": "Callers give a field's width and height in cells; a one-line field is one row tall."
57
+ },
58
+ "src/renderers/dom/host/live-frame.ts": {
59
+ "uses": 8,
60
+ "why": "A resize's live frame is in cells, the pane's unit, until the pane renders at the new size."
61
+ },
62
+ "src/renderers/dom/host/mouse.ts": {
63
+ "uses": 10,
64
+ "why": "Pointer handlers receive cell coordinates, the event API every renderer shares."
65
+ },
66
+ "src/renderers/dom/host/scroll-box.tsx": {
67
+ "uses": 22,
68
+ "why": "The scroller's API (scrollTop, scrollBy, viewport) is in rows and columns for callers shared with the terminal; content insets are given in cells."
69
+ },
70
+ "src/renderers/dom/host/size-observer.ts": {
71
+ "uses": 6,
72
+ "why": "Observed sizes are reported in cells, as callers expect."
73
+ },
74
+ "src/renderers/dom/host/style.ts": {
75
+ "uses": 27,
76
+ "why": "Maps the shared Box and Text props that components give in cells (width, height, padding, margin, gap, position) to pixels."
77
+ },
78
+ "src/renderers/dom/host/surface-fit.ts": {
79
+ "uses": 4,
80
+ "why": "A chart takes its box when its cells come within a cell of it, because panes still count their space in cells."
81
+ },
82
+ "src/renderers/dom/host/tabs.tsx": {
83
+ "uses": 2,
84
+ "why": "A tab strip is one row tall, the row every caller reserves for it."
85
+ },
86
+ "src/renderers/dom/host/text.tsx": {
87
+ "uses": 2,
88
+ "why": "The ASCII wordmark draws one glyph per cell."
89
+ },
90
+ "src/renderers/dom/input-host.tsx": {
91
+ "uses": 4,
92
+ "why": "The viewport is reported in cells (useViewport), the unit every renderer shares."
93
+ },
94
+ "src/renderers/dom/native-renderer.ts": {
95
+ "uses": 4,
96
+ "why": "The renderer's width and height are reported in cells, the unit every renderer shares."
97
+ },
98
+ "src/renderers/dom/styles.css": {
99
+ "uses": 14,
100
+ "why": "Defines the cell size and the base line height; status, footer and hint lines are one row; a few insets are one cell, as the terminal's (the floating pane's two-cell grip, a query bar segment)."
101
+ }
28
102
  }