+
diff --git a/src/lib/boss-data.ts b/src/lib/boss-data.ts
index 0412322..3b1a0b8 100644
--- a/src/lib/boss-data.ts
+++ b/src/lib/boss-data.ts
@@ -9630,7 +9630,7 @@ export async function updateUserSettings(settings: Partial) {
};
return state.user.settings;
});
- publishBossEvent("conversation.updated", { deviceId: PRIMARY_CODEX_NODE_ID });
+ publishBossEvent("settings.updated");
return nextSettings;
}
diff --git a/src/lib/boss-events.ts b/src/lib/boss-events.ts
index ee5fac3..e335df6 100644
--- a/src/lib/boss-events.ts
+++ b/src/lib/boss-events.ts
@@ -10,6 +10,7 @@ export type BossEventName =
| "ai_accounts.updated"
| "devices.updated"
| "devices.skills.updated"
+ | "settings.updated"
| "storage.updated"
| "ota.updated";
diff --git a/tests/settings-page-realtime-refresh.test.ts b/tests/settings-page-realtime-refresh.test.ts
new file mode 100644
index 0000000..a5909f0
--- /dev/null
+++ b/tests/settings-page-realtime-refresh.test.ts
@@ -0,0 +1,18 @@
+import test from "node:test";
+import assert from "node:assert/strict";
+import { readFile } from "node:fs/promises";
+
+test("settings page refreshes when user settings change", async () => {
+ const source = await readFile(
+ new URL("../src/app/me/settings/page.tsx", import.meta.url),
+ "utf8",
+ );
+
+ assert.match(source, /import \{ RealtimeRefresh \}/, "expected settings page to import RealtimeRefresh");
+ assert.match(source, / {
+ await setup();
+ await resetSettingsState();
+});
+
+test.after(async () => {
+ if (runtimeRoot) {
+ await rm(runtimeRoot, { recursive: true, force: true });
+ }
+});
+
+test("updateUserSettings publishes settings refresh event", async () => {
+ const events: Array<{ event: string }> = [];
+ const unsubscribe = subscribeBossEvents((event) => {
+ events.push({ event });
+ });
+
+ await updateUserSettings({ liveUpdates: false });
+ unsubscribe();
+
+ assert.equal(events.at(-1)?.event, "settings.updated");
+});