@leemour/cli-messaging 0.94.0 → 0.96.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 (73) hide show
  1. package/dist/cli/bot/command.js +1 -1
  2. package/dist/cli/bot/command.js.map +1 -1
  3. package/dist/cli/messenger/conversations-command.d.ts.map +1 -1
  4. package/dist/cli/messenger/conversations-command.js +66 -0
  5. package/dist/cli/messenger/conversations-command.js.map +1 -1
  6. package/dist/cli/messenger/store-maintenance-command.d.ts.map +1 -1
  7. package/dist/cli/messenger/store-maintenance-command.js +50 -11
  8. package/dist/cli/messenger/store-maintenance-command.js.map +1 -1
  9. package/dist/cli/skill-command.d.ts.map +1 -1
  10. package/dist/cli/skill-command.js +5 -1
  11. package/dist/cli/skill-command.js.map +1 -1
  12. package/dist/search/query.d.ts +28 -0
  13. package/dist/search/query.d.ts.map +1 -0
  14. package/dist/search/query.js +109 -0
  15. package/dist/search/query.js.map +1 -0
  16. package/dist/search/trigrams.d.ts +7 -0
  17. package/dist/search/trigrams.d.ts.map +1 -0
  18. package/dist/search/trigrams.js +13 -0
  19. package/dist/search/trigrams.js.map +1 -0
  20. package/dist/sends/permissions.d.ts +1 -1
  21. package/dist/sends/permissions.d.ts.map +1 -1
  22. package/dist/sends/permissions.js +14 -1
  23. package/dist/sends/permissions.js.map +1 -1
  24. package/dist/services/conversations.d.ts +11 -1
  25. package/dist/services/conversations.d.ts.map +1 -1
  26. package/dist/services/conversations.js +8 -0
  27. package/dist/services/conversations.js.map +1 -1
  28. package/dist/services/messages.d.ts +2 -0
  29. package/dist/services/messages.d.ts.map +1 -1
  30. package/dist/services/messages.js +13 -6
  31. package/dist/services/messages.js.map +1 -1
  32. package/dist/sqlite-runtime.d.ts +29 -0
  33. package/dist/sqlite-runtime.d.ts.map +1 -0
  34. package/dist/sqlite-runtime.js +105 -0
  35. package/dist/sqlite-runtime.js.map +1 -0
  36. package/dist/store/drivers/bun-sqlite.d.ts +5 -0
  37. package/dist/store/drivers/bun-sqlite.d.ts.map +1 -1
  38. package/dist/store/drivers/bun-sqlite.js +24 -2
  39. package/dist/store/drivers/bun-sqlite.js.map +1 -1
  40. package/dist/store/index.d.ts +1 -0
  41. package/dist/store/index.d.ts.map +1 -1
  42. package/dist/store/index.js +1 -0
  43. package/dist/store/index.js.map +1 -1
  44. package/dist/store/open.d.ts +2 -0
  45. package/dist/store/open.d.ts.map +1 -1
  46. package/dist/store/open.js +10 -5
  47. package/dist/store/open.js.map +1 -1
  48. package/dist/store/sqlite/backfill.d.ts +2 -1
  49. package/dist/store/sqlite/backfill.d.ts.map +1 -1
  50. package/dist/store/sqlite/backfill.js +3 -1
  51. package/dist/store/sqlite/backfill.js.map +1 -1
  52. package/dist/store/sqlite/batches.d.ts +17 -3
  53. package/dist/store/sqlite/batches.d.ts.map +1 -1
  54. package/dist/store/sqlite/batches.js +93 -6
  55. package/dist/store/sqlite/batches.js.map +1 -1
  56. package/dist/store/sqlite/chats.d.ts +2 -0
  57. package/dist/store/sqlite/chats.d.ts.map +1 -1
  58. package/dist/store/sqlite/chats.js +6 -0
  59. package/dist/store/sqlite/chats.js.map +1 -1
  60. package/dist/store/sqlite/open.d.ts.map +1 -1
  61. package/dist/store/sqlite/open.js +2 -4
  62. package/dist/store/sqlite/open.js.map +1 -1
  63. package/dist/store/sqlite/search-index.d.ts +36 -0
  64. package/dist/store/sqlite/search-index.d.ts.map +1 -0
  65. package/dist/store/sqlite/search-index.js +131 -0
  66. package/dist/store/sqlite/search-index.js.map +1 -0
  67. package/dist/store/store.d.ts +29 -0
  68. package/dist/store/store.d.ts.map +1 -1
  69. package/dist/store/store.js +26 -0
  70. package/dist/store/store.js.map +1 -1
  71. package/package.json +8 -2
  72. package/parity.json +14 -14
  73. package/skills/link-conversations/SKILL.md +77 -0
