54 lines
1.5 KiB
TypeScript
54 lines
1.5 KiB
TypeScript
import { existsSync, readFileSync } from "node:fs";
|
|
import { join } from "node:path";
|
|
import { discoverProfiles, getEffectiveProfile } from "@/lib/workspace";
|
|
|
|
export const dynamic = "force-dynamic";
|
|
export const runtime = "nodejs";
|
|
|
|
type GatewayMeta = {
|
|
mode?: string;
|
|
port?: number;
|
|
url?: string;
|
|
};
|
|
|
|
function readGatewayMeta(stateDir: string): GatewayMeta | null {
|
|
for (const filename of ["openclaw.json", "config.json"]) {
|
|
const configPath = join(stateDir, filename);
|
|
if (!existsSync(configPath)) {
|
|
continue;
|
|
}
|
|
try {
|
|
const raw = JSON.parse(readFileSync(configPath, "utf-8")) as {
|
|
gateway?: { mode?: unknown; port?: unknown };
|
|
};
|
|
const port = typeof raw.gateway?.port === "number"
|
|
? raw.gateway.port
|
|
: typeof raw.gateway?.port === "string"
|
|
? Number.parseInt(raw.gateway.port, 10)
|
|
: undefined;
|
|
const mode = typeof raw.gateway?.mode === "string" ? raw.gateway.mode : undefined;
|
|
return {
|
|
...(mode ? { mode } : {}),
|
|
...(Number.isFinite(port) ? { port } : {}),
|
|
...(Number.isFinite(port) ? { url: `ws://127.0.0.1:${port}` } : {}),
|
|
};
|
|
} catch {
|
|
// Continue to fallback config file candidate.
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
export async function GET() {
|
|
const activeProfile = getEffectiveProfile() ?? "default";
|
|
const profiles = discoverProfiles().map((profile) => ({
|
|
...profile,
|
|
gateway: readGatewayMeta(profile.stateDir),
|
|
}));
|
|
|
|
return Response.json({
|
|
profiles,
|
|
activeProfile,
|
|
});
|
|
}
|