@leemour/cli-messaging 0.88.0 → 0.89.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 (104) hide show
  1. package/dist/cli/bot/port.d.ts +29 -0
  2. package/dist/cli/bot/port.d.ts.map +1 -0
  3. package/dist/cli/bot/port.js +2 -0
  4. package/dist/cli/bot/port.js.map +1 -0
  5. package/dist/cli/bot/registry.d.ts +37 -0
  6. package/dist/cli/bot/registry.d.ts.map +1 -0
  7. package/dist/cli/bot/registry.js +94 -0
  8. package/dist/cli/bot/registry.js.map +1 -0
  9. package/dist/cli/bot/token.d.ts +25 -0
  10. package/dist/cli/bot/token.d.ts.map +1 -0
  11. package/dist/cli/bot/token.js +36 -0
  12. package/dist/cli/bot/token.js.map +1 -0
  13. package/dist/cli/index.d.ts +4 -0
  14. package/dist/cli/index.d.ts.map +1 -1
  15. package/dist/cli/index.js +3 -0
  16. package/dist/cli/index.js.map +1 -1
  17. package/dist/cli/messenger/after.d.ts +18 -5
  18. package/dist/cli/messenger/after.d.ts.map +1 -1
  19. package/dist/cli/messenger/after.js +19 -31
  20. package/dist/cli/messenger/after.js.map +1 -1
  21. package/dist/cli/messenger/conversations-command.d.ts +10 -0
  22. package/dist/cli/messenger/conversations-command.d.ts.map +1 -0
  23. package/dist/cli/messenger/conversations-command.js +101 -0
  24. package/dist/cli/messenger/conversations-command.js.map +1 -0
  25. package/dist/cli/messenger/messages-command.d.ts.map +1 -1
  26. package/dist/cli/messenger/messages-command.js +6 -7
  27. package/dist/cli/messenger/messages-command.js.map +1 -1
  28. package/dist/cli/messenger/server-command.d.ts.map +1 -1
  29. package/dist/cli/messenger/server-command.js +18 -9
  30. package/dist/cli/messenger/server-command.js.map +1 -1
  31. package/dist/cli/messenger/store-maintenance-command.d.ts.map +1 -1
  32. package/dist/cli/messenger/store-maintenance-command.js +34 -0
  33. package/dist/cli/messenger/store-maintenance-command.js.map +1 -1
  34. package/dist/conversations/link.d.ts +2 -2
  35. package/dist/conversations/link.d.ts.map +1 -1
  36. package/dist/conversations/link.js +6 -4
  37. package/dist/conversations/link.js.map +1 -1
  38. package/dist/domain/models.d.ts +2 -0
  39. package/dist/domain/models.d.ts.map +1 -1
  40. package/dist/mcp/confirm.js +1 -1
  41. package/dist/mcp/confirm.js.map +1 -1
  42. package/dist/mcp/tool.d.ts +2 -0
  43. package/dist/mcp/tool.d.ts.map +1 -1
  44. package/dist/mcp/tool.js +2 -0
  45. package/dist/mcp/tool.js.map +1 -1
  46. package/dist/mcp/tools/chats.d.ts.map +1 -1
  47. package/dist/mcp/tools/chats.js +13 -8
  48. package/dist/mcp/tools/chats.js.map +1 -1
  49. package/dist/mcp/tools/conversations.d.ts +5 -0
  50. package/dist/mcp/tools/conversations.d.ts.map +1 -0
  51. package/dist/mcp/tools/conversations.js +56 -0
  52. package/dist/mcp/tools/conversations.js.map +1 -0
  53. package/dist/mcp/tools/inbox.js +3 -3
  54. package/dist/mcp/tools/inbox.js.map +1 -1
  55. package/dist/mcp/tools/messages-send.js +4 -4
  56. package/dist/mcp/tools/messages-send.js.map +1 -1
  57. package/dist/mcp/tools/messages.d.ts.map +1 -1
  58. package/dist/mcp/tools/messages.js +25 -18
  59. package/dist/mcp/tools/messages.js.map +1 -1
  60. package/dist/mcp/tools/review.d.ts.map +1 -1
  61. package/dist/mcp/tools/review.js +3 -3
  62. package/dist/mcp/tools/review.js.map +1 -1
  63. package/dist/mcp/tools.d.ts.map +1 -1
  64. package/dist/mcp/tools.js +2 -0
  65. package/dist/mcp/tools.js.map +1 -1
  66. package/dist/parity/bin.js +15 -2
  67. package/dist/parity/bin.js.map +1 -1
  68. package/dist/parity/index.d.ts +1 -0
  69. package/dist/parity/index.d.ts.map +1 -1
  70. package/dist/parity/index.js +1 -0
  71. package/dist/parity/index.js.map +1 -1
  72. package/dist/parity/wording.d.ts +7 -0
  73. package/dist/parity/wording.d.ts.map +1 -0
  74. package/dist/parity/wording.js +31 -0
  75. package/dist/parity/wording.js.map +1 -0
  76. package/dist/sends/permissions.js +1 -1
  77. package/dist/sends/permissions.js.map +1 -1
  78. package/dist/services/conversations.d.ts +45 -0
  79. package/dist/services/conversations.d.ts.map +1 -0
  80. package/dist/services/conversations.js +92 -0
  81. package/dist/services/conversations.js.map +1 -0
  82. package/dist/services/index.d.ts +4 -0
  83. package/dist/services/index.d.ts.map +1 -1
  84. package/dist/services/index.js +3 -0
  85. package/dist/services/index.js.map +1 -1
  86. package/dist/store/sqlite/conversations.d.ts +45 -0
  87. package/dist/store/sqlite/conversations.d.ts.map +1 -0
  88. package/dist/store/sqlite/conversations.js +309 -0
  89. package/dist/store/sqlite/conversations.js.map +1 -0
  90. package/dist/store/sqlite/messages.d.ts.map +1 -1
  91. package/dist/store/sqlite/messages.js +2 -0
  92. package/dist/store/sqlite/messages.js.map +1 -1
  93. package/dist/store/sqlite/reads.d.ts +50 -0
  94. package/dist/store/sqlite/reads.d.ts.map +1 -1
  95. package/dist/store/sqlite/reads.js +2 -1
  96. package/dist/store/sqlite/reads.js.map +1 -1
  97. package/dist/store/sqlite/search.d.ts +33 -0
  98. package/dist/store/sqlite/search.d.ts.map +1 -1
  99. package/dist/store/store.d.ts +70 -0
  100. package/dist/store/store.d.ts.map +1 -1
  101. package/dist/store/store.js +46 -0
  102. package/dist/store/store.js.map +1 -1
  103. package/package.json +1 -1
  104. package/parity.json +43 -17
