@omega.js/desktop 0.52.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 (273) hide show
  1. package/README.md +17 -12
  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 +11 -11
  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/AGENTS.md +17 -8
  48. package/dist/defaults/config/omega.json5 +7 -7
  49. package/dist/defaults/hooks/build/post.js +1 -1
  50. package/dist/defaults/hooks/build/pre.js +1 -1
  51. package/dist/defaults/hooks/deploy/pre.js +1 -1
  52. package/dist/defaults/hooks/release/post.js +1 -1
  53. package/dist/defaults/hooks/release/pre.js +1 -1
  54. package/dist/defaults/src/assets/js/components/about/index.js +3 -5
  55. package/dist/defaults/src/assets/js/components/main/index.js +3 -5
  56. package/dist/defaults/src/assets/js/components/settings/index.js +3 -5
  57. package/dist/defaults/src/integrations/context-menu/index.js +2 -2
  58. package/dist/defaults/src/integrations/menu/index.js +3 -3
  59. package/dist/defaults/src/integrations/tray/index.js +3 -3
  60. package/dist/defaults/src/main.js +3 -5
  61. package/dist/defaults/src/preload.js +3 -5
  62. package/dist/defaults/test/README.md +2 -2
  63. package/dist/gulp/main.js +9 -10
  64. package/dist/gulp/tasks/audit.js +7 -7
  65. package/dist/gulp/tasks/build-config.js +8 -8
  66. package/dist/gulp/tasks/bundle.js +16 -16
  67. package/dist/gulp/tasks/defaults.js +3 -3
  68. package/dist/gulp/tasks/distribute.js +2 -2
  69. package/dist/gulp/tasks/html.js +9 -9
  70. package/dist/gulp/tasks/package-quick.js +3 -3
  71. package/dist/gulp/tasks/package.js +3 -3
  72. package/dist/gulp/tasks/release.js +3 -3
  73. package/dist/gulp/tasks/sass.js +6 -6
  74. package/dist/gulp/tasks/serve.js +4 -4
  75. package/dist/hooks/notarize-artifacts.js +1 -1
  76. package/dist/hooks/notarize.js +1 -1
  77. package/dist/index.js +5 -8
  78. package/dist/lib/_environment-mixin.js +50 -0
  79. package/dist/lib/_lifecycle-mixin.js +45 -0
  80. package/dist/lib/analytics.js +33 -35
  81. package/dist/lib/app-state.js +14 -14
  82. package/dist/lib/auth-flow.js +18 -18
  83. package/dist/lib/auth-persistence.js +12 -12
  84. package/dist/lib/auth.js +421 -0
  85. package/dist/lib/auto-updater.js +49 -49
  86. package/dist/lib/context-menu.js +13 -13
  87. package/dist/lib/context.js +19 -19
  88. package/dist/lib/deep-link.js +34 -34
  89. package/dist/lib/fontawesome.js +5 -5
  90. package/dist/lib/ipc.js +4 -4
  91. package/dist/lib/menu.js +25 -25
  92. package/dist/lib/protocol.js +5 -5
  93. package/dist/lib/remote-config.js +22 -22
  94. package/dist/lib/remote-scripts.js +21 -21
  95. package/dist/lib/restart-manager/index.js +28 -28
  96. package/dist/lib/sign-helpers/exec-with-limit.js +1 -1
  97. package/dist/lib/sign-helpers/sign-events.js +1 -1
  98. package/dist/lib/startup.js +18 -13
  99. package/dist/lib/storage.js +10 -10
  100. package/dist/lib/templating.js +16 -16
  101. package/dist/lib/theme.js +10 -10
  102. package/dist/lib/tray.js +27 -27
  103. package/dist/lib/usage.js +11 -11
  104. package/dist/lib/window-manager.js +26 -26
  105. package/dist/main.js +398 -483
  106. package/dist/preload.js +236 -176
  107. package/dist/renderer.js +417 -391
  108. package/dist/test/fixtures/consumer-app/config/omega.json5 +1 -1
  109. package/dist/test/fixtures/consumer-app/src/assets/js/components/main/index.js +8 -11
  110. package/dist/test/fixtures/consumer-app/src/main.js +5 -7
  111. package/dist/test/fixtures/consumer-app/src/preload.js +2 -2
  112. package/dist/test/harness/boot-entry.js +22 -20
  113. package/dist/test/harness/main-entry.js +31 -30
  114. package/dist/test/harness/renderer-entry.js +5 -5
  115. package/dist/test/harness/renderer-preload.js +137 -141
  116. package/dist/test/index.js +10 -10
  117. package/dist/test/runner.js +2 -2
  118. package/dist/test/runners/boot.js +7 -6
  119. package/dist/test/runners/electron.js +3 -2
  120. package/dist/test/runners/render-event.js +2 -2
  121. package/dist/test/suites/boot/consumer-app-boots.test.js +57 -26
  122. package/dist/test/suites/boot/restart-manager.test.js +2 -2
  123. package/dist/test/suites/boot/storage-bundled.test.js +5 -5
  124. package/dist/test/suites/boot/theme.test.js +13 -13
  125. package/dist/test/suites/build/audit.test.js +1 -1
  126. package/dist/test/suites/build/auth-persistence-resolve.test.js +6 -6
  127. package/dist/test/suites/build/boot-fixture.test.js +2 -2
  128. package/dist/test/suites/build/boot-runner-timeout.test.js +6 -5
  129. package/dist/test/suites/build/brand-scss.test.js +1 -1
  130. package/dist/test/suites/build/build-json-bake.test.js +1 -1
  131. package/dist/test/suites/build/cli.test.js +2 -2
  132. package/dist/test/suites/build/config-schema.test.js +5 -5
  133. package/dist/test/suites/build/defaults-scaffold.test.js +2 -2
  134. package/dist/test/suites/build/deploy-hook.test.js +3 -3
  135. package/dist/test/suites/build/ensure-target.test.js +2 -2
  136. package/dist/test/suites/build/env-delivery.test.js +2 -2
  137. package/dist/test/suites/build/esm-only-dependency.test.js +2 -2
  138. package/dist/test/suites/build/exports.test.js +9 -8
  139. package/dist/test/suites/build/get-config.test.js +4 -4
  140. package/dist/test/suites/build/manifest-deps.test.js +1 -1
  141. package/dist/test/suites/build/merge-line-files.test.js +1 -1
  142. package/dist/test/suites/build/omega-shell.test.js +34 -2
  143. package/dist/test/suites/build/omega.test.js +350 -0
  144. package/dist/test/suites/build/renderer-auth-bridge.test.js +211 -78
  145. package/dist/test/suites/build/runner.test.js +2 -2
  146. package/dist/test/suites/build/sentry.test.js +2 -2
  147. package/dist/test/suites/build/sign-windows-e2e.test.js +2 -2
  148. package/dist/test/suites/build/templating.test.js +3 -3
  149. package/dist/test/suites/build/test-stealth.test.js +7 -9
  150. package/dist/test/suites/build/url-helpers.test.js +55 -56
  151. package/dist/test/suites/build/validate-config.test.js +2 -2
  152. package/dist/test/suites/build/wave5-pins.test.js +2 -2
  153. package/dist/test/suites/main/analytics.test.js +59 -59
  154. package/dist/test/suites/main/app-state.test.js +66 -66
  155. package/dist/test/suites/main/auth-flow.test.js +41 -41
  156. package/dist/test/suites/main/auth-persistence.test.js +54 -43
  157. package/dist/test/suites/main/{client-bridge.integration.test.js → auth.integration.test.js} +10 -9
  158. package/dist/test/suites/main/auth.test.js +336 -0
  159. package/dist/test/suites/main/auto-updater.test.js +134 -134
  160. package/dist/test/suites/main/boot-sequence.test.js +37 -49
  161. package/dist/test/suites/main/context-menu.test.js +51 -50
  162. package/dist/test/suites/main/context.test.js +25 -25
  163. package/dist/test/suites/main/deep-link.test.js +74 -74
  164. package/dist/test/suites/main/fontawesome.test.js +27 -27
  165. package/dist/test/suites/main/ipc.test.js +35 -35
  166. package/dist/test/suites/main/menu.test.js +101 -100
  167. package/dist/test/suites/main/protocol.test.js +19 -19
  168. package/dist/test/suites/main/remote-config.test.js +63 -63
  169. package/dist/test/suites/main/remote-scripts.test.js +103 -103
  170. package/dist/test/suites/main/request.test.js +71 -0
  171. package/dist/test/suites/main/restart-manager.test.js +33 -33
  172. package/dist/test/suites/main/startup-paths-and-ua.test.js +4 -4
  173. package/dist/test/suites/main/startup.test.js +26 -26
  174. package/dist/test/suites/main/stealth-window.test.js +1 -1
  175. package/dist/test/suites/main/storage.test.js +25 -25
  176. package/dist/test/suites/main/theme.test.js +34 -34
  177. package/dist/test/suites/main/tray.test.js +79 -79
  178. package/dist/test/suites/main/url-helpers.test.js +133 -133
  179. package/dist/test/suites/main/usage.test.js +25 -25
  180. package/dist/test/suites/main/window-bounds.test.js +27 -27
  181. package/dist/test/suites/main/window-manager.test.js +44 -44
  182. package/dist/test/suites/renderer/analytics-bridge.test.js +5 -5
  183. package/dist/test/suites/renderer/cross-context-helpers.test.js +37 -31
  184. package/dist/test/suites/renderer/round-trip.test.js +3 -3
  185. package/dist/test/suites/renderer/tooltips.test.js +15 -15
  186. package/dist/test/suites/renderer/{window-em-surface.test.js → window-desktop-surface.test.js} +27 -7
  187. package/dist/test/utils/extended-mode-warning.js +1 -1
  188. package/dist/utils/boot-harness.js +56 -0
  189. package/dist/utils/mode-helpers.js +2 -15
  190. package/dist/utils/ship-keys.js +3 -3
  191. package/dist/utils/signing-status.js +51 -0
  192. package/dist/utils/test-events.js +7 -0
  193. package/dist/utils/test-stealth.js +6 -6
  194. package/dist/utils/url-helpers.js +52 -42
  195. package/dist/utils/user-agent.js +44 -0
  196. package/dist/vendor/account/engine.js +3 -3
  197. package/dist/vendor/account/index.js +14 -45
  198. package/dist/vendor/account/resolve-account.js +44 -0
  199. package/dist/vendor/account/schema.js +1 -1
  200. package/dist/vendor/account/user.js +99 -0
  201. package/dist/vendor/config/client-config.js +1 -1
  202. package/dist/vendor/config/environment.js +11 -30
  203. package/dist/vendor/config/index.js +8 -11
  204. package/dist/vendor/config/load.js +1 -2
  205. package/dist/vendor/config/platforms.js +1 -1
  206. package/dist/vendor/config/retired-keys.js +2 -2
  207. package/dist/vendor/config/schema.js +5 -8
  208. package/dist/vendor/config/site-global.js +2 -3
  209. package/dist/vendor/config/validate.js +1 -2
  210. package/dist/vendor/config/winback.js +1 -1
  211. package/dist/vendor/devkit/actions-secrets.js +1 -1
  212. package/dist/vendor/devkit/attach-log-file.js +1 -1
  213. package/dist/vendor/devkit/build-json.js +1 -1
  214. package/dist/vendor/devkit/cli-router.js +3 -4
  215. package/dist/vendor/devkit/defaults-engine.js +9 -11
  216. package/dist/vendor/devkit/local.js +2 -0
  217. package/dist/vendor/devkit/merge-line-files.js +2 -3
  218. package/dist/vendor/devkit/test/runner-core.js +6 -6
  219. package/dist/vendor/monitoring/env.js +2 -2
  220. package/dist/vendor/monitoring/index.js +1 -1
  221. package/dist/vendor/monitoring/main.js +1 -1
  222. package/dist/vendor/monitoring/preload.js +1 -1
  223. package/dist/vendor/monitoring/renderer.js +1 -1
  224. package/docs/analytics.md +8 -8
  225. package/docs/app-state.md +19 -19
  226. package/docs/audit.md +4 -4
  227. package/docs/{client-bridge.md → auth.md} +88 -73
  228. package/docs/auto-updater.md +8 -8
  229. package/docs/boot-sequence.md +11 -6
  230. package/docs/build-system.md +1 -1
  231. package/docs/cdp-debugging.md +1 -1
  232. package/docs/common-mistakes.md +7 -7
  233. package/docs/config-schema.md +1 -1
  234. package/docs/context-menu.md +13 -13
  235. package/docs/context.md +11 -11
  236. package/docs/css.md +3 -9
  237. package/docs/deep-link.md +25 -25
  238. package/docs/environment-detection.md +16 -16
  239. package/docs/fontawesome.md +7 -5
  240. package/docs/hooks.md +8 -8
  241. package/docs/index.md +38 -27
  242. package/docs/ipc.md +10 -10
  243. package/docs/lib-modules.md +9 -9
  244. package/docs/logging.md +12 -14
  245. package/docs/menu.md +18 -18
  246. package/docs/remote-config.md +9 -9
  247. package/docs/remote-scripts.md +12 -12
  248. package/docs/restart-manager.md +8 -8
  249. package/docs/sentry.md +4 -4
  250. package/docs/shared/analytics.md +1 -1
  251. package/docs/shared/breaking-changes.md +79 -13
  252. package/docs/shared/config.md +17 -21
  253. package/docs/shared/logging.md +1 -1
  254. package/docs/shared/monitoring.md +5 -5
  255. package/docs/shared/testing.md +2 -2
  256. package/docs/shared/theming.md +1 -1
  257. package/docs/shared/translation.md +19 -10
  258. package/docs/startup.md +16 -16
  259. package/docs/storage.md +11 -11
  260. package/docs/templating.md +3 -3
  261. package/docs/test-boot-layer.md +12 -12
  262. package/docs/test-framework.md +17 -17
  263. package/docs/themes.md +7 -7
  264. package/docs/tooltips.md +2 -2
  265. package/docs/tray.md +31 -31
  266. package/docs/usage.md +7 -7
  267. package/docs/verts.md +1 -1
  268. package/docs/windows.md +22 -22
  269. package/package.json +3 -4
  270. package/dist/lib/client-bridge.js +0 -374
  271. package/dist/lib/logger.js +0 -4
  272. package/dist/test/suites/build/manager.test.js +0 -213
  273. package/dist/test/suites/main/client-bridge.test.js +0 -262
