@leemour/cli-messaging 0.42.0 → 0.43.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 (47) hide show
  1. package/README.md +1 -1
  2. package/dist/cli/index.d.ts +1 -1
  3. package/dist/cli/index.d.ts.map +1 -1
  4. package/dist/cli/index.js +1 -1
  5. package/dist/cli/index.js.map +1 -1
  6. package/dist/cli/messenger/messages-command.d.ts +3 -1
  7. package/dist/cli/messenger/messages-command.d.ts.map +1 -1
  8. package/dist/cli/messenger/messages-command.js +21 -5
  9. package/dist/cli/messenger/messages-command.js.map +1 -1
  10. package/dist/cli/messenger/port.d.ts +3 -0
  11. package/dist/cli/messenger/port.d.ts.map +1 -1
  12. package/dist/cli/messenger/port.js.map +1 -1
  13. package/dist/cli/messenger/serve-command.d.ts +4 -0
  14. package/dist/cli/messenger/serve-command.d.ts.map +1 -1
  15. package/dist/cli/messenger/serve-command.js +18 -4
  16. package/dist/cli/messenger/serve-command.js.map +1 -1
  17. package/dist/cli/messenger/server-command.d.ts.map +1 -1
  18. package/dist/cli/messenger/server-command.js +8 -0
  19. package/dist/cli/messenger/server-command.js.map +1 -1
  20. package/dist/mcp/tools/messages-send.d.ts.map +1 -1
  21. package/dist/mcp/tools/messages-send.js +20 -4
  22. package/dist/mcp/tools/messages-send.js.map +1 -1
  23. package/dist/sends/index.d.ts +1 -0
  24. package/dist/sends/index.d.ts.map +1 -1
  25. package/dist/sends/index.js +1 -0
  26. package/dist/sends/index.js.map +1 -1
  27. package/dist/sends/upload.d.ts +14 -0
  28. package/dist/sends/upload.d.ts.map +1 -0
  29. package/dist/sends/upload.js +47 -0
  30. package/dist/sends/upload.js.map +1 -0
  31. package/dist/store/drivers/bun-sqlite.d.ts +15 -1
  32. package/dist/store/drivers/bun-sqlite.d.ts.map +1 -1
  33. package/dist/store/drivers/bun-sqlite.js +3 -1
  34. package/dist/store/drivers/bun-sqlite.js.map +1 -1
  35. package/dist/store/drivers/node-sqlite.d.ts +2 -0
  36. package/dist/store/drivers/node-sqlite.d.ts.map +1 -1
  37. package/dist/store/drivers/node-sqlite.js +2 -2
  38. package/dist/store/drivers/node-sqlite.js.map +1 -1
  39. package/dist/store/sqlite/open.d.ts +16 -0
  40. package/dist/store/sqlite/open.d.ts.map +1 -0
  41. package/dist/store/sqlite/open.js +30 -0
  42. package/dist/store/sqlite/open.js.map +1 -0
  43. package/dist/store/sqlite/schema.d.ts +1491 -0
  44. package/dist/store/sqlite/schema.d.ts.map +1 -0
  45. package/dist/store/sqlite/schema.js +150 -0
  46. package/dist/store/sqlite/schema.js.map +1 -0
  47. package/package.json +4 -1
@@ -1,6 +1,8 @@
1
+ import { CliError } from "@leemour/cli-core";
1
2
  import * as v from "valibot";
2
3
  import { guardedSend } from "../../cli/messenger/messages-command.js";
3
4
  import { sendTime } from "../../domain/send-time.js";
5
+ import { readUpload } from "../../sends/upload.js";
4
6
  import { APPROVE, chatOf, message, nameOf, tool, WRITE } from "../tool.js";
