Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,15 @@ Write each change in both `### English` and `### 中文` under `## Unreleased`.
- Add named client API keys with optional provider allowlists, and show the console administrator key on System
- Store an empty client-key provider allowlist as `[]` instead of JSON `null`
- Keep the v0.2.20 bytes for provider-model settings migration 007, and accept the later tab-indented checksum so existing databases can boot
- Explain on System when the host updater is missing, instead of showing the raw Unix socket error

### 中文

- Logs 和模型页的筛选下拉改用紧凑 HeroUI Select,高度对齐 32px 工具栏
- 新增可限制供应商的客户端 API 密钥,并在系统页显示控制台管理员密钥
- 客户端密钥未限制供应商时写入 `[]`,不再存成 JSON `null`
- 007 供应商模型设置迁移保持 v0.2.20 原文,并接受后来误改缩进后的 checksum,已有数据库可以启动
- 系统页在没有宿主机更新器时说明更新条件,不再直接显示 Unix socket 报错

## 0.2.20 - 2026-08-29

Expand Down
14 changes: 12 additions & 2 deletions frontend/src/i18n/messages.ts
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,12 @@ export const messages: Record<Lang, Dict> = {
releaseNotes: 'Release notes',
updateNoNotes: 'No release notes were provided.',
updaterReady: 'Host updater connected',
updaterUnavailable: 'Host updater unavailable',
updaterUnavailable: 'Host updater not connected',
updaterNeedsHost: 'This process cannot replace its own container',
updaterUnavailableHint: 'Console updates need a host updater next to Docker. This page can check GitHub, but it cannot recreate the container until that daemon is connected.',
updaterNeedInstall: 'Install the host updater from deploy/install-updater.sh or deploy/install-updater.ps1 so it can talk to Docker.',
updaterNeedCompose: 'Linux needs the updater socket mounted into the container. Docker Desktop uses a loopback updater URL instead of a Unix socket.',
updaterNeedRelease: 'The running build must be a published GitHub release, not a local or development image.',
updateNow: 'Update now',
updateReloadingIn: 'Updating… refresh in {seconds}s',
sqliteProtection: 'SQLite protection',
Expand Down Expand Up @@ -524,7 +529,12 @@ export const messages: Record<Lang, Dict> = {
releaseNotes: '版本说明',
updateNoNotes: '该版本暂无说明。',
updaterReady: '宿主机更新器已连接',
updaterUnavailable: '宿主机更新器不可用',
updaterUnavailable: '未连接宿主机更新器',
updaterNeedsHost: '当前进程不能替换自己的容器',
updaterUnavailableHint: '控制台更新需要宿主机上的更新器来操作 Docker。这一页可以检查 GitHub,但更新器没连上时不能重建容器。',
updaterNeedInstall: '用 deploy/install-updater.sh 或 deploy/install-updater.ps1 安装宿主机更新器,让它能调用 Docker。',
updaterNeedCompose: 'Linux 需要把更新器 socket 挂进容器。Docker Desktop 用本机回环地址,而不是 Unix socket。',
updaterNeedRelease: '当前运行的必须是已发布的 GitHub Release,不能是本地或开发镜像。',
updateNow: '立即更新',
updateReloadingIn: '更新中… {seconds}s 后刷新',
sqliteProtection: 'SQLite 保护',
Expand Down
13 changes: 11 additions & 2 deletions frontend/src/pages/SystemPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -236,11 +236,20 @@ export function SystemPage() {
<div className="flex items-center justify-between gap-3">
<div>
<h3 className="font-semibold">{t('updateStatus')}</h3>
<p className="mt-1 text-xs text-[var(--app-faint)]">{info?.agent?.job_id || t('noUpdateJob')}</p>
<p className="mt-1 text-xs text-[var(--app-faint)]">{info?.agent?.job_id || (info?.agent?.available ? t('noUpdateJob') : t('updaterNeedsHost'))}</p>
</div>
<Chip size="sm" variant="soft" color={statusColor(agentState)}>{stateLabel}</Chip>
</div>
{info?.agent?.error ? <p className="mt-4 text-xs leading-5 text-[var(--app-danger)]">{info.agent.error}</p> : null}
{info?.agent?.available ? null : (
<div className="mt-4 space-y-2 text-xs leading-5 text-[var(--app-muted)]">
<p>{t('updaterUnavailableHint')}</p>
<ul className="list-disc space-y-1 pl-4 text-[var(--app-faint)]">
<li>{t('updaterNeedInstall')}</li>
<li>{t('updaterNeedCompose')}</li>
<li>{t('updaterNeedRelease')}</li>
</ul>
</div>
)}
</Card>
</div>
</div>
Expand Down

Large diffs are not rendered by default.

Large diffs are not rendered by default.

4 changes: 2 additions & 2 deletions internal/webui/static/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link href="https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500&family=Outfit:wght@400;500;600;700&display=swap" rel="stylesheet" />
<script type="module" crossorigin src="/assets/index-C1Ful2UA.js"></script>
<link rel="stylesheet" crossorigin href="/assets/index-DWhSA4d5.css">
<script type="module" crossorigin src="/assets/index-bG_dUq1A.js"></script>
<link rel="stylesheet" crossorigin href="/assets/index-DoZvvmrR.css">
</head>
<body>
<div id="root"></div>
Expand Down
Loading