@@ -1,6 +1,6 @@
1
1
  // Analytics — GA4 via Measurement Protocol. Mirrors @omega.js/backend's
2
- // `Manager.config.analytics.providers.google.id` shape so the same person can be
3
- // tracked across desktop (@omega.js/desktop) + web (UJM/@omega.js/client) + backend (@omega.js/backend) by
2
+ // `omega.config.analytics.providers.google.id` shape so the same person can be
3
+ // tracked across desktop (@omega.js/desktop) + web (@omega.js/client) + backend (@omega.js/backend) by
4
4
  // referencing a single namespaced UUIDv5 identity.
5
5
  //
6
6
  // Cross-platform identity (the key feature):
@@ -18,16 +18,16 @@
18
18
  // namespace via uuidv5.URL of the projectId string. Same projectId in @omega.js/backend/@omega.js/client/@omega.js/desktop
19
19
  // → the same uid hashes to the same user_id everywhere → unified analytics.
20
20
  //
21
- // Anonymous (client-bridge hasn't reported auth yet) → user_id stays null.
21
+ // Anonymous (auth holds no signed-in account yet) → user_id stays null.
22
22
  // Authed (auth event fires) → user_id is set + a `login` event is dispatched. On
23
23
  // logout → user_id clears + `logout` event fires.
