Phase 004: remove the desktop shell, website tooling, and bundled hermes CLI

- Drop all desktop/Electron branches, scripts, and UI (title bar, pets,
  desktop bridge); LAN endpoint kind is now web/custom only
- Replace the bundled hermes CLI with user-side installation: add
  GET /api/hermes/cli-status plus a HermesMissingView onboarding guide
- Remove the version-management UI (snapshots handled by git) and prune
  dead website/mcu/claude scripts and lockfile entries
This commit is contained in:
2026-10-16 15:33:56 +08:00
parent 8c1ddf415f
commit 4701bf0ad0
49 changed files with 354 additions and 2403 deletions
@@ -10,7 +10,6 @@ import ModelSelector from "@/components/layout/ModelSelector.vue";
import ProfileSelector from "@/components/layout/ProfileSelector.vue";
import LanguageSwitch from "@/components/layout/LanguageSwitch.vue";
import ThemeSwitch from "@/components/layout/ThemeSwitch.vue";
import VersionManagementModal from "@/components/layout/VersionManagementModal.vue";
import { changelog } from "@/data/changelog";
import { getStoredUsername, isStoredSuperAdmin } from "@/api/client";
@@ -25,11 +24,7 @@ const selectedKey = computed(() => {
const isSuperAdmin = computed(() => isStoredSuperAdmin());
const currentUsername = computed(() => getStoredUsername());
const isVersionPreview = import.meta.env.VITE_HERMES_PREVIEW === '1';
const isDesktopShell = computed(() =>
(window as typeof window & { hermesDesktop?: { isDesktop?: boolean } }).hermesDesktop?.isDesktop === true,
);
const showChangelog = ref(false);
const showVersionManagement = ref(false);
const showDockerUpdateTip = ref(false);
const isDockerRuntime = computed(() => appStore.isDocker);
@@ -87,10 +82,6 @@ function openChangelog() {
showChangelog.value = true;
}
function openVersionManagement() {
showVersionManagement.value = true;
}
function handleDockerUpdateTip() {
showDockerUpdateTip.value = true;
}
@@ -361,20 +352,6 @@ function handleUpdateClick() {
</span>
<ThemeSwitch />
</div>
<NButton
v-if="isDesktopShell"
type="primary"
size="tiny"
block
class="update-btn version-management-btn"
:class="{ 'has-update': appStore.updateAvailable }"
@click="openVersionManagement"
>
<span class="version-management-label">
{{ t('sidebar.versionManagement') }}
<span class="version-update-label">{{ t('sidebar.updateAvailableLabel') }}</span>
</span>
</NButton>
<NButton v-if="appStore.clientOutdated" type="warning" size="tiny" block class="update-btn" @click="handleReloadClient">
{{ t('sidebar.reloadClientVersion', { version: appStore.serverVersion }) }}
</NButton>
@@ -422,7 +399,6 @@ function handleUpdateClick() {
</div>
</div>
</NModal>
<VersionManagementModal v-if="isDesktopShell" v-model:show="showVersionManagement" />
<NModal v-model:show="showDockerUpdateTip" preset="dialog" :title="t('sidebar.dockerUpdateTitle')" style="width: 480px;">
<div class="docker-update-modal">
@@ -695,28 +671,6 @@ function handleUpdateClick() {
border-radius: $radius-sm;
}
.version-management-btn {
.version-management-label {
display: inline-flex;
align-items: center;
justify-content: center;
gap: 6px;
min-width: 0;
}
.version-update-label {
display: none;
flex: 0 0 auto;
color: inherit;
font-size: 11px;
font-weight: 600;
}
&.has-update .version-update-label {
display: inline;
}
}
.changelog-list {
max-height: min(70vh, 640px);
overflow-y: auto;