@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,9 @@
1
+ /**
2
+ * Chat inbox module - public API
3
+ */
4
+ export { getUnreadSummaryData, getUnreadPreview } from './unread-service.js';
5
+ export { peekMessages, readMessages, markAsRead } from './read-service.js';
6
+ export { getHistory, getHistoryWithContext } from './history-service.js';
7
+ export { searchLocalMessages } from './search-service.js';
8
+ export { listConversationsWithUnread, getConversationDetail } from './conversation-service.js';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/modules/chat/inbox/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC7E,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC3E,OAAO,EAAE,UAAU,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AACzE,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,2BAA2B,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Chat inbox module - public API
3
+ */
4
+ export { getUnreadSummaryData, getUnreadPreview } from './unread-service.js';
5
+ export { peekMessages, readMessages, markAsRead } from './read-service.js';
6
+ export { getHistory, getHistoryWithContext } from './history-service.js';
7
+ export { searchLocalMessages } from './search-service.js';
8
+ export { listConversationsWithUnread, getConversationDetail } from './conversation-service.js';
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/modules/chat/inbox/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC7E,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC3E,OAAO,EAAE,UAAU,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AACzE,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,2BAA2B,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Read service - orchestrate read operations with safe mark-as-read
3
+ */
4
+ import Database from 'better-sqlite3';
5
+ export interface ReadResult {
6
+ messages: Array<any>;
7
+ markedRead: number;
8
+ }
9
+ export interface MarkReadTarget {
10
+ type: 'global' | 'conversation' | 'messages';
11
+ id?: string;
12
+ messageIds?: string[];
13
+ }
14
+ /**
15
+ * Peek at unread messages WITHOUT marking as read
16
+ */
17
+ export declare function peekMessages(db: Database.Database, options?: {
18
+ conversationId?: string;
19
+ limit?: number;
20
+ mentionsOnly?: boolean;
21
+ }): ReadResult;
22
+ /**
23
+ * Read messages AND mark as read
24
+ */
25
+ export declare function readMessages(db: Database.Database, options?: {
26
+ conversationId?: string;
27
+ limit?: number;
28
+ mentionsOnly?: boolean;
29
+ }): ReadResult;
30
+ /**
31
+ * Mark messages as read by target
32
+ */
33
+ export declare function markAsRead(db: Database.Database, target: MarkReadTarget, options?: {
34
+ mentionsOnly?: boolean;
35
+ }): number;
36
+ //# sourceMappingURL=read-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-service.d.ts","sourceRoot":"","sources":["../../../../src/modules/chat/inbox/read-service.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAItC,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,QAAQ,GAAG,cAAc,GAAG,UAAU,CAAC;IAC7C,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,OAAO,GAAE;IACP,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,OAAO,CAAC;CACnB,GACL,UAAU,CAmBZ;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,OAAO,GAAE;IACP,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,OAAO,CAAC;CACnB,GACL,UAAU,CAiCZ;AAED;;GAEG;AACH,wBAAgB,UAAU,CACxB,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,MAAM,EAAE,cAAc,EACtB,OAAO,GAAE;IAAE,YAAY,CAAC,EAAE,OAAO,CAAA;CAAO,GACvC,MAAM,CA+BR"}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * Read service - orchestrate read operations with safe mark-as-read
3
+ */
4
+ import { getUnreadMessages } from '../store/message-repo.js';
5
+ import { markConversationRead, markMessagesRead, getUnreadMentions } from '../store/read-state-repo.js';
6
+ /**
7
+ * Peek at unread messages WITHOUT marking as read
8
+ */
9
+ export function peekMessages(db, options = {}) {
10
+ let messages;
11
+ if (options.mentionsOnly) {
12
+ messages = getUnreadMentions(db, {
13
+ conversationId: options.conversationId,
14
+ limit: options.limit,
15
+ });
16
+ }
17
+ else {
18
+ messages = getUnreadMessages(db, {
19
+ conversationId: options.conversationId,
20
+ limit: options.limit,
21
+ });
22
+ }
23
+ return {
24
+ messages,
25
+ markedRead: 0, // Peek doesn't mark as read
26
+ };
27
+ }
28
+ /**
29
+ * Read messages AND mark as read
30
+ */
31
+ export function readMessages(db, options = {}) {
32
+ // First, fetch unread messages
33
+ let messages;
34
+ if (options.mentionsOnly) {
35
+ messages = getUnreadMentions(db, {
36
+ conversationId: options.conversationId,
37
+ limit: options.limit,
38
+ });
39
+ }
40
+ else {
41
+ messages = getUnreadMessages(db, {
42
+ conversationId: options.conversationId,
43
+ limit: options.limit,
44
+ });
45
+ }
46
+ if (messages.length === 0) {
47
+ return { messages: [], markedRead: 0 };
48
+ }
49
+ // Mark them as read in a transaction
50
+ const messageIds = messages.map((m) => m.message_id);
51
+ const transaction = db.transaction(() => {
52
+ return markMessagesRead(db, messageIds);
53
+ });
54
+ const markedRead = transaction();
55
+ return {
56
+ messages,
57
+ markedRead,
58
+ };
59
+ }
60
+ /**
61
+ * Mark messages as read by target
62
+ */
63
+ export function markAsRead(db, target, options = {}) {
64
+ switch (target.type) {
65
+ case 'global':
66
+ // Mark all unread as read across all conversations
67
+ const allConversations = db.prepare(`
68
+ SELECT DISTINCT conversation_id FROM messages m
69
+ JOIN message_local_state ml ON m.message_id = ml.message_id
70
+ WHERE ml.is_read = 0 AND m.sender_id != 'me'
71
+ `).all();
72
+ let totalGlobal = 0;
73
+ for (const conv of allConversations) {
74
+ totalGlobal += markConversationRead(db, conv.conversation_id);
75
+ }
76
+ return totalGlobal;
77
+ case 'conversation':
78
+ if (!target.id) {
79
+ throw new Error('Conversation ID required for conversation-level read');
80
+ }
81
+ return markConversationRead(db, target.id);
82
+ case 'messages':
83
+ if (!target.messageIds || target.messageIds.length === 0) {
84
+ throw new Error('Message IDs required for message-level read');
85
+ }
86
+ return markMessagesRead(db, target.messageIds);
87
+ default:
88
+ throw new Error(`Invalid target type: ${target.type}`);
89
+ }
90
+ }
91
+ //# sourceMappingURL=read-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-service.js","sourceRoot":"","sources":["../../../../src/modules/chat/inbox/read-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Search service - local cache search across messages
3
+ */
4
+ import Database from 'better-sqlite3';
5
+ export interface SearchResult {
6
+ query: string;
7
+ results: Array<any>;
8
+ totalCount: number;
9
+ }
10
+ /**
11
+ * Search local messages
12
+ */
13
+ export declare function searchLocalMessages(db: Database.Database, query: string, options?: {
14
+ conversationId?: string;
15
+ unreadOnly?: boolean;
16
+ limit?: number;
17
+ dateFrom?: string;
18
+ dateTo?: string;
19
+ }): SearchResult;
20
+ //# sourceMappingURL=search-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-service.d.ts","sourceRoot":"","sources":["../../../../src/modules/chat/inbox/search-service.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAGtC,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,KAAK,EAAE,MAAM,EACb,OAAO,GAAE;IACP,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACZ,GACL,YAAY,CAgBd"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Search service - local cache search across messages
3
+ */
4
+ import { searchMessages } from '../store/message-repo.js';
5
+ /**
6
+ * Search local messages
7
+ */
8
+ export function searchLocalMessages(db, query, options = {}) {
9
+ if (!query || query.trim().length === 0) {
10
+ return {
11
+ query,
12
+ results: [],
13
+ totalCount: 0,
14
+ };
15
+ }
16
+ const results = searchMessages(db, query.trim(), options);
17
+ return {
18
+ query,
19
+ results,
20
+ totalCount: results.length,
21
+ };
22
+ }
23
+ //# sourceMappingURL=search-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-service.js","sourceRoot":"","sources":["../../../../src/modules/chat/inbox/search-service.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAQ1D;;GAEG;AACH,MAAM,UAAU,mBAAmB,CACjC,EAAqB,EACrB,KAAa,EACb,UAMI,EAAE;IAEN,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxC,OAAO;YACL,KAAK;YACL,OAAO,EAAE,EAAE;YACX,UAAU,EAAE,CAAC;SACd,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,cAAc,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,OAAO,CAAC,CAAC;IAE1D,OAAO;QACL,KAAK;QACL,OAAO;QACP,UAAU,EAAE,OAAO,CAAC,MAAM;KAC3B,CAAC;AACJ,CAAC"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Unread service - orchestrate unread summary operations
3
+ */
4
+ import Database from 'better-sqlite3';
5
+ export interface UnreadSummaryResult {
6
+ totalUnread: number;
7
+ totalMentions: number;
8
+ byConversation: Array<{
9
+ conversationId: string;
10
+ conversationType: string;
11
+ conversationName: string | null;
12
+ unreadCount: number;
13
+ hasMention: boolean;
14
+ lastUnreadAt: string;
15
+ }>;
16
+ }
17
+ export interface UnreadPreviewResult {
18
+ messages: Array<any>;
19
+ hasHistory: boolean;
20
+ totalUnread: number;
21
+ }
22
+ /**
23
+ * Get comprehensive unread summary
24
+ */
25
+ export declare function getUnreadSummaryData(db: Database.Database, options?: {
26
+ mentionsOnly?: boolean;
27
+ conversationId?: string;
28
+ }): UnreadSummaryResult;
29
+ /**
30
+ * Get unread messages preview with history context
31
+ */
32
+ export declare function getUnreadPreview(db: Database.Database, options?: {
33
+ conversationId?: string;
34
+ limit?: number;
35
+ mentionsOnly?: boolean;
36
+ historyBefore?: number;
37
+ }): UnreadPreviewResult;
38
+ //# sourceMappingURL=unread-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unread-service.d.ts","sourceRoot":"","sources":["../../../../src/modules/chat/inbox/unread-service.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAStC,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,KAAK,CAAC;QACpB,cAAc,EAAE,MAAM,CAAC;QACvB,gBAAgB,EAAE,MAAM,CAAC;QACzB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;QAChC,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,OAAO,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC,CAAC;CACJ;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IACrB,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,OAAO,GAAE;IAAE,YAAY,CAAC,EAAE,OAAO,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAA;CAAO,GAChE,mBAAmB,CAoBrB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,OAAO,GAAE;IACP,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;CACnB,GACL,mBAAmB,CAsCrB"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Unread service - orchestrate unread summary operations
3
+ */
4
+ import { getUnreadSummary, getUnreadMentions, getUnreadCountByMention, getUnreadWithHistory, } from '../store/read-state-repo.js';
5
+ import { getUnreadMessages } from '../store/message-repo.js';
6
+ /**
7
+ * Get comprehensive unread summary
8
+ */
9
+ export function getUnreadSummaryData(db, options = {}) {
10
+ const summary = getUnreadSummary(db);
11
+ const totalMentions = getUnreadCountByMention(db, options.conversationId);
12
+ const filtered = options.conversationId
13
+ ? summary.filter(s => s.conversation_id === options.conversationId)
14
+ : summary;
15
+ return {
16
+ totalUnread: filtered.reduce((sum, s) => sum + s.unread_count, 0),
17
+ totalMentions,
18
+ byConversation: filtered.map(s => ({
19
+ conversationId: s.conversation_id,
20
+ conversationType: s.conversation_type,
21
+ conversationName: s.conversation_name,
22
+ unreadCount: s.unread_count,
23
+ hasMention: s.has_mention,
24
+ lastUnreadAt: s.last_unread_at,
25
+ })),
26
+ };
27
+ }
28
+ /**
29
+ * Get unread messages preview with history context
30
+ */
31
+ export function getUnreadPreview(db, options = {}) {
32
+ if (options.mentionsOnly) {
33
+ const mentions = getUnreadMentions(db, {
34
+ conversationId: options.conversationId,
35
+ limit: options.limit,
36
+ });
37
+ return {
38
+ messages: mentions,
39
+ hasHistory: false,
40
+ totalUnread: mentions.length,
41
+ };
42
+ }
43
+ if (options.historyBefore) {
44
+ const withHistory = getUnreadWithHistory(db, {
45
+ conversationId: options.conversationId,
46
+ historyBefore: options.historyBefore,
47
+ limit: options.limit,
48
+ });
49
+ return {
50
+ messages: withHistory,
51
+ hasHistory: true,
52
+ totalUnread: withHistory.filter(m => m.is_read === 0).length,
53
+ };
54
+ }
55
+ const messages = getUnreadMessages(db, {
56
+ conversationId: options.conversationId,
57
+ limit: options.limit,
58
+ });
59
+ return {
60
+ messages,
61
+ hasHistory: false,
62
+ totalUnread: messages.length,
63
+ };
64
+ }
65
+ //# sourceMappingURL=unread-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unread-service.js","sourceRoot":"","sources":["../../../../src/modules/chat/inbox/unread-service.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAqB7D;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAClC,EAAqB,EACrB,UAA+D,EAAE;IAEjE,MAAM,OAAO,GAAG,gBAAgB,CAAC,EAAE,CAAC,CAAC;IACrC,MAAM,aAAa,GAAG,uBAAuB,CAAC,EAAE,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;IAE1E,MAAM,QAAQ,GAAG,OAAO,CAAC,cAAc;QACrC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,eAAe,KAAK,OAAO,CAAC,cAAc,CAAC;QACnE,CAAC,CAAC,OAAO,CAAC;IAEZ,OAAO;QACL,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC;QACjE,aAAa;QACb,cAAc,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACjC,cAAc,EAAE,CAAC,CAAC,eAAe;YACjC,gBAAgB,EAAE,CAAC,CAAC,iBAAiB;YACrC,gBAAgB,EAAE,CAAC,CAAC,iBAAiB;YACrC,WAAW,EAAE,CAAC,CAAC,YAAY;YAC3B,UAAU,EAAE,CAAC,CAAC,WAAW;YACzB,YAAY,EAAE,CAAC,CAAC,cAAc;SAC/B,CAAC,CAAC;KACJ,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAC9B,EAAqB,EACrB,UAKI,EAAE;IAEN,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,iBAAiB,CAAC,EAAE,EAAE;YACrC,cAAc,EAAE,OAAO,CAAC,cAAc;YACtC,KAAK,EAAE,OAAO,CAAC,KAAK;SACrB,CAAC,CAAC;QAEH,OAAO;YACL,QAAQ,EAAE,QAAQ;YAClB,UAAU,EAAE,KAAK;YACjB,WAAW,EAAE,QAAQ,CAAC,MAAM;SAC7B,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;QAC1B,MAAM,WAAW,GAAG,oBAAoB,CAAC,EAAE,EAAE;YAC3C,cAAc,EAAE,OAAO,CAAC,cAAc;YACtC,aAAa,EAAE,OAAO,CAAC,aAAa;YACpC,KAAK,EAAE,OAAO,CAAC,KAAK;SACrB,CAAC,CAAC;QAEH,OAAO;YACL,QAAQ,EAAE,WAAW;YACrB,UAAU,EAAE,IAAI;YAChB,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,MAAM;SAC7D,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,iBAAiB,CAAC,EAAE,EAAE;QACrC,cAAc,EAAE,OAAO,CAAC,cAAc;QACtC,KAAK,EAAE,OAAO,CAAC,KAAK;KACrB,CAAC,CAAC;IAEH,OAAO;QACL,QAAQ;QACR,UAAU,EAAE,KAAK;QACjB,WAAW,EAAE,QAAQ,CAAC,MAAM;KAC7B,CAAC;AACJ,CAAC"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Message rendering service - format messages for display
3
+ */
4
+ import type { MessageRecord, MessageLocalState } from '../store/message-repo.js';
5
+ export interface RenderOptions {
6
+ showTimestamps?: boolean;
7
+ showReadStatus?: boolean;
8
+ showMentions?: boolean;
9
+ showStatus?: boolean;
10
+ }
11
+ /**
12
+ * Render a single message for plain-text display
13
+ */
14
+ export declare function renderMessage(msg: MessageRecord & Partial<MessageLocalState> & {
15
+ conversation_name?: string | null;
16
+ }, options?: RenderOptions): string;
17
+ /**
18
+ * Render a list of messages
19
+ */
20
+ export declare function renderMessageList(messages: Array<MessageRecord & Partial<MessageLocalState> & {
21
+ conversation_name?: string | null;
22
+ }>, options?: RenderOptions & {
23
+ groupByConversation?: boolean;
24
+ }): string;
25
+ /**
26
+ * Render a history block with optional unread marker
27
+ */
28
+ export declare function renderHistoryBlock(messages: Array<MessageRecord & Partial<MessageLocalState>>, options?: {
29
+ unreadMarker?: string;
30
+ }): string;
31
+ /**
32
+ * Render message to JSON format
33
+ */
34
+ export declare function renderMessageJSON(msg: MessageRecord & Partial<MessageLocalState>): object;
35
+ //# sourceMappingURL=message-render.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-render.d.ts","sourceRoot":"","sources":["../../../../src/modules/chat/render/message-render.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAEjF,MAAM,WAAW,aAAa;IAC5B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AASD;;GAEG;AACH,wBAAgB,aAAa,CAC3B,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,iBAAiB,CAAC,GAAG;IAAE,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,EACvF,OAAO,GAAE,aAAkB,GAC1B,MAAM,CAiCR;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,KAAK,CAAC,aAAa,GAAG,OAAO,CAAC,iBAAiB,CAAC,GAAG;IAAE,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,EACnG,OAAO,GAAE,aAAa,GAAG;IAAE,mBAAmB,CAAC,EAAE,OAAO,CAAA;CAAO,GAC9D,MAAM,CAyBR;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,KAAK,CAAC,aAAa,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC,EAC3D,OAAO,GAAE;IAAE,YAAY,CAAC,EAAE,MAAM,CAAA;CAAO,GACtC,MAAM,CA6BR;AAyBD;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,iBAAiB,CAAC,GAC9C,MAAM,CAcR"}
@@ -0,0 +1,129 @@
1
+ /**
2
+ * Message rendering service - format messages for display
3
+ */
4
+ const DEFAULT_OPTIONS = {
5
+ showTimestamps: true,
6
+ showReadStatus: true,
7
+ showMentions: true,
8
+ showStatus: true,
9
+ };
10
+ /**
11
+ * Render a single message for plain-text display
12
+ */
13
+ export function renderMessage(msg, options = {}) {
14
+ const opts = { ...DEFAULT_OPTIONS, ...options };
15
+ const lines = [];
16
+ // Status badge
17
+ if (opts.showStatus && msg.status !== 'sent') {
18
+ const badge = msg.status === 'edited' ? '[edited] ' :
19
+ msg.status === 'withdrawn' ? '[withdrawn] ' :
20
+ msg.status === 'deleted' ? '[deleted] ' : '';
21
+ lines.push(` ${badge}`);
22
+ }
23
+ // Timestamp + sender
24
+ const timestamp = opts.showTimestamps ? formatTime(msg.remote_created_at) : '';
25
+ const mention = opts.showMentions && msg.is_mentioned ? ' @' : '';
26
+ const sender = msg.sender_id;
27
+ lines.push(` ${timestamp}${mention}${sender}:`);
28
+ // Content
29
+ if (msg.content) {
30
+ lines.push(` ${msg.content}`);
31
+ }
32
+ else {
33
+ lines.push(` <no content>`);
34
+ }
35
+ // Read status
36
+ if (opts.showReadStatus && msg.is_read !== undefined) {
37
+ const status = msg.is_read ? '✓' : '●';
38
+ lines.push(` [${status}]`);
39
+ }
40
+ return lines.join('\n');
41
+ }
42
+ /**
43
+ * Render a list of messages
44
+ */
45
+ export function renderMessageList(messages, options = {}) {
46
+ if (messages.length === 0) {
47
+ return 'No messages found.';
48
+ }
49
+ const lines = [];
50
+ let lastConvId = null;
51
+ for (const msg of messages) {
52
+ // Group separator
53
+ if (options.groupByConversation && msg.conversation_id !== lastConvId) {
54
+ if (lines.length > 0) {
55
+ lines.push('');
56
+ }
57
+ const convName = msg.conversation_name || msg.conversation_id.substring(0, 12);
58
+ lines.push(`Conversation: ${convName}`);
59
+ lines.push('─'.repeat(40));
60
+ lastConvId = msg.conversation_id;
61
+ }
62
+ lines.push(renderMessage(msg, options));
63
+ lines.push('');
64
+ }
65
+ return lines.join('\n');
66
+ }
67
+ /**
68
+ * Render a history block with optional unread marker
69
+ */
70
+ export function renderHistoryBlock(messages, options = {}) {
71
+ if (messages.length === 0) {
72
+ return 'No messages in history.';
73
+ }
74
+ const lines = [];
75
+ const unreadMarker = options.unreadMarker || '─── Unread messages below ───';
76
+ let markerShown = false;
77
+ // Sort by timestamp
78
+ const sorted = [...messages].sort((a, b) => new Date(a.remote_created_at).getTime() - new Date(b.remote_created_at).getTime());
79
+ for (const msg of sorted) {
80
+ // Insert marker before first unread message
81
+ if (!markerShown && msg.is_read === 0) {
82
+ lines.push('');
83
+ lines.push(unreadMarker);
84
+ lines.push('');
85
+ markerShown = true;
86
+ }
87
+ lines.push(renderMessage(msg, { showReadStatus: false }));
88
+ lines.push('');
89
+ }
90
+ return lines.join('\n');
91
+ }
92
+ /**
93
+ * Format a timestamp for display
94
+ */
95
+ function formatTime(isoString) {
96
+ const date = new Date(isoString);
97
+ const now = new Date();
98
+ const diff = now.getTime() - date.getTime();
99
+ // Today: show time only
100
+ if (diff < 24 * 60 * 60 * 1000) {
101
+ return date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' }) + ' ';
102
+ }
103
+ // This week: show day + time
104
+ if (diff < 7 * 24 * 60 * 60 * 1000) {
105
+ return date.toLocaleDateString([], { weekday: 'short' }) + ' ' +
106
+ date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' }) + ' ';
107
+ }
108
+ // Older: show date
109
+ return date.toLocaleDateString() + ' ';
110
+ }
111
+ /**
112
+ * Render message to JSON format
113
+ */
114
+ export function renderMessageJSON(msg) {
115
+ return {
116
+ messageId: msg.message_id,
117
+ conversationId: msg.conversation_id,
118
+ senderId: msg.sender_id,
119
+ content: msg.content,
120
+ type: msg.type,
121
+ status: msg.status,
122
+ inReplyTo: msg.in_reply_to,
123
+ mentions: msg.mentions ? JSON.parse(msg.mentions) : null,
124
+ createdAt: msg.remote_created_at,
125
+ isRead: msg.is_read === 1,
126
+ isMentioned: msg.is_mentioned === 1,
127
+ };
128
+ }
129
+ //# sourceMappingURL=message-render.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-render.js","sourceRoot":"","sources":["../../../../src/modules/chat/render/message-render.ts"],"names":[],"mappings":"AAAA;;GAEG;AAWH,MAAM,eAAe,GAA4B;IAC/C,cAAc,EAAE,IAAI;IACpB,cAAc,EAAE,IAAI;IACpB,YAAY,EAAE,IAAI;IAClB,UAAU,EAAE,IAAI;CACjB,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,aAAa,CAC3B,GAAuF,EACvF,UAAyB,EAAE;IAE3B,MAAM,IAAI,GAAG,EAAE,GAAG,eAAe,EAAE,GAAG,OAAO,EAAE,CAAC;IAChD,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,eAAe;IACf,IAAI,IAAI,CAAC,UAAU,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QAC7C,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;YACvC,GAAG,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC;gBAC7C,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3D,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC;IAC3B,CAAC;IAED,qBAAqB;IACrB,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/E,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,IAAI,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IAClE,MAAM,MAAM,GAAG,GAAG,CAAC,SAAS,CAAC;IAE7B,KAAK,CAAC,IAAI,CAAC,KAAK,SAAS,GAAG,OAAO,GAAG,MAAM,GAAG,CAAC,CAAC;IAEjD,UAAU;IACV,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;QAChB,KAAK,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IACnC,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IACjC,CAAC;IAED,cAAc;IACd,IAAI,IAAI,CAAC,cAAc,IAAI,GAAG,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QACrD,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;QACvC,KAAK,CAAC,IAAI,CAAC,QAAQ,MAAM,GAAG,CAAC,CAAC;IAChC,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAC/B,QAAmG,EACnG,UAA6D,EAAE;IAE/D,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,oBAAoB,CAAC;IAC9B,CAAC;IAED,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,UAAU,GAAkB,IAAI,CAAC;IAErC,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,kBAAkB;QAClB,IAAI,OAAO,CAAC,mBAAmB,IAAI,GAAG,CAAC,eAAe,KAAK,UAAU,EAAE,CAAC;YACtE,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACrB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACjB,CAAC;YACD,MAAM,QAAQ,GAAG,GAAG,CAAC,iBAAiB,IAAI,GAAG,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC/E,KAAK,CAAC,IAAI,CAAC,iBAAiB,QAAQ,EAAE,CAAC,CAAC;YACxC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;YAC3B,UAAU,GAAG,GAAG,CAAC,eAAe,CAAC;QACnC,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;QACxC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAChC,QAA2D,EAC3D,UAAqC,EAAE;IAEvC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,yBAAyB,CAAC;IACnC,CAAC;IAED,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,+BAA+B,CAAC;IAE7E,IAAI,WAAW,GAAG,KAAK,CAAC;IAExB,oBAAoB;IACpB,MAAM,MAAM,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACzC,IAAI,IAAI,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,OAAO,EAAE,CAClF,CAAC;IAEF,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;QACzB,4CAA4C;QAC5C,IAAI,CAAC,WAAW,IAAI,GAAG,CAAC,OAAO,KAAK,CAAC,EAAE,CAAC;YACtC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACzB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,WAAW,GAAG,IAAI,CAAC;QACrB,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QAC1D,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,SAAS,UAAU,CAAC,SAAiB;IACnC,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC;IACjC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;IAE5C,wBAAwB;IACxB,IAAI,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC,kBAAkB,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,GAAG,GAAG,CAAC;IACnF,CAAC;IAED,6BAA6B;IAC7B,IAAI,IAAI,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC;QACnC,OAAO,IAAI,CAAC,kBAAkB,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,GAAG,GAAG;YACvD,IAAI,CAAC,kBAAkB,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,GAAG,GAAG,CAAC;IACnF,CAAC;IAED,mBAAmB;IACnB,OAAO,IAAI,CAAC,kBAAkB,EAAE,GAAG,GAAG,CAAC;AACzC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAC/B,GAA+C;IAE/C,OAAO;QACL,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,cAAc,EAAE,GAAG,CAAC,eAAe;QACnC,QAAQ,EAAE,GAAG,CAAC,SAAS;QACvB,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,SAAS,EAAE,GAAG,CAAC,WAAW;QAC1B,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI;QACxD,SAAS,EAAE,GAAG,CAAC,iBAAiB;QAChC,MAAM,EAAE,GAAG,CAAC,OAAO,KAAK,CAAC;QACzB,WAAW,EAAE,GAAG,CAAC,YAAY,KAAK,CAAC;KACpC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Conversation service - orchestrate conversation management with cache
3
+ */
4
+ import Database from 'better-sqlite3';
5
+ export interface CreateResult {
6
+ conversationId: string;
7
+ cached: boolean;
8
+ }
9
+ export interface MemberResult {
10
+ agentId: string;
11
+ role: string;
12
+ cached: boolean;
13
+ }
14
+ /**
15
+ * Create a conversation and cache locally
16
+ */
17
+ export declare function createConversation(db: Database.Database, accessToken: string, options: {
18
+ type: 'direct' | 'group';
19
+ name?: string;
20
+ members?: string[];
21
+ }): Promise<CreateResult>;
22
+ /**
23
+ * Invite a member and update cache
24
+ */
25
+ export declare function inviteMember(db: Database.Database, accessToken: string, conversationId: string, agentId: string, role?: 'owner' | 'admin' | 'member'): Promise<MemberResult>;
26
+ /**
27
+ * Remove a member and update cache
28
+ */
29
+ export declare function removeMember(db: Database.Database, accessToken: string, conversationId: string, agentId: string): Promise<{
30
+ agentId: string;
31
+ cached: boolean;
32
+ }>;
33
+ /**
34
+ * Update member role and update cache
35
+ */
36
+ export declare function updateRole(db: Database.Database, accessToken: string, conversationId: string, agentId: string, role: 'owner' | 'admin' | 'member'): Promise<MemberResult>;
37
+ /**
38
+ * Leave a conversation and update cache
39
+ */
40
+ export declare function leaveConversation(db: Database.Database, accessToken: string, conversationId: string): Promise<{
41
+ conversationId: string;
42
+ cached: boolean;
43
+ }>;
44
+ /**
45
+ * Update conversation and cache
46
+ */
47
+ export declare function updateConversation(db: Database.Database, accessToken: string, conversationId: string, updates: {
48
+ name?: string;
49
+ }): Promise<{
50
+ conversationId: string;
51
+ cached: boolean;
52
+ }>;
53
+ //# sourceMappingURL=conversation-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation-service.d.ts","sourceRoot":"","sources":["../../../../src/modules/chat/send/conversation-service.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAWtC,MAAM,WAAW,YAAY;IAC3B,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;CACjB;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE;IACP,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB,GACA,OAAO,CAAC,YAAY,CAAC,CA6BvB;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,OAAO,GAAG,OAAO,GAAG,QAAmB,GAC5C,OAAO,CAAC,YAAY,CAAC,CAcvB;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC,CAU/C;AAED;;GAEG;AACH,wBAAsB,UAAU,CAC9B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,QAAQ,GACjC,OAAO,CAAC,YAAY,CAAC,CAcvB;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC;IAAE,cAAc,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC,CAYtD;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GACzB,OAAO,CAAC;IAAE,cAAc,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC,CActD"}