@omega.js/desktop 0.51.0 → 0.53.0

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 (289) hide show
  1. package/README.md +18 -13
  2. package/dist/assets/css/core/_initialize.scss +1 -1
  3. package/dist/assets/js/core/app-shell.js +14 -15
  4. package/dist/assets/themes/_template/_theme.js +6 -6
  5. package/dist/assets/themes/base/_includes/global/sections/account.html +4 -4
  6. package/dist/assets/themes/base/_includes/global/sections/app-sidebar.html +5 -5
  7. package/dist/assets/themes/base/_layouts/frontend/pages/account/index.html +3 -3
  8. package/dist/assets/themes/base/_layouts/frontend/pages/alternatives/index.html +1 -1
  9. package/dist/assets/themes/base/_layouts/frontend/pages/blog/tags/tag.html +1 -1
  10. package/dist/assets/themes/base/_layouts/frontend/pages/payment/confirmation.html +1 -1
  11. package/dist/assets/themes/base/_sections/marketing/newsletter-cta/section.js +2 -3
  12. package/dist/assets/themes/base/_sections/verts/unit/section.html +1 -1
  13. package/dist/assets/themes/base/_sections/verts/unit/section.js +3 -4
  14. package/dist/assets/themes/base/_theme.js +4 -3
  15. package/dist/assets/themes/bootstrap/_theme.js +2 -2
  16. package/dist/assets/themes/bootstrap/overrides/_links.scss +1 -1
  17. package/dist/assets/themes/classy/_theme.js +8 -6
  18. package/dist/assets/themes/classy/css/marketing/_sections.scss +1 -2
  19. package/dist/assets/themes/classy/js/hero-demo-form.js +3 -2
  20. package/dist/assets/themes/neobrutalism/_theme.js +5 -5
  21. package/dist/assets/themes/neobrutalism/js/pages/test/libraries/layers/index.js +1 -1
  22. package/dist/assets/themes/newsflash/_theme.js +6 -6
  23. package/dist/assets/themes/newsflash/js/pages/test/libraries/layers/index.js +1 -1
  24. package/dist/build.js +87 -111
  25. package/dist/cli.js +1 -1
  26. package/dist/commands/build.js +2 -2
  27. package/dist/commands/cdp/capture.js +2 -2
  28. package/dist/commands/cdp/quit.js +2 -2
  29. package/dist/commands/cdp/relaunch.js +2 -2
  30. package/dist/commands/cdp/theme.js +1 -1
  31. package/dist/commands/clean.js +2 -2
  32. package/dist/commands/deploy.js +4 -4
  33. package/dist/commands/finalize-release.js +4 -4
  34. package/dist/commands/install.js +3 -3
  35. package/dist/commands/launch.js +2 -2
  36. package/dist/commands/lib/deploy-precheck.js +3 -3
  37. package/dist/commands/lib/ensure-target.js +6 -6
  38. package/dist/commands/package.js +2 -2
  39. package/dist/commands/publish.js +2 -2
  40. package/dist/commands/release.js +3 -3
  41. package/dist/commands/runner.js +145 -48
  42. package/dist/commands/sign-windows.js +5 -5
  43. package/dist/commands/test.js +4 -4
  44. package/dist/commands/update.js +2 -2
  45. package/dist/commands/validate-certs.js +4 -4
  46. package/dist/commands/version.js +3 -3
  47. package/dist/defaults/.github/workflows/build.yml +2 -0
  48. package/dist/defaults/AGENTS.md +17 -8
  49. package/dist/defaults/config/omega.json5 +7 -7
  50. package/dist/defaults/hooks/build/post.js +1 -1
  51. package/dist/defaults/hooks/build/pre.js +1 -1
  52. package/dist/defaults/hooks/deploy/pre.js +1 -1
  53. package/dist/defaults/hooks/release/post.js +1 -1
  54. package/dist/defaults/hooks/release/pre.js +1 -1
  55. package/dist/defaults/src/assets/js/components/about/index.js +3 -5
  56. package/dist/defaults/src/assets/js/components/main/index.js +3 -5
  57. package/dist/defaults/src/assets/js/components/settings/index.js +3 -5
  58. package/dist/defaults/src/integrations/context-menu/index.js +2 -2
  59. package/dist/defaults/src/integrations/menu/index.js +3 -3
  60. package/dist/defaults/src/integrations/tray/index.js +3 -3
  61. package/dist/defaults/src/main.js +3 -5
  62. package/dist/defaults/src/preload.js +3 -5
  63. package/dist/defaults/test/README.md +2 -2
  64. package/dist/gulp/main.js +9 -10
  65. package/dist/gulp/tasks/audit.js +7 -7
  66. package/dist/gulp/tasks/build-config.js +8 -8
  67. package/dist/gulp/tasks/bundle.js +16 -16
  68. package/dist/gulp/tasks/defaults.js +3 -3
  69. package/dist/gulp/tasks/distribute.js +2 -2
  70. package/dist/gulp/tasks/html.js +9 -9
  71. package/dist/gulp/tasks/package-quick.js +3 -3
  72. package/dist/gulp/tasks/package.js +3 -3
  73. package/dist/gulp/tasks/release.js +3 -3
  74. package/dist/gulp/tasks/sass.js +6 -6
  75. package/dist/gulp/tasks/serve.js +4 -4
  76. package/dist/hooks/notarize-artifacts.js +1 -1
  77. package/dist/hooks/notarize.js +1 -1
  78. package/dist/index.js +5 -8
  79. package/dist/lib/_environment-mixin.js +50 -0
  80. package/dist/lib/_lifecycle-mixin.js +45 -0
  81. package/dist/lib/analytics.js +33 -35
  82. package/dist/lib/app-state.js +14 -14
  83. package/dist/lib/auth-flow.js +18 -18
  84. package/dist/lib/auth-persistence.js +12 -12
  85. package/dist/lib/auth.js +421 -0
  86. package/dist/lib/auto-updater.js +49 -49
  87. package/dist/lib/context-menu.js +13 -13
  88. package/dist/lib/context.js +19 -19
  89. package/dist/lib/deep-link.js +34 -34
  90. package/dist/lib/fontawesome.js +5 -5
  91. package/dist/lib/ipc.js +4 -4
  92. package/dist/lib/menu.js +25 -25
  93. package/dist/lib/protocol.js +5 -5
  94. package/dist/lib/remote-config.js +22 -22
  95. package/dist/lib/remote-scripts.js +21 -21
  96. package/dist/lib/restart-manager/index.js +28 -28
  97. package/dist/lib/sign-helpers/exec-with-limit.js +1 -1
  98. package/dist/lib/sign-helpers/sign-events.js +1 -1
  99. package/dist/lib/startup.js +18 -13
  100. package/dist/lib/storage.js +10 -10
  101. package/dist/lib/templating.js +16 -16
  102. package/dist/lib/theme.js +10 -10
  103. package/dist/lib/tray.js +27 -27
  104. package/dist/lib/usage.js +11 -11
  105. package/dist/lib/window-manager.js +26 -26
  106. package/dist/main.js +398 -483
  107. package/dist/preload.js +236 -176
  108. package/dist/renderer.js +417 -391
  109. package/dist/runner/job-started.js +1 -1
  110. package/dist/test/fixtures/consumer-app/config/omega.json5 +1 -1
  111. package/dist/test/fixtures/consumer-app/src/assets/js/components/main/index.js +8 -11
  112. package/dist/test/fixtures/consumer-app/src/main.js +5 -7
  113. package/dist/test/fixtures/consumer-app/src/preload.js +2 -2
  114. package/dist/test/harness/boot-entry.js +22 -20
  115. package/dist/test/harness/main-entry.js +31 -30
  116. package/dist/test/harness/renderer-entry.js +5 -5
  117. package/dist/test/harness/renderer-preload.js +137 -141
  118. package/dist/test/index.js +10 -10
  119. package/dist/test/runner.js +2 -2
  120. package/dist/test/runners/boot.js +7 -6
  121. package/dist/test/runners/electron.js +3 -2
  122. package/dist/test/runners/render-event.js +2 -2
  123. package/dist/test/suites/boot/consumer-app-boots.test.js +57 -26
  124. package/dist/test/suites/boot/restart-manager.test.js +2 -2
  125. package/dist/test/suites/boot/storage-bundled.test.js +5 -5
  126. package/dist/test/suites/boot/theme.test.js +13 -13
  127. package/dist/test/suites/build/audit.test.js +1 -1
  128. package/dist/test/suites/build/auth-persistence-resolve.test.js +6 -6
  129. package/dist/test/suites/build/boot-fixture.test.js +2 -2
  130. package/dist/test/suites/build/boot-runner-timeout.test.js +6 -5
  131. package/dist/test/suites/build/brand-scss.test.js +1 -1
  132. package/dist/test/suites/build/build-json-bake.test.js +1 -1
  133. package/dist/test/suites/build/cli.test.js +2 -2
  134. package/dist/test/suites/build/config-schema.test.js +5 -5
  135. package/dist/test/suites/build/defaults-scaffold.test.js +2 -2
  136. package/dist/test/suites/build/deploy-hook.test.js +3 -3
  137. package/dist/test/suites/build/ensure-target.test.js +2 -2
  138. package/dist/test/suites/build/env-delivery.test.js +2 -2
  139. package/dist/test/suites/build/esm-only-dependency.test.js +2 -2
  140. package/dist/test/suites/build/exports.test.js +9 -8
  141. package/dist/test/suites/build/get-config.test.js +4 -4
  142. package/dist/test/suites/build/manifest-deps.test.js +1 -1
  143. package/dist/test/suites/build/merge-line-files.test.js +1 -1
  144. package/dist/test/suites/build/omega-shell.test.js +34 -2
  145. package/dist/test/suites/build/omega.test.js +350 -0
  146. package/dist/test/suites/build/renderer-auth-bridge.test.js +211 -78
  147. package/dist/test/suites/build/runner.test.js +612 -5
  148. package/dist/test/suites/build/sentry.test.js +2 -2
  149. package/dist/test/suites/build/sign-windows-e2e.test.js +2 -2
  150. package/dist/test/suites/build/templating.test.js +3 -3
  151. package/dist/test/suites/build/test-stealth.test.js +7 -9
  152. package/dist/test/suites/build/url-helpers.test.js +55 -56
  153. package/dist/test/suites/build/validate-config.test.js +2 -2
  154. package/dist/test/suites/build/wave5-pins.test.js +2 -2
  155. package/dist/test/suites/main/analytics.test.js +59 -59
  156. package/dist/test/suites/main/app-state.test.js +66 -66
  157. package/dist/test/suites/main/auth-flow.test.js +41 -41
  158. package/dist/test/suites/main/auth-persistence.test.js +54 -43
  159. package/dist/test/suites/main/{client-bridge.integration.test.js → auth.integration.test.js} +10 -9
  160. package/dist/test/suites/main/auth.test.js +336 -0
  161. package/dist/test/suites/main/auto-updater.test.js +134 -134
  162. package/dist/test/suites/main/boot-sequence.test.js +37 -49
  163. package/dist/test/suites/main/context-menu.test.js +51 -50
  164. package/dist/test/suites/main/context.test.js +25 -25
  165. package/dist/test/suites/main/deep-link.test.js +74 -74
  166. package/dist/test/suites/main/fontawesome.test.js +27 -27
  167. package/dist/test/suites/main/ipc.test.js +35 -35
  168. package/dist/test/suites/main/menu.test.js +101 -100
  169. package/dist/test/suites/main/protocol.test.js +19 -19
  170. package/dist/test/suites/main/remote-config.test.js +63 -63
  171. package/dist/test/suites/main/remote-scripts.test.js +103 -103
  172. package/dist/test/suites/main/request.test.js +71 -0
  173. package/dist/test/suites/main/restart-manager.test.js +33 -33
  174. package/dist/test/suites/main/startup-paths-and-ua.test.js +4 -4
  175. package/dist/test/suites/main/startup.test.js +26 -26
  176. package/dist/test/suites/main/stealth-window.test.js +1 -1
  177. package/dist/test/suites/main/storage.test.js +25 -25
  178. package/dist/test/suites/main/theme.test.js +34 -34
  179. package/dist/test/suites/main/tray.test.js +79 -79
  180. package/dist/test/suites/main/url-helpers.test.js +133 -133
  181. package/dist/test/suites/main/usage.test.js +25 -25
  182. package/dist/test/suites/main/window-bounds.test.js +27 -27
  183. package/dist/test/suites/main/window-manager.test.js +44 -44
  184. package/dist/test/suites/renderer/analytics-bridge.test.js +5 -5
  185. package/dist/test/suites/renderer/cross-context-helpers.test.js +37 -31
  186. package/dist/test/suites/renderer/round-trip.test.js +3 -3
  187. package/dist/test/suites/renderer/tooltips.test.js +15 -15
  188. package/dist/test/suites/renderer/{window-em-surface.test.js → window-desktop-surface.test.js} +27 -7
  189. package/dist/test/utils/extended-mode-warning.js +1 -1
  190. package/dist/utils/boot-harness.js +56 -0
  191. package/dist/utils/mode-helpers.js +2 -15
  192. package/dist/utils/ship-keys.js +3 -3
  193. package/dist/utils/signing-status.js +51 -0
  194. package/dist/utils/test-events.js +7 -0
  195. package/dist/utils/test-stealth.js +6 -6
  196. package/dist/utils/url-helpers.js +52 -42
  197. package/dist/utils/user-agent.js +44 -0
  198. package/dist/vendor/account/engine.js +3 -3
  199. package/dist/vendor/account/index.js +14 -45
  200. package/dist/vendor/account/resolve-account.js +44 -0
  201. package/dist/vendor/account/schema.js +1 -1
  202. package/dist/vendor/account/user.js +99 -0
  203. package/dist/vendor/config/client-config.js +1 -1
  204. package/dist/vendor/config/environment.js +11 -30
  205. package/dist/vendor/config/index.js +13 -12
  206. package/dist/vendor/config/load.js +1 -2
  207. package/dist/vendor/config/platforms.js +1 -1
  208. package/dist/vendor/config/repo.js +24 -0
  209. package/dist/vendor/config/retired-keys.js +2 -2
  210. package/dist/vendor/config/schema.js +5 -8
  211. package/dist/vendor/config/site-global.js +2 -3
  212. package/dist/vendor/config/validate.js +1 -2
  213. package/dist/vendor/config/winback.js +1 -1
  214. package/dist/vendor/devkit/actions-secrets.js +1 -1
  215. package/dist/vendor/devkit/attach-log-file.js +1 -1
  216. package/dist/vendor/devkit/brand-version.js +162 -1
  217. package/dist/vendor/devkit/build-json.js +1 -1
  218. package/dist/vendor/devkit/cli-router.js +3 -4
  219. package/dist/vendor/devkit/defaults-engine.js +9 -11
  220. package/dist/vendor/devkit/deploy.js +64 -4
  221. package/dist/vendor/devkit/git-remote.js +78 -1
  222. package/dist/vendor/devkit/local.js +53 -3
  223. package/dist/vendor/devkit/lockfile.js +127 -0
  224. package/dist/vendor/devkit/merge-line-files.js +2 -3
  225. package/dist/vendor/devkit/pack-local.js +4 -7
  226. package/dist/vendor/devkit/preludes/origin-heal.js +35 -49
  227. package/dist/vendor/devkit/target-secrets.js +34 -45
  228. package/dist/vendor/devkit/test/runner-core.js +6 -6
  229. package/dist/vendor/monitoring/env.js +2 -2
  230. package/dist/vendor/monitoring/index.js +1 -1
  231. package/dist/vendor/monitoring/main.js +1 -1
  232. package/dist/vendor/monitoring/preload.js +1 -1
  233. package/dist/vendor/monitoring/renderer.js +1 -1
  234. package/docs/analytics.md +8 -8
  235. package/docs/app-state.md +19 -19
  236. package/docs/audit.md +4 -4
  237. package/docs/{client-bridge.md → auth.md} +88 -73
  238. package/docs/auto-updater.md +8 -8
  239. package/docs/boot-sequence.md +11 -6
  240. package/docs/build-system.md +1 -1
  241. package/docs/cdp-debugging.md +1 -1
  242. package/docs/common-mistakes.md +7 -7
  243. package/docs/config-schema.md +1 -1
  244. package/docs/context-menu.md +13 -13
  245. package/docs/context.md +11 -11
  246. package/docs/css.md +3 -9
  247. package/docs/deep-link.md +25 -25
  248. package/docs/environment-detection.md +16 -16
  249. package/docs/fontawesome.md +7 -5
  250. package/docs/hooks.md +8 -8
  251. package/docs/index.md +39 -28
  252. package/docs/ipc.md +10 -10
  253. package/docs/lib-modules.md +9 -9
  254. package/docs/logging.md +12 -14
  255. package/docs/menu.md +18 -18
  256. package/docs/releasing.md +4 -2
  257. package/docs/remote-config.md +9 -9
  258. package/docs/remote-scripts.md +12 -12
  259. package/docs/restart-manager.md +8 -8
  260. package/docs/runner.md +12 -10
  261. package/docs/sentry.md +4 -4
  262. package/docs/shared/analytics.md +1 -1
  263. package/docs/shared/brands.md +1 -1
  264. package/docs/shared/breaking-changes.md +79 -13
  265. package/docs/shared/config.md +24 -21
  266. package/docs/shared/deploys.md +30 -7
  267. package/docs/shared/local-dev.md +5 -3
  268. package/docs/shared/logging.md +1 -1
  269. package/docs/shared/monitoring.md +5 -5
  270. package/docs/shared/testing.md +2 -2
  271. package/docs/shared/theming.md +1 -1
  272. package/docs/shared/translation.md +19 -10
  273. package/docs/signing.md +1 -1
  274. package/docs/startup.md +16 -16
  275. package/docs/storage.md +11 -11
  276. package/docs/templating.md +3 -3
  277. package/docs/test-boot-layer.md +12 -12
  278. package/docs/test-framework.md +17 -17
  279. package/docs/themes.md +7 -7
  280. package/docs/tooltips.md +2 -2
  281. package/docs/tray.md +31 -31
  282. package/docs/usage.md +7 -7
  283. package/docs/verts.md +1 -1
  284. package/docs/windows.md +22 -22
  285. package/package.json +3 -4
  286. package/dist/lib/client-bridge.js +0 -374
  287. package/dist/lib/logger.js +0 -4
  288. package/dist/test/suites/build/manager.test.js +0 -213
  289. package/dist/test/suites/main/client-bridge.test.js +0 -262
