feat: cloud native file browser, settings Claude auth, deploy hardening

- Add native Cloud file browser with FileBrowser API integration
- Add cloud store, filebrowser-client, useAudioPlayer, useFileType composables
- Add Cloud components: FileGrid, FileCard, FileCardGrid, CloudToolbar
- Add Claude authentication section to Settings with OAuth status check
- Harden deploy script to preserve /aiui/ and claude-login.html
- Add nginx proxies for btcpay, homeassistant, filebrowser (HTTPS block)
- Add app configs for filebrowser, searxng, penpot in package.rs
- Update goal progress tracking with app aliases
- Improve mobile back button composable with ResizeObserver
- Update various views with cloud integration and UI refinements

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Dorian
2026-03-04 23:05:01 +00:00
co-authored by Claude Opus 4.6
parent 173bf8fc0f
commit d7ff678e9d
26 changed files with 2053 additions and 265 deletions
+15 -2
View File
@@ -215,13 +215,26 @@ function isStepCompleted(step: GoalStep): boolean {
return completedSteps.value.has(step.id)
}
/** App ID aliases — backend may register under variant names */
const APP_ALIASES: Record<string, string[]> = {
immich: ['immich-server', 'immich-app', 'immich_server'],
nextcloud: ['nextcloud-aio', 'nextcloud-server'],
'bitcoin-knots': ['bitcoin', 'bitcoin-core'],
}
function matchesAppId(pkgId: string, appId: string): boolean {
if (pkgId === appId) return true
const aliases = APP_ALIASES[appId]
return aliases ? aliases.includes(pkgId) : false
}
function isAppInstalled(appId: string): boolean {
return Object.keys(appStore.packages).some((pkgId) => pkgId === appId)
return Object.keys(appStore.packages).some((pkgId) => matchesAppId(pkgId, appId))
}
function isAppRunning(appId: string): boolean {
return Object.entries(appStore.packages).some(
([pkgId, pkg]) => pkgId === appId && pkg.state === 'running',
([pkgId, pkg]) => matchesAppId(pkgId, appId) && pkg.state === 'running',
)
}