@leemour/cli-messaging 0.47.0 → 0.49.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 (53) hide show
  1. package/README.md +1 -1
  2. package/dist/cli/messenger/mcp-command.d.ts +1 -0
  3. package/dist/cli/messenger/mcp-command.d.ts.map +1 -1
  4. package/dist/cli/messenger/mcp-command.js +7 -4
  5. package/dist/cli/messenger/mcp-command.js.map +1 -1
  6. package/dist/cli/messenger/messages-command.d.ts.map +1 -1
  7. package/dist/cli/messenger/messages-command.js +2 -0
  8. package/dist/cli/messenger/messages-command.js.map +1 -1
  9. package/dist/cli/messenger/messages-delete-command.d.ts +24 -0
  10. package/dist/cli/messenger/messages-delete-command.d.ts.map +1 -0
  11. package/dist/cli/messenger/messages-delete-command.js +44 -0
  12. package/dist/cli/messenger/messages-delete-command.js.map +1 -0
  13. package/dist/cli/messenger/port.d.ts +4 -0
  14. package/dist/cli/messenger/port.d.ts.map +1 -1
  15. package/dist/cli/messenger/port.js.map +1 -1
  16. package/dist/domain/models.d.ts +4 -0
  17. package/dist/domain/models.d.ts.map +1 -1
  18. package/dist/mcp/instructions.d.ts +2 -1
  19. package/dist/mcp/instructions.d.ts.map +1 -1
  20. package/dist/mcp/instructions.js +6 -1
  21. package/dist/mcp/instructions.js.map +1 -1
  22. package/dist/mcp/server.d.ts +2 -1
  23. package/dist/mcp/server.d.ts.map +1 -1
  24. package/dist/mcp/server.js +4 -2
  25. package/dist/mcp/server.js.map +1 -1
  26. package/dist/mcp/tools/messages-delete.d.ts +4 -0
  27. package/dist/mcp/tools/messages-delete.d.ts.map +1 -0
  28. package/dist/mcp/tools/messages-delete.js +19 -0
  29. package/dist/mcp/tools/messages-delete.js.map +1 -0
  30. package/dist/mcp/tools.d.ts +2 -0
  31. package/dist/mcp/tools.d.ts.map +1 -1
  32. package/dist/mcp/tools.js +3 -0
  33. package/dist/mcp/tools.js.map +1 -1
  34. package/dist/store/sqlite/backfill.d.ts +12 -0
  35. package/dist/store/sqlite/backfill.d.ts.map +1 -0
  36. package/dist/store/sqlite/backfill.js +34 -0
  37. package/dist/store/sqlite/backfill.js.map +1 -0
  38. package/dist/store/sqlite/manifest.d.ts +3 -1
  39. package/dist/store/sqlite/manifest.d.ts.map +1 -1
  40. package/dist/store/sqlite/manifest.js +27 -9
  41. package/dist/store/sqlite/manifest.js.map +1 -1
  42. package/dist/store/sqlite/migrations.generated.d.ts.map +1 -1
  43. package/dist/store/sqlite/migrations.generated.js +22 -0
  44. package/dist/store/sqlite/migrations.generated.js.map +1 -1
  45. package/dist/store/sqlite/schema.d.ts +97 -1
  46. package/dist/store/sqlite/schema.d.ts.map +1 -1
  47. package/dist/store/sqlite/schema.js +12 -2
  48. package/dist/store/sqlite/schema.js.map +1 -1
  49. package/dist/store/store.d.ts +2 -0
  50. package/dist/store/store.d.ts.map +1 -1
  51. package/dist/store/store.js +22 -9
  52. package/dist/store/store.js.map +1 -1
  53. package/package.json +3 -1
package/dist/mcp/tools.js CHANGED
@@ -5,6 +5,7 @@ import { contactsTools } from "./tools/contacts.js";
5
5
  import { inboxTools } from "./tools/inbox.js";
6
6
  import { messagesTools } from "./tools/messages.js";
7
7
  import { messageActionTools } from "./tools/messages-actions.js";
8
+ import { messageDeleteTools } from "./tools/messages-delete.js";
8
9
  import { messagesPhotoTools } from "./tools/messages-photo.js";
9
10
  import { messageSendTools } from "./tools/messages-send.js";
10
11
  import { messagesTranscribeTools } from "./tools/messages-transcribe.js";
@@ -28,6 +29,8 @@ export const readTools = (messenger) => ({
28
29
  });
29
30
  /** Offered only with `--allow-mark-read`, which `--allow-send` does not imply: the other side sees it. */
30
31
  export const markReadTools = (messenger) => chatsReadTools(messenger);
32
+ /** Offered only with `--allow-delete`: the owner's own copy, never for everyone — that is the command's alone. */
33
+ export const deleteTools = (messenger) => messageDeleteTools(messenger);
31
34
  /** Offered only with `--allow-send`. */
