- DB: migration #10 (sessions.archived_at + index), helpers archive/unarchive/archiveExpired (soft-archive, jamais de DELETE) - core/retention-settings.ts: session_retention_days (défaut 30, 0=jamais, 1-3650) + session_purge_days (off) - core/session-archive.ts: scheduler start/stop/sweep (calqué DiscoveryService), câblé dans runDaemon - pty-manager.list({includeArchived}) + SessionSummary.archived + emitHistoricalUpdate - routes: GET /sessions?includeArchived, POST/DELETE /sessions/:id/archive, POST /sessions/archive-now - protocole additif: message WS session_archived (relayé par la gateway, abonnés 'sessions') - settings: retentionDays/purgeDays exposés et validés dans PATCH /settings - web: store sessions (showArchived + archive/unarchive), SessionsListView (toggle/badge/actions), SettingsView (slider rétention), i18n EN+FR - tests: retention-settings + session-archive (vitest) + settings-routes étendu ; acceptance-p10.mjs (sweep, event WS, resume d'une session archivée → 201, rétention=0)
45 lines
1.6 KiB
TypeScript
45 lines
1.6 KiB
TypeScript
import { defineStore } from 'pinia';
|
|
import { ref } from 'vue';
|
|
import type { ServerInfo, SettingsResponse, UpdateSettingsRequest } from '@arboretum/shared';
|
|
import { api } from '../lib/api';
|
|
|
|
// Réglages serveur (découverte des dépôts, infos serveur).
|
|
// Les préférences purement client (langue) restent gérées par l'i18n/localStorage.
|
|
export const useSettingsStore = defineStore('settings', () => {
|
|
const server = ref<ServerInfo | null>(null);
|
|
const scanRoots = ref<string[]>([]);
|
|
const scanIntervalMin = ref(0);
|
|
const claudeBinPath = ref<string | null>(null);
|
|
const claudeHome = ref<string | null>(null);
|
|
const retentionDays = ref(0);
|
|
const purgeDays = ref(0);
|
|
const loaded = ref(false);
|
|
const saving = ref(false);
|
|
|
|
function apply(res: SettingsResponse): void {
|
|
server.value = res.server;
|
|
scanRoots.value = res.settings.scanRoots;
|
|
scanIntervalMin.value = res.settings.scanIntervalMin;
|
|
claudeBinPath.value = res.settings.claudeBinPath;
|
|
claudeHome.value = res.settings.claudeHome;
|
|
retentionDays.value = res.settings.retentionDays;
|
|
purgeDays.value = res.settings.purgeDays;
|
|
loaded.value = true;
|
|
}
|
|
|
|
async function fetch(): Promise<void> {
|
|
apply(await api.get<SettingsResponse>('/api/v1/settings'));
|
|
}
|
|
|
|
async function save(patch: UpdateSettingsRequest): Promise<void> {
|
|
saving.value = true;
|
|
try {
|
|
apply(await api.patch<SettingsResponse>('/api/v1/settings', patch));
|
|
} finally {
|
|
saving.value = false;
|
|
}
|
|
}
|
|
|
|
return { server, scanRoots, scanIntervalMin, claudeBinPath, claudeHome, retentionDays, purgeDays, loaded, saving, fetch, save };
|
|
});
|