@leemour/cli-messaging 0.95.0 → 0.97.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 (99) hide show
  1. package/README.md +9 -2
  2. package/dist/cli/bot/command.d.ts +1 -1
  3. package/dist/cli/bot/command.d.ts.map +1 -1
  4. package/dist/cli/bot/command.js +52 -11
  5. package/dist/cli/bot/command.js.map +1 -1
  6. package/dist/cli/bot/context.d.ts +17 -1
  7. package/dist/cli/bot/context.d.ts.map +1 -1
  8. package/dist/cli/bot/context.js +37 -3
  9. package/dist/cli/bot/context.js.map +1 -1
  10. package/dist/cli/bot/copy.d.ts +19 -0
  11. package/dist/cli/bot/copy.d.ts.map +1 -0
  12. package/dist/cli/bot/copy.js +85 -0
  13. package/dist/cli/bot/copy.js.map +1 -0
  14. package/dist/cli/bot/messages.d.ts +10 -0
  15. package/dist/cli/bot/messages.d.ts.map +1 -0
  16. package/dist/cli/bot/messages.js +242 -0
  17. package/dist/cli/bot/messages.js.map +1 -0
  18. package/dist/cli/bot/port.d.ts +50 -5
  19. package/dist/cli/bot/port.d.ts.map +1 -1
  20. package/dist/cli/bot/port.js +2 -1
  21. package/dist/cli/bot/port.js.map +1 -1
  22. package/dist/cli/index.d.ts +3 -1
  23. package/dist/cli/index.d.ts.map +1 -1
  24. package/dist/cli/index.js +3 -0
  25. package/dist/cli/index.js.map +1 -1
  26. package/dist/cli/messenger/ask.d.ts.map +1 -1
  27. package/dist/cli/messenger/ask.js +1 -1
  28. package/dist/cli/messenger/ask.js.map +1 -1
  29. package/dist/cli/messenger/conversations-command.d.ts.map +1 -1
  30. package/dist/cli/messenger/conversations-command.js +66 -0
  31. package/dist/cli/messenger/conversations-command.js.map +1 -1
  32. package/dist/cli/messenger/store-maintenance-command.d.ts.map +1 -1
  33. package/dist/cli/messenger/store-maintenance-command.js +50 -11
  34. package/dist/cli/messenger/store-maintenance-command.js.map +1 -1
  35. package/dist/cli/skill-command.d.ts.map +1 -1
  36. package/dist/cli/skill-command.js +5 -1
  37. package/dist/cli/skill-command.js.map +1 -1
  38. package/dist/search/query.d.ts +28 -0
  39. package/dist/search/query.d.ts.map +1 -0
  40. package/dist/search/query.js +109 -0
  41. package/dist/search/query.js.map +1 -0
  42. package/dist/search/trigrams.d.ts +7 -0
  43. package/dist/search/trigrams.d.ts.map +1 -0
  44. package/dist/search/trigrams.js +13 -0
  45. package/dist/search/trigrams.js.map +1 -0
  46. package/dist/sends/permissions.d.ts +1 -1
  47. package/dist/sends/permissions.d.ts.map +1 -1
  48. package/dist/sends/permissions.js +14 -1
  49. package/dist/sends/permissions.js.map +1 -1
  50. package/dist/services/conversations.d.ts +11 -1
  51. package/dist/services/conversations.d.ts.map +1 -1
  52. package/dist/services/conversations.js +8 -0
  53. package/dist/services/conversations.js.map +1 -1
  54. package/dist/services/messages.d.ts +2 -0
  55. package/dist/services/messages.d.ts.map +1 -1
  56. package/dist/services/messages.js +13 -6
  57. package/dist/services/messages.js.map +1 -1
  58. package/dist/sqlite-runtime.d.ts +29 -0
  59. package/dist/sqlite-runtime.d.ts.map +1 -0
  60. package/dist/sqlite-runtime.js +105 -0
  61. package/dist/sqlite-runtime.js.map +1 -0
  62. package/dist/store/drivers/bun-sqlite.d.ts +5 -0
  63. package/dist/store/drivers/bun-sqlite.d.ts.map +1 -1
  64. package/dist/store/drivers/bun-sqlite.js +24 -2
  65. package/dist/store/drivers/bun-sqlite.js.map +1 -1
  66. package/dist/store/index.d.ts +1 -0
  67. package/dist/store/index.d.ts.map +1 -1
  68. package/dist/store/index.js +1 -0
  69. package/dist/store/index.js.map +1 -1
  70. package/dist/store/open.d.ts +2 -0
  71. package/dist/store/open.d.ts.map +1 -1
  72. package/dist/store/open.js +10 -5
  73. package/dist/store/open.js.map +1 -1
  74. package/dist/store/sqlite/backfill.d.ts +2 -1
  75. package/dist/store/sqlite/backfill.d.ts.map +1 -1
  76. package/dist/store/sqlite/backfill.js +3 -1
  77. package/dist/store/sqlite/backfill.js.map +1 -1
  78. package/dist/store/sqlite/batches.d.ts +17 -3
  79. package/dist/store/sqlite/batches.d.ts.map +1 -1
  80. package/dist/store/sqlite/batches.js +93 -6
  81. package/dist/store/sqlite/batches.js.map +1 -1
  82. package/dist/store/sqlite/chats.d.ts +2 -0
  83. package/dist/store/sqlite/chats.d.ts.map +1 -1
  84. package/dist/store/sqlite/chats.js +6 -0
  85. package/dist/store/sqlite/chats.js.map +1 -1
  86. package/dist/store/sqlite/open.d.ts.map +1 -1
  87. package/dist/store/sqlite/open.js +2 -4
  88. package/dist/store/sqlite/open.js.map +1 -1
  89. package/dist/store/sqlite/search-index.d.ts +36 -0
  90. package/dist/store/sqlite/search-index.d.ts.map +1 -0
  91. package/dist/store/sqlite/search-index.js +131 -0
  92. package/dist/store/sqlite/search-index.js.map +1 -0
  93. package/dist/store/store.d.ts +29 -0
  94. package/dist/store/store.d.ts.map +1 -1
  95. package/dist/store/store.js +26 -0
  96. package/dist/store/store.js.map +1 -1
  97. package/package.json +9 -2
  98. package/parity.json +20 -72
  99. package/skills/link-conversations/SKILL.md +77 -0
