@cats-inc/cats-platform 0.1.1 → 0.1.7

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 (203) 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 +68 -11
  11. package/build/desktop/contracts.d.ts.map +1 -1
  12. package/build/desktop/contracts.js +52 -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/ipcSecurity.d.ts +6 -0
  23. package/build/desktop/ipcSecurity.d.ts.map +1 -0
  24. package/build/desktop/ipcSecurity.js +10 -0
  25. package/build/desktop/ipcSecurity.js.map +1 -0
  26. package/build/desktop/main.js +272 -59
  27. package/build/desktop/main.js.map +1 -1
  28. package/build/desktop/packaging.d.ts.map +1 -1
  29. package/build/desktop/packaging.js +10 -4
  30. package/build/desktop/packaging.js.map +1 -1
  31. package/build/desktop/preload.cjs +39 -0
  32. package/build/desktop/preload.cjs.map +1 -1
  33. package/build/desktop/processSupervisor.d.ts +2 -0
  34. package/build/desktop/processSupervisor.d.ts.map +1 -1
  35. package/build/desktop/processSupervisor.js +28 -13
  36. package/build/desktop/processSupervisor.js.map +1 -1
  37. package/build/desktop/readiness.d.ts +2 -2
  38. package/build/desktop/readiness.d.ts.map +1 -1
  39. package/build/desktop/readiness.js +2 -2
  40. package/build/desktop/readiness.js.map +1 -1
  41. package/build/desktop/releaseDescriptor.d.ts +85 -0
  42. package/build/desktop/releaseDescriptor.d.ts.map +1 -0
  43. package/build/desktop/releaseDescriptor.js +246 -0
  44. package/build/desktop/releaseDescriptor.js.map +1 -0
  45. package/build/desktop/screenshotCapture.d.ts.map +1 -1
  46. package/build/desktop/screenshotCapture.js +3 -7
  47. package/build/desktop/screenshotCapture.js.map +1 -1
  48. package/build/desktop/security.d.ts +8 -0
  49. package/build/desktop/security.d.ts.map +1 -1
  50. package/build/desktop/security.js +54 -1
  51. package/build/desktop/security.js.map +1 -1
  52. package/build/desktop/tray.d.ts +1 -0
  53. package/build/desktop/tray.d.ts.map +1 -1
  54. package/build/desktop/tray.js +26 -0
  55. package/build/desktop/tray.js.map +1 -1
  56. package/build/desktop/trayMenu.d.ts +22 -1
  57. package/build/desktop/trayMenu.d.ts.map +1 -1
  58. package/build/desktop/trayMenu.js +61 -0
  59. package/build/desktop/trayMenu.js.map +1 -1
  60. package/build/desktop/updateInstallHandoff.d.ts +30 -0
  61. package/build/desktop/updateInstallHandoff.d.ts.map +1 -0
  62. package/build/desktop/updateInstallHandoff.js +39 -0
  63. package/build/desktop/updateInstallHandoff.js.map +1 -0
  64. package/build/desktop/updateIpc.d.ts +42 -0
  65. package/build/desktop/updateIpc.d.ts.map +1 -0
  66. package/build/desktop/updateIpc.js +71 -0
  67. package/build/desktop/updateIpc.js.map +1 -0
  68. package/build/desktop/updateManager.d.ts +76 -0
  69. package/build/desktop/updateManager.d.ts.map +1 -0
  70. package/build/desktop/updateManager.js +342 -0
  71. package/build/desktop/updateManager.js.map +1 -0
  72. package/build/desktop/updateNotifications.d.ts +64 -0
  73. package/build/desktop/updateNotifications.d.ts.map +1 -0
  74. package/build/desktop/updateNotifications.js +143 -0
  75. package/build/desktop/updateNotifications.js.map +1 -0
  76. package/build/desktop/updaterAdapter.d.ts +72 -0
  77. package/build/desktop/updaterAdapter.d.ts.map +1 -0
  78. package/build/desktop/updaterAdapter.js +198 -0
  79. package/build/desktop/updaterAdapter.js.map +1 -0
  80. package/build/desktop/voiceCapture.d.ts.map +1 -1
  81. package/build/desktop/voiceCapture.js +3 -7
  82. package/build/desktop/voiceCapture.js.map +1 -1
  83. package/build/renderer/assets/ActiveSessionPermissionChip-BRMLwkvf.js +1 -0
  84. package/build/renderer/assets/{App-BbuTWT6Y.js → App-BM2nzo6s.js} +1 -1
  85. package/build/renderer/assets/{App-n-RtGh42.js → App-CVQAwCMi.js} +1 -1
  86. package/build/renderer/assets/{App-B13AzNko.js → App-Dl5FLaR_.js} +1 -1
  87. package/build/renderer/assets/{WorkspaceAppRoutes-BktWrQK-.js → WorkspaceAppRoutes-C3DUzdbj.js} +1 -1
  88. package/build/renderer/assets/app-hP5h2jAt.js +43 -0
  89. package/build/renderer/assets/{client-DREGSZqQ.js → client-BdGHAUoK.js} +1 -1
  90. package/build/renderer/assets/{conversationSidebarRecentEntries-BNPz3X1V.js → conversationSidebarRecentEntries-B-mNvfiy.js} +1 -1
  91. package/build/renderer/assets/{screenshotOverlay-EF07cXvw.js → screenshotOverlay-DfBcolX-.js} +1 -1
  92. package/build/renderer/assets/{useDraftSessionChips-3z_Je4ju.js → useDraftSessionChips-DuXIoptW.js} +1 -1
  93. package/build/renderer/desktop/overlay/index.html +2 -2
  94. package/build/renderer/index.html +2 -2
  95. package/build/server/app/renderer/settings/settingsDesktopErrorLabels.d.ts +5 -0
  96. package/build/server/app/renderer/settings/settingsDesktopErrorLabels.d.ts.map +1 -0
  97. package/build/server/app/renderer/settings/settingsDesktopErrorLabels.js +16 -0
  98. package/build/server/app/renderer/settings/settingsDesktopErrorLabels.js.map +1 -0
  99. package/build/server/app/renderer/settings/settingsDesktopPreferences.d.ts +11 -0
  100. package/build/server/app/renderer/settings/settingsDesktopPreferences.d.ts.map +1 -0
  101. package/build/server/app/renderer/settings/settingsDesktopPreferences.js +30 -0
  102. package/build/server/app/renderer/settings/settingsDesktopPreferences.js.map +1 -0
  103. package/build/server/app/renderer/settings/settingsDesktopUpdateLabels.d.ts +31 -0
  104. package/build/server/app/renderer/settings/settingsDesktopUpdateLabels.d.ts.map +1 -0
  105. package/build/server/app/renderer/settings/settingsDesktopUpdateLabels.js +101 -0
  106. package/build/server/app/renderer/settings/settingsDesktopUpdateLabels.js.map +1 -0
  107. package/build/server/app/server/authGatePolicy.js +14 -2
  108. package/build/server/app/server/authGatePolicy.js.map +1 -1
  109. package/build/server/app/server/authRoutes.d.ts +2 -1
  110. package/build/server/app/server/authRoutes.d.ts.map +1 -1
  111. package/build/server/app/server/authRoutes.js +260 -4
  112. package/build/server/app/server/authRoutes.js.map +1 -1
  113. package/build/server/app/server/contracts.d.ts +3 -1
  114. package/build/server/app/server/contracts.d.ts.map +1 -1
  115. package/build/server/app/server/dependencies.d.ts.map +1 -1
  116. package/build/server/app/server/dependencies.js +4 -1
  117. package/build/server/app/server/dependencies.js.map +1 -1
  118. package/build/server/app/server/index.js +1 -1
  119. package/build/server/app/server/index.js.map +1 -1
  120. package/build/server/app/server/platformSetupRoutes.d.ts.map +1 -1
  121. package/build/server/app/server/platformSetupRoutes.js +42 -5
  122. package/build/server/app/server/platformSetupRoutes.js.map +1 -1
  123. package/build/server/app/server/requestRouter.d.ts.map +1 -1
  124. package/build/server/app/server/requestRouter.js +3 -0
  125. package/build/server/app/server/requestRouter.js.map +1 -1
  126. package/build/server/design/components/runtimeChips.d.ts +1 -1
  127. package/build/server/design/components/runtimeChips.d.ts.map +1 -1
  128. package/build/server/design/components/runtimeChips.js +4 -1
  129. package/build/server/design/components/runtimeChips.js.map +1 -1
  130. package/build/server/index.js +12 -1
  131. package/build/server/index.js.map +1 -1
  132. package/build/server/platform/auth/browserHandoff.d.ts +50 -0
  133. package/build/server/platform/auth/browserHandoff.d.ts.map +1 -0
  134. package/build/server/platform/auth/browserHandoff.js +94 -0
  135. package/build/server/platform/auth/browserHandoff.js.map +1 -0
  136. package/build/server/platform/auth/index.d.ts +1 -0
  137. package/build/server/platform/auth/index.d.ts.map +1 -1
  138. package/build/server/platform/auth/index.js +1 -0
  139. package/build/server/platform/auth/index.js.map +1 -1
  140. package/build/server/platform/auth/principal.js +2 -2
  141. package/build/server/platform/auth/principal.js.map +1 -1
  142. package/build/server/platform/auth/session.d.ts +3 -0
  143. package/build/server/platform/auth/session.d.ts.map +1 -1
  144. package/build/server/platform/auth/session.js +41 -0
  145. package/build/server/platform/auth/session.js.map +1 -1
  146. package/build/server/platform/auth/sessionSecretProvisioning.d.ts +23 -0
  147. package/build/server/platform/auth/sessionSecretProvisioning.d.ts.map +1 -0
  148. package/build/server/platform/auth/sessionSecretProvisioning.js +291 -0
  149. package/build/server/platform/auth/sessionSecretProvisioning.js.map +1 -0
  150. package/build/server/platform/auth/state.js +4 -0
  151. package/build/server/platform/auth/state.js.map +1 -1
  152. package/build/server/platform/auth/types.d.ts +1 -0
  153. package/build/server/platform/auth/types.d.ts.map +1 -1
  154. package/build/server/products/code/livePreview/realProcessAdapter.d.ts.map +1 -1
  155. package/build/server/products/code/livePreview/realProcessAdapter.js +7 -1
  156. package/build/server/products/code/livePreview/realProcessAdapter.js.map +1 -1
  157. package/build/server/products/code/state/appExport.d.ts.map +1 -1
  158. package/build/server/products/code/state/appExport.js +2 -0
  159. package/build/server/products/code/state/appExport.js.map +1 -1
  160. package/build/server/shared/browserHandoff.d.ts +11 -0
  161. package/build/server/shared/browserHandoff.d.ts.map +1 -0
  162. package/build/server/shared/browserHandoff.js +2 -0
  163. package/build/server/shared/browserHandoff.js.map +1 -0
  164. package/build/server/shared/desktopRecoveryBridge.d.ts +47 -0
  165. package/build/server/shared/desktopRecoveryBridge.d.ts.map +1 -1
  166. package/build/server/shared/desktopRecoveryBridge.js +20 -0
  167. package/build/server/shared/desktopRecoveryBridge.js.map +1 -1
  168. package/build/server/shared/i18n/catalogs/en.d.ts.map +1 -1
  169. package/build/server/shared/i18n/catalogs/en.js +38 -0
  170. package/build/server/shared/i18n/catalogs/en.js.map +1 -1
  171. package/build/server/shared/i18n/catalogs/zh-TW.d.ts.map +1 -1
  172. package/build/server/shared/i18n/catalogs/zh-TW.js +36 -0
  173. package/build/server/shared/i18n/catalogs/zh-TW.js.map +1 -1
  174. package/build/server/shared/i18n/index.d.ts +36 -0
  175. package/build/server/shared/i18n/index.d.ts.map +1 -1
  176. package/build/server/shared/i18n/messageKeys.d.ts +36 -0
  177. package/build/server/shared/i18n/messageKeys.d.ts.map +1 -1
  178. package/build/server/shared/i18n/messageKeys.js +36 -0
  179. package/build/server/shared/i18n/messageKeys.js.map +1 -1
  180. package/build/server/shared/loadProjectEnvFile.d.ts.map +1 -1
  181. package/build/server/shared/loadProjectEnvFile.js +18 -19
  182. package/build/server/shared/loadProjectEnvFile.js.map +1 -1
  183. package/build/server/shared/platformChildProcessEnv.d.ts +2 -0
  184. package/build/server/shared/platformChildProcessEnv.d.ts.map +1 -0
  185. package/build/server/shared/platformChildProcessEnv.js +22 -0
  186. package/build/server/shared/platformChildProcessEnv.js.map +1 -0
  187. package/package.json +19 -27
  188. package/scripts/build-desktop-installer.mjs +438 -37
  189. package/scripts/build-test-ui.mjs +13 -2
  190. package/scripts/generate-desktop-release-descriptor.mjs +258 -0
  191. package/scripts/validate-release-assets.mjs +422 -0
  192. package/scripts/validate-release-version.mjs +217 -0
  193. package/scripts/windows/Test-WindowsInstallerSmoke.ps1 +55 -1
  194. package/build/desktop/update.d.ts +0 -24
  195. package/build/desktop/update.d.ts.map +0 -1
  196. package/build/desktop/update.js +0 -173
  197. package/build/desktop/update.js.map +0 -1
  198. package/build/renderer/assets/ActiveSessionPermissionChip-BYr8cDpb.js +0 -1
  199. package/build/renderer/assets/app-DnVQMpW_.js +0 -43
  200. package/build/server/app/renderer/settings/settingsDesktopStartupErrorLabels.d.ts +0 -5
  201. package/build/server/app/renderer/settings/settingsDesktopStartupErrorLabels.d.ts.map +0 -1
  202. package/build/server/app/renderer/settings/settingsDesktopStartupErrorLabels.js +0 -11
  203. 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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"}
