@omega.js/desktop 0.52.0 → 0.54.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.
- package/README.md +53 -48
- package/dist/assets/css/core/_initialize.scss +1 -1
- package/dist/assets/js/core/app-shell.js +14 -15
- package/dist/assets/themes/_template/_theme.js +6 -6
- package/dist/assets/themes/base/_includes/global/sections/account.html +4 -4
- package/dist/assets/themes/base/_includes/global/sections/app-sidebar.html +5 -5
- package/dist/assets/themes/base/_layouts/frontend/pages/account/index.html +3 -3
- package/dist/assets/themes/base/_layouts/frontend/pages/alternatives/index.html +1 -1
- package/dist/assets/themes/base/_layouts/frontend/pages/blog/tags/tag.html +1 -1
- package/dist/assets/themes/base/_layouts/frontend/pages/payment/confirmation.html +1 -1
- package/dist/assets/themes/base/_sections/marketing/newsletter-cta/section.js +2 -3
- package/dist/assets/themes/base/_sections/verts/unit/section.html +1 -1
- package/dist/assets/themes/base/_sections/verts/unit/section.js +3 -4
- package/dist/assets/themes/base/_theme.js +4 -3
- package/dist/assets/themes/bootstrap/_theme.js +2 -2
- package/dist/assets/themes/bootstrap/overrides/_links.scss +1 -1
- package/dist/assets/themes/classy/_theme.js +8 -6
- package/dist/assets/themes/classy/css/marketing/_sections.scss +1 -2
- package/dist/assets/themes/classy/js/hero-demo-form.js +3 -2
- package/dist/assets/themes/neobrutalism/_theme.js +5 -5
- package/dist/assets/themes/neobrutalism/js/pages/test/libraries/layers/index.js +1 -1
- package/dist/assets/themes/newsflash/_theme.js +6 -6
- package/dist/assets/themes/newsflash/js/pages/test/libraries/layers/index.js +1 -1
- package/dist/build.js +87 -111
- package/dist/cli-run.js +4 -1
- package/dist/cli.js +3 -3
- package/dist/commands/build.js +2 -2
- package/dist/commands/cdp/capture.js +2 -2
- package/dist/commands/cdp/client.js +1 -1
- package/dist/commands/cdp/quit.js +2 -2
- package/dist/commands/cdp/relaunch.js +2 -2
- package/dist/commands/cdp/theme.js +1 -1
- package/dist/commands/cdp.js +1 -1
- package/dist/commands/clean.js +4 -5
- package/dist/commands/deploy.js +4 -4
- package/dist/commands/dev.js +25 -0
- package/dist/commands/finalize-release.js +4 -4
- package/dist/commands/launch.js +2 -2
- package/dist/commands/lib/deploy-precheck.js +3 -3
- package/dist/commands/lib/ensure-target.js +18 -23
- package/dist/commands/lib/migrate.js +17 -0
- package/dist/commands/logs.js +1 -1
- package/dist/commands/package.js +2 -2
- package/dist/commands/publish.js +2 -2
- package/dist/commands/release.js +4 -4
- package/dist/commands/runner.js +11 -11
- package/dist/commands/sign-windows.js +5 -5
- package/dist/commands/test.js +8 -8
- package/dist/commands/update.js +7 -6
- package/dist/commands/validate-certs.js +4 -4
- package/dist/commands/version.js +3 -3
- package/dist/defaults/.github/workflows/build.yml +18 -18
- package/dist/defaults/_.gitignore +0 -2
- package/dist/defaults/_mas/README.md +3 -3
- package/dist/defaults/config/certs/README.md +1 -1
- package/dist/defaults/config/omega.json5 +43 -43
- package/dist/defaults/docs/README.md +3 -3
- package/dist/defaults/gulpfile.js +1 -1
- package/dist/defaults/hooks/build/post.js +2 -2
- package/dist/defaults/hooks/build/pre.js +2 -2
- package/dist/defaults/hooks/deploy/pre.js +1 -1
- package/dist/defaults/hooks/notarize/post.js +2 -2
- package/dist/defaults/hooks/release/post.js +2 -2
- package/dist/defaults/hooks/release/pre.js +2 -2
- package/dist/defaults/src/assets/js/components/about/index.js +3 -5
- package/dist/defaults/src/assets/js/components/main/index.js +3 -5
- package/dist/defaults/src/assets/js/components/settings/index.js +3 -5
- package/dist/defaults/src/assets/scss/pages/about.scss +1 -1
- package/dist/defaults/src/assets/scss/pages/main.scss +1 -1
- package/dist/defaults/src/assets/scss/pages/settings.scss +1 -1
- package/dist/defaults/src/integrations/context-menu/index.js +13 -13
- package/dist/defaults/src/integrations/menu/index.js +8 -8
- package/dist/defaults/src/integrations/tray/index.js +12 -12
- package/dist/defaults/src/main.js +5 -7
- package/dist/defaults/src/preload.js +4 -6
- package/dist/defaults/test/README.md +5 -5
- package/dist/defaults/test/_init.js +1 -1
- package/dist/gulp/main.js +9 -10
- package/dist/gulp/tasks/audit.js +11 -14
- package/dist/gulp/tasks/build-config.js +8 -8
- package/dist/gulp/tasks/bundle.js +16 -16
- package/dist/gulp/tasks/defaults.js +3 -3
- package/dist/gulp/tasks/distribute.js +2 -2
- package/dist/gulp/tasks/html.js +9 -9
- package/dist/gulp/tasks/package-quick.js +3 -3
- package/dist/gulp/tasks/package.js +3 -3
- package/dist/gulp/tasks/release.js +3 -3
- package/dist/gulp/tasks/sass.js +6 -6
- package/dist/gulp/tasks/serve.js +4 -4
- package/dist/hooks/notarize-artifacts.js +1 -1
- package/dist/hooks/notarize.js +1 -1
- package/dist/index.js +5 -8
- package/dist/lib/_environment-mixin.js +50 -0
- package/dist/lib/_lifecycle-mixin.js +45 -0
- package/dist/lib/analytics.js +33 -35
- package/dist/lib/app-state.js +14 -14
- package/dist/lib/auth-flow.js +18 -18
- package/dist/lib/auth-persistence.js +12 -12
- package/dist/lib/auth.js +421 -0
- package/dist/lib/auto-updater.js +49 -49
- package/dist/lib/context-menu.js +13 -13
- package/dist/lib/context.js +19 -19
- package/dist/lib/deep-link.js +34 -34
- package/dist/lib/fontawesome.js +5 -5
- package/dist/lib/ipc.js +4 -4
- package/dist/lib/menu.js +25 -25
- package/dist/lib/protocol.js +5 -5
- package/dist/lib/remote-config.js +22 -22
- package/dist/lib/remote-scripts.js +21 -21
- package/dist/lib/restart-manager/index.js +29 -29
- package/dist/lib/restart-manager/install.js +1 -1
- package/dist/lib/restart-manager/protocol.js +1 -1
- package/dist/lib/sign-helpers/exec-with-limit.js +1 -1
- package/dist/lib/sign-helpers/sign-events.js +1 -1
- package/dist/lib/startup.js +18 -13
- package/dist/lib/storage.js +10 -10
- package/dist/lib/templating.js +16 -16
- package/dist/lib/theme.js +10 -10
- package/dist/lib/tray.js +27 -27
- package/dist/lib/usage.js +11 -11
- package/dist/lib/window-manager.js +26 -26
- package/dist/main.js +399 -483
- package/dist/preload.js +236 -176
- package/dist/renderer.js +417 -391
- package/dist/test/fixtures/consumer-app/config/omega.json5 +1 -1
- package/dist/test/fixtures/consumer-app/src/assets/js/components/main/index.js +8 -11
- package/dist/test/fixtures/consumer-app/src/main.js +5 -7
- package/dist/test/fixtures/consumer-app/src/preload.js +2 -2
- package/dist/test/harness/boot-entry.js +22 -20
- package/dist/test/harness/main-entry.js +31 -30
- package/dist/test/harness/renderer-entry.js +5 -5
- package/dist/test/harness/renderer-preload.js +137 -141
- package/dist/test/index.js +10 -10
- package/dist/test/runner.js +2 -2
- package/dist/test/runners/boot.js +7 -6
- package/dist/test/runners/electron.js +3 -2
- package/dist/test/runners/render-event.js +2 -2
- package/dist/test/suites/boot/consumer-app-boots.test.js +57 -26
- package/dist/test/suites/boot/restart-manager.test.js +2 -2
- package/dist/test/suites/boot/storage-bundled.test.js +5 -5
- package/dist/test/suites/boot/theme.test.js +13 -13
- package/dist/test/suites/build/audit.test.js +21 -8
- package/dist/test/suites/build/auth-persistence-resolve.test.js +6 -6
- package/dist/test/suites/build/boot-fixture.test.js +2 -2
- package/dist/test/suites/build/boot-runner-timeout.test.js +6 -5
- package/dist/test/suites/build/brand-scss.test.js +1 -1
- package/dist/test/suites/build/build-json-bake.test.js +1 -1
- package/dist/test/suites/build/build-workflow-jobs.test.js +2 -2
- package/dist/test/suites/build/cli.test.js +30 -2
- package/dist/test/suites/build/config-schema.test.js +5 -5
- package/dist/test/suites/build/defaults-em-dash.test.js +22 -0
- package/dist/test/suites/build/defaults-scaffold.test.js +21 -7
- package/dist/test/suites/build/deploy-direct.test.js +7 -5
- package/dist/test/suites/build/deploy-dispatch.test.js +2 -1
- package/dist/test/suites/build/deploy-hook.test.js +7 -5
- package/dist/test/suites/build/dev-verb.test.js +67 -0
- package/dist/test/suites/build/ensure-target.test.js +13 -5
- package/dist/test/suites/build/env-delivery.test.js +2 -2
- package/dist/test/suites/build/esm-only-dependency.test.js +2 -2
- package/dist/test/suites/build/exports.test.js +9 -8
- package/dist/test/suites/build/get-config.test.js +4 -4
- package/dist/test/suites/build/manifest-deps.test.js +1 -1
- package/dist/test/suites/build/merge-line-files.test.js +7 -7
- package/dist/test/suites/build/migrate.test.js +29 -0
- package/dist/test/suites/build/omega-shell.test.js +34 -2
- package/dist/test/suites/build/omega.test.js +350 -0
- package/dist/test/suites/build/project-scripts-deps.test.js +6 -10
- package/dist/test/suites/build/renderer-auth-bridge.test.js +211 -78
- package/dist/test/suites/build/runner-env-write.test.js +73 -0
- package/dist/test/suites/build/runner.test.js +11 -10
- package/dist/test/suites/build/sentry.test.js +2 -2
- package/dist/test/suites/build/setup-scripts.test.js +27 -0
- package/dist/test/suites/build/sign-windows-e2e.test.js +2 -2
- package/dist/test/suites/build/templating.test.js +3 -3
- package/dist/test/suites/build/test-stealth.test.js +7 -9
- package/dist/test/suites/build/url-helpers.test.js +55 -56
- package/dist/test/suites/build/validate-config.test.js +15 -4
- package/dist/test/suites/build/verb-logs.test.js +20 -0
- package/dist/test/suites/build/wave5-pins.test.js +2 -2
- package/dist/test/suites/main/analytics.test.js +59 -59
- package/dist/test/suites/main/app-state.test.js +66 -66
- package/dist/test/suites/main/auth-flow.test.js +41 -41
- package/dist/test/suites/main/auth-persistence.test.js +54 -43
- package/dist/test/suites/main/{client-bridge.integration.test.js → auth.integration.test.js} +10 -9
- package/dist/test/suites/main/auth.test.js +336 -0
- package/dist/test/suites/main/auto-updater.test.js +134 -134
- package/dist/test/suites/main/boot-sequence.test.js +37 -49
- package/dist/test/suites/main/context-menu.test.js +51 -50
- package/dist/test/suites/main/context.test.js +25 -25
- package/dist/test/suites/main/deep-link.test.js +74 -74
- package/dist/test/suites/main/fontawesome.test.js +27 -27
- package/dist/test/suites/main/ipc.test.js +35 -35
- package/dist/test/suites/main/menu.test.js +101 -100
- package/dist/test/suites/main/protocol.test.js +19 -19
- package/dist/test/suites/main/remote-config.test.js +63 -63
- package/dist/test/suites/main/remote-scripts.test.js +103 -103
- package/dist/test/suites/main/request.test.js +71 -0
- package/dist/test/suites/main/restart-manager.test.js +33 -33
- package/dist/test/suites/main/startup-paths-and-ua.test.js +4 -4
- package/dist/test/suites/main/startup.test.js +26 -26
- package/dist/test/suites/main/stealth-window.test.js +1 -1
- package/dist/test/suites/main/storage.test.js +25 -25
- package/dist/test/suites/main/theme.test.js +34 -34
- package/dist/test/suites/main/tray.test.js +79 -79
- package/dist/test/suites/main/url-helpers.test.js +133 -133
- package/dist/test/suites/main/usage.test.js +25 -25
- package/dist/test/suites/main/window-bounds.test.js +27 -27
- package/dist/test/suites/main/window-manager.test.js +44 -44
- package/dist/test/suites/renderer/analytics-bridge.test.js +5 -5
- package/dist/test/suites/renderer/cross-context-helpers.test.js +37 -31
- package/dist/test/suites/renderer/round-trip.test.js +3 -3
- package/dist/test/suites/renderer/tooltips.test.js +15 -15
- package/dist/test/suites/renderer/{window-em-surface.test.js → window-desktop-surface.test.js} +28 -8
- package/dist/test/utils/extended-mode-warning.js +1 -1
- package/dist/utils/boot-harness.js +56 -0
- package/dist/utils/build-pipeline.js +4 -4
- package/dist/utils/mode-helpers.js +2 -15
- package/dist/utils/runner-env.js +13 -28
- package/dist/utils/ship-keys.js +3 -3
- package/dist/utils/signing-status.js +51 -0
- package/dist/utils/test-events.js +7 -0
- package/dist/utils/test-stealth.js +6 -6
- package/dist/utils/url-helpers.js +52 -42
- package/dist/utils/user-agent.js +44 -0
- package/dist/vendor/account/engine.js +3 -3
- package/dist/vendor/account/index.js +14 -45
- package/dist/vendor/account/resolve-account.js +44 -0
- package/dist/vendor/account/schema.js +1 -1
- package/dist/vendor/account/user.js +99 -0
- package/dist/vendor/config/client-config.js +1 -1
- package/dist/vendor/config/company.js +46 -14
- package/dist/vendor/config/defaults.js +30 -7
- package/dist/vendor/config/edit.js +25 -3
- package/dist/vendor/config/env-delivery.js +1 -1
- package/dist/vendor/config/env-schema.js +3 -6
- package/dist/vendor/config/env.js +34 -22
- package/dist/vendor/config/environment.js +11 -30
- package/dist/vendor/config/index.js +21 -28
- package/dist/vendor/config/load.js +16 -9
- package/dist/vendor/config/platforms.js +1 -1
- package/dist/vendor/config/repo.js +10 -27
- package/dist/vendor/config/schema-client.js +64 -0
- package/dist/vendor/config/schema-cloud.js +38 -0
- package/dist/vendor/config/schema-manager.js +118 -0
- package/dist/vendor/config/schema-overrides.js +68 -0
- package/dist/vendor/config/schema.js +104 -160
- package/dist/vendor/config/site-global.js +2 -3
- package/dist/vendor/config/validate.js +97 -78
- package/dist/vendor/config/winback.js +1 -1
- package/dist/vendor/devkit/actions-secrets.js +1 -1
- package/dist/vendor/devkit/agents-md.js +233 -0
- package/dist/vendor/devkit/attach-log-file.js +16 -2
- package/dist/vendor/devkit/build-json.js +1 -1
- package/dist/vendor/devkit/ci-workflows.js +30 -30
- package/dist/vendor/devkit/cli-router.js +16 -11
- package/dist/vendor/devkit/defaults-engine.js +15 -51
- package/dist/vendor/devkit/deploy-snapshot.js +44 -9
- package/dist/vendor/devkit/env-lines.js +183 -0
- package/dist/vendor/devkit/local.js +64 -10
- package/dist/vendor/devkit/lockfile.js +32 -13
- package/dist/vendor/devkit/logger.js +7 -2
- package/dist/vendor/devkit/merge-line-files.js +219 -177
- package/dist/vendor/devkit/omega-bin.js +208 -111
- package/dist/vendor/devkit/preludes/docs-sync.js +52 -0
- package/dist/vendor/devkit/preludes/index.js +1 -0
- package/dist/vendor/devkit/target-picker.js +45 -0
- package/dist/vendor/devkit/test/dashed-files.js +37 -0
- package/dist/vendor/devkit/test/run-verb-under-tee.js +71 -0
- package/dist/vendor/devkit/test/runner-core.js +6 -6
- package/dist/vendor/devkit/update.js +15 -15
- package/dist/vendor/devkit/verb-scripts.js +40 -0
- package/dist/vendor/devkit/verbs.js +170 -0
- package/dist/vendor/monitoring/env.js +2 -2
- package/dist/vendor/monitoring/index.js +1 -1
- package/dist/vendor/monitoring/main.js +1 -1
- package/dist/vendor/monitoring/preload.js +1 -1
- package/dist/vendor/monitoring/renderer.js +1 -1
- package/package.json +19 -26
- package/dist/commands/install.js +0 -37
- package/dist/defaults/AGENTS.md +0 -110
- package/dist/defaults/CLAUDE.md +0 -1
- package/dist/lib/client-bridge.js +0 -374
- package/dist/lib/logger.js +0 -4
- package/dist/test/suites/build/manager.test.js +0 -213
- package/dist/test/suites/main/client-bridge.test.js +0 -262
- package/dist/vendor/config/env-retired.js +0 -137
- package/dist/vendor/config/retired-keys.js +0 -635
- package/docs/analytics.md +0 -140
- package/docs/app-state.md +0 -92
- package/docs/audit.md +0 -69
- package/docs/auto-updater.md +0 -243
- package/docs/boot-sequence.md +0 -39
- package/docs/build-system.md +0 -169
- package/docs/cdp-debugging.md +0 -169
- package/docs/client-bridge.md +0 -269
- package/docs/common-mistakes.md +0 -21
- package/docs/config-schema.md +0 -120
- package/docs/context-menu.md +0 -112
- package/docs/context.md +0 -81
- package/docs/css.md +0 -90
- package/docs/deep-link.md +0 -186
- package/docs/environment-detection.md +0 -112
- package/docs/fontawesome.md +0 -107
- package/docs/hooks.md +0 -89
- package/docs/icons.md +0 -79
- package/docs/index.md +0 -317
- package/docs/installer-options.md +0 -165
- package/docs/ipc.md +0 -61
- package/docs/lib-modules.md +0 -53
- package/docs/logging.md +0 -229
- package/docs/menu.md +0 -160
- package/docs/releasing.md +0 -239
- package/docs/remote-config.md +0 -118
- package/docs/remote-scripts.md +0 -144
- package/docs/restart-manager.md +0 -144
- package/docs/runner.md +0 -290
- package/docs/sentry.md +0 -97
- package/docs/shared/agent-docs.md +0 -89
- package/docs/shared/analytics.md +0 -612
- package/docs/shared/brands.md +0 -57
- package/docs/shared/breaking-changes.md +0 -851
- package/docs/shared/config.md +0 -1952
- package/docs/shared/deploys.md +0 -341
- package/docs/shared/icons.md +0 -219
- package/docs/shared/local-dev.md +0 -167
- package/docs/shared/logging.md +0 -205
- package/docs/shared/monitoring.md +0 -167
- package/docs/shared/publishing.md +0 -187
- package/docs/shared/rulings.md +0 -34
- package/docs/shared/testing.md +0 -147
- package/docs/shared/theming.md +0 -629
- package/docs/shared/translation.md +0 -333
- package/docs/shared/updates.md +0 -61
- package/docs/signing.md +0 -293
- package/docs/startup.md +0 -142
- package/docs/storage.md +0 -59
- package/docs/templating.md +0 -101
- package/docs/test-boot-layer.md +0 -157
- package/docs/test-framework.md +0 -362
- package/docs/themes.md +0 -149
- package/docs/tooltips.md +0 -99
- package/docs/tray.md +0 -164
- package/docs/usage.md +0 -58
- package/docs/verts.md +0 -62
- package/docs/windows.md +0 -149
|
@@ -28,14 +28,14 @@
|
|
|
28
28
|
// 60s heartbeats reconnect through the fresh runtime.json afterwards.
|
|
29
29
|
//
|
|
30
30
|
// Bail conditions (any one → the lib schedules nothing):
|
|
31
|
-
// -
|
|
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)
|
|
35
35
|
// - config.restartManager.enabled === false
|
|
36
36
|
// - non-production without OMEGA_RESTART_MANAGER_DEV=1 (dev noise guard)
|
|
37
37
|
//
|
|
38
|
-
// Full reference: docs/restart-manager.md.
|
|
38
|
+
// Full reference: docs/desktop/restart-manager.md.
|
|
39
39
|
|
|
40
40
|
const path = require('path');
|
|
41
41
|
const fs = require('fs');
|
|
@@ -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
|
-
|
|
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(
|
|
91
|
+
initialize(omega) {
|
|
92
92
|
if (restartManager._initialized) return;
|
|
93
93
|
restartManager._initialized = true;
|
|
94
|
-
restartManager.
|
|
94
|
+
restartManager._omega = omega;
|
|
95
95
|
|
|
96
|
-
const cfg =
|
|
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 =
|
|
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 (
|
|
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 (
|
|
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 (!
|
|
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 =
|
|
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
|
|
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 (
|
|
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
|
|
201
|
+
const omega = restartManager._omega;
|
|
202
202
|
const res = await restartManager._post(protocol.ENDPOINTS.deregister, {
|
|
203
|
-
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
|
|
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 (
|
|
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:
|
|
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
|
|
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 (
|
|
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.
|
|
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
|
|
444
|
+
const omega = restartManager._omega;
|
|
445
445
|
const { app } = require('electron');
|
|
446
446
|
return protocol.buildRegisterPayload({
|
|
447
|
-
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:
|
|
452
|
-
environment:
|
|
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
|
|
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 =
|
|
527
|
-
if (
|
|
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(() =>
|
|
535
|
+
restartManager._quitFlush().finally(() => omega.quit({ force: true }));
|
|
536
536
|
},
|
|
537
537
|
|
|
538
538
|
async _quitFlush() {
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
// the same machine from running installers concurrently; RM itself ignores it.
|
|
20
20
|
//
|
|
21
21
|
// Pure helpers (parseFeed, pickArtifact, URL builders) are exported individually
|
|
22
|
-
// for build-layer tests. See docs/restart-manager.md.
|
|
22
|
+
// for build-layer tests. See docs/desktop/restart-manager.md.
|
|
23
23
|
|
|
24
24
|
const path = require('path');
|
|
25
25
|
const fs = require('fs');
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
// storage-persisted, so they survive the update relaunch). @omega.js/desktop's lib only ever
|
|
30
30
|
// installs RM when it's missing.
|
|
31
31
|
//
|
|
32
|
-
// Full reference: docs/restart-manager.md.
|
|
32
|
+
// Full reference: docs/desktop/restart-manager.md.
|
|
33
33
|
|
|
34
34
|
const path = require('path');
|
|
35
35
|
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
const { spawnSync } = require('child_process');
|
|
14
14
|
const { execute } = require('node-powertools');
|
|
15
15
|
|
|
16
|
-
const logger =
|
|
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 =
|
|
24
|
+
const logger = require('../../build.js').logger('sign-events');
|
|
25
25
|
|
|
26
26
|
function resolveLogPath(env, platform) {
|
|
27
27
|
env = env || process.env;
|
package/dist/lib/startup.js
CHANGED
|
@@ -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 `
|
|
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 `
|
|
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
|
-
|
|
42
|
+
_omega: null,
|
|
39
43
|
_electron: null,
|
|
40
44
|
|
|
41
|
-
initialize(
|
|
45
|
+
initialize(omega) {
|
|
42
46
|
if (startup._initialized) {
|
|
43
47
|
return;
|
|
44
48
|
}
|
|
45
49
|
|
|
46
|
-
startup.
|
|
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
|
-
|
|
80
|
-
|
|
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(`
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
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;
|
package/dist/lib/storage.js
CHANGED
|
@@ -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
|
-
//
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
//
|
|
8
|
-
//
|
|
9
|
-
//
|
|
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
|
-
|
|
30
|
+
_omega: null,
|
|
31
31
|
_store: null,
|
|
32
32
|
_changeSubs: {}, // key -> Set<fn>
|
|
33
33
|
_ipcRegistered: false,
|
|
34
34
|
|
|
35
|
-
async initialize(
|
|
35
|
+
async initialize(omega) {
|
|
36
36
|
if (storage._initialized) {
|
|
37
37
|
return;
|
|
38
38
|
}
|
|
39
39
|
|
|
40
|
-
storage.
|
|
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 =
|
|
61
|
+
const projectName = omega.config.app?.productName || electron.app.getName();
|
|
62
62
|
|
|
63
63
|
storage._store = new ElectronStore({
|
|
64
64
|
name: 'omega-storage',
|
package/dist/lib/templating.js
CHANGED
|
@@ -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 `{{ }}
|
|
5
|
-
// - Standard variable scope built from
|
|
4
|
+
// - Brackets are `{{ }}`.
|
|
5
|
+
// - Standard variable scope built from omega.config + page metadata.
|
|
6
6
|
//
|
|
7
7
|
// Public API:
|
|
8
|
-
//
|
|
9
|
-
//
|
|
10
|
-
//
|
|
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
|
-
//
|
|
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
|
-
|
|
25
|
+
_omega: null,
|
|
26
26
|
|
|
27
|
-
initialize(
|
|
28
|
-
templating.
|
|
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
|
|
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
|
-
// `
|
|
43
|
-
//
|
|
44
|
-
buildPageVars(pageName, extras,
|
|
45
|
-
|
|
46
|
-
const cfg = (
|
|
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 = (
|
|
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
|
-
//
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
//
|
|
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
|
-
|
|
41
|
+
_omega: null,
|
|
42
42
|
_nativeTheme: null,
|
|
43
43
|
_listeners: new Set(),
|
|
44
44
|
_lastEmitted: null,
|
|
45
45
|
_onNativeUpdated: null,
|
|
46
46
|
|
|
47
|
-
initialize(
|
|
47
|
+
initialize(omega) {
|
|
48
48
|
if (theme._initialized) {
|
|
49
49
|
return;
|
|
50
50
|
}
|
|
51
51
|
|
|
52
|
-
theme.
|
|
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 =
|
|
69
|
-
const configured =
|
|
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.
|
|
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
|