feat: add profile management page with full CRUD UI

- Add frontend API layer, Pinia store, and 5 components (ProfileCard, ProfilesPanel, ProfileCreateModal, ProfileRenameModal, ProfileImportModal)
- Add ProfilesView page with card grid layout and expandable details
- Modify export endpoint to stream file as browser download instead of returning server path
- Add sidebar nav entry, router route, and i18n translations (en/zh)
- Support create, rename, delete, switch (with gateway restart), export, and import profiles

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
ekko
2026-04-16 09:40:25 +08:00
parent 57ef171dda
commit 04b80a616e
13 changed files with 1081 additions and 4 deletions
+48
View File
@@ -31,6 +31,9 @@ export default {
disable: 'Disable',
configured: 'Configured',
notConfigured: 'Not configured',
confirm: 'Confirm',
expand: 'Expand',
collapse: 'Collapse',
},
// Sidebar
@@ -38,6 +41,7 @@ export default {
chat: 'Chat',
jobs: 'Jobs',
models: 'Models',
profiles: 'Profiles',
skills: 'Skills',
memory: 'Memory',
logs: 'Logs',
@@ -197,6 +201,50 @@ export default {
fetchFailed: 'Failed to fetch models',
},
// Profiles
profiles: {
title: 'Profiles',
create: 'Create Profile',
import: 'Import',
export: 'Export',
rename: 'Rename',
delete: 'Delete',
switchTo: 'Switch to',
switchConfirm: 'Switching to profile "{name}" will restart the gateway. Continue?',
switchSuccess: 'Switched to profile "{name}"',
switchFailed: 'Failed to switch profile. Gateway may need manual restart.',
createSuccess: 'Profile "{name}" created',
createFailed: 'Failed to create profile',
renameSuccess: 'Profile renamed',
renameFailed: 'Failed to rename profile',
deleteConfirm: 'Are you sure you want to delete profile "{name}"?',
deleteSuccess: 'Profile deleted',
deleteFailed: 'Failed to delete profile',
exportSuccess: 'Profile exported',
exportFailed: 'Failed to export profile',
importSuccess: 'Profile imported',
importFailed: 'Failed to import profile',
name: 'Profile Name',
namePlaceholder: 'Enter profile name',
newName: 'New Name',
newNamePlaceholder: 'Enter new name',
cloneFromCurrent: 'Clone from current profile',
archivePath: 'Archive Path',
archivePathPlaceholder: 'Server path to archive file',
importName: 'Profile Name (optional)',
importNamePlaceholder: 'Leave empty to use archive name',
active: 'Active',
model: 'Model',
gateway: 'Gateway',
alias: 'Alias',
provider: 'Provider',
path: 'Path',
skills: 'Skills',
hasEnv: 'Has .env',
hasSoulMd: 'Has soul.md',
noProfiles: 'No profiles found. Create one to get started.',
},
// Logs
logs: {
title: 'Logs',