feat: Telegram fleet alerts, forge sigil scramble, UI polish, agent ops
- Calibrate: per-event Telegram/SMTP toggles, test notification, chat ID help - Notify on agent connect/reconnect, offline/hashrate/rejection, forge complete - Sigil scramble post-forge uniquification and Dispense Reveal ceremony - Full system check, desktop push, BITS/host-binary persistence, Path Tracer - Dashboard/Crucible visual polish, haptics, sacred geometry, mobile nav - README documents alerts, sigil scramble, and pack-usb workflow - USB bundle repacked via pack-usb.bat (AetherForge.exe + synced agent source)
This commit is contained in:
22
server/web/src/visual/visualPrefs.test.ts
Normal file
22
server/web/src/visual/visualPrefs.test.ts
Normal file
@@ -0,0 +1,22 @@
|
||||
/**
|
||||
* @vitest-environment happy-dom
|
||||
*/
|
||||
import { describe, it, expect, beforeEach } from 'vitest';
|
||||
import { loadGlowParticlesEnabled, saveGlowParticlesEnabled } from './visualPrefs';
|
||||
|
||||
describe('visualPrefs', () => {
|
||||
beforeEach(() => {
|
||||
localStorage.clear();
|
||||
});
|
||||
|
||||
it('defaults glow particles to on', () => {
|
||||
expect(loadGlowParticlesEnabled()).toBe(true);
|
||||
});
|
||||
|
||||
it('persists glow toggle', () => {
|
||||
saveGlowParticlesEnabled(false);
|
||||
expect(loadGlowParticlesEnabled()).toBe(false);
|
||||
saveGlowParticlesEnabled(true);
|
||||
expect(loadGlowParticlesEnabled()).toBe(true);
|
||||
});
|
||||
});
|
||||
26
server/web/src/visual/visualPrefs.ts
Normal file
26
server/web/src/visual/visualPrefs.ts
Normal file
@@ -0,0 +1,26 @@
|
||||
const GLOW_KEY = 'aetherforge-glow-particles';
|
||||
|
||||
export function loadGlowParticlesEnabled(): boolean {
|
||||
try {
|
||||
const v = localStorage.getItem(GLOW_KEY);
|
||||
if (v === '0') return false;
|
||||
if (v === '1') return true;
|
||||
} catch {
|
||||
/* ignore */
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
export function saveGlowParticlesEnabled(enabled: boolean): void {
|
||||
try {
|
||||
localStorage.setItem(GLOW_KEY, enabled ? '1' : '0');
|
||||
} catch {
|
||||
/* ignore */
|
||||
}
|
||||
}
|
||||
|
||||
export const VISUAL_PREFS_EVENT = 'aetherforge-visual-prefs';
|
||||
|
||||
export function dispatchVisualPrefsChange(): void {
|
||||
window.dispatchEvent(new CustomEvent(VISUAL_PREFS_EVENT));
|
||||
}
|
||||
Reference in New Issue
Block a user