mirror of
https://github.com/DayuanJiang/next-ai-draw-io.git
synced 2026-10-13 04:59:51 +08:00
- components/model-selector.tsx uses Dialog, Command and Tooltip directly; delete components/ai-elements/model-selector.tsx and components/button-with-tooltip.tsx; one renderGroups for both lists; no "Server · " prefix round trip - components/ui: drop CommandDialog, CommandShortcut and six unused shadcn exports - model-config-dialog: no type-to-confirm on provider delete; provider-credentials-fields: drop footer and bedrockApiKey - hooks/use-model-config.ts and lib/types/model-config.ts: remove the 2025-12 single-provider migration, resetConfig, selectedModel and fields nothing reads - components/chat/TemplateFormDialog.tsx replaces the create and edit dialogs; TemplatePanel drops the setInput fallback, the templatesChanged listener, dictionary fallbacks and formatLastUsed; lib/template-storage.ts drops getTemplate, clickCount and indexes - reasoning.tsx becomes one component; shimmer uses a CSS keyframe (motion and @radix-ui/react-use-controllable-state removed) - error-toast.tsx deleted in favour of toast.error; ValidationCard drops the idle status; dev-xml-simulator uses English literals - admin: no enum setting type, shared types from lib/admin (AdminProviderInput stays exported for that), ENABLE_HISTORY_XML_REPLACE entry removed - app/globals.css: drop check-pop, --ease-spring, --duration-normal and the shadow aliases - dictionaries: 81 unused keys removed from all four languages
55 lines
1.9 KiB
TypeScript
55 lines
1.9 KiB
TypeScript
import type { MaskedSecret as SecretValue } from "@/lib/admin/auth"
|
|
import type { AdminProviderInput as AdminProvider } from "@/lib/admin/providers"
|
|
import { getApiEndpoint } from "@/lib/base-path"
|
|
import type { ProviderName } from "@/lib/types/model-config"
|
|
|
|
export const SESSION_PASSWORD_KEY = "next-ai-draw-io-admin-password"
|
|
|
|
// ── Shared types ─────────────────────────────────────────────────────
|
|
|
|
// The same shapes the admin API validates and returns. Secret fields of a
|
|
// provider hold either a masked marker (unchanged) or a plaintext string
|
|
// (new value).
|
|
export type { AdminProvider, SecretValue }
|
|
|
|
export function isSecretValue(v: unknown): v is SecretValue {
|
|
return typeof v === "object" && v !== null && "isSet" in v
|
|
}
|
|
|
|
export interface SettingState {
|
|
key: string
|
|
source: "file" | "env" | "default"
|
|
value: string | SecretValue | null
|
|
}
|
|
|
|
export type SettingsMap = Record<string, SettingState>
|
|
|
|
// Editable text of a saved setting; secrets have none (write-only)
|
|
export function savedTextOf(state: SettingState | undefined): string {
|
|
return state && !isSecretValue(state.value) ? (state.value ?? "") : ""
|
|
}
|
|
|
|
// Provider defined in AI_MODELS_CONFIG / ai-models.json — shown read-only
|
|
export interface EnvProvider {
|
|
name: string
|
|
provider: ProviderName
|
|
models: string[]
|
|
isDefault: boolean
|
|
}
|
|
|
|
export async function adminFetch(path: string, pw: string, init?: RequestInit) {
|
|
const res = await fetch(getApiEndpoint(path), {
|
|
...init,
|
|
headers: {
|
|
...init?.headers,
|
|
"x-admin-password": pw,
|
|
...(init?.body ? { "Content-Type": "application/json" } : {}),
|
|
},
|
|
})
|
|
const data = await res.json().catch(() => ({}))
|
|
if (!res.ok) {
|
|
throw new Error(data.error || `Request failed (${res.status})`)
|
|
}
|
|
return data
|
|
}
|