5
7
  /**
6
8
  * Registered only with `--allow-send`, so a server started without it has no way to write at all —
@@ -13,14 +15,18 @@ export const messageSendTools = (messenger) => {
13
15
  return {
14
16
  messages_send: tool({
15
17
  title: "Send a message",
16
- description: "Send one text message as the owner. Only when the owner asked for this exact text to this exact chat. " +
18
+ description: "Send one message as the owner — text, or a file or photo from the owner's machine with the text as its " +
19
+ "caption. Only when the owner asked for this exact message to this exact chat. Hidden files and folders, " +
20
+ `~/.ssh and ${messenger.app.command}'s own folders are refused, with no way around it here. ` +
17
21
  "A name that matches several chats is refused with the candidates — pick an id, never guess. " +
18
22
  `On outcome_unknown, retry with the send_id it returns and ${name} drops the duplicate; never with a new one. ` +
19
23
  `With \`at\`, ${name} sends it later and the answer carries scheduledFor; never retry a scheduled send — ` +
20
24
  "read messages_scheduled instead.",
21
25
  input: v.object({
22
26
  chat,
23
- text: v.pipe(v.string(), v.minLength(1)),
27
+ text: v.optional(v.pipe(v.string(), v.description("the message, or the caption of a file or photo"))),
28
+ file: v.optional(v.pipe(v.string(), v.minLength(1), v.description("a path on the owner's machine to attach as a file"))),
29
+ photo: v.optional(v.pipe(v.string(), v.minLength(1), v.description("a .jpg, .png or .webp to attach as a photo"))),
24
30
  reply_to: v.optional(v.pipe(message, v.description("the message this answers, in the same chat"))),
25
31
  send_id: v.optional(v.pipe(v.string(), v.minLength(1), v.description("from an earlier outcome_unknown"))),
26
32
  silent: v.optional(v.pipe(v.boolean(), v.description("deliver without a notification"))),
@@ -31,11 +37,21 @@ export const messageSendTools = (messenger) => {
31
37
  annotations: WRITE,
32
38
  _meta: APPROVE,
33
39
  permission: "send",
34
- online: async (adapter, args, { guard }) => {
40
+ online: async (adapter, args, { guard, env }) => {
35
41
  const at = args.at === undefined ? undefined : sendTime(args.at);
42
+ // Never anyFile here: a path an agent was talked into is how a key would leave the machine.
43
+ const read = { app: messenger.app, env };
44
+ const attachments = [
45
+ ...(args.photo === undefined ? [] : [await readUpload("photo", args.photo, read)]),
46
+ ...(args.file === undefined ? [] : [await readUpload("file", args.file, read)]),
47
+ ];
48
+ if ((args.text ?? "").trim() === "" && attachments.length === 0) {
49
+ throw new CliError("validation_error", "nothing to send — give text, a file or a photo");
50
+ }
36
51
  const sent = await guardedSend(guard, adapter, {
37
52
  chat: args.chat,
38
- text: args.text,
53
+ text: args.text ?? "",
54
+ ...(attachments.length === 0 ? {} : { attachments }),
39
55
  ...(args.send_id === undefined ? {} : { sendId: args.send_id }),
40
56
  ...(args.reply_to === undefined ? {} : { replyTo: args.reply_to }),
41
57
  ...(args.silent === true ? { silent: true } : {}),
@@ -1 +1 @@
1
- {"version":3,"file":"messages-send.js","sourceRoot":"","sources":["../../../src/mcp/tools/messages-send.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"messages-send.js","sourceRoot":"","sources":["../../../src/mcp/tools/messages-send.ts"],"names":[],"mappings":"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"}
@@ -4,4 +4,5 @@ export { type AccountAction, type ChatAction, type SendEntry, SendJournal, type
4
4
  export { PERMISSIONS, type Permission, permissionFor } from "./permissions.js";
5
5
  export { type Recipient, RecipientList, recipientsPathFor } from "./recipients.js";
6
6
  export { newSendId } from "./send-id.js";
7
+ export { readUpload, type Upload, type UploadKind } from "./upload.js";
7
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sends/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,YAAY,EACjB,QAAQ,EACR,KAAK,SAAS,EACd,KAAK,gBAAgB,EACrB,SAAS,EACT,aAAa,GACd,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,UAAU,EACf,KAAK,SAAS,EACd,WAAW,EACX,KAAK,QAAQ,EACb,KAAK,WAAW,EAChB,YAAY,GACb,MAAM,cAAc,CAAA;AACrB,OAAO,EAAE,WAAW,EAAE,KAAK,UAAU,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAC9E,OAAO,EAAE,KAAK,SAAS,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AAClF,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sends/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,YAAY,EACjB,QAAQ,EACR,KAAK,SAAS,EACd,KAAK,gBAAgB,EACrB,SAAS,EACT,aAAa,GACd,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,UAAU,EACf,KAAK,SAAS,EACd,WAAW,EACX,KAAK,QAAQ,EACb,KAAK,WAAW,EAChB,YAAY,GACb,MAAM,cAAc,CAAA;AACrB,OAAO,EAAE,WAAW,EAAE,KAAK,UAAU,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAC9E,OAAO,EAAE,KAAK,SAAS,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AAClF,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AACxC,OAAO,EAAE,UAAU,EAAE,KAAK,MAAM,EAAE,KAAK,UAAU,EAAE,MAAM,aAAa,CAAA"}
@@ -4,4 +4,5 @@ export { SendJournal, sendsPathFor, } from "./journal.js";
4
4
  export { PERMISSIONS, permissionFor } from "./permissions.js";
5
5
  export { RecipientList, recipientsPathFor } from "./recipients.js";
6
6
  export { newSendId } from "./send-id.js";
7
+ export { readUpload } from "./upload.js";
7
8
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sends/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,QAAQ,EAGR,SAAS,EACT,aAAa,GACd,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,EAIL,WAAW,EAGX,YAAY,GACb,MAAM,cAAc,CAAA;AACrB,OAAO,EAAE,WAAW,EAAmB,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAC9E,OAAO,EAAkB,aAAa,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AAClF,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sends/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,QAAQ,EAGR,SAAS,EACT,aAAa,GACd,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,EAIL,WAAW,EAGX,YAAY,GACb,MAAM,cAAc,CAAA;AACrB,OAAO,EAAE,WAAW,EAAmB,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAC9E,OAAO,EAAkB,aAAa,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AAClF,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AACxC,OAAO,EAAE,UAAU,EAAgC,MAAM,aAAa,CAAA"}
@@ -0,0 +1,14 @@
1
+ import type { AppIdentity } from "../cli/app.js";
2
+ export type UploadKind = "photo" | "file";
3
+ /** A file read for sending. Its name goes to the messenger and never to the journal. */
4
+ export interface Upload {
5
+ kind: UploadKind;
6
+ name: string;
7
+ bytes: Uint8Array;
8
+ }
9
+ export declare const readUpload: (kind: UploadKind, path: string, { app, env, anyFile }: {
10
+ app: AppIdentity;
11
+ env?: NodeJS.ProcessEnv;
12
+ anyFile?: boolean;
13
+ }) => Promise<Upload>;
14
+ //# sourceMappingURL=upload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload.d.ts","sourceRoot":"","sources":["../../src/sends/upload.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAGhD,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,MAAM,CAAA;AAEzC,wFAAwF;AACxF,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,UAAU,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,UAAU,CAAA;CAClB;AA+BD,eAAO,MAAM,UAAU,SACf,UAAU,QACV,MAAM,yBACiC;IAAE,GAAG,EAAE,WAAW,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,KAC5G,OAAO,CAAC,MAAM,CAkBhB,CAAA"}
@@ -0,0 +1,47 @@
1
+ import { realpathSync } from "node:fs";
2
+ import { readFile } from "node:fs/promises";
3
+ import { basename, extname, isAbsolute, relative, resolve, sep } from "node:path";
4
+ import { CliError, resolvePaths } from "@leemour/cli-core";
5
+ import { storePath } from "../store/path.js";
6
+ const PHOTO = new Set([".jpg", ".jpeg", ".png", ".webp"]);
7
+ /**
8
+ * A file somebody talked an agent into sending would be a key or a token: those live in hidden
9
+ * files and folders, `~/.ssh` among them, in the CLI's own folders — the session is there — and in
10
+ * the message store (max-cli `NEED-274`). The real path is checked as well as the typed one, so a
11
+ * link does not hide where it points.
12
+ */
13
+ const refusedPlace = (path, app, env) => {
14
+ const own = Object.values(resolvePaths({ appName: app.appName, prefix: app.envPrefix, env }));
15
+ // The store file and its -wal and -shm, not its folder: MESSAGING_STORE may sit in the home folder.
16
+ const store = resolve(storePath(env));
17
+ let real = resolve(path);
18
+ try {
19
+ real = realpathSync(path);
20
+ }
21
+ catch { }
22
+ return [resolve(path), real].some((candidate) => candidate.split(sep).some((part) => part.startsWith(".") && part !== "." && part !== "..") ||
23
+ own.some((dir) => inside(candidate, dir)) ||
24
+ candidate.startsWith(store));
25
+ };
26
+ const inside = (path, dir) => {
27
+ const way = relative(resolve(dir), path);
28
+ return way === "" || (!way.startsWith("..") && !isAbsolute(way));
29
+ };
30
+ export const readUpload = async (kind, path, { app, env = process.env, anyFile = false }) => {
31
+ if (kind === "photo" && !PHOTO.has(extname(path).toLowerCase())) {
32
+ throw new CliError("validation_error", `a photo is a .jpg, .png or .webp — send ${path} as a file instead`);
33
+ }
34
+ if (!anyFile && refusedPlace(path, app, env)) {
35
+ throw new CliError("validation_error", `cannot send ${path}: hidden files and folders, ~/.ssh, ${app.command}'s own folders and the message store ` +
36
+ `are not sent — the owner adds --allow-any-file to \`${app.command} messages send\` if this file is meant to go`);
37
+ }
38
+ try {
39
+ return { kind, name: basename(path), bytes: await readFile(path) };
40
+ }
41
+ catch (error) {
42
+ const code = error.code;
43
+ const reason = code === "ENOENT" ? "no such file" : code === "EISDIR" ? "it is a folder" : "it cannot be read";
44
+ throw new CliError("validation_error", `cannot send ${path}: ${reason}`);
45
+ }
46
+ };
47
+ //# sourceMappingURL=upload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload.js","sourceRoot":"","sources":["../../src/sends/upload.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAA;AACjF,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAE1D,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAW5C,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;AAEzD;;;;;GAKG;AACH,MAAM,YAAY,GAAG,CAAC,IAAY,EAAE,GAAgB,EAAE,GAAsB,EAAW,EAAE;IACvF,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC,CAAA;IAC7F,oGAAoG;IACpG,MAAM,KAAK,GAAG,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAA;IACrC,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACxB,IAAI,CAAC;QACH,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,CAAA;IAC3B,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IACV,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,CAC/B,CAAC,SAAS,EAAE,EAAE,CACZ,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,IAAI,CAAC;QAC1F,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;QACzC,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,CAC9B,CAAA;AACH,CAAC,CAAA;AAED,MAAM,MAAM,GAAG,CAAC,IAAY,EAAE,GAAW,EAAW,EAAE;IACpD,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAA;IACxC,OAAO,GAAG,KAAK,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAA;AAClE,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,UAAU,GAAG,KAAK,EAC7B,IAAgB,EAChB,IAAY,EACZ,EAAE,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,OAAO,GAAG,KAAK,EAAoE,EAC5F,EAAE;IACnB,IAAI,IAAI,KAAK,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;QAChE,MAAM,IAAI,QAAQ,CAAC,kBAAkB,EAAE,2CAA2C,IAAI,oBAAoB,CAAC,CAAA;IAC7G,CAAC;IACD,IAAI,CAAC,OAAO,IAAI,YAAY,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;QAC7C,MAAM,IAAI,QAAQ,CAChB,kBAAkB,EAClB,eAAe,IAAI,uCAAuC,GAAG,CAAC,OAAO,uCAAuC;YAC1G,uDAAuD,GAAG,CAAC,OAAO,8CAA8C,CACnH,CAAA;IACH,CAAC;IACD,IAAI,CAAC;QACH,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAA;IACpE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,GAAI,KAA+B,CAAC,IAAI,CAAA;QAClD,MAAM,MAAM,GAAG,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,mBAAmB,CAAA;QAC9G,MAAM,IAAI,QAAQ,CAAC,kBAAkB,EAAE,eAAe,IAAI,KAAK,MAAM,EAAE,CAAC,CAAA;IAC1E,CAAC;AACH,CAAC,CAAA"}
@@ -1,8 +1,22 @@
1
- import type { CacheDatabase } from "../driver.js";
1
+ import type { CacheDatabase, SqlValue } from "../driver.js";
2
+ interface BunStatement {
3
+ run(...parameters: SqlValue[]): {
4
+ changes: number;
5
+ };
6
+ get(...parameters: SqlValue[]): unknown;
7
+ all(...parameters: SqlValue[]): unknown[];
8
+ }
9
+ export interface BunDatabase {
10
+ exec(sql: string): void;
11
+ query(sql: string): BunStatement;
12
+ close(): void;
13
+ }
2
14
  /**
3
15
  * The specifier is a variable on purpose: written inline, TypeScript tries to resolve `bun:sqlite`
4
16
  * and fails, because Bun's types are not installed and would only be right for one of the two
5
17
  * runtimes anyway. The import is reached only under Bun, so Node never evaluates it.
6
18
  */
