diff --git a/api/index.go b/api/index.go
deleted file mode 100644
index 147ce32..0000000
--- a/api/index.go
+++ /dev/null
@@ -1,20 +0,0 @@
-package handler
-
-import (
- "net/http"
- "sync"
-
- "ds2api/app"
-)
-
-var (
- once sync.Once
- h http.Handler
-)
-
-func Handler(w http.ResponseWriter, r *http.Request) {
- once.Do(func() {
- h = app.NewHandler()
- })
- h.ServeHTTP(w, r)
-}
diff --git a/internal/httpapi/admin/handler.go b/internal/httpapi/admin/handler.go
index a524593..663feb2 100644
--- a/internal/httpapi/admin/handler.go
+++ b/internal/httpapi/admin/handler.go
@@ -13,7 +13,6 @@ import (
adminrawsamples "ds2api/internal/httpapi/admin/rawsamples"
adminsettings "ds2api/internal/httpapi/admin/settings"
adminshared "ds2api/internal/httpapi/admin/shared"
- adminvercel "ds2api/internal/httpapi/admin/vercel"
adminversion "ds2api/internal/httpapi/admin/version"
)
@@ -33,7 +32,6 @@ func RegisterRoutes(r chi.Router, h *Handler) {
settingsHandler := &adminsettings.Handler{Store: deps.Store, Pool: deps.Pool, DS: deps.DS, OpenAI: deps.OpenAI, ChatHistory: deps.ChatHistory}
proxiesHandler := &adminproxies.Handler{Store: deps.Store, Pool: deps.Pool, DS: deps.DS, OpenAI: deps.OpenAI, ChatHistory: deps.ChatHistory}
rawSamplesHandler := &adminrawsamples.Handler{Store: deps.Store, Pool: deps.Pool, DS: deps.DS, OpenAI: deps.OpenAI, ChatHistory: deps.ChatHistory}
- vercelHandler := &adminvercel.Handler{Store: deps.Store, Pool: deps.Pool, DS: deps.DS, OpenAI: deps.OpenAI, ChatHistory: deps.ChatHistory}
historyHandler := &adminhistory.Handler{Store: deps.Store, Pool: deps.Pool, DS: deps.DS, OpenAI: deps.OpenAI, ChatHistory: deps.ChatHistory}
devCaptureHandler := &admindevcapture.Handler{Store: deps.Store, Pool: deps.Pool, DS: deps.DS, OpenAI: deps.OpenAI, ChatHistory: deps.ChatHistory}
versionHandler := &adminversion.Handler{Store: deps.Store, Pool: deps.Pool, DS: deps.DS, OpenAI: deps.OpenAI, ChatHistory: deps.ChatHistory}
@@ -47,7 +45,6 @@ func RegisterRoutes(r chi.Router, h *Handler) {
adminproxies.RegisterRoutes(pr, proxiesHandler)
adminaccounts.RegisterRoutes(pr, accountsHandler)
adminrawsamples.RegisterRoutes(pr, rawSamplesHandler)
- adminvercel.RegisterRoutes(pr, vercelHandler)
admindevcapture.RegisterRoutes(pr, devCaptureHandler)
adminhistory.RegisterRoutes(pr, historyHandler)
adminversion.RegisterRoutes(pr, versionHandler)
diff --git a/webui/src/layout/DashboardShell.jsx b/webui/src/layout/DashboardShell.jsx
index b0542a6..4f33305 100644
--- a/webui/src/layout/DashboardShell.jsx
+++ b/webui/src/layout/DashboardShell.jsx
@@ -3,7 +3,6 @@ import { useLocation, useNavigate } from 'react-router-dom'
import {
LayoutDashboard,
Upload,
- Cloud,
Settings as SettingsIcon,
LogOut,
Menu,
@@ -19,7 +18,6 @@ import AccountManagerContainer from '../features/account/AccountManagerContainer
import ApiTesterContainer from '../features/apiTester/ApiTesterContainer'
import ChatHistoryContainer from '../features/chatHistory/ChatHistoryContainer'
import BatchImport from '../components/BatchImport'
-import VercelSyncContainer from '../features/vercel/VercelSyncContainer'
import SettingsContainer from '../features/settings/SettingsContainer'
import ProxyManagerContainer from '../features/proxy/ProxyManagerContainer'
import LanguageToggle from '../components/LanguageToggle'
@@ -37,7 +35,6 @@ export default function DashboardShell({ token, onLogout, config, fetchConfig, s
{ id: 'test', label: t('nav.test.label'), icon: Server, description: t('nav.test.desc') },
{ id: 'history', label: t('nav.history.label'), icon: History, description: t('nav.history.desc') },
{ id: 'import', label: t('nav.import.label'), icon: Upload, description: t('nav.import.desc') },
- { id: 'vercel', label: t('nav.vercel.label'), icon: Cloud, description: t('nav.vercel.desc') },
{ id: 'settings', label: t('nav.settings.label'), icon: SettingsIcon, description: t('nav.settings.desc') },
]
@@ -105,8 +102,6 @@ export default function DashboardShell({ token, onLogout, config, fetchConfig, s
return
case 'import':
return
- case 'vercel':
- return
case 'settings':
return
default:
diff --git a/webui/src/locales/en.json b/webui/src/locales/en.json
index f13b632..6dcf47d 100644
--- a/webui/src/locales/en.json
+++ b/webui/src/locales/en.json
@@ -25,10 +25,6 @@
"label": "Batch Import",
"desc": "Bulk import account configuration"
},
- "vercel": {
- "label": "Vercel Sync",
- "desc": "Sync configuration to Vercel"
- },
"settings": {
"label": "Settings",
"desc": "Edit runtime and security settings online"
@@ -448,41 +444,5 @@
"adminPortal": "DS2API admin portal",
"signInFailed": "Sign-in failed.",
"networkError": "Network error: {error}"
- },
- "vercel": {
- "tokenRequired": "Vercel access token is required.",
- "projectRequired": "Project ID is required.",
- "syncFailed": "Sync failed.",
- "networkError": "Network error.",
- "title": "Vercel Deployment",
- "description": "Sync the current keys and accounts directly to Vercel environment variables.",
- "tokenLabel": "Vercel Access Token",
- "getToken": "Get token",
- "tokenPlaceholderPreconfig": "Using preconfigured token",
- "tokenPlaceholder": "Enter Vercel access token",
- "projectIdLabel": "Project ID",
- "projectIdHint": "Find it in Project Settings → General.",
- "teamIdLabel": "Team ID",
- "optional": "optional",
- "syncing": "Syncing...",
- "syncRedeploy": "Sync & redeploy",
- "redeployHint": "This triggers a Vercel redeploy and usually takes 30–60 seconds.",
- "syncSucceeded": "Sync succeeded",
- "syncFailedLabel": "Sync failed",
- "openDeployment": "Open deployment",
- "statusSynced": "Synced",
- "statusNotSynced": "Not synced",
- "statusNeverSynced": "Never synced",
- "lastSyncTime": "Last sync: {time}",
- "draftDiffers": "Frontend draft differs from env config. Click Sync & redeploy.",
- "pollPaused": "Status polling paused after {count} failures.",
- "manualRefresh": "Refresh manually",
- "howItWorks": "How it works",
- "steps": {
- "one": "The current configuration (keys and accounts) is exported as JSON.",
- "two": "The JSON is Base64-encoded for safe formatting.",
- "three": "Update the env var in Vercel:",
- "four": "Trigger a redeploy to apply the updated environment variables."
- }
}
}
diff --git a/webui/src/locales/ru.json b/webui/src/locales/ru.json
index 757f69d..0d8c767 100644
--- a/webui/src/locales/ru.json
+++ b/webui/src/locales/ru.json
@@ -25,10 +25,6 @@
"label": "Массовый импорт",
"desc": "Массовый импорт конфигурации аккаунтов"
},
- "vercel": {
- "label": "Синхронизация Vercel",
- "desc": "Синхронизация конфигурации в Vercel"
- },
"settings": {
"label": "Настройки",
"desc": "Онлайн-редактирование настроек среды выполнения и безопасности"
@@ -448,41 +444,5 @@
"adminPortal": "Портал администратора DS2API",
"signInFailed": "Не удалось войти.",
"networkError": "Ошибка сети: {error}"
- },
- "vercel": {
- "tokenRequired": "Требуется токен доступа Vercel.",
- "projectRequired": "Требуется ID проекта.",
- "syncFailed": "Синхронизация не выполнена.",
- "networkError": "Ошибка сети.",
- "title": "Развёртывание Vercel",
- "description": "Синхронизируйте текущие ключи и аккаунты напрямую в переменные окружения Vercel.",
- "tokenLabel": "Токен доступа Vercel",
- "getToken": "Получить токен",
- "tokenPlaceholderPreconfig": "Используется предварительно заданный токен",
- "tokenPlaceholder": "Введите токен доступа Vercel",
- "projectIdLabel": "ID проекта",
- "projectIdHint": "Найдите его в Project Settings → General.",
- "teamIdLabel": "ID команды",
- "optional": "необязательно",
- "syncing": "Синхронизация...",
- "syncRedeploy": "Синхронизировать и переразвернуть",
- "redeployHint": "Это запускает переразвёртывание Vercel и обычно занимает 30–60 секунд.",
- "syncSucceeded": "Синхронизация успешна",
- "syncFailedLabel": "Синхронизация не выполнена",
- "openDeployment": "Открыть развёртывание",
- "statusSynced": "Синхронизировано",
- "statusNotSynced": "Не синхронизировано",
- "statusNeverSynced": "Никогда не синхронизировалось",
- "lastSyncTime": "Последняя синхронизация: {time}",
- "draftDiffers": "Черновик фронтенда отличается от конфигурации env. Нажмите «Синхронизировать и переразвернуть».",
- "pollPaused": "Опрос статуса приостановлен после {count} сбоев.",
- "manualRefresh": "Обновить вручную",
- "howItWorks": "Как это работает",
- "steps": {
- "one": "Текущая конфигурация (ключи и аккаунты) экспортируется как JSON.",
- "two": "JSON кодируется в Base64 для безопасного форматирования.",
- "three": "Обновите переменную окружения в Vercel:",
- "four": "Запустите переразвёртывание, чтобы применить обновлённые переменные окружения."
- }
}
}