@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.
- package/README.md +1 -1
- package/dist/cli/messenger/mcp-command.d.ts +1 -0
- package/dist/cli/messenger/mcp-command.d.ts.map +1 -1
- package/dist/cli/messenger/mcp-command.js +7 -4
- package/dist/cli/messenger/mcp-command.js.map +1 -1
- package/dist/cli/messenger/messages-command.d.ts.map +1 -1
- package/dist/cli/messenger/messages-command.js +2 -0
- package/dist/cli/messenger/messages-command.js.map +1 -1
- package/dist/cli/messenger/messages-delete-command.d.ts +24 -0
- package/dist/cli/messenger/messages-delete-command.d.ts.map +1 -0
- package/dist/cli/messenger/messages-delete-command.js +44 -0
- package/dist/cli/messenger/messages-delete-command.js.map +1 -0
- package/dist/cli/messenger/port.d.ts +4 -0
- package/dist/cli/messenger/port.d.ts.map +1 -1
- package/dist/cli/messenger/port.js.map +1 -1
- package/dist/domain/models.d.ts +4 -0
- package/dist/domain/models.d.ts.map +1 -1
- package/dist/mcp/instructions.d.ts +2 -1
- package/dist/mcp/instructions.d.ts.map +1 -1
- package/dist/mcp/instructions.js +6 -1
- package/dist/mcp/instructions.js.map +1 -1
- package/dist/mcp/server.d.ts +2 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +4 -2
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools/messages-delete.d.ts +4 -0
- package/dist/mcp/tools/messages-delete.d.ts.map +1 -0
- package/dist/mcp/tools/messages-delete.js +19 -0
- package/dist/mcp/tools/messages-delete.js.map +1 -0
- package/dist/mcp/tools.d.ts +2 -0
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +3 -0
- package/dist/mcp/tools.js.map +1 -1
- package/dist/store/sqlite/backfill.d.ts +12 -0
- package/dist/store/sqlite/backfill.d.ts.map +1 -0
- package/dist/store/sqlite/backfill.js +34 -0
- package/dist/store/sqlite/backfill.js.map +1 -0
- package/dist/store/sqlite/manifest.d.ts +3 -1
- package/dist/store/sqlite/manifest.d.ts.map +1 -1
- package/dist/store/sqlite/manifest.js +27 -9
- package/dist/store/sqlite/manifest.js.map +1 -1
- package/dist/store/sqlite/migrations.generated.d.ts.map +1 -1
- package/dist/store/sqlite/migrations.generated.js +22 -0
- package/dist/store/sqlite/migrations.generated.js.map +1 -1
- package/dist/store/sqlite/schema.d.ts +97 -1
- package/dist/store/sqlite/schema.d.ts.map +1 -1
- package/dist/store/sqlite/schema.js +12 -2
- package/dist/store/sqlite/schema.js.map +1 -1
- package/dist/store/store.d.ts +2 -0
- package/dist/store/store.d.ts.map +1 -1
- package/dist/store/store.js +22 -9
- package/dist/store/store.js.map +1 -1
- 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),
|
package/dist/mcp/tools.js.map
CHANGED
|
@@ -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.
|
|
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
|
|
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 = [
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
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;
|
|
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,
|
|
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
|
|
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
|
|
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
|
|
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":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/store/sqlite/schema.ts"],"names":[],"mappings":"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"}
|
package/dist/store/store.d.ts
CHANGED
|
@@ -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":"AAIA,OAAO,KAAK,EAEV,IAAI,EAEJ,EAAE,EACF,OAAO,EACP,UAAU,EACV,IAAI,EACJ,QAAQ,EACR,SAAS,EACT,eAAe,EAChB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/store/store.ts"],"names":[],"mappings":"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"}
|
package/dist/store/store.js
CHANGED
|
@@ -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,
|
|
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),
|