@cats-inc/cats-platform 0.1.1 → 0.1.5

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 (152) hide show
  1. package/.env.example +2 -2
  2. package/README.md +6 -0
  3. package/build/desktop/bootstrapPage.d.ts.map +1 -1
  4. package/build/desktop/bootstrapPage.js +81 -4
  5. package/build/desktop/bootstrapPage.js.map +1 -1
  6. package/build/desktop/config.d.ts +11 -1
  7. package/build/desktop/config.d.ts.map +1 -1
  8. package/build/desktop/config.js +5 -2
  9. package/build/desktop/config.js.map +1 -1
  10. package/build/desktop/contracts.d.ts +66 -11
  11. package/build/desktop/contracts.d.ts.map +1 -1
  12. package/build/desktop/contracts.js +50 -1
  13. package/build/desktop/contracts.js.map +1 -1
  14. package/build/desktop/hostState.d.ts +4 -3
  15. package/build/desktop/hostState.d.ts.map +1 -1
  16. package/build/desktop/hostState.js +22 -30
  17. package/build/desktop/hostState.js.map +1 -1
  18. package/build/desktop/hostVersion.d.ts +1 -0
  19. package/build/desktop/hostVersion.d.ts.map +1 -1
  20. package/build/desktop/hostVersion.js +29 -5
  21. package/build/desktop/hostVersion.js.map +1 -1
  22. package/build/desktop/main.js +234 -37
  23. package/build/desktop/main.js.map +1 -1
  24. package/build/desktop/packaging.d.ts.map +1 -1
  25. package/build/desktop/packaging.js +10 -4
  26. package/build/desktop/packaging.js.map +1 -1
  27. package/build/desktop/preload.cjs +29 -0
  28. package/build/desktop/preload.cjs.map +1 -1
  29. package/build/desktop/processSupervisor.d.ts +2 -0
  30. package/build/desktop/processSupervisor.d.ts.map +1 -1
  31. package/build/desktop/processSupervisor.js +28 -13
  32. package/build/desktop/processSupervisor.js.map +1 -1
  33. package/build/desktop/readiness.d.ts +2 -2
  34. package/build/desktop/readiness.d.ts.map +1 -1
  35. package/build/desktop/readiness.js +2 -2
  36. package/build/desktop/readiness.js.map +1 -1
  37. package/build/desktop/releaseDescriptor.d.ts +85 -0
  38. package/build/desktop/releaseDescriptor.d.ts.map +1 -0
  39. package/build/desktop/releaseDescriptor.js +246 -0
  40. package/build/desktop/releaseDescriptor.js.map +1 -0
  41. package/build/desktop/tray.d.ts +1 -0
  42. package/build/desktop/tray.d.ts.map +1 -1
  43. package/build/desktop/tray.js +26 -0
  44. package/build/desktop/tray.js.map +1 -1
  45. package/build/desktop/trayMenu.d.ts +22 -1
  46. package/build/desktop/trayMenu.d.ts.map +1 -1
  47. package/build/desktop/trayMenu.js +61 -0
  48. package/build/desktop/trayMenu.js.map +1 -1
  49. package/build/desktop/updateInstallHandoff.d.ts +30 -0
  50. package/build/desktop/updateInstallHandoff.d.ts.map +1 -0
  51. package/build/desktop/updateInstallHandoff.js +39 -0
  52. package/build/desktop/updateInstallHandoff.js.map +1 -0
  53. package/build/desktop/updateIpc.d.ts +42 -0
  54. package/build/desktop/updateIpc.d.ts.map +1 -0
  55. package/build/desktop/updateIpc.js +71 -0
  56. package/build/desktop/updateIpc.js.map +1 -0
  57. package/build/desktop/updateManager.d.ts +76 -0
  58. package/build/desktop/updateManager.d.ts.map +1 -0
  59. package/build/desktop/updateManager.js +342 -0
  60. package/build/desktop/updateManager.js.map +1 -0
  61. package/build/desktop/updateNotifications.d.ts +64 -0
  62. package/build/desktop/updateNotifications.d.ts.map +1 -0
  63. package/build/desktop/updateNotifications.js +143 -0
  64. package/build/desktop/updateNotifications.js.map +1 -0
  65. package/build/desktop/updaterAdapter.d.ts +72 -0
  66. package/build/desktop/updaterAdapter.d.ts.map +1 -0
  67. package/build/desktop/updaterAdapter.js +198 -0
  68. package/build/desktop/updaterAdapter.js.map +1 -0
  69. package/build/renderer/assets/{ActiveSessionPermissionChip-BYr8cDpb.js → ActiveSessionPermissionChip-BoDkKkmi.js} +1 -1
  70. package/build/renderer/assets/{App-BbuTWT6Y.js → App-Bs1eRarv.js} +1 -1
  71. package/build/renderer/assets/{App-B13AzNko.js → App-C4S1Wa9f.js} +1 -1
  72. package/build/renderer/assets/{App-n-RtGh42.js → App-CNJj5gi9.js} +1 -1
  73. package/build/renderer/assets/{WorkspaceAppRoutes-BktWrQK-.js → WorkspaceAppRoutes-CFAuhWGF.js} +1 -1
  74. package/build/renderer/assets/app-uJJx-k1S.js +43 -0
  75. package/build/renderer/assets/{conversationSidebarRecentEntries-BNPz3X1V.js → conversationSidebarRecentEntries-CPGopayy.js} +1 -1
  76. package/build/renderer/assets/{useDraftSessionChips-3z_Je4ju.js → useDraftSessionChips-BsOdYfWw.js} +1 -1
  77. package/build/renderer/index.html +1 -1
  78. package/build/server/app/renderer/settings/settingsDesktopErrorLabels.d.ts +5 -0
  79. package/build/server/app/renderer/settings/settingsDesktopErrorLabels.d.ts.map +1 -0
  80. package/build/server/app/renderer/settings/settingsDesktopErrorLabels.js +16 -0
  81. package/build/server/app/renderer/settings/settingsDesktopErrorLabels.js.map +1 -0
  82. package/build/server/app/renderer/settings/settingsDesktopPreferences.d.ts +11 -0
  83. package/build/server/app/renderer/settings/settingsDesktopPreferences.d.ts.map +1 -0
  84. package/build/server/app/renderer/settings/settingsDesktopPreferences.js +30 -0
  85. package/build/server/app/renderer/settings/settingsDesktopPreferences.js.map +1 -0
  86. package/build/server/app/renderer/settings/settingsDesktopUpdateLabels.d.ts +31 -0
  87. package/build/server/app/renderer/settings/settingsDesktopUpdateLabels.d.ts.map +1 -0
  88. package/build/server/app/renderer/settings/settingsDesktopUpdateLabels.js +101 -0
  89. package/build/server/app/renderer/settings/settingsDesktopUpdateLabels.js.map +1 -0
  90. package/build/server/app/server/index.js +1 -1
  91. package/build/server/app/server/index.js.map +1 -1
  92. package/build/server/app/server/platformSetupRoutes.d.ts.map +1 -1
  93. package/build/server/app/server/platformSetupRoutes.js +42 -5
  94. package/build/server/app/server/platformSetupRoutes.js.map +1 -1
  95. package/build/server/app/server/requestRouter.d.ts.map +1 -1
  96. package/build/server/app/server/requestRouter.js +2 -0
  97. package/build/server/app/server/requestRouter.js.map +1 -1
  98. package/build/server/design/components/runtimeChips.d.ts +1 -1
  99. package/build/server/design/components/runtimeChips.d.ts.map +1 -1
  100. package/build/server/design/components/runtimeChips.js +4 -1
  101. package/build/server/design/components/runtimeChips.js.map +1 -1
  102. package/build/server/index.js +12 -1
  103. package/build/server/index.js.map +1 -1
  104. package/build/server/platform/auth/sessionSecretProvisioning.d.ts +23 -0
  105. package/build/server/platform/auth/sessionSecretProvisioning.d.ts.map +1 -0
  106. package/build/server/platform/auth/sessionSecretProvisioning.js +291 -0
  107. package/build/server/platform/auth/sessionSecretProvisioning.js.map +1 -0
  108. package/build/server/products/code/livePreview/realProcessAdapter.d.ts.map +1 -1
  109. package/build/server/products/code/livePreview/realProcessAdapter.js +7 -1
  110. package/build/server/products/code/livePreview/realProcessAdapter.js.map +1 -1
  111. package/build/server/products/code/state/appExport.d.ts.map +1 -1
  112. package/build/server/products/code/state/appExport.js +2 -0
  113. package/build/server/products/code/state/appExport.js.map +1 -1
  114. package/build/server/shared/desktopRecoveryBridge.d.ts +46 -0
  115. package/build/server/shared/desktopRecoveryBridge.d.ts.map +1 -1
  116. package/build/server/shared/desktopRecoveryBridge.js +20 -0
  117. package/build/server/shared/desktopRecoveryBridge.js.map +1 -1
  118. package/build/server/shared/i18n/catalogs/en.d.ts.map +1 -1
  119. package/build/server/shared/i18n/catalogs/en.js +37 -0
  120. package/build/server/shared/i18n/catalogs/en.js.map +1 -1
  121. package/build/server/shared/i18n/catalogs/zh-TW.d.ts.map +1 -1
  122. package/build/server/shared/i18n/catalogs/zh-TW.js +35 -0
  123. package/build/server/shared/i18n/catalogs/zh-TW.js.map +1 -1
  124. package/build/server/shared/i18n/index.d.ts +35 -0
  125. package/build/server/shared/i18n/index.d.ts.map +1 -1
  126. package/build/server/shared/i18n/messageKeys.d.ts +35 -0
  127. package/build/server/shared/i18n/messageKeys.d.ts.map +1 -1
  128. package/build/server/shared/i18n/messageKeys.js +35 -0
  129. package/build/server/shared/i18n/messageKeys.js.map +1 -1
  130. package/build/server/shared/loadProjectEnvFile.d.ts.map +1 -1
  131. package/build/server/shared/loadProjectEnvFile.js +18 -19
  132. package/build/server/shared/loadProjectEnvFile.js.map +1 -1
  133. package/build/server/shared/platformChildProcessEnv.d.ts +2 -0
  134. package/build/server/shared/platformChildProcessEnv.d.ts.map +1 -0
  135. package/build/server/shared/platformChildProcessEnv.js +22 -0
  136. package/build/server/shared/platformChildProcessEnv.js.map +1 -0
  137. package/package.json +19 -27
  138. package/scripts/build-desktop-installer.mjs +438 -37
  139. package/scripts/build-test-ui.mjs +13 -2
  140. package/scripts/generate-desktop-release-descriptor.mjs +258 -0
  141. package/scripts/validate-release-assets.mjs +422 -0
  142. package/scripts/validate-release-version.mjs +217 -0
  143. package/scripts/windows/Test-WindowsInstallerSmoke.ps1 +55 -1
  144. package/build/desktop/update.d.ts +0 -24
  145. package/build/desktop/update.d.ts.map +0 -1
  146. package/build/desktop/update.js +0 -173
  147. package/build/desktop/update.js.map +0 -1
  148. package/build/renderer/assets/app-DnVQMpW_.js +0 -43
  149. package/build/server/app/renderer/settings/settingsDesktopStartupErrorLabels.d.ts +0 -5
  150. package/build/server/app/renderer/settings/settingsDesktopStartupErrorLabels.d.ts.map +0 -1
  151. package/build/server/app/renderer/settings/settingsDesktopStartupErrorLabels.js +0 -11
  152. package/build/server/app/renderer/settings/settingsDesktopStartupErrorLabels.js.map +0 -1