@@ -6,7 +6,7 @@ const { v5: uuidv5 } = require('uuid');
6
6
  const defineCases = require('../../../vendor/devkit/test/define-cases.js');
7
7
 
8
8
  async function reinit(ctx, env, configOverrides) {
9
- ctx.manager.analytics.shutdown();
9
+ ctx.omega.analytics.shutdown();
10
10
  const saved = {
11
11
  GOOGLE_ANALYTICS_SECRET: process.env.GOOGLE_ANALYTICS_SECRET,
12
12
  };
@@ -14,19 +14,19 @@ async function reinit(ctx, env, configOverrides) {
14
14
  if (v == null) delete process.env[k];
15
15
  else process.env[k] = v;
16
16
  }
17
- const cfgOrig = ctx.manager.config.analytics;
17
+ const cfgOrig = ctx.omega.config.analytics;
18
18
  if (configOverrides !== undefined) {
19
- ctx.manager.config.analytics = configOverrides;
19
+ ctx.omega.config.analytics = configOverrides;
20
20
  }
21
- ctx.manager.analytics.initialize(ctx.manager);
21
+ ctx.omega.analytics.initialize(ctx.omega);
22
22
  return () => {
23
- ctx.manager.analytics.shutdown();
23
+ ctx.omega.analytics.shutdown();
24
24
  for (const [k, v] of Object.entries(saved)) {
25
25
  if (v == null) delete process.env[k];
26
26
  else process.env[k] = v;
27
27
  }
28
- ctx.manager.config.analytics = cfgOrig;
29
- ctx.manager.analytics.initialize(ctx.manager);
28
+ ctx.omega.config.analytics = cfgOrig;
29
+ ctx.omega.analytics.initialize(ctx.omega);
30
30
  };
31
31
  }
