@leemour/cli-messaging 0.141.0 → 0.142.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 (128) hide show
  1. package/dist/cli/config-command.js +5 -0
  2. package/dist/cli/config-command.js.map +1 -1
  3. package/dist/cli/messenger/archive-commands.d.ts.map +1 -1
  4. package/dist/cli/messenger/archive-commands.js +91 -7
  5. package/dist/cli/messenger/archive-commands.js.map +1 -1
  6. package/dist/cli/messenger/catch-up.d.ts +17 -0
  7. package/dist/cli/messenger/catch-up.d.ts.map +1 -0
  8. package/dist/cli/messenger/catch-up.js +30 -0
  9. package/dist/cli/messenger/catch-up.js.map +1 -0
  10. package/dist/cli/messenger/conversations-command.d.ts.map +1 -1
  11. package/dist/cli/messenger/conversations-command.js +213 -27
  12. package/dist/cli/messenger/conversations-command.js.map +1 -1
  13. package/dist/cli/messenger/export-folder.d.ts +54 -0
  14. package/dist/cli/messenger/export-folder.d.ts.map +1 -0
  15. package/dist/cli/messenger/export-folder.js +106 -0
  16. package/dist/cli/messenger/export-folder.js.map +1 -0
  17. package/dist/cli/messenger/inbox.d.ts +4 -3
  18. package/dist/cli/messenger/inbox.d.ts.map +1 -1
  19. package/dist/cli/messenger/inbox.js +28 -32
  20. package/dist/cli/messenger/inbox.js.map +1 -1
  21. package/dist/cli/messenger/messages-command.d.ts.map +1 -1
  22. package/dist/cli/messenger/messages-command.js +2 -0
  23. package/dist/cli/messenger/messages-command.js.map +1 -1
  24. package/dist/cli/messenger/messages-stats-command.d.ts +4 -0
  25. package/dist/cli/messenger/messages-stats-command.d.ts.map +1 -0
  26. package/dist/cli/messenger/messages-stats-command.js +49 -0
  27. package/dist/cli/messenger/messages-stats-command.js.map +1 -0
  28. package/dist/cli/messenger/password.d.ts +11 -0
  29. package/dist/cli/messenger/password.d.ts.map +1 -0
  30. package/dist/cli/messenger/password.js +26 -0
  31. package/dist/cli/messenger/password.js.map +1 -0
  32. package/dist/cli/messenger/points.d.ts +21 -0
  33. package/dist/cli/messenger/points.d.ts.map +1 -0
  34. package/dist/cli/messenger/points.js +39 -0
  35. package/dist/cli/messenger/points.js.map +1 -0
  36. package/dist/cli/messenger/review.d.ts.map +1 -1
  37. package/dist/cli/messenger/review.js +55 -20
  38. package/dist/cli/messenger/review.js.map +1 -1
  39. package/dist/cli/messenger/store-maintenance-command.d.ts.map +1 -1
  40. package/dist/cli/messenger/store-maintenance-command.js +75 -20
  41. package/dist/cli/messenger/store-maintenance-command.js.map +1 -1
  42. package/dist/cli/permission-migration.d.ts.map +1 -1
  43. package/dist/cli/permission-migration.js +14 -9
  44. package/dist/cli/permission-migration.js.map +1 -1
  45. package/dist/cli/settings.d.ts +4 -0
  46. package/dist/cli/settings.d.ts.map +1 -1
  47. package/dist/cli/settings.js +12 -22
  48. package/dist/cli/settings.js.map +1 -1
  49. package/dist/domain/models.d.ts +4 -0
  50. package/dist/domain/models.d.ts.map +1 -1
  51. package/dist/mcp/server.d.ts.map +1 -1
  52. package/dist/mcp/server.js +2 -1
  53. package/dist/mcp/server.js.map +1 -1
  54. package/dist/mcp/tool.d.ts +1 -1
  55. package/dist/mcp/tool.d.ts.map +1 -1
  56. package/dist/mcp/tools/conversations.d.ts +1 -1
  57. package/dist/mcp/tools/conversations.d.ts.map +1 -1
  58. package/dist/mcp/tools/conversations.js +76 -5
  59. package/dist/mcp/tools/conversations.js.map +1 -1
  60. package/dist/mcp/tools/messages.d.ts.map +1 -1
  61. package/dist/mcp/tools/messages.js +8 -1
  62. package/dist/mcp/tools/messages.js.map +1 -1
  63. package/dist/mcp/tools/search.d.ts +24 -0
  64. package/dist/mcp/tools/search.d.ts.map +1 -1
  65. package/dist/mcp/tools/search.js +25 -0
  66. package/dist/mcp/tools/search.js.map +1 -1
  67. package/dist/sealed.d.ts +39 -0
  68. package/dist/sealed.d.ts.map +1 -0
  69. package/dist/sealed.js +140 -0
  70. package/dist/sealed.js.map +1 -0
  71. package/dist/search/lucene/dates.d.ts +2 -2
  72. package/dist/search/lucene/dates.d.ts.map +1 -1
  73. package/dist/search/lucene/dates.js +27 -5
  74. package/dist/search/lucene/dates.js.map +1 -1
  75. package/dist/search/lucene/registry.d.ts +1 -1
  76. package/dist/search/lucene/registry.d.ts.map +1 -1
  77. package/dist/search/lucene/registry.js +1 -1
  78. package/dist/search/lucene/registry.js.map +1 -1
  79. package/dist/sends/index.d.ts +1 -1
  80. package/dist/sends/index.d.ts.map +1 -1
  81. package/dist/sends/index.js +1 -1
  82. package/dist/sends/index.js.map +1 -1
  83. package/dist/sends/permissions.d.ts +9 -0
  84. package/dist/sends/permissions.d.ts.map +1 -1
  85. package/dist/sends/permissions.js +19 -0
  86. package/dist/sends/permissions.js.map +1 -1
  87. package/dist/services/archive.d.ts +22 -1
  88. package/dist/services/archive.d.ts.map +1 -1
  89. package/dist/services/archive.js +25 -0
  90. package/dist/services/archive.js.map +1 -1
  91. package/dist/services/embeddings.d.ts +108 -3
  92. package/dist/services/embeddings.d.ts.map +1 -1
  93. package/dist/services/embeddings.js +250 -59
  94. package/dist/services/embeddings.js.map +1 -1
  95. package/dist/services/inbox.d.ts +27 -9
  96. package/dist/services/inbox.d.ts.map +1 -1
  97. package/dist/services/inbox.js +57 -22
  98. package/dist/services/inbox.js.map +1 -1
  99. package/dist/services/messages-search.d.ts +21 -1
  100. package/dist/services/messages-search.d.ts.map +1 -1
  101. package/dist/services/messages-search.js +90 -26
  102. package/dist/services/messages-search.js.map +1 -1
  103. package/dist/services/messages.d.ts +8 -1
  104. package/dist/services/messages.d.ts.map +1 -1
  105. package/dist/services/messages.js +7 -1
  106. package/dist/services/messages.js.map +1 -1
  107. package/dist/store/sqlite/lucene.d.ts +11 -0
  108. package/dist/store/sqlite/lucene.d.ts.map +1 -1
  109. package/dist/store/sqlite/lucene.js +53 -18
  110. package/dist/store/sqlite/lucene.js.map +1 -1
  111. package/dist/store/sqlite/messages.d.ts +2 -2
  112. package/dist/store/sqlite/messages.d.ts.map +1 -1
  113. package/dist/store/sqlite/messages.js +5 -2
  114. package/dist/store/sqlite/messages.js.map +1 -1
  115. package/dist/store/sqlite/reads.d.ts +10 -0
  116. package/dist/store/sqlite/reads.d.ts.map +1 -1
  117. package/dist/store/sqlite/reads.js +25 -2
  118. package/dist/store/sqlite/reads.js.map +1 -1
  119. package/dist/store/sqlite/vectors.d.ts +49 -1
  120. package/dist/store/sqlite/vectors.d.ts.map +1 -1
  121. package/dist/store/sqlite/vectors.js +121 -6
  122. package/dist/store/sqlite/vectors.js.map +1 -1
  123. package/dist/store/store.d.ts +51 -1
  124. package/dist/store/store.d.ts.map +1 -1
  125. package/dist/store/store.js +55 -7
  126. package/dist/store/store.js.map +1 -1
  127. package/package.json +1 -1
  128. package/parity.json +170 -2
