family-ai-agent 1.0.6 → 1.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (147) hide show
  1. package/.letta/settings.local.json +3 -0
  2. package/dist/database/adapters/base-adapter.d.ts +81 -0
  3. package/dist/database/adapters/base-adapter.d.ts.map +1 -0
  4. package/dist/database/adapters/base-adapter.js +105 -0
  5. package/dist/database/adapters/base-adapter.js.map +1 -0
  6. package/dist/database/adapters/index.d.ts +49 -0
  7. package/dist/database/adapters/index.d.ts.map +1 -0
  8. package/dist/database/adapters/index.js +200 -0
  9. package/dist/database/adapters/index.js.map +1 -0
  10. package/dist/database/adapters/postgres-adapter.d.ts +75 -0
  11. package/dist/database/adapters/postgres-adapter.d.ts.map +1 -0
  12. package/dist/database/adapters/postgres-adapter.js +225 -0
  13. package/dist/database/adapters/postgres-adapter.js.map +1 -0
  14. package/dist/database/adapters/sqlite-adapter.d.ts +72 -0
  15. package/dist/database/adapters/sqlite-adapter.d.ts.map +1 -0
  16. package/dist/database/adapters/sqlite-adapter.js +368 -0
  17. package/dist/database/adapters/sqlite-adapter.js.map +1 -0
  18. package/dist/database/cache/cache-keys.d.ts +180 -0
  19. package/dist/database/cache/cache-keys.d.ts.map +1 -0
  20. package/dist/database/cache/cache-keys.js +107 -0
  21. package/dist/database/cache/cache-keys.js.map +1 -0
  22. package/dist/database/cache/index.d.ts +24 -0
  23. package/dist/database/cache/index.d.ts.map +1 -0
  24. package/dist/database/cache/index.js +34 -0
  25. package/dist/database/cache/index.js.map +1 -0
  26. package/dist/database/cache/query-cache.d.ts +67 -0
  27. package/dist/database/cache/query-cache.d.ts.map +1 -0
  28. package/dist/database/cache/query-cache.js +177 -0
  29. package/dist/database/cache/query-cache.js.map +1 -0
  30. package/dist/database/client.d.ts +63 -4
  31. package/dist/database/client.d.ts.map +1 -1
  32. package/dist/database/client.js +147 -59
  33. package/dist/database/client.js.map +1 -1
  34. package/dist/database/db-config.d.ts +104 -0
  35. package/dist/database/db-config.d.ts.map +1 -0
  36. package/dist/database/db-config.js +167 -0
  37. package/dist/database/db-config.js.map +1 -0
  38. package/dist/database/drizzle/index.d.ts +42 -0
  39. package/dist/database/drizzle/index.d.ts.map +1 -0
  40. package/dist/database/drizzle/index.js +48 -0
  41. package/dist/database/drizzle/index.js.map +1 -0
  42. package/dist/database/drizzle/schema/audit.d.ts +533 -0
  43. package/dist/database/drizzle/schema/audit.d.ts.map +1 -0
  44. package/dist/database/drizzle/schema/audit.js +71 -0
  45. package/dist/database/drizzle/schema/audit.js.map +1 -0
  46. package/dist/database/drizzle/schema/checkpoints.d.ts +665 -0
  47. package/dist/database/drizzle/schema/checkpoints.d.ts.map +1 -0
  48. package/dist/database/drizzle/schema/checkpoints.js +110 -0
  49. package/dist/database/drizzle/schema/checkpoints.js.map +1 -0
  50. package/dist/database/drizzle/schema/conversations.d.ts +449 -0
  51. package/dist/database/drizzle/schema/conversations.d.ts.map +1 -0
  52. package/dist/database/drizzle/schema/conversations.js +91 -0
  53. package/dist/database/drizzle/schema/conversations.js.map +1 -0
  54. package/dist/database/drizzle/schema/documents.d.ts +600 -0
  55. package/dist/database/drizzle/schema/documents.d.ts.map +1 -0
  56. package/dist/database/drizzle/schema/documents.js +100 -0
  57. package/dist/database/drizzle/schema/documents.js.map +1 -0
  58. package/dist/database/drizzle/schema/index.d.ts +3084 -0
  59. package/dist/database/drizzle/schema/index.d.ts.map +1 -0
  60. package/dist/database/drizzle/schema/index.js +46 -0
  61. package/dist/database/drizzle/schema/index.js.map +1 -0
  62. package/dist/database/drizzle/schema/memories.d.ts +435 -0
  63. package/dist/database/drizzle/schema/memories.d.ts.map +1 -0
  64. package/dist/database/drizzle/schema/memories.js +73 -0
  65. package/dist/database/drizzle/schema/memories.js.map +1 -0
  66. package/dist/database/drizzle/schema/tasks.d.ts +565 -0
  67. package/dist/database/drizzle/schema/tasks.d.ts.map +1 -0
  68. package/dist/database/drizzle/schema/tasks.js +84 -0
  69. package/dist/database/drizzle/schema/tasks.js.map +1 -0
  70. package/dist/database/health/circuit-breaker.d.ts +81 -0
  71. package/dist/database/health/circuit-breaker.d.ts.map +1 -0
  72. package/dist/database/health/circuit-breaker.js +184 -0
  73. package/dist/database/health/circuit-breaker.js.map +1 -0
  74. package/dist/database/health/health-monitor.d.ts +69 -0
  75. package/dist/database/health/health-monitor.d.ts.map +1 -0
  76. package/dist/database/health/health-monitor.js +174 -0
  77. package/dist/database/health/health-monitor.js.map +1 -0
  78. package/dist/database/health/index.d.ts +27 -0
  79. package/dist/database/health/index.d.ts.map +1 -0
  80. package/dist/database/health/index.js +23 -0
  81. package/dist/database/health/index.js.map +1 -0
  82. package/dist/database/index.d.ts +16 -0
  83. package/dist/database/index.d.ts.map +1 -0
  84. package/dist/database/index.js +41 -0
  85. package/dist/database/index.js.map +1 -0
  86. package/dist/database/migrations/index.d.ts +34 -0
  87. package/dist/database/migrations/index.d.ts.map +1 -0
  88. package/dist/database/migrations/index.js +45 -0
  89. package/dist/database/migrations/index.js.map +1 -0
  90. package/dist/database/migrations/migrator.d.ts +77 -0
  91. package/dist/database/migrations/migrator.d.ts.map +1 -0
  92. package/dist/database/migrations/migrator.js +258 -0
  93. package/dist/database/migrations/migrator.js.map +1 -0
  94. package/dist/database/migrations/versions/001_initial.d.ts +9 -0
  95. package/dist/database/migrations/versions/001_initial.d.ts.map +1 -0
  96. package/dist/database/migrations/versions/001_initial.js +183 -0
  97. package/dist/database/migrations/versions/001_initial.js.map +1 -0
  98. package/dist/database/types.d.ts +255 -0
  99. package/dist/database/types.d.ts.map +1 -0
  100. package/dist/database/types.js +8 -0
  101. package/dist/database/types.js.map +1 -0
  102. package/dist/database/vector/embedding-cache.d.ts +92 -0
  103. package/dist/database/vector/embedding-cache.d.ts.map +1 -0
  104. package/dist/database/vector/embedding-cache.js +185 -0
  105. package/dist/database/vector/embedding-cache.js.map +1 -0
  106. package/dist/database/vector/hnsw-index.d.ts +111 -0
  107. package/dist/database/vector/hnsw-index.d.ts.map +1 -0
  108. package/dist/database/vector/hnsw-index.js +337 -0
  109. package/dist/database/vector/hnsw-index.js.map +1 -0
  110. package/dist/database/vector/index.d.ts +75 -0
  111. package/dist/database/vector/index.d.ts.map +1 -0
  112. package/dist/database/vector/index.js +213 -0
  113. package/dist/database/vector/index.js.map +1 -0
  114. package/dist/database/vector/similarity.d.ts +67 -0
  115. package/dist/database/vector/similarity.d.ts.map +1 -0
  116. package/dist/database/vector/similarity.js +176 -0
  117. package/dist/database/vector/similarity.js.map +1 -0
  118. package/package.json +6 -3
  119. package/src/database/adapters/base-adapter.ts +171 -0
  120. package/src/database/adapters/index.ts +224 -0
  121. package/src/database/adapters/postgres-adapter.ts +285 -0
  122. package/src/database/adapters/sqlite-adapter.ts +420 -0
  123. package/src/database/cache/cache-keys.ts +150 -0
  124. package/src/database/cache/index.ts +44 -0
  125. package/src/database/cache/query-cache.ts +213 -0
  126. package/src/database/client.ts +166 -64
  127. package/src/database/db-config.ts +194 -0
  128. package/src/database/drizzle/index.ts +66 -0
  129. package/src/database/drizzle/schema/audit.ts +127 -0
  130. package/src/database/drizzle/schema/checkpoints.ts +164 -0
  131. package/src/database/drizzle/schema/conversations.ts +138 -0
  132. package/src/database/drizzle/schema/documents.ts +157 -0
  133. package/src/database/drizzle/schema/index.ts +139 -0
  134. package/src/database/drizzle/schema/memories.ts +127 -0
  135. package/src/database/drizzle/schema/tasks.ts +129 -0
  136. package/src/database/health/circuit-breaker.ts +214 -0
  137. package/src/database/health/health-monitor.ts +224 -0
  138. package/src/database/health/index.ts +41 -0
  139. package/src/database/index.ts +157 -0
  140. package/src/database/migrations/index.ts +52 -0
  141. package/src/database/migrations/migrator.ts +325 -0
  142. package/src/database/migrations/versions/001_initial.ts +198 -0
  143. package/src/database/types.ts +324 -0
  144. package/src/database/vector/embedding-cache.ts +234 -0
  145. package/src/database/vector/hnsw-index.ts +452 -0
  146. package/src/database/vector/index.ts +292 -0
  147. package/src/database/vector/similarity.ts +198 -0