32
32
 
@@ -35,15 +35,15 @@ module.exports = defineCases({
35
35
  layer: 'main',
36
36
  description: 'analytics (main)',
37
37
  cleanup: async (ctx) => {
38
- ctx.manager.analytics.shutdown();
38
+ ctx.omega.analytics.shutdown();
39
39
  delete process.env.GOOGLE_ANALYTICS_SECRET;
40
- ctx.manager.analytics.initialize(ctx.manager);
40
+ ctx.omega.analytics.initialize(ctx.omega);
41
41
  },
42
42
  tests: [
43
43
  {
44
- name: 'analytics module wired on manager',
44
+ name: 'analytics module wired on omega',
45
45
  run: (ctx) => {
46
- ctx.expect(ctx.manager.analytics).toBeDefined();
46
+ ctx.expect(ctx.omega.analytics).toBeDefined();
47
47
  },
48
48
  },
49
49
  {
@@ -51,8 +51,8 @@ module.exports = defineCases({
51
51
  run: async (ctx) => {
52
52
  const restore = await reinit(ctx, {}, { enabled: false });
53
53
  try {
54
- ctx.expect(ctx.manager.analytics._enabled).toBe(false);
55
- ctx.expect(ctx.manager.analytics._clientId).toBe(null);
54
+ ctx.expect(ctx.omega.analytics._enabled).toBe(false);
55
+ ctx.expect(ctx.omega.analytics._clientId).toBe(null);
56
56
  } finally { await restore(); }
57
57
  },
58
58
  },
@@ -64,7 +64,7 @@ module.exports = defineCases({
64
64
  providers: { google: { id: '' } },
65
65
  });
66
66
  try {
67
- ctx.expect(ctx.manager.analytics._enabled).toBe(false);
67
+ ctx.expect(ctx.omega.analytics._enabled).toBe(false);
68
68
  } finally { await restore(); }
69
69
  },
70
70
  },
@@ -76,7 +76,7 @@ module.exports = defineCases({
76
76
  providers: { google: { id: 'G-TESTID12' } },
77
77
  });
78
78
  try {
79
- ctx.expect(ctx.manager.analytics._enabled).toBe(false);
79
+ ctx.expect(ctx.omega.analytics._enabled).toBe(false);
80
80
  } finally { await restore(); }
81
81
  },
82
82
  },
@@ -88,14 +88,14 @@ module.exports = defineCases({
88
88
  providers: { google: { id: 'G-TESTID12' } },
89
89
  });
90
90
  try {
91
- ctx.expect(ctx.manager.analytics._enabled).toBe(true);
92
- ctx.expect(typeof ctx.manager.analytics._clientId).toBe('string');
93
- ctx.expect(ctx.manager.analytics._clientId.length).toBe(36);
91
+ ctx.expect(ctx.omega.analytics._enabled).toBe(true);
92
+ ctx.expect(typeof ctx.omega.analytics._clientId).toBe('string');
93
+ ctx.expect(ctx.omega.analytics._clientId.length).toBe(36);
94
94
  // Confirm it's a stable derivation: same deviceId + same namespace should
95
95
  // produce the same uuidv5 every time.
96
- const ns = ctx.manager.analytics._namespace;
97
- const deviceId = ctx.manager.context.session.deviceId;
98
- ctx.expect(ctx.manager.analytics._clientId).toBe(uuidv5(deviceId, ns));
96
+ const ns = ctx.omega.analytics._namespace;
97
+ const deviceId = ctx.omega.context.session.deviceId;
98
+ ctx.expect(ctx.omega.analytics._clientId).toBe(uuidv5(deviceId, ns));
99
99
  } finally { await restore(); }
100
100
  },