@@ -6,12 +6,14 @@ export const pendingNormalization = (database) => Number(database.prepare("SELEC
6
6
  * Fills them in batches by `pk`, one short write transaction each, so other processes wait for one
7
7
  * batch at most. Stopping between batches loses nothing: the next run starts from what is left.
8
8
  */
9
- export const backfillNormalized = (database, { batch = 5_000, onBatch } = {}) => {
9
+ export const backfillNormalized = (database, { batch = 5_000, onBatch, until = () => false, } = {}) => {
10
10
  const next = database.prepare(`SELECT pk, text FROM messages WHERE normalized_text IS NULL AND deleted_at IS NULL AND pk > ? ORDER BY pk LIMIT ?`);
11
11
  const fill = database.prepare("UPDATE messages SET normalized_text = ?, normalizer_version = ? WHERE pk = ?");
12
12
  let filled = 0;
13
13
  let after = 0;
14
14
  for (;;) {
15
+ if (until())
16
+ return filled;
15
17
  database.exec("BEGIN IMMEDIATE");
16
18
  let rows;
17
19
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"backfill.js","sourceRoot":"","sources":["../../../src/store/sqlite/backfill.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAE/D,mGAAmG;AACnG,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,QAAuB,EAAU,EAAE,CACtE,MAAM,CACJ,QAAQ,CAAC,OAAO,CAAC,yFAAyF,CAAC,CAAC,GAAG,EAAE;IAC/G,EAAE,CAAC,CACN,CAAA;AAEH;;;GAGG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,QAAuB,EACvB,EAAE,KAAK,GAAG,KAAK,EAAE,OAAO,EAAE,GAA2D,EAAE,EAC/E,EAAE;IACV,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAC3B,mHAAmH,CACpH,CAAA;IACD,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,8EAA8E,CAAC,CAAA;IAC7G,IAAI,MAAM,GAAG,CAAC,CAAA;IACd,IAAI,KAAK,GAAG,CAAC,CAAA;IACb,SAAS,CAAC;QACR,QAAQ,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA;QAChC,IAAI,IAA+B,CAAA;QACnC,IAAI,CAAC;YACH,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;YAC7B,KAAK,MAAM,GAAG,IAAI,IAAI;gBAAE,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,kBAAkB,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAA;YACjG,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QACzB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;YACzB,MAAM,KAAK,CAAA;QACb,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,MAAM,CAAA;QACpC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAA;QACrB,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;QAC/B,OAAO,EAAE,CAAC,MAAM,CAAC,CAAA;IACnB,CAAC;AACH,CAAC,CAAA"}
1
+ {"version":3,"file":"backfill.js","sourceRoot":"","sources":["../../../src/store/sqlite/backfill.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAE/D,mGAAmG;AACnG,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,QAAuB,EAAU,EAAE,CACtE,MAAM,CACJ,QAAQ,CAAC,OAAO,CAAC,yFAAyF,CAAC,CAAC,GAAG,EAAE;IAC/G,EAAE,CAAC,CACN,CAAA;AAEH;;;GAGG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,QAAuB,EACvB,EACE,KAAK,GAAG,KAAK,EACb,OAAO,EACP,KAAK,GAAG,GAAG,EAAE,CAAC,KAAK,GACpB,GAAkF,EAAE,EAC7E,EAAE;IACV,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAC3B,mHAAmH,CACpH,CAAA;IACD,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,8EAA8E,CAAC,CAAA;IAC7G,IAAI,MAAM,GAAG,CAAC,CAAA;IACd,IAAI,KAAK,GAAG,CAAC,CAAA;IACb,SAAS,CAAC;QACR,IAAI,KAAK,EAAE;YAAE,OAAO,MAAM,CAAA;QAC1B,QAAQ,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA;QAChC,IAAI,IAA+B,CAAA;QACnC,IAAI,CAAC;YACH,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;YAC7B,KAAK,MAAM,GAAG,IAAI,IAAI;gBAAE,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,kBAAkB,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAA;YACjG,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QACzB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;YACzB,MAAM,KAAK,CAAA;QACb,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,MAAM,CAAA;QACpC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAA;QACrB,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;QAC/B,OAAO,EAAE,CAAC,MAAM,CAAC,CAAA;IACnB,CAAC;AACH,CAAC,CAAA"}
@@ -1,10 +1,14 @@
1
1
  import type { Id } from "../../domain/models.js";
2
- import type { LinkBatch } from "../store.js";
2
+ import type { AgentAnswer, LinkBatch } from "../store.js";
3
3
  import type { StoreContext } from "./open.js";
4
4
  /** How many messages before the first one to answer the agent sees: 97% of reply parents sit within 50. */
5
5
  export declare const BATCH_CONTEXT = 50;
6
- /** `b1.<chat>.<first>.<last>.<hash>`: the window's core, so an answer can be checked against it (A3). */
7
- export declare const batchId: (chatKey: number, core: number[]) => string;
6
+ /**
7
+ * `b1.<chat>.<first>.<last>.<hash>` (A3): the first and last message to answer, and a hash of every live
8
+ * message between them. Answering some of them leaves the id valid; a message added or deleted inside
9
+ * the window does not, so an answer is never checked against a window that moved.
10
+ */
11
+ export declare const batchId: (chatKey: number, span: number[]) => string;
8
12
  /** How much is left to answer, for the agent to tell the user before it starts (A7). */
9
13
  export declare const batchStatus: ({ orm }: StoreContext, chatKey: number) => {
10
14
  messages: number;
@@ -16,4 +20,14 @@ export declare const batchStatus: ({ orm }: StoreContext, chatKey: number) => {
16
20
  * messages before it. `undefined` when nothing is left to answer.
17
21
  */
18
22
  export declare const nextBatch: (context: StoreContext, chatKey: number, chatId: Id, size: number) => Omit<LinkBatch, "remaining"> | undefined;
23
+ /** The chat a batch id names, for the facade to check it belongs to the account. */
24
+ export declare const chatOfBatch: (id: string) => number | undefined;
25
+ /**
26
+ * The agent's answer to a batch (A5), checked whole before anything is stored: every message is one
27
+ * the batch asked about, each parent is in the batch and earlier, no message twice, confidence 0–1, a
28
+ * model named. A message's new answer replaces its earlier one. Runs inside the caller's transaction.
29
+ */
30
+ export declare const saveAnswers: (context: StoreContext, id: string, answer: AgentAnswer) => number;
31
+ /** Drops the agent's answers for a chat, or only one model's (A10); messages are never touched. */
32
+ export declare const clearAnswers: ({ orm }: StoreContext, chatKey: number, model: string | undefined) => number;
19
33
  //# sourceMappingURL=batches.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"batches.d.ts","sourceRoot":"","sources":["../../../src/store/sqlite/batches.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,wBAAwB,CAAA;AAChD,OAAO,KAAK,EAAgB,SAAS,EAAE,MAAM,aAAa,CAAA;AAE1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAG7C,2GAA2G;AAC3G,eAAO,MAAM,aAAa,KAAK,CAAA;AA6B/B,yGAAyG;AACzG,eAAO,MAAM,OAAO,YAAa,MAAM,QAAQ,MAAM,EAAE,KAAG,MAC2D,CAAA;AAErH,wFAAwF;AACxF,eAAO,MAAM,WAAW,YAAa,YAAY,WAAW,MAAM;IAKvD,QAAQ;IAA8B,UAAU;CAC1D,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,SAAS,YACX,YAAY,WACZ,MAAM,UACP,EAAE,QACJ,MAAM,KACX,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,GAAG,SA+BjC,CAAA"}
1
+ {"version":3,"file":"batches.d.ts","sourceRoot":"","sources":["../../../src/store/sqlite/batches.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,wBAAwB,CAAA;AAChD,OAAO,KAAK,EAAE,WAAW,EAAgB,SAAS,EAAE,MAAM,aAAa,CAAA;AAEvE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAG7C,2GAA2G;AAC3G,eAAO,MAAM,aAAa,KAAK,CAAA;AAiC/B;;;;GAIG;AACH,eAAO,MAAM,OAAO,YAAa,MAAM,QAAQ,MAAM,EAAE,KAAG,MAC2D,CAAA;AAErH,wFAAwF;AACxF,eAAO,MAAM,WAAW,YAAa,YAAY,WAAW,MAAM;IAKvD,QAAQ;IAA8B,UAAU;CAC1D,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,SAAS,YACX,YAAY,WACZ,MAAM,UACP,EAAE,QACJ,MAAM,KACX,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,GAAG,SAgCjC,CAAA;AA0ED,oFAAoF;AACpF,eAAO,MAAM,WAAW,OAAQ,MAAM,KAAG,MAAM,GAAG,SAGjD,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,WAAW,YAAa,YAAY,MAAM,MAAM,UAAU,WAAW,KAAG,MAuCpF,CAAA;AAED,mGAAmG;AACnG,eAAO,MAAM,YAAY,YAAa,YAAY,WAAW,MAAM,SAAS,MAAM,GAAG,SAAS,KAAG,MAM9F,CAAA"}
@@ -1,4 +1,5 @@
1
1
  import { createHash } from "node:crypto";
2
+ import { CliError } from "@leemour/cli-core";
2
3
  import { sql } from "./drizzle/core.js";
3
4
  import { toIso } from "./values.js";
4
5
  /** How many messages before the first one to answer the agent sees: 97% of reply parents sit within 50. */
@@ -7,16 +8,22 @@ export const BATCH_CONTEXT = 50;
7
8
  * Phase 4 plan A2: a live message the agent is asked about — no reply the messenger itself records to a
8
9
  * message held here, and no current agent answer. A stale answer makes it need the agent again.
9
10
  */
11
+ const replied = (m) => sql `EXISTS (SELECT 1 FROM messages p WHERE p.chat_pk = ${m}.chat_pk
12
+ AND p.native_id = ${m}.reply_to_native_id AND p.deleted_at IS NULL)`;
10
13
  const needsAgent = (m) => sql `(
11
- NOT EXISTS (SELECT 1 FROM messages p WHERE p.chat_pk = ${m}.chat_pk AND p.native_id = ${m}.reply_to_native_id
12
- AND p.deleted_at IS NULL)
14
+ NOT ${replied(m)}
13
15
  AND NOT EXISTS (SELECT 1 FROM message_links l WHERE l.message_pk = ${m}.pk AND l.source = 'agent'
14
16
  AND l.stale_at IS NULL))`;
15
17
  const COLUMNS = sql `m.pk, m.native_id, m.sent_at, m.text, coalesce(m.sender_chat_native_id, i.native_id) AS sender_id,
16
- m.sender_name, m.reply_to_native_id, m.thread_native_id, m.mentions, ${needsAgent(sql `m`)} AS needs`;
18
+ m.sender_name, m.reply_to_native_id, m.thread_native_id, m.mentions, ${needsAgent(sql `m`)} AS needs,
19
+ ${replied(sql `m`)} AS replied`;
17
20
  const FROM = sql `messages m LEFT JOIN identities i ON i.pk = m.sender_identity_pk`;
18
- /** `b1.<chat>.<first>.<last>.<hash>`: the window's core, so an answer can be checked against it (A3). */
19
- export const batchId = (chatKey, core) => `b1.${chatKey}.${core[0]}.${core.at(-1)}.${createHash("sha256").update(core.join(",")).digest("hex").slice(0, 12)}`;
21
+ /**
22
+ * `b1.<chat>.<first>.<last>.<hash>` (A3): the first and last message to answer, and a hash of every live
23
+ * message between them. Answering some of them leaves the id valid; a message added or deleted inside
24
+ * the window does not, so an answer is never checked against a window that moved.
25
+ */
26
+ export const batchId = (chatKey, span) => `b1.${chatKey}.${span[0]}.${span.at(-1)}.${createHash("sha256").update(span.join(",")).digest("hex").slice(0, 12)}`;
20
27
  /** How much is left to answer, for the agent to tell the user before it starts (A7). */
21
28
  export const batchStatus = ({ orm }, chatKey) => {
22
29
  const row = orm.get(sql `SELECT count(*) AS messages, sum(length(m.text)) AS characters FROM messages m
@@ -43,8 +50,9 @@ export const nextBatch = (context, chatKey, chatId, size) => {
43
50
  .reverse();
44
51
  const core = span.filter((row) => Number(row.needs) === 1);
45
52
  const candidates = candidatesOf(context, core.map(({ pk }) => pk));
53
+ const last = span.findLastIndex((row) => Number(row.needs) === 1);
46
54
  return {
47
- batch: batchId(chatKey, core.map(({ pk }) => pk)),
55
+ batch: batchId(chatKey, span.slice(0, last + 1).map(({ pk }) => pk)),
48
56
  chat: chatId,
49
57
  messages: [...before, ...span].map((row) => toBatchMessage(row, candidates.get(row.pk))),
50
58
  };
@@ -78,4 +86,83 @@ const toBatchMessage = (row, candidates) => ({
78
86
  answer: Number(row.needs) === 1,
79
87
  ...(Number(row.needs) === 1 ? { candidates: candidates ?? [] } : {}),
80
88
  });
89
+ const BATCH_ID = /^b1\.(\d+)\.(\d+)\.(\d+)\.[0-9a-f]{12}$/;
90
+ const refused = (why) => new CliError("validation_error", `the answer was not stored: ${why}`);
91
+ /** The messages a batch id names, read again: the context before it and the window itself. */
92
+ const windowOf = (context, id) => {
93
+ const { orm } = context;
94
+ const [, chat, first, last] = BATCH_ID.exec(id) ?? [];
95
+ if (!chat)
96
+ throw refused(`${id} is not a batch id from \`conversations batches next\``);
97
+ const chatKey = Number(chat);
98
+ const ends = orm.all(sql `SELECT pk, sent_at FROM messages WHERE chat_pk = ${chatKey} AND deleted_at IS NULL AND pk IN (${Number(first)}, ${Number(last)})
99
+ ORDER BY sent_at, pk`);
100
+ const [from, to] = ends.length === 1 ? [ends[0], ends[0]] : ends;
101
+ if (!from || !to)
102
+ throw refused("the chat changed under this batch — ask for a new one");
103
+ const live = sql `m.chat_pk = ${chatKey} AND m.deleted_at IS NULL`;
104
+ const span = orm.all(sql `SELECT ${COLUMNS} FROM ${FROM} WHERE ${live}
105
+ AND (m.sent_at, m.pk) >= (${from.sent_at}, ${from.pk}) AND (m.sent_at, m.pk) <= (${to.sent_at}, ${to.pk})
106
+ ORDER BY m.sent_at, m.pk`);
107
+ if (batchId(chatKey, span.map(({ pk }) => pk)) !== id) {
108
+ throw refused("the chat changed under this batch — ask for a new one");
109
+ }
110
+ const before = orm.all(sql `SELECT ${COLUMNS} FROM ${FROM} WHERE ${live} AND (m.sent_at, m.pk) < (${from.sent_at}, ${from.pk})
111
+ ORDER BY m.sent_at DESC, m.pk DESC LIMIT ${BATCH_CONTEXT}`);
112
+ return { chatKey, span, before };
113
+ };
114
+ /** The chat a batch id names, for the facade to check it belongs to the account. */
115
+ export const chatOfBatch = (id) => {
116
+ const chat = BATCH_ID.exec(id)?.[1];
117
+ return chat === undefined ? undefined : Number(chat);
118
+ };
119
+ /**
120
+ * The agent's answer to a batch (A5), checked whole before anything is stored: every message is one
121
+ * the batch asked about, each parent is in the batch and earlier, no message twice, confidence 0–1, a
122
+ * model named. A message's new answer replaces its earlier one. Runs inside the caller's transaction.
123
+ */
124
+ export const saveAnswers = (context, id, answer) => {
125
+ const { orm, now } = context;
126
+ if (!answer.model?.trim())
127
+ throw refused("name the model that answered (`model`)");
128
+ const { chatKey, span, before } = windowOf(context, id);
129
+ // Asked about: in the window and not a reply the messenger records. One answered earlier may be answered again.
130
+ const askable = new Map(span.filter((row) => Number(row.replied) === 0).map((row) => [row.native_id, row]));
131
+ const order = new Map([...before.reverse(), ...span].map((row, index) => [row.native_id, { index, pk: row.pk }]));
132
+ const seen = new Set();
133
+ const rows = answer.answers.map(({ message, parent, confidence }) => {
134
+ const asked = askable.get(String(message));
135
+ if (!asked)
136
+ throw refused(`message ${message} is not one this batch asks about`);
137
+ if (seen.has(asked.native_id))
138
+ throw refused(`message ${message} is answered twice`);
139
+ seen.add(asked.native_id);
140
+ if (typeof confidence !== "number" || !(confidence >= 0 && confidence <= 1)) {
141
+ throw refused(`the confidence for message ${message} is not between 0 and 1`);
142
+ }
143
+ if (parent === null)
144
+ return { messagePk: asked.pk, parentPk: null, confidence };
145
+ const found = order.get(String(parent));
146
+ if (!found)
147
+ throw refused(`the parent ${parent} of message ${message} is not in this batch`);
148
+ if (found.index >= (order.get(asked.native_id)?.index ?? -1)) {
149
+ throw refused(`the parent ${parent} of message ${message} is not earlier than it`);
150
+ }
151
+ return { messagePk: asked.pk, parentPk: found.pk, confidence };
152
+ });
153
+ if (rows.length === 0)
154
+ return 0;
155
+ const pks = sql.join(rows.map(({ messagePk }) => sql `${messagePk}`), sql `, `);
156
+ orm.run(sql `DELETE FROM message_links WHERE source = 'agent' AND message_pk IN (${pks})`);
157
+ const at = now();
158
+ for (const row of rows) {
159
+ orm.run(sql `INSERT INTO message_links (chat_pk, message_pk, parent_pk, source, kind, confidence, method, version, batch, created_at)
160
+ VALUES (${chatKey}, ${row.messagePk}, ${row.parentPk}, 'agent', 'answer', ${row.confidence}, ${answer.model.trim()},
161
+ ${answer.skill ?? null}, ${id}, ${at})`);
162
+ }
163
+ return rows.length;
164
+ };
165
+ /** Drops the agent's answers for a chat, or only one model's (A10); messages are never touched. */
166
+ export const clearAnswers = ({ orm }, chatKey, model) => Number(orm.all(sql `DELETE FROM message_links WHERE chat_pk = ${chatKey} AND source = 'agent'
167
+ ${model === undefined ? sql `` : sql `AND method = ${model}`} RETURNING 1 AS n`).length);
81
168
  //# sourceMappingURL=batches.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"batches.js","sourceRoot":"","sources":["../../../src/store/sqlite/batches.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"batches.js","sourceRoot":"","sources":["../../../src/store/sqlite/batches.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,8 @@
1
1
  import type { Chat, Id, Member, Page } from "../../domain/models.js";
2
2
  import type { AccountKey, StoredChatFilter } from "../store.js";
3
3
  import type { StoreContext } from "./open.js";
4
+ /** The chat's own id, when the store key is a chat of this account. */
5
+ export declare const chatOf: ({ orm }: StoreContext, accountKey: number, chatKey: number) => Id | undefined;
4
6
  export declare const findChatPk: ({ orm }: StoreContext, accountKey: number, chatId: Id) => number | undefined;
5
7
  /** A chat known only from its messages, until the chat list names it. */
6
8
  export declare const chatPkFor: (context: StoreContext, accountKey: number, chatId: Id) => number;
@@ -1 +1 @@
1
- {"version":3,"file":"chats.d.ts","sourceRoot":"","sources":["../../../src/store/sqlite/chats.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAA;AACpE,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAG/D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAc7C,eAAO,MAAM,UAAU,YAAa,YAAY,cAAc,MAAM,UAAU,EAAE,KAAG,MAAM,GAAG,SAK9E,CAAA;AAEd,yEAAyE;AACzE,eAAO,MAAM,SAAS,YAAa,YAAY,cAAc,MAAM,UAAU,EAAE,KAAG,MAQ/E,CAAA;AAEH,eAAO,MAAM,UAAU,iBAAkB,YAAY,cAAc,MAAM,QAAQ,IAAI,KAAG,IA+BvF,CAAA;AAED,0CAA0C;AAC1C,eAAO,MAAM,YAAY,YACd,YAAY,OAChB,UAAU,cACH,MAAM,UACV,EAAE,aACC,EAAE,EAAE,KACd,IASF,CAAA;AAED,eAAO,MAAM,OAAO,YAAa,YAAY,WAAW,MAAM,KAAG,MAAM,EAO7D,CAAA;AAMV,gGAAgG;AAChG,eAAO,MAAM,QAAQ,YAAa,YAAY,cAAc,MAAM,WAAW,EAAE,EAAE,KAAG,MAYnE,CAAA;AAEjB,8DAA8D;AAC9D,eAAO,MAAM,SAAS,YAAa,YAAY,cAAc,MAAM,KAAG;IAAE,GAAG,EAAE,MAAM,EAAE,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAYtG,CAAA;AAED,qGAAqG;AACrG,eAAO,MAAM,UAAU,YAAa,YAAY,OAAO,MAAM,EAAE,KAAG,IAWjE,CAAA;AAED,eAAO,MAAM,SAAS,YAAa,YAAY,cAAc,MAAM,OAAO,UAAU,YAAY,EAAE,KAAG,IAAI,EAgBrE,CAAA;AAiBpC,eAAO,MAAM,SAAS,YACX,YAAY,cACT,MAAM,gCACgB;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,gBAAgB,KACvF,IAAI,CAAC,IAAI,CAUX,CAAA;AAED,eAAO,MAAM,UAAU,YAAa,YAAY,cAAc,MAAM,UAAU,gBAAgB,KAAG,MACY,CAAA"}
1
+ {"version":3,"file":"chats.d.ts","sourceRoot":"","sources":["../../../src/store/sqlite/chats.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAA;AACpE,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAG/D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAc7C,uEAAuE;AACvE,eAAO,MAAM,MAAM,YAAa,YAAY,cAAc,MAAM,WAAW,MAAM,KAAG,EAAE,GAAG,SAK3E,CAAA;AAEd,eAAO,MAAM,UAAU,YAAa,YAAY,cAAc,MAAM,UAAU,EAAE,KAAG,MAAM,GAAG,SAK9E,CAAA;AAEd,yEAAyE;AACzE,eAAO,MAAM,SAAS,YAAa,YAAY,cAAc,MAAM,UAAU,EAAE,KAAG,MAQ/E,CAAA;AAEH,eAAO,MAAM,UAAU,iBAAkB,YAAY,cAAc,MAAM,QAAQ,IAAI,KAAG,IA+BvF,CAAA;AAED,0CAA0C;AAC1C,eAAO,MAAM,YAAY,YACd,YAAY,OAChB,UAAU,cACH,MAAM,UACV,EAAE,aACC,EAAE,EAAE,KACd,IASF,CAAA;AAED,eAAO,MAAM,OAAO,YAAa,YAAY,WAAW,MAAM,KAAG,MAAM,EAO7D,CAAA;AAMV,gGAAgG;AAChG,eAAO,MAAM,QAAQ,YAAa,YAAY,cAAc,MAAM,WAAW,EAAE,EAAE,KAAG,MAYnE,CAAA;AAEjB,8DAA8D;AAC9D,eAAO,MAAM,SAAS,YAAa,YAAY,cAAc,MAAM,KAAG;IAAE,GAAG,EAAE,MAAM,EAAE,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAYtG,CAAA;AAED,qGAAqG;AACrG,eAAO,MAAM,UAAU,YAAa,YAAY,OAAO,MAAM,EAAE,KAAG,IAWjE,CAAA;AAED,eAAO,MAAM,SAAS,YAAa,YAAY,cAAc,MAAM,OAAO,UAAU,YAAY,EAAE,KAAG,IAAI,EAgBrE,CAAA;AAiBpC,eAAO,MAAM,SAAS,YACX,YAAY,cACT,MAAM,gCACgB;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,gBAAgB,KACvF,IAAI,CAAC,IAAI,CAUX,CAAA;AAED,eAAO,MAAM,UAAU,YAAa,YAAY,cAAc,MAAM,UAAU,gBAAgB,KAAG,MACY,CAAA"}
@@ -3,6 +3,12 @@ import { and, eq, gt, inArray, sql } from "./drizzle/core.js";
3
3
  import { identityPk } from "./identities.js";
4
4
  import { attachments, chatMembers, chats, fetchLeases, identities, messageRevisions, messages, syncRanges, transcripts, } from "./schema.js";
5
5
  import { json, parsed, present, toIso, toMs } from "./values.js";
6
+ /** The chat's own id, when the store key is a chat of this account. */
7
+ export const chatOf = ({ orm }, accountKey, chatKey) => orm
8
+ .select({ id: chats.nativeId })
9
+ .from(chats)
10
+ .where(and(eq(chats.pk, chatKey), eq(chats.accountPk, accountKey)))
11
+ .get()?.id;
6
12
  export const findChatPk = ({ orm }, accountKey, chatId) => orm
7
13
  .select({ pk: chats.pk })
8
14
  .from(chats)
@@ -1 +1 @@
1
- {"version":3,"file":"chats.js","sourceRoot":"","sources":["../../../src/store/sqlite/chats.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"chats.js","sourceRoot":"","sources":["../../../src/store/sqlite/chats.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"open.d.ts","sourceRoot":"","sources":["../../../src/store/sqlite/open.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAW,MAAM,cAAc,CAAA;AAE1D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AAE5D,qGAAqG;AACrG,MAAM,MAAM,GAAG,GAAG,mBAAmB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAEtD,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,aAAa,CAAA;IACvB,GAAG,EAAE,GAAG,CAAA;CACT;AAED,+FAA+F;AAC/F,MAAM,WAAW,YAAa,SAAQ,YAAY;IAChD,GAAG,EAAE,MAAM,MAAM,CAAA;CAClB;AAED;;;;;GAKG;AACH,eAAO,MAAM,UAAU,SAAgB,MAAM,KAAG,OAAO,CAAC,YAAY,CAInE,CAAA"}
1
+ {"version":3,"file":"open.d.ts","sourceRoot":"","sources":["../../../src/store/sqlite/open.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAW,MAAM,cAAc,CAAA;AAC1D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AAE5D,qGAAqG;AACrG,MAAM,MAAM,GAAG,GAAG,mBAAmB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAEtD,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,aAAa,CAAA;IACvB,GAAG,EAAE,GAAG,CAAA;CACT;AAED,+FAA+F;AAC/F,MAAM,WAAW,YAAa,SAAQ,YAAY;IAChD,GAAG,EAAE,MAAM,MAAM,CAAA;CAClB;AAED;;;;;GAKG;AACH,eAAO,MAAM,UAAU,SAAgB,MAAM,KAAG,OAAO,CAAC,YAAY,CAInE,CAAA"}
@@ -18,11 +18,9 @@ const openUnderNode = async (path) => {
18
18
  return { database: cacheOverNodeSqlite(client), orm: drizzle({ client }) };
19
19
  };
20
20
  const openUnderBun = async (path) => {
21
- // A variable, not a literal: TypeScript would resolve `bun:sqlite`, whose types are not installed.
22
- const runtime = "bun:sqlite";
23
- const { Database } = (await import(runtime));
21
+ const { bunDatabase, cacheOverBunSqlite } = await import("../drivers/bun-sqlite.js");
22
+ const Database = await bunDatabase();
24
23
  const { drizzle } = (await import("./drizzle/bun.js"));
25
- const { cacheOverBunSqlite } = await import("../drivers/bun-sqlite.js");
26
24
  const client = new Database(path);
27
25
  return { database: cacheOverBunSqlite(client), orm: drizzle({ client }) };
28
26
  };
@@ -1 +1 @@
1
- {"version":3,"file":"open.js","sourceRoot":"","sources":["../../../src/store/sqlite/open.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,OAAO,EAAE,MAAM,cAAc,CAAA;AAiB1D;;;;;GAKG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,KAAK,EAAE,IAAY,EAAyB,EAAE;IACtE,MAAM,MAAM,GAAG,KAAK,IAAI,UAAU,CAAC,CAAC,CAAC,MAAM,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,aAAa,CAAC,IAAI,CAAC,CAAA;IACzF,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAC7B,OAAO,MAAM,CAAA;AACf,CAAC,CAAA;AAED,MAAM,aAAa,GAAG,KAAK,EAAE,IAAY,EAAyB,EAAE;IAClE,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAA;IACpD,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAA;IACrD,MAAM,EAAE,mBAAmB,EAAE,GAAG,MAAM,MAAM,CAAC,2BAA2B,CAAC,CAAA;IACzE,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,CAAA;IACrC,OAAO,EAAE,QAAQ,EAAE,mBAAmB,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAmB,EAAE,CAAA;AAC9F,CAAC,CAAA;AAED,MAAM,YAAY,GAAG,KAAK,EAAE,IAAY,EAAyB,EAAE;IACjE,mGAAmG;IACnG,MAAM,OAAO,GAAG,YAAY,CAAA;IAC5B,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC,CAAoD,CAAA;IAC/F,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAEpD,CAAA;IACD,MAAM,EAAE,kBAAkB,EAAE,GAAG,MAAM,MAAM,CAAC,0BAA0B,CAAC,CAAA;IACvE,MAAM,MAAM,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAA;IACjC,OAAO,EAAE,QAAQ,EAAE,kBAAkB,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAQ,EAAE,CAAA;AAClF,CAAC,CAAA"}
1
+ {"version":3,"file":"open.js","sourceRoot":"","sources":["../../../src/store/sqlite/open.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,OAAO,EAAE,MAAM,cAAc,CAAA;AAgB1D;;;;;GAKG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,KAAK,EAAE,IAAY,EAAyB,EAAE;IACtE,MAAM,MAAM,GAAG,KAAK,IAAI,UAAU,CAAC,CAAC,CAAC,MAAM,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,aAAa,CAAC,IAAI,CAAC,CAAA;IACzF,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAC7B,OAAO,MAAM,CAAA;AACf,CAAC,CAAA;AAED,MAAM,aAAa,GAAG,KAAK,EAAE,IAAY,EAAyB,EAAE;IAClE,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAA;IACpD,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAA;IACrD,MAAM,EAAE,mBAAmB,EAAE,GAAG,MAAM,MAAM,CAAC,2BAA2B,CAAC,CAAA;IACzE,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,CAAA;IACrC,OAAO,EAAE,QAAQ,EAAE,mBAAmB,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAmB,EAAE,CAAA;AAC9F,CAAC,CAAA;AAED,MAAM,YAAY,GAAG,KAAK,EAAE,IAAY,EAAyB,EAAE;IACjE,MAAM,EAAE,WAAW,EAAE,kBAAkB,EAAE,GAAG,MAAM,MAAM,CAAC,0BAA0B,CAAC,CAAA;IACpF,MAAM,QAAQ,GAAG,MAAM,WAAW,EAAE,CAAA;IACpC,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAEpD,CAAA;IACD,MAAM,MAAM,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAA;IACjC,OAAO,EAAE,QAAQ,EAAE,kBAAkB,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAQ,EAAE,CAAA;AAClF,CAAC,CAAA"}
@@ -0,0 +1,36 @@
1
+ import type { CacheDatabase } from "../driver.js";
2
+ export interface SearchIndexState {
3
+ /** The highest message the batches must reach; newer ones are indexed by triggers. */
4
+ watermark: number;
5
+ filledThrough: number;
6
+ pendingNormalization: number;
7
+ /** Every live message is in the word index: search may rank by words. */
8
+ ready: boolean;
9
+ /** The typo vocabulary covers the messages up to this one; 0 while it is not built. */
10
+ termsThrough: number;
11
+ builtAt: string | null;
12
+ }
13
+ export interface SearchIndexFill {
14
+ normalized: number;
15
+ indexed: number;
16
+ terms: number;
17
+ }
18
+ /** `undefined` on a file before version 12, which has no word index. */
19
+ export declare const searchIndexState: (database: CacheDatabase) => SearchIndexState | undefined;
20
+ /**
21
+ * Brings the word index to "ready", in short write transactions so other processes wait for one batch
22
+ * at most: the normalized text first — a message without it cannot be indexed — then the messages up
23
+ * to the watermark, then the typo vocabulary. `until` stops it between batches; stopping loses nothing.
24
+ */
25
+ export declare const fillSearchIndex: (database: CacheDatabase, { batch, until, onBatch, now, }?: {
26
+ batch?: number;
27
+ until?: () => boolean;
28
+ onBatch?: (step: string, done: number) => void;
29
+ now?: () => number;
30
+ }) => SearchIndexFill;
31
+ /**
32
+ * Empties the word index and its vocabulary and starts the fill again from the newest message — for
33
+ * `store reindex`. Messages written meanwhile are indexed by the triggers, as after the migration.
34
+ */
35
+ export declare const resetSearchIndex: (database: CacheDatabase) => void;
36
+ //# sourceMappingURL=search-index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-index.d.ts","sourceRoot":"","sources":["../../../src/store/sqlite/search-index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAKjD,MAAM,WAAW,gBAAgB;IAC/B,sFAAsF;IACtF,SAAS,EAAE,MAAM,CAAA;IACjB,aAAa,EAAE,MAAM,CAAA;IACrB,oBAAoB,EAAE,MAAM,CAAA;IAC5B,yEAAyE;IACzE,KAAK,EAAE,OAAO,CAAA;IACd,uFAAuF;IACvF,YAAY,EAAE,MAAM,CAAA;IACpB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;CACvB;AAED,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;CACd;AAED,wEAAwE;AACxE,eAAO,MAAM,gBAAgB,aAAc,aAAa,KAAG,gBAAgB,GAAG,SAkB7E,CAAA;AAcD;;;;GAIG;AACH,eAAO,MAAM,eAAe,aAChB,aAAa,oCAMpB;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;CAAE,KAC/G,eAqCF,CAAA;AAwCD;;;GAGG;AACH,eAAO,MAAM,gBAAgB,aAAc,aAAa,KAAG,IAa1D,CAAA"}
@@ -0,0 +1,131 @@
1
+ import { trigrams } from "../../search/trigrams.js";
2
+ import { backfillNormalized, pendingNormalization } from "./backfill.js";
3
+ const INDEX = "message_words";
4
+ /** `undefined` on a file before version 12, which has no word index. */
5
+ export const searchIndexState = (database) => {
6
+ const exists = database.prepare("SELECT 1 FROM sqlite_master WHERE name = 'search_index_state'").get();
7
+ if (!exists)
8
+ return undefined;
9
+ const row = database
10
+ .prepare("SELECT watermark, filled_through, terms_through, built_at FROM search_index_state WHERE name = ?")
11
+ .get(INDEX);
12
+ if (!row)
13
+ return undefined;
14
+ const watermark = Number(row.watermark);
15
+ const filledThrough = Number(row.filled_through);
16
+ const pending = pendingNormalization(database);
17
+ return {
18
+ watermark,
19
+ filledThrough,
20
+ pendingNormalization: pending,
21
+ ready: filledThrough >= watermark && pending === 0,
22
+ termsThrough: Number(row.terms_through),
23
+ builtAt: row.built_at === null ? null : new Date(Number(row.built_at)).toISOString(),
24
+ };
25
+ };
26
+ const inBatch = (database, body) => {
27
+ database.exec("BEGIN IMMEDIATE");
28
+ try {
29
+ const result = body();
30
+ database.exec("COMMIT");
31
+ return result;
32
+ }
33
+ catch (error) {
34
+ database.exec("ROLLBACK");
35
+ throw error;
36
+ }
37
+ };
38
+ /**
39
+ * Brings the word index to "ready", in short write transactions so other processes wait for one batch
40
+ * at most: the normalized text first — a message without it cannot be indexed — then the messages up
41
+ * to the watermark, then the typo vocabulary. `until` stops it between batches; stopping loses nothing.
42
+ */
43
+ export const fillSearchIndex = (database, { batch = 5_000, until = () => false, onBatch, now = Date.now, } = {}) => {
44
+ const filled = { normalized: 0, indexed: 0, terms: 0 };
45
+ const before = searchIndexState(database);
46
+ // Every search asks; when all is built it must not take the write lock.
47
+ if (!before || (before.ready && before.termsThrough > 0))
48
+ return filled;
49
+ if (before.pendingNormalization > 0) {
50
+ filled.normalized = backfillNormalized(database, {
51
+ batch,
52
+ until,
53
+ onBatch: (done) => onBatch?.("normalized", done),
54
+ });
55
+ }
56
+ const index = database.prepare(`INSERT OR REPLACE INTO message_words (rowid, normalized_text, scope)
57
+ SELECT pk, normalized_text, 'c' || chat_pk || coalesce(' s' || sender_identity_pk, '')
58
+ FROM messages WHERE pk > ? AND pk <= ? AND normalized_text <> ''`);
59
+ const advance = database.prepare("UPDATE search_index_state SET filled_through = ? WHERE name = ?");
60
+ for (;;) {
61
+ const state = searchIndexState(database);
62
+ if (!state || state.filledThrough >= state.watermark || until())
63
+ break;
64
+ const to = Math.min(state.filledThrough + batch, state.watermark);
65
+ filled.indexed += inBatch(database, () => {
66
+ const { changes } = index.run(state.filledThrough, to);
67
+ advance.run(to, INDEX);
68
+ return changes;
69
+ });
70
+ onBatch?.("indexed", filled.indexed);
71
+ }
72
+ const state = searchIndexState(database);
73
+ if (state && state.filledThrough >= state.watermark && state.builtAt === null) {
74
+ database.prepare("UPDATE search_index_state SET built_at = ? WHERE name = ?").run(now(), INDEX);
75
+ }
76
+ if (state?.ready && state.termsThrough === 0)
77
+ filled.terms = buildTerms(database, { batch, until, onBatch });
78
+ return filled;
79
+ };
80
+ /**
81
+ * The typo vocabulary, from the index's own list of words — `col`, so the chat and sender tokens are
82
+ * never words. In term order, each batch committed, so a run stopped half-way resumes after the last
83
+ * term it wrote. Numbers get no trigrams: a mistyped number is another number, not a typo.
84
+ */
85
+ const buildTerms = (database, { batch, until, onBatch }) => {
86
+ const through = Number(database.prepare("SELECT coalesce(max(pk), 0) AS pk FROM messages").get()?.pk);
87
+ const next = database.prepare(`SELECT term FROM message_words_vocab WHERE col = 'normalized_text' AND term > ? ORDER BY term LIMIT ?`);
88
+ const term = database.prepare("INSERT OR IGNORE INTO search_terms (term, length) VALUES (?, ?)");
89
+ const trigram = database.prepare("INSERT OR IGNORE INTO search_term_trigrams (trigram, length, term) VALUES (?, ?, ?)");
90
+ let after = String(database.prepare("SELECT coalesce(max(term), '') AS term FROM search_terms").get()?.term);
91
+ let written = 0;
92
+ for (;;) {
93
+ if (until())
94
+ return written;
95
+ const terms = next.all(after, batch).map((row) => String(row.term));
96
+ if (terms.length === 0)
97
+ break;
98
+ inBatch(database, () => {
99
+ for (const word of terms) {
100
+ term.run(word, word.length);
101
+ if (!/^\d+$/.test(word))
102
+ for (const piece of trigrams(word))
103
+ trigram.run(piece, word.length, word);
104
+ }
105
+ });
106
+ written += terms.length;
107
+ after = terms.at(-1) ?? after;
108
+ onBatch?.("terms", written);
109
+ }
110
+ // 0 means "not built", so an empty file still records that it was.
111
+ database.prepare("UPDATE search_index_state SET terms_through = ? WHERE name = ?").run(Math.max(through, 1), INDEX);
112
+ return written;
113
+ };
114
+ /**
115
+ * Empties the word index and its vocabulary and starts the fill again from the newest message — for
116
+ * `store reindex`. Messages written meanwhile are indexed by the triggers, as after the migration.
117
+ */
118
+ export const resetSearchIndex = (database) => {
119
+ if (!searchIndexState(database))
120
+ return;
121
+ inBatch(database, () => {
122
+ database.exec(`INSERT INTO ${INDEX} (${INDEX}) VALUES ('delete-all')`);
123
+ database.exec("DELETE FROM search_terms");
124
+ database.exec("DELETE FROM search_term_trigrams");
125
+ database
126
+ .prepare(`UPDATE search_index_state SET watermark = (SELECT coalesce(max(pk), 0) FROM messages),
127
+ filled_through = 0, terms_through = 0, built_at = NULL WHERE name = ?`)
128
+ .run(INDEX);
129
+ });
130
+ };
131
+ //# sourceMappingURL=search-index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-index.js","sourceRoot":"","sources":["../../../src/store/sqlite/search-index.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import type { Link, LinkInput } from "../conversations/link.js";
2
2
  import type { Chat, Contact, Id, Member, Message, MessageHit, Page, Provider, Reactions, WindowedMessage } from "../domain/models.js";
3
3
  import type { PeopleLookup } from "../resolve.js";
4
+ import type { SearchIndexFill, SearchIndexState } from "./sqlite/search-index.js";
4
5
  /** Which account of which messenger a call is about. */
5
6
  export interface AccountKey {
6
7
  provider: Provider;
@@ -139,6 +140,13 @@ export interface MessageStore {
139
140
  links(key: AccountKey, chatId: Id, messageId: Id): Promise<StoredLink[]>;
140
141
  /** The user's agent's current answer per message: its parent, or `null` for "starts a conversation". */
141
142
  agentAnswers(key: AccountKey, chatId: Id): Promise<Map<Id, Id | null>>;
143
+ /** Stores the agent's answer to a batch, checked whole first; answers how many were stored (A5). */
144
+ saveAnswers(key: AccountKey, batch: string, answer: AgentAnswer): Promise<{
145
+ chat: Id;
146
+ stored: number;
147
+ }>;
148
+ /** Drops the agent's answers for a chat, or one model's; answers how many. Messages are never touched. */
149
+ clearAnswers(key: AccountKey, chatId: Id, model?: string): Promise<number>;
142
150
  /** How many messages still need the user's agent, and their characters (phase 4). */
143
151
  batchStatus(key: AccountKey, chatId: Id): Promise<{
144
152
  messages: number;
@@ -222,6 +230,15 @@ export interface MessageStore {
222
230
  }): Promise<Page<StoredHit>>;
223
231
  /** Newest first — by text, by who wrote it, or both. */
224
232
  find(filter: MessageFilter): Promise<Page<StoredHit>>;
233
+ /** How far the word index is built; `undefined` on a file before it existed. */
234
+ searchIndexState(): Promise<SearchIndexState | undefined>;
235
+ /**
236
+ * Builds the word index towards "ready" in short batches — the normalized text, the messages up to
237
+ * the watermark, the typo vocabulary — until done or `until` says stop. Each batch is its own write.
238
+ */
239
+ fillSearchIndex(options?: {
240
+ until?: () => boolean;
241
+ }): Promise<SearchIndexFill>;
225
242
  savePeople(key: AccountKey, people: PersonFacts[]): Promise<void>;
226
243
  /**
227
244
  * The people this account has a one-to-one chat with — as far as the saved member lists go —
@@ -309,6 +326,18 @@ export interface BatchMessage {
309
326
  confidence: number;
310
327
  }[];
311
328
  }
329
+ /** What the user's agent returns for a batch (phase 4 plan A5), as read from stdin. */
330
+ export interface AgentAnswer {
331
+ /** The model that answered; stored as the link's method. */
332
+ model: string;
333
+ /** The skill's version, when the skill sends it. */
334
+ skill?: string;
335
+ answers: {
336
+ message: Id;
337
+ parent: Id | null;
338
+ confidence: number;
339
+ }[];
340
+ }
312
341
  /** A window of a chat for the agent: the messages to answer and the ones before them (A1). */
313
342
  export interface LinkBatch {
314
343
  /** Names the window, so an answer can be checked against it (A3). */