@@ -6,6 +6,8 @@ import { codeOf, guardedWrite } from "../sends/guarded.js";
6
6
  import { newOperationId, newSendId } from "../sends/send-id.js";
7
7
  /** max-cli's: many at once is what a ban for automation looks like. */
8
8
  export const DELETE_AT_ONCE = 10;
9
+ /** How long a search may spend building the word index first (phase 2 plan S3: about 200 ms). */
10
+ export const SEARCH_FILL_MS = 200;
9
11
  export const messagesService = (deps) => {
10
12
  const { guard } = deps;
11
13
  const inStore = async (read) => read(await deps.store(), await deps.account());
@@ -45,12 +47,17 @@ export const messagesService = (deps) => {
45
47
  }
46
48
  return (await deps.connection()).around(chat, message, window);
47
49
  },
48
- search: ({ text, pattern, chat, limit }) => inStore(async (store, account) => store.find({
49
- ...(pattern ? { pattern } : { text: text ?? "" }),
50
- account,
51
- limit,
52
- ...(chat === undefined ? {} : { chatId: await storedChatId(deps.messenger, chat, store, account) }),
53
- })),
50
+ search: ({ text, pattern, chat, limit }) => inStore(async (store, account) => {
51
+ // A large file builds its word index a slice per search as well as in `store migrate` (NEED-453 A).
52
+ const stop = Date.now() + SEARCH_FILL_MS;
53
+ await store.fillSearchIndex({ until: () => Date.now() >= stop });
54
+ return store.find({
55
+ ...(pattern ? { pattern } : { text: text ?? "" }),
56
+ account,
57
+ limit,
58
+ ...(chat === undefined ? {} : { chatId: await storedChatId(deps.messenger, chat, store, account) }),
59
+ });
60
+ }),
54
61
  send: async ({ chat, text: typed, sendId, replyTo, silent, noPreview, markdown, at, attachments = [] }) => {
55
62
  const connection = await deps.connection();
56
63
  if (at !== undefined && sendId !== undefined) {
@@ -1 +1 @@
1
- {"version":3,"file":"messages.js","sourceRoot":"","sources":["../../src/services/messages.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"messages.js","sourceRoot":"","sources":["../../src/services/messages.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import { type ChildProcess } from "node:child_process";
2
+ export interface SqliteRuntime {
3
+ env: NodeJS.ProcessEnv;
4
+ platform: NodeJS.Platform;
5
+ bun: boolean;
6
+ maps(): string;
7
+ capable(): Promise<boolean>;
8
+ library(musl: boolean): Promise<{
9
+ path: string;
10
+ version: string;
11
+ } | undefined>;
12
+ works(env: NodeJS.ProcessEnv, version: string): boolean;
13
+ restart(env: NodeJS.ProcessEnv): Promise<never>;
14
+ }
15
+ /**
16
+ * Run first by `tg` and `max`, before their program is imported. A Linux distribution's Node takes
17
+ * the system's `libsqlite3`; when that one cannot hold the store, the command starts again on the
18
+ * SQLite of `@leemour/cli-messaging-sqlite`. Restarting here, before anything is read or sent, is
19
+ * what makes it safe — later in the command it could repeat an action.
20
+ */
21
+ export declare const ensureSqlite: (runtime?: SqliteRuntime) => Promise<void>;
22
+ export declare const nodeRuntime: () => SqliteRuntime;
23
+ /**
24
+ * The parent stays while the command runs in the child: it passes on what stops it — an MCP client
25
+ * or `kill <pid>` signals the process it started — and leaves with the child's code or signal. The
26
+ * terminal sends Ctrl-C to both, so the parent ignores SIGINT and waits.
27
+ */
28
+ export declare const relay: (child: ChildProcess, host?: Pick<NodeJS.Process, "on" | "exit" | "kill" | "pid" | "removeAllListeners">) => Promise<never>;
29
+ //# sourceMappingURL=sqlite-runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite-runtime.d.ts","sourceRoot":"","sources":["../src/sqlite-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,YAAY,EAAoB,MAAM,oBAAoB,CAAA;AASxE,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC,UAAU,CAAA;IACtB,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAA;IACzB,GAAG,EAAE,OAAO,CAAA;IACZ,IAAI,IAAI,MAAM,CAAA;IACd,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,CAAA;IAC3B,OAAO,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC,CAAA;IAC9E,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAA;IACvD,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,CAAA;CAChD;AAED;;;;;GAKG;AACH,eAAO,MAAM,YAAY,aAAmB,aAAa,KAAmB,OAAO,CAAC,IAAI,CA4BvF,CAAA;AASD,eAAO,MAAM,WAAW,QAAO,aAiC7B,CAAA;AAEF;;;;GAIG;AACH,eAAO,MAAM,KAAK,UACT,YAAY,SACb,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,oBAAoB,CAAC,KAChF,OAAO,CAAC,KAAK,CAWZ,CAAA"}
@@ -0,0 +1,105 @@
1
+ import { spawn, spawnSync } from "node:child_process";
2
+ import { readFileSync } from "node:fs";
3
+ import { dirname } from "node:path";
4
+ import { CAPABILITY_STATEMENTS, storeCapable } from "./store/open.js";
5
+ const RESTARTED = "CLI_MESSAGING_SQLITE_RESTARTED";
6
+ const USER_LIBRARY_PATH = "CLI_MESSAGING_USER_LD_LIBRARY_PATH";
7
+ const FORWARDED = ["SIGTERM", "SIGHUP", "SIGQUIT"];
8
+ /**
9
+ * Run first by `tg` and `max`, before their program is imported. A Linux distribution's Node takes
10
+ * the system's `libsqlite3`; when that one cannot hold the store, the command starts again on the
11
+ * SQLite of `@leemour/cli-messaging-sqlite`. Restarting here, before anything is read or sent, is
12
+ * what makes it safe — later in the command it could repeat an action.
13
+ */
14
+ export const ensureSqlite = async (runtime = nodeRuntime()) => {
15
+ const { env } = runtime;
16
+ if (env[RESTARTED]) {
17
+ // Programs this one starts get the user's search path back, and check their own SQLite.
18
+ if (env[USER_LIBRARY_PATH] === undefined)
19
+ delete env.LD_LIBRARY_PATH;
20
+ else
21
+ env.LD_LIBRARY_PATH = env[USER_LIBRARY_PATH];
22
+ delete env[USER_LIBRARY_PATH];
23
+ delete env[RESTARTED];
24
+ return;
25
+ }
26
+ // Official Node builds SQLite in: nothing to swap, and nothing to pay for asking.
27
+ if (runtime.bun || runtime.platform !== "linux")
28
+ return;
29
+ const maps = runtime.maps();
30
+ if (!maps.includes("libsqlite3"))
31
+ return;
32
+ if (await runtime.capable())
33
+ return;
34
+ const library = await runtime.library(maps.includes("ld-musl"));
35
+ if (!library)
36
+ return;
37
+ const restarted = {
38
+ ...env,
39
+ LD_LIBRARY_PATH: [dirname(library.path), env.LD_LIBRARY_PATH].filter(Boolean).join(":"),
40
+ [RESTARTED]: "1",
41
+ };
42
+ if (env.LD_LIBRARY_PATH !== undefined)
43
+ restarted[USER_LIBRARY_PATH] = env.LD_LIBRARY_PATH;
44
+ // A library that does not load would crash the command before any of our code runs; the store's
45
+ // own check refuses with a message instead.
46
+ if (!runtime.works(restarted, library.version))
47
+ return;
48
+ await runtime.restart(restarted);
49
+ };
50
+ const trialScript = (version) => `
51
+ const { DatabaseSync } = await import("node:sqlite")
52
+ const database = new DatabaseSync(":memory:")
53
+ if (database.prepare("SELECT sqlite_version() AS v").get().v !== ${JSON.stringify(version)}) process.exit(1)
54
+ for (const statement of ${JSON.stringify(CAPABILITY_STATEMENTS)}) database.exec(statement)
55
+ `;
56
+ export const nodeRuntime = () => ({
57
+ env: process.env,
58
+ platform: process.platform,
59
+ bun: "Bun" in globalThis,
60
+ maps: () => {
61
+ try {
62
+ return readFileSync("/proc/self/maps", "utf8");
63
+ }
64
+ catch {
65
+ return "";
66
+ }
67
+ },
68
+ capable: () => storeCapable().then(() => true, () => false),
69
+ library: async (musl) => {
70
+ try {
71
+ const { libraryFor, SQLITE_VERSION } = await import("@leemour/cli-messaging-sqlite");
72
+ const path = libraryFor({ musl });
73
+ return path === undefined ? undefined : { path, version: SQLITE_VERSION };
74
+ }
75
+ catch {
76
+ return undefined;
77
+ }
78
+ },
79
+ works: (env, version) => spawnSync(process.execPath, ["--no-warnings", "--input-type=module", "-e", trialScript(version)], {
80
+ env,
81
+ stdio: "ignore",
82
+ timeout: 10_000,
83
+ }).status === 0,
84
+ restart: (env) => relay(spawn(process.execPath, [...process.execArgv, ...process.argv.slice(1)], { env, stdio: "inherit" })),
85
+ });
86
+ /**
87
+ * The parent stays while the command runs in the child: it passes on what stops it — an MCP client
88
+ * or `kill <pid>` signals the process it started — and leaves with the child's code or signal. The
89
+ * terminal sends Ctrl-C to both, so the parent ignores SIGINT and waits.
90
+ */
91
+ export const relay = (child, host = process) => new Promise(() => {
92
+ for (const signal of FORWARDED)
93
+ host.on(signal, () => child.kill(signal));
94
+ host.on("SIGINT", () => { });
95
+ child.on("error", () => host.exit(1));
96
+ child.on("exit", (code, signal) => {
97
+ if (signal) {
98
+ host.removeAllListeners(signal);
99
+ host.kill(host.pid, signal);
100
+ }
101
+ else
102
+ host.exit(code ?? 1);
103
+ });
104
+ });
105
+ //# sourceMappingURL=sqlite-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite-runtime.js","sourceRoot":"","sources":["../src/sqlite-runtime.ts"],"names":[],"mappings":"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"}
@@ -11,11 +11,16 @@ export interface BunDatabase {
11
11
  query(sql: string): BunStatement;
12
12
  close(): void;
13
13
  }
14
+ export interface BunDatabaseClass {
15
+ new (path: string): BunDatabase;
16
+ setCustomSQLite(path: string): void;
17
+ }
14
18
  /**
15
19
  * The specifier is a variable on purpose: written inline, TypeScript tries to resolve `bun:sqlite`
16
20
  * and fails, because Bun's types are not installed and would only be right for one of the two
17
21
  * runtimes anyway. The import is reached only under Bun, so Node never evaluates it.
18
22
  */
23
+ export declare const bunDatabase: () => Promise<BunDatabaseClass>;
19
24
  export declare const openWithBunSqlite: (path: string) => Promise<CacheDatabase>;
20
25
  export declare const cacheOverBunSqlite: (database: BunDatabase) => CacheDatabase;
21
26
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"bun-sqlite.d.ts","sourceRoot":"","sources":["../../../src/store/drivers/bun-sqlite.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;AAE3D,UAAU,YAAY;IACpB,GAAG,CAAC,GAAG,UAAU,EAAE,QAAQ,EAAE,GAAG;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAA;IACnD,GAAG,CAAC,GAAG,UAAU,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAA;IACvC,GAAG,CAAC,GAAG,UAAU,EAAE,QAAQ,EAAE,GAAG,OAAO,EAAE,CAAA;CAC1C;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,CAAA;IAChC,KAAK,IAAI,IAAI,CAAA;CACd;AAED;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,SAAgB,MAAM,KAAG,OAAO,CAAC,aAAa,CAI3E,CAAA;AAED,eAAO,MAAM,kBAAkB,aAAc,WAAW,KAAG,aAa1D,CAAA"}
1
+ {"version":3,"file":"bun-sqlite.d.ts","sourceRoot":"","sources":["../../../src/store/drivers/bun-sqlite.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;AAE3D,UAAU,YAAY;IACpB,GAAG,CAAC,GAAG,UAAU,EAAE,QAAQ,EAAE,GAAG;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAA;IACnD,GAAG,CAAC,GAAG,UAAU,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAA;IACvC,GAAG,CAAC,GAAG,UAAU,EAAE,QAAQ,EAAE,GAAG,OAAO,EAAE,CAAA;CAC1C;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,CAAA;IAChC,KAAK,IAAI,IAAI,CAAA;CACd;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,IAAI,EAAE,MAAM,GAAG,WAAW,CAAA;IAC/B,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CACpC;AAkBD;;;;GAIG;AACH,eAAO,MAAM,WAAW,QAAa,OAAO,CAAC,gBAAgB,CAS5D,CAAA;AAED,eAAO,MAAM,iBAAiB,SAAgB,MAAM,KAAG,OAAO,CAAC,aAAa,CACvB,CAAA;AAErD,eAAO,MAAM,kBAAkB,aAAc,WAAW,KAAG,aAa1D,CAAA"}
@@ -1,13 +1,35 @@
1
+ let customised = false;
2
+ /**
3
+ * Bun on macOS takes the system's SQLite, which can be older than the store needs, so it always
4
+ * loads ours — once, before the first database: Bun refuses a second, different library. Without
5
+ * the package (an install that skipped it) the system's stays, and the store's check decides.
6
+ */
7
+ const ownLibrary = async () => {
8
+ try {
9
+ const { libraryFor } = await import("@leemour/cli-messaging-sqlite");
10
+ return libraryFor();
11
+ }
12
+ catch {
13
+ return undefined;
14
+ }
15
+ };
1
16
  /**
2
17
  * The specifier is a variable on purpose: written inline, TypeScript tries to resolve `bun:sqlite`
3
18
  * and fails, because Bun's types are not installed and would only be right for one of the two
4
19
  * runtimes anyway. The import is reached only under Bun, so Node never evaluates it.
5
20
  */
6
- export const openWithBunSqlite = async (path) => {
21
+ export const bunDatabase = async () => {
7
22
  const specifier = "bun:sqlite";
8
23
  const { Database } = (await import(specifier));
9
- return cacheOverBunSqlite(new Database(path));
24
+ if (process.platform === "darwin" && !customised) {
25
+ customised = true;
26
+ const library = await ownLibrary();
27
+ if (library)
28
+ Database.setCustomSQLite(library);
29
+ }
30
+ return Database;
10
31
  };
32
+ export const openWithBunSqlite = async (path) => cacheOverBunSqlite(new (await bunDatabase())(path));
11
33
  export const cacheOverBunSqlite = (database) => {
12
34
  return {
13
35
  exec: (sql) => database.exec(sql),
@@ -1 +1 @@
1
- {"version":3,"file":"bun-sqlite.js","sourceRoot":"","sources":["../../../src/store/drivers/bun-sqlite.ts"],"names":[],"mappings":"AAcA;;;;GAIG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,EAAE,IAAY,EAA0B,EAAE;IAC9E,MAAM,SAAS,GAAG,YAAY,CAAA;IAC9B,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,MAAM,MAAM,CAAC,SAAS,CAAC,CAAoD,CAAA;IACjG,OAAO,kBAAkB,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAA;AAC/C,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,QAAqB,EAAiB,EAAE;IACzE,OAAO;QACL,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC;QACjC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACf,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;YACrC,OAAO;gBACL,GAAG,EAAE,CAAC,GAAG,UAAsB,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC/F,GAAG,EAAE,CAAC,GAAG,UAAsB,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,UAAU,CAAwC;gBACvG,GAAG,EAAE,CAAC,GAAG,UAAsB,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,UAAU,CAA8B;aAC9F,CAAA;QACH,CAAC;QACD,KAAK,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE;KAC9B,CAAA;AACH,CAAC,CAAA"}
1
+ {"version":3,"file":"bun-sqlite.js","sourceRoot":"","sources":["../../../src/store/drivers/bun-sqlite.ts"],"names":[],"mappings":"AAmBA,IAAI,UAAU,GAAG,KAAK,CAAA;AAEtB;;;;GAIG;AACH,MAAM,UAAU,GAAG,KAAK,IAAiC,EAAE;IACzD,IAAI,CAAC;QACH,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,+BAA+B,CAAC,CAAA;QACpE,OAAO,UAAU,EAAE,CAAA;IACrB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAA;IAClB,CAAC;AACH,CAAC,CAAA;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,IAA+B,EAAE;IAC/D,MAAM,SAAS,GAAG,YAAY,CAAA;IAC9B,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,MAAM,MAAM,CAAC,SAAS,CAAC,CAAmC,CAAA;IAChF,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,UAAU,EAAE,CAAC;QACjD,UAAU,GAAG,IAAI,CAAA;QACjB,MAAM,OAAO,GAAG,MAAM,UAAU,EAAE,CAAA;QAClC,IAAI,OAAO;YAAE,QAAQ,CAAC,eAAe,CAAC,OAAO,CAAC,CAAA;IAChD,CAAC;IACD,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,EAAE,IAAY,EAA0B,EAAE,CAC9E,kBAAkB,CAAC,IAAI,CAAC,MAAM,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;AAErD,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,QAAqB,EAAiB,EAAE;IACzE,OAAO;QACL,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC;QACjC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACf,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;YACrC,OAAO;gBACL,GAAG,EAAE,CAAC,GAAG,UAAsB,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC/F,GAAG,EAAE,CAAC,GAAG,UAAsB,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,UAAU,CAAwC;gBACvG,GAAG,EAAE,CAAC,GAAG,UAAsB,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,UAAU,CAA8B;aAC9F,CAAA;QACH,CAAC;QACD,KAAK,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE;KAC9B,CAAA;AACH,CAAC,CAAA"}
@@ -4,5 +4,6 @@ export { MIGRATIONS, type Migration, migrate } from "./migrations.js";
4
4
  export { openCache } from "./open.js";
5
5
  export { storePath } from "./path.js";
6
6
  export { backfillNormalized, pendingNormalization } from "./sqlite/backfill.js";
7
+ export { fillSearchIndex, resetSearchIndex, type SearchIndexFill, type SearchIndexState, searchIndexState, } from "./sqlite/search-index.js";
7
8
  export { type AccountKey, type ChatStats, type Delta, type IngestedVia, type MessageFilter, type MessageStore, openStore, type PersonFacts, type Range, type StoredChatFilter, type StoredHit, type StoreOptions, } from "./store.js";
8
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/store/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AACxF,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AACrC,OAAO,EAAE,UAAU,EAAE,KAAK,SAAS,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AACrE,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AACrC,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAA;AAC/E,OAAO,EACL,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,KAAK,EACV,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,SAAS,EACT,KAAK,WAAW,EAChB,KAAK,KAAK,EACV,KAAK,gBAAgB,EACrB,KAAK,SAAS,EACd,KAAK,YAAY,GAClB,MAAM,YAAY,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/store/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AACxF,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AACrC,OAAO,EAAE,UAAU,EAAE,KAAK,SAAS,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AACrE,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AACrC,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAA;AAC/E,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,gBAAgB,GACjB,MAAM,0BAA0B,CAAA;AACjC,OAAO,EACL,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,KAAK,EACV,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,SAAS,EACT,KAAK,WAAW,EAChB,KAAK,KAAK,EACV,KAAK,gBAAgB,EACrB,KAAK,SAAS,EACd,KAAK,YAAY,GAClB,MAAM,YAAY,CAAA"}
@@ -3,5 +3,6 @@ export { MIGRATIONS, migrate } from "./migrations.js";
3
3
  export { openCache } from "./open.js";
4
4
  export { storePath } from "./path.js";
5
5
  export { backfillNormalized, pendingNormalization } from "./sqlite/backfill.js";
6
+ export { fillSearchIndex, resetSearchIndex, searchIndexState, } from "./sqlite/search-index.js";
6
7
  export { openStore, } from "./store.js";
7
8
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/store/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AACrC,OAAO,EAAE,UAAU,EAAkB,OAAO,EAAE,MAAM,iBAAiB,CAAA;AACrE,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AACrC,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAA;AAC/E,OAAO,EAOL,SAAS,GAMV,MAAM,YAAY,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/store/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AACrC,OAAO,EAAE,UAAU,EAAkB,OAAO,EAAE,MAAM,iBAAiB,CAAA;AACrE,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AACrC,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAA;AAC/E,OAAO,EACL,eAAe,EACf,gBAAgB,EAGhB,gBAAgB,GACjB,MAAM,0BAA0B,CAAA;AACjC,OAAO,EAOL,SAAS,GAMV,MAAM,YAAY,CAAA"}
@@ -11,6 +11,8 @@ import { type CacheDatabase } from "./driver.js";
11
11
  * is the reverse (`NEED-11`).
12
12
  */
13
13
  export declare const openCache: (path: string) => Promise<CacheDatabase>;
14
+ /** The two kinds of full-text table the migrations create, made and dropped in `temp`. */
15
+ export declare const CAPABILITY_STATEMENTS: string[];
14
16
  /**
15
17
  * Refuses a SQLite the store's migrations cannot run on, before anything is written. The version
16
18
  * number alone does not tell: official Node 22.0–22.15 ships SQLite 3.46–3.49 without FTS5, and
@@ -1 +1 @@
1
- {"version":3,"file":"open.d.ts","sourceRoot":"","sources":["../../src/store/open.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,aAAa,EAAW,MAAM,aAAa,CAAA;AAEzD;;;;;;;;;;GAUG;AACH,eAAO,MAAM,SAAS,SAAgB,MAAM,KAAG,OAAO,CAAC,aAAa,CAInE,CAAA;AAiBD;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,aAAc,aAAa,OAAM,MAAM,KAAe,IAkBpF,CAAA;AAID,4EAA4E;AAC5E,eAAO,MAAM,YAAY,QAAO,OAAO,CAAC,IAAI,CAS3C,CAAA"}
1
+ {"version":3,"file":"open.d.ts","sourceRoot":"","sources":["../../src/store/open.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,aAAa,EAAW,MAAM,aAAa,CAAA;AAEzD;;;;;;;;;;GAUG;AACH,eAAO,MAAM,SAAS,SAAgB,MAAM,KAAG,OAAO,CAAC,aAAa,CAInE,CAAA;AAiBD,0FAA0F;AAC1F,eAAO,MAAM,qBAAqB,UAMjC,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,aAAc,aAAa,OAAM,MAAM,KAAe,IAcpF,CAAA;AAID,4EAA4E;AAC5E,eAAO,MAAM,YAAY,QAAO,OAAO,CAAC,IAAI,CAS3C,CAAA"}
@@ -28,6 +28,14 @@ const runtime = () => {
28
28
  const bun = globalThis.Bun;
29
29
  return bun ? `Bun ${bun.version}` : `Node ${process.versions.node}`;
30
30
  };
31
+ /** The two kinds of full-text table the migrations create, made and dropped in `temp`. */
32
+ export const CAPABILITY_STATEMENTS = [
33
+ `CREATE VIRTUAL TABLE temp.capability_words USING fts5(a, content = '', contentless_delete = 1,
34
+ tokenize = 'unicode61 remove_diacritics 2')`,
35
+ "CREATE VIRTUAL TABLE temp.capability_text USING fts5(a, tokenize = 'trigram')",
36
+ "DROP TABLE temp.capability_words",
37
+ "DROP TABLE temp.capability_text",
38
+ ];
31
39
  /**
32
40
  * Refuses a SQLite the store's migrations cannot run on, before anything is written. The version
33
41
  * number alone does not tell: official Node 22.0–22.15 ships SQLite 3.46–3.49 without FTS5, and
@@ -35,11 +43,8 @@ const runtime = () => {
35
43
  */
36
44
  export const assertStoreCapable = (database, on = runtime()) => {
37
45
  try {
38
- database.exec(`CREATE VIRTUAL TABLE temp.capability_words USING fts5(a, content = '', contentless_delete = 1,
39
- tokenize = 'unicode61 remove_diacritics 2')`);
40
- database.exec("CREATE VIRTUAL TABLE temp.capability_text USING fts5(a, tokenize = 'trigram')");
41
- database.exec("DROP TABLE temp.capability_words");
42
- database.exec("DROP TABLE temp.capability_text");
46
+ for (const statement of CAPABILITY_STATEMENTS)
47
+ database.exec(statement);
43
48
  }
44
49
  catch (error) {
45
50
  const version = String(database.prepare("SELECT sqlite_version() AS version").get()?.version);
@@ -1 +1 @@
1
- {"version":3,"file":"open.js","sourceRoot":"","sources":["../../src/store/open.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAsB,OAAO,EAAE,MAAM,aAAa,CAAA;AAEzD;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,KAAK,EAAE,IAAY,EAA0B,EAAE;IACtE,MAAM,QAAQ,GAAG,KAAK,IAAI,UAAU,CAAC,CAAC,CAAC,MAAM,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,aAAa,CAAC,IAAI,CAAC,CAAA;IAC3F,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IACtB,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA;AAED,MAAM,YAAY,GAAG,KAAK,EAAE,IAAY,EAA0B,EAAE;IAClE,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC,CAAA;IACrE,OAAO,MAAM,iBAAiB,CAAC,IAAI,CAAC,CAAA;AACtC,CAAC,CAAA;AAED,MAAM,aAAa,GAAG,KAAK,EAAE,IAAY,EAA0B,EAAE;IACnE,MAAM,EAAE,kBAAkB,EAAE,GAAG,MAAM,MAAM,CAAC,0BAA0B,CAAC,CAAA;IACvE,OAAO,kBAAkB,CAAC,IAAI,CAAC,CAAA;AACjC,CAAC,CAAA;AAED,MAAM,OAAO,GAAG,GAAW,EAAE;IAC3B,MAAM,GAAG,GAAI,UAA4C,CAAC,GAAG,CAAA;IAC7D,OAAO,GAAG,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,QAAQ,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAA;AACrE,CAAC,CAAA;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,QAAuB,EAAE,EAAE,GAAW,OAAO,EAAE,EAAQ,EAAE;IAC1F,IAAI,CAAC;QACH,QAAQ,CAAC,IAAI,CAAC;iEAC+C,CAAC,CAAA;QAC9D,QAAQ,CAAC,IAAI,CAAC,+EAA+E,CAAC,CAAA;QAC9F,QAAQ,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAA;QACjD,QAAQ,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAA;IAClD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,oCAAoC,CAAC,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,CAAA;QAC7F,MAAM,MAAM,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC;YACjC,CAAC,CAAC,0CAA0C;YAC5C,CAAC,CAAC,oDAAoD,CAAA;QACxD,MAAM,IAAI,QAAQ,CAChB,qBAAqB,EACrB,8DAA8D,OAAO,KAAK,EAAE,oBAAoB,MAAM,GAAG,EACzG,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAChG,CAAA;IACH,CAAC;AACH,CAAC,CAAA;AAED,IAAI,OAAkC,CAAA;AAEtC,4EAA4E;AAC5E,MAAM,CAAC,MAAM,YAAY,GAAG,GAAkB,EAAE;IAC9C,OAAO,KAAK,SAAS,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE;QAClD,IAAI,CAAC;YACH,kBAAkB,CAAC,QAAQ,CAAC,CAAA;QAC9B,CAAC;gBAAS,CAAC;YACT,QAAQ,CAAC,KAAK,EAAE,CAAA;QAClB,CAAC;IACH,CAAC,CAAC,CAAA;IACF,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA"}
1
+ {"version":3,"file":"open.js","sourceRoot":"","sources":["../../src/store/open.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAsB,OAAO,EAAE,MAAM,aAAa,CAAA;AAEzD;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,KAAK,EAAE,IAAY,EAA0B,EAAE;IACtE,MAAM,QAAQ,GAAG,KAAK,IAAI,UAAU,CAAC,CAAC,CAAC,MAAM,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,aAAa,CAAC,IAAI,CAAC,CAAA;IAC3F,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IACtB,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA;AAED,MAAM,YAAY,GAAG,KAAK,EAAE,IAAY,EAA0B,EAAE;IAClE,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC,CAAA;IACrE,OAAO,MAAM,iBAAiB,CAAC,IAAI,CAAC,CAAA;AACtC,CAAC,CAAA;AAED,MAAM,aAAa,GAAG,KAAK,EAAE,IAAY,EAA0B,EAAE;IACnE,MAAM,EAAE,kBAAkB,EAAE,GAAG,MAAM,MAAM,CAAC,0BAA0B,CAAC,CAAA;IACvE,OAAO,kBAAkB,CAAC,IAAI,CAAC,CAAA;AACjC,CAAC,CAAA;AAED,MAAM,OAAO,GAAG,GAAW,EAAE;IAC3B,MAAM,GAAG,GAAI,UAA4C,CAAC,GAAG,CAAA;IAC7D,OAAO,GAAG,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,QAAQ,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAA;AACrE,CAAC,CAAA;AAED,0FAA0F;AAC1F,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC;iDAC+C;IAC/C,+EAA+E;IAC/E,kCAAkC;IAClC,iCAAiC;CAClC,CAAA;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,QAAuB,EAAE,EAAE,GAAW,OAAO,EAAE,EAAQ,EAAE;IAC1F,IAAI,CAAC;QACH,KAAK,MAAM,SAAS,IAAI,qBAAqB;YAAE,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IACzE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,oCAAoC,CAAC,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,CAAA;QAC7F,MAAM,MAAM,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC;YACjC,CAAC,CAAC,0CAA0C;YAC5C,CAAC,CAAC,oDAAoD,CAAA;QACxD,MAAM,IAAI,QAAQ,CAChB,qBAAqB,EACrB,8DAA8D,OAAO,KAAK,EAAE,oBAAoB,MAAM,GAAG,EACzG,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAChG,CAAA;IACH,CAAC;AACH,CAAC,CAAA;AAED,IAAI,OAAkC,CAAA;AAEtC,4EAA4E;AAC5E,MAAM,CAAC,MAAM,YAAY,GAAG,GAAkB,EAAE;IAC9C,OAAO,KAAK,SAAS,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE;QAClD,IAAI,CAAC;YACH,kBAAkB,CAAC,QAAQ,CAAC,CAAA;QAC9B,CAAC;gBAAS,CAAC;YACT,QAAQ,CAAC,KAAK,EAAE,CAAA;QAClB,CAAC;IACH,CAAC,CAAC,CAAA;IACF,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA"}
@@ -5,8 +5,9 @@ export declare const pendingNormalization: (database: CacheDatabase) => number;
5
5
  * Fills them in batches by `pk`, one short write transaction each, so other processes wait for one
6
6
  * batch at most. Stopping between batches loses nothing: the next run starts from what is left.
7
7
  */
8
- export declare const backfillNormalized: (database: CacheDatabase, { batch, onBatch }?: {
8
+ export declare const backfillNormalized: (database: CacheDatabase, { batch, onBatch, until, }?: {
9
9
  batch?: number;
10
10
  onBatch?: (filled: number) => void;
11
+ until?: () => boolean;
11
12
  }) => number;
12
13
  //# sourceMappingURL=backfill.d.ts.map
@@ -1 +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"}
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,+BAKpB;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,OAAO,CAAA;CAAE,KAC/E,MAwBF,CAAA"}
@@ -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