Kuunda Cloud Managed

Kuunda Cloud Managed = BaaS Kuunda (API REST, Auth, Storage, Realtime) + Management API pour les outils de vibe coding (Lovable, Bolt, CI, scripts).

Deux plans

PlanHôteUsage
Data plane{ref}.kuunda-cloud.comApp générée : @kuunda/kuunda-js, clé anon, JWT utilisateurs
Control planehttps://api.kuunda-cloud.com/v1Agents : PAT, DDL SQL, création projet

Authentification

Créez un Personal Access Token (kuunda_pat_*) dans la console : Compte → Access Tokens. Permissions :

Pour Lovable / CI : dans la console, bouton Préparer pour CI / Lovable, ou Activer SQL sur un PAT existant (le secret déjà en CI reste valable). Recréer un token seulement si le secret a été perdu.

Authorization: Bearer kuunda_pat_xxxxx

Découverte projet

GET https://api.kuunda-cloud.com/v1/projects/{ref}
→ ref, schema, rest_url, auth_url, anon_key, sdk…

Créer un projet (Managed)

POST https://api.kuunda-cloud.com/v1/projects
{ "name": "Mon app Lovable" }
→ project { ref, anon_key, rest_url, schema, … }

Exécuter du SQL (migrations)

Requiert un PAT avec database_query: true. Le SQL est validé (AST + lexer hors chaînes, fail-closed si illisible) et tourne sous le rôle {schema}_owner, pas en superuser. Journal d’audit + limite 30 req/min (Redis, partagée entre instances).

POST https://api.kuunda-cloud.com/v1/projects/{ref}/database/query
{ "query": "CREATE TABLE …; NOTIFY pgrst, 'reload schema';" }

Déployer une Edge Function (agents / CI)

Requiert un PAT avec edge_functions: true. Équivalent de supabase functions deploy. Fichiers locaux : kuunda/functions/<name>/index.ts et éventuellement kuunda/functions/_shared/ (bundlé automatiquement). Le runtime injecte KUUNDA_URL, KUUNDA_ANON_KEY, KUUNDA_SERVICE_ROLE_KEY, KUUNDA_DB_SCHEMA, KUUNDA_PROJECT_REF (aliases SUPABASE_* aussi).

# Management API (PAT edge_functions)
POST https://api.kuunda-cloud.com/v1/projects/{ref}/functions/deploy
{ "name": "hello", "source": "Deno.serve(() => new Response('ok'))", "files": { "_shared/cors.ts": "…" } }

# CLI depuis le monorepo (packages/cli) — @kuunda/cli n’est pas sur npm
# npx kuunda functions deploy hello

# Secrets métier (upsert)
PUT https://api.kuunda-cloud.com/v1/projects/{ref}/functions/secrets
{ "functionName": "hello", "key": "GENIUS_API_KEY", "value": "…" }

Dans Cursor, le serveur MCP du dépôt (packages/mcp-server) expose aussi deploy_edge_function (jeton kuunda_mcp_* généré dans Paramètres → API → MCP).

Contrat runtime Functions (tous les projets)

Handler : export default async (req: Request) => Response ou Deno.serve(handler). Imports HTTPS Deno (esm.sh, jsr, deno.land) autorisés. Échec compilation / import / timeout : HTTP 500 JSON { "error", "message", "request_id" } avec CORS. Un 502 gateway (infra) a aussi CORS + request_id. Le preflight OPTIONS echo Access-Control-Request-Headers (SDK : content-profile, x-project-ref, headers métier).

Realtime WebSocket

Pour un projet actif, Realtime partagé est joignable sans activation manuelle : wss://{ref}.kuunda-cloud.com/realtime/v1/websocket?apikey=…&vsn=1.0.0 (SDK kuunda.channel(…)). Les projets en base dédiée reçoivent un sidecar au premier abonnement. Tables : publication supabase_realtime (console Realtime ou import).

Client dans le code généré

npm install @kuunda/kuunda-js

import { createClient } from '@kuunda/kuunda-js';

const kuunda = createClient(
  process.env.NEXT_PUBLIC_KUUNDA_URL!,
  process.env.NEXT_PUBLIC_KUUNDA_ANON_KEY!,
  { dbSchema: process.env.KUUNDA_DB_SCHEMA! }
);

KUUNDA_DB_SCHEMA = proj_ + UUID projet (32 hex, sans tirets), pas la ref courte à 8 caractères.

Équivalence SDK et clés

Utilisez @kuunda/kuunda-js avec l’API Management https://api.kuunda-cloud.com/v1, et les clés kuunda_anon_* / kuunda_pat_*.