Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
60 commits
Select commit Hold shift + click to select a range
de990c3
feat(auth): wave 1 - login route contract, cookie TDD, loading state,…
ding113 Feb 17, 2026
44f5f45
feat(login): wave 2 - redirect safety, visual redesign, footer integr…
ding113 Feb 17, 2026
dbff799
refactor(auth): wave 3 - role metadata, cookie constant unification, …
ding113 Feb 17, 2026
bf4372d
test(login): wave 4 - regression matrix, quality gates, stabilization
ding113 Feb 17, 2026
9b561a0
feat(security): wave 5 - session contract, store, cookie hardening, a…
ding113 Feb 17, 2026
8f51447
feat(security): wave 6 - opaque session login, dual-read auth, logout…
ding113 Feb 17, 2026
f312071
feat(security): wave 7 - security headers integration, regression sui…
ding113 Feb 17, 2026
bea43b4
feat(auth): switch session token mode to opaque by default
ding113 Feb 18, 2026
713b921
fix(test): hoist mock fns to survive vitest mockReset between tests
ding113 Feb 18, 2026
e732fe8
refactor(auth): use Web Crypto API for session ID generation
ding113 Feb 18, 2026
228b61d
feat(provider): add batch patch operation types
ding113 Feb 18, 2026
e309280
feat(provider): add batch patch validation and normalization
ding113 Feb 18, 2026
1b00961
test(provider): add batch patch contract validation tests
ding113 Feb 18, 2026
7e15d53
feat(auth): add admin token session support for virtual user
ding113 Feb 18, 2026
26fe96d
test(auth): add admin token session validation tests
ding113 Feb 18, 2026
2352e5e
refactor(proxy): delegate session validation to downstream layouts
ding113 Feb 18, 2026
7e62244
test(proxy): add cookie passthrough behavior tests
ding113 Feb 18, 2026
4321621
feat(providers): add batch patch error code constants
ding113 Feb 18, 2026
94d6fea
feat(providers): implement batch patch preview, apply, and undo actions
ding113 Feb 18, 2026
cf594f4
test(providers): add batch patch action contract tests
ding113 Feb 18, 2026
34f2956
fix(security): normalize origin to lowercase in CSRF guard
ding113 Feb 18, 2026
3b362e1
refactor(auth): improve error handling and lazy-load session store
ding113 Feb 18, 2026
ab13853
fix(auth): remove redundant read in session rotation
ding113 Feb 18, 2026
7a34288
fix(auth): reset session store promise on import failure
ding113 Feb 18, 2026
49279e7
test(auth): update import paths and add missing mocks
ding113 Feb 18, 2026
d10a839
chore: format code (feat-security-auth-overhaul-809072b)
github-actions[bot] Feb 18, 2026
1bc45bd
fix(auth): strengthen userId validation in session parser
ding113 Feb 18, 2026
18f3b02
style(auth): format code and fix test expectation
ding113 Feb 18, 2026
0a4dfa7
fix(auth): add type assertion for userId in parseSessionData
github-actions[bot] Feb 18, 2026
d3c3298
feat(i18n): add password visibility and brand tagline translations
ding113 Feb 18, 2026
cf263ba
feat(auth): redesign login page with split panel layout and animations
ding113 Feb 18, 2026
4449554
test(auth): update login page tests for redesigned UI
ding113 Feb 18, 2026
423dcd5
fix(auth): prevent session rotation on expired sessions
ding113 Feb 18, 2026
3f2803f
test(auth): add session expiration and rotation edge case coverage
ding113 Feb 18, 2026
066c2b4
perf(security): add memory-bounded sweep for login abuse tracking
ding113 Feb 18, 2026
535a290
fix(security): validate CSP report-uri to prevent directive injection
ding113 Feb 18, 2026
f9f50ae
test(security): add case-insensitive origin matching coverage
ding113 Feb 18, 2026
845e2e3
refactor(providers): extract thinking budget editor into reusable com…
ding113 Feb 18, 2026
b1b6bde
feat(providers): add adaptive thinking configuration editor
ding113 Feb 18, 2026
a69562e
refactor(providers): use extracted thinking budget editor in routing …
ding113 Feb 18, 2026
a9c7ff5
feat(providers): add in-memory undo snapshot store with TTL
ding113 Feb 18, 2026
57a378b
feat(providers): support advanced routing fields in batch updates
ding113 Feb 18, 2026
2021e90
test(settings): add adaptive thinking editor component tests
ding113 Feb 18, 2026
97e35d0
test(settings): add comprehensive tests for adaptive thinking editor
ding113 Feb 18, 2026
bd6be16
fix: remove orphan test code outside describe blocks
github-actions[bot] Feb 18, 2026
29c02c4
test(settings): normalize editor tests to createRoot pattern
ding113 Feb 18, 2026
804a193
feat(providers): extend batch update with 4 advanced routing fields
ding113 Feb 18, 2026
ea4c504
feat(providers): add type/group quick-select to batch toolbar
ding113 Feb 18, 2026
ae16ef5
fix: remove unused import and fix formatting
ding113 Feb 18, 2026
eea64ff
feat(providers): generate per-provider preview rows with field compat…
ding113 Feb 18, 2026
f212e2e
refactor(providers): remove FieldToggle, add 9-field sectioned batch …
ding113 Feb 18, 2026
1c145df
feat(providers): implement apply engine with DB writes, preimage capt…
ding113 Feb 18, 2026
5211951
feat(providers): implement undo engine with preimage grouping and per…
ding113 Feb 18, 2026
2aaba44
feat(providers,security): add batch preview step, patch draft builder…
ding113 Feb 18, 2026
9bb35cd
chore: format code (feat-security-auth-overhaul-a6f2c5a)
github-actions[bot] Feb 18, 2026
e418d18
feat(providers): add undo support for single and batch provider deletion
ding113 Feb 18, 2026
381be07
feat(providers): add undo support for single provider edits
ding113 Feb 19, 2026
64fa5e8
test(providers): add tests for batch delete undo and provider restore
ding113 Feb 19, 2026
10e9e4d
test(providers): add tests for FormTabNav and ProviderBatchToolbar co…
ding113 Feb 19, 2026
4a0f06e
feat(security): add Redis KV store, harden auth and undo system
ding113 Feb 19, 2026
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
8 changes: 7 additions & 1 deletion messages/en/auth.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
{
"form": {
"title": "Login Panel",
"description": "Access the unified admin console with your API Key"
"description": "Access the unified admin console with your API Key",
"apiKeyLabel": "API Key",
"showPassword": "Show password",
"hidePassword": "Hide password"
},
"login": {
"title": "Login",
Expand All @@ -20,6 +23,9 @@
"placeholders": {
"apiKeyExample": "e.g. sk-xxxxxxxx"
},
"brand": {
"tagline": "Unified API management console"
},
"actions": {
"enterConsole": "Enter Console",
"viewUsageDoc": "View Usage Documentation"
Expand Down
68 changes: 65 additions & 3 deletions messages/en/settings/providers/batchEdit.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,10 @@
"invertSelection": "Invert",
"selectedCount": "{count} selected",
"editSelected": "Edit Selected",
"selectByType": "Select by Type",
"selectByTypeItem": "{type} ({count})",
"selectByGroup": "Select by Group",
"selectByGroupItem": "{group} ({count})",
"actions": {
"edit": "Edit",
"delete": "Delete",
Expand All @@ -20,12 +24,33 @@
"next": "Next",
"noFieldEnabled": "Please enable at least one field to update"
},
"sections": {
"basic": "Basic Settings",
"routing": "Group & Routing",
"anthropic": "Anthropic Settings"
},
"fields": {
"isEnabled": "Status",
"isEnabled": {
"label": "Status",
"noChange": "No Change",
"enable": "Enable",
"disable": "Disable"
},
"priority": "Priority",
"weight": "Weight",
"costMultiplier": "Cost Multiplier",
"groupTag": "Group Tag"
"groupTag": {
"label": "Group Tag",
"clear": "Clear"
},
"modelRedirects": "Model Redirects",
"allowedModels": "Allowed Models",
"thinkingBudget": "Thinking Budget",
"adaptiveThinking": "Adaptive Thinking"
},
"affectedProviders": {
"title": "Affected Providers",
"more": "+{count} more"
},
"confirm": {
"title": "Confirm Operation",
Expand All @@ -34,10 +59,47 @@
"goBack": "Go Back",
"processing": "Processing..."
},
"preview": {
"title": "Preview Changes",
"description": "Review changes before applying to {count} providers",
"providerHeader": "{name}",
"fieldChanged": "{field}: {before} -> {after}",
"fieldSkipped": "{field}: Skipped ({reason})",
"excludeProvider": "Exclude",
"summary": "{providerCount} providers, {fieldCount} changes, {skipCount} skipped",
"noChanges": "No changes to apply",
"apply": "Apply Changes",
"back": "Back to Edit",
"loading": "Generating preview..."
},
"batchNotes": {
"codexOnly": "Codex only",
"claudeOnly": "Claude only",
"geminiOnly": "Gemini only"
},
"selectionHint": "Select multiple providers for batch operations",
"undo": {
"button": "Undo",
"success": "Operation undone successfully",
"expired": "Undo expired",
"batchDeleteSuccess": "Deleted {count} providers",
"batchDeleteUndone": "Restored {count} providers",
"singleDeleteSuccess": "Provider deleted",
"singleDeleteUndone": "Provider restored",
"singleEditSuccess": "Provider updated",
"singleEditUndone": "Changes reverted",
"failed": "Undo failed"
},
"toast": {
"updated": "Updated {count} providers",
"deleted": "Deleted {count} providers",
"circuitReset": "Reset {count} circuit breakers",
"failed": "Operation failed: {error}"
"failed": "Operation failed: {error}",
"undo": "Undo",
"undoSuccess": "Reverted {count} providers",
"undoFailed": "Undo failed: {error}",
"undoExpired": "Undo window expired",
"previewFailed": "Preview failed: {error}",
"unknownError": "Unknown error"
}
}
8 changes: 7 additions & 1 deletion messages/ja/auth.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
{
"form": {
"title": "ログインパネル",
"description": "API キーを使用して統一管理コンソールにアクセスします"
"description": "API キーを使用して統一管理コンソールにアクセスします",
"apiKeyLabel": "API Key",
"showPassword": "パスワードを表示",
"hidePassword": "パスワードを非表示"
},
"login": {
"title": "ログイン",
Expand All @@ -20,6 +23,9 @@
"placeholders": {
"apiKeyExample": "例: sk-xxxxxxxx"
},
"brand": {
"tagline": "統合API管理コンソール"
},
Comment on lines +26 to +28
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

同一页面内术语不一致:brand.taglineform.description 用词不统一。

brand.tagline(第 27 行)使用「統合」(tōgō,统合/集成),而同文件 form.description(第 4 行)使用「統一」(tōitsu,统一/单一化)来指代同一个控制台。两词在日语中含义有所不同,用户在同一登录页面会看到两种不同说法,可能产生困惑。对比 zh-CN/auth.json,两处均使用「统一」,建议日语保持一致。

🔧 建议修复(以统一使用「統合」为例,或参照英文原文确认规范术语后再定)
-    "description": "API キーを使用して統一管理コンソールにアクセスします",
+    "description": "API キーを使用して統合管理コンソールにアクセスします",

或统一改为「統一」:

-    "tagline": "統合API管理コンソール"
+    "tagline": "統一API管理コンソール"
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@messages/ja/auth.json` around lines 26 - 28, brand.tagline currently uses
"統合" while form.description uses "統一", causing inconsistent terminology on the
same page; pick the correct canonical term (either "統合" or "統一") based on
zh-CN/EN source or product style, then update the value of "brand.tagline" or
"form.description" so both use the same term; ensure you change the string only
(preserve JSON structure) and verify the keys "brand.tagline" and
"form.description" match the chosen terminology across the file.

"actions": {
"enterConsole": "コンソールに入る",
"viewUsageDoc": "使用方法を見る"
Expand Down
68 changes: 65 additions & 3 deletions messages/ja/settings/providers/batchEdit.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,10 @@
"invertSelection": "反転",
"selectedCount": "{count} 件選択中",
"editSelected": "選択項目を編集",
"selectByType": "タイプで選択",
"selectByTypeItem": "{type} ({count})",
"selectByGroup": "グループで選択",
"selectByGroupItem": "{group} ({count})",
"actions": {
"edit": "編集",
"delete": "削除",
Expand All @@ -20,12 +24,33 @@
"next": "次へ",
"noFieldEnabled": "更新するフィールドを少なくとも1つ有効にしてください"
},
"sections": {
"basic": "基本設定",
"routing": "グループとルーティング",
"anthropic": "Anthropic 設定"
},
"fields": {
"isEnabled": "ステータス",
"isEnabled": {
"label": "ステータス",
"noChange": "変更なし",
"enable": "有効",
"disable": "無効"
},
"priority": "優先度",
"weight": "重み",
"costMultiplier": "価格倍率",
"groupTag": "グループタグ"
"groupTag": {
"label": "グループタグ",
"clear": "クリア"
},
"modelRedirects": "モデルリダイレクト",
"allowedModels": "許可モデル",
"thinkingBudget": "思考バジェット",
"adaptiveThinking": "アダプティブ思考"
},
"affectedProviders": {
"title": "影響を受けるプロバイダー",
"more": "+{count} 件"
},
"confirm": {
"title": "操作の確認",
Expand All @@ -34,10 +59,47 @@
"goBack": "戻る",
"processing": "処理中..."
},
"preview": {
"title": "変更のプレビュー",
"description": "{count} 件のプロバイダーに適用する前に変更内容を確認してください",
"providerHeader": "{name}",
"fieldChanged": "{field}: {before} -> {after}",
"fieldSkipped": "{field}: スキップ ({reason})",
"excludeProvider": "除外",
"summary": "{providerCount} 件のプロバイダー, {fieldCount} 件の変更, {skipCount} 件スキップ",
"noChanges": "適用する変更はありません",
"apply": "変更を適用",
"back": "編集に戻る",
"loading": "プレビューを生成中..."
},
"batchNotes": {
"codexOnly": "Codex のみ",
"claudeOnly": "Claude のみ",
"geminiOnly": "Gemini のみ"
},
"selectionHint": "複数のプロバイダーを選択して一括操作を実行",
"undo": {
"button": "元に戻す",
"success": "操作が正常に元に戻されました",
"expired": "元に戻す期限が切れました",
"batchDeleteSuccess": "{count} 件のプロバイダーを削除しました",
"batchDeleteUndone": "{count} 件のプロバイダーを復元しました",
"singleDeleteSuccess": "プロバイダーを削除しました",
"singleDeleteUndone": "プロバイダーを復元しました",
"singleEditSuccess": "プロバイダーを更新しました",
"singleEditUndone": "変更を元に戻しました",
"failed": "元に戻すことに失敗しました"
},
"toast": {
"updated": "{count} 件のプロバイダーを更新しました",
"deleted": "{count} 件のプロバイダーを削除しました",
"circuitReset": "{count} 件のサーキットブレーカーをリセットしました",
"failed": "操作に失敗しました: {error}"
"failed": "操作に失敗しました: {error}",
"undo": "元に戻す",
"undoSuccess": "{count} 件のプロバイダーを復元しました",
"undoFailed": "元に戻す操作に失敗しました: {error}",
"undoExpired": "元に戻す期限が切れました",
"previewFailed": "プレビューに失敗しました: {error}",
"unknownError": "不明なエラー"
}
}
8 changes: 7 additions & 1 deletion messages/ru/auth.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
{
"form": {
"title": "Панель входа",
"description": "Введите ваш API ключ для доступа к данным"
"description": "Введите ваш API ключ для доступа к данным",
"apiKeyLabel": "API Key",
"showPassword": "Показать пароль",
"hidePassword": "Скрыть пароль"
},
"login": {
"title": "Вход",
Expand All @@ -20,6 +23,9 @@
"placeholders": {
"apiKeyExample": "например sk-xxxxxxxx"
},
"brand": {
"tagline": "Единая консоль управления API"
},
"actions": {
"enterConsole": "Перейти в консоль",
"viewUsageDoc": "Просмотреть документацию"
Expand Down
68 changes: 65 additions & 3 deletions messages/ru/settings/providers/batchEdit.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,10 @@
"invertSelection": "Инвертировать",
"selectedCount": "Выбрано: {count}",
"editSelected": "Редактировать выбранные",
"selectByType": "Выбрать по типу",
"selectByTypeItem": "{type} ({count})",
"selectByGroup": "Выбрать по группе",
"selectByGroupItem": "{group} ({count})",
"actions": {
"edit": "Редактировать",
"delete": "Удалить",
Expand All @@ -20,12 +24,33 @@
"next": "Далее",
"noFieldEnabled": "Пожалуйста, включите хотя бы одно поле для обновления"
},
"sections": {
"basic": "Основные настройки",
"routing": "Группы и маршрутизация",
"anthropic": "Настройки Anthropic"
},
"fields": {
"isEnabled": "Статус",
"isEnabled": {
"label": "Статус",
"noChange": "Без изменений",
"enable": "Включить",
"disable": "Отключить"
},
"priority": "Приоритет",
"weight": "Вес",
"costMultiplier": "Множитель стоимости",
"groupTag": "Тег группы"
"groupTag": {
"label": "Тег группы",
"clear": "Очистить"
},
"modelRedirects": "Перенаправление моделей",
"allowedModels": "Разрешённые модели",
"thinkingBudget": "Бюджет мышления",
"adaptiveThinking": "Адаптивное мышление"
},
"affectedProviders": {
"title": "Затронутые поставщики",
"more": "+{count} ещё"
},
"confirm": {
"title": "Подтвердите операцию",
Expand All @@ -34,10 +59,47 @@
"goBack": "Назад",
"processing": "Обработка..."
},
"preview": {
"title": "Предпросмотр изменений",
"description": "Проверьте изменения перед применением к {count} поставщикам",
"providerHeader": "{name}",
"fieldChanged": "{field}: {before} -> {after}",
"fieldSkipped": "{field}: Пропущено ({reason})",
"excludeProvider": "Исключить",
"summary": "{providerCount} поставщиков, {fieldCount} изменений, {skipCount} пропущено",
"noChanges": "Нет изменений для применения",
"apply": "Применить изменения",
"back": "Вернуться к редактированию",
"loading": "Генерация предпросмотра..."
},
"batchNotes": {
"codexOnly": "Только Codex",
"claudeOnly": "Только Claude",
"geminiOnly": "Только Gemini"
},
"selectionHint": "Выберите нескольких поставщиков для массовых операций",
"undo": {
"button": "Отменить",
"success": "Операция успешно отменена",
"expired": "Время отмены истекло",
"batchDeleteSuccess": "Удалено поставщиков: {count}",
"batchDeleteUndone": "Восстановлено поставщиков: {count}",
"singleDeleteSuccess": "Поставщик удалён",
"singleDeleteUndone": "Поставщик восстановлен",
"singleEditSuccess": "Поставщик обновлён",
"singleEditUndone": "Изменения отменены",
"failed": "Ошибка отмены"
},
"toast": {
"updated": "Обновлено поставщиков: {count}",
"deleted": "Удалено поставщиков: {count}",
"circuitReset": "Сброшено прерывателей: {count}",
"failed": "Операция не удалась: {error}"
"failed": "Операция не удалась: {error}",
"undo": "Отменить",
"undoSuccess": "Восстановлено поставщиков: {count}",
"undoFailed": "Отмена не удалась: {error}",
"undoExpired": "Время отмены истекло",
"previewFailed": "Предпросмотр не удался: {error}",
"unknownError": "Неизвестная ошибка"
}
}
8 changes: 7 additions & 1 deletion messages/zh-CN/auth.json
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,9 @@
"placeholders": {
"apiKeyExample": "例如 sk-xxxxxxxx"
},
"brand": {
"tagline": "统一 API 管理控制台"
},
"actions": {
"enterConsole": "进入控制台",
"viewUsageDoc": "查看使用文档"
Expand All @@ -41,6 +44,9 @@
},
"form": {
"title": "登录面板",
"description": "使用您的 API Key 进入统一控制台"
"description": "使用您的 API Key 进入统一控制台",
"apiKeyLabel": "API Key",
"showPassword": "显示密码",
"hidePassword": "隐藏密码"
}
}
Loading
Loading