32
35
  export const sendTools = (messenger) => ({
33
36
  ...messageSendTools(messenger),
@@ -1 +1 @@
1
- {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/mcp/tools.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAA;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAC3D,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAA;AACxE,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAE/C;;;GAGG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,SAAoB,EAA2B,EAAE,CAAC,CAAC;IAC3E,GAAG,UAAU,CAAC,SAAS,CAAC;IACxB,GAAG,WAAW,CAAC,SAAS,CAAC;IACzB,GAAG,WAAW,CAAC,SAAS,CAAC;IACzB,GAAG,YAAY,CAAC,SAAS,CAAC;IAC1B,GAAG,UAAU,CAAC,SAAS,CAAC;IACxB,GAAG,aAAa,CAAC,SAAS,CAAC;IAC3B,GAAG,aAAa,CAAC,SAAS,CAAC;IAC3B,GAAG,kBAAkB,CAAC,SAAS,CAAC;IAChC,GAAG,uBAAuB,CAAC,SAAS,CAAC;CACtC,CAAC,CAAA;AAEF,0GAA0G;AAC1G,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,SAAoB,EAA2B,EAAE,CAAC,cAAc,CAAC,SAAS,CAAC,CAAA;AAEzG,wCAAwC;AACxC,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,SAAoB,EAA2B,EAAE,CAAC,CAAC;IAC3E,GAAG,gBAAgB,CAAC,SAAS,CAAC;IAC9B,GAAG,kBAAkB,CAAC,SAAS,CAAC;IAChC,GAAG,aAAa,CAAC,SAAS,CAAC;CAC5B,CAAC,CAAA"}
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/mcp/tools.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAA;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAC3D,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAA;AACxE,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAE/C;;;GAGG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,SAAoB,EAA2B,EAAE,CAAC,CAAC;IAC3E,GAAG,UAAU,CAAC,SAAS,CAAC;IACxB,GAAG,WAAW,CAAC,SAAS,CAAC;IACzB,GAAG,WAAW,CAAC,SAAS,CAAC;IACzB,GAAG,YAAY,CAAC,SAAS,CAAC;IAC1B,GAAG,UAAU,CAAC,SAAS,CAAC;IACxB,GAAG,aAAa,CAAC,SAAS,CAAC;IAC3B,GAAG,aAAa,CAAC,SAAS,CAAC;IAC3B,GAAG,kBAAkB,CAAC,SAAS,CAAC;IAChC,GAAG,uBAAuB,CAAC,SAAS,CAAC;CACtC,CAAC,CAAA;AAEF,0GAA0G;AAC1G,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,SAAoB,EAA2B,EAAE,CAAC,cAAc,CAAC,SAAS,CAAC,CAAA;AAEzG,kHAAkH;AAClH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,SAAoB,EAA2B,EAAE,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAA;AAE3G,wCAAwC;AACxC,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,SAAoB,EAA2B,EAAE,CAAC,CAAC;IAC3E,GAAG,gBAAgB,CAAC,SAAS,CAAC;IAC9B,GAAG,kBAAkB,CAAC,SAAS,CAAC;IAChC,GAAG,aAAa,CAAC,SAAS,CAAC;CAC5B,CAAC,CAAA"}
@@ -0,0 +1,12 @@
1
+ import type { CacheDatabase } from "../driver.js";
2
+ /** Live messages stored before version 6, still without their normalized text. An index lookup. */
3
+ export declare const pendingNormalization: (database: CacheDatabase) => number;
4
+ /**
5
+ * Fills them in batches by `pk`, one short write transaction each, so other processes wait for one
6
+ * batch at most. Stopping between batches loses nothing: the next run starts from what is left.
7
+ */
8
+ export declare const backfillNormalized: (database: CacheDatabase, { batch, onBatch }?: {
9
+ batch?: number;
10
+ onBatch?: (filled: number) => void;
11
+ }) => number;
12
+ //# sourceMappingURL=backfill.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backfill.d.ts","sourceRoot":"","sources":["../../../src/store/sqlite/backfill.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAGjD,mGAAmG;AACnG,eAAO,MAAM,oBAAoB,aAAc,aAAa,KAAG,MAI5D,CAAA;AAEH;;;GAGG;AACH,eAAO,MAAM,kBAAkB,aACnB,aAAa,uBACK;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;CAAE,KACjF,MAuBF,CAAA"}
@@ -0,0 +1,34 @@
1
+ import { NORMALIZER_VERSION, normalize } from "../normalize.js";
2
+ /** Live messages stored before version 6, still without their normalized text. An index lookup. */
3
+ export const pendingNormalization = (database) => Number(database.prepare("SELECT count(*) AS n FROM messages WHERE normalized_text IS NULL AND deleted_at IS NULL").get()
4
+ ?.n);
5
+ /**
6
+ * Fills them in batches by `pk`, one short write transaction each, so other processes wait for one
7
+ * batch at most. Stopping between batches loses nothing: the next run starts from what is left.
8
+ */
9
+ export const backfillNormalized = (database, { batch = 5_000, onBatch } = {}) => {
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
+ const fill = database.prepare("UPDATE messages SET normalized_text = ?, normalizer_version = ? WHERE pk = ?");
12
+ let filled = 0;
13
+ let after = 0;
14
+ for (;;) {
15
+ database.exec("BEGIN IMMEDIATE");
16
+ let rows;
17
+ try {
18
+ rows = next.all(after, batch);
19
+ for (const row of rows)
20
+ fill.run(normalize(String(row.text)), NORMALIZER_VERSION, Number(row.pk));
21
+ database.exec("COMMIT");
22
+ }
23
+ catch (error) {
24
+ database.exec("ROLLBACK");
25
+ throw error;
26
+ }
27
+ if (rows.length === 0)
28
+ return filled;
29
+ filled += rows.length;
30
+ after = Number(rows.at(-1)?.pk);
31
+ onBatch?.(filled);
32
+ }
33
+ };
34
+ //# sourceMappingURL=backfill.js.map
@@ -0,0 +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,6 +1,8 @@
1
1
  import type { Migration } from "../migrations.js";
2
2
  /**
3
- * Every folder drizzle-kit generated, in order, and the schema version it becomes. The version and
3
+ * Every folder drizzle-kit generated, in order, and the schema version it becomes. Consecutive
4
+ * folders may share a version — a generated one and a `--custom` one for its triggers — and are
5
+ * applied as one migration, one `schema_migrations` row. The version and
4
6
  * `minCompatible` are ours, not Drizzle's: `schema_migrations` is the only log, and every build
5
7
  * already installed decides by it.
6
8
  */
@@ -1 +1 @@
1
- {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../../src/store/sqlite/manifest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAGjD;;;;GAIG;AACH,MAAM,MAAM,aAAa,GACrB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE;AAC1D,yFAAyF;GACvF;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,oBAAoB,EAAE,IAAI,CAAA;CAAE,CAAA;AAEhD,eAAO,MAAM,QAAQ,EAAE,aAAa,EAAsE,CAAA;AAE1G,eAAO,MAAM,mBAAmB,cACpB,aAAa,EAAE,cACd;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,EAAE,CAAA;CAAE,EAAE,KAClD,SAAS,EAMR,CAAA"}
1
+ {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../../src/store/sqlite/manifest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAGjD;;;;;;GAMG;AACH,MAAM,MAAM,aAAa,GACrB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE;AAC1D,yFAAyF;GACvF;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,oBAAoB,EAAE,IAAI,CAAA;CAAE,CAAA;AAEhD,eAAO,MAAM,QAAQ,EAAE,aAAa,EAKnC,CAAA;AAED,eAAO,MAAM,mBAAmB,cACpB,aAAa,EAAE,cACd;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,EAAE,CAAA;CAAE,EAAE,KAClD,SAAS,EAgBX,CAAA"}
@@ -1,11 +1,29 @@
1
1
  import { GENERATED } from "./migrations.generated.js";
2
- export const MANIFEST = [{ name: "20260929205838_baseline", coveredByHandWritten: true }];
3
- export const generatedMigrations = (manifest = MANIFEST, generated = GENERATED) => manifest.flatMap((entry) => {
4
- if ("coveredByHandWritten" in entry)
5
- return [];
6
- const found = generated.find(({ name }) => name === entry.name);
7
- if (!found)
8
- throw new Error(`migration ${entry.name} is in the manifest and not in the bundle — run pnpm db:bundle`);
9
- return [{ version: entry.version, minCompatible: entry.minCompatible, statements: found.statements }];
10
- });
2
+ export const MANIFEST = [
3
+ { name: "20260929205838_baseline", coveredByHandWritten: true },
4
+ // Older builds refuse the file from here on (plan D6): none of them writes normalized_text.
5
+ { name: "20260930003739_version-6-columns", version: 6, minCompatible: 6 },
6
+ { name: "20260930003740_version-6-message-count", version: 6, minCompatible: 6 },
7
+ ];
8
+ export const generatedMigrations = (manifest = MANIFEST, generated = GENERATED) => {
9
+ const migrations = [];
10
+ for (const entry of manifest) {
11
+ if ("coveredByHandWritten" in entry)
12
+ continue;
13
+ const found = generated.find(({ name }) => name === entry.name);
14
+ if (!found)
15
+ throw new Error(`migration ${entry.name} is in the manifest and not in the bundle — run pnpm db:bundle`);
16
+ const last = migrations.at(-1);
17
+ if (last?.version !== entry.version) {
18
+ migrations.push({ version: entry.version, minCompatible: entry.minCompatible, statements: [...found.statements] });
19
+ }
20
+ else if (last.minCompatible !== entry.minCompatible) {
21
+ throw new Error(`the rows of version ${entry.version} disagree on minCompatible`);
22
+ }
23
+ else {
24
+ last.statements.push(...found.statements);
25
+ }
26
+ }
27
+ return migrations;
28
+ };
11
29
  //# sourceMappingURL=manifest.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../../src/store/sqlite/manifest.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AAYrD,MAAM,CAAC,MAAM,QAAQ,GAAoB,CAAC,EAAE,IAAI,EAAE,yBAAyB,EAAE,oBAAoB,EAAE,IAAI,EAAE,CAAC,CAAA;AAE1G,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,QAAQ,GAAoB,QAAQ,EACpC,SAAS,GAA6C,SAAS,EAClD,EAAE,CACf,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;IACzB,IAAI,sBAAsB,IAAI,KAAK;QAAE,OAAO,EAAE,CAAA;IAC9C,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,CAAA;IAC/D,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,aAAa,KAAK,CAAC,IAAI,gEAAgE,CAAC,CAAA;IACpH,OAAO,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,aAAa,EAAE,KAAK,CAAC,aAAa,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC,CAAA;AACvG,CAAC,CAAC,CAAA"}
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../../src/store/sqlite/manifest.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AAcrD,MAAM,CAAC,MAAM,QAAQ,GAAoB;IACvC,EAAE,IAAI,EAAE,yBAAyB,EAAE,oBAAoB,EAAE,IAAI,EAAE;IAC/D,4FAA4F;IAC5F,EAAE,IAAI,EAAE,kCAAkC,EAAE,OAAO,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE;IAC1E,EAAE,IAAI,EAAE,wCAAwC,EAAE,OAAO,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE;CACjF,CAAA;AAED,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,QAAQ,GAAoB,QAAQ,EACpC,SAAS,GAA6C,SAAS,EAClD,EAAE;IACf,MAAM,UAAU,GAAgB,EAAE,CAAA;IAClC,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;QAC7B,IAAI,sBAAsB,IAAI,KAAK;YAAE,SAAQ;QAC7C,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,CAAA;QAC/D,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,aAAa,KAAK,CAAC,IAAI,gEAAgE,CAAC,CAAA;QACpH,MAAM,IAAI,GAAG,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;QAC9B,IAAI,IAAI,EAAE,OAAO,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC;YACpC,UAAU,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,aAAa,EAAE,KAAK,CAAC,aAAa,EAAE,UAAU,EAAE,CAAC,GAAG,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC,CAAA;QACpH,CAAC;aAAM,IAAI,IAAI,CAAC,aAAa,KAAK,KAAK,CAAC,aAAa,EAAE,CAAC;YACtD,MAAM,IAAI,KAAK,CAAC,uBAAuB,KAAK,CAAC,OAAO,4BAA4B,CAAC,CAAA;QACnF,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,UAAU,CAAC,CAAA;QAC3C,CAAC;IACH,CAAC;IACD,OAAO,UAAU,CAAA;AACnB,CAAC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"migrations.generated.d.ts","sourceRoot":"","sources":["../../../src/store/sqlite/migrations.generated.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,SAAS,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,EAAE,CAAA;CAAE,EAuB7D,CAAA"}
1
+ {"version":3,"file":"migrations.generated.d.ts","sourceRoot":"","sources":["../../../src/store/sqlite/migrations.generated.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,SAAS,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,EAAE,CAAA;CAAE,EA6C7D,CAAA"}
@@ -21,6 +21,28 @@ export const GENERATED = [
21
21
  "CREATE INDEX `messages_by_account` ON `messages` (`account_pk`,`native_id`);",
22
22
  "CREATE INDEX `messages_by_sender` ON `messages` (`sender_identity_pk`);"
23
23
  ]
24
+ },
25
+ {
26
+ "name": "20260930003739_version-6-columns",
27
+ "statements": [
28
+ "ALTER TABLE `chats` ADD `username` text;",
29
+ "ALTER TABLE `chats` ADD `membership_state` text;",
30
+ "ALTER TABLE `chats` ADD `is_searchable` integer DEFAULT 1 NOT NULL;",
31
+ "ALTER TABLE `chats` ADD `message_count` integer DEFAULT 0 NOT NULL;",
32
+ "ALTER TABLE `messages` ADD `normalized_text` text;",
33
+ "ALTER TABLE `messages` ADD `normalizer_version` integer;",
34
+ "CREATE INDEX `messages_to_normalize` ON `messages` (`pk`) WHERE normalized_text IS NULL AND deleted_at IS NULL;"
35
+ ]
36
+ },
37
+ {
38
+ "name": "20260930003740_version-6-message-count",
39
+ "statements": [
40
+ "-- A chat's live messages, kept by triggers: a tombstone is not counted, and taking it back is.\nCREATE TRIGGER chats_count_ai AFTER INSERT ON messages WHEN new.deleted_at IS NULL BEGIN\n UPDATE chats SET message_count = message_count + 1 WHERE pk = new.chat_pk;\nEND;",
41
+ "CREATE TRIGGER chats_count_ad AFTER DELETE ON messages WHEN old.deleted_at IS NULL BEGIN\n UPDATE chats SET message_count = message_count - 1 WHERE pk = old.chat_pk;\nEND;",
42
+ "CREATE TRIGGER chats_count_tombstone AFTER UPDATE OF deleted_at ON messages\n WHEN old.deleted_at IS NULL AND new.deleted_at IS NOT NULL BEGIN\n UPDATE chats SET message_count = message_count - 1 WHERE pk = new.chat_pk;\nEND;",
43
+ "CREATE TRIGGER chats_count_untombstone AFTER UPDATE OF deleted_at ON messages\n WHEN old.deleted_at IS NOT NULL AND new.deleted_at IS NULL BEGIN\n UPDATE chats SET message_count = message_count + 1 WHERE pk = new.chat_pk;\nEND;",
44
+ "UPDATE chats SET message_count = counted.n\n FROM (SELECT chat_pk, count(*) AS n FROM messages WHERE deleted_at IS NULL GROUP BY chat_pk) AS counted\n WHERE chats.pk = counted.chat_pk;"
45
+ ]
24
46
  }
25
47
  ];
26
48
  //# sourceMappingURL=migrations.generated.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"migrations.generated.js","sourceRoot":"","sources":["../../../src/store/sqlite/migrations.generated.ts"],"names":[],"mappings":"AAAA,6FAA6F;AAC7F,MAAM,CAAC,MAAM,SAAS,GAA6C;IACjE;QACE,MAAM,EAAE,yBAAyB;QACjC,YAAY,EAAE;YACZ,wdAAwd;YACxd,2PAA2P;YAC3P,giBAAgiB;YAChiB,0fAA0f;YAC1f,gYAAgY;YAChY,mnBAAmnB;YACnnB,8cAA8c;YAC9c,oRAAoR;YACpR,6+BAA6+B;YAC7+B,sNAAsN;YACtN,sSAAsS;YACtS,qFAAqF;YACrF,4EAA4E;YAC5E,4EAA4E;YAC5E,6EAA6E;YAC7E,8EAA8E;YAC9E,yEAAyE;SAC1E;KACF;CACF,CAAA"}
1
+ {"version":3,"file":"migrations.generated.js","sourceRoot":"","sources":["../../../src/store/sqlite/migrations.generated.ts"],"names":[],"mappings":"AAAA,6FAA6F;AAC7F,MAAM,CAAC,MAAM,SAAS,GAA6C;IACjE;QACE,MAAM,EAAE,yBAAyB;QACjC,YAAY,EAAE;YACZ,wdAAwd;YACxd,2PAA2P;YAC3P,giBAAgiB;YAChiB,0fAA0f;YAC1f,gYAAgY;YAChY,mnBAAmnB;YACnnB,8cAA8c;YAC9c,oRAAoR;YACpR,6+BAA6+B;YAC7+B,sNAAsN;YACtN,sSAAsS;YACtS,qFAAqF;YACrF,4EAA4E;YAC5E,4EAA4E;YAC5E,6EAA6E;YAC7E,8EAA8E;YAC9E,yEAAyE;SAC1E;KACF;IACD;QACE,MAAM,EAAE,kCAAkC;QAC1C,YAAY,EAAE;YACZ,0CAA0C;YAC1C,kDAAkD;YAClD,qEAAqE;YACrE,qEAAqE;YACrE,oDAAoD;YACpD,0DAA0D;YAC1D,iHAAiH;SAClH;KACF;IACD;QACE,MAAM,EAAE,wCAAwC;QAChD,YAAY,EAAE;YACZ,+QAA+Q;YAC/Q,8KAA8K;YAC9K,qOAAqO;YACrO,uOAAuO;YACvO,4LAA4L;SAC7L;KACF;CACF,CAAA"}
@@ -1,5 +1,5 @@
1
1
  /**
2
- * The store's base tables as migrations 1–5 left them — what `drizzle-kit generate` diffs against.
2
+ * The store's base tables — what `drizzle-kit generate` diffs against.
3
3
  * A change here becomes a migration, so it follows the rules at the top of `../migrations.ts`. The
4
4
  * FTS5 tables and their triggers are not modelled by Drizzle and live in hand-written SQL.
5
5
  */
@@ -746,6 +746,70 @@ export declare const chats: import("drizzle-orm/sqlite-core").SQLiteTableWithCol
746
746
  identity: undefined;
747
747
  generated: undefined;
748
748
  }, {}>;
749
+ username: import("drizzle-orm/sqlite-core").SQLiteColumn<{
750
+ name: string;
751
+ tableName: "chats";
752
+ dataType: "string";
753
+ data: string;
754
+ driverParam: string;
755
+ notNull: false;
756
+ hasDefault: false;
757
+ isPrimaryKey: false;
758
+ isAutoincrement: false;
759
+ hasRuntimeDefault: false;
760
+ enumValues: [string, ...string[]];
761
+ baseColumn: never;
762
+ identity: undefined;
763
+ generated: undefined;
764
+ }, {}>;
765
+ membershipState: import("drizzle-orm/sqlite-core").SQLiteColumn<{
766
+ name: string;
767
+ tableName: "chats";
768
+ dataType: "string";
769
+ data: string;
770
+ driverParam: string;
771
+ notNull: false;
772
+ hasDefault: false;
773
+ isPrimaryKey: false;
774
+ isAutoincrement: false;
775
+ hasRuntimeDefault: false;
776
+ enumValues: [string, ...string[]];
777
+ baseColumn: never;
778
+ identity: undefined;
779
+ generated: undefined;
780
+ }, {}>;
781
+ isSearchable: import("drizzle-orm/sqlite-core").SQLiteColumn<{
782
+ name: string;
783
+ tableName: "chats";
784
+ dataType: "number int53";
785
+ data: number;
786
+ driverParam: number;
787
+ notNull: true;
788
+ hasDefault: true;
789
+ isPrimaryKey: false;
790
+ isAutoincrement: false;
791
+ hasRuntimeDefault: false;
792
+ enumValues: undefined;
793
+ baseColumn: never;
794
+ identity: undefined;
795
+ generated: undefined;
796
+ }, {}>;
797
+ messageCount: import("drizzle-orm/sqlite-core").SQLiteColumn<{
798
+ name: string;
799
+ tableName: "chats";
800
+ dataType: "number int53";
801
+ data: number;
802
+ driverParam: number;
803
+ notNull: true;
804
+ hasDefault: true;
805
+ isPrimaryKey: false;
806
+ isAutoincrement: false;
807
+ hasRuntimeDefault: false;
808
+ enumValues: undefined;
809
+ baseColumn: never;
810
+ identity: undefined;
811
+ generated: undefined;
812
+ }, {}>;
749
813
  };
750
814
  dialect: 'sqlite';
751
815
  }>;
@@ -1073,6 +1137,38 @@ export declare const messages: import("drizzle-orm/sqlite-core").SQLiteTableWith
1073
1137
  identity: undefined;
1074
1138
  generated: undefined;
1075
1139
  }, {}>;
