dsh-vault 1.9.2 → 1.9.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/client.js +389 -97
- package/lib/client.js.map +1 -1
- package/package.json +1 -1
package/lib/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","names":["css"],"sources":["../src/client/VaultSection.tsx","../src/client/locales.ts","../src/client/index.ts"],"sourcesContent":["/**\n * Vault settings section: list, search, add, edit, delete, and copy encrypted\n * credentials. All mutations go through the host VaultGateway remote; secrets\n * are shown only inside the edit form or a copy action, never in the list.\n */\n\nimport { useCallback, useEffect, useId, useMemo, useRef, useState, type ReactNode } from 'react'\nimport type { PropsLocale, PropsRuntime, InjectFace, TranslateNS } from '@deepseek-ai/dsh-client-ui-slots'\nimport type { VaultLocaleKey } from './locales.ts'\nimport css from './VaultSection.module.css'\n\n/** Wire shapes shared with the host gateway (mirror of src/index.ts types). */\nexport interface VaultSummaryWire {\n id: string\n title: string\n sensitivity?: string\n kind?: string\n username?: string\n email?: string\n phone?: string\n host?: string\n port?: string\n url?: string\n tags?: string[]\n icon?: string\n color?: string\n fields?: Record<string, string>\n createdAt?: number\n updatedAt?: number\n}\n\nexport interface VaultFullWire {\n id: string\n title: string\n kind?: string\n username?: string\n email?: string\n phone?: string\n password?: string\n host?: string\n port?: string\n privateKey?: string\n apiKey?: string\n secret?: string\n accessToken?: string\n refreshToken?: string\n expiresAt?: number\n rotationDays?: number\n sensitivity?: string\n favorite?: boolean\n otpSecret?: string\n url?: string\n notes?: string\n tags?: string[]\n icon?: string\n color?: string\n fields?: Record<string, unknown>\n}\n\n/** Patch shape accepted by vault.add / vault.update. */\nexport type VaultPatch = Partial<Omit<VaultFullWire, 'id'>>\n\n/** Registration-side business face supplied by the plugin entry. */\nexport interface VaultSectionInjected {\n t: TranslateNS<'settings.vault'>\n config: () => Promise<{ accessMode: 'readonly' | 'ask' | 'auto'; autoCapture: boolean; autoLockSeconds: number }>\n setAccessMode: (mode: 'readonly' | 'ask' | 'auto') => Promise<{ accessMode: 'readonly' | 'ask' | 'auto'; autoCapture: boolean; autoLockSeconds: number }>\n setAutoCapture: (enabled: boolean) => Promise<{ accessMode: 'readonly' | 'ask' | 'auto'; autoCapture: boolean; autoLockSeconds: number }>\n setAutoLock: (seconds: number) => Promise<{ seconds: number }>\n list: () => Promise<VaultSummaryWire[]>\n search: (query: string, limit?: number) => Promise<VaultSummaryWire[]>\n get: (id: string) => Promise<{ found: boolean; entry?: VaultFullWire }>\n add: (patch: VaultPatch & { title: string }) => Promise<VaultSummaryWire>\n update: (id: string, patch: VaultPatch) => Promise<{ found: boolean; entry?: VaultSummaryWire }>\n remove: (id: string) => Promise<{ deleted: boolean }>\n purge: (id: string) => Promise<{ purged: boolean }>\n trash: () => Promise<VaultSummaryWire[]>\n rotation: () => Promise<unknown[]>\n history: () => Promise<unknown[]>\n stats: () => Promise<Record<string, unknown>>\n recent: () => Promise<unknown[]>\n backupStatus: () => Promise<{ daysSinceBackup: number; backups: number }>\n backup: (maxBackups?: number) => Promise<{ path: string; kept: number; pruned: number }>\n health: () => Promise<{ weak: unknown[]; reused: unknown[]; strength: { weak: number; fair: number; strong: number }; no2fa: unknown[]; httpSites: unknown[]; score: number; verdict: string }>\n duplicates: () => Promise<{ groups: number }>\n duplicateGroups: () => Promise<Array<Array<{ id: string; title: string }>>>\n status: () => Promise<{ locked: boolean; entries: number }>\n switchVault: (name: string) => Promise<{ switched: boolean; name: string }>\n lock: () => Promise<{ locked: boolean }>\n unlock: () => Promise<{ locked: boolean }>\n totpUri: (id: string) => Promise<{ uri: string }>\n tags: () => Promise<Array<{ name: string; count: number }>>\n renameTag: (from: string, to: string) => Promise<{ renamed: number }>\n generatorHistory: () => Promise<Array<{ password: string; at: number }>>\n backups: (limit?: number) => Promise<Array<{ path: string; at: number; vaultName: string; size: number }>>\n deleteBackup: (path: string) => Promise<{ deleted: boolean; path: string }>\n restoreBackup: (path: string, mode?: string, overwrite?: boolean) => Promise<{ entries: number; safetyBackup: string; note: string; added?: number; skipped?: number; updated?: number }>\n importChrome: (overwrite?: boolean) => Promise<{ added: number; skipped: number; updated: number; note: string }>\n importFirefox: (masterPassword?: string, overwrite?: boolean) => Promise<{ added: number; skipped: number; updated: number; note: string }>\n keychainImport: (options?: { limit?: number; overwrite?: boolean; preview?: boolean; service?: string }) => Promise<{ added: number; skipped: number; updated: number; note: string }>\n import1password: (path: string, overwrite?: boolean, dryRun?: boolean) => Promise<{ added: number; skipped: number; updated: number; note: string }>\n importManagerCsv: (path: string, overwrite?: boolean, dryRun?: boolean) => Promise<{ added: number; skipped: number; updated: number; note: string }>\n importEnpass: (path: string, overwrite?: boolean, dryRun?: boolean) => Promise<{ added: number; skipped: number; updated: number; note: string }>\n importBitwarden: (path: string, overwrite?: boolean, dryRun?: boolean) => Promise<{ added: number; skipped: number; updated: number; note: string }>\n import1pif: (path: string, overwrite?: boolean, dryRun?: boolean) => Promise<{ added: number; skipped: number; updated: number; note: string }>\n importBitwardenEncrypted: (path: string, password: string, overwrite?: boolean, dryRun?: boolean) => Promise<{ added: number; skipped: number; updated: number; note: string }>\n importKeePassXml: (path: string, overwrite?: boolean, dryRun?: boolean) => Promise<{ added: number; skipped: number; updated: number; note: string }>\n importKdbx: (path: string, password?: string, keyfile?: string, overwrite?: boolean, dryRun?: boolean) => Promise<{ added: number; skipped: number; updated: number; note: string }>\n searchSystem: (query: string, source?: string, limit?: number) => Promise<{ matches: Array<{ source: string; name: string; username: string }>; note: string }>\n listVaults: () => Promise<Array<{ name: string; active: boolean }>>\n touch: (id: string) => Promise<{ touched: boolean }>\n setFavorite: (id: string, favorite: boolean) => Promise<{ found: boolean }>\n attachments: (id: string) => Promise<{ found: boolean; attachments: Array<{ name: string; size: number }> }>\n detach: (id: string, name: string) => Promise<{ found: boolean; detached: boolean }>\n verifyAll: () => Promise<Array<{ id: string; title: string; issues: string[] }>>\n breachCheck: (online?: boolean) => Promise<{ checked: number; pwned: Array<{ id: string; title: string; count: number }>; weak: Array<{ id: string; title: string }>; offline: boolean }>\n generatePassword: (options?: { length?: number; lowercase?: boolean; uppercase?: boolean; digits?: boolean; symbols?: boolean; excludeAmbiguous?: boolean; passphrase?: boolean; words?: number; separator?: string; wordDigits?: boolean }) => Promise<{ password: string }>\n strength: (password: string) => Promise<{ score: number; verdict: string; feedback: string; bits: number }>\n templates: () => Promise<Array<{ name: string; kind: string; fields: Record<string, string> }>>\n saveTemplate: (name: string, kind: string, fields: Record<string, string>) => Promise<{ saved: boolean }>\n generateUsername: () => Promise<{ username: string }>\n merge: (fromId: string, toId: string, keepSource?: boolean) => Promise<{ found: boolean }>\n restore: (id: string) => Promise<{ restored: boolean }>\n undeleteAll: () => Promise<{ restored: number }>\n totp: (id: string) => Promise<{ code: string; label?: string; secondsRemaining: number }>\n sessionOpen: (url: string) => Promise<{ sessionId: string; url: string }>\n sessionCollect: (sessionId: string, url?: string) => Promise<{ cookies: unknown[]; count: number }>\n sessionClose: (sessionId: string) => Promise<{ closed: boolean }>\n sessionListOpen: () => Promise<Array<{ sessionId: string; url: string; openedAt: number }>>\n sessionListSaved: () => Promise<Array<{ id: string; title: string; url?: string; cookieCount: number; expiredCount?: number; expiringSoon?: number; updatedAt?: number }>>\n sessionSave: (options: { title: string; cookies: unknown[]; url?: string; overwrite?: boolean }) => Promise<{ saved: number; id: string }>\n sessionExport: (id: string, format?: 'header' | 'netscape' | 'json' | 'playwright') => Promise<{ text: string; cookieCount: number; domains: string[] }>\n sessionGet: (id: string) => Promise<{ id: string; title: string; url?: string; cookies: unknown[]; notes?: string }>\n sessionPrune: (id: string, preview?: boolean) => Promise<{ pruned: number; remaining: number; note: string }>\n vaultRename: (from: string, to: string) => Promise<{ renamed: boolean; from?: string; to?: string; vaults: Array<{ name: string; active: boolean }>; note: string }>\n vaultDelete: (name: string, confirm: boolean) => Promise<{ deleted: boolean; name?: string; active: string; vaults: Array<{ name: string; active: boolean }>; note: string }>\n watchtower: () => Promise<Array<{ id: string; title: string; kind: string; flags: string[]; score: number; verdict: string; bits?: number }>>\n export1pux: (path: string) => Promise<{ path: string; count: number }>\n exportBitwarden: (path: string) => Promise<{ path: string; count: number }>\n recoveryCode: () => Promise<{ code: string; note: string }>\n verifyRecovery: (code: string) => Promise<{ verified: boolean }>\n recoveryStatus: () => Promise<{ set: boolean; issuedAt?: number }>\n}\n\n/** Type-level alias so consumers can reference the wire shapes without values. */\nexport type VaultSectionTypes = {\n entries: VaultSummaryWire[]\n fullEntry: VaultFullWire\n summaryEntry: VaultSummaryWire\n config: { accessMode: 'readonly' | 'ask' | 'auto'; autoCapture: boolean; autoLockSeconds: number }\n accessModes: Array<'readonly' | 'ask' | 'auto'>\n}\n\n/** Full component props assembled by the Settings slot renderer. */\nexport type VaultSectionProps =\n PropsRuntime<'settings.section'>\n & PropsLocale<'settings.vault'>\n & InjectFace<VaultSectionInjected>\n\n/** The editable form fields we render (subset of the full wire). */\ntype FormFields = {\n title?: string | undefined\n kind?: string | undefined\n username?: string | undefined\n email?: string | undefined\n phone?: string | undefined\n password?: string | undefined\n host?: string | undefined\n port?: string | undefined\n privateKey?: string | undefined\n apiKey?: string | undefined\n secret?: string | undefined\n accessToken?: string | undefined\n refreshToken?: string | undefined\n otpSecret?: string | undefined\n cardNumber?: string | undefined\n cardExpiry?: string | undefined\n cardCvv?: string | undefined\n cardHolder?: string | undefined\n url?: string | undefined\n notes?: string | undefined\n icon?: string | undefined\n color?: string | undefined\n expiresAt?: number | undefined\n rotationDays?: number | undefined\n sensitivity?: string | undefined\n favorite?: boolean | undefined\n}\n\nconst FORM_FIELDS: Array<{ key: keyof FormFields; label: VaultLocaleKey }> = [\n { key: 'title', label: 'fieldTitle' },\n { key: 'kind', label: 'fieldKind' },\n { key: 'username', label: 'fieldUsername' },\n { key: 'email', label: 'fieldEmail' },\n { key: 'phone', label: 'fieldPhone' },\n { key: 'password', label: 'fieldPassword' },\n { key: 'host', label: 'fieldHost' },\n { key: 'port', label: 'fieldPort' },\n { key: 'apiKey', label: 'fieldApiKey' },\n { key: 'secret', label: 'fieldSecret' },\n { key: 'accessToken', label: 'fieldAccessToken' },\n { key: 'refreshToken', label: 'fieldRefreshToken' },\n { key: 'otpSecret', label: 'fieldOtpSecret' },\n { key: 'cardNumber', label: 'fieldCardNumber' },\n { key: 'cardExpiry', label: 'fieldCardExpiry' },\n { key: 'cardCvv', label: 'fieldCardCvv' },\n { key: 'cardHolder', label: 'fieldCardHolder' },\n { key: 'url', label: 'fieldUrl' },\n { key: 'notes', label: 'fieldNotes' },\n { key: 'expiresAt', label: 'fieldExpiresAt' },\n { key: 'rotationDays', label: 'fieldRotationDays' },\n { key: 'sensitivity', label: 'fieldSensitivity' },\n { key: 'favorite', label: 'fieldFavorite' },\n { key: 'icon', label: 'fieldIcon' },\n { key: 'color', label: 'fieldColor' },\n]\n\nconst VERDICT_KEYS: Record<string, VaultLocaleKey> = { good: 'verdictGood', fair: 'verdictFair', poor: 'verdictPoor' }\nconst TAB_KEYS: Record<string, VaultLocaleKey> = {\n entries: 'tabEntries', security: 'tabSecurity', transfer: 'tabTransfer',\n backup: 'tabBackup', permissions: 'tabPermissions', sessions: 'tabSessions', trash: 'tabTrash',\n}\nconst VERDICT_KEYS_SHORT: Record<string, VaultLocaleKey> = { weak: 'verdictPoor', fair: 'verdictFair', strong: 'verdictGood', 'very strong': 'verdictGood' }\nconst GEN_OPT_KEYS: Record<string, VaultLocaleKey> = {\n uppercase: 'genOptUppercase', lowercase: 'genOptLowercase', digits: 'genOptDigits',\n symbols: 'genOptSymbols', excludeAmbiguous: 'genOptExcludeAmbiguous',\n}\n\n/** Number of entries matching the current kind/tag filters (for pagination). */\nfunction filteredCount(entries: VaultSummaryWire[], kindFilter: string, tagFilter: string): number {\n return entries.filter(entry => (kindFilter === '' || entry.kind === kindFilter) && (tagFilter === '' || (entry.tags ?? []).includes(tagFilter))).length\n}\n\nconst KIND_KEYS: Record<string, VaultLocaleKey> = {\n login: 'kindLogin',\n ssh: 'kindSsh',\n 'api-key': 'kindApiKey',\n secret: 'kindSecret',\n oauth: 'kindOauth',\n cookie: 'kindCookie',\n card: 'kindCard',\n custom: 'kindCustom',\n}\n\ntype ViewState =\n | { readonly status: 'loading' }\n | { readonly status: 'error'; readonly reason?: string }\n | { readonly status: 'ready'; readonly entries: VaultSummaryWire[] }\n\ntype EditorState =\n | { readonly status: 'closed' }\n | { readonly status: 'creating' }\n | { readonly status: 'editing'; readonly entry: VaultFullWire }\n\nfunction emptyForm(): FormFields {\n return { title: '', kind: 'login', username: '', email: '', phone: '', password: '', host: '', port: '', icon: '', color: '' }\n}\n\n/** Human label for a built-in template name (`builtin:wifi` → Wi-Fi). */\nfunction templateLabel(name: string): string {\n const labels: Record<string, string> = {\n 'builtin:login': 'Login', 'builtin:ssh': 'SSH', 'builtin:api-key': 'API key',\n 'builtin:oauth': 'OAuth', 'builtin:secret': 'Secret', 'builtin:card': 'Card',\n 'builtin:wifi': 'Wi-Fi', 'builtin:server': 'Server', 'builtin:database': 'Database',\n 'builtin:identity': 'Identity', 'builtin:bank': 'Bank account', 'builtin:custom': 'Custom',\n }\n return labels[name] ?? name\n}\n\n/** Render the Vault settings section. */\nexport function VaultSection(props: VaultSectionProps): ReactNode {\n const { t, config, setAccessMode, setAutoCapture, setAutoLock, list, search, get, add, update, remove, purge, trash, rotation, health, duplicates, duplicateGroups, merge, history, stats, backupStatus, backup, recent, restore, undeleteAll, totp, status, switchVault, listVaults, touch, setFavorite, attachments, detach, verifyAll, breachCheck, generatePassword, strength, generateUsername, templates, saveTemplate, lock, totpUri, tags, renameTag, generatorHistory, backups, deleteBackup, restoreBackup, importChrome, importFirefox, import1password, importManagerCsv, importEnpass, importBitwarden, import1pif, importKeePassXml, importKdbx, importBitwardenEncrypted, keychainImport, searchSystem, sessionOpen, sessionCollect, sessionClose, sessionListOpen, sessionListSaved, sessionSave, sessionExport, sessionGet, sessionPrune, vaultRename, vaultDelete, watchtower, export1pux, exportBitwarden, recoveryCode, verifyRecovery, recoveryStatus, unlock } = props\n const searchId = useId()\n const [query, setQuery] = useState('')\n const [state, setState] = useState<ViewState>({ status: 'loading' })\n const [editor, setEditor] = useState<EditorState>({ status: 'closed' })\n const [form, setForm] = useState<FormFields>(emptyForm())\n const [busy, setBusy] = useState(false)\n const [message, setMessage] = useState<string | null>(null)\n const [copiedId, setCopiedId] = useState<string | null>(null)\n const [totpMap, setTotpMap] = useState<Record<string, { code: string; until: number }>>({})\n const [uriMap, setUriMap] = useState<Record<string, string>>({})\n const [tagList, setTagList] = useState<Array<{ name: string; count: number }>>([])\n const [genHistory, setGenHistory] = useState<Array<{ password: string; at: number }>>([])\n const [backupList, setBackupList] = useState<Array<{ path: string; at: number; vaultName: string; size: number }>>([])\n const [openSessions, setOpenSessions] = useState<Array<{ sessionId: string; url: string; openedAt: number }>>([])\n const [savedSessions, setSavedSessions] = useState<Array<{ id: string; title: string; url?: string; cookieCount: number; expiredCount?: number; expiringSoon?: number; updatedAt?: number }>>([])\n const [sessionUrl, setSessionUrl] = useState('')\n const [sessionTitle, setSessionTitle] = useState('')\n const [sessionDetail, setSessionDetail] = useState<{ id: string; title: string; url?: string; cookies: unknown[]; notes?: string } | null>(null)\n const [watchMap, setWatchMap] = useState<Record<string, { score: number; verdict: string; flags: string[] }>>({})\n const [sessionPaste, setSessionPaste] = useState('')\n const [sessionPasteTitle, setSessionPasteTitle] = useState('')\n const [sysQuery, setSysQuery] = useState('')\n const [sysMatches, setSysMatches] = useState<Array<{ source: string; name: string; username: string }>>([])\n const [nowTick, setNowTick] = useState(Date.now())\n const [tagsDraft, setTagsDraft] = useState('')\n const [fieldsDraft, setFieldsDraft] = useState('')\n const [revealed, setRevealed] = useState<Record<string, boolean>>({})\n const [genOpts, setGenOpts] = useState<{ length: number; uppercase: boolean; lowercase: boolean; digits: boolean; symbols: boolean; excludeAmbiguous: boolean; passphrase: boolean; words: number; separator: string; wordDigits: boolean }>({ length: 24, uppercase: true, lowercase: true, digits: true, symbols: true, excludeAmbiguous: false, passphrase: false, words: 4, separator: '-', wordDigits: true })\n const [showGenOpts, setShowGenOpts] = useState(false)\n const [pwStrength, setPwStrength] = useState<{ score: number; verdict: string } | null>(null)\n const [tplList, setTplList] = useState<Array<{ name: string; kind: string; fields: Record<string, string> }>>([])\n const [kindFilter, setKindFilter] = useState('')\n const [tagFilter, setTagFilter] = useState('')\n const [expandedId, setExpandedId] = useState<string | null>(null)\n const [attachmentsMap, setAttachmentsMap] = useState<Record<string, Array<{ name: string; size: number }>>>({})\n const [visibleCount, setVisibleCount] = useState(50)\n const [sortBy, setSortBy] = useState<'alpha' | 'recent' | 'created' | 'favorite' | 'smart'>('alpha')\n const [activeTab, setActiveTab] = useState<'entries' | 'security' | 'transfer' | 'backup' | 'permissions' | 'sessions' | 'trash'>('entries')\n const [policy, setPolicy] = useState<{ accessMode: 'readonly' | 'ask' | 'auto'; autoCapture: boolean; autoLockSeconds: number } | null>(null)\n const [trashEntries, setTrashEntries] = useState<VaultSummaryWire[]>([])\n const [report, setReport] = useState<{ rotation: unknown[]; weak: unknown[]; reused: unknown[]; strength: { weak: number; fair: number; strong: number } | null; no2fa: unknown[]; httpSites: unknown[]; score: number; verdict: string } | null>(null)\n const [dueMap, setDueMap] = useState<Record<string, { due: string; daysLeft: number }>>({})\n const [recentEvents, setRecentEvents] = useState<Array<Record<string, unknown>>>([])\n const [vaultStats, setVaultStats] = useState<Record<string, unknown> | null>(null)\n const [backupInfo, setBackupInfo] = useState<{ daysSinceBackup: number; backups: number } | null>(null)\n const [recentEntries, setRecentEntries] = useState<Array<Record<string, unknown>>>([])\n const [dupGroups, setDupGroups] = useState<number>(0)\n const [dupList, setDupList] = useState<Array<Array<{ id: string; title: string }>>>([])\n const [locked, setLocked] = useState(false)\n const [vaults, setVaults] = useState<Array<{ name: string; active: boolean; entries?: number }>>([])\n const [audit, setAudit] = useState<Array<{ id: string; title: string; issues: string[] }>>([])\n const [breach, setBreach] = useState<{ checked: number; pwned: Array<{ id: string; title: string; count: number }>; weak: Array<{ id: string; title: string }>; offline: boolean } | null>(null)\n\n const readonly = policy?.accessMode === 'readonly'\n\n /** Format a byte count for display (e.g. 1536 → \"1.5 KB\"). */\n function formatSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`\n }\n\n /** Turn an RPC/Error failure into a specific, localized message instead of\n * the generic \"operation failed\" copy. The RPC channel wraps errors as\n * `vault.<method> failed: <code>: <message>`; unwrap and map the common\n * host-side failures to friendly copy, falling back to the raw detail. */\n function errText(err: unknown): string {\n const raw = err instanceof Error ? err.message : String(err ?? '')\n const clean = raw.replace(/^vault\\.[a-z]+ failed: [^:]+: /i, '')\n if (/vault is locked/i.test(clean)) return t('errLocked')\n if (/title must not be empty/i.test(clean)) return t('errTitleEmpty')\n if (/invalid vault name/i.test(clean)) return t('errInvalidVaultName')\n if (/disabled in readonly mode/i.test(clean)) return t('errReadonly')\n if (clean.length === 0) return t('error')\n return t('errDetail').replace('{detail}', clean)\n }\n\n /** Format an auto-lock timeout (seconds) for display: 90 → \"1m 30s\". */\n function formatAutoLock(seconds: number): string {\n if (seconds <= 0) return '0'\n const m = Math.floor(seconds / 60)\n const s = seconds % 60\n if (m === 0) return `${s}s`\n if (s === 0) return `${m}m`\n return `${m}m ${s}s`\n }\n\n // Suggest an icon from the URL domain (1Password-style visual hint).\n useEffect(() => {\n const url = form.url ?? ''\n if (url.length === 0 || (form.icon ?? '').length > 0) return\n const host = url.replace(/^https?:\\/\\//i, '').split('/')[0]!.toLowerCase()\n const map: Record<string, string> = {\n github: '🐙', gitlab: '🦊', google: '🔎', 'google.com': '🔎', amazon: '📦', apple: '',\n aws: '☁️', azure: '☁️', digitalocean: '🐳', docker: '🐳', npm: '📦', figma: '🎨',\n notion: '📝', slack: '💬', discord: '🎮', twitter: '🐦', facebook: '👥', instagram: '📷',\n linkedin: '💼', youtube: '▶️', netflix: '🎬', spotify: '🎵', dropbox: '📁', drive: '🗂️',\n }\n const hostBase = host.split('.')[0] ?? ''\n const icon = map[host] ?? map[hostBase] ?? ''\n if (icon) setForm(previous => ({ ...previous, icon }))\n }, [form.url, form.icon])\n useEffect(() => {\n const pw = form.password ?? ''\n if (pw.length === 0) { setPwStrength(null); return }\n const timer = window.setTimeout(() => {\n void strength(pw).then(\n r => setPwStrength({ score: r.score, verdict: r.verdict }),\n () => setPwStrength(null),\n )\n }, 250)\n return () => window.clearTimeout(timer)\n }, [form.password, strength])\n\n /** Apply a template's field values to the current form. The form is reset\n * to its empty state first (so fields the template does not set are cleared\n * rather than leaking the previous template's values), then the template's\n * fields are applied. Secret-ish fields are never filled from a template.\n * Non-catalog kinds (wifi/server/database/identity/bank templates) map to\n * the closest catalog kind so the kind selector and store stay consistent. */\n const CATALOG_KIND: Record<string, string> = {\n wifi: 'login', server: 'ssh', database: 'ssh', identity: 'login', bank: 'card',\n }\n function applyTemplate(name: string): void {\n const tpl = tplList.find(t => t.name === name)\n if (!tpl) return\n const next: Partial<FormFields> = {}\n if (tpl.kind !== 'builtin:custom') {\n const raw = tpl.kind.replace('builtin:', '')\n next.kind = CATALOG_KIND[raw] ?? raw\n }\n for (const [key, value] of Object.entries(tpl.fields)) {\n if (key === 'password' || key === 'otpSecret' || key === 'apiKey' || key === 'secret') continue\n ;(next as Record<string, unknown>)[key] = value\n }\n // Start from a clean form so switching templates never leaves stale values\n // from the previous template behind (the user's reported UX bug).\n setForm({ ...emptyForm(), ...next })\n }\n\n /** Change the entry kind. When CREATING a new entry, unrelated fields from\n * the previous kind are cleared so the form does not carry stale values; when\n * EDITING an existing entry the other fields are kept (they may be valid for\n * the new kind too, and clearing would risk data loss). */\n function changeKind(kind: string): void {\n setForm(previous => {\n if (editor.status === 'creating') {\n return { ...emptyForm(), kind }\n }\n return { ...previous, kind }\n })\n }\n\n /** Save the current form as a reusable template. */\n async function saveAsTemplate(): Promise<void> {\n const name = window.prompt(t('tplNamePrompt'))\n if (!name) return\n const fields: Record<string, string> = {}\n for (const key of ['username', 'email', 'phone', 'host', 'port', 'url', 'notes', 'icon', 'color',\n 'cardNumber', 'cardExpiry', 'cardCvv', 'cardHolder']) {\n const v = (form as Record<string, unknown>)[key]\n if (typeof v === 'string' && v.length > 0) fields[key] = v\n }\n await saveTemplate(name.trim(), form.kind ?? 'login', fields)\n await templates().then(setTplList).catch(() => {})\n setMessage(`${t('tplSaved')} ${name.trim()}`)\n }\n\n /** Switch the active vault and reload everything. */\n async function switchVaultTo(name: string): Promise<void> {\n setBusy(true)\n setMessage(null)\n try {\n await switchVault(name)\n await listVaults().then(setVaults)\n setQuery('')\n void backups(20).then(setBackupList).catch(() => {})\n void backupStatus().then(bk => setBackupInfo(bk)).catch(() => {})\n void refresh()\n status().then(value => setLocked(value.locked)).catch(() => {})\n } catch (err) {\n setMessage(errText(err))\n } finally {\n setBusy(false)\n }\n }\n\n /** Delete one backup file (confirms first). */\n async function deleteBackupFile(b: { path: string }): Promise<void> {\n if (!window.confirm(t('backupDeleteConfirm'))) return\n setBusy(true)\n setMessage(null)\n try {\n const r = await deleteBackup(b.path)\n setMessage(t('backupDeleted'))\n void backups(20).then(setBackupList).catch(() => {})\n } catch (err) {\n setMessage(errText(err))\n } finally {\n setBusy(false)\n }\n }\n\n /** Rename the active (or picked) vault. */\n async function runVaultRename(): Promise<void> {\n const current = vaults.find(v => v.active)?.name ?? 'default'\n const target = window.prompt(`${t('vaultRenamePrompt')} (${current})`)\n if (target === null || target.trim() === '' || target.trim() === current) return\n setBusy(true)\n setMessage(null)\n try {\n const r = await vaultRename(current, target.trim())\n setMessage(r.note)\n await listVaults().then(setVaults)\n void refresh()\n } catch (err) {\n setMessage(errText(err))\n } finally {\n setBusy(false)\n }\n }\n\n /** Delete a picked vault (confirms first; default vault cannot be deleted). */\n async function runVaultDelete(name: string): Promise<void> {\n if (name === 'default') { setMessage(t('vaultDeleteDefault')); return }\n if (!window.confirm(t('vaultDeleteConfirm').replace('{name}', name))) return\n setBusy(true)\n setMessage(null)\n try {\n const r = await vaultDelete(name, true)\n setMessage(r.note)\n await listVaults().then(setVaults)\n void backups(20).then(setBackupList).catch(() => {})\n void refresh()\n } catch (err) {\n setMessage(errText(err))\n } finally {\n setBusy(false)\n }\n }\n\n /** Import from Firefox (prompts for the primary password when one is set). */\n async function runFirefoxImport(): Promise<void> {\n const mp = window.prompt(t('firefoxMasterPw'))\n if (mp === null) return\n setBusy(true)\n setMessage(null)\n try {\n const r = await importFirefox(mp, false)\n setMessage(r.note)\n void refresh()\n } catch (err) {\n setMessage(errText(err))\n } finally {\n setBusy(false)\n }\n }\n\n /** Import from Chrome / Keychain with a confirmation about keychain prompts. */\n async function runSystemImport(source: 'chrome' | 'keychain', preview: boolean): Promise<void> {\n if (source === 'keychain' && !preview) {\n const ok = window.confirm(t('keychainPromptWarn'))\n if (!ok) return\n }\n setBusy(true)\n setMessage(null)\n try {\n const r = source === 'chrome'\n ? await importChrome(false)\n : await keychainImport({ limit: 10, preview })\n setMessage(r.note)\n void refresh()\n } catch (err) {\n setMessage(errText(err))\n } finally {\n setBusy(false)\n }\n }\n\n /** Import a 1Password 1PUX file (path entered by the user). */\n async function runImport1password(): Promise<void> {\n const path = window.prompt(t('import1passwordPrompt'))\n if (path === null || path.trim() === '') return\n setBusy(true)\n setMessage(null)\n try {\n const r = await import1password(path.trim(), false)\n setMessage(r.note)\n void refresh()\n } catch (err) {\n setMessage(errText(err))\n } finally {\n setBusy(false)\n }\n }\n\n /** Preview a file import (dry run) — reports counts without writing. */\n async function runImportPreview(run: () => Promise<{ note: string }>): Promise<void> {\n setBusy(true)\n setMessage(null)\n try {\n const r = await run()\n setMessage(`${t('previewLabel')} ${r.note}`)\n } catch (err) {\n setMessage(errText(err))\n } finally {\n setBusy(false)\n }\n }\n\n /** Preview a file-based import: prompt for the path, then dry-run. */\n async function runFilePreview(promptKey: string, run: (path: string, overwrite: boolean, dryRun: boolean) => Promise<{ note: string }>): Promise<void> {\n const path = window.prompt(t(promptKey as never))\n if (path === null || path.trim() === '') return\n await runImportPreview(() => run(path.trim(), false, true))\n }\n\n /** Import a password-manager CSV file (Dashlane/NordPass/Keeper). */\n async function runImportManagerCsv(): Promise<void> {\n const path = window.prompt(t('importManagerCsvPrompt'))\n if (path === null || path.trim() === '') return\n setBusy(true)\n setMessage(null)\n try {\n const r = await importManagerCsv(path.trim(), false)\n setMessage(r.note)\n void refresh()\n } catch (err) {\n setMessage(errText(err))\n } finally {\n setBusy(false)\n }\n }\n\n /** Import an Enpass JSON export (path entered by the user). */\n async function runImportEnpass(): Promise<void> {\n const path = window.prompt(t('importEnpassPrompt'))\n if (path === null || path.trim() === '') return\n setBusy(true)\n setMessage(null)\n try {\n const r = await importEnpass(path.trim(), false)\n setMessage(r.note)\n void refresh()\n } catch (err) {\n setMessage(errText(err))\n } finally {\n setBusy(false)\n }\n }\n\n /** Import a Bitwarden JSON export (path entered by the user). */\n async function runImportBitwarden(): Promise<void> {\n const path = window.prompt(t('importBitwardenPrompt'))\n if (path === null || path.trim() === '') return\n setBusy(true)\n setMessage(null)\n try {\n const r = await importBitwarden(path.trim(), false)\n setMessage(r.note)\n void refresh()\n } catch (err) {\n setMessage(errText(err))\n } finally {\n setBusy(false)\n }\n }\n\n /** Import a Bitwarden password-protected JSON export (asks for the export passphrase). */\n async function runImportBitwardenEncrypted(): Promise<void> {\n const path = window.prompt(t('importBitwardenEncryptedPrompt'))\n if (path === null || path.trim() === '') return\n const password = window.prompt(t('importBitwardenEncryptedPasswordPrompt'))\n if (password === null) return\n setBusy(true)\n setMessage(null)\n try {\n const r = await importBitwardenEncrypted(path.trim(), password, false)\n setMessage(r.note)\n void refresh()\n } catch (err) {\n setMessage(errText(err))\n } finally {\n setBusy(false)\n }\n }\n\n /** Import a legacy 1Password 1PIF export. */\n async function runImport1pif(): Promise<void> {\n const path = window.prompt(t('import1pifPrompt'))\n if (path === null || path.trim() === '') return\n setBusy(true)\n setMessage(null)\n try {\n const r = await import1pif(path.trim(), false)\n setMessage(r.note)\n void refresh()\n } catch (err) {\n setMessage(errText(err))\n } finally {\n setBusy(false)\n }\n }\n\n /** Import a KeePass 2.x XML export. */\n async function runImportKeePassXml(): Promise<void> {\n const path = window.prompt(t('importKeePassXmlPrompt'))\n if (path === null || path.trim() === '') return\n setBusy(true)\n setMessage(null)\n try {\n const r = await importKeePassXml(path.trim(), false)\n setMessage(r.note)\n void refresh()\n } catch (err) {\n setMessage(errText(err))\n } finally {\n setBusy(false)\n }\n }\n\n /** Import a KeePass KDBX binary database (asks for path + optional password). */\n async function runImportKdbx(): Promise<void> {\n const path = window.prompt(t('importKdbxPrompt'))\n if (path === null || path.trim() === '') return\n const password = window.prompt(t('importKdbxPasswordPrompt')) ?? ''\n setBusy(true)\n setMessage(null)\n try {\n const r = await importKdbx(path.trim(), password, '', false)\n setMessage(r.note)\n void refresh()\n } catch (err) {\n setMessage(errText(err))\n } finally {\n setBusy(false)\n }\n }\n\n /** Export the vault as a 1Password 1PUX archive. */\n async function runExport1pux(): Promise<void> {\n const suggested = t('exportDefaultPath').replace('{file}', `${new Date().toISOString().slice(0, 10)}.1pux`)\n const path = window.prompt(`${t('export1puxPrompt')}\\n${t('exportPathHint')}: ${suggested}`, suggested)\n if (path === null || path.trim() === '') return\n setBusy(true)\n setMessage(null)\n try {\n const r = await export1pux(path.trim())\n setMessage(`${t('exportDone')} (${r.count} ${t('entryCount').toLowerCase()}) — ${r.path}`)\n } catch (err) {\n setMessage(errText(err))\n } finally {\n setBusy(false)\n }\n }\n\n /** Export the vault as a Bitwarden JSON document. */\n async function runExportBitwarden(): Promise<void> {\n const suggested = t('exportDefaultPath').replace('{file}', `${new Date().toISOString().slice(0, 10)}.json`)\n const path = window.prompt(`${t('exportBitwardenPrompt')}\\n${t('exportPathHint')}: ${suggested}`, suggested)\n if (path === null || path.trim() === '') return\n setBusy(true)\n setMessage(null)\n try {\n const r = await exportBitwarden(path.trim())\n setMessage(`${t('exportDone')} (${r.count} ${t('entryCount').toLowerCase()}) — ${r.path}`)\n } catch (err) {\n setMessage(errText(err))\n } finally {\n setBusy(false)\n }\n }\n\n /** Search Chrome/Keychain for the typed keyword (no secrets shown). */\n async function searchSystemStores(): Promise<void> {\n if (sysQuery.trim().length === 0) return\n setBusy(true)\n setMessage(null)\n try {\n const r = await searchSystem(sysQuery.trim(), 'all', 15)\n setSysMatches(r.matches)\n } catch (err) {\n setMessage(errText(err))\n } finally {\n setBusy(false)\n }\n }\n\n /** Rename a tag across all entries (Bitwarden-style tag merge). */\n async function renameTagAll(from: string): Promise<void> {\n const to = window.prompt(`${t('tagRenamePrompt')} ${from}`)\n if (!to || to.trim().length === 0 || to.trim() === from) return\n await renameTag(from, to.trim())\n await tags().then(setTagList).catch(() => {})\n void refresh()\n }\n\n /** Merge one duplicate into another (first keeps gaps filled), then refresh. */\n async function mergeEntries(group: Array<{ id: string; title: string }>): Promise<void> {\n if (group.length < 2) return\n setBusy(true)\n setMessage(null)\n try {\n const [first, second] = group\n await merge(second!.id, first!.id, false)\n await duplicateGroups().then(setDupList)\n void refresh()\n } catch (err) {\n setMessage(errText(err))\n } finally {\n setBusy(false)\n }\n }\n\n /** Lock the vault immediately from the UI. */\n async function lockNow(): Promise<void> {\n setBusy(true)\n try {\n const r = await lock()\n setLocked(r.locked)\n if (r.locked) {\n // The vault is locked: clear the visible list and health data so\n // stale secrets and stats are not left on screen.\n setState({ status: 'ready', entries: [] })\n setReport(null)\n setVaultStats(null)\n setAudit([])\n setDupList([])\n setTagList([])\n setBreach(null)\n setMessage(t('lockedMsg'))\n } else {\n setMessage(t('error'))\n }\n } catch (err) {\n setMessage(errText(err))\n } finally {\n setBusy(false)\n }\n }\n\n /** Unlock the vault from the locked banner. */\n async function unlockNow(): Promise<void> {\n setBusy(true)\n try {\n const r = await unlock()\n setLocked(r.locked)\n if (!r.locked) {\n void refresh()\n void status().then(value => setLocked(value.locked)).catch(() => {})\n }\n } catch (err) {\n setMessage(errText(err))\n } finally {\n setBusy(false)\n }\n }\n\n /** Export the current security report (weak/reused/no-2FA/http/rotation)\n * as a CSV file (1Password Watchtower-style). Client-side only; the report\n * data is already loaded. */\n async function exportReportCsv(): Promise<void> {\n if (report === null) return\n const esc = (v: unknown): string => {\n const s = String(v ?? '')\n return /[\",\\n]/.test(s) ? `\"${s.replace(/\"/g, '\"\"')}\"` : s\n }\n const lines: string[] = [`dsh-vault security report,${new Date().toISOString()},score=${report.score},verdict=${report.verdict}`]\n lines.push('')\n lines.push('weak passwords,title')\n for (const w of report.weak as Array<{ title?: string; id?: string }>) lines.push(`weak,${esc(w.title ?? w.id ?? '')}`)\n lines.push('')\n lines.push('reused passwords,title')\n for (const r of report.reused as Array<{ title?: string; id?: string }>) lines.push(`reused,${esc(r.title ?? r.id ?? '')}`)\n lines.push('')\n lines.push('missing 2FA,title')\n for (const n of report.no2fa as Array<{ title?: string; id?: string }>) lines.push(`no-2fa,${esc(n.title ?? n.id ?? '')}`)\n lines.push('')\n lines.push('http sites,title')\n for (const h of report.httpSites as Array<{ title?: string; id?: string }>) lines.push(`http,${esc(h.title ?? h.id ?? '')}`)\n lines.push('')\n lines.push('rotation due,title')\n for (const r of report.rotation as Array<{ title?: string; id?: string }>) lines.push(`rotation,${esc(r.title ?? r.id ?? '')}`)\n const blob = new Blob(['\\uFEFF' + lines.join('\\n')], { type: 'text/csv;charset=utf-8' })\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n a.download = `dsh-vault-security-report-${new Date().toISOString().slice(0, 10)}.csv`\n document.body.appendChild(a)\n a.click()\n a.remove()\n URL.revokeObjectURL(url)\n setMessage(t('reportExported'))\n }\n\n /** Run a Watchtower-style breach scan and show the result. */\n async function runBreachCheck(): Promise<void> {\n setBusy(true)\n setMessage(null)\n try {\n const result = await breachCheck(true)\n setBreach(result)\n if (result.pwned.length === 0 && result.weak.length === 0) {\n setMessage(result.offline ? t('breachOkOffline') : t('breachOk'))\n }\n } catch (err) {\n setMessage(errText(err))\n } finally {\n setBusy(false)\n }\n }\n\n /** Run an encrypted backup now and refresh the backup-age badge + list. */\n async function backupNow(): Promise<void> {\n setBusy(true)\n setMessage(null)\n try {\n const result = await backup()\n setBackupInfo({ daysSinceBackup: 0, backups: result.kept })\n setMessage(`${t('backupDone')} (${result.kept} kept, ${result.pruned} pruned)`)\n void backups(20).then(setBackupList).catch(() => {})\n void refresh()\n } catch (err) {\n setMessage(errText(err))\n } finally {\n setBusy(false)\n }\n }\n\n /** Restore the vault from a backup file (asks for confirmation first). */\n async function restoreBackupFrom(b: { path: string; at: number }): Promise<void> {\n const mode = window.confirm(t('backupRestoreModeMerge'))\n ? 'merge'\n : window.confirm(t('backupRestoreModeReplace')) ? 'replace' : null\n if (mode === null) return\n setBusy(true)\n setMessage(null)\n try {\n const result = await restoreBackup(b.path, mode)\n setMessage(result.note)\n setBackupInfo(null)\n void backups(20).then(setBackupList).catch(() => {})\n void refresh()\n if (result.safetyBackup !== '') setMessage(`${result.note} — ${t('backupSafetyHint')} ${result.safetyBackup}`)\n } catch (err) {\n setMessage(errText(err))\n } finally {\n setBusy(false)\n }\n }\n\n /** Reload the sessions lists (open windows + saved sessions). */\n const refreshSessions = useCallback((): void => {\n void sessionListOpen().then(setOpenSessions).catch(() => {})\n void sessionListSaved().then(setSavedSessions).catch(() => {})\n }, [sessionListOpen, sessionListSaved])\n\n /** Open a browser window for manual login, then show the collect hint. */\n async function runSessionOpen(): Promise<void> {\n if (readonly) { setMessage(t('sessionReadOnly')); return }\n const url = sessionUrl.trim()\n if (url.length === 0) { setMessage(t('sessionUrlPrompt')); return }\n setBusy(true)\n setMessage(null)\n try {\n const result = await sessionOpen(url)\n setMessage(t('sessionNoteOpen').replace('{url}', result.url))\n refreshSessions()\n } catch {\n setMessage(t('sessionOpenFailed'))\n } finally {\n setBusy(false)\n }\n }\n\n /** Collect cookies from an open window and save them under a title. */\n async function runSessionCollect(sessionId: string, fallbackUrl: string): Promise<void> {\n if (readonly) { setMessage(t('sessionReadOnly')); return }\n let title = sessionTitle.trim()\n if (title.length === 0) {\n const asked = window.prompt(`${t('sessionSaveTitle')} ${t('sessionNamePlaceholder')}`)\n if (asked === null) return\n title = asked.trim()\n if (title.length === 0) return\n }\n setBusy(true)\n setMessage(null)\n try {\n const collected = await sessionCollect(sessionId, fallbackUrl)\n if (collected.count === 0) { setMessage(t('sessionNoteCollect').replace('{n}', '0')); return }\n const saved = await sessionSave({ title, cookies: collected.cookies, url: fallbackUrl, overwrite: true })\n setMessage(t('sessionSaved').replace('{n}', String(saved.saved)))\n setSessionTitle('')\n refreshSessions()\n } catch (err) {\n setMessage(errText(err))\n } finally {\n setBusy(false)\n }\n }\n\n /** Close a browser window. */\n async function runSessionClose(sessionId: string): Promise<void> {\n setBusy(true)\n try {\n await sessionClose(sessionId)\n refreshSessions()\n } finally {\n setBusy(false)\n }\n }\n\n /** Copy a saved session as a Cookie header (or jar) to the clipboard. */\n async function runSessionExport(id: string, format: 'header' | 'netscape' | 'playwright'): Promise<void> {\n setBusy(true)\n setMessage(null)\n try {\n const exported = await sessionExport(id, format)\n await navigator.clipboard.writeText(exported.text)\n setCopiedId(id)\n window.setTimeout(() => setCopiedId(current => current === id ? null : current), 1600)\n } catch (err) {\n setMessage(errText(err))\n } finally {\n setBusy(false)\n }\n }\n\n /** Show the cookie detail of a saved session. */\n async function runSessionDetail(id: string): Promise<void> {\n setBusy(true)\n try {\n const detail = await sessionGet(id)\n setSessionDetail(detail)\n } catch (err) {\n setMessage(errText(err))\n } finally {\n setBusy(false)\n }\n }\n\n /** Remove expired cookies from a saved session (confirms first). */\n async function runSessionPrune(id: string): Promise<void> {\n if (!window.confirm(t('sessionPruneConfirm'))) return\n setBusy(true)\n setMessage(null)\n try {\n const result = await sessionPrune(id, false)\n setMessage(result.note)\n refreshSessions()\n } catch (err) {\n setMessage(errText(err))\n } finally {\n setBusy(false)\n }\n }\n\n /** Generate a one-time recovery code and show it once (confirm first). */\n async function runRecoveryCode(): Promise<void> {\n if (!window.confirm(t('recoveryCodeConfirm'))) return\n setBusy(true)\n setMessage(null)\n try {\n const r = await recoveryCode()\n window.alert(`${t('recoveryCodeAlert')}\\n\\n${r.code}\\n\\n${r.note}`)\n setMessage(t('recoveryCodeSet'))\n } catch (err) {\n setMessage(errText(err))\n } finally {\n setBusy(false)\n }\n }\n\n /** Verify a recovery code typed by the user. */\n async function runVerifyRecovery(): Promise<void> {\n const code = window.prompt(t('recoveryCodeVerifyPrompt'))\n if (code === null || code.trim() === '') return\n setBusy(true)\n setMessage(null)\n try {\n const r = await verifyRecovery(code.trim())\n setMessage(r.verified ? t('recoveryVerified') : t('recoveryNotVerified'))\n } catch (err) {\n setMessage(errText(err))\n } finally {\n setBusy(false)\n }\n }\n\n /** Save cookies pasted as JSON / header text. */\n async function runSessionImport(): Promise<void> {\n if (readonly) { setMessage(t('sessionReadOnly')); return }\n const title = sessionPasteTitle.trim()\n const raw = sessionPaste.trim()\n if (title.length === 0 || raw.length === 0) { setMessage(t('sessionImportPastePrompt')); return }\n setBusy(true)\n setMessage(null)\n try {\n const parsed = parsePastedCookiesClient(raw)\n if (parsed.length === 0) { setMessage(t('sessionImportPastePrompt')); return }\n const saved = await sessionSave({ title, cookies: parsed, overwrite: true })\n setMessage(t('sessionSaved').replace('{n}', String(saved.saved)))\n setSessionPaste('')\n setSessionPasteTitle('')\n refreshSessions()\n } catch (err) {\n setMessage(errText(err))\n } finally {\n setBusy(false)\n }\n }\n\n /** Client-side cookie parser (mirrors the host parsePastedCookies). */\n function parsePastedCookiesClient(text: string): unknown[] {\n const trimmed = text.trim()\n if (trimmed.length === 0) return []\n const out: unknown[] = []\n if (trimmed.startsWith('[') || trimmed.startsWith('{')) {\n try {\n const parsed = JSON.parse(trimmed) as unknown\n const rows = Array.isArray(parsed) ? parsed : [parsed]\n for (const row of rows) {\n if (typeof row !== 'object' || row === null) continue\n const r = row as Record<string, unknown>\n if (typeof r.name !== 'string' || typeof r.value !== 'string' || typeof r.domain !== 'string') continue\n out.push({\n name: r.name, value: r.value, domain: r.domain,\n path: typeof r.path === 'string' ? r.path : '/',\n expires: typeof r.expires === 'number' ? r.expires : -1,\n httpOnly: r.httpOnly === true, secure: r.secure === true,\n ...(r.sameSite === 'Strict' || r.sameSite === 'Lax' || r.sameSite === 'None' ? { sameSite: r.sameSite } : {}),\n })\n }\n } catch { return [] }\n } else {\n for (const pair of trimmed.split(';')) {\n const eq = pair.indexOf('=')\n if (eq <= 0) continue\n const name = pair.slice(0, eq).trim()\n const value = pair.slice(eq + 1).trim()\n if (name.length === 0) continue\n out.push({ name, value, domain: '', path: '/', expires: -1, httpOnly: false, secure: false })\n }\n }\n return out\n }\n\n useEffect(() => {\n let current = true\n void config().then(\n value => { if (current) setPolicy(value) },\n () => { /* policy is informational; ignore failures */ },\n )\n void status().then(\n value => { if (current) setLocked(value.locked) },\n () => { /* ignore */ },\n )\n void listVaults().then(setVaults).catch(() => {})\n void templates().then(setTplList).catch(() => {})\n void watchtower().then(list => {\n const map: Record<string, { score: number; verdict: string; flags: string[] }> = {}\n for (const w of list) map[w.id] = { score: w.score, verdict: w.verdict, flags: w.flags }\n setWatchMap(map)\n }).catch(() => {})\n refreshSessions()\n return () => { current = false }\n }, [config, status, listVaults, templates, refreshSessions])\n\n const refresh = useMemo(() => async () => {\n setState({ status: 'loading' })\n try {\n const entries = query.trim().length === 0\n ? await list()\n : await search(query.trim())\n setState({ status: 'ready', entries })\n setVisibleCount(50)\n status().then(value => setLocked(value.locked)).catch(() => {})\n } catch (err) {\n // A locked vault makes list() throw; surface the locked banner instead\n // of a generic failure (the user can unlock, not retry). Even when\n // status() itself fails (e.g. an older host), a lock-shaped error still\n // flips the locked flag so write actions stay disabled.\n const st = await status().catch(() => null)\n const raw = err instanceof Error ? err.message : String(err ?? '')\n const lockError = (st !== null && st.locked) || /vault is locked/i.test(raw)\n if (lockError) {\n setLocked(true)\n setState({ status: 'ready', entries: [] })\n } else {\n setState({ status: 'error', reason: errText(err) })\n }\n }\n }, [list, search, query])\n\n useEffect(() => {\n let current = true\n const timer = window.setTimeout(() => {\n void refresh().then(\n () => { /* state already set inside refresh */ },\n () => { if (current) setState({ status: 'error' }) },\n )\n }, 250)\n return () => { current = false; window.clearTimeout(timer) }\n // refresh is memoized on query (debounced); list/search are stable.\n }, [refresh])\n\n // TOTP countdown: tick every second so the progress ring stays live, and\n // auto-refresh any code whose 30s window just expired.\n useEffect(() => {\n const timer = window.setInterval(() => setNowTick(Date.now()), 1000)\n return () => window.clearInterval(timer)\n }, [])\n\n useEffect(() => {\n for (const [id, info] of Object.entries(totpMap)) {\n if (info.until > 0 && nowTick >= info.until && info.code !== t('error')) {\n void totp(id).then(\n result => setTotpMap(previous => ({\n ...previous,\n [id]: { code: result.code, until: Date.now() + result.secondsRemaining * 1000 },\n })),\n () => { /* keep the last code; next window retries */ },\n )\n }\n }\n }, [nowTick, totpMap, totp])\n\n // Load attachments when an entry is expanded.\n useEffect(() => {\n if (expandedId === null) return\n let current = true\n void attachments(expandedId).then(r => {\n if (current && r.found) setAttachmentsMap(prev => ({ ...prev, [expandedId]: r.attachments }))\n }).catch(() => {})\n return () => { current = false }\n }, [expandedId, attachments])\n\n // Vault health & meta: load once on mount (stats, backup age, rotation,\n // weak/reused scan, recent activity) and refresh on window focus.\n useEffect(() => {\n let current = true\n const load = (): void => {\n void Promise.all([\n stats().catch(() => null),\n backupStatus().catch(() => null),\n rotation().catch(() => []),\n health().catch(() => null),\n recent().catch(() => []),\n duplicates().catch(() => null),\n ]).then(([st, bk, rot, hl, rc, dp]) => {\n if (dp !== null && typeof dp === 'object' && (dp as { groups?: number }).groups !== undefined) {\n setDupGroups((dp as { groups: number }).groups)\n }\n duplicateGroups().then(setDupList).catch(() => {})\n verifyAll().then(setAudit).catch(() => {})\n tags().then(setTagList).catch(() => {})\n generatorHistory().then(setGenHistory).catch(() => {})\n backups(20).then(setBackupList).catch(() => {})\n trash().then(setTrashEntries).catch(() => {})\n if (!current) return\n if (st !== null) setVaultStats(st as Record<string, unknown>)\n if (bk !== null) setBackupInfo(bk)\n setReport({ rotation: (rot ?? []) as unknown[], weak: ((hl?.weak ?? []) as unknown[]), reused: ((hl?.reused ?? []) as unknown[]), strength: (hl?.strength ?? null) as { weak: number; fair: number; strong: number } | null, no2fa: ((hl?.no2fa ?? []) as unknown[]), httpSites: ((hl?.httpSites ?? []) as unknown[]), score: Number(hl?.score ?? 100), verdict: String(hl?.verdict ?? 'good') })\n const due: Record<string, { due: string; daysLeft: number }> = {}\n for (const item of (rot ?? []) as Array<{ id?: string; due?: string; daysLeft?: number }>) {\n if (item.id !== undefined && item.due !== undefined) due[item.id] = { due: item.due, daysLeft: item.daysLeft ?? 0 }\n }\n setDueMap(due)\n setRecentEntries((rc ?? []) as Array<Record<string, unknown>>)\n })\n }\n load()\n const onFocus = (): void => { load() }\n window.addEventListener('focus', onFocus)\n return () => { current = false; window.removeEventListener('focus', onFocus) }\n }, [stats, backupStatus, rotation, health, recent, duplicates, duplicateGroups, verifyAll, tags, generatorHistory, backups])\n\n /** Open the editor for a new entry. */\n function startCreate(): void {\n setForm(emptyForm())\n setTagsDraft('')\n setFieldsDraft('')\n setMessage(null)\n setEditor({ status: 'creating' })\n }\n\n /** Open the editor for an existing entry (fetches full secrets). */\n async function startEdit(id: string): Promise<void> {\n setBusy(true)\n setMessage(null)\n try {\n const result = await get(id)\n if (!result.found || result.entry === undefined) {\n setMessage(t('error'))\n return\n }\n const entry = result.entry\n setForm({\n title: entry.title ?? '',\n kind: entry.kind ?? 'login',\n username: entry.username ?? '',\n email: entry.email ?? '',\n phone: entry.phone ?? '',\n password: entry.password ?? '',\n host: entry.host ?? '',\n port: entry.port ?? '',\n privateKey: entry.privateKey ?? '',\n apiKey: entry.apiKey ?? '',\n secret: entry.secret ?? '',\n accessToken: entry.accessToken ?? '',\n refreshToken: entry.refreshToken ?? '',\n otpSecret: entry.otpSecret ?? '',\n url: entry.url ?? '',\n notes: entry.notes ?? '',\n icon: entry.icon ?? '',\n color: entry.color ?? '',\n expiresAt: entry.expiresAt,\n rotationDays: entry.rotationDays,\n sensitivity: entry.sensitivity,\n favorite: entry.favorite ?? false,\n })\n setTagsDraft((entry.tags ?? []).join(', '))\n setFieldsDraft(entry.fields !== undefined ? Object.entries(entry.fields).map(([k, v]) => `${k}=${String(v)}`).join('\\n') : '')\n setEditor({ status: 'editing', entry })\n } catch (err) {\n setMessage(errText(err))\n } finally {\n setBusy(false)\n }\n }\n\n /** Save the current form (create or update). */\n async function save(): Promise<void> {\n if (!(form.title ?? '').trim()) {\n setMessage(t('error'))\n return\n }\n // Editing an existing entry and actually typing a new password: confirm\n // (Bitwarden-style). An empty form password (entry had none, or the user\n // cleared it) is not a change, so it never prompts.\n const entryPw = editor.status === 'editing' ? (editor.entry?.password ?? '') : ''\n const typedPw = (form.password ?? '').trim()\n if (editor.status === 'editing' && typedPw.length > 0 && typedPw !== entryPw) {\n if (!window.confirm(t('pwChangeConfirm'))) return\n }\n setBusy(true)\n setMessage(null)\n try {\n const tags = tagsDraft.split(',').map(x => x.trim()).filter(x => x.length > 0)\n const fields: Record<string, string> = {}\n for (const line of fieldsDraft.split('\\n')) {\n const trimmed = line.trim()\n if (trimmed.length === 0) continue\n const eq = trimmed.indexOf('=')\n if (eq <= 0) continue\n fields[trimmed.slice(0, eq).trim()] = trimmed.slice(eq + 1).trim()\n }\n const patch: VaultPatch = {\n title: (form.title ?? '').trim(),\n ...(form.kind !== undefined ? { kind: form.kind } : {}),\n ...(form.username !== undefined ? { username: form.username } : {}),\n ...(form.email !== undefined ? { email: form.email } : {}),\n ...(form.phone !== undefined ? { phone: form.phone } : {}),\n ...(form.password !== undefined ? { password: form.password } : {}),\n ...(form.host !== undefined ? { host: form.host } : {}),\n ...(form.port !== undefined ? { port: form.port } : {}),\n ...(form.privateKey !== undefined ? { privateKey: form.privateKey } : {}),\n ...(form.apiKey !== undefined ? { apiKey: form.apiKey } : {}),\n ...(form.secret !== undefined ? { secret: form.secret } : {}),\n ...(form.accessToken !== undefined ? { accessToken: form.accessToken } : {}),\n ...(form.refreshToken !== undefined ? { refreshToken: form.refreshToken } : {}),\n ...(form.otpSecret !== undefined ? { otpSecret: form.otpSecret } : {}),\n ...(form.url !== undefined ? { url: form.url } : {}),\n ...(form.notes !== undefined ? { notes: form.notes } : {}),\n ...(form.icon !== undefined ? { icon: form.icon } : {}),\n ...(form.color !== undefined ? { color: form.color } : {}),\n ...(form.expiresAt !== undefined ? { expiresAt: form.expiresAt } : {}),\n ...(form.rotationDays !== undefined ? { rotationDays: form.rotationDays } : {}),\n ...(form.sensitivity !== undefined ? { sensitivity: form.sensitivity } : {}),\n ...(form.favorite !== undefined ? { favorite: form.favorite } : {}),\n // Always send tags: an empty array clears them, and the host store\n // treats empty string values as \"clear this field\" too.\n tags,\n fields,\n }\n if (editor.status === 'creating') {\n await add(patch as VaultPatch & { title: string })\n setMessage(t('savedNew'))\n } else if (editor.status === 'editing') {\n await update(editor.entry.id, patch)\n setMessage(t('savedUpdated'))\n }\n setEditor({ status: 'closed' })\n await refresh()\n } catch (err) {\n setMessage(errText(err))\n } finally {\n setBusy(false)\n }\n }\n\n /** Delete an entry after confirmation. */\n async function removeEntry(id: string): Promise<void> {\n if (!window.confirm(t('deleteConfirm'))) return\n setBusy(true)\n try {\n await remove(id)\n await refresh()\n } catch (err) {\n setMessage(errText(err))\n } finally {\n setBusy(false)\n }\n }\n\n /** Copy a field value to the clipboard and flash the row. */\n const clipboardTimer = useRef<number | null>(null)\n const CLIPBOARD_CLEAR_MS = 30_000\n\n async function copyValue(id: string, value: string): Promise<void> {\n try {\n await navigator.clipboard.writeText(value)\n } catch {\n // Clipboard may be blocked; fall back to a temporary textarea.\n const textarea = document.createElement('textarea')\n textarea.value = value\n document.body.appendChild(textarea)\n textarea.select()\n document.execCommand('copy')\n textarea.remove()\n }\n setCopiedId(id)\n window.setTimeout(() => setCopiedId(null), 3000)\n // Auto-clear the clipboard after 30s (1Password/Bitwarden-style), so a\n // copied secret does not linger for anyone using the machine later. Only\n // clear when the clipboard still holds the value we copied — if the user\n // copied something else meanwhile, never wipe their content.\n if (clipboardTimer.current !== null) window.clearTimeout(clipboardTimer.current)\n const copied = value\n clipboardTimer.current = window.setTimeout(() => {\n clipboardTimer.current = null\n void navigator.clipboard.readText().then(current => {\n if (current === copied) void navigator.clipboard.writeText('').catch(() => {})\n }).catch(() => {})\n }, CLIPBOARD_CLEAR_MS)\n }\n\n /** Fetch and show the otpauth URI for an entry (for adding to another device). */\n async function showTotpUri(id: string): Promise<void> {\n setBusy(true)\n try {\n const r = await totpUri(id)\n setUriMap(previous => ({ ...previous, [id]: previous[id] === r.uri ? '' : r.uri }))\n } catch (err) {\n setMessage(errText(err))\n } finally {\n setBusy(false)\n }\n }\n\n /** Fetch and display a TOTP code for an entry with an otpSecret. */\n async function showTotp(id: string): Promise<void> {\n setBusy(true)\n try {\n const result = await totp(id)\n setTotpMap(previous => ({ ...previous, [id]: { code: result.code, until: Date.now() + result.secondsRemaining * 1000 } }))\n } catch {\n setTotpMap(previous => ({ ...previous, [id]: { code: t('error'), until: 0 } }))\n } finally {\n setBusy(false)\n }\n }\n\n /** Relative time like \"5m ago\" / \"2d ago\". */\n function relTime(epoch: unknown): string {\n const n = Number(epoch)\n if (!Number.isFinite(n) || n <= 0) return ''\n const secs = Math.max(0, Math.floor((Date.now() - n) / 1000))\n if (secs < 60) return `${secs}s`\n if (secs < 3600) return `${Math.floor(secs / 60)}m`\n if (secs < 86400) return `${Math.floor(secs / 3600)}h`\n return `${Math.floor(secs / 86400)}d`\n }\n\n /** Human-friendly value formatting for the expanded detail box. */\n function formatDetail(key: string, value: unknown): string {\n if (key === 'expiresAt' || key === 'updatedAt' || key === 'createdAt') {\n const n = Number(value)\n return Number.isFinite(n) && n > 0 ? new Date(n).toISOString().slice(0, 16).replace('T', ' ') : String(value)\n }\n if (key === 'sensitivity' && value === 'high') return t('sensitivityHigh')\n if (key === 'kind') return t(KIND_KEYS[String(value)] ?? 'kindCustom')\n if (Array.isArray(value)) return value.join(', ')\n if (key === 'fields' && typeof value === 'object' && value !== null) {\n return Object.entries(value as Record<string, string>).map(([k, v]) => `${k}: ${String(v)}`).join(', ')\n }\n if (typeof value === 'object' && value !== null) return JSON.stringify(value)\n return String(value)\n }\n\n /** Field-set summary line for one entry (non-secret). */\n function kindIcon(kind?: string): string {\n switch (kind ?? 'login') {\n case 'ssh': return '🖥️'\n case 'api-key': return '🔑'\n case 'oauth': return '🔐'\n case 'secret': return '🤫'\n case 'cookie': return '🍪'\n case 'card': return '💳'\n case 'custom': return '🧩'\n default: return '👤'\n }\n }\n\n function passwordAge(entry: VaultSummaryWire): string {\n const up = entry.updatedAt\n if (up === undefined || up <= 0) return ''\n const days = Math.max(0, Math.floor((Date.now() - up) / 86_400_000))\n if (days === 0) return t('ageToday')\n return `${days}d`\n }\n\n function identityLine(entry: VaultSummaryWire): string {\n const parts = [\n entry.kind !== undefined ? t(KIND_KEYS[entry.kind] ?? 'kindCustom') : t('kindLogin'),\n entry.username,\n entry.email,\n entry.phone,\n entry.host !== undefined ? `${entry.host}${entry.port !== undefined ? `:${entry.port}` : ''}` : undefined,\n entry.url,\n ].filter((value): value is string => value !== undefined && value.length > 0)\n return parts.join(' · ')\n }\n\n return (\n <section className={css.section} aria-labelledby=\"vault-heading\">\n <h2 id=\"vault-heading\">{t('heading')}</h2>\n <p className={css.intro}>{t('intro')}</p>\n\n {locked && (\n <div className={css.lockedBanner} role=\"alert\">\n <p>{t('lockedBanner')}</p>\n <button type=\"button\" className={css.backupButton} onClick={() => void unlockNow()} disabled={busy}>{t('unlock')}</button>\n </div>\n )}\n\n <nav className={css.tabs} aria-label={t('sectionTabs')}>\n {(['entries', 'security', 'transfer', 'backup', 'permissions', 'sessions', 'trash'] as const).map(tab => (\n <button\n key={tab}\n type=\"button\"\n className={`${css.tab}${activeTab === tab ? ` ${css.tabActive}` : ''}`}\n onClick={() => setActiveTab(tab)}\n >{t(TAB_KEYS[tab]!)}</button>\n ))}\n </nav>\n\n {activeTab === 'entries' && (<div className={css.tabPane}>\n <div className={css.toolbar}>\n {locked && (\n <span className={css.lockedTag}>{t('lockedShort')}</span>\n )}\n {vaults.length > 0 && (\n <select\n className={css.kindFilter}\n value={vaults.find(v => v.active)?.name ?? ''}\n onChange={event => void switchVaultTo(event.target.value)}\n aria-label={t('vaultSelect')}\n disabled={locked}\n >\n {vaults.map(v => (\n <option key={v.name} value={v.name}>{v.name}{v.active ? ' *' : ''}{v.entries !== undefined ? ` (${v.entries})` : ''}</option>\n ))}\n </select>\n )}\n <button type=\"button\" className={css.dupMerge} onClick={() => void runVaultRename()} disabled={busy || locked} title={t('vaultRename')}>{t('vaultRename')}</button>\n {vaults.filter(v => v.name !== 'default').map(v => (\n <button key={v.name} type=\"button\" className={css.dangerButton} onClick={() => void runVaultDelete(v.name)} disabled={busy || locked} title={t('vaultDelete')}>{t('vaultDelete')} {v.name}</button>\n ))}\n <label className={css.searchBox}>\n <span className={css.srOnly}>{t('searchPlaceholder')}</span>\n <input\n id={searchId}\n type=\"search\"\n placeholder={t('searchPlaceholder')}\n value={query}\n onChange={event => setQuery(event.target.value)}\n disabled={locked}\n />\n {query.length > 0 && (\n <button type=\"button\" className={css.clearButton} onClick={() => setQuery('')} aria-label={t('clearSearch')}>×</button>\n )}\n </label>\n <select className={css.kindFilter} value={kindFilter} onChange={e => setKindFilter(e.target.value)} aria-label={t('fieldKind')}>\n <option value=\"\">{t('allKinds')}</option>\n {Object.entries(KIND_KEYS).map(([value, key]) => (\n <option key={value} value={value}>{t(key)}</option>\n ))}\n </select>\n <select className={css.kindFilter} value={tagFilter} onChange={e => setTagFilter(e.target.value)} aria-label={t('fieldTags')}>\n <option value=\"\">{t('allTags')}</option>\n {[...new Set(state.status === 'ready' ? state.entries.flatMap(e => e.tags ?? []) : [])].sort().map(tag => (\n <option key={tag} value={tag}>{tag}</option>\n ))}\n </select>\n <select\n className={css.sortButton}\n value={sortBy}\n onChange={event => setSortBy(event.target.value as 'alpha' | 'recent' | 'created' | 'favorite' | 'smart')}\n aria-label={t('sortBy')}\n >\n <option value=\"alpha\">{t('sortAlpha')}</option>\n <option value=\"recent\">{t('sortRecent')}</option>\n <option value=\"created\">{t('sortCreated')}</option>\n <option value=\"favorite\">{t('sortFavorite')}</option>\n <option value=\"smart\">{t('sortSmart')}</option>\n </select>\n <button type=\"button\" className={css.addButton} onClick={startCreate} disabled={busy || readonly || locked}>\n + {t('add')}\n </button>\n </div>\n </div>)}\n\n {message !== null && <p role=\"alert\" className={css.error}>{message}</p>}\n\n {state.status === 'loading' && <p className={css.status}>{t('loading')}</p>}\n {state.status === 'error' && (\n <p role=\"alert\" className={css.error}>\n {state.reason ?? t('error')}{' '}\n <button type=\"button\" className={css.retryButton} onClick={() => void refresh()}>{t('retry')}</button>\n </p>\n )}\n {activeTab === 'entries' && (<div className={css.tabPane}>\n {state.status === 'ready' && state.entries.length === 0 && (\n <div className={css.emptyBox}>\n <p className={css.empty}>{t('empty')}</p>\n <p className={css.emptyHint}>{readonly ? t('emptyHintReadonly') : t('emptyHint')}</p>\n {!readonly && !locked && (\n <button type=\"button\" className={css.addButton} onClick={startCreate}>{t('quickAdd')}</button>\n )}\n </div>\n )}\n </div>)}\n\n {activeTab === 'security' && (<div className={css.tabPane}>\n {recentEntries.length > 0 && (\n <div className={css.reportBox}>\n <p className={css.reportTitle}>{t('recentlyAdded')}</p>\n {recentEntries.map((e, i) => (\n <p key={i} className={css.reportLine}>{String(e.title ?? '')}{relTime((e as Record<string, unknown>).updatedAt) !== '' && ` · ${relTime((e as Record<string, unknown>).updatedAt)}`}</p>\n ))}\n </div>\n )}\n\n {recentEvents.length > 0 && (\n <div className={css.reportBox}>\n <p className={css.reportTitle}>{t('recentActivity')}</p>\n {recentEvents.map((ev, i) => (\n <p key={i} className={css.reportLine}>\n {String(ev.action ?? '')} · {String(ev.title ?? ev.id ?? '')}{relTime((ev as Record<string, unknown>).at) !== '' && ` · ${relTime((ev as Record<string, unknown>).at)}`}\n </p>\n ))}\n </div>\n )}\n\n {report !== null && (report.rotation.length > 0 || report.weak.length > 0 || report.reused.length > 0) && (\n <div className={css.reportBox}>\n <p className={css.reportTitle}>{t('reportTitle')}</p>\n {report.rotation.length > 0 && (\n <>\n <p className={css.reportLine}>{t('reportRotation')}: {report.rotation.length}</p>\n {(report.rotation as Array<{ title?: string; due?: string; daysLeft?: number }>).slice(0, 8).map((item, i) => (\n <p key={i} className={css.reportSub}>\n · {String(item.title ?? '?')}{item.due === 'expired' ? ` (${t('dueExpired')})` : item.due === 'soon' ? ` (${t('dueExpiring')} ${item.daysLeft ?? 0}d)` : ` (${t('dueNow')})`}\n </p>\n ))}\n </>\n )}\n {report.weak.length > 0 && (\n <>\n <p className={css.reportLine}>{t('reportWeak')}: {report.weak.length}</p>\n {(report.weak as Array<{ title?: string }>).slice(0, 5).map((item, i) => (\n <p key={i} className={css.reportSub}>· {String(item.title ?? '?')}</p>\n ))}\n </>\n )}\n {report.reused.length > 0 && (\n <>\n <p className={css.reportLine}>{t('reportReused')}: {report.reused.length}</p>\n {(report.reused as Array<{ entries?: Array<{ title?: string }> }>).slice(0, 3).map((group, i) => (\n <p key={i} className={css.reportSub}>\n · {(group.entries ?? []).slice(0, 3).map(e => String(e.title ?? '?')).join(' / ')}\n </p>\n ))}\n </>\n )}\n {report.no2fa.length > 0 && (\n <>\n <p className={css.reportLine}>{t('no2fa')}: {report.no2fa.length}</p>\n {(report.no2fa as Array<{ title?: string }>).slice(0, 5).map((item, i) => (\n <p key={i} className={css.reportSub}>· {String(item.title ?? '?')}</p>\n ))}\n </>\n )}\n {report.httpSites.length > 0 && (\n <>\n <p className={css.reportLine}>{t('httpSites')}: {report.httpSites.length}</p>\n {(report.httpSites as Array<{ title?: string }>).slice(0, 5).map((item, i) => (\n <p key={i} className={css.reportSub}>· {String(item.title ?? '?')}</p>\n ))}\n </>\n )}\n </div>\n )}\n\n {audit.length > 0 && (\n <div className={css.reportBox}>\n <p className={css.reportTitle}>{t('auditTitle')} ({audit.length})</p>\n {audit.slice(0, 6).map(item => (\n <div key={item.id} className={css.auditRow}>\n <span className={css.dupNames}>{item.title}</span>\n <span className={css.auditIssues}>{item.issues.join('; ')}</span>\n <button\n type=\"button\"\n className={css.dupMerge}\n onClick={() => void startEdit(item.id)}\n disabled={busy}\n >{t('auditEdit')}</button>\n </div>\n ))}\n </div>\n )}\n\n </div>)}\n\n {activeTab === 'transfer' && (<div className={css.tabPane}>\n <div className={css.reportBox}>\n <p className={css.reportTitle}>{t('systemSearch')}</p>\n <div className={css.dupGroup}>\n <input\n className={css.searchBox}\n type=\"search\"\n placeholder={t('sysSearchPlaceholder')}\n value={sysQuery}\n onChange={event => setSysQuery(event.target.value)}\n onKeyDown={event => { if (event.key === 'Enter') void searchSystemStores() }}\n />\n <button type=\"button\" className={css.dupMerge} onClick={() => void searchSystemStores()} disabled={busy}>{t('sysSearchGo')}</button>\n </div>\n {sysMatches.length > 0 && (\n <div>\n {sysMatches.map((m, i) => (\n <p key={i} className={css.reportSub}>[{m.source}] {m.name} · {m.username}</p>\n ))}\n </div>\n )}\n </div>\n\n <div className={css.reportBox}>\n <p className={css.reportTitle}>{t('systemImport')}</p>\n <div className={css.dupGroup}>\n <span className={css.dupNames}>{t('importChromeDesc')}</span>\n <button type=\"button\" className={css.dupMerge} onClick={() => void runSystemImport('chrome', false)} disabled={busy || readonly || locked}>{t('importChrome')}</button>\n </div>\n <div className={css.dupGroup}>\n <span className={css.dupNames}>{t('importFirefoxDesc')}</span>\n <button type=\"button\" className={css.dupMerge} onClick={() => void runFirefoxImport()} disabled={busy || readonly || locked}>{t('importFirefox')}</button>\n </div>\n <div className={css.dupGroup}>\n <span className={css.dupNames}>{t('importKeychainDesc')}</span>\n <button type=\"button\" className={css.dupMerge} onClick={() => void runSystemImport('keychain', true)} disabled={busy || readonly || locked}>{t('keychainPreview')}</button>\n <button type=\"button\" className={css.dupMerge} onClick={() => void runSystemImport('keychain', false)} disabled={busy || readonly || locked}>{t('importKeychain')}</button>\n </div>\n <div className={css.dupGroup}>\n <span className={css.dupNames}>{t('import1passwordDesc')}</span>\n <button type=\"button\" className={css.dupMerge} onClick={() => void runImport1password()} disabled={busy || readonly || locked}>{t('import1password')}</button>\n <button type=\"button\" className={css.dupMerge} onClick={() => void runFilePreview('import1passwordPrompt', import1password)} disabled={busy || readonly || locked}>{t('preview')}</button>\n </div>\n <div className={css.dupGroup}>\n <span className={css.dupNames}>{t('importManagerCsvDesc')}</span>\n <button type=\"button\" className={css.dupMerge} onClick={() => void runImportManagerCsv()} disabled={busy || readonly || locked}>{t('importManagerCsv')}</button>\n <button type=\"button\" className={css.dupMerge} onClick={() => void runFilePreview('importManagerCsvPrompt', importManagerCsv)} disabled={busy || readonly || locked}>{t('preview')}</button>\n </div>\n <div className={css.dupGroup}>\n <span className={css.dupNames}>{t('importEnpassDesc')}</span>\n <button type=\"button\" className={css.dupMerge} onClick={() => void runImportEnpass()} disabled={busy || readonly || locked}>{t('importEnpass')}</button>\n <button type=\"button\" className={css.dupMerge} onClick={() => void runFilePreview('importEnpassPrompt', importEnpass)} disabled={busy || readonly || locked}>{t('preview')}</button>\n </div>\n <div className={css.dupGroup}>\n <span className={css.dupNames}>{t('importBitwardenDesc')}</span>\n <button type=\"button\" className={css.dupMerge} onClick={() => void runImportBitwarden()} disabled={busy || readonly || locked}>{t('importBitwarden')}</button>\n <button type=\"button\" className={css.dupMerge} onClick={() => void runFilePreview('importBitwardenPrompt', importBitwarden)} disabled={busy || readonly || locked}>{t('preview')}</button>\n </div>\n <div className={css.dupGroup}>\n <span className={css.dupNames}>{t('importBitwardenEncryptedDesc')}</span>\n <button type=\"button\" className={css.dupMerge} onClick={() => void runImportBitwardenEncrypted()} disabled={busy || readonly || locked}>{t('importBitwardenEncrypted')}</button>\n </div>\n <div className={css.dupGroup}>\n <span className={css.dupNames}>{t('import1pifDesc')}</span>\n <button type=\"button\" className={css.dupMerge} onClick={() => void runImport1pif()} disabled={busy || readonly || locked}>{t('import1pif')}</button>\n <button type=\"button\" className={css.dupMerge} onClick={() => void runFilePreview('import1pifPrompt', import1pif)} disabled={busy || readonly || locked}>{t('preview')}</button>\n </div>\n <div className={css.dupGroup}>\n <span className={css.dupNames}>{t('importKeePassXmlDesc')}</span>\n <button type=\"button\" className={css.dupMerge} onClick={() => void runImportKeePassXml()} disabled={busy || readonly || locked}>{t('importKeePassXml')}</button>\n <button type=\"button\" className={css.dupMerge} onClick={() => void runFilePreview('importKeePassXmlPrompt', importKeePassXml)} disabled={busy || readonly || locked}>{t('preview')}</button>\n </div>\n <div className={css.dupGroup}>\n <span className={css.dupNames}>{t('importKdbxDesc')}</span>\n <button type=\"button\" className={css.dupMerge} onClick={() => void runImportKdbx()} disabled={busy || readonly || locked}>{t('importKdbx')}</button>\n </div>\n </div>\n\n <div className={css.reportBox}>\n <p className={css.reportTitle}>{t('exportTitle')}</p>\n <p className={css.reportSub}>{t('exportHint')}</p>\n <div className={css.dupGroup}>\n <span className={css.dupNames}>{t('export1puxDesc')}</span>\n <button type=\"button\" className={css.dupMerge} onClick={() => void runExport1pux()} disabled={busy || readonly || locked}>{t('export1pux')}</button>\n </div>\n <div className={css.dupGroup}>\n <span className={css.dupNames}>{t('exportBitwardenDesc')}</span>\n <button type=\"button\" className={css.dupMerge} onClick={() => void runExportBitwarden()} disabled={busy || readonly || locked}>{t('exportBitwarden')}</button>\n </div>\n </div>\n </div>)}\n\n {activeTab === 'backup' && (<div className={css.tabPane}>\n <div className={css.reportBox}>\n <p className={css.reportTitle}>{t('backupTitle')}</p>\n <p className={css.reportSub}>{t('backupHint')}</p>\n {backupInfo !== null && (\n <p className={css.reportSub}>{t('healthBackup')}: {backupInfo.daysSinceBackup}d ({backupInfo.backups})</p>\n )}\n <button type=\"button\" className={css.backupButton} onClick={() => void backupNow()} disabled={busy}>\n {t('backupNow')}\n </button>\n </div>\n\n {backupList.length > 0 && (\n <div className={css.reportBox}>\n <p className={css.reportTitle}>{t('recentBackups')} ({backupList.length})</p>\n {backupList.map(b => (\n <div key={b.path} className={css.dupGroup}>\n <span className={css.dupNames}>\n {b.vaultName !== '' ? `${b.vaultName} · ` : ''}{new Date(b.at).toLocaleString()}\n {b.size !== undefined && b.size > 0 ? ` · ${formatSize(b.size)}` : ''}\n </span>\n <button\n type=\"button\"\n className={css.dupMerge}\n onClick={() => void restoreBackupFrom(b)}\n disabled={busy || readonly || locked}\n title={t('backupRestoreHint')}\n >{t('backupRestore')}</button>\n <button\n type=\"button\"\n className={css.dangerButton}\n onClick={() => void deleteBackupFile(b)}\n disabled={busy || readonly || locked}\n title={t('backupDelete')}\n >{t('backupDelete')}</button>\n </div>\n ))}\n </div>\n )}\n {backupList.length === 0 && (\n <p className={css.empty}>{t('noBackups')}</p>\n )}\n </div>)}\n\n {activeTab === 'sessions' && (<div className={css.tabPane}>\n <div className={css.reportBox}>\n <p className={css.reportTitle}>{t('tabSessions')}</p>\n <p className={css.reportSub}>{t('sessionsIntro')}</p>\n <label className={css.field}>\n <span>{t('sessionUrlPrompt')}</span>\n <input\n type=\"text\"\n value={sessionUrl}\n onChange={event => setSessionUrl(event.target.value)}\n placeholder={t('sessionUrlPlaceholder')}\n disabled={busy || readonly || locked}\n />\n </label>\n <button type=\"button\" className={css.backupButton} onClick={() => void runSessionOpen()} disabled={busy || readonly || locked}>\n {t('sessionOpen')}\n </button>\n <p className={css.reportSub}>{t('sessionOpenHint')}</p>\n </div>\n\n <div className={css.reportBox}>\n <p className={css.reportTitle}>{t('sessionOpenList')} ({openSessions.length})</p>\n {openSessions.length === 0 && (<p className={css.empty}>{t('sessionNoOpen')}</p>)}\n {openSessions.map(s => (\n <div key={s.sessionId} className={css.dupGroup}>\n <span className={css.dupNames}>{s.url} — {t('sessionNamePlaceholder')}</span>\n <label className={css.field}>\n <input\n type=\"text\"\n value={sessionTitle}\n onChange={event => setSessionTitle(event.target.value)}\n placeholder={t('sessionNamePlaceholder')}\n disabled={busy || readonly || locked}\n />\n </label>\n <button\n type=\"button\"\n className={css.dupMerge}\n onClick={() => void runSessionCollect(s.sessionId, s.url)}\n disabled={busy || readonly || locked}\n title={t('sessionCollect')}\n >{t('sessionCollect')}</button>\n <button\n type=\"button\"\n className={css.dangerButton}\n onClick={() => void runSessionClose(s.sessionId)}\n disabled={busy}\n title={t('sessionClose')}\n >{t('sessionClose')}</button>\n </div>\n ))}\n </div>\n\n <div className={css.reportBox}>\n <p className={css.reportTitle}>{t('sessionSavedList')} ({savedSessions.length})</p>\n {savedSessions.length === 0 && (<p className={css.empty}>{t('sessionEmpty')}</p>)}\n {savedSessions.map(s => (\n <div key={s.id} className={css.dupGroup}>\n <span className={css.dupNames}>{s.title} — {s.cookieCount} {t('sessionCookie')}{(s.expiredCount ?? 0) > 0 ? ` · ${s.expiredCount} ${t('sessionExpired')}` : ''}{(s.expiringSoon ?? 0) > 0 ? ` · ${s.expiringSoon} ${t('sessionExpiringSoon')}` : ''}{s.url !== undefined ? ` · ${s.url}` : ''}</span>\n <button\n type=\"button\"\n className={css.dupMerge}\n onClick={() => void runSessionExport(s.id, 'header')}\n disabled={busy}\n title={t('sessionExport')}\n >{copiedId === s.id ? t('sessionCopied') : t('sessionExport')}</button>\n <button\n type=\"button\"\n className={css.dupMerge}\n onClick={() => void runSessionExport(s.id, 'netscape')}\n disabled={busy}\n title={t('sessionExportJar')}\n >{t('sessionExportJar')}</button>\n <button\n type=\"button\"\n className={css.dupMerge}\n onClick={() => void runSessionExport(s.id, 'playwright')}\n disabled={busy}\n title={t('sessionExportPlaywright')}\n >{t('sessionExportPlaywright')}</button>\n <button\n type=\"button\"\n className={css.dupMerge}\n onClick={() => void runSessionDetail(s.id)}\n disabled={busy}\n title={t('sessionView')}\n >{t('sessionView')}</button>\n <button\n type=\"button\"\n className={css.dupMerge}\n onClick={() => void runSessionPrune(s.id)}\n disabled={busy || readonly || locked || (s.expiredCount ?? 0) === 0}\n title={t('sessionPrune')}\n >{t('sessionPrune')}</button>\n <button\n type=\"button\"\n className={css.dangerButton}\n onClick={() => void remove(s.id)}\n disabled={busy || readonly || locked}\n title={t('sessionDelete')}\n >{t('sessionDelete')}</button>\n </div>\n ))}\n </div>\n\n {sessionDetail !== null && (\n <div className={css.reportBox}>\n <p className={css.reportTitle}>{t('sessionDetailTitle')} — {sessionDetail.title}</p>\n <p className={css.reportSub}>{sessionDetail.notes ?? ''}</p>\n {sessionDetail.cookies.map((c, index) => {\n const cookie = c as { name?: string; value?: string; domain?: string; path?: string; expires?: number; httpOnly?: boolean; secure?: boolean; sameSite?: string }\n const expiry = typeof cookie.expires === 'number' && cookie.expires >= 0\n ? new Date(cookie.expires * 1000).toLocaleString() : t('sessionSessionCookie')\n const nowSec = Math.floor(Date.now() / 1000)\n const isExpired = typeof cookie.expires === 'number' && cookie.expires > 0 && cookie.expires <= nowSec\n const expiring = typeof cookie.expires === 'number' && cookie.expires > nowSec && cookie.expires <= nowSec + 7 * 86_400\n return (\n <div key={`${index}-${cookie.name}`} className={css.auditRow}>\n <span className={css.dupNames}>{cookie.name} = {cookie.value}</span>\n <span className={css.reportSub}>{t('sessionDomain')}: {cookie.domain}{cookie.httpOnly === true ? ' · HttpOnly' : ''}{cookie.secure === true ? ' · Secure' : ''} · {t('sessionExpires')}: {expiry}{isExpired ? ` · ${t('sessionExpired')}` : ''}{expiring ? ` · ${t('sessionExpiringSoon')}` : ''}</span>\n </div>\n )\n })}\n </div>\n )}\n\n <div className={css.reportBox}>\n <p className={css.reportTitle}>{t('sessionImportPaste')}</p>\n <label className={css.field}>\n <span>{t('sessionImportPasteTitle')}</span>\n <input\n type=\"text\"\n value={sessionPasteTitle}\n onChange={event => setSessionPasteTitle(event.target.value)}\n placeholder={t('sessionNamePlaceholder')}\n disabled={busy || readonly || locked}\n />\n </label>\n <label className={css.field}>\n <span>{t('sessionImportPastePrompt')}</span>\n <textarea\n value={sessionPaste}\n onChange={event => setSessionPaste(event.target.value)}\n rows={4}\n disabled={busy || readonly || locked}\n />\n </label>\n <button type=\"button\" className={css.backupButton} onClick={() => void runSessionImport()} disabled={busy || readonly || locked}>\n {t('sessionImport')}\n </button>\n </div>\n </div>)}\n\n {activeTab === 'permissions' && (<div className={css.tabPane}>\n {policy !== null && (\n <div className={css.reportBox}>\n <p className={css.reportTitle}>{t('permTitle')}</p>\n <div className={css.policyBar}>\n <label className={css.policyField}>\n <span>{t('modeLabel')}</span>\n <select\n value={policy.accessMode}\n disabled={busy}\n onChange={event => {\n const next = event.target.value as 'readonly' | 'ask' | 'auto'\n setBusy(true)\n setMessage(null)\n void setAccessMode(next).then(\n value => { setPolicy(value); setBusy(false) },\n (err) => { setMessage(errText(err)); setBusy(false) },\n )\n }}\n >\n <option value=\"readonly\">{t('modeReadonly')}</option>\n <option value=\"ask\">{t('modeAsk')}</option>\n <option value=\"auto\">{t('modeAuto')}</option>\n </select>\n </label>\n <label className={css.policyField}>\n <span>{t('autoCaptureLabel')}</span>\n <input\n type=\"checkbox\"\n checked={policy.autoCapture}\n disabled={busy}\n onChange={event => {\n const next = event.target.checked\n setBusy(true)\n setMessage(null)\n void setAutoCapture(next).then(\n value => { setPolicy(value); setBusy(false) },\n (err) => { setMessage(errText(err)); setBusy(false) },\n )\n }}\n />\n </label>\n <label className={css.policyField}>\n <span>{t('autoLockLabel')}</span>\n <select\n value={policy.autoLockSeconds}\n disabled={busy}\n onChange={event => {\n const next = Number(event.target.value)\n setBusy(true)\n setMessage(null)\n void setAutoLock(next).then(\n value => { setPolicy(previous => previous ? { ...previous, autoLockSeconds: value.seconds } : previous); setBusy(false) },\n (err) => { setMessage(errText(err)); setBusy(false) },\n )\n }}\n >\n <option value={0}>{t('autoLockNever')}</option>\n <option value={60}>{t('autoLock1m')}</option>\n <option value={300}>{t('autoLock5m')}</option>\n <option value={900}>{t('autoLock15m')}</option>\n <option value={1800}>{t('autoLock30m')}</option>\n <option value={3600}>{t('autoLock1h')}</option>\n </select>\n </label>\n <p className={policy.accessMode === 'readonly' ? css.modeReadonly : policy.accessMode === 'ask' ? css.modeAsk : css.modeAuto}>\n {policy.accessMode === 'readonly'\n ? t('modeReadonlyHint')\n : policy.accessMode === 'ask'\n ? t('modeAskHint')\n : t('modeAutoHint')}\n {policy.autoCapture ? ` · ${t('autoCaptureOn')}` : ` · ${t('autoCaptureOff')}`}\n {policy.autoLockSeconds > 0 ? ` · ${t('autoLockHint')}: ${formatAutoLock(policy.autoLockSeconds)}` : ` · ${t('autoLockNeverHint')}`}\n </p>\n </div>\n </div>\n )}\n\n {tagList.length > 0 && (\n <div className={css.reportBox}>\n <p className={css.reportTitle}>{t('tagManage')} ({tagList.length})</p>\n {tagList.slice(0, 8).map(tag => (\n <div key={tag.name} className={css.dupGroup}>\n <span className={css.dupNames}>{tag.name} ({tag.count})</span>\n <button\n type=\"button\"\n className={css.dupMerge}\n onClick={() => void renameTagAll(tag.name)}\n disabled={busy || readonly || locked}\n >{t('tagRename')}</button>\n </div>\n ))}\n </div>\n )}\n\n {dupList.length > 0 && (\n <div className={css.reportBox}>\n <p className={css.reportTitle}>{t('dupTitle')} ({dupList.length})</p>\n {dupList.slice(0, 5).map((group, gi) => (\n <div key={gi} className={css.dupGroup}>\n <span className={css.dupNames}>{group.map(g => g.title).join(' / ')}</span>\n <button\n type=\"button\"\n className={css.dupMerge}\n onClick={() => void mergeEntries(group)}\n disabled={busy || readonly || locked}\n >{t('dupMerge')}</button>\n </div>\n ))}\n </div>\n )}\n </div>)}\n\n {activeTab === 'trash' && (<div className={css.tabPane}>\n {trashEntries.length === 0 && <p className={css.empty}>{t('trashEmpty')}</p>}\n {trashEntries.length > 0 && (\n <ul className={css.list}>\n {trashEntries.map(entry => (\n <li key={entry.id} className={css.row}>\n <div className={css.rowMain}>\n <span className={css.title}>{entry.title}</span>\n <span className={css.identity}>{t('trashed')}</span>\n </div>\n <div className={css.rowActions}>\n <button\n type=\"button\"\n onClick={() => { void restore(entry.id).then(() => { void trash().then(setTrashEntries); void refresh() }) }}\n disabled={busy || readonly || locked}\n >{t('restore')}</button>\n <button\n type=\"button\"\n className={css.dangerButton}\n onClick={() => {\n if (!window.confirm(t('purgeOneConfirm').replace('{name}', entry.title))) return\n void purge(entry.id).then(() => { void trash().then(setTrashEntries); void refresh() })\n }}\n disabled={busy || readonly || locked}\n >{t('purge')}</button>\n </div>\n </li>\n ))}\n </ul>\n )}\n {trashEntries.length > 0 && (\n <>\n <button\n type=\"button\"\n className={css.trashButton}\n onClick={() => {\n setBusy(true)\n void undeleteAll().then(() => {\n void trash().then(setTrashEntries)\n void refresh()\n setBusy(false)\n }, () => setBusy(false))\n }}\n disabled={busy || readonly || locked}\n >{t('restoreAll')}</button>\n <button\n type=\"button\"\n className={css.dangerButton}\n onClick={() => {\n if (!window.confirm(t('clearTrashConfirm'))) return\n setBusy(true)\n void Promise.all(trashEntries.map(e => purge(e.id))).then(() => {\n void trash().then(setTrashEntries)\n void refresh()\n setBusy(false)\n }, () => setBusy(false))\n }}\n disabled={busy || readonly || locked}\n >{t('clearTrash')}</button>\n </>\n )}\n </div>)}\n\n {activeTab === 'entries' && (<div className={css.tabPane}>\n {state.status === 'ready' && filteredCount(state.entries, kindFilter, tagFilter) > visibleCount && (\n <button\n type=\"button\"\n className={css.trashButton}\n onClick={() => setVisibleCount(count => count + 50)}\n >{t('loadMore')} ({filteredCount(state.entries, kindFilter, tagFilter) - visibleCount})</button>\n )}\n\n {state.status === 'ready' && state.entries.length > 0 && (\n <>\n <p className={css.resultCount}>\n {t('resultCount')}: {filteredCount(state.entries, kindFilter, tagFilter)}\n {(() => {\n const byKind = new Map<string, number>()\n for (const e of state.entries) {\n if ((kindFilter === '' || e.kind === kindFilter) && (tagFilter === '' || (e.tags ?? []).includes(tagFilter))) {\n const k = e.kind ?? 'login'\n byKind.set(k, (byKind.get(k) ?? 0) + 1)\n }\n }\n return [...byKind.entries()].map(([k, n]) => (\n <span key={k} className={css.kindChip}>{t(KIND_KEYS[k] ?? 'kindCustom')} {n}</span>\n ))\n })()}\n </p>\n <ul className={css.list}>\n {filteredCount(state.entries, kindFilter, tagFilter) === 0 && (\n <li className={css.empty}>{t('noFiltered')}</li>\n )}\n {state.entries.filter(entry => (kindFilter === '' || entry.kind === kindFilter) && (tagFilter === '' || (entry.tags ?? []).includes(tagFilter))).sort((a, b) => sortBy === 'alpha' ? a.title.localeCompare(b.title) : sortBy === 'recent' ? (b.updatedAt ?? 0) - (a.updatedAt ?? 0) : sortBy === 'created' ? (b.createdAt ?? 0) - (a.createdAt ?? 0) : ((a as VaultSummaryWire & { favorite?: boolean }).favorite === true ? 0 : 1) - ((b as VaultSummaryWire & { favorite?: boolean }).favorite === true ? 0 : 1) || (b.updatedAt ?? 0) - (a.updatedAt ?? 0) || a.title.localeCompare(b.title)).slice(0, visibleCount).map(entry => {\n const totpInfo = totpMap[entry.id]\n const remaining = totpInfo !== undefined && totpInfo.until > 0 ? Math.max(0, Math.ceil((totpInfo.until - nowTick) / 1000)) : undefined\n const frac = remaining !== undefined ? remaining / 30 : 0\n const code = totpInfo?.code\n return (\n <li key={entry.id} className={`${css.row}${dueMap[entry.id] !== undefined ? ` ${dueMap[entry.id]!.due === 'expired' ? css.rowExpired : css.rowDue}` : ''}`}>\n <div className={css.rowMain} onClick={() => setExpandedId(expandedId === entry.id ? null : entry.id)}>\n <span className={css.title} style={entry.color !== undefined && entry.color !== '' ? { borderLeft: `3px solid ${entry.color}`, paddingLeft: 6 } : undefined}>\n <span className={css.kindIcon}>{entry.icon ?? kindIcon(entry.kind)}</span>\n <button\n type=\"button\"\n className={`${css.pinStar} ${(entry as VaultSummaryWire & { favorite?: boolean }).favorite ? css.pinOn : css.pinOff}`}\n title={t('togglePinHint')}\n disabled={busy || locked}\n onClick={event => {\n event.stopPropagation()\n const next = !(entry as VaultSummaryWire & { favorite?: boolean }).favorite\n void setFavorite(entry.id, next).then(() => void refresh())\n }}\n >★</button>\n {entry.title}\n {(entry as VaultSummaryWire & { sensitivity?: string }).sensitivity === 'high' && (\n <span className={css.highBadge}>{t('highSensitivity')}</span>\n )}\n {dueMap[entry.id] !== undefined && (\n <span className={`${css.dueBadge} ${dueMap[entry.id]!.due === 'expired' ? css.badgeDanger : css.badgeWarn}`}>\n {dueMap[entry.id]!.due === 'expired' ? t('dueExpired') : dueMap[entry.id]!.due === 'soon' ? `${t('dueExpiring')} ${dueMap[entry.id]!.daysLeft}d` : t('dueNow')}\n </span>\n )}\n {passwordAge(entry) !== '' && (\n <span className={css.dueBadge} title={t('ageHint')}>{passwordAge(entry)}</span>\n )}\n {watchMap[entry.id] !== undefined && watchMap[entry.id]!.verdict !== 'good' && (\n <span className={`${css.dueBadge} ${watchMap[entry.id]!.verdict === 'poor' ? css.badgeDanger : css.badgeWarn}`} title={t('watchFlagsTitle') + watchMap[entry.id]!.flags.join(', ')}>\n {t('watchScore').replace('{n}', String(watchMap[entry.id]!.score))}\n </span>\n )}\n </span>\n <span className={css.identity}>{identityLine(entry)}</span>\n {uriMap[entry.id] !== undefined && uriMap[entry.id] !== '' && (\n <span className={css.totp} title={t('totpUriHint')}>\n <code className={css.uriCode}>{uriMap[entry.id]}</code>\n </span>\n )}\n {code !== undefined && (\n <span className={css.totp}>\n <svg className={css.totpRing} width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <circle cx=\"8\" cy=\"8\" r=\"6.5\" fill=\"none\" stroke=\"var(--dsh-color-border, #ddd)\" strokeWidth=\"2\" />\n <circle\n cx=\"8\" cy=\"8\" r=\"6.5\" fill=\"none\"\n stroke={remaining !== undefined && remaining <= 5 ? '#cf3d3d' : '#2e9e5b'}\n strokeWidth=\"2\" strokeLinecap=\"round\"\n strokeDasharray={`${(frac * 2 * Math.PI * 6.5).toFixed(1)} ${(2 * Math.PI * 6.5).toFixed(1)}`}\n transform=\"rotate(-90 8 8)\"\n />\n </svg>\n {code}{remaining !== undefined ? ` (${remaining}s)` : ''}\n </span>\n )}\n </div>\n {expandedId === entry.id && (\n <div className={css.detailBox}>\n {Object.entries(entry).filter(([k]) => !['id', 'title', 'favorite'].includes(k) && entry[k as keyof VaultSummaryWire] !== undefined).map(([k, v]) => (\n <span key={k} className={css.detailItem}>\n <strong>{k}</strong>: {formatDetail(k, v)}\n <button\n type=\"button\"\n className={css.revealButton}\n title={t('copyFieldHint')}\n onClick={() => void copyValue(entry.id, Array.isArray(v) ? v.join(', ') : String(v))}\n disabled={locked}\n >⧉</button>\n </span>\n ))}\n {(attachmentsMap[entry.id] ?? []).length > 0 && (\n <div className={css.attachBox}>\n <strong>{t('attachmentsTitle')}:</strong>\n {(attachmentsMap[entry.id] ?? []).map(a => (\n <span key={a.name} className={css.detailItem}>\n 📎 {a.name} ({formatSize(a.size)})\n <button\n type=\"button\"\n className={css.revealButton}\n title={t('detachHint')}\n disabled={busy || readonly || locked}\n onClick={() => {\n setBusy(true)\n void detach(entry.id, a.name).then(() => {\n void attachments(entry.id).then(r => {\n if (r.found) setAttachmentsMap(prev => ({ ...prev, [entry.id]: r.attachments }))\n })\n setBusy(false)\n }, () => setBusy(false))\n }}\n >✕</button>\n </span>\n ))}\n </div>\n )}\n </div>\n )}\n <div className={css.rowActions}>\n {copiedId === entry.id && <span className={css.copied}>{t('copied')} · {t('clearsIn30s')}</span>}\n <button\n type=\"button\"\n onClick={() => void copyValue(entry.id, entry.username ?? entry.title)}\n disabled={busy || readonly || locked}\n >{t('copy')}</button>\n <button\n type=\"button\"\n onClick={() => {\n setBusy(true)\n void get(entry.id).then(r => {\n if (r.found && r.entry?.password) void copyValue(entry.id, r.entry.password)\n setBusy(false)\n }, () => setBusy(false))\n }}\n disabled={busy || readonly || locked}\n >{t('copyPassword')}</button>\n <button type=\"button\" onClick={() => void showTotp(entry.id)} disabled={busy || locked}>{t('totp')}</button>\n <button type=\"button\" onClick={() => void showTotpUri(entry.id)} disabled={busy || locked} title={t('totpUriHint')}>{t('totpUri')}</button>\n {code !== undefined && (\n <button type=\"button\" onClick={() => void copyValue(entry.id, code)} disabled={busy || locked}>{t('copyCode')}</button>\n )}\n {entry.url !== undefined && entry.url !== '' && (\n <button type=\"button\" onClick={() => window.open(entry.url!, '_blank', 'noopener')} title={t('openUrlHint')}>{t('openUrl')}</button>\n )}\n <button type=\"button\" onClick={() => void touch(entry.id).then(() => void refresh())} disabled={busy || readonly || locked} title={t('touchHint')}>{t('touch')}</button>\n <button type=\"button\" onClick={() => void startEdit(entry.id)} disabled={busy || readonly || locked}>{t('edit')}</button>\n <button\n type=\"button\"\n className={css.deleteButton}\n onClick={() => void removeEntry(entry.id)}\n disabled={busy || readonly || locked}\n >{t('delete')}</button>\n </div>\n </li>\n )\n })}\n </ul>\n </>\n )}\n </div>)}\n\n {activeTab === 'security' && (<div className={css.tabPane}>\n {state.status === 'ready' && (\n <div className={css.healthBar}>\n {vaultStats !== null && typeof vaultStats.total === 'number' && (\n <span className={css.badge}>{t('entryCount')}: {String(vaultStats.total)}</span>\n )}\n {vaultStats !== null && typeof vaultStats.withTotp === 'number' && (\n <span className={css.badge}>TOTP: {String(vaultStats.withTotp)}</span>\n )}\n {vaultStats !== null && typeof vaultStats.highSensitivity === 'number' && (\n <span className={css.badge}>{t('highSensitivity')}: {String(vaultStats.highSensitivity)}</span>\n )}\n {report !== null && report.strength !== null && (\n <span className={`${css.badge} ${report.strength.weak > 0 ? css.badgeDanger : css.badgeOk}`}>\n {t('healthStrength')}: {report.strength.weak}W/{report.strength.fair}F/{report.strength.strong}S\n </span>\n )}\n {report !== null && (\n <span className={`${css.badge} ${report.verdict === 'good' ? css.badgeOk : report.verdict === 'fair' ? css.badgeWarn : css.badgeDanger}`}>\n <svg className={css.scoreRing} width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <circle cx=\"8\" cy=\"8\" r=\"6.5\" fill=\"none\" stroke=\"var(--dsh-color-border, #ddd)\" strokeWidth=\"2\" />\n <circle\n cx=\"8\" cy=\"8\" r=\"6.5\" fill=\"none\"\n stroke={report.verdict === 'good' ? '#2e9e5b' : report.verdict === 'fair' ? '#c98a1b' : '#cf3d3d'}\n strokeWidth=\"2\" strokeLinecap=\"round\"\n strokeDasharray={`${(report.score / 100 * 2 * Math.PI * 6.5).toFixed(1)} ${(2 * Math.PI * 6.5).toFixed(1)}`}\n transform=\"rotate(-90 8 8)\"\n />\n </svg>\n {t('healthScore')}: {report.score} ({t(VERDICT_KEYS[report.verdict] ?? 'verdictGood')})\n </span>\n )}\n {report !== null && report.no2fa.length > 0 && (\n <span className={`${css.badge} ${css.badgeWarn}`}>{t('no2fa')}: {report.no2fa.length}</span>\n )}\n {report !== null && report.httpSites.length > 0 && (\n <span className={`${css.badge} ${css.badgeWarn}`}>{t('httpSites')}: {report.httpSites.length}</span>\n )}\n {report !== null && report.rotation.length > 0 && (\n <span className={`${css.badge} ${css.badgeWarn}`}>{t('reportRotation')}: {report.rotation.length}</span>\n )}\n {vaultStats !== null && typeof vaultStats.expired === 'number' && vaultStats.expired > 0 && (\n <span className={`${css.badge} ${css.badgeDanger}`}>{t('dueExpired')}: {String(vaultStats.expired)}</span>\n )}\n {report !== null && report.weak.length > 0 && (\n <span className={`${css.badge} ${css.badgeDanger}`}>{t('reportWeak')}: {report.weak.length}</span>\n )}\n {report !== null && report.reused.length > 0 && (\n <span className={`${css.badge} ${css.badgeDanger}`}>{t('reportReused')}: {report.reused.length}</span>\n )}\n {dupGroups > 0 && (\n <span className={`${css.badge} ${css.badgeWarn}`}>{t('dupGroups')}: {dupGroups}</span>\n )}\n {report !== null && report.rotation.length === 0 && report.weak.length === 0 && report.reused.length === 0 && (\n <span className={`${css.badge} ${css.badgeOk}`}>{t('healthOk')}</span>\n )}\n {backupInfo !== null && backupInfo.daysSinceBackup >= 0 && (\n <span className={`${css.badge} ${backupInfo.daysSinceBackup > 14 ? css.badgeDanger : backupInfo.daysSinceBackup > 7 ? css.badgeWarn : ''}`}>\n {t('healthBackup')}: {backupInfo.daysSinceBackup}d ({backupInfo.backups})\n </span>\n )}\n <button type=\"button\" className={css.backupButton} onClick={() => void exportReportCsv()} disabled={busy || report === null}>\n {t('exportReport')}\n </button>\n <button type=\"button\" className={css.backupButton} onClick={() => void backupNow()} disabled={busy}>\n {t('backupNow')}\n </button>\n <button type=\"button\" className={css.backupButton} onClick={() => void runBreachCheck()} disabled={busy}>\n {t('breachCheck')}\n </button>\n <button type=\"button\" className={css.backupButton} onClick={() => void lockNow()} disabled={busy || locked}>\n {t('lock')}\n </button>\n <button type=\"button\" className={css.backupButton} onClick={() => void runRecoveryCode()} disabled={busy || locked}>\n {t('recoveryCode')}\n </button>\n <button type=\"button\" className={css.backupButton} onClick={() => void runVerifyRecovery()} disabled={busy || locked}>\n {t('recoveryVerify')}\n </button>\n </div>\n )}\n\n {breach !== null && (breach.pwned.length > 0 || breach.weak.length > 0) && (\n <div className={css.reportBox}>\n <p className={css.reportTitle}>{t('breachTitle')}{breach.offline ? ` (${t('breachOffline')})` : ''}</p>\n {breach.pwned.slice(0, 6).map(item => (\n <p key={item.id} className={css.reportSub}>· {item.title} — {t('breachPwned')}{item.count > 0 ? ` ×${item.count}` : ''}</p>\n ))}\n {breach.weak.slice(0, 6).map(item => (\n <p key={item.id} className={css.reportSub}>· {item.title} — {t('breachWeak')}</p>\n ))}\n </div>\n )}\n {state.status === 'ready' && (\n <p className={css.footer}>\n {t('entryCount')}: {state.entries.length}\n {vaultStats !== null && typeof vaultStats.withTotp === 'number' && ` · TOTP: ${String(vaultStats.withTotp)}`}\n {vaultStats !== null && typeof vaultStats.highSensitivity === 'number' && ` · ${t('highSensitivity')}: ${String(vaultStats.highSensitivity)}`}\n {backupInfo !== null && backupInfo.daysSinceBackup >= 0 && ` · backup: ${backupInfo.daysSinceBackup}d ago`}\n {vaultStats !== null && typeof vaultStats.byTag === 'object' && vaultStats.byTag !== null\n && Object.keys(vaultStats.byTag as Record<string, unknown>).length > 0\n && ` · tags: ${Object.entries(vaultStats.byTag as Record<string, unknown>).map(([k, v]) => `${k}(${String(v)})`).join(' ')}`}\n </p>\n )}\n\n </div>)}\n\n {editor.status !== 'closed' && (\n <div className={css.editor} role=\"dialog\" aria-label={editor.status === 'creating' ? t('add') : t('edit')}>\n <div className={css.editorBody}>\n <div className={css.genOpts}>\n <label className={css.genOptRow}>\n <span>{t('tplApply')}</span>\n <select\n value=\"\"\n onChange={event => { const v = event.target.value; if (v) applyTemplate(v) }}\n >\n <option value=\"\">—</option>\n {tplList.map(tpl => <option key={tpl.name} value={tpl.name}>{templateLabel(tpl.name)}</option>)}\n </select>\n </label>\n {editor.status === 'editing' && (\n <button type=\"button\" className={css.retryButton} onClick={() => void saveAsTemplate()} disabled={busy}>{t('tplSave')}</button>\n )}\n </div>\n {FORM_FIELDS.filter(f => {\n const kind = form.kind ?? 'login'\n // Card-only fields show only for the card kind; everything else\n // is hidden when a card is selected (keeps the form focused).\n if (f.key === 'cardNumber' || f.key === 'cardExpiry' || f.key === 'cardCvv' || f.key === 'cardHolder') {\n return kind === 'card'\n }\n return kind !== 'card' || f.key === 'title' || f.key === 'kind' || f.key === 'notes' || f.key === 'icon' || f.key === 'color'\n }).map(field => (\n <label key={field.key} className={css.field}>\n <span>{t(field.label)}</span>\n {field.key === 'kind' ? (\n <select\n value={form.kind ?? 'login'}\n onChange={event => changeKind(event.target.value)}\n >\n {Object.entries(KIND_KEYS).map(([value, key]) => (\n <option key={value} value={value}>{t(key)}</option>\n ))}\n </select>\n ) : field.key === 'title' ? (\n <input\n value={form.title ?? ''}\n onChange={event => setForm(previous => ({ ...previous, title: event.target.value }))}\n />\n ) : field.key === 'password' || field.key === 'otpSecret' || field.key === 'apiKey'\n || field.key === 'secret' || field.key === 'accessToken' || field.key === 'refreshToken'\n || field.key === 'privateKey' ? (\n <span className={css.secretField}>\n <input\n type={revealed[field.key] ? 'text' : 'password'}\n value={(form[field.key] as string | undefined) ?? ''}\n onChange={event => setForm(previous => ({ ...previous, [field.key]: event.target.value }))}\n />\n {field.key === 'password' && (\n <>\n <button\n type=\"button\"\n className={css.revealButton}\n title={t('genPwHint')}\n onClick={() => { void generatePassword(genOpts).then(r => { setForm(previous => ({ ...previous, password: r.password })); void generatorHistory().then(setGenHistory).catch(() => {}) }) }}\n >{t('genPw')}</button>\n <button\n type=\"button\"\n className={css.revealButton}\n title={t('genOptsHint')}\n onClick={() => setShowGenOpts(v => !v)}\n >⚙</button>\n </>\n )}\n <button\n type=\"button\"\n className={css.revealButton}\n onClick={() => setRevealed(previous => ({ ...previous, [field.key]: !previous[field.key] }))}\n >{revealed[field.key] ? t('hide') : t('show')}</button>\n </span>\n ) : field.key === 'expiresAt' ? (\n <input\n type=\"datetime-local\"\n value={form.expiresAt !== undefined ? new Date(form.expiresAt).toISOString().slice(0, 16) : ''}\n onChange={event => {\n const raw = event.target.value\n const epoch = raw.length > 0 ? Date.parse(raw) : NaN\n setForm(previous => ({ ...previous, expiresAt: Number.isNaN(epoch) ? undefined : epoch }))\n }}\n />\n ) : field.key === 'rotationDays' ? (\n <input\n type=\"number\"\n min={0}\n max={3650}\n placeholder={t('rotationClearHint')}\n value={form.rotationDays ?? ''}\n onChange={event => {\n const raw = event.target.value\n setForm(previous => ({ ...previous, rotationDays: raw.length > 0 ? Number(raw) : undefined }))\n }}\n />\n ) : field.key === 'sensitivity' ? (\n <select\n value={form.sensitivity ?? 'normal'}\n onChange={event => setForm(previous => ({ ...previous, sensitivity: event.target.value === 'high' ? 'high' : 'normal' }))}\n >\n <option value=\"normal\">{t('sensitivityNormal')}</option>\n <option value=\"high\">{t('sensitivityHigh')}</option>\n </select>\n ) : field.key === 'favorite' ? (\n <label className={css.checkField}>\n <input\n type=\"checkbox\"\n checked={form.favorite ?? false}\n onChange={event => setForm(previous => ({ ...previous, favorite: event.target.checked }))}\n />\n {t('favoriteHint')}\n </label>\n ) : field.key === 'username' ? (\n <span className={css.secretField}>\n <input\n type=\"text\"\n value={(form.username as string | undefined) ?? ''}\n onChange={event => setForm(previous => ({ ...previous, username: event.target.value }))}\n />\n <button\n type=\"button\"\n className={css.revealButton}\n title={t('genUserHint')}\n onClick={() => { void generateUsername().then(r => setForm(previous => ({ ...previous, username: r.username }))) }}\n >{t('genUser')}</button>\n </span>\n ) : (\n <input\n type=\"text\"\n value={(form[field.key] as string | undefined) ?? ''}\n onChange={event => setForm(previous => ({ ...previous, [field.key]: event.target.value }))}\n />\n )}\n </label>\n ))}\n {pwStrength !== null && (\n <div className={css.pwMeter}>\n <div className={`${css.pwBar} ${pwStrength.score >= 60 ? css.pwStrong : pwStrength.score >= 40 ? css.pwFair : css.pwWeak}`} style={{ width: `${pwStrength.score}%` }} />\n <span className={css.pwLabel}>{t('strengthLabel')}: {pwStrength.score}/100 ({t(VERDICT_KEYS_SHORT[pwStrength.verdict] ?? 'verdictGood')})</span>\n </div>\n )}\n {showGenOpts && (\n <div className={css.genOpts}>\n <label className={css.genOptRow}>\n <span>{t('genPassphrase')}</span>\n <input\n type=\"checkbox\"\n checked={genOpts.passphrase}\n onChange={event => setGenOpts(previous => ({ ...previous, passphrase: event.target.checked }))}\n />\n </label>\n {genOpts.passphrase ? (\n <>\n <label className={css.genOptRow}>\n <span>{t('genWords')}</span>\n <input\n type=\"number\" min={2} max={12} value={genOpts.words}\n onChange={event => setGenOpts(previous => ({ ...previous, words: Math.max(2, Math.min(12, Number(event.target.value) || 4)) }))}\n />\n </label>\n <label className={css.genOptRow}>\n <span>{t('genSeparator')}</span>\n <input\n type=\"text\" maxLength={4} value={genOpts.separator}\n onChange={event => setGenOpts(previous => ({ ...previous, separator: event.target.value }))}\n />\n </label>\n <label className={css.genOptRow}>\n <span>{t('genWordDigits')}</span>\n <input\n type=\"checkbox\"\n checked={genOpts.wordDigits}\n onChange={event => setGenOpts(previous => ({ ...previous, wordDigits: event.target.checked }))}\n />\n </label>\n </>\n ) : (\n <>\n <label className={css.genOptRow}>\n <span>{t('genLength')}</span>\n <input\n type=\"number\" min={6} max={64} value={genOpts.length}\n onChange={event => setGenOpts(previous => ({ ...previous, length: Math.max(6, Math.min(64, Number(event.target.value) || 24)) }))}\n />\n </label>\n {(['uppercase', 'lowercase', 'digits', 'symbols', 'excludeAmbiguous'] as const).map(key => (\n <label key={key} className={css.genOptRow}>\n <span>{t(GEN_OPT_KEYS[key] ?? 'genOptUppercase')}</span>\n <input\n type=\"checkbox\"\n checked={genOpts[key]}\n onChange={event => setGenOpts(previous => ({ ...previous, [key]: event.target.checked }))}\n />\n </label>\n ))}\n </>\n )}\n {genHistory.length > 0 && (\n <div className={css.genHist}>\n <span>{t('genHistory')}:</span>\n {genHistory.slice(0, 3).map((h, i) => (\n <button\n key={i}\n type=\"button\"\n className={css.revealButton}\n onClick={() => setForm(previous => ({ ...previous, password: h.password }))}\n title={new Date(h.at).toLocaleString()}\n >{h.password}</button>\n ))}\n </div>\n )}\n </div>\n )}\n <label className={css.field}>\n <span>{t('fieldTags')}</span>\n <input\n list=\"dsh-vault-tags\"\n value={tagsDraft}\n onChange={event => setTagsDraft(event.target.value)}\n placeholder=\"dev, prod\"\n />\n <datalist id=\"dsh-vault-tags\">\n {[...new Set(state.status === 'ready' ? state.entries.flatMap(e => e.tags ?? []) : [])].sort().map(tag => (\n <option key={tag} value={tag} />\n ))}\n </datalist>\n </label>\n <label className={css.field}>\n <span>{t('fieldCustom')}</span>\n <textarea\n value={fieldsDraft}\n onChange={event => setFieldsDraft(event.target.value)}\n rows={3}\n placeholder=\"region=us-east-1 team=infra\"\n />\n </label>\n </div>\n <div className={css.editorActions}>\n <button type=\"button\" onClick={() => setEditor({ status: 'closed' })} disabled={busy}>{t('cancel')}</button>\n <button type=\"button\" className={css.saveButton} onClick={() => void save()} disabled={busy}>{t('save')}</button>\n </div>\n </div>\n )}\n </section>\n )\n}\n","/** Copy dictionaries for the Vault settings section. */\n\n/** English strings (the key-set source of truth for this pair). */\nexport const en = {\n nav: 'Vault',\n heading: 'Vault',\n intro: 'Encrypted credentials stored on this machine.',\n searchPlaceholder: 'Search title, username, email, host…',\n loading: 'Loading…',\n empty: 'No credentials yet. Add one to get started.',\n noFiltered: 'No entries match the current filter.',\n emptyHint: 'Tip: you can ask the assistant to save an API key or token you share in chat — with auto-capture on it offers to store it for you. Bulk importing? Ask for vault_import_csv with a CSV file path.',\n emptyHintReadonly: 'The vault is in readonly mode — credentials can be read but not added here. Switch accessMode to \"readwrite\" to enable writes.',\n modeLabel: 'Access mode',\n autoCaptureLabel: 'Auto-capture credentials from chat',\n modeReadonly: 'Read-only',\n modeAsk: 'Ask before writing',\n modeAuto: 'Automatic read-write',\n modeReadonlyHint: 'Read-only — mutations disabled',\n modeAskHint: 'Prompt before writing — every add/update/delete asks you',\n modeAutoHint: 'Automatic read-write — no per-call prompt',\n autoCaptureOn: 'auto-capture on',\n autoCaptureOff: 'auto-capture off',\n clearSearch: 'Clear search',\n entryCount: 'Entries',\n reportTitle: 'Health & rotation',\n recentActivity: 'Recent activity',\n recentlyAdded: 'Recently added',\n reportRotation: 'expired / due for rotation',\n reportWeak: 'weak passwords',\n reportReused: 'credentials reused across entries',\n dupGroups: 'duplicate groups',\n dupTitle: 'Duplicate entries',\n dupMerge: 'Merge',\n healthOk: 'vault healthy',\n healthBackup: 'backup',\n backupNow: 'Backup now',\n backupDone: 'Backup created',\n lockedBanner: 'Vault is locked — unlock it with vault_unlock to read or write entries.',\n vaultSelect: 'Active vault',\n vaultRename: 'Rename vault',\n vaultRenamePrompt: 'New name for the vault',\n vaultDelete: 'Delete',\n vaultDeleteConfirm: 'Permanently delete vault \"{name}\"? This cannot be undone.',\n vaultDeleteDefault: 'The default vault cannot be deleted.',\n touch: 'Used',\n touchHint: 'Mark as recently used',\n auditTitle: 'Needs attention',\n auditEdit: 'Edit',\n breachCheck: 'Check breaches',\n exportReport: 'Export report',\n reportExported: 'Security report exported as CSV.',\n breachTitle: 'Breach scan',\n breachPwned: 'password appeared in breaches',\n breachWeak: 'common/weak password',\n breachOffline: 'offline fallback',\n breachOk: 'No breached or weak passwords found',\n breachOkOffline: 'No weak passwords found (offline — online breach check unavailable)',\n healthScore: 'Security score',\n verdictGood: 'good',\n verdictFair: 'fair',\n verdictPoor: 'poor',\n no2fa: 'No 2FA',\n genPw: 'Generate',\n genPwHint: 'Fill with a generated strong password',\n retry: 'Retry',\n genUser: 'Generate',\n genUserHint: 'Fill with a generated username',\n loadMore: 'Load more',\n clearsIn30s: 'clears in 30s',\n openUrl: 'Open',\n openUrlHint: 'Open the associated website',\n genOptsHint: 'Password generator options',\n genLength: 'Length',\n genOptUppercase: 'Uppercase',\n genOptLowercase: 'Lowercase',\n genOptDigits: 'Digits',\n genOptSymbols: 'Symbols',\n genOptExcludeAmbiguous: 'No ambiguous chars',\n strengthLabel: 'Strength',\n tplApply: 'Apply template',\n tplSave: 'Save as template',\n tplNamePrompt: 'Template name:',\n tplSaved: 'Template saved:',\n lock: 'Lock',\n recoveryCode: 'Generate recovery code',\n recoveryCodeConfirm: 'Generate a one-time recovery code? It is shown only once (store it safely, e.g. printed); only its hash is kept.',\n recoveryCodeAlert: 'Your one-time recovery code (shown once — store it safely):',\n recoveryCodeSet: 'Recovery code generated (shown once).',\n recoveryVerify: 'Verify recovery code',\n recoveryCodeVerifyPrompt: 'Enter the recovery code to verify:',\n recoveryVerified: 'Recovery code verified.',\n recoveryNotVerified: 'Recovery code does not match.',\n lockedMsg: 'Vault locked — unlock with vault_unlock',\n ageToday: 'new',\n ageHint: 'Updated days ago (password age)',\n watchPoor: '⚠ high risk',\n watchWarn: '⚠ attention',\n watchScore: '{n}',\n watchFlagsTitle: 'Risks: ',\n resultCount: 'Results',\n totpUri: 'URI',\n totpUriHint: 'Show otpauth URI for another device',\n pwChangeConfirm: 'Changing the password — continue?',\n copyFieldHint: 'Copy this field value',\n tagManage: 'Tags',\n tagRename: 'Rename',\n tagRenamePrompt: 'New name for tag',\n genHistory: 'Recently generated',\n recentBackups: 'Recent backups',\n backupTitle: 'Encrypted backups',\n backupHint: 'Backups are encrypted copies of the vault document kept in the same folder. Restoring replaces the live vault with the selected snapshot; a safety copy of the current state is written first.',\n backupRestore: 'Restore',\n backupRestoreHint: 'Restore the vault from this backup',\n backupRestoreConfirm: 'Restore the vault from this backup? The current vault is snapshotted first, then replaced.',\n backupRestoreModeMerge: 'Merge this backup into the current vault (entries are copied in, existing same-title entries are kept)? OK = merge. Cancel = replace the whole vault.',\n backupRestoreModeReplace: 'Replace the WHOLE vault with this backup? A safety snapshot is written first.',\n backupDelete: 'Delete',\n backupDeleteConfirm: 'Delete this backup file permanently?',\n backupDeleted: 'Backup deleted.',\n backupSafetyHint: 'Pre-restore snapshot saved to',\n noBackups: 'No backups yet — create one with \"Backup now\".',\n permTitle: 'Access permissions & capture',\n systemImport: 'System import',\n importChrome: 'Import Chrome',\n importChromeDesc: 'Chrome password manager (Login Data)',\n importKeychain: 'Import Keychain',\n importKeychainDesc: 'macOS Keychain (internet passwords — website logins)',\n importKeychainHint: 'Reads internet passwords (inet) by default — the entries that actually back website logins (Wi-Fi and app secrets are generic passwords and are skipped). First-time authorization: choose \"Always Allow\" once for this process.',\n keychainPreview: 'Preview',\n preview: 'Preview',\n previewLabel: 'Preview —',\n keychainPromptWarn: 'Importing from the Keychain may prompt macOS for authorization for each entry. First time: choose \"Always Allow\" to consent once for this process. Continue?',\n systemSearch: 'Search system stores',\n sysSearchPlaceholder: 'Search Chrome / Keychain…',\n sysSearchGo: 'Search',\n importFirefox: 'Import Firefox',\n importFirefoxDesc: 'Firefox profile (logins.json + key4.db)',\n firefoxMasterPw: 'Firefox primary password (leave empty if none):',\n import1password: 'Import 1Password',\n import1passwordDesc: '1Password 1PUX export (.1pux)',\n import1passwordPrompt: 'Path to the .1pux file:',\n importManagerCsv: 'Import manager CSV',\n importManagerCsvDesc: 'Password-manager CSV (Dashlane / NordPass / Keeper)',\n importManagerCsvPrompt: 'Path to the CSV file (header auto-detected):',\n importEnpass: 'Import Enpass',\n importEnpassDesc: 'Enpass JSON export (.json)',\n importEnpassPrompt: 'Path to the Enpass .json export:',\n importBitwarden: 'Import Bitwarden',\n importBitwardenDesc: 'Bitwarden JSON export (.json)',\n importBitwardenPrompt: 'Path to the Bitwarden .json export:',\n importBitwardenEncrypted: 'Import Bitwarden (encrypted)',\n importBitwardenEncryptedDesc: 'Bitwarden password-protected JSON export (.json)',\n importBitwardenEncryptedPrompt: 'Path to the encrypted Bitwarden .json export:',\n importBitwardenEncryptedPasswordPrompt: 'Export passphrase (the one chosen when creating the encrypted export):',\n import1pif: 'Import 1Password 1PIF',\n import1pifDesc: 'Legacy 1Password 1PIF export (.1pif)',\n import1pifPrompt: 'Path to the .1pif file:',\n importKeePassXml: 'Import KeePass XML',\n importKeePassXmlDesc: 'KeePass 2.x XML export (.xml)',\n importKeePassXmlPrompt: 'Path to the KeePass .xml export:',\n importKdbx: 'Import KeePass KDBX',\n importKdbxDesc: 'KeePass KDBX database (.kdbx, 3.1/4.x, AES-KDF/Argon2)',\n importKdbxPrompt: 'Path to the .kdbx file:',\n importKdbxPasswordPrompt: 'Database password (leave blank if none):',\n exportTitle: 'Export',\n exportHint: 'Export the whole vault (contains plaintext secrets — keep the file protected).',\n export1pux: 'Export 1Password 1PUX',\n export1puxDesc: '1Password 1PUX archive (.1pux)',\n export1puxPrompt: 'Path to the output .1pux file:',\n exportDefaultPath: 'dsh-vault-export-{file}',\n exportPathHint: 'Suggested path (edit if needed)',\n exportBitwarden: 'Export Bitwarden JSON',\n exportBitwardenDesc: 'Bitwarden JSON document (.json)',\n exportBitwardenPrompt: 'Path to the output .json file:',\n exportDone: 'Exported',\n sectionTabs: 'Vault sections',\n tabEntries: 'Entries',\n tabSecurity: 'Security',\n tabTransfer: 'Import / Export',\n tabBackup: 'Backup',\n tabPermissions: 'Permissions',\n tabSessions: 'Sessions',\n tabTrash: 'Trash',\n sessionsIntro: 'Log into any site in a real browser window, then save the session cookies here for automation (curl, requests, browser-less tools). HttpOnly cookies are captured too.',\n sessionUrlPrompt: 'Site URL to open:',\n sessionOpen: 'Open login window',\n sessionOpenHint: 'Opens a real browser window at the URL. Log in there manually (password, 2FA, …), then come back and click Collect.',\n sessionOpenFailed: 'Could not open a browser — is playwright-core installed and a Chromium build available?',\n sessionOpenList: 'Open windows',\n sessionNoOpen: 'No browser windows open.',\n sessionCollect: 'Collect & save',\n sessionSaveTitle: 'Save as:',\n sessionOverwrite: 'Replace existing',\n sessionSaved: 'saved {n} cookies',\n sessionSavedList: 'Saved sessions',\n sessionEmpty: 'No saved login sessions yet. Open a window, log in, and collect.',\n sessionExport: 'Copy Cookie header',\n sessionExportJar: 'Copy jar (curl -b)',\n sessionExportPlaywright: 'Copy Playwright snippet',\n sessionView: 'View',\n sessionDelete: 'Delete',\n sessionClose: 'Close window',\n sessionCopied: 'Copied!',\n sessionDetailTitle: 'Cookies',\n sessionCookie: 'cookies',\n sessionExpires: 'expires',\n sessionSessionCookie: 'session',\n sessionExpired: 'expired',\n sessionExpiringSoon: 'expiring in 7d',\n sessionPrune: 'Prune expired',\n sessionPruneConfirm: 'Remove expired cookies from this saved session? Session cookies (no expiry) are kept.',\n sessionDomain: 'domain',\n sessionReopen: 'Re-open in browser',\n sessionImportPaste: 'Import from pasted cookies',\n sessionImportPastePrompt: 'Paste a JSON cookie array or a Cookie header string:',\n sessionImportPasteTitle: 'Title:',\n sessionImport: 'Import cookies',\n sessionNoteOpen: 'Browser window opened at {url}. Log in, then click Collect & save.',\n sessionNoteCollect: 'Collected {n} cookies.',\n sessionNamePlaceholder: 'e.g. GitHub session',\n sessionUrlPlaceholder: 'https://example.com/login',\n sessionReadOnly: 'The vault is in readonly mode — browser sessions cannot be saved.',\n lockedShort: '🔒 locked',\n unlock: 'Unlock',\n httpSites: 'HTTP sites',\n healthStrength: 'strength',\n dueExpired: 'EXPIRED',\n dueExpiring: 'expires in',\n dueNow: 'rotation due',\n showTrash: 'Trash',\n hideTrash: 'Hide trash',\n trashed: 'in trash',\n trashEmpty: 'Trash is empty',\n restore: 'Restore',\n clearTrash: 'Empty trash',\n restoreAll: 'Restore all',\n clearTrashConfirm: 'Permanently delete ALL trashed entries? This cannot be undone.',\n show: 'Show',\n hide: 'Hide',\n allKinds: 'All kinds',\n allTags: 'All tags',\n sortBy: 'Sort',\n sortAlpha: 'Sort: A–Z',\n sortFavorite: 'Favorites first',\n sortSmart: 'Smart',\n sortRecent: 'Sort: recent',\n sortCreated: 'Sort: created',\n highSensitivity: 'HIGH',\n pinned: 'Pinned',\n togglePinHint: 'Toggle pinned (shows at top in pinned/smart sort)',\n attachmentsTitle: 'Attachments',\n detachHint: 'Remove attachment',\n add: 'Add credential',\n quickAdd: 'Quick add',\n cancel: 'Cancel',\n save: 'Save',\n savedNew: 'Entry created.',\n savedUpdated: 'Entry updated.',\n edit: 'Edit',\n delete: 'Delete',\n deleteConfirm: 'Delete this entry? This cannot be undone.',\n copy: 'Copy',\n copyPassword: 'Copy password',\n copyCode: 'Copy code',\n copied: 'Copied',\n totp: 'Code',\n fieldTitle: 'Title',\n fieldKind: 'Kind',\n fieldUsername: 'Username',\n fieldEmail: 'Email',\n fieldPhone: 'Phone',\n fieldPassword: 'Password',\n fieldHost: 'Host',\n fieldPort: 'Port',\n fieldApiKey: 'API key',\n fieldSecret: 'Secret',\n fieldAccessToken: 'Access token',\n fieldRefreshToken: 'Refresh token',\n fieldOtpSecret: 'OTP secret',\n fieldUrl: 'URL',\n fieldCardNumber: 'Card number',\n fieldCardExpiry: 'Expiry (MM/YY)',\n fieldCardCvv: 'CVV',\n fieldCardHolder: 'Card holder',\n fieldNotes: 'Notes',\n fieldTags: 'Tags',\n fieldIcon: 'Icon (emoji)',\n fieldExpiresAt: 'Expires at',\n fieldRotationDays: 'Rotation (days, 0 = never)',\n fieldSensitivity: 'Sensitivity',\n fieldFavorite: 'Pinned',\n sensitivityNormal: 'normal',\n sensitivityHigh: 'high',\n favoriteHint: 'Show at top',\n rotationClearHint: '0 clears rotation',\n fieldColor: 'Color',\n fieldCustom: 'Custom fields (key=value per line)',\n error: 'Something went wrong.',\n errLocked: 'Vault is locked — unlock first.',\n errTitleEmpty: 'Title must not be empty.',\n errInvalidVaultName: 'Invalid vault name.',\n errReadonly: 'This action is disabled in readonly mode.',\n errDetail: 'Something went wrong: {detail}',\n autoLockLabel: 'Auto-lock after',\n autoLockNever: 'Never',\n autoLock1m: '1 minute',\n autoLock5m: '5 minutes',\n autoLock15m: '15 minutes',\n autoLock30m: '30 minutes',\n autoLock1h: '1 hour',\n autoLockHint: 'Auto-lock',\n autoLockNeverHint: 'auto-lock off',\n purge: 'Delete permanently',\n purgeOneConfirm: 'Permanently delete \"{name}\"? This cannot be undone.',\n genPassphrase: 'Memorable passphrase',\n genWords: 'Words (2–12)',\n genSeparator: 'Separator',\n genWordDigits: 'Append 2 digits',\n kindLogin: 'Login',\n kindSsh: 'SSH',\n kindApiKey: 'API key',\n kindSecret: 'Secret',\n kindOauth: 'OAuth',\n kindCookie: 'Session cookies',\n kindCard: 'Card',\n kindCustom: 'Custom',\n} as const\n\nexport type VaultLocaleKey = keyof typeof en\n\n/** Chinese strings (same keys as English). */\nexport const zh: Record<VaultLocaleKey, string> = {\n nav: '凭据库',\n heading: 'Vault 凭据库',\n intro: '本机加密存储的凭据。',\n searchPlaceholder: '搜索标题、用户名、邮箱、主机…',\n loading: '加载中…',\n empty: '还没有凭据,添加一条开始使用。',\n noFiltered: '当前过滤条件下没有匹配的条目。',\n emptyHint: '提示:你可以在对话中把 API Key 或 token 交给助手保存——开启自动捕获后,它会在你同意时帮你存入本库。批量导入?让助手调用 vault_import_csv 并给出 CSV 路径即可。',\n emptyHintReadonly: '当前为只读模式——只能读取凭据,不能在此添加。将 accessMode 改为 \"readwrite\" 即可启用写入。',\n modeLabel: '访问模式',\n autoCaptureLabel: '自动捕获对话中的凭据',\n modeReadonly: '只读',\n modeAsk: '写入前询问',\n modeAuto: '自动读写',\n modeReadonlyHint: '只读 —— 变更已禁用',\n modeAskHint: '写入前询问 —— 每次增/改/删都会征求你的确认',\n modeAutoHint: '自动读写 —— 无需逐次确认',\n autoCaptureOn: '自动捕获已开启',\n autoCaptureOff: '自动捕获已关闭',\n clearSearch: '清除搜索',\n entryCount: '条目数',\n reportTitle: '健康与轮换',\n recentActivity: '最近活动',\n recentlyAdded: '最近添加',\n reportRotation: '已过期 / 待轮换',\n reportWeak: '弱密码',\n reportReused: '跨条目复用的凭据',\n dupGroups: '重复分组',\n dupTitle: '重复条目',\n dupMerge: '合并',\n healthOk: '凭据库健康',\n healthBackup: '备份',\n backupNow: '立即备份',\n backupDone: '备份已创建',\n lockedBanner: '保险库已锁定 —— 请使用 vault_unlock 解锁后再读写条目。',\n vaultSelect: '当前保险库',\n vaultRename: '重命名保险库',\n vaultRenamePrompt: '保险库的新名称',\n vaultDelete: '删除',\n vaultDeleteConfirm: '永久删除保险库 \"{name}\"?此操作无法撤销。',\n vaultDeleteDefault: '默认保险库不能被删除。',\n touch: '标记已用',\n touchHint: '标记为最近使用',\n auditTitle: '需要处理',\n auditEdit: '编辑',\n breachCheck: '泄露检测',\n exportReport: '导出安全报告',\n reportExported: '安全报告已导出为 CSV。',\n breachTitle: '泄露扫描',\n breachPwned: '密码曾出现在数据泄露中',\n breachWeak: '常见/弱密码',\n breachOffline: '离线兜底',\n breachOk: '未发现泄露或弱密码',\n breachOkOffline: '未发现弱密码(离线——在线泄露检测不可用)',\n healthScore: '安全评分',\n verdictGood: '良好',\n verdictFair: '一般',\n verdictPoor: '较差',\n no2fa: '未启用2FA',\n genPw: '生成',\n genPwHint: '填入生成的强密码',\n retry: '重试',\n genUser: '生成',\n genUserHint: '填入生成的用户名',\n loadMore: '加载更多',\n clearsIn30s: '30秒后自动清除',\n openUrl: '打开',\n openUrlHint: '打开关联网站',\n genOptsHint: '密码生成器选项',\n genLength: '长度',\n genOptUppercase: '大写',\n genOptLowercase: '小写',\n genOptDigits: '数字',\n genOptSymbols: '符号',\n genOptExcludeAmbiguous: '排除易混淆字符',\n strengthLabel: '强度',\n tplApply: '套用模板',\n tplSave: '存为模板',\n tplNamePrompt: '模板名称:',\n tplSaved: '模板已保存:',\n lock: '锁定',\n recoveryCode: '生成恢复码',\n recoveryCodeConfirm: '生成一次性恢复码?仅在生成时显示一次(请妥善保存,如打印备份);只保存其哈希。',\n recoveryCodeAlert: '您的一次性恢复码(仅显示一次——请妥善保存):',\n recoveryCodeSet: '恢复码已生成(仅显示一次)。',\n recoveryVerify: '验证恢复码',\n recoveryCodeVerifyPrompt: '输入要验证的恢复码:',\n recoveryVerified: '恢复码验证通过。',\n recoveryNotVerified: '恢复码不匹配。',\n lockedMsg: '保险库已锁定 —— 使用 vault_unlock 解锁',\n ageToday: '新',\n ageHint: '距上次更新天数(密码年龄)',\n watchPoor: '⚠ 高风险',\n watchWarn: '⚠ 需关注',\n watchScore: '{n}',\n watchFlagsTitle: '风险: ',\n resultCount: '结果',\n totpUri: 'URI',\n totpUriHint: '显示 otpauth URI 以便在其它设备添加',\n pwChangeConfirm: '正在修改密码 —— 确定继续?',\n copyFieldHint: '复制该字段值',\n tagManage: '标签管理',\n tagRename: '重命名',\n tagRenamePrompt: '标签新名称',\n genHistory: '最近生成',\n recentBackups: '最近备份',\n backupTitle: '加密备份',\n backupHint: '备份是存放在同目录下的加密副本。还原会用所选快照替换当前密码库,还原前会先保存一份当前状态的安全快照。',\n backupRestore: '还原',\n backupRestoreHint: '用该备份还原密码库',\n backupRestoreConfirm: '确定用该备份还原密码库?当前状态会先快照,再被替换。',\n backupRestoreModeMerge: '将该备份合并进当前密码库(条目被复制进来,同标题条目保留)?确定=合并。取消=整体替换密码库。',\n backupRestoreModeReplace: '用该备份整体替换当前密码库?会先写一份安全快照。',\n backupDelete: '删除',\n backupDeleteConfirm: '永久删除这个备份文件?',\n backupDeleted: '备份已删除。',\n backupSafetyHint: '还原前快照已保存到',\n noBackups: '暂无备份 — 用“立即备份”创建。',\n permTitle: '访问权限与自动捕获',\n systemImport: '系统导入',\n importChrome: '导入 Chrome',\n importChromeDesc: 'Chrome 密码管理器(Login Data)',\n importKeychain: '导入钥匙串',\n importKeychainDesc: 'macOS 钥匙串(互联网密码——网站登录凭据)',\n importKeychainHint: '默认读取互联网密码(inet)——真正用于网站登录的条目(Wi-Fi 和应用密钥属于通用密码,会被跳过)。首次授权请选择「始终允许」一次即可。',\n keychainPreview: '预览',\n preview: '预览',\n previewLabel: '预览 —',\n keychainPromptWarn: '从钥匙串导入时 macOS 可能为每条凭据弹出授权框。首次请在弹窗中选择“始终允许”一次性授权本进程。是否继续?',\n systemSearch: '搜索系统凭据库',\n sysSearchPlaceholder: '搜索 Chrome / 钥匙串…',\n sysSearchGo: '搜索',\n importFirefox: '导入 Firefox',\n importFirefoxDesc: 'Firefox 配置(logins.json + key4.db)',\n firefoxMasterPw: 'Firefox 主密码(未设置则留空):',\n import1password: '导入 1Password',\n import1passwordDesc: '1Password 1PUX 导出(.1pux)',\n import1passwordPrompt: '请输入 .1pux 文件路径:',\n importManagerCsv: '导入密码库 CSV',\n importManagerCsvDesc: '密码管理器 CSV(Dashlane / NordPass / Keeper)',\n importManagerCsvPrompt: '请输入 CSV 文件路径(自动识别表头):',\n importEnpass: '导入 Enpass',\n importEnpassDesc: 'Enpass JSON 导出(.json)',\n importEnpassPrompt: '请输入 Enpass JSON 导出文件路径:',\n importBitwarden: '导入 Bitwarden',\n importBitwardenDesc: 'Bitwarden JSON 导出(.json)',\n importBitwardenPrompt: '请输入 Bitwarden JSON 导出文件路径:',\n importBitwardenEncrypted: '导入 Bitwarden(加密)',\n importBitwardenEncryptedDesc: 'Bitwarden 加密 JSON 导出(.json)',\n importBitwardenEncryptedPrompt: '请输入加密 Bitwarden JSON 导出文件路径:',\n importBitwardenEncryptedPasswordPrompt: '导出口令(创建加密导出时设置的口令):',\n import1pif: '导入 1Password 1PIF',\n import1pifDesc: '旧版 1Password 1PIF 导出(.1pif)',\n import1pifPrompt: '请输入 .1pif 文件路径:',\n importKeePassXml: '导入 KeePass XML',\n importKeePassXmlDesc: 'KeePass 2.x XML 导出(.xml)',\n importKeePassXmlPrompt: '请输入 KeePass XML 导出文件路径:',\n importKdbx: '导入 KeePass KDBX',\n importKdbxDesc: 'KeePass KDBX 数据库(.kdbx,3.1/4.x,AES-KDF/Argon2)',\n importKdbxPrompt: '请输入 .kdbx 文件路径:',\n importKdbxPasswordPrompt: '数据库密码(无密码则留空):',\n exportTitle: '导出',\n exportHint: '导出整个保险库(包含明文机密——请妥善保护文件)。',\n export1pux: '导出 1Password 1PUX',\n export1puxDesc: '1Password 1PUX 归档(.1pux)',\n export1puxPrompt: '输出 .1pux 文件路径:',\n exportDefaultPath: 'dsh-vault-export-{file}',\n exportPathHint: '建议路径(可按需修改)',\n exportBitwarden: '导出 Bitwarden JSON',\n exportBitwardenDesc: 'Bitwarden JSON 文档(.json)',\n exportBitwardenPrompt: '输出 .json 文件路径:',\n exportDone: '已导出',\n sectionTabs: '凭据库分区',\n tabEntries: '条目',\n tabSecurity: '安全',\n tabTransfer: '导入/导出',\n tabBackup: '备份',\n tabPermissions: '权限',\n tabSessions: '会话',\n tabTrash: '回收站',\n sessionsIntro: '在真实浏览器窗口中登录任意网站,然后把登录后的 session cookie 保存到这里,供自动化任务使用(curl、requests 等)。HttpOnly cookie 也能捕获。',\n sessionUrlPrompt: '要打开的网站地址:',\n sessionOpen: '打开登录窗口',\n sessionOpenHint: '在指定地址打开真实浏览器窗口。请在其中手动登录(密码、二次验证等),然后回到这里点击「收集并保存」。',\n sessionOpenFailed: '无法打开浏览器——请确认已安装 playwright-core 且有可用的 Chromium。',\n sessionOpenList: '已打开的窗口',\n sessionNoOpen: '当前没有打开的浏览器窗口。',\n sessionCollect: '收集并保存',\n sessionSaveTitle: '保存为:',\n sessionOverwrite: '覆盖已有条目',\n sessionSaved: '已保存 {n} 个 cookie',\n sessionSavedList: '已保存的会话',\n sessionEmpty: '还没有保存的登录会话。打开窗口、登录、然后收集。',\n sessionExport: '复制 Cookie 头',\n sessionExportJar: '复制 cookie jar(curl -b)',\n sessionExportPlaywright: '复制 Playwright 片段',\n sessionView: '查看',\n sessionDelete: '删除',\n sessionClose: '关闭窗口',\n sessionCopied: '已复制!',\n sessionDetailTitle: 'Cookies',\n sessionCookie: '个 cookie',\n sessionExpires: '过期',\n sessionSessionCookie: '会话',\n sessionExpired: '已过期',\n sessionExpiringSoon: '7 天内过期',\n sessionPrune: '清理过期',\n sessionPruneConfirm: '移除该已保存会话中的过期 cookie?无过期的会话 cookie 会保留。',\n sessionDomain: '域名',\n sessionReopen: '在浏览器中重新打开',\n sessionImportPaste: '从粘贴的 cookie 导入',\n sessionImportPastePrompt: '粘贴 JSON cookie 数组或 Cookie 头字符串:',\n sessionImportPasteTitle: '标题:',\n sessionImport: '导入 cookies',\n sessionNoteOpen: '浏览器窗口已打开:{url}。登录后点击「收集并保存」。',\n sessionNoteCollect: '已收集 {n} 个 cookie。',\n sessionNamePlaceholder: '例如:GitHub 会话',\n sessionUrlPlaceholder: 'https://example.com/login',\n sessionReadOnly: '凭据库处于只读模式,无法保存浏览器会话。',\n lockedShort: '🔒 已锁定',\n unlock: '解锁',\n httpSites: 'HTTP站点',\n healthStrength: '强度',\n dueExpired: '已过期',\n dueExpiring: '将于',\n dueNow: '待轮换',\n showTrash: '回收站',\n hideTrash: '隐藏回收站',\n trashed: '已删除',\n trashEmpty: '回收站为空',\n restore: '恢复',\n clearTrash: '清空回收站',\n restoreAll: '全部恢复',\n clearTrashConfirm: '永久删除回收站中全部条目?此操作不可撤销。',\n show: '显示',\n hide: '隐藏',\n allKinds: '全部类型',\n allTags: '全部标签',\n sortBy: '排序',\n sortAlpha: '排序:A–Z',\n sortFavorite: '置顶优先',\n sortSmart: '智能排序',\n sortRecent: '排序:最近',\n sortCreated: '排序:创建时间',\n highSensitivity: '高敏',\n pinned: '已置顶',\n togglePinHint: '切换置顶(置顶/智能排序时显示在最前)',\n attachmentsTitle: '附件',\n detachHint: '移除附件',\n add: '新增凭据',\n quickAdd: '快速添加',\n cancel: '取消',\n save: '保存',\n savedNew: '条目已创建。',\n savedUpdated: '条目已更新。',\n edit: '编辑',\n delete: '删除',\n deleteConfirm: '确定删除该条目?此操作不可撤销。',\n copy: '复制',\n copyPassword: '复制密码',\n copyCode: '复制验证码',\n copied: '已复制',\n totp: '验证码',\n fieldTitle: '标题',\n fieldKind: '类型',\n fieldUsername: '用户名',\n fieldEmail: '邮箱',\n fieldPhone: '手机号',\n fieldPassword: '密码',\n fieldHost: '主机',\n fieldPort: '端口',\n fieldApiKey: 'API 密钥',\n fieldSecret: 'Secret',\n fieldAccessToken: '访问令牌',\n fieldRefreshToken: '刷新令牌',\n fieldOtpSecret: 'TOTP 密钥',\n fieldUrl: 'URL',\n fieldCardNumber: '卡号',\n fieldCardExpiry: '有效期(MM/YY)',\n fieldCardCvv: 'CVV',\n fieldCardHolder: '持卡人',\n fieldNotes: '备注',\n fieldTags: '标签',\n fieldIcon: '图标(emoji)',\n fieldExpiresAt: '过期时间',\n fieldRotationDays: '轮换周期(天,0=永不)',\n fieldSensitivity: '敏感级别',\n fieldFavorite: '置顶',\n sensitivityNormal: '普通',\n sensitivityHigh: '高敏',\n favoriteHint: '列表置顶显示',\n rotationClearHint: '0 清除轮换',\n fieldColor: '颜色',\n fieldCustom: '自定义字段(每行 key=value)',\n error: '操作失败。',\n errLocked: '保险库已锁定,请先解锁。',\n errTitleEmpty: '标题不能为空。',\n errInvalidVaultName: '保险库名称无效。',\n errReadonly: '当前为只读模式,此操作已禁用。',\n errDetail: '操作失败:{detail}',\n autoLockLabel: '自动锁定',\n autoLockNever: '永不',\n autoLock1m: '1 分钟',\n autoLock5m: '5 分钟',\n autoLock15m: '15 分钟',\n autoLock30m: '30 分钟',\n autoLock1h: '1 小时',\n autoLockHint: '自动锁定',\n autoLockNeverHint: '自动锁定已关闭',\n purge: '永久删除',\n purgeOneConfirm: '永久删除「{name}」?此操作不可撤销。',\n genPassphrase: '易记短语密码',\n genWords: '单词数(2–12)',\n genSeparator: '分隔符',\n genWordDigits: '尾部加 2 位数字',\n kindLogin: '登录',\n kindSsh: 'SSH',\n kindApiKey: 'API 密钥',\n kindSecret: 'Secret',\n kindOauth: 'OAuth',\n kindCookie: '会话 Cookies',\n kindCard: '银行卡',\n kindCustom: '自定义',\n}\n","/**\n * dsh-vault browser half: a Vault settings page managing encrypted\n * credentials — list, search, add, edit, delete, and copy — through the host\n * VaultGateway remote over the /api RPC channel.\n *\n * @module dsh-vault/client\n */\n\nimport type { ClientContext } from '@deepseek-ai/dsh-client-runtime/client'\nimport type { ConnectionHandle } from '@deepseek-ai/dsh-api-remotes/client'\nimport type {} from '@deepseek-ai/dsh-client-locale/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-settings/client'\nimport { VaultSection, type VaultSectionInjected } from './VaultSection.tsx'\nimport type { VaultSectionTypes } from './VaultSection.tsx'\nimport { en, zh, type VaultLocaleKey } from './locales.ts'\n\nexport type { VaultSectionInjected, VaultSectionProps } from './VaultSection.tsx'\nexport type { VaultSectionTypes } from './VaultSection.tsx'\nexport type { VaultLocaleKey } from './locales.ts'\n\ndeclare module '@deepseek-ai/dsh-client-ui-slots' {\n interface LocaleNamespaceMap {\n /** Vault settings page copy. */\n 'settings.vault': VaultLocaleKey\n }\n}\n\n/** Dictionary namespace owned by this plugin. */\nexport const NS = 'settings.vault'\n\n/** Services required by the Settings registration and the RPC face. */\nexport const inject = ['slots', 'locale', 'connection']\n\n/**\n * Register the Vault settings section once the `settings.section` declaration\n * is on the ledger. The section talks to the host through the connection RPC\n * channel (endpoints `vault/*` served by the host VaultGateway remote).\n */\nexport function apply(ctx: ClientContext): void {\n ctx.effect(() => ctx.locale.register(NS, { zh, en }), 'dsh-vault: dictionaries')\n\n const t = ctx.locale.bind(NS)\n const connection = ctx.get('connection') as ConnectionHandle\n\n /** Invoke one host vault remote and normalize the RPC envelope. */\n async function invoke<T>(method: string, args: Record<string, unknown> = {}): Promise<T> {\n const result = await connection.rpc.call('/api', `vault/${method}`, { args })\n if (!result.ok) {\n throw new Error(`vault.${method} failed: ${result.error.code}: ${result.error.message}`)\n }\n return result.value as T\n }\n\n const injected = (): VaultSectionInjected => ({\n t,\n config: () => invoke<VaultSectionTypes['config']>('config'),\n setAccessMode: (mode) => invoke<VaultSectionTypes['config']>('setAccessMode', { mode }),\n setAutoCapture: (enabled) => invoke<VaultSectionTypes['config']>('setAutoCapture', { enabled }),\n setAutoLock: (seconds) => invoke<{ seconds: number }>('setAutoLock', { seconds }),\n list: () => invoke<{ entries: VaultSectionTypes['entries'] }>('list').then(r => r.entries),\n search: (query, limit) => invoke<{ entries: VaultSectionTypes['entries'] }>('search', { query, limit: limit ?? 50 }).then(r => r.entries),\n get: (id) => invoke<{ found: boolean; entry?: VaultSectionTypes['fullEntry'] }>('get', { id }),\n add: (patch) => invoke<VaultSectionTypes['summaryEntry']>('add', { patch }),\n update: (id, patch) => invoke<{ found: boolean; entry?: VaultSectionTypes['summaryEntry'] }>('update', { id, patch }),\n remove: (id) => invoke<{ deleted: boolean }>('delete', { id }),\n purge: (id) => invoke<{ purged: boolean }>('purge', { id }),\n trash: () => invoke<{ entries: VaultSectionTypes['entries'] }>('trash').then(r => r.entries),\n rotation: () => invoke<{ entries: unknown[] }>('rotation').then(r => r.entries),\n history: () => invoke<{ events: unknown[] }>('history').then(r => r.events),\n stats: () => invoke<Record<string, unknown>>('stats'),\n recent: () => invoke<{ entries: unknown[] }>('recent').then(r => r.entries),\n backupStatus: () => invoke<{ daysSinceBackup: number; backups: number }>('backupStatus'),\n backup: (maxBackups) => invoke<{ path: string; kept: number; pruned: number }>('backup', { ...(maxBackups !== undefined ? { maxBackups } : {}) }),\n health: () => invoke<{ weak: unknown[]; reused: unknown[]; strength: { weak: number; fair: number; strong: number }; no2fa: unknown[]; httpSites: unknown[]; score: number; verdict: string }>('health'),\n duplicates: () => invoke<{ groups: number }>('duplicates'),\n status: () => invoke<{ locked: boolean; entries: number }>('status'),\n switchVault: (name) => invoke<{ switched: boolean; name: string }>('switchVault', { name }),\n listVaults: () => invoke<Array<{ name: string; active: boolean; entries?: number }>>('listVaults'),\n touch: (id) => invoke<{ touched: boolean }>('touch', { id }),\n setFavorite: (id, favorite) => invoke<{ found: boolean }>('setFavorite', { id, favorite }),\n attachments: (id) => invoke<{ found: boolean; attachments: Array<{ name: string; size: number }> }>('attachments', { id }),\n detach: (id, name) => invoke<{ found: boolean; detached: boolean }>('detach', { id, name }),\n lock: () => invoke<{ locked: boolean }>('lock'),\n unlock: () => invoke<{ locked: boolean }>('unlock'),\n totpUri: (id) => invoke<{ uri: string }>('totpUri', { id }),\n tags: () => invoke<Array<{ name: string; count: number }>>('tags'),\n renameTag: (from, to) => invoke<{ renamed: number }>('renameTag', { from, to }),\n generatorHistory: () => invoke<Array<{ password: string; at: number }>>('generatorHistory'),\n backups: (limit) => invoke<Array<{ path: string; at: number; vaultName: string; size: number }>>('backups', { limit: limit ?? 5 }),\n deleteBackup: (path) => invoke<{ deleted: boolean; path: string }>('deleteBackup', { path }),\n restoreBackup: (path, mode, overwrite) => invoke<{ entries: number; safetyBackup: string; note: string; added?: number; skipped?: number; updated?: number }>('restoreBackup', { path, mode: mode ?? 'merge', overwrite: overwrite ?? false }),\n importChrome: (overwrite) => invoke<{ added: number; skipped: number; updated: number; note: string }>('importChrome', { overwrite: overwrite ?? false }),\n importFirefox: (masterPassword, overwrite) => invoke<{ added: number; skipped: number; updated: number; note: string }>('importFirefox', { masterPassword: masterPassword ?? '', overwrite: overwrite ?? false }),\n keychainImport: (options) => invoke<{ added: number; skipped: number; updated: number; note: string }>('keychainImport', { options: options ?? {} }),\n import1password: (path, overwrite, dryRun) => invoke<{ added: number; skipped: number; updated: number; note: string }>('import1password', { path, overwrite: overwrite ?? false, dryRun: dryRun ?? false }),\n importManagerCsv: (path, overwrite, dryRun) => invoke<{ added: number; skipped: number; updated: number; note: string }>('importManagerCsv', { path, overwrite: overwrite ?? false, dryRun: dryRun ?? false }),\n importEnpass: (path, overwrite, dryRun) => invoke<{ added: number; skipped: number; updated: number; note: string }>('importEnpass', { path, overwrite: overwrite ?? false, dryRun: dryRun ?? false }),\n importBitwarden: (path, overwrite, dryRun) => invoke<{ added: number; skipped: number; updated: number; note: string }>('importBitwarden', { path, overwrite: overwrite ?? false, dryRun: dryRun ?? false }),\n import1pif: (path, overwrite, dryRun) => invoke<{ added: number; skipped: number; updated: number; note: string }>('import1pif', { path, overwrite: overwrite ?? false, dryRun: dryRun ?? false }),\n importBitwardenEncrypted: (path, password, overwrite, dryRun) => invoke<{ added: number; skipped: number; updated: number; note: string }>('importBitwardenEncrypted', { path, password, overwrite: overwrite ?? false, dryRun: dryRun ?? false }),\n importKeePassXml: (path, overwrite, dryRun) => invoke<{ added: number; skipped: number; updated: number; note: string }>('importKeePassXml', { path, overwrite: overwrite ?? false, dryRun: dryRun ?? false }),\n importKdbx: (path, password, keyfile, overwrite, dryRun) => invoke<{ added: number; skipped: number; updated: number; note: string }>('importKdbx', { path, password: password ?? '', keyfile: keyfile ?? '', overwrite: overwrite ?? false, dryRun: dryRun ?? false }),\n searchSystem: (query, source, limit) => invoke<{ matches: Array<{ source: string; name: string; username: string }>; note: string }>('searchSystem', { query, source: source ?? 'all', limit: limit ?? 15 }),\n verifyAll: () => invoke<Array<{ id: string; title: string; issues: string[] }>>('verifyAll'),\n breachCheck: (online) => invoke<{ checked: number; pwned: Array<{ id: string; title: string; count: number }>; weak: Array<{ id: string; title: string }>; offline: boolean }>('breachCheck', { online: online ?? true }),\n generatePassword: (options) => invoke<{ password: string }>('generatePassword', { options: options ?? {} }),\n strength: (password) => invoke<{ score: number; verdict: string; feedback: string; bits: number }>('strength', { password }),\n templates: () => invoke<Array<{ name: string; kind: string; fields: Record<string, string> }>>('templates'),\n saveTemplate: (name, kind, fields) => invoke<{ saved: boolean }>('saveTemplate', { name, kind, fields }),\n generateUsername: () => invoke<{ username: string }>('generateUsername'),\n duplicateGroups: () => invoke<Array<Array<{ id: string; title: string }>>>('duplicateGroups'),\n merge: (fromId, toId, keepSource) => invoke<{ found: boolean }>('merge', { fromId, toId, keepSource: keepSource ?? false }),\n restore: (id) => invoke<{ restored: boolean }>('restore', { id }),\n undeleteAll: () => invoke<{ restored: number }>('undeleteAll'),\n totp: (id) => invoke<{ code: string; label?: string; secondsRemaining: number }>('totp', { id }),\n sessionOpen: (url) => invoke<{ sessionId: string; url: string }>('sessionOpen', { url }),\n sessionCollect: (sessionId, url) => invoke<{ cookies: unknown[]; count: number }>('sessionCollect', { sessionId, url: url ?? '' }),\n sessionClose: (sessionId) => invoke<{ closed: boolean }>('sessionClose', { sessionId }),\n sessionListOpen: () => invoke<Array<{ sessionId: string; url: string; openedAt: number }>>('sessionListOpen'),\n sessionListSaved: () => invoke<Array<{ id: string; title: string; url?: string; cookieCount: number; expiredCount?: number; expiringSoon?: number; updatedAt?: number }>>('sessionListSaved'),\n sessionSave: (options) => invoke<{ saved: number; id: string }>('sessionSave', { options: options ?? {} }),\n sessionExport: (id, format) => invoke<{ text: string; cookieCount: number; domains: string[] }>('sessionExport', { id, format: format ?? 'header' }),\n sessionGet: (id) => invoke<{ id: string; title: string; url?: string; cookies: unknown[]; notes?: string }>('sessionGet', { id }),\n sessionPrune: (id, preview) => invoke<{ pruned: number; remaining: number; note: string }>('sessionPrune', { id, preview: preview ?? false }),\n watchtower: () => invoke<Array<{ id: string; title: string; kind: string; flags: string[]; score: number; verdict: string; bits?: number }>>('watchtower'),\n export1pux: (path) => invoke<{ path: string; count: number }>('export1pux', { path }),\n exportBitwarden: (path) => invoke<{ path: string; count: number }>('exportBitwarden', { path }),\n recoveryCode: () => invoke<{ code: string; note: string }>('recoveryCode'),\n verifyRecovery: (code) => invoke<{ verified: boolean }>('verifyRecovery', { code }),\n recoveryStatus: () => invoke<{ set: boolean; issuedAt?: number }>('recoveryStatus'),\n vaultRename: (from, to) => invoke<{ renamed: boolean; from?: string; to?: string; vaults: Array<{ name: string; active: boolean }>; note: string }>('vaultRename', { from, to }),\n vaultDelete: (name, confirm) => invoke<{ deleted: boolean; name?: string; active: string; vaults: Array<{ name: string; active: boolean }>; note: string }>('vaultDelete', { name, confirm }),\n })\n\n ctx.slots.inject('settings.section', () => ctx.slots.register({\n name: 'settings.section',\n id: 'vault',\n order: 30,\n label: () => t('nav'),\n inject: injected,\n }, VaultSection))\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"client.js","names":["css"],"sources":["../src/client/VaultSection.tsx","../src/client/locales.ts","../src/client/index.ts"],"sourcesContent":["/**\n * Vault settings section: list, search, add, edit, delete, and copy encrypted\n * credentials. All mutations go through the host VaultGateway remote; secrets\n * are shown only inside the edit form or a copy action, never in the list.\n */\n\nimport { useCallback, useEffect, useId, useMemo, useRef, useState, type ReactNode } from 'react'\nimport type { PropsLocale, PropsRuntime, InjectFace, TranslateNS } from '@deepseek-ai/dsh-client-ui-slots'\nimport type { VaultLocaleKey } from './locales.ts'\nimport css from './VaultSection.module.css'\n\n/** Wire shapes shared with the host gateway (mirror of src/index.ts types). */\nexport interface VaultSummaryWire {\n id: string\n title: string\n sensitivity?: string\n kind?: string\n username?: string\n email?: string\n phone?: string\n host?: string\n port?: string\n url?: string\n tags?: string[]\n icon?: string\n color?: string\n fields?: Record<string, string>\n createdAt?: number\n updatedAt?: number\n}\n\nexport interface VaultFullWire {\n id: string\n title: string\n kind?: string\n username?: string\n email?: string\n phone?: string\n password?: string\n host?: string\n port?: string\n privateKey?: string\n apiKey?: string\n secret?: string\n accessToken?: string\n refreshToken?: string\n expiresAt?: number\n rotationDays?: number\n sensitivity?: string\n favorite?: boolean\n otpSecret?: string\n url?: string\n notes?: string\n tags?: string[]\n icon?: string\n color?: string\n fields?: Record<string, unknown>\n}\n\n/** Patch shape accepted by vault.add / vault.update. */\nexport type VaultPatch = Partial<Omit<VaultFullWire, 'id'>>\n\n/** Registration-side business face supplied by the plugin entry. */\nexport interface VaultSectionInjected {\n t: TranslateNS<'settings.vault'>\n config: () => Promise<{ accessMode: 'readonly' | 'ask' | 'auto'; autoCapture: boolean; autoLockSeconds: number }>\n setAccessMode: (mode: 'readonly' | 'ask' | 'auto') => Promise<{ accessMode: 'readonly' | 'ask' | 'auto'; autoCapture: boolean; autoLockSeconds: number }>\n setAutoCapture: (enabled: boolean) => Promise<{ accessMode: 'readonly' | 'ask' | 'auto'; autoCapture: boolean; autoLockSeconds: number }>\n setAutoLock: (seconds: number) => Promise<{ seconds: number }>\n list: () => Promise<VaultSummaryWire[]>\n search: (query: string, limit?: number) => Promise<VaultSummaryWire[]>\n get: (id: string) => Promise<{ found: boolean; entry?: VaultFullWire }>\n add: (patch: VaultPatch & { title: string }) => Promise<VaultSummaryWire>\n update: (id: string, patch: VaultPatch) => Promise<{ found: boolean; entry?: VaultSummaryWire }>\n remove: (id: string) => Promise<{ deleted: boolean }>\n purge: (id: string) => Promise<{ purged: boolean }>\n trash: () => Promise<VaultSummaryWire[]>\n rotation: () => Promise<unknown[]>\n history: () => Promise<unknown[]>\n stats: () => Promise<Record<string, unknown>>\n recent: () => Promise<unknown[]>\n backupStatus: () => Promise<{ daysSinceBackup: number; backups: number }>\n backup: (maxBackups?: number) => Promise<{ path: string; kept: number; pruned: number }>\n health: () => Promise<{ weak: unknown[]; reused: unknown[]; strength: { weak: number; fair: number; strong: number }; no2fa: unknown[]; httpSites: unknown[]; score: number; verdict: string }>\n duplicates: () => Promise<{ groups: number }>\n duplicateGroups: () => Promise<Array<Array<{ id: string; title: string }>>>\n status: () => Promise<{ locked: boolean; entries: number }>\n switchVault: (name: string) => Promise<{ switched: boolean; name: string }>\n lock: () => Promise<{ locked: boolean }>\n unlock: () => Promise<{ locked: boolean }>\n totpUri: (id: string) => Promise<{ uri: string }>\n tags: () => Promise<Array<{ name: string; count: number }>>\n renameTag: (from: string, to: string) => Promise<{ renamed: number }>\n generatorHistory: () => Promise<Array<{ password: string; at: number }>>\n backups: (limit?: number) => Promise<Array<{ path: string; at: number; vaultName: string; size: number }>>\n deleteBackup: (path: string) => Promise<{ deleted: boolean; path: string }>\n restoreBackup: (path: string, mode?: string, overwrite?: boolean) => Promise<{ entries: number; safetyBackup: string; note: string; added?: number; skipped?: number; updated?: number }>\n importChrome: (overwrite?: boolean) => Promise<{ added: number; skipped: number; updated: number; note: string }>\n importFirefox: (masterPassword?: string, overwrite?: boolean) => Promise<{ added: number; skipped: number; updated: number; note: string }>\n keychainImport: (options?: { limit?: number; overwrite?: boolean; preview?: boolean; service?: string }) => Promise<{ added: number; skipped: number; updated: number; note: string }>\n import1password: (path: string, overwrite?: boolean, dryRun?: boolean) => Promise<{ added: number; skipped: number; updated: number; note: string }>\n importManagerCsv: (path: string, overwrite?: boolean, dryRun?: boolean) => Promise<{ added: number; skipped: number; updated: number; note: string }>\n importEnpass: (path: string, overwrite?: boolean, dryRun?: boolean) => Promise<{ added: number; skipped: number; updated: number; note: string }>\n importBitwarden: (path: string, overwrite?: boolean, dryRun?: boolean) => Promise<{ added: number; skipped: number; updated: number; note: string }>\n import1pif: (path: string, overwrite?: boolean, dryRun?: boolean) => Promise<{ added: number; skipped: number; updated: number; note: string }>\n importBitwardenEncrypted: (path: string, password: string, overwrite?: boolean, dryRun?: boolean) => Promise<{ added: number; skipped: number; updated: number; note: string }>\n importKeePassXml: (path: string, overwrite?: boolean, dryRun?: boolean) => Promise<{ added: number; skipped: number; updated: number; note: string }>\n importKdbx: (path: string, password?: string, keyfile?: string, overwrite?: boolean, dryRun?: boolean) => Promise<{ added: number; skipped: number; updated: number; note: string }>\n searchSystem: (query: string, source?: string, limit?: number) => Promise<{ matches: Array<{ source: string; name: string; username: string }>; note: string }>\n listVaults: () => Promise<Array<{ name: string; active: boolean }>>\n touch: (id: string) => Promise<{ touched: boolean }>\n setFavorite: (id: string, favorite: boolean) => Promise<{ found: boolean }>\n attachments: (id: string) => Promise<{ found: boolean; attachments: Array<{ name: string; size: number }> }>\n detach: (id: string, name: string) => Promise<{ found: boolean; detached: boolean }>\n verifyAll: () => Promise<Array<{ id: string; title: string; issues: string[] }>>\n breachCheck: (online?: boolean) => Promise<{ checked: number; pwned: Array<{ id: string; title: string; count: number }>; weak: Array<{ id: string; title: string }>; offline: boolean }>\n generatePassword: (options?: { length?: number; lowercase?: boolean; uppercase?: boolean; digits?: boolean; symbols?: boolean; excludeAmbiguous?: boolean; passphrase?: boolean; words?: number; separator?: string; wordDigits?: boolean }) => Promise<{ password: string }>\n strength: (password: string) => Promise<{ score: number; verdict: string; feedback: string; bits: number }>\n templates: () => Promise<Array<{ name: string; kind: string; fields: Record<string, string> }>>\n saveTemplate: (name: string, kind: string, fields: Record<string, string>) => Promise<{ saved: boolean }>\n generateUsername: () => Promise<{ username: string }>\n merge: (fromId: string, toId: string, keepSource?: boolean) => Promise<{ found: boolean }>\n restore: (id: string) => Promise<{ restored: boolean }>\n undeleteAll: () => Promise<{ restored: number }>\n totp: (id: string) => Promise<{ code: string; label?: string; secondsRemaining: number }>\n sessionOpen: (url: string) => Promise<{ sessionId: string; url: string }>\n sessionCollect: (sessionId: string, url?: string) => Promise<{ cookies: unknown[]; count: number }>\n sessionClose: (sessionId: string) => Promise<{ closed: boolean }>\n sessionListOpen: () => Promise<Array<{ sessionId: string; url: string; openedAt: number }>>\n sessionListSaved: () => Promise<Array<{ id: string; title: string; url?: string; cookieCount: number; expiredCount?: number; expiringSoon?: number; updatedAt?: number }>>\n sessionSave: (options: { title: string; cookies: unknown[]; url?: string; overwrite?: boolean }) => Promise<{ saved: number; id: string }>\n sessionExport: (id: string, format?: 'header' | 'netscape' | 'json' | 'playwright') => Promise<{ text: string; cookieCount: number; domains: string[] }>\n sessionGet: (id: string) => Promise<{ id: string; title: string; url?: string; cookies: unknown[]; notes?: string }>\n sessionPrune: (id: string, preview?: boolean) => Promise<{ pruned: number; remaining: number; note: string }>\n vaultRename: (from: string, to: string) => Promise<{ renamed: boolean; from?: string; to?: string; vaults: Array<{ name: string; active: boolean }>; note: string }>\n vaultDelete: (name: string, confirm: boolean) => Promise<{ deleted: boolean; name?: string; active: string; vaults: Array<{ name: string; active: boolean }>; note: string }>\n watchtower: () => Promise<Array<{ id: string; title: string; kind: string; flags: string[]; score: number; verdict: string; bits?: number }>>\n export1pux: (path: string) => Promise<{ path: string; count: number }>\n exportBitwarden: (path: string) => Promise<{ path: string; count: number }>\n recoveryCode: () => Promise<{ code: string; note: string }>\n verifyRecovery: (code: string) => Promise<{ verified: boolean }>\n recoveryStatus: () => Promise<{ set: boolean; issuedAt?: number }>\n}\n\n/** Type-level alias so consumers can reference the wire shapes without values. */\nexport type VaultSectionTypes = {\n entries: VaultSummaryWire[]\n fullEntry: VaultFullWire\n summaryEntry: VaultSummaryWire\n config: { accessMode: 'readonly' | 'ask' | 'auto'; autoCapture: boolean; autoLockSeconds: number }\n accessModes: Array<'readonly' | 'ask' | 'auto'>\n}\n\n/** Full component props assembled by the Settings slot renderer. */\nexport type VaultSectionProps =\n PropsRuntime<'settings.section'>\n & PropsLocale<'settings.vault'>\n & InjectFace<VaultSectionInjected>\n\n/** The editable form fields we render (subset of the full wire). */\ntype FormFields = {\n title?: string | undefined\n kind?: string | undefined\n username?: string | undefined\n email?: string | undefined\n phone?: string | undefined\n password?: string | undefined\n host?: string | undefined\n port?: string | undefined\n privateKey?: string | undefined\n apiKey?: string | undefined\n secret?: string | undefined\n accessToken?: string | undefined\n refreshToken?: string | undefined\n otpSecret?: string | undefined\n cardNumber?: string | undefined\n cardExpiry?: string | undefined\n cardCvv?: string | undefined\n cardHolder?: string | undefined\n url?: string | undefined\n notes?: string | undefined\n icon?: string | undefined\n color?: string | undefined\n expiresAt?: number | undefined\n rotationDays?: number | undefined\n sensitivity?: string | undefined\n favorite?: boolean | undefined\n}\n\nconst FORM_FIELDS: Array<{ key: keyof FormFields; label: VaultLocaleKey }> = [\n { key: 'title', label: 'fieldTitle' },\n { key: 'kind', label: 'fieldKind' },\n { key: 'username', label: 'fieldUsername' },\n { key: 'email', label: 'fieldEmail' },\n { key: 'phone', label: 'fieldPhone' },\n { key: 'password', label: 'fieldPassword' },\n { key: 'host', label: 'fieldHost' },\n { key: 'port', label: 'fieldPort' },\n { key: 'apiKey', label: 'fieldApiKey' },\n { key: 'secret', label: 'fieldSecret' },\n { key: 'accessToken', label: 'fieldAccessToken' },\n { key: 'refreshToken', label: 'fieldRefreshToken' },\n { key: 'otpSecret', label: 'fieldOtpSecret' },\n { key: 'cardNumber', label: 'fieldCardNumber' },\n { key: 'cardExpiry', label: 'fieldCardExpiry' },\n { key: 'cardCvv', label: 'fieldCardCvv' },\n { key: 'cardHolder', label: 'fieldCardHolder' },\n { key: 'url', label: 'fieldUrl' },\n { key: 'notes', label: 'fieldNotes' },\n { key: 'expiresAt', label: 'fieldExpiresAt' },\n { key: 'rotationDays', label: 'fieldRotationDays' },\n { key: 'sensitivity', label: 'fieldSensitivity' },\n { key: 'favorite', label: 'fieldFavorite' },\n { key: 'icon', label: 'fieldIcon' },\n { key: 'color', label: 'fieldColor' },\n]\n\nconst VERDICT_KEYS: Record<string, VaultLocaleKey> = { good: 'verdictGood', fair: 'verdictFair', poor: 'verdictPoor' }\nconst TAB_KEYS: Record<string, VaultLocaleKey> = {\n entries: 'tabEntries', security: 'tabSecurity', transfer: 'tabTransfer',\n backup: 'tabBackup', permissions: 'tabPermissions', sessions: 'tabSessions', trash: 'tabTrash',\n}\nconst VERDICT_KEYS_SHORT: Record<string, VaultLocaleKey> = { weak: 'verdictPoor', fair: 'verdictFair', strong: 'verdictGood', 'very strong': 'verdictGood' }\nconst GEN_OPT_KEYS: Record<string, VaultLocaleKey> = {\n uppercase: 'genOptUppercase', lowercase: 'genOptLowercase', digits: 'genOptDigits',\n symbols: 'genOptSymbols', excludeAmbiguous: 'genOptExcludeAmbiguous',\n}\n\n/** Number of entries matching the current kind/tag filters (for pagination). */\nfunction filteredCount(entries: VaultSummaryWire[], kindFilter: string, tagFilter: string): number {\n return entries.filter(entry => (kindFilter === '' || entry.kind === kindFilter) && (tagFilter === '' || (entry.tags ?? []).includes(tagFilter))).length\n}\n\nconst KIND_KEYS: Record<string, VaultLocaleKey> = {\n login: 'kindLogin',\n ssh: 'kindSsh',\n 'api-key': 'kindApiKey',\n secret: 'kindSecret',\n oauth: 'kindOauth',\n cookie: 'kindCookie',\n card: 'kindCard',\n custom: 'kindCustom',\n}\n\ntype ViewState =\n | { readonly status: 'loading' }\n | { readonly status: 'error'; readonly reason?: string }\n | { readonly status: 'ready'; readonly entries: VaultSummaryWire[] }\n\ntype EditorState =\n | { readonly status: 'closed' }\n | { readonly status: 'creating' }\n | { readonly status: 'editing'; readonly entry: VaultFullWire }\n\nfunction emptyForm(): FormFields {\n return { title: '', kind: 'login', username: '', email: '', phone: '', password: '', host: '', port: '', icon: '', color: '' }\n}\n\n/** Human label for a built-in template name (`builtin:wifi` → Wi-Fi). */\nfunction templateLabel(name: string): string {\n const labels: Record<string, string> = {\n 'builtin:login': 'Login', 'builtin:ssh': 'SSH', 'builtin:api-key': 'API key',\n 'builtin:oauth': 'OAuth', 'builtin:secret': 'Secret', 'builtin:card': 'Card',\n 'builtin:wifi': 'Wi-Fi', 'builtin:server': 'Server', 'builtin:database': 'Database',\n 'builtin:identity': 'Identity', 'builtin:bank': 'Bank account', 'builtin:custom': 'Custom',\n }\n return labels[name] ?? name\n}\n\n/** Render the Vault settings section. */\nexport function VaultSection(props: VaultSectionProps): ReactNode {\n const { t, config, setAccessMode, setAutoCapture, setAutoLock, list, search, get, add, update, remove, purge, trash, rotation, health, duplicates, duplicateGroups, merge, history, stats, backupStatus, backup, recent, restore, undeleteAll, totp, status, switchVault, listVaults, touch, setFavorite, attachments, detach, verifyAll, breachCheck, generatePassword, strength, generateUsername, templates, saveTemplate, lock, totpUri, tags, renameTag, generatorHistory, backups, deleteBackup, restoreBackup, importChrome, importFirefox, import1password, importManagerCsv, importEnpass, importBitwarden, import1pif, importKeePassXml, importKdbx, importBitwardenEncrypted, keychainImport, searchSystem, sessionOpen, sessionCollect, sessionClose, sessionListOpen, sessionListSaved, sessionSave, sessionExport, sessionGet, sessionPrune, vaultRename, vaultDelete, watchtower, export1pux, exportBitwarden, recoveryCode, verifyRecovery, recoveryStatus, unlock } = props\n const searchId = useId()\n const [query, setQuery] = useState('')\n const [state, setState] = useState<ViewState>({ status: 'loading' })\n const [editor, setEditor] = useState<EditorState>({ status: 'closed' })\n const [form, setForm] = useState<FormFields>(emptyForm())\n const [busy, setBusy] = useState(false)\n const [message, setMessage] = useState<string | null>(null)\n const [copiedId, setCopiedId] = useState<string | null>(null)\n const [totpMap, setTotpMap] = useState<Record<string, { code: string; until: number }>>({})\n const [uriMap, setUriMap] = useState<Record<string, string>>({})\n const [tagList, setTagList] = useState<Array<{ name: string; count: number }>>([])\n const [genHistory, setGenHistory] = useState<Array<{ password: string; at: number }>>([])\n const [backupList, setBackupList] = useState<Array<{ path: string; at: number; vaultName: string; size: number }>>([])\n const [openSessions, setOpenSessions] = useState<Array<{ sessionId: string; url: string; openedAt: number }>>([])\n const [savedSessions, setSavedSessions] = useState<Array<{ id: string; title: string; url?: string; cookieCount: number; expiredCount?: number; expiringSoon?: number; updatedAt?: number }>>([])\n const [sessionUrl, setSessionUrl] = useState('')\n const [sessionTitle, setSessionTitle] = useState('')\n const [sessionDetail, setSessionDetail] = useState<{ id: string; title: string; url?: string; cookies: unknown[]; notes?: string } | null>(null)\n const [watchMap, setWatchMap] = useState<Record<string, { score: number; verdict: string; flags: string[] }>>({})\n const [sessionPaste, setSessionPaste] = useState('')\n const [sessionPasteTitle, setSessionPasteTitle] = useState('')\n const [sysQuery, setSysQuery] = useState('')\n const [sysMatches, setSysMatches] = useState<Array<{ source: string; name: string; username: string }>>([])\n const [nowTick, setNowTick] = useState(Date.now())\n const [tagsDraft, setTagsDraft] = useState('')\n const [fieldsDraft, setFieldsDraft] = useState('')\n const [revealed, setRevealed] = useState<Record<string, boolean>>({})\n const [genOpts, setGenOpts] = useState<{ length: number; uppercase: boolean; lowercase: boolean; digits: boolean; symbols: boolean; excludeAmbiguous: boolean; passphrase: boolean; words: number; separator: string; wordDigits: boolean }>({ length: 24, uppercase: true, lowercase: true, digits: true, symbols: true, excludeAmbiguous: false, passphrase: false, words: 4, separator: '-', wordDigits: true })\n const [showGenOpts, setShowGenOpts] = useState(false)\n const [pwStrength, setPwStrength] = useState<{ score: number; verdict: string; bits: number } | null>(null)\n const [tplList, setTplList] = useState<Array<{ name: string; kind: string; fields: Record<string, string> }>>([])\n const [kindFilter, setKindFilter] = useState('')\n const [tagFilter, setTagFilter] = useState('')\n const [expandedId, setExpandedId] = useState<string | null>(null)\n const [attachmentsMap, setAttachmentsMap] = useState<Record<string, Array<{ name: string; size: number }>>>({})\n const [selectMode, setSelectMode] = useState(false)\n const [selectedIds, setSelectedIds] = useState<Set<string>>(new Set())\n const [visibleCount, setVisibleCount] = useState(50)\n const [sortBy, setSortBy] = useState<'alpha' | 'recent' | 'created' | 'favorite' | 'smart'>('alpha')\n const [activeTab, setActiveTab] = useState<'entries' | 'security' | 'transfer' | 'backup' | 'permissions' | 'sessions' | 'trash'>('entries')\n const [policy, setPolicy] = useState<{ accessMode: 'readonly' | 'ask' | 'auto'; autoCapture: boolean; autoLockSeconds: number } | null>(null)\n const [trashEntries, setTrashEntries] = useState<VaultSummaryWire[]>([])\n const [report, setReport] = useState<{ rotation: unknown[]; weak: unknown[]; reused: unknown[]; strength: { weak: number; fair: number; strong: number } | null; no2fa: unknown[]; httpSites: unknown[]; score: number; verdict: string } | null>(null)\n const [dueMap, setDueMap] = useState<Record<string, { due: string; daysLeft: number }>>({})\n const [recentEvents, setRecentEvents] = useState<Array<Record<string, unknown>>>([])\n const [vaultStats, setVaultStats] = useState<Record<string, unknown> | null>(null)\n const [backupInfo, setBackupInfo] = useState<{ daysSinceBackup: number; backups: number } | null>(null)\n const [recentEntries, setRecentEntries] = useState<Array<Record<string, unknown>>>([])\n const [dupGroups, setDupGroups] = useState<number>(0)\n const [dupList, setDupList] = useState<Array<Array<{ id: string; title: string }>>>([])\n const [locked, setLocked] = useState(false)\n const [vaults, setVaults] = useState<Array<{ name: string; active: boolean; entries?: number }>>([])\n const [audit, setAudit] = useState<Array<{ id: string; title: string; issues: string[] }>>([])\n const [breach, setBreach] = useState<{ checked: number; pwned: Array<{ id: string; title: string; count: number }>; weak: Array<{ id: string; title: string }>; offline: boolean } | null>(null)\n\n const readonly = policy?.accessMode === 'readonly'\n\n /** Format a byte count for display (e.g. 1536 → \"1.5 KB\"). */\n function formatSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`\n }\n\n /** Turn an RPC/Error failure into a specific, localized message instead of\n * the generic \"operation failed\" copy. The RPC channel wraps errors as\n * `vault.<method> failed: <code>: <message>`; unwrap and map the common\n * host-side failures to friendly copy, falling back to the raw detail. */\n function errText(err: unknown): string {\n const raw = err instanceof Error ? err.message : String(err ?? '')\n const clean = raw.replace(/^vault\\.[a-z]+ failed: [^:]+: /i, '')\n if (/vault is locked/i.test(clean)) return t('errLocked')\n if (/title must not be empty/i.test(clean)) return t('errTitleEmpty')\n if (/invalid vault name/i.test(clean)) return t('errInvalidVaultName')\n if (/disabled in readonly mode/i.test(clean)) return t('errReadonly')\n if (clean.length === 0) return t('error')\n return t('errDetail').replace('{detail}', clean)\n }\n\n /** Format an auto-lock timeout (seconds) for display: 90 → \"1m 30s\". */\n function formatAutoLock(seconds: number): string {\n if (seconds <= 0) return '0'\n const m = Math.floor(seconds / 60)\n const s = seconds % 60\n if (m === 0) return `${s}s`\n if (s === 0) return `${m}m`\n return `${m}m ${s}s`\n }\n\n // Suggest an icon from the URL domain (1Password-style visual hint).\n useEffect(() => {\n const url = form.url ?? ''\n if (url.length === 0 || (form.icon ?? '').length > 0) return\n const host = url.replace(/^https?:\\/\\//i, '').split('/')[0]!.toLowerCase()\n const map: Record<string, string> = {\n github: '🐙', gitlab: '🦊', google: '🔎', 'google.com': '🔎', amazon: '📦', apple: '',\n aws: '☁️', azure: '☁️', digitalocean: '🐳', docker: '🐳', npm: '📦', figma: '🎨',\n notion: '📝', slack: '💬', discord: '🎮', twitter: '🐦', facebook: '👥', instagram: '📷',\n linkedin: '💼', youtube: '▶️', netflix: '🎬', spotify: '🎵', dropbox: '📁', drive: '🗂️',\n }\n const hostBase = host.split('.')[0] ?? ''\n const icon = map[host] ?? map[hostBase] ?? ''\n if (icon) setForm(previous => ({ ...previous, icon }))\n }, [form.url, form.icon])\n useEffect(() => {\n const pw = form.password ?? ''\n if (pw.length === 0) { setPwStrength(null); return }\n const timer = window.setTimeout(() => {\n void strength(pw).then(\n r => setPwStrength({ score: r.score, verdict: r.verdict, bits: r.bits }),\n () => setPwStrength(null),\n )\n }, 250)\n return () => window.clearTimeout(timer)\n }, [form.password, strength])\n\n /** Apply a template's field values to the current form. The form is reset\n * to its empty state first (so fields the template does not set are cleared\n * rather than leaking the previous template's values), then the template's\n * fields are applied. Secret-ish fields are never filled from a template.\n * Non-catalog kinds (wifi/server/database/identity/bank templates) map to\n * the closest catalog kind so the kind selector and store stay consistent. */\n const CATALOG_KIND: Record<string, string> = {\n wifi: 'login', server: 'ssh', database: 'ssh', identity: 'login', bank: 'card',\n }\n function applyTemplate(name: string): void {\n const tpl = tplList.find(t => t.name === name)\n if (!tpl) return\n const next: Partial<FormFields> = {}\n if (tpl.kind !== 'builtin:custom') {\n const raw = tpl.kind.replace('builtin:', '')\n next.kind = CATALOG_KIND[raw] ?? raw\n }\n for (const [key, value] of Object.entries(tpl.fields)) {\n if (key === 'password' || key === 'otpSecret' || key === 'apiKey' || key === 'secret') continue\n ;(next as Record<string, unknown>)[key] = value\n }\n // Start from a clean form so switching templates never leaves stale values\n // from the previous template behind (the user's reported UX bug).\n setForm({ ...emptyForm(), ...next })\n }\n\n /** Change the entry kind. When CREATING a new entry, unrelated fields from\n * the previous kind are cleared so the form does not carry stale values; when\n * EDITING an existing entry the other fields are kept (they may be valid for\n * the new kind too, and clearing would risk data loss). */\n function changeKind(kind: string): void {\n setForm(previous => {\n if (editor.status === 'creating') {\n return { ...emptyForm(), kind }\n }\n return { ...previous, kind }\n })\n }\n\n /** Save the current form as a reusable template. */\n async function saveAsTemplate(): Promise<void> {\n const name = window.prompt(t('tplNamePrompt'))\n if (!name) return\n const fields: Record<string, string> = {}\n for (const key of ['username', 'email', 'phone', 'host', 'port', 'url', 'notes', 'icon', 'color',\n 'cardNumber', 'cardExpiry', 'cardCvv', 'cardHolder']) {\n const v = (form as Record<string, unknown>)[key]\n if (typeof v === 'string' && v.length > 0) fields[key] = v\n }\n await saveTemplate(name.trim(), form.kind ?? 'login', fields)\n await templates().then(setTplList).catch(() => {})\n setMessage(`${t('tplSaved')} ${name.trim()}`)\n }\n\n /** Switch the active vault and reload everything. */\n async function switchVaultTo(name: string): Promise<void> {\n setBusy(true)\n setMessage(null)\n try {\n await switchVault(name)\n await listVaults().then(setVaults)\n setQuery('')\n void backups(20).then(setBackupList).catch(() => {})\n void backupStatus().then(bk => setBackupInfo(bk)).catch(() => {})\n void refresh()\n status().then(value => setLocked(value.locked)).catch(() => {})\n } catch (err) {\n setMessage(errText(err))\n } finally {\n setBusy(false)\n }\n }\n\n /** Delete one backup file (confirms first). */\n async function deleteBackupFile(b: { path: string }): Promise<void> {\n if (!window.confirm(t('backupDeleteConfirm'))) return\n setBusy(true)\n setMessage(null)\n try {\n const r = await deleteBackup(b.path)\n setMessage(t('backupDeleted'))\n void backups(20).then(setBackupList).catch(() => {})\n } catch (err) {\n setMessage(errText(err))\n } finally {\n setBusy(false)\n }\n }\n\n /** Rename the active (or picked) vault. */\n async function runVaultRename(): Promise<void> {\n const current = vaults.find(v => v.active)?.name ?? 'default'\n const target = window.prompt(`${t('vaultRenamePrompt')} (${current})`)\n if (target === null || target.trim() === '' || target.trim() === current) return\n setBusy(true)\n setMessage(null)\n try {\n const r = await vaultRename(current, target.trim())\n setMessage(r.note)\n await listVaults().then(setVaults)\n void refresh()\n } catch (err) {\n setMessage(errText(err))\n } finally {\n setBusy(false)\n }\n }\n\n /** Delete a picked vault (confirms first; default vault cannot be deleted). */\n async function runVaultDelete(name: string): Promise<void> {\n if (name === 'default') { setMessage(t('vaultDeleteDefault')); return }\n if (!window.confirm(t('vaultDeleteConfirm').replace('{name}', name))) return\n setBusy(true)\n setMessage(null)\n try {\n const r = await vaultDelete(name, true)\n setMessage(r.note)\n await listVaults().then(setVaults)\n void backups(20).then(setBackupList).catch(() => {})\n void refresh()\n } catch (err) {\n setMessage(errText(err))\n } finally {\n setBusy(false)\n }\n }\n\n /** Import from Firefox (prompts for the primary password when one is set). */\n async function runFirefoxImport(): Promise<void> {\n const mp = window.prompt(t('firefoxMasterPw'))\n if (mp === null) return\n setBusy(true)\n setMessage(null)\n try {\n const r = await importFirefox(mp, false)\n setMessage(r.note)\n void refresh()\n } catch (err) {\n setMessage(errText(err))\n } finally {\n setBusy(false)\n }\n }\n\n /** Import from Chrome / Keychain with a confirmation about keychain prompts. */\n async function runSystemImport(source: 'chrome' | 'keychain', preview: boolean): Promise<void> {\n if (source === 'keychain' && !preview) {\n const ok = window.confirm(t('keychainPromptWarn'))\n if (!ok) return\n }\n setBusy(true)\n setMessage(null)\n try {\n const r = source === 'chrome'\n ? await importChrome(false)\n : await keychainImport({ limit: 10, preview })\n setMessage(r.note)\n void refresh()\n } catch (err) {\n setMessage(errText(err))\n } finally {\n setBusy(false)\n }\n }\n\n /** Import a 1Password 1PUX file (path entered by the user). */\n async function runImport1password(): Promise<void> {\n const path = window.prompt(t('import1passwordPrompt'))\n if (path === null || path.trim() === '') return\n setBusy(true)\n setMessage(null)\n try {\n const r = await import1password(path.trim(), false)\n setMessage(r.note)\n void refresh()\n refreshHealth()\n } catch (err) {\n setMessage(errText(err))\n } finally {\n setBusy(false)\n }\n }\n\n /** Preview a file import (dry run) — reports counts without writing. */\n async function runImportPreview(run: () => Promise<{ note: string }>): Promise<void> {\n setBusy(true)\n setMessage(null)\n try {\n const r = await run()\n setMessage(`${t('previewLabel')} ${r.note}`)\n } catch (err) {\n setMessage(errText(err))\n } finally {\n setBusy(false)\n }\n }\n\n /** Preview a file-based import: prompt for the path, then dry-run. */\n async function runFilePreview(promptKey: string, run: (path: string, overwrite: boolean, dryRun: boolean) => Promise<{ note: string }>): Promise<void> {\n const path = window.prompt(t(promptKey as never))\n if (path === null || path.trim() === '') return\n await runImportPreview(() => run(path.trim(), false, true))\n }\n\n /** Import a password-manager CSV file (Dashlane/NordPass/Keeper). */\n async function runImportManagerCsv(): Promise<void> {\n const path = window.prompt(t('importManagerCsvPrompt'))\n if (path === null || path.trim() === '') return\n setBusy(true)\n setMessage(null)\n try {\n const r = await importManagerCsv(path.trim(), false)\n setMessage(r.note)\n void refresh()\n refreshHealth()\n } catch (err) {\n setMessage(errText(err))\n } finally {\n setBusy(false)\n }\n }\n\n /** Import an Enpass JSON export (path entered by the user). */\n async function runImportEnpass(): Promise<void> {\n const path = window.prompt(t('importEnpassPrompt'))\n if (path === null || path.trim() === '') return\n setBusy(true)\n setMessage(null)\n try {\n const r = await importEnpass(path.trim(), false)\n setMessage(r.note)\n void refresh()\n refreshHealth()\n } catch (err) {\n setMessage(errText(err))\n } finally {\n setBusy(false)\n }\n }\n\n /** Import a Bitwarden JSON export (path entered by the user). */\n async function runImportBitwarden(): Promise<void> {\n const path = window.prompt(t('importBitwardenPrompt'))\n if (path === null || path.trim() === '') return\n setBusy(true)\n setMessage(null)\n try {\n const r = await importBitwarden(path.trim(), false)\n setMessage(r.note)\n void refresh()\n refreshHealth()\n } catch (err) {\n setMessage(errText(err))\n } finally {\n setBusy(false)\n }\n }\n\n /** Import a Bitwarden password-protected JSON export (asks for the export passphrase). */\n async function runImportBitwardenEncrypted(): Promise<void> {\n const path = window.prompt(t('importBitwardenEncryptedPrompt'))\n if (path === null || path.trim() === '') return\n const password = window.prompt(t('importBitwardenEncryptedPasswordPrompt'))\n if (password === null) return\n setBusy(true)\n setMessage(null)\n try {\n const r = await importBitwardenEncrypted(path.trim(), password, false)\n setMessage(r.note)\n void refresh()\n refreshHealth()\n } catch (err) {\n setMessage(errText(err))\n } finally {\n setBusy(false)\n }\n }\n\n /** Import a legacy 1Password 1PIF export. */\n async function runImport1pif(): Promise<void> {\n const path = window.prompt(t('import1pifPrompt'))\n if (path === null || path.trim() === '') return\n setBusy(true)\n setMessage(null)\n try {\n const r = await import1pif(path.trim(), false)\n setMessage(r.note)\n void refresh()\n refreshHealth()\n } catch (err) {\n setMessage(errText(err))\n } finally {\n setBusy(false)\n }\n }\n\n /** Import a KeePass 2.x XML export. */\n async function runImportKeePassXml(): Promise<void> {\n const path = window.prompt(t('importKeePassXmlPrompt'))\n if (path === null || path.trim() === '') return\n setBusy(true)\n setMessage(null)\n try {\n const r = await importKeePassXml(path.trim(), false)\n setMessage(r.note)\n void refresh()\n refreshHealth()\n } catch (err) {\n setMessage(errText(err))\n } finally {\n setBusy(false)\n }\n }\n\n /** Import a KeePass KDBX binary database (asks for path + optional password). */\n async function runImportKdbx(): Promise<void> {\n const path = window.prompt(t('importKdbxPrompt'))\n if (path === null || path.trim() === '') return\n const password = window.prompt(t('importKdbxPasswordPrompt')) ?? ''\n setBusy(true)\n setMessage(null)\n try {\n const r = await importKdbx(path.trim(), password, '', false)\n setMessage(r.note)\n void refresh()\n refreshHealth()\n } catch (err) {\n setMessage(errText(err))\n } finally {\n setBusy(false)\n }\n }\n\n /** Export the vault as a 1Password 1PUX archive. */\n async function runExport1pux(): Promise<void> {\n const suggested = t('exportDefaultPath').replace('{file}', `${new Date().toISOString().slice(0, 10)}.1pux`)\n const path = window.prompt(`${t('export1puxPrompt')}\\n${t('exportPathHint')}: ${suggested}`, suggested)\n if (path === null || path.trim() === '') return\n setBusy(true)\n setMessage(null)\n try {\n const r = await export1pux(path.trim())\n setMessage(`${t('exportDone')} (${r.count} ${t('entryCount').toLowerCase()}) — ${r.path}`)\n } catch (err) {\n setMessage(errText(err))\n } finally {\n setBusy(false)\n }\n }\n\n /** Export the vault as a Bitwarden JSON document. */\n async function runExportBitwarden(): Promise<void> {\n const suggested = t('exportDefaultPath').replace('{file}', `${new Date().toISOString().slice(0, 10)}.json`)\n const path = window.prompt(`${t('exportBitwardenPrompt')}\\n${t('exportPathHint')}: ${suggested}`, suggested)\n if (path === null || path.trim() === '') return\n setBusy(true)\n setMessage(null)\n try {\n const r = await exportBitwarden(path.trim())\n setMessage(`${t('exportDone')} (${r.count} ${t('entryCount').toLowerCase()}) — ${r.path}`)\n } catch (err) {\n setMessage(errText(err))\n } finally {\n setBusy(false)\n }\n }\n\n /** Search Chrome/Keychain for the typed keyword (no secrets shown). */\n async function searchSystemStores(): Promise<void> {\n if (sysQuery.trim().length === 0) return\n setBusy(true)\n setMessage(null)\n try {\n const r = await searchSystem(sysQuery.trim(), 'all', 15)\n setSysMatches(r.matches)\n } catch (err) {\n setMessage(errText(err))\n } finally {\n setBusy(false)\n }\n }\n\n /** Rename a tag across all entries (Bitwarden-style tag merge). */\n async function renameTagAll(from: string): Promise<void> {\n const to = window.prompt(`${t('tagRenamePrompt')} ${from}`)\n if (!to || to.trim().length === 0 || to.trim() === from) return\n await renameTag(from, to.trim())\n await tags().then(setTagList).catch(() => {})\n void refresh()\n }\n\n /** Merge one duplicate into another (first keeps gaps filled), then refresh. */\n async function mergeEntries(group: Array<{ id: string; title: string }>): Promise<void> {\n if (group.length < 2) return\n setBusy(true)\n setMessage(null)\n try {\n const [first, second] = group\n await merge(second!.id, first!.id, false)\n await duplicateGroups().then(setDupList)\n void refresh()\n } catch (err) {\n setMessage(errText(err))\n } finally {\n setBusy(false)\n }\n }\n\n /** Lock the vault immediately from the UI. */\n async function lockNow(): Promise<void> {\n setBusy(true)\n try {\n const r = await lock()\n setLocked(r.locked)\n if (r.locked) {\n // The vault is locked: clear the visible list and health data so\n // stale secrets and stats are not left on screen.\n setState({ status: 'ready', entries: [] })\n setReport(null)\n setVaultStats(null)\n setAudit([])\n setDupList([])\n setTagList([])\n setBreach(null)\n setMessage(t('lockedMsg'))\n } else {\n setMessage(t('error'))\n }\n } catch (err) {\n setMessage(errText(err))\n } finally {\n setBusy(false)\n }\n }\n\n /** Unlock the vault from the locked banner. */\n async function unlockNow(): Promise<void> {\n setBusy(true)\n try {\n const r = await unlock()\n setLocked(r.locked)\n if (!r.locked) {\n void refresh()\n void status().then(value => setLocked(value.locked)).catch(() => {})\n }\n } catch (err) {\n setMessage(errText(err))\n } finally {\n setBusy(false)\n }\n }\n\n /** Export the current security report (weak/reused/no-2FA/http/rotation)\n * as a CSV file (1Password Watchtower-style). Client-side only; the report\n * data is already loaded. */\n async function exportReportCsv(): Promise<void> {\n if (report === null) return\n const esc = (v: unknown): string => {\n const s = String(v ?? '')\n return /[\",\\n]/.test(s) ? `\"${s.replace(/\"/g, '\"\"')}\"` : s\n }\n const lines: string[] = [`dsh-vault security report,${new Date().toISOString()},score=${report.score},verdict=${report.verdict}`]\n lines.push('')\n lines.push('weak passwords,title')\n for (const w of report.weak as Array<{ title?: string; id?: string }>) lines.push(`weak,${esc(w.title ?? w.id ?? '')}`)\n lines.push('')\n lines.push('reused passwords,title')\n for (const r of report.reused as Array<{ title?: string; id?: string }>) lines.push(`reused,${esc(r.title ?? r.id ?? '')}`)\n lines.push('')\n lines.push('missing 2FA,title')\n for (const n of report.no2fa as Array<{ title?: string; id?: string }>) lines.push(`no-2fa,${esc(n.title ?? n.id ?? '')}`)\n lines.push('')\n lines.push('http sites,title')\n for (const h of report.httpSites as Array<{ title?: string; id?: string }>) lines.push(`http,${esc(h.title ?? h.id ?? '')}`)\n lines.push('')\n lines.push('rotation due,title')\n for (const r of report.rotation as Array<{ title?: string; id?: string }>) lines.push(`rotation,${esc(r.title ?? r.id ?? '')}`)\n const blob = new Blob(['\\uFEFF' + lines.join('\\n')], { type: 'text/csv;charset=utf-8' })\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n a.download = `dsh-vault-security-report-${new Date().toISOString().slice(0, 10)}.csv`\n document.body.appendChild(a)\n a.click()\n a.remove()\n URL.revokeObjectURL(url)\n setMessage(t('reportExported'))\n }\n\n /** Run a Watchtower-style breach scan and show the result. */\n async function runBreachCheck(): Promise<void> {\n setBusy(true)\n setMessage(null)\n try {\n const result = await breachCheck(true)\n setBreach(result)\n if (result.pwned.length === 0 && result.weak.length === 0) {\n setMessage(result.offline ? t('breachOkOffline') : t('breachOk'))\n }\n } catch (err) {\n setMessage(errText(err))\n } finally {\n setBusy(false)\n }\n }\n\n /** Run an encrypted backup now and refresh the backup-age badge + list. */\n async function backupNow(): Promise<void> {\n setBusy(true)\n setMessage(null)\n try {\n const result = await backup()\n setBackupInfo({ daysSinceBackup: 0, backups: result.kept })\n setMessage(`${t('backupDone')} (${result.kept} kept, ${result.pruned} pruned)`)\n void backups(20).then(setBackupList).catch(() => {})\n void refresh()\n } catch (err) {\n setMessage(errText(err))\n } finally {\n setBusy(false)\n }\n }\n\n /** Restore the vault from a backup file (asks for confirmation first). */\n async function restoreBackupFrom(b: { path: string; at: number }): Promise<void> {\n const mode = window.confirm(t('backupRestoreModeMerge'))\n ? 'merge'\n : window.confirm(t('backupRestoreModeReplace')) ? 'replace' : null\n if (mode === null) return\n setBusy(true)\n setMessage(null)\n try {\n const result = await restoreBackup(b.path, mode)\n setMessage(result.note)\n setBackupInfo(null)\n void backups(20).then(setBackupList).catch(() => {})\n void refresh()\n if (result.safetyBackup !== '') setMessage(`${result.note} — ${t('backupSafetyHint')} ${result.safetyBackup}`)\n } catch (err) {\n setMessage(errText(err))\n } finally {\n setBusy(false)\n }\n }\n\n /** Reload the sessions lists (open windows + saved sessions). */\n const refreshSessions = useCallback((): void => {\n void sessionListOpen().then(setOpenSessions).catch(() => {})\n void sessionListSaved().then(setSavedSessions).catch(() => {})\n }, [sessionListOpen, sessionListSaved])\n\n /** Open a browser window for manual login, then show the collect hint. */\n async function runSessionOpen(): Promise<void> {\n if (readonly) { setMessage(t('sessionReadOnly')); return }\n const url = sessionUrl.trim()\n if (url.length === 0) { setMessage(t('sessionUrlPrompt')); return }\n setBusy(true)\n setMessage(null)\n try {\n const result = await sessionOpen(url)\n setMessage(t('sessionNoteOpen').replace('{url}', result.url))\n refreshSessions()\n } catch {\n setMessage(t('sessionOpenFailed'))\n } finally {\n setBusy(false)\n }\n }\n\n /** Collect cookies from an open window and save them under a title. */\n async function runSessionCollect(sessionId: string, fallbackUrl: string): Promise<void> {\n if (readonly) { setMessage(t('sessionReadOnly')); return }\n let title = sessionTitle.trim()\n if (title.length === 0) {\n const asked = window.prompt(`${t('sessionSaveTitle')} ${t('sessionNamePlaceholder')}`)\n if (asked === null) return\n title = asked.trim()\n if (title.length === 0) return\n }\n setBusy(true)\n setMessage(null)\n try {\n const collected = await sessionCollect(sessionId, fallbackUrl)\n if (collected.count === 0) { setMessage(t('sessionNoteCollect').replace('{n}', '0')); return }\n const saved = await sessionSave({ title, cookies: collected.cookies, url: fallbackUrl, overwrite: true })\n setMessage(t('sessionSaved').replace('{n}', String(saved.saved)))\n setSessionTitle('')\n refreshSessions()\n } catch (err) {\n setMessage(errText(err))\n } finally {\n setBusy(false)\n }\n }\n\n /** Close a browser window. */\n async function runSessionClose(sessionId: string): Promise<void> {\n setBusy(true)\n try {\n await sessionClose(sessionId)\n refreshSessions()\n } finally {\n setBusy(false)\n }\n }\n\n /** Copy a saved session as a Cookie header (or jar) to the clipboard. */\n async function runSessionExport(id: string, format: 'header' | 'netscape' | 'playwright'): Promise<void> {\n setBusy(true)\n setMessage(null)\n try {\n const exported = await sessionExport(id, format)\n await navigator.clipboard.writeText(exported.text)\n setCopiedId(id)\n window.setTimeout(() => setCopiedId(current => current === id ? null : current), 1600)\n } catch (err) {\n setMessage(errText(err))\n } finally {\n setBusy(false)\n }\n }\n\n /** Show the cookie detail of a saved session. */\n async function runSessionDetail(id: string): Promise<void> {\n setBusy(true)\n try {\n const detail = await sessionGet(id)\n setSessionDetail(detail)\n } catch (err) {\n setMessage(errText(err))\n } finally {\n setBusy(false)\n }\n }\n\n /** Remove expired cookies from a saved session (confirms first). */\n async function runSessionPrune(id: string): Promise<void> {\n if (!window.confirm(t('sessionPruneConfirm'))) return\n setBusy(true)\n setMessage(null)\n try {\n const result = await sessionPrune(id, false)\n setMessage(result.note)\n refreshSessions()\n } catch (err) {\n setMessage(errText(err))\n } finally {\n setBusy(false)\n }\n }\n\n /** Generate a one-time recovery code and show it once (confirm first). */\n async function runRecoveryCode(): Promise<void> {\n if (!window.confirm(t('recoveryCodeConfirm'))) return\n setBusy(true)\n setMessage(null)\n try {\n const r = await recoveryCode()\n window.alert(`${t('recoveryCodeAlert')}\\n\\n${r.code}\\n\\n${r.note}`)\n setMessage(t('recoveryCodeSet'))\n } catch (err) {\n setMessage(errText(err))\n } finally {\n setBusy(false)\n }\n }\n\n /** Verify a recovery code typed by the user. */\n async function runVerifyRecovery(): Promise<void> {\n const code = window.prompt(t('recoveryCodeVerifyPrompt'))\n if (code === null || code.trim() === '') return\n setBusy(true)\n setMessage(null)\n try {\n const r = await verifyRecovery(code.trim())\n setMessage(r.verified ? t('recoveryVerified') : t('recoveryNotVerified'))\n } catch (err) {\n setMessage(errText(err))\n } finally {\n setBusy(false)\n }\n }\n\n /** Save cookies pasted as JSON / header text. */\n async function runSessionImport(): Promise<void> {\n if (readonly) { setMessage(t('sessionReadOnly')); return }\n const title = sessionPasteTitle.trim()\n const raw = sessionPaste.trim()\n if (title.length === 0 || raw.length === 0) { setMessage(t('sessionImportPastePrompt')); return }\n setBusy(true)\n setMessage(null)\n try {\n const parsed = parsePastedCookiesClient(raw)\n if (parsed.length === 0) { setMessage(t('sessionImportPastePrompt')); return }\n const saved = await sessionSave({ title, cookies: parsed, overwrite: true })\n setMessage(t('sessionSaved').replace('{n}', String(saved.saved)))\n setSessionPaste('')\n setSessionPasteTitle('')\n refreshSessions()\n } catch (err) {\n setMessage(errText(err))\n } finally {\n setBusy(false)\n }\n }\n\n /** Client-side cookie parser (mirrors the host parsePastedCookies). */\n function parsePastedCookiesClient(text: string): unknown[] {\n const trimmed = text.trim()\n if (trimmed.length === 0) return []\n const out: unknown[] = []\n if (trimmed.startsWith('[') || trimmed.startsWith('{')) {\n try {\n const parsed = JSON.parse(trimmed) as unknown\n const rows = Array.isArray(parsed) ? parsed : [parsed]\n for (const row of rows) {\n if (typeof row !== 'object' || row === null) continue\n const r = row as Record<string, unknown>\n if (typeof r.name !== 'string' || typeof r.value !== 'string' || typeof r.domain !== 'string') continue\n out.push({\n name: r.name, value: r.value, domain: r.domain,\n path: typeof r.path === 'string' ? r.path : '/',\n expires: typeof r.expires === 'number' ? r.expires : -1,\n httpOnly: r.httpOnly === true, secure: r.secure === true,\n ...(r.sameSite === 'Strict' || r.sameSite === 'Lax' || r.sameSite === 'None' ? { sameSite: r.sameSite } : {}),\n })\n }\n } catch { return [] }\n } else {\n for (const pair of trimmed.split(';')) {\n const eq = pair.indexOf('=')\n if (eq <= 0) continue\n const name = pair.slice(0, eq).trim()\n const value = pair.slice(eq + 1).trim()\n if (name.length === 0) continue\n out.push({ name, value, domain: '', path: '/', expires: -1, httpOnly: false, secure: false })\n }\n }\n return out\n }\n\n useEffect(() => {\n let current = true\n void config().then(\n value => { if (current) setPolicy(value) },\n () => { /* policy is informational; ignore failures */ },\n )\n void status().then(\n value => { if (current) setLocked(value.locked) },\n () => { /* ignore */ },\n )\n void listVaults().then(setVaults).catch(() => {})\n void templates().then(setTplList).catch(() => {})\n void watchtower().then(list => {\n const map: Record<string, { score: number; verdict: string; flags: string[] }> = {}\n for (const w of list) map[w.id] = { score: w.score, verdict: w.verdict, flags: w.flags }\n setWatchMap(map)\n }).catch(() => {})\n refreshSessions()\n return () => { current = false }\n }, [config, status, listVaults, templates, refreshSessions])\n\n const refresh = useMemo(() => async () => {\n setState({ status: 'loading' })\n try {\n const entries = query.trim().length === 0\n ? await list()\n : await search(query.trim())\n setState({ status: 'ready', entries })\n setVisibleCount(50)\n status().then(value => setLocked(value.locked)).catch(() => {})\n } catch (err) {\n // A locked vault makes list() throw; surface the locked banner instead\n // of a generic failure (the user can unlock, not retry). Even when\n // status() itself fails (e.g. an older host), a lock-shaped error still\n // flips the locked flag so write actions stay disabled.\n const st = await status().catch(() => null)\n const raw = err instanceof Error ? err.message : String(err ?? '')\n const lockError = (st !== null && st.locked) || /vault is locked/i.test(raw)\n if (lockError) {\n setLocked(true)\n setState({ status: 'ready', entries: [] })\n } else {\n setState({ status: 'error', reason: errText(err) })\n }\n }\n }, [list, search, query])\n\n useEffect(() => {\n let current = true\n const timer = window.setTimeout(() => {\n void refresh().then(\n () => { /* state already set inside refresh */ },\n () => { if (current) setState({ status: 'error' }) },\n )\n }, 250)\n return () => { current = false; window.clearTimeout(timer) }\n // refresh is memoized on query (debounced); list/search are stable.\n }, [refresh])\n\n // TOTP countdown: tick every second so the progress ring stays live, and\n // auto-refresh any code whose 30s window just expired.\n useEffect(() => {\n const timer = window.setInterval(() => setNowTick(Date.now()), 1000)\n return () => window.clearInterval(timer)\n }, [])\n\n useEffect(() => {\n for (const [id, info] of Object.entries(totpMap)) {\n if (info.until > 0 && nowTick >= info.until && info.code !== t('error')) {\n void totp(id).then(\n result => setTotpMap(previous => ({\n ...previous,\n [id]: { code: result.code, until: Date.now() + result.secondsRemaining * 1000 },\n })),\n () => { /* keep the last code; next window retries */ },\n )\n }\n }\n }, [nowTick, totpMap, totp])\n\n // Load attachments when an entry is expanded.\n useEffect(() => {\n if (expandedId === null) return\n let current = true\n void attachments(expandedId).then(r => {\n if (current && r.found) setAttachmentsMap(prev => ({ ...prev, [expandedId]: r.attachments }))\n }).catch(() => {})\n return () => { current = false }\n }, [expandedId, attachments])\n\n /** Recompute just the health report (weak/reused/no-2FA/rotation) after a\n * write so the toolbar badges stay current without a full reload. */\n const refreshHealth = useCallback(() => {\n void health().then(hl => {\n setReport(previous => ({\n ...(previous ?? { rotation: [], weak: [], reused: [], strength: null, no2fa: [], httpSites: [], score: 100, verdict: 'good' }),\n weak: (hl?.weak ?? []) as unknown[],\n reused: (hl?.reused ?? []) as unknown[],\n strength: (hl?.strength ?? null) as { weak: number; fair: number; strong: number } | null,\n no2fa: ((hl?.no2fa ?? []) as unknown[]),\n httpSites: ((hl?.httpSites ?? []) as unknown[]),\n score: Number(hl?.score ?? 100),\n verdict: String(hl?.verdict ?? 'good'),\n }))\n }).catch(() => {})\n void history().then(events => setRecentEvents((events ?? []) as Array<Record<string, unknown>>)).catch(() => {})\n }, [health, history])\n\n // Vault health & meta: load once on mount (stats, backup age, rotation,\n // weak/reused scan, recent activity) and refresh on window focus.\n useEffect(() => {\n let current = true\n const load = (): void => {\n void Promise.all([\n stats().catch(() => null),\n backupStatus().catch(() => null),\n rotation().catch(() => []),\n health().catch(() => null),\n recent().catch(() => []),\n history().catch(() => []),\n duplicates().catch(() => null),\n ]).then(([st, bk, rot, hl, rc, hst, dp]) => {\n if (dp !== null && typeof dp === 'object' && (dp as { groups?: number }).groups !== undefined) {\n setDupGroups((dp as { groups: number }).groups)\n }\n if (Array.isArray(hst)) setRecentEvents(hst as Array<Record<string, unknown>>)\n duplicateGroups().then(setDupList).catch(() => {})\n verifyAll().then(setAudit).catch(() => {})\n tags().then(setTagList).catch(() => {})\n generatorHistory().then(setGenHistory).catch(() => {})\n backups(20).then(setBackupList).catch(() => {})\n trash().then(setTrashEntries).catch(() => {})\n if (!current) return\n if (st !== null) setVaultStats(st as Record<string, unknown>)\n if (bk !== null) setBackupInfo(bk)\n setReport({ rotation: (rot ?? []) as unknown[], weak: ((hl?.weak ?? []) as unknown[]), reused: ((hl?.reused ?? []) as unknown[]), strength: (hl?.strength ?? null) as { weak: number; fair: number; strong: number } | null, no2fa: ((hl?.no2fa ?? []) as unknown[]), httpSites: ((hl?.httpSites ?? []) as unknown[]), score: Number(hl?.score ?? 100), verdict: String(hl?.verdict ?? 'good') })\n const due: Record<string, { due: string; daysLeft: number }> = {}\n for (const item of (rot ?? []) as Array<{ id?: string; due?: string; daysLeft?: number }>) {\n if (item.id !== undefined && item.due !== undefined) due[item.id] = { due: item.due, daysLeft: item.daysLeft ?? 0 }\n }\n setDueMap(due)\n setRecentEntries((rc ?? []) as Array<Record<string, unknown>>)\n })\n }\n load()\n const onFocus = (): void => { load() }\n window.addEventListener('focus', onFocus)\n return () => { current = false; window.removeEventListener('focus', onFocus) }\n }, [stats, backupStatus, rotation, health, recent, duplicates, duplicateGroups, verifyAll, tags, generatorHistory, backups])\n\n /** Open the editor for a new entry. */\n function startCreate(): void {\n setForm(emptyForm())\n setTagsDraft('')\n setFieldsDraft('')\n setMessage(null)\n setEditor({ status: 'creating' })\n }\n\n /** Open the editor for an existing entry (fetches full secrets). */\n async function startEdit(id: string): Promise<void> {\n setBusy(true)\n setMessage(null)\n try {\n const result = await get(id)\n if (!result.found || result.entry === undefined) {\n setMessage(t('error'))\n return\n }\n const entry = result.entry\n setForm({\n title: entry.title ?? '',\n kind: entry.kind ?? 'login',\n username: entry.username ?? '',\n email: entry.email ?? '',\n phone: entry.phone ?? '',\n password: entry.password ?? '',\n host: entry.host ?? '',\n port: entry.port ?? '',\n privateKey: entry.privateKey ?? '',\n apiKey: entry.apiKey ?? '',\n secret: entry.secret ?? '',\n accessToken: entry.accessToken ?? '',\n refreshToken: entry.refreshToken ?? '',\n otpSecret: entry.otpSecret ?? '',\n url: entry.url ?? '',\n notes: entry.notes ?? '',\n icon: entry.icon ?? '',\n color: entry.color ?? '',\n expiresAt: entry.expiresAt,\n rotationDays: entry.rotationDays,\n sensitivity: entry.sensitivity,\n favorite: entry.favorite ?? false,\n })\n setTagsDraft((entry.tags ?? []).join(', '))\n setFieldsDraft(entry.fields !== undefined ? Object.entries(entry.fields).map(([k, v]) => `${k}=${String(v)}`).join('\\n') : '')\n setEditor({ status: 'editing', entry })\n } catch (err) {\n setMessage(errText(err))\n } finally {\n setBusy(false)\n }\n }\n\n /** Save the current form (create or update). */\n async function save(): Promise<void> {\n if (!(form.title ?? '').trim()) {\n setMessage(t('error'))\n return\n }\n // Editing an existing entry and actually typing a new password: confirm\n // (Bitwarden-style). An empty form password (entry had none, or the user\n // cleared it) is not a change, so it never prompts.\n const entryPw = editor.status === 'editing' ? (editor.entry?.password ?? '') : ''\n const typedPw = (form.password ?? '').trim()\n if (editor.status === 'editing' && typedPw.length > 0 && typedPw !== entryPw) {\n if (!window.confirm(t('pwChangeConfirm'))) return\n }\n setBusy(true)\n setMessage(null)\n try {\n const tags = tagsDraft.split(',').map(x => x.trim()).filter(x => x.length > 0)\n const fields: Record<string, string> = {}\n for (const line of fieldsDraft.split('\\n')) {\n const trimmed = line.trim()\n if (trimmed.length === 0) continue\n const eq = trimmed.indexOf('=')\n if (eq <= 0) continue\n fields[trimmed.slice(0, eq).trim()] = trimmed.slice(eq + 1).trim()\n }\n const patch: VaultPatch = {\n title: (form.title ?? '').trim(),\n ...(form.kind !== undefined ? { kind: form.kind } : {}),\n ...(form.username !== undefined ? { username: form.username } : {}),\n ...(form.email !== undefined ? { email: form.email } : {}),\n ...(form.phone !== undefined ? { phone: form.phone } : {}),\n ...(form.password !== undefined ? { password: form.password } : {}),\n ...(form.host !== undefined ? { host: form.host } : {}),\n ...(form.port !== undefined ? { port: form.port } : {}),\n ...(form.privateKey !== undefined ? { privateKey: form.privateKey } : {}),\n ...(form.apiKey !== undefined ? { apiKey: form.apiKey } : {}),\n ...(form.secret !== undefined ? { secret: form.secret } : {}),\n ...(form.accessToken !== undefined ? { accessToken: form.accessToken } : {}),\n ...(form.refreshToken !== undefined ? { refreshToken: form.refreshToken } : {}),\n ...(form.otpSecret !== undefined ? { otpSecret: form.otpSecret } : {}),\n ...(form.url !== undefined ? { url: form.url } : {}),\n ...(form.notes !== undefined ? { notes: form.notes } : {}),\n ...(form.icon !== undefined ? { icon: form.icon } : {}),\n ...(form.color !== undefined ? { color: form.color } : {}),\n ...(form.expiresAt !== undefined ? { expiresAt: form.expiresAt } : {}),\n ...(form.rotationDays !== undefined ? { rotationDays: form.rotationDays } : {}),\n ...(form.sensitivity !== undefined ? { sensitivity: form.sensitivity } : {}),\n ...(form.favorite !== undefined ? { favorite: form.favorite } : {}),\n // Always send tags: an empty array clears them, and the host store\n // treats empty string values as \"clear this field\" too.\n tags,\n fields,\n }\n if (editor.status === 'creating') {\n await add(patch as VaultPatch & { title: string })\n setMessage(t('savedNew'))\n } else if (editor.status === 'editing') {\n await update(editor.entry.id, patch)\n setMessage(t('savedUpdated'))\n }\n setEditor({ status: 'closed' })\n await refresh()\n refreshHealth()\n } catch (err) {\n setMessage(errText(err))\n } finally {\n setBusy(false)\n }\n }\n\n /** Delete an entry after confirmation. */\n async function removeEntry(id: string): Promise<void> {\n if (!window.confirm(t('deleteConfirm'))) return\n const title = state.status === 'ready' ? state.entries.find(e => e.id === id)?.title ?? '' : ''\n setBusy(true)\n try {\n await remove(id)\n await refresh()\n refreshHealth()\n setMessage(title !== '' ? t('deletedWithTitle').replace('{name}', title) : t('deleted'))\n } catch (err) {\n setMessage(errText(err))\n } finally {\n setBusy(false)\n }\n }\n\n /** Toggle batch-select mode (Bitwarden-style bulk operations). */\n function toggleSelectMode(): void {\n setSelectMode(m => {\n const next = !m\n if (!next) setSelectedIds(new Set())\n return next\n })\n }\n\n /** Delete all selected entries after one confirmation (bulk operation). */\n async function removeSelected(): Promise<void> {\n if (selectedIds.size === 0) return\n if (!window.confirm(t('bulkDeleteConfirm').replace('{n}', String(selectedIds.size)))) return\n const count = selectedIds.size\n setBusy(true)\n try {\n await Promise.all([...selectedIds].map(id => remove(id)))\n setSelectedIds(new Set())\n setSelectMode(false)\n await refresh()\n refreshHealth()\n setMessage(t('bulkDeleted').replace('{n}', String(count)))\n } catch (err) {\n setMessage(errText(err))\n } finally {\n setBusy(false)\n }\n }\n\n /** Copy a field value to the clipboard and flash the row. */\n const clipboardTimer = useRef<number | null>(null)\n const CLIPBOARD_CLEAR_MS = 30_000\n\n async function copyValue(id: string, value: string): Promise<void> {\n try {\n await navigator.clipboard.writeText(value)\n } catch {\n // Clipboard may be blocked; fall back to a temporary textarea.\n const textarea = document.createElement('textarea')\n textarea.value = value\n document.body.appendChild(textarea)\n textarea.select()\n document.execCommand('copy')\n textarea.remove()\n }\n setCopiedId(id)\n window.setTimeout(() => setCopiedId(null), 3000)\n // Auto-clear the clipboard after 30s (1Password/Bitwarden-style), so a\n // copied secret does not linger for anyone using the machine later. Only\n // clear when the clipboard still holds the value we copied — if the user\n // copied something else meanwhile, never wipe their content.\n if (clipboardTimer.current !== null) window.clearTimeout(clipboardTimer.current)\n const copied = value\n clipboardTimer.current = window.setTimeout(() => {\n clipboardTimer.current = null\n void navigator.clipboard.readText().then(current => {\n if (current === copied) void navigator.clipboard.writeText('').catch(() => {})\n }).catch(() => {})\n }, CLIPBOARD_CLEAR_MS)\n }\n\n /** Fetch and show the otpauth URI for an entry (for adding to another device). */\n async function showTotpUri(id: string): Promise<void> {\n setBusy(true)\n try {\n const r = await totpUri(id)\n setUriMap(previous => ({ ...previous, [id]: previous[id] === r.uri ? '' : r.uri }))\n } catch (err) {\n setMessage(errText(err))\n } finally {\n setBusy(false)\n }\n }\n\n /** Fetch and display a TOTP code for an entry with an otpSecret. */\n async function showTotp(id: string): Promise<void> {\n setBusy(true)\n try {\n const result = await totp(id)\n setTotpMap(previous => ({ ...previous, [id]: { code: result.code, until: Date.now() + result.secondsRemaining * 1000 } }))\n } catch {\n setTotpMap(previous => ({ ...previous, [id]: { code: t('error'), until: 0 } }))\n } finally {\n setBusy(false)\n }\n }\n\n /** Relative time like \"5m ago\" / \"2d ago\". */\n function relTime(epoch: unknown): string {\n const n = Number(epoch)\n if (!Number.isFinite(n) || n <= 0) return ''\n const secs = Math.max(0, Math.floor((Date.now() - n) / 1000))\n if (secs < 60) return `${secs}s`\n if (secs < 3600) return `${Math.floor(secs / 60)}m`\n if (secs < 86400) return `${Math.floor(secs / 3600)}h`\n return `${Math.floor(secs / 86400)}d`\n }\n\n /** Human-friendly value formatting for the expanded detail box. */\n function formatDetail(key: string, value: unknown): string {\n if (key === 'expiresAt' || key === 'updatedAt' || key === 'createdAt') {\n const n = Number(value)\n return Number.isFinite(n) && n > 0 ? new Date(n).toISOString().slice(0, 16).replace('T', ' ') : String(value)\n }\n if (key === 'sensitivity' && value === 'high') return t('sensitivityHigh')\n if (key === 'kind') return t(KIND_KEYS[String(value)] ?? 'kindCustom')\n if (Array.isArray(value)) return value.join(', ')\n if (key === 'fields' && typeof value === 'object' && value !== null) {\n return Object.entries(value as Record<string, string>).map(([k, v]) => `${k}: ${String(v)}`).join(', ')\n }\n if (typeof value === 'object' && value !== null) return JSON.stringify(value)\n return String(value)\n }\n\n /** Field-set summary line for one entry (non-secret). */\n function kindIcon(kind?: string): string {\n switch (kind ?? 'login') {\n case 'ssh': return '🖥️'\n case 'api-key': return '🔑'\n case 'oauth': return '🔐'\n case 'secret': return '🤫'\n case 'cookie': return '🍪'\n case 'card': return '💳'\n case 'custom': return '🧩'\n default: return '👤'\n }\n }\n\n function passwordAge(entry: VaultSummaryWire): string {\n const up = entry.updatedAt\n if (up === undefined || up <= 0) return ''\n const days = Math.max(0, Math.floor((Date.now() - up) / 86_400_000))\n if (days === 0) return t('ageToday')\n return `${days}d`\n }\n\n function identityLine(entry: VaultSummaryWire): string {\n const parts = [\n entry.kind !== undefined ? t(KIND_KEYS[entry.kind] ?? 'kindCustom') : t('kindLogin'),\n entry.username,\n entry.email,\n entry.phone,\n entry.host !== undefined ? `${entry.host}${entry.port !== undefined ? `:${entry.port}` : ''}` : undefined,\n entry.url,\n ].filter((value): value is string => value !== undefined && value.length > 0)\n return parts.join(' · ')\n }\n\n return (\n <section className={css.section} aria-labelledby=\"vault-heading\">\n <h2 id=\"vault-heading\">{t('heading')}</h2>\n <p className={css.intro}>{t('intro')}</p>\n\n {locked && (\n <div className={css.lockedBanner} role=\"alert\">\n <p>{t('lockedBanner')}</p>\n <button type=\"button\" className={css.backupButton} onClick={() => void unlockNow()} disabled={busy}>{t('unlock')}</button>\n </div>\n )}\n\n <nav className={css.tabs} aria-label={t('sectionTabs')}>\n {(['entries', 'security', 'transfer', 'backup', 'permissions', 'sessions', 'trash'] as const).map(tab => (\n <button\n key={tab}\n type=\"button\"\n className={`${css.tab}${activeTab === tab ? ` ${css.tabActive}` : ''}`}\n onClick={() => setActiveTab(tab)}\n >{t(TAB_KEYS[tab]!)}</button>\n ))}\n </nav>\n\n {activeTab === 'entries' && (<div className={css.tabPane}>\n <div className={css.toolbar}>\n {locked && (\n <span className={css.lockedTag}>{t('lockedShort')}</span>\n )}\n {vaults.length > 0 && (\n <select\n className={css.kindFilter}\n value={vaults.find(v => v.active)?.name ?? ''}\n onChange={event => void switchVaultTo(event.target.value)}\n aria-label={t('vaultSelect')}\n disabled={locked}\n >\n {vaults.map(v => (\n <option key={v.name} value={v.name}>{v.name}{v.active ? ' *' : ''}{v.entries !== undefined ? ` (${v.entries})` : ''}</option>\n ))}\n </select>\n )}\n <button type=\"button\" className={css.dupMerge} onClick={() => void runVaultRename()} disabled={busy || locked} title={t('vaultRename')}>{t('vaultRename')}</button>\n {vaults.filter(v => v.name !== 'default').map(v => (\n <button key={v.name} type=\"button\" className={css.dangerButton} onClick={() => void runVaultDelete(v.name)} disabled={busy || locked} title={t('vaultDelete')}>{t('vaultDelete')} {v.name}</button>\n ))}\n <label className={css.searchBox}>\n <span className={css.srOnly}>{t('searchPlaceholder')}</span>\n <input\n id={searchId}\n type=\"search\"\n placeholder={t('searchPlaceholder')}\n value={query}\n onChange={event => setQuery(event.target.value)}\n disabled={locked}\n />\n {query.length > 0 && (\n <button type=\"button\" className={css.clearButton} onClick={() => setQuery('')} aria-label={t('clearSearch')}>×</button>\n )}\n </label>\n <select className={css.kindFilter} value={kindFilter} onChange={e => setKindFilter(e.target.value)} aria-label={t('fieldKind')}>\n <option value=\"\">{t('allKinds')}</option>\n {Object.entries(KIND_KEYS).map(([value, key]) => (\n <option key={value} value={value}>{t(key)}</option>\n ))}\n </select>\n <select className={css.kindFilter} value={tagFilter} onChange={e => setTagFilter(e.target.value)} aria-label={t('fieldTags')}>\n <option value=\"\">{t('allTags')}</option>\n {[...new Set(state.status === 'ready' ? state.entries.flatMap(e => e.tags ?? []) : [])].sort().map(tag => (\n <option key={tag} value={tag}>{tag}</option>\n ))}\n </select>\n <select\n className={css.sortButton}\n value={sortBy}\n onChange={event => setSortBy(event.target.value as 'alpha' | 'recent' | 'created' | 'favorite' | 'smart')}\n aria-label={t('sortBy')}\n >\n <option value=\"alpha\">{t('sortAlpha')}</option>\n <option value=\"recent\">{t('sortRecent')}</option>\n <option value=\"created\">{t('sortCreated')}</option>\n <option value=\"favorite\">{t('sortFavorite')}</option>\n <option value=\"smart\">{t('sortSmart')}</option>\n </select>\n {report !== null && (report.weak.length > 0 || report.reused.length > 0 || report.no2fa.length > 0 || report.httpSites.length > 0 || report.rotation.length > 0) && (\n <span className={css.healthSummary} title={t('healthSummaryHint')}>\n {report.weak.length > 0 && <span className={`${css.badge} ${css.badgeDanger}`}>{t('reportWeak')}: {report.weak.length}</span>}\n {report.reused.length > 0 && <span className={`${css.badge} ${css.badgeDanger}`}>{t('reportReused')}: {report.reused.length}</span>}\n {report.no2fa.length > 0 && <span className={`${css.badge} ${css.badgeWarn}`}>{t('no2fa')}: {report.no2fa.length}</span>}\n {report.httpSites.length > 0 && <span className={`${css.badge} ${css.badgeWarn}`}>{t('httpSites')}: {report.httpSites.length}</span>}\n {report.rotation.length > 0 && <span className={`${css.badge} ${css.badgeWarn}`}>{t('reportRotation')}: {report.rotation.length}</span>}\n </span>\n )}\n {report !== null && report.weak.length === 0 && report.reused.length === 0 && report.no2fa.length === 0 && report.httpSites.length === 0 && report.rotation.length === 0 && (\n <span className={`${css.badge} ${css.badgeOk}`} title={t('healthSummaryHint')}>{t('healthOk')} ✓</span>\n )}\n <button type=\"button\" className={css.addButton} onClick={startCreate} disabled={busy || readonly || locked}>\n + {t('add')}\n </button>\n {!readonly && !locked && (\n <button type=\"button\" className={selectMode ? `${css.dupMerge} ${css.selectActive}` : css.dupMerge} onClick={toggleSelectMode} disabled={busy}>\n {selectMode ? t('bulkDone') : t('bulkSelect')}\n </button>\n )}\n </div>\n {selectMode && (\n <div className={css.bulkBar}>\n <label className={css.bulkItem}>\n <input\n type=\"checkbox\"\n checked={state.status === 'ready' && state.entries.length > 0 && [...state.entries].every(e => selectedIds.has(e.id))}\n onChange={event => {\n if (state.status !== 'ready') return\n const ids = new Set(selectedIds)\n for (const e of state.entries) {\n if (event.target.checked) ids.add(e.id)\n else ids.delete(e.id)\n }\n setSelectedIds(ids)\n }}\n />\n <span>{t('bulkSelectAll')}</span>\n </label>\n <span className={css.bulkCount}>{t('bulkSelected')}: {selectedIds.size}</span>\n <button type=\"button\" className={css.dangerButton} onClick={() => void removeSelected()} disabled={busy || selectedIds.size === 0}>{t('bulkDelete')}</button>\n </div>\n )}\n </div>)}\n\n {message !== null && <p role=\"alert\" className={css.error}>{message}</p>}\n\n {state.status === 'loading' && <p className={css.status}>{t('loading')}</p>}\n {state.status === 'error' && (\n <p role=\"alert\" className={css.error}>\n {state.reason ?? t('error')}{' '}\n <button type=\"button\" className={css.retryButton} onClick={() => void refresh()}>{t('retry')}</button>\n </p>\n )}\n {activeTab === 'entries' && (<div className={css.tabPane}>\n {state.status === 'ready' && state.entries.length > 0 && (\n <div className={css.healthBar}>\n <span className={css.badge}>{t('entryCount')}: {state.entries.length}</span>\n {(() => {\n const byKind = new Map<string, number>()\n for (const e of state.entries) {\n const k = e.kind ?? 'login'\n byKind.set(k, (byKind.get(k) ?? 0) + 1)\n }\n return [...byKind.entries()].map(([k, n]) => (\n <span key={k} className={css.badge}>{t(KIND_KEYS[k] ?? 'kindCustom')}: {n}</span>\n ))\n })()}\n {vaultStats !== null && typeof vaultStats.withTotp === 'number' && vaultStats.withTotp > 0 && (\n <span className={css.badge}>TOTP: {String(vaultStats.withTotp)}</span>\n )}\n </div>\n )}\n {state.status === 'ready' && state.entries.length === 0 && (\n <div className={css.emptyBox}>\n {query.trim().length > 0 || kindFilter !== '' || tagFilter !== '' ? (\n <>\n <p className={css.empty}>{t('noFiltered')}</p>\n <p className={css.emptyHint}>{t('noFilteredHint')}</p>\n <button type=\"button\" className={css.addButton} onClick={() => { setQuery(''); setKindFilter(''); setTagFilter('') }}>{t('clearFilters')}</button>\n </>\n ) : (\n <>\n <p className={css.empty}>{t('empty')}</p>\n <p className={css.emptyHint}>{readonly ? t('emptyHintReadonly') : t('emptyHint')}</p>\n {!readonly && !locked && (\n <button type=\"button\" className={css.addButton} onClick={startCreate}>{t('quickAdd')}</button>\n )}\n </>\n )}\n </div>\n )}\n </div>)}\n\n {activeTab === 'security' && (<div className={css.tabPane}>\n {recentEntries.length > 0 && (\n <div className={css.reportBox}>\n <p className={css.reportTitle}>{t('recentlyAdded')}</p>\n {recentEntries.map((e, i) => (\n <p key={i} className={css.reportLine}>{String(e.title ?? '')}{relTime((e as Record<string, unknown>).updatedAt) !== '' && ` · ${relTime((e as Record<string, unknown>).updatedAt)}`}</p>\n ))}\n </div>\n )}\n\n {recentEvents.length > 0 && (\n <div className={css.reportBox}>\n <p className={css.reportTitle}>{t('recentActivity')}</p>\n {recentEvents.slice(0, 12).map((ev, i) => {\n const action = String(ev.action ?? '')\n const icon = action === 'add' ? '➕' : action === 'delete' ? '🗑️' : action === 'restore' ? '♻️' : action === 'purge' ? '🔥' : action === 'update' ? '✏️' : '•'\n const cls = action === 'delete' || action === 'purge' ? css.histDanger : action === 'add' ? css.histAdd : action === 'update' ? css.histUpdate : css.histNeutral\n return (\n <p key={i} className={`${css.reportLine} ${cls}`}>\n {icon} {action} · {String(ev.title ?? ev.id ?? '')}{relTime((ev as Record<string, unknown>).at) !== '' && ` · ${relTime((ev as Record<string, unknown>).at)}`}\n </p>\n )\n })}\n </div>\n )}\n\n {report !== null && (report.rotation.length > 0 || report.weak.length > 0 || report.reused.length > 0) && (\n <div className={css.reportBox}>\n <p className={css.reportTitle}>{t('reportTitle')}</p>\n {report.rotation.length > 0 && (\n <>\n <p className={css.reportLine}>{t('reportRotation')}: {report.rotation.length}</p>\n {(report.rotation as Array<{ title?: string; due?: string; daysLeft?: number }>).slice(0, 8).map((item, i) => (\n <p key={i} className={css.reportSub}>\n · {String(item.title ?? '?')}{item.due === 'expired' ? ` (${t('dueExpired')})` : item.due === 'soon' ? ` (${t('dueExpiring')} ${item.daysLeft ?? 0}d)` : ` (${t('dueNow')})`}\n </p>\n ))}\n </>\n )}\n {report.weak.length > 0 && (\n <>\n <p className={css.reportLine}>{t('reportWeak')}: {report.weak.length}</p>\n {(report.weak as Array<{ title?: string }>).slice(0, 5).map((item, i) => (\n <p key={i} className={css.reportSub}>· {String(item.title ?? '?')}</p>\n ))}\n </>\n )}\n {report.reused.length > 0 && (\n <>\n <p className={css.reportLine}>{t('reportReused')}: {report.reused.length}</p>\n {(report.reused as Array<{ entries?: Array<{ title?: string }> }>).slice(0, 3).map((group, i) => (\n <p key={i} className={css.reportSub}>\n · {(group.entries ?? []).slice(0, 3).map(e => String(e.title ?? '?')).join(' / ')}\n </p>\n ))}\n </>\n )}\n {report.no2fa.length > 0 && (\n <>\n <p className={css.reportLine}>{t('no2fa')}: {report.no2fa.length}</p>\n {(report.no2fa as Array<{ title?: string }>).slice(0, 5).map((item, i) => (\n <p key={i} className={css.reportSub}>· {String(item.title ?? '?')}</p>\n ))}\n </>\n )}\n {report.httpSites.length > 0 && (\n <>\n <p className={css.reportLine}>{t('httpSites')}: {report.httpSites.length}</p>\n {(report.httpSites as Array<{ title?: string }>).slice(0, 5).map((item, i) => (\n <p key={i} className={css.reportSub}>· {String(item.title ?? '?')}</p>\n ))}\n </>\n )}\n </div>\n )}\n\n {audit.length > 0 && (\n <div className={css.reportBox}>\n <p className={css.reportTitle}>{t('auditTitle')} ({audit.length})</p>\n {audit.slice(0, 6).map(item => (\n <div key={item.id} className={css.auditRow}>\n <span className={css.dupNames}>{item.title}</span>\n <span className={css.auditIssues}>{item.issues.join('; ')}</span>\n <button\n type=\"button\"\n className={css.dupMerge}\n onClick={() => void startEdit(item.id)}\n disabled={busy}\n >{t('auditEdit')}</button>\n </div>\n ))}\n </div>\n )}\n\n </div>)}\n\n {activeTab === 'transfer' && (<div className={css.tabPane}>\n <div className={css.reportBox}>\n <p className={css.reportTitle}>{t('systemSearch')}</p>\n <div className={css.dupGroup}>\n <input\n className={css.searchBox}\n type=\"search\"\n placeholder={t('sysSearchPlaceholder')}\n value={sysQuery}\n onChange={event => setSysQuery(event.target.value)}\n onKeyDown={event => { if (event.key === 'Enter') void searchSystemStores() }}\n />\n <button type=\"button\" className={css.dupMerge} onClick={() => void searchSystemStores()} disabled={busy}>{t('sysSearchGo')}</button>\n </div>\n {sysMatches.length > 0 && (\n <div>\n {sysMatches.map((m, i) => (\n <p key={i} className={css.reportSub}>[{m.source}] {m.name} · {m.username}</p>\n ))}\n </div>\n )}\n </div>\n\n <div className={css.reportBox}>\n <p className={css.reportTitle}>{t('systemImport')}</p>\n <div className={css.dupGroup}>\n <span className={css.dupNames}>{t('importChromeDesc')}</span>\n <button type=\"button\" className={css.dupMerge} onClick={() => void runSystemImport('chrome', false)} disabled={busy || readonly || locked}>{t('importChrome')}</button>\n </div>\n <div className={css.dupGroup}>\n <span className={css.dupNames}>{t('importFirefoxDesc')}</span>\n <button type=\"button\" className={css.dupMerge} onClick={() => void runFirefoxImport()} disabled={busy || readonly || locked}>{t('importFirefox')}</button>\n </div>\n <div className={css.dupGroup}>\n <span className={css.dupNames}>{t('importKeychainDesc')}</span>\n <button type=\"button\" className={css.dupMerge} onClick={() => void runSystemImport('keychain', true)} disabled={busy || readonly || locked}>{t('keychainPreview')}</button>\n <button type=\"button\" className={css.dupMerge} onClick={() => void runSystemImport('keychain', false)} disabled={busy || readonly || locked}>{t('importKeychain')}</button>\n </div>\n <div className={css.dupGroup}>\n <span className={css.dupNames}>{t('import1passwordDesc')}</span>\n <button type=\"button\" className={css.dupMerge} onClick={() => void runImport1password()} disabled={busy || readonly || locked}>{t('import1password')}</button>\n <button type=\"button\" className={css.dupMerge} onClick={() => void runFilePreview('import1passwordPrompt', import1password)} disabled={busy || readonly || locked}>{t('preview')}</button>\n </div>\n <div className={css.dupGroup}>\n <span className={css.dupNames}>{t('importManagerCsvDesc')}</span>\n <button type=\"button\" className={css.dupMerge} onClick={() => void runImportManagerCsv()} disabled={busy || readonly || locked}>{t('importManagerCsv')}</button>\n <button type=\"button\" className={css.dupMerge} onClick={() => void runFilePreview('importManagerCsvPrompt', importManagerCsv)} disabled={busy || readonly || locked}>{t('preview')}</button>\n </div>\n <div className={css.dupGroup}>\n <span className={css.dupNames}>{t('importEnpassDesc')}</span>\n <button type=\"button\" className={css.dupMerge} onClick={() => void runImportEnpass()} disabled={busy || readonly || locked}>{t('importEnpass')}</button>\n <button type=\"button\" className={css.dupMerge} onClick={() => void runFilePreview('importEnpassPrompt', importEnpass)} disabled={busy || readonly || locked}>{t('preview')}</button>\n </div>\n <div className={css.dupGroup}>\n <span className={css.dupNames}>{t('importBitwardenDesc')}</span>\n <button type=\"button\" className={css.dupMerge} onClick={() => void runImportBitwarden()} disabled={busy || readonly || locked}>{t('importBitwarden')}</button>\n <button type=\"button\" className={css.dupMerge} onClick={() => void runFilePreview('importBitwardenPrompt', importBitwarden)} disabled={busy || readonly || locked}>{t('preview')}</button>\n </div>\n <div className={css.dupGroup}>\n <span className={css.dupNames}>{t('importBitwardenEncryptedDesc')}</span>\n <button type=\"button\" className={css.dupMerge} onClick={() => void runImportBitwardenEncrypted()} disabled={busy || readonly || locked}>{t('importBitwardenEncrypted')}</button>\n </div>\n <div className={css.dupGroup}>\n <span className={css.dupNames}>{t('import1pifDesc')}</span>\n <button type=\"button\" className={css.dupMerge} onClick={() => void runImport1pif()} disabled={busy || readonly || locked}>{t('import1pif')}</button>\n <button type=\"button\" className={css.dupMerge} onClick={() => void runFilePreview('import1pifPrompt', import1pif)} disabled={busy || readonly || locked}>{t('preview')}</button>\n </div>\n <div className={css.dupGroup}>\n <span className={css.dupNames}>{t('importKeePassXmlDesc')}</span>\n <button type=\"button\" className={css.dupMerge} onClick={() => void runImportKeePassXml()} disabled={busy || readonly || locked}>{t('importKeePassXml')}</button>\n <button type=\"button\" className={css.dupMerge} onClick={() => void runFilePreview('importKeePassXmlPrompt', importKeePassXml)} disabled={busy || readonly || locked}>{t('preview')}</button>\n </div>\n <div className={css.dupGroup}>\n <span className={css.dupNames}>{t('importKdbxDesc')}</span>\n <button type=\"button\" className={css.dupMerge} onClick={() => void runImportKdbx()} disabled={busy || readonly || locked}>{t('importKdbx')}</button>\n </div>\n </div>\n\n <div className={css.reportBox}>\n <p className={css.reportTitle}>{t('exportTitle')}</p>\n <p className={css.reportSub}>{t('exportHint')}</p>\n <div className={css.dupGroup}>\n <span className={css.dupNames}>{t('export1puxDesc')}</span>\n <button type=\"button\" className={css.dupMerge} onClick={() => void runExport1pux()} disabled={busy || readonly || locked}>{t('export1pux')}</button>\n </div>\n <div className={css.dupGroup}>\n <span className={css.dupNames}>{t('exportBitwardenDesc')}</span>\n <button type=\"button\" className={css.dupMerge} onClick={() => void runExportBitwarden()} disabled={busy || readonly || locked}>{t('exportBitwarden')}</button>\n </div>\n </div>\n </div>)}\n\n {activeTab === 'backup' && (<div className={css.tabPane}>\n <div className={css.reportBox}>\n <p className={css.reportTitle}>{t('backupTitle')}</p>\n <p className={css.reportSub}>{t('backupHint')}</p>\n {backupInfo !== null && (\n <p className={css.reportSub}>{t('healthBackup')}: {backupInfo.daysSinceBackup}d ({backupInfo.backups})</p>\n )}\n <button type=\"button\" className={css.backupButton} onClick={() => void backupNow()} disabled={busy}>\n {t('backupNow')}\n </button>\n </div>\n\n {backupList.length > 0 && (\n <div className={css.reportBox}>\n <p className={css.reportTitle}>{t('recentBackups')} ({backupList.length})</p>\n {backupList.map(b => (\n <div key={b.path} className={css.dupGroup}>\n <span className={css.dupNames}>\n {b.vaultName !== '' ? `${b.vaultName} · ` : ''}{new Date(b.at).toLocaleString()}\n {b.size !== undefined && b.size > 0 ? ` · ${formatSize(b.size)}` : ''}\n </span>\n <button\n type=\"button\"\n className={css.dupMerge}\n onClick={() => void restoreBackupFrom(b)}\n disabled={busy || readonly || locked}\n title={t('backupRestoreHint')}\n >{t('backupRestore')}</button>\n <button\n type=\"button\"\n className={css.dangerButton}\n onClick={() => void deleteBackupFile(b)}\n disabled={busy || readonly || locked}\n title={t('backupDelete')}\n >{t('backupDelete')}</button>\n </div>\n ))}\n </div>\n )}\n {backupList.length === 0 && (\n <p className={css.empty}>{t('noBackups')}</p>\n )}\n </div>)}\n\n {activeTab === 'sessions' && (<div className={css.tabPane}>\n <div className={css.reportBox}>\n <p className={css.reportTitle}>{t('tabSessions')}</p>\n <p className={css.reportSub}>{t('sessionsIntro')}</p>\n <label className={css.field}>\n <span>{t('sessionUrlPrompt')}</span>\n <input\n type=\"text\"\n value={sessionUrl}\n onChange={event => setSessionUrl(event.target.value)}\n placeholder={t('sessionUrlPlaceholder')}\n disabled={busy || readonly || locked}\n />\n </label>\n <button type=\"button\" className={css.backupButton} onClick={() => void runSessionOpen()} disabled={busy || readonly || locked}>\n {t('sessionOpen')}\n </button>\n <p className={css.reportSub}>{t('sessionOpenHint')}</p>\n </div>\n\n <div className={css.reportBox}>\n <p className={css.reportTitle}>{t('sessionOpenList')} ({openSessions.length})</p>\n {openSessions.length === 0 && (<p className={css.empty}>{t('sessionNoOpen')}</p>)}\n {openSessions.map(s => (\n <div key={s.sessionId} className={css.dupGroup}>\n <span className={css.dupNames}>{s.url} — {t('sessionNamePlaceholder')}</span>\n <label className={css.field}>\n <input\n type=\"text\"\n value={sessionTitle}\n onChange={event => setSessionTitle(event.target.value)}\n placeholder={t('sessionNamePlaceholder')}\n disabled={busy || readonly || locked}\n />\n </label>\n <button\n type=\"button\"\n className={css.dupMerge}\n onClick={() => void runSessionCollect(s.sessionId, s.url)}\n disabled={busy || readonly || locked}\n title={t('sessionCollect')}\n >{t('sessionCollect')}</button>\n <button\n type=\"button\"\n className={css.dangerButton}\n onClick={() => void runSessionClose(s.sessionId)}\n disabled={busy}\n title={t('sessionClose')}\n >{t('sessionClose')}</button>\n </div>\n ))}\n </div>\n\n <div className={css.reportBox}>\n <p className={css.reportTitle}>{t('sessionSavedList')} ({savedSessions.length})</p>\n {savedSessions.length === 0 && (<p className={css.empty}>{t('sessionEmpty')}</p>)}\n {savedSessions.map(s => (\n <div key={s.id} className={css.dupGroup}>\n <span className={css.dupNames}>{s.title} — {s.cookieCount} {t('sessionCookie')}{(s.expiredCount ?? 0) > 0 ? ` · ${s.expiredCount} ${t('sessionExpired')}` : ''}{(s.expiringSoon ?? 0) > 0 ? ` · ${s.expiringSoon} ${t('sessionExpiringSoon')}` : ''}{s.url !== undefined ? ` · ${s.url}` : ''}</span>\n <button\n type=\"button\"\n className={css.dupMerge}\n onClick={() => void runSessionExport(s.id, 'header')}\n disabled={busy}\n title={t('sessionExport')}\n >{copiedId === s.id ? t('sessionCopied') : t('sessionExport')}</button>\n <button\n type=\"button\"\n className={css.dupMerge}\n onClick={() => void runSessionExport(s.id, 'netscape')}\n disabled={busy}\n title={t('sessionExportJar')}\n >{t('sessionExportJar')}</button>\n <button\n type=\"button\"\n className={css.dupMerge}\n onClick={() => void runSessionExport(s.id, 'playwright')}\n disabled={busy}\n title={t('sessionExportPlaywright')}\n >{t('sessionExportPlaywright')}</button>\n <button\n type=\"button\"\n className={css.dupMerge}\n onClick={() => void runSessionDetail(s.id)}\n disabled={busy}\n title={t('sessionView')}\n >{t('sessionView')}</button>\n <button\n type=\"button\"\n className={css.dupMerge}\n onClick={() => void runSessionPrune(s.id)}\n disabled={busy || readonly || locked || (s.expiredCount ?? 0) === 0}\n title={t('sessionPrune')}\n >{t('sessionPrune')}</button>\n <button\n type=\"button\"\n className={css.dangerButton}\n onClick={() => void remove(s.id)}\n disabled={busy || readonly || locked}\n title={t('sessionDelete')}\n >{t('sessionDelete')}</button>\n </div>\n ))}\n </div>\n\n {sessionDetail !== null && (\n <div className={css.reportBox}>\n <p className={css.reportTitle}>{t('sessionDetailTitle')} — {sessionDetail.title}</p>\n <p className={css.reportSub}>{sessionDetail.notes ?? ''}</p>\n {sessionDetail.cookies.map((c, index) => {\n const cookie = c as { name?: string; value?: string; domain?: string; path?: string; expires?: number; httpOnly?: boolean; secure?: boolean; sameSite?: string }\n const expiry = typeof cookie.expires === 'number' && cookie.expires >= 0\n ? new Date(cookie.expires * 1000).toLocaleString() : t('sessionSessionCookie')\n const nowSec = Math.floor(Date.now() / 1000)\n const isExpired = typeof cookie.expires === 'number' && cookie.expires > 0 && cookie.expires <= nowSec\n const expiring = typeof cookie.expires === 'number' && cookie.expires > nowSec && cookie.expires <= nowSec + 7 * 86_400\n return (\n <div key={`${index}-${cookie.name}`} className={css.auditRow}>\n <span className={css.dupNames}>{cookie.name} = {cookie.value}</span>\n <span className={css.reportSub}>{t('sessionDomain')}: {cookie.domain}{cookie.httpOnly === true ? ' · HttpOnly' : ''}{cookie.secure === true ? ' · Secure' : ''} · {t('sessionExpires')}: {expiry}{isExpired ? ` · ${t('sessionExpired')}` : ''}{expiring ? ` · ${t('sessionExpiringSoon')}` : ''}</span>\n </div>\n )\n })}\n </div>\n )}\n\n <div className={css.reportBox}>\n <p className={css.reportTitle}>{t('sessionImportPaste')}</p>\n <label className={css.field}>\n <span>{t('sessionImportPasteTitle')}</span>\n <input\n type=\"text\"\n value={sessionPasteTitle}\n onChange={event => setSessionPasteTitle(event.target.value)}\n placeholder={t('sessionNamePlaceholder')}\n disabled={busy || readonly || locked}\n />\n </label>\n <label className={css.field}>\n <span>{t('sessionImportPastePrompt')}</span>\n <textarea\n value={sessionPaste}\n onChange={event => setSessionPaste(event.target.value)}\n rows={4}\n disabled={busy || readonly || locked}\n />\n </label>\n <button type=\"button\" className={css.backupButton} onClick={() => void runSessionImport()} disabled={busy || readonly || locked}>\n {t('sessionImport')}\n </button>\n </div>\n </div>)}\n\n {activeTab === 'permissions' && (<div className={css.tabPane}>\n {policy !== null && (\n <div className={css.reportBox}>\n <p className={css.reportTitle}>{t('permTitle')}</p>\n <div className={css.policyBar}>\n <label className={css.policyField}>\n <span>{t('modeLabel')}</span>\n <select\n value={policy.accessMode}\n disabled={busy}\n onChange={event => {\n const next = event.target.value as 'readonly' | 'ask' | 'auto'\n setBusy(true)\n setMessage(null)\n void setAccessMode(next).then(\n value => { setPolicy(value); setBusy(false) },\n (err) => { setMessage(errText(err)); setBusy(false) },\n )\n }}\n >\n <option value=\"readonly\">{t('modeReadonly')}</option>\n <option value=\"ask\">{t('modeAsk')}</option>\n <option value=\"auto\">{t('modeAuto')}</option>\n </select>\n </label>\n <label className={css.policyField}>\n <span>{t('autoCaptureLabel')}</span>\n <input\n type=\"checkbox\"\n checked={policy.autoCapture}\n disabled={busy}\n onChange={event => {\n const next = event.target.checked\n setBusy(true)\n setMessage(null)\n void setAutoCapture(next).then(\n value => { setPolicy(value); setBusy(false) },\n (err) => { setMessage(errText(err)); setBusy(false) },\n )\n }}\n />\n </label>\n <label className={css.policyField}>\n <span>{t('autoLockLabel')}</span>\n <select\n value={policy.autoLockSeconds}\n disabled={busy}\n onChange={event => {\n const next = Number(event.target.value)\n setBusy(true)\n setMessage(null)\n void setAutoLock(next).then(\n value => { setPolicy(previous => previous ? { ...previous, autoLockSeconds: value.seconds } : previous); setBusy(false) },\n (err) => { setMessage(errText(err)); setBusy(false) },\n )\n }}\n >\n <option value={0}>{t('autoLockNever')}</option>\n <option value={60}>{t('autoLock1m')}</option>\n <option value={300}>{t('autoLock5m')}</option>\n <option value={900}>{t('autoLock15m')}</option>\n <option value={1800}>{t('autoLock30m')}</option>\n <option value={3600}>{t('autoLock1h')}</option>\n </select>\n </label>\n <p className={policy.accessMode === 'readonly' ? css.modeReadonly : policy.accessMode === 'ask' ? css.modeAsk : css.modeAuto}>\n {policy.accessMode === 'readonly'\n ? t('modeReadonlyHint')\n : policy.accessMode === 'ask'\n ? t('modeAskHint')\n : t('modeAutoHint')}\n {policy.autoCapture ? ` · ${t('autoCaptureOn')}` : ` · ${t('autoCaptureOff')}`}\n {policy.autoLockSeconds > 0 ? ` · ${t('autoLockHint')}: ${formatAutoLock(policy.autoLockSeconds)}` : ` · ${t('autoLockNeverHint')}`}\n </p>\n </div>\n </div>\n )}\n\n {tagList.length > 0 && (\n <div className={css.reportBox}>\n <p className={css.reportTitle}>{t('tagManage')} ({tagList.length})</p>\n {tagList.slice(0, 8).map(tag => (\n <div key={tag.name} className={css.dupGroup}>\n <span className={css.dupNames}>{tag.name} ({tag.count})</span>\n <button\n type=\"button\"\n className={css.dupMerge}\n onClick={() => void renameTagAll(tag.name)}\n disabled={busy || readonly || locked}\n >{t('tagRename')}</button>\n </div>\n ))}\n </div>\n )}\n\n {dupList.length > 0 && (\n <div className={css.reportBox}>\n <p className={css.reportTitle}>{t('dupTitle')} ({dupList.length})</p>\n {dupList.slice(0, 5).map((group, gi) => (\n <div key={gi} className={css.dupGroup}>\n <span className={css.dupNames}>{group.map(g => g.title).join(' / ')}</span>\n <button\n type=\"button\"\n className={css.dupMerge}\n onClick={() => void mergeEntries(group)}\n disabled={busy || readonly || locked}\n >{t('dupMerge')}</button>\n </div>\n ))}\n </div>\n )}\n </div>)}\n\n {activeTab === 'trash' && (<div className={css.tabPane}>\n {trashEntries.length === 0 && <p className={css.empty}>{t('trashEmpty')}</p>}\n {trashEntries.length > 0 && (\n <ul className={css.list}>\n {trashEntries.map(entry => (\n <li key={entry.id} className={css.row}>\n <div className={css.rowMain}>\n <span className={css.title}>{entry.title}</span>\n <span className={css.identity}>{t('trashed')}</span>\n </div>\n <div className={css.rowActions}>\n <button\n type=\"button\"\n onClick={() => { void restore(entry.id).then(() => { void trash().then(setTrashEntries); void refresh(); refreshHealth() }) }}\n disabled={busy || readonly || locked}\n >{t('restore')}</button>\n <button\n type=\"button\"\n className={css.dangerButton}\n onClick={() => {\n if (!window.confirm(t('purgeOneConfirm').replace('{name}', entry.title))) return\n void purge(entry.id).then(() => { void trash().then(setTrashEntries); void refresh() })\n }}\n disabled={busy || readonly || locked}\n >{t('purge')}</button>\n </div>\n </li>\n ))}\n </ul>\n )}\n {trashEntries.length > 0 && (\n <>\n <button\n type=\"button\"\n className={css.trashButton}\n onClick={() => {\n setBusy(true)\n void undeleteAll().then(() => {\n void trash().then(setTrashEntries)\n void refresh()\n refreshHealth()\n setBusy(false)\n }, () => setBusy(false))\n }}\n disabled={busy || readonly || locked}\n >{t('restoreAll')}</button>\n <button\n type=\"button\"\n className={css.dangerButton}\n onClick={() => {\n if (!window.confirm(t('clearTrashConfirm'))) return\n setBusy(true)\n void Promise.all(trashEntries.map(e => purge(e.id))).then(() => {\n void trash().then(setTrashEntries)\n void refresh()\n setBusy(false)\n }, () => setBusy(false))\n }}\n disabled={busy || readonly || locked}\n >{t('clearTrash')}</button>\n </>\n )}\n </div>)}\n\n {activeTab === 'entries' && (<div className={css.tabPane}>\n {state.status === 'ready' && filteredCount(state.entries, kindFilter, tagFilter) > visibleCount && (\n <button\n type=\"button\"\n className={css.trashButton}\n onClick={() => setVisibleCount(count => count + 50)}\n >{t('loadMore')} ({filteredCount(state.entries, kindFilter, tagFilter) - visibleCount})</button>\n )}\n\n {state.status === 'ready' && state.entries.length > 0 && (\n <>\n <p className={css.resultCount}>\n {t('resultCount')}: {filteredCount(state.entries, kindFilter, tagFilter)}\n {(() => {\n const byKind = new Map<string, number>()\n for (const e of state.entries) {\n if ((kindFilter === '' || e.kind === kindFilter) && (tagFilter === '' || (e.tags ?? []).includes(tagFilter))) {\n const k = e.kind ?? 'login'\n byKind.set(k, (byKind.get(k) ?? 0) + 1)\n }\n }\n return [...byKind.entries()].map(([k, n]) => (\n <span key={k} className={css.kindChip}>{t(KIND_KEYS[k] ?? 'kindCustom')} {n}</span>\n ))\n })()}\n </p>\n <ul className={css.list}>\n {filteredCount(state.entries, kindFilter, tagFilter) === 0 && (\n <li className={css.empty}>{t('noFiltered')}</li>\n )}\n {state.entries.filter(entry => (kindFilter === '' || entry.kind === kindFilter) && (tagFilter === '' || (entry.tags ?? []).includes(tagFilter))).sort((a, b) => sortBy === 'alpha' ? a.title.localeCompare(b.title) : sortBy === 'recent' ? (b.updatedAt ?? 0) - (a.updatedAt ?? 0) : sortBy === 'created' ? (b.createdAt ?? 0) - (a.createdAt ?? 0) : ((a as VaultSummaryWire & { favorite?: boolean }).favorite === true ? 0 : 1) - ((b as VaultSummaryWire & { favorite?: boolean }).favorite === true ? 0 : 1) || (b.updatedAt ?? 0) - (a.updatedAt ?? 0) || a.title.localeCompare(b.title)).slice(0, visibleCount).map(entry => {\n const totpInfo = totpMap[entry.id]\n const remaining = totpInfo !== undefined && totpInfo.until > 0 ? Math.max(0, Math.ceil((totpInfo.until - nowTick) / 1000)) : undefined\n const frac = remaining !== undefined ? remaining / 30 : 0\n const code = totpInfo?.code\n return (\n <li key={entry.id} className={`${css.row}${dueMap[entry.id] !== undefined ? ` ${dueMap[entry.id]!.due === 'expired' ? css.rowExpired : css.rowDue}` : ''}${selectedIds.has(entry.id) ? ` ${css.rowSelected}` : ''}`}>\n {selectMode && (\n <input\n type=\"checkbox\"\n className={css.rowCheck}\n checked={selectedIds.has(entry.id)}\n onChange={event => {\n setSelectedIds(prev => {\n const next = new Set(prev)\n if (event.target.checked) next.add(entry.id)\n else next.delete(entry.id)\n return next\n })\n }}\n aria-label={entry.title}\n />\n )}\n <div\n className={css.rowMain}\n role=\"button\"\n tabIndex={0}\n aria-expanded={expandedId === entry.id}\n onClick={() => setExpandedId(expandedId === entry.id ? null : entry.id)}\n onKeyDown={event => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault()\n setExpandedId(expandedId === entry.id ? null : entry.id)\n }\n }}\n >\n <span className={css.title} style={entry.color !== undefined && entry.color !== '' ? { borderLeft: `3px solid ${entry.color}`, paddingLeft: 6 } : undefined}>\n <span className={css.kindIcon}>{entry.icon ?? kindIcon(entry.kind)}</span>\n <button\n type=\"button\"\n className={`${css.pinStar} ${(entry as VaultSummaryWire & { favorite?: boolean }).favorite ? css.pinOn : css.pinOff}`}\n title={t('togglePinHint')}\n disabled={busy || locked}\n onClick={event => {\n event.stopPropagation()\n const next = !(entry as VaultSummaryWire & { favorite?: boolean }).favorite\n void setFavorite(entry.id, next).then(() => void refresh())\n }}\n onKeyDown={event => event.stopPropagation()}\n >★</button>\n {entry.title}\n {(entry as VaultSummaryWire & { sensitivity?: string }).sensitivity === 'high' && (\n <span className={css.highBadge}>{t('highSensitivity')}</span>\n )}\n {dueMap[entry.id] !== undefined && (\n <span className={`${css.dueBadge} ${dueMap[entry.id]!.due === 'expired' ? css.badgeDanger : css.badgeWarn}`}>\n {dueMap[entry.id]!.due === 'expired' ? t('dueExpired') : dueMap[entry.id]!.due === 'soon' ? `${t('dueExpiring')} ${dueMap[entry.id]!.daysLeft}d` : t('dueNow')}\n </span>\n )}\n {passwordAge(entry) !== '' && (\n <span className={css.dueBadge} title={t('ageHint')}>{passwordAge(entry)}</span>\n )}\n {watchMap[entry.id] !== undefined && watchMap[entry.id]!.verdict !== 'good' && (\n <span className={`${css.dueBadge} ${watchMap[entry.id]!.verdict === 'poor' ? css.badgeDanger : css.badgeWarn}`} title={t('watchFlagsTitle') + watchMap[entry.id]!.flags.join(', ')}>\n {t('watchScore').replace('{n}', String(watchMap[entry.id]!.score))}\n </span>\n )}\n </span>\n <span className={css.identity}>{identityLine(entry)}</span>\n {uriMap[entry.id] !== undefined && uriMap[entry.id] !== '' && (\n <span className={css.totp} title={t('totpUriHint')}>\n <code className={css.uriCode}>{uriMap[entry.id]}</code>\n </span>\n )}\n {code !== undefined && (\n <span className={css.totp}>\n <svg className={css.totpRing} width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <circle cx=\"8\" cy=\"8\" r=\"6.5\" fill=\"none\" stroke=\"var(--dsh-color-border, #ddd)\" strokeWidth=\"2\" />\n <circle\n cx=\"8\" cy=\"8\" r=\"6.5\" fill=\"none\"\n stroke={remaining !== undefined && remaining <= 5 ? '#cf3d3d' : '#2e9e5b'}\n strokeWidth=\"2\" strokeLinecap=\"round\"\n strokeDasharray={`${(frac * 2 * Math.PI * 6.5).toFixed(1)} ${(2 * Math.PI * 6.5).toFixed(1)}`}\n transform=\"rotate(-90 8 8)\"\n />\n </svg>\n {code}{remaining !== undefined ? ` (${remaining}s)` : ''}\n </span>\n )}\n </div>\n {expandedId === entry.id && (\n <div className={css.detailBox}>\n {Object.entries(entry).filter(([k]) => !['id', 'title', 'favorite'].includes(k) && entry[k as keyof VaultSummaryWire] !== undefined).map(([k, v]) => (\n <span key={k} className={css.detailItem}>\n <strong>{k}</strong>: {formatDetail(k, v)}\n <button\n type=\"button\"\n className={css.revealButton}\n title={t('copyFieldHint')}\n onClick={() => void copyValue(entry.id, Array.isArray(v) ? v.join(', ') : String(v))}\n disabled={locked}\n >⧉</button>\n </span>\n ))}\n {(attachmentsMap[entry.id] ?? []).length > 0 && (\n <div className={css.attachBox}>\n <strong>{t('attachmentsTitle')}:</strong>\n {(attachmentsMap[entry.id] ?? []).map(a => (\n <span key={a.name} className={css.detailItem}>\n 📎 {a.name} ({formatSize(a.size)})\n <button\n type=\"button\"\n className={css.revealButton}\n title={t('detachHint')}\n disabled={busy || readonly || locked}\n onClick={() => {\n setBusy(true)\n void detach(entry.id, a.name).then(() => {\n void attachments(entry.id).then(r => {\n if (r.found) setAttachmentsMap(prev => ({ ...prev, [entry.id]: r.attachments }))\n })\n setBusy(false)\n }, () => setBusy(false))\n }}\n >✕</button>\n </span>\n ))}\n </div>\n )}\n </div>\n )}\n <div className={css.rowActions}>\n {copiedId === entry.id && <span className={css.copied}>{t('copied')} · {t('clearsIn30s')}</span>}\n <button\n type=\"button\"\n onClick={() => void copyValue(entry.id, entry.username ?? entry.title)}\n disabled={busy || readonly || locked}\n title={entry.username !== undefined && entry.username !== '' ? t('copyUsernameHint') : t('copyTitleHint')}\n >{entry.username !== undefined && entry.username !== '' ? t('copyUsername') : t('copy')}</button>\n <button\n type=\"button\"\n onClick={() => {\n setBusy(true)\n void get(entry.id).then(r => {\n if (r.found && r.entry?.password) void copyValue(entry.id, r.entry.password)\n setBusy(false)\n }, () => setBusy(false))\n }}\n disabled={busy || readonly || locked}\n >{t('copyPassword')}</button>\n <button type=\"button\" onClick={() => void showTotp(entry.id)} disabled={busy || locked}>{t('totp')}</button>\n <button type=\"button\" onClick={() => void showTotpUri(entry.id)} disabled={busy || locked} title={t('totpUriHint')}>{t('totpUri')}</button>\n {code !== undefined && (\n <button type=\"button\" onClick={() => void copyValue(entry.id, code)} disabled={busy || locked}>{t('copyCode')}</button>\n )}\n {entry.url !== undefined && entry.url !== '' && (\n <button type=\"button\" onClick={() => window.open(entry.url!, '_blank', 'noopener')} title={t('openUrlHint')}>{t('openUrl')}</button>\n )}\n <button type=\"button\" onClick={() => void touch(entry.id).then(() => void refresh())} disabled={busy || readonly || locked} title={t('touchHint')}>{t('touch')}</button>\n <button type=\"button\" onClick={() => void startEdit(entry.id)} disabled={busy || readonly || locked}>{t('edit')}</button>\n <button\n type=\"button\"\n className={css.deleteButton}\n onClick={() => void removeEntry(entry.id)}\n disabled={busy || readonly || locked}\n >{t('delete')}</button>\n </div>\n </li>\n )\n })}\n </ul>\n </>\n )}\n </div>)}\n\n {activeTab === 'security' && (<div className={css.tabPane}>\n {state.status === 'ready' && (\n <div className={css.healthBar}>\n {vaultStats !== null && typeof vaultStats.total === 'number' && (\n <span className={css.badge}>{t('entryCount')}: {String(vaultStats.total)}</span>\n )}\n {vaultStats !== null && typeof vaultStats.withTotp === 'number' && (\n <span className={css.badge}>TOTP: {String(vaultStats.withTotp)}</span>\n )}\n {vaultStats !== null && typeof vaultStats.highSensitivity === 'number' && (\n <span className={css.badge}>{t('highSensitivity')}: {String(vaultStats.highSensitivity)}</span>\n )}\n {report !== null && report.strength !== null && (\n <span className={`${css.badge} ${report.strength.weak > 0 ? css.badgeDanger : css.badgeOk}`}>\n {t('healthStrength')}: {report.strength.weak}W/{report.strength.fair}F/{report.strength.strong}S\n </span>\n )}\n {report !== null && (\n <span className={`${css.badge} ${report.verdict === 'good' ? css.badgeOk : report.verdict === 'fair' ? css.badgeWarn : css.badgeDanger}`}>\n <svg className={css.scoreRing} width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <circle cx=\"8\" cy=\"8\" r=\"6.5\" fill=\"none\" stroke=\"var(--dsh-color-border, #ddd)\" strokeWidth=\"2\" />\n <circle\n cx=\"8\" cy=\"8\" r=\"6.5\" fill=\"none\"\n stroke={report.verdict === 'good' ? '#2e9e5b' : report.verdict === 'fair' ? '#c98a1b' : '#cf3d3d'}\n strokeWidth=\"2\" strokeLinecap=\"round\"\n strokeDasharray={`${(report.score / 100 * 2 * Math.PI * 6.5).toFixed(1)} ${(2 * Math.PI * 6.5).toFixed(1)}`}\n transform=\"rotate(-90 8 8)\"\n />\n </svg>\n {t('healthScore')}: {report.score} ({t(VERDICT_KEYS[report.verdict] ?? 'verdictGood')})\n </span>\n )}\n {report !== null && report.no2fa.length > 0 && (\n <span className={`${css.badge} ${css.badgeWarn}`}>{t('no2fa')}: {report.no2fa.length}</span>\n )}\n {report !== null && report.httpSites.length > 0 && (\n <span className={`${css.badge} ${css.badgeWarn}`}>{t('httpSites')}: {report.httpSites.length}</span>\n )}\n {report !== null && report.rotation.length > 0 && (\n <span className={`${css.badge} ${css.badgeWarn}`}>{t('reportRotation')}: {report.rotation.length}</span>\n )}\n {vaultStats !== null && typeof vaultStats.expired === 'number' && vaultStats.expired > 0 && (\n <span className={`${css.badge} ${css.badgeDanger}`}>{t('dueExpired')}: {String(vaultStats.expired)}</span>\n )}\n {report !== null && report.weak.length > 0 && (\n <span className={`${css.badge} ${css.badgeDanger}`}>{t('reportWeak')}: {report.weak.length}</span>\n )}\n {report !== null && report.reused.length > 0 && (\n <span className={`${css.badge} ${css.badgeDanger}`}>{t('reportReused')}: {report.reused.length}</span>\n )}\n {dupGroups > 0 && (\n <span className={`${css.badge} ${css.badgeWarn}`}>{t('dupGroups')}: {dupGroups}</span>\n )}\n {report !== null && report.rotation.length === 0 && report.weak.length === 0 && report.reused.length === 0 && (\n <span className={`${css.badge} ${css.badgeOk}`}>{t('healthOk')}</span>\n )}\n {backupInfo !== null && backupInfo.daysSinceBackup >= 0 && (\n <span className={`${css.badge} ${backupInfo.daysSinceBackup > 14 ? css.badgeDanger : backupInfo.daysSinceBackup > 7 ? css.badgeWarn : ''}`}>\n {t('healthBackup')}: {backupInfo.daysSinceBackup}d ({backupInfo.backups})\n </span>\n )}\n <button type=\"button\" className={css.backupButton} onClick={() => void exportReportCsv()} disabled={busy || report === null}>\n {t('exportReport')}\n </button>\n <button type=\"button\" className={css.backupButton} onClick={() => void backupNow()} disabled={busy}>\n {t('backupNow')}\n </button>\n <button type=\"button\" className={css.backupButton} onClick={() => void runBreachCheck()} disabled={busy}>\n {t('breachCheck')}\n </button>\n <button type=\"button\" className={css.backupButton} onClick={() => void lockNow()} disabled={busy || locked}>\n {t('lock')}\n </button>\n <button type=\"button\" className={css.backupButton} onClick={() => void runRecoveryCode()} disabled={busy || locked}>\n {t('recoveryCode')}\n </button>\n <button type=\"button\" className={css.backupButton} onClick={() => void runVerifyRecovery()} disabled={busy || locked}>\n {t('recoveryVerify')}\n </button>\n </div>\n )}\n\n {breach !== null && (breach.pwned.length > 0 || breach.weak.length > 0) && (\n <div className={css.reportBox}>\n <p className={css.reportTitle}>{t('breachTitle')}{breach.offline ? ` (${t('breachOffline')})` : ''}</p>\n {breach.pwned.slice(0, 6).map(item => (\n <p key={item.id} className={css.reportSub}>· {item.title} — {t('breachPwned')}{item.count > 0 ? ` ×${item.count}` : ''}</p>\n ))}\n {breach.weak.slice(0, 6).map(item => (\n <p key={item.id} className={css.reportSub}>· {item.title} — {t('breachWeak')}</p>\n ))}\n </div>\n )}\n {state.status === 'ready' && (\n <p className={css.footer}>\n {t('entryCount')}: {state.entries.length}\n {vaultStats !== null && typeof vaultStats.withTotp === 'number' && ` · TOTP: ${String(vaultStats.withTotp)}`}\n {vaultStats !== null && typeof vaultStats.highSensitivity === 'number' && ` · ${t('highSensitivity')}: ${String(vaultStats.highSensitivity)}`}\n {backupInfo !== null && backupInfo.daysSinceBackup >= 0 && ` · backup: ${backupInfo.daysSinceBackup}d ago`}\n {vaultStats !== null && typeof vaultStats.byTag === 'object' && vaultStats.byTag !== null\n && Object.keys(vaultStats.byTag as Record<string, unknown>).length > 0\n && ` · tags: ${Object.entries(vaultStats.byTag as Record<string, unknown>).map(([k, v]) => `${k}(${String(v)})`).join(' ')}`}\n </p>\n )}\n\n </div>)}\n\n {editor.status !== 'closed' && (\n <div className={css.editor} role=\"dialog\" aria-label={editor.status === 'creating' ? t('add') : t('edit')}>\n <div className={css.editorBody}>\n <div className={css.genOpts}>\n <label className={css.genOptRow}>\n <span>{t('tplApply')}</span>\n <select\n value=\"\"\n onChange={event => { const v = event.target.value; if (v) applyTemplate(v) }}\n >\n <option value=\"\">—</option>\n {tplList.map(tpl => <option key={tpl.name} value={tpl.name}>{templateLabel(tpl.name)}</option>)}\n </select>\n </label>\n {editor.status === 'editing' && (\n <button type=\"button\" className={css.retryButton} onClick={() => void saveAsTemplate()} disabled={busy}>{t('tplSave')}</button>\n )}\n </div>\n {FORM_FIELDS.filter(f => {\n const kind = form.kind ?? 'login'\n // Card-only fields show only for the card kind; everything else\n // is hidden when a card is selected (keeps the form focused).\n if (f.key === 'cardNumber' || f.key === 'cardExpiry' || f.key === 'cardCvv' || f.key === 'cardHolder') {\n return kind === 'card'\n }\n return kind !== 'card' || f.key === 'title' || f.key === 'kind' || f.key === 'notes' || f.key === 'icon' || f.key === 'color'\n }).map(field => (\n <label key={field.key} className={css.field}>\n <span>{t(field.label)}</span>\n {field.key === 'kind' ? (\n <select\n value={form.kind ?? 'login'}\n onChange={event => changeKind(event.target.value)}\n >\n {Object.entries(KIND_KEYS).map(([value, key]) => (\n <option key={value} value={value}>{t(key)}</option>\n ))}\n </select>\n ) : field.key === 'title' ? (\n <input\n value={form.title ?? ''}\n onChange={event => setForm(previous => ({ ...previous, title: event.target.value }))}\n />\n ) : field.key === 'password' || field.key === 'otpSecret' || field.key === 'apiKey'\n || field.key === 'secret' || field.key === 'accessToken' || field.key === 'refreshToken'\n || field.key === 'privateKey' ? (\n <span className={css.secretField}>\n <input\n type={revealed[field.key] ? 'text' : 'password'}\n value={(form[field.key] as string | undefined) ?? ''}\n onChange={event => setForm(previous => ({ ...previous, [field.key]: event.target.value }))}\n />\n {field.key === 'password' && (\n <>\n <button\n type=\"button\"\n className={css.revealButton}\n title={t('genPwHint')}\n onClick={() => { void generatePassword(genOpts).then(r => { setForm(previous => ({ ...previous, password: r.password })); void generatorHistory().then(setGenHistory).catch(() => {}) }) }}\n >{t('genPw')}</button>\n <button\n type=\"button\"\n className={css.revealButton}\n title={t('genOptsHint')}\n onClick={() => setShowGenOpts(v => !v)}\n >⚙</button>\n </>\n )}\n <button\n type=\"button\"\n className={css.revealButton}\n onClick={() => setRevealed(previous => ({ ...previous, [field.key]: !previous[field.key] }))}\n >{revealed[field.key] ? t('hide') : t('show')}</button>\n </span>\n ) : field.key === 'expiresAt' ? (\n <input\n type=\"datetime-local\"\n value={form.expiresAt !== undefined ? new Date(form.expiresAt).toISOString().slice(0, 16) : ''}\n onChange={event => {\n const raw = event.target.value\n const epoch = raw.length > 0 ? Date.parse(raw) : NaN\n setForm(previous => ({ ...previous, expiresAt: Number.isNaN(epoch) ? undefined : epoch }))\n }}\n />\n ) : field.key === 'rotationDays' ? (\n <input\n type=\"number\"\n min={0}\n max={3650}\n placeholder={t('rotationClearHint')}\n value={form.rotationDays ?? ''}\n onChange={event => {\n const raw = event.target.value\n setForm(previous => ({ ...previous, rotationDays: raw.length > 0 ? Number(raw) : undefined }))\n }}\n />\n ) : field.key === 'sensitivity' ? (\n <select\n value={form.sensitivity ?? 'normal'}\n onChange={event => setForm(previous => ({ ...previous, sensitivity: event.target.value === 'high' ? 'high' : 'normal' }))}\n >\n <option value=\"normal\">{t('sensitivityNormal')}</option>\n <option value=\"high\">{t('sensitivityHigh')}</option>\n </select>\n ) : field.key === 'favorite' ? (\n <label className={css.checkField}>\n <input\n type=\"checkbox\"\n checked={form.favorite ?? false}\n onChange={event => setForm(previous => ({ ...previous, favorite: event.target.checked }))}\n />\n {t('favoriteHint')}\n </label>\n ) : field.key === 'username' ? (\n <span className={css.secretField}>\n <input\n type=\"text\"\n value={(form.username as string | undefined) ?? ''}\n onChange={event => setForm(previous => ({ ...previous, username: event.target.value }))}\n />\n <button\n type=\"button\"\n className={css.revealButton}\n title={t('genUserHint')}\n onClick={() => { void generateUsername().then(r => setForm(previous => ({ ...previous, username: r.username }))) }}\n >{t('genUser')}</button>\n </span>\n ) : (\n <input\n type=\"text\"\n value={(form[field.key] as string | undefined) ?? ''}\n onChange={event => setForm(previous => ({ ...previous, [field.key]: event.target.value }))}\n />\n )}\n </label>\n ))}\n {pwStrength !== null && (\n <div className={css.pwMeter}>\n <div className={`${css.pwBar} ${pwStrength.score >= 60 ? css.pwStrong : pwStrength.score >= 40 ? css.pwFair : css.pwWeak}`} style={{ width: `${pwStrength.score}%` }} />\n <span className={css.pwLabel}>{t('strengthLabel')}: {pwStrength.score}/100 ({t(VERDICT_KEYS_SHORT[pwStrength.verdict] ?? 'verdictGood')}) · {t('entropyLabel')}: {pwStrength.bits} bits</span>\n </div>\n )}\n {showGenOpts && (\n <div className={css.genOpts}>\n <label className={css.genOptRow}>\n <span>{t('genPassphrase')}</span>\n <input\n type=\"checkbox\"\n checked={genOpts.passphrase}\n onChange={event => setGenOpts(previous => ({ ...previous, passphrase: event.target.checked }))}\n />\n </label>\n {genOpts.passphrase ? (\n <>\n <label className={css.genOptRow}>\n <span>{t('genWords')}</span>\n <input\n type=\"number\" min={2} max={12} value={genOpts.words}\n onChange={event => setGenOpts(previous => ({ ...previous, words: Math.max(2, Math.min(12, Number(event.target.value) || 4)) }))}\n />\n </label>\n <label className={css.genOptRow}>\n <span>{t('genSeparator')}</span>\n <input\n type=\"text\" maxLength={4} value={genOpts.separator}\n onChange={event => setGenOpts(previous => ({ ...previous, separator: event.target.value }))}\n />\n </label>\n <label className={css.genOptRow}>\n <span>{t('genWordDigits')}</span>\n <input\n type=\"checkbox\"\n checked={genOpts.wordDigits}\n onChange={event => setGenOpts(previous => ({ ...previous, wordDigits: event.target.checked }))}\n />\n </label>\n </>\n ) : (\n <>\n <label className={css.genOptRow}>\n <span>{t('genLength')}</span>\n <input\n type=\"number\" min={6} max={64} value={genOpts.length}\n onChange={event => setGenOpts(previous => ({ ...previous, length: Math.max(6, Math.min(64, Number(event.target.value) || 24)) }))}\n />\n </label>\n {(['uppercase', 'lowercase', 'digits', 'symbols', 'excludeAmbiguous'] as const).map(key => (\n <label key={key} className={css.genOptRow}>\n <span>{t(GEN_OPT_KEYS[key] ?? 'genOptUppercase')}</span>\n <input\n type=\"checkbox\"\n checked={genOpts[key]}\n onChange={event => setGenOpts(previous => ({ ...previous, [key]: event.target.checked }))}\n />\n </label>\n ))}\n </>\n )}\n {genHistory.length > 0 && (\n <div className={css.genHist}>\n <span>{t('genHistory')}:</span>\n {genHistory.slice(0, 3).map((h, i) => (\n <button\n key={i}\n type=\"button\"\n className={css.revealButton}\n onClick={() => setForm(previous => ({ ...previous, password: h.password }))}\n title={new Date(h.at).toLocaleString()}\n >{h.password}</button>\n ))}\n </div>\n )}\n </div>\n )}\n <label className={css.field}>\n <span>{t('fieldTags')}</span>\n <input\n list=\"dsh-vault-tags\"\n value={tagsDraft}\n onChange={event => setTagsDraft(event.target.value)}\n placeholder=\"dev, prod\"\n />\n <datalist id=\"dsh-vault-tags\">\n {[...new Set(state.status === 'ready' ? state.entries.flatMap(e => e.tags ?? []) : [])].sort().map(tag => (\n <option key={tag} value={tag} />\n ))}\n </datalist>\n </label>\n <label className={css.field}>\n <span>{t('fieldCustom')}</span>\n <textarea\n value={fieldsDraft}\n onChange={event => setFieldsDraft(event.target.value)}\n rows={3}\n placeholder=\"region=us-east-1 team=infra\"\n />\n </label>\n </div>\n <div className={css.editorActions}>\n <button type=\"button\" onClick={() => setEditor({ status: 'closed' })} disabled={busy}>{t('cancel')}</button>\n <button type=\"button\" className={css.saveButton} onClick={() => void save()} disabled={busy}>{t('save')}</button>\n </div>\n </div>\n )}\n </section>\n )\n}\n","/** Copy dictionaries for the Vault settings section. */\n\n/** English strings (the key-set source of truth for this pair). */\nexport const en = {\n nav: 'Vault',\n heading: 'Vault',\n intro: 'Encrypted credentials stored on this machine.',\n searchPlaceholder: 'Search title, username, email, host…',\n loading: 'Loading…',\n empty: 'No credentials yet. Add one to get started.',\n noFiltered: 'No entries match the current filter.',\n noFilteredHint: 'Try a different search or clear the filters.',\n clearFilters: 'Clear filters',\n emptyHint: 'Tip: you can ask the assistant to save an API key or token you share in chat — with auto-capture on it offers to store it for you. Bulk importing? Ask for vault_import_csv with a CSV file path.',\n emptyHintReadonly: 'The vault is in readonly mode — credentials can be read but not added here. Switch accessMode to \"readwrite\" to enable writes.',\n modeLabel: 'Access mode',\n autoCaptureLabel: 'Auto-capture credentials from chat',\n modeReadonly: 'Read-only',\n modeAsk: 'Ask before writing',\n modeAuto: 'Automatic read-write',\n modeReadonlyHint: 'Read-only — mutations disabled',\n modeAskHint: 'Prompt before writing — every add/update/delete asks you',\n modeAutoHint: 'Automatic read-write — no per-call prompt',\n autoCaptureOn: 'auto-capture on',\n autoCaptureOff: 'auto-capture off',\n clearSearch: 'Clear search',\n entryCount: 'Entries',\n reportTitle: 'Health & rotation',\n recentActivity: 'Recent activity',\n recentlyAdded: 'Recently added',\n reportRotation: 'expired / due for rotation',\n reportWeak: 'weak passwords',\n healthSummaryHint: 'Vault health: weak/reused/no-2FA/HTTP/rotation counts',\n reportReused: 'credentials reused across entries',\n dupGroups: 'duplicate groups',\n dupTitle: 'Duplicate entries',\n dupMerge: 'Merge',\n healthOk: 'vault healthy',\n healthBackup: 'backup',\n backupNow: 'Backup now',\n backupDone: 'Backup created',\n lockedBanner: 'Vault is locked — unlock it with vault_unlock to read or write entries.',\n vaultSelect: 'Active vault',\n vaultRename: 'Rename vault',\n vaultRenamePrompt: 'New name for the vault',\n vaultDelete: 'Delete',\n vaultDeleteConfirm: 'Permanently delete vault \"{name}\"? This cannot be undone.',\n vaultDeleteDefault: 'The default vault cannot be deleted.',\n touch: 'Used',\n touchHint: 'Mark as recently used',\n auditTitle: 'Needs attention',\n auditEdit: 'Edit',\n breachCheck: 'Check breaches',\n exportReport: 'Export report',\n reportExported: 'Security report exported as CSV.',\n breachTitle: 'Breach scan',\n breachPwned: 'password appeared in breaches',\n breachWeak: 'common/weak password',\n breachOffline: 'offline fallback',\n breachOk: 'No breached or weak passwords found',\n breachOkOffline: 'No weak passwords found (offline — online breach check unavailable)',\n healthScore: 'Security score',\n verdictGood: 'good',\n verdictFair: 'fair',\n verdictPoor: 'poor',\n no2fa: 'No 2FA',\n genPw: 'Generate',\n genPwHint: 'Fill with a generated strong password',\n retry: 'Retry',\n genUser: 'Generate',\n genUserHint: 'Fill with a generated username',\n loadMore: 'Load more',\n clearsIn30s: 'clears in 30s',\n openUrl: 'Open',\n openUrlHint: 'Open the associated website',\n genOptsHint: 'Password generator options',\n genLength: 'Length',\n genOptUppercase: 'Uppercase',\n genOptLowercase: 'Lowercase',\n genOptDigits: 'Digits',\n genOptSymbols: 'Symbols',\n genOptExcludeAmbiguous: 'No ambiguous chars',\n strengthLabel: 'Strength',\n entropyLabel: 'Entropy',\n tplApply: 'Apply template',\n tplSave: 'Save as template',\n tplNamePrompt: 'Template name:',\n tplSaved: 'Template saved:',\n lock: 'Lock',\n recoveryCode: 'Generate recovery code',\n recoveryCodeConfirm: 'Generate a one-time recovery code? It is shown only once (store it safely, e.g. printed); only its hash is kept.',\n recoveryCodeAlert: 'Your one-time recovery code (shown once — store it safely):',\n recoveryCodeSet: 'Recovery code generated (shown once).',\n recoveryVerify: 'Verify recovery code',\n recoveryCodeVerifyPrompt: 'Enter the recovery code to verify:',\n recoveryVerified: 'Recovery code verified.',\n recoveryNotVerified: 'Recovery code does not match.',\n lockedMsg: 'Vault locked — unlock with vault_unlock',\n ageToday: 'new',\n ageHint: 'Updated days ago (password age)',\n watchPoor: '⚠ high risk',\n watchWarn: '⚠ attention',\n watchScore: '{n}',\n watchFlagsTitle: 'Risks: ',\n resultCount: 'Results',\n totpUri: 'URI',\n totpUriHint: 'Show otpauth URI for another device',\n pwChangeConfirm: 'Changing the password — continue?',\n copyFieldHint: 'Copy this field value',\n tagManage: 'Tags',\n tagRename: 'Rename',\n tagRenamePrompt: 'New name for tag',\n genHistory: 'Recently generated',\n recentBackups: 'Recent backups',\n backupTitle: 'Encrypted backups',\n backupHint: 'Backups are encrypted copies of the vault document kept in the same folder. Restoring replaces the live vault with the selected snapshot; a safety copy of the current state is written first.',\n backupRestore: 'Restore',\n backupRestoreHint: 'Restore the vault from this backup',\n backupRestoreConfirm: 'Restore the vault from this backup? The current vault is snapshotted first, then replaced.',\n backupRestoreModeMerge: 'Merge this backup into the current vault (entries are copied in, existing same-title entries are kept)? OK = merge. Cancel = replace the whole vault.',\n backupRestoreModeReplace: 'Replace the WHOLE vault with this backup? A safety snapshot is written first.',\n backupDelete: 'Delete',\n backupDeleteConfirm: 'Delete this backup file permanently?',\n backupDeleted: 'Backup deleted.',\n backupSafetyHint: 'Pre-restore snapshot saved to',\n noBackups: 'No backups yet — create one with \"Backup now\".',\n permTitle: 'Access permissions & capture',\n systemImport: 'System import',\n importChrome: 'Import Chrome',\n importChromeDesc: 'Chrome password manager (Login Data)',\n importKeychain: 'Import Keychain',\n importKeychainDesc: 'macOS Keychain (internet passwords — website logins)',\n importKeychainHint: 'Reads internet passwords (inet) by default — the entries that actually back website logins (Wi-Fi and app secrets are generic passwords and are skipped). First-time authorization: choose \"Always Allow\" once for this process.',\n keychainPreview: 'Preview',\n preview: 'Preview',\n previewLabel: 'Preview —',\n keychainPromptWarn: 'Importing from the Keychain may prompt macOS for authorization for each entry. First time: choose \"Always Allow\" to consent once for this process. Continue?',\n systemSearch: 'Search system stores',\n sysSearchPlaceholder: 'Search Chrome / Keychain…',\n sysSearchGo: 'Search',\n importFirefox: 'Import Firefox',\n importFirefoxDesc: 'Firefox profile (logins.json + key4.db)',\n firefoxMasterPw: 'Firefox primary password (leave empty if none):',\n import1password: 'Import 1Password',\n import1passwordDesc: '1Password 1PUX export (.1pux)',\n import1passwordPrompt: 'Path to the .1pux file:',\n importManagerCsv: 'Import manager CSV',\n importManagerCsvDesc: 'Password-manager CSV (Dashlane / NordPass / Keeper)',\n importManagerCsvPrompt: 'Path to the CSV file (header auto-detected):',\n importEnpass: 'Import Enpass',\n importEnpassDesc: 'Enpass JSON export (.json)',\n importEnpassPrompt: 'Path to the Enpass .json export:',\n importBitwarden: 'Import Bitwarden',\n importBitwardenDesc: 'Bitwarden JSON export (.json)',\n importBitwardenPrompt: 'Path to the Bitwarden .json export:',\n importBitwardenEncrypted: 'Import Bitwarden (encrypted)',\n importBitwardenEncryptedDesc: 'Bitwarden password-protected JSON export (.json)',\n importBitwardenEncryptedPrompt: 'Path to the encrypted Bitwarden .json export:',\n importBitwardenEncryptedPasswordPrompt: 'Export passphrase (the one chosen when creating the encrypted export):',\n import1pif: 'Import 1Password 1PIF',\n import1pifDesc: 'Legacy 1Password 1PIF export (.1pif)',\n import1pifPrompt: 'Path to the .1pif file:',\n importKeePassXml: 'Import KeePass XML',\n importKeePassXmlDesc: 'KeePass 2.x XML export (.xml)',\n importKeePassXmlPrompt: 'Path to the KeePass .xml export:',\n importKdbx: 'Import KeePass KDBX',\n importKdbxDesc: 'KeePass KDBX database (.kdbx, 3.1/4.x, AES-KDF/Argon2)',\n importKdbxPrompt: 'Path to the .kdbx file:',\n importKdbxPasswordPrompt: 'Database password (leave blank if none):',\n exportTitle: 'Export',\n exportHint: 'Export the whole vault (contains plaintext secrets — keep the file protected).',\n export1pux: 'Export 1Password 1PUX',\n export1puxDesc: '1Password 1PUX archive (.1pux)',\n export1puxPrompt: 'Path to the output .1pux file:',\n exportDefaultPath: 'dsh-vault-export-{file}',\n exportPathHint: 'Suggested path (edit if needed)',\n exportBitwarden: 'Export Bitwarden JSON',\n exportBitwardenDesc: 'Bitwarden JSON document (.json)',\n exportBitwardenPrompt: 'Path to the output .json file:',\n exportDone: 'Exported',\n sectionTabs: 'Vault sections',\n tabEntries: 'Entries',\n tabSecurity: 'Security',\n tabTransfer: 'Import / Export',\n tabBackup: 'Backup',\n tabPermissions: 'Permissions',\n tabSessions: 'Sessions',\n tabTrash: 'Trash',\n sessionsIntro: 'Log into any site in a real browser window, then save the session cookies here for automation (curl, requests, browser-less tools). HttpOnly cookies are captured too.',\n sessionUrlPrompt: 'Site URL to open:',\n sessionOpen: 'Open login window',\n sessionOpenHint: 'Opens a real browser window at the URL. Log in there manually (password, 2FA, …), then come back and click Collect.',\n sessionOpenFailed: 'Could not open a browser — is playwright-core installed and a Chromium build available?',\n sessionOpenList: 'Open windows',\n sessionNoOpen: 'No browser windows open.',\n sessionCollect: 'Collect & save',\n sessionSaveTitle: 'Save as:',\n sessionOverwrite: 'Replace existing',\n sessionSaved: 'saved {n} cookies',\n sessionSavedList: 'Saved sessions',\n sessionEmpty: 'No saved login sessions yet. Open a window, log in, and collect.',\n sessionExport: 'Copy Cookie header',\n sessionExportJar: 'Copy jar (curl -b)',\n sessionExportPlaywright: 'Copy Playwright snippet',\n sessionView: 'View',\n sessionDelete: 'Delete',\n sessionClose: 'Close window',\n sessionCopied: 'Copied!',\n sessionDetailTitle: 'Cookies',\n sessionCookie: 'cookies',\n sessionExpires: 'expires',\n sessionSessionCookie: 'session',\n sessionExpired: 'expired',\n sessionExpiringSoon: 'expiring in 7d',\n sessionPrune: 'Prune expired',\n sessionPruneConfirm: 'Remove expired cookies from this saved session? Session cookies (no expiry) are kept.',\n sessionDomain: 'domain',\n sessionReopen: 'Re-open in browser',\n sessionImportPaste: 'Import from pasted cookies',\n sessionImportPastePrompt: 'Paste a JSON cookie array or a Cookie header string:',\n sessionImportPasteTitle: 'Title:',\n sessionImport: 'Import cookies',\n sessionNoteOpen: 'Browser window opened at {url}. Log in, then click Collect & save.',\n sessionNoteCollect: 'Collected {n} cookies.',\n sessionNamePlaceholder: 'e.g. GitHub session',\n sessionUrlPlaceholder: 'https://example.com/login',\n sessionReadOnly: 'The vault is in readonly mode — browser sessions cannot be saved.',\n lockedShort: '🔒 locked',\n unlock: 'Unlock',\n httpSites: 'HTTP sites',\n healthStrength: 'strength',\n dueExpired: 'EXPIRED',\n dueExpiring: 'expires in',\n dueNow: 'rotation due',\n showTrash: 'Trash',\n hideTrash: 'Hide trash',\n trashed: 'in trash',\n trashEmpty: 'Trash is empty',\n restore: 'Restore',\n clearTrash: 'Empty trash',\n restoreAll: 'Restore all',\n clearTrashConfirm: 'Permanently delete ALL trashed entries? This cannot be undone.',\n show: 'Show',\n hide: 'Hide',\n allKinds: 'All kinds',\n allTags: 'All tags',\n sortBy: 'Sort',\n sortAlpha: 'Sort: A–Z',\n sortFavorite: 'Favorites first',\n sortSmart: 'Smart',\n sortRecent: 'Sort: recent',\n sortCreated: 'Sort: created',\n highSensitivity: 'HIGH',\n pinned: 'Pinned',\n togglePinHint: 'Toggle pinned (shows at top in pinned/smart sort)',\n attachmentsTitle: 'Attachments',\n detachHint: 'Remove attachment',\n add: 'Add credential',\n quickAdd: 'Quick add',\n cancel: 'Cancel',\n save: 'Save',\n savedNew: 'Entry created.',\n savedUpdated: 'Entry updated.',\n edit: 'Edit',\n delete: 'Delete',\n deleteConfirm: 'Move this entry to the trash? You can restore it later.',\n deleted: 'Entry moved to trash.',\n deletedWithTitle: '{name} moved to trash.',\n copy: 'Copy',\n copyUsername: 'Copy username',\n copyUsernameHint: 'Copy the username',\n copyTitleHint: 'Copy the title',\n bulkSelect: 'Select',\n bulkDone: 'Done',\n bulkSelectAll: 'Select all',\n bulkSelected: 'Selected',\n bulkDelete: 'Delete selected',\n bulkDeleteConfirm: 'Delete {n} selected entries? They move to the trash.',\n bulkDeleted: 'Deleted {n} entries.',\n copyPassword: 'Copy password',\n copyCode: 'Copy code',\n copied: 'Copied',\n totp: 'Code',\n fieldTitle: 'Title',\n fieldKind: 'Kind',\n fieldUsername: 'Username',\n fieldEmail: 'Email',\n fieldPhone: 'Phone',\n fieldPassword: 'Password',\n fieldHost: 'Host',\n fieldPort: 'Port',\n fieldApiKey: 'API key',\n fieldSecret: 'Secret',\n fieldAccessToken: 'Access token',\n fieldRefreshToken: 'Refresh token',\n fieldOtpSecret: 'OTP secret',\n fieldUrl: 'URL',\n fieldCardNumber: 'Card number',\n fieldCardExpiry: 'Expiry (MM/YY)',\n fieldCardCvv: 'CVV',\n fieldCardHolder: 'Card holder',\n fieldNotes: 'Notes',\n fieldTags: 'Tags',\n fieldIcon: 'Icon (emoji)',\n fieldExpiresAt: 'Expires at',\n fieldRotationDays: 'Rotation (days, 0 = never)',\n fieldSensitivity: 'Sensitivity',\n fieldFavorite: 'Pinned',\n sensitivityNormal: 'normal',\n sensitivityHigh: 'high',\n favoriteHint: 'Show at top',\n rotationClearHint: '0 clears rotation',\n fieldColor: 'Color',\n fieldCustom: 'Custom fields (key=value per line)',\n error: 'Something went wrong.',\n errLocked: 'Vault is locked — unlock first.',\n errTitleEmpty: 'Title must not be empty.',\n errInvalidVaultName: 'Invalid vault name.',\n errReadonly: 'This action is disabled in readonly mode.',\n errDetail: 'Something went wrong: {detail}',\n autoLockLabel: 'Auto-lock after',\n autoLockNever: 'Never',\n autoLock1m: '1 minute',\n autoLock5m: '5 minutes',\n autoLock15m: '15 minutes',\n autoLock30m: '30 minutes',\n autoLock1h: '1 hour',\n autoLockHint: 'Auto-lock',\n autoLockNeverHint: 'auto-lock off',\n purge: 'Delete permanently',\n purgeOneConfirm: 'Permanently delete \"{name}\"? This cannot be undone.',\n genPassphrase: 'Memorable passphrase',\n genWords: 'Words (2–12)',\n genSeparator: 'Separator',\n genWordDigits: 'Append 2 digits',\n kindLogin: 'Login',\n kindSsh: 'SSH',\n kindApiKey: 'API key',\n kindSecret: 'Secret',\n kindOauth: 'OAuth',\n kindCookie: 'Session cookies',\n kindCard: 'Card',\n kindCustom: 'Custom',\n} as const\n\nexport type VaultLocaleKey = keyof typeof en\n\n/** Chinese strings (same keys as English). */\nexport const zh: Record<VaultLocaleKey, string> = {\n nav: '凭据库',\n heading: 'Vault 凭据库',\n intro: '本机加密存储的凭据。',\n searchPlaceholder: '搜索标题、用户名、邮箱、主机…',\n loading: '加载中…',\n empty: '还没有凭据,添加一条开始使用。',\n noFiltered: '当前过滤条件下没有匹配的条目。',\n noFilteredHint: '试试其他搜索词, 或清除过滤条件。',\n clearFilters: '清除过滤',\n emptyHint: '提示:你可以在对话中把 API Key 或 token 交给助手保存——开启自动捕获后,它会在你同意时帮你存入本库。批量导入?让助手调用 vault_import_csv 并给出 CSV 路径即可。',\n emptyHintReadonly: '当前为只读模式——只能读取凭据,不能在此添加。将 accessMode 改为 \"readwrite\" 即可启用写入。',\n modeLabel: '访问模式',\n autoCaptureLabel: '自动捕获对话中的凭据',\n modeReadonly: '只读',\n modeAsk: '写入前询问',\n modeAuto: '自动读写',\n modeReadonlyHint: '只读 —— 变更已禁用',\n modeAskHint: '写入前询问 —— 每次增/改/删都会征求你的确认',\n modeAutoHint: '自动读写 —— 无需逐次确认',\n autoCaptureOn: '自动捕获已开启',\n autoCaptureOff: '自动捕获已关闭',\n clearSearch: '清除搜索',\n entryCount: '条目数',\n reportTitle: '健康与轮换',\n recentActivity: '最近活动',\n recentlyAdded: '最近添加',\n reportRotation: '已过期 / 待轮换',\n reportWeak: '弱密码',\n healthSummaryHint: '保险库健康: 弱密码/复用/缺2FA/HTTP站点/到期轮换计数',\n reportReused: '跨条目复用的凭据',\n dupGroups: '重复分组',\n dupTitle: '重复条目',\n dupMerge: '合并',\n healthOk: '凭据库健康',\n healthBackup: '备份',\n backupNow: '立即备份',\n backupDone: '备份已创建',\n lockedBanner: '保险库已锁定 —— 请使用 vault_unlock 解锁后再读写条目。',\n vaultSelect: '当前保险库',\n vaultRename: '重命名保险库',\n vaultRenamePrompt: '保险库的新名称',\n vaultDelete: '删除',\n vaultDeleteConfirm: '永久删除保险库 \"{name}\"?此操作无法撤销。',\n vaultDeleteDefault: '默认保险库不能被删除。',\n touch: '标记已用',\n touchHint: '标记为最近使用',\n auditTitle: '需要处理',\n auditEdit: '编辑',\n breachCheck: '泄露检测',\n exportReport: '导出安全报告',\n reportExported: '安全报告已导出为 CSV。',\n breachTitle: '泄露扫描',\n breachPwned: '密码曾出现在数据泄露中',\n breachWeak: '常见/弱密码',\n breachOffline: '离线兜底',\n breachOk: '未发现泄露或弱密码',\n breachOkOffline: '未发现弱密码(离线——在线泄露检测不可用)',\n healthScore: '安全评分',\n verdictGood: '良好',\n verdictFair: '一般',\n verdictPoor: '较差',\n no2fa: '未启用2FA',\n genPw: '生成',\n genPwHint: '填入生成的强密码',\n retry: '重试',\n genUser: '生成',\n genUserHint: '填入生成的用户名',\n loadMore: '加载更多',\n clearsIn30s: '30秒后自动清除',\n openUrl: '打开',\n openUrlHint: '打开关联网站',\n genOptsHint: '密码生成器选项',\n genLength: '长度',\n genOptUppercase: '大写',\n genOptLowercase: '小写',\n genOptDigits: '数字',\n genOptSymbols: '符号',\n genOptExcludeAmbiguous: '排除易混淆字符',\n strengthLabel: '强度',\n entropyLabel: '熵值',\n tplApply: '套用模板',\n tplSave: '存为模板',\n tplNamePrompt: '模板名称:',\n tplSaved: '模板已保存:',\n lock: '锁定',\n recoveryCode: '生成恢复码',\n recoveryCodeConfirm: '生成一次性恢复码?仅在生成时显示一次(请妥善保存,如打印备份);只保存其哈希。',\n recoveryCodeAlert: '您的一次性恢复码(仅显示一次——请妥善保存):',\n recoveryCodeSet: '恢复码已生成(仅显示一次)。',\n recoveryVerify: '验证恢复码',\n recoveryCodeVerifyPrompt: '输入要验证的恢复码:',\n recoveryVerified: '恢复码验证通过。',\n recoveryNotVerified: '恢复码不匹配。',\n lockedMsg: '保险库已锁定 —— 使用 vault_unlock 解锁',\n ageToday: '新',\n ageHint: '距上次更新天数(密码年龄)',\n watchPoor: '⚠ 高风险',\n watchWarn: '⚠ 需关注',\n watchScore: '{n}',\n watchFlagsTitle: '风险: ',\n resultCount: '结果',\n totpUri: 'URI',\n totpUriHint: '显示 otpauth URI 以便在其它设备添加',\n pwChangeConfirm: '正在修改密码 —— 确定继续?',\n copyFieldHint: '复制该字段值',\n tagManage: '标签管理',\n tagRename: '重命名',\n tagRenamePrompt: '标签新名称',\n genHistory: '最近生成',\n recentBackups: '最近备份',\n backupTitle: '加密备份',\n backupHint: '备份是存放在同目录下的加密副本。还原会用所选快照替换当前密码库,还原前会先保存一份当前状态的安全快照。',\n backupRestore: '还原',\n backupRestoreHint: '用该备份还原密码库',\n backupRestoreConfirm: '确定用该备份还原密码库?当前状态会先快照,再被替换。',\n backupRestoreModeMerge: '将该备份合并进当前密码库(条目被复制进来,同标题条目保留)?确定=合并。取消=整体替换密码库。',\n backupRestoreModeReplace: '用该备份整体替换当前密码库?会先写一份安全快照。',\n backupDelete: '删除',\n backupDeleteConfirm: '永久删除这个备份文件?',\n backupDeleted: '备份已删除。',\n backupSafetyHint: '还原前快照已保存到',\n noBackups: '暂无备份 — 用“立即备份”创建。',\n permTitle: '访问权限与自动捕获',\n systemImport: '系统导入',\n importChrome: '导入 Chrome',\n importChromeDesc: 'Chrome 密码管理器(Login Data)',\n importKeychain: '导入钥匙串',\n importKeychainDesc: 'macOS 钥匙串(互联网密码——网站登录凭据)',\n importKeychainHint: '默认读取互联网密码(inet)——真正用于网站登录的条目(Wi-Fi 和应用密钥属于通用密码,会被跳过)。首次授权请选择「始终允许」一次即可。',\n keychainPreview: '预览',\n preview: '预览',\n previewLabel: '预览 —',\n keychainPromptWarn: '从钥匙串导入时 macOS 可能为每条凭据弹出授权框。首次请在弹窗中选择“始终允许”一次性授权本进程。是否继续?',\n systemSearch: '搜索系统凭据库',\n sysSearchPlaceholder: '搜索 Chrome / 钥匙串…',\n sysSearchGo: '搜索',\n importFirefox: '导入 Firefox',\n importFirefoxDesc: 'Firefox 配置(logins.json + key4.db)',\n firefoxMasterPw: 'Firefox 主密码(未设置则留空):',\n import1password: '导入 1Password',\n import1passwordDesc: '1Password 1PUX 导出(.1pux)',\n import1passwordPrompt: '请输入 .1pux 文件路径:',\n importManagerCsv: '导入密码库 CSV',\n importManagerCsvDesc: '密码管理器 CSV(Dashlane / NordPass / Keeper)',\n importManagerCsvPrompt: '请输入 CSV 文件路径(自动识别表头):',\n importEnpass: '导入 Enpass',\n importEnpassDesc: 'Enpass JSON 导出(.json)',\n importEnpassPrompt: '请输入 Enpass JSON 导出文件路径:',\n importBitwarden: '导入 Bitwarden',\n importBitwardenDesc: 'Bitwarden JSON 导出(.json)',\n importBitwardenPrompt: '请输入 Bitwarden JSON 导出文件路径:',\n importBitwardenEncrypted: '导入 Bitwarden(加密)',\n importBitwardenEncryptedDesc: 'Bitwarden 加密 JSON 导出(.json)',\n importBitwardenEncryptedPrompt: '请输入加密 Bitwarden JSON 导出文件路径:',\n importBitwardenEncryptedPasswordPrompt: '导出口令(创建加密导出时设置的口令):',\n import1pif: '导入 1Password 1PIF',\n import1pifDesc: '旧版 1Password 1PIF 导出(.1pif)',\n import1pifPrompt: '请输入 .1pif 文件路径:',\n importKeePassXml: '导入 KeePass XML',\n importKeePassXmlDesc: 'KeePass 2.x XML 导出(.xml)',\n importKeePassXmlPrompt: '请输入 KeePass XML 导出文件路径:',\n importKdbx: '导入 KeePass KDBX',\n importKdbxDesc: 'KeePass KDBX 数据库(.kdbx,3.1/4.x,AES-KDF/Argon2)',\n importKdbxPrompt: '请输入 .kdbx 文件路径:',\n importKdbxPasswordPrompt: '数据库密码(无密码则留空):',\n exportTitle: '导出',\n exportHint: '导出整个保险库(包含明文机密——请妥善保护文件)。',\n export1pux: '导出 1Password 1PUX',\n export1puxDesc: '1Password 1PUX 归档(.1pux)',\n export1puxPrompt: '输出 .1pux 文件路径:',\n exportDefaultPath: 'dsh-vault-export-{file}',\n exportPathHint: '建议路径(可按需修改)',\n exportBitwarden: '导出 Bitwarden JSON',\n exportBitwardenDesc: 'Bitwarden JSON 文档(.json)',\n exportBitwardenPrompt: '输出 .json 文件路径:',\n exportDone: '已导出',\n sectionTabs: '凭据库分区',\n tabEntries: '条目',\n tabSecurity: '安全',\n tabTransfer: '导入/导出',\n tabBackup: '备份',\n tabPermissions: '权限',\n tabSessions: '会话',\n tabTrash: '回收站',\n sessionsIntro: '在真实浏览器窗口中登录任意网站,然后把登录后的 session cookie 保存到这里,供自动化任务使用(curl、requests 等)。HttpOnly cookie 也能捕获。',\n sessionUrlPrompt: '要打开的网站地址:',\n sessionOpen: '打开登录窗口',\n sessionOpenHint: '在指定地址打开真实浏览器窗口。请在其中手动登录(密码、二次验证等),然后回到这里点击「收集并保存」。',\n sessionOpenFailed: '无法打开浏览器——请确认已安装 playwright-core 且有可用的 Chromium。',\n sessionOpenList: '已打开的窗口',\n sessionNoOpen: '当前没有打开的浏览器窗口。',\n sessionCollect: '收集并保存',\n sessionSaveTitle: '保存为:',\n sessionOverwrite: '覆盖已有条目',\n sessionSaved: '已保存 {n} 个 cookie',\n sessionSavedList: '已保存的会话',\n sessionEmpty: '还没有保存的登录会话。打开窗口、登录、然后收集。',\n sessionExport: '复制 Cookie 头',\n sessionExportJar: '复制 cookie jar(curl -b)',\n sessionExportPlaywright: '复制 Playwright 片段',\n sessionView: '查看',\n sessionDelete: '删除',\n sessionClose: '关闭窗口',\n sessionCopied: '已复制!',\n sessionDetailTitle: 'Cookies',\n sessionCookie: '个 cookie',\n sessionExpires: '过期',\n sessionSessionCookie: '会话',\n sessionExpired: '已过期',\n sessionExpiringSoon: '7 天内过期',\n sessionPrune: '清理过期',\n sessionPruneConfirm: '移除该已保存会话中的过期 cookie?无过期的会话 cookie 会保留。',\n sessionDomain: '域名',\n sessionReopen: '在浏览器中重新打开',\n sessionImportPaste: '从粘贴的 cookie 导入',\n sessionImportPastePrompt: '粘贴 JSON cookie 数组或 Cookie 头字符串:',\n sessionImportPasteTitle: '标题:',\n sessionImport: '导入 cookies',\n sessionNoteOpen: '浏览器窗口已打开:{url}。登录后点击「收集并保存」。',\n sessionNoteCollect: '已收集 {n} 个 cookie。',\n sessionNamePlaceholder: '例如:GitHub 会话',\n sessionUrlPlaceholder: 'https://example.com/login',\n sessionReadOnly: '凭据库处于只读模式,无法保存浏览器会话。',\n lockedShort: '🔒 已锁定',\n unlock: '解锁',\n httpSites: 'HTTP站点',\n healthStrength: '强度',\n dueExpired: '已过期',\n dueExpiring: '将于',\n dueNow: '待轮换',\n showTrash: '回收站',\n hideTrash: '隐藏回收站',\n trashed: '已删除',\n trashEmpty: '回收站为空',\n restore: '恢复',\n clearTrash: '清空回收站',\n restoreAll: '全部恢复',\n clearTrashConfirm: '永久删除回收站中全部条目?此操作不可撤销。',\n show: '显示',\n hide: '隐藏',\n allKinds: '全部类型',\n allTags: '全部标签',\n sortBy: '排序',\n sortAlpha: '排序:A–Z',\n sortFavorite: '置顶优先',\n sortSmart: '智能排序',\n sortRecent: '排序:最近',\n sortCreated: '排序:创建时间',\n highSensitivity: '高敏',\n pinned: '已置顶',\n togglePinHint: '切换置顶(置顶/智能排序时显示在最前)',\n attachmentsTitle: '附件',\n detachHint: '移除附件',\n add: '新增凭据',\n quickAdd: '快速添加',\n cancel: '取消',\n save: '保存',\n savedNew: '条目已创建。',\n savedUpdated: '条目已更新。',\n edit: '编辑',\n delete: '删除',\n deleteConfirm: '将该条目移入回收站?之后可恢复。',\n deleted: '条目已移入回收站。',\n deletedWithTitle: '「{name}」已移入回收站。',\n copy: '复制',\n copyUsername: '复制用户名',\n copyUsernameHint: '复制用户名',\n copyTitleHint: '复制标题',\n bulkSelect: '批量选择',\n bulkDone: '完成',\n bulkSelectAll: '全选',\n bulkSelected: '已选择',\n bulkDelete: '删除所选',\n bulkDeleteConfirm: '删除所选 {n} 条条目?它们将移入回收站。',\n bulkDeleted: '已删除 {n} 条条目。',\n copyPassword: '复制密码',\n copyCode: '复制验证码',\n copied: '已复制',\n totp: '验证码',\n fieldTitle: '标题',\n fieldKind: '类型',\n fieldUsername: '用户名',\n fieldEmail: '邮箱',\n fieldPhone: '手机号',\n fieldPassword: '密码',\n fieldHost: '主机',\n fieldPort: '端口',\n fieldApiKey: 'API 密钥',\n fieldSecret: 'Secret',\n fieldAccessToken: '访问令牌',\n fieldRefreshToken: '刷新令牌',\n fieldOtpSecret: 'TOTP 密钥',\n fieldUrl: 'URL',\n fieldCardNumber: '卡号',\n fieldCardExpiry: '有效期(MM/YY)',\n fieldCardCvv: 'CVV',\n fieldCardHolder: '持卡人',\n fieldNotes: '备注',\n fieldTags: '标签',\n fieldIcon: '图标(emoji)',\n fieldExpiresAt: '过期时间',\n fieldRotationDays: '轮换周期(天,0=永不)',\n fieldSensitivity: '敏感级别',\n fieldFavorite: '置顶',\n sensitivityNormal: '普通',\n sensitivityHigh: '高敏',\n favoriteHint: '列表置顶显示',\n rotationClearHint: '0 清除轮换',\n fieldColor: '颜色',\n fieldCustom: '自定义字段(每行 key=value)',\n error: '操作失败。',\n errLocked: '保险库已锁定,请先解锁。',\n errTitleEmpty: '标题不能为空。',\n errInvalidVaultName: '保险库名称无效。',\n errReadonly: '当前为只读模式,此操作已禁用。',\n errDetail: '操作失败:{detail}',\n autoLockLabel: '自动锁定',\n autoLockNever: '永不',\n autoLock1m: '1 分钟',\n autoLock5m: '5 分钟',\n autoLock15m: '15 分钟',\n autoLock30m: '30 分钟',\n autoLock1h: '1 小时',\n autoLockHint: '自动锁定',\n autoLockNeverHint: '自动锁定已关闭',\n purge: '永久删除',\n purgeOneConfirm: '永久删除「{name}」?此操作不可撤销。',\n genPassphrase: '易记短语密码',\n genWords: '单词数(2–12)',\n genSeparator: '分隔符',\n genWordDigits: '尾部加 2 位数字',\n kindLogin: '登录',\n kindSsh: 'SSH',\n kindApiKey: 'API 密钥',\n kindSecret: 'Secret',\n kindOauth: 'OAuth',\n kindCookie: '会话 Cookies',\n kindCard: '银行卡',\n kindCustom: '自定义',\n}\n","/**\n * dsh-vault browser half: a Vault settings page managing encrypted\n * credentials — list, search, add, edit, delete, and copy — through the host\n * VaultGateway remote over the /api RPC channel.\n *\n * @module dsh-vault/client\n */\n\nimport type { ClientContext } from '@deepseek-ai/dsh-client-runtime/client'\nimport type { ConnectionHandle } from '@deepseek-ai/dsh-api-remotes/client'\nimport type {} from '@deepseek-ai/dsh-client-locale/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-settings/client'\nimport { VaultSection, type VaultSectionInjected } from './VaultSection.tsx'\nimport type { VaultSectionTypes } from './VaultSection.tsx'\nimport { en, zh, type VaultLocaleKey } from './locales.ts'\n\nexport type { VaultSectionInjected, VaultSectionProps } from './VaultSection.tsx'\nexport type { VaultSectionTypes } from './VaultSection.tsx'\nexport type { VaultLocaleKey } from './locales.ts'\n\ndeclare module '@deepseek-ai/dsh-client-ui-slots' {\n interface LocaleNamespaceMap {\n /** Vault settings page copy. */\n 'settings.vault': VaultLocaleKey\n }\n}\n\n/** Dictionary namespace owned by this plugin. */\nexport const NS = 'settings.vault'\n\n/** Services required by the Settings registration and the RPC face. */\nexport const inject = ['slots', 'locale', 'connection']\n\n/**\n * Register the Vault settings section once the `settings.section` declaration\n * is on the ledger. The section talks to the host through the connection RPC\n * channel (endpoints `vault/*` served by the host VaultGateway remote).\n */\nexport function apply(ctx: ClientContext): void {\n ctx.effect(() => ctx.locale.register(NS, { zh, en }), 'dsh-vault: dictionaries')\n\n const t = ctx.locale.bind(NS)\n const connection = ctx.get('connection') as ConnectionHandle\n\n /** Invoke one host vault remote and normalize the RPC envelope. */\n async function invoke<T>(method: string, args: Record<string, unknown> = {}): Promise<T> {\n const result = await connection.rpc.call('/api', `vault/${method}`, { args })\n if (!result.ok) {\n throw new Error(`vault.${method} failed: ${result.error.code}: ${result.error.message}`)\n }\n return result.value as T\n }\n\n const injected = (): VaultSectionInjected => ({\n t,\n config: () => invoke<VaultSectionTypes['config']>('config'),\n setAccessMode: (mode) => invoke<VaultSectionTypes['config']>('setAccessMode', { mode }),\n setAutoCapture: (enabled) => invoke<VaultSectionTypes['config']>('setAutoCapture', { enabled }),\n setAutoLock: (seconds) => invoke<{ seconds: number }>('setAutoLock', { seconds }),\n list: () => invoke<{ entries: VaultSectionTypes['entries'] }>('list').then(r => r.entries),\n search: (query, limit) => invoke<{ entries: VaultSectionTypes['entries'] }>('search', { query, limit: limit ?? 50 }).then(r => r.entries),\n get: (id) => invoke<{ found: boolean; entry?: VaultSectionTypes['fullEntry'] }>('get', { id }),\n add: (patch) => invoke<VaultSectionTypes['summaryEntry']>('add', { patch }),\n update: (id, patch) => invoke<{ found: boolean; entry?: VaultSectionTypes['summaryEntry'] }>('update', { id, patch }),\n remove: (id) => invoke<{ deleted: boolean }>('delete', { id }),\n purge: (id) => invoke<{ purged: boolean }>('purge', { id }),\n trash: () => invoke<{ entries: VaultSectionTypes['entries'] }>('trash').then(r => r.entries),\n rotation: () => invoke<{ entries: unknown[] }>('rotation').then(r => r.entries),\n history: () => invoke<{ events: unknown[] }>('history').then(r => r.events),\n stats: () => invoke<Record<string, unknown>>('stats'),\n recent: () => invoke<{ entries: unknown[] }>('recent').then(r => r.entries),\n backupStatus: () => invoke<{ daysSinceBackup: number; backups: number }>('backupStatus'),\n backup: (maxBackups) => invoke<{ path: string; kept: number; pruned: number }>('backup', { ...(maxBackups !== undefined ? { maxBackups } : {}) }),\n health: () => invoke<{ weak: unknown[]; reused: unknown[]; strength: { weak: number; fair: number; strong: number }; no2fa: unknown[]; httpSites: unknown[]; score: number; verdict: string }>('health'),\n duplicates: () => invoke<{ groups: number }>('duplicates'),\n status: () => invoke<{ locked: boolean; entries: number }>('status'),\n switchVault: (name) => invoke<{ switched: boolean; name: string }>('switchVault', { name }),\n listVaults: () => invoke<Array<{ name: string; active: boolean; entries?: number }>>('listVaults'),\n touch: (id) => invoke<{ touched: boolean }>('touch', { id }),\n setFavorite: (id, favorite) => invoke<{ found: boolean }>('setFavorite', { id, favorite }),\n attachments: (id) => invoke<{ found: boolean; attachments: Array<{ name: string; size: number }> }>('attachments', { id }),\n detach: (id, name) => invoke<{ found: boolean; detached: boolean }>('detach', { id, name }),\n lock: () => invoke<{ locked: boolean }>('lock'),\n unlock: () => invoke<{ locked: boolean }>('unlock'),\n totpUri: (id) => invoke<{ uri: string }>('totpUri', { id }),\n tags: () => invoke<Array<{ name: string; count: number }>>('tags'),\n renameTag: (from, to) => invoke<{ renamed: number }>('renameTag', { from, to }),\n generatorHistory: () => invoke<Array<{ password: string; at: number }>>('generatorHistory'),\n backups: (limit) => invoke<Array<{ path: string; at: number; vaultName: string; size: number }>>('backups', { limit: limit ?? 5 }),\n deleteBackup: (path) => invoke<{ deleted: boolean; path: string }>('deleteBackup', { path }),\n restoreBackup: (path, mode, overwrite) => invoke<{ entries: number; safetyBackup: string; note: string; added?: number; skipped?: number; updated?: number }>('restoreBackup', { path, mode: mode ?? 'merge', overwrite: overwrite ?? false }),\n importChrome: (overwrite) => invoke<{ added: number; skipped: number; updated: number; note: string }>('importChrome', { overwrite: overwrite ?? false }),\n importFirefox: (masterPassword, overwrite) => invoke<{ added: number; skipped: number; updated: number; note: string }>('importFirefox', { masterPassword: masterPassword ?? '', overwrite: overwrite ?? false }),\n keychainImport: (options) => invoke<{ added: number; skipped: number; updated: number; note: string }>('keychainImport', { options: options ?? {} }),\n import1password: (path, overwrite, dryRun) => invoke<{ added: number; skipped: number; updated: number; note: string }>('import1password', { path, overwrite: overwrite ?? false, dryRun: dryRun ?? false }),\n importManagerCsv: (path, overwrite, dryRun) => invoke<{ added: number; skipped: number; updated: number; note: string }>('importManagerCsv', { path, overwrite: overwrite ?? false, dryRun: dryRun ?? false }),\n importEnpass: (path, overwrite, dryRun) => invoke<{ added: number; skipped: number; updated: number; note: string }>('importEnpass', { path, overwrite: overwrite ?? false, dryRun: dryRun ?? false }),\n importBitwarden: (path, overwrite, dryRun) => invoke<{ added: number; skipped: number; updated: number; note: string }>('importBitwarden', { path, overwrite: overwrite ?? false, dryRun: dryRun ?? false }),\n import1pif: (path, overwrite, dryRun) => invoke<{ added: number; skipped: number; updated: number; note: string }>('import1pif', { path, overwrite: overwrite ?? false, dryRun: dryRun ?? false }),\n importBitwardenEncrypted: (path, password, overwrite, dryRun) => invoke<{ added: number; skipped: number; updated: number; note: string }>('importBitwardenEncrypted', { path, password, overwrite: overwrite ?? false, dryRun: dryRun ?? false }),\n importKeePassXml: (path, overwrite, dryRun) => invoke<{ added: number; skipped: number; updated: number; note: string }>('importKeePassXml', { path, overwrite: overwrite ?? false, dryRun: dryRun ?? false }),\n importKdbx: (path, password, keyfile, overwrite, dryRun) => invoke<{ added: number; skipped: number; updated: number; note: string }>('importKdbx', { path, password: password ?? '', keyfile: keyfile ?? '', overwrite: overwrite ?? false, dryRun: dryRun ?? false }),\n searchSystem: (query, source, limit) => invoke<{ matches: Array<{ source: string; name: string; username: string }>; note: string }>('searchSystem', { query, source: source ?? 'all', limit: limit ?? 15 }),\n verifyAll: () => invoke<Array<{ id: string; title: string; issues: string[] }>>('verifyAll'),\n breachCheck: (online) => invoke<{ checked: number; pwned: Array<{ id: string; title: string; count: number }>; weak: Array<{ id: string; title: string }>; offline: boolean }>('breachCheck', { online: online ?? true }),\n generatePassword: (options) => invoke<{ password: string }>('generatePassword', { options: options ?? {} }),\n strength: (password) => invoke<{ score: number; verdict: string; feedback: string; bits: number }>('strength', { password }),\n templates: () => invoke<Array<{ name: string; kind: string; fields: Record<string, string> }>>('templates'),\n saveTemplate: (name, kind, fields) => invoke<{ saved: boolean }>('saveTemplate', { name, kind, fields }),\n generateUsername: () => invoke<{ username: string }>('generateUsername'),\n duplicateGroups: () => invoke<Array<Array<{ id: string; title: string }>>>('duplicateGroups'),\n merge: (fromId, toId, keepSource) => invoke<{ found: boolean }>('merge', { fromId, toId, keepSource: keepSource ?? false }),\n restore: (id) => invoke<{ restored: boolean }>('restore', { id }),\n undeleteAll: () => invoke<{ restored: number }>('undeleteAll'),\n totp: (id) => invoke<{ code: string; label?: string; secondsRemaining: number }>('totp', { id }),\n sessionOpen: (url) => invoke<{ sessionId: string; url: string }>('sessionOpen', { url }),\n sessionCollect: (sessionId, url) => invoke<{ cookies: unknown[]; count: number }>('sessionCollect', { sessionId, url: url ?? '' }),\n sessionClose: (sessionId) => invoke<{ closed: boolean }>('sessionClose', { sessionId }),\n sessionListOpen: () => invoke<Array<{ sessionId: string; url: string; openedAt: number }>>('sessionListOpen'),\n sessionListSaved: () => invoke<Array<{ id: string; title: string; url?: string; cookieCount: number; expiredCount?: number; expiringSoon?: number; updatedAt?: number }>>('sessionListSaved'),\n sessionSave: (options) => invoke<{ saved: number; id: string }>('sessionSave', { options: options ?? {} }),\n sessionExport: (id, format) => invoke<{ text: string; cookieCount: number; domains: string[] }>('sessionExport', { id, format: format ?? 'header' }),\n sessionGet: (id) => invoke<{ id: string; title: string; url?: string; cookies: unknown[]; notes?: string }>('sessionGet', { id }),\n sessionPrune: (id, preview) => invoke<{ pruned: number; remaining: number; note: string }>('sessionPrune', { id, preview: preview ?? false }),\n watchtower: () => invoke<Array<{ id: string; title: string; kind: string; flags: string[]; score: number; verdict: string; bits?: number }>>('watchtower'),\n export1pux: (path) => invoke<{ path: string; count: number }>('export1pux', { path }),\n exportBitwarden: (path) => invoke<{ path: string; count: number }>('exportBitwarden', { path }),\n recoveryCode: () => invoke<{ code: string; note: string }>('recoveryCode'),\n verifyRecovery: (code) => invoke<{ verified: boolean }>('verifyRecovery', { code }),\n recoveryStatus: () => invoke<{ set: boolean; issuedAt?: number }>('recoveryStatus'),\n vaultRename: (from, to) => invoke<{ renamed: boolean; from?: string; to?: string; vaults: Array<{ name: string; active: boolean }>; note: string }>('vaultRename', { from, to }),\n vaultDelete: (name, confirm) => invoke<{ deleted: boolean; name?: string; active: string; vaults: Array<{ name: string; active: boolean }>; note: string }>('vaultDelete', { name, confirm }),\n })\n\n ctx.slots.inject('settings.section', () => ctx.slots.register({\n name: 'settings.section',\n id: 'vault',\n order: 30,\n label: () => t('nav'),\n inject: injected,\n }, VaultSection))\n}\n"],"mappings":"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"}
|