@@ -1 +1 @@
1
- {"version":3,"file":"screenshotCapture.d.ts","sourceRoot":"","sources":["../../desktop/host/screenshotCapture.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE9C,OAAO,EAEL,KAAK,+BAA+B,EACpC,KAAK,8BAA8B,EACpC,MAAM,gBAAgB,CAAC;AAExB,eAAO,MAAM,8BAA8B,wCAAwC,CAAC;AAKpF,MAAM,WAAW,2BAA4B,SAAQ,IAAI,CAAC,aAAa,EAAE,aAAa,CAAC;IACrF,IAAI,IAAI,IAAI,CAAC;IACb,IAAI,IAAI,IAAI,CAAC;IACb,WAAW,IAAI,OAAO,CAAC;IACvB,OAAO,IAAI,IAAI,CAAC;IAChB,KAAK,IAAI,IAAI,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,OAAO,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;CACvB;AAED,MAAM,WAAW,4BAA4B;IAC3C,UAAU,EAAE,OAAO,CAAC;IACpB,YAAY,EAAE,OAAO,CAAC;IACtB,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,8BAA8B;IAC7C,OAAO,EAAE,+BAA+B,CAAC;IACzC,UAAU,EAAE,2BAA2B,CAAC;IACxC,kBAAkB,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACzC,mBAAmB,CAAC,EAAE,CACpB,OAAO,EAAE,+BAA+B,KACrC,OAAO,CAAC,8BAA8B,CAAC,CAAC;CAC9C;AAMD,wBAAgB,oCAAoC,CAClD,KAAK,EAAE,OAAO,GACb,+BAA+B,CAcjC;AAED,wBAAgB,+BAA+B,CAC7C,KAAK,EAAE,OAAO,EACd,UAAU,EAAE,IAAI,CAAC,2BAA2B,EAAE,aAAa,CAAC,GAAG,IAAI,GAClE,OAAO,CAMT;AAED,wBAAgB,mCAAmC,CACjD,KAAK,EAAE,OAAO,EACd,UAAU,EAAE,2BAA2B,GAAG,IAAI,GAC7C,OAAO,CAAC,UAAU,IAAI,2BAA2B,CAInD;AAED,wBAAgB,mCAAmC,CACjD,UAAU,EAAE,2BAA2B,GACtC,4BAA4B,CAM9B;AAED,wBAAgB,kCAAkC,CAChD,UAAU,EAAE,2BAA2B,EACvC,KAAK,EAAE,4BAA4B,GAClC,IAAI,CAiBN;AAED,wBAAsB,uCAAuC,CAC3D,MAAM,SAA6B,GAClC,OAAO,CAAC,IAAI,CAAC,CAIf;AAED,wBAAsB,oCAAoC,CAAC,CAAC,EAC1D,UAAU,EAAE,2BAA2B,EACvC,MAAM,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACxB,kBAAkB,GAAE,MAAM,OAAO,CAAC,IAAI,CAA2C,GAChF,OAAO,CAAC,CAAC,CAAC,CASZ;AAED,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,8BAA8B,GACtC,OAAO,CAAC,8BAA8B,CAAC,CAWzC"}
1
+ {"version":3,"file":"screenshotCapture.d.ts","sourceRoot":"","sources":["../../desktop/host/screenshotCapture.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE9C,OAAO,EAEL,KAAK,+BAA+B,EACpC,KAAK,8BAA8B,EACpC,MAAM,gBAAgB,CAAC;AAMxB,eAAO,MAAM,8BAA8B,wCAAwC,CAAC;AAKpF,MAAM,WAAW,2BAA4B,SAAQ,IAAI,CAAC,aAAa,EAAE,aAAa,CAAC;IACrF,IAAI,IAAI,IAAI,CAAC;IACb,IAAI,IAAI,IAAI,CAAC;IACb,WAAW,IAAI,OAAO,CAAC;IACvB,OAAO,IAAI,IAAI,CAAC;IAChB,KAAK,IAAI,IAAI,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,OAAO,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;CACvB;AAED,MAAM,WAAW,4BAA4B;IAC3C,UAAU,EAAE,OAAO,CAAC;IACpB,YAAY,EAAE,OAAO,CAAC;IACtB,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,8BAA8B;IAC7C,OAAO,EAAE,+BAA+B,CAAC;IACzC,UAAU,EAAE,2BAA2B,CAAC;IACxC,kBAAkB,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACzC,mBAAmB,CAAC,EAAE,CACpB,OAAO,EAAE,+BAA+B,KACrC,OAAO,CAAC,8BAA8B,CAAC,CAAC;CAC9C;AAMD,wBAAgB,oCAAoC,CAClD,KAAK,EAAE,OAAO,GACb,+BAA+B,CAcjC;AAED,wBAAgB,+BAA+B,CAC7C,KAAK,EAAE,OAAO,EACd,UAAU,EAAE,IAAI,CAAC,2BAA2B,EAAE,aAAa,CAAC,GAAG,IAAI,GAClE,OAAO,CAET;AAED,wBAAgB,mCAAmC,CACjD,KAAK,EAAE,OAAO,EACd,UAAU,EAAE,2BAA2B,GAAG,IAAI,GAC7C,OAAO,CAAC,UAAU,IAAI,2BAA2B,CAMnD;AAED,wBAAgB,mCAAmC,CACjD,UAAU,EAAE,2BAA2B,GACtC,4BAA4B,CAM9B;AAED,wBAAgB,kCAAkC,CAChD,UAAU,EAAE,2BAA2B,EACvC,KAAK,EAAE,4BAA4B,GAClC,IAAI,CAiBN;AAED,wBAAsB,uCAAuC,CAC3D,MAAM,SAA6B,GAClC,OAAO,CAAC,IAAI,CAAC,CAIf;AAED,wBAAsB,oCAAoC,CAAC,CAAC,EAC1D,UAAU,EAAE,2BAA2B,EACvC,MAAM,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACxB,kBAAkB,GAAE,MAAM,OAAO,CAAC,IAAI,CAA2C,GAChF,OAAO,CAAC,CAAC,CAAC,CASZ;AAED,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,8BAA8B,GACtC,OAAO,CAAC,8BAA8B,CAAC,CAWzC"}
@@ -1,4 +1,5 @@
1
1
  import { DESKTOP_SCREENSHOT_CAPTURE_SOURCES, } from './contracts.js';
2
+ import { assertMainWindowIpcSender, isMainWindowIpcSender, } from './ipcSecurity.js';
2
3
  export const DESKTOP_SCREENSHOT_IPC_CHANNEL = 'cats-host:capture-screenshot-region';
3
4
  const DESKTOP_SCREENSHOT_UNSUPPORTED_MESSAGE = 'Native region screenshot capture is not implemented in this desktop build yet.';
4
5
  const DEFAULT_COMPOSITOR_WAIT_MS = 120;
@@ -14,15 +15,10 @@ export function parseDesktopScreenshotCaptureRequest(value) {
14
15
  };
15
16
  }
16
17
  export function isMainWindowScreenshotIpcSender(event, mainWindow) {
17
- if (!mainWindow) {
18
- return false;
19
- }
20
- return event.sender === mainWindow.webContents;
18
+ return isMainWindowIpcSender(event, mainWindow);
21
19
  }
22
20
  export function assertMainWindowScreenshotIpcSender(event, mainWindow) {
23
- if (!isMainWindowScreenshotIpcSender(event, mainWindow)) {
24
- throw new Error('Desktop screenshot capture is only available to the main Cats window.');
25
- }
21
+ assertMainWindowIpcSender(event, mainWindow, 'Desktop screenshot capture is only available to the main Cats window.');
26
22
  }
27
23
  export function captureDesktopScreenshotWindowState(mainWindow) {
28
24
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"screenshotCapture.js","sourceRoot":"","sources":["../../desktop/host/screenshotCapture.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"screenshotCapture.js","sourceRoot":"","sources":["../../desktop/host/screenshotCapture.ts"],"names":[],"mappings":"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"}
@@ -6,6 +6,14 @@ interface ValidateDesktopUrlOptions {
6
6
  export declare function normalizeDesktopHost(rawValue: string | undefined, fallback: string): string;
7
7
  export declare function validateDesktopUrl(rawValue: string, options?: ValidateDesktopUrlOptions): string;
8
8
  export declare function parseDesktopAllowedHosts(rawValue: string | undefined): string[];
9
+ export declare function resolveDesktopBrowserHandoffUrl(rawLaunchPath: string, options: {
10
+ appBaseUrl: string;
11
+ allowedHosts: Iterable<string>;
12
+ }): string;
13
+ export declare function isDesktopAppOriginUrl(rawUrl: string, options: {
14
+ appBaseUrl: string;
15
+ allowedHosts: Iterable<string>;
16
+ }): boolean;
9
17
  export declare function isDesktopHostActionId(value: unknown): value is DesktopHostActionId;
10
18
  export {};
11
19
  //# sourceMappingURL=security.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../../desktop/host/security.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,mBAAmB,EACzB,MAAM,gBAAgB,CAAC;AAExB,UAAU,yBAAyB;IACjC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;CACxC;AA4CD,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,QAAQ,EAAE,MAAM,GACf,MAAM,CASR;AAED,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,yBAA8B,GACtC,MAAM,CAoBR;AAED,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,EAAE,CAW/E;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,mBAAmB,CAElF"}
1
+ {"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../../desktop/host/security.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,mBAAmB,EACzB,MAAM,gBAAgB,CAAC;AAExB,UAAU,yBAAyB;IACjC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;CACxC;AAiDD,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,QAAQ,EAAE,MAAM,GACf,MAAM,CASR;AAED,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,yBAA8B,GACtC,MAAM,CAoBR;AAED,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,EAAE,CAW/E;AAED,wBAAgB,+BAA+B,CAC7C,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE;IACP,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;CAChC,GACA,MAAM,CAmCR;AAED,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE;IACP,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;CAChC,GACA,OAAO,CAYT;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,mBAAmB,CAElF"}
@@ -1,5 +1,10 @@
1
- import { DESKTOP_HOST_ACTION_IDS, } from './contracts.js';
1
+ import { DESKTOP_BROWSER_HANDOFF_EXCHANGE_PATH, DESKTOP_HOST_ACTION_IDS, } from './contracts.js';
2
2
  const DESKTOP_HOST_ACTION_ID_SET = new Set(DESKTOP_HOST_ACTION_IDS);
3
+ const DESKTOP_DIRECT_BROWSER_PATHS = new Set([
4
+ '/runtime/setup',
5
+ '/runtime/dashboard',
6
+ '/runtime/playground',
7
+ ]);
3
8
  const HOSTNAME_PATTERN = /^(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)(?:\.(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?))*$/iu;
4
9
  const BRACKETED_IPV6_PATTERN = /^\[[0-9a-f:.]+\]$/iu;
5
10
  function isValidIpv4Host(value) {
@@ -78,6 +83,54 @@ export function parseDesktopAllowedHosts(rawValue) {
78
83
  }
79
84
  return entries.map((entry) => entry.toLowerCase());
80
85
  }
86
+ export function resolveDesktopBrowserHandoffUrl(rawLaunchPath, options) {
87
+ const launchPath = rawLaunchPath.trim();
88
+ if (!launchPath.startsWith('/')) {
89
+ throw new Error('Desktop browser handoff path must be root-relative.');
90
+ }
91
+ const appUrl = new URL(validateDesktopUrl(options.appBaseUrl, {
92
+ allowedHosts: options.allowedHosts,
93
+ }));
94
+ const targetUrl = new URL(launchPath, appUrl);
95
+ if (targetUrl.origin !== appUrl.origin) {
96
+ throw new Error('Desktop browser handoff must use the Cats app origin.');
97
+ }
98
+ if (DESKTOP_DIRECT_BROWSER_PATHS.has(targetUrl.pathname)) {
99
+ if (targetUrl.search || targetUrl.hash) {
100
+ throw new Error('Desktop direct browser path is invalid.');
101
+ }
102
+ return validateDesktopUrl(targetUrl.toString(), {
103
+ allowedHosts: options.allowedHosts,
104
+ });
105
+ }
106
+ if (targetUrl.pathname !== DESKTOP_BROWSER_HANDOFF_EXCHANGE_PATH || targetUrl.search) {
107
+ throw new Error('Desktop browser handoff path is invalid.');
108
+ }
109
+ const fragmentParams = new URLSearchParams(targetUrl.hash.slice(1));
110
+ const tokenValues = fragmentParams.getAll('token');
111
+ if (tokenValues.length !== 1
112
+ || !/^[a-z0-9_-]{40,}$/iu.test(tokenValues[0] ?? '')
113
+ || Array.from(fragmentParams.keys()).some((key) => key !== 'token')) {
114
+ throw new Error('Desktop browser handoff token is invalid.');
115
+ }
116
+ return validateDesktopUrl(targetUrl.toString(), {
117
+ allowedHosts: options.allowedHosts,
118
+ });
119
+ }
120
+ export function isDesktopAppOriginUrl(rawUrl, options) {
121
+ try {
122
+ const appUrl = new URL(validateDesktopUrl(options.appBaseUrl, {
123
+ allowedHosts: options.allowedHosts,
124
+ }));
125
+ const targetUrl = new URL(validateDesktopUrl(rawUrl, {
126
+ allowedHosts: options.allowedHosts,
127
+ }));
128
+ return targetUrl.origin === appUrl.origin;
129
+ }
130
+ catch {
131
+ return false;
132
+ }
133
+ }
81
134
  export function isDesktopHostActionId(value) {
82
135
  return typeof value === 'string' && DESKTOP_HOST_ACTION_ID_SET.has(value);
83
136
  }
@@ -1 +1 @@
1
- {"version":3,"file":"security.js","sourceRoot":"","sources":["../../desktop/host/security.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"security.js","sourceRoot":"","sources":["../../desktop/host/security.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) {