diff --git a/apps/ios/capacitor.config.ts b/apps/ios/capacitor.config.ts
index 88bdb5b426..133727300a 100644
--- a/apps/ios/capacitor.config.ts
+++ b/apps/ios/capacitor.config.ts
@@ -41,6 +41,9 @@ const config: CapacitorConfig = {
iOSClientId: '636969838408-0jbv7gq9793m0uchdrjlr8v1k6m5lh59.apps.googleusercontent.com',
},
},
+ PushNotifications: {
+ presentationOptions: ['badge', 'sound', 'alert'],
+ },
},
};
diff --git a/apps/ios/ios/App/App/App.entitlements b/apps/ios/ios/App/App/App.entitlements
index 907452dafd..ce3a3b2716 100644
--- a/apps/ios/ios/App/App/App.entitlements
+++ b/apps/ios/ios/App/App/App.entitlements
@@ -11,5 +11,7 @@
Default
+ aps-environment
+ production
diff --git a/apps/ios/ios/App/App/AppDelegate.swift b/apps/ios/ios/App/App/AppDelegate.swift
index c3cd83b5c0..6b60b74264 100644
--- a/apps/ios/ios/App/App/AppDelegate.swift
+++ b/apps/ios/ios/App/App/AppDelegate.swift
@@ -11,6 +11,16 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
return true
}
+ // MARK: - Push Notifications
+
+ func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
+ NotificationCenter.default.post(name: .capacitorDidRegisterForRemoteNotifications, object: deviceToken)
+ }
+
+ func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
+ NotificationCenter.default.post(name: .capacitorDidFailToRegisterForRemoteNotifications, object: error)
+ }
+
func applicationWillResignActive(_ application: UIApplication) {
// Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
// Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game.
diff --git a/apps/ios/package.json b/apps/ios/package.json
index fdd7d09564..bffe43fba4 100644
--- a/apps/ios/package.json
+++ b/apps/ios/package.json
@@ -19,6 +19,7 @@
"@capacitor/ios": "^7.0.3",
"@capacitor/keyboard": "^7.0.3",
"@capacitor/preferences": "^7.0.3",
+ "@capacitor/push-notifications": "^7.0.0",
"@capacitor/splash-screen": "^7.0.3",
"@capacitor/status-bar": "^7.0.3",
"@capgo/capacitor-social-login": "^7.20.0"
diff --git a/apps/web/src/app/api/notifications/push-tokens/route.ts b/apps/web/src/app/api/notifications/push-tokens/route.ts
new file mode 100644
index 0000000000..dd3f0f03e7
--- /dev/null
+++ b/apps/web/src/app/api/notifications/push-tokens/route.ts
@@ -0,0 +1,106 @@
+import { NextResponse } from 'next/server';
+import {
+ registerPushToken,
+ unregisterPushToken,
+ getUserPushTokens,
+} from '@pagespace/lib/notifications';
+import { loggers } from '@pagespace/lib/server';
+import { authenticateRequestWithOptions, isAuthError } from '@/lib/auth';
+
+const AUTH_OPTIONS = { allow: ['session'] as const, requireCSRF: true };
+
+export async function GET(req: Request) {
+ const auth = await authenticateRequestWithOptions(req, AUTH_OPTIONS);
+ if (isAuthError(auth)) {
+ return auth.error;
+ }
+ const userId = auth.userId;
+
+ try {
+ const tokens = await getUserPushTokens(userId);
+ return NextResponse.json({ tokens });
+ } catch (error) {
+ loggers.api.error('Error fetching push tokens:', error as Error);
+ return NextResponse.json(
+ { error: 'Failed to fetch push tokens' },
+ { status: 500 }
+ );
+ }
+}
+
+export async function POST(req: Request) {
+ const auth = await authenticateRequestWithOptions(req, AUTH_OPTIONS);
+ if (isAuthError(auth)) {
+ return auth.error;
+ }
+ const userId = auth.userId;
+
+ try {
+ const body = await req.json();
+ const { token, platform, deviceId, deviceName, webPushSubscription } = body;
+
+ if (!token || !platform) {
+ return NextResponse.json(
+ { error: 'Token and platform are required' },
+ { status: 400 }
+ );
+ }
+
+ if (!['ios', 'android', 'web'].includes(platform)) {
+ return NextResponse.json(
+ { error: 'Invalid platform. Must be ios, android, or web' },
+ { status: 400 }
+ );
+ }
+
+ const result = await registerPushToken(
+ userId,
+ token,
+ platform,
+ deviceId,
+ deviceName,
+ webPushSubscription
+ );
+
+ return NextResponse.json({
+ success: true,
+ tokenId: result.id,
+ });
+ } catch (error) {
+ loggers.api.error('Error registering push token:', error as Error);
+ return NextResponse.json(
+ { error: 'Failed to register push token' },
+ { status: 500 }
+ );
+ }
+}
+
+export async function DELETE(req: Request) {
+ const auth = await authenticateRequestWithOptions(req, AUTH_OPTIONS);
+ if (isAuthError(auth)) {
+ return auth.error;
+ }
+ const userId = auth.userId;
+
+ try {
+ const body = await req.json();
+ const { token } = body;
+
+ if (!token) {
+ return NextResponse.json(
+ { error: 'Token is required' },
+ { status: 400 }
+ );
+ }
+
+ await unregisterPushToken(userId, token);
+
+ return NextResponse.json({ success: true });
+ } catch (error) {
+ loggers.api.error('Error unregistering push token:', error as Error);
+ return NextResponse.json(
+ { error: 'Failed to unregister push token' },
+ { status: 500 }
+ );
+ }
+}
diff --git a/apps/web/src/hooks/usePushNotifications.ts b/apps/web/src/hooks/usePushNotifications.ts
new file mode 100644
index 0000000000..9e2f589985
--- /dev/null
+++ b/apps/web/src/hooks/usePushNotifications.ts
@@ -0,0 +1,316 @@
+'use client';
+
+import { useEffect, useState, useCallback, useRef } from 'react';
+import { useCapacitor } from './useCapacitor';
+import { useAuth } from './useAuth';
+import { post, del } from '@/lib/auth/auth-fetch';
+import { getOrCreateDeviceId, getDeviceName } from '@/lib/analytics';
+
+type PermissionStatus = 'prompt' | 'granted' | 'denied' | 'unknown';
+
+interface PushNotificationState {
+ isSupported: boolean;
+ permissionStatus: PermissionStatus;
+ isRegistered: boolean;
+ isLoading: boolean;
+ error: string | null;
+}
+
+interface PushNotificationActions {
+ requestPermission: () => Promise;
+ registerToken: () => Promise;
+ unregisterToken: () => Promise;
+}
+
+interface PushNotificationSchema {
+ title?: string;
+ body?: string;
+ id: string;
+ data: Record;
+}
+
+interface ActionPerformed {
+ actionId: string;
+ notification: PushNotificationSchema;
+}
+
+export function usePushNotifications(): PushNotificationState & PushNotificationActions {
+ const { isNative, platform, isReady } = useCapacitor();
+ const { isAuthenticated, user } = useAuth();
+
+ const [state, setState] = useState({
+ isSupported: false,
+ permissionStatus: 'unknown',
+ isRegistered: false,
+ isLoading: false,
+ error: null,
+ });
+
+ const tokenRef = useRef(null);
+ const hasRegisteredRef = useRef(false);
+ const pushNotificationsRef = useRef(null);
+
+ // Check if push notifications are supported
+ useEffect(() => {
+ if (!isReady) return;
+
+ const checkSupport = async () => {
+ // Only supported on iOS for now
+ if (isNative && platform === 'ios') {
+ try {
+ const { PushNotifications } = await import('@capacitor/push-notifications');
+ pushNotificationsRef.current = PushNotifications;
+ setState(prev => ({ ...prev, isSupported: true }));
+ } catch {
+ setState(prev => ({ ...prev, isSupported: false }));
+ }
+ } else {
+ setState(prev => ({ ...prev, isSupported: false }));
+ }
+ };
+
+ checkSupport();
+ }, [isNative, platform, isReady]);
+
+ // Check permission status
+ useEffect(() => {
+ if (!state.isSupported || !pushNotificationsRef.current) return;
+
+ const checkPermission = async () => {
+ const PushNotifications = pushNotificationsRef.current;
+ if (!PushNotifications) return;
+
+ try {
+ const result = await PushNotifications.checkPermissions();
+ setState(prev => ({
+ ...prev,
+ permissionStatus: result.receive as PermissionStatus,
+ }));
+ } catch (error) {
+ console.error('[PushNotifications] Error checking permissions:', error);
+ }
+ };
+
+ checkPermission();
+ }, [state.isSupported]);
+
+ // Set up listeners for push notification events
+ useEffect(() => {
+ if (!state.isSupported || !pushNotificationsRef.current) return;
+
+ const PushNotifications = pushNotificationsRef.current;
+ const listeners: (() => void)[] = [];
+
+ const setupListeners = async () => {
+ // Registration success
+ const registrationListener = await PushNotifications.addListener(
+ 'registration',
+ (token: { value: string }) => {
+ console.log('[PushNotifications] Registered with token:', token.value.substring(0, 20) + '...');
+ tokenRef.current = token.value;
+ registerTokenWithServer(token.value);
+ }
+ );
+ listeners.push(() => registrationListener.remove());
+
+ // Registration error
+ const registrationErrorListener = await PushNotifications.addListener(
+ 'registrationError',
+ (error: { error: string }) => {
+ console.error('[PushNotifications] Registration error:', error);
+ setState(prev => ({
+ ...prev,
+ error: error.error,
+ isLoading: false,
+ }));
+ }
+ );
+ listeners.push(() => registrationErrorListener.remove());
+
+ // Notification received while app is in foreground
+ const receivedListener = await PushNotifications.addListener(
+ 'pushNotificationReceived',
+ (notification: PushNotificationSchema) => {
+ console.log('[PushNotifications] Received:', notification);
+ // Handle foreground notification
+ // Could dispatch an event or update state here
+ if (typeof window !== 'undefined') {
+ window.dispatchEvent(new CustomEvent('push:received', {
+ detail: notification,
+ }));
+ }
+ }
+ );
+ listeners.push(() => receivedListener.remove());
+
+ // Notification tapped
+ const actionListener = await PushNotifications.addListener(
+ 'pushNotificationActionPerformed',
+ (action: ActionPerformed) => {
+ console.log('[PushNotifications] Action performed:', action);
+ // Handle notification tap
+ if (typeof window !== 'undefined') {
+ window.dispatchEvent(new CustomEvent('push:action', {
+ detail: action,
+ }));
+ }
+ }
+ );
+ listeners.push(() => actionListener.remove());
+ };
+
+ setupListeners();
+
+ return () => {
+ listeners.forEach(remove => remove());
+ };
+ }, [state.isSupported]);
+
+ // Register token with server
+ const registerTokenWithServer = useCallback(async (token: string) => {
+ if (!isAuthenticated || hasRegisteredRef.current) return;
+
+ setState(prev => ({ ...prev, isLoading: true, error: null }));
+
+ try {
+ const deviceId = getOrCreateDeviceId();
+ const deviceName = getDeviceName();
+
+ await post('/api/notifications/push-tokens', {
+ token,
+ platform,
+ deviceId,
+ deviceName,
+ });
+
+ hasRegisteredRef.current = true;
+ setState(prev => ({
+ ...prev,
+ isRegistered: true,
+ isLoading: false,
+ }));
+
+ console.log('[PushNotifications] Token registered with server');
+ } catch (error) {
+ console.error('[PushNotifications] Failed to register token:', error);
+ setState(prev => ({
+ ...prev,
+ error: error instanceof Error ? error.message : 'Failed to register token',
+ isLoading: false,
+ }));
+ }
+ }, [isAuthenticated, platform]);
+
+ // Request permission and register for push notifications
+ const requestPermission = useCallback(async (): Promise => {
+ if (!state.isSupported || !pushNotificationsRef.current) {
+ return false;
+ }
+
+ const PushNotifications = pushNotificationsRef.current;
+ setState(prev => ({ ...prev, isLoading: true, error: null }));
+
+ try {
+ // Request permission
+ const permResult = await PushNotifications.requestPermissions();
+
+ if (permResult.receive === 'granted') {
+ setState(prev => ({ ...prev, permissionStatus: 'granted' }));
+
+ // Register with APNs
+ await PushNotifications.register();
+
+ return true;
+ } else {
+ setState(prev => ({
+ ...prev,
+ permissionStatus: permResult.receive as PermissionStatus,
+ isLoading: false,
+ }));
+ return false;
+ }
+ } catch (error) {
+ console.error('[PushNotifications] Error requesting permission:', error);
+ setState(prev => ({
+ ...prev,
+ error: error instanceof Error ? error.message : 'Failed to request permission',
+ isLoading: false,
+ }));
+ return false;
+ }
+ }, [state.isSupported]);
+
+ // Manually register token (if already have permission)
+ const registerToken = useCallback(async (): Promise => {
+ if (!state.isSupported || !pushNotificationsRef.current) {
+ return false;
+ }
+
+ if (state.permissionStatus !== 'granted') {
+ return requestPermission();
+ }
+
+ const PushNotifications = pushNotificationsRef.current;
+
+ try {
+ await PushNotifications.register();
+ return true;
+ } catch (error) {
+ console.error('[PushNotifications] Error registering:', error);
+ setState(prev => ({
+ ...prev,
+ error: error instanceof Error ? error.message : 'Failed to register',
+ }));
+ return false;
+ }
+ }, [state.isSupported, state.permissionStatus, requestPermission]);
+
+ // Unregister token
+ const unregisterToken = useCallback(async (): Promise => {
+ if (!tokenRef.current) return;
+
+ try {
+ await del('/api/notifications/push-tokens', { token: tokenRef.current });
+ tokenRef.current = null;
+ hasRegisteredRef.current = false;
+ setState(prev => ({ ...prev, isRegistered: false }));
+ console.log('[PushNotifications] Token unregistered');
+ } catch (error) {
+ console.error('[PushNotifications] Failed to unregister token:', error);
+ }
+ }, []);
+
+ // Auto-register when user is authenticated and permission is granted
+ useEffect(() => {
+ if (
+ isAuthenticated &&
+ state.isSupported &&
+ state.permissionStatus === 'granted' &&
+ !state.isRegistered &&
+ !hasRegisteredRef.current &&
+ tokenRef.current
+ ) {
+ registerTokenWithServer(tokenRef.current);
+ }
+ }, [isAuthenticated, state.isSupported, state.permissionStatus, state.isRegistered, registerTokenWithServer]);
+
+ // Clean up on logout
+ useEffect(() => {
+ if (!isAuthenticated && state.isRegistered) {
+ unregisterToken();
+ }
+ }, [isAuthenticated, state.isRegistered, unregisterToken]);
+
+ // Reset registration state when user changes
+ useEffect(() => {
+ hasRegisteredRef.current = false;
+ setState(prev => ({ ...prev, isRegistered: false }));
+ }, [user?.id]);
+
+ return {
+ ...state,
+ requestPermission,
+ registerToken,
+ unregisterToken,
+ };
+}
diff --git a/apps/web/src/types/capacitor-plugins.d.ts b/apps/web/src/types/capacitor-plugins.d.ts
index 29ac459b7d..ef5f5fba7d 100644
--- a/apps/web/src/types/capacitor-plugins.d.ts
+++ b/apps/web/src/types/capacitor-plugins.d.ts
@@ -32,3 +32,67 @@ declare module "@capacitor/browser" {
open(options: { url: string }): Promise;
};
}
+
+declare module "@capacitor/push-notifications" {
+ interface PluginListenerHandle {
+ remove: () => Promise;
+ }
+
+ interface PermissionStatus {
+ receive: "prompt" | "prompt-with-rationale" | "granted" | "denied";
+ }
+
+ interface Token {
+ value: string;
+ }
+
+ interface RegistrationError {
+ error: string;
+ }
+
+ interface PushNotificationSchema {
+ title?: string;
+ subtitle?: string;
+ body?: string;
+ id: string;
+ tag?: string;
+ badge?: number;
+ data: Record;
+ click_action?: string;
+ link?: string;
+ group?: string;
+ groupSummary?: boolean;
+ }
+
+ interface ActionPerformed {
+ actionId: string;
+ inputValue?: string;
+ notification: PushNotificationSchema;
+ }
+
+ export const PushNotifications: {
+ checkPermissions(): Promise;
+ requestPermissions(): Promise;
+ register(): Promise;
+ unregister(): Promise;
+ getDeliveredNotifications(): Promise<{ notifications: PushNotificationSchema[] }>;
+ removeDeliveredNotifications(options: { notifications: PushNotificationSchema[] }): Promise;
+ removeAllDeliveredNotifications(): Promise;
+ addListener(
+ event: "registration",
+ cb: (token: Token) => void
+ ): Promise;
+ addListener(
+ event: "registrationError",
+ cb: (error: RegistrationError) => void
+ ): Promise;
+ addListener(
+ event: "pushNotificationReceived",
+ cb: (notification: PushNotificationSchema) => void
+ ): Promise;
+ addListener(
+ event: "pushNotificationActionPerformed",
+ cb: (action: ActionPerformed) => void
+ ): Promise;
+ };
+}
diff --git a/packages/db/drizzle/0056_funny_mentor.sql b/packages/db/drizzle/0056_funny_mentor.sql
new file mode 100644
index 0000000000..e8ad4537f1
--- /dev/null
+++ b/packages/db/drizzle/0056_funny_mentor.sql
@@ -0,0 +1,32 @@
+DO $$ BEGIN
+ CREATE TYPE "public"."PushPlatformType" AS ENUM('ios', 'android', 'web');
+EXCEPTION
+ WHEN duplicate_object THEN null;
+END $$;
+--> statement-breakpoint
+CREATE TABLE IF NOT EXISTS "push_notification_tokens" (
+ "id" text PRIMARY KEY NOT NULL,
+ "userId" text NOT NULL,
+ "token" text NOT NULL,
+ "platform" "PushPlatformType" NOT NULL,
+ "deviceId" text,
+ "deviceName" text,
+ "isActive" boolean DEFAULT true NOT NULL,
+ "webPushSubscription" text,
+ "createdAt" timestamp DEFAULT now() NOT NULL,
+ "updatedAt" timestamp DEFAULT now() NOT NULL,
+ "lastUsedAt" timestamp,
+ "failedAttempts" text DEFAULT '0',
+ "lastFailedAt" timestamp
+);
+--> statement-breakpoint
+DO $$ BEGIN
+ ALTER TABLE "push_notification_tokens" ADD CONSTRAINT "push_notification_tokens_userId_users_id_fk" FOREIGN KEY ("userId") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action;
+EXCEPTION
+ WHEN duplicate_object THEN null;
+END $$;
+--> statement-breakpoint
+CREATE INDEX IF NOT EXISTS "push_notification_tokens_user_id_idx" ON "push_notification_tokens" USING btree ("userId");--> statement-breakpoint
+CREATE INDEX IF NOT EXISTS "push_notification_tokens_token_idx" ON "push_notification_tokens" USING btree ("token");--> statement-breakpoint
+CREATE INDEX IF NOT EXISTS "push_notification_tokens_platform_idx" ON "push_notification_tokens" USING btree ("platform");--> statement-breakpoint
+CREATE INDEX IF NOT EXISTS "push_notification_tokens_active_idx" ON "push_notification_tokens" USING btree ("userId","isActive");
\ No newline at end of file
diff --git a/packages/db/drizzle/meta/0056_snapshot.json b/packages/db/drizzle/meta/0056_snapshot.json
new file mode 100644
index 0000000000..da121903c6
--- /dev/null
+++ b/packages/db/drizzle/meta/0056_snapshot.json
@@ -0,0 +1,9794 @@
+{
+ "id": "5fe16c13-7aed-474f-baac-07c244c0a449",
+ "prevId": "0b9f36ce-ef1b-4ae4-a13e-8c4b96534a03",
+ "version": "7",
+ "dialect": "postgresql",
+ "tables": {
+ "public.device_tokens": {
+ "name": "device_tokens",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "userId": {
+ "name": "userId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "tokenHash": {
+ "name": "tokenHash",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "tokenPrefix": {
+ "name": "tokenPrefix",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "expiresAt": {
+ "name": "expiresAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "lastUsedAt": {
+ "name": "lastUsedAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "deviceId": {
+ "name": "deviceId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "platform": {
+ "name": "platform",
+ "type": "PlatformType",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "deviceName": {
+ "name": "deviceName",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "tokenVersion": {
+ "name": "tokenVersion",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 0
+ },
+ "userAgent": {
+ "name": "userAgent",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "ipAddress": {
+ "name": "ipAddress",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "lastIpAddress": {
+ "name": "lastIpAddress",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "location": {
+ "name": "location",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "trustScore": {
+ "name": "trustScore",
+ "type": "real",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 1
+ },
+ "suspiciousActivityCount": {
+ "name": "suspiciousActivityCount",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 0
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "revokedAt": {
+ "name": "revokedAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "revokedReason": {
+ "name": "revokedReason",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "replacedByTokenId": {
+ "name": "replacedByTokenId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {
+ "device_tokens_user_id_idx": {
+ "name": "device_tokens_user_id_idx",
+ "columns": [
+ {
+ "expression": "userId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "device_tokens_token_hash_idx": {
+ "name": "device_tokens_token_hash_idx",
+ "columns": [
+ {
+ "expression": "tokenHash",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "device_tokens_device_id_idx": {
+ "name": "device_tokens_device_id_idx",
+ "columns": [
+ {
+ "expression": "deviceId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "device_tokens_expires_at_idx": {
+ "name": "device_tokens_expires_at_idx",
+ "columns": [
+ {
+ "expression": "expiresAt",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "device_tokens_active_device_idx": {
+ "name": "device_tokens_active_device_idx",
+ "columns": [
+ {
+ "expression": "userId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "deviceId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "platform",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "where": "\"device_tokens\".\"revokedAt\" IS NULL",
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "device_tokens_userId_users_id_fk": {
+ "name": "device_tokens_userId_users_id_fk",
+ "tableFrom": "device_tokens",
+ "tableTo": "users",
+ "columnsFrom": [
+ "userId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "device_tokens_tokenHash_unique": {
+ "name": "device_tokens_tokenHash_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "tokenHash"
+ ]
+ }
+ }
+ },
+ "public.email_unsubscribe_tokens": {
+ "name": "email_unsubscribe_tokens",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "token_hash": {
+ "name": "token_hash",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "token_prefix": {
+ "name": "token_prefix",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "user_id": {
+ "name": "user_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "notification_type": {
+ "name": "notification_type",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "expires_at": {
+ "name": "expires_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "used_at": {
+ "name": "used_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "email_unsubscribe_tokens_token_hash_idx": {
+ "name": "email_unsubscribe_tokens_token_hash_idx",
+ "columns": [
+ {
+ "expression": "token_hash",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "email_unsubscribe_tokens_user_id_idx": {
+ "name": "email_unsubscribe_tokens_user_id_idx",
+ "columns": [
+ {
+ "expression": "user_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "email_unsubscribe_tokens_expires_at_idx": {
+ "name": "email_unsubscribe_tokens_expires_at_idx",
+ "columns": [
+ {
+ "expression": "expires_at",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "email_unsubscribe_tokens_user_id_users_id_fk": {
+ "name": "email_unsubscribe_tokens_user_id_users_id_fk",
+ "tableFrom": "email_unsubscribe_tokens",
+ "tableTo": "users",
+ "columnsFrom": [
+ "user_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "email_unsubscribe_tokens_token_hash_unique": {
+ "name": "email_unsubscribe_tokens_token_hash_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "token_hash"
+ ]
+ }
+ }
+ },
+ "public.mcp_tokens": {
+ "name": "mcp_tokens",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "userId": {
+ "name": "userId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "tokenHash": {
+ "name": "tokenHash",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "tokenPrefix": {
+ "name": "tokenPrefix",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "lastUsed": {
+ "name": "lastUsed",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "revokedAt": {
+ "name": "revokedAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {
+ "mcp_tokens_user_id_idx": {
+ "name": "mcp_tokens_user_id_idx",
+ "columns": [
+ {
+ "expression": "userId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "mcp_tokens_token_hash_idx": {
+ "name": "mcp_tokens_token_hash_idx",
+ "columns": [
+ {
+ "expression": "tokenHash",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "mcp_tokens_userId_users_id_fk": {
+ "name": "mcp_tokens_userId_users_id_fk",
+ "tableFrom": "mcp_tokens",
+ "tableTo": "users",
+ "columnsFrom": [
+ "userId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "mcp_tokens_tokenHash_unique": {
+ "name": "mcp_tokens_tokenHash_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "tokenHash"
+ ]
+ }
+ }
+ },
+ "public.socket_tokens": {
+ "name": "socket_tokens",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "userId": {
+ "name": "userId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "tokenHash": {
+ "name": "tokenHash",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "expiresAt": {
+ "name": "expiresAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "socket_tokens_user_id_idx": {
+ "name": "socket_tokens_user_id_idx",
+ "columns": [
+ {
+ "expression": "userId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "socket_tokens_token_hash_idx": {
+ "name": "socket_tokens_token_hash_idx",
+ "columns": [
+ {
+ "expression": "tokenHash",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "socket_tokens_expires_at_idx": {
+ "name": "socket_tokens_expires_at_idx",
+ "columns": [
+ {
+ "expression": "expiresAt",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "socket_tokens_userId_users_id_fk": {
+ "name": "socket_tokens_userId_users_id_fk",
+ "tableFrom": "socket_tokens",
+ "tableTo": "users",
+ "columnsFrom": [
+ "userId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "socket_tokens_tokenHash_unique": {
+ "name": "socket_tokens_tokenHash_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "tokenHash"
+ ]
+ }
+ }
+ },
+ "public.users": {
+ "name": "users",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "email": {
+ "name": "email",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "emailVerified": {
+ "name": "emailVerified",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "image": {
+ "name": "image",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "password": {
+ "name": "password",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "googleId": {
+ "name": "googleId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "appleId": {
+ "name": "appleId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "provider": {
+ "name": "provider",
+ "type": "AuthProvider",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'email'"
+ },
+ "tokenVersion": {
+ "name": "tokenVersion",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 0
+ },
+ "role": {
+ "name": "role",
+ "type": "UserRole",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'user'"
+ },
+ "adminRoleVersion": {
+ "name": "adminRoleVersion",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 0
+ },
+ "currentAiProvider": {
+ "name": "currentAiProvider",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'pagespace'"
+ },
+ "currentAiModel": {
+ "name": "currentAiModel",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'glm-4.5-air'"
+ },
+ "storageUsedBytes": {
+ "name": "storageUsedBytes",
+ "type": "real",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 0
+ },
+ "activeUploads": {
+ "name": "activeUploads",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 0
+ },
+ "lastStorageCalculated": {
+ "name": "lastStorageCalculated",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "stripeCustomerId": {
+ "name": "stripeCustomerId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "subscriptionTier": {
+ "name": "subscriptionTier",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'free'"
+ },
+ "tosAcceptedAt": {
+ "name": "tosAcceptedAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "failedLoginAttempts": {
+ "name": "failedLoginAttempts",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 0
+ },
+ "lockedUntil": {
+ "name": "lockedUntil",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "suspendedAt": {
+ "name": "suspendedAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "suspendedReason": {
+ "name": "suspendedReason",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updatedAt": {
+ "name": "updatedAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "users_email_unique": {
+ "name": "users_email_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "email"
+ ]
+ },
+ "users_googleId_unique": {
+ "name": "users_googleId_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "googleId"
+ ]
+ },
+ "users_appleId_unique": {
+ "name": "users_appleId_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "appleId"
+ ]
+ },
+ "users_stripeCustomerId_unique": {
+ "name": "users_stripeCustomerId_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "stripeCustomerId"
+ ]
+ }
+ }
+ },
+ "public.verification_tokens": {
+ "name": "verification_tokens",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "userId": {
+ "name": "userId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "tokenHash": {
+ "name": "tokenHash",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "tokenPrefix": {
+ "name": "tokenPrefix",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "type": {
+ "name": "type",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "expiresAt": {
+ "name": "expiresAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "usedAt": {
+ "name": "usedAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {
+ "verification_tokens_user_id_idx": {
+ "name": "verification_tokens_user_id_idx",
+ "columns": [
+ {
+ "expression": "userId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "verification_tokens_token_hash_idx": {
+ "name": "verification_tokens_token_hash_idx",
+ "columns": [
+ {
+ "expression": "tokenHash",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "verification_tokens_type_idx": {
+ "name": "verification_tokens_type_idx",
+ "columns": [
+ {
+ "expression": "type",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "verification_tokens_userId_users_id_fk": {
+ "name": "verification_tokens_userId_users_id_fk",
+ "tableFrom": "verification_tokens",
+ "tableTo": "users",
+ "columnsFrom": [
+ "userId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "verification_tokens_tokenHash_unique": {
+ "name": "verification_tokens_tokenHash_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "tokenHash"
+ ]
+ }
+ }
+ },
+ "public.sessions": {
+ "name": "sessions",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "token_hash": {
+ "name": "token_hash",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "token_prefix": {
+ "name": "token_prefix",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "user_id": {
+ "name": "user_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "type": {
+ "name": "type",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "scopes": {
+ "name": "scopes",
+ "type": "text[]",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "ARRAY[]::text[]"
+ },
+ "resource_type": {
+ "name": "resource_type",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "resource_id": {
+ "name": "resource_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "drive_id": {
+ "name": "drive_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "token_version": {
+ "name": "token_version",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "created_by_service": {
+ "name": "created_by_service",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_by_ip": {
+ "name": "created_by_ip",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "expires_at": {
+ "name": "expires_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "last_used_at": {
+ "name": "last_used_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "last_used_ip": {
+ "name": "last_used_ip",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "revoked_at": {
+ "name": "revoked_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "revoked_reason": {
+ "name": "revoked_reason",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "sessions_user_id_idx": {
+ "name": "sessions_user_id_idx",
+ "columns": [
+ {
+ "expression": "user_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "sessions_expires_at_idx": {
+ "name": "sessions_expires_at_idx",
+ "columns": [
+ {
+ "expression": "expires_at",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "sessions_user_active_idx": {
+ "name": "sessions_user_active_idx",
+ "columns": [
+ {
+ "expression": "user_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "revoked_at",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "expires_at",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "sessions_user_id_users_id_fk": {
+ "name": "sessions_user_id_users_id_fk",
+ "tableFrom": "sessions",
+ "tableTo": "users",
+ "columnsFrom": [
+ "user_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "sessions_token_hash_unique": {
+ "name": "sessions_token_hash_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "token_hash"
+ ]
+ }
+ }
+ },
+ "public.chat_messages": {
+ "name": "chat_messages",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "pageId": {
+ "name": "pageId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "conversationId": {
+ "name": "conversationId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "role": {
+ "name": "role",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "content": {
+ "name": "content",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "toolCalls": {
+ "name": "toolCalls",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "toolResults": {
+ "name": "toolResults",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "isActive": {
+ "name": "isActive",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": true
+ },
+ "editedAt": {
+ "name": "editedAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "userId": {
+ "name": "userId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "sourceAgentId": {
+ "name": "sourceAgentId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "messageType": {
+ "name": "messageType",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'standard'"
+ }
+ },
+ "indexes": {
+ "chat_messages_page_id_idx": {
+ "name": "chat_messages_page_id_idx",
+ "columns": [
+ {
+ "expression": "pageId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "chat_messages_user_id_idx": {
+ "name": "chat_messages_user_id_idx",
+ "columns": [
+ {
+ "expression": "userId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "chat_messages_conversation_id_idx": {
+ "name": "chat_messages_conversation_id_idx",
+ "columns": [
+ {
+ "expression": "conversationId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "chat_messages_page_id_conversation_id_idx": {
+ "name": "chat_messages_page_id_conversation_id_idx",
+ "columns": [
+ {
+ "expression": "pageId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "conversationId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "chat_messages_page_id_is_active_created_at_idx": {
+ "name": "chat_messages_page_id_is_active_created_at_idx",
+ "columns": [
+ {
+ "expression": "pageId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "isActive",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "createdAt",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "chat_messages_pageId_pages_id_fk": {
+ "name": "chat_messages_pageId_pages_id_fk",
+ "tableFrom": "chat_messages",
+ "tableTo": "pages",
+ "columnsFrom": [
+ "pageId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "chat_messages_userId_users_id_fk": {
+ "name": "chat_messages_userId_users_id_fk",
+ "tableFrom": "chat_messages",
+ "tableTo": "users",
+ "columnsFrom": [
+ "userId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "chat_messages_sourceAgentId_pages_id_fk": {
+ "name": "chat_messages_sourceAgentId_pages_id_fk",
+ "tableFrom": "chat_messages",
+ "tableTo": "pages",
+ "columnsFrom": [
+ "sourceAgentId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "set null",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "public.drives": {
+ "name": "drives",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "slug": {
+ "name": "slug",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "ownerId": {
+ "name": "ownerId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "isTrashed": {
+ "name": "isTrashed",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "trashedAt": {
+ "name": "trashedAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updatedAt": {
+ "name": "updatedAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "drivePrompt": {
+ "name": "drivePrompt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {
+ "drives_owner_id_idx": {
+ "name": "drives_owner_id_idx",
+ "columns": [
+ {
+ "expression": "ownerId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "drives_owner_id_slug_key": {
+ "name": "drives_owner_id_slug_key",
+ "columns": [
+ {
+ "expression": "ownerId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "slug",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "drives_ownerId_users_id_fk": {
+ "name": "drives_ownerId_users_id_fk",
+ "tableFrom": "drives",
+ "tableTo": "users",
+ "columnsFrom": [
+ "ownerId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "public.favorites": {
+ "name": "favorites",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "userId": {
+ "name": "userId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "pageId": {
+ "name": "pageId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {
+ "favorites_user_id_page_id_key": {
+ "name": "favorites_user_id_page_id_key",
+ "columns": [
+ {
+ "expression": "userId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "pageId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "favorites_userId_users_id_fk": {
+ "name": "favorites_userId_users_id_fk",
+ "tableFrom": "favorites",
+ "tableTo": "users",
+ "columnsFrom": [
+ "userId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "favorites_pageId_pages_id_fk": {
+ "name": "favorites_pageId_pages_id_fk",
+ "tableFrom": "favorites",
+ "tableTo": "pages",
+ "columnsFrom": [
+ "pageId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "public.mentions": {
+ "name": "mentions",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "sourcePageId": {
+ "name": "sourcePageId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "targetPageId": {
+ "name": "targetPageId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {
+ "mentions_source_page_id_target_page_id_key": {
+ "name": "mentions_source_page_id_target_page_id_key",
+ "columns": [
+ {
+ "expression": "sourcePageId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "targetPageId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "mentions_source_page_id_idx": {
+ "name": "mentions_source_page_id_idx",
+ "columns": [
+ {
+ "expression": "sourcePageId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "mentions_target_page_id_idx": {
+ "name": "mentions_target_page_id_idx",
+ "columns": [
+ {
+ "expression": "targetPageId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "mentions_sourcePageId_pages_id_fk": {
+ "name": "mentions_sourcePageId_pages_id_fk",
+ "tableFrom": "mentions",
+ "tableTo": "pages",
+ "columnsFrom": [
+ "sourcePageId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "mentions_targetPageId_pages_id_fk": {
+ "name": "mentions_targetPageId_pages_id_fk",
+ "tableFrom": "mentions",
+ "tableTo": "pages",
+ "columnsFrom": [
+ "targetPageId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "public.page_tags": {
+ "name": "page_tags",
+ "schema": "",
+ "columns": {
+ "pageId": {
+ "name": "pageId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "tagId": {
+ "name": "tagId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "page_tags_pageId_pages_id_fk": {
+ "name": "page_tags_pageId_pages_id_fk",
+ "tableFrom": "page_tags",
+ "tableTo": "pages",
+ "columnsFrom": [
+ "pageId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "page_tags_tagId_tags_id_fk": {
+ "name": "page_tags_tagId_tags_id_fk",
+ "tableFrom": "page_tags",
+ "tableTo": "tags",
+ "columnsFrom": [
+ "tagId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {
+ "page_tags_pageId_tagId_pk": {
+ "name": "page_tags_pageId_tagId_pk",
+ "columns": [
+ "pageId",
+ "tagId"
+ ]
+ }
+ },
+ "uniqueConstraints": {}
+ },
+ "public.pages": {
+ "name": "pages",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "title": {
+ "name": "title",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "type": {
+ "name": "type",
+ "type": "PageType",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "content": {
+ "name": "content",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "''"
+ },
+ "isPaginated": {
+ "name": "isPaginated",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "position": {
+ "name": "position",
+ "type": "real",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "isTrashed": {
+ "name": "isTrashed",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "aiProvider": {
+ "name": "aiProvider",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "aiModel": {
+ "name": "aiModel",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "systemPrompt": {
+ "name": "systemPrompt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "enabledTools": {
+ "name": "enabledTools",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "includeDrivePrompt": {
+ "name": "includeDrivePrompt",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "agentDefinition": {
+ "name": "agentDefinition",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "visibleToGlobalAssistant": {
+ "name": "visibleToGlobalAssistant",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": true
+ },
+ "includePageTree": {
+ "name": "includePageTree",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "pageTreeScope": {
+ "name": "pageTreeScope",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false,
+ "default": "'children'"
+ },
+ "fileSize": {
+ "name": "fileSize",
+ "type": "real",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "mimeType": {
+ "name": "mimeType",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "originalFileName": {
+ "name": "originalFileName",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "filePath": {
+ "name": "filePath",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "fileMetadata": {
+ "name": "fileMetadata",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "processingStatus": {
+ "name": "processingStatus",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false,
+ "default": "'pending'"
+ },
+ "processingError": {
+ "name": "processingError",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "processedAt": {
+ "name": "processedAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "extractionMethod": {
+ "name": "extractionMethod",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "extractionMetadata": {
+ "name": "extractionMetadata",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "contentHash": {
+ "name": "contentHash",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updatedAt": {
+ "name": "updatedAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "trashedAt": {
+ "name": "trashedAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "revision": {
+ "name": "revision",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 0
+ },
+ "stateHash": {
+ "name": "stateHash",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "driveId": {
+ "name": "driveId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "parentId": {
+ "name": "parentId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "originalParentId": {
+ "name": "originalParentId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {
+ "pages_drive_id_idx": {
+ "name": "pages_drive_id_idx",
+ "columns": [
+ {
+ "expression": "driveId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "pages_parent_id_idx": {
+ "name": "pages_parent_id_idx",
+ "columns": [
+ {
+ "expression": "parentId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "pages_parent_id_position_idx": {
+ "name": "pages_parent_id_position_idx",
+ "columns": [
+ {
+ "expression": "parentId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "position",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "pages_driveId_drives_id_fk": {
+ "name": "pages_driveId_drives_id_fk",
+ "tableFrom": "pages",
+ "tableTo": "drives",
+ "columnsFrom": [
+ "driveId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "public.storage_events": {
+ "name": "storage_events",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "userId": {
+ "name": "userId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "pageId": {
+ "name": "pageId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "eventType": {
+ "name": "eventType",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "sizeDelta": {
+ "name": "sizeDelta",
+ "type": "real",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "totalSizeAfter": {
+ "name": "totalSizeAfter",
+ "type": "real",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "metadata": {
+ "name": "metadata",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "storage_events_user_id_idx": {
+ "name": "storage_events_user_id_idx",
+ "columns": [
+ {
+ "expression": "userId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "storage_events_created_at_idx": {
+ "name": "storage_events_created_at_idx",
+ "columns": [
+ {
+ "expression": "createdAt",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "storage_events_userId_users_id_fk": {
+ "name": "storage_events_userId_users_id_fk",
+ "tableFrom": "storage_events",
+ "tableTo": "users",
+ "columnsFrom": [
+ "userId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "storage_events_pageId_pages_id_fk": {
+ "name": "storage_events_pageId_pages_id_fk",
+ "tableFrom": "storage_events",
+ "tableTo": "pages",
+ "columnsFrom": [
+ "pageId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "set null",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "public.tags": {
+ "name": "tags",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "color": {
+ "name": "color",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "tags_name_unique": {
+ "name": "tags_name_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "name"
+ ]
+ }
+ }
+ },
+ "public.user_mentions": {
+ "name": "user_mentions",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "sourcePageId": {
+ "name": "sourcePageId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "targetUserId": {
+ "name": "targetUserId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "mentionedByUserId": {
+ "name": "mentionedByUserId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {
+ "user_mentions_source_page_id_target_user_id_key": {
+ "name": "user_mentions_source_page_id_target_user_id_key",
+ "columns": [
+ {
+ "expression": "sourcePageId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "targetUserId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "user_mentions_source_page_id_idx": {
+ "name": "user_mentions_source_page_id_idx",
+ "columns": [
+ {
+ "expression": "sourcePageId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "user_mentions_target_user_id_idx": {
+ "name": "user_mentions_target_user_id_idx",
+ "columns": [
+ {
+ "expression": "targetUserId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "user_mentions_sourcePageId_pages_id_fk": {
+ "name": "user_mentions_sourcePageId_pages_id_fk",
+ "tableFrom": "user_mentions",
+ "tableTo": "pages",
+ "columnsFrom": [
+ "sourcePageId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "user_mentions_targetUserId_users_id_fk": {
+ "name": "user_mentions_targetUserId_users_id_fk",
+ "tableFrom": "user_mentions",
+ "tableTo": "users",
+ "columnsFrom": [
+ "targetUserId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "user_mentions_mentionedByUserId_users_id_fk": {
+ "name": "user_mentions_mentionedByUserId_users_id_fk",
+ "tableFrom": "user_mentions",
+ "tableTo": "users",
+ "columnsFrom": [
+ "mentionedByUserId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "set null",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "public.permissions": {
+ "name": "permissions",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "action": {
+ "name": "action",
+ "type": "PermissionAction",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "subjectType": {
+ "name": "subjectType",
+ "type": "SubjectType",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "subjectId": {
+ "name": "subjectId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "pageId": {
+ "name": "pageId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "permissions_page_id_idx": {
+ "name": "permissions_page_id_idx",
+ "columns": [
+ {
+ "expression": "pageId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "permissions_subject_id_subject_type_idx": {
+ "name": "permissions_subject_id_subject_type_idx",
+ "columns": [
+ {
+ "expression": "subjectId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "subjectType",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "permissions_page_id_subject_id_subject_type_idx": {
+ "name": "permissions_page_id_subject_id_subject_type_idx",
+ "columns": [
+ {
+ "expression": "pageId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "subjectId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "subjectType",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "permissions_pageId_pages_id_fk": {
+ "name": "permissions_pageId_pages_id_fk",
+ "tableFrom": "permissions",
+ "tableTo": "pages",
+ "columnsFrom": [
+ "pageId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "public.drive_invitations": {
+ "name": "drive_invitations",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "driveId": {
+ "name": "driveId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "email": {
+ "name": "email",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "userId": {
+ "name": "userId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "invitedBy": {
+ "name": "invitedBy",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "status": {
+ "name": "status",
+ "type": "InvitationStatus",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'PENDING'"
+ },
+ "token": {
+ "name": "token",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "message": {
+ "name": "message",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "expiresAt": {
+ "name": "expiresAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "respondedAt": {
+ "name": "respondedAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {
+ "drive_invitations_drive_id_idx": {
+ "name": "drive_invitations_drive_id_idx",
+ "columns": [
+ {
+ "expression": "driveId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "drive_invitations_email_idx": {
+ "name": "drive_invitations_email_idx",
+ "columns": [
+ {
+ "expression": "email",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "drive_invitations_status_idx": {
+ "name": "drive_invitations_status_idx",
+ "columns": [
+ {
+ "expression": "status",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "drive_invitations_token_idx": {
+ "name": "drive_invitations_token_idx",
+ "columns": [
+ {
+ "expression": "token",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "drive_invitations_driveId_drives_id_fk": {
+ "name": "drive_invitations_driveId_drives_id_fk",
+ "tableFrom": "drive_invitations",
+ "tableTo": "drives",
+ "columnsFrom": [
+ "driveId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "drive_invitations_userId_users_id_fk": {
+ "name": "drive_invitations_userId_users_id_fk",
+ "tableFrom": "drive_invitations",
+ "tableTo": "users",
+ "columnsFrom": [
+ "userId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "drive_invitations_invitedBy_users_id_fk": {
+ "name": "drive_invitations_invitedBy_users_id_fk",
+ "tableFrom": "drive_invitations",
+ "tableTo": "users",
+ "columnsFrom": [
+ "invitedBy"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "drive_invitations_token_unique": {
+ "name": "drive_invitations_token_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "token"
+ ]
+ }
+ }
+ },
+ "public.drive_members": {
+ "name": "drive_members",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "driveId": {
+ "name": "driveId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "userId": {
+ "name": "userId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "role": {
+ "name": "role",
+ "type": "MemberRole",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'MEMBER'"
+ },
+ "customRoleId": {
+ "name": "customRoleId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "invitedBy": {
+ "name": "invitedBy",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "invitedAt": {
+ "name": "invitedAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "acceptedAt": {
+ "name": "acceptedAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "lastAccessedAt": {
+ "name": "lastAccessedAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {
+ "drive_members_drive_id_idx": {
+ "name": "drive_members_drive_id_idx",
+ "columns": [
+ {
+ "expression": "driveId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "drive_members_user_id_idx": {
+ "name": "drive_members_user_id_idx",
+ "columns": [
+ {
+ "expression": "userId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "drive_members_role_idx": {
+ "name": "drive_members_role_idx",
+ "columns": [
+ {
+ "expression": "role",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "drive_members_custom_role_id_idx": {
+ "name": "drive_members_custom_role_id_idx",
+ "columns": [
+ {
+ "expression": "customRoleId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "drive_members_driveId_drives_id_fk": {
+ "name": "drive_members_driveId_drives_id_fk",
+ "tableFrom": "drive_members",
+ "tableTo": "drives",
+ "columnsFrom": [
+ "driveId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "drive_members_userId_users_id_fk": {
+ "name": "drive_members_userId_users_id_fk",
+ "tableFrom": "drive_members",
+ "tableTo": "users",
+ "columnsFrom": [
+ "userId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "drive_members_customRoleId_drive_roles_id_fk": {
+ "name": "drive_members_customRoleId_drive_roles_id_fk",
+ "tableFrom": "drive_members",
+ "tableTo": "drive_roles",
+ "columnsFrom": [
+ "customRoleId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "set null",
+ "onUpdate": "no action"
+ },
+ "drive_members_invitedBy_users_id_fk": {
+ "name": "drive_members_invitedBy_users_id_fk",
+ "tableFrom": "drive_members",
+ "tableTo": "users",
+ "columnsFrom": [
+ "invitedBy"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "set null",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "drive_members_drive_user_key": {
+ "name": "drive_members_drive_user_key",
+ "nullsNotDistinct": false,
+ "columns": [
+ "driveId",
+ "userId"
+ ]
+ }
+ }
+ },
+ "public.drive_roles": {
+ "name": "drive_roles",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "driveId": {
+ "name": "driveId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "description": {
+ "name": "description",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "color": {
+ "name": "color",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "isDefault": {
+ "name": "isDefault",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "permissions": {
+ "name": "permissions",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "position": {
+ "name": "position",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 0
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updatedAt": {
+ "name": "updatedAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {
+ "drive_roles_drive_id_idx": {
+ "name": "drive_roles_drive_id_idx",
+ "columns": [
+ {
+ "expression": "driveId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "drive_roles_position_idx": {
+ "name": "drive_roles_position_idx",
+ "columns": [
+ {
+ "expression": "position",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "drive_roles_driveId_drives_id_fk": {
+ "name": "drive_roles_driveId_drives_id_fk",
+ "tableFrom": "drive_roles",
+ "tableTo": "drives",
+ "columnsFrom": [
+ "driveId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "drive_roles_drive_name_key": {
+ "name": "drive_roles_drive_name_key",
+ "nullsNotDistinct": false,
+ "columns": [
+ "driveId",
+ "name"
+ ]
+ }
+ }
+ },
+ "public.page_permissions": {
+ "name": "page_permissions",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "pageId": {
+ "name": "pageId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "userId": {
+ "name": "userId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "canView": {
+ "name": "canView",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "canEdit": {
+ "name": "canEdit",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "canShare": {
+ "name": "canShare",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "canDelete": {
+ "name": "canDelete",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "grantedBy": {
+ "name": "grantedBy",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "grantedAt": {
+ "name": "grantedAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "expiresAt": {
+ "name": "expiresAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "note": {
+ "name": "note",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {
+ "page_permissions_page_id_idx": {
+ "name": "page_permissions_page_id_idx",
+ "columns": [
+ {
+ "expression": "pageId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "page_permissions_user_id_idx": {
+ "name": "page_permissions_user_id_idx",
+ "columns": [
+ {
+ "expression": "userId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "page_permissions_expires_at_idx": {
+ "name": "page_permissions_expires_at_idx",
+ "columns": [
+ {
+ "expression": "expiresAt",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "page_permissions_pageId_pages_id_fk": {
+ "name": "page_permissions_pageId_pages_id_fk",
+ "tableFrom": "page_permissions",
+ "tableTo": "pages",
+ "columnsFrom": [
+ "pageId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "page_permissions_userId_users_id_fk": {
+ "name": "page_permissions_userId_users_id_fk",
+ "tableFrom": "page_permissions",
+ "tableTo": "users",
+ "columnsFrom": [
+ "userId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "page_permissions_grantedBy_users_id_fk": {
+ "name": "page_permissions_grantedBy_users_id_fk",
+ "tableFrom": "page_permissions",
+ "tableTo": "users",
+ "columnsFrom": [
+ "grantedBy"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "set null",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "page_permissions_page_user_key": {
+ "name": "page_permissions_page_user_key",
+ "nullsNotDistinct": false,
+ "columns": [
+ "pageId",
+ "userId"
+ ]
+ }
+ }
+ },
+ "public.user_profiles": {
+ "name": "user_profiles",
+ "schema": "",
+ "columns": {
+ "userId": {
+ "name": "userId",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "username": {
+ "name": "username",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "displayName": {
+ "name": "displayName",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "bio": {
+ "name": "bio",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "avatarUrl": {
+ "name": "avatarUrl",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "isPublic": {
+ "name": "isPublic",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updatedAt": {
+ "name": "updatedAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {
+ "user_profiles_is_public_idx": {
+ "name": "user_profiles_is_public_idx",
+ "columns": [
+ {
+ "expression": "isPublic",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "user_profiles_userId_users_id_fk": {
+ "name": "user_profiles_userId_users_id_fk",
+ "tableFrom": "user_profiles",
+ "tableTo": "users",
+ "columnsFrom": [
+ "userId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "public.channel_messages": {
+ "name": "channel_messages",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "content": {
+ "name": "content",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "pageId": {
+ "name": "pageId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "userId": {
+ "name": "userId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {
+ "channel_messages_page_id_idx": {
+ "name": "channel_messages_page_id_idx",
+ "columns": [
+ {
+ "expression": "pageId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "channel_messages_pageId_pages_id_fk": {
+ "name": "channel_messages_pageId_pages_id_fk",
+ "tableFrom": "channel_messages",
+ "tableTo": "pages",
+ "columnsFrom": [
+ "pageId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "channel_messages_userId_users_id_fk": {
+ "name": "channel_messages_userId_users_id_fk",
+ "tableFrom": "channel_messages",
+ "tableTo": "users",
+ "columnsFrom": [
+ "userId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "public.user_ai_settings": {
+ "name": "user_ai_settings",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "userId": {
+ "name": "userId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "provider": {
+ "name": "provider",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "encryptedApiKey": {
+ "name": "encryptedApiKey",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "baseUrl": {
+ "name": "baseUrl",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updatedAt": {
+ "name": "updatedAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "user_ai_settings_userId_users_id_fk": {
+ "name": "user_ai_settings_userId_users_id_fk",
+ "tableFrom": "user_ai_settings",
+ "tableTo": "users",
+ "columnsFrom": [
+ "userId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "user_provider_unique": {
+ "name": "user_provider_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "userId",
+ "provider"
+ ]
+ }
+ }
+ },
+ "public.user_dashboards": {
+ "name": "user_dashboards",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "userId": {
+ "name": "userId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "content": {
+ "name": "content",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "''"
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updatedAt": {
+ "name": "updatedAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "user_dashboards_userId_users_id_fk": {
+ "name": "user_dashboards_userId_users_id_fk",
+ "tableFrom": "user_dashboards",
+ "tableTo": "users",
+ "columnsFrom": [
+ "userId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "user_dashboards_userId_unique": {
+ "name": "user_dashboards_userId_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "userId"
+ ]
+ }
+ }
+ },
+ "public.conversations": {
+ "name": "conversations",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "userId": {
+ "name": "userId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "title": {
+ "name": "title",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "type": {
+ "name": "type",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "contextId": {
+ "name": "contextId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "lastMessageAt": {
+ "name": "lastMessageAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updatedAt": {
+ "name": "updatedAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "isActive": {
+ "name": "isActive",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": true
+ }
+ },
+ "indexes": {
+ "conversations_user_id_idx": {
+ "name": "conversations_user_id_idx",
+ "columns": [
+ {
+ "expression": "userId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "conversations_user_id_type_idx": {
+ "name": "conversations_user_id_type_idx",
+ "columns": [
+ {
+ "expression": "userId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "type",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "conversations_user_id_last_message_at_idx": {
+ "name": "conversations_user_id_last_message_at_idx",
+ "columns": [
+ {
+ "expression": "userId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "lastMessageAt",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "conversations_context_id_idx": {
+ "name": "conversations_context_id_idx",
+ "columns": [
+ {
+ "expression": "contextId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "conversations_userId_users_id_fk": {
+ "name": "conversations_userId_users_id_fk",
+ "tableFrom": "conversations",
+ "tableTo": "users",
+ "columnsFrom": [
+ "userId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "public.messages": {
+ "name": "messages",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "conversationId": {
+ "name": "conversationId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "userId": {
+ "name": "userId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "role": {
+ "name": "role",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "messageType": {
+ "name": "messageType",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'standard'"
+ },
+ "content": {
+ "name": "content",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "toolCalls": {
+ "name": "toolCalls",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "toolResults": {
+ "name": "toolResults",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "isActive": {
+ "name": "isActive",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": true
+ },
+ "editedAt": {
+ "name": "editedAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {
+ "messages_conversation_id_idx": {
+ "name": "messages_conversation_id_idx",
+ "columns": [
+ {
+ "expression": "conversationId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "messages_conversation_id_created_at_idx": {
+ "name": "messages_conversation_id_created_at_idx",
+ "columns": [
+ {
+ "expression": "conversationId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "createdAt",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "messages_user_id_idx": {
+ "name": "messages_user_id_idx",
+ "columns": [
+ {
+ "expression": "userId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "messages_conversationId_conversations_id_fk": {
+ "name": "messages_conversationId_conversations_id_fk",
+ "tableFrom": "messages",
+ "tableTo": "conversations",
+ "columnsFrom": [
+ "conversationId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "messages_userId_users_id_fk": {
+ "name": "messages_userId_users_id_fk",
+ "tableFrom": "messages",
+ "tableTo": "users",
+ "columnsFrom": [
+ "userId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "public.notifications": {
+ "name": "notifications",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "userId": {
+ "name": "userId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "type": {
+ "name": "type",
+ "type": "NotificationType",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "title": {
+ "name": "title",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "message": {
+ "name": "message",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "metadata": {
+ "name": "metadata",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "isRead": {
+ "name": "isRead",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "readAt": {
+ "name": "readAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "pageId": {
+ "name": "pageId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "driveId": {
+ "name": "driveId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "triggeredByUserId": {
+ "name": "triggeredByUserId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {
+ "notifications_user_id_idx": {
+ "name": "notifications_user_id_idx",
+ "columns": [
+ {
+ "expression": "userId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "notifications_user_id_is_read_idx": {
+ "name": "notifications_user_id_is_read_idx",
+ "columns": [
+ {
+ "expression": "userId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "isRead",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "notifications_created_at_idx": {
+ "name": "notifications_created_at_idx",
+ "columns": [
+ {
+ "expression": "createdAt",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "notifications_type_idx": {
+ "name": "notifications_type_idx",
+ "columns": [
+ {
+ "expression": "type",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "notifications_userId_users_id_fk": {
+ "name": "notifications_userId_users_id_fk",
+ "tableFrom": "notifications",
+ "tableTo": "users",
+ "columnsFrom": [
+ "userId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "notifications_pageId_pages_id_fk": {
+ "name": "notifications_pageId_pages_id_fk",
+ "tableFrom": "notifications",
+ "tableTo": "pages",
+ "columnsFrom": [
+ "pageId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "notifications_driveId_drives_id_fk": {
+ "name": "notifications_driveId_drives_id_fk",
+ "tableFrom": "notifications",
+ "tableTo": "drives",
+ "columnsFrom": [
+ "driveId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "notifications_triggeredByUserId_users_id_fk": {
+ "name": "notifications_triggeredByUserId_users_id_fk",
+ "tableFrom": "notifications",
+ "tableTo": "users",
+ "columnsFrom": [
+ "triggeredByUserId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "set null",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "public.email_notification_log": {
+ "name": "email_notification_log",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "userId": {
+ "name": "userId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "notificationId": {
+ "name": "notificationId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "notificationType": {
+ "name": "notificationType",
+ "type": "NotificationType",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "recipientEmail": {
+ "name": "recipientEmail",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "success": {
+ "name": "success",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "errorMessage": {
+ "name": "errorMessage",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "sentAt": {
+ "name": "sentAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "email_notification_log_user_idx": {
+ "name": "email_notification_log_user_idx",
+ "columns": [
+ {
+ "expression": "userId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "email_notification_log_sent_at_idx": {
+ "name": "email_notification_log_sent_at_idx",
+ "columns": [
+ {
+ "expression": "sentAt",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "email_notification_log_notification_id_idx": {
+ "name": "email_notification_log_notification_id_idx",
+ "columns": [
+ {
+ "expression": "notificationId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "email_notification_log_userId_users_id_fk": {
+ "name": "email_notification_log_userId_users_id_fk",
+ "tableFrom": "email_notification_log",
+ "tableTo": "users",
+ "columnsFrom": [
+ "userId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "public.email_notification_preferences": {
+ "name": "email_notification_preferences",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "userId": {
+ "name": "userId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "notificationType": {
+ "name": "notificationType",
+ "type": "NotificationType",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "emailEnabled": {
+ "name": "emailEnabled",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": true
+ },
+ "updatedAt": {
+ "name": "updatedAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "email_notification_preferences_user_type_idx": {
+ "name": "email_notification_preferences_user_type_idx",
+ "columns": [
+ {
+ "expression": "userId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "notificationType",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "email_notification_preferences_userId_users_id_fk": {
+ "name": "email_notification_preferences_userId_users_id_fk",
+ "tableFrom": "email_notification_preferences",
+ "tableTo": "users",
+ "columnsFrom": [
+ "userId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "public.activity_logs": {
+ "name": "activity_logs",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "timestamp": {
+ "name": "timestamp",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "userId": {
+ "name": "userId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "actorEmail": {
+ "name": "actorEmail",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'legacy@unknown'"
+ },
+ "actorDisplayName": {
+ "name": "actorDisplayName",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "isAiGenerated": {
+ "name": "isAiGenerated",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "aiProvider": {
+ "name": "aiProvider",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "aiModel": {
+ "name": "aiModel",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "aiConversationId": {
+ "name": "aiConversationId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "operation": {
+ "name": "operation",
+ "type": "activity_operation",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "resourceType": {
+ "name": "resourceType",
+ "type": "activity_resource",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "resourceId": {
+ "name": "resourceId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "resourceTitle": {
+ "name": "resourceTitle",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "driveId": {
+ "name": "driveId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "pageId": {
+ "name": "pageId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "contentSnapshot": {
+ "name": "contentSnapshot",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "contentFormat": {
+ "name": "contentFormat",
+ "type": "content_format",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "contentRef": {
+ "name": "contentRef",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "contentSize": {
+ "name": "contentSize",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "rollbackFromActivityId": {
+ "name": "rollbackFromActivityId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "rollbackSourceOperation": {
+ "name": "rollbackSourceOperation",
+ "type": "activity_operation",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "rollbackSourceTimestamp": {
+ "name": "rollbackSourceTimestamp",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "rollbackSourceTitle": {
+ "name": "rollbackSourceTitle",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "updatedFields": {
+ "name": "updatedFields",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "previousValues": {
+ "name": "previousValues",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "newValues": {
+ "name": "newValues",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "metadata": {
+ "name": "metadata",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "streamId": {
+ "name": "streamId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "streamSeq": {
+ "name": "streamSeq",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "changeGroupId": {
+ "name": "changeGroupId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "changeGroupType": {
+ "name": "changeGroupType",
+ "type": "activity_change_group_type",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "stateHashBefore": {
+ "name": "stateHashBefore",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "stateHashAfter": {
+ "name": "stateHashAfter",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "isArchived": {
+ "name": "isArchived",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "previousLogHash": {
+ "name": "previousLogHash",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "logHash": {
+ "name": "logHash",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "chainSeed": {
+ "name": "chainSeed",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {
+ "idx_activity_logs_timestamp": {
+ "name": "idx_activity_logs_timestamp",
+ "columns": [
+ {
+ "expression": "timestamp",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_activity_logs_user_timestamp": {
+ "name": "idx_activity_logs_user_timestamp",
+ "columns": [
+ {
+ "expression": "userId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "timestamp",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_activity_logs_drive_timestamp": {
+ "name": "idx_activity_logs_drive_timestamp",
+ "columns": [
+ {
+ "expression": "driveId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "timestamp",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_activity_logs_page_timestamp": {
+ "name": "idx_activity_logs_page_timestamp",
+ "columns": [
+ {
+ "expression": "pageId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "timestamp",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_activity_logs_archived": {
+ "name": "idx_activity_logs_archived",
+ "columns": [
+ {
+ "expression": "isArchived",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_activity_logs_rollback_from": {
+ "name": "idx_activity_logs_rollback_from",
+ "columns": [
+ {
+ "expression": "rollbackFromActivityId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_activity_logs_stream": {
+ "name": "idx_activity_logs_stream",
+ "columns": [
+ {
+ "expression": "streamId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "streamSeq",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "where": "\"activity_logs\".\"streamId\" IS NOT NULL",
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_activity_logs_change_group": {
+ "name": "idx_activity_logs_change_group",
+ "columns": [
+ {
+ "expression": "changeGroupId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "where": "\"activity_logs\".\"changeGroupId\" IS NOT NULL",
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_activity_logs_log_hash": {
+ "name": "idx_activity_logs_log_hash",
+ "columns": [
+ {
+ "expression": "logHash",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "where": "\"activity_logs\".\"logHash\" IS NOT NULL",
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "activity_logs_userId_users_id_fk": {
+ "name": "activity_logs_userId_users_id_fk",
+ "tableFrom": "activity_logs",
+ "tableTo": "users",
+ "columnsFrom": [
+ "userId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "set null",
+ "onUpdate": "no action"
+ },
+ "activity_logs_driveId_drives_id_fk": {
+ "name": "activity_logs_driveId_drives_id_fk",
+ "tableFrom": "activity_logs",
+ "tableTo": "drives",
+ "columnsFrom": [
+ "driveId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "set null",
+ "onUpdate": "no action"
+ },
+ "activity_logs_pageId_pages_id_fk": {
+ "name": "activity_logs_pageId_pages_id_fk",
+ "tableFrom": "activity_logs",
+ "tableTo": "pages",
+ "columnsFrom": [
+ "pageId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "set null",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "public.ai_usage_logs": {
+ "name": "ai_usage_logs",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "timestamp": {
+ "name": "timestamp",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "user_id": {
+ "name": "user_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "session_id": {
+ "name": "session_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "provider": {
+ "name": "provider",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "model": {
+ "name": "model",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "input_tokens": {
+ "name": "input_tokens",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "output_tokens": {
+ "name": "output_tokens",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "total_tokens": {
+ "name": "total_tokens",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "cost": {
+ "name": "cost",
+ "type": "real",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "currency": {
+ "name": "currency",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false,
+ "default": "'USD'"
+ },
+ "duration": {
+ "name": "duration",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "streaming_duration": {
+ "name": "streaming_duration",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "conversation_id": {
+ "name": "conversation_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "message_id": {
+ "name": "message_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "page_id": {
+ "name": "page_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "drive_id": {
+ "name": "drive_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "prompt": {
+ "name": "prompt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "completion": {
+ "name": "completion",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "success": {
+ "name": "success",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": false,
+ "default": true
+ },
+ "error": {
+ "name": "error",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "metadata": {
+ "name": "metadata",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "context_messages": {
+ "name": "context_messages",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "context_size": {
+ "name": "context_size",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "system_prompt_tokens": {
+ "name": "system_prompt_tokens",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "tool_definition_tokens": {
+ "name": "tool_definition_tokens",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "conversation_tokens": {
+ "name": "conversation_tokens",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "message_count": {
+ "name": "message_count",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "was_truncated": {
+ "name": "was_truncated",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": false,
+ "default": false
+ },
+ "truncation_strategy": {
+ "name": "truncation_strategy",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {
+ "idx_ai_usage_timestamp": {
+ "name": "idx_ai_usage_timestamp",
+ "columns": [
+ {
+ "expression": "timestamp",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_ai_usage_user_id": {
+ "name": "idx_ai_usage_user_id",
+ "columns": [
+ {
+ "expression": "user_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "timestamp",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_ai_usage_provider": {
+ "name": "idx_ai_usage_provider",
+ "columns": [
+ {
+ "expression": "provider",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "model",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "timestamp",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_ai_usage_cost": {
+ "name": "idx_ai_usage_cost",
+ "columns": [
+ {
+ "expression": "cost",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_ai_usage_conversation": {
+ "name": "idx_ai_usage_conversation",
+ "columns": [
+ {
+ "expression": "conversation_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_ai_usage_context": {
+ "name": "idx_ai_usage_context",
+ "columns": [
+ {
+ "expression": "conversation_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "timestamp",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_ai_usage_context_size": {
+ "name": "idx_ai_usage_context_size",
+ "columns": [
+ {
+ "expression": "context_size",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "public.alert_history": {
+ "name": "alert_history",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "timestamp": {
+ "name": "timestamp",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "type": {
+ "name": "type",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "severity": {
+ "name": "severity",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "message": {
+ "name": "message",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "threshold": {
+ "name": "threshold",
+ "type": "real",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "actual_value": {
+ "name": "actual_value",
+ "type": "real",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "notified": {
+ "name": "notified",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": false,
+ "default": false
+ },
+ "notified_at": {
+ "name": "notified_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "notification_channel": {
+ "name": "notification_channel",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "acknowledged": {
+ "name": "acknowledged",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": false,
+ "default": false
+ },
+ "acknowledged_at": {
+ "name": "acknowledged_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "acknowledged_by": {
+ "name": "acknowledged_by",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "metadata": {
+ "name": "metadata",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {
+ "idx_alerts_timestamp": {
+ "name": "idx_alerts_timestamp",
+ "columns": [
+ {
+ "expression": "timestamp",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_alerts_type": {
+ "name": "idx_alerts_type",
+ "columns": [
+ {
+ "expression": "type",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "timestamp",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_alerts_severity": {
+ "name": "idx_alerts_severity",
+ "columns": [
+ {
+ "expression": "severity",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_alerts_acknowledged": {
+ "name": "idx_alerts_acknowledged",
+ "columns": [
+ {
+ "expression": "acknowledged",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "public.api_metrics": {
+ "name": "api_metrics",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "timestamp": {
+ "name": "timestamp",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "endpoint": {
+ "name": "endpoint",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "method": {
+ "name": "method",
+ "type": "http_method",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "status_code": {
+ "name": "status_code",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "duration": {
+ "name": "duration",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "request_size": {
+ "name": "request_size",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "response_size": {
+ "name": "response_size",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "user_id": {
+ "name": "user_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "session_id": {
+ "name": "session_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "ip": {
+ "name": "ip",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "user_agent": {
+ "name": "user_agent",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "error": {
+ "name": "error",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "request_id": {
+ "name": "request_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "cache_hit": {
+ "name": "cache_hit",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": false,
+ "default": false
+ },
+ "cache_key": {
+ "name": "cache_key",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {
+ "idx_api_metrics_timestamp": {
+ "name": "idx_api_metrics_timestamp",
+ "columns": [
+ {
+ "expression": "timestamp",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_api_metrics_endpoint": {
+ "name": "idx_api_metrics_endpoint",
+ "columns": [
+ {
+ "expression": "endpoint",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "timestamp",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_api_metrics_user_id": {
+ "name": "idx_api_metrics_user_id",
+ "columns": [
+ {
+ "expression": "user_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "timestamp",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_api_metrics_status": {
+ "name": "idx_api_metrics_status",
+ "columns": [
+ {
+ "expression": "status_code",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "timestamp",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_api_metrics_duration": {
+ "name": "idx_api_metrics_duration",
+ "columns": [
+ {
+ "expression": "duration",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "public.daily_aggregates": {
+ "name": "daily_aggregates",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "date": {
+ "name": "date",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "category": {
+ "name": "category",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "total_count": {
+ "name": "total_count",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false,
+ "default": 0
+ },
+ "success_count": {
+ "name": "success_count",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false,
+ "default": 0
+ },
+ "error_count": {
+ "name": "error_count",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false,
+ "default": 0
+ },
+ "avg_duration": {
+ "name": "avg_duration",
+ "type": "real",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "min_duration": {
+ "name": "min_duration",
+ "type": "real",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "max_duration": {
+ "name": "max_duration",
+ "type": "real",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "p50_duration": {
+ "name": "p50_duration",
+ "type": "real",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "p95_duration": {
+ "name": "p95_duration",
+ "type": "real",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "p99_duration": {
+ "name": "p99_duration",
+ "type": "real",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "unique_users": {
+ "name": "unique_users",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false,
+ "default": 0
+ },
+ "unique_sessions": {
+ "name": "unique_sessions",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false,
+ "default": 0
+ },
+ "total_tokens": {
+ "name": "total_tokens",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "total_cost": {
+ "name": "total_cost",
+ "type": "real",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "metadata": {
+ "name": "metadata",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "computed_at": {
+ "name": "computed_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "idx_aggregates_date": {
+ "name": "idx_aggregates_date",
+ "columns": [
+ {
+ "expression": "date",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "category",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_aggregates_category": {
+ "name": "idx_aggregates_category",
+ "columns": [
+ {
+ "expression": "category",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "public.error_logs": {
+ "name": "error_logs",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "timestamp": {
+ "name": "timestamp",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "name": {
+ "name": "name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "message": {
+ "name": "message",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "stack": {
+ "name": "stack",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "user_id": {
+ "name": "user_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "session_id": {
+ "name": "session_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "request_id": {
+ "name": "request_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "endpoint": {
+ "name": "endpoint",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "method": {
+ "name": "method",
+ "type": "http_method",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "file": {
+ "name": "file",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "line": {
+ "name": "line",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "column": {
+ "name": "column",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "ip": {
+ "name": "ip",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "user_agent": {
+ "name": "user_agent",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "metadata": {
+ "name": "metadata",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "resolved": {
+ "name": "resolved",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": false,
+ "default": false
+ },
+ "resolved_at": {
+ "name": "resolved_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "resolved_by": {
+ "name": "resolved_by",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "resolution": {
+ "name": "resolution",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {
+ "idx_errors_timestamp": {
+ "name": "idx_errors_timestamp",
+ "columns": [
+ {
+ "expression": "timestamp",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_errors_name": {
+ "name": "idx_errors_name",
+ "columns": [
+ {
+ "expression": "name",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "timestamp",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_errors_user_id": {
+ "name": "idx_errors_user_id",
+ "columns": [
+ {
+ "expression": "user_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_errors_resolved": {
+ "name": "idx_errors_resolved",
+ "columns": [
+ {
+ "expression": "resolved",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_errors_endpoint": {
+ "name": "idx_errors_endpoint",
+ "columns": [
+ {
+ "expression": "endpoint",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "public.performance_metrics": {
+ "name": "performance_metrics",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "timestamp": {
+ "name": "timestamp",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "metric": {
+ "name": "metric",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "value": {
+ "name": "value",
+ "type": "real",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "unit": {
+ "name": "unit",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "user_id": {
+ "name": "user_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "session_id": {
+ "name": "session_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "page_id": {
+ "name": "page_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "drive_id": {
+ "name": "drive_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "metadata": {
+ "name": "metadata",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "cpu_usage": {
+ "name": "cpu_usage",
+ "type": "real",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "memory_usage": {
+ "name": "memory_usage",
+ "type": "real",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "disk_usage": {
+ "name": "disk_usage",
+ "type": "real",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {
+ "idx_performance_timestamp": {
+ "name": "idx_performance_timestamp",
+ "columns": [
+ {
+ "expression": "timestamp",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_performance_metric": {
+ "name": "idx_performance_metric",
+ "columns": [
+ {
+ "expression": "metric",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "timestamp",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_performance_value": {
+ "name": "idx_performance_value",
+ "columns": [
+ {
+ "expression": "value",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_performance_user_id": {
+ "name": "idx_performance_user_id",
+ "columns": [
+ {
+ "expression": "user_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "public.retention_policies": {
+ "name": "retention_policies",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "subscriptionTier": {
+ "name": "subscriptionTier",
+ "type": "subscription_tier",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "retentionDays": {
+ "name": "retentionDays",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updatedAt": {
+ "name": "updatedAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "retention_policies_subscriptionTier_unique": {
+ "name": "retention_policies_subscriptionTier_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "subscriptionTier"
+ ]
+ }
+ }
+ },
+ "public.system_logs": {
+ "name": "system_logs",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "timestamp": {
+ "name": "timestamp",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "level": {
+ "name": "level",
+ "type": "log_level",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "message": {
+ "name": "message",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "category": {
+ "name": "category",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "user_id": {
+ "name": "user_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "session_id": {
+ "name": "session_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "request_id": {
+ "name": "request_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "drive_id": {
+ "name": "drive_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "page_id": {
+ "name": "page_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "endpoint": {
+ "name": "endpoint",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "method": {
+ "name": "method",
+ "type": "http_method",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "ip": {
+ "name": "ip",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "user_agent": {
+ "name": "user_agent",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "error_name": {
+ "name": "error_name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "error_message": {
+ "name": "error_message",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "error_stack": {
+ "name": "error_stack",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "duration": {
+ "name": "duration",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "memory_used": {
+ "name": "memory_used",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "memory_total": {
+ "name": "memory_total",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "metadata": {
+ "name": "metadata",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "hostname": {
+ "name": "hostname",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "pid": {
+ "name": "pid",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "version": {
+ "name": "version",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {
+ "idx_system_logs_timestamp": {
+ "name": "idx_system_logs_timestamp",
+ "columns": [
+ {
+ "expression": "timestamp",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_system_logs_level": {
+ "name": "idx_system_logs_level",
+ "columns": [
+ {
+ "expression": "level",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_system_logs_category": {
+ "name": "idx_system_logs_category",
+ "columns": [
+ {
+ "expression": "category",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_system_logs_user_id": {
+ "name": "idx_system_logs_user_id",
+ "columns": [
+ {
+ "expression": "user_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_system_logs_request_id": {
+ "name": "idx_system_logs_request_id",
+ "columns": [
+ {
+ "expression": "request_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_system_logs_error": {
+ "name": "idx_system_logs_error",
+ "columns": [
+ {
+ "expression": "error_name",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "timestamp",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "public.user_activities": {
+ "name": "user_activities",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "timestamp": {
+ "name": "timestamp",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "user_id": {
+ "name": "user_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "session_id": {
+ "name": "session_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "action": {
+ "name": "action",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "resource": {
+ "name": "resource",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "resource_id": {
+ "name": "resource_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "drive_id": {
+ "name": "drive_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "page_id": {
+ "name": "page_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "metadata": {
+ "name": "metadata",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "ip": {
+ "name": "ip",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "user_agent": {
+ "name": "user_agent",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {
+ "idx_user_activities_timestamp": {
+ "name": "idx_user_activities_timestamp",
+ "columns": [
+ {
+ "expression": "timestamp",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_user_activities_user_id": {
+ "name": "idx_user_activities_user_id",
+ "columns": [
+ {
+ "expression": "user_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "timestamp",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_user_activities_action": {
+ "name": "idx_user_activities_action",
+ "columns": [
+ {
+ "expression": "action",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "timestamp",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_user_activities_resource": {
+ "name": "idx_user_activities_resource",
+ "columns": [
+ {
+ "expression": "resource",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "resource_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "public.drive_backup_files": {
+ "name": "drive_backup_files",
+ "schema": "",
+ "columns": {
+ "backupId": {
+ "name": "backupId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "fileId": {
+ "name": "fileId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "storagePath": {
+ "name": "storagePath",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "sizeBytes": {
+ "name": "sizeBytes",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "mimeType": {
+ "name": "mimeType",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "checksumVersion": {
+ "name": "checksumVersion",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {
+ "drive_backup_files_backup_idx": {
+ "name": "drive_backup_files_backup_idx",
+ "columns": [
+ {
+ "expression": "backupId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "drive_backup_files_backupId_drive_backups_id_fk": {
+ "name": "drive_backup_files_backupId_drive_backups_id_fk",
+ "tableFrom": "drive_backup_files",
+ "tableTo": "drive_backups",
+ "columnsFrom": [
+ "backupId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {
+ "drive_backup_files_backupId_fileId_pk": {
+ "name": "drive_backup_files_backupId_fileId_pk",
+ "columns": [
+ "backupId",
+ "fileId"
+ ]
+ }
+ },
+ "uniqueConstraints": {}
+ },
+ "public.drive_backup_members": {
+ "name": "drive_backup_members",
+ "schema": "",
+ "columns": {
+ "backupId": {
+ "name": "backupId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "userId": {
+ "name": "userId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "role": {
+ "name": "role",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "customRoleId": {
+ "name": "customRoleId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "invitedBy": {
+ "name": "invitedBy",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "invitedAt": {
+ "name": "invitedAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "acceptedAt": {
+ "name": "acceptedAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {
+ "drive_backup_members_backup_idx": {
+ "name": "drive_backup_members_backup_idx",
+ "columns": [
+ {
+ "expression": "backupId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "drive_backup_members_backupId_drive_backups_id_fk": {
+ "name": "drive_backup_members_backupId_drive_backups_id_fk",
+ "tableFrom": "drive_backup_members",
+ "tableTo": "drive_backups",
+ "columnsFrom": [
+ "backupId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {
+ "drive_backup_members_backupId_userId_pk": {
+ "name": "drive_backup_members_backupId_userId_pk",
+ "columns": [
+ "backupId",
+ "userId"
+ ]
+ }
+ },
+ "uniqueConstraints": {}
+ },
+ "public.drive_backup_pages": {
+ "name": "drive_backup_pages",
+ "schema": "",
+ "columns": {
+ "backupId": {
+ "name": "backupId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "pageId": {
+ "name": "pageId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "pageVersionId": {
+ "name": "pageVersionId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "title": {
+ "name": "title",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "type": {
+ "name": "type",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "parentId": {
+ "name": "parentId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "originalParentId": {
+ "name": "originalParentId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "position": {
+ "name": "position",
+ "type": "real",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "isTrashed": {
+ "name": "isTrashed",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "trashedAt": {
+ "name": "trashedAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {
+ "drive_backup_pages_backup_idx": {
+ "name": "drive_backup_pages_backup_idx",
+ "columns": [
+ {
+ "expression": "backupId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "drive_backup_pages_backupId_drive_backups_id_fk": {
+ "name": "drive_backup_pages_backupId_drive_backups_id_fk",
+ "tableFrom": "drive_backup_pages",
+ "tableTo": "drive_backups",
+ "columnsFrom": [
+ "backupId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "drive_backup_pages_pageVersionId_page_versions_id_fk": {
+ "name": "drive_backup_pages_pageVersionId_page_versions_id_fk",
+ "tableFrom": "drive_backup_pages",
+ "tableTo": "page_versions",
+ "columnsFrom": [
+ "pageVersionId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "set null",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {
+ "drive_backup_pages_backupId_pageId_pk": {
+ "name": "drive_backup_pages_backupId_pageId_pk",
+ "columns": [
+ "backupId",
+ "pageId"
+ ]
+ }
+ },
+ "uniqueConstraints": {}
+ },
+ "public.drive_backup_permissions": {
+ "name": "drive_backup_permissions",
+ "schema": "",
+ "columns": {
+ "backupId": {
+ "name": "backupId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "pageId": {
+ "name": "pageId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "userId": {
+ "name": "userId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "canView": {
+ "name": "canView",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": true
+ },
+ "canEdit": {
+ "name": "canEdit",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "canShare": {
+ "name": "canShare",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "canDelete": {
+ "name": "canDelete",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "grantedBy": {
+ "name": "grantedBy",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "note": {
+ "name": "note",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "expiresAt": {
+ "name": "expiresAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {
+ "drive_backup_permissions_backup_idx": {
+ "name": "drive_backup_permissions_backup_idx",
+ "columns": [
+ {
+ "expression": "backupId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "drive_backup_permissions_backupId_drive_backups_id_fk": {
+ "name": "drive_backup_permissions_backupId_drive_backups_id_fk",
+ "tableFrom": "drive_backup_permissions",
+ "tableTo": "drive_backups",
+ "columnsFrom": [
+ "backupId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {
+ "drive_backup_permissions_backupId_pageId_userId_pk": {
+ "name": "drive_backup_permissions_backupId_pageId_userId_pk",
+ "columns": [
+ "backupId",
+ "pageId",
+ "userId"
+ ]
+ }
+ },
+ "uniqueConstraints": {}
+ },
+ "public.drive_backup_roles": {
+ "name": "drive_backup_roles",
+ "schema": "",
+ "columns": {
+ "backupId": {
+ "name": "backupId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "roleId": {
+ "name": "roleId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "description": {
+ "name": "description",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "color": {
+ "name": "color",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "isDefault": {
+ "name": "isDefault",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "permissions": {
+ "name": "permissions",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "position": {
+ "name": "position",
+ "type": "real",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {
+ "drive_backup_roles_backup_idx": {
+ "name": "drive_backup_roles_backup_idx",
+ "columns": [
+ {
+ "expression": "backupId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "drive_backup_roles_backupId_drive_backups_id_fk": {
+ "name": "drive_backup_roles_backupId_drive_backups_id_fk",
+ "tableFrom": "drive_backup_roles",
+ "tableTo": "drive_backups",
+ "columnsFrom": [
+ "backupId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {
+ "drive_backup_roles_backupId_roleId_pk": {
+ "name": "drive_backup_roles_backupId_roleId_pk",
+ "columns": [
+ "backupId",
+ "roleId"
+ ]
+ }
+ },
+ "uniqueConstraints": {}
+ },
+ "public.drive_backups": {
+ "name": "drive_backups",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "driveId": {
+ "name": "driveId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "createdBy": {
+ "name": "createdBy",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "source": {
+ "name": "source",
+ "type": "drive_backup_source",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'manual'"
+ },
+ "status": {
+ "name": "status",
+ "type": "drive_backup_status",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'pending'"
+ },
+ "label": {
+ "name": "label",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "reason": {
+ "name": "reason",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "changeGroupId": {
+ "name": "changeGroupId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "changeGroupType": {
+ "name": "changeGroupType",
+ "type": "activity_change_group_type",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "isPinned": {
+ "name": "isPinned",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "expiresAt": {
+ "name": "expiresAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "metadata": {
+ "name": "metadata",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "completedAt": {
+ "name": "completedAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "failedAt": {
+ "name": "failedAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "failureReason": {
+ "name": "failureReason",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {
+ "drive_backups_drive_created_at_idx": {
+ "name": "drive_backups_drive_created_at_idx",
+ "columns": [
+ {
+ "expression": "driveId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "createdAt",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "drive_backups_status_idx": {
+ "name": "drive_backups_status_idx",
+ "columns": [
+ {
+ "expression": "status",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "drive_backups_driveId_drives_id_fk": {
+ "name": "drive_backups_driveId_drives_id_fk",
+ "tableFrom": "drive_backups",
+ "tableTo": "drives",
+ "columnsFrom": [
+ "driveId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "drive_backups_createdBy_users_id_fk": {
+ "name": "drive_backups_createdBy_users_id_fk",
+ "tableFrom": "drive_backups",
+ "tableTo": "users",
+ "columnsFrom": [
+ "createdBy"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "set null",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "public.page_versions": {
+ "name": "page_versions",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "pageId": {
+ "name": "pageId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "driveId": {
+ "name": "driveId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "createdBy": {
+ "name": "createdBy",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "source": {
+ "name": "source",
+ "type": "page_version_source",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'auto'"
+ },
+ "label": {
+ "name": "label",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "reason": {
+ "name": "reason",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "changeGroupId": {
+ "name": "changeGroupId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "changeGroupType": {
+ "name": "changeGroupType",
+ "type": "activity_change_group_type",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "contentRef": {
+ "name": "contentRef",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "contentFormat": {
+ "name": "contentFormat",
+ "type": "content_format",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "contentSize": {
+ "name": "contentSize",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "stateHash": {
+ "name": "stateHash",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "pageRevision": {
+ "name": "pageRevision",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 0
+ },
+ "isPinned": {
+ "name": "isPinned",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "expiresAt": {
+ "name": "expiresAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "metadata": {
+ "name": "metadata",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {
+ "page_versions_page_created_at_idx": {
+ "name": "page_versions_page_created_at_idx",
+ "columns": [
+ {
+ "expression": "pageId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "createdAt",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "page_versions_drive_created_at_idx": {
+ "name": "page_versions_drive_created_at_idx",
+ "columns": [
+ {
+ "expression": "driveId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "createdAt",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "page_versions_pinned_idx": {
+ "name": "page_versions_pinned_idx",
+ "columns": [
+ {
+ "expression": "isPinned",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "page_versions_pageId_pages_id_fk": {
+ "name": "page_versions_pageId_pages_id_fk",
+ "tableFrom": "page_versions",
+ "tableTo": "pages",
+ "columnsFrom": [
+ "pageId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "page_versions_driveId_drives_id_fk": {
+ "name": "page_versions_driveId_drives_id_fk",
+ "tableFrom": "page_versions",
+ "tableTo": "drives",
+ "columnsFrom": [
+ "driveId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "page_versions_createdBy_users_id_fk": {
+ "name": "page_versions_createdBy_users_id_fk",
+ "tableFrom": "page_versions",
+ "tableTo": "users",
+ "columnsFrom": [
+ "createdBy"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "set null",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "public.connections": {
+ "name": "connections",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "user1Id": {
+ "name": "user1Id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "user2Id": {
+ "name": "user2Id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "status": {
+ "name": "status",
+ "type": "ConnectionStatus",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'PENDING'"
+ },
+ "requestedBy": {
+ "name": "requestedBy",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "requestMessage": {
+ "name": "requestMessage",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "requestedAt": {
+ "name": "requestedAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "acceptedAt": {
+ "name": "acceptedAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "blockedBy": {
+ "name": "blockedBy",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "blockedAt": {
+ "name": "blockedAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {
+ "connections_user1_id_idx": {
+ "name": "connections_user1_id_idx",
+ "columns": [
+ {
+ "expression": "user1Id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "connections_user2_id_idx": {
+ "name": "connections_user2_id_idx",
+ "columns": [
+ {
+ "expression": "user2Id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "connections_status_idx": {
+ "name": "connections_status_idx",
+ "columns": [
+ {
+ "expression": "status",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "connections_user1_status_idx": {
+ "name": "connections_user1_status_idx",
+ "columns": [
+ {
+ "expression": "user1Id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "status",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "connections_user2_status_idx": {
+ "name": "connections_user2_status_idx",
+ "columns": [
+ {
+ "expression": "user2Id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "status",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "connections_user1Id_users_id_fk": {
+ "name": "connections_user1Id_users_id_fk",
+ "tableFrom": "connections",
+ "tableTo": "users",
+ "columnsFrom": [
+ "user1Id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "connections_user2Id_users_id_fk": {
+ "name": "connections_user2Id_users_id_fk",
+ "tableFrom": "connections",
+ "tableTo": "users",
+ "columnsFrom": [
+ "user2Id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "connections_requestedBy_users_id_fk": {
+ "name": "connections_requestedBy_users_id_fk",
+ "tableFrom": "connections",
+ "tableTo": "users",
+ "columnsFrom": [
+ "requestedBy"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "connections_blockedBy_users_id_fk": {
+ "name": "connections_blockedBy_users_id_fk",
+ "tableFrom": "connections",
+ "tableTo": "users",
+ "columnsFrom": [
+ "blockedBy"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "set null",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "connections_user_pair_key": {
+ "name": "connections_user_pair_key",
+ "nullsNotDistinct": false,
+ "columns": [
+ "user1Id",
+ "user2Id"
+ ]
+ }
+ }
+ },
+ "public.direct_messages": {
+ "name": "direct_messages",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "conversationId": {
+ "name": "conversationId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "senderId": {
+ "name": "senderId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "content": {
+ "name": "content",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "isRead": {
+ "name": "isRead",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "readAt": {
+ "name": "readAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "isEdited": {
+ "name": "isEdited",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "editedAt": {
+ "name": "editedAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "direct_messages_conversation_id_idx": {
+ "name": "direct_messages_conversation_id_idx",
+ "columns": [
+ {
+ "expression": "conversationId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "direct_messages_sender_id_idx": {
+ "name": "direct_messages_sender_id_idx",
+ "columns": [
+ {
+ "expression": "senderId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "direct_messages_created_at_idx": {
+ "name": "direct_messages_created_at_idx",
+ "columns": [
+ {
+ "expression": "createdAt",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "direct_messages_conversation_created_idx": {
+ "name": "direct_messages_conversation_created_idx",
+ "columns": [
+ {
+ "expression": "conversationId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "createdAt",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "direct_messages_conversation_is_read_idx": {
+ "name": "direct_messages_conversation_is_read_idx",
+ "columns": [
+ {
+ "expression": "conversationId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "isRead",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "direct_messages_unread_count_idx": {
+ "name": "direct_messages_unread_count_idx",
+ "columns": [
+ {
+ "expression": "conversationId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "senderId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "isRead",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "direct_messages_conversationId_dm_conversations_id_fk": {
+ "name": "direct_messages_conversationId_dm_conversations_id_fk",
+ "tableFrom": "direct_messages",
+ "tableTo": "dm_conversations",
+ "columnsFrom": [
+ "conversationId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "direct_messages_senderId_users_id_fk": {
+ "name": "direct_messages_senderId_users_id_fk",
+ "tableFrom": "direct_messages",
+ "tableTo": "users",
+ "columnsFrom": [
+ "senderId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "public.dm_conversations": {
+ "name": "dm_conversations",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "participant1Id": {
+ "name": "participant1Id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "participant2Id": {
+ "name": "participant2Id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "lastMessageAt": {
+ "name": "lastMessageAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "lastMessagePreview": {
+ "name": "lastMessagePreview",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "participant1LastRead": {
+ "name": "participant1LastRead",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "participant2LastRead": {
+ "name": "participant2LastRead",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updatedAt": {
+ "name": "updatedAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {
+ "dm_conversations_participant1_id_idx": {
+ "name": "dm_conversations_participant1_id_idx",
+ "columns": [
+ {
+ "expression": "participant1Id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "dm_conversations_participant2_id_idx": {
+ "name": "dm_conversations_participant2_id_idx",
+ "columns": [
+ {
+ "expression": "participant2Id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "dm_conversations_last_message_at_idx": {
+ "name": "dm_conversations_last_message_at_idx",
+ "columns": [
+ {
+ "expression": "lastMessageAt",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "dm_conversations_participant1_last_message_idx": {
+ "name": "dm_conversations_participant1_last_message_idx",
+ "columns": [
+ {
+ "expression": "participant1Id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "lastMessageAt",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "dm_conversations_participant2_last_message_idx": {
+ "name": "dm_conversations_participant2_last_message_idx",
+ "columns": [
+ {
+ "expression": "participant2Id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "lastMessageAt",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "dm_conversations_participant1Id_users_id_fk": {
+ "name": "dm_conversations_participant1Id_users_id_fk",
+ "tableFrom": "dm_conversations",
+ "tableTo": "users",
+ "columnsFrom": [
+ "participant1Id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "dm_conversations_participant2Id_users_id_fk": {
+ "name": "dm_conversations_participant2Id_users_id_fk",
+ "tableFrom": "dm_conversations",
+ "tableTo": "users",
+ "columnsFrom": [
+ "participant2Id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "dm_conversations_participant_pair_key": {
+ "name": "dm_conversations_participant_pair_key",
+ "nullsNotDistinct": false,
+ "columns": [
+ "participant1Id",
+ "participant2Id"
+ ]
+ }
+ }
+ },
+ "public.stripe_events": {
+ "name": "stripe_events",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "type": {
+ "name": "type",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "processedAt": {
+ "name": "processedAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "error": {
+ "name": "error",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "stripe_events_type_idx": {
+ "name": "stripe_events_type_idx",
+ "columns": [
+ {
+ "expression": "type",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "stripe_events_processed_at_idx": {
+ "name": "stripe_events_processed_at_idx",
+ "columns": [
+ {
+ "expression": "processedAt",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "public.subscriptions": {
+ "name": "subscriptions",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "userId": {
+ "name": "userId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "stripeSubscriptionId": {
+ "name": "stripeSubscriptionId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "stripePriceId": {
+ "name": "stripePriceId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "status": {
+ "name": "status",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "currentPeriodStart": {
+ "name": "currentPeriodStart",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "currentPeriodEnd": {
+ "name": "currentPeriodEnd",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "cancelAtPeriodEnd": {
+ "name": "cancelAtPeriodEnd",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "stripeScheduleId": {
+ "name": "stripeScheduleId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "scheduledPriceId": {
+ "name": "scheduledPriceId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "scheduledChangeDate": {
+ "name": "scheduledChangeDate",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updatedAt": {
+ "name": "updatedAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "subscriptions_user_id_idx": {
+ "name": "subscriptions_user_id_idx",
+ "columns": [
+ {
+ "expression": "userId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "subscriptions_stripe_subscription_id_idx": {
+ "name": "subscriptions_stripe_subscription_id_idx",
+ "columns": [
+ {
+ "expression": "stripeSubscriptionId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "subscriptions_stripe_schedule_id_idx": {
+ "name": "subscriptions_stripe_schedule_id_idx",
+ "columns": [
+ {
+ "expression": "stripeScheduleId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "subscriptions_userId_users_id_fk": {
+ "name": "subscriptions_userId_users_id_fk",
+ "tableFrom": "subscriptions",
+ "tableTo": "users",
+ "columnsFrom": [
+ "userId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "subscriptions_stripeSubscriptionId_unique": {
+ "name": "subscriptions_stripeSubscriptionId_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "stripeSubscriptionId"
+ ]
+ }
+ }
+ },
+ "public.contact_submissions": {
+ "name": "contact_submissions",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "email": {
+ "name": "email",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "subject": {
+ "name": "subject",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "message": {
+ "name": "message",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "contact_submissions_email_idx": {
+ "name": "contact_submissions_email_idx",
+ "columns": [
+ {
+ "expression": "email",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "contact_submissions_created_at_idx": {
+ "name": "contact_submissions_created_at_idx",
+ "columns": [
+ {
+ "expression": "createdAt",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "public.feedback_submissions": {
+ "name": "feedback_submissions",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "user_id": {
+ "name": "user_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "message": {
+ "name": "message",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "attachments": {
+ "name": "attachments",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "page_url": {
+ "name": "page_url",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "user_agent": {
+ "name": "user_agent",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "screen_size": {
+ "name": "screen_size",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "viewport_size": {
+ "name": "viewport_size",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "app_version": {
+ "name": "app_version",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "console_errors": {
+ "name": "console_errors",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "status": {
+ "name": "status",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'new'"
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "feedback_submissions_user_id_idx": {
+ "name": "feedback_submissions_user_id_idx",
+ "columns": [
+ {
+ "expression": "user_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "feedback_submissions_status_idx": {
+ "name": "feedback_submissions_status_idx",
+ "columns": [
+ {
+ "expression": "status",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "feedback_submissions_created_at_idx": {
+ "name": "feedback_submissions_created_at_idx",
+ "columns": [
+ {
+ "expression": "created_at",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "feedback_submissions_user_id_users_id_fk": {
+ "name": "feedback_submissions_user_id_users_id_fk",
+ "tableFrom": "feedback_submissions",
+ "tableTo": "users",
+ "columnsFrom": [
+ "user_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "public.file_pages": {
+ "name": "file_pages",
+ "schema": "",
+ "columns": {
+ "fileId": {
+ "name": "fileId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "pageId": {
+ "name": "pageId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "linkedBy": {
+ "name": "linkedBy",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "linkedAt": {
+ "name": "linkedAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "linkSource": {
+ "name": "linkSource",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {
+ "file_pages_file_id_idx": {
+ "name": "file_pages_file_id_idx",
+ "columns": [
+ {
+ "expression": "fileId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "file_pages_page_id_idx": {
+ "name": "file_pages_page_id_idx",
+ "columns": [
+ {
+ "expression": "pageId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "file_pages_fileId_files_id_fk": {
+ "name": "file_pages_fileId_files_id_fk",
+ "tableFrom": "file_pages",
+ "tableTo": "files",
+ "columnsFrom": [
+ "fileId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "file_pages_pageId_pages_id_fk": {
+ "name": "file_pages_pageId_pages_id_fk",
+ "tableFrom": "file_pages",
+ "tableTo": "pages",
+ "columnsFrom": [
+ "pageId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "file_pages_linkedBy_users_id_fk": {
+ "name": "file_pages_linkedBy_users_id_fk",
+ "tableFrom": "file_pages",
+ "tableTo": "users",
+ "columnsFrom": [
+ "linkedBy"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "set null",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {
+ "file_pages_fileId_pageId_pk": {
+ "name": "file_pages_fileId_pageId_pk",
+ "columns": [
+ "fileId",
+ "pageId"
+ ]
+ }
+ },
+ "uniqueConstraints": {
+ "file_pages_page_id_key": {
+ "name": "file_pages_page_id_key",
+ "nullsNotDistinct": false,
+ "columns": [
+ "pageId"
+ ]
+ }
+ }
+ },
+ "public.files": {
+ "name": "files",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "driveId": {
+ "name": "driveId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "sizeBytes": {
+ "name": "sizeBytes",
+ "type": "bigint",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "mimeType": {
+ "name": "mimeType",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "storagePath": {
+ "name": "storagePath",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "checksumVersion": {
+ "name": "checksumVersion",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 1
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updatedAt": {
+ "name": "updatedAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "createdBy": {
+ "name": "createdBy",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "lastAccessedAt": {
+ "name": "lastAccessedAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {
+ "files_drive_id_idx": {
+ "name": "files_drive_id_idx",
+ "columns": [
+ {
+ "expression": "driveId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "files_driveId_drives_id_fk": {
+ "name": "files_driveId_drives_id_fk",
+ "tableFrom": "files",
+ "tableTo": "drives",
+ "columnsFrom": [
+ "driveId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "files_createdBy_users_id_fk": {
+ "name": "files_createdBy_users_id_fk",
+ "tableFrom": "files",
+ "tableTo": "users",
+ "columnsFrom": [
+ "createdBy"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "set null",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "public.task_items": {
+ "name": "task_items",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "taskListId": {
+ "name": "taskListId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "userId": {
+ "name": "userId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "assigneeId": {
+ "name": "assigneeId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "assigneeAgentId": {
+ "name": "assigneeAgentId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "pageId": {
+ "name": "pageId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "title": {
+ "name": "title",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "description": {
+ "name": "description",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "status": {
+ "name": "status",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'pending'"
+ },
+ "priority": {
+ "name": "priority",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'medium'"
+ },
+ "position": {
+ "name": "position",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 0
+ },
+ "dueDate": {
+ "name": "dueDate",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "metadata": {
+ "name": "metadata",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "completedAt": {
+ "name": "completedAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updatedAt": {
+ "name": "updatedAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "task_items_task_list_id_idx": {
+ "name": "task_items_task_list_id_idx",
+ "columns": [
+ {
+ "expression": "taskListId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "task_items_task_list_status_idx": {
+ "name": "task_items_task_list_status_idx",
+ "columns": [
+ {
+ "expression": "taskListId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "status",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "task_items_assignee_id_idx": {
+ "name": "task_items_assignee_id_idx",
+ "columns": [
+ {
+ "expression": "assigneeId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "task_items_assignee_agent_id_idx": {
+ "name": "task_items_assignee_agent_id_idx",
+ "columns": [
+ {
+ "expression": "assigneeAgentId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "task_items_page_id_idx": {
+ "name": "task_items_page_id_idx",
+ "columns": [
+ {
+ "expression": "pageId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "task_items_taskListId_task_lists_id_fk": {
+ "name": "task_items_taskListId_task_lists_id_fk",
+ "tableFrom": "task_items",
+ "tableTo": "task_lists",
+ "columnsFrom": [
+ "taskListId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "task_items_userId_users_id_fk": {
+ "name": "task_items_userId_users_id_fk",
+ "tableFrom": "task_items",
+ "tableTo": "users",
+ "columnsFrom": [
+ "userId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "task_items_assigneeId_users_id_fk": {
+ "name": "task_items_assigneeId_users_id_fk",
+ "tableFrom": "task_items",
+ "tableTo": "users",
+ "columnsFrom": [
+ "assigneeId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "set null",
+ "onUpdate": "no action"
+ },
+ "task_items_assigneeAgentId_pages_id_fk": {
+ "name": "task_items_assigneeAgentId_pages_id_fk",
+ "tableFrom": "task_items",
+ "tableTo": "pages",
+ "columnsFrom": [
+ "assigneeAgentId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "set null",
+ "onUpdate": "no action"
+ },
+ "task_items_pageId_pages_id_fk": {
+ "name": "task_items_pageId_pages_id_fk",
+ "tableFrom": "task_items",
+ "tableTo": "pages",
+ "columnsFrom": [
+ "pageId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "public.task_lists": {
+ "name": "task_lists",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "userId": {
+ "name": "userId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "pageId": {
+ "name": "pageId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "conversationId": {
+ "name": "conversationId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "title": {
+ "name": "title",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "description": {
+ "name": "description",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "status": {
+ "name": "status",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'pending'"
+ },
+ "metadata": {
+ "name": "metadata",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updatedAt": {
+ "name": "updatedAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "task_lists_page_id_idx": {
+ "name": "task_lists_page_id_idx",
+ "columns": [
+ {
+ "expression": "pageId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "task_lists_conversation_id_idx": {
+ "name": "task_lists_conversation_id_idx",
+ "columns": [
+ {
+ "expression": "conversationId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "task_lists_user_id_idx": {
+ "name": "task_lists_user_id_idx",
+ "columns": [
+ {
+ "expression": "userId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "task_lists_userId_users_id_fk": {
+ "name": "task_lists_userId_users_id_fk",
+ "tableFrom": "task_lists",
+ "tableTo": "users",
+ "columnsFrom": [
+ "userId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "task_lists_pageId_pages_id_fk": {
+ "name": "task_lists_pageId_pages_id_fk",
+ "tableFrom": "task_lists",
+ "tableTo": "pages",
+ "columnsFrom": [
+ "pageId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "public.security_audit_log": {
+ "name": "security_audit_log",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "event_type": {
+ "name": "event_type",
+ "type": "security_event_type",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "user_id": {
+ "name": "user_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "session_id": {
+ "name": "session_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "service_id": {
+ "name": "service_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "resource_type": {
+ "name": "resource_type",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "resource_id": {
+ "name": "resource_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "ip_address": {
+ "name": "ip_address",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "user_agent": {
+ "name": "user_agent",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "geo_location": {
+ "name": "geo_location",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "details": {
+ "name": "details",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "risk_score": {
+ "name": "risk_score",
+ "type": "real",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "anomaly_flags": {
+ "name": "anomaly_flags",
+ "type": "text[]",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "timestamp": {
+ "name": "timestamp",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "previous_hash": {
+ "name": "previous_hash",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "event_hash": {
+ "name": "event_hash",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {
+ "idx_security_audit_timestamp": {
+ "name": "idx_security_audit_timestamp",
+ "columns": [
+ {
+ "expression": "timestamp",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_security_audit_user_timestamp": {
+ "name": "idx_security_audit_user_timestamp",
+ "columns": [
+ {
+ "expression": "user_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "timestamp",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_security_audit_event_type": {
+ "name": "idx_security_audit_event_type",
+ "columns": [
+ {
+ "expression": "event_type",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "timestamp",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_security_audit_resource": {
+ "name": "idx_security_audit_resource",
+ "columns": [
+ {
+ "expression": "resource_type",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "resource_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "timestamp",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_security_audit_ip": {
+ "name": "idx_security_audit_ip",
+ "columns": [
+ {
+ "expression": "ip_address",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "timestamp",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_security_audit_event_hash": {
+ "name": "idx_security_audit_event_hash",
+ "columns": [
+ {
+ "expression": "event_hash",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_security_audit_risk_score": {
+ "name": "idx_security_audit_risk_score",
+ "columns": [
+ {
+ "expression": "risk_score",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_security_audit_session": {
+ "name": "idx_security_audit_session",
+ "columns": [
+ {
+ "expression": "session_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "timestamp",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "security_audit_log_user_id_users_id_fk": {
+ "name": "security_audit_log_user_id_users_id_fk",
+ "tableFrom": "security_audit_log",
+ "tableTo": "users",
+ "columnsFrom": [
+ "user_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "set null",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "public.user_page_views": {
+ "name": "user_page_views",
+ "schema": "",
+ "columns": {
+ "userId": {
+ "name": "userId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "pageId": {
+ "name": "pageId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "viewedAt": {
+ "name": "viewedAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "user_page_views_user_id_idx": {
+ "name": "user_page_views_user_id_idx",
+ "columns": [
+ {
+ "expression": "userId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "user_page_views_page_id_idx": {
+ "name": "user_page_views_page_id_idx",
+ "columns": [
+ {
+ "expression": "pageId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "user_page_views_user_page_idx": {
+ "name": "user_page_views_user_page_idx",
+ "columns": [
+ {
+ "expression": "userId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "pageId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "user_page_views_userId_users_id_fk": {
+ "name": "user_page_views_userId_users_id_fk",
+ "tableFrom": "user_page_views",
+ "tableTo": "users",
+ "columnsFrom": [
+ "userId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "user_page_views_pageId_pages_id_fk": {
+ "name": "user_page_views_pageId_pages_id_fk",
+ "tableFrom": "user_page_views",
+ "tableTo": "pages",
+ "columnsFrom": [
+ "pageId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {
+ "user_page_views_userId_pageId_pk": {
+ "name": "user_page_views_userId_pageId_pk",
+ "columns": [
+ "userId",
+ "pageId"
+ ]
+ }
+ },
+ "uniqueConstraints": {}
+ },
+ "public.push_notification_tokens": {
+ "name": "push_notification_tokens",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "userId": {
+ "name": "userId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "token": {
+ "name": "token",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "platform": {
+ "name": "platform",
+ "type": "PushPlatformType",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "deviceId": {
+ "name": "deviceId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "deviceName": {
+ "name": "deviceName",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "isActive": {
+ "name": "isActive",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": true
+ },
+ "webPushSubscription": {
+ "name": "webPushSubscription",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updatedAt": {
+ "name": "updatedAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "lastUsedAt": {
+ "name": "lastUsedAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "failedAttempts": {
+ "name": "failedAttempts",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false,
+ "default": "'0'"
+ },
+ "lastFailedAt": {
+ "name": "lastFailedAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {
+ "push_notification_tokens_user_id_idx": {
+ "name": "push_notification_tokens_user_id_idx",
+ "columns": [
+ {
+ "expression": "userId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "push_notification_tokens_token_idx": {
+ "name": "push_notification_tokens_token_idx",
+ "columns": [
+ {
+ "expression": "token",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "push_notification_tokens_platform_idx": {
+ "name": "push_notification_tokens_platform_idx",
+ "columns": [
+ {
+ "expression": "platform",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "push_notification_tokens_active_idx": {
+ "name": "push_notification_tokens_active_idx",
+ "columns": [
+ {
+ "expression": "userId",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "isActive",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "push_notification_tokens_userId_users_id_fk": {
+ "name": "push_notification_tokens_userId_users_id_fk",
+ "tableFrom": "push_notification_tokens",
+ "tableTo": "users",
+ "columnsFrom": [
+ "userId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ }
+ },
+ "enums": {
+ "public.AuthProvider": {
+ "name": "AuthProvider",
+ "schema": "public",
+ "values": [
+ "email",
+ "google",
+ "apple",
+ "both"
+ ]
+ },
+ "public.PlatformType": {
+ "name": "PlatformType",
+ "schema": "public",
+ "values": [
+ "web",
+ "desktop",
+ "ios",
+ "android"
+ ]
+ },
+ "public.UserRole": {
+ "name": "UserRole",
+ "schema": "public",
+ "values": [
+ "user",
+ "admin"
+ ]
+ },
+ "public.PageType": {
+ "name": "PageType",
+ "schema": "public",
+ "values": [
+ "FOLDER",
+ "DOCUMENT",
+ "CHANNEL",
+ "AI_CHAT",
+ "CANVAS",
+ "FILE",
+ "SHEET",
+ "TASK_LIST"
+ ]
+ },
+ "public.PermissionAction": {
+ "name": "PermissionAction",
+ "schema": "public",
+ "values": [
+ "VIEW",
+ "EDIT",
+ "SHARE",
+ "DELETE"
+ ]
+ },
+ "public.SubjectType": {
+ "name": "SubjectType",
+ "schema": "public",
+ "values": [
+ "USER"
+ ]
+ },
+ "public.InvitationStatus": {
+ "name": "InvitationStatus",
+ "schema": "public",
+ "values": [
+ "PENDING",
+ "ACCEPTED",
+ "REJECTED",
+ "EXPIRED"
+ ]
+ },
+ "public.MemberRole": {
+ "name": "MemberRole",
+ "schema": "public",
+ "values": [
+ "OWNER",
+ "ADMIN",
+ "MEMBER"
+ ]
+ },
+ "public.NotificationType": {
+ "name": "NotificationType",
+ "schema": "public",
+ "values": [
+ "PERMISSION_GRANTED",
+ "PERMISSION_REVOKED",
+ "PERMISSION_UPDATED",
+ "PAGE_SHARED",
+ "DRIVE_INVITED",
+ "DRIVE_JOINED",
+ "DRIVE_ROLE_CHANGED",
+ "CONNECTION_REQUEST",
+ "CONNECTION_ACCEPTED",
+ "CONNECTION_REJECTED",
+ "NEW_DIRECT_MESSAGE",
+ "EMAIL_VERIFICATION_REQUIRED",
+ "TOS_PRIVACY_UPDATED",
+ "MENTION",
+ "TASK_ASSIGNED"
+ ]
+ },
+ "public.activity_change_group_type": {
+ "name": "activity_change_group_type",
+ "schema": "public",
+ "values": [
+ "user",
+ "ai",
+ "automation",
+ "system"
+ ]
+ },
+ "public.activity_operation": {
+ "name": "activity_operation",
+ "schema": "public",
+ "values": [
+ "create",
+ "update",
+ "delete",
+ "restore",
+ "reorder",
+ "permission_grant",
+ "permission_update",
+ "permission_revoke",
+ "trash",
+ "move",
+ "agent_config_update",
+ "member_add",
+ "member_remove",
+ "member_role_change",
+ "login",
+ "logout",
+ "signup",
+ "password_change",
+ "email_change",
+ "token_create",
+ "token_revoke",
+ "upload",
+ "convert",
+ "account_delete",
+ "profile_update",
+ "avatar_update",
+ "message_update",
+ "message_delete",
+ "role_reorder",
+ "ownership_transfer",
+ "rollback",
+ "conversation_undo",
+ "conversation_undo_with_changes"
+ ]
+ },
+ "public.activity_resource": {
+ "name": "activity_resource",
+ "schema": "public",
+ "values": [
+ "page",
+ "drive",
+ "permission",
+ "agent",
+ "user",
+ "member",
+ "role",
+ "file",
+ "token",
+ "device",
+ "message",
+ "conversation"
+ ]
+ },
+ "public.content_format": {
+ "name": "content_format",
+ "schema": "public",
+ "values": [
+ "text",
+ "html",
+ "json",
+ "tiptap"
+ ]
+ },
+ "public.http_method": {
+ "name": "http_method",
+ "schema": "public",
+ "values": [
+ "GET",
+ "POST",
+ "PUT",
+ "DELETE",
+ "PATCH",
+ "HEAD",
+ "OPTIONS"
+ ]
+ },
+ "public.log_level": {
+ "name": "log_level",
+ "schema": "public",
+ "values": [
+ "trace",
+ "debug",
+ "info",
+ "warn",
+ "error",
+ "fatal"
+ ]
+ },
+ "public.subscription_tier": {
+ "name": "subscription_tier",
+ "schema": "public",
+ "values": [
+ "free",
+ "pro",
+ "business",
+ "founder"
+ ]
+ },
+ "public.drive_backup_source": {
+ "name": "drive_backup_source",
+ "schema": "public",
+ "values": [
+ "manual",
+ "scheduled",
+ "pre_restore",
+ "system"
+ ]
+ },
+ "public.drive_backup_status": {
+ "name": "drive_backup_status",
+ "schema": "public",
+ "values": [
+ "pending",
+ "ready",
+ "failed"
+ ]
+ },
+ "public.page_version_source": {
+ "name": "page_version_source",
+ "schema": "public",
+ "values": [
+ "manual",
+ "auto",
+ "pre_ai",
+ "pre_restore",
+ "restore",
+ "system"
+ ]
+ },
+ "public.ConnectionStatus": {
+ "name": "ConnectionStatus",
+ "schema": "public",
+ "values": [
+ "PENDING",
+ "ACCEPTED",
+ "BLOCKED"
+ ]
+ },
+ "public.security_event_type": {
+ "name": "security_event_type",
+ "schema": "public",
+ "values": [
+ "auth.login.success",
+ "auth.login.failure",
+ "auth.logout",
+ "auth.token.created",
+ "auth.token.revoked",
+ "auth.token.refreshed",
+ "auth.password.changed",
+ "auth.password.reset.requested",
+ "auth.password.reset.completed",
+ "auth.mfa.enabled",
+ "auth.mfa.disabled",
+ "auth.mfa.challenged",
+ "auth.mfa.verified",
+ "auth.session.created",
+ "auth.session.revoked",
+ "auth.device.registered",
+ "auth.device.revoked",
+ "authz.access.granted",
+ "authz.access.denied",
+ "authz.permission.granted",
+ "authz.permission.revoked",
+ "authz.role.assigned",
+ "authz.role.removed",
+ "data.read",
+ "data.write",
+ "data.delete",
+ "data.export",
+ "data.share",
+ "admin.user.created",
+ "admin.user.suspended",
+ "admin.user.reactivated",
+ "admin.user.deleted",
+ "admin.settings.changed",
+ "security.anomaly.detected",
+ "security.rate.limited",
+ "security.brute.force.detected",
+ "security.suspicious.activity"
+ ]
+ },
+ "public.PushPlatformType": {
+ "name": "PushPlatformType",
+ "schema": "public",
+ "values": [
+ "ios",
+ "android",
+ "web"
+ ]
+ }
+ },
+ "schemas": {},
+ "sequences": {},
+ "_meta": {
+ "columns": {},
+ "schemas": {},
+ "tables": {}
+ }
+}
\ No newline at end of file
diff --git a/packages/db/drizzle/meta/_journal.json b/packages/db/drizzle/meta/_journal.json
index 7a2eb03822..9a452f2c28 100644
--- a/packages/db/drizzle/meta/_journal.json
+++ b/packages/db/drizzle/meta/_journal.json
@@ -393,6 +393,13 @@
"when": 1769888152370,
"tag": "0055_watery_wrecker",
"breakpoints": true
+ },
+ {
+ "idx": 56,
+ "version": "7",
+ "when": 1769834749649,
+ "tag": "0056_funny_mentor",
+ "breakpoints": true
}
]
}
\ No newline at end of file
diff --git a/packages/db/src/index.ts b/packages/db/src/index.ts
index fb67ea291e..c010c15067 100644
--- a/packages/db/src/index.ts
+++ b/packages/db/src/index.ts
@@ -74,6 +74,15 @@ export {
userHotkeyPreferencesRelations,
} from './schema/hotkeys';
+// Push notification tokens re-exports
+export {
+ pushNotificationTokens,
+ pushNotificationTokensRelations,
+ pushPlatformType,
+ type PushNotificationToken,
+ type NewPushNotificationToken,
+} from './schema/push-notifications';
+
// Note: Auth transaction functions are exported from '@pagespace/db/transactions/auth-transactions'
// They are NOT re-exported here to avoid circular dependency issues
// Import directly: import { atomicDeviceTokenRotation, ... } from '@pagespace/db/transactions/auth-transactions';
\ No newline at end of file
diff --git a/packages/db/src/schema.ts b/packages/db/src/schema.ts
index 3e7a9457e3..d9e77798d9 100644
--- a/packages/db/src/schema.ts
+++ b/packages/db/src/schema.ts
@@ -20,6 +20,7 @@ export * from './schema/tasks';
export * from './schema/security-audit';
export * from './schema/page-views';
export * from './schema/hotkeys';
+export * from './schema/push-notifications';
import * as auth from './schema/auth';
import * as sessions from './schema/sessions';
@@ -43,6 +44,7 @@ import * as tasks from './schema/tasks';
import * as securityAudit from './schema/security-audit';
import * as pageViews from './schema/page-views';
import * as hotkeys from './schema/hotkeys';
+import * as pushNotifications from './schema/push-notifications';
export const schema = {
...auth,
@@ -67,4 +69,5 @@ export const schema = {
...securityAudit,
...pageViews,
...hotkeys,
+ ...pushNotifications,
};
diff --git a/packages/db/src/schema/push-notifications.ts b/packages/db/src/schema/push-notifications.ts
new file mode 100644
index 0000000000..5493fa1c44
--- /dev/null
+++ b/packages/db/src/schema/push-notifications.ts
@@ -0,0 +1,55 @@
+import { pgTable, text, timestamp, boolean, index, pgEnum } from 'drizzle-orm/pg-core';
+import { relations } from 'drizzle-orm';
+import { users } from './auth';
+import { createId } from '@paralleldrive/cuid2';
+
+export const pushPlatformType = pgEnum('PushPlatformType', ['ios', 'android', 'web']);
+
+export const pushNotificationTokens = pgTable('push_notification_tokens', {
+ id: text('id').primaryKey().$defaultFn(() => createId()),
+ userId: text('userId').notNull().references(() => users.id, { onDelete: 'cascade' }),
+
+ // The push token from APNs (iOS), FCM (Android), or Web Push subscription
+ token: text('token').notNull(),
+
+ // Platform identification
+ platform: pushPlatformType('platform').notNull(),
+
+ // Device identification for managing multiple devices
+ deviceId: text('deviceId'),
+ deviceName: text('deviceName'),
+
+ // Token state
+ isActive: boolean('isActive').default(true).notNull(),
+
+ // For web push, we need to store the full subscription object
+ // Contains endpoint, keys (p256dh, auth) for Web Push API
+ webPushSubscription: text('webPushSubscription'),
+
+ // Timestamps
+ createdAt: timestamp('createdAt', { mode: 'date' }).defaultNow().notNull(),
+ updatedAt: timestamp('updatedAt', { mode: 'date' }).defaultNow().notNull().$onUpdate(() => new Date()),
+ lastUsedAt: timestamp('lastUsedAt', { mode: 'date' }),
+
+ // Track failed delivery attempts for cleanup
+ failedAttempts: text('failedAttempts').default('0'),
+ lastFailedAt: timestamp('lastFailedAt', { mode: 'date' }),
+}, (table) => {
+ return {
+ userIdx: index('push_notification_tokens_user_id_idx').on(table.userId),
+ tokenIdx: index('push_notification_tokens_token_idx').on(table.token),
+ platformIdx: index('push_notification_tokens_platform_idx').on(table.platform),
+ activeIdx: index('push_notification_tokens_active_idx').on(table.userId, table.isActive),
+ };
+});
+
+export const pushNotificationTokensRelations = relations(pushNotificationTokens, ({ one }) => ({
+ user: one(users, {
+ fields: [pushNotificationTokens.userId],
+ references: [users.id],
+ }),
+}));
+
+// Types for external use
+export type PushNotificationToken = typeof pushNotificationTokens.$inferSelect;
+export type NewPushNotificationToken = typeof pushNotificationTokens.$inferInsert;
diff --git a/packages/lib/package.json b/packages/lib/package.json
index 1afea9a2d7..f28a031fa5 100644
--- a/packages/lib/package.json
+++ b/packages/lib/package.json
@@ -209,9 +209,9 @@
"require": "./dist/auth/index.js"
},
"./notifications": {
- "types": "./dist/notifications/notifications.d.ts",
- "import": "./dist/notifications/notifications.js",
- "require": "./dist/notifications/notifications.js"
+ "types": "./dist/notifications/index.d.ts",
+ "import": "./dist/notifications/index.js",
+ "require": "./dist/notifications/index.js"
},
"./validators": {
"types": "./dist/validators/index.d.ts",
@@ -336,7 +336,7 @@
"./dist/auth/index.d.ts"
],
"notifications": [
- "./dist/notifications/notifications.d.ts"
+ "./dist/notifications/index.d.ts"
],
"validators": [
"./dist/validators/index.d.ts"
diff --git a/packages/lib/src/notifications/index.ts b/packages/lib/src/notifications/index.ts
index 91da0ce9a5..f17a4c6a22 100644
--- a/packages/lib/src/notifications/index.ts
+++ b/packages/lib/src/notifications/index.ts
@@ -5,4 +5,5 @@
export * from './guards';
export * from './notifications';
+export * from './push-notifications';
export * from './types';
diff --git a/packages/lib/src/notifications/notifications.ts b/packages/lib/src/notifications/notifications.ts
index 487b3537f7..0f98477736 100644
--- a/packages/lib/src/notifications/notifications.ts
+++ b/packages/lib/src/notifications/notifications.ts
@@ -2,6 +2,7 @@ import { db, notifications, users, pages, drives, eq, and, desc, count, sql } fr
import { createId } from '@paralleldrive/cuid2';
import { sendNotificationEmail } from '../services/notification-email-service';
import { createSignedBroadcastHeaders } from '../auth/broadcast-auth';
+import { sendPushNotification } from './push-notifications';
// Export types and guards
export * from './types';
@@ -55,6 +56,21 @@ export async function createNotification(params: CreateNotificationParams) {
metadata: params.metadata || {},
});
+ // Send push notification (fire-and-forget - don't block on push sending)
+ void sendPushNotification(params.userId, {
+ title: params.title,
+ body: params.message,
+ data: {
+ notificationId: notification[0].id,
+ type: params.type,
+ ...(params.pageId && { pageId: params.pageId }),
+ ...(params.driveId && { driveId: params.driveId }),
+ ...params.metadata,
+ },
+ }).catch((error) => {
+ console.error('Failed to send push notification:', error);
+ });
+
return notification[0];
}
diff --git a/packages/lib/src/notifications/push-notifications.ts b/packages/lib/src/notifications/push-notifications.ts
new file mode 100644
index 0000000000..59397ef8cc
--- /dev/null
+++ b/packages/lib/src/notifications/push-notifications.ts
@@ -0,0 +1,385 @@
+import { db, pushNotificationTokens, eq, and } from '@pagespace/db';
+import { createId } from '@paralleldrive/cuid2';
+import * as crypto from 'crypto';
+
+type PushPlatform = 'ios' | 'android' | 'web';
+
+interface PushNotificationPayload {
+ title: string;
+ body: string;
+ badge?: number;
+ sound?: string;
+ data?: Record;
+ category?: string;
+ threadId?: string;
+}
+
+interface SendPushResult {
+ success: boolean;
+ tokenId: string;
+ error?: string;
+ shouldRemoveToken?: boolean;
+}
+
+// APNs JWT token cache
+let apnsJwtToken: string | null = null;
+let apnsJwtExpiry: number = 0;
+
+function getApnsJwtToken(): string {
+ const now = Math.floor(Date.now() / 1000);
+
+ // Return cached token if still valid (tokens are valid for 1 hour, refresh at 50 min)
+ if (apnsJwtToken && apnsJwtExpiry > now + 600) {
+ return apnsJwtToken;
+ }
+
+ const teamId = process.env.APNS_TEAM_ID;
+ const keyId = process.env.APNS_KEY_ID;
+ const privateKey = process.env.APNS_PRIVATE_KEY;
+
+ if (!teamId || !keyId || !privateKey) {
+ throw new Error('APNs configuration missing: APNS_TEAM_ID, APNS_KEY_ID, and APNS_PRIVATE_KEY are required');
+ }
+
+ // Create JWT header and claims
+ const header = {
+ alg: 'ES256',
+ kid: keyId,
+ };
+
+ const claims = {
+ iss: teamId,
+ iat: now,
+ };
+
+ // Base64url encode
+ const base64url = (obj: object) =>
+ Buffer.from(JSON.stringify(obj))
+ .toString('base64')
+ .replace(/\+/g, '-')
+ .replace(/\//g, '_')
+ .replace(/=/g, '');
+
+ const headerB64 = base64url(header);
+ const claimsB64 = base64url(claims);
+ const signingInput = `${headerB64}.${claimsB64}`;
+
+ // Sign with ES256 (ECDSA P-256)
+ const sign = crypto.createSign('SHA256');
+ sign.update(signingInput);
+ sign.end();
+
+ // The private key should be in PEM format
+ const formattedKey = privateKey.includes('-----BEGIN')
+ ? privateKey
+ : `-----BEGIN PRIVATE KEY-----\n${privateKey}\n-----END PRIVATE KEY-----`;
+
+ const signature = sign.sign(formattedKey);
+
+ // Convert DER signature to raw r||s format for JWT
+ // DER format: 0x30 [len] 0x02 [r_len] [r] 0x02 [s_len] [s]
+ const derToRaw = (der: Buffer): Buffer => {
+ let offset = 2; // Skip sequence tag and length
+ const rLen = der[offset + 1];
+ const r = der.slice(offset + 2, offset + 2 + rLen);
+ offset = offset + 2 + rLen;
+ const sLen = der[offset + 1];
+ const s = der.slice(offset + 2, offset + 2 + sLen);
+
+ // Ensure r and s are 32 bytes each (pad or trim leading zeros)
+ const rPadded = Buffer.alloc(32);
+ const sPadded = Buffer.alloc(32);
+
+ if (r.length <= 32) {
+ r.copy(rPadded, 32 - r.length);
+ } else {
+ r.copy(rPadded, 0, r.length - 32);
+ }
+
+ if (s.length <= 32) {
+ s.copy(sPadded, 32 - s.length);
+ } else {
+ s.copy(sPadded, 0, s.length - 32);
+ }
+
+ return Buffer.concat([rPadded, sPadded]);
+ };
+
+ const rawSignature = derToRaw(signature);
+ const signatureB64 = rawSignature
+ .toString('base64')
+ .replace(/\+/g, '-')
+ .replace(/\//g, '_')
+ .replace(/=/g, '');
+
+ apnsJwtToken = `${signingInput}.${signatureB64}`;
+ apnsJwtExpiry = now + 3600; // Token is valid for 1 hour
+
+ return apnsJwtToken;
+}
+
+async function sendToApns(
+ deviceToken: string,
+ payload: PushNotificationPayload,
+ tokenId: string
+): Promise {
+ const bundleId = process.env.APNS_BUNDLE_ID || 'ai.pagespace.ios';
+ const isProduction = process.env.NODE_ENV === 'production';
+ const apnsHost = isProduction
+ ? 'api.push.apple.com'
+ : 'api.sandbox.push.apple.com';
+
+ try {
+ const jwtToken = getApnsJwtToken();
+
+ const apnsPayload = {
+ aps: {
+ alert: {
+ title: payload.title,
+ body: payload.body,
+ },
+ badge: payload.badge,
+ sound: payload.sound || 'default',
+ 'thread-id': payload.threadId,
+ category: payload.category,
+ },
+ ...payload.data,
+ };
+
+ const response = await fetch(
+ `https://${apnsHost}/3/device/${deviceToken}`,
+ {
+ method: 'POST',
+ headers: {
+ 'authorization': `bearer ${jwtToken}`,
+ 'apns-topic': bundleId,
+ 'apns-push-type': 'alert',
+ 'apns-priority': '10',
+ 'content-type': 'application/json',
+ },
+ body: JSON.stringify(apnsPayload),
+ }
+ );
+
+ if (response.ok) {
+ return { success: true, tokenId };
+ }
+
+ const errorBody = await response.json().catch(() => ({}));
+ const reason = (errorBody as { reason?: string }).reason || 'Unknown error';
+
+ // Check if token should be removed (invalid or unregistered)
+ const invalidTokenReasons = [
+ 'BadDeviceToken',
+ 'Unregistered',
+ 'DeviceTokenNotForTopic',
+ 'ExpiredToken',
+ ];
+
+ return {
+ success: false,
+ tokenId,
+ error: reason,
+ shouldRemoveToken: invalidTokenReasons.includes(reason),
+ };
+ } catch (error) {
+ console.error('APNs send error:', error);
+ return {
+ success: false,
+ tokenId,
+ error: error instanceof Error ? error.message : 'Unknown error',
+ };
+ }
+}
+
+export async function registerPushToken(
+ userId: string,
+ token: string,
+ platform: PushPlatform,
+ deviceId?: string,
+ deviceName?: string,
+ webPushSubscription?: string
+): Promise<{ id: string }> {
+ // Check if this token already exists for this user
+ const existing = await db.query.pushNotificationTokens.findFirst({
+ where: and(
+ eq(pushNotificationTokens.userId, userId),
+ eq(pushNotificationTokens.token, token)
+ ),
+ });
+
+ if (existing) {
+ // Update the existing token
+ await db
+ .update(pushNotificationTokens)
+ .set({
+ isActive: true,
+ deviceId,
+ deviceName,
+ webPushSubscription,
+ updatedAt: new Date(),
+ failedAttempts: '0',
+ lastFailedAt: null,
+ })
+ .where(eq(pushNotificationTokens.id, existing.id));
+
+ return { id: existing.id };
+ }
+
+ // If deviceId is provided, deactivate other tokens for the same device
+ if (deviceId) {
+ await db
+ .update(pushNotificationTokens)
+ .set({ isActive: false })
+ .where(
+ and(
+ eq(pushNotificationTokens.userId, userId),
+ eq(pushNotificationTokens.deviceId, deviceId),
+ eq(pushNotificationTokens.platform, platform)
+ )
+ );
+ }
+
+ // Create new token
+ const id = createId();
+ await db.insert(pushNotificationTokens).values({
+ id,
+ userId,
+ token,
+ platform,
+ deviceId,
+ deviceName,
+ webPushSubscription,
+ isActive: true,
+ });
+
+ return { id };
+}
+
+export async function unregisterPushToken(
+ userId: string,
+ token: string
+): Promise {
+ await db
+ .update(pushNotificationTokens)
+ .set({ isActive: false })
+ .where(
+ and(
+ eq(pushNotificationTokens.userId, userId),
+ eq(pushNotificationTokens.token, token)
+ )
+ );
+}
+
+export async function unregisterAllPushTokens(userId: string): Promise {
+ await db
+ .update(pushNotificationTokens)
+ .set({ isActive: false })
+ .where(eq(pushNotificationTokens.userId, userId));
+}
+
+export async function sendPushNotification(
+ userId: string,
+ payload: PushNotificationPayload
+): Promise<{ sent: number; failed: number; errors: string[] }> {
+ // Get all active push tokens for the user
+ const tokens = await db.query.pushNotificationTokens.findMany({
+ where: and(
+ eq(pushNotificationTokens.userId, userId),
+ eq(pushNotificationTokens.isActive, true)
+ ),
+ });
+
+ if (tokens.length === 0) {
+ return { sent: 0, failed: 0, errors: [] };
+ }
+
+ const results: SendPushResult[] = [];
+
+ for (const tokenRecord of tokens) {
+ let result: SendPushResult;
+
+ switch (tokenRecord.platform) {
+ case 'ios':
+ result = await sendToApns(tokenRecord.token, payload, tokenRecord.id);
+ break;
+ case 'android':
+ // TODO: Implement FCM when Android app is added
+ result = {
+ success: false,
+ tokenId: tokenRecord.id,
+ error: 'Android push not yet implemented',
+ };
+ break;
+ case 'web':
+ // TODO: Implement Web Push when PWA push is added
+ result = {
+ success: false,
+ tokenId: tokenRecord.id,
+ error: 'Web push not yet implemented',
+ };
+ break;
+ default:
+ result = {
+ success: false,
+ tokenId: tokenRecord.id,
+ error: `Unknown platform: ${tokenRecord.platform}`,
+ };
+ }
+
+ results.push(result);
+
+ // Handle token cleanup for invalid tokens
+ if (result.shouldRemoveToken) {
+ await db
+ .update(pushNotificationTokens)
+ .set({ isActive: false })
+ .where(eq(pushNotificationTokens.id, tokenRecord.id));
+ } else if (!result.success) {
+ // Track failed attempts
+ const failedAttempts = parseInt(tokenRecord.failedAttempts || '0', 10) + 1;
+ await db
+ .update(pushNotificationTokens)
+ .set({
+ failedAttempts: String(failedAttempts),
+ lastFailedAt: new Date(),
+ // Deactivate after 5 consecutive failures
+ isActive: failedAttempts < 5,
+ })
+ .where(eq(pushNotificationTokens.id, tokenRecord.id));
+ } else {
+ // Reset failed attempts on success and update lastUsedAt
+ await db
+ .update(pushNotificationTokens)
+ .set({
+ failedAttempts: '0',
+ lastFailedAt: null,
+ lastUsedAt: new Date(),
+ })
+ .where(eq(pushNotificationTokens.id, tokenRecord.id));
+ }
+ }
+
+ const sent = results.filter((r) => r.success).length;
+ const failed = results.filter((r) => !r.success).length;
+ const errors = results.filter((r) => r.error).map((r) => r.error!);
+
+ return { sent, failed, errors };
+}
+
+export async function getUserPushTokens(userId: string) {
+ return db.query.pushNotificationTokens.findMany({
+ where: and(
+ eq(pushNotificationTokens.userId, userId),
+ eq(pushNotificationTokens.isActive, true)
+ ),
+ columns: {
+ id: true,
+ platform: true,
+ deviceId: true,
+ deviceName: true,
+ createdAt: true,
+ lastUsedAt: true,
+ },
+ });
+}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 9d1d4e1882..97b7cd35a1 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -130,6 +130,9 @@ importers:
'@capacitor/preferences':
specifier: ^7.0.3
version: 7.0.3(@capacitor/core@7.4.5)
+ '@capacitor/push-notifications':
+ specifier: ^7.0.0
+ version: 7.0.4(@capacitor/core@7.4.5)
'@capacitor/splash-screen':
specifier: ^7.0.3
version: 7.0.4(@capacitor/core@7.4.5)
@@ -1106,6 +1109,11 @@ packages:
peerDependencies:
'@capacitor/core': '>=7.0.0'
+ '@capacitor/push-notifications@7.0.4':
+ resolution: {integrity: sha512-ygTRlA9OiTNfwMZwk7/AUhtVb0/AoCDedsg5RLZUFs5g9abW0ePPzhLl4rSIYwp+4njNjXyIUsQvhnh344/HZA==}
+ peerDependencies:
+ '@capacitor/core': '>=7.0.0'
+
'@capacitor/splash-screen@7.0.4':
resolution: {integrity: sha512-Tv2nepaHJBew2opuF5cHI7nhTAKdWuHxQFhUT6pIS9zfbUGNBEOOQLF4459DfabwRorLN16/DPo3Xk4qNnCRtw==}
peerDependencies:
@@ -10536,6 +10544,10 @@ snapshots:
dependencies:
'@capacitor/core': 7.4.5
+ '@capacitor/push-notifications@7.0.4(@capacitor/core@7.4.5)':
+ dependencies:
+ '@capacitor/core': 7.4.5
+
'@capacitor/splash-screen@7.0.4(@capacitor/core@7.4.5)':
dependencies:
'@capacitor/core': 7.4.5