| "use server"; |
|
|
| import { NextResponse } from "next/server"; |
| import fs from "fs/promises"; |
| import path from "path"; |
| import { |
| ensureCliConfigWriteAllowed, |
| getCliPrimaryConfigPath, |
| getCliRuntimeStatus, |
| } from "@/shared/services/cliRuntime"; |
| import { createBackup } from "@/shared/services/backupService"; |
| import { saveCliToolLastConfigured, deleteCliToolLastConfigured } from "@/lib/db/cliToolState"; |
|
|
| const getDroidSettingsPath = () => getCliPrimaryConfigPath("droid"); |
| const getDroidDir = () => path.dirname(getDroidSettingsPath()); |
|
|
| |
| const readSettings = async () => { |
| try { |
| const settingsPath = getDroidSettingsPath(); |
| const content = await fs.readFile(settingsPath, "utf-8"); |
| return JSON.parse(content); |
| } catch (error: any) { |
| if (error.code === "ENOENT") return null; |
| throw error; |
| } |
| }; |
|
|
| |
| const hasOmniRouteConfig = (settings: any) => { |
| if (!settings || !settings.customModels) return false; |
| return settings.customModels.some((m) => m.id === "custom:OmniRoute-0"); |
| }; |
|
|
| |
| export async function GET() { |
| try { |
| const runtime = await getCliRuntimeStatus("droid"); |
|
|
| if (!runtime.installed || !runtime.runnable) { |
| return NextResponse.json({ |
| installed: runtime.installed, |
| runnable: runtime.runnable, |
| command: runtime.command, |
| commandPath: runtime.commandPath, |
| runtimeMode: runtime.runtimeMode, |
| reason: runtime.reason, |
| settings: null, |
| message: |
| runtime.installed && !runtime.runnable |
| ? "Factory Droid CLI is installed but not runnable" |
| : "Factory Droid CLI is not installed", |
| }); |
| } |
|
|
| const settings = await readSettings(); |
|
|
| return NextResponse.json({ |
| installed: runtime.installed, |
| runnable: runtime.runnable, |
| command: runtime.command, |
| commandPath: runtime.commandPath, |
| runtimeMode: runtime.runtimeMode, |
| reason: runtime.reason, |
| settings, |
| hasOmniRoute: hasOmniRouteConfig(settings), |
| settingsPath: getDroidSettingsPath(), |
| }); |
| } catch (error) { |
| console.log("Error checking droid settings:", error); |
| return NextResponse.json({ error: "Failed to check droid settings" }, { status: 500 }); |
| } |
| } |
|
|
| |
| export async function POST(request: Request) { |
| try { |
| const writeGuard = ensureCliConfigWriteAllowed(); |
| if (writeGuard) { |
| return NextResponse.json({ error: writeGuard }, { status: 403 }); |
| } |
|
|
| const { baseUrl, apiKey, model } = await request.json(); |
|
|
| if (!baseUrl || !model) { |
| return NextResponse.json({ error: "baseUrl and model are required" }, { status: 400 }); |
| } |
|
|
| const droidDir = getDroidDir(); |
| const settingsPath = getDroidSettingsPath(); |
|
|
| |
| await fs.mkdir(droidDir, { recursive: true }); |
|
|
| |
| await createBackup("droid", settingsPath); |
|
|
| |
| let settings: Record<string, any> = {}; |
| try { |
| const existingSettings = await fs.readFile(settingsPath, "utf-8"); |
| settings = JSON.parse(existingSettings); |
| } catch { |
| |
| } |
|
|
| |
| if (!settings.customModels) { |
| settings.customModels = []; |
| } |
|
|
| |
| settings.customModels = settings.customModels.filter((m) => m.id !== "custom:OmniRoute-0"); |
|
|
| |
| const normalizedBaseUrl = baseUrl.endsWith("/v1") ? baseUrl : `${baseUrl}/v1`; |
|
|
| |
| const customModel = { |
| model: model, |
| id: "custom:OmniRoute-0", |
| index: 0, |
| baseUrl: normalizedBaseUrl, |
| apiKey: apiKey || "your_api_key", |
| displayName: model, |
| maxOutputTokens: 131072, |
| noImageSupport: false, |
| provider: "openai", |
| }; |
|
|
| settings.customModels.unshift(customModel); |
|
|
| |
| await fs.writeFile(settingsPath, JSON.stringify(settings, null, 2)); |
|
|
| |
| try { |
| saveCliToolLastConfigured("droid"); |
| } catch { |
| |
| } |
|
|
| return NextResponse.json({ |
| success: true, |
| message: "Factory Droid settings applied successfully!", |
| settingsPath, |
| }); |
| } catch (error) { |
| console.log("Error updating droid settings:", error); |
| return NextResponse.json({ error: "Failed to update droid settings" }, { status: 500 }); |
| } |
| } |
|
|
| |
| export async function DELETE() { |
| try { |
| const writeGuard = ensureCliConfigWriteAllowed(); |
| if (writeGuard) { |
| return NextResponse.json({ error: writeGuard }, { status: 403 }); |
| } |
|
|
| const settingsPath = getDroidSettingsPath(); |
|
|
| |
| await createBackup("droid", settingsPath); |
|
|
| |
| let settings: Record<string, any> = {}; |
| try { |
| const existingSettings = await fs.readFile(settingsPath, "utf-8"); |
| settings = JSON.parse(existingSettings); |
| } catch (error: any) { |
| if (error.code === "ENOENT") { |
| return NextResponse.json({ |
| success: true, |
| message: "No settings file to reset", |
| }); |
| } |
| throw error; |
| } |
|
|
| |
| if (settings.customModels) { |
| settings.customModels = settings.customModels.filter((m) => m.id !== "custom:OmniRoute-0"); |
|
|
| |
| if (settings.customModels.length === 0) { |
| delete settings.customModels; |
| } |
| } |
|
|
| |
| await fs.writeFile(settingsPath, JSON.stringify(settings, null, 2)); |
|
|
| |
| try { |
| deleteCliToolLastConfigured("droid"); |
| } catch { |
| |
| } |
|
|
| return NextResponse.json({ |
| success: true, |
| message: "OmniRoute settings removed successfully", |
| }); |
| } catch (error) { |
| console.log("Error resetting droid settings:", error); |
| return NextResponse.json({ error: "Failed to reset droid settings" }, { status: 500 }); |
| } |
| } |
|
|