Command Inbox
Reference

Database schema

Complete table, column, enum, and index reference

Schema source: src/lib/db/schema.ts and src/lib/db/auth-schema.ts.

Embedding dimensions: 768 (EMBEDDING_DIMENSIONS in providers.ts).

Enums

priority

high | medium | low

triage_lane

reply | schedule | fyi | done

draft_tone

professional | friendly | brief

scheduled_send_status

pending | sent | cancelled | failed

users

ColumnTypeConstraints
idtextPK — Better Auth user ID
emailtextNOT NULL, UNIQUE
nametextnullable
corsair_tenant_idtextnullable — set after Google connect
backfill_completed_attimestamptznullable — initial classification done
created_attimestamptzNOT NULL, default now
updated_attimestamptzNOT NULL, default now

classifications

ColumnTypeConstraints
idtextPK
user_idtextFK → users.id, ON DELETE CASCADE
thread_idtextNOT NULL — Gmail thread ID
prioritypriority enumNOT NULL
lanetriage_lane enumNOT NULL
subjecttextNOT NULL — denormalized
sendertextNOT NULL — denormalized
snippettextNOT NULL — denormalized
scheduling_intentjsonbnullable — see shape below
classified_attimestamptzNOT NULL, default now
embeddingvector(768)nullable
embedding_providertextnullable — openai | gemini

Indexes:

  • classifications_user_idx on (user_id)
  • classifications_user_thread_idx on (user_id, thread_id)
  • classifications_user_provider_idx on (user_id, embedding_provider)

scheduling_intent JSON shape

{
  "proposedTimes": ["2026-06-20T14:00:00.000Z"],
  "attendees": ["guest@example.com"],
  "duration": 30,
  "confidence": 0.85
}

snoozes

ColumnTypeConstraints
idtextPK
user_idtextFK → users.id, CASCADE
thread_idtextNOT NULL
snoozed_untiltimestamptzNOT NULL
created_attimestamptzNOT NULL, default now

Index: snoozes_user_time_idx on (user_id, snoozed_until)

drafts

ColumnTypeConstraints
idtextPK
user_idtextFK → users.id, CASCADE
thread_idtextnullable
contenttextNOT NULL — HTML
tonedraft_tone enumnullable
approvedbooleanNOT NULL, default false
created_attimestamptzNOT NULL, default now

scheduled_sends

ColumnTypeConstraints
idtextPK
user_idtextFK → users.id, CASCADE
thread_idtextnullable
tojsonbNOT NULL — string array
subjecttextNOT NULL
bodytextNOT NULL
send_attimestamptzNOT NULL
statusscheduled_send_statusNOT NULL, default pending
sent_attimestamptznullable
created_attimestamptzNOT NULL, default now

Index: scheduled_sends_time_idx on (status, send_at)

thread_meetings

ColumnTypeConstraints
idtextPK
user_idtextFK → users.id, CASCADE
thread_idtextNOT NULL
event_idtextNOT NULL — Google Calendar event ID
slot_starttimestamptzNOT NULL
duration_minutesintegerNOT NULL
created_attimestamptzNOT NULL, default now

Index: thread_meetings_user_thread_idx on (user_id, thread_id)

webhook_logs

ColumnTypeConstraints
idtextPK
user_idtextFK → users.id, SET NULL
payloadjsonbNOT NULL
signaturetextnullable
verifiedbooleanNOT NULL
processed_attimestamptzNOT NULL, default now
errortextnullable

Better Auth tables

Managed by drizzle/0001_better_auth.sql — standard Better Auth schema (sessions, accounts, verifications). See Better Auth documentation for column details.

Corsair cache tables

Created by bun run corsair:setup — not in Drizzle schema. Stores synced Gmail/Calendar data and encrypted OAuth tokens. Access via Corsair SDK only.

Relations

users 1──* classifications
users 1──* snoozes
users 1──* drafts
users 1──* scheduled_sends
users 1──* thread_meetings
users 1──* webhook_logs