@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
@@ -28,7 +28,7 @@
28
28
  // 60s heartbeats reconnect through the fresh runtime.json afterwards.
29
29
  //
30
30
  // Bail conditions (any one → the lib schedules nothing):
31
- // - manager.isTesting() — tests drive the public methods explicitly against
31
+ // - omega.isTesting() — tests drive the public methods explicitly against
32
32
  // an isolated root; nothing may fire on its own, and install/spawn paths
33
33
  // stay dead so tests never touch network or real OS state.
34
34
  // - brand.id === 'restart-manager' (RM doesn't manage itself)
@@ -70,7 +70,7 @@ const INSTALL_COOLDOWN_MS = 60 * 60 * 1000; // failed install → bac
70
70
 
71
71
  const restartManager = {
72
72
  _initialized: false,
73
- _manager: null,
73
+ _omega: null,
74
74
  _enabled: true,
75
75
  _bailed: false,
76
76
  _bailReason: null,
@@ -88,12 +88,12 @@ const restartManager = {
88
88
  _lastHeartbeatAt: null,
89
89
  _lastError: null,
90
90
 
91
- initialize(manager) {
91
+ initialize(omega) {
92
92
  if (restartManager._initialized) return;
93
93
  restartManager._initialized = true;
94
- restartManager._manager = manager;
94
+ restartManager._omega = omega;
95
95
 
96
- const cfg = manager.config.restartManager || {};
96
+ const cfg = omega.config.restartManager || {};
97
97
  restartManager._enabled = cfg.enabled !== false;
98
98
  restartManager._feed = { ...DEFAULT_FEED, ...(cfg.feed || {}) };
99
99
 
@@ -103,20 +103,20 @@ const restartManager = {
103
103
  // userData (wiped every run) so explicit test calls never touch the real
104
104
  // neutral root; everything else shares `<appData>/restart-manager` (or the
105
105
  // OMEGA_RM_ROOT override — the cross-repo dev/test isolation seam).
106
- restartManager._root = manager.isTesting()
106
+ restartManager._root = omega.isTesting()
107
107
  ? path.join(app.getPath('userData'), protocol.SHARED_DIR_NAME)
108
108
  : protocol.resolveSharedRoot(app.getPath('appData'), process.env);
109
109
 
110
110
  // Bail #1: test mode. Nothing fires on its own — no timers, no quit hook
111
111
  // (a preventDefault in before-quit would wedge the harness's quit). Tests
112
112
  // drive register()/unregister()/ensureInstalled() explicitly.
113
- if (manager.isTesting()) {
113
+ if (omega.isTesting()) {
114
114
  restartManager._bail('testing', 'skipping (test mode).');
115
115
  return;
116
116
  }
117
117
 
118
118
  // Bail #2: this app IS restart-manager. RM doesn't manage itself.
119
- if (manager.config.brand.id === 'restart-manager') {
119
+ if (omega.config.brand.id === 'restart-manager') {
120
120
  restartManager._bail('self', 'skipping (this app is restart-manager itself).');
121
121
  return;
122
122
  }
@@ -129,14 +129,14 @@ const restartManager = {
129
129
 
130
130
  // Bail #4: dev mode unless explicitly opted in — avoids feed fetches and
131
131
  // spawn thrash during local dev where RM likely isn't installed.
132
- if (!manager.isProduction() && process.env.OMEGA_RESTART_MANAGER_DEV !== '1') {
132
+ if (!omega.isProduction() && process.env.OMEGA_RESTART_MANAGER_DEV !== '1') {
133
133
  restartManager._bail('dev', 'skipping outside production (set OMEGA_RESTART_MANAGER_DEV=1 to test).');
134
134
  return;
135
135
  }
136
136
 
137
137
  // Schedule the first register after whenReady; single timer so re-init
138
138
  // guards don't pile up (tests shutdown() to clear).
139
- const delay = manager.isDevelopment() ? REGISTER_DELAY_DEV_MS : REGISTER_DELAY_PROD_MS;
139
+ const delay = omega.isDevelopment() ? REGISTER_DELAY_DEV_MS : REGISTER_DELAY_PROD_MS;
140
140
  app.whenReady().then(() => {
141
141
  restartManager._registerTimer = setTimeout(() => {
142
142
  restartManager.register().catch((e) => logger.warn(`register failed: ${e.message}`));
@@ -155,14 +155,14 @@ const restartManager = {
155
155
  // or spawns — a probe failure just returns false.
156
156
  async register() {
157
157
  if (restartManager._hardBailed()) return false;
158
- const manager = restartManager._manager;
158
+ const omega = restartManager._omega;
159
159
 
160
160
  for (let attempt = 1; attempt <= MAX_REGISTER_ATTEMPTS; attempt++) {
161
161
  try {
162
162
  let probe = await restartManager._probeRunning();
163
163
 
164
164
  if (!probe.ok) {
165
- if (manager.isTesting()) {
165
+ if (omega.isTesting()) {
166
166
  restartManager._lastError = 'restart-manager not running';
167
167
  return false;
168
168
  }
@@ -198,9 +198,9 @@ const restartManager = {
198
198
  if (restartManager._hardBailed()) return false;
199
199
 
200
200
  try {
201
- const manager = restartManager._manager;
201
+ const omega = restartManager._omega;
202
202
  const res = await restartManager._post(protocol.ENDPOINTS.deregister, {
203
- id: manager.config.brand.id,
203
+ id: omega.config.brand.id,
204
204
  pid: process.pid,
205
205
  });
206
206
  restartManager._registered = false;
@@ -215,21 +215,21 @@ const restartManager = {
215
215
  // Install RM into <root>/app/ when missing. Smart existence: the installed
216
216
  // app on disk short-circuits BEFORE any network so repeat boots cost one stat.
217
217
  async ensureInstalled() {
218
- const manager = restartManager._manager;
218
+ const omega = restartManager._omega;
219
219
  const platform = process.platform;
220
220
 
221
221
  const appPath = protocol.getInstalledAppPath(restartManager._root, platform);
222
222
  if (fs.existsSync(appPath)) return true;
223
223
 
224
224
  // Tests never hit the network unless explicitly in extended mode.
225
- if (manager.isTesting() && !process.env.TEST_EXTENDED_MODE) return false;
225
+ if (omega.isTesting() && !process.env.TEST_EXTENDED_MODE) return false;
226
226
 
227
227
  if (Date.now() < restartManager._installCooldownUntil) {
228
228
  logger.log('install on cooldown after a recent failure — skipping.');
229
229
  return false;
230
230
  }
231
231
 
232
- if (!install.acquireInstallLock(restartManager._root, { pid: process.pid, hostAppId: manager.config.brand.id })) {
232
+ if (!install.acquireInstallLock(restartManager._root, { pid: process.pid, hostAppId: omega.config.brand.id })) {
233
233
  logger.log('another app holds the install lock — skipping (heartbeat retries).');
234
234
  return false;
235
235
  }
@@ -258,13 +258,13 @@ const restartManager = {
258
258
 
259
259
  // Make sure RM is actually serving: probe → spawn the installed app → poll.
260
260
  async ensureRunning() {
261
- const manager = restartManager._manager;
261
+ const omega = restartManager._omega;
262
262
 
263
263
  const probe = await restartManager._probeRunning();
264
264
  if (probe.ok) return true;
265
265
 
266
266
  // Tests never spawn real binaries — the fixture server plays the running RM.
267
- if (manager.isTesting()) return false;
267
+ if (omega.isTesting()) return false;
268
268
 
269
269
  const appPath = protocol.getInstalledAppPath(restartManager._root, process.platform);
270
270
  if (!fs.existsSync(appPath)) return false;
@@ -319,7 +319,7 @@ const restartManager = {
319
319
  restartManager._quitWired = false;
320
320
  }
321
321
  restartManager._initialized = false;
322
- restartManager._manager = null;
322
+ restartManager._omega = null;
323
323
  restartManager._enabled = true;
324
324
  restartManager._bailed = false;
325
325
  restartManager._bailReason = null;
@@ -441,15 +441,15 @@ const restartManager = {
441
441
  },
442
442
 
443
443
  _buildPayload() {
444
- const manager = restartManager._manager;
444
+ const omega = restartManager._omega;
445
445
  const { app } = require('electron');
446
446
  return protocol.buildRegisterPayload({
447
- id: manager.config.brand.id,
447
+ id: omega.config.brand.id,
448
448
  name: app.getName(),
449
449
  pid: process.pid,
450
450
  path: app.getPath('exe'),
451
- version: manager.getVersion(),
452
- environment: manager.getEnvironment(),
451
+ version: omega.getVersion(),
452
+ environment: omega.getEnvironment(),
453
453
  });
454
454
  },
455
455
 
@@ -516,15 +516,15 @@ const restartManager = {
516
516
  },
517
517
 
518
518
  _handleBeforeQuit(event) {
519
- const manager = restartManager._manager;
519
+ const omega = restartManager._omega;
520
520
  if (restartManager._quitFlushed || !restartManager._registered) return;
521
521
 
522
522
  // Never intercept the auto-updater's quitAndInstall — its quit sequence
523
523
  // (especially Squirrel.Mac) must own the exit. The app relaunches via the
524
524
  // updater anyway; RM's deregister-wins grace window + @omega.js/desktop's single-instance
525
525
  // lock neutralize the tiny race.
526
- const updaterStatus = manager.autoUpdater.getStatus();
527
- if (manager._allowQuit && updaterStatus.code === 'downloaded') {
526
+ const updaterStatus = omega.autoUpdater.getStatus();
527
+ if (omega._allowQuit && updaterStatus.code === 'downloaded') {
528
528
  restartManager._quitFlushed = true;
529
529
  restartManager.unregister().catch(() => { /* best-effort */ });
530
530
  return;
@@ -532,7 +532,7 @@ const restartManager = {
532
532
 
533
533
  event.preventDefault();
534
534
  restartManager._quitFlushed = true;
535
- restartManager._quitFlush().finally(() => manager.quit({ force: true }));
535
+ restartManager._quitFlush().finally(() => omega.quit({ force: true }));
536
536
  },
537
537
 
538
538
  async _quitFlush() {
@@ -13,7 +13,7 @@
13
13
  const { spawnSync } = require('child_process');
14
14
  const { execute } = require('node-powertools');
15
15
 
16
- const logger = new (require('../../build.js'))().logger('exec-with-limit');
16
+ const logger = require('../../build.js').logger('exec-with-limit');
17
17
 
18
18
  // A kill that failed is exactly the state the operator needs to see, so every
19
19
  // failure is said, never swallowed.
@@ -21,7 +21,7 @@ const os = require('os');
21
21
  const path = require('path');
22
22
  const jetpack = require('fs-jetpack');
23
23
 
24
- const logger = new (require('../../build.js'))().logger('sign-events');
24
+ const logger = require('../../build.js').logger('sign-events');
25
25
 
26
26
  function resolveLogPath(env, platform) {
27
27
  env = env || process.env;
@@ -6,7 +6,7 @@
6
6
  // normal — default. Dock icon visible on macOS, taskbar entry on Windows.
7
7
  // hidden — packaged builds get LSUIElement=true on macOS (zero dock bounce, no
8
8
  // dock icon, not in Cmd+Tab). Tray/notifications/networking still work.
9
- // Consumer surfaces UI later via `manager.windows.create('main')`, which
9
+ // Consumer surfaces UI later via `omega.windows.create('main')`, which
10
10
  // calls app.dock.show() automatically so the icon appears alongside the
11
11
  // window. Use this for menubar apps, agent apps, anything that should
12
12
  // be invisible until the user explicitly asks for UI.
@@ -18,7 +18,7 @@
18
18
  //
19
19
  // @omega.js/desktop does NOT auto-create any windows anymore — the consumer's main.js drives that.
20
20
  // So "isLaunchHidden" no longer needs to gate window creation; we just expose the
21
- // raw mode and let the consumer decide whether to call `manager.windows.create()`.
21
+ // raw mode and let the consumer decide whether to call `omega.windows.create()`.
22
22
  //
23
23
  // Detection: macOS sets `getLoginItemSettings().wasOpenedAtLogin = true`. On Windows we
24
24
  // register the login item with `--omega-launched-at-login` arg and check process.argv.
@@ -33,17 +33,21 @@ const logger = new LoggerLite('startup');
33
33
  const VALID_MODES = ['normal', 'hidden'];
34
34
  const LOGIN_ARG = '--omega-launched-at-login'; // marker for Windows + Linux login-launch detection
35
35
 
36
+ // The env keys the boot summary logs: the environment input, the login-item override,
37
+ // and the two a parent process leaks in (ELECTRON_RUN_AS_NODE turns Electron into Node)
38
+ const BOOT_ENV_KEYS = ['OMEGA_ENVIRONMENT', 'OMEGA_FORCE_LOGIN_ITEM', 'ELECTRON_RUN_AS_NODE', 'NODE_ENV'];
39
+
36
40
  const startup = {
37
41
  _initialized: false,
38
- _manager: null,
42
+ _omega: null,
39
43
  _electron: null,
40
44
 
41
- initialize(manager) {
45
+ initialize(omega) {
42
46
  if (startup._initialized) {
43
47
  return;
44
48
  }
45
49
 
46
- startup._manager = manager;
50
+ startup._omega = omega;
47
51
  startup._electron = require('electron');
48
52
 
49
53
  const mode = startup.getMode();
@@ -76,8 +80,9 @@ const startup = {
76
80
  // "Why is @omega.js/desktop behaving like X?" → check resolved values
77
81
  // "Why did @omega.js/desktop decide X?" → check raw inputs
78
82
  const macLogin = process.platform === 'darwin' ? startup._electron.app.getLoginItemSettings() : null;
79
- const emEnv = Object.fromEntries(
80
- Object.entries(process.env).filter(([k]) => k.startsWith('EM_') || k === 'ELECTRON_RUN_AS_NODE' || k === 'NODE_ENV')
83
+ // The named knobs that steer this boot, never a prefix: OMEGA_* also names secrets
84
+ const bootEnv = Object.fromEntries(
85
+ Object.entries(process.env).filter(([k]) => BOOT_ENV_KEYS.includes(k))
81
86
  );
82
87
  const launchedAtLogin = startup.wasLaunchedAtLogin();
83
88
  const launchedAtLoginVia = startup._launchedAtLoginVia();
@@ -89,7 +94,7 @@ const startup = {
89
94
  logger.log(` process.arch: ${process.arch}`);
90
95
  logger.log(` app.isPackaged: ${startup._electron.app.isPackaged}`);
91
96
  logger.log(` app.getLoginItemSettings(): ${macLogin ? JSON.stringify(macLogin) : '(not macOS)'}`);
92
- logger.log(` EM_/electron/node env: ${JSON.stringify(emEnv)}`);
97
+ logger.log(` boot env: ${JSON.stringify(bootEnv)}`);
93
98
 
94
99
  logger.log('startup boot summary — RESOLVED values:');
95
100
  logger.log(` config.startup.mode: ${mode}`);
@@ -116,32 +121,32 @@ const startup = {
116
121
  // OMEGA_FORCE_LOGIN_ITEM=1 bypasses the guard so you can intentionally exercise the flow.
117
122
  _isDev() {
118
123
  if (process.env.OMEGA_FORCE_LOGIN_ITEM === '1') return false;
119
- return !startup._manager.isProduction();
124
+ return !startup._omega.isProduction();
120
125
  },
121
126
 
122
127
  // Returns the resolved user-launch mode, defaulting to 'normal' for unknown values.
123
128
  getMode() {
124
- const raw = startup._manager.config.startup?.mode || 'normal';
129
+ const raw = startup._omega.config.startup?.mode || 'normal';
125
130
  return VALID_MODES.includes(raw) ? raw : 'normal';
126
131
  },
127
132
 
128
133
  // openAtLogin block reads. `_loginEnabled` defaults to true; `_loginMode` defaults to 'hidden'.
129
134
  _loginEnabled() {
130
- const v = startup._manager.config.startup?.openAtLogin;
135
+ const v = startup._omega.config.startup?.openAtLogin;
131
136
  if (typeof v === 'boolean') return v; // back-compat for boolean form
132
137
  if (v && typeof v === 'object') return v.enabled !== false; // object form: default true
133
138
  return true; // unset → true (apps open at login by default)
134
139
  },
135
140
 
136
141
  _loginMode() {
137
- const v = startup._manager.config.startup?.openAtLogin;
142
+ const v = startup._omega.config.startup?.openAtLogin;
138
143
  if (v && typeof v === 'object' && VALID_MODES.includes(v.mode)) return v.mode;
139
144
  return 'hidden'; // default: launch hidden at login
140
145
  },
141
146
 
142
147
  // True if this launch is hidden — combines user-launch mode (always honored) with
143
148
  // login-launch mode (only honored when the app was launched at login). Consumers can
144
- // read this to decide whether to call manager.windows.create() during boot.
149
+ // read this to decide whether to call omega.windows.create() during boot.
145
150
  isLaunchHidden() {
146
151
  if (startup.getMode() === 'hidden') return true;
147
152
  if (startup.wasLaunchedAtLogin() && startup._loginMode() === 'hidden') return true;
@@ -1,12 +1,12 @@
1
1
  // Storage — unified KV store for main + renderer.
2
2
  //
3
3
  // Main-side (sync, direct disk-backed via electron-store):
4
- // manager.storage.get(key, default)
5
- // manager.storage.set(key, value)
6
- // manager.storage.delete(key)
7
- // manager.storage.has(key)
8
- // manager.storage.clear()
9
- // manager.storage.onChange(key, fn) // returns unsubscribe fn
4
+ // omega.storage.get(key, default)
5
+ // omega.storage.set(key, value)
6
+ // omega.storage.delete(key)
7
+ // omega.storage.has(key)
8
+ // omega.storage.clear()
9
+ // omega.storage.onChange(key, fn) // returns unsubscribe fn
10
10
  //
11
11
  // Renderer-side (async, proxied through preload contextBridge → IPC → main):
12
12
  // window.desktop.storage.get(key, default) → Promise
@@ -27,17 +27,17 @@ const logger = new LoggerLite('storage');
27
27
 
28
28
  const storage = {
29
29
  _initialized: false,
30
- _manager: null,
30
+ _omega: null,
31
31
  _store: null,
32
32
  _changeSubs: {}, // key -> Set<fn>
33
33
  _ipcRegistered: false,
34
34
 
35
- async initialize(manager) {
35
+ async initialize(omega) {
36
36
  if (storage._initialized) {
37
37
  return;
38
38
  }
39
39
 
40
- storage._manager = manager;
40
+ storage._omega = omega;
41
41
 
42
42
  let ElectronStore;
43
43
  try {
@@ -58,7 +58,7 @@ const storage = {
58
58
 
59
59
  // Build the store. Filename is `omega-storage.json` (electron-store appends .json).
60
60
  // Production name is read from electron's app.name (set automatically from package.productName).
61
- const projectName = manager.config.app?.productName || electron.app.getName();
61
+ const projectName = omega.config.app?.productName || electron.app.getName();
62
62
 
63
63
  storage._store = new ElectronStore({
64
64
  name: 'omega-storage',
@@ -1,15 +1,15 @@
1
1
  // Templating — light token-replacement engine for HTML/CSS/JS at build time.
2
2
  //
3
3
  // Wraps node-powertools' template() with framework-friendly defaults:
4
- // - Brackets are `{{ }}` (matches BXM/UJM convention).
5
- // - Standard variable scope built from manager.config + page metadata.
4
+ // - Brackets are `{{ }}`.
5
+ // - Standard variable scope built from omega.config + page metadata.
6
6
  //
7
7
  // Public API:
8
- // manager.templating.render(input, vars) // arbitrary string + arbitrary vars
9
- // manager.templating.buildPageVars(pageName, extras) // produces { brand, app, page, theme, cacheBust }
10
- // manager.templating.renderPage(pageTemplate, vars) // shortcut that uses {{ }} brackets
8
+ // omega.templating.render(input, vars) // arbitrary string + arbitrary vars
9
+ // omega.templating.buildPageVars(pageName, extras) // produces { brand, app, page, theme, cacheBust }
10
+ // omega.templating.renderPage(pageTemplate, vars) // shortcut that uses {{ }} brackets
11
11
  //
12
- // Manager.initialize calls .initialize(manager) but the lib is mostly used at build time
12
+ // omega.initialize() calls .initialize(omega) but the lib is mostly used at build time
13
13
  // (gulp/html), not at runtime. The runtime surface is exposed for consumer hooks that want
14
14
  // to template their own strings.
15
15
 
@@ -22,10 +22,10 @@ const DEFAULT_BRACKETS = ['{{', '}}'];
22
22
 
23
23
  const templating = {
24
24
  _initialized: false,
25
- _manager: null,
25
+ _omega: null,
26
26
 
27
- initialize(manager) {
28
- templating._manager = manager;
27
+ initialize(omega) {
28
+ templating._omega = omega;
29
29
  templating._initialized = true;
30
30
  logger.log('initialize');
31
31
  },
@@ -37,19 +37,19 @@ const templating = {
37
37
  return template(String(input || ''), vars || {}, { brackets });
38
38
  },
39
39
 
40
- // Build the standard variable scope for a page render. Combines manager.config with
40
+ // Build the standard variable scope for a page render. Combines omega.config with
41
41
  // page-specific metadata + cache-buster for asset URLs.
42
- // `manager` is optional — buildPageVars works at build time (where Manager singleton is built
43
- // from build.js) without needing the runtime manager singleton.
44
- buildPageVars(pageName, extras, manager) {
45
- const m = manager || templating._manager;
46
- const cfg = (m && m.config) || (m && typeof m.getConfig === 'function' ? m.getConfig() : {}) || {};
42
+ // `omega` is optional: buildPageVars works at build time (where the build module from
43
+ // build.js stands in) without needing the runtime omega instance.
44
+ buildPageVars(pageName, extras, omega) {
45
+ omega = omega || templating._omega;
46
+ const cfg = (omega && omega.config) || (omega && typeof omega.getConfig === 'function' ? omega.getConfig() : {}) || {};
47
47
  // Pull version from the consumer's package.json at build time. This baked-in
48
48
  // string is used by templates that want to display the running version in the
49
49
  // UI (e.g. "v1.0.5" in a footer). At runtime it always matches the version
50
50
  // that was packaged + signed + uploaded, since both come from the same
51
51
  // package.json read.
52
- const pkg = (m && typeof m.getPackage === 'function' ? m.getPackage('project') : null) || {};
52
+ const pkg = (omega && typeof omega.getPackage === 'function' ? omega.getPackage('project') : null) || {};
53
53
  const appBlock = { ...(cfg.app || {}) };
54
54
  if (pkg.version && !appBlock.version) appBlock.version = pkg.version;
55
55
  const vars = {
package/dist/lib/theme.js CHANGED
@@ -1,10 +1,10 @@
1
1
  // Theme — system-aware dynamic appearance (light / dark / follow-the-OS).
2
2
  //
3
3
  // Main-side API:
4
- // manager.theme.get() → 'system' | 'light' | 'dark' (the SOURCE — what's chosen)
5
- // manager.theme.resolved() → 'light' | 'dark' (what's actually showing)
6
- // manager.theme.set(source) → apply + persist a new source
7
- // manager.theme.onChange(fn) → fn({ source, resolved }) on every effective change; returns unsubscribe
4
+ // omega.theme.get() → 'system' | 'light' | 'dark' (the SOURCE — what's chosen)
5
+ // omega.theme.resolved() → 'light' | 'dark' (what's actually showing)
6
+ // omega.theme.set(source) → apply + persist a new source
7
+ // omega.theme.onChange(fn) → fn({ source, resolved }) on every effective change; returns unsubscribe
8
8
  //
9
9
  // Renderer-side (preload contextBridge):
10
10
  // window.desktop.theme.get() → Promise<{ source, resolved }>
@@ -38,18 +38,18 @@ const SOURCES = ['system', 'light', 'dark'];
38
38
 
39
39
  const theme = {
40
40
  _initialized: false,
41
- _manager: null,
41
+ _omega: null,
42
42
  _nativeTheme: null,
43
43
  _listeners: new Set(),
44
44
  _lastEmitted: null,
45
45
  _onNativeUpdated: null,
46
46
 
47
- initialize(manager) {
47
+ initialize(omega) {
48
48
  if (theme._initialized) {
49
49
  return;
50
50
  }
51
51
 
52
- theme._manager = manager;
52
+ theme._omega = omega;
53
53
 
54
54
  let nativeTheme;
55
55
  try {
@@ -65,8 +65,8 @@ const theme = {
65
65
  theme._nativeTheme = nativeTheme;
66
66
 
67
67
  // Boot source: storage override → config default → 'system'.
68
- const stored = manager.storage.get(`${STORAGE_KEY}.appearance`);
69
- const configured = manager.config?.theme?.appearance;
68
+ const stored = omega.storage.get(`${STORAGE_KEY}.appearance`);
69
+ const configured = omega.config?.theme?.appearance;
70
70
  const source = SOURCES.includes(stored) ? stored
71
71
  : SOURCES.includes(configured) ? configured
72
72
  : 'system';
@@ -116,7 +116,7 @@ const theme = {
116
116
  return;
117
117
  }
118
118
 
119
- theme._manager.storage.set(`${STORAGE_KEY}.appearance`, source);
119
+ theme._omega.storage.set(`${STORAGE_KEY}.appearance`, source);
120
120
  theme._nativeTheme.themeSource = source;
121
121
 
122
122
  // nativeTheme 'updated' only fires when the RESOLVED appearance changes — a