diff --git a/package-lock.json b/package-lock.json
index fb02de33..c22ee038 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -23,7 +23,7 @@
"@kamiya4047/eslint-plugin-pretty-import": "^0.1.6",
"@pinia/testing": "^1.0.3",
"@sentry/vite-plugin": "^4.9.1",
- "@sentry/vue": "^10.43.0",
+ "@sentry/vue": "^10.44.0",
"@sigma/edge-curve": "^3.1.0",
"@sigma/node-border": "^3.0.0",
"@tailwindcss/vite": "^4.2.1",
@@ -42,7 +42,7 @@
"cross-env": "^10.1.0",
"dayjs": "^1.11.20",
"echarts": "^6.0.0",
- "electron": "^39.8.2",
+ "electron": "^39.8.3",
"electron-builder": "^26.8.1",
"embla-carousel-vue": "^8.6.0",
"eslint": "^9.39.4",
@@ -2903,54 +2903,54 @@
"license": "MIT"
},
"node_modules/@sentry-internal/browser-utils": {
- "version": "10.43.0",
- "resolved": "https://registry.npmjs.org/@sentry-internal/browser-utils/-/browser-utils-10.43.0.tgz",
- "integrity": "sha512-8zYTnzhAPvNkVH1Irs62wl0J/c+0QcJ62TonKnzpSFUUD3V5qz8YDZbjIDGfxy+1EB9fO0sxtddKCzwTHF/MbQ==",
+ "version": "10.44.0",
+ "resolved": "https://registry.npmjs.org/@sentry-internal/browser-utils/-/browser-utils-10.44.0.tgz",
+ "integrity": "sha512-z9xz3T/v+MnfHY6kdUCmOZI8CiAl3LlKYtGH2p3rAsrxhwX+BTnUp01VhMVnEZIDgUXNt3AhJac+4kcDIPu1Hg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@sentry/core": "10.43.0"
+ "@sentry/core": "10.44.0"
},
"engines": {
"node": ">=18"
}
},
"node_modules/@sentry-internal/feedback": {
- "version": "10.43.0",
- "resolved": "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-10.43.0.tgz",
- "integrity": "sha512-YoXuwluP6eOcQxTeTtaWb090++MrLyWOVsUTejzUQQ6LFL13Jwt+bDPF1kvBugMq4a7OHw/UNKQfd6//rZMn2g==",
+ "version": "10.44.0",
+ "resolved": "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-10.44.0.tgz",
+ "integrity": "sha512-yNS2EGK1bNm8YUI+Orzpa7yr05Da+b1VEe/9x7dl7gTjw/+tfutoXlG6Y+iFZBB3gQ9QU+nxZAhU+KcxiPEURw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@sentry/core": "10.43.0"
+ "@sentry/core": "10.44.0"
},
"engines": {
"node": ">=18"
}
},
"node_modules/@sentry-internal/replay": {
- "version": "10.43.0",
- "resolved": "https://registry.npmjs.org/@sentry-internal/replay/-/replay-10.43.0.tgz",
- "integrity": "sha512-khCXlGrlH1IU7P5zCEAJFestMeH97zDVCekj8OsNNDtN/1BmCJ46k6Xi0EqAUzdJgrOLJeLdoYdgtiIjovZ8Sg==",
+ "version": "10.44.0",
+ "resolved": "https://registry.npmjs.org/@sentry-internal/replay/-/replay-10.44.0.tgz",
+ "integrity": "sha512-KDmoqBsRmkaoc+eKLR2CbScd2eBmLcw+1+D441lLttAO3WWhvYyCaYdu/HIGGUoybuSgt+IcpCJdi7hFuCvYqw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@sentry-internal/browser-utils": "10.43.0",
- "@sentry/core": "10.43.0"
+ "@sentry-internal/browser-utils": "10.44.0",
+ "@sentry/core": "10.44.0"
},
"engines": {
"node": ">=18"
}
},
"node_modules/@sentry-internal/replay-canvas": {
- "version": "10.43.0",
- "resolved": "https://registry.npmjs.org/@sentry-internal/replay-canvas/-/replay-canvas-10.43.0.tgz",
- "integrity": "sha512-ZIw1UNKOFXo1LbPCJPMAx9xv7D8TMZQusLDUgb6BsPQJj0igAuwd7KRGTkjjgnrwBp2O/sxcQFRhQhknWk7QPg==",
+ "version": "10.44.0",
+ "resolved": "https://registry.npmjs.org/@sentry-internal/replay-canvas/-/replay-canvas-10.44.0.tgz",
+ "integrity": "sha512-RA7XgYZWHY7M+vaHvuMxDFT51wCs4puS2smElM5oh+j3YqbFXY7P16fOCwIAGoyI4gVsj8aTeBgVqUmrmzhAXQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@sentry-internal/replay": "10.43.0",
- "@sentry/core": "10.43.0"
+ "@sentry-internal/replay": "10.44.0",
+ "@sentry/core": "10.44.0"
},
"engines": {
"node": ">=18"
@@ -2967,17 +2967,17 @@
}
},
"node_modules/@sentry/browser": {
- "version": "10.43.0",
- "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-10.43.0.tgz",
- "integrity": "sha512-2V3I3sXi3SMeiZpKixd9ztokSgK27cmvsD9J5oyOyjhGLTW/6QKCwHbKnluMgQMXq20nixQk5zN4wRjRUma3sg==",
+ "version": "10.44.0",
+ "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-10.44.0.tgz",
+ "integrity": "sha512-UpMx5forbVKieNULma3gT2SsLYqsYT4nLXa6s1io/Y8BFej9sH2dD5ExA8TrkQThQwAWFI3qKsQzYnF+EX/Bfg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@sentry-internal/browser-utils": "10.43.0",
- "@sentry-internal/feedback": "10.43.0",
- "@sentry-internal/replay": "10.43.0",
- "@sentry-internal/replay-canvas": "10.43.0",
- "@sentry/core": "10.43.0"
+ "@sentry-internal/browser-utils": "10.44.0",
+ "@sentry-internal/feedback": "10.44.0",
+ "@sentry-internal/replay": "10.44.0",
+ "@sentry-internal/replay-canvas": "10.44.0",
+ "@sentry/core": "10.44.0"
},
"engines": {
"node": ">=18"
@@ -3178,9 +3178,9 @@
}
},
"node_modules/@sentry/core": {
- "version": "10.43.0",
- "resolved": "https://registry.npmjs.org/@sentry/core/-/core-10.43.0.tgz",
- "integrity": "sha512-l0SszQAPiQGWl/ferw8GP3ALyHXiGiRKJaOvNmhGO+PrTQyZTZ6OYyPnGijAFRg58dE1V3RCH/zw5d2xSUIiNg==",
+ "version": "10.44.0",
+ "resolved": "https://registry.npmjs.org/@sentry/core/-/core-10.44.0.tgz",
+ "integrity": "sha512-aa7CiDaNFZvHpqd97LJhuskolfJ/4IH5xyuVVLnv7l6B0v9KTwskPUxb0tH1ej3FxuzfH+i8iTiTFuqpfHS3QA==",
"dev": true,
"license": "MIT",
"engines": {
@@ -3202,14 +3202,14 @@
}
},
"node_modules/@sentry/vue": {
- "version": "10.43.0",
- "resolved": "https://registry.npmjs.org/@sentry/vue/-/vue-10.43.0.tgz",
- "integrity": "sha512-PYBJVHfd7JwnQv92sTnsfLVNwVEKY2wQzXt9aux6QNcKh4g3pyK68PoEBrcCSEHpUb7zs3lJedk3+aeX+kN7fw==",
+ "version": "10.44.0",
+ "resolved": "https://registry.npmjs.org/@sentry/vue/-/vue-10.44.0.tgz",
+ "integrity": "sha512-XAjvUPhfqkEULt3kly4fSmwQ7fi9XuBWU8Hq9Fme3WN3Ti5q1lTqFBvxlpGeUDKzb2g/J9NVRq9G10m7d438Fg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@sentry/browser": "10.43.0",
- "@sentry/core": "10.43.0"
+ "@sentry/browser": "10.44.0",
+ "@sentry/core": "10.44.0"
},
"engines": {
"node": ">=18"
@@ -6489,9 +6489,9 @@
}
},
"node_modules/electron": {
- "version": "39.8.2",
- "resolved": "https://registry.npmjs.org/electron/-/electron-39.8.2.tgz",
- "integrity": "sha512-uwNJHeqm8pzQEZf/KX4XM1fJctZpHcA0Za/MlP9mOg0FAWHbKo6yRC33QbdfLX7PeNjYZC3I3nnVhE5L2CLqxw==",
+ "version": "39.8.3",
+ "resolved": "https://registry.npmjs.org/electron/-/electron-39.8.3.tgz",
+ "integrity": "sha512-ZhetvWz2qbI2WbBHdK/utR8I5bi1pYWJdit9tP0sGzs42CpsAFyu/FirXE88NWSh+3U8X6Wuf9jjDEYvAyrxNw==",
"dev": true,
"hasInstallScript": true,
"license": "MIT",
diff --git a/package.json b/package.json
index 84498142..f1ca4cda 100644
--- a/package.json
+++ b/package.json
@@ -43,7 +43,7 @@
"@kamiya4047/eslint-plugin-pretty-import": "^0.1.6",
"@pinia/testing": "^1.0.3",
"@sentry/vite-plugin": "^4.9.1",
- "@sentry/vue": "^10.43.0",
+ "@sentry/vue": "^10.44.0",
"@sigma/edge-curve": "^3.1.0",
"@sigma/node-border": "^3.0.0",
"@tailwindcss/vite": "^4.2.1",
@@ -62,7 +62,7 @@
"cross-env": "^10.1.0",
"dayjs": "^1.11.20",
"echarts": "^6.0.0",
- "electron": "^39.8.2",
+ "electron": "^39.8.3",
"electron-builder": "^26.8.1",
"embla-carousel-vue": "^8.6.0",
"eslint": "^9.39.4",
diff --git a/src/components/AvatarInfo.vue b/src/components/AvatarInfo.vue
index 02596387..ac6c01e3 100644
--- a/src/components/AvatarInfo.vue
+++ b/src/components/AvatarInfo.vue
@@ -21,11 +21,9 @@
import { useI18n } from 'vue-i18n';
import { TooltipWrapper } from './ui/tooltip';
- import { useAvatarStore } from '../stores';
import { getAvatarName, showAvatarAuthorDialog } from '../coordinators/avatarCoordinator';
const { t } = useI18n();
- const avatarStore = useAvatarStore();
const props = defineProps({
imageurl: String,
diff --git a/src/stores/auth.js b/src/stores/auth.js
index 9c0e07b5..e8099880 100644
--- a/src/stores/auth.js
+++ b/src/stores/auth.js
@@ -839,8 +839,7 @@ export const useAuthStore = defineStore('Auth', () => {
*/
async function loginComplete() {
await database.initUserTables(userStore.currentUser.id);
- // [Disabled] Avatar DB log auto-cleanup on login
- // advancedSettingsStore.runAvatarAutoCleanup(userStore.currentUser.id);
+ 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 54510223..04efe8e3 100644
--- a/src/stores/settings/advanced.js
+++ b/src/stores/settings/advanced.js
@@ -529,103 +529,100 @@ export const useAdvancedSettingsStore = defineStore('AdvancedSettings', () => {
);
}
- // [Disabled] Avatar DB log cleanup - setAvatarAutoCleanup
- // async function setAvatarAutoCleanup(value) {
- // avatarAutoCleanup.value = value;
- // await configRepository.setString('VRCX_avatarAutoCleanup', value);
- // }
+ 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.
- // */
- // [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;
- // }
- // }
+ /**
+ * @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();
+ }
+
+ 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.
- // */
- // [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);
- // }
- // }
+ /**
+ * 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);
+ }
+ }
async function setSaveInstanceEmoji() {
saveInstanceEmoji.value = !saveInstanceEmoji.value;
@@ -1174,10 +1171,9 @@ export const useAdvancedSettingsStore = defineStore('AdvancedSettings', () => {
setProgressPieFilter,
setShowConfirmationOnSwitchAvatar,
setGameLogDisabled,
- // [Disabled] Avatar DB log cleanup exports
- // setAvatarAutoCleanup,
- // purgeAvatarFeedData,
- // runAvatarAutoCleanup,
+ 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 48e94888..23a83232 100644
--- a/src/views/Settings/components/Tabs/AdvancedTab.vue
+++ b/src/views/Settings/components/Tabs/AdvancedTab.vue
@@ -165,7 +165,6 @@
{{ t('view.settings.advanced.advanced.sqlite_table_size.event') }}
-
+
-
+
@@ -298,16 +296,13 @@