1140
+ normalizedText: import("drizzle-orm/sqlite-core").SQLiteColumn<{
1141
+ name: string;
1142
+ tableName: "messages";
1143
+ dataType: "string";
1144
+ data: string;
1145
+ driverParam: string;
1146
+ notNull: false;
1147
+ hasDefault: false;
1148
+ isPrimaryKey: false;
1149
+ isAutoincrement: false;
1150
+ hasRuntimeDefault: false;
1151
+ enumValues: [string, ...string[]];
1152
+ baseColumn: never;
1153
+ identity: undefined;
1154
+ generated: undefined;
1155
+ }, {}>;
1156
+ normalizerVersion: import("drizzle-orm/sqlite-core").SQLiteColumn<{
1157
+ name: string;
1158
+ tableName: "messages";
1159
+ dataType: "number int53";
1160
+ data: number;
1161
+ driverParam: number;
1162
+ notNull: false;
1163
+ hasDefault: false;
1164
+ isPrimaryKey: false;
1165
+ isAutoincrement: false;
1166
+ hasRuntimeDefault: false;
1167
+ enumValues: undefined;
1168
+ baseColumn: never;
1169
+ identity: undefined;
1170
+ generated: undefined;
1171
+ }, {}>;
1076
1172
  };
1077
1173
  dialect: 'sqlite';
