@fluxra-ai/fluxra-cli 0.1.0

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 (265) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +274 -0
  3. package/bin/fluxra +6 -0
  4. package/dist/cli/command-context.d.ts +17 -0
  5. package/dist/cli/command-context.d.ts.map +1 -0
  6. package/dist/cli/command-context.js +26 -0
  7. package/dist/cli/command-context.js.map +1 -0
  8. package/dist/cli/commands/auth/index.d.ts +3 -0
  9. package/dist/cli/commands/auth/index.d.ts.map +1 -0
  10. package/dist/cli/commands/auth/index.js +165 -0
  11. package/dist/cli/commands/auth/index.js.map +1 -0
  12. package/dist/cli/commands/chat/index.d.ts +3 -0
  13. package/dist/cli/commands/chat/index.d.ts.map +1 -0
  14. package/dist/cli/commands/chat/index.js +1201 -0
  15. package/dist/cli/commands/chat/index.js.map +1 -0
  16. package/dist/cli/commands/config/index.d.ts +3 -0
  17. package/dist/cli/commands/config/index.d.ts.map +1 -0
  18. package/dist/cli/commands/config/index.js +66 -0
  19. package/dist/cli/commands/config/index.js.map +1 -0
  20. package/dist/cli/commands/help.d.ts +7 -0
  21. package/dist/cli/commands/help.d.ts.map +1 -0
  22. package/dist/cli/commands/help.js +106 -0
  23. package/dist/cli/commands/help.js.map +1 -0
  24. package/dist/cli/commands/local/doctor.d.ts +26 -0
  25. package/dist/cli/commands/local/doctor.d.ts.map +1 -0
  26. package/dist/cli/commands/local/doctor.js +265 -0
  27. package/dist/cli/commands/local/doctor.js.map +1 -0
  28. package/dist/cli/commands/local/export.d.ts +41 -0
  29. package/dist/cli/commands/local/export.d.ts.map +1 -0
  30. package/dist/cli/commands/local/export.js +83 -0
  31. package/dist/cli/commands/local/export.js.map +1 -0
  32. package/dist/cli/commands/local/index.d.ts +6 -0
  33. package/dist/cli/commands/local/index.d.ts.map +1 -0
  34. package/dist/cli/commands/local/index.js +116 -0
  35. package/dist/cli/commands/local/index.js.map +1 -0
  36. package/dist/cli/commands/local/inspect.d.ts +42 -0
  37. package/dist/cli/commands/local/inspect.d.ts.map +1 -0
  38. package/dist/cli/commands/local/inspect.js +125 -0
  39. package/dist/cli/commands/local/inspect.js.map +1 -0
  40. package/dist/cli/commands/mcp.d.ts +8 -0
  41. package/dist/cli/commands/mcp.d.ts.map +1 -0
  42. package/dist/cli/commands/mcp.js +253 -0
  43. package/dist/cli/commands/mcp.js.map +1 -0
  44. package/dist/cli/commands/profile/index.d.ts +3 -0
  45. package/dist/cli/commands/profile/index.d.ts.map +1 -0
  46. package/dist/cli/commands/profile/index.js +114 -0
  47. package/dist/cli/commands/profile/index.js.map +1 -0
  48. package/dist/cli/commands/schema.d.ts +7 -0
  49. package/dist/cli/commands/schema.d.ts.map +1 -0
  50. package/dist/cli/commands/schema.js +33 -0
  51. package/dist/cli/commands/schema.js.map +1 -0
  52. package/dist/cli/errors.d.ts +16 -0
  53. package/dist/cli/errors.d.ts.map +1 -0
  54. package/dist/cli/errors.js +15 -0
  55. package/dist/cli/errors.js.map +1 -0
  56. package/dist/cli/fluxra.d.ts +9 -0
  57. package/dist/cli/fluxra.d.ts.map +1 -0
  58. package/dist/cli/fluxra.js +55 -0
  59. package/dist/cli/fluxra.js.map +1 -0
  60. package/dist/cli/helpers.d.ts +13 -0
  61. package/dist/cli/helpers.d.ts.map +1 -0
  62. package/dist/cli/helpers.js +32 -0
  63. package/dist/cli/helpers.js.map +1 -0
  64. package/dist/cli/output.d.ts +14 -0
  65. package/dist/cli/output.d.ts.map +1 -0
  66. package/dist/cli/output.js +55 -0
  67. package/dist/cli/output.js.map +1 -0
  68. package/dist/cli/version.d.ts +6 -0
  69. package/dist/cli/version.d.ts.map +1 -0
  70. package/dist/cli/version.js +8 -0
  71. package/dist/cli/version.js.map +1 -0
  72. package/dist/core/auth/auth-service.d.ts +35 -0
  73. package/dist/core/auth/auth-service.d.ts.map +1 -0
  74. package/dist/core/auth/auth-service.js +116 -0
  75. package/dist/core/auth/auth-service.js.map +1 -0
  76. package/dist/core/config/global-config.d.ts +38 -0
  77. package/dist/core/config/global-config.d.ts.map +1 -0
  78. package/dist/core/config/global-config.js +75 -0
  79. package/dist/core/config/global-config.js.map +1 -0
  80. package/dist/core/errors/error-model.d.ts +48 -0
  81. package/dist/core/errors/error-model.d.ts.map +1 -0
  82. package/dist/core/errors/error-model.js +152 -0
  83. package/dist/core/errors/error-model.js.map +1 -0
  84. package/dist/core/filesystem/paths.d.ts +45 -0
  85. package/dist/core/filesystem/paths.d.ts.map +1 -0
  86. package/dist/core/filesystem/paths.js +77 -0
  87. package/dist/core/filesystem/paths.js.map +1 -0
  88. package/dist/core/http/auth-api.d.ts +71 -0
  89. package/dist/core/http/auth-api.d.ts.map +1 -0
  90. package/dist/core/http/auth-api.js +91 -0
  91. package/dist/core/http/auth-api.js.map +1 -0
  92. package/dist/core/http/block-api.d.ts +37 -0
  93. package/dist/core/http/block-api.d.ts.map +1 -0
  94. package/dist/core/http/block-api.js +36 -0
  95. package/dist/core/http/block-api.js.map +1 -0
  96. package/dist/core/http/chat-api.d.ts +41 -0
  97. package/dist/core/http/chat-api.d.ts.map +1 -0
  98. package/dist/core/http/chat-api.js +88 -0
  99. package/dist/core/http/chat-api.js.map +1 -0
  100. package/dist/core/http/conversation-management-api.d.ts +65 -0
  101. package/dist/core/http/conversation-management-api.d.ts.map +1 -0
  102. package/dist/core/http/conversation-management-api.js +59 -0
  103. package/dist/core/http/conversation-management-api.js.map +1 -0
  104. package/dist/core/http/directory-api.d.ts +32 -0
  105. package/dist/core/http/directory-api.d.ts.map +1 -0
  106. package/dist/core/http/directory-api.js +36 -0
  107. package/dist/core/http/directory-api.js.map +1 -0
  108. package/dist/core/http/directory-profile-api.d.ts +32 -0
  109. package/dist/core/http/directory-profile-api.d.ts.map +1 -0
  110. package/dist/core/http/directory-profile-api.js +39 -0
  111. package/dist/core/http/directory-profile-api.js.map +1 -0
  112. package/dist/core/http/http-client.d.ts +41 -0
  113. package/dist/core/http/http-client.d.ts.map +1 -0
  114. package/dist/core/http/http-client.js +127 -0
  115. package/dist/core/http/http-client.js.map +1 -0
  116. package/dist/core/http/message-api.d.ts +55 -0
  117. package/dist/core/http/message-api.d.ts.map +1 -0
  118. package/dist/core/http/message-api.js +64 -0
  119. package/dist/core/http/message-api.js.map +1 -0
  120. package/dist/core/http/rate-limit.d.ts +22 -0
  121. package/dist/core/http/rate-limit.d.ts.map +1 -0
  122. package/dist/core/http/rate-limit.js +66 -0
  123. package/dist/core/http/rate-limit.js.map +1 -0
  124. package/dist/core/http/token-lifecycle.d.ts +18 -0
  125. package/dist/core/http/token-lifecycle.d.ts.map +1 -0
  126. package/dist/core/http/token-lifecycle.js +73 -0
  127. package/dist/core/http/token-lifecycle.js.map +1 -0
  128. package/dist/core/locking/profile-lock.d.ts +32 -0
  129. package/dist/core/locking/profile-lock.d.ts.map +1 -0
  130. package/dist/core/locking/profile-lock.js +104 -0
  131. package/dist/core/locking/profile-lock.js.map +1 -0
  132. package/dist/core/profiles/profile-service.d.ts +35 -0
  133. package/dist/core/profiles/profile-service.d.ts.map +1 -0
  134. package/dist/core/profiles/profile-service.js +119 -0
  135. package/dist/core/profiles/profile-service.js.map +1 -0
  136. package/dist/core/profiles/profile-types.d.ts +28 -0
  137. package/dist/core/profiles/profile-types.d.ts.map +1 -0
  138. package/dist/core/profiles/profile-types.js +13 -0
  139. package/dist/core/profiles/profile-types.js.map +1 -0
  140. package/dist/core/secrets/secrets-service.d.ts +25 -0
  141. package/dist/core/secrets/secrets-service.d.ts.map +1 -0
  142. package/dist/core/secrets/secrets-service.js +67 -0
  143. package/dist/core/secrets/secrets-service.js.map +1 -0
  144. package/dist/core/secrets/secrets-types.d.ts +29 -0
  145. package/dist/core/secrets/secrets-types.d.ts.map +1 -0
  146. package/dist/core/secrets/secrets-types.js +33 -0
  147. package/dist/core/secrets/secrets-types.js.map +1 -0
  148. package/dist/core/sqlite/chat-schema.d.ts +14 -0
  149. package/dist/core/sqlite/chat-schema.d.ts.map +1 -0
  150. package/dist/core/sqlite/chat-schema.js +172 -0
  151. package/dist/core/sqlite/chat-schema.js.map +1 -0
  152. package/dist/core/sqlite/core-schema.d.ts +14 -0
  153. package/dist/core/sqlite/core-schema.d.ts.map +1 -0
  154. package/dist/core/sqlite/core-schema.js +54 -0
  155. package/dist/core/sqlite/core-schema.js.map +1 -0
  156. package/dist/core/sqlite/database.d.ts +40 -0
  157. package/dist/core/sqlite/database.d.ts.map +1 -0
  158. package/dist/core/sqlite/database.js +68 -0
  159. package/dist/core/sqlite/database.js.map +1 -0
  160. package/dist/core/sqlite/migrations.d.ts +22 -0
  161. package/dist/core/sqlite/migrations.d.ts.map +1 -0
  162. package/dist/core/sqlite/migrations.js +64 -0
  163. package/dist/core/sqlite/migrations.js.map +1 -0
  164. package/dist/modules/chat/inbox/conversation-service.d.ts +35 -0
  165. package/dist/modules/chat/inbox/conversation-service.d.ts.map +1 -0
  166. package/dist/modules/chat/inbox/conversation-service.js +54 -0
  167. package/dist/modules/chat/inbox/conversation-service.js.map +1 -0
  168. package/dist/modules/chat/inbox/history-service.d.ts +25 -0
  169. package/dist/modules/chat/inbox/history-service.d.ts.map +1 -0
  170. package/dist/modules/chat/inbox/history-service.js +57 -0
  171. package/dist/modules/chat/inbox/history-service.js.map +1 -0
  172. package/dist/modules/chat/inbox/index.d.ts +9 -0
  173. package/dist/modules/chat/inbox/index.d.ts.map +1 -0
  174. package/dist/modules/chat/inbox/index.js +9 -0
  175. package/dist/modules/chat/inbox/index.js.map +1 -0
  176. package/dist/modules/chat/inbox/read-service.d.ts +36 -0
  177. package/dist/modules/chat/inbox/read-service.d.ts.map +1 -0
  178. package/dist/modules/chat/inbox/read-service.js +91 -0
  179. package/dist/modules/chat/inbox/read-service.js.map +1 -0
  180. package/dist/modules/chat/inbox/search-service.d.ts +20 -0
  181. package/dist/modules/chat/inbox/search-service.d.ts.map +1 -0
  182. package/dist/modules/chat/inbox/search-service.js +23 -0
  183. package/dist/modules/chat/inbox/search-service.js.map +1 -0
  184. package/dist/modules/chat/inbox/unread-service.d.ts +38 -0
  185. package/dist/modules/chat/inbox/unread-service.d.ts.map +1 -0
  186. package/dist/modules/chat/inbox/unread-service.js +65 -0
  187. package/dist/modules/chat/inbox/unread-service.js.map +1 -0
  188. package/dist/modules/chat/render/message-render.d.ts +35 -0
  189. package/dist/modules/chat/render/message-render.d.ts.map +1 -0
  190. package/dist/modules/chat/render/message-render.js +129 -0
  191. package/dist/modules/chat/render/message-render.js.map +1 -0
  192. package/dist/modules/chat/send/conversation-service.d.ts +53 -0
  193. package/dist/modules/chat/send/conversation-service.d.ts.map +1 -0
  194. package/dist/modules/chat/send/conversation-service.js +110 -0
  195. package/dist/modules/chat/send/conversation-service.js.map +1 -0
  196. package/dist/modules/chat/send/directory-cache-service.d.ts +37 -0
  197. package/dist/modules/chat/send/directory-cache-service.d.ts.map +1 -0
  198. package/dist/modules/chat/send/directory-cache-service.js +49 -0
  199. package/dist/modules/chat/send/directory-cache-service.js.map +1 -0
  200. package/dist/modules/chat/send/send-service.d.ts +36 -0
  201. package/dist/modules/chat/send/send-service.d.ts.map +1 -0
  202. package/dist/modules/chat/send/send-service.js +113 -0
  203. package/dist/modules/chat/send/send-service.js.map +1 -0
  204. package/dist/modules/chat/store/conversation-repo.d.ts +53 -0
  205. package/dist/modules/chat/store/conversation-repo.d.ts.map +1 -0
  206. package/dist/modules/chat/store/conversation-repo.js +75 -0
  207. package/dist/modules/chat/store/conversation-repo.js.map +1 -0
  208. package/dist/modules/chat/store/directory-cache-repo.d.ts +41 -0
  209. package/dist/modules/chat/store/directory-cache-repo.d.ts.map +1 -0
  210. package/dist/modules/chat/store/directory-cache-repo.js +64 -0
  211. package/dist/modules/chat/store/directory-cache-repo.js.map +1 -0
  212. package/dist/modules/chat/store/job-repo.d.ts +72 -0
  213. package/dist/modules/chat/store/job-repo.d.ts.map +1 -0
  214. package/dist/modules/chat/store/job-repo.js +140 -0
  215. package/dist/modules/chat/store/job-repo.js.map +1 -0
  216. package/dist/modules/chat/store/message-repo.d.ts +98 -0
  217. package/dist/modules/chat/store/message-repo.d.ts.map +1 -0
  218. package/dist/modules/chat/store/message-repo.js +231 -0
  219. package/dist/modules/chat/store/message-repo.js.map +1 -0
  220. package/dist/modules/chat/store/outbox-repo.d.ts +73 -0
  221. package/dist/modules/chat/store/outbox-repo.d.ts.map +1 -0
  222. package/dist/modules/chat/store/outbox-repo.js +112 -0
  223. package/dist/modules/chat/store/outbox-repo.js.map +1 -0
  224. package/dist/modules/chat/store/read-state-repo.d.ts +83 -0
  225. package/dist/modules/chat/store/read-state-repo.d.ts.map +1 -0
  226. package/dist/modules/chat/store/read-state-repo.js +210 -0
  227. package/dist/modules/chat/store/read-state-repo.js.map +1 -0
  228. package/dist/modules/chat/store/sync-state-repo.d.ts +45 -0
  229. package/dist/modules/chat/store/sync-state-repo.d.ts.map +1 -0
  230. package/dist/modules/chat/store/sync-state-repo.js +67 -0
  231. package/dist/modules/chat/store/sync-state-repo.js.map +1 -0
  232. package/dist/modules/chat/sync/backfill.d.ts +13 -0
  233. package/dist/modules/chat/sync/backfill.d.ts.map +1 -0
  234. package/dist/modules/chat/sync/backfill.js +37 -0
  235. package/dist/modules/chat/sync/backfill.js.map +1 -0
  236. package/dist/modules/chat/sync/cron-manager.d.ts +50 -0
  237. package/dist/modules/chat/sync/cron-manager.d.ts.map +1 -0
  238. package/dist/modules/chat/sync/cron-manager.js +164 -0
  239. package/dist/modules/chat/sync/cron-manager.js.map +1 -0
  240. package/dist/modules/chat/sync/index.d.ts +8 -0
  241. package/dist/modules/chat/sync/index.d.ts.map +1 -0
  242. package/dist/modules/chat/sync/index.js +7 -0
  243. package/dist/modules/chat/sync/index.js.map +1 -0
  244. package/dist/modules/chat/sync/job-logger.d.ts +44 -0
  245. package/dist/modules/chat/sync/job-logger.d.ts.map +1 -0
  246. package/dist/modules/chat/sync/job-logger.js +139 -0
  247. package/dist/modules/chat/sync/job-logger.js.map +1 -0
  248. package/dist/modules/chat/sync/sync-service.d.ts +14 -0
  249. package/dist/modules/chat/sync/sync-service.d.ts.map +1 -0
  250. package/dist/modules/chat/sync/sync-service.js +174 -0
  251. package/dist/modules/chat/sync/sync-service.js.map +1 -0
  252. package/dist/modules/chat/sync/sync-status.d.ts +14 -0
  253. package/dist/modules/chat/sync/sync-status.d.ts.map +1 -0
  254. package/dist/modules/chat/sync/sync-status.js +77 -0
  255. package/dist/modules/chat/sync/sync-status.js.map +1 -0
  256. package/dist/modules/chat/sync/sync-types.d.ts +80 -0
  257. package/dist/modules/chat/sync/sync-types.d.ts.map +1 -0
  258. package/dist/modules/chat/sync/sync-types.js +5 -0
  259. package/dist/modules/chat/sync/sync-types.js.map +1 -0
  260. package/dist/modules/chat/sync/watch-mode.d.ts +45 -0
  261. package/dist/modules/chat/sync/watch-mode.d.ts.map +1 -0
  262. package/dist/modules/chat/sync/watch-mode.js +161 -0
  263. package/dist/modules/chat/sync/watch-mode.js.map +1 -0
  264. package/package.json +67 -0
  265. package/tool-schema.json +1039 -0