101
101
  },
@@ -105,24 +105,24 @@ module.exports = defineCases({
105
105
  // launch a new GA client, so initialize raises instead of limping.
106
106
  name: 'no context.session.deviceId: initialize raises (the boot-order invariant)',
107
107
  run: async (ctx) => {
108
- const savedDeviceId = ctx.manager.context.session.deviceId;
108
+ const savedDeviceId = ctx.omega.context.session.deviceId;
109
109
  const savedSecret = process.env.GOOGLE_ANALYTICS_SECRET;
110
- const savedConfig = ctx.manager.config.analytics;
110
+ const savedConfig = ctx.omega.config.analytics;
111
111
 
112
- ctx.manager.analytics.shutdown();
113
- ctx.manager.context.session.deviceId = null;
112
+ ctx.omega.analytics.shutdown();
113
+ ctx.omega.context.session.deviceId = null;
114
114
  process.env.GOOGLE_ANALYTICS_SECRET = 'fake-secret';
115
- ctx.manager.config.analytics = { enabled: true, providers: { google: { id: 'G-TESTID12' } } };
115
+ ctx.omega.config.analytics = { enabled: true, providers: { google: { id: 'G-TESTID12' } } };
116
116
 
117
117
  try {
118
- await ctx.expect(() => ctx.manager.analytics.initialize(ctx.manager)).toThrow(/boot sequence/);
118
+ await ctx.expect(() => ctx.omega.analytics.initialize(ctx.omega)).toThrow(/boot sequence/);
119
119
  } finally {
120
- ctx.manager.context.session.deviceId = savedDeviceId;
121
- ctx.manager.config.analytics = savedConfig;
120
+ ctx.omega.context.session.deviceId = savedDeviceId;
121
+ ctx.omega.config.analytics = savedConfig;
122
122
  if (savedSecret == null) delete process.env.GOOGLE_ANALYTICS_SECRET;
123
123
  else process.env.GOOGLE_ANALYTICS_SECRET = savedSecret;
124
- ctx.manager.analytics.shutdown();
125
- ctx.manager.analytics.initialize(ctx.manager);
124
+ ctx.omega.analytics.shutdown();
125
+ ctx.omega.analytics.initialize(ctx.omega);
126
126
  }
127
127
  },
128
128
  },
@@ -136,7 +136,7 @@ module.exports = defineCases({
136
136
  providers: { google: { id: 'G-TESTID12' } },
137
137
  });
138
138
  try {
139
- const a = ctx.manager.analytics;
139
+ const a = ctx.omega.analytics;
140
140
  const ns = a._namespace;
141
141
  a.setUserId('firebase-uid-abc-123');
142
142
  const expected = uuidv5('firebase-uid-abc-123', ns);
@@ -153,7 +153,7 @@ module.exports = defineCases({
153
153
  run: async (ctx) => {
154
154
  // Hand-rolled (not reinit()): the helper's leading shutdown() would
155
155
  // wipe the very _pendingUid this test plants.
156
- const a = ctx.manager.analytics;
156
+ const a = ctx.omega.analytics;
157
157
  a.shutdown(); // _namespace null — the pre-init state
158
158
 
159
159
  a.setUserId('early-uid-before-boot');
@@ -161,18 +161,18 @@ module.exports = defineCases({
161
161
 
162
162
  const savedSecret = process.env.GOOGLE_ANALYTICS_SECRET;
163
163
  process.env.GOOGLE_ANALYTICS_SECRET = 'fake-secret';
164
- const cfgOrig = ctx.manager.config.analytics;
165
- ctx.manager.config.analytics = { enabled: true, providers: { google: { id: 'G-TESTID12' } } };
164
+ const cfgOrig = ctx.omega.config.analytics;
165
+ ctx.omega.config.analytics = { enabled: true, providers: { google: { id: 'G-TESTID12' } } };
166
166
  try {
167
- a.initialize(ctx.manager);
167
+ a.initialize(ctx.omega);
168
168
  ctx.expect(a._pendingUid).toBe(null);
169
169
  ctx.expect(a._userId).toBe(uuidv5('early-uid-before-boot', a._namespace));
170
170
  } finally {
171
171
  a.shutdown();
172
172
  if (savedSecret == null) delete process.env.GOOGLE_ANALYTICS_SECRET;
173
173
  else process.env.GOOGLE_ANALYTICS_SECRET = savedSecret;
174
- ctx.manager.config.analytics = cfgOrig;
175
- a.initialize(ctx.manager);
174
+ ctx.omega.config.analytics = cfgOrig;
175
+ a.initialize(ctx.omega);
176
176
  }
177
177
  },
178
178
  },
@@ -184,10 +184,10 @@ module.exports = defineCases({
184
184
  providers: { google: { id: 'G-TESTID12' } },
185
185
  });
186
186
  try {
187
- ctx.manager.analytics.setUserId('some-uid');
188
- ctx.expect(ctx.manager.analytics._userId).not.toBe(null);
189
- ctx.manager.analytics.setUserId(null);
190
- ctx.expect(ctx.manager.analytics._userId).toBe(null);
187
+ ctx.omega.analytics.setUserId('some-uid');
188
+ ctx.expect(ctx.omega.analytics._userId).not.toBe(null);
189
+ ctx.omega.analytics.setUserId(null);
190
+ ctx.expect(ctx.omega.analytics._userId).toBe(null);
191
191
  } finally { await restore(); }
192
192
  },
193
193
  },
@@ -203,7 +203,7 @@ module.exports = defineCases({
203
203
  providers: { google: { id: 'G-TESTID12' } },
204
204
  });
205
205
 
206
- const a = ctx.manager.analytics;
206
+ const a = ctx.omega.analytics;
207
207
  const origSend = a._send;
208
208
  const sent = [];
209
209
  a._send = (descriptor) => { sent.push(descriptor); return true; };
@@ -230,7 +230,7 @@ module.exports = defineCases({
230
230
  {
231
231
  name: '_enrichParams adds session_id + engagement_time_msec',
232
232
  run: (ctx) => {
233
- const params = ctx.manager.analytics._enrichParams({ custom: 'value' });
233
+ const params = ctx.omega.analytics._enrichParams({ custom: 'value' });
234
234
  ctx.expect(params.custom).toBe('value');
235
235
  ctx.expect(typeof params.session_id).toBe('string');
236
236
  ctx.expect(typeof params.engagement_time_msec).toBe('number');
@@ -245,7 +245,7 @@ module.exports = defineCases({
245
245
  const restore = await reinit(ctx, {}, { enabled: false });
246
246
  try {
247
247
  // Should not throw.
248
- ctx.manager.analytics.event('app_launch', { x: 1 });
248
+ ctx.omega.analytics.event('app_launch', { x: 1 });
249
249
  ctx.expect(true).toBe(true);
250
250
  } finally { await restore(); }
251
251
  },
@@ -253,28 +253,28 @@ module.exports = defineCases({
253
253
  {
254
254
  name: 'event() before init queues, queue is bounded',
255
255
  run: (ctx) => {
256
- const a = ctx.manager.analytics;
256
+ const a = ctx.omega.analytics;
257
257
  a.shutdown(); // back to uninitialized state
258
258
  a.event('queued_one');
259
259
  a.event('queued_two');
260
260
  ctx.expect(a._queue.length).toBe(2);
261
- ctx.manager.analytics.initialize(ctx.manager); // restore for downstream tests
261
+ ctx.omega.analytics.initialize(ctx.omega); // restore for downstream tests
262
262
  },
263
263
  },
264
264
  {
265
265
  name: 'queue flushes on init',
266
266
  run: async (ctx) => {
267
267
  // Force a "before init" state with a couple of queued items.
268
- ctx.manager.analytics.shutdown();
269
- ctx.manager.analytics._queue.push({ name: 'x', params: {} });
270
- ctx.manager.analytics._queue.push({ name: 'y', params: {} });
268
+ ctx.omega.analytics.shutdown();
269
+ ctx.omega.analytics._queue.push({ name: 'x', params: {} });
270
+ ctx.omega.analytics._queue.push({ name: 'y', params: {} });
271
271
  const restore = await reinit(ctx, { GOOGLE_ANALYTICS_SECRET: 'fake-secret' }, {
272
272
  enabled: true,
273
273
  providers: { google: { id: 'G-TESTID12' } },
274
274
  });
275
275
  try {
276
276
  // After init, queue should be drained.
277
- ctx.expect(ctx.manager.analytics._queue.length).toBe(0);
277
+ ctx.expect(ctx.omega.analytics._queue.length).toBe(0);
278
278
  } finally { await restore(); }
279
279
  },
280
280
  },
@@ -286,7 +286,7 @@ module.exports = defineCases({
286
286
  providers: { google: { id: 'G-TESTID12' } },
287
287
  });
288
288
  try {
289
- const a = ctx.manager.analytics;
289
+ const a = ctx.omega.analytics;
290
290
  // Simulate auth bridge firing.
291
291
  a._handleAuthChange({ uid: 'user-123' });
292
292
  ctx.expect(a._userId).not.toBe(null);
@@ -304,9 +304,9 @@ module.exports = defineCases({
304
304
  providers: { google: { id: 'G-TESTID12' } },
305
305
  });
306
306
  try {
307
- ctx.manager.analytics.setUserProperties({ plan: 'premium', custom_flag: true });
308
- ctx.expect(ctx.manager.analytics._userProperties.plan).toEqual({ value: 'premium' });
309
- ctx.expect(ctx.manager.analytics._userProperties.custom_flag).toEqual({ value: true });
307
+ ctx.omega.analytics.setUserProperties({ plan: 'premium', custom_flag: true });
308
+ ctx.expect(ctx.omega.analytics._userProperties.plan).toEqual({ value: 'premium' });
309
+ ctx.expect(ctx.omega.analytics._userProperties.custom_flag).toEqual({ value: true });
310
310
  } finally { await restore(); }
311
311
  },
312
312
  },
@@ -318,7 +318,7 @@ module.exports = defineCases({
318
318
  providers: { google: { id: 'G-TESTID12' } },
319
319
  });
320
320
  try {
321
- const snap = await ctx.manager.ipc.invoke('desktop:analytics:status');
321
+ const snap = await ctx.omega.ipc.invoke('desktop:analytics:status');
322
322
  ctx.expect(snap.enabled).toBe(true);
323
323
  ctx.expect(snap.measurementId).toBe('G-TESTID12');
324
324
  } finally { await restore(); }
@@ -327,13 +327,13 @@ module.exports = defineCases({
327
327
  {
328
328
  name: 'IPC listener desktop:analytics:event routes to analytics.event',
329
329
  run: async (ctx) => {
330
- const a = ctx.manager.analytics;
330
+ const a = ctx.omega.analytics;
331
331
  const origEvent = a.event;
332
332
  let captured = null;
333
333
  a.event = (name, params) => { captured = { name, params }; };
334
334
  try {
335
335
  // Simulate an inbound IPC call (renderer would do ipcRenderer.send).
336
- const listeners = ctx.manager.ipc._listeners?.['desktop:analytics:event'];
336
+ const listeners = ctx.omega.ipc._listeners?.['desktop:analytics:event'];
337
337
  ctx.expect(listeners).toBeDefined();
338
338
  listeners.forEach((fn) => fn({ name: 'rendererEvent', params: { x: 1 } }));
339
339
  ctx.expect(captured).toEqual({ name: 'rendererEvent', params: { x: 1 } });
@@ -348,7 +348,7 @@ module.exports = defineCases({
348
348
  providers: { google: { id: 'G-TESTID12' } },
349
349
  });
350
350
  try {
351
- const j = ctx.manager.analytics.toJSON();
351
+ const j = ctx.omega.analytics.toJSON();
352
352
  ctx.expect(j.enabled).toBe(true);
353
353
  ctx.expect(j.measurementId).toBe('G-TESTID12');
354
354
  ctx.expect(typeof j.clientId).toBe('string');
@@ -1,6 +1,6 @@
1
1
  // Main-process tests for lib/app-state.js — storage-backed launch flags + crash sentinel.
2
2
  //
3
- // The harness already booted Manager once, which incremented launchCount and seeded
3
+ // The harness already booted omega once, which incremented launchCount and seeded
4
4
  // state. We test by calling appState.reset() then re-initializing with crafted
5
5
  // storage state to simulate first-launch / repeat-launch / crash-recovery / upgrade.
6
6
 
@@ -14,60 +14,60 @@ module.exports = defineCases({
14
14
  description: 'app-state (main)',
15
15
  cleanup: async (ctx) => {
16
16
  // Restore a sane state for any later suites that look at appState.
17
- ctx.manager.appState.reset();
17
+ ctx.omega.appState.reset();
18
18
  // Mark _initialized=false so we can re-init cleanly.
19
- ctx.manager.appState._initialized = false;
20
- await ctx.manager.appState.initialize(ctx.manager);
19
+ ctx.omega.appState._initialized = false;
20
+ await ctx.omega.appState.initialize(ctx.omega);
21
21
  },
22
22
  tests: [
23
23
  {
24
24
  name: 'initialize ran during boot',
25
25
  run: (ctx) => {
26
- ctx.expect(ctx.manager.appState._initialized).toBe(true);
26
+ ctx.expect(ctx.omega.appState._initialized).toBe(true);
27
27
  },
28
28
  },
29
29
  {
30
30
  name: 'first launch: flags + counters seeded correctly',
31
31
  run: async (ctx) => {
32
- ctx.manager.appState.reset();
33
- ctx.manager.appState._initialized = false;
34
- await ctx.manager.appState.initialize(ctx.manager);
35
-
36
- ctx.expect(ctx.manager.appState.isFirstLaunch()).toBe(true);
37
- ctx.expect(ctx.manager.appState.getLaunchCount()).toBe(1);
38
- ctx.expect(ctx.manager.appState.getInstalledAt()).toBeInstanceOf(Date);
39
- ctx.expect(ctx.manager.appState.getLastLaunchAt()).toBeNull();
40
- ctx.expect(ctx.manager.appState.recoveredFromCrash()).toBe(false);
32
+ ctx.omega.appState.reset();
33
+ ctx.omega.appState._initialized = false;
34
+ await ctx.omega.appState.initialize(ctx.omega);
35
+
36
+ ctx.expect(ctx.omega.appState.isFirstLaunch()).toBe(true);
37
+ ctx.expect(ctx.omega.appState.getLaunchCount()).toBe(1);
38
+ ctx.expect(ctx.omega.appState.getInstalledAt()).toBeInstanceOf(Date);
39
+ ctx.expect(ctx.omega.appState.getLastLaunchAt()).toBeNull();
40
+ ctx.expect(ctx.omega.appState.recoveredFromCrash()).toBe(false);
41
41
  },
42
42
  },
43
43
  {
44
44
  name: 'second launch: not first, count incremented, lastLaunchAt populated',
45
45
  run: async (ctx) => {
46
- ctx.manager.appState.reset();
47
- ctx.manager.appState._initialized = false;
48
- await ctx.manager.appState.initialize(ctx.manager);
46
+ ctx.omega.appState.reset();
47
+ ctx.omega.appState._initialized = false;
48
+ await ctx.omega.appState.initialize(ctx.omega);
49
49
 
50
50
  // Simulate a graceful quit from the first launch.
51
- const after1 = ctx.manager.storage.get(STORAGE_KEY);
51
+ const after1 = ctx.omega.storage.get(STORAGE_KEY);
52
52
  after1.sentinel = false;
53
53
  after1.lastQuitAt = Date.now();
54
- ctx.manager.storage.set(STORAGE_KEY, after1);
54
+ ctx.omega.storage.set(STORAGE_KEY, after1);
55
55
 
56
56
  // Boot again.
57
- ctx.manager.appState._initialized = false;
58
- await ctx.manager.appState.initialize(ctx.manager);
57
+ ctx.omega.appState._initialized = false;
58
+ await ctx.omega.appState.initialize(ctx.omega);
59
59
 
60
- ctx.expect(ctx.manager.appState.isFirstLaunch()).toBe(false);
61
- ctx.expect(ctx.manager.appState.getLaunchCount()).toBe(2);
62
- ctx.expect(ctx.manager.appState.getLastLaunchAt()).toBeInstanceOf(Date);
63
- ctx.expect(ctx.manager.appState.recoveredFromCrash()).toBe(false);
60
+ ctx.expect(ctx.omega.appState.isFirstLaunch()).toBe(false);
61
+ ctx.expect(ctx.omega.appState.getLaunchCount()).toBe(2);
62
+ ctx.expect(ctx.omega.appState.getLastLaunchAt()).toBeInstanceOf(Date);
63
+ ctx.expect(ctx.omega.appState.recoveredFromCrash()).toBe(false);
64
64
  },
65
65
  },
66
66
  {
67
67
  name: 'crash detection: previous launch left sentinel and no quit timestamp',
68
68
  run: async (ctx) => {
69
69
  // Seed storage with a "we were running and never gracefully quit" state.
70
- ctx.manager.storage.set(STORAGE_KEY, {
70
+ ctx.omega.storage.set(STORAGE_KEY, {
71
71
  installedAt: Date.now() - 10000,
72
72
  launchCount: 3,
73
73
  lastLaunchAt: Date.now() - 1000,
@@ -76,17 +76,17 @@ module.exports = defineCases({
76
76
  version: '1.0.0',
77
77
  });
78
78
 
79
- ctx.manager.appState._initialized = false;
80
- await ctx.manager.appState.initialize(ctx.manager);
79
+ ctx.omega.appState._initialized = false;
80
+ await ctx.omega.appState.initialize(ctx.omega);
81
81
 
82
- ctx.expect(ctx.manager.appState.recoveredFromCrash()).toBe(true);
83
- ctx.expect(ctx.manager.appState.getLaunchCount()).toBe(4);
82
+ ctx.expect(ctx.omega.appState.recoveredFromCrash()).toBe(true);
83
+ ctx.expect(ctx.omega.appState.getLaunchCount()).toBe(4);
84
84
  },
85
85
  },
86
86
  {
87
87
  name: 'graceful quit: sentinel cleared on next boot, no crash flag',
88
88
  run: async (ctx) => {
89
- ctx.manager.storage.set(STORAGE_KEY, {
89
+ ctx.omega.storage.set(STORAGE_KEY, {
90
90
  installedAt: Date.now() - 10000,
91
91
  launchCount: 5,
92
92
  lastLaunchAt: Date.now() - 1000,
@@ -95,17 +95,17 @@ module.exports = defineCases({
95
95
  version: '1.0.0',
96
96
  });
97
97
 
98
- ctx.manager.appState._initialized = false;
99
- await ctx.manager.appState.initialize(ctx.manager);
98
+ ctx.omega.appState._initialized = false;
99
+ await ctx.omega.appState.initialize(ctx.omega);
100
100
 
101
- ctx.expect(ctx.manager.appState.recoveredFromCrash()).toBe(false);
102
- ctx.expect(ctx.manager.appState.getLaunchCount()).toBe(6);
101
+ ctx.expect(ctx.omega.appState.recoveredFromCrash()).toBe(false);
102
+ ctx.expect(ctx.omega.appState.getLaunchCount()).toBe(6);
103
103
  },
104
104
  },
105
105
  {
106
106
  name: 'version upgrade: previousVersion populated when version changes',
107
107
  run: async (ctx) => {
108
- ctx.manager.storage.set(STORAGE_KEY, {
108
+ ctx.omega.storage.set(STORAGE_KEY, {
109
109
  installedAt: Date.now() - 10000,
110
110
  launchCount: 10,
111
111
  lastLaunchAt: Date.now() - 1000,
@@ -114,19 +114,19 @@ module.exports = defineCases({
114
114
  version: '0.9.0', // previous version
115
115
  });
116
116
 
117
- // Force the manager's reported version to differ.
118
- const origConfig = ctx.manager.config.app;
119
- ctx.manager.config.app = { ...origConfig, version: '1.0.0' };
117
+ // Force the omega instance's reported version to differ.
118
+ const origConfig = ctx.omega.config.app;
119
+ ctx.omega.config.app = { ...origConfig, version: '1.0.0' };
120
120
 
121
121
  try {
122
- ctx.manager.appState._initialized = false;
123
- await ctx.manager.appState.initialize(ctx.manager);
122
+ ctx.omega.appState._initialized = false;
123
+ await ctx.omega.appState.initialize(ctx.omega);
124
124
 
125
- ctx.expect(ctx.manager.appState.getVersion()).toBe('1.0.0');
126
- ctx.expect(ctx.manager.appState.getPreviousVersion()).toBe('0.9.0');
127
- ctx.expect(ctx.manager.appState.wasUpgraded()).toBe(true);
125
+ ctx.expect(ctx.omega.appState.getVersion()).toBe('1.0.0');
126
+ ctx.expect(ctx.omega.appState.getPreviousVersion()).toBe('0.9.0');
127
+ ctx.expect(ctx.omega.appState.wasUpgraded()).toBe(true);
128
128
  } finally {
129
- ctx.manager.config.app = origConfig;
129
+ ctx.omega.config.app = origConfig;
130
130
  }
131
131
  },
132
132
  },
@@ -134,7 +134,7 @@ module.exports = defineCases({
134
134
  name: 'no version change: wasUpgraded false, previousVersion preserved',
135
135
  run: async (ctx) => {
136
136
  // Seed with a previousVersion that should NOT be overwritten when version doesn't change.
137
- ctx.manager.storage.set(STORAGE_KEY, {
137
+ ctx.omega.storage.set(STORAGE_KEY, {
138
138
  installedAt: Date.now() - 10000,
139
139
  launchCount: 20,
140
140
  lastLaunchAt: Date.now() - 1000,
@@ -144,53 +144,53 @@ module.exports = defineCases({
144
144
  previousVersion: '0.9.0',
145
145
  });
146
146
 
147
- const origConfig = ctx.manager.config.app;
148
- ctx.manager.config.app = { ...origConfig, version: '1.0.0' };
147
+ const origConfig = ctx.omega.config.app;
148
+ ctx.omega.config.app = { ...origConfig, version: '1.0.0' };
149
149
 
150
150
  try {
151
- ctx.manager.appState._initialized = false;
152
- await ctx.manager.appState.initialize(ctx.manager);
151
+ ctx.omega.appState._initialized = false;
152
+ await ctx.omega.appState.initialize(ctx.omega);
153
153
 
154
- ctx.expect(ctx.manager.appState.wasUpgraded()).toBe(false);
154
+ ctx.expect(ctx.omega.appState.wasUpgraded()).toBe(false);
155
155
  // Should preserve the historical previousVersion rather than nuking it.
156
- ctx.expect(ctx.manager.appState.getPreviousVersion()).toBe('0.9.0');
156
+ ctx.expect(ctx.omega.appState.getPreviousVersion()).toBe('0.9.0');
157
157
  } finally {
158
- ctx.manager.config.app = origConfig;
158
+ ctx.omega.config.app = origConfig;
159
159
  }
160
160
  },
161
161
  },
162
162
  {
163
163
  name: 'launchedFromDeepLink: defaults false, set/cleared via setter',
164
164
  run: (ctx) => {
165
- ctx.expect(ctx.manager.appState.launchedFromDeepLink()).toBe(false);
166
- ctx.manager.appState.setLaunchedFromDeepLink(true);
167
- ctx.expect(ctx.manager.appState.launchedFromDeepLink()).toBe(true);
168
- ctx.manager.appState.setLaunchedFromDeepLink(false);
169
- ctx.expect(ctx.manager.appState.launchedFromDeepLink()).toBe(false);
165
+ ctx.expect(ctx.omega.appState.launchedFromDeepLink()).toBe(false);
166
+ ctx.omega.appState.setLaunchedFromDeepLink(true);
167
+ ctx.expect(ctx.omega.appState.launchedFromDeepLink()).toBe(true);
168
+ ctx.omega.appState.setLaunchedFromDeepLink(false);
169
+ ctx.expect(ctx.omega.appState.launchedFromDeepLink()).toBe(false);
170
170
  },
171
171
  },
172
172
  {
173
173
  name: 'launchedAtLogin returns a boolean',
174
174
  run: (ctx) => {
175
- ctx.expect(typeof ctx.manager.appState.launchedAtLogin()).toBe('boolean');
175
+ ctx.expect(typeof ctx.omega.appState.launchedAtLogin()).toBe('boolean');
176
176
  },
177
177
  },
178
178
  {
179
179
  name: 'getLastQuitAt reads live storage (returns null when sentinel is active)',
180
180
  run: async (ctx) => {
181
- ctx.manager.appState.reset();
182
- ctx.manager.appState._initialized = false;
183
- await ctx.manager.appState.initialize(ctx.manager);
181
+ ctx.omega.appState.reset();
182
+ ctx.omega.appState._initialized = false;
183
+ await ctx.omega.appState.initialize(ctx.omega);
184
184
  // After init, sentinel=true and lastQuitAt=null.
185
- ctx.expect(ctx.manager.appState.getLastQuitAt()).toBeNull();
185
+ ctx.expect(ctx.omega.appState.getLastQuitAt()).toBeNull();
186
186
  },
187
187
  },
188
188
  {
189
189
  name: 'reset() wipes persisted state',
190
190
  run: (ctx) => {
191
- ctx.expect(ctx.manager.storage.has(STORAGE_KEY)).toBe(true);
192
- ctx.manager.appState.reset();
193
- ctx.expect(ctx.manager.storage.has(STORAGE_KEY)).toBe(false);
191
+ ctx.expect(ctx.omega.storage.has(STORAGE_KEY)).toBe(true);
192
+ ctx.omega.appState.reset();
193
+ ctx.expect(ctx.omega.storage.has(STORAGE_KEY)).toBe(false);
194
194
  },
195
195
  },
196
196
  ],