@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,72 @@
1
+ /**
2
+ * Job repository - manage scheduler_jobs table for background sync
3
+ */
4
+ import Database from 'better-sqlite3';
5
+ export interface SchedulerJob {
6
+ id: string;
7
+ job_type: string;
8
+ payload: string | null;
9
+ status: 'pending' | 'running' | 'completed' | 'failed';
10
+ scheduled_at: string;
11
+ executed_at: string | null;
12
+ last_error: string | null;
13
+ retry_count: number;
14
+ created_at: string;
15
+ }
16
+ export interface JobStats {
17
+ total: number;
18
+ pending: number;
19
+ running: number;
20
+ completed: number;
21
+ failed: number;
22
+ }
23
+ /**
24
+ * Upsert a job (insert or update)
25
+ */
26
+ export declare function upsertJob(db: Database.Database, job: {
27
+ id: string;
28
+ jobType: string;
29
+ payload?: Record<string, any>;
30
+ scheduledAt?: string;
31
+ }): void;
32
+ /**
33
+ * Get a job by ID
34
+ */
35
+ export declare function getJob(db: Database.Database, jobId: string): SchedulerJob | undefined;
36
+ /**
37
+ * Get jobs by type
38
+ */
39
+ export declare function getJobsByType(db: Database.Database, jobType: string, status?: string): SchedulerJob[];
40
+ /**
41
+ * List all jobs, optionally filter by status
42
+ */
43
+ export declare function listJobs(db: Database.Database, status?: string): SchedulerJob[];
44
+ /**
45
+ * Update job status
46
+ */
47
+ export declare function updateJobStatus(db: Database.Database, jobId: string, status: 'pending' | 'running' | 'completed' | 'failed', error?: string): void;
48
+ /**
49
+ * Record job success
50
+ */
51
+ export declare function recordJobSuccess(db: Database.Database, jobId: string): void;
52
+ /**
53
+ * Record job failure
54
+ */
55
+ export declare function recordJobFailure(db: Database.Database, jobId: string, error: string): void;
56
+ /**
57
+ * Delete a job
58
+ */
59
+ export declare function deleteJob(db: Database.Database, jobId: string): void;
60
+ /**
61
+ * Get job statistics
62
+ */
63
+ export declare function getJobStats(db: Database.Database): JobStats;
64
+ /**
65
+ * Get latest job by type
66
+ */
67
+ export declare function getLatestJobByType(db: Database.Database, jobType: string): SchedulerJob | undefined;
68
+ /**
69
+ * Clean up old completed jobs (older than specified days)
70
+ */
71
+ export declare function cleanupOldJobs(db: Database.Database, olderThanDays?: number): number;
72
+ //# sourceMappingURL=job-repo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"job-repo.d.ts","sourceRoot":"","sources":["../../../../src/modules/chat/store/job-repo.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAEtC,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;IACvD,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAgB,SAAS,CACvB,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,GAAG,EAAE;IACH,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,GACA,IAAI,CAeN;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAIrF;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,MAAM,GACd,YAAY,EAAE,CAShB;AAED;;GAEG;AACH,wBAAgB,QAAQ,CACtB,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,MAAM,CAAC,EAAE,MAAM,GACd,YAAY,EAAE,CAShB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,EACtD,KAAK,CAAC,EAAE,MAAM,GACb,IAAI,CAiBN;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,KAAK,EAAE,MAAM,GACZ,IAAI,CAKN;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,GACZ,IAAI,CAKN;AAED;;GAEG;AACH,wBAAgB,SAAS,CACvB,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,KAAK,EAAE,MAAM,GACZ,IAAI,CAIN;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,QAAQ,CAkB3D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,OAAO,EAAE,MAAM,GACd,YAAY,GAAG,SAAS,CAI1B;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,aAAa,GAAE,MAAU,GACxB,MAAM,CAOR"}
@@ -0,0 +1,140 @@
1
+ /**
2
+ * Job repository - manage scheduler_jobs table for background sync
3
+ */
4
+ /**
5
+ * Upsert a job (insert or update)
6
+ */
7
+ export function upsertJob(db, job) {
8
+ db.prepare(`
9
+ INSERT INTO scheduler_jobs (id, job_type, payload, status, scheduled_at)
10
+ VALUES (?, ?, ?, 'pending', ?)
11
+ ON CONFLICT(id) DO UPDATE SET
12
+ job_type = excluded.job_type,
13
+ payload = excluded.payload,
14
+ scheduled_at = excluded.scheduled_at,
15
+ status = CASE WHEN status = 'failed' THEN 'pending' ELSE status END
16
+ `).run(job.id, job.jobType, job.payload ? JSON.stringify(job.payload) : null, job.scheduledAt || new Date().toISOString());
17
+ }
18
+ /**
19
+ * Get a job by ID
20
+ */
21
+ export function getJob(db, jobId) {
22
+ return db.prepare(`
23
+ SELECT * FROM scheduler_jobs WHERE id = ?
24
+ `).get(jobId);
25
+ }
26
+ /**
27
+ * Get jobs by type
28
+ */
29
+ export function getJobsByType(db, jobType, status) {
30
+ if (status) {
31
+ return db.prepare(`
32
+ SELECT * FROM scheduler_jobs WHERE job_type = ? AND status = ? ORDER BY created_at DESC
33
+ `).all(jobType, status);
34
+ }
35
+ return db.prepare(`
36
+ SELECT * FROM scheduler_jobs WHERE job_type = ? ORDER BY created_at DESC
37
+ `).all(jobType);
38
+ }
39
+ /**
40
+ * List all jobs, optionally filter by status
41
+ */
42
+ export function listJobs(db, status) {
43
+ if (status) {
44
+ return db.prepare(`
45
+ SELECT * FROM scheduler_jobs WHERE status = ? ORDER BY created_at DESC
46
+ `).all(status);
47
+ }
48
+ return db.prepare(`
49
+ SELECT * FROM scheduler_jobs ORDER BY created_at DESC
50
+ `).all();
51
+ }
52
+ /**
53
+ * Update job status
54
+ */
55
+ export function updateJobStatus(db, jobId, status, error) {
56
+ if (status === 'running') {
57
+ db.prepare(`
58
+ UPDATE scheduler_jobs SET status = ?, executed_at = datetime('now'), last_error = NULL
59
+ WHERE id = ?
60
+ `).run(status, jobId);
61
+ }
62
+ else if (status === 'failed' && error) {
63
+ db.prepare(`
64
+ UPDATE scheduler_jobs SET status = ?, last_error = ?, retry_count = retry_count + 1
65
+ WHERE id = ?
66
+ `).run(status, error, jobId);
67
+ }
68
+ else {
69
+ db.prepare(`
70
+ UPDATE scheduler_jobs SET status = ?
71
+ WHERE id = ?
72
+ `).run(status, jobId);
73
+ }
74
+ }
75
+ /**
76
+ * Record job success
77
+ */
78
+ export function recordJobSuccess(db, jobId) {
79
+ db.prepare(`
80
+ UPDATE scheduler_jobs SET status = 'completed', last_error = NULL
81
+ WHERE id = ?
82
+ `).run(jobId);
83
+ }
84
+ /**
85
+ * Record job failure
86
+ */
87
+ export function recordJobFailure(db, jobId, error) {
88
+ db.prepare(`
89
+ UPDATE scheduler_jobs SET status = 'failed', last_error = ?, retry_count = retry_count + 1
90
+ WHERE id = ?
91
+ `).run(error, jobId);
92
+ }
93
+ /**
94
+ * Delete a job
95
+ */
96
+ export function deleteJob(db, jobId) {
97
+ db.prepare(`
98
+ DELETE FROM scheduler_jobs WHERE id = ?
99
+ `).run(jobId);
100
+ }
101
+ /**
102
+ * Get job statistics
103
+ */
104
+ export function getJobStats(db) {
105
+ const row = db.prepare(`
106
+ SELECT
107
+ COUNT(*) as total,
108
+ SUM(CASE WHEN status = 'pending' THEN 1 ELSE 0 END) as pending,
109
+ SUM(CASE WHEN status = 'running' THEN 1 ELSE 0 END) as running,
110
+ SUM(CASE WHEN status = 'completed' THEN 1 ELSE 0 END) as completed,
111
+ SUM(CASE WHEN status = 'failed' THEN 1 ELSE 0 END) as failed
112
+ FROM scheduler_jobs
113
+ `).get();
114
+ return {
115
+ total: row.total || 0,
116
+ pending: row.pending || 0,
117
+ running: row.running || 0,
118
+ completed: row.completed || 0,
119
+ failed: row.failed || 0,
120
+ };
121
+ }
122
+ /**
123
+ * Get latest job by type
124
+ */
125
+ export function getLatestJobByType(db, jobType) {
126
+ return db.prepare(`
127
+ SELECT * FROM scheduler_jobs WHERE job_type = ? ORDER BY created_at DESC LIMIT 1
128
+ `).get(jobType);
129
+ }
130
+ /**
131
+ * Clean up old completed jobs (older than specified days)
132
+ */
133
+ export function cleanupOldJobs(db, olderThanDays = 7) {
134
+ const result = db.prepare(`
135
+ DELETE FROM scheduler_jobs
136
+ WHERE status = 'completed' AND created_at < datetime('now', ?)
137
+ `).run(`-${olderThanDays} days`);
138
+ return result.changes;
139
+ }
140
+ //# sourceMappingURL=job-repo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"job-repo.js","sourceRoot":"","sources":["../../../../src/modules/chat/store/job-repo.ts"],"names":[],"mappings":"AAAA;;GAEG;AAwBH;;GAEG;AACH,MAAM,UAAU,SAAS,CACvB,EAAqB,EACrB,GAKC;IAED,EAAE,CAAC,OAAO,CAAC;;;;;;;;GAQV,CAAC,CAAC,GAAG,CACJ,GAAG,CAAC,EAAE,EACN,GAAG,CAAC,OAAO,EACX,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAChD,GAAG,CAAC,WAAW,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAC5C,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,MAAM,CAAC,EAAqB,EAAE,KAAa;IACzD,OAAO,EAAE,CAAC,OAAO,CAAC;;GAEjB,CAAC,CAAC,GAAG,CAAC,KAAK,CAA6B,CAAC;AAC5C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAC3B,EAAqB,EACrB,OAAe,EACf,MAAe;IAEf,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,EAAE,CAAC,OAAO,CAAC;;KAEjB,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAmB,CAAC;IAC5C,CAAC;IACD,OAAO,EAAE,CAAC,OAAO,CAAC;;GAEjB,CAAC,CAAC,GAAG,CAAC,OAAO,CAAmB,CAAC;AACpC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,QAAQ,CACtB,EAAqB,EACrB,MAAe;IAEf,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,EAAE,CAAC,OAAO,CAAC;;KAEjB,CAAC,CAAC,GAAG,CAAC,MAAM,CAAmB,CAAC;IACnC,CAAC;IACD,OAAO,EAAE,CAAC,OAAO,CAAC;;GAEjB,CAAC,CAAC,GAAG,EAAoB,CAAC;AAC7B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAC7B,EAAqB,EACrB,KAAa,EACb,MAAsD,EACtD,KAAc;IAEd,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,EAAE,CAAC,OAAO,CAAC;;;KAGV,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACxB,CAAC;SAAM,IAAI,MAAM,KAAK,QAAQ,IAAI,KAAK,EAAE,CAAC;QACxC,EAAE,CAAC,OAAO,CAAC;;;KAGV,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IAC/B,CAAC;SAAM,CAAC;QACN,EAAE,CAAC,OAAO,CAAC;;;KAGV,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACxB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAC9B,EAAqB,EACrB,KAAa;IAEb,EAAE,CAAC,OAAO,CAAC;;;GAGV,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAC9B,EAAqB,EACrB,KAAa,EACb,KAAa;IAEb,EAAE,CAAC,OAAO,CAAC;;;GAGV,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AACvB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CACvB,EAAqB,EACrB,KAAa;IAEb,EAAE,CAAC,OAAO,CAAC;;GAEV,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,EAAqB;IAC/C,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC;;;;;;;;GAQtB,CAAC,CAAC,GAAG,EAA+H,CAAC;IAEtI,OAAO;QACL,KAAK,EAAE,GAAG,CAAC,KAAK,IAAI,CAAC;QACrB,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,CAAC;QACzB,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,CAAC;QACzB,SAAS,EAAE,GAAG,CAAC,SAAS,IAAI,CAAC;QAC7B,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,CAAC;KACxB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAChC,EAAqB,EACrB,OAAe;IAEf,OAAO,EAAE,CAAC,OAAO,CAAC;;GAEjB,CAAC,CAAC,GAAG,CAAC,OAAO,CAA6B,CAAC;AAC9C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAC5B,EAAqB,EACrB,gBAAwB,CAAC;IAEzB,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC;;;GAGzB,CAAC,CAAC,GAAG,CAAC,IAAI,aAAa,OAAO,CAAC,CAAC;IAEjC,OAAO,MAAM,CAAC,OAAO,CAAC;AACxB,CAAC"}
@@ -0,0 +1,98 @@
1
+ /**
2
+ * Message repository - data access for messages
3
+ */
4
+ import Database from 'better-sqlite3';
5
+ export interface MessageRecord {
6
+ message_id: string;
7
+ conversation_id: string;
8
+ sender_id: string;
9
+ content: string | null;
10
+ type: 'text' | 'system' | 'command';
11
+ status: 'sent' | 'edited' | 'withdrawn' | 'deleted';
12
+ in_reply_to: string | null;
13
+ mentions: string | null;
14
+ edit_history: string | null;
15
+ remote_created_at: string;
16
+ remote_updated_at: string | null;
17
+ local_created_at: string;
18
+ local_updated_at: string;
19
+ }
20
+ export interface MessageLocalState {
21
+ message_id: string;
22
+ is_read: number;
23
+ read_at: string | null;
24
+ is_mentioned: number;
25
+ note: string | null;
26
+ updated_at: string;
27
+ }
28
+ /**
29
+ * Upsert a message (insert or update)
30
+ * Returns true if inserted, false if updated
31
+ */
32
+ export declare function upsertMessage(db: Database.Database, message: Partial<MessageRecord> & {
33
+ message_id: string;
34
+ conversation_id: string;
35
+ sender_id: string;
36
+ }): {
37
+ inserted: boolean;
38
+ };
39
+ /**
40
+ * Mark a message as read
41
+ */
42
+ export declare function markMessageRead(db: Database.Database, messageId: string): void;
43
+ /**
44
+ * Update message status (e.g., edited, withdrawn)
45
+ */
46
+ export declare function updateMessageStatus(db: Database.Database, messageId: string, status: 'edited' | 'withdrawn' | 'deleted', editHistory?: string): void;
47
+ /**
48
+ * Get messages for a conversation
49
+ */
50
+ export declare function getConversationMessages(db: Database.Database, conversationId: string, options?: {
51
+ limit?: number;
52
+ before?: string;
53
+ }): Array<MessageRecord & MessageLocalState>;
54
+ /**
55
+ * Get unread messages count
56
+ */
57
+ export declare function getUnreadCount(db: Database.Database, conversationId?: string): number;
58
+ /**
59
+ * Get unread messages with conversation context
60
+ */
61
+ export declare function getUnreadMessages(db: Database.Database, options?: {
62
+ limit?: number;
63
+ conversationId?: string;
64
+ }): Array<MessageRecord & MessageLocalState & {
65
+ conversation_type: string;
66
+ conversation_name: string | null;
67
+ }>;
68
+ /**
69
+ * Search messages by query string
70
+ * Searches in content and sender_id
71
+ */
72
+ export declare function searchMessages(db: Database.Database, query: string, options?: {
73
+ conversationId?: string;
74
+ unreadOnly?: boolean;
75
+ limit?: number;
76
+ dateFrom?: string;
77
+ dateTo?: string;
78
+ }): Array<MessageRecord & MessageLocalState & {
79
+ conversation_type: string;
80
+ conversation_name: string | null;
81
+ }>;
82
+ /**
83
+ * Get N messages before a specific message (history context)
84
+ */
85
+ export declare function getHistoryBefore(db: Database.Database, conversationId: string, beforeTimestamp: string, limit?: number): Array<MessageRecord & MessageLocalState>;
86
+ /**
87
+ * Get paginated messages for a specific conversation
88
+ */
89
+ export declare function getMessagesByConversation(db: Database.Database, conversationId: string, options?: {
90
+ limit?: number;
91
+ before?: string;
92
+ after?: string;
93
+ }): Array<MessageRecord & MessageLocalState>;
94
+ /**
95
+ * Update mention flag for a message
96
+ */
97
+ export declare function updateMentionFlag(db: Database.Database, messageId: string, isMentioned: number): void;
98
+ //# sourceMappingURL=message-repo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-repo.d.ts","sourceRoot":"","sources":["../../../../src/modules/chat/store/message-repo.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,231 @@
1
+ /**
2
+ * Message repository - data access for messages
3
+ */
4
+ /**
5
+ * Upsert a message (insert or update)
6
+ * Returns true if inserted, false if updated
7
+ */
8
+ export function upsertMessage(db, message) {
9
+ const existing = db.prepare('SELECT message_id FROM messages WHERE message_id = ?').get(message.message_id);
10
+ if (existing) {
11
+ // Update existing message
12
+ db.prepare(`
13
+ UPDATE messages SET
14
+ content = @content,
15
+ type = @type,
16
+ status = @status,
17
+ in_reply_to = @in_reply_to,
18
+ mentions = @mentions,
19
+ edit_history = @edit_history,
20
+ remote_updated_at = @remote_updated_at,
21
+ local_updated_at = datetime('now')
22
+ WHERE message_id = @message_id
23
+ `).run({
24
+ message_id: message.message_id,
25
+ content: message.content ?? null,
26
+ type: message.type || 'text',
27
+ status: message.status || 'sent',
28
+ in_reply_to: message.in_reply_to ?? null,
29
+ mentions: message.mentions ?? null,
30
+ edit_history: message.edit_history ?? null,
31
+ remote_updated_at: message.remote_updated_at ?? null,
32
+ });
33
+ return { inserted: false };
34
+ }
35
+ else {
36
+ // Insert new message
37
+ db.prepare(`
38
+ INSERT INTO messages (
39
+ message_id, conversation_id, sender_id, content, type, status,
40
+ in_reply_to, mentions, edit_history, remote_created_at, remote_updated_at
41
+ ) VALUES (
42
+ @message_id, @conversation_id, @sender_id, @content, @type, @status,
43
+ @in_reply_to, @mentions, @edit_history, @remote_created_at, @remote_updated_at
44
+ )
45
+ `).run({
46
+ message_id: message.message_id,
47
+ conversation_id: message.conversation_id,
48
+ sender_id: message.sender_id,
49
+ content: message.content ?? null,
50
+ type: message.type || 'text',
51
+ status: message.status || 'sent',
52
+ in_reply_to: message.in_reply_to ?? null,
53
+ mentions: message.mentions ?? null,
54
+ edit_history: message.edit_history ?? null,
55
+ remote_created_at: message.remote_created_at || new Date().toISOString(),
56
+ remote_updated_at: message.remote_updated_at ?? null,
57
+ });
58
+ // Initialize local state
59
+ db.prepare(`
60
+ INSERT INTO message_local_state (message_id, is_read, is_mentioned)
61
+ VALUES (?, 0, 0)
62
+ `).run(message.message_id);
63
+ return { inserted: true };
64
+ }
65
+ }
66
+ /**
67
+ * Mark a message as read
68
+ */
69
+ export function markMessageRead(db, messageId) {
70
+ db.prepare(`
71
+ UPDATE message_local_state
72
+ SET is_read = 1, read_at = datetime('now'), updated_at = datetime('now')
73
+ WHERE message_id = ?
74
+ `).run(messageId);
75
+ }
76
+ /**
77
+ * Update message status (e.g., edited, withdrawn)
78
+ */
79
+ export function updateMessageStatus(db, messageId, status, editHistory) {
80
+ db.prepare(`
81
+ UPDATE messages SET
82
+ status = ?,
83
+ edit_history = COALESCE(?, edit_history),
84
+ remote_updated_at = datetime('now'),
85
+ local_updated_at = datetime('now')
86
+ WHERE message_id = ?
87
+ `).run(status, editHistory ?? null, messageId);
88
+ }
89
+ /**
90
+ * Get messages for a conversation
91
+ */
92
+ export function getConversationMessages(db, conversationId, options = {}) {
93
+ const limit = options.limit || 50;
94
+ let query = `
95
+ SELECT m.*, ml.is_read, ml.read_at, ml.is_mentioned, ml.note
96
+ FROM messages m
97
+ JOIN message_local_state ml ON m.message_id = ml.message_id
98
+ WHERE m.conversation_id = ?
99
+ `;
100
+ const params = [conversationId];
101
+ if (options.before) {
102
+ query += ` AND m.remote_created_at < ?`;
103
+ params.push(options.before);
104
+ }
105
+ query += ` ORDER BY m.remote_created_at DESC LIMIT ?`;
106
+ params.push(limit);
107
+ return db.prepare(query).all(...params);
108
+ }
109
+ /**
110
+ * Get unread messages count
111
+ */
112
+ export function getUnreadCount(db, conversationId) {
113
+ let query = `
114
+ SELECT COUNT(*) as count
115
+ FROM message_local_state ml
116
+ JOIN messages m ON m.message_id = ml.message_id
117
+ WHERE ml.is_read = 0 AND m.sender_id != ?
118
+ `;
119
+ const params = ['me']; // TODO: Replace with actual agent ID
120
+ if (conversationId) {
121
+ query += ` AND m.conversation_id = ?`;
122
+ params.push(conversationId);
123
+ }
124
+ const row = db.prepare(query).get(...params);
125
+ return row.count;
126
+ }
127
+ /**
128
+ * Get unread messages with conversation context
129
+ */
130
+ export function getUnreadMessages(db, options = {}) {
131
+ const limit = options.limit || 50;
132
+ let query = `
133
+ SELECT m.*, ml.is_read, ml.read_at, ml.is_mentioned, ml.note,
134
+ c.type as conversation_type, c.name as conversation_name
135
+ FROM messages m
136
+ JOIN message_local_state ml ON m.message_id = ml.message_id
137
+ JOIN conversations c ON c.conversation_id = m.conversation_id
138
+ WHERE ml.is_read = 0 AND m.sender_id != ?
139
+ `;
140
+ const params = ['me']; // TODO: Replace with actual agent ID
141
+ if (options.conversationId) {
142
+ query += ` AND m.conversation_id = ?`;
143
+ params.push(options.conversationId);
144
+ }
145
+ query += ` ORDER BY m.remote_created_at DESC LIMIT ?`;
146
+ params.push(limit);
147
+ return db.prepare(query).all(...params);
148
+ }
149
+ /**
150
+ * Search messages by query string
151
+ * Searches in content and sender_id
152
+ */
153
+ export function searchMessages(db, query, options = {}) {
154
+ const limit = options.limit || 50;
155
+ const searchPattern = `%${query}%`;
156
+ let sql = `
157
+ SELECT m.*, ml.is_read, ml.read_at, ml.is_mentioned, ml.note,
158
+ c.type as conversation_type, c.name as conversation_name
159
+ FROM messages m
160
+ JOIN message_local_state ml ON m.message_id = ml.message_id
161
+ JOIN conversations c ON c.conversation_id = m.conversation_id
162
+ WHERE (m.content LIKE ? OR m.sender_id LIKE ?)
163
+ `;
164
+ const params = [searchPattern, searchPattern];
165
+ if (options.conversationId) {
166
+ sql += ` AND m.conversation_id = ?`;
167
+ params.push(options.conversationId);
168
+ }
169
+ if (options.unreadOnly) {
170
+ sql += ` AND ml.is_read = 0`;
171
+ }
172
+ if (options.dateFrom) {
173
+ sql += ` AND m.remote_created_at >= ?`;
174
+ params.push(options.dateFrom);
175
+ }
176
+ if (options.dateTo) {
177
+ sql += ` AND m.remote_created_at <= ?`;
178
+ params.push(options.dateTo);
179
+ }
180
+ sql += ` ORDER BY m.remote_created_at DESC LIMIT ?`;
181
+ params.push(limit);
182
+ return db.prepare(sql).all(...params);
183
+ }
184
+ /**
185
+ * Get N messages before a specific message (history context)
186
+ */
187
+ export function getHistoryBefore(db, conversationId, beforeTimestamp, limit = 10) {
188
+ return db.prepare(`
189
+ SELECT m.*, ml.is_read, ml.read_at, ml.is_mentioned, ml.note
190
+ FROM messages m
191
+ JOIN message_local_state ml ON m.message_id = ml.message_id
192
+ WHERE m.conversation_id = ? AND m.remote_created_at < ?
193
+ ORDER BY m.remote_created_at DESC
194
+ LIMIT ?
195
+ `).all(conversationId, beforeTimestamp, limit);
196
+ }
197
+ /**
198
+ * Get paginated messages for a specific conversation
199
+ */
200
+ export function getMessagesByConversation(db, conversationId, options = {}) {
201
+ const limit = options.limit || 50;
202
+ let query = `
203
+ SELECT m.*, ml.is_read, ml.read_at, ml.is_mentioned, ml.note
204
+ FROM messages m
205
+ JOIN message_local_state ml ON m.message_id = ml.message_id
206
+ WHERE m.conversation_id = ?
207
+ `;
208
+ const params = [conversationId];
209
+ if (options.before) {
210
+ query += ` AND m.remote_created_at < ?`;
211
+ params.push(options.before);
212
+ }
213
+ if (options.after) {
214
+ query += ` AND m.remote_created_at > ?`;
215
+ params.push(options.after);
216
+ }
217
+ query += ` ORDER BY m.remote_created_at DESC LIMIT ?`;
218
+ params.push(limit);
219
+ return db.prepare(query).all(...params);
220
+ }
221
+ /**
222
+ * Update mention flag for a message
223
+ */
224
+ export function updateMentionFlag(db, messageId, isMentioned) {
225
+ db.prepare(`
226
+ UPDATE message_local_state
227
+ SET is_mentioned = ?, updated_at = datetime('now')
228
+ WHERE message_id = ?
229
+ `).run(isMentioned, messageId);
230
+ }
231
+ //# sourceMappingURL=message-repo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-repo.js","sourceRoot":"","sources":["../../../../src/modules/chat/store/message-repo.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Outbox repository - manage failed/pending message sends
3
+ */
4
+ import Database from 'better-sqlite3';
5
+ export interface OutboxEntry {
6
+ id: string;
7
+ conversation_id: string | null;
8
+ recipient_agent_id: string | null;
9
+ content: string;
10
+ type: string;
11
+ in_reply_to: string | null;
12
+ mentions: string | null;
13
+ status: 'pending' | 'sent' | 'failed';
14
+ retry_count: number;
15
+ last_error: string | null;
16
+ created_at: string;
17
+ sent_at: string | null;
18
+ remote_message_id: string | null;
19
+ }
20
+ /**
21
+ * Enqueue a message to outbox
22
+ */
23
+ export declare function enqueueMessage(db: Database.Database, message: {
24
+ id: string;
25
+ conversationId?: string;
26
+ recipientAgentId?: string;
27
+ content: string;
28
+ type?: string;
29
+ inReplyTo?: string;
30
+ mentions?: string[];
31
+ }): void;
32
+ /**
33
+ * Get pending messages from outbox
34
+ */
35
+ export declare function getPendingMessages(db: Database.Database): OutboxEntry[];
36
+ /**
37
+ * Get all outbox entries
38
+ */
39
+ export declare function getAllOutboxEntries(db: Database.Database): OutboxEntry[];
40
+ /**
41
+ * Mark an outbox entry as sent
42
+ */
43
+ export declare function markMessageSent(db: Database.Database, outboxId: string, remoteMessageId: string): void;
44
+ /**
45
+ * Mark an outbox entry as failed
46
+ */
47
+ export declare function markMessageFailed(db: Database.Database, outboxId: string, error: string): void;
48
+ /**
49
+ * Get retryable messages (retry_count < maxRetries)
50
+ */
51
+ export declare function getRetryableMessages(db: Database.Database, maxRetries: number): OutboxEntry[];
52
+ /**
53
+ * Reset a failed message to pending for retry
54
+ */
55
+ export declare function resetMessageForRetry(db: Database.Database, outboxId: string): void;
56
+ /**
57
+ * Delete an outbox entry
58
+ */
59
+ export declare function deleteOutboxEntry(db: Database.Database, outboxId: string): void;
60
+ /**
61
+ * Get outbox statistics
62
+ */
63
+ export declare function getOutboxStats(db: Database.Database): {
64
+ pending: number;
65
+ failed: number;
66
+ sent: number;
67
+ totalRetries: number;
68
+ };
69
+ /**
70
+ * Clean up old sent entries (older than specified hours)
71
+ */
72
+ export declare function cleanupOldOutboxEntries(db: Database.Database, olderThanHours?: number): number;
73
+ //# sourceMappingURL=outbox-repo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outbox-repo.d.ts","sourceRoot":"","sources":["../../../../src/modules/chat/store/outbox-repo.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAEtC,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAC;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,OAAO,EAAE;IACP,EAAE,EAAE,MAAM,CAAC;IACX,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB,GACA,IAAI,CAeN;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,WAAW,EAAE,CAIvE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,WAAW,EAAE,CAIxE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,QAAQ,EAAE,MAAM,EAChB,eAAe,EAAE,MAAM,GACtB,IAAI,CASN;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,GACZ,IAAI,CAQN;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,UAAU,EAAE,MAAM,GACjB,WAAW,EAAE,CAMf;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,QAAQ,EAAE,MAAM,GACf,IAAI,CAON;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAE/E;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG;IACrD,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;CACtB,CAgBA;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,cAAc,GAAE,MAAW,GAC1B,MAAM,CAOR"}