I asked you:
"So, Basically, the P2HS Cloud is app backend + hosting substrate multi-tenant platform service that generated apps call into for durable primitives: records, files, jobs, webhooks, connectors, realtime, audit, secrets, service credentials, and controlled execution.
We need to have allow / ask / deny controls for Cloud actions and defaults for things like DB reads, DB modifications, auth config, logs, and project info. We need tool-class permissions for the codegen agent and cloud actions.
Logs and usage as first-class features
Supabase-style bundle: database, auth, storage, edge functions, realtime-ish behavior, AI, and managed secrets in one unified platform.
So it will be excellent for “generate me a SaaS app end to end,”
Storage Bucket (R2 is already there)
Need to highlight storage buckets and large file support
Jobs / Queue / Scheduler
Lovable offers "Edge Functions"
How can we extend our Cloud to allow codegen to build any SaaS app end to end?
And we also need to have "External Resources Connections" Like Let user connect their External Database.
"

And then you replied:
---
  P2HS Cloud Platform Expansion — Full Architecture

  What You Have vs. What's Needed

  ┌────────────────────────┬──────────────────────────────────┬──────────────────────────────────────────────────────────────────┐
  │       Primitive        │              Status              │                               Gap                                │
  ├────────────────────────┼──────────────────────────────────┼──────────────────────────────────────────────────────────────────┤
  │ Records / DB           │ Done (D1 entities + field index) │ No app-user RLS, no vector/AI search                             │
  ├────────────────────────┼──────────────────────────────────┼──────────────────────────────────────────────────────────────────┤
  │ Files / Storage        │ Partial (R2 + cloud_files)       │ No named buckets, no presigned URLs, no public CDN, no multipart │
  ├────────────────────────┼──────────────────────────────────┼──────────────────────────────────────────────────────────────────┤
  │ Jobs / Queue           │ Done (cloud_jobs + pc-processor) │ No scheduler worker yet (table exists, no pc-scheduler)          │
  ├────────────────────────┼──────────────────────────────────┼──────────────────────────────────────────────────────────────────┤
  │ Webhooks               │ Done (inbound + outbound)        │ —                                                                │
  ├────────────────────────┼──────────────────────────────────┼──────────────────────────────────────────────────────────────────┤
  │ App-User Auth          │ Missing                          │ No app user table, sessions, JWT issuance, or OAuth providers    │
  ├────────────────────────┼──────────────────────────────────┼──────────────────────────────────────────────────────────────────┤
  │ Edge Functions         │ Missing                          │ No deploy pipeline, no runtime table, no event triggers          │
  ├────────────────────────┼──────────────────────────────────┼──────────────────────────────────────────────────────────────────┤
  │ Realtime               │ Missing                          │ No SSE/WS, no pubsub                                             │
  ├────────────────────────┼──────────────────────────────────┼──────────────────────────────────────────────────────────────────┤
  │ AI / Vectors           │ Missing                          │ No embedding table, no semantic search                           │
  ├────────────────────────┼──────────────────────────────────┼──────────────────────────────────────────────────────────────────┤
  │ External Connections   │ Missing                          │ No external DB proxy or connection registry                      │
  ├────────────────────────┼──────────────────────────────────┼──────────────────────────────────────────────────────────────────┤
  │ Logs                   │ Partial (cloud_activity_log)     │ No structured levels, no retention policy, no drain/export       │
  ├────────────────────────┼──────────────────────────────────┼──────────────────────────────────────────────────────────────────┤
  │ Usage                  │ Partial (finalized in Core)      │ No per-project metrics table in Cloud                            │
  ├────────────────────────┼──────────────────────────────────┼──────────────────────────────────────────────────────────────────┤
  │ Tool-class Permissions │ Missing                          │ No allow/ask/deny for codegen agent per action class             │
  └────────────────────────┴──────────────────────────────────┴──────────────────────────────────────────────────────────────────┘

  ---
  Layer 1 — Permission Model (Allow / Ask / Deny)

  This is the control layer everything else plugs into. Add it to Core first, sync to Cloud.

  Core — new table: project_tool_permissions

  -- P2HS-BE migration
  CREATE TABLE project_tool_permissions (
      id          UUID PRIMARY KEY DEFAULT gen_random_uuid(),
      project_id  UUID NOT NULL REFERENCES projects(id),
      tool_class  TEXT NOT NULL,       -- e.g. "db.read", "auth.config", "edge_fn.deploy"
      mode        TEXT NOT NULL,       -- "allow" | "ask" | "deny"
      actor_scope TEXT NOT NULL,       -- "codegen_agent" | "api_client" | "any"
      created_at  TIMESTAMPTZ NOT NULL DEFAULT now(),
      updated_at  TIMESTAMPTZ NOT NULL DEFAULT now(),
      UNIQUE (project_id, tool_class, actor_scope)
  );

  Tool classes (canonical set):

  ┌──────────────────┬────────────────────────────────────────────────┬─────────┐
  │      Class       │                  Description                   │ Default │
  ├──────────────────┼────────────────────────────────────────────────┼─────────┤
  │ db.read          │ SELECT records, list entities                  │ allow   │
  ├──────────────────┼────────────────────────────────────────────────┼─────────┤
  │ db.write         │ INSERT / UPDATE / DELETE records               │ ask     │
  ├──────────────────┼────────────────────────────────────────────────┼─────────┤
  │ db.schema        │ Create/modify/delete entities                  │ ask     │
  ├──────────────────┼────────────────────────────────────────────────┼─────────┤
  │ auth.config      │ Configure providers, policies, user management │ ask     │
  ├──────────────────┼────────────────────────────────────────────────┼─────────┤
  │ storage.read     │ Download files, list buckets                   │ allow   │
  ├──────────────────┼────────────────────────────────────────────────┼─────────┤
  │ storage.write    │ Upload, delete files, create buckets           │ ask     │
  ├──────────────────┼────────────────────────────────────────────────┼─────────┤
  │ storage.policy   │ Change bucket public/private policy            │ ask     │
  ├──────────────────┼────────────────────────────────────────────────┼─────────┤
  │ edge_fn.deploy   │ Deploy or update an edge function              │ ask     │
  ├──────────────────┼────────────────────────────────────────────────┼─────────┤
  │ edge_fn.invoke   │ HTTP-invoke an edge function                   │ allow   │
  ├──────────────────┼────────────────────────────────────────────────┼─────────┤
  │ secrets.read     │ Read secret metadata (not values)              │ allow   │
  ├──────────────────┼────────────────────────────────────────────────┼─────────┤
  │ secrets.write    │ Create/rotate/delete secrets                   │ ask     │
  ├──────────────────┼────────────────────────────────────────────────┼─────────┤
  │ scheduler.manage │ Create/update/delete schedules                 │ ask     │
  ├──────────────────┼────────────────────────────────────────────────┼─────────┤
  │ realtime.publish │ Publish events to realtime channels            │ allow   │
  ├──────────────────┼────────────────────────────────────────────────┼─────────┤
  │ logs.read        │ Query project logs                             │ allow   │
  ├──────────────────┼────────────────────────────────────────────────┼─────────┤
  │ project.info     │ Read project config, capabilities              │ allow   │
  ├──────────────────┼────────────────────────────────────────────────┼─────────┤
  │ ai.embed         │ Generate embeddings                            │ allow   │
  ├──────────────────┼────────────────────────────────────────────────┼─────────┤
  │ ai.query         │ Semantic search, AI completions                │ allow   │
  ├──────────────────┼────────────────────────────────────────────────┼─────────┤
  │ external.connect │ Create/use external DB/API connections         │ ask     │
  └──────────────────┴────────────────────────────────────────────────┴─────────┘

  Core syncs these into cloud_project_capabilities as tool_permissions_json via the existing bootstrap/upsert flow.

  ---
  Layer 2 — App-User Auth

  Supabase's auth is what makes generated SaaS apps viable end-to-end. This needs its own sub-system.

  New D1 tables in P2HSCloud — migration 0004_app_auth.sql

  -- Auth config per project
  CREATE TABLE cloud_auth_config (
      project_id          TEXT PRIMARY KEY,
      enabled             INTEGER DEFAULT 1,
      providers_json      TEXT NOT NULL DEFAULT '[]', -- [{type:"email",enabled:true}, {type:"google",client_id,client_secret_ref}]
      jwt_expiry_seconds  INTEGER DEFAULT 3600,
      refresh_expiry_days INTEGER DEFAULT 30,
      allow_signup        INTEGER DEFAULT 1,
      require_email_verify INTEGER DEFAULT 0,
      settings_json       TEXT,
      updated_at          TEXT NOT NULL
  );

  -- App users (per project, not platform users)
  CREATE TABLE cloud_app_users (
      id              TEXT PRIMARY KEY,
      workspace_id    TEXT NOT NULL,
      project_id      TEXT NOT NULL,
      email           TEXT,
      phone           TEXT,
      provider        TEXT NOT NULL,  -- "email" | "google" | "github" | "anonymous"
      provider_id     TEXT,           -- external OAuth subject
      password_hash   TEXT,
      display_name    TEXT,
      avatar_url      TEXT,
      email_verified  INTEGER DEFAULT 0,
      phone_verified  INTEGER DEFAULT 0,
      metadata_json   TEXT,
      status          TEXT DEFAULT 'active',
      last_sign_in_at TEXT,
      created_at      TEXT NOT NULL,
      updated_at      TEXT NOT NULL,
      UNIQUE (project_id, email),
      UNIQUE (project_id, provider, provider_id)
  );

  -- Sessions + refresh tokens
  CREATE TABLE cloud_app_sessions (
      id              TEXT PRIMARY KEY,
      project_id      TEXT NOT NULL,
      user_id         TEXT NOT NULL REFERENCES cloud_app_users(id),
      refresh_token_hash TEXT NOT NULL UNIQUE,
      user_agent      TEXT,
      ip_address      TEXT,
      expires_at      TEXT NOT NULL,
      revoked_at      TEXT,
      created_at      TEXT NOT NULL
  );

  New pc-gateway routes

  POST /v1/projects/:project_id/auth/signup
  POST /v1/projects/:project_id/auth/signin
  POST /v1/projects/:project_id/auth/signout
  POST /v1/projects/:project_id/auth/refresh
  POST /v1/projects/:project_id/auth/oauth/:provider        -- OAuth redirect
  GET  /v1/projects/:project_id/auth/oauth/:provider/callback
  GET  /v1/projects/:project_id/auth/users                  -- admin only
  GET  /v1/projects/:project_id/auth/users/:user_id
  DELETE /v1/projects/:project_id/auth/users/:user_id
  PUT  /v1/cloud/control/projects/:id/auth-config           -- Core → Cloud control

  Generated apps get a short-lived app JWT (not the platform grant JWT). Records can then carry created_by = app user ID and filtering can enforce row-level access.

  ---
  Layer 3 — Storage Buckets (named, policy-controlled)

  New D1 tables — migration 0005_storage_buckets.sql

  CREATE TABLE cloud_storage_buckets (
      id              TEXT PRIMARY KEY,
      workspace_id    TEXT NOT NULL,
      project_id      TEXT NOT NULL,
      name            TEXT NOT NULL,           -- slug, e.g. "avatars", "uploads"
      access_policy   TEXT DEFAULT 'private',  -- "public" | "private" | "authenticated"
      cdn_enabled     INTEGER DEFAULT 0,
      cdn_url_base    TEXT,                    -- e.g. https://cdn.p2hs.com/proj_xxx/avatars
      allowed_mime_types_json TEXT,            -- null = all types
      max_file_size_bytes     INTEGER,         -- null = plan default
      created_at      TEXT NOT NULL,
      updated_at      TEXT NOT NULL,
      UNIQUE (project_id, name)
  );

  New pc-gateway routes

  GET    /v1/projects/:project_id/storage/buckets
  POST   /v1/projects/:project_id/storage/buckets
  DELETE /v1/projects/:project_id/storage/buckets/:bucket_name

  POST   /v1/projects/:project_id/storage/buckets/:bucket_name/upload       -- single file
  POST   /v1/projects/:project_id/storage/buckets/:bucket_name/upload/init  -- multipart init
  PUT    /v1/projects/:project_id/storage/buckets/:bucket_name/upload/:upload_id/part
  POST   /v1/projects/:project_id/storage/buckets/:bucket_name/upload/:upload_id/complete
  GET    /v1/projects/:project_id/storage/buckets/:bucket_name/files
  GET    /v1/projects/:project_id/storage/buckets/:bucket_name/files/:file_id
  DELETE /v1/projects/:project_id/storage/buckets/:bucket_name/files/:file_id
  POST   /v1/projects/:project_id/storage/buckets/:bucket_name/signed-url   -- presigned GET URL

  R2 object key pattern: {workspace_id}/{project_id}/buckets/{bucket_name}/{file_id}/{filename}

  ---
  Layer 4 — Scheduler Worker (pc-scheduler)

  The cloud_schedules table already exists. What's missing is the pc-scheduler worker.

  New worker: apps/pc-scheduler

  // Cloudflare Cron Trigger — wrangler.toml
  // [triggers]
  // crons = ["* * * * *"]   -- runs every minute

  export default {
    async scheduled(event: ScheduledEvent, env: Env, ctx: ExecutionContext) {
      // 1. Query cloud_schedules WHERE next_run_at <= now() AND status = 'active'
      // 2. For each due schedule:
      //    - Enqueue to JOBS_QUEUE (same pc-processor consumer)
      //    - Update last_run_at, compute next_run_at (via cron-parser)
      //    - Write cloud_activity_log entry
    }
  }

  New pc-gateway routes

  GET    /v1/projects/:project_id/schedules
  POST   /v1/projects/:project_id/schedules
  GET    /v1/projects/:project_id/schedules/:schedule_id
  PATCH  /v1/projects/:project_id/schedules/:schedule_id
  DELETE /v1/projects/:project_id/schedules/:schedule_id
  GET    /v1/projects/:project_id/schedules/:schedule_id/runs  -- history from cloud_jobs

  ---
  Layer 5 — Edge Functions

  This is the "Lovable Edge Functions" equivalent. Two design options:

  Option A (Simple — recommended first): Edge functions are stored code executed inside pc-processor as a new request type (edge_fn.run).
  Code is stored in R2, loaded at runtime using eval/Function
  constructor in an isolated context — or compiled to a Worker script via Cloudflare Workers for Platforms (dispatch namespaces).

  Option B (Full — Cloudflare Workers for Platforms): Each edge function is a real Worker deployed into a customer dispatch namespace.
  More powerful but requires Cloudflare Workers for Platforms (paid
  add-on).

  New D1 tables — migration 0006_edge_functions.sql

  CREATE TABLE cloud_edge_functions (
      id              TEXT PRIMARY KEY,
      workspace_id    TEXT NOT NULL,
      project_id      TEXT NOT NULL,
      name            TEXT NOT NULL,
      slug            TEXT NOT NULL,           -- URL-safe, e.g. "send-welcome-email"
      runtime         TEXT DEFAULT 'js',
      source_ref      TEXT,                    -- R2 key for source bundle
      status          TEXT DEFAULT 'draft',    -- draft | deployed | error
      trigger_type    TEXT NOT NULL,           -- "http" | "event" | "schedule"
      trigger_config_json TEXT,
      env_refs_json   TEXT,                    -- list of secret_ref keys to inject
      version         INTEGER DEFAULT 1,
      deployed_at     TEXT,
      created_at      TEXT NOT NULL,
      updated_at      TEXT NOT NULL,
      UNIQUE (project_id, slug)
  );

  CREATE TABLE cloud_edge_fn_invocations (
      id              TEXT PRIMARY KEY,
      project_id      TEXT NOT NULL,
      fn_id           TEXT NOT NULL,
      trigger_source  TEXT,
      status          TEXT NOT NULL,
      duration_ms     INTEGER,
      log_ref         TEXT,                    -- R2 key for detailed logs
      error_message   TEXT,
      created_at      TEXT NOT NULL
  );

  New routes

  GET    /v1/projects/:project_id/functions
  POST   /v1/projects/:project_id/functions
  POST   /v1/projects/:project_id/functions/:slug/deploy  -- upload source bundle
  POST   /v1/projects/:project_id/functions/:slug/invoke  -- HTTP trigger
  GET    /v1/projects/:project_id/functions/:slug/logs

  New request type: edge_fn.run added to pc-processor handler registry — loads source from R2, executes in isolated context.

  ---
  Layer 6 — Realtime (SSE first, then WS)

  Cloudflare Workers support SSE natively. For pubsub, use Durable Objects or KV + long-poll.

  Recommended: SSE + Durable Object per project channel.

  New worker: apps/pc-realtime (or add to pc-gateway)

  GET /v1/projects/:project_id/realtime/listen?channels=records:users,jobs -- SSE stream
  POST /v1/projects/:project_id/realtime/publish                           -- internal

  New D1 table — migration 0007_realtime.sql

  CREATE TABLE cloud_realtime_channels (
      id              TEXT PRIMARY KEY,
      project_id      TEXT NOT NULL,
      name            TEXT NOT NULL,           -- e.g. "records:users", "jobs", "custom:orders"
      access_policy   TEXT DEFAULT 'authenticated',
      created_at      TEXT NOT NULL,
      UNIQUE (project_id, name)
  );

  Record mutations and job events automatically publish to records:{entity_key} and jobs channels. Custom edge function events publish to custom:{channel}.

  ---
  Layer 7 — AI / Vector Embeddings

  New D1 table — migration 0008_ai.sql

  CREATE TABLE cloud_record_embeddings (
      id          TEXT PRIMARY KEY,
      project_id  TEXT NOT NULL,
      entity_key  TEXT NOT NULL,
      record_id   TEXT NOT NULL,
      field_key   TEXT NOT NULL,         -- which field was embedded
      model       TEXT NOT NULL,         -- e.g. "text-embedding-3-small"
      dimensions  INTEGER NOT NULL,
      vector_ref  TEXT NOT NULL,         -- R2 key or Vectorize index ref
      created_at  TEXT NOT NULL,
      updated_at  TEXT NOT NULL,
      UNIQUE (project_id, entity_key, record_id, field_key)
  );

  D1 doesn't support pgvector. Use Cloudflare Vectorize as the vector store.

  New request type: ai.embed — embeds a record field and writes to Vectorize.

  New routes

  POST /v1/projects/:project_id/ai/embed                 -- embed records
  POST /v1/projects/:project_id/ai/search                -- semantic search
  POST /v1/projects/:project_id/ai/complete              -- AI completion with context injection

  ---
  Layer 8 — External Resource Connections

  New D1 table — migration 0009_external_connections.sql

  CREATE TABLE cloud_external_connections (
      id              TEXT PRIMARY KEY,
      workspace_id    TEXT NOT NULL,
      project_id      TEXT NOT NULL,
      name            TEXT NOT NULL,
      type            TEXT NOT NULL,   -- "postgres" | "mysql" | "mongodb" | "redis" | "s3" | "http_api"
      status          TEXT DEFAULT 'pending',  -- pending | testing | active | error
      connection_secret_ref TEXT NOT NULL,     -- encrypted connection string in Core secrets
      hyperdrive_id   TEXT,                    -- Cloudflare Hyperdrive ID for SQL types
      schema_snapshot_json TEXT,               -- cached schema introspection
      last_tested_at  TEXT,
      created_at      TEXT NOT NULL,
      updated_at      TEXT NOT NULL,
      UNIQUE (project_id, name)
  );

  For Postgres/MySQL → use Cloudflare Hyperdrive for connection pooling. The connection string lives in Core secrets, the Hyperdrive binding ID is stored here.

  For HTTP APIs → stored as a named integration with base URL + auth config.

  New routes

  GET    /v1/projects/:project_id/connections
  POST   /v1/projects/:project_id/connections
  POST   /v1/projects/:project_id/connections/:conn_id/test
  GET    /v1/projects/:project_id/connections/:conn_id/schema
  POST   /v1/projects/:project_id/connections/:conn_id/query  -- proxy SQL queries
  DELETE /v1/projects/:project_id/connections/:conn_id

  The query proxy is a new request type: external.query — processor fetches connection via Hyperdrive and executes the query.

  ---
  Layer 9 — Logs as First-Class

  Extend cloud_activity_log + add structured log streams:

  New D1 table — migration 0010_logs.sql

  CREATE TABLE cloud_log_streams (
      id          TEXT PRIMARY KEY,
      project_id  TEXT NOT NULL,
      level       TEXT NOT NULL,    -- "debug" | "info" | "warn" | "error"
      source      TEXT NOT NULL,    -- "edge_fn" | "job" | "gateway" | "webhook" | "auth"
      trace_id    TEXT,
      message     TEXT NOT NULL,
      data_json   TEXT,
      occurred_at TEXT NOT NULL
  );

  CREATE INDEX idx_log_streams_project_time ON cloud_log_streams (project_id, occurred_at DESC);
  CREATE INDEX idx_log_streams_level ON cloud_log_streams (project_id, level, occurred_at DESC);

  New routes

  GET /v1/projects/:project_id/logs?source=&level=&from=&to=&limit=
  GET /v1/projects/:project_id/logs/live    -- SSE tail

  Log drain (export): configurable to external Logtail / Datadog / custom webhook.

  ---
  Layer 10 — Usage as First-Class

  New D1 table — migration 0011_usage.sql

  CREATE TABLE cloud_usage_snapshots (
      id              TEXT PRIMARY KEY,
      project_id      TEXT NOT NULL,
      snapshot_at     TEXT NOT NULL,
      db_record_count INTEGER DEFAULT 0,
      db_entity_count INTEGER DEFAULT 0,
      storage_bytes   INTEGER DEFAULT 0,
      job_count_total INTEGER DEFAULT 0,
      edge_fn_invocations INTEGER DEFAULT 0,
      auth_user_count INTEGER DEFAULT 0,
      ai_embed_count  INTEGER DEFAULT 0,
      realtime_msg_count INTEGER DEFAULT 0,
      created_at      TEXT NOT NULL
  );

  Snapshots written by pc-scheduler (daily cron). Exposed via:

  GET /v1/projects/:project_id/usage?period=day|week|month
  GET /v1/projects/:project_id/usage/current

  ---
  Codegen Agent Integration

  The codegen agent (Claude/Cursor) needs to know what platform primitives are available and be constrained by the tool-class permission model.

  How the agent learns the platform surface

  Core generates a project manifest injected into the codegen system prompt:

  {
    "platform": "p2hs",
    "project_id": "proj_xxx",
    "primitives": {
      "database": { "entities": ["users", "posts", "orders"], "auth_rls": true },
      "auth": { "providers": ["email", "google"], "enabled": true },
      "storage": { "buckets": ["avatars", "uploads"] },
      "functions": { "deployed": ["send-welcome-email"] },
      "connections": { "external": ["postgres:crm_db"] },
      "scheduler": { "schedules": ["daily-digest"] }
    },
    "tool_permissions": {
      "db.read":       "allow",
      "db.write":      "ask",
      "db.schema":     "ask",
      "auth.config":   "ask",
      "storage.write": "ask",
      "edge_fn.deploy":"ask",
      "secrets.write": "deny"
    }
  }

  Codegen Tool Classes → API Actions

  ┌──────────────────┬───────────────────────────────┐
  │    Tool Class    │            Maps To            │
  ├──────────────────┼───────────────────────────────┤
  │ db.schema        │ POST/PATCH/DELETE /entities   │
  ├──────────────────┼───────────────────────────────┤
  │ db.write         │ POST/PATCH/DELETE /records    │
  ├──────────────────┼───────────────────────────────┤
  │ db.read          │ GET /records, GET /entities   │
  ├──────────────────┼───────────────────────────────┤
  │ auth.config      │ PUT /auth-config              │
  ├──────────────────┼───────────────────────────────┤
  │ storage.write    │ POST /storage/buckets, upload │
  ├──────────────────┼───────────────────────────────┤
  │ edge_fn.deploy   │ POST /functions/:slug/deploy  │
  ├──────────────────┼───────────────────────────────┤
  │ secrets.write    │ Core secrets API              │
  ├──────────────────┼───────────────────────────────┤
  │ scheduler.manage │ POST /schedules               │
  └──────────────────┴───────────────────────────────┘

  ask mode means the codegen agent surfaces a confirmation step to the user before executing. deny means the action is blocked from the agent context entirely.

  ---
  Implementation Phases

  Phase 1 — Foundation (unblocks everything)

  1. Permission model — project_tool_permissions in Core + sync to Cloud
  2. pc-scheduler worker — activate cloud_schedules table
  3. Named storage buckets — migration + routes
  4. Logs as first-class — cloud_log_streams + query route

  Phase 2 — Auth + SaaS completeness

  5. App-user auth — cloud_auth_config, cloud_app_users, cloud_app_sessions
  6. Usage snapshots — metrics table + cron snapshot task

  Phase 3 — Developer power features

  7. Edge functions — cloud_edge_functions table + edge_fn.run request type
  8. External connections — cloud_external_connections + Hyperdrive integration

  Phase 4 — AI + Realtime

  9. Realtime — SSE streams + Durable Object channels
  10. AI/Vectors — Vectorize integration + ai.embed/ai.search routes

  ---
  What Codegen Gets End-to-End

  With all of this in place, a codegen run for "build me a SaaS app" gets:

  ✓ Database      → define entities, create records, filtered queries, RLS by auth user
  ✓ Auth          → signup/signin, OAuth, JWT, session management
  ✓ Storage       → named buckets, upload, presigned URLs, public CDN
  ✓ Functions     → custom logic, event-triggered, HTTP-callable
  ✓ Jobs          → async work, retries, provider integrations
  ✓ Scheduler     → cron tasks, one-off delayed jobs
  ✓ Webhooks      → inbound events from Stripe/GitHub/etc, outbound notifications
  ✓ Realtime      → SSE streams for live UI updates
  ✓ AI            → semantic search, embeddings, completions with project context
  ✓ Logs          → structured debug/error logs with live tail
  ✓ External DB   → proxy queries to user's own Postgres/MySQL
  ✓ Permissions   → allow/ask/deny per action class for the codegen agent
  ✓ Usage         → real-time metrics per feature

  ---