@@ -192,7 +192,7 @@ const HOUSEKEEPING = new Set([
192
192
  const BOT_HOUSEKEEPING = new Set(["auth", "list", "sends", "recipients", "mcp"]);
193
193
  const STORE_MAINTENANCE = new Set(["info", "check", "migrate", "backup", "restore"]);
194
194
  /** Commands outside `messages` that print what people wrote, so `deny messages` reaches them too. */
195
- const SHOW_MESSAGES = new Set(["inbox", "review", "watch", "serve", "store"]);
195
+ const SHOW_MESSAGES = new Set(["inbox", "review", "watch", "serve", "store", "conversations"]);
196
196
  /**
197
197
  * The key a command path is checked against: `null` for housekeeping, which no level stops, and
198
198
  * `undefined` for a path this package does not know — a CLI's own command, which its CLI maps.
@@ -1 +1 @@
1
- {"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../src/sends/permissions.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../src/sends/permissions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ import type { Id, Message, Page } from "../domain/models.js";
2
+ import type { ConversationSummary, StoredLink } from "../store/store.js";
3
+ import type { ServiceDeps } from "./deps.js";
4
+ export interface Built {
5
+ chat: Id;
6
+ messages: number;
7
+ links: number;
8
+ conversations: number;
9
+ builtAt: string;
10
+ rulesVersion: number;
11
+ }
12
+ export interface MessageLinks {
13
+ chat: Id;
14
+ message: Id;
15
+ /** The message's own links; `chosen` is the one its conversation follows. */
16
+ links: (StoredLink & {
17
+ chosen: boolean;
18
+ })[];
19
+ /** Its chosen parents back to where the conversation starts, nearest first. */
20
+ chain: Id[];
21
+ }
22
+ /**
23
+ * Conversations inside a chat, built from the store alone by rules (phase 3): replies, mentions and one
24
+ * sender's messages in a row. Nothing is built on sync; a chat has conversations once `build` ran for it.
25
+ */
26
+ export interface ConversationsService {
27
+ build(chat: string): Promise<Built>;
28
+ list(chat: string, window: {
29
+ limit: number;
30
+ since?: string;
31
+ }): Promise<Page<ConversationSummary>>;
32
+ /** By the conversation's id, or as the conversation a message is in. */
33
+ show(target: {
34
+ id: string;
35
+ } | {
36
+ chat: string;
37
+ message: Id;
38
+ }): Promise<{
39
+ summary: ConversationSummary;
40
+ messages: Message[];
41
+ }>;
42
+ links(chat: string, message: Id): Promise<MessageLinks>;
43
+ }
44
+ export declare const conversationsService: (deps: ServiceDeps) => ConversationsService;
45
+ //# sourceMappingURL=conversations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversations.d.ts","sourceRoot":"","sources":["../../src/services/conversations.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAA;AAC5D,OAAO,KAAK,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AACxE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAS5C,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,EAAE,CAAA;IACR,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,aAAa,EAAE,MAAM,CAAA;IACrB,OAAO,EAAE,MAAM,CAAA;IACf,YAAY,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,EAAE,CAAA;IACR,OAAO,EAAE,EAAE,CAAA;IACX,6EAA6E;IAC7E,KAAK,EAAE,CAAC,UAAU,GAAG;QAAE,MAAM,EAAE,OAAO,CAAA;KAAE,CAAC,EAAE,CAAA;IAC3C,+EAA+E;IAC/E,KAAK,EAAE,EAAE,EAAE,CAAA;CACZ;AAED;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAA;IACnC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAA;IACjG,wEAAwE;IACxE,IAAI,CACF,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,EAAE,CAAA;KAAE,GACrD,OAAO,CAAC;QAAE,OAAO,EAAE,mBAAmB,CAAC;QAAC,QAAQ,EAAE,OAAO,EAAE,CAAA;KAAE,CAAC,CAAA;IACjE,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,GAAG,OAAO,CAAC,YAAY,CAAC,CAAA;CACxD;AAED,eAAO,MAAM,oBAAoB,SAAU,WAAW,KAAG,oBAuFxD,CAAA"}
@@ -0,0 +1,92 @@
1
+ import { CliError } from "@leemour/cli-core";
2
+ import { linkMessages, RULES_VERSION } from "../conversations/link.js";
3
+ import { storedChatId } from "./messages.js";
4
+ /** A page of messages handed to the rules at a time; reading is quick, the rules hold a 50-message window. */
5
+ const READ_PAGE = 5_000;
6
+ /** How far `links` follows a message's chosen parents back. */
7
+ const CHAIN = 50;
8
+ export const conversationsService = (deps) => {
9
+ const found = async (chat) => {
10
+ const store = await deps.store();
11
+ const account = await deps.account();
12
+ return { store, account, chatId: await storedChatId(deps.messenger, chat, store, account) };
13
+ };
14
+ const notBuilt = (chatId) => new CliError("not_found", `chat ${chatId} has no conversations yet — \`${deps.messenger.app.command} conversations build --chat ${chatId}\``);
15
+ return {
16
+ build: async (chat) => {
17
+ const { store, account, chatId } = await found(chat);
18
+ const startedAt = Date.now();
19
+ const inputs = [];
20
+ let after;
21
+ for (;;) {
22
+ const page = await store.linkInputs(account, chatId, { limit: READ_PAGE, ...(after ? { after } : {}) });
23
+ inputs.push(...page.items);
24
+ if (page.next === null)
25
+ break;
26
+ after = page.next;
27
+ }
28
+ if (inputs.length === 0) {
29
+ throw new CliError("not_found", `the store holds no messages of chat ${chatId} — fetch them first`);
30
+ }
31
+ const { links, conversations } = linkMessages(inputs, { handles: await store.senderHandles(account, chatId) });
32
+ await store.replaceConversations(account, chatId, {
33
+ startedAt,
34
+ algorithmVersion: RULES_VERSION,
35
+ links,
36
+ conversations,
37
+ });
38
+ return {
39
+ chat: chatId,
40
+ messages: inputs.length,
41
+ links: links.length,
42
+ conversations: conversations.length,
43
+ builtAt: new Date(startedAt).toISOString(),
44
+ rulesVersion: RULES_VERSION,
45
+ };
46
+ },
47
+ list: async (chat, { limit, since }) => {
48
+ const { store, account, chatId } = await found(chat);
49
+ if (!(await store.conversationState(account, chatId))?.builtAt)
50
+ throw notBuilt(chatId);
51
+ return store.conversations(account, chatId, { limit, ...(since === undefined ? {} : { after: since }) });
52
+ },
53
+ show: async (target) => {
54
+ const store = await deps.store();
55
+ const account = await deps.account();
56
+ let id;
57
+ if ("id" in target) {
58
+ id = target.id;
59
+ }
60
+ else {
61
+ const { chatId } = await found(target.chat);
62
+ const of = await store.conversationOf(account, chatId, target.message);
63
+ if (of === undefined) {
64
+ if (!(await store.conversationState(account, chatId))?.builtAt)
65
+ throw notBuilt(chatId);
66
+ throw new CliError("not_found", `message ${target.message} is in no conversation of chat ${chatId}`);
67
+ }
68
+ id = of;
69
+ }
70
+ const conversation = await store.conversation(account, id);
71
+ if (!conversation) {
72
+ throw new CliError("not_found", `no conversation ${id} — a rebuild gives new ids; \`conversations list\``);
73
+ }
74
+ return conversation;
75
+ },
76
+ links: async (chat, message) => {
77
+ const { store, account, chatId } = await found(chat);
78
+ const chosenOf = (links) => links.find((link) => !link.stale);
79
+ const own = await store.links(account, chatId, message);
80
+ const chosen = chosenOf(own);
81
+ const chain = [];
82
+ for (let parent = chosen?.parentId ?? null; parent !== null && chain.length < CHAIN;) {
83
+ if (chain.includes(parent))
84
+ break;
85
+ chain.push(parent);
86
+ parent = chosenOf(await store.links(account, chatId, parent))?.parentId ?? null;
87
+ }
88
+ return { chat: chatId, message, links: own.map((link) => ({ ...link, chosen: link === chosen })), chain };
89
+ },
90
+ };
91
+ };
92
+ //# sourceMappingURL=conversations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversations.js","sourceRoot":"","sources":["../../src/services/conversations.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,7 @@ import { type AccountService } from "./account.js";
2
2
  import { type AdminService } from "./admin.js";
3
3
  import { type ArchiveService } from "./archive.js";
4
4
  import { type ChatsService } from "./chats.js";
5
+ import { type ConversationsService } from "./conversations.js";
5
6
  import type { ServiceDeps } from "./deps.js";
6
7
  import { type FoldersService } from "./folders.js";
7
8
  import { type InboxService } from "./inbox.js";
@@ -16,6 +17,8 @@ export type { ArchiveService, Fetched, FetchOptions } from "./archive.js";
16
17
  export { archiveService } from "./archive.js";
17
18
  export type { ChatFilter, ChatsService, MarkedRead, PageWindow } from "./chats.js";
18
19
  export { CHAT_SCAN, chatsService, EVENTS_DAYS } from "./chats.js";
20
+ export type { Built, ConversationsService, MessageLinks } from "./conversations.js";
21
+ export { conversationsService } from "./conversations.js";
19
22
  export type { ServiceDeps } from "./deps.js";
20
23
  export { OFFLINE, onlineDeps, storedDeps } from "./deps.js";
21
24
  export type { FolderEdit, FoldersService } from "./folders.js";
@@ -38,6 +41,7 @@ export interface Services {
38
41
  folders: FoldersService;
39
42
  account: AccountService;
40
43
  moderation: ModerationService;
44
+ conversations: ConversationsService;
41
45
  }
42
46
  /**
43
47
  * How a CLI replaces a use case: it returns the services it changes, whole, and can call the shared
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAkB,MAAM,cAAc,CAAA;AAClE,OAAO,EAAE,KAAK,YAAY,EAAgB,MAAM,YAAY,CAAA;AAC5D,OAAO,EAAE,KAAK,cAAc,EAAkB,MAAM,cAAc,CAAA;AAClE,OAAO,EAAE,KAAK,YAAY,EAAgB,MAAM,YAAY,CAAA;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAC5C,OAAO,EAAE,KAAK,cAAc,EAAkB,MAAM,cAAc,CAAA;AAClE,OAAO,EAAE,KAAK,YAAY,EAAgB,MAAM,YAAY,CAAA;AAC5D,OAAO,EAAE,KAAK,eAAe,EAAmB,MAAM,eAAe,CAAA;AACrE,OAAO,EAAE,KAAK,iBAAiB,EAAqB,MAAM,iBAAiB,CAAA;AAC3E,OAAO,EAAE,KAAK,aAAa,EAAiB,MAAM,aAAa,CAAA;AAE/D,YAAY,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAC7C,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AACzC,YAAY,EAAE,cAAc,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AACzE,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAC7C,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAClF,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AACjE,YAAY,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAC5C,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AAC3D,YAAY,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAC7C,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AACzC,YAAY,EACV,YAAY,EACZ,UAAU,EACV,eAAe,EACf,aAAa,EACb,MAAM,EACN,OAAO,EACP,WAAW,EACX,WAAW,GACZ,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAC7E,YAAY,EAAE,eAAe,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACrF,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AACnD,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC7D,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAEpD,MAAM,WAAW,QAAQ;IACvB,QAAQ,EAAE,eAAe,CAAA;IACzB,KAAK,EAAE,YAAY,CAAA;IACnB,MAAM,EAAE,aAAa,CAAA;IACrB,KAAK,EAAE,YAAY,CAAA;IACnB,OAAO,EAAE,cAAc,CAAA;IACvB,KAAK,EAAE,YAAY,CAAA;IACnB,OAAO,EAAE,cAAc,CAAA;IACvB,OAAO,EAAE,cAAc,CAAA;IACvB,UAAU,EAAE,iBAAiB,CAAA;CAC9B;AAED;;;GAGG;AACH,MAAM,MAAM,QAAQ,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAA;AAE/E,4GAA4G;AAC5G,eAAO,MAAM,WAAW,SAAU,WAAW,KAAG,QAa/C,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,7 @@ import { accountService } from "./account.js";
2
2
  import { adminService } from "./admin.js";
3
3
  import { archiveService } from "./archive.js";
4
4
  import { chatsService } from "./chats.js";
5
+ import { conversationsService } from "./conversations.js";
5
6
  import { foldersService } from "./folders.js";
6
7
  import { inboxService } from "./inbox.js";
7
8
  import { messagesService } from "./messages.js";
@@ -11,6 +12,7 @@ export { accountService } from "./account.js";
11
12
  export { adminService } from "./admin.js";
12
13
  export { archiveService } from "./archive.js";
13
14
  export { CHAT_SCAN, chatsService, EVENTS_DAYS } from "./chats.js";
15
+ export { conversationsService } from "./conversations.js";
14
16
  export { OFFLINE, onlineDeps, storedDeps } from "./deps.js";
15
17
  export { foldersService } from "./folders.js";
16
18
  export { inboxService } from "./inbox.js";
@@ -29,6 +31,7 @@ export const servicesFor = (deps) => {
29
31
  folders: foldersService(deps),
30
32
  account: accountService(deps),
31
33
  moderation: moderationService(deps),
34
+ conversations: conversationsService(deps),
32
35
  };
33
36
  return deps.messenger.services ? { ...base, ...deps.messenger.services(base, deps) } : base;
34
37
  };
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,cAAc,EAAE,MAAM,cAAc,CAAA;AAClE,OAAO,EAAqB,YAAY,EAAE,MAAM,YAAY,CAAA;AAC5D,OAAO,EAAuB,cAAc,EAAE,MAAM,cAAc,CAAA;AAClE,OAAO,EAAqB,YAAY,EAAE,MAAM,YAAY,CAAA;AAE5D,OAAO,EAAuB,cAAc,EAAE,MAAM,cAAc,CAAA;AAClE,OAAO,EAAqB,YAAY,EAAE,MAAM,YAAY,CAAA;AAC5D,OAAO,EAAwB,eAAe,EAAE,MAAM,eAAe,CAAA;AACrE,OAAO,EAA0B,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AAC3E,OAAO,EAAsB,aAAa,EAAE,MAAM,aAAa,CAAA;AAG/D,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAE7C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAEzC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAE7C,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAEjE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AAE3D,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAE7C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAWzC,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAE7E,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AAEnD,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAoBpD,4GAA4G;AAC5G,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,IAAiB,EAAY,EAAE;IACzD,MAAM,IAAI,GAAa;QACrB,QAAQ,EAAE,eAAe,CAAC,IAAI,CAAC;QAC/B,KAAK,EAAE,YAAY,CAAC,IAAI,CAAC;QACzB,MAAM,EAAE,aAAa,CAAC,IAAI,CAAC;QAC3B,KAAK,EAAE,YAAY,CAAC,IAAI,CAAC;QACzB,OAAO,EAAE,cAAc,CAAC,IAAI,CAAC;QAC7B,KAAK,EAAE,YAAY,CAAC,IAAI,CAAC;QACzB,OAAO,EAAE,cAAc,CAAC,IAAI,CAAC;QAC7B,OAAO,EAAE,cAAc,CAAC,IAAI,CAAC;QAC7B,UAAU,EAAE,iBAAiB,CAAC,IAAI,CAAC;KACpC,CAAA;IACD,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAA;AAC7F,CAAC,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,cAAc,EAAE,MAAM,cAAc,CAAA;AAClE,OAAO,EAAqB,YAAY,EAAE,MAAM,YAAY,CAAA;AAC5D,OAAO,EAAuB,cAAc,EAAE,MAAM,cAAc,CAAA;AAClE,OAAO,EAAqB,YAAY,EAAE,MAAM,YAAY,CAAA;AAC5D,OAAO,EAA6B,oBAAoB,EAAE,MAAM,oBAAoB,CAAA;AAEpF,OAAO,EAAuB,cAAc,EAAE,MAAM,cAAc,CAAA;AAClE,OAAO,EAAqB,YAAY,EAAE,MAAM,YAAY,CAAA;AAC5D,OAAO,EAAwB,eAAe,EAAE,MAAM,eAAe,CAAA;AACrE,OAAO,EAA0B,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AAC3E,OAAO,EAAsB,aAAa,EAAE,MAAM,aAAa,CAAA;AAG/D,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAE7C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAEzC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAE7C,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAEjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAA;AAEzD,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AAE3D,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAE7C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAWzC,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAE7E,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AAEnD,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAqBpD,4GAA4G;AAC5G,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,IAAiB,EAAY,EAAE;IACzD,MAAM,IAAI,GAAa;QACrB,QAAQ,EAAE,eAAe,CAAC,IAAI,CAAC;QAC/B,KAAK,EAAE,YAAY,CAAC,IAAI,CAAC;QACzB,MAAM,EAAE,aAAa,CAAC,IAAI,CAAC;QAC3B,KAAK,EAAE,YAAY,CAAC,IAAI,CAAC;QACzB,OAAO,EAAE,cAAc,CAAC,IAAI,CAAC;QAC7B,KAAK,EAAE,YAAY,CAAC,IAAI,CAAC;QACzB,OAAO,EAAE,cAAc,CAAC,IAAI,CAAC;QAC7B,OAAO,EAAE,cAAc,CAAC,IAAI,CAAC;QAC7B,UAAU,EAAE,iBAAiB,CAAC,IAAI,CAAC;QACnC,aAAa,EAAE,oBAAoB,CAAC,IAAI,CAAC;KAC1C,CAAA;IACD,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAA;AAC7F,CAAC,CAAA"}
@@ -0,0 +1,45 @@
1
+ import type { LinkInput } from "../../conversations/link.js";
2
+ import type { Id, Message } from "../../domain/models.js";
3
+ import type { ConversationBuild, ConversationSummary, StoredLink } from "../store.js";
4
+ import type { StoreContext } from "./open.js";
5
+ /** A chat's live messages for the rules, oldest first, a page at a time; `next` continues it. */
6
+ export declare const linkInputs: ({ orm }: StoreContext, chatKey: number, { after, limit }: {
7
+ after?: string;
8
+ limit: number;
9
+ }) => {
10
+ items: LinkInput[];
11
+ next: string | null;
12
+ };
13
+ /** The usernames of everyone who wrote in the chat, lowercased, to their id: what a mention names. */
14
+ export declare const senderHandles: ({ orm }: StoreContext, chatKey: number) => Map<string, Id>;
15
+ /**
16
+ * Plan C3–C4, corrected by NEED-475 A. The chat's provider and rule links and its conversations are
17
+ * written under a new build number in short transactions; one more makes that build the one readers
18
+ * see; older builds are then deleted, a batch at a time. Until the switch readers see the previous
19
+ * build, so a failed build leaves it in place. Agent links have no build and stay; one whose message
20
+ * or parent was edited or deleted after it was written is marked stale.
21
+ */
22
+ export declare const replaceConversations: (context: StoreContext, chatKey: number, { startedAt, algorithmVersion, links, conversations: groups }: ConversationBuild, batch?: number) => Promise<void>;
23
+ /** Newest first. `after` and `before` bound when a conversation started. */
24
+ export declare const conversationPage: (context: StoreContext, chatKey: number, { limit, after, before }: {
25
+ limit: number;
26
+ after?: number;
27
+ before?: number;
28
+ }) => {
29
+ items: ConversationSummary[];
30
+ hasMore: boolean;
31
+ };
32
+ /** Its messages oldest first — only an account's own conversation. */
33
+ export declare const conversation: (context: StoreContext, accountKey: number, id: number) => {
34
+ summary: ConversationSummary;
35
+ messages: Message[];
36
+ } | undefined;
37
+ export declare const conversationOf: ({ orm }: StoreContext, chatKey: number, messageId: Id) => string | undefined;
38
+ /** Every link a message has, the messenger's first, then the strongest. */
39
+ export declare const linksOf: ({ orm }: StoreContext, chatKey: number, messageId: Id) => StoredLink[];
40
+ export declare const stateOf: ({ orm }: StoreContext, chatKey: number) => {
41
+ enabledAt: string;
42
+ builtAt: string | null;
43
+ algorithmVersion: number | null;
44
+ } | undefined;
45
+ //# sourceMappingURL=conversations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversations.d.ts","sourceRoot":"","sources":["../../../src/store/sqlite/conversations.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAQ,SAAS,EAAE,MAAM,6BAA6B,CAAA;AAClE,OAAO,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAA;AACzD,OAAO,KAAK,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAErF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAe7C,iGAAiG;AACjG,eAAO,MAAM,UAAU,YACZ,YAAY,WACZ,MAAM,oBACG;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,KAClD;IAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CAsC3C,CAAA;AAED,sGAAsG;AACtG,eAAO,MAAM,aAAa,YAAa,YAAY,WAAW,MAAM,KAAG,GAAG,CAAC,MAAM,EAAE,EAAE,CASlF,CAAA;AA+CH;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,YACtB,YAAY,WACZ,MAAM,iEACgD,iBAAiB,qBAE/E,OAAO,CAAC,IAAI,CAqId,CAAA;AAyDD,4EAA4E;AAC5E,eAAO,MAAM,gBAAgB,YAClB,YAAY,WACZ,MAAM,4BACW;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,KAC3E;IAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAclD,CAAA;AAED,sEAAsE;AACtE,eAAO,MAAM,YAAY,YACd,YAAY,cACT,MAAM,MACd,MAAM,KACT;IAAE,OAAO,EAAE,mBAAmB,CAAC;IAAC,QAAQ,EAAE,OAAO,EAAE,CAAA;CAAE,GAAG,SAgB1D,CAAA;AAED,eAAO,MAAM,cAAc,YAAa,YAAY,WAAW,MAAM,aAAa,EAAE,KAAG,MAAM,GAAG,SAS/F,CAAA;AAED,2EAA2E;AAC3E,eAAO,MAAM,OAAO,YAAa,YAAY,WAAW,MAAM,aAAa,EAAE,KAAG,UAAU,EAgCnF,CAAA;AAEP,eAAO,MAAM,OAAO,YAAa,YAAY,WAAW,MAAM;eAIjB,MAAM;;;aAKlD,CAAA"}
@@ -0,0 +1,309 @@
1
+ import { setTimeout } from "node:timers/promises";
2
+ import { and, asc, desc, eq, isNull, sql } from "./drizzle/core.js";
3
+ import { selectMessages, toMessages } from "./reads.js";
4
+ import { chats, conversationMessages, conversationState, conversations, identities, messageLinks, messages, } from "./schema.js";
5
+ import { toIso } from "./values.js";
6
+ const position = (sentAt, pk) => `${sentAt}:${pk}`;
7
+ /** A chat's live messages for the rules, oldest first, a page at a time; `next` continues it. */
8
+ export const linkInputs = ({ orm }, chatKey, { after, limit }) => {
9
+ const [sentAt, pk] = (after ?? "").split(":").map(Number);
10
+ const rows = orm
11
+ .select({
12
+ pk: messages.pk,
13
+ id: messages.nativeId,
14
+ senderId: sql `coalesce(${messages.senderChatNativeId}, ${identities.nativeId})`,
15
+ text: messages.text,
16
+ sentAt: messages.sentAt,
17
+ replyToId: messages.replyToNativeId,
18
+ threadId: messages.threadNativeId,
19
+ mentions: messages.mentions,
20
+ })
21
+ .from(messages)
22
+ .leftJoin(identities, eq(identities.pk, messages.senderIdentityPk))
23
+ .where(and(eq(messages.chatPk, chatKey), isNull(messages.deletedAt), after === undefined ? undefined : sql `(${messages.sentAt}, ${messages.pk}) > (${sentAt}, ${pk})`))
24
+ .orderBy(asc(messages.sentAt), asc(messages.pk))
25
+ .limit(limit)
26
+ .all();
27
+ const last = rows.at(-1);
28
+ return {
29
+ items: rows.map((row) => ({
30
+ id: row.id,
31
+ senderId: row.senderId,
32
+ text: row.text,
33
+ timestamp: toIso(row.sentAt),
34
+ ...(row.replyToId === null ? {} : { replyToId: row.replyToId }),
35
+ ...(row.threadId === null ? {} : { threadId: row.threadId }),
36
+ ...(row.mentions === null ? {} : { mentions: JSON.parse(row.mentions) }),
37
+ })),
38
+ next: rows.length === limit && last ? position(last.sentAt, last.pk) : null,
39
+ };
40
+ };
41
+ /** The usernames of everyone who wrote in the chat, lowercased, to their id: what a mention names. */
42
+ export const senderHandles = ({ orm }, chatKey) => new Map(orm
43
+ .selectDistinct({ username: identities.username, id: identities.nativeId })
44
+ .from(messages)
45
+ .innerJoin(identities, eq(identities.pk, messages.senderIdentityPk))
46
+ .where(and(eq(messages.chatPk, chatKey), sql `${identities.username} IS NOT NULL`))
47
+ .all()
48
+ .map(({ username, id }) => [String(username).toLowerCase(), id]));
49
+ const inChat = (chatKey) => eq(messageLinks.chatPk, chatKey);
50
+ /**
51
+ * A long write cut into short transactions with a pause between them. Without the pause the next
52
+ * `BEGIN IMMEDIATE` wins the lock again at once: a process waiting for it sleeps up to 100 ms at a time
53
+ * and, measured, waited out the whole build (1.8 s of 1.9 s at 100k messages). It gives up at 5 s.
54
+ * `work` writes one row per step, synchronously: nothing awaits while a transaction is open (D3).
55
+ */
56
+ const inTurns = async ({ database }, work, { holdMs = 250, pauseMs = 120 } = {}) => {
57
+ for (let done = false; !done;) {
58
+ database.exec("BEGIN IMMEDIATE");
59
+ try {
60
+ const since = performance.now();
61
+ do
62
+ done = work.next().done === true;
63
+ while (!done && performance.now() - since < holdMs);
64
+ database.exec("COMMIT");
65
+ }
66
+ catch (error) {
67
+ database.exec("ROLLBACK");
68
+ throw error;
69
+ }
70
+ if (!done)
71
+ await setTimeout(pauseMs);
72
+ }
73
+ };
74
+ const once = (body) => ({
75
+ next: () => {
76
+ body();
77
+ return { done: true, value: undefined };
78
+ },
79
+ });
80
+ const highestBuild = ({ orm }, chatKey) => Number(orm
81
+ .select({
82
+ n: sql `max(
83
+ coalesce((SELECT max(${conversations.build}) FROM ${conversations} WHERE ${conversations.chatPk} = ${chatKey}), 0),
84
+ coalesce((SELECT max(${messageLinks.build}) FROM ${messageLinks} WHERE ${inChat(chatKey)}), 0),
85
+ coalesce((SELECT ${conversationState.currentBuild} FROM ${conversationState}
86
+ WHERE ${conversationState.chatPk} = ${chatKey}), 0))`,
87
+ })
88
+ .from(sql `(SELECT 1)`)
89
+ .get()?.n);
90
+ /**
91
+ * Plan C3–C4, corrected by NEED-475 A. The chat's provider and rule links and its conversations are
92
+ * written under a new build number in short transactions; one more makes that build the one readers
93
+ * see; older builds are then deleted, a batch at a time. Until the switch readers see the previous
94
+ * build, so a failed build leaves it in place. Agent links have no build and stay; one whose message
95
+ * or parent was edited or deleted after it was written is marked stale.
96
+ */
97
+ export const replaceConversations = async (context, chatKey, { startedAt, algorithmVersion, links, conversations: groups }, batch = 5_000) => {
98
+ const { orm, now } = context;
99
+ const held = new Map(orm
100
+ .select({ id: messages.nativeId, pk: messages.pk, sentAt: messages.sentAt })
101
+ .from(messages)
102
+ .where(eq(messages.chatPk, chatKey))
103
+ .all()
104
+ .map((row) => [row.id, row]));
105
+ let build = 0;
106
+ await inTurns(context, once(() => {
107
+ // By start time, so a build that started later is the newer one; never one already used.
108
+ build = Math.max(startedAt, highestBuild(context, chatKey) + 1);
109
+ orm.insert(conversationState).values({ chatPk: chatKey, enabledAt: startedAt }).onConflictDoNothing().run();
110
+ }));
111
+ const insertLink = orm
112
+ .insert(messageLinks)
113
+ .values({
114
+ chatPk: chatKey,
115
+ messagePk: sql.placeholder("messagePk"),
116
+ parentPk: sql.placeholder("parentPk"),
117
+ source: sql.placeholder("source"),
118
+ kind: sql.placeholder("kind"),
119
+ confidence: sql.placeholder("confidence"),
120
+ method: sql.placeholder("method"),
121
+ version: String(algorithmVersion),
122
+ createdAt: startedAt,
123
+ build,
124
+ })
125
+ .onConflictDoNothing()
126
+ .prepare();
127
+ const insertMember = orm
128
+ .insert(conversationMessages)
129
+ .values({ conversationPk: sql.placeholder("conversationPk"), messagePk: sql.placeholder("messagePk") })
130
+ .prepare();
131
+ await inTurns(context, (function* () {
132
+ for (const link of links) {
133
+ const message = held.get(link.messageId);
134
+ const parent = held.get(link.parentId);
135
+ if (!message || !parent)
136
+ continue;
137
+ insertLink.run(row(link, message.pk, parent.pk));
138
+ yield;
139
+ }
140
+ for (const ids of groups) {
141
+ const members = ids.flatMap((id) => held.get(id) ?? []);
142
+ const first = members[0];
143
+ if (!first)
144
+ continue;
145
+ const created = orm
146
+ .insert(conversations)
147
+ .values({
148
+ chatPk: chatKey,
149
+ build,
150
+ firstMessagePk: first.pk,
151
+ firstAt: first.sentAt,
152
+ lastAt: members.reduce((last, member) => Math.max(last, member.sentAt), first.sentAt),
153
+ messageCount: members.length,
154
+ builtAt: startedAt,
155
+ algorithmVersion,
156
+ })
157
+ .returning({ pk: conversations.pk })
158
+ .get();
159
+ for (const member of members) {
160
+ insertMember.run({ conversationPk: created.pk, messagePk: member.pk });
161
+ yield;
162
+ }
163
+ }
164
+ })());
165
+ const changedSince = (end) => sql `(
166
+ EXISTS (SELECT 1 FROM message_revisions r WHERE r.message_pk = ${end} AND r.captured_at > ${messageLinks.createdAt})
167
+ OR EXISTS (SELECT 1 FROM messages d WHERE d.pk = ${end} AND d.deleted_at > ${messageLinks.createdAt}))`;
168
+ await inTurns(context, once(() => {
169
+ orm
170
+ .update(messageLinks)
171
+ .set({ staleAt: now() })
172
+ .where(and(eq(messageLinks.source, "agent"), isNull(messageLinks.staleAt), inChat(chatKey), sql `(${changedSince(sql `${messageLinks.messagePk}`)} OR ${changedSince(sql `${messageLinks.parentPk}`)})`))
173
+ .run();
174
+ // A slower build that started earlier and finishes later must not replace a newer one.
175
+ orm
176
+ .update(conversationState)
177
+ .set({ currentBuild: build, builtAt: startedAt, algorithmVersion })
178
+ .where(and(eq(conversationState.chatPk, chatKey), sql `coalesce(${conversationState.currentBuild}, 0) < ${build}`))
179
+ .run();
180
+ }));
181
+ const current = sql `(SELECT ${conversationState.currentBuild} FROM ${conversationState}
182
+ WHERE ${conversationState.chatPk} = ${chatKey})`;
183
+ await inTurns(context, (function* () {
184
+ for (;;) {
185
+ const removed = orm
186
+ .delete(conversations)
187
+ .where(sql `${conversations.pk} IN (SELECT ${conversations.pk} FROM ${conversations}
188
+ WHERE ${conversations.chatPk} = ${chatKey} AND ${conversations.build} < ${current} LIMIT ${batch})`)
189
+ .returning({ pk: conversations.pk })
190
+ .all().length +
191
+ orm
192
+ .delete(messageLinks)
193
+ .where(sql `rowid IN (SELECT rowid FROM ${messageLinks} WHERE ${messageLinks.chatPk} = ${chatKey}
194
+ AND ${messageLinks.build} < ${current} LIMIT ${batch})`)
195
+ .returning({ pk: messageLinks.messagePk })
196
+ .all().length;
197
+ if (removed === 0)
198
+ return;
199
+ yield;
200
+ }
201
+ })());
202
+ };
203
+ const row = (link, messagePk, parentPk) => ({
204
+ messagePk,
205
+ parentPk,
206
+ source: link.source,
207
+ kind: link.kind,
208
+ confidence: link.confidence,
209
+ method: link.method,
210
+ });
211
+ /** Only the build readers see; a newer one may be half written. */
212
+ const isCurrent = sql `${conversations.build} = (SELECT ${conversationState.currentBuild} FROM ${conversationState}
213
+ WHERE ${conversationState.chatPk} = ${conversations.chatPk})`;
214
+ const SUMMARY = {
215
+ pk: conversations.pk,
216
+ chatId: chats.nativeId,
217
+ firstMessageId: messages.nativeId,
218
+ firstAt: conversations.firstAt,
219
+ lastAt: conversations.lastAt,
220
+ messageCount: conversations.messageCount,
221
+ builtAt: conversations.builtAt,
222
+ algorithmVersion: conversations.algorithmVersion,
223
+ senders: sql `(SELECT count(DISTINCT coalesce(m.sender_chat_native_id, m.sender_identity_pk))
224
+ FROM conversation_messages cm JOIN messages m ON m.pk = cm.message_pk WHERE cm.conversation_pk = ${conversations.pk})`,
225
+ };
226
+ const summaries = ({ orm }) => orm
227
+ .select(SUMMARY)
228
+ .from(conversations)
229
+ .innerJoin(chats, eq(chats.pk, conversations.chatPk))
230
+ .innerJoin(messages, eq(messages.pk, conversations.firstMessagePk));
231
+ const toSummary = (row) => ({
232
+ id: String(row.pk),
233
+ chatId: row.chatId,
234
+ firstMessageId: row.firstMessageId,
235
+ firstAt: toIso(row.firstAt),
236
+ lastAt: toIso(row.lastAt),
237
+ messageCount: row.messageCount,
238
+ senders: Number(row.senders),
239
+ builtAt: toIso(row.builtAt),
240
+ algorithmVersion: row.algorithmVersion,
241
+ });
242
+ /** Newest first. `after` and `before` bound when a conversation started. */
243
+ export const conversationPage = (context, chatKey, { limit, after, before }) => {
244
+ const rows = summaries(context)
245
+ .where(and(eq(conversations.chatPk, chatKey), isCurrent, after === undefined ? undefined : sql `${conversations.firstAt} >= ${after}`, before === undefined ? undefined : sql `${conversations.firstAt} < ${before}`))
246
+ .orderBy(desc(conversations.firstAt), desc(conversations.pk))
247
+ .limit(limit + 1)
248
+ .all();
249
+ return { items: rows.slice(0, limit).map(toSummary), hasMore: rows.length > limit };
250
+ };
251
+ /** Its messages oldest first — only an account's own conversation. */
252
+ export const conversation = (context, accountKey, id) => {
253
+ const found = summaries(context)
254
+ .where(and(eq(conversations.pk, id), eq(chats.accountPk, accountKey), isCurrent))
255
+ .get();
256
+ if (!found)
257
+ return undefined;
258
+ const rows = selectMessages(context)
259
+ .where(and(isNull(messages.deletedAt), sql `${messages.pk} IN (SELECT ${conversationMessages.messagePk} FROM ${conversationMessages}
260
+ WHERE ${conversationMessages.conversationPk} = ${id})`))
261
+ .orderBy(asc(messages.sentAt), asc(messages.pk))
262
+ .all();
263
+ return { summary: toSummary(found), messages: toMessages(context, rows) };
264
+ };
265
+ export const conversationOf = ({ orm }, chatKey, messageId) => {
266
+ const found = orm
267
+ .select({ pk: conversationMessages.conversationPk })
268
+ .from(conversationMessages)
269
+ .innerJoin(messages, eq(messages.pk, conversationMessages.messagePk))
270
+ .innerJoin(conversations, eq(conversations.pk, conversationMessages.conversationPk))
271
+ .where(and(eq(messages.chatPk, chatKey), eq(messages.nativeId, messageId), isCurrent))
272
+ .get();
273
+ return found ? String(found.pk) : undefined;
274
+ };
275
+ /** Every link a message has, the messenger's first, then the strongest. */
276
+ export const linksOf = ({ orm }, chatKey, messageId) => orm
277
+ .select({
278
+ parentId: sql `(SELECT p.native_id FROM messages p WHERE p.pk = ${messageLinks.parentPk})`,
279
+ source: messageLinks.source,
280
+ kind: messageLinks.kind,
281
+ confidence: messageLinks.confidence,
282
+ method: messageLinks.method,
283
+ version: messageLinks.version,
284
+ createdAt: messageLinks.createdAt,
285
+ staleAt: messageLinks.staleAt,
286
+ })
287
+ .from(messageLinks)
288
+ .innerJoin(messages, eq(messages.pk, messageLinks.messagePk))
289
+ .where(and(eq(messages.chatPk, chatKey), eq(messages.nativeId, messageId), sql `(${messageLinks.build} IS NULL OR ${messageLinks.build} = (SELECT ${conversationState.currentBuild}
290
+ FROM ${conversationState} WHERE ${conversationState.chatPk} = ${chatKey}))`))
291
+ .orderBy(sql `CASE ${messageLinks.source} WHEN 'provider' THEN 0 WHEN 'agent' THEN 1 ELSE 2 END`, desc(messageLinks.confidence))
292
+ .all()
293
+ .map(({ createdAt, staleAt, ...link }) => ({
294
+ ...link,
295
+ source: link.source,
296
+ createdAt: toIso(createdAt),
297
+ stale: staleAt !== null,
298
+ }));
299
+ export const stateOf = ({ orm }, chatKey) => {
300
+ const found = orm.select().from(conversationState).where(eq(conversationState.chatPk, chatKey)).get();
301
+ return found
302
+ ? {
303
+ enabledAt: toIso(found.enabledAt),
304
+ builtAt: toIso(found.builtAt),
305
+ algorithmVersion: found.algorithmVersion,
306
+ }
307
+ : undefined;
308
+ };
309
+ //# sourceMappingURL=conversations.js.map