feat: restructure as pnpm monorepo with Tauri desktop shell

- Migrate to packages/web + packages/desktop workspace layout via git mv
- Add Tauri v2 desktop shell with @tauri-apps/plugin-http for CORS bypass
- Configure Turborepo with package-level dependsOn build graph
- Add semantic-release with exec plugin for GHA output and disabled PR comments
- Fix http:default capability scope to allow all HTTP/HTTPS origins
- Add Vite Tauri integration (clearScreen, TAURI_DEV_HOST, target, envPrefix)
- Add semantic-release.yml and release.yml GitHub Actions workflows
- Fix all Biome lint errors (noArrayIndexKey, noNonNullAssertion, button types)
This commit is contained in:
Offending Commit
2026-04-24 16:52:40 -05:00
parent 9a74182f97
commit 92c4dfd3dd
152 changed files with 14088 additions and 4774 deletions

View File

@@ -0,0 +1,64 @@
import { httpFetch } from "@/lib/http";
import { z } from "zod";
const CONFIG_KEY = "openconcho:config";
export const configSchema = z.object({
baseUrl: z.string().url("Must be a valid URL"),
token: z.string().optional().default(""),
});
export type Config = z.infer<typeof configSchema>;
export function loadConfig(): Config | null {
try {
const raw = localStorage.getItem(CONFIG_KEY);
if (!raw) return null;
const parsed = JSON.parse(raw);
return configSchema.parse(parsed);
} catch {
return null;
}
}
export function saveConfig(config: Config): void {
localStorage.setItem(CONFIG_KEY, JSON.stringify(config));
}
export function clearConfig(): void {
localStorage.removeItem(CONFIG_KEY);
}
export type HealthStatus = "ok" | "auth-required" | "unreachable" | "checking";
export async function checkConnection(
baseUrl: string,
token?: string,
): Promise<{
status: HealthStatus;
message: string;
}> {
try {
const headers: Record<string, string> = { "Content-Type": "application/json" };
if (token) headers.Authorization = `Bearer ${token}`;
const res = await httpFetch(`${baseUrl}/v3/workspaces/list`, {
method: "POST",
headers,
body: JSON.stringify({}),
signal: AbortSignal.timeout(5000),
});
if (res.ok) return { status: "ok", message: "Connected successfully" };
if (res.status === 401 || res.status === 403) {
return { status: "auth-required", message: "Authentication required — provide an API token" };
}
return { status: "unreachable", message: `Server returned ${res.status}` };
} catch (err) {
const msg = err instanceof Error ? err.message : "Unknown error";
if (msg.includes("AbortError") || msg.includes("timeout")) {
return { status: "unreachable", message: "Connection timed out" };
}
return { status: "unreachable", message: `Cannot reach server: ${msg}` };
}
}