@@ -1,9 +1,13 @@
1
1
  import { CliError } from "@leemour/cli-core";
2
2
  import { CHUNK_CHARS, chunkHash, chunkTextOf } from "../conversations/chunks.js";
3
+ import { RULES_VERSION } from "../conversations/link.js";
3
4
  import { defaultThreads, isTextModelInstalled, textModelsDirectory } from "../embeddings/embed.js";
4
5
  import { DEFAULT_TEXT_MODEL, textModel } from "../embeddings/models.js";
5
6
  import { remoteKey } from "../embeddings/remote.js";
7
+ import { conversationsService } from "./conversations.js";
6
8
  import { searchStore, storedChatId } from "./messages.js";
9
+ /** How much one run without `--chat` does at most, by default. */
10
+ export const REFRESH_BOUNDS = { maxChats: 20, maxChunks: 2_000 };
7
11
  /** A vector's model: the provider, the model and its size — vectors of two of them never mix. */
8
12
  export const vectorModelKey = (model) => `local:${model.id}:${model.dims}`;
9
13
  /** Chunks per batch for one local session; one short transaction writes each batch. */
@@ -20,6 +24,8 @@ const RRF_K = 60;
20
24
  const CHARS_PER_TOKEN_AT_LEAST = 3;
21
25
  export const embeddingsService = (deps) => {
22
26
  const command = deps.messenger.app.command;
27
+ const notDownloaded = (id) => new CliError("not_found", `${id} is not downloaded — \`${command} models text download ${id}\``);
28
+ const notBuiltError = (chatId) => new CliError("not_found", `chat ${chatId} has no conversations yet — \`${command} conversations build --chat ${chatId}\``);
23
29
  const resolve = (choice = DEFAULT_TEXT_MODEL) => {
24
30
  if (typeof choice !== "string") {
25
31
  const { remote, apiKey, concurrency = 4 } = choice;
@@ -29,6 +35,7 @@ export const embeddingsService = (deps) => {
29
35
  dims: remote.dims,
30
36
  speed: null,
31
37
  price: remote.price,
38
+ installed: true,
32
39
  perBatch: (_workers) => PER_REQUEST * concurrency,
33
40
  open: async () => (await import("../embeddings/remote.js")).openRemote(remote, apiKey, { concurrency }),
34
41
  };
@@ -41,11 +48,11 @@ export const embeddingsService = (deps) => {
41
48
  dims: model.dims,
42
49
  speed: model.chunksPerSecond,
43
50
  price: undefined,
51
+ installed: isTextModelInstalled(model, directory),
44
52
  perBatch: (workers) => PER_SESSION * Math.max(1, workers),
45
53
  open: async ({ workers = 1, threads, apart = false, } = {}) => {
46
- if (!isTextModelInstalled(model, directory)) {
47
- throw new CliError("not_found", `${model.id} is not downloaded — \`${command} models text download ${model.id}\``);
48
- }
54
+ if (!isTextModelInstalled(model, directory))
55
+ throw notDownloaded(model.id);
49
56
  if (apart) {
50
57
  const { openProcess } = await import("../embeddings/process.js");
51
58
  return openProcess(model, directory, { threads: threads ?? defaultThreads() });
@@ -64,30 +71,80 @@ export const embeddingsService = (deps) => {
64
71
  const byWords = async (query, chatId, since) => {
65
72
  const words = [...new Set(query.toLowerCase().match(/[\p{L}\p{N}]+/gu) ?? [])];
66
73
  if (words.length === 0)
67
- return [];
74
+ return { hits: [], outside: new Set() };
68
75
  const store = await deps.store();
69
76
  const account = await deps.account();
70
77
  const { items: found } = await searchStore(store, account, { text: words.join(" OR "), ...(chatId === undefined ? {} : { chat: chatId }), limit: WORD_HITS }, deps.messenger);
71
78
  const items = found.filter(({ match }) => match === "words" || match === "beginnings");
72
79
  const summaries = await store.conversationsOfMessages(account, items.map(({ chatId, id }) => ({ chatId, messageId: id })));
73
80
  const seen = new Set();
74
- return items.flatMap(({ id }, index) => {
81
+ const outside = new Set();
82
+ const hits = items.flatMap(({ id, chatId }, index) => {
75
83
  const summary = summaries[index];
84
+ if (!summary)
85
+ outside.add(chatId);
76
86
  if (!summary || seen.has(summary.id) || (since !== undefined && Date.parse(summary.lastAt) < Date.parse(since)))
77
87
  return [];
78
88
  seen.add(summary.id);
79
89
  return [{ summary, chunk: { firstMessageId: id, lastMessageId: id } }];
80
90
  });
91
+ return { hits, outside };
92
+ };
93
+ const readinessOf = async (chatId, key) => {
94
+ const store = await deps.store();
95
+ const account = await deps.account();
96
+ return (await store.readiness(account, { ...(chatId === undefined ? {} : { chatId }), model: key })).map(shaped);
81
97
  };
82
98
  const found = async (chat) => {
83
99
  const store = await deps.store();
84
100
  const account = await deps.account();
85
101
  const chatId = await storedChatId(deps.messenger, chat, store, account);
86
- if (!(await store.conversationState(account, chatId))?.builtAt) {
87
- throw new CliError("not_found", `chat ${chatId} has no conversations yet — \`${command} conversations build --chat ${chatId}\``);
88
- }
102
+ if (!(await store.conversationState(account, chatId))?.builtAt)
103
+ throw notBuiltError(chatId);
89
104
  return { store, account, chatId };
90
105
  };
106
+ /** The server's warm model when there is one, kept open after; otherwise opened here and closed. */
107
+ const withEmbedder = async (target, choice, { workers = 1, threads }, work) => {
108
+ const warm = typeof choice !== "object" ? deps.embedders : undefined;
109
+ const embedder = warm
110
+ ? await warm.get(target.key, () => target.open({ apart: true }))
111
+ : await target.open({ workers, ...(threads ? { threads } : {}) });
112
+ try {
113
+ return await work(embedder);
114
+ }
115
+ finally {
116
+ if (!warm)
117
+ await embedder.close();
118
+ }
119
+ };
120
+ const embedInto = async (chatId, target, embedder, { workers = 1, maxChunks = Number.POSITIVE_INFINITY, progress, }) => {
121
+ const store = await deps.store();
122
+ const account = await deps.account();
123
+ let embedded = 0;
124
+ let skipped = 0;
125
+ let left = (await store.vectorStatus(account, chatId, target.key)).chunks;
126
+ let after;
127
+ while (embedded + skipped < maxChunks) {
128
+ const batch = await store.chunksToEmbed(account, chatId, target.key, {
129
+ limit: Math.min(target.perBatch(workers), maxChunks - embedded - skipped),
130
+ ...(after ? { after } : {}),
131
+ });
132
+ if (batch.length === 0)
133
+ break;
134
+ after = batch.at(-1)?.hash;
135
+ const ready = batch.flatMap(({ hash, lines }) => {
136
+ const text = chunkTextOf(lines);
137
+ return chunkHash(text) === hash ? [{ hash, text }] : [];
138
+ });
139
+ skipped += batch.length - ready.length;
140
+ const vectors = await embedder.embed(ready.map(({ text }) => text), "passage");
141
+ await store.saveVectors(target.key, target.dims, ready.map(({ hash }, index) => ({ hash, vector: vectors[index] })));
142
+ embedded += ready.length;
143
+ left = Math.max(0, left - batch.length);
144
+ progress?.(embedded, left);
145
+ }
146
+ return { chat: chatId, model: target.id, embedded, skipped };
147
+ };
91
148
  return {
92
149
  status: async (chat, choice) => {
93
150
  const { store, account, chatId } = await found(chat);
@@ -108,66 +165,153 @@ export const embeddingsService = (deps) => {
108
165
  : {}),
109
166
  };
110
167
  },
111
- embed: async (chat, { model: choice, workers = 1, threads, progress }) => {
112
- const { store, account, chatId } = await found(chat);
168
+ embed: async (chat, { model: choice, workers = 1, threads, maxChunks, progress }) => {
169
+ const { chatId } = await found(chat);
113
170
  const target = resolve(choice);
114
- const embedder = await target.open({ workers, ...(threads ? { threads } : {}) });
115
- let embedded = 0;
116
- let skipped = 0;
117
- try {
118
- let left = (await store.vectorStatus(account, chatId, target.key)).chunks;
119
- let after;
120
- for (;;) {
121
- const batch = await store.chunksToEmbed(account, chatId, target.key, {
122
- limit: target.perBatch(workers),
123
- ...(after ? { after } : {}),
124
- });
125
- if (batch.length === 0)
126
- break;
127
- after = batch.at(-1)?.hash;
128
- const ready = batch.flatMap(({ hash, lines }) => {
129
- const text = chunkTextOf(lines);
130
- return chunkHash(text) === hash ? [{ hash, text }] : [];
171
+ return withEmbedder(target, choice, { workers, threads }, (embedder) => embedInto(chatId, target, embedder, { workers, maxChunks, progress }));
172
+ },
173
+ search: async (query, { chat, model: choice, since, limit }) => {
174
+ const store = await deps.store();
175
+ const account = await deps.account();
176
+ const target = resolve(choice);
177
+ const chatId = chat === undefined ? undefined : await storedChatId(deps.messenger, chat, store, account);
178
+ const scope = chatId === undefined ? {} : { chatId };
179
+ const words = await byWords(query, chatId, since);
180
+ let meaning = [];
181
+ if (target.installed) {
182
+ const warm = typeof choice !== "object" ? deps.embedders : undefined;
183
+ const embedder = warm ? await warm.get(target.key, () => target.open({ apart: true })) : await target.open();
184
+ try {
185
+ const [vector] = await embedder.embed([query], "query");
186
+ meaning = await store.nearestConversations(account, {
187
+ ...scope,
188
+ ...(since === undefined ? {} : { since }),
189
+ model: target.key,
190
+ limit: Math.max(limit, CANDIDATES),
191
+ query: vector,
131
192
  });
132
- skipped += batch.length - ready.length;
133
- const vectors = await embedder.embed(ready.map(({ text }) => text), "passage");
134
- await store.saveVectors(target.key, target.dims, ready.map(({ hash }, index) => ({ hash, vector: vectors[index] })));
135
- embedded += ready.length;
136
- left = Math.max(0, left - batch.length);
137
- progress?.(embedded, left);
193
+ }
194
+ finally {
195
+ if (!warm)
196
+ await embedder.close();
138
197
  }
139
198
  }
140
- finally {
141
- await embedder.close();
199
+ const elsewhere = await store.embeddedOnlyElsewhere(account, { ...scope, model: target.key });
200
+ return {
201
+ model: target.id,
202
+ meaning: target.installed ? "searched" : "unavailable",
203
+ hits: fused(meaning, words.hits).slice(0, limit),
204
+ readiness: searchReadiness(await readinessOf(chatId, target.key), target.installed, words.outside),
205
+ embeddedOnlyElsewhere: elsewhere,
206
+ };
207
+ },
208
+ related: async (chat, message, { model: choice, limit }) => {
209
+ const store = await deps.store();
210
+ const account = await deps.account();
211
+ const target = resolve(choice);
212
+ const chatId = await storedChatId(deps.messenger, chat, store, account);
213
+ const [source] = await store.conversationsOfMessages(account, [{ chatId, messageId: message }]);
214
+ if (!source) {
215
+ if (!(await store.conversationState(account, chatId))?.builtAt)
216
+ throw notBuiltError(chatId);
217
+ throw new CliError("not_found", `message ${message} is in no conversation of chat ${chatId}`);
142
218
  }
143
- return { chat: chatId, model: target.id, embedded, skipped };
219
+ const { vectors } = await store.conversationVectors(account, source.id, target.key);
220
+ if (vectors.length === 0) {
221
+ const [own] = await readinessOf(chatId, target.key);
222
+ const step = own && isStale(own) ? "build" : "embed";
223
+ throw new CliError("not_found", `conversation ${source.id} has no vector of ${target.id} that matches its messages now — ` +
224
+ `\`${command} conversations ${step} --chat ${chatId}\``);
225
+ }
226
+ const hits = await store.nearestConversations(account, {
227
+ model: target.key,
228
+ limit: Math.max(limit, CANDIDATES),
229
+ query: meanOf(vectors),
230
+ exclude: source.id,
231
+ });
232
+ return {
233
+ model: target.id,
234
+ source,
235
+ hits: hits
236
+ .slice(0, limit)
237
+ .map(({ summary, chunk, score, stale }) => ({ summary, chunk, score, by: ["meaning"], stale })),
238
+ readiness: searchReadiness(await readinessOf(undefined, target.key), true, new Set()),
239
+ };
144
240
  },
145
- search: async (query, { chat, model: choice, since, limit }) => {
241
+ readiness: async ({ chat, model: choice }) => {
146
242
  const store = await deps.store();
147
243
  const account = await deps.account();
148
244
  const target = resolve(choice);
149
245
  const chatId = chat === undefined ? undefined : await storedChatId(deps.messenger, chat, store, account);
150
- const scope = chatId === undefined ? {} : { chatId };
151
- const warm = typeof choice !== "object" ? deps.embedders : undefined;
152
- const embedder = warm ? await warm.get(target.key, () => target.open({ apart: true })) : await target.open();
153
- let meaning;
154
- try {
155
- const [vector] = await embedder.embed([query], "query");
156
- meaning = await store.nearestConversations(account, {
157
- ...scope,
158
- ...(since === undefined ? {} : { since }),
159
- model: target.key,
160
- limit: Math.max(limit, CANDIDATES),
161
- query: vector,
162
- });
246
+ return { model: target.id, chats: await readinessOf(chatId, target.key) };
247
+ },
248
+ refresh: async ({ chat, model: choice = DEFAULT_TEXT_MODEL, build = true, embed = true, maxChats = REFRESH_BOUNDS.maxChats, maxChunks = REFRESH_BOUNDS.maxChunks, workers, threads, progress, }) => {
249
+ const store = await deps.store();
250
+ const account = await deps.account();
251
+ const target = resolve(choice);
252
+ if (embed && !build && !target.installed)
253
+ throw notDownloaded(target.id);
254
+ const chatId = chat === undefined ? undefined : await storedChatId(deps.messenger, chat, store, account);
255
+ const scan = async () => ({
256
+ chats: (await readinessOf(chatId, target.key)).sort(byOldestBuild),
257
+ unbuilt: chatId === undefined ? await store.unbuiltGroups(account) : [],
258
+ });
259
+ const built = [];
260
+ if (build) {
261
+ const { chats, unbuilt } = await scan();
262
+ const queue = [...chats.filter(needsBuild).map(({ chat }) => chat), ...unbuilt].slice(0, maxChats);
263
+ const conversations = conversationsService(deps);
264
+ for (const id of queue) {
265
+ try {
266
+ const one = await conversations.build(id);
267
+ built.push(one);
268
+ progress?.(`chat ${id}: ${one.messages} messages → ${one.conversations} conversations`);
269
+ }
270
+ catch (error) {
271
+ // Every message of a once-built chat deleted: nothing to build, and it stays in `left`.
272
+ if (!(error instanceof CliError && error.code === "not_found"))
273
+ throw error;
274
+ }
275
+ }
163
276
  }
164
- finally {
165
- if (!warm)
166
- await embedder.close();
277
+ const embedded = [];
278
+ if (embed && target.installed) {
279
+ const fresh = new Set(built.map(({ chat }) => chat));
280
+ const queue = (await scan()).chats
281
+ .filter(needsEmbed)
282
+ .sort((a, b) => Number(fresh.has(b.chat)) - Number(fresh.has(a.chat)))
283
+ .slice(0, maxChats);
284
+ if (queue.length > 0) {
285
+ await withEmbedder(target, choice, { workers, threads }, async (embedder) => {
286
+ let budget = maxChunks;
287
+ for (const { chat } of queue) {
288
+ if (budget <= 0)
289
+ break;
290
+ const done = await embedInto(chat, target, embedder, { workers, maxChunks: budget });
291
+ budget -= done.embedded + done.skipped;
292
+ embedded.push(done);
293
+ progress?.(`chat ${chat}: ${done.embedded} chunks embedded with ${target.id}`);
294
+ }
295
+ });
296
+ }
167
297
  }
168
- const words = await byWords(query, chatId, since);
169
- const elsewhere = await store.embeddedOnlyElsewhere(account, { ...scope, model: target.key });
170
- return { model: target.id, hits: fused(meaning, words).slice(0, limit), embeddedOnlyElsewhere: elsewhere };
298
+ const after = await scan();
299
+ const rebuild = build ? [...after.chats.filter(needsBuild).map(({ chat }) => chat), ...after.unbuilt] : [];
300
+ const pending = new Set(rebuild);
301
+ return {
302
+ model: target.id,
303
+ modelAvailable: target.installed,
304
+ built,
305
+ embedded,
306
+ left: [
307
+ ...rebuild.map((chat) => ({ chat, needs: "build" })),
308
+ ...(embed
309
+ ? after.chats
310
+ .filter((one) => needsEmbed(one) && !pending.has(one.chat))
311
+ .map(({ chat }) => ({ chat, needs: "embed" }))
312
+ : []),
313
+ ],
314
+ };
171
315
  },
172
316
  clear: async (chat, choice) => {
173
317
  const store = await deps.store();
@@ -181,8 +325,8 @@ export const embeddingsService = (deps) => {
181
325
  /** Reciprocal rank fusion of the two lists: each conversation scores 1 / (k + rank) in every list it is in. */
182
326
  const fused = (meaning, words) => {
183
327
  const merged = new Map();
184
- meaning.forEach(({ summary, chunk, score }, index) => {
185
- merged.set(summary.id, { summary, chunk, score, by: ["meaning"], fused: 1 / (RRF_K + index + 1) });
328
+ meaning.forEach(({ summary, chunk, score, stale }, index) => {
329
+ merged.set(summary.id, { summary, chunk, score, by: ["meaning"], stale, fused: 1 / (RRF_K + index + 1) });
186
330
  });
187
331
  words.forEach(({ summary, chunk }, index) => {
188
332
  const share = 1 / (RRF_K + index + 1);
@@ -192,10 +336,57 @@ const fused = (meaning, words) => {
192
336
  held.by.push("words");
193
337
  }
194
338
  else
195
- merged.set(summary.id, { summary, chunk, score: null, by: ["words"], fused: share });
339
+ merged.set(summary.id, { summary, chunk, score: null, by: ["words"], stale: false, fused: share });
196
340
  });
197
341
  return [...merged.values()]
198
342
  .sort((a, b) => b.fused - a.fused || (b.score ?? -2) - (a.score ?? -2))
199
343
  .map(({ fused: _, ...hit }) => hit);
200
344
  };
345
+ const needsBuild = (one) => one.graph === null || isStale(one);
346
+ const needsEmbed = (one) => one.graph !== null && one.vectors.missing > 0;
347
+ /** Never finished first, then the oldest build: the longest-waiting change goes first. */
348
+ const byOldestBuild = (a, b) => (a.graph?.builtAt ?? "").localeCompare(b.graph?.builtAt ?? "");
349
+ /** The chats in readiness by how a meaning search with these vectors could see them, and the word matches outside any. */
350
+ const searchReadiness = (chats, meaning, outside) => {
351
+ const built = new Set(chats.filter(({ state }) => state !== "not-built").map(({ chat }) => chat));
352
+ const ids = (keep) => chats.filter(keep).map(({ chat }) => chat);
353
+ const byMeaning = (one) => meaning && built.has(one.chat) && one.state !== "words-only" && one.vectors.chunks > 0;
354
+ return {
355
+ searchedByMeaning: ids(byMeaning),
356
+ wordsOnly: ids((one) => built.has(one.chat) && !byMeaning(one)),
357
+ partial: ids((one) => byMeaning(one) && one.vectors.missing > 0),
358
+ stale: ids((one) => built.has(one.chat) && isStale(one)),
359
+ notBuilt: [
360
+ ...new Set([...ids((one) => one.state === "not-built"), ...[...outside].filter((id) => !built.has(id))]),
361
+ ].sort(),
362
+ };
363
+ };
364
+ /** Unit vectors' mean, made unit length again so the dot product stays a cosine. */
365
+ const meanOf = (vectors) => {
366
+ const mean = new Float32Array(vectors[0]?.length ?? 0);
367
+ for (const vector of vectors) {
368
+ for (let index = 0; index < mean.length; index++)
369
+ mean[index] = mean[index] + vector[index];
370
+ }
371
+ const length = Math.hypot(...mean) || 1;
372
+ return mean.map((value) => value / length);
373
+ };
374
+ const isStale = ({ graph, pending, vectors }) => Boolean(graph?.outdatedRules) || pending.new + pending.edited + pending.deleted > 0 || vectors.stale > 0;
375
+ const shaped = ({ chatId, builtAt, algorithmVersion, pending, vectors }) => {
376
+ const { embedded, ...counts } = vectors;
377
+ const graph = builtAt === null
378
+ ? null
379
+ : { builtAt, rulesVersion: algorithmVersion, outdatedRules: algorithmVersion !== RULES_VERSION };
380
+ const one = { chat: chatId, state: "ready", graph, pending, vectors: counts };
381
+ const state = graph === null
382
+ ? "not-built"
383
+ : counts.chunks > 0 && embedded === 0
384
+ ? "words-only"
385
+ : isStale(one)
386
+ ? "stale"
387
+ : counts.missing > 0
388
+ ? "partial"
389
+ : "ready";
390
+ return { ...one, state };
391
+ };
201
392
  //# sourceMappingURL=embeddings.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"embeddings.js","sourceRoot":"","sources":["../../src/services/embeddings.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"embeddings.js","sourceRoot":"","sources":["../../src/services/embeddings.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { type MessengerAdapter, type ServerReads } from "../cli/messenger/port.js";
2
- import type { Chat, Id, Inbox, Message, Review } from "../domain/models.js";
2
+ import type { Chat, ChatKind, Id, Inbox, Message, Review } from "../domain/models.js";
3
3
  import type { AccountKey, MessageStore } from "../store/store.js";
4
4
  import type { ServiceDeps } from "./deps.js";
5
5
  /**
@@ -27,6 +27,8 @@ export type InboxReader = Pick<ServerReads, "chats" | "history"> & Pick<Messenge
27
27
  * answered by the owner alone.
28
28
  */
29
29
  export declare const storeReader: (deps: ServiceDeps, store: MessageStore, account: AccountKey) => InboxReader;
30
+ /** `dialog,group` as typed; refuses a word that is not a kind, before anything is asked. */
31
+ export declare const kindsOf: (typed: string, flag?: string) => ChatKind[];
30
32
  export declare const capped: (chats: Chat[], most: number) => {
31
33
  read: Chat[];
32
34
  skipped: {
@@ -43,29 +45,40 @@ export declare const capped: (chats: Chat[], most: number) => {
43
45
  * Muted and archived chats are left out unless `all`, or they mention the owner: on a busy account
44
46
  * they are most of what is unread, and they would take the history reads a person's chat needs.
45
47
  */
46
- export declare const unreadIn: (adapter: InboxReader, { limit, all }: {
48
+ export declare const unreadIn: (adapter: InboxReader, { limit, all, kinds }: {
47
49
  limit: number;
48
50
  all?: boolean;
51
+ kinds?: readonly ChatKind[];
49
52
  }) => Promise<Inbox>;
50
53
  /**
51
- * Other people's messages in every chat that changed after `since`.
54
+ * Other people's messages in every chat that changed after its own point — `points` — or after
55
+ * `since` for a chat with none.
56
+ *
57
+ * **A point per chat** is what lets a channels-only run leave the groups where they were, and a
58
+ * chat past the per-run cap keep its point instead of falling behind one that moved past it.
52
59
  *
53
60
  * **Everything is cut at the chat list's newest message**, the snapshot taken first. The reads run
54
- * one after another, so a chat read early can gain a message while a later one is read; had the
55
- * saved point followed the later read, that message would sit behind it and never show. Anything
56
- * newer waits for the next run and shows once there.
61
+ * one after another, so a chat read early can gain a message while a later one is read; anything
62
+ * newer than the snapshot waits for the next run and shows once there. Each chat read is `checked`
63
+ * up to that cut.
57
64
  */
58
- export declare const newIn: (adapter: InboxReader, { since, limit, all }: {
65
+ export declare const newIn: (adapter: InboxReader, { since, points, limit, all, kinds, }: {
59
66
  since: number;
67
+ points?: ReadonlyMap<Id, number>;
60
68
  limit: number;
61
69
  all?: boolean;
70
+ kinds?: readonly ChatKind[];
62
71
  }) => Promise<Inbox>;
63
72
  /** Every page is a history request; 20 chats of 3 pages stays well inside what one account may ask. */
64
73
  export declare const REVIEW_CHATS = 20;
65
74
  export interface ReviewOptions {
66
75
  since: number;
76
+ /** A chat's own start, where it has one; `since` for the rest. */
77
+ points?: ReadonlyMap<Id, number>;
67
78
  /** A chat as typed; only that one is read, muted or not. */
68
79
  chat?: string;
80
+ /** Only chats of these kinds; ignored with `chat`. */
81
+ kinds?: readonly ChatKind[];
69
82
  all?: boolean;
70
83
  /** Keep only questions nobody answered in this many hours. */
71
84
  unansweredAfterHours?: number;
@@ -78,7 +91,7 @@ export interface ReviewOptions {
78
91
  * owes what reads, where `inbox` reads only other people's newest few. Cut at the chat list's newest
79
92
  * message, as `inbox --new` is, so the next review starting at `until` misses nothing.
80
93
  */
81
- export declare const reviewIn: (adapter: InboxReader, { since, chat, all, unansweredAfterHours, now, enrich }: ReviewOptions) => Promise<Review>;
94
+ export declare const reviewIn: (adapter: InboxReader, { since, points, chat, kinds, all, unansweredAfterHours, now, enrich }: ReviewOptions) => Promise<Review>;
82
95
  /**
83
96
  * Questions from others still waiting, as max-cli counts them. A question is a message with `?` in
84
97
  * it, or a reply to the owner or an admin. It is answered when one of them replied to it, or was the
@@ -90,11 +103,16 @@ export declare const unanswered: (messages: Message[], { answerers, before }: {
90
103
  before: number;
91
104
  }) => Message[];
92
105
  export interface InboxService {
93
- /** Other people's unread messages; with `since` (ms, parsed by the caller), what arrived after it instead. */
106
+ /**
107
+ * Other people's unread messages; with `since` (ms, parsed by the caller), what arrived after it
108
+ * instead — after a chat's own point where `points` has one.
109
+ */
94
110
  read(options: {
95
111
  since?: number;
112
+ points?: ReadonlyMap<Id, number>;
96
113
  limit: number;
97
114
  all?: boolean;
115
+ kinds?: readonly ChatKind[];
98
116
  }): Promise<Inbox>;
99
117
  /** Every message, both sides, in each chat that changed since a point. */
100
118
  review(options: ReviewOptions): Promise<Review>;
@@ -1 +1 @@
1
- {"version":3,"file":"inbox.d.ts","sourceRoot":"","sources":["../../src/services/inbox.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"inbox.d.ts","sourceRoot":"","sources":["../../src/services/inbox.ts"],"names":[],"mappings":"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"}