@sylphx/flow 1.0.1 → 1.0.3

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 (229) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/package.json +10 -9
  3. package/src/commands/codebase-command.ts +168 -0
  4. package/src/commands/flow-command.ts +1137 -0
  5. package/src/commands/flow-orchestrator.ts +296 -0
  6. package/src/commands/hook-command.ts +444 -0
  7. package/src/commands/init-command.ts +92 -0
  8. package/src/commands/init-core.ts +322 -0
  9. package/src/commands/knowledge-command.ts +161 -0
  10. package/src/commands/run-command.ts +120 -0
  11. package/src/components/benchmark-monitor.tsx +331 -0
  12. package/src/components/reindex-progress.tsx +261 -0
  13. package/src/composables/functional/index.ts +14 -0
  14. package/src/composables/functional/useEnvironment.ts +171 -0
  15. package/src/composables/functional/useFileSystem.ts +139 -0
  16. package/src/composables/index.ts +5 -0
  17. package/src/composables/useEnv.ts +13 -0
  18. package/src/composables/useRuntimeConfig.ts +27 -0
  19. package/src/composables/useTargetConfig.ts +45 -0
  20. package/src/config/ai-config.ts +376 -0
  21. package/src/config/constants.ts +35 -0
  22. package/src/config/index.ts +27 -0
  23. package/src/config/rules.ts +43 -0
  24. package/src/config/servers.ts +371 -0
  25. package/src/config/targets.ts +126 -0
  26. package/src/core/agent-loader.ts +141 -0
  27. package/src/core/agent-manager.ts +174 -0
  28. package/src/core/ai-sdk.ts +603 -0
  29. package/src/core/app-factory.ts +381 -0
  30. package/src/core/builtin-agents.ts +9 -0
  31. package/src/core/command-system.ts +550 -0
  32. package/src/core/config-system.ts +550 -0
  33. package/src/core/connection-pool.ts +390 -0
  34. package/src/core/di-container.ts +155 -0
  35. package/src/core/error-handling.ts +519 -0
  36. package/src/core/formatting/bytes.test.ts +115 -0
  37. package/src/core/formatting/bytes.ts +64 -0
  38. package/src/core/functional/async.ts +313 -0
  39. package/src/core/functional/either.ts +109 -0
  40. package/src/core/functional/error-handler.ts +135 -0
  41. package/src/core/functional/error-types.ts +311 -0
  42. package/src/core/functional/index.ts +19 -0
  43. package/src/core/functional/option.ts +142 -0
  44. package/src/core/functional/pipe.ts +189 -0
  45. package/src/core/functional/result.ts +204 -0
  46. package/src/core/functional/validation.ts +138 -0
  47. package/src/core/headless-display.ts +96 -0
  48. package/src/core/index.ts +6 -0
  49. package/src/core/installers/file-installer.ts +303 -0
  50. package/src/core/installers/mcp-installer.ts +213 -0
  51. package/src/core/interfaces/index.ts +22 -0
  52. package/src/core/interfaces/repository.interface.ts +91 -0
  53. package/src/core/interfaces/service.interface.ts +133 -0
  54. package/src/core/interfaces.ts +129 -0
  55. package/src/core/loop-controller.ts +200 -0
  56. package/src/core/result.ts +351 -0
  57. package/src/core/rule-loader.ts +147 -0
  58. package/src/core/rule-manager.ts +240 -0
  59. package/src/core/service-config.ts +252 -0
  60. package/src/core/session-service.ts +121 -0
  61. package/src/core/state-detector.ts +389 -0
  62. package/src/core/storage-factory.ts +115 -0
  63. package/src/core/stream-handler.ts +288 -0
  64. package/src/core/target-manager.ts +161 -0
  65. package/src/core/type-utils.ts +427 -0
  66. package/src/core/unified-storage.ts +456 -0
  67. package/src/core/upgrade-manager.ts +300 -0
  68. package/src/core/validation/limit.test.ts +155 -0
  69. package/src/core/validation/limit.ts +46 -0
  70. package/src/core/validation/query.test.ts +44 -0
  71. package/src/core/validation/query.ts +20 -0
  72. package/src/db/auto-migrate.ts +322 -0
  73. package/src/db/base-database-client.ts +144 -0
  74. package/src/db/cache-db.ts +218 -0
  75. package/src/db/cache-schema.ts +75 -0
  76. package/src/db/database.ts +70 -0
  77. package/src/db/index.ts +252 -0
  78. package/src/db/memory-db.ts +153 -0
  79. package/src/db/memory-schema.ts +29 -0
  80. package/src/db/schema.ts +289 -0
  81. package/src/db/session-repository.ts +733 -0
  82. package/src/domains/codebase/index.ts +5 -0
  83. package/src/domains/codebase/tools.ts +139 -0
  84. package/src/domains/index.ts +8 -0
  85. package/src/domains/knowledge/index.ts +10 -0
  86. package/src/domains/knowledge/resources.ts +537 -0
  87. package/src/domains/knowledge/tools.ts +174 -0
  88. package/src/domains/utilities/index.ts +6 -0
  89. package/src/domains/utilities/time/index.ts +5 -0
  90. package/src/domains/utilities/time/tools.ts +291 -0
  91. package/src/index.ts +211 -0
  92. package/src/services/agent-service.ts +273 -0
  93. package/src/services/claude-config-service.ts +252 -0
  94. package/src/services/config-service.ts +258 -0
  95. package/src/services/evaluation-service.ts +271 -0
  96. package/src/services/functional/evaluation-logic.ts +296 -0
  97. package/src/services/functional/file-processor.ts +273 -0
  98. package/src/services/functional/index.ts +12 -0
  99. package/src/services/index.ts +13 -0
  100. package/src/services/mcp-service.ts +432 -0
  101. package/src/services/memory.service.ts +476 -0
  102. package/src/services/search/base-indexer.ts +156 -0
  103. package/src/services/search/codebase-indexer-types.ts +38 -0
  104. package/src/services/search/codebase-indexer.ts +647 -0
  105. package/src/services/search/embeddings-provider.ts +455 -0
  106. package/src/services/search/embeddings.ts +316 -0
  107. package/src/services/search/functional-indexer.ts +323 -0
  108. package/src/services/search/index.ts +27 -0
  109. package/src/services/search/indexer.ts +380 -0
  110. package/src/services/search/knowledge-indexer.ts +422 -0
  111. package/src/services/search/semantic-search.ts +244 -0
  112. package/src/services/search/tfidf.ts +559 -0
  113. package/src/services/search/unified-search-service.ts +888 -0
  114. package/src/services/smart-config-service.ts +385 -0
  115. package/src/services/storage/cache-storage.ts +487 -0
  116. package/src/services/storage/drizzle-storage.ts +581 -0
  117. package/src/services/storage/index.ts +15 -0
  118. package/src/services/storage/lancedb-vector-storage.ts +494 -0
  119. package/src/services/storage/memory-storage.ts +268 -0
  120. package/src/services/storage/separated-storage.ts +467 -0
  121. package/src/services/storage/vector-storage.ts +13 -0
  122. package/src/shared/agents/index.ts +63 -0
  123. package/src/shared/files/index.ts +99 -0
  124. package/src/shared/index.ts +32 -0
  125. package/src/shared/logging/index.ts +24 -0
  126. package/src/shared/processing/index.ts +153 -0
  127. package/src/shared/types/index.ts +25 -0
  128. package/src/targets/claude-code.ts +574 -0
  129. package/src/targets/functional/claude-code-logic.ts +185 -0
  130. package/src/targets/functional/index.ts +6 -0
  131. package/src/targets/opencode.ts +529 -0
  132. package/src/types/agent.types.ts +32 -0
  133. package/src/types/api/batch.ts +108 -0
  134. package/src/types/api/errors.ts +118 -0
  135. package/src/types/api/index.ts +55 -0
  136. package/src/types/api/requests.ts +76 -0
  137. package/src/types/api/responses.ts +180 -0
  138. package/src/types/api/websockets.ts +85 -0
  139. package/src/types/api.types.ts +9 -0
  140. package/src/types/benchmark.ts +49 -0
  141. package/src/types/cli.types.ts +87 -0
  142. package/src/types/common.types.ts +35 -0
  143. package/src/types/database.types.ts +510 -0
  144. package/src/types/mcp-config.types.ts +448 -0
  145. package/src/types/mcp.types.ts +69 -0
  146. package/src/types/memory-types.ts +63 -0
  147. package/src/types/provider.types.ts +28 -0
  148. package/src/types/rule.types.ts +24 -0
  149. package/src/types/session.types.ts +214 -0
  150. package/src/types/target-config.types.ts +295 -0
  151. package/src/types/target.types.ts +140 -0
  152. package/src/types/todo.types.ts +25 -0
  153. package/src/types.ts +40 -0
  154. package/src/utils/advanced-tokenizer.ts +191 -0
  155. package/src/utils/agent-enhancer.ts +114 -0
  156. package/src/utils/ai-model-fetcher.ts +19 -0
  157. package/src/utils/async-file-operations.ts +516 -0
  158. package/src/utils/audio-player.ts +345 -0
  159. package/src/utils/cli-output.ts +266 -0
  160. package/src/utils/codebase-helpers.ts +211 -0
  161. package/src/utils/console-ui.ts +79 -0
  162. package/src/utils/database-errors.ts +140 -0
  163. package/src/utils/debug-logger.ts +49 -0
  164. package/src/utils/error-handler.ts +53 -0
  165. package/src/utils/file-operations.ts +310 -0
  166. package/src/utils/file-scanner.ts +259 -0
  167. package/src/utils/functional/array.ts +355 -0
  168. package/src/utils/functional/index.ts +15 -0
  169. package/src/utils/functional/object.ts +279 -0
  170. package/src/utils/functional/string.ts +281 -0
  171. package/src/utils/functional.ts +543 -0
  172. package/src/utils/help.ts +20 -0
  173. package/src/utils/immutable-cache.ts +106 -0
  174. package/src/utils/index.ts +78 -0
  175. package/src/utils/jsonc.ts +158 -0
  176. package/src/utils/logger.ts +396 -0
  177. package/src/utils/mcp-config.ts +249 -0
  178. package/src/utils/memory-tui.ts +414 -0
  179. package/src/utils/models-dev.ts +91 -0
  180. package/src/utils/notifications.ts +169 -0
  181. package/src/utils/object-utils.ts +51 -0
  182. package/src/utils/parallel-operations.ts +487 -0
  183. package/src/utils/paths.ts +143 -0
  184. package/src/utils/process-manager.ts +155 -0
  185. package/src/utils/prompts.ts +120 -0
  186. package/src/utils/search-tool-builder.ts +214 -0
  187. package/src/utils/secret-utils.ts +179 -0
  188. package/src/utils/security.ts +537 -0
  189. package/src/utils/session-manager.ts +168 -0
  190. package/src/utils/session-title.ts +87 -0
  191. package/src/utils/settings.ts +182 -0
  192. package/src/utils/simplified-errors.ts +410 -0
  193. package/src/utils/sync-utils.ts +159 -0
  194. package/src/utils/target-config.ts +570 -0
  195. package/src/utils/target-utils.ts +394 -0
  196. package/src/utils/template-engine.ts +94 -0
  197. package/src/utils/test-audio.ts +71 -0
  198. package/src/utils/todo-context.ts +46 -0
  199. package/src/utils/token-counter.ts +288 -0
  200. package/dist/index.d.ts +0 -10
  201. package/dist/index.js +0 -59554
  202. package/dist/lancedb.linux-x64-gnu-b7f0jgsz.node +0 -0
  203. package/dist/lancedb.linux-x64-musl-tgcv22rx.node +0 -0
  204. package/dist/shared/chunk-25dwp0dp.js +0 -89
  205. package/dist/shared/chunk-3pjb6063.js +0 -208
  206. package/dist/shared/chunk-4d6ydpw7.js +0 -2854
  207. package/dist/shared/chunk-4wjcadjk.js +0 -225
  208. package/dist/shared/chunk-5j4w74t6.js +0 -30
  209. package/dist/shared/chunk-5j8m3dh3.js +0 -58
  210. package/dist/shared/chunk-5thh3qem.js +0 -91
  211. package/dist/shared/chunk-6g9xy73m.js +0 -252
  212. package/dist/shared/chunk-7eq34c42.js +0 -23
  213. package/dist/shared/chunk-c2gwgx3r.js +0 -115
  214. package/dist/shared/chunk-cjd3mk4c.js +0 -1320
  215. package/dist/shared/chunk-g5cv6703.js +0 -368
  216. package/dist/shared/chunk-hpkhykhq.js +0 -574
  217. package/dist/shared/chunk-m2322pdk.js +0 -122
  218. package/dist/shared/chunk-nd5fdvaq.js +0 -26
  219. package/dist/shared/chunk-pgd3m6zf.js +0 -108
  220. package/dist/shared/chunk-qk8n91hw.js +0 -494
  221. package/dist/shared/chunk-rkkn8szp.js +0 -16855
  222. package/dist/shared/chunk-t16rfxh0.js +0 -61
  223. package/dist/shared/chunk-t4fbfa5v.js +0 -19
  224. package/dist/shared/chunk-t77h86w6.js +0 -276
  225. package/dist/shared/chunk-v0ez4aef.js +0 -71
  226. package/dist/shared/chunk-v29j2r3s.js +0 -32051
  227. package/dist/shared/chunk-vfbc6ew5.js +0 -765
  228. package/dist/shared/chunk-vmeqwm1c.js +0 -204
  229. package/dist/shared/chunk-x66eh37x.js +0 -137