24
24
  //
25
25
  // API surface:
26
- // manager.analytics.event(name, params?) // generic event
27
- // manager.analytics.pageview(path?) // convenience wrapper
28
- // manager.analytics.screenview(name?) // convenience wrapper
29
- // manager.analytics.setUserId(uid) // manual override; auto-wired to omega
30
- // manager.analytics.setUserProperties(props) // merge into user_properties block
26
+ // omega.analytics.event(name, params?) // generic event
27
+ // omega.analytics.pageview(path?) // convenience wrapper
28
+ // omega.analytics.screenview(name?) // convenience wrapper
29
+ // omega.analytics.setUserId(uid) // manual override; auto-wired to auth
30
+ // omega.analytics.setUserProperties(props) // merge into user_properties block
31
31
  //
32
32
  // Events fired during normal operation are queued until init completes (we need
33
33
  // context.session + measurement_id + secret). Once initialized, the queue
@@ -67,7 +67,7 @@ const MAX_QUEUE = 200;
67
67
 
68
68
  const analytics = {
69
69
  _initialized: false,
70
- _manager: null,
70
+ _omega: null,
71
71
  _enabled: false,
72
72
  _measurementId: null,
73
73
  _apiSecret: null,
@@ -78,12 +78,12 @@ const analytics = {
78
78
  _queue: [],
79
79
  _authUnsub: null,
80
80
 
81
- initialize(manager) {
81
+ initialize(omega) {
82
82
  if (analytics._initialized) return;
83
83
  analytics._initialized = true;
84
- analytics._manager = manager;
84
+ analytics._omega = omega;
85
85
 
86
- const cfg = manager.config.analytics || {};
86
+ const cfg = omega.config.analytics || {};
87
87
 
88
88
  // Presence-driven: providers.google.id presence enables analytics. No separate
89
89
  // `enabled` flag (matches @omega.js/backend convention — credentials are the enable signal).
@@ -109,8 +109,8 @@ const analytics = {
109
109
  // projectId in @omega.js/backend/@omega.js/client/@omega.js/desktop → same namespace → same per-uid UUIDv5
110
110
  // everywhere. UUIDv5 needs a UUID-shaped namespace — we derive one from the
111
111
  // string projectId by hashing it into uuidv5.URL space (RFC 4122).
112
- const projectId = manager.config.cloud?.config?.projectId
113
- || manager.config.brand.id;
112
+ const projectId = omega.config.cloud?.config?.projectId
113
+ || omega.config.brand.id;
114
114
  analytics._namespace = core.deriveNamespace(projectId);
115
115
 
116
116
  // Apply a uid stored by a pre-init setUserId() call — the auth
@@ -125,7 +125,7 @@ const analytics = {
125
125
  // so an empty one is a broken boot order, never a runtime condition — and a
126
126
  // fresh id minted here would persist nowhere, making every launch a new GA
127
127
  // client (#396). It raises instead.
128
- const deviceId = manager.context.session.deviceId;
128
+ const deviceId = omega.context.session.deviceId;
129
129
 
130
130
  if (!deviceId) {
131
131
  throw new Error('analytics.initialize() ran before context.initialize() resolved session.deviceId — the boot sequence must init context first');
@@ -142,16 +142,14 @@ const analytics = {
142
142
  analytics_.configure({
143
143
  transport: { send: (descriptor) => analytics._send(descriptor) },
144
144
  context: { runtime: 'electron' },
145
- environment: manager.isDevelopment?.() ? 'development' : 'production',
145
+ environment: omega.isDevelopment?.() ? 'development' : 'production',
146
146
  });
147
147
 
148
- // Wire auth subscription so user_id flips automatically on login/logout.
149
- analytics._authUnsub = manager.omega.onAuthChange((snap) => {
150
- analytics._handleAuthChange(snap);
148
+ // Listen to auth so user_id flips automatically on login/logout. The listen
149
+ // catch-up delivers the state auth already holds, so nothing is pulled here.
150
+ analytics._authUnsub = omega.auth.listen(({ user }) => {
151
+ analytics._handleAuthChange(user);
151
152
  });
152
- // Pull current state immediately in case auth already resolved.
153
- const current = manager.omega.getCurrentUser();
154
- if (current?.uid) analytics._handleAuthChange(current);
155
153
 
156
154
  // Compute initial user_properties from context + usage.
157
155
  analytics._userProperties = analytics._buildUserProperties();
@@ -176,11 +174,11 @@ const analytics = {
176
174
 
177
175
  // IPC: renderer → main analytics calls. Forward fires-and-forgets via send;
178
176
  // status query via invoke.
179
- manager.ipc.unhandle('desktop:analytics:status');
180
- manager.ipc.handle('desktop:analytics:status', () => analytics.toJSON());
177
+ omega.ipc.unhandle('desktop:analytics:status');
178
+ omega.ipc.handle('desktop:analytics:status', () => analytics.toJSON());
181
179
  // Use Set-deduped listener; named handler so re-init collapses duplicates.
182
- manager.ipc.on('desktop:analytics:event', analytics._onIpcEvent);
183
- manager.ipc.on('desktop:analytics:set-user-properties', analytics._onIpcSetProps);
180
+ omega.ipc.on('desktop:analytics:event', analytics._onIpcEvent);
181
+ omega.ipc.on('desktop:analytics:set-user-properties', analytics._onIpcSetProps);
184
182
  },
185
183
 
186
184
  _onIpcEvent({ name, params } = {}) {
@@ -248,7 +246,7 @@ const analytics = {
248
246
  analytics.event('screen_view', name ? { screen_name: name } : {});
249
247
  },
250
248
 
251
- // Manual user-id override. Normally client-bridge wires this automatically.
249
+ // Manual user-id override. Normally auth.listen wires this automatically.
252
250
  setUserId(uid) {
253
251
  if (!analytics._namespace) {
254
252
  // Init hasn't run yet — store and apply at init.
@@ -273,24 +271,24 @@ const analytics = {
273
271
  // GA4 param contract: each event needs engagement_time_msec (else session bounces),
274
272
  // and we add session_id + page_location so reports group properly.
275
273
  _enrichParams(params) {
276
- const m = analytics._manager;
277
- const ctx = m.context;
274
+ const omega = analytics._omega;
275
+ const ctx = omega.context;
278
276
  const sessionStart = ctx.session.startTime ? new Date(ctx.session.startTime).getTime() : Date.now();
279
277
  const engagement = Math.max(1, Date.now() - sessionStart);
280
278
  return {
281
279
  session_id: ctx.session.id || 'unknown',
282
280
  engagement_time_msec: engagement,
283
- page_location: params.page_location || `app://${m.config.brand.id}`,
284
- page_title: params.page_title || m.config.app?.productName || m.config.brand.name,
281
+ page_location: params.page_location || `app://${omega.config.brand.id}`,
282
+ page_title: params.page_title || omega.config.app?.productName || omega.config.brand.name,
285
283
  ...params,
286
284
  };
287
285
  },
288
286
 
289
287
  // Compute user-properties from current context + usage. Re-run on auth change.
290
288
  _buildUserProperties() {
291
- const m = analytics._manager;
292
- const ctx = m.context;
293
- const usage = m.usage;
289
+ const omega = analytics._omega;
290
+ const ctx = omega.context;
291
+ const usage = omega.usage;
294
292
  const wrap = (v) => ({ value: v });
295
293
  const out = {
296
294
  app_version: wrap(ctx.app.version || 'unknown'),
@@ -343,7 +341,7 @@ const analytics = {
343
341
  analytics._authUnsub();
344
342
  }
345
343
  analytics._initialized = false;
346
- analytics._manager = null;
344
+ analytics._omega = null;
347
345
  analytics._enabled = false;
348
346
  analytics._measurementId = null;
349
347
  analytics._apiSecret = null;
@@ -11,7 +11,7 @@
11
11
  // sentinel: true, // set on launch, cleared on graceful quit; survival = crash
12
12
  // }
13
13
  //
14
- // Public API on `manager.appState`:
14
+ // Public API on `omega.appState`:
15
15
  // isFirstLaunch() — true only for the very first boot of the app on this machine
16
16
  // getLaunchCount() — total successful launches (including this one)
17
17
  // getInstalledAt() — Date of first launch
@@ -40,7 +40,7 @@ const STORAGE_KEY = 'appState';
40
40
  const appState = {
41
41
  _initialized: false,
42
42
  _quitWired: false,
43
- _manager: null,
43
+ _omega: null,
44
44
  _electron: null,
45
45
 
46
46
  // Cached snapshot of the state AS LOADED at the start of this launch.
@@ -54,15 +54,15 @@ const appState = {
54
54
  // Set by lib/deep-link.initialize when argv contains a deep-link payload.
55
55
  _launchedFromDeepLink: false,
56
56
 
57
- async initialize(manager) {
57
+ async initialize(omega) {
58
58
  if (appState._initialized) {
59
59
  return;
60
60
  }
61
61
 
62
- appState._manager = manager;
62
+ appState._omega = omega;
63
63
  appState._electron = require('electron');
64
64
 
65
- const storage = manager.storage;
65
+ const storage = omega.storage;
66
66
 
67
67
  const now = Date.now();
68
68
  const previous = storage.get(STORAGE_KEY) || {};
@@ -74,11 +74,11 @@ const appState = {
74
74
  const previousQuitAt = previous.lastQuitAt || null;
75
75
  appState._recoveredFromCrash = !isFirstLaunch && previousSentinel && !previousQuitAt;
76
76
 
77
- // Version detection. Prefer the cross-context manager.getVersion() helper —
77
+ // Version detection. Prefer the cross-context omega.getVersion() helper —
78
78
  // it tries `app.getVersion()` first (authoritative in main, reads asar
79
79
  // package.json in packaged builds) and falls back to project package.json.
80
- const currentVersion = manager.config.app?.version
81
- || manager.getVersion()
80
+ const currentVersion = omega.config.app?.version
81
+ || omega.getVersion()
82
82
  || tryGetVersionFromPackage()
83
83
  || null;
84
84
  const previousVersion = previous.version || null;
@@ -122,7 +122,7 @@ const appState = {
122
122
  const onQuit = () => {
123
123
  if (cleared) return;
124
124
  cleared = true;
125
- const storage = appState._manager.storage;
125
+ const storage = appState._omega.storage;
126
126
  const cur = storage.get(STORAGE_KEY) || {};
127
127
  cur.sentinel = false;
128
128
  cur.lastQuitAt = Date.now();
@@ -157,7 +157,7 @@ const appState = {
157
157
  // The CURRENT snapshot's lastQuitAt is null (we cleared it on init).
158
158
  // What the consumer wants is "when did we previously quit gracefully" — read storage live,
159
159
  // because at the moment of the call this launch hasn't quit yet.
160
- const cur = appState._manager.storage.get(STORAGE_KEY) || {};
160
+ const cur = appState._omega.storage.get(STORAGE_KEY) || {};
161
161
  const ms = cur.lastQuitAt;
162
162
  return ms ? new Date(ms) : null;
163
163
  },
@@ -201,7 +201,7 @@ const appState = {
201
201
  // Test helper — wipe persisted state and reset the in-memory snapshot.
202
202
  // (Public, intentionally — used by integration tests + by consumers who want a "reset to factory" command.)
203
203
  reset() {
204
- appState._manager.storage.delete(STORAGE_KEY);
204
+ appState._omega.storage.delete(STORAGE_KEY);
205
205
  appState._snapshot = null;
206
206
  appState._recoveredFromCrash = false;
207
207
  appState._launchedFromDeepLink = false;
@@ -209,11 +209,11 @@ const appState = {
209
209
  };
210
210
 
211
211
  function tryGetVersionFromPackage() {
212
- // Last-resort fallback used only when manager.getVersion() is unavailable.
212
+ // Last-resort fallback used only when omega.getVersion() is unavailable.
213
213
  // Reads via build.js's getPackage helper which already handles "no package.json
214
214
  // at projectRoot" by returning null — no try/catch needed.
215
- const Manager = require('../build.js');
216
- const pkg = Manager.getPackage('project');
215
+ const build = require('../build.js');
216
+ const pkg = build.getPackage('project');
217
217
  return pkg?.version || null;
218
218
  }
219
219
 
@@ -1,6 +1,6 @@
1
- // Auth Flow — the framework-owned sign-in round trip: `manager.openAuthFlow()`.
1
+ // Auth Flow — the framework-owned sign-in round trip: `omega.openAuthFlow()`.
2
2
  //
3
- // Opens the user's REAL default browser on manager.getAuthUrl()'s /signin → /token
3
+ // Opens the user's REAL default browser on omega.getAuthUrl()'s /signin → /token
4
4
  // chain — never an embedded window, so sign-in rides the user's own browser session
5
5
  // (SSO with whatever they're already logged into). What differs per environment is
6
6
  // only the RETURN CHANNEL for the minted token:
@@ -25,12 +25,12 @@
25
25
  // return), and self-expiring (default 5 min). The browser tab gets a tiny
26
26
  // "return to the app" page on success.
27
27
  //
28
- // Public API (via manager):
29
- // manager.openAuthFlow(options?) → Promise<{ url, port? }> — resolves once the flow
28
+ // Public API (via omega):
29
+ // omega.openAuthFlow(options?) → Promise<{ url, port? }> — resolves once the flow
30
30
  // is LAUNCHED; completion arrives later through
31
- // auth/token → omega.handleAuthToken →
31
+ // auth/token → auth.handleToken →
32
32
  // the desktop:auth:sign-in-with-token broadcast.
33
- // manager.authFlow.cancel() → tear down a pending dev listener (idempotent).
33
+ // omega.authFlow.cancel() → tear down a pending dev listener (idempotent).
34
34
 
35
35
  const crypto = require('crypto');
36
36
  const http = require('http');
@@ -43,26 +43,26 @@ const DEFAULT_TIMEOUT_MS = 5 * 60 * 1000;
43
43
 
44
44
  const authFlow = {
45
45
  _initialized: false,
46
- _manager: null,
46
+ _omega: null,
47
47
  _pending: null, // { server, nonce, timer, port } — the one in-flight dev listener
48
48
 
49
- initialize(manager) {
49
+ initialize(omega) {
50
50
  if (authFlow._initialized) {
51
51
  return;
52
52
  }
53
- authFlow._manager = manager;
53
+ authFlow._omega = omega;
54
54
  authFlow._initialized = true;
55
55
  },
56
56
 
57
57
  // Open the sign-in flow in the user's default browser. Resolves once the flow is
58
58
  // launched — NOT when the user finishes signing in.
59
59
  async open(options) {
60
- const manager = authFlow._manager;
60
+ const omega = authFlow._omega;
61
61
  options = options || {};
62
62
 
63
63
  // Production: the OS routes the custom scheme back to us — plain external open.
64
- if (manager.isProduction()) {
65
- const url = manager.getAuthUrl();
64
+ if (omega.isProduction()) {
65
+ const url = omega.getAuthUrl();
66
66
  require('electron').shell.openExternal(url);
67
67
  logger.log(`production — opened ${url}`);
68
68
  return { url };
@@ -89,7 +89,7 @@ const authFlow = {
89
89
  authFlow._pending = { server, nonce, timer, port };
90
90
 
91
91
  const returnUrl = `http://127.0.0.1:${port}/auth/token?state=${nonce}`;
92
- const url = manager.getAuthUrl(null, returnUrl);
92
+ const url = omega.getAuthUrl(null, returnUrl);
93
93
  require('electron').shell.openExternal(url);
94
94
  logger.log(`dev — loopback listener on 127.0.0.1:${port}, opened ${url}`);
95
95
  return { url, port };
@@ -113,7 +113,7 @@ const authFlow = {
113
113
  },
114
114
 
115
115
  _handleRequest(req, res) {
116
- const manager = authFlow._manager;
116
+ const omega = authFlow._omega;
117
117
  const pending = authFlow._pending;
118
118
  const url = new URL(req.url, 'http://127.0.0.1');
119
119
 
@@ -136,18 +136,18 @@ const authFlow = {
136
136
  }
137
137
 
138
138
  // Valid return: reply, tear down, then feed the SAME pipeline production uses.
139
- const appName = manager.config?.brand?.name || 'the app';
139
+ const appName = omega.config?.brand?.name || 'the app';
140
140
  res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8', Connection: 'close' });
141
141
  res.end(authFlow._page('Signed in', `You can close this tab and return to ${appName}.`));
142
142
  authFlow.cancel();
143
143
 
144
- const brandId = manager.config.brand.id;
145
- manager.deepLink.dispatch(`${brandId}://auth/token?authToken=${encodeURIComponent(token)}`);
144
+ const brandId = omega.config.brand.id;
145
+ omega.deepLink.dispatch(`${brandId}://auth/token?authToken=${encodeURIComponent(token)}`);
146
146
 
147
147
  // The browser held focus during sign-in — bring the app back to the front,
148
148
  // mirroring what a real OS deep-link arrival does. windows.show is the
149
149
  // stealth-aware surface (raw win.show() would flash windows during tests).
150
- manager.windows.show('main');
150
+ omega.windows.show('main');
151
151
  },
152
152
 
153
153
  _page(title, message) {
@@ -1,6 +1,6 @@
1
1
  // Auth Persistence — pluggable MAIN-process storage for the Firebase auth session.
2
2
  //
3
- // Every browser context (renderers here, popup/options/background in BXM) gets Firebase
3
+ // Every browser context (renderers here, popup/options/background in an extension) gets Firebase
4
4
  // session persistence for free via IndexedDB. Main is the one Node context — Firebase
5
5
  // defaults to in-memory there, so sign-in died with the process and the bridge's
6
6
  // authority rule signed every renderer out on the next boot.
@@ -30,7 +30,7 @@
30
30
  // signal isTestRun() reads below ([#907](https://github.com/Omega-JS-Stack/omega/issues/907)).
31
31
  //
32
32
  // Select via config `omega.authPersistence` ('safeStorage' | 'none' | a custom
33
- // registered name). Register custom strategies BEFORE manager.initialize():
33
+ // registered name). Register custom strategies BEFORE omega.initialize():
34
34
  // require('@omega.js/desktop/lib/auth-persistence').register('keytar', {...})
35
35
  //
36
36
  // The firebase adapter mirrors firebase's own getReactNativePersistence(): a class
@@ -114,18 +114,18 @@ const noneStrategy = {
114
114
  async removeItem() {},
115
115
  };
116
116
 
117
- // Is this process a TEST RUN, in either lane that reaches this lib? The manager
117
+ // Is this process a TEST RUN, in either lane that reaches this lib? The omega instance
118
118
  // answers it, in both: each lane spawns its child with `OMEGA_ENVIRONMENT=testing`
119
119
  // and the baked word never writes over it
120
120
  // ([#925](https://github.com/Omega-JS-Stack/omega/issues/925)), so a booted
121
121
  // production artifact reports the lane it is running in too.
122
- function isTestRun(manager) {
123
- return !!manager?.isTesting?.();
122
+ function isTestRun(omega) {
123
+ return !!omega?.isTesting?.();
124
124
  }
125
125
 
126
126
  const authPersistence = {
127
127
  _initialized: false,
128
- _manager: null,
128
+ _omega: null,
129
129
  _strategies: {
130
130
  safeStorage: safeStorageStrategy,
131
131
  none: noneStrategy,
@@ -134,15 +134,15 @@ const authPersistence = {
134
134
 
135
135
  // Lib-shape conformance — the real work happens in resolve(), called by the
136
136
  // @omega.js/client bridge at auth boot (it needs the async availability check).
137
- initialize(manager) {
137
+ initialize(omega) {
138
138
  if (authPersistence._initialized) {
139
139
  return;
140
140
  }
141
- authPersistence._manager = manager;
141
+ authPersistence._omega = omega;
142
142
  authPersistence._initialized = true;
143
143
  },
144
144
 
145
- // Consumers add custom strategies before manager.initialize().
145
+ // Consumers add custom strategies before omega.initialize().
146
146
  register(name, strategy) {
147
147
  if (!name || typeof strategy?.getItem !== 'function') {
148
148
  throw new Error('auth-persistence.register: strategy must implement getItem/setItem/removeItem/available');
@@ -152,20 +152,20 @@ const authPersistence = {
152
152
 
153
153
  // Pick + availability-check the configured strategy. Returns the active strategy
154
154
  // or null (→ caller falls back to firebase's in-memory default).
155
- async resolve(manager) {
155
+ async resolve(omega) {
156
156
  // A TEST RUN is `none`, before any config is read: the test lanes never sign a
157
157
  // real user in, so the OS keychain is never asked. This overrides an explicit
158
158
  // consumer value too, because the boot layer boots the brand's REAL config through
159
159
  // the staged test app, and an unsigned Electron binary asking macOS for a keychain
160
160
  // item parks the whole run behind a SecurityAgent prompt
161
161
  // ([#907](https://github.com/Omega-JS-Stack/omega/issues/907)).
162
- if (isTestRun(manager)) {
162
+ if (isTestRun(omega)) {
163
163
  logger.log('auth persistence: none (test mode)');
164
164
  authPersistence._active = null;
165
165
  return null;
166
166
  }
167
167
 
168
- const wanted = manager.config?.omega?.authPersistence || 'safeStorage';
168
+ const wanted = omega.config?.omega?.authPersistence || 'safeStorage';
169
169
  const strategy = authPersistence._strategies[wanted];
170
170
 
171
171
  if (!strategy) {