Data Model

3.1 D1 Database Schema

-- Customers and authentication
CREATE TABLE customers (
  id TEXT PRIMARY KEY,
  name TEXT NOT NULL,
  email TEXT NOT NULL,
  created_at INTEGER NOT NULL,
  cloud_accounts JSON NOT NULL,  -- { aws: [], azure: [], gcp: [] }
  kivera_identity_id TEXT,
  max_concurrent_workloads INTEGER DEFAULT 100,
  default_requirements JSON
);

CREATE TABLE api_tokens (
  id TEXT PRIMARY KEY,
  customer_id TEXT NOT NULL REFERENCES customers(id),
  token_hash TEXT NOT NULL,
  name TEXT NOT NULL,
  permissions JSON NOT NULL,
  created_at INTEGER NOT NULL,
  expires_at INTEGER,
  last_used_at INTEGER
);

-- Workloads
CREATE TABLE workloads (
  id TEXT PRIMARY KEY,
  customer_id TEXT NOT NULL REFERENCES customers(id),
  name TEXT NOT NULL,
  status TEXT NOT NULL, -- PENDING, PROVISIONING, RUNNING, STOPPING, TERMINATED, FAILED
  requirements JSON NOT NULL,
  config JSON NOT NULL,
  created_at INTEGER NOT NULL,
  started_at INTEGER,
  terminated_at INTEGER,
  termination_reason TEXT
);

CREATE TABLE workload_instances (
  id TEXT PRIMARY KEY,
  workload_id TEXT NOT NULL REFERENCES workloads(id),
  provider TEXT NOT NULL, -- aws, azure, gcp
  region TEXT NOT NULL,
  instance_type TEXT NOT NULL,
  instance_id TEXT NOT NULL,
  public_ip TEXT,
  private_ip TEXT,
  status TEXT NOT NULL,
  spot_price REAL NOT NULL,
  created_at INTEGER NOT NULL,
  terminated_at INTEGER
);

CREATE TABLE workload_routing (
  workload_id TEXT PRIMARY KEY REFERENCES workloads(id),
  endpoint TEXT NOT NULL,
  provider TEXT NOT NULL,
  region TEXT NOT NULL,
  instance_id TEXT NOT NULL,
  updated_at INTEGER NOT NULL
);

-- Spot pricing history
CREATE TABLE spot_price_history (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  provider TEXT NOT NULL,
  region TEXT NOT NULL,
  instance_type TEXT NOT NULL,
  price_per_hour REAL NOT NULL,
  availability_zone TEXT,
  recorded_at INTEGER NOT NULL
);

CREATE INDEX idx_spot_prices_lookup ON spot_price_history(provider, region, instance_type, recorded_at DESC);

-- Audit log
CREATE TABLE audit_log (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  customer_id TEXT NOT NULL,
  workload_id TEXT,
  action TEXT NOT NULL,
  details JSON,
  ip_address TEXT,
  user_agent TEXT,
  created_at INTEGER NOT NULL
);

CREATE INDEX idx_audit_customer ON audit_log(customer_id, created_at DESC);

3.2 KV Namespace Structure

# Routing (hot path - needs to be fast)
workload:{workloadId}:endpoint     -> "10.0.1.50"
workload:{workloadId}:status       -> "RUNNING" | "INTERRUPTED" | "STOPPING"
workload:{workloadId}:provider     -> "aws"
workload:{workloadId}:region       -> "us-east-1"

# Price cache (updated every 60s)
prices:{provider}:{region}:{instanceType} -> { price: 0.05, updatedAt: 1234567890 }
prices:best:{requirements_hash}           -> { provider: "aws", region: "us-east-1", ... }

# Customer session cache
customer:{customerId}:token:{tokenPrefix} -> { permissions: [...], expiresAt: ... }

# Rate limiting
ratelimit:{customerId}:{action}:{window} -> count

3.3 Durable Object State (SQLite)

-- ConnectionManager DO
CREATE TABLE connections (
  id TEXT PRIMARY KEY,
  workload_id TEXT NOT NULL,
  backend TEXT NOT NULL,
  connected_at INTEGER NOT NULL,
  last_activity_at INTEGER NOT NULL
);

-- PriceCollector DO
CREATE TABLE spot_prices (
  provider TEXT NOT NULL,
  region TEXT NOT NULL,
  instance_type TEXT NOT NULL,
  vcpu INTEGER NOT NULL,
  memory_gb REAL NOT NULL,
  gpu_count INTEGER DEFAULT 0,
  gpu_type TEXT,
  price_per_hour REAL NOT NULL,
  interruption_rate REAL,
  availability_score REAL,
  updated_at INTEGER NOT NULL,
  PRIMARY KEY (provider, region, instance_type)
);

CREATE INDEX idx_prices_requirements ON spot_prices(vcpu, memory_gb, gpu_count, price_per_hour);

-- HealthMonitor DO
CREATE TABLE health_checks (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  checked_at INTEGER NOT NULL,
  healthy BOOLEAN NOT NULL,
  response_time_ms INTEGER,
  error TEXT
);