@@ -0,0 +1,289 @@
1
+ /**
2
+ * Drizzle ORM schema for Sylphx Flow
3
+ * Type-safe database schema with migrations support
4
+ */
5
+
6
+ import { index, integer, primaryKey, real, sqliteTable, text } from 'drizzle-orm/sqlite-core';
7
+
8
+ // Memory table for persistent storage
9
+ export const memory = sqliteTable(
10
+ 'memory',
11
+ {
12
+ key: text('key').notNull(),
13
+ namespace: text('namespace').notNull().default('default'),
14
+ value: text('value').notNull(),
15
+ timestamp: integer('timestamp').notNull(),
16
+ created_at: text('created_at').notNull(),
17
+ updated_at: text('updated_at').notNull(),
18
+ },
19
+ (table) => ({
20
+ pk: primaryKey({ columns: [table.key, table.namespace] }),
21
+ namespaceIdx: index('idx_memory_namespace').on(table.namespace),
22
+ timestampIdx: index('idx_memory_timestamp').on(table.timestamp),
23
+ keyIdx: index('idx_memory_key').on(table.key),
24
+ })
25
+ );
26
+
27
+ // Codebase files table
28
+ export const codebaseFiles = sqliteTable(
29
+ 'codebase_files',
30
+ {
31
+ path: text('path').primaryKey(),
32
+ mtime: integer('mtime').notNull(),
33
+ hash: text('hash').notNull(),
34
+ content: text('content'), // Optional full content
35
+ language: text('language'), // Detected programming language
36
+ size: integer('size'), // File size in bytes
37
+ indexedAt: text('indexed_at').notNull(),
38
+ },
39
+ (table) => ({
40
+ mtimeIdx: index('idx_codebase_files_mtime').on(table.mtime),
41
+ hashIdx: index('idx_codebase_files_hash').on(table.hash),
42
+ })
43
+ );
44
+
45
+ // TF-IDF terms table
46
+ export const tfidfTerms = sqliteTable(
47
+ 'tfidf_terms',
48
+ {
49
+ filePath: text('file_path')
50
+ .notNull()
51
+ .references(() => codebaseFiles.path, { onDelete: 'cascade' }),
52
+ term: text('term').notNull(),
53
+ frequency: real('frequency').notNull(),
54
+ },
55
+ (table) => ({
56
+ termIdx: index('idx_tfidf_terms_term').on(table.term),
57
+ fileIdx: index('idx_tfidf_terms_file').on(table.filePath),
58
+ })
59
+ );
60
+
61
+ // TF-IDF documents table (document vectors)
62
+ export const tfidfDocuments = sqliteTable('tfidf_documents', {
63
+ filePath: text('file_path')
64
+ .primaryKey()
65
+ .references(() => codebaseFiles.path, { onDelete: 'cascade' }),
66
+ magnitude: real('magnitude').notNull(),
67
+ termCount: integer('term_count').notNull(),
68
+ rawTerms: text('raw_terms').notNull(), // JSON string of Record<string, number>
69
+ });
70
+
71
+ // IDF values table
72
+ export const tfidfIdf = sqliteTable('tfidf_idf', {
73
+ term: text('term').primaryKey(),
74
+ idfValue: real('idf_value').notNull(),
75
+ });
76
+
77
+ // Codebase metadata table
78
+ export const codebaseMetadata = sqliteTable('codebase_metadata', {
79
+ key: text('key').primaryKey(),
80
+ value: text('value').notNull(),
81
+ });
82
+
83
+ // Export types for TypeScript
84
+ export type Memory = typeof memory.$inferSelect;
85
+ export type NewMemory = typeof memory.$inferInsert;
86
+
87
+ export type CodebaseFile = typeof codebaseFiles.$inferSelect;
88
+ export type NewCodebaseFile = typeof codebaseFiles.$inferInsert;
89
+
90
+ export type TfidfTerm = typeof tfidfTerms.$inferSelect;
91
+ export type NewTfidfTerm = typeof tfidfTerms.$inferInsert;
92
+
93
+ export type TfidfDocument = typeof tfidfDocuments.$inferSelect;
94
+ export type NewTfidfDocument = typeof tfidfDocuments.$inferInsert;
95
+
96
+ export type TfidfIdf = typeof tfidfIdf.$inferSelect;
97
+ export type NewTfidfIdf = typeof tfidfIdf.$inferInsert;
98
+
99
+ export type CodebaseMetadata = typeof codebaseMetadata.$inferSelect;
100
+ export type NewCodebaseMetadata = typeof codebaseMetadata.$inferInsert;
101
+
102
+ // ============================================
103
+ // Session Management Tables
104
+ // ============================================
105
+
106
+ /**
107
+ * Sessions table - Main chat sessions
108
+ * Stores session metadata and configuration
109
+ */
110
+ export const sessions = sqliteTable(
111
+ 'sessions',
112
+ {
113
+ id: text('id').primaryKey(),
114
+ title: text('title'),
115
+ provider: text('provider').notNull(), // 'anthropic' | 'openai' | 'google' | 'openrouter'
116
+ model: text('model').notNull(),
117
+ nextTodoId: integer('next_todo_id').notNull().default(1),
118
+
119
+ // Note: Streaming state moved to messages table (message-level, not session-level)
120
+ // Each message can be in streaming state with isStreaming flag
121
+
122
+ created: integer('created').notNull(), // Unix timestamp (ms)
123
+ updated: integer('updated').notNull(), // Unix timestamp (ms)
124
+ },
125
+ (table) => ({
126
+ updatedIdx: index('idx_sessions_updated').on(table.updated),
127
+ createdIdx: index('idx_sessions_created').on(table.created),
128
+ providerIdx: index('idx_sessions_provider').on(table.provider),
129
+ titleIdx: index('idx_sessions_title').on(table.title),
130
+ })
131
+ );
132
+
133
+ /**
134
+ * Messages table - Chat messages in sessions
135
+ * Stores message metadata and role
136
+ */
137
+ export const messages = sqliteTable(
138
+ 'messages',
139
+ {
140
+ id: text('id').primaryKey(),
141
+ sessionId: text('session_id')
142
+ .notNull()
143
+ .references(() => sessions.id, { onDelete: 'cascade' }),
144
+ role: text('role').notNull(), // 'user' | 'assistant'
145
+ timestamp: integer('timestamp').notNull(), // Unix timestamp (ms)
146
+ ordering: integer('ordering').notNull(), // For display order
147
+ finishReason: text('finish_reason'), // 'stop' | 'length' | 'tool-calls' | 'error'
148
+ // Message status - unified state for all messages
149
+ status: text('status').notNull().default('completed'), // 'active' | 'completed' | 'error' | 'abort'
150
+ // Metadata stored as JSON: { cpu?: string, memory?: string }
151
+ metadata: text('metadata'), // JSON string
152
+ },
153
+ (table) => ({
154
+ sessionIdx: index('idx_messages_session').on(table.sessionId),
155
+ orderingIdx: index('idx_messages_ordering').on(table.sessionId, table.ordering),
156
+ timestampIdx: index('idx_messages_timestamp').on(table.timestamp),
157
+ statusIdx: index('idx_messages_status').on(table.status),
158
+ })
159
+ );
160
+
161
+ /**
162
+ * Message parts table - Content parts of messages
163
+ * Stores text, reasoning, tool calls, errors
164
+ * Content structure varies by type, stored as JSON
165
+ *
166
+ * ALL parts have unified status field: 'active' | 'completed' | 'error' | 'abort'
167
+ */
168
+ export const messageParts = sqliteTable(
169
+ 'message_parts',
170
+ {
171
+ id: text('id').primaryKey(),
172
+ messageId: text('message_id')
173
+ .notNull()
174
+ .references(() => messages.id, { onDelete: 'cascade' }),
175
+ ordering: integer('ordering').notNull(), // Order within message
176
+ type: text('type').notNull(), // 'text' | 'reasoning' | 'tool' | 'error'
177
+ // Content structure (JSON) - ALL parts include status field:
178
+ // - text: { type: 'text', content: string, status: 'active' | 'completed' | ... }
179
+ // - reasoning: { type: 'reasoning', content: string, status: ..., duration?: number }
180
+ // - tool: { type: 'tool', name: string, status: ..., duration?: number, args?: any, result?: any, error?: string }
181
+ // - error: { type: 'error', error: string, status: 'completed' }
182
+ content: text('content').notNull(), // JSON string
183
+ },
184
+ (table) => ({
185
+ messageIdx: index('idx_message_parts_message').on(table.messageId),
186
+ orderingIdx: index('idx_message_parts_ordering').on(table.messageId, table.ordering),
187
+ typeIdx: index('idx_message_parts_type').on(table.type),
188
+ })
189
+ );
190
+
191
+ /**
192
+ * Message attachments table - File attachments to messages
193
+ */
194
+ export const messageAttachments = sqliteTable(
195
+ 'message_attachments',
196
+ {
197
+ id: text('id').primaryKey(),
198
+ messageId: text('message_id')
199
+ .notNull()
200
+ .references(() => messages.id, { onDelete: 'cascade' }),
201
+ path: text('path').notNull(),
202
+ relativePath: text('relative_path').notNull(),
203
+ size: integer('size'),
204
+ },
205
+ (table) => ({
206
+ messageIdx: index('idx_message_attachments_message').on(table.messageId),
207
+ pathIdx: index('idx_message_attachments_path').on(table.path),
208
+ })
209
+ );
210
+
211
+ /**
212
+ * Message usage table - Token usage for messages
213
+ * 1:1 relationship with messages (only assistant messages have usage)
214
+ */
215
+ export const messageUsage = sqliteTable('message_usage', {
216
+ messageId: text('message_id')
217
+ .primaryKey()
218
+ .references(() => messages.id, { onDelete: 'cascade' }),
219
+ promptTokens: integer('prompt_tokens').notNull(),
220
+ completionTokens: integer('completion_tokens').notNull(),
221
+ totalTokens: integer('total_tokens').notNull(),
222
+ });
223
+
224
+ /**
225
+ * Todos table - Per-session todo lists
226
+ */
227
+ export const todos = sqliteTable(
228
+ 'todos',
229
+ {
230
+ id: integer('id').notNull(), // Per-session ID (not globally unique!)
231
+ sessionId: text('session_id')
232
+ .notNull()
233
+ .references(() => sessions.id, { onDelete: 'cascade' }),
234
+ content: text('content').notNull(),
235
+ activeForm: text('active_form').notNull(),
236
+ status: text('status').notNull(), // 'pending' | 'in_progress' | 'completed'
237
+ ordering: integer('ordering').notNull(),
238
+ },
239
+ (table) => ({
240
+ pk: primaryKey({ columns: [table.sessionId, table.id] }),
241
+ sessionIdx: index('idx_todos_session').on(table.sessionId),
242
+ statusIdx: index('idx_todos_status').on(table.status),
243
+ orderingIdx: index('idx_todos_ordering').on(table.sessionId, table.ordering),
244
+ })
245
+ );
246
+
247
+ /**
248
+ * Message todo snapshots table - Snapshot of todos at message creation time
249
+ * Enables rewind feature - can restore todo state at any point in conversation
250
+ */
251
+ export const messageTodoSnapshots = sqliteTable(
252
+ 'message_todo_snapshots',
253
+ {
254
+ id: text('id').primaryKey(),
255
+ messageId: text('message_id')
256
+ .notNull()
257
+ .references(() => messages.id, { onDelete: 'cascade' }),
258
+ todoId: integer('todo_id').notNull(), // ID from snapshot (not FK!)
259
+ content: text('content').notNull(),
260
+ activeForm: text('active_form').notNull(),
261
+ status: text('status').notNull(),
262
+ ordering: integer('ordering').notNull(),
263
+ },
264
+ (table) => ({
265
+ messageIdx: index('idx_message_todo_snapshots_message').on(table.messageId),
266
+ })
267
+ );
268
+
269
+ // Export types for TypeScript
270
+ export type Session = typeof sessions.$inferSelect;
271
+ export type NewSession = typeof sessions.$inferInsert;
272
+
273
+ export type Message = typeof messages.$inferSelect;
274
+ export type NewMessage = typeof messages.$inferInsert;
275
+
276
+ export type MessagePart = typeof messageParts.$inferSelect;
277
+ export type NewMessagePart = typeof messageParts.$inferInsert;
278
+
279
+ export type MessageAttachment = typeof messageAttachments.$inferSelect;
280
+ export type NewMessageAttachment = typeof messageAttachments.$inferInsert;
281
+
282
+ export type MessageUsage = typeof messageUsage.$inferSelect;
283
+ export type NewMessageUsage = typeof messageUsage.$inferInsert;
284
+
285
+ export type Todo = typeof todos.$inferSelect;
286
+ export type NewTodo = typeof todos.$inferInsert;
287
+
288
+ export type MessageTodoSnapshot = typeof messageTodoSnapshots.$inferSelect;
289
+ export type NewMessageTodoSnapshot = typeof messageTodoSnapshots.$inferInsert;