@@ -0,0 +1,157 @@
1
+ /**
2
+ * Documents Schema
3
+ *
4
+ * Drizzle ORM schema for knowledge base documents and chunks.
5
+ * Supports vector embeddings for RAG (Retrieval Augmented Generation).
6
+ */
7
+
8
+ import {
9
+ pgTable,
10
+ uuid,
11
+ text,
12
+ integer,
13
+ timestamp,
14
+ jsonb,
15
+ index,
16
+ } from 'drizzle-orm/pg-core';
17
+ import {
18
+ sqliteTable,
19
+ text as sqliteText,
20
+ integer as sqliteInteger,
21
+ } from 'drizzle-orm/sqlite-core';
22
+ import { sql } from 'drizzle-orm';
23
+
24
+ // =============================================================================
25
+ // PostgreSQL Schema
26
+ // =============================================================================
27
+
28
+ /**
29
+ * Documents table (PostgreSQL)
30
+ */
31
+ export const documentsPg = pgTable(
32
+ 'documents',
33
+ {
34
+ id: uuid('id')
35
+ .primaryKey()
36
+ .default(sql`gen_random_uuid()`),
37
+ userId: text('user_id'),
38
+ filename: text('filename').notNull(),
39
+ fileType: text('file_type'),
40
+ fileSize: integer('file_size'),
41
+ content: text('content'),
42
+ metadata: jsonb('metadata').default({}).notNull(),
43
+ createdAt: timestamp('created_at', { withTimezone: true })
44
+ .defaultNow()
45
+ .notNull(),
46
+ },
47
+ (table) => ({
48
+ userIdIdx: index('documents_user_id_idx').on(table.userId),
49
+ filenameIdx: index('documents_filename_idx').on(table.filename),
50
+ createdAtIdx: index('documents_created_at_idx').on(table.createdAt),
51
+ })
52
+ );
53
+
54
+ /**
55
+ * Document chunks table (PostgreSQL)
56
+ */
57
+ export const documentChunksPg = pgTable(
58
+ 'document_chunks',
59
+ {
60
+ id: uuid('id')
61
+ .primaryKey()
62
+ .default(sql`gen_random_uuid()`),
63
+ documentId: uuid('document_id')
64
+ .notNull()
65
+ .references(() => documentsPg.id, { onDelete: 'cascade' }),
66
+ chunkIndex: integer('chunk_index').notNull(),
67
+ content: text('content').notNull(),
68
+ // pgvector embedding
69
+ embedding: text('embedding').notNull(),
70
+ metadata: jsonb('metadata').default({}).notNull(),
71
+ createdAt: timestamp('created_at', { withTimezone: true })
72
+ .defaultNow()
73
+ .notNull(),
74
+ },
75
+ (table) => ({
76
+ documentIdIdx: index('chunks_document_id_idx').on(table.documentId),
77
+ chunkIndexIdx: index('chunks_chunk_index_idx').on(table.chunkIndex),
78
+ })
79
+ );
80
+
81
+ // =============================================================================
82
+ // SQLite Schema
83
+ // =============================================================================
84
+
85
+ /**
86
+ * Documents table (SQLite)
87
+ */
88
+ export const documentsSqlite = sqliteTable('documents', {
89
+ id: sqliteText('id')
90
+ .primaryKey()
91
+ .$defaultFn(() => crypto.randomUUID()),
92
+ userId: sqliteText('user_id'),
93
+ filename: sqliteText('filename').notNull(),
94
+ fileType: sqliteText('file_type'),
95
+ fileSize: sqliteInteger('file_size'),
96
+ content: sqliteText('content'),
97
+ metadata: sqliteText('metadata', { mode: 'json' })
98
+ .notNull()
99
+ .$type<Record<string, unknown>>()
100
+ .default({}),
101
+ createdAt: sqliteInteger('created_at', { mode: 'timestamp' })
102
+ .notNull()
103
+ .$defaultFn(() => new Date()),
104
+ });
105
+
106
+ /**
107
+ * Document chunks table (SQLite)
108
+ */
109
+ export const documentChunksSqlite = sqliteTable('document_chunks', {
110
+ id: sqliteText('id')
111
+ .primaryKey()
112
+ .$defaultFn(() => crypto.randomUUID()),
113
+ documentId: sqliteText('document_id')
114
+ .notNull()
115
+ .references(() => documentsSqlite.id, { onDelete: 'cascade' }),
116
+ chunkIndex: sqliteInteger('chunk_index').notNull(),
117
+ content: sqliteText('content').notNull(),
118
+ embedding: sqliteText('embedding').notNull(),
119
+ metadata: sqliteText('metadata', { mode: 'json' })
120
+ .notNull()
121
+ .$type<Record<string, unknown>>()
122
+ .default({}),
123
+ createdAt: sqliteInteger('created_at', { mode: 'timestamp' })
124
+ .notNull()
125
+ .$defaultFn(() => new Date()),
126
+ });
127
+
128
+ // =============================================================================
129
+ // TypeScript Types
130
+ // =============================================================================
131
+
132
+ export type DocumentPg = typeof documentsPg.$inferSelect;
133
+ export type NewDocumentPg = typeof documentsPg.$inferInsert;
134
+ export type DocumentChunkPg = typeof documentChunksPg.$inferSelect;
135
+ export type NewDocumentChunkPg = typeof documentChunksPg.$inferInsert;
136
+
137
+ export type DocumentSqlite = typeof documentsSqlite.$inferSelect;
138
+ export type NewDocumentSqlite = typeof documentsSqlite.$inferInsert;
139
+ export type DocumentChunkSqlite = typeof documentChunksSqlite.$inferSelect;
140
+ export type NewDocumentChunkSqlite = typeof documentChunksSqlite.$inferInsert;
141
+
142
+ // Unified types
143
+ export type Document = DocumentPg | DocumentSqlite;
144
+ export type NewDocument = NewDocumentPg | NewDocumentSqlite;
145
+ export type DocumentChunk = DocumentChunkPg | DocumentChunkSqlite;
146
+ export type NewDocumentChunk = NewDocumentChunkPg | NewDocumentChunkSqlite;
147
+
148
+ // Parsed chunk with embedding array
149
+ export interface ParsedDocumentChunk {
150
+ id: string;
151
+ documentId: string;
152
+ chunkIndex: number;
153
+ content: string;
154
+ embedding: number[];
155
+ metadata: Record<string, unknown>;
156
+ createdAt: Date;
157
+ }
@@ -0,0 +1,139 @@
1
+ /**
2
+ * Schema Exports
3
+ *
4
+ * Central export for all Drizzle ORM schemas.
5
+ */
6
+
7
+ // Conversations
8
+ export {
9
+ conversationsPg,
10
+ messagesPg,
11
+ conversationsSqlite,
12
+ messagesSqlite,
13
+ type ConversationPg,
14
+ type NewConversationPg,
15
+ type MessagePg,
16
+ type NewMessagePg,
17
+ type ConversationSqlite,
18
+ type NewConversationSqlite,
19
+ type MessageSqlite,
20
+ type NewMessageSqlite,
21
+ type Conversation,
22
+ type NewConversation,
23
+ type Message,
24
+ type NewMessage,
25
+ } from './conversations.js';
26
+
27
+ // Long-term memories
28
+ export {
29
+ longTermMemoriesPg,
30
+ longTermMemoriesSqlite,
31
+ type LongTermMemoryPg,
32
+ type NewLongTermMemoryPg,
33
+ type LongTermMemorySqlite,
34
+ type NewLongTermMemorySqlite,
35
+ type LongTermMemory,
36
+ type NewLongTermMemory,
37
+ type MemoryType,
38
+ type ParsedMemory,
39
+ } from './memories.js';
40
+
41
+ // Documents
42
+ export {
43
+ documentsPg,
44
+ documentChunksPg,
45
+ documentsSqlite,
46
+ documentChunksSqlite,
47
+ type DocumentPg,
48
+ type NewDocumentPg,
49
+ type DocumentChunkPg,
50
+ type NewDocumentChunkPg,
51
+ type DocumentSqlite,
52
+ type NewDocumentSqlite,
53
+ type DocumentChunkSqlite,
54
+ type NewDocumentChunkSqlite,
55
+ type Document,
56
+ type NewDocument,
57
+ type DocumentChunk,
58
+ type NewDocumentChunk,
59
+ type ParsedDocumentChunk,
60
+ } from './documents.js';
61
+
62
+ // Checkpoints
63
+ export {
64
+ checkpointsPg,
65
+ checkpointWritesPg,
66
+ checkpointsSqlite,
67
+ checkpointWritesSqlite,
68
+ type CheckpointPg,
69
+ type NewCheckpointPg,
70
+ type CheckpointWritePg,
71
+ type NewCheckpointWritePg,
72
+ type CheckpointSqlite,
73
+ type NewCheckpointSqlite,
74
+ type CheckpointWriteSqlite,
75
+ type NewCheckpointWriteSqlite,
76
+ type Checkpoint,
77
+ type NewCheckpoint,
78
+ type CheckpointWrite,
79
+ type NewCheckpointWrite,
80
+ } from './checkpoints.js';
81
+
82
+ // Audit logs
83
+ export {
84
+ auditLogsPg,
85
+ auditLogsSqlite,
86
+ type AuditLogPg,
87
+ type NewAuditLogPg,
88
+ type AuditLogSqlite,
89
+ type NewAuditLogSqlite,
90
+ type AuditLog,
91
+ type NewAuditLog,
92
+ type AuditActionType,
93
+ type AuditStatus,
94
+ } from './audit.js';
95
+
96
+ // Tasks
97
+ export {
98
+ tasksPg,
99
+ tasksSqlite,
100
+ type TaskPg,
101
+ type NewTaskPg,
102
+ type TaskSqlite,
103
+ type NewTaskSqlite,
104
+ type Task,
105
+ type NewTask,
106
+ type TaskStatus,
107
+ TaskPriority,
108
+ type TaskPriorityLevel,
109
+ } from './tasks.js';
110
+
111
+ /**
112
+ * All PostgreSQL tables
113
+ */
114
+ export const pgSchema = {
115
+ conversations: () => import('./conversations.js').then((m) => m.conversationsPg),
116
+ messages: () => import('./conversations.js').then((m) => m.messagesPg),
117
+ longTermMemories: () => import('./memories.js').then((m) => m.longTermMemoriesPg),
118
+ documents: () => import('./documents.js').then((m) => m.documentsPg),
119
+ documentChunks: () => import('./documents.js').then((m) => m.documentChunksPg),
120
+ checkpoints: () => import('./checkpoints.js').then((m) => m.checkpointsPg),
121
+ checkpointWrites: () => import('./checkpoints.js').then((m) => m.checkpointWritesPg),
122
+ auditLogs: () => import('./audit.js').then((m) => m.auditLogsPg),
123
+ tasks: () => import('./tasks.js').then((m) => m.tasksPg),
124
+ };
125
+
126
+ /**
127
+ * All SQLite tables
128
+ */
129
+ export const sqliteSchema = {
130
+ conversations: () => import('./conversations.js').then((m) => m.conversationsSqlite),
131
+ messages: () => import('./conversations.js').then((m) => m.messagesSqlite),
132
+ longTermMemories: () => import('./memories.js').then((m) => m.longTermMemoriesSqlite),
133
+ documents: () => import('./documents.js').then((m) => m.documentsSqlite),
134
+ documentChunks: () => import('./documents.js').then((m) => m.documentChunksSqlite),
135
+ checkpoints: () => import('./checkpoints.js').then((m) => m.checkpointsSqlite),
136
+ checkpointWrites: () => import('./checkpoints.js').then((m) => m.checkpointWritesSqlite),
137
+ auditLogs: () => import('./audit.js').then((m) => m.auditLogsSqlite),
138
+ tasks: () => import('./tasks.js').then((m) => m.tasksSqlite),
139
+ };
@@ -0,0 +1,127 @@
1
+ /**
2
+ * Long-Term Memories Schema
3
+ *
4
+ * Drizzle ORM schema for vector-embedded memories.
5
+ * PostgreSQL uses pgvector, SQLite stores embeddings as JSON.
6
+ */
7
+
8
+ import {
9
+ pgTable,
10
+ uuid,
11
+ text,
12
+ real,
13
+ integer,
14
+ timestamp,
15
+ jsonb,
16
+ index,
17
+ } from 'drizzle-orm/pg-core';
18
+ import {
19
+ sqliteTable,
20
+ text as sqliteText,
21
+ real as sqliteReal,
22
+ integer as sqliteInteger,
23
+ } from 'drizzle-orm/sqlite-core';
24
+ import { sql } from 'drizzle-orm';
25
+
26
+ // =============================================================================
27
+ // PostgreSQL Schema (with pgvector)
28
+ // =============================================================================
29
+
30
+ /**
31
+ * Long-term memories table (PostgreSQL)
32
+ * Uses pgvector extension for embedding storage and similarity search
33
+ */
34
+ export const longTermMemoriesPg = pgTable(
35
+ 'long_term_memories',
36
+ {
37
+ id: uuid('id')
38
+ .primaryKey()
39
+ .default(sql`gen_random_uuid()`),
40
+ userId: text('user_id'),
41
+ memoryType: text('memory_type').notNull(), // 'semantic' | 'episodic' | 'procedural'
42
+ content: text('content').notNull(),
43
+ // pgvector type - stored as vector(1536)
44
+ // Note: Drizzle doesn't have native pgvector support, so we use customType
45
+ embedding: text('embedding').notNull(), // Will store as '[0.1, 0.2, ...]' format
46
+ importance: real('importance').default(0.5).notNull(),
47
+ accessCount: integer('access_count').default(0).notNull(),
48
+ lastAccessed: timestamp('last_accessed', { withTimezone: true }),
49
+ metadata: jsonb('metadata').default({}).notNull(),
50
+ createdAt: timestamp('created_at', { withTimezone: true })
51
+ .defaultNow()
52
+ .notNull(),
53
+ updatedAt: timestamp('updated_at', { withTimezone: true })
54
+ .defaultNow()
55
+ .notNull(),
56
+ },
57
+ (table) => ({
58
+ userIdIdx: index('memories_user_id_idx').on(table.userId),
59
+ memoryTypeIdx: index('memories_memory_type_idx').on(table.memoryType),
60
+ importanceIdx: index('memories_importance_idx').on(table.importance),
61
+ createdAtIdx: index('memories_created_at_idx').on(table.createdAt),
62
+ })
63
+ );
64
+
65
+ // =============================================================================
66
+ // SQLite Schema
67
+ // =============================================================================
68
+
69
+ /**
70
+ * Long-term memories table (SQLite)
71
+ * Embeddings stored as JSON string, similarity search done in-memory
72
+ */
73
+ export const longTermMemoriesSqlite = sqliteTable('long_term_memories', {
74
+ id: sqliteText('id')
75
+ .primaryKey()
76
+ .$defaultFn(() => crypto.randomUUID()),
77
+ userId: sqliteText('user_id'),
78
+ memoryType: sqliteText('memory_type').notNull(),
79
+ content: sqliteText('content').notNull(),
80
+ // Embedding stored as JSON array string: "[0.1, 0.2, ...]"
81
+ embedding: sqliteText('embedding').notNull(),
82
+ importance: sqliteReal('importance').default(0.5).notNull(),
83
+ accessCount: sqliteInteger('access_count').default(0).notNull(),
84
+ lastAccessed: sqliteInteger('last_accessed', { mode: 'timestamp' }),
85
+ metadata: sqliteText('metadata', { mode: 'json' })
86
+ .notNull()
87
+ .$type<Record<string, unknown>>()
88
+ .default({}),
89
+ createdAt: sqliteInteger('created_at', { mode: 'timestamp' })
90
+ .notNull()
91
+ .$defaultFn(() => new Date()),
92
+ updatedAt: sqliteInteger('updated_at', { mode: 'timestamp' })
93
+ .notNull()
94
+ .$defaultFn(() => new Date()),
95
+ });
96
+
97
+ // =============================================================================
98
+ // TypeScript Types
99
+ // =============================================================================
100
+
101
+ export type LongTermMemoryPg = typeof longTermMemoriesPg.$inferSelect;
102
+ export type NewLongTermMemoryPg = typeof longTermMemoriesPg.$inferInsert;
103
+
104
+ export type LongTermMemorySqlite = typeof longTermMemoriesSqlite.$inferSelect;
105
+ export type NewLongTermMemorySqlite = typeof longTermMemoriesSqlite.$inferInsert;
106
+
107
+ // Unified types
108
+ export type LongTermMemory = LongTermMemoryPg | LongTermMemorySqlite;
109
+ export type NewLongTermMemory = NewLongTermMemoryPg | NewLongTermMemorySqlite;
110
+
111
+ // Memory type enum
112
+ export type MemoryType = 'semantic' | 'episodic' | 'procedural';
113
+
114
+ // Memory with parsed embedding
115
+ export interface ParsedMemory {
116
+ id: string;
117
+ userId: string | null;
118
+ memoryType: MemoryType;
119
+ content: string;
120
+ embedding: number[];
121
+ importance: number;
122
+ accessCount: number;
123
+ lastAccessed: Date | null;
124
+ metadata: Record<string, unknown>;
125
+ createdAt: Date;
126
+ updatedAt: Date;
127
+ }
@@ -0,0 +1,129 @@
1
+ /**
2
+ * Tasks Schema
3
+ *
4
+ * Drizzle ORM schema for automation task queue.
5
+ * Supports scheduled and recurring tasks.
6
+ */
7
+
8
+ import {
9
+ pgTable,
10
+ uuid,
11
+ text,
12
+ integer,
13
+ timestamp,
14
+ jsonb,
15
+ index,
16
+ } from 'drizzle-orm/pg-core';
17
+ import {
18
+ sqliteTable,
19
+ text as sqliteText,
20
+ integer as sqliteInteger,
21
+ } from 'drizzle-orm/sqlite-core';
22
+ import { sql } from 'drizzle-orm';
23
+
24
+ // =============================================================================
25
+ // PostgreSQL Schema
26
+ // =============================================================================
27
+
28
+ /**
29
+ * Tasks table (PostgreSQL)
30
+ */
31
+ export const tasksPg = pgTable(
32
+ 'tasks',
33
+ {
34
+ id: uuid('id')
35
+ .primaryKey()
36
+ .default(sql`gen_random_uuid()`),
37
+ userId: text('user_id'),
38
+ taskType: text('task_type').notNull(),
39
+ priority: integer('priority').default(0).notNull(),
40
+ status: text('status').default('pending').notNull(), // 'pending' | 'running' | 'completed' | 'failed' | 'cancelled'
41
+ payload: jsonb('payload').default({}).notNull(),
42
+ result: jsonb('result'),
43
+ errorMessage: text('error_message'),
44
+ scheduledAt: timestamp('scheduled_at', { withTimezone: true }),
45
+ startedAt: timestamp('started_at', { withTimezone: true }),
46
+ completedAt: timestamp('completed_at', { withTimezone: true }),
47
+ retryCount: integer('retry_count').default(0).notNull(),
48
+ maxRetries: integer('max_retries').default(3).notNull(),
49
+ createdAt: timestamp('created_at', { withTimezone: true })
50
+ .defaultNow()
51
+ .notNull(),
52
+ updatedAt: timestamp('updated_at', { withTimezone: true })
53
+ .defaultNow()
54
+ .notNull(),
55
+ },
56
+ (table) => ({
57
+ userIdIdx: index('tasks_user_id_idx').on(table.userId),
58
+ statusIdx: index('tasks_status_idx').on(table.status),
59
+ priorityIdx: index('tasks_priority_idx').on(table.priority),
60
+ scheduledAtIdx: index('tasks_scheduled_at_idx').on(table.scheduledAt),
61
+ taskTypeIdx: index('tasks_task_type_idx').on(table.taskType),
62
+ })
63
+ );
64
+
65
+ // =============================================================================
66
+ // SQLite Schema
67
+ // =============================================================================
68
+
69
+ /**
70
+ * Tasks table (SQLite)
71
+ */
72
+ export const tasksSqlite = sqliteTable('tasks', {
73
+ id: sqliteText('id')
74
+ .primaryKey()
75
+ .$defaultFn(() => crypto.randomUUID()),
76
+ userId: sqliteText('user_id'),
77
+ taskType: sqliteText('task_type').notNull(),
78
+ priority: sqliteInteger('priority').default(0).notNull(),
79
+ status: sqliteText('status').default('pending').notNull(),
80
+ payload: sqliteText('payload', { mode: 'json' })
81
+ .notNull()
82
+ .$type<Record<string, unknown>>()
83
+ .default({}),
84
+ result: sqliteText('result', { mode: 'json' }).$type<Record<string, unknown>>(),
85
+ errorMessage: sqliteText('error_message'),
86
+ scheduledAt: sqliteInteger('scheduled_at', { mode: 'timestamp' }),
87
+ startedAt: sqliteInteger('started_at', { mode: 'timestamp' }),
88
+ completedAt: sqliteInteger('completed_at', { mode: 'timestamp' }),
89
+ retryCount: sqliteInteger('retry_count').default(0).notNull(),
90
+ maxRetries: sqliteInteger('max_retries').default(3).notNull(),
91
+ createdAt: sqliteInteger('created_at', { mode: 'timestamp' })
92
+ .notNull()
93
+ .$defaultFn(() => new Date()),
94
+ updatedAt: sqliteInteger('updated_at', { mode: 'timestamp' })
95
+ .notNull()
96
+ .$defaultFn(() => new Date()),
97
+ });
98
+
99
+ // =============================================================================
100
+ // TypeScript Types
101
+ // =============================================================================
102
+
103
+ export type TaskPg = typeof tasksPg.$inferSelect;
104
+ export type NewTaskPg = typeof tasksPg.$inferInsert;
105
+
106
+ export type TaskSqlite = typeof tasksSqlite.$inferSelect;
107
+ export type NewTaskSqlite = typeof tasksSqlite.$inferInsert;
108
+
109
+ // Unified types
110
+ export type Task = TaskPg | TaskSqlite;
111
+ export type NewTask = NewTaskPg | NewTaskSqlite;
112
+
113
+ // Task status enum
114
+ export type TaskStatus =
115
+ | 'pending'
116
+ | 'running'
117
+ | 'completed'
118
+ | 'failed'
119
+ | 'cancelled';
120
+
121
+ // Task priority levels
122
+ export const TaskPriority = {
123
+ LOW: 0,
124
+ NORMAL: 5,
125
+ HIGH: 10,
126
+ URGENT: 20,
127
+ } as const;
128
+
129
+ export type TaskPriorityLevel = (typeof TaskPriority)[keyof typeof TaskPriority];