1078
1174
  }>;
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/store/sqlite/schema.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AAEH,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAUpB,CAAA;AAED,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAOlB,CAAA;AAEF,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAetB,CAAA;AAED,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAezB,CAAA;AAED,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAY7B,CAAA;AAEF,eAAO,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoBjB,CAAA;AAED,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkCpB,CAAA;AAED,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAW5B,CAAA;AAED,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAqBvB,CAAA;AAED,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAUtB,CAAA;AAED,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAY7B,CAAA"}
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/store/sqlite/schema.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AAEH,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAUpB,CAAA;AAED,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAOlB,CAAA;AAEF,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAetB,CAAA;AAED,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAezB,CAAA;AAED,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAY7B,CAAA;AAEF,eAAO,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA0BjB,CAAA;AAED,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAsCpB,CAAA;AAED,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAW5B,CAAA;AAED,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAqBvB,CAAA;AAED,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAUtB,CAAA;AAED,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAY7B,CAAA"}
@@ -1,7 +1,7 @@
1
- import { desc } from "drizzle-orm";
1
+ import { desc, sql } from "drizzle-orm";
2
2
  import { index, integer, primaryKey, real, sqliteTable, text, unique } from "drizzle-orm/sqlite-core";
3
3
  /**
4
- * The store's base tables as migrations 1–5 left them — what `drizzle-kit generate` diffs against.
4
+ * The store's base tables — what `drizzle-kit generate` diffs against.
5
5
  * A change here becomes a migration, so it follows the rules at the top of `../migrations.ts`. The
6
6
  * FTS5 tables and their triggers are not modelled by Drizzle and live in hand-written SQL.
7
7
  */