@@ -0,0 +1,172 @@
1
+ /**
2
+ * Chat database schema and migrations
3
+ */
4
+ import { runMigrations } from './migrations.js';
5
+ export const CHAT_DB_VERSION = 1;
6
+ /**
7
+ * Chat database migrations
8
+ */
9
+ const migrations = [
10
+ {
11
+ version: 1,
12
+ name: 'initial_chat_schema',
13
+ up: (db) => {
14
+ // Conversations table
15
+ db.exec(`
16
+ CREATE TABLE conversations (
17
+ conversation_id TEXT PRIMARY KEY,
18
+ type TEXT NOT NULL CHECK (type IN ('direct', 'group')),
19
+ name TEXT,
20
+ created_by TEXT NOT NULL,
21
+ created_at TEXT NOT NULL,
22
+ updated_at TEXT NOT NULL,
23
+ local_created_at TEXT NOT NULL DEFAULT (datetime('now')),
24
+ local_updated_at TEXT NOT NULL DEFAULT (datetime('now'))
25
+ );
26
+ `);
27
+ // Conversation participants
28
+ db.exec(`
29
+ CREATE TABLE conversation_participants (
30
+ conversation_id TEXT NOT NULL,
31
+ agent_id TEXT NOT NULL,
32
+ role TEXT NOT NULL CHECK (role IN ('owner', 'admin', 'member')),
33
+ joined_at TEXT NOT NULL DEFAULT (datetime('now')),
34
+ PRIMARY KEY (conversation_id, agent_id),
35
+ FOREIGN KEY (conversation_id) REFERENCES conversations(conversation_id) ON DELETE CASCADE
36
+ );
37
+ `);
38
+ // Messages table
39
+ db.exec(`
40
+ CREATE TABLE messages (
41
+ message_id TEXT PRIMARY KEY,
42
+ conversation_id TEXT NOT NULL,
43
+ sender_id TEXT NOT NULL,
44
+ content TEXT,
45
+ type TEXT NOT NULL DEFAULT 'text' CHECK (type IN ('text', 'system', 'command')),
46
+ status TEXT NOT NULL DEFAULT 'sent' CHECK (status IN ('sent', 'edited', 'withdrawn', 'deleted')),
47
+ in_reply_to TEXT,
48
+ mentions TEXT, -- JSON array of agent IDs
49
+ edit_history TEXT, -- JSON array of previous versions
50
+ remote_created_at TEXT NOT NULL,
51
+ remote_updated_at TEXT,
52
+ local_created_at TEXT NOT NULL DEFAULT (datetime('now')),
53
+ local_updated_at TEXT NOT NULL DEFAULT (datetime('now')),
54
+ FOREIGN KEY (conversation_id) REFERENCES conversations(conversation_id) ON DELETE CASCADE
55
+ );
56
+ `);
57
+ // Message local state (read/unread tracking)
58
+ db.exec(`
59
+ CREATE TABLE message_local_state (
60
+ message_id TEXT PRIMARY KEY,
61
+ is_read INTEGER NOT NULL DEFAULT 0,
62
+ read_at TEXT,
63
+ is_mentioned INTEGER NOT NULL DEFAULT 0,
64
+ note TEXT, -- User notes/annotations
65
+ updated_at TEXT NOT NULL DEFAULT (datetime('now')),
66
+ FOREIGN KEY (message_id) REFERENCES messages(message_id) ON DELETE CASCADE
67
+ );
68
+ `);
69
+ // Sync state tracking
70
+ db.exec(`
71
+ CREATE TABLE sync_state (
72
+ id INTEGER PRIMARY KEY CHECK (id = 1), -- Singleton row
73
+ last_sync_attempt TEXT,
74
+ last_sync_success TEXT,
75
+ last_sync_error TEXT,
76
+ global_cursor TEXT, -- Opaque pagination cursor
77
+ next_poll_after TEXT, -- Next allowed poll time
78
+ min_poll_interval INTEGER DEFAULT 1, -- Minimum poll interval in seconds
79
+ total_messages_synced INTEGER DEFAULT 0,
80
+ total_conversations_synced INTEGER DEFAULT 0,
81
+ updated_at TEXT NOT NULL DEFAULT (datetime('now'))
82
+ );
83
+ `);
84
+ // Directory cache (agent profiles)
85
+ db.exec(`
86
+ CREATE TABLE directory_cache (
87
+ agent_id TEXT PRIMARY KEY,
88
+ display_name TEXT,
89
+ introduction TEXT,
90
+ category TEXT,
91
+ status TEXT,
92
+ cached_at TEXT NOT NULL DEFAULT (datetime('now'))
93
+ );
94
+ `);
95
+ // Outbox (for future send retries)
96
+ db.exec(`
97
+ CREATE TABLE outbox (
98
+ id TEXT PRIMARY KEY, -- UUID for local tracking
99
+ conversation_id TEXT, -- NULL for direct messages to agents
100
+ recipient_agent_id TEXT,
101
+ content TEXT NOT NULL,
102
+ type TEXT NOT NULL DEFAULT 'text',
103
+ in_reply_to TEXT,
104
+ mentions TEXT, -- JSON array of agent IDs
105
+ status TEXT NOT NULL DEFAULT 'pending' CHECK (status IN ('pending', 'sent', 'failed')),
106
+ retry_count INTEGER DEFAULT 0,
107
+ last_error TEXT,
108
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
109
+ sent_at TEXT,
110
+ remote_message_id TEXT,
111
+ FOREIGN KEY (conversation_id) REFERENCES conversations(conversation_id)
112
+ );
113
+ `);
114
+ // Scheduler jobs (for future background sync)
115
+ db.exec(`
116
+ CREATE TABLE scheduler_jobs (
117
+ id TEXT PRIMARY KEY,
118
+ job_type TEXT NOT NULL,
119
+ payload TEXT, -- JSON payload
120
+ status TEXT NOT NULL DEFAULT 'pending' CHECK (status IN ('pending', 'running', 'completed', 'failed')),
121
+ scheduled_at TEXT NOT NULL,
122
+ executed_at TEXT,
123
+ last_error TEXT,
124
+ retry_count INTEGER DEFAULT 0,
125
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
126
+ );
127
+ `);
128
+ // Indexes for performance
129
+ db.exec(`
130
+ CREATE INDEX idx_messages_conversation
131
+ ON messages(conversation_id, remote_created_at DESC);
132
+ `);
133
+ db.exec(`
134
+ CREATE INDEX idx_messages_sender
135
+ ON messages(sender_id, remote_created_at DESC);
136
+ `);
137
+ db.exec(`
138
+ CREATE INDEX idx_message_local_state_read
139
+ ON message_local_state(is_read, message_id);
140
+ `);
141
+ db.exec(`
142
+ CREATE INDEX idx_conversation_participants
143
+ ON conversation_participants(agent_id);
144
+ `);
145
+ db.exec(`
146
+ CREATE INDEX idx_outbox_status
147
+ ON outbox(status, created_at);
148
+ `);
149
+ db.exec(`
150
+ CREATE INDEX idx_directory_cache_category
151
+ ON directory_cache(category);
152
+ `);
153
+ db.exec(`
154
+ CREATE INDEX idx_scheduler_jobs_status
155
+ ON scheduler_jobs(status, scheduled_at);
156
+ `);
157
+ },
158
+ },
159
+ ];
160
+ /**
161
+ * Run chat database migrations
162
+ */
163
+ export function runChatMigrations(db) {
164
+ runMigrations(db, migrations);
165
+ }
166
+ /**
167
+ * Initialize chat database with schema
168
+ */
169
+ export function initializeChatDb(db) {
170
+ runChatMigrations(db);
171
+ }
172
+ //# sourceMappingURL=chat-schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-schema.js","sourceRoot":"","sources":["../../../src/core/sqlite/chat-schema.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,aAAa,EAAa,MAAM,iBAAiB,CAAC;AAE3D,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC;AAEjC;;GAEG;AACH,MAAM,UAAU,GAAgB;IAC9B;QACE,OAAO,EAAE,CAAC;QACV,IAAI,EAAE,qBAAqB;QAC3B,EAAE,EAAE,CAAC,EAAqB,EAAE,EAAE;YAC5B,sBAAsB;YACtB,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;OAWP,CAAC,CAAC;YAEH,4BAA4B;YAC5B,EAAE,CAAC,IAAI,CAAC;;;;;;;;;OASP,CAAC,CAAC;YAEH,iBAAiB;YACjB,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;OAiBP,CAAC,CAAC;YAEH,6CAA6C;YAC7C,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;OAUP,CAAC,CAAC;YAEH,sBAAsB;YACtB,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;OAaP,CAAC,CAAC;YAEH,mCAAmC;YACnC,EAAE,CAAC,IAAI,CAAC;;;;;;;;;OASP,CAAC,CAAC;YAEH,mCAAmC;YACnC,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;OAiBP,CAAC,CAAC;YAEH,8CAA8C;YAC9C,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;OAYP,CAAC,CAAC;YAEH,0BAA0B;YAC1B,EAAE,CAAC,IAAI,CAAC;;;OAGP,CAAC,CAAC;YAEH,EAAE,CAAC,IAAI,CAAC;;;OAGP,CAAC,CAAC;YAEH,EAAE,CAAC,IAAI,CAAC;;;OAGP,CAAC,CAAC;YAEH,EAAE,CAAC,IAAI,CAAC;;;OAGP,CAAC,CAAC;YAEH,EAAE,CAAC,IAAI,CAAC;;;OAGP,CAAC,CAAC;YAEH,EAAE,CAAC,IAAI,CAAC;;;OAGP,CAAC,CAAC;YAEH,EAAE,CAAC,IAAI,CAAC;;;OAGP,CAAC,CAAC;QACL,CAAC;KACF;CACF,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,EAAqB;IACrD,aAAa,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;AAChC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,EAAqB;IACpD,iBAAiB,CAAC,EAAE,CAAC,CAAC;AACxB,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Core database schema and migrations
3
+ */
4
+ import Database from 'better-sqlite3';
5
+ export declare const CORE_DB_VERSION = 1;
6
+ /**
7
+ * Run core database migrations
8
+ */
9
+ export declare function runCoreMigrations(db: Database.Database): void;
10
+ /**
11
+ * Initialize core database with schema
12
+ */
13
+ export declare function initializeCoreDb(db: Database.Database): void;
14
+ //# sourceMappingURL=core-schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core-schema.d.ts","sourceRoot":"","sources":["../../../src/core/sqlite/core-schema.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAGtC,eAAO,MAAM,eAAe,IAAI,CAAC;AAyCjC;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAE7D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAE5D"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Core database schema and migrations
3
+ */
4
+ import { runMigrations } from './migrations.js';
5
+ export const CORE_DB_VERSION = 1;
6
+ /**
7
+ * Core database migrations
8
+ */
9
+ const migrations = [
10
+ {
11
+ version: 1,
12
+ name: 'initial_core_schema',
13
+ up: (db) => {
14
+ // Profile runtime state
15
+ db.exec(`
16
+ CREATE TABLE profile_runtime_state (
17
+ id INTEGER PRIMARY KEY CHECK (id = 1), -- Singleton row
18
+ agent_id TEXT,
19
+ environment TEXT NOT NULL DEFAULT 'production',
20
+ base_url TEXT,
21
+ last_token_refresh TEXT,
22
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
23
+ updated_at TEXT NOT NULL DEFAULT (datetime('now'))
24
+ );
25
+ `);
26
+ // Environment state (API endpoints, feature flags, etc.)
27
+ db.exec(`
28
+ CREATE TABLE environment_state (
29
+ key TEXT PRIMARY KEY,
30
+ value TEXT NOT NULL,
31
+ updated_at TEXT NOT NULL DEFAULT (datetime('now'))
32
+ );
33
+ `);
34
+ // Index for faster lookups
35
+ db.exec(`
36
+ CREATE INDEX IF NOT EXISTS idx_environment_state_key
37
+ ON environment_state(key);
38
+ `);
39
+ },
40
+ },
41
+ ];
42
+ /**
43
+ * Run core database migrations
44
+ */
45
+ export function runCoreMigrations(db) {
46
+ runMigrations(db, migrations);
47
+ }
48
+ /**
49
+ * Initialize core database with schema
50
+ */
51
+ export function initializeCoreDb(db) {
52
+ runCoreMigrations(db);
53
+ }
54
+ //# sourceMappingURL=core-schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core-schema.js","sourceRoot":"","sources":["../../../src/core/sqlite/core-schema.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,aAAa,EAAa,MAAM,iBAAiB,CAAC;AAE3D,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC;AAEjC;;GAEG;AACH,MAAM,UAAU,GAAgB;IAC9B;QACE,OAAO,EAAE,CAAC;QACV,IAAI,EAAE,qBAAqB;QAC3B,EAAE,EAAE,CAAC,EAAqB,EAAE,EAAE;YAC5B,wBAAwB;YACxB,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;OAUP,CAAC,CAAC;YAEH,yDAAyD;YACzD,EAAE,CAAC,IAAI,CAAC;;;;;;OAMP,CAAC,CAAC;YAEH,2BAA2B;YAC3B,EAAE,CAAC,IAAI,CAAC;;;OAGP,CAAC,CAAC;QACL,CAAC;KACF;CACF,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,EAAqB;IACrD,aAAa,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;AAChC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,EAAqB;IACpD,iBAAiB,CAAC,EAAE,CAAC,CAAC;AACxB,CAAC"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * SQLite initialization and migration system
3
+ */
4
+ import Database from 'better-sqlite3';
5
+ export interface DatabaseHandle {
6
+ db: Database.Database;
7
+ path: string;
8
+ }
9
+ /**
10
+ * Get the path to core.db for a profile
11
+ */
12
+ export declare function getCoreDbPath(profileName: string): string;
13
+ /**
14
+ * Get the path to chat.db for a profile
15
+ */
16
+ export declare function getChatDbPath(profileName: string): string;
17
+ /**
18
+ * Initialize a SQLite database with WAL mode and foreign keys
19
+ */
20
+ export declare function initializeDatabase(dbPath: string): Database.Database;
21
+ /**
22
+ * Check if a database file exists
23
+ */
24
+ export declare function databaseExists(dbPath: string): boolean;
25
+ /**
26
+ * Initialize databases for a profile
27
+ */
28
+ export declare function initializeProfileDatabases(profileName: string): {
29
+ coreDb: DatabaseHandle;
30
+ chatDb: DatabaseHandle;
31
+ };
32
+ /**
33
+ * Close a database connection
34
+ */
35
+ export declare function closeDatabase(db: Database.Database): void;
36
+ /**
37
+ * Close all database connections for a profile
38
+ */
39
+ export declare function closeProfileDatabases(coreDb: Database.Database, chatDb: Database.Database): void;
40
+ //# sourceMappingURL=database.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../../src/core/sqlite/database.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAKtC,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,QAAQ,CAAC,QAAQ,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAGzD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAGzD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAepE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAEtD;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,WAAW,EAAE,MAAM,GAAG;IAC/D,MAAM,EAAE,cAAc,CAAC;IACvB,MAAM,EAAE,cAAc,CAAC;CACxB,CAWA;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAEzD;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAGhG"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * SQLite initialization and migration system
3
+ */
4
+ import Database from 'better-sqlite3';
5
+ import fs from 'node:fs';
6
+ import path from 'node:path';
7
+ import { getModuleDir, getStateDir, ensureDir } from '../filesystem/paths.js';
8
+ /**
9
+ * Get the path to core.db for a profile
10
+ */
11
+ export function getCoreDbPath(profileName) {
12
+ const stateDir = getStateDir(profileName);
13
+ return path.join(stateDir, 'core.db');
14
+ }
15
+ /**
16
+ * Get the path to chat.db for a profile
17
+ */
18
+ export function getChatDbPath(profileName) {
19
+ const chatDir = getModuleDir(profileName, 'chat');
20
+ return path.join(chatDir, 'chat.db');
21
+ }
22
+ /**
23
+ * Initialize a SQLite database with WAL mode and foreign keys
24
+ */
25
+ export function initializeDatabase(dbPath) {
26
+ ensureDir(path.dirname(dbPath));
27
+ const db = new Database(dbPath);
28
+ // Enable WAL mode for better concurrent access
29
+ db.pragma('journal_mode = WAL');
30
+ // Enable foreign keys
31
+ db.pragma('foreign_keys = ON');
32
+ // Set busy timeout
33
+ db.pragma('busy_timeout = 5000');
34
+ return db;
35
+ }
36
+ /**
37
+ * Check if a database file exists
38
+ */
39
+ export function databaseExists(dbPath) {
40
+ return fs.existsSync(dbPath);
41
+ }
42
+ /**
43
+ * Initialize databases for a profile
44
+ */
45
+ export function initializeProfileDatabases(profileName) {
46
+ const coreDbPath = getCoreDbPath(profileName);
47
+ const chatDbPath = getChatDbPath(profileName);
48
+ const coreDb = initializeDatabase(coreDbPath);
49
+ const chatDb = initializeDatabase(chatDbPath);
50
+ return {
51
+ coreDb: { db: coreDb, path: coreDbPath },
52
+ chatDb: { db: chatDb, path: chatDbPath },
53
+ };
54
+ }
55
+ /**
56
+ * Close a database connection
57
+ */
58
+ export function closeDatabase(db) {
59
+ db.close();
60
+ }
61
+ /**
62
+ * Close all database connections for a profile
63
+ */
64
+ export function closeProfileDatabases(coreDb, chatDb) {
65
+ closeDatabase(coreDb);
66
+ closeDatabase(chatDb);
67
+ }
68
+ //# sourceMappingURL=database.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.js","sourceRoot":"","sources":["../../../src/core/sqlite/database.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAO9E;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,WAAmB;IAC/C,MAAM,QAAQ,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC;IAC1C,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;AACxC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,WAAmB;IAC/C,MAAM,OAAO,GAAG,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAClD,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;AACvC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAc;IAC/C,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IAEhC,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;IAEhC,+CAA+C;IAC/C,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAEhC,sBAAsB;IACtB,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAE/B,mBAAmB;IACnB,EAAE,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC;IAEjC,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,MAAc;IAC3C,OAAO,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;AAC/B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,0BAA0B,CAAC,WAAmB;IAI5D,MAAM,UAAU,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC;IAC9C,MAAM,UAAU,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC;IAE9C,MAAM,MAAM,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC;IAE9C,OAAO;QACL,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE;QACxC,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE;KACzC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,EAAqB;IACjD,EAAE,CAAC,KAAK,EAAE,CAAC;AACb,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAAyB,EAAE,MAAyB;IACxF,aAAa,CAAC,MAAM,CAAC,CAAC;IACtB,aAAa,CAAC,MAAM,CAAC,CAAC;AACxB,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Migration system for SQLite databases
3
+ */
4
+ import Database from 'better-sqlite3';
5
+ export interface Migration {
6
+ version: number;
7
+ name: string;
8
+ up: (db: Database.Database) => void;
9
+ }
10
+ /**
11
+ * Get the current schema version
12
+ */
13
+ export declare function getCurrentVersion(db: Database.Database): number;
14
+ /**
15
+ * Run pending migrations
16
+ */
17
+ export declare function runMigrations(db: Database.Database, migrations: Migration[]): void;
18
+ /**
19
+ * Check if database is up to date
20
+ */
21
+ export declare function isUpToDate(db: Database.Database, latestVersion: number): boolean;
22
+ //# sourceMappingURL=migrations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrations.d.ts","sourceRoot":"","sources":["../../../src/core/sqlite/migrations.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAEtC,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,KAAK,IAAI,CAAC;CACrC;AAeD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,MAAM,CAK/D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,IAAI,CAuClF;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAEhF"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Migration system for SQLite databases
3
+ */
4
+ /**
5
+ * Create the migrations tracking table if it doesn't exist
6
+ */
7
+ function ensureMigrationTable(db) {
8
+ db.exec(`
9
+ CREATE TABLE IF NOT EXISTS schema_migrations (
10
+ version INTEGER PRIMARY KEY,
11
+ name TEXT NOT NULL,
12
+ applied_at TEXT NOT NULL DEFAULT (datetime('now'))
13
+ );
14
+ `);
15
+ }
16
+ /**
17
+ * Get the current schema version
18
+ */
19
+ export function getCurrentVersion(db) {
20
+ ensureMigrationTable(db);
21
+ const row = db.prepare('SELECT MAX(version) as version FROM schema_migrations').get();
22
+ return row.version || 0;
23
+ }
24
+ /**
25
+ * Run pending migrations
26
+ */
27
+ export function runMigrations(db, migrations) {
28
+ ensureMigrationTable(db);
29
+ const currentVersion = getCurrentVersion(db);
30
+ const pendingMigrations = migrations
31
+ .filter(m => m.version > currentVersion)
32
+ .sort((a, b) => a.version - b.version);
33
+ if (pendingMigrations.length === 0) {
34
+ return;
35
+ }
36
+ console.log(`Running ${pendingMigrations.length} migration(s)...`);
37
+ for (const migration of pendingMigrations) {
38
+ // Each migration runs in its own transaction
39
+ const transaction = db.transaction(() => {
40
+ try {
41
+ migration.up(db);
42
+ db.prepare('INSERT INTO schema_migrations (version, name, applied_at) VALUES (?, ?, datetime(\'now\'))').run(migration.version, migration.name);
43
+ console.log(` ✓ Migration ${migration.version}: ${migration.name}`);
44
+ }
45
+ catch (error) {
46
+ throw new Error(`Migration ${migration.version} (${migration.name}) failed: ${error instanceof Error ? error.message : String(error)}`);
47
+ }
48
+ });
49
+ try {
50
+ transaction();
51
+ }
52
+ catch (error) {
53
+ // Re-throw to stop migration process
54
+ throw error;
55
+ }
56
+ }
57
+ }
58
+ /**
59
+ * Check if database is up to date
60
+ */
61
+ export function isUpToDate(db, latestVersion) {
62
+ return getCurrentVersion(db) >= latestVersion;
63
+ }
64
+ //# sourceMappingURL=migrations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrations.js","sourceRoot":"","sources":["../../../src/core/sqlite/migrations.ts"],"names":[],"mappings":"AAAA;;GAEG;AAUH;;GAEG;AACH,SAAS,oBAAoB,CAAC,EAAqB;IACjD,EAAE,CAAC,IAAI,CAAC;;;;;;GAMP,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,EAAqB;IACrD,oBAAoB,CAAC,EAAE,CAAC,CAAC;IAEzB,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,uDAAuD,CAAC,CAAC,GAAG,EAAgC,CAAC;IACpH,OAAO,GAAG,CAAC,OAAO,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,EAAqB,EAAE,UAAuB;IAC1E,oBAAoB,CAAC,EAAE,CAAC,CAAC;IAEzB,MAAM,cAAc,GAAG,iBAAiB,CAAC,EAAE,CAAC,CAAC;IAC7C,MAAM,iBAAiB,GAAG,UAAU;SACjC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,GAAG,cAAc,CAAC;SACvC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC;IAEzC,IAAI,iBAAiB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnC,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,WAAW,iBAAiB,CAAC,MAAM,kBAAkB,CAAC,CAAC;IAEnE,KAAK,MAAM,SAAS,IAAI,iBAAiB,EAAE,CAAC;QAC1C,6CAA6C;QAC7C,MAAM,WAAW,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;YACtC,IAAI,CAAC;gBACH,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;gBAEjB,EAAE,CAAC,OAAO,CACR,4FAA4F,CAC7F,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;gBAEzC,OAAO,CAAC,GAAG,CAAC,iBAAiB,SAAS,CAAC,OAAO,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;YACvE,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,IAAI,KAAK,CACb,aAAa,SAAS,CAAC,OAAO,KAAK,SAAS,CAAC,IAAI,aAAa,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CACvH,CAAC;YACJ,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC;YACH,WAAW,EAAE,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,qCAAqC;YACrC,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,EAAqB,EAAE,aAAqB;IACrE,OAAO,iBAAiB,CAAC,EAAE,CAAC,IAAI,aAAa,CAAC;AAChD,CAAC"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Conversation service - listing and detail views
3
+ */
4
+ import Database from 'better-sqlite3';
5
+ export interface ConversationListItem {
6
+ conversationId: string;
7
+ type: string;
8
+ name: string | null;
9
+ unreadCount: number;
10
+ lastMessageAt: string | null;
11
+ }
12
+ export interface ConversationDetail {
13
+ conversation: any;
14
+ participants: Array<any>;
15
+ recentMessages: Array<any>;
16
+ unreadStats: {
17
+ totalUnread: number;
18
+ mentionedUnread: number;
19
+ } | null;
20
+ }
21
+ /**
22
+ * List conversations with unread counts
23
+ */
24
+ export declare function listConversationsWithUnread(db: Database.Database, options?: {
25
+ limit?: number;
26
+ offset?: number;
27
+ unreadOnly?: boolean;
28
+ }): ConversationListItem[];
29
+ /**
30
+ * Get conversation detail with recent history
31
+ */
32
+ export declare function getConversationDetail(db: Database.Database, conversationId: string, options?: {
33
+ historyLimit?: number;
34
+ }): ConversationDetail | null;
35
+ //# sourceMappingURL=conversation-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation-service.d.ts","sourceRoot":"","sources":["../../../../src/modules/chat/inbox/conversation-service.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAKtC,MAAM,WAAW,oBAAoB;IACnC,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED,MAAM,WAAW,kBAAkB;IACjC,YAAY,EAAE,GAAG,CAAC;IAClB,YAAY,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IACzB,cAAc,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAC3B,WAAW,EAAE;QACX,WAAW,EAAE,MAAM,CAAC;QACpB,eAAe,EAAE,MAAM,CAAC;KACzB,GAAG,IAAI,CAAC;CACV;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CACzC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,OAAO,GAAE;IACP,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,OAAO,CAAC;CACjB,GACL,oBAAoB,EAAE,CAyBxB;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,cAAc,EAAE,MAAM,EACtB,OAAO,GAAE;IACP,YAAY,CAAC,EAAE,MAAM,CAAC;CAClB,GACL,kBAAkB,GAAG,IAAI,CAuB3B"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Conversation service - listing and detail views
3
+ */
4
+ import { listConversations, getConversation, getConversationParticipants } from '../store/conversation-repo.js';
5
+ import { getMessagesByConversation } from '../store/message-repo.js';
6
+ import { getConversationUnreadStats } from '../store/read-state-repo.js';
7
+ /**
8
+ * List conversations with unread counts
9
+ */
10
+ export function listConversationsWithUnread(db, options = {}) {
11
+ const conversations = listConversations(db, {
12
+ limit: options.limit,
13
+ offset: options.offset,
14
+ });
15
+ const items = [];
16
+ for (const conv of conversations) {
17
+ const stats = getConversationUnreadStats(db, conv.conversation_id);
18
+ if (options.unreadOnly && (!stats || stats.totalUnread === 0)) {
19
+ continue;
20
+ }
21
+ items.push({
22
+ conversationId: conv.conversation_id,
23
+ type: conv.type,
24
+ name: conv.name,
25
+ unreadCount: stats?.totalUnread || 0,
26
+ lastMessageAt: conv.updated_at,
27
+ });
28
+ }
29
+ return items;
30
+ }
31
+ /**
32
+ * Get conversation detail with recent history
33
+ */
34
+ export function getConversationDetail(db, conversationId, options = {}) {
35
+ const conversation = getConversation(db, conversationId);
36
+ if (!conversation) {
37
+ return null;
38
+ }
39
+ const participants = getConversationParticipants(db, conversationId);
40
+ const recentMessages = getMessagesByConversation(db, conversationId, {
41
+ limit: options.historyLimit || 20,
42
+ }).reverse(); // Show oldest to newest
43
+ const unreadStats = getConversationUnreadStats(db, conversationId);
44
+ return {
45
+ conversation,
46
+ participants,
47
+ recentMessages,
48
+ unreadStats: unreadStats ? {
49
+ totalUnread: unreadStats.totalUnread,
50
+ mentionedUnread: unreadStats.mentionedUnread,
51
+ } : null,
52
+ };
53
+ }
54
+ //# sourceMappingURL=conversation-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation-service.js","sourceRoot":"","sources":["../../../../src/modules/chat/inbox/conversation-service.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAChH,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAC;AAoBzE;;GAEG;AACH,MAAM,UAAU,2BAA2B,CACzC,EAAqB,EACrB,UAII,EAAE;IAEN,MAAM,aAAa,GAAG,iBAAiB,CAAC,EAAE,EAAE;QAC1C,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IAEH,MAAM,KAAK,GAA2B,EAAE,CAAC;IAEzC,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,0BAA0B,CAAC,EAAE,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;QAEnE,IAAI,OAAO,CAAC,UAAU,IAAI,CAAC,CAAC,KAAK,IAAI,KAAK,CAAC,WAAW,KAAK,CAAC,CAAC,EAAE,CAAC;YAC9D,SAAS;QACX,CAAC;QAED,KAAK,CAAC,IAAI,CAAC;YACT,cAAc,EAAE,IAAI,CAAC,eAAe;YACpC,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,WAAW,EAAE,KAAK,EAAE,WAAW,IAAI,CAAC;YACpC,aAAa,EAAE,IAAI,CAAC,UAAU;SAC/B,CAAC,CAAC;IACL,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CACnC,EAAqB,EACrB,cAAsB,EACtB,UAEI,EAAE;IAEN,MAAM,YAAY,GAAG,eAAe,CAAC,EAAE,EAAE,cAAc,CAAC,CAAC;IAEzD,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,YAAY,GAAG,2BAA2B,CAAC,EAAE,EAAE,cAAc,CAAC,CAAC;IACrE,MAAM,cAAc,GAAG,yBAAyB,CAAC,EAAE,EAAE,cAAc,EAAE;QACnE,KAAK,EAAE,OAAO,CAAC,YAAY,IAAI,EAAE;KAClC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,wBAAwB;IAEtC,MAAM,WAAW,GAAG,0BAA0B,CAAC,EAAE,EAAE,cAAc,CAAC,CAAC;IAEnE,OAAO;QACL,YAAY;QACZ,YAAY;QACZ,cAAc;QACd,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC;YACzB,WAAW,EAAE,WAAW,CAAC,WAAW;YACpC,eAAe,EAAE,WAAW,CAAC,eAAe;SAC7C,CAAC,CAAC,CAAC,IAAI;KACT,CAAC;AACJ,CAAC"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * History service - local history browsing without altering unread state
3
+ */
4
+ import Database from 'better-sqlite3';
5
+ export interface HistoryResult {
6
+ messages: Array<any>;
7
+ hasMore: boolean;
8
+ nextCursor: string | null;
9
+ }
10
+ /**
11
+ * Get paginated message history for a conversation
12
+ */
13
+ export declare function getHistory(db: Database.Database, conversationId: string, options?: {
14
+ limit?: number;
15
+ before?: string;
16
+ after?: string;
17
+ }): HistoryResult;
18
+ /**
19
+ * Get message with surrounding context
20
+ */
21
+ export declare function getHistoryWithContext(db: Database.Database, conversationId: string, messageId: string, options?: {
22
+ beforeCount?: number;
23
+ afterCount?: number;
24
+ }): Array<any>;
25
+ //# sourceMappingURL=history-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history-service.d.ts","sourceRoot":"","sources":["../../../../src/modules/chat/inbox/history-service.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAGtC,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED;;GAEG;AACH,wBAAgB,UAAU,CACxB,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,cAAc,EAAE,MAAM,EACtB,OAAO,GAAE;IACP,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CACX,GACL,aAAa,CAsBf;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,cAAc,EAAE,MAAM,EACtB,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE;IACP,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CAChB,GACL,KAAK,CAAC,GAAG,CAAC,CAkCZ"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * History service - local history browsing without altering unread state
3
+ */
4
+ import { getMessagesByConversation, getHistoryBefore } from '../store/message-repo.js';
5
+ /**
6
+ * Get paginated message history for a conversation
7
+ */
8
+ export function getHistory(db, conversationId, options = {}) {
9
+ const limit = options.limit || 50;
10
+ const messages = getMessagesByConversation(db, conversationId, {
11
+ limit: limit + 1, // Fetch one extra to check hasMore
12
+ before: options.before,
13
+ after: options.after,
14
+ });
15
+ const hasMore = messages.length > limit;
16
+ if (hasMore) {
17
+ messages.pop(); // Remove the extra message
18
+ }
19
+ const nextCursor = hasMore && messages.length > 0
20
+ ? messages[messages.length - 1].remote_created_at
21
+ : null;
22
+ return {
23
+ messages,
24
+ hasMore,
25
+ nextCursor,
26
+ };
27
+ }
28
+ /**
29
+ * Get message with surrounding context
30
+ */
31
+ export function getHistoryWithContext(db, conversationId, messageId, options = {}) {
32
+ const beforeCount = options.beforeCount || 10;
33
+ const afterCount = options.afterCount || 10;
34
+ // Get the target message timestamp
35
+ const target = db.prepare('SELECT remote_created_at FROM messages WHERE message_id = ?').get(messageId);
36
+ if (!target) {
37
+ return [];
38
+ }
39
+ // Get messages before
40
+ const before = getHistoryBefore(db, conversationId, target.remote_created_at, beforeCount);
41
+ // Get messages after
42
+ const after = getMessagesByConversation(db, conversationId, {
43
+ limit: afterCount,
44
+ after: target.remote_created_at,
45
+ });
46
+ // Get target message
47
+ const targetMsg = db.prepare(`
48
+ SELECT m.*, ml.is_read, ml.is_mentioned
49
+ FROM messages m
50
+ JOIN message_local_state ml ON m.message_id = ml.message_id
51
+ WHERE m.message_id = ?
52
+ `).get(messageId);
53
+ // Combine and sort
54
+ const all = [...before.reverse(), targetMsg, ...after];
55
+ return all.filter(Boolean);
56
+ }
57
+ //# sourceMappingURL=history-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history-service.js","sourceRoot":"","sources":["../../../../src/modules/chat/inbox/history-service.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,yBAAyB,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAQvF;;GAEG;AACH,MAAM,UAAU,UAAU,CACxB,EAAqB,EACrB,cAAsB,EACtB,UAII,EAAE;IAEN,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;IAClC,MAAM,QAAQ,GAAG,yBAAyB,CAAC,EAAE,EAAE,cAAc,EAAE;QAC7D,KAAK,EAAE,KAAK,GAAG,CAAC,EAAE,mCAAmC;QACrD,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,KAAK,EAAE,OAAO,CAAC,KAAK;KACrB,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,GAAG,KAAK,CAAC;IACxC,IAAI,OAAO,EAAE,CAAC;QACZ,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,2BAA2B;IAC7C,CAAC;IAED,MAAM,UAAU,GAAG,OAAO,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;QAC/C,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,iBAAiB;QACjD,CAAC,CAAC,IAAI,CAAC;IAET,OAAO;QACL,QAAQ;QACR,OAAO;QACP,UAAU;KACX,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CACnC,EAAqB,EACrB,cAAsB,EACtB,SAAiB,EACjB,UAGI,EAAE;IAEN,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,EAAE,CAAC;IAC9C,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,EAAE,CAAC;IAE5C,mCAAmC;IACnC,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CACvB,6DAA6D,CAC9D,CAAC,GAAG,CAAC,SAAS,CAA8C,CAAC;IAE9D,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,sBAAsB;IACtB,MAAM,MAAM,GAAG,gBAAgB,CAAC,EAAE,EAAE,cAAc,EAAE,MAAM,CAAC,iBAAiB,EAAE,WAAW,CAAC,CAAC;IAE3F,qBAAqB;IACrB,MAAM,KAAK,GAAG,yBAAyB,CAAC,EAAE,EAAE,cAAc,EAAE;QAC1D,KAAK,EAAE,UAAU;QACjB,KAAK,EAAE,MAAM,CAAC,iBAAiB;KAChC,CAAC,CAAC;IAEH,qBAAqB;IACrB,MAAM,SAAS,GAAG,EAAE,CAAC,OAAO,CAAC;;;;;GAK5B,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAElB,mBAAmB;IACnB,MAAM,GAAG,GAAG,CAAC,GAAG,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC,CAAC;IAEvD,OAAO,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAC7B,CAAC"}