diff --git a/package-lock.json b/package-lock.json
index 0a2d958c..fb02de33 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -77,7 +77,7 @@
"vue-router": "^4.6.4",
"vue-showdown": "^4.2.0",
"vue-sonner": "^2.0.9",
- "worker-timers": "^8.0.30",
+ "worker-timers": "^8.0.31",
"yargs": "^18.0.0",
"zod": "^3.25.76"
},
@@ -530,9 +530,9 @@
}
},
"node_modules/@babel/runtime": {
- "version": "7.28.6",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.6.tgz",
- "integrity": "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==",
+ "version": "7.29.2",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz",
+ "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==",
"dev": true,
"license": "MIT",
"engines": {
@@ -5267,16 +5267,16 @@
}
},
"node_modules/broker-factory": {
- "version": "3.1.13",
- "resolved": "https://registry.npmjs.org/broker-factory/-/broker-factory-3.1.13.tgz",
- "integrity": "sha512-H2VALe31mEtO/SRcNp4cUU5BAm1biwhc/JaF77AigUuni/1YT0FLCJfbUxwIEs9y6Kssjk2fmXgf+Y9ALvmKlw==",
+ "version": "3.1.14",
+ "resolved": "https://registry.npmjs.org/broker-factory/-/broker-factory-3.1.14.tgz",
+ "integrity": "sha512-L45k5HMbPIrMid0nTOZ/UPXG/c0aRuQKVrSDFIb1zOkvfiyHgYmIjc3cSiN1KwQIvRDOtKE0tfb3I9EZ3CmpQQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/runtime": "^7.28.6",
- "fast-unique-numbers": "^9.0.26",
+ "@babel/runtime": "^7.29.2",
+ "fast-unique-numbers": "^9.0.27",
"tslib": "^2.8.1",
- "worker-factory": "^7.0.48"
+ "worker-factory": "^7.0.49"
}
},
"node_modules/broker-factory/node_modules/tslib": {
@@ -7343,13 +7343,13 @@
"license": "MIT"
},
"node_modules/fast-unique-numbers": {
- "version": "9.0.26",
- "resolved": "https://registry.npmjs.org/fast-unique-numbers/-/fast-unique-numbers-9.0.26.tgz",
- "integrity": "sha512-3Mtq8p1zQinjGyWfKeuBunbuFoixG72AUkk4VvzbX4ykCW9Q4FzRaNyIlfQhUjnKw2ARVP+/CKnoyr6wfHftig==",
+ "version": "9.0.27",
+ "resolved": "https://registry.npmjs.org/fast-unique-numbers/-/fast-unique-numbers-9.0.27.tgz",
+ "integrity": "sha512-nDA9ADeINN8SA2u2wCtU+siWFTTDqQR37XvgPIDDmboWQeExz7X0mImxuaN+kJddliIqy2FpVRmnvRZ+j8i1/A==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/runtime": "^7.28.6",
+ "@babel/runtime": "^7.29.2",
"tslib": "^2.8.1"
},
"engines": {
@@ -12364,14 +12364,14 @@
}
},
"node_modules/worker-factory": {
- "version": "7.0.48",
- "resolved": "https://registry.npmjs.org/worker-factory/-/worker-factory-7.0.48.tgz",
- "integrity": "sha512-CGmBy3tJvpBPjUvb0t4PrpKubUsfkI1Ohg0/GGFU2RvA9j/tiVYwKU8O7yu7gH06YtzbeJLzdUR29lmZKn5pag==",
+ "version": "7.0.49",
+ "resolved": "https://registry.npmjs.org/worker-factory/-/worker-factory-7.0.49.tgz",
+ "integrity": "sha512-lW7tpgy6aUv2dFsQhv1yv+XFzdkCf/leoKRTGMPVK5/die6RrUjqgJHJf556qO+ZfytNG6wPXc17E8zzsOLUDw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/runtime": "^7.28.6",
- "fast-unique-numbers": "^9.0.26",
+ "@babel/runtime": "^7.29.2",
+ "fast-unique-numbers": "^9.0.27",
"tslib": "^2.8.1"
}
},
@@ -12383,30 +12383,30 @@
"license": "0BSD"
},
"node_modules/worker-timers": {
- "version": "8.0.30",
- "resolved": "https://registry.npmjs.org/worker-timers/-/worker-timers-8.0.30.tgz",
- "integrity": "sha512-8P7YoMHWN0Tz7mg+9oEhuZdjBIn2z6gfjlJqFcHiDd9no/oLnMGCARCDkV1LR3ccQus62ZdtIp7t3aTKrMLHOg==",
+ "version": "8.0.31",
+ "resolved": "https://registry.npmjs.org/worker-timers/-/worker-timers-8.0.31.tgz",
+ "integrity": "sha512-ngkq5S6JuZyztom8tDgBzorLo9byhBMko/sXfgiUD945AuzKGg1GCgDMCC3NaYkicLpGKXutONM36wEX8UbBCA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/runtime": "^7.28.6",
+ "@babel/runtime": "^7.29.2",
"tslib": "^2.8.1",
- "worker-timers-broker": "^8.0.15",
- "worker-timers-worker": "^9.0.13"
+ "worker-timers-broker": "^8.0.16",
+ "worker-timers-worker": "^9.0.14"
}
},
"node_modules/worker-timers-broker": {
- "version": "8.0.15",
- "resolved": "https://registry.npmjs.org/worker-timers-broker/-/worker-timers-broker-8.0.15.tgz",
- "integrity": "sha512-Te+EiVUMzG5TtHdmaBZvBrZSFNauym6ImDaCAnzQUxvjnw+oGjMT2idmAOgDy30vOZMLejd0bcsc90Axu6XPWA==",
+ "version": "8.0.16",
+ "resolved": "https://registry.npmjs.org/worker-timers-broker/-/worker-timers-broker-8.0.16.tgz",
+ "integrity": "sha512-JyP3AvUGyPGbBGW7XiUewm2+0pN/aYo1QpVf5kdXAfkDZcN3p7NbWrG6XnyDEpDIvfHk/+LCnOW/NsuiU9riYA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/runtime": "^7.28.6",
- "broker-factory": "^3.1.13",
- "fast-unique-numbers": "^9.0.26",
+ "@babel/runtime": "^7.29.2",
+ "broker-factory": "^3.1.14",
+ "fast-unique-numbers": "^9.0.27",
"tslib": "^2.8.1",
- "worker-timers-worker": "^9.0.13"
+ "worker-timers-worker": "^9.0.14"
}
},
"node_modules/worker-timers-broker/node_modules/tslib": {
@@ -12417,15 +12417,15 @@
"license": "0BSD"
},
"node_modules/worker-timers-worker": {
- "version": "9.0.13",
- "resolved": "https://registry.npmjs.org/worker-timers-worker/-/worker-timers-worker-9.0.13.tgz",
- "integrity": "sha512-qjn18szGb1kjcmh2traAdki1eiIS5ikFo+L90nfMOvSRpuDw1hAcR1nzkP2+Hkdqz5thIRnfuWx7QSpsEUsA6Q==",
+ "version": "9.0.14",
+ "resolved": "https://registry.npmjs.org/worker-timers-worker/-/worker-timers-worker-9.0.14.tgz",
+ "integrity": "sha512-/qF06C60sXmSLfUl7WglvrDIbspmPOM8UrG63Dnn4bi2x4/DfqHS/+dxF5B+MdHnYO5tVuZYLHdAodrKdabTIg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/runtime": "^7.28.6",
+ "@babel/runtime": "^7.29.2",
"tslib": "^2.8.1",
- "worker-factory": "^7.0.48"
+ "worker-factory": "^7.0.49"
}
},
"node_modules/worker-timers-worker/node_modules/tslib": {
diff --git a/package.json b/package.json
index b05f4d0a..84498142 100644
--- a/package.json
+++ b/package.json
@@ -97,7 +97,7 @@
"vue-router": "^4.6.4",
"vue-showdown": "^4.2.0",
"vue-sonner": "^2.0.9",
- "worker-timers": "^8.0.30",
+ "worker-timers": "^8.0.31",
"yargs": "^18.0.0",
"zod": "^3.25.76"
},
diff --git a/src/stores/auth.js b/src/stores/auth.js
index e8099880..9c0e07b5 100644
--- a/src/stores/auth.js
+++ b/src/stores/auth.js
@@ -839,7 +839,8 @@ export const useAuthStore = defineStore('Auth', () => {
*/
async function loginComplete() {
await database.initUserTables(userStore.currentUser.id);
- advancedSettingsStore.runAvatarAutoCleanup(userStore.currentUser.id);
+ // [Disabled] Avatar DB log auto-cleanup on login
+ // advancedSettingsStore.runAvatarAutoCleanup(userStore.currentUser.id);
watchState.isLoggedIn = true;
AppApi.CheckGameRunning(); // restore state from hot-reload
}
diff --git a/src/stores/settings/advanced.js b/src/stores/settings/advanced.js
index 73e36282..54510223 100644
--- a/src/stores/settings/advanced.js
+++ b/src/stores/settings/advanced.js
@@ -529,100 +529,103 @@ export const useAdvancedSettingsStore = defineStore('AdvancedSettings', () => {
);
}
- async function setAvatarAutoCleanup(value) {
- avatarAutoCleanup.value = value;
- await configRepository.setString('VRCX_avatarAutoCleanup', value);
- }
+ // [Disabled] Avatar DB log cleanup - setAvatarAutoCleanup
+ // async function setAvatarAutoCleanup(value) {
+ // avatarAutoCleanup.value = value;
+ // await configRepository.setString('VRCX_avatarAutoCleanup', value);
+ // }
- /**
- * @param {number|null} days - Number of days to keep. Null means delete all.
- */
- async function purgeAvatarFeedData(days) {
- let cutoffDate = null;
- if (days !== null) {
- const cutoff = new Date();
- cutoff.setDate(cutoff.getDate() - days);
- cutoffDate = cutoff.toJSON();
- }
+ // /**
+ // * @param {number|null} days - Number of days to keep. Null means delete all.
+ // */
+ // [Disabled] Avatar DB log cleanup - purgeAvatarFeedData
+ // async function purgeAvatarFeedData(days) {
+ // let cutoffDate = null;
+ // if (days !== null) {
+ // const cutoff = new Date();
+ // cutoff.setDate(cutoff.getDate() - days);
+ // cutoffDate = cutoff.toJSON();
+ // }
+ //
+ // purgeInProgress.value = true;
+ // const msgBox = toast.warning(
+ // t(
+ // 'view.settings.advanced.advanced.database_cleanup.purge_in_progress'
+ // ),
+ // { duration: Infinity }
+ // );
+ //
+ // try {
+ // await database.purgeAvatarFeedData(cutoffDate);
+ // await database.vacuum();
+ // toast.dismiss(msgBox);
+ // toast.success(
+ // t(
+ // 'view.settings.advanced.advanced.database_cleanup.purge_complete'
+ // )
+ // );
+ // // Brief delay before restart to show success message
+ // await new Promise((resolve) =>
+ // setTimeout(resolve, 1500)
+ // );
+ // VRCXUpdaterStore.restartVRCX(false);
+ // } catch (err) {
+ // console.error(err);
+ // toast.dismiss(msgBox);
+ // toast.error(t('view.settings.advanced.advanced.database_cleanup.purge_failed', { error: err }));
+ // } finally {
+ // purgeInProgress.value = false;
+ // }
+ // }
- purgeInProgress.value = true;
- const msgBox = toast.warning(
- t(
- 'view.settings.advanced.advanced.database_cleanup.purge_in_progress'
- ),
- { duration: Infinity }
- );
-
- try {
- await database.purgeAvatarFeedData(cutoffDate);
- await database.vacuum();
- toast.dismiss(msgBox);
- toast.success(
- t(
- 'view.settings.advanced.advanced.database_cleanup.purge_complete'
- )
- );
- // Brief delay before restart to show success message
- await new Promise((resolve) =>
- setTimeout(resolve, 1500)
- );
- VRCXUpdaterStore.restartVRCX(false);
- } catch (err) {
- console.error(err);
- toast.dismiss(msgBox);
- toast.error(t('view.settings.advanced.advanced.database_cleanup.purge_failed', { error: err }));
- } finally {
- purgeInProgress.value = false;
- }
- }
-
- /**
- * Run auto-cleanup on startup if configured and enough time has passed.
- * Reads config directly from configRepository to avoid race condition
- * with initAdvancedSettings not having completed yet.
- * @param {string} userId - Current user ID for per-user cleanup tracking.
- */
- async function runAvatarAutoCleanup(userId) {
- const cleanupSetting = await configRepository.getString(
- 'VRCX_avatarAutoCleanup',
- 'Off'
- );
- if (cleanupSetting === 'Off') return;
-
- const configKey = `VRCX_lastAvatarCleanupDate_${userId}`;
- const lastCleanupStr = await configRepository.getString(
- configKey,
- ''
- );
- const now = new Date();
-
- if (lastCleanupStr) {
- const lastCleanup = new Date(lastCleanupStr);
- const daysSinceLastCleanup =
- (now - lastCleanup) / (1000 * 60 * 60 * 24);
- if (daysSinceLastCleanup < 7) return;
- }
-
- const days = parseInt(cleanupSetting, 10);
- if (isNaN(days) || days <= 0) return;
-
- const cutoff = new Date();
- cutoff.setDate(cutoff.getDate() - days);
- const cutoffDate = cutoff.toJSON();
-
- try {
- await database.purgeAvatarFeedData(cutoffDate);
- await configRepository.setString(
- configKey,
- now.toJSON()
- );
- console.log(
- `Auto-cleaned avatar feed data older than ${days} days`
- );
- } catch (err) {
- console.error('Avatar auto-cleanup failed:', err);
- }
- }
+ // /**
+ // * Run auto-cleanup on startup if configured and enough time has passed.
+ // * Reads config directly from configRepository to avoid race condition
+ // * with initAdvancedSettings not having completed yet.
+ // * @param {string} userId - Current user ID for per-user cleanup tracking.
+ // */
+ // [Disabled] Avatar DB log cleanup - runAvatarAutoCleanup
+ // async function runAvatarAutoCleanup(userId) {
+ // const cleanupSetting = await configRepository.getString(
+ // 'VRCX_avatarAutoCleanup',
+ // 'Off'
+ // );
+ // if (cleanupSetting === 'Off') return;
+ //
+ // const configKey = `VRCX_lastAvatarCleanupDate_${userId}`;
+ // const lastCleanupStr = await configRepository.getString(
+ // configKey,
+ // ''
+ // );
+ // const now = new Date();
+ //
+ // if (lastCleanupStr) {
+ // const lastCleanup = new Date(lastCleanupStr);
+ // const daysSinceLastCleanup =
+ // (now - lastCleanup) / (1000 * 60 * 60 * 24);
+ // if (daysSinceLastCleanup < 7) return;
+ // }
+ //
+ // const days = parseInt(cleanupSetting, 10);
+ // if (isNaN(days) || days <= 0) return;
+ //
+ // const cutoff = new Date();
+ // cutoff.setDate(cutoff.getDate() - days);
+ // const cutoffDate = cutoff.toJSON();
+ //
+ // try {
+ // await database.purgeAvatarFeedData(cutoffDate);
+ // await configRepository.setString(
+ // configKey,
+ // now.toJSON()
+ // );
+ // console.log(
+ // `Auto-cleaned avatar feed data older than ${days} days`
+ // );
+ // } catch (err) {
+ // console.error('Avatar auto-cleanup failed:', err);
+ // }
+ // }
async function setSaveInstanceEmoji() {
saveInstanceEmoji.value = !saveInstanceEmoji.value;
@@ -1171,9 +1174,10 @@ export const useAdvancedSettingsStore = defineStore('AdvancedSettings', () => {
setProgressPieFilter,
setShowConfirmationOnSwitchAvatar,
setGameLogDisabled,
- setAvatarAutoCleanup,
- purgeAvatarFeedData,
- runAvatarAutoCleanup,
+ // [Disabled] Avatar DB log cleanup exports
+ // setAvatarAutoCleanup,
+ // purgeAvatarFeedData,
+ // runAvatarAutoCleanup,
setUGCFolderPath,
cropPrintsChanged,
setAutoDeleteOldPrints,
diff --git a/src/views/Settings/components/Tabs/AdvancedTab.vue b/src/views/Settings/components/Tabs/AdvancedTab.vue
index 645707c0..48e94888 100644
--- a/src/views/Settings/components/Tabs/AdvancedTab.vue
+++ b/src/views/Settings/components/Tabs/AdvancedTab.vue
@@ -165,6 +165,7 @@
{{ t('view.settings.advanced.advanced.sqlite_table_size.event') }}
+
+
@@ -294,13 +298,16 @@