@@ -70,6 +70,12 @@ export const chats = sqliteTable("chats", {
70
70
  participantsCount: integer("participants_count"),
71
71
  providerMetadata: text("provider_metadata"),
72
72
  updatedAt: integer("updated_at").notNull(),
73
+ username: text("username"),
74
+ /** `NULL` is unknown. Searchable does not follow from it: a chat left keeps its messages. */
75
+ membershipState: text("membership_state"),
76
+ isSearchable: integer("is_searchable").notNull().default(1),
77
+ /** Kept by triggers, so phase 2 can choose per query how a filter reaches the index. */
78
+ messageCount: integer("message_count").notNull().default(0),
73
79
  }, (table) => [
74
80
  unique().on(table.accountPk, table.nativeId),
75
81
  index("chats_by_recency").on(table.accountPk, desc(table.lastMessageAt)),
@@ -99,11 +105,15 @@ export const messages = sqliteTable("messages", {
99
105
  providerMetadata: text("provider_metadata"),
100
106
  ingestedAt: integer("ingested_at").notNull(),
101
107
  ingestedVia: text("ingested_via").notNull(),
108
+ normalizedText: text("normalized_text"),
109
+ normalizerVersion: integer("normalizer_version"),
102
110
  }, (table) => [
103
111
  unique().on(table.chatPk, table.nativeId),
104
112
  index("messages_by_time").on(table.chatPk, desc(table.sentAt)),
105
113
  index("messages_by_account").on(table.accountPk, table.nativeId),
106
114
  index("messages_by_sender").on(table.senderIdentityPk),
115
+ // Empty once the backfill is done, so every open can ask "anything left?" without reading the table.
116
+ index("messages_to_normalize").on(table.pk).where(sql `normalized_text IS NULL AND deleted_at IS NULL`),
107
117
  ]);
108
118
  export const messageRevisions = sqliteTable("message_revisions", {
109
119
  messagePk: integer("message_pk")
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/store/sqlite/schema.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/store/sqlite/schema.ts"],"names":[],"mappings":"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"}
@@ -123,5 +123,7 @@ export interface StoreOptions {
123
123
  env?: NodeJS.ProcessEnv;
124
124
  now?: () => number;
125
125
  }
126
+ /** About 40 ms of the first open (129k rows/s measured at 1M, 2026-09-30); Tab opens the store too. */
127
+ export declare const BACKFILL_ON_OPEN = 5000;
126
128
  export declare const openStore: ({ path, env, now }?: StoreOptions) => Promise<MessageStore>;
127
129
  //# sourceMappingURL=store.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/store/store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/store/store.ts"],"names":[],"mappings":"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"}
@@ -3,9 +3,13 @@ import { dirname } from "node:path";
3
3
  import { CliError } from "@leemour/cli-core";
4
4
  import { formatLocator } from "../domain/locator.js";
5
5
  import { migrate } from "./migrations.js";
6
+ import { NORMALIZER_VERSION, normalize } from "./normalize.js";
6
7
  import { openCache } from "./open.js";
7
8
  import { storePath } from "./path.js";
9
+ import { backfillNormalized, pendingNormalization } from "./sqlite/backfill.js";
8
10
  import { ulid } from "./ulid.js";
11
+ /** About 40 ms of the first open (129k rows/s measured at 1M, 2026-09-30); Tab opens the store too. */
12
+ export const BACKFILL_ON_OPEN = 5_000;
9
13
  export const openStore = async ({ path, env, now = Date.now } = {}) => {
10
14
  const file = path ?? storePath(env);
11
15
  mkdirSync(dirname(file), { recursive: true, mode: 0o700 });
@@ -14,6 +18,10 @@ export const openStore = async ({ path, env, now = Date.now } = {}) => {
14
18
  const database = await openCache(file);
15
19
  try {
16
20
  migrate(database, { now });
21
+ // A small file is filled on the spot; a larger one waits for `db migrate`, since nothing reads the copy yet.
22
+ const pending = pendingNormalization(database);
23
+ if (pending > 0 && pending <= BACKFILL_ON_OPEN)
24
+ backfillNormalized(database);
17
25
  }
18
26
  catch (error) {
19
27
  database.close();
@@ -49,12 +57,14 @@ const storeOver = (database, now) => {
49
57
  };
50
58
  const upsertChat = (accountKey, chat) => {
51
59
  run(`INSERT INTO chats (account_pk, native_id, kind, title, unread_count, last_message_at, participants_count,
52
- provider_metadata, updated_at)
53
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
60
+ provider_metadata, membership_state, updated_at)
61
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
54
62
  ON CONFLICT (account_pk, native_id) DO UPDATE SET
55
63
  kind = excluded.kind, title = excluded.title, unread_count = excluded.unread_count,
56
64
  last_message_at = excluded.last_message_at, participants_count = excluded.participants_count,
57
- provider_metadata = excluded.provider_metadata, updated_at = excluded.updated_at`, accountKey, chat.id, chat.kind, chat.title, chat.unreadCount, toMs(chat.lastMessageAt), chat.participantsCount, json(chat.providerMetadata), now());
65
+ provider_metadata = excluded.provider_metadata,
66
+ membership_state = coalesce(excluded.membership_state, chats.membership_state),
67
+ updated_at = excluded.updated_at`, accountKey, chat.id, chat.kind, chat.title, chat.unreadCount, toMs(chat.lastMessageAt), chat.participantsCount, json(chat.providerMetadata), chat.membershipState ?? null, now());
58
68
  };
59
69
  /** A chat known only from its messages, until the chat list names it. */
60
70
  const chatPkFor = (accountKey, chatId) => findChatPk(accountKey, chatId) ??
@@ -106,18 +116,20 @@ const storeOver = (database, now) => {
106
116
  reactions: json(message.reactions ?? undefined),
107
117
  provider_metadata: json(message.providerMetadata),
108
118
  };
109
- const found = one("SELECT pk, text, edited_at FROM messages WHERE chat_pk = ? AND native_id = ?", chatKey, message.id);
119
+ const found = one("SELECT pk, text, edited_at, deleted_at FROM messages WHERE chat_pk = ? AND native_id = ?", chatKey, message.id);
120
+ // A deleted message gets no second copy of its text (the owner's ruling: deletion leaves no text).
121
+ const normalized = found?.deleted_at == null ? searchable(message.text) : {};
110
122
  let pk;
111
123
  if (!found) {
112
- const columns = Object.keys(fields);
124
+ const columns = [...Object.keys(fields), ...Object.keys(normalized)];
113
125
  pk = Number(one(`INSERT INTO messages (chat_pk, account_pk, native_id, text, ingested_at, ingested_via, ${columns.join(", ")})
114
- VALUES (?, ?, ?, ?, ?, ?, ${columns.map(() => "?").join(", ")}) RETURNING pk`, chatKey, accountKey, message.id, message.text, now(), via, ...Object.values(fields))?.pk);
126
+ VALUES (?, ?, ?, ?, ?, ?, ${columns.map(() => "?").join(", ")}) RETURNING pk`, chatKey, accountKey, message.id, message.text, now(), via, ...Object.values(fields), ...Object.values(normalized))?.pk);
115
127
  }
116
128
  else {
117
129
  pk = Number(found.pk);
118
130
  // A copy that knows less — no reactions asked for, no quote sent, no sender — never erases what we had.
119
- const assignments = Object.keys(fields).map((column) => `${column} = coalesce(?, ${column})`);
120
- run(`UPDATE messages SET ${assignments.join(", ")} WHERE pk = ?`, ...Object.values(fields), pk);
131
+ const assignments = [...Object.keys(fields), ...Object.keys(normalized)].map((column) => `${column} = coalesce(?, ${column})`);
132
+ run(`UPDATE messages SET ${assignments.join(", ")} WHERE pk = ?`, ...Object.values(fields), ...Object.values(normalized), pk);
121
133
  if (found.text !== message.text) {
122
134
  run("INSERT INTO message_revisions (message_pk, text, edited_at, captured_at) VALUES (?, ?, ?, ?)", pk, String(found.text), found.edited_at ?? null, now());
123
135
  run("UPDATE messages SET text = ? WHERE pk = ?", message.text, pk);
@@ -405,6 +417,7 @@ const storeOver = (database, now) => {
405
417
  close: async () => database.close(),
406
418
  };
407
419
  };
420
+ const searchable = (text) => ({ normalized_text: normalize(text), normalizer_version: NORMALIZER_VERSION });
408
421
  const toMs = (iso) => {
409
422
  if (iso === null || iso === undefined)
410
423
  return null;
@@ -429,7 +442,7 @@ const toChat = (row) => ({
429
442
  unreadCount: row.unread_count ?? null,
430
443
  lastMessageAt: toIso(row.last_message_at),
431
444
  participantsCount: row.participants_count ?? null,
432
- ...present({ providerMetadata: parsed(row.provider_metadata) }),
445
+ ...present({ membershipState: row.membership_state, providerMetadata: parsed(row.provider_metadata) }),
433
446
  });
434
447
  const toAttachment = (row) => ({
435
448
  kind: String(row.kind),