7
19
  export declare const openWithBunSqlite: (path: string) => Promise<CacheDatabase>;
20
+ export declare const cacheOverBunSqlite: (database: BunDatabase) => CacheDatabase;
21
+ export {};
8
22
  //# sourceMappingURL=bun-sqlite.d.ts.map
@@ -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,EAAY,MAAM,cAAc,CAAA;AAc3D;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,SAAgB,MAAM,KAAG,OAAO,CAAC,aAAa,CAiB3E,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;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,SAAgB,MAAM,KAAG,OAAO,CAAC,aAAa,CAI3E,CAAA;AAED,eAAO,MAAM,kBAAkB,aAAc,WAAW,KAAG,aAa1D,CAAA"}
@@ -6,7 +6,9 @@
6
6
  export const openWithBunSqlite = async (path) => {
7
7
  const specifier = "bun:sqlite";
8
8
  const { Database } = (await import(specifier));
9
- const database = new Database(path);
9
+ return cacheOverBunSqlite(new Database(path));
10
+ };
11
+ export const cacheOverBunSqlite = (database) => {
10
12
  return {
11
13
  exec: (sql) => database.exec(sql),
12
14
  prepare: (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,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAA;IAEnC,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":"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,3 +1,4 @@
1
+ import { DatabaseSync } from "node:sqlite";
1
2
  import type { CacheDatabase } from "../driver.js";
2
3
  /**
3
4
  * ⚠ On Node 22 the import itself prints `ExperimentalWarning: SQLite is an experimental feature`
@@ -5,4 +6,5 @@ import type { CacheDatabase } from "../driver.js";
5
6
  * process-wide to hide one line costs more than it saves.
6
7
  */
7
8
  export declare const openWithNodeSqlite: (path: string) => CacheDatabase;
9
+ export declare const cacheOverNodeSqlite: (database: DatabaseSync) => CacheDatabase;
8
10
  //# sourceMappingURL=node-sqlite.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"node-sqlite.d.ts","sourceRoot":"","sources":["../../../src/store/drivers/node-sqlite.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAY,MAAM,cAAc,CAAA;AAE3D;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,SAAU,MAAM,KAAG,aAejD,CAAA"}
1
+ {"version":3,"file":"node-sqlite.d.ts","sourceRoot":"","sources":["../../../src/store/drivers/node-sqlite.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,KAAK,EAAE,aAAa,EAAY,MAAM,cAAc,CAAA;AAE3D;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,SAAU,MAAM,KAAG,aAA4D,CAAA;AAE9G,eAAO,MAAM,mBAAmB,aAAc,YAAY,KAAG,aAa5D,CAAA"}
@@ -4,8 +4,8 @@ import { DatabaseSync } from "node:sqlite";
4
4
  * to stderr. Node 24 is silent. Left alone deliberately (`NEED-59`): suppressing warnings
5
5
  * process-wide to hide one line costs more than it saves.
6
6
  */
7
- export const openWithNodeSqlite = (path) => {
8
- const database = new DatabaseSync(path);
7
+ export const openWithNodeSqlite = (path) => cacheOverNodeSqlite(new DatabaseSync(path));
8
+ export const cacheOverNodeSqlite = (database) => {
9
9
  return {
10
10
  exec: (sql) => database.exec(sql),
11
11
  prepare: (sql) => {
@@ -1 +1 @@
1
- {"version":3,"file":"node-sqlite.js","sourceRoot":"","sources":["../../../src/store/drivers/node-sqlite.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAG1C;;;;GAIG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,IAAY,EAAiB,EAAE;IAChE,MAAM,QAAQ,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,CAAA;IAEvC,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,OAAO,CAAC,GAAG,CAAC,CAAA;YACvC,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":"node-sqlite.js","sourceRoot":"","sources":["../../../src/store/drivers/node-sqlite.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAG1C;;;;GAIG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,IAAY,EAAiB,EAAE,CAAC,mBAAmB,CAAC,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC,CAAA;AAE9G,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,QAAsB,EAAiB,EAAE;IAC3E,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,OAAO,CAAC,GAAG,CAAC,CAAA;YACvC,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"}
@@ -0,0 +1,16 @@
1
+ import type { SQLiteAsyncDatabase } from "drizzle-orm/sqlite-core";
2
+ import { type CacheDatabase } from "../driver.js";
3
+ /** Drizzle over the store's connection. Synchronous inside: a transaction never awaits (plan D3). */
4
+ export type Orm = SQLiteAsyncDatabase<"sync", unknown>;
5
+ export interface OpenedSqlite {
6
+ database: CacheDatabase;
7
+ orm: Orm;
8
+ }
9
+ /**
10
+ * One SQLite connection, seen two ways: the `CacheDatabase` seam the hand-written SQL and the
11
+ * migration runner use, and Drizzle. Each Drizzle driver imports its runtime at the top of its
12
+ * file, so both are loaded by dynamic `import()` in the branch that has that runtime — see
13
+ * `../open.ts` for why a static import breaks the other runtime.
14
+ */
15
+ export declare const openSqlite: (path: string) => Promise<OpenedSqlite>;
16
+ //# sourceMappingURL=open.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"open.d.ts","sourceRoot":"","sources":["../../../src/store/sqlite/open.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAA;AAClE,OAAO,EAAE,KAAK,aAAa,EAAW,MAAM,cAAc,CAAA;AAG1D,qGAAqG;AACrG,MAAM,MAAM,GAAG,GAAG,mBAAmB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAEtD,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,aAAa,CAAA;IACvB,GAAG,EAAE,GAAG,CAAA;CACT;AAED;;;;;GAKG;AACH,eAAO,MAAM,UAAU,SAAgB,MAAM,KAAG,OAAO,CAAC,YAAY,CAInE,CAAA"}
@@ -0,0 +1,30 @@
1
+ import { PRAGMAS } from "../driver.js";
2
+ /**
3
+ * One SQLite connection, seen two ways: the `CacheDatabase` seam the hand-written SQL and the
4
+ * migration runner use, and Drizzle. Each Drizzle driver imports its runtime at the top of its
5
+ * file, so both are loaded by dynamic `import()` in the branch that has that runtime — see
6
+ * `../open.ts` for why a static import breaks the other runtime.
7
+ */
8
+ export const openSqlite = async (path) => {
9
+ const opened = "Bun" in globalThis ? await openUnderBun(path) : await openUnderNode(path);
10
+ opened.database.exec(PRAGMAS);
11
+ return opened;
12
+ };
13
+ const openUnderNode = async (path) => {
14
+ const { DatabaseSync } = await import("node:sqlite");
15
+ const { drizzle } = await import("drizzle-orm/node-sqlite");
16
+ const { cacheOverNodeSqlite } = await import("../drivers/node-sqlite.js");
17
+ const client = new DatabaseSync(path);
18
+ return { database: cacheOverNodeSqlite(client), orm: drizzle({ client }) };
19
+ };
20
+ const openUnderBun = async (path) => {
21
+ // Variables, not literals: TypeScript would resolve `bun:sqlite`, whose types are not installed.
22
+ const runtime = "bun:sqlite";
23
+ const driver = "drizzle-orm/bun-sqlite";
24
+ const { Database } = (await import(runtime));
25
+ const { drizzle } = (await import(driver));
26
+ const { cacheOverBunSqlite } = await import("../drivers/bun-sqlite.js");
27
+ const client = new Database(path);
28
+ return { database: cacheOverBunSqlite(client), orm: drizzle({ client }) };
29
+ };
30
+ //# sourceMappingURL=open.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"open.js","sourceRoot":"","sources":["../../../src/store/sqlite/open.ts"],"names":[],"mappings":"AACA,OAAO,EAAsB,OAAO,EAAE,MAAM,cAAc,CAAA;AAW1D;;;;;GAKG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,KAAK,EAAE,IAAY,EAAyB,EAAE;IACtE,MAAM,MAAM,GAAG,KAAK,IAAI,UAAU,CAAC,CAAC,CAAC,MAAM,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,aAAa,CAAC,IAAI,CAAC,CAAA;IACzF,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAC7B,OAAO,MAAM,CAAA;AACf,CAAC,CAAA;AAED,MAAM,aAAa,GAAG,KAAK,EAAE,IAAY,EAAyB,EAAE;IAClE,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAA;IACpD,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC,CAAA;IAC3D,MAAM,EAAE,mBAAmB,EAAE,GAAG,MAAM,MAAM,CAAC,2BAA2B,CAAC,CAAA;IACzE,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,CAAA;IACrC,OAAO,EAAE,QAAQ,EAAE,mBAAmB,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAmB,EAAE,CAAA;AAC9F,CAAC,CAAA;AAED,MAAM,YAAY,GAAG,KAAK,EAAE,IAAY,EAAyB,EAAE;IACjE,iGAAiG;IACjG,MAAM,OAAO,GAAG,YAAY,CAAA;IAC5B,MAAM,MAAM,GAAG,wBAAwB,CAAA;IACvC,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC,CAAoD,CAAA;IAC/F,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,MAAM,MAAM,CAAC,MAAM,CAAC,CAA0D,CAAA;IACnG,MAAM,EAAE,kBAAkB,EAAE,GAAG,MAAM,MAAM,CAAC,0BAA0B,CAAC,CAAA;IACvE,MAAM,MAAM,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAA;IACjC,OAAO,EAAE,QAAQ,EAAE,kBAAkB,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAQ,EAAE,CAAA;AAClF,CAAC,CAAA"}