@@ -0,0 +1,246 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import { dirname, join } from 'node:path';
3
+ import { fileURLToPath } from 'node:url';
4
+ /**
5
+ * Provenance emitted by the tag-gated release workflow
6
+ * (`scripts/generate-desktop-release-descriptor.mjs`). SPEC-111 requires
7
+ * official update capability to depend on this file rather than on
8
+ * `app.isPackaged`, which is also true for locally packaged and unofficial
9
+ * builds.
10
+ *
11
+ * Nothing in this module reads the environment. Requirement 1.9 states that no
12
+ * environment variable may promote a development or unofficial package into an
13
+ * official update client, and the cheapest way to guarantee that is to give the
14
+ * resolver no access to one.
15
+ */
16
+ export const DESKTOP_RELEASE_DESCRIPTOR_SCHEMA_VERSION = 1;
17
+ export const DESKTOP_RELEASE_DESCRIPTOR_FILENAME = 'release-descriptor.json';
18
+ export const DESKTOP_RELEASE_PLATFORMS = ['windows', 'macos', 'linux'];
19
+ /**
20
+ * What kind of build the workflow produced.
21
+ *
22
+ * `official` is a signed stable release. `preview` is an unsigned prerelease
23
+ * from the same guarded workflow: it may self-update so the upgrade path is
24
+ * testable before signing exists, but it resolves to its own distribution mode
25
+ * and is never presented as official.
26
+ */
27
+ export const DESKTOP_RELEASE_KINDS = ['official', 'preview'];
28
+ const SEMVER_CORE = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)$/u;
29
+ const COMMIT_SHA = /^[0-9a-f]{40}$/iu;
30
+ const GITHUB_REPOSITORY = /^[A-Za-z0-9._-]+\/[A-Za-z0-9._-]+$/u;
31
+ function isObjectRecord(value) {
32
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
33
+ }
34
+ function readString(record, key) {
35
+ const value = record[key];
36
+ return typeof value === 'string' && value.trim() !== '' ? value.trim() : null;
37
+ }
38
+ export function resolveDesktopReleasePlatform(nodePlatform) {
39
+ if (nodePlatform === 'win32') {
40
+ return 'windows';
41
+ }
42
+ if (nodePlatform === 'darwin') {
43
+ return 'macos';
44
+ }
45
+ if (nodePlatform === 'linux') {
46
+ return 'linux';
47
+ }
48
+ return null;
49
+ }
50
+ export function resolveDesktopReleaseDescriptorPath(moduleDir = dirname(fileURLToPath(import.meta.url))) {
51
+ // The descriptor is generated into build/desktop next to the compiled host,
52
+ // so the same relative lookup works for a dev run and inside the asar.
53
+ return join(moduleDir, DESKTOP_RELEASE_DESCRIPTOR_FILENAME);
54
+ }
55
+ export function parseDesktopReleaseDescriptor(raw) {
56
+ if (!isObjectRecord(raw)) {
57
+ return { ok: false, reason: 'descriptor_malformed', detail: 'Descriptor is not an object.' };
58
+ }
59
+ if (raw.schemaVersion !== DESKTOP_RELEASE_DESCRIPTOR_SCHEMA_VERSION) {
60
+ return {
61
+ ok: false,
62
+ reason: 'descriptor_schema_unsupported',
63
+ detail: `Unsupported descriptor schemaVersion: ${String(raw.schemaVersion)}`,
64
+ };
65
+ }
66
+ // Required. A descriptor without a kind is not something this workflow
67
+ // produced, so it fails closed rather than defaulting to official.
68
+ const kind = readString(raw, 'kind');
69
+ if (kind === null || !DESKTOP_RELEASE_KINDS.includes(kind)) {
70
+ return {
71
+ ok: false,
72
+ reason: 'descriptor_malformed',
73
+ detail: `Descriptor kind is not official or preview: ${String(raw.kind)}`,
74
+ };
75
+ }
76
+ const version = readString(raw, 'version');
77
+ if (version === null || !SEMVER_CORE.test(version)) {
78
+ return {
79
+ ok: false,
80
+ reason: 'descriptor_malformed',
81
+ detail: 'Descriptor version is not a MAJOR.MINOR.PATCH string.',
82
+ };
83
+ }
84
+ const tag = readString(raw, 'tag');
85
+ if (tag === null || tag !== `v${version}`) {
86
+ return {
87
+ ok: false,
88
+ reason: 'descriptor_malformed',
89
+ detail: 'Descriptor tag does not match its version.',
90
+ };
91
+ }
92
+ const commit = readString(raw, 'commit');
93
+ if (commit === null || !COMMIT_SHA.test(commit)) {
94
+ return {
95
+ ok: false,
96
+ reason: 'descriptor_malformed',
97
+ detail: 'Descriptor commit is not a full 40-character sha.',
98
+ };
99
+ }
100
+ const platform = readString(raw, 'platform');
101
+ if (platform === null
102
+ || !DESKTOP_RELEASE_PLATFORMS.includes(platform)) {
103
+ return {
104
+ ok: false,
105
+ reason: 'descriptor_malformed',
106
+ detail: 'Descriptor platform is not windows, macos, or linux.',
107
+ };
108
+ }
109
+ // Phase 1 publishes stable only, and Requirement 1.7 pins the production
110
+ // channel to the descriptor. Any other channel means the file was not
111
+ // produced by the current release workflow.
112
+ if (raw.channel !== 'stable') {
113
+ return {
114
+ ok: false,
115
+ reason: 'descriptor_malformed',
116
+ detail: `Descriptor channel is not stable: ${String(raw.channel)}`,
117
+ };
118
+ }
119
+ if (raw.provider !== 'github_release') {
120
+ return {
121
+ ok: false,
122
+ reason: 'descriptor_malformed',
123
+ detail: `Descriptor provider is not github_release: ${String(raw.provider)}`,
124
+ };
125
+ }
126
+ const repository = readString(raw, 'repository');
127
+ if (repository === null || !GITHUB_REPOSITORY.test(repository)) {
128
+ return {
129
+ ok: false,
130
+ reason: 'descriptor_malformed',
131
+ detail: 'Descriptor repository is not in owner/name form.',
132
+ };
133
+ }
134
+ const runtimeCommit = readString(raw, 'runtimeCommit');
135
+ if (runtimeCommit === null || !COMMIT_SHA.test(runtimeCommit)) {
136
+ return {
137
+ ok: false,
138
+ reason: 'descriptor_malformed',
139
+ detail: 'Descriptor runtimeCommit is not a full 40-character sha.',
140
+ };
141
+ }
142
+ return {
143
+ ok: true,
144
+ descriptor: {
145
+ schemaVersion: DESKTOP_RELEASE_DESCRIPTOR_SCHEMA_VERSION,
146
+ kind: kind,
147
+ tag,
148
+ version,
149
+ commit: commit.toLowerCase(),
150
+ platform: platform,
151
+ channel: 'stable',
152
+ provider: 'github_release',
153
+ repository,
154
+ runtimeCommit: runtimeCommit.toLowerCase(),
155
+ generatedAt: readString(raw, 'generatedAt'),
156
+ },
157
+ };
158
+ }
159
+ function unofficial(currentVersion, reason) {
160
+ return {
161
+ distribution: 'unofficial_packaged',
162
+ provider: 'none',
163
+ channel: 'stable',
164
+ currentVersion,
165
+ repository: null,
166
+ commit: null,
167
+ unavailableReason: reason,
168
+ };
169
+ }
170
+ export function resolveDesktopDistributionIdentity(input) {
171
+ const { isPackaged, currentVersion, nodePlatform, descriptor } = input;
172
+ if (!isPackaged) {
173
+ return {
174
+ distribution: 'development',
175
+ provider: 'none',
176
+ channel: 'stable',
177
+ currentVersion,
178
+ repository: null,
179
+ commit: null,
180
+ unavailableReason: 'development_build',
181
+ };
182
+ }
183
+ if (descriptor === null) {
184
+ return unofficial(currentVersion, 'descriptor_missing');
185
+ }
186
+ if (!descriptor.ok) {
187
+ return unofficial(currentVersion, descriptor.reason);
188
+ }
189
+ if (descriptor.descriptor.version !== currentVersion) {
190
+ return unofficial(currentVersion, 'descriptor_version_mismatch');
191
+ }
192
+ if (descriptor.descriptor.platform !== resolveDesktopReleasePlatform(nodePlatform)) {
193
+ return unofficial(currentVersion, 'descriptor_platform_mismatch');
194
+ }
195
+ return {
196
+ distribution: descriptor.descriptor.kind === 'preview'
197
+ ? 'preview_packaged'
198
+ : 'official_packaged',
199
+ provider: 'github_release',
200
+ channel: descriptor.descriptor.channel,
201
+ currentVersion,
202
+ repository: descriptor.descriptor.repository,
203
+ commit: descriptor.descriptor.commit,
204
+ unavailableReason: null,
205
+ };
206
+ }
207
+ /**
208
+ * Returns null when the descriptor is absent, which is the expected state for a
209
+ * development run and for a locally packaged build. A present but unreadable or
210
+ * invalid file is reported as a parse failure so the reason reaches diagnostics
211
+ * instead of silently degrading to "missing".
212
+ */
213
+ export async function loadDesktopReleaseDescriptor(descriptorPath = resolveDesktopReleaseDescriptorPath(), dependencies = {}) {
214
+ const readFileImpl = dependencies.readFileImpl
215
+ ?? ((path) => readFile(path, 'utf8'));
216
+ let contents;
217
+ try {
218
+ contents = await readFileImpl(descriptorPath);
219
+ }
220
+ catch (error) {
221
+ if (isMissingFileError(error)) {
222
+ return null;
223
+ }
224
+ return {
225
+ ok: false,
226
+ reason: 'descriptor_unreadable',
227
+ detail: error instanceof Error ? error.message : String(error),
228
+ };
229
+ }
230
+ let parsed;
231
+ try {
232
+ parsed = JSON.parse(contents);
233
+ }
234
+ catch (error) {
235
+ return {
236
+ ok: false,
237
+ reason: 'descriptor_malformed',
238
+ detail: error instanceof Error ? error.message : String(error),
239
+ };
240
+ }
241
+ return parseDesktopReleaseDescriptor(parsed);
242
+ }
243
+ function isMissingFileError(error) {
244
+ return isObjectRecord(error) && error.code === 'ENOENT';
245
+ }
246
+ //# sourceMappingURL=releaseDescriptor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"releaseDescriptor.js","sourceRoot":"","sources":["../../desktop/host/releaseDescriptor.ts"],"names":[],"mappings":"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"}
@@ -14,6 +14,7 @@ interface CreateDesktopTrayControllerOptions {
14
14
  onRunAction: (actionId: DesktopHostActionId) => Promise<void>;
15
15
  onQuit: () => void;
16
16
  canInteract?: () => boolean;
17
+ onCheckForUpdates?: () => Promise<void>;
17
18
  }
18
19
  export declare function runDesktopTrayShowWindow(onShowWindow: () => Promise<void>): void;
19
20
  export declare function createDesktopTrayController(options: CreateDesktopTrayControllerOptions): Promise<DesktopTrayController>;
@@ -1 +1 @@
1
- {"version":3,"file":"tray.d.ts","sourceRoot":"","sources":["../../desktop/host/tray.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,aAAa,EAGd,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EAAyB,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAGjF,OAAO,EAGL,KAAK,oBAAoB,EAC1B,MAAM,eAAe,CAAC;AAEvB,MAAM,WAAW,qBAAqB;IACpC,UAAU,IAAI,IAAI,CAAC;IACnB,gBAAgB,IAAI,IAAI,CAAC;IACzB,UAAU,CAAC,KAAK,EAAE,oBAAoB,GAAG,IAAI,CAAC;IAC9C,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,UAAU,kCAAkC;IAC1C,SAAS,EAAE,MAAM,aAAa,GAAG,IAAI,CAAC;IACtC,YAAY,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,WAAW,EAAE,CAAC,QAAQ,EAAE,mBAAmB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9D,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,OAAO,CAAC;CAC7B;AAuFD,wBAAgB,wBAAwB,CAAC,YAAY,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAEhF;AA+FD,wBAAsB,2BAA2B,CAC/C,OAAO,EAAE,kCAAkC,GAC1C,OAAO,CAAC,qBAAqB,CAAC,CA0EhC"}
1
+ {"version":3,"file":"tray.d.ts","sourceRoot":"","sources":["../../desktop/host/tray.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,aAAa,EAGd,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EAAyB,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAGjF,OAAO,EAGL,KAAK,oBAAoB,EAC1B,MAAM,eAAe,CAAC;AAEvB,MAAM,WAAW,qBAAqB;IACpC,UAAU,IAAI,IAAI,CAAC;IACnB,gBAAgB,IAAI,IAAI,CAAC;IACzB,UAAU,CAAC,KAAK,EAAE,oBAAoB,GAAG,IAAI,CAAC;IAC9C,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,UAAU,kCAAkC;IAC1C,SAAS,EAAE,MAAM,aAAa,GAAG,IAAI,CAAC;IACtC,YAAY,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,WAAW,EAAE,CAAC,QAAQ,EAAE,mBAAmB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9D,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,OAAO,CAAC;IAG5B,iBAAiB,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACzC;AAuFD,wBAAgB,wBAAwB,CAAC,YAAY,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAEhF;AA0HD,wBAAsB,2BAA2B,CAC/C,OAAO,EAAE,kCAAkC,GAC1C,OAAO,CAAC,qBAAqB,CAAC,CA0EhC"}
@@ -122,6 +122,32 @@ function buildDesktopTrayMenuTemplate(state, options, showWindow) {
122
122
  });
123
123
  }
124
124
  }
125
+ // SPEC-111 section 5: the update entry sits before Settings and Quit, and is
126
+ // absent entirely when the build has no update capability.
127
+ if (state.updateItem) {
128
+ pushSeparator();
129
+ template.push({
130
+ label: state.updateItem.label,
131
+ enabled: state.updateItem.enabled,
132
+ click: () => {
133
+ const item = state.updateItem;
134
+ if (!item?.enabled) {
135
+ return;
136
+ }
137
+ runTrayAction(async () => {
138
+ if (options.canInteract?.() === false) {
139
+ return;
140
+ }
141
+ if (item.intent === 'check') {
142
+ await options.onCheckForUpdates?.();
143
+ return;
144
+ }
145
+ await options.onNavigate('/settings/desktop');
146
+ showWindow();
147
+ });
148
+ },
149
+ });
150
+ }
125
151
  if (state.setupCompleteAt) {
126
152
  pushSeparator();
127
153
  template.push({
@@ -1 +1 @@
1
- {"version":3,"file":"tray.js","sourceRoot":"","sources":["../../desktop/host/tray.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tray.js","sourceRoot":"","sources":["../../desktop/host/tray.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { DesktopBootstrapPhase, DesktopHostAction } from './contracts.js';
1
+ import type { DesktopBootstrapPhase, DesktopHostAction, DesktopUpdateSnapshot } from './contracts.js';
2
2
  export interface DesktopTrayProductDescriptor {
3
3
  id?: string;
4
4
  productName?: string;
@@ -9,6 +9,17 @@ export interface DesktopTrayProductDescriptor {
9
9
  disabledReason?: string;
10
10
  } | null;
11
11
  }
12
+ /**
13
+ * Tray update entry. Absent entirely when the build has no update capability,
14
+ * so an unofficial or development package never shows a command it cannot
15
+ * honour.
16
+ */
17
+ export interface DesktopTrayUpdateItem {
18
+ label: string;
19
+ enabled: boolean;
20
+ /** What activating the item should do. */
21
+ intent: 'check' | 'open_settings';
22
+ }
12
23
  export interface DesktopTrayMenuState {
13
24
  phase?: DesktopBootstrapPhase;
14
25
  summary: string;
@@ -21,6 +32,7 @@ export interface DesktopTrayMenuState {
21
32
  }>;
22
33
  lockedLabel?: string;
23
34
  lockedTooltip?: string;
35
+ updateItem?: DesktopTrayUpdateItem | null;
24
36
  }
25
37
  export type DesktopTrayLocale = 'en' | 'zh-TW';
26
38
  interface BuildDesktopTrayMenuStateOptions {
@@ -31,8 +43,17 @@ interface BuildDesktopTrayMenuStateOptions {
31
43
  actions: ReadonlyArray<Pick<DesktopHostAction, 'id' | 'label' | 'primary'>>;
32
44
  products: ReadonlyArray<DesktopTrayProductDescriptor> | null | undefined;
33
45
  locale?: string | null;
46
+ updates?: DesktopUpdateSnapshot | null;
34
47
  }
35
48
  export declare function normalizeDesktopTrayLocale(locale: string | null | undefined): DesktopTrayLocale;
49
+ /**
50
+ * Derives the tray update entry from the host-owned snapshot.
51
+ *
52
+ * Labels stay truthful about what the host is doing, and every state that has
53
+ * an operation in flight is disabled so a second request cannot be started
54
+ * from the tray.
55
+ */
56
+ export declare function buildDesktopTrayUpdateItem(snapshot: DesktopUpdateSnapshot | null | undefined, localeInput?: string | null): DesktopTrayUpdateItem | null;
36
57
  export declare function buildDesktopTrayMenuState(options: BuildDesktopTrayMenuStateOptions): DesktopTrayMenuState;
37
58
  export declare function buildDesktopTrayQuittingMenuState(localeInput?: string | null): DesktopTrayMenuState;
38
59
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"trayMenu.d.ts","sourceRoot":"","sources":["../../desktop/host/trayMenu.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,qBAAqB,EACrB,iBAAiB,EAElB,MAAM,gBAAgB,CAAC;AAExB,MAAM,WAAW,4BAA4B;IAC3C,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE;QACN,UAAU,CAAC,EAAE,OAAO,CAAC;QACrB,cAAc,CAAC,EAAE,MAAM,CAAC;KACzB,GAAG,IAAI,CAAC;CACV;AAED,MAAM,WAAW,oBAAoB;IAKnC,KAAK,CAAC,EAAE,qBAAqB,CAAC;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,iBAAiB,EAAE,IAAI,GAAG,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC;IACpE,QAAQ,EAAE,KAAK,CAAC;QACd,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;KACd,CAAC,CAAC;IAKH,WAAW,CAAC,EAAE,MAAM,CAAC;IAIrB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,MAAM,iBAAiB,GAAG,IAAI,GAAG,OAAO,CAAC;AAE/C,UAAU,gCAAgC;IACxC,KAAK,EAAE,qBAAqB,CAAC;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,uBAAuB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,OAAO,EAAE,aAAa,CAAC,IAAI,CAAC,iBAAiB,EAAE,IAAI,GAAG,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC;IAC5E,QAAQ,EAAE,aAAa,CAAC,4BAA4B,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC;IACzE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAuDD,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAChC,iBAAiB,CAQnB;AAqDD,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,gCAAgC,GACxC,oBAAoB,CAyBtB;AAED,wBAAgB,iCAAiC,CAC/C,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,GAC1B,oBAAoB,CAWtB"}
1
+ {"version":3,"file":"trayMenu.d.ts","sourceRoot":"","sources":["../../desktop/host/trayMenu.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,qBAAqB,EACrB,iBAAiB,EAEjB,qBAAqB,EACtB,MAAM,gBAAgB,CAAC;AAExB,MAAM,WAAW,4BAA4B;IAC3C,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE;QACN,UAAU,CAAC,EAAE,OAAO,CAAC;QACrB,cAAc,CAAC,EAAE,MAAM,CAAC;KACzB,GAAG,IAAI,CAAC;CACV;AAED;;;;GAIG;AACH,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,0CAA0C;IAC1C,MAAM,EAAE,OAAO,GAAG,eAAe,CAAC;CACnC;AAED,MAAM,WAAW,oBAAoB;IAKnC,KAAK,CAAC,EAAE,qBAAqB,CAAC;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,iBAAiB,EAAE,IAAI,GAAG,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC;IACpE,QAAQ,EAAE,KAAK,CAAC;QACd,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;KACd,CAAC,CAAC;IAKH,WAAW,CAAC,EAAE,MAAM,CAAC;IAIrB,aAAa,CAAC,EAAE,MAAM,CAAC;IAGvB,UAAU,CAAC,EAAE,qBAAqB,GAAG,IAAI,CAAC;CAC3C;AAED,MAAM,MAAM,iBAAiB,GAAG,IAAI,GAAG,OAAO,CAAC;AAE/C,UAAU,gCAAgC;IACxC,KAAK,EAAE,qBAAqB,CAAC;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,uBAAuB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,OAAO,EAAE,aAAa,CAAC,IAAI,CAAC,iBAAiB,EAAE,IAAI,GAAG,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC;IAC5E,QAAQ,EAAE,aAAa,CAAC,4BAA4B,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC;IACzE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,OAAO,CAAC,EAAE,qBAAqB,GAAG,IAAI,CAAC;CACxC;AAuDD,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAChC,iBAAiB,CAQnB;AAwED;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,qBAAqB,GAAG,IAAI,GAAG,SAAS,EAClD,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,GAC1B,qBAAqB,GAAG,IAAI,CAmB9B;AAwBD,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,gCAAgC,GACxC,oBAAoB,CA0BtB;AAED,wBAAgB,iCAAiC,CAC/C,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,GAC1B,oBAAoB,CAWtB"}
@@ -89,6 +89,66 @@ function toTrayProductLabel(productName, locale) {
89
89
  ? `Open ${trimmed.slice('Cats '.length)}`
90
90
  : `Open ${trimmed}`;
91
91
  }
92
+ const TRAY_UPDATE_LABELS = {
93
+ en: {
94
+ check: 'Check for Updates…',
95
+ checking: 'Checking for Updates…',
96
+ available: 'Update Available…',
97
+ downloading: 'Downloading Update…',
98
+ downloaded: 'Restart to Update…',
99
+ installing: 'Installing Update…',
100
+ },
101
+ 'zh-TW': {
102
+ check: '檢查更新…',
103
+ checking: '正在檢查更新…',
104
+ available: '有可用更新…',
105
+ downloading: '正在下載更新…',
106
+ downloaded: '重新啟動以更新…',
107
+ installing: '正在安裝更新…',
108
+ },
109
+ };
110
+ /**
111
+ * Derives the tray update entry from the host-owned snapshot.
112
+ *
113
+ * Labels stay truthful about what the host is doing, and every state that has
114
+ * an operation in flight is disabled so a second request cannot be started
115
+ * from the tray.
116
+ */
117
+ export function buildDesktopTrayUpdateItem(snapshot, localeInput) {
118
+ if (!snapshot?.capability.canCheck) {
119
+ return null;
120
+ }
121
+ const locale = normalizeDesktopTrayLocale(localeInput);
122
+ const labels = TRAY_UPDATE_LABELS[locale];
123
+ // A preview build self-updates, so the tray has to say what it is or a
124
+ // tester cannot tell it apart from a supported release.
125
+ const suffix = snapshot.capability.distribution === 'preview_packaged'
126
+ ? (locale === 'zh-TW' ? '(預覽)' : ' (preview)')
127
+ : '';
128
+ const withSuffix = (item) => ({
129
+ ...item,
130
+ label: `${item.label}${suffix}`,
131
+ });
132
+ return withSuffix(resolveTrayUpdateItem(snapshot, labels));
133
+ }
134
+ function resolveTrayUpdateItem(snapshot, labels) {
135
+ switch (snapshot.status) {
136
+ case 'checking':
137
+ return { label: labels.checking, enabled: false, intent: 'check' };
138
+ case 'update_available':
139
+ return { label: labels.available, enabled: true, intent: 'open_settings' };
140
+ case 'downloading': {
141
+ const percent = Math.round(snapshot.progress?.percent ?? 0);
142
+ return { label: `${labels.downloading} ${percent}%`, enabled: false, intent: 'check' };
143
+ }
144
+ case 'downloaded':
145
+ return { label: labels.downloaded, enabled: true, intent: 'open_settings' };
146
+ case 'installing':
147
+ return { label: labels.installing, enabled: false, intent: 'check' };
148
+ default:
149
+ return { label: labels.check, enabled: true, intent: 'check' };
150
+ }
151
+ }
92
152
  export function buildDesktopTrayMenuState(options) {
93
153
  const effectiveSetupCompleteAt = options.setupCompleteAt ?? options.fallbackSetupCompleteAt ?? null;
94
154
  const locale = normalizeDesktopTrayLocale(options.locale);
@@ -112,6 +172,7 @@ export function buildDesktopTrayMenuState(options) {
112
172
  label: localizeTrayActionLabel(action, locale),
113
173
  })),
114
174
  products,
175
+ updateItem: buildDesktopTrayUpdateItem(options.updates, options.locale),
115
176
  };
116
177
  }
117
178
  export function buildDesktopTrayQuittingMenuState(localeInput) {
@@ -1 +1 @@
1
- {"version":3,"file":"trayMenu.js","sourceRoot":"","sources":["../../desktop/host/trayMenu.ts"],"names":[],"mappings":"AAsDA,MAAM,uBAAuB,GAAG,IAAI,GAAG,CAAsB;IAC3D,WAAW;IACX,YAAY;IACZ,cAAc;IACd,OAAO;IACP,gBAAgB;CACjB,CAAC,CAAC;AAEH,MAAM,6BAA6B,GAA2B;IAC5D,yBAAyB,EAAE,eAAe;IAC1C,yDAAyD,EACvD,sBAAsB;IACxB,wDAAwD,EACtD,qBAAqB;IACvB,yDAAyD,EACvD,wBAAwB;IAC1B,oEAAoE,EAClE,qCAAqC;IACvC,kDAAkD,EAChD,uBAAuB;IACzB,kDAAkD,EAChD,kBAAkB;IACpB,4EAA4E,EAC1E,0BAA0B;IAC5B,oFAAoF,EAClF,0CAA0C;IAC5C,4DAA4D,EAC1D,yBAAyB;IAC3B,4DAA4D,EAC1D,oBAAoB;IACtB,8EAA8E,EAC5E,gCAAgC;IAClC,mFAAmF,EACjF,iCAAiC;CACpC,CAAC;AAEF,SAAS,oBAAoB,CAAC,OAAqC;IACjE,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC;IAChD,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAClC,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,OAAO,CAAC,YAAY,KAAK,WAAW,IAAI,OAAO,CAAC,YAAY,KAAK,YAAY,EAAE,CAAC;QAClF,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,OAAO,CAAC,KAAK,EAAE,UAAU,KAAK,KAAK,EAAE,CAAC;QACxC,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,OAAO,CAAC,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,EAAE,CAAC;QAC1C,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,0BAA0B,CACxC,MAAiC;IAEjC,MAAM,UAAU,GAAG,MAAM,EAAE,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC;IACnE,OAAO,UAAU,KAAK,OAAO;WACxB,UAAU,KAAK,SAAS;WACxB,UAAU,CAAC,UAAU,CAAC,QAAQ,CAAC;WAC/B,UAAU,CAAC,UAAU,CAAC,UAAU,CAAC;QACpC,CAAC,CAAC,OAAO;QACT,CAAC,CAAC,IAAI,CAAC;AACX,CAAC;AAED,SAAS,uBAAuB,CAC9B,MAA+C,EAC/C,MAAyB;IAEzB,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;QACvB,OAAO,MAAM,CAAC,KAAK,CAAC;IACtB,CAAC;IAED,QAAQ,MAAM,CAAC,EAAE,EAAE,CAAC;QAClB,KAAK,WAAW;YACd,OAAO,SAAS,CAAC;QACnB,KAAK,YAAY;YACf,OAAO,MAAM,CAAC;QAChB,KAAK,cAAc;YACjB,OAAO,QAAQ,CAAC;QAClB,KAAK,OAAO,CAAC;QACb,KAAK,gBAAgB;YACnB,OAAO,IAAI,CAAC;QACd;YACE,OAAO,MAAM,CAAC,KAAK,CAAC;IACxB,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB,CAAC,OAAe,EAAE,MAAyB;IACrE,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;QACvB,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,OAAO,6BAA6B,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC;AAC3D,CAAC;AAED,SAAS,kBAAkB,CAAC,WAAmB,EAAE,MAAyB;IACxE,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC;IACnC,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;QACvB,IAAI,OAAO,KAAK,WAAW,EAAE,CAAC;YAC5B,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,IAAI,OAAO,KAAK,WAAW,EAAE,CAAC;YAC5B,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,IAAI,OAAO,KAAK,WAAW,EAAE,CAAC;YAC5B,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,OAAO,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC;YAChC,CAAC,CAAC,MAAM,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;YACvC,CAAC,CAAC,MAAM,OAAO,EAAE,CAAC;IACtB,CAAC;IACD,OAAO,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC;QAChC,CAAC,CAAC,QAAQ,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;QACzC,CAAC,CAAC,QAAQ,OAAO,EAAE,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,yBAAyB,CACvC,OAAyC;IAEzC,MAAM,wBAAwB,GAAG,OAAO,CAAC,eAAe,IAAI,OAAO,CAAC,uBAAuB,IAAI,IAAI,CAAC;IACpG,MAAM,MAAM,GAAG,0BAA0B,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC1D,MAAM,QAAQ,GAAG,wBAAwB;QACvC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC;aACvB,MAAM,CAAC,oBAAoB,CAAC;aAC5B,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YACjB,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,OAAO,CAAC,WAAY,CAAC,IAAI,EAAE;YACrD,KAAK,EAAE,kBAAkB,CAAC,OAAO,CAAC,WAAY,CAAC,IAAI,EAAE,EAAE,MAAM,CAAC;YAC9D,IAAI,EAAE,OAAO,CAAC,WAAY,CAAC,IAAI,EAAE;SAClC,CAAC,CAAC;QACL,CAAC,CAAC,EAAE,CAAC;IAEP,OAAO;QACL,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,OAAO,EAAE,mBAAmB,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC;QACrD,eAAe,EAAE,wBAAwB;QACzC,OAAO,EAAE,OAAO,CAAC,OAAO;aACrB,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,uBAAuB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;aAC1D,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YAChB,GAAG,MAAM;YACT,KAAK,EAAE,uBAAuB,CAAC,MAAM,EAAE,MAAM,CAAC;SAC/C,CAAC,CAAC;QACL,QAAQ;KACT,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iCAAiC,CAC/C,WAA2B;IAE3B,MAAM,MAAM,GAAG,0BAA0B,CAAC,WAAW,CAAC,CAAC;IACvD,MAAM,WAAW,GAAG,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC;IACnE,OAAO;QACL,OAAO,EAAE,WAAW;QACpB,eAAe,EAAE,IAAI;QACrB,OAAO,EAAE,EAAE;QACX,QAAQ,EAAE,EAAE;QACZ,WAAW;QACX,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,iBAAiB;KACtE,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"trayMenu.js","sourceRoot":"","sources":["../../desktop/host/trayMenu.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type { DesktopUpdaterAdapter } from './updateManager.js';
2
+ /**
3
+ * Managed-service drain around the installer handoff.
4
+ *
5
+ * `quitAndInstall` ends the process, so without this the Cats runtime and
6
+ * platform sidecars are killed mid-flight rather than drained. On Windows that
7
+ * is not merely untidy: the upgrade runs the previous uninstaller before
8
+ * installing, and a sidecar still holding files in the install directory can
9
+ * make that uninstall or the install that follows fail, which is how an update
10
+ * leaves a broken installation behind.
11
+ *
12
+ * This is a decorator rather than a manager feature so the update state machine
13
+ * stays a state machine, and so the ordering is testable without Electron.
14
+ */
15
+ export interface DesktopInstallHandoffHooks {
16
+ /**
17
+ * Brings managed services down. Resolves once they are stopped, including the
18
+ * forced path when a graceful stop times out.
19
+ */
20
+ drainManagedServices: () => Promise<void>;
21
+ /**
22
+ * Brings managed services back after a handoff that failed while the process
23
+ * was still alive. Without it the app would still be running but with dead
24
+ * sidecars, which is a worse state than the one the user started in.
25
+ */
26
+ restartManagedServices: () => Promise<void>;
27
+ logger?: (message: string) => void;
28
+ }
29
+ export declare function withDesktopInstallHandoff(adapter: DesktopUpdaterAdapter, hooks: DesktopInstallHandoffHooks): DesktopUpdaterAdapter;
30
+ //# sourceMappingURL=updateInstallHandoff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"updateInstallHandoff.d.ts","sourceRoot":"","sources":["../../desktop/host/updateInstallHandoff.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAEhE;;;;;;;;;;;;GAYG;AAEH,MAAM,WAAW,0BAA0B;IACzC;;;OAGG;IACH,oBAAoB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1C;;;;OAIG;IACH,sBAAsB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACpC;AAED,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,qBAAqB,EAC9B,KAAK,EAAE,0BAA0B,GAChC,qBAAqB,CA0CvB"}
@@ -0,0 +1,39 @@
1
+ export function withDesktopInstallHandoff(adapter, hooks) {
2
+ const log = hooks.logger ?? (() => { });
3
+ async function restoreAfterFailedHandoff(stage) {
4
+ try {
5
+ await hooks.restartManagedServices();
6
+ }
7
+ catch (restartError) {
8
+ // Nothing further can be done from here. The manager still reports a
9
+ // recoverable state, and the log says why the app may be degraded.
10
+ log(`[desktop-update] managed services did not restart after a failed ${stage}: `
11
+ + `${restartError instanceof Error ? restartError.message : String(restartError)}`);
12
+ }
13
+ }
14
+ return {
15
+ checkForUpdates: adapter.checkForUpdates.bind(adapter),
16
+ downloadUpdate: adapter.downloadUpdate.bind(adapter),
17
+ async quitAndInstall() {
18
+ try {
19
+ await hooks.drainManagedServices();
20
+ }
21
+ catch (drainError) {
22
+ // Handing off now would point the installer at files a surviving
23
+ // sidecar may still hold, so the install is abandoned instead.
24
+ log('[desktop-update] managed services failed to drain; abandoning the installer handoff: '
25
+ + `${drainError instanceof Error ? drainError.message : String(drainError)}`);
26
+ await restoreAfterFailedHandoff('drain');
27
+ throw drainError;
28
+ }
29
+ try {
30
+ await adapter.quitAndInstall();
31
+ }
32
+ catch (handoffError) {
33
+ await restoreAfterFailedHandoff('handoff');
34
+ throw handoffError;
35
+ }
36
+ },
37
+ };
38
+ }
39
+ //# sourceMappingURL=updateInstallHandoff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"updateInstallHandoff.js","sourceRoot":"","sources":["../../desktop/host/updateInstallHandoff.ts"],"names":[],"mappings":"AA+BA,MAAM,UAAU,yBAAyB,CACvC,OAA8B,EAC9B,KAAiC;IAEjC,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAEvC,KAAK,UAAU,yBAAyB,CAAC,KAAa;QACpD,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,sBAAsB,EAAE,CAAC;QACvC,CAAC;QAAC,OAAO,YAAY,EAAE,CAAC;YACtB,qEAAqE;YACrE,mEAAmE;YACnE,GAAG,CACD,oEAAoE,KAAK,IAAI;kBACzE,GAAG,YAAY,YAAY,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CACrF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO;QACL,eAAe,EAAE,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC;QACtD,cAAc,EAAE,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC;QAEpD,KAAK,CAAC,cAAc;YAClB,IAAI,CAAC;gBACH,MAAM,KAAK,CAAC,oBAAoB,EAAE,CAAC;YACrC,CAAC;YAAC,OAAO,UAAU,EAAE,CAAC;gBACpB,iEAAiE;gBACjE,+DAA+D;gBAC/D,GAAG,CACD,uFAAuF;sBACnF,GAAG,UAAU,YAAY,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAC/E,CAAC;gBACF,MAAM,yBAAyB,CAAC,OAAO,CAAC,CAAC;gBACzC,MAAM,UAAU,CAAC;YACnB,CAAC;YAED,IAAI,CAAC;gBACH,MAAM,OAAO,CAAC,cAAc,EAAE,CAAC;YACjC,CAAC;YAAC,OAAO,YAAY,EAAE,CAAC;gBACtB,MAAM,yBAAyB,CAAC,SAAS,CAAC,CAAC;gBAC3C,MAAM,YAAY,CAAC;YACrB,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,42 @@
1
+ import type { DesktopUpdateSnapshot } from './contracts.js';
2
+ import type { DesktopUpdateManager } from './updateManager.js';
3
+ /**
4
+ * Bounded IPC surface for the host-owned update manager.
5
+ *
6
+ * SPEC-111 section 3: every command takes no arguments, so a renderer cannot
7
+ * supply a feed URL, filesystem destination, shell command, executable path, or
8
+ * installer flag. Every handler also verifies the sender is the current Cats
9
+ * main window before touching the manager.
10
+ */
11
+ export declare const DESKTOP_UPDATE_IPC_CHANNELS: {
12
+ readonly snapshot: "cats-host:update-get-snapshot";
13
+ readonly check: "cats-host:update-check";
14
+ readonly download: "cats-host:update-download";
15
+ readonly install: "cats-host:update-install";
16
+ readonly event: "cats-host:update-event";
17
+ };
18
+ export interface DesktopUpdateIpcEvent {
19
+ sender: unknown;
20
+ }
21
+ export interface DesktopUpdateWebContentsLike {
22
+ isDestroyed?: () => boolean;
23
+ send: (channel: string, payload: unknown) => void;
24
+ }
25
+ export declare function isDesktopUpdateIpcSenderTrusted(event: DesktopUpdateIpcEvent, mainWindowWebContents: unknown): boolean;
26
+ export interface CreateDesktopUpdateIpcHandlersInput {
27
+ manager: DesktopUpdateManager;
28
+ resolveMainWindowWebContents: () => unknown;
29
+ logger?: (message: string) => void;
30
+ }
31
+ export type DesktopUpdateIpcHandlers = Record<string, (event: DesktopUpdateIpcEvent) => Promise<DesktopUpdateSnapshot | void>>;
32
+ export declare function createDesktopUpdateIpcHandlers(input: CreateDesktopUpdateIpcHandlersInput): DesktopUpdateIpcHandlers;
33
+ export interface CreateDesktopUpdateSnapshotBroadcastInput {
34
+ manager: DesktopUpdateManager;
35
+ resolveMainWindowWebContents: () => DesktopUpdateWebContentsLike | null;
36
+ }
37
+ /**
38
+ * Streams manager snapshots to the main window. Returns the unsubscribe
39
+ * function so the caller can detach deterministically during shutdown.
40
+ */
41
+ export declare function createDesktopUpdateSnapshotBroadcast(input: CreateDesktopUpdateSnapshotBroadcastInput): () => void;
42
+ //# sourceMappingURL=updateIpc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"updateIpc.d.ts","sourceRoot":"","sources":["../../desktop/host/updateIpc.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAC5D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAE/D;;;;;;;GAOG;AAEH,eAAO,MAAM,2BAA2B;;;;;;CAM9B,CAAC;AAEX,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,4BAA4B;IAC3C,WAAW,CAAC,EAAE,MAAM,OAAO,CAAC;IAC5B,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;CACnD;AAED,wBAAgB,+BAA+B,CAC7C,KAAK,EAAE,qBAAqB,EAC5B,qBAAqB,EAAE,OAAO,GAC7B,OAAO,CAKT;AAED,MAAM,WAAW,mCAAmC;IAClD,OAAO,EAAE,oBAAoB,CAAC;IAC9B,4BAA4B,EAAE,MAAM,OAAO,CAAC;IAC5C,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACpC;AAED,MAAM,MAAM,wBAAwB,GAAG,MAAM,CAC3C,MAAM,EACN,CAAC,KAAK,EAAE,qBAAqB,KAAK,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC,CACxE,CAAC;AAEF,wBAAgB,8BAA8B,CAC5C,KAAK,EAAE,mCAAmC,GACzC,wBAAwB,CAgC1B;AAED,MAAM,WAAW,yCAAyC;IACxD,OAAO,EAAE,oBAAoB,CAAC;IAC9B,4BAA4B,EAAE,MAAM,4BAA4B,GAAG,IAAI,CAAC;CACzE;AAED;;;GAGG;AACH,wBAAgB,oCAAoC,CAClD,KAAK,EAAE,yCAAyC,GAC/C,MAAM,IAAI,CAaZ"}