@leemour/max-cli 0.7.0 → 0.8.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 (160) hide show
  1. package/README.md +198 -79
  2. package/dist/cache/schema.d.ts +13 -8
  3. package/dist/cache/schema.d.ts.map +1 -1
  4. package/dist/cache/schema.js +84 -23
  5. package/dist/cache/schema.js.map +1 -1
  6. package/dist/cache/store.d.ts +15 -0
  7. package/dist/cache/store.d.ts.map +1 -1
  8. package/dist/cache/store.js +32 -3
  9. package/dist/cache/store.js.map +1 -1
  10. package/dist/client.d.ts +28 -1
  11. package/dist/client.d.ts.map +1 -1
  12. package/dist/client.js +110 -5
  13. package/dist/client.js.map +1 -1
  14. package/dist/commands/chats.d.ts.map +1 -1
  15. package/dist/commands/chats.js +8 -0
  16. package/dist/commands/chats.js.map +1 -1
  17. package/dist/commands/config.d.ts.map +1 -1
  18. package/dist/commands/config.js +6 -2
  19. package/dist/commands/config.js.map +1 -1
  20. package/dist/commands/context.d.ts +14 -2
  21. package/dist/commands/context.d.ts.map +1 -1
  22. package/dist/commands/context.js +18 -19
  23. package/dist/commands/context.js.map +1 -1
  24. package/dist/commands/export.d.ts +3 -0
  25. package/dist/commands/export.d.ts.map +1 -0
  26. package/dist/commands/export.js +83 -0
  27. package/dist/commands/export.js.map +1 -0
  28. package/dist/commands/mcp.d.ts.map +1 -1
  29. package/dist/commands/mcp.js +9 -2
  30. package/dist/commands/mcp.js.map +1 -1
  31. package/dist/commands/messages.d.ts.map +1 -1
  32. package/dist/commands/messages.js +126 -3
  33. package/dist/commands/messages.js.map +1 -1
  34. package/dist/commands/models.d.ts +7 -0
  35. package/dist/commands/models.d.ts.map +1 -0
  36. package/dist/commands/models.js +47 -0
  37. package/dist/commands/models.js.map +1 -0
  38. package/dist/commands/serve.d.ts.map +1 -1
  39. package/dist/commands/serve.js +50 -2
  40. package/dist/commands/serve.js.map +1 -1
  41. package/dist/commands/session.d.ts.map +1 -1
  42. package/dist/commands/session.js +13 -3
  43. package/dist/commands/session.js.map +1 -1
  44. package/dist/commands/watch.d.ts.map +1 -1
  45. package/dist/commands/watch.js +12 -16
  46. package/dist/commands/watch.js.map +1 -1
  47. package/dist/config.d.ts +18 -2
  48. package/dist/config.d.ts.map +1 -1
  49. package/dist/config.js +58 -4
  50. package/dist/config.js.map +1 -1
  51. package/dist/domain/map.d.ts.map +1 -1
  52. package/dist/domain/map.js +5 -0
  53. package/dist/domain/map.js.map +1 -1
  54. package/dist/domain/models.d.ts +14 -0
  55. package/dist/domain/models.d.ts.map +1 -1
  56. package/dist/domain/models.js.map +1 -1
  57. package/dist/download.d.ts +2 -0
  58. package/dist/download.d.ts.map +1 -1
  59. package/dist/download.js +11 -0
  60. package/dist/download.js.map +1 -1
  61. package/dist/export.d.ts +26 -0
  62. package/dist/export.d.ts.map +1 -0
  63. package/dist/export.js +75 -0
  64. package/dist/export.js.map +1 -0
  65. package/dist/generated/client.generated.d.ts +2 -0
  66. package/dist/generated/client.generated.d.ts.map +1 -1
  67. package/dist/generated/client.generated.js +2 -0
  68. package/dist/generated/client.generated.js.map +1 -1
  69. package/dist/generated/opcodes.generated.d.ts +0 -9
  70. package/dist/generated/opcodes.generated.d.ts.map +1 -1
  71. package/dist/generated/opcodes.generated.js +0 -9
  72. package/dist/generated/opcodes.generated.js.map +1 -1
  73. package/dist/generated/operations.generated.d.ts +18 -1
  74. package/dist/generated/operations.generated.d.ts.map +1 -1
  75. package/dist/generated/operations.generated.js +4 -2
  76. package/dist/generated/operations.generated.js.map +1 -1
  77. package/dist/mcp/confirm.d.ts +7 -0
  78. package/dist/mcp/confirm.d.ts.map +1 -1
  79. package/dist/mcp/confirm.js +16 -7
  80. package/dist/mcp/confirm.js.map +1 -1
  81. package/dist/mcp/instructions.d.ts +5 -1
  82. package/dist/mcp/instructions.d.ts.map +1 -1
  83. package/dist/mcp/instructions.js +16 -2
  84. package/dist/mcp/instructions.js.map +1 -1
  85. package/dist/mcp/server.d.ts +3 -1
  86. package/dist/mcp/server.d.ts.map +1 -1
  87. package/dist/mcp/server.js +22 -3
  88. package/dist/mcp/server.js.map +1 -1
  89. package/dist/mcp/session.d.ts +1 -1
  90. package/dist/mcp/session.d.ts.map +1 -1
  91. package/dist/mcp/session.js +1 -1
  92. package/dist/mcp/session.js.map +1 -1
  93. package/dist/mcp/tools.d.ts +8 -1
  94. package/dist/mcp/tools.d.ts.map +1 -1
  95. package/dist/mcp/tools.js +87 -10
  96. package/dist/mcp/tools.js.map +1 -1
  97. package/dist/program.d.ts.map +1 -1
  98. package/dist/program.js +6 -2
  99. package/dist/program.js.map +1 -1
  100. package/dist/sends/guard.d.ts +7 -3
  101. package/dist/sends/guard.d.ts.map +1 -1
  102. package/dist/sends/guard.js +32 -11
  103. package/dist/sends/guard.js.map +1 -1
  104. package/dist/sends/journal.d.ts +6 -1
  105. package/dist/sends/journal.d.ts.map +1 -1
  106. package/dist/sends/journal.js.map +1 -1
  107. package/dist/sends/permissions.d.ts +11 -0
  108. package/dist/sends/permissions.d.ts.map +1 -0
  109. package/dist/sends/permissions.js +47 -0
  110. package/dist/sends/permissions.js.map +1 -0
  111. package/dist/server/server-connection.d.ts +25 -15
  112. package/dist/server/server-connection.d.ts.map +1 -1
  113. package/dist/server/server-connection.js +69 -63
  114. package/dist/server/server-connection.js.map +1 -1
  115. package/dist/server/server.d.ts +7 -0
  116. package/dist/server/server.d.ts.map +1 -1
  117. package/dist/server/server.js +82 -19
  118. package/dist/server/server.js.map +1 -1
  119. package/dist/server/start.d.ts +17 -1
  120. package/dist/server/start.d.ts.map +1 -1
  121. package/dist/server/start.js +46 -7
  122. package/dist/server/start.js.map +1 -1
  123. package/dist/session/adopt.d.ts.map +1 -1
  124. package/dist/session/adopt.js +4 -0
  125. package/dist/session/adopt.js.map +1 -1
  126. package/dist/session/handshake.d.ts +1 -1
  127. package/dist/spec/index.js +4 -4
  128. package/dist/spec/index.js.map +1 -1
  129. package/dist/spec/operations/chats.d.ts +12 -2
  130. package/dist/spec/operations/chats.d.ts.map +1 -1
  131. package/dist/spec/operations/chats.js +32 -5
  132. package/dist/spec/operations/chats.js.map +1 -1
  133. package/dist/spec/operations/messages.d.ts +13 -1
  134. package/dist/spec/operations/messages.d.ts.map +1 -1
  135. package/dist/spec/operations/messages.js +18 -4
  136. package/dist/spec/operations/messages.js.map +1 -1
  137. package/dist/transcribe/index.d.ts +34 -0
  138. package/dist/transcribe/index.d.ts.map +1 -0
  139. package/dist/transcribe/index.js +43 -0
  140. package/dist/transcribe/index.js.map +1 -0
  141. package/dist/transcribe/install.d.ts +18 -0
  142. package/dist/transcribe/install.d.ts.map +1 -0
  143. package/dist/transcribe/install.js +67 -0
  144. package/dist/transcribe/install.js.map +1 -0
  145. package/dist/transcribe/models.d.ts +32 -0
  146. package/dist/transcribe/models.d.ts.map +1 -0
  147. package/dist/transcribe/models.js +124 -0
  148. package/dist/transcribe/models.js.map +1 -0
  149. package/dist/transcribe/speech.d.ts +25 -0
  150. package/dist/transcribe/speech.d.ts.map +1 -0
  151. package/dist/transcribe/speech.js +105 -0
  152. package/dist/transcribe/speech.js.map +1 -0
  153. package/dist/update.d.ts +1 -11
  154. package/dist/update.d.ts.map +1 -1
  155. package/dist/update.js +14 -42
  156. package/dist/update.js.map +1 -1
  157. package/dist/version.d.ts +1 -1
  158. package/dist/version.js +1 -1
  159. package/package.json +8 -3
  160. package/skills/max-cli/SKILL.md +19 -3
@@ -0,0 +1,18 @@
1
+ import { type SpeechModel } from "./models.js";
2
+ /** Beside the profile caches, so `max cache clear` — which empties a database — leaves them alone. */
3
+ export declare const modelsDirectory: (env?: NodeJS.ProcessEnv) => string;
4
+ export declare const modelPath: (directory: string, model: SpeechModel) => (name: string) => string;
5
+ export declare const vadPath: (directory: string) => string;
6
+ /**
7
+ * Size, not hash: hashing 650 MB on every call would cost more than the transcription. The hash is
8
+ * checked once, as the file arrives, and a file only reaches its name after passing it.
9
+ */
10
+ export declare const isInstalled: (model: SpeechModel, directory: string) => boolean;
11
+ export declare const installedBytes: (model: SpeechModel) => number;
12
+ export type Fetch = (url: string) => Promise<Response>;
13
+ export declare const install: (model: SpeechModel, directory: string, { fetch: get, progress }?: {
14
+ fetch?: Fetch;
15
+ progress?: (line: string) => void;
16
+ }) => Promise<void>;
17
+ export declare const megabytes: (bytes: number) => string;
18
+ //# sourceMappingURL=install.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/transcribe/install.ts"],"names":[],"mappings":"AAOA,OAAO,EAAkB,KAAK,WAAW,EAAO,MAAM,aAAa,CAAA;AAEnE,sGAAsG;AACtG,eAAO,MAAM,eAAe,GAAI,MAAK,MAAM,CAAC,UAAwB,KAAG,MACkB,CAAA;AAEzF,eAAO,MAAM,SAAS,GAAI,WAAW,MAAM,EAAE,OAAO,WAAW,MAAM,MAAM,MAAM,WAAoC,CAAA;AAErH,eAAO,MAAM,OAAO,GAAI,WAAW,MAAM,KAAG,MAAmC,CAAA;AAO/E;;;GAGG;AACH,eAAO,MAAM,WAAW,GAAI,OAAO,WAAW,EAAE,WAAW,MAAM,KAAG,OACW,CAAA;AAU/E,eAAO,MAAM,cAAc,GAAI,OAAO,WAAW,KAAG,MAAgE,CAAA;AAEpH,MAAM,MAAM,KAAK,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAA;AAEtD,eAAO,MAAM,OAAO,GAClB,OAAO,WAAW,EAClB,WAAW,MAAM,EACjB,2BAAkC;IAAE,KAAK,CAAC,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CAAO,KAC1F,OAAO,CAAC,IAAI,CAOd,CAAA;AAqCD,eAAO,MAAM,SAAS,GAAI,OAAO,MAAM,KAAG,MACgC,CAAA"}
@@ -0,0 +1,67 @@
1
+ import { createHash } from "node:crypto";
2
+ import { createWriteStream, mkdirSync, statSync } from "node:fs";
3
+ import { rename, rm } from "node:fs/promises";
4
+ import { join } from "node:path";
5
+ import { Readable, Transform } from "node:stream";
6
+ import { pipeline } from "node:stream/promises";
7
+ import { CliError, resolvePaths } from "@leemour/cli-core";
8
+ import { VAD } from "./models.js";
9
+ /** Beside the profile caches, so `max cache clear` — which empties a database — leaves them alone. */
10
+ export const modelsDirectory = (env = process.env) => join(resolvePaths({ appName: "max-cli", prefix: "MAX", env }).cache, "models", "audio");
11
+ export const modelPath = (directory, model) => (name) => join(directory, model.id, name);
12
+ export const vadPath = (directory) => join(directory, VAD.name);
13
+ const placed = (model, directory) => [
14
+ ...model.files.map((file) => [file, modelPath(directory, model)(file.name)]),
15
+ [VAD, vadPath(directory)],
16
+ ];
17
+ /**
18
+ * Size, not hash: hashing 650 MB on every call would cost more than the transcription. The hash is
19
+ * checked once, as the file arrives, and a file only reaches its name after passing it.
20
+ */
21
+ export const isInstalled = (model, directory) => placed(model, directory).every(([file, path]) => sizeOf(path) === file.bytes);
22
+ const sizeOf = (path) => {
23
+ try {
24
+ return statSync(path).size;
25
+ }
26
+ catch {
27
+ return undefined;
28
+ }
29
+ };
30
+ export const installedBytes = (model) => model.files.reduce((sum, file) => sum + file.bytes, 0);
31
+ export const install = async (model, directory, { fetch: get = fetch, progress } = {}) => {
32
+ mkdirSync(join(directory, model.id), { recursive: true, mode: 0o700 });
33
+ for (const [file, path] of placed(model, directory)) {
34
+ if (sizeOf(path) === file.bytes)
35
+ continue;
36
+ progress?.(`downloading ${file.name} (${megabytes(file.bytes)})`);
37
+ await fetchVerified(file, path, get);
38
+ }
39
+ };
40
+ const fetchVerified = async (file, path, get) => {
41
+ const response = await get(file.url);
42
+ if (!response.ok || !response.body) {
43
+ await response.body?.cancel();
44
+ throw new CliError("network_error", `${file.name} could not be downloaded: HTTP ${response.status}`);
45
+ }
46
+ const partial = `${path}.${process.pid}.part`;
47
+ const hash = createHash("sha256");
48
+ const hashing = new Transform({
49
+ transform(chunk, _encoding, done) {
50
+ hash.update(chunk);
51
+ done(null, chunk);
52
+ },
53
+ });
54
+ try {
55
+ await pipeline(Readable.fromWeb(response.body), hashing, createWriteStream(partial, { mode: 0o600 }));
56
+ const actual = hash.digest("hex");
57
+ if (actual !== file.sha256) {
58
+ throw new CliError("invalid_response", `${file.name} is not the file this version of max expects (sha256 ${actual}) — nothing was installed`);
59
+ }
60
+ await rename(partial, path);
61
+ }
62
+ finally {
63
+ await rm(partial, { force: true });
64
+ }
65
+ };
66
+ export const megabytes = (bytes) => bytes < 1_000_000 ? "under 1 MB" : `${Math.round(bytes / 1_000_000)} MB`;
67
+ //# sourceMappingURL=install.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/transcribe/install.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * The speech models `max messages transcribe` can use, each **pinned to one commit** and checked by
3
+ * sha256: a file that does not match is refused, so nobody else's model runs in a program that
4
+ * holds the owner's session.
5
+ *
6
+ * Measured 2026-09-24 through the WebAssembly build of sherpa-onnx, one thread, a Ryzen AI 9 HX 470
7
+ * laptop, 5 minutes of Ogg Opus cut by VAD, Node 24 and Bun 1.3.14 alike (`FIND-131`, `FIND-133`):
8
+ * `gigaam-v3` ×7 real time, `gigaam-v3-ctc` ×8, `parakeet-v3` ×5 and 1.3 GB of memory. Whisper small
9
+ * ran at ×1.1 and is not offered.
10
+ */
11
+ export interface ModelFile {
12
+ name: string;
13
+ url: string;
14
+ sha256: string;
15
+ bytes: number;
16
+ }
17
+ export interface SpeechModel {
18
+ id: string;
19
+ title: string;
20
+ languages: string;
21
+ files: ModelFile[];
22
+ /** The part of sherpa-onnx's `modelConfig` that names the files, given where they are. */
23
+ config: (path: (name: string) => string) => Record<string, unknown>;
24
+ featureDim: number;
25
+ }
26
+ export declare const MODELS: SpeechModel[];
27
+ /** Cuts speech at pauses. Every model needs it: five minutes in one piece crash the WebAssembly build. */
28
+ export declare const VAD: ModelFile;
29
+ export declare const DEFAULT_MODEL = "gigaam-v3";
30
+ export declare const findModel: (id: string) => SpeechModel | undefined;
31
+ export declare const speechModel: (id: string) => SpeechModel;
32
+ //# sourceMappingURL=models.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../src/transcribe/models.ts"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AACH,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,SAAS,EAAE,CAAA;IAClB,0FAA0F;IAC1F,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACnE,UAAU,EAAE,MAAM,CAAA;CACnB;AAeD,eAAO,MAAM,MAAM,EAAE,WAAW,EAqG/B,CAAA;AAED,0GAA0G;AAC1G,eAAO,MAAM,GAAG,EAAE,SAKjB,CAAA;AAED,eAAO,MAAM,aAAa,cAAc,CAAA;AAExC,eAAO,MAAM,SAAS,GAAI,IAAI,MAAM,KAAG,WAAW,GAAG,SAAoD,CAAA;AAEzG,eAAO,MAAM,WAAW,GAAI,IAAI,MAAM,KAAG,WASxC,CAAA"}
@@ -0,0 +1,124 @@
1
+ import { CliError } from "@leemour/cli-core";
2
+ const huggingFace = (repository, commit) => (name) => `https://huggingface.co/csukuangfj/${repository}/resolve/${commit}/${name}`;
3
+ const gigaam = huggingFace("sherpa-onnx-nemo-transducer-punct-giga-am-v3-russian-2025-12-16", "a6039be7cee829a9044a69ac0ebaf1c191217c97");
4
+ const gigaamCtc = huggingFace("sherpa-onnx-nemo-ctc-punct-giga-am-v3-russian-2025-12-16", "4fb5407ff028a69fec516cdf4c10fac9ddea7c16");
5
+ const parakeet = huggingFace("sherpa-onnx-nemo-parakeet-tdt-0.6b-v3-int8", "2bda32ec70b097a55adaa07d9a7173915b43cc78");
6
+ export const MODELS = [
7
+ {
8
+ id: "gigaam-v3",
9
+ title: "GigaAM v3, with punctuation",
10
+ languages: "Russian — the best of the three for Russian",
11
+ featureDim: 64,
12
+ files: [
13
+ {
14
+ name: "encoder.int8.onnx",
15
+ url: gigaam("encoder.int8.onnx"),
16
+ sha256: "369f35a71bf288d3b8e0391fabd8dba5f2314088d440bca474056b7b4b6e66bf",
17
+ bytes: 224_570_820,
18
+ },
19
+ {
20
+ name: "decoder.onnx",
21
+ url: gigaam("decoder.onnx"),
22
+ sha256: "38fc7475443ea2a26f63211ca350f73ac50fff824ab7a3876ee2bd610c53bbc4",
23
+ bytes: 4_600_132,
24
+ },
25
+ {
26
+ name: "joiner.onnx",
27
+ url: gigaam("joiner.onnx"),
28
+ sha256: "602ff7017a93311aad34df1437c8d7f49911353c13d6eae7a6ee7b041339465c",
29
+ bytes: 2_712_896,
30
+ },
31
+ {
32
+ name: "tokens.txt",
33
+ url: gigaam("tokens.txt"),
34
+ sha256: "39abae20e692998290c574e606f11a9edef2902a1995463fcff63d1490cf22b7",
35
+ bytes: 13_354,
36
+ },
37
+ ],
38
+ config: (path) => ({
39
+ transducer: { encoder: path("encoder.int8.onnx"), decoder: path("decoder.onnx"), joiner: path("joiner.onnx") },
40
+ tokens: path("tokens.txt"),
41
+ modelType: "nemo_transducer",
42
+ }),
43
+ },
44
+ {
45
+ id: "gigaam-v3-ctc",
46
+ title: "GigaAM v3 CTC, with punctuation — a little faster",
47
+ languages: "Russian — a little faster, rougher with capital letters",
48
+ featureDim: 64,
49
+ files: [
50
+ {
51
+ name: "model.int8.onnx",
52
+ url: gigaamCtc("model.int8.onnx"),
53
+ sha256: "d5fea8df94263c285e54b21e5774b707c707192d3bdbeffd7b1eb07fb6743b35",
54
+ bytes: 224_893_661,
55
+ },
56
+ {
57
+ name: "tokens.txt",
58
+ url: gigaamCtc("tokens.txt"),
59
+ sha256: "142de7570b3de5b3035ce111a89c228e80e6085273731d944093ddf24fa539cd",
60
+ bytes: 2_007,
61
+ },
62
+ ],
63
+ config: (path) => ({ nemoCtc: { model: path("model.int8.onnx") }, tokens: path("tokens.txt") }),
64
+ },
65
+ {
66
+ id: "parakeet-v3",
67
+ title: "NVIDIA Parakeet TDT 0.6B v3",
68
+ /** The model card's list: huggingface.co/nvidia/parakeet-tdt-0.6b-v3, read 2026-09-24. */
69
+ languages: "25: bg cs da de el en es et fi fr hr hu it lt lv mt nl pl pt ro ru sk sl sv uk",
70
+ featureDim: 80,
71
+ files: [
72
+ {
73
+ name: "encoder.int8.onnx",
74
+ url: parakeet("encoder.int8.onnx"),
75
+ sha256: "acfc2b4456377e15d04f0243af540b7fe7c992f8d898d751cf134c3a55fd2247",
76
+ bytes: 652_184_281,
77
+ },
78
+ {
79
+ name: "decoder.int8.onnx",
80
+ url: parakeet("decoder.int8.onnx"),
81
+ sha256: "179e50c43d1a9de79c8a24149a2f9bac6eb5981823f2a2ed88d655b24248db4e",
82
+ bytes: 11_845_275,
83
+ },
84
+ {
85
+ name: "joiner.int8.onnx",
86
+ url: parakeet("joiner.int8.onnx"),
87
+ sha256: "3164c13fc2821009440d20fcb5fdc78bff28b4db2f8d0f0b329101719c0948b3",
88
+ bytes: 6_355_277,
89
+ },
90
+ {
91
+ name: "tokens.txt",
92
+ url: parakeet("tokens.txt"),
93
+ sha256: "d58544679ea4bc6ac563d1f545eb7d474bd6cfa467f0a6e2c1dc1c7d37e3c35d",
94
+ bytes: 93_939,
95
+ },
96
+ ],
97
+ config: (path) => ({
98
+ transducer: {
99
+ encoder: path("encoder.int8.onnx"),
100
+ decoder: path("decoder.int8.onnx"),
101
+ joiner: path("joiner.int8.onnx"),
102
+ },
103
+ tokens: path("tokens.txt"),
104
+ modelType: "nemo_transducer",
105
+ }),
106
+ },
107
+ ];
108
+ /** Cuts speech at pauses. Every model needs it: five minutes in one piece crash the WebAssembly build. */
109
+ export const VAD = {
110
+ name: "silero_vad.onnx",
111
+ url: "https://github.com/k2-fsa/sherpa-onnx/releases/download/asr-models/silero_vad.onnx",
112
+ sha256: "9e2449e1087496d8d4caba907f23e0bd3f78d91fa552479bb9c23ac09cbb1fd6",
113
+ bytes: 643_854,
114
+ };
115
+ export const DEFAULT_MODEL = "gigaam-v3";
116
+ export const findModel = (id) => MODELS.find((model) => model.id === id);
117
+ export const speechModel = (id) => {
118
+ const model = findModel(id);
119
+ if (!model) {
120
+ throw new CliError("validation_error", `no speech model "${id}" — one of ${MODELS.map((known) => known.id).join(", ")}`);
121
+ }
122
+ return model;
123
+ };
124
+ //# sourceMappingURL=models.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"models.js","sourceRoot":"","sources":["../../src/transcribe/models.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { SpeechModel } from "./models.js";
2
+ /** What transcription needs from a speech engine — small enough for a test to stand in for it. */
3
+ export interface Recognizer {
4
+ recognize(pcm: Float32Array): string;
5
+ free(): void;
6
+ }
7
+ export declare const SAMPLE_RATE = 16000;
8
+ /**
9
+ * MAX voice messages are Ogg Opus at 48 kHz (measured on a received one), and the models want
10
+ * 16 kHz. Averaging each three samples is ours rather than the engine's resampler, which announces
11
+ * itself on stderr on every call.
12
+ */
13
+ export declare const toModelRate: (samples: Float32Array, rate: number) => Float32Array;
14
+ export declare const decodeOgg: (bytes: Uint8Array) => Promise<{
15
+ samples: Float32Array;
16
+ rate: number;
17
+ }>;
18
+ /**
19
+ * The model, and a voice detector that cuts the audio at pauses into pieces of at most 20 seconds.
20
+ * The cutting is not optional: five minutes in one piece crash the WebAssembly build (measured).
21
+ *
22
+ * `sherpa-onnx` is loaded here, on first use, so no other command pays for its 15 MB of WebAssembly.
23
+ */
24
+ export declare const openRecognizer: (model: SpeechModel, path: (name: string) => string, vadModel: string) => Recognizer;
25
+ //# sourceMappingURL=speech.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"speech.d.ts","sourceRoot":"","sources":["../../src/transcribe/speech.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAE9C,kGAAkG;AAClG,MAAM,WAAW,UAAU;IACzB,SAAS,CAAC,GAAG,EAAE,YAAY,GAAG,MAAM,CAAA;IACpC,IAAI,IAAI,IAAI,CAAA;CACb;AAED,eAAO,MAAM,WAAW,QAAS,CAAA;AAQjC;;;;GAIG;AACH,eAAO,MAAM,WAAW,GAAI,SAAS,YAAY,EAAE,MAAM,MAAM,KAAG,YAYjE,CAAA;AAED,eAAO,MAAM,SAAS,GAAU,OAAO,UAAU,KAAG,OAAO,CAAC;IAAE,OAAO,EAAE,YAAY,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAYlG,CAAA;AAyBD;;;;;GAKG;AACH,eAAO,MAAM,cAAc,GAAI,OAAO,WAAW,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,EAAE,UAAU,MAAM,KAAG,UAwDrG,CAAA"}
@@ -0,0 +1,105 @@
1
+ import { createRequire } from "node:module";
2
+ export const SAMPLE_RATE = 16_000;
3
+ /**
4
+ * Half a second of silence ahead of the speech. Without it the voice detector clipped a recording
5
+ * that starts talking at once: "Ничьих" came back as "чьих" (measured 2026-09-24).
6
+ */
7
+ const LEAD = SAMPLE_RATE / 2;
8
+ /**
9
+ * MAX voice messages are Ogg Opus at 48 kHz (measured on a received one), and the models want
10
+ * 16 kHz. Averaging each three samples is ours rather than the engine's resampler, which announces
11
+ * itself on stderr on every call.
12
+ */
13
+ export const toModelRate = (samples, rate) => {
14
+ const step = rate / SAMPLE_RATE;
15
+ const length = Math.floor(samples.length / step);
16
+ const pcm = new Float32Array(LEAD + length);
17
+ for (let i = 0; i < length; i++) {
18
+ const from = Math.floor(i * step);
19
+ const to = Math.max(from + 1, Math.floor((i + 1) * step));
20
+ let sum = 0;
21
+ for (let j = from; j < to; j++)
22
+ sum += samples[j] ?? 0;
23
+ pcm[LEAD + i] = sum / (to - from);
24
+ }
25
+ return pcm;
26
+ };
27
+ export const decodeOgg = async (bytes) => {
28
+ const { OggOpusDecoder } = await import("ogg-opus-decoder");
29
+ const decoder = new OggOpusDecoder();
30
+ await decoder.ready;
31
+ try {
32
+ const { channelData, sampleRate, samplesDecoded } = await decoder.decodeFile(bytes);
33
+ const samples = channelData[0];
34
+ if (!samples || samplesDecoded === 0)
35
+ throw new Error("no Ogg Opus audio in it");
36
+ return { samples, rate: sampleRate };
37
+ }
38
+ finally {
39
+ decoder.free();
40
+ }
41
+ };
42
+ const WINDOW = 512;
43
+ /**
44
+ * The model, and a voice detector that cuts the audio at pauses into pieces of at most 20 seconds.
45
+ * The cutting is not optional: five minutes in one piece crash the WebAssembly build (measured).
46
+ *
47
+ * `sherpa-onnx` is loaded here, on first use, so no other command pays for its 15 MB of WebAssembly.
48
+ */
49
+ export const openRecognizer = (model, path, vadModel) => {
50
+ const sherpa = createRequire(import.meta.url)("sherpa-onnx");
51
+ const engine = sherpa.createOfflineRecognizer({
52
+ featConfig: { sampleRate: SAMPLE_RATE, featureDim: model.featureDim },
53
+ modelConfig: { ...model.config(path), numThreads: 1, provider: "cpu", debug: 0 },
54
+ decodingMethod: "greedy_search",
55
+ });
56
+ const vad = sherpa.createVad({
57
+ sileroVad: {
58
+ model: vadModel,
59
+ threshold: 0.5,
60
+ minSilenceDuration: 0.5,
61
+ minSpeechDuration: 0.25,
62
+ maxSpeechDuration: 20,
63
+ windowSize: WINDOW,
64
+ },
65
+ sampleRate: SAMPLE_RATE,
66
+ numThreads: 1,
67
+ provider: "cpu",
68
+ debug: 0,
69
+ bufferSizeInSeconds: 30,
70
+ });
71
+ const piece = (samples) => {
72
+ const stream = engine.createStream();
73
+ try {
74
+ stream.acceptWaveform(SAMPLE_RATE, samples);
75
+ engine.decode(stream);
76
+ return engine.getResult(stream).text.trim();
77
+ }
78
+ finally {
79
+ stream.free();
80
+ }
81
+ };
82
+ return {
83
+ recognize: (pcm) => {
84
+ const parts = [];
85
+ const drain = () => {
86
+ while (!vad.isEmpty()) {
87
+ parts.push(piece(vad.front().samples));
88
+ vad.pop();
89
+ }
90
+ };
91
+ for (let i = 0; i + WINDOW <= pcm.length; i += WINDOW) {
92
+ vad.acceptWaveform(pcm.subarray(i, i + WINDOW));
93
+ drain();
94
+ }
95
+ vad.flush();
96
+ drain();
97
+ return parts.filter(Boolean).join(" ");
98
+ },
99
+ free: () => {
100
+ vad.free();
101
+ engine.free();
102
+ },
103
+ };
104
+ };
105
+ //# sourceMappingURL=speech.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"speech.js","sourceRoot":"","sources":["../../src/transcribe/speech.ts"],"names":[],"mappings":"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"}
package/dist/update.d.ts CHANGED
@@ -12,17 +12,7 @@ export interface UpdateEnvironment {
12
12
  }
13
13
  export declare const installer: ({ scriptPath }?: UpdateEnvironment) => Installer;
14
14
  export declare const latest: (environment?: UpdateEnvironment) => Promise<string | undefined>;
15
- /**
16
- * npm and pnpm are `.cmd` shims on Windows, and Node starts a `.cmd` only through a shell. The
17
- * words are joined rather than passed as arguments, which Node 24 deprecates alongside `shell`;
18
- * that is safe only because they come from `updateCommand`, never from the person typing.
19
- */
20
- export declare const spawnPlan: ([command, ...args]: string[], platform?: NodeJS.Platform) => {
21
- file: string;
22
- args: string[];
23
- shell: boolean;
24
- };
25
- /** stdout stays one result: whatever the package manager prints goes to stderr. */
15
+ /** The package manager's output goes to stderr, so stdout stays one result. */
26
16
  export declare const runUpdate: (argv: string[], environment?: UpdateEnvironment) => number;
27
17
  /**
28
18
  * The daily "a newer version exists" line, or `undefined`. Started beside the command and awaited
@@ -1 +1 @@
1
- {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../src/update.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AACvD,OAAO,EAEL,KAAK,SAAS,EAOf,MAAM,0BAA0B,CAAA;AAIjC,eAAO,MAAM,OAAO,qBAAqB,CAAA;AAEzC,wGAAwG;AACxG,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;IAClB,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,4EAA4E;IAC5E,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,MAAM,CAAA;CACnC;AAED,eAAO,MAAM,SAAS,GAAI,iBAAgB,iBAAsB,KAAG,SACM,CAAA;AAEzE,eAAO,MAAM,MAAM,GAAI,cAAa,iBAAsB,gCACe,CAAA;AAEzE;;;;GAIG;AACH,eAAO,MAAM,SAAS,GAAI,oBAAoB,MAAM,EAAE,EAAE,WAAU,MAAM,CAAC,QAA2B;UAG3E,MAAM;;;CAAsB,CAAA;AAErD,mFAAmF;AACnF,eAAO,MAAM,SAAS,GAAI,MAAM,MAAM,EAAE,EAAE,cAAa,iBAAsB,KAAG,MAM/E,CAAA;AAKD;;;GAGG;AACH,eAAO,MAAM,YAAY,GACvB,MAAM,SAAS,MAAM,EAAE,EACvB,4BAIG;IAAE,GAAG,CAAC,EAAE,OAAO,CAAC;IAAC,WAAW,CAAC,EAAE,iBAAiB,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;CAAE,KAC7E,OAAO,CAAC,MAAM,GAAG,SAAS,CAkC5B,CAAA"}
1
+ {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../src/update.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AACvD,OAAO,EACL,KAAK,SAAS,EAKf,MAAM,0BAA0B,CAAA;AAIjC,eAAO,MAAM,OAAO,qBAAqB,CAAA;AAEzC,wGAAwG;AACxG,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;IAClB,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,4EAA4E;IAC5E,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,MAAM,CAAA;CACnC;AAED,eAAO,MAAM,SAAS,GAAI,iBAAgB,iBAAsB,KAAG,SACM,CAAA;AAEzE,eAAO,MAAM,MAAM,GAAI,cAAa,iBAAsB,gCACe,CAAA;AAEzE,+EAA+E;AAC/E,eAAO,MAAM,SAAS,GAAI,MAAM,MAAM,EAAE,EAAE,cAAa,iBAAsB,KAAG,MACT,CAAA;AAKvE;;;GAGG;AACH,eAAO,MAAM,YAAY,GACvB,MAAM,SAAS,MAAM,EAAE,EACvB,4BAIG;IAAE,GAAG,CAAC,EAAE,OAAO,CAAC;IAAC,WAAW,CAAC,EAAE,iBAAiB,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;CAAE,KAC7E,OAAO,CAAC,MAAM,GAAG,SAAS,CAsB5B,CAAA"}
package/dist/update.js CHANGED
@@ -1,70 +1,42 @@
1
- import { spawnSync } from "node:child_process";
2
1
  import { realpathSync } from "node:fs";
3
2
  import { join } from "node:path";
4
3
  import { fileURLToPath } from "node:url";
5
4
  import { resolvePaths } from "@leemour/cli-core";
6
- import { checkIsDue, installerOf, isNewer, latestVersion, mayNotify, readUpdateState, writeUpdateState, } from "@leemour/cli-core/update";
5
+ import { installerOf, latestVersion, runUpdate as runPackageManager, updateNotice as sharedNotice, } from "@leemour/cli-core/update";
7
6
  import { resolveSettings } from "./config.js";
8
7
  import { VERSION } from "./version.js";
9
8
  export const PACKAGE = "@leemour/max-cli";
10
9
  export const installer = ({ scriptPath } = {}) => installerOf(scriptPath ?? realpathSync(fileURLToPath(import.meta.url)));
11
10
  export const latest = (environment = {}) => latestVersion(PACKAGE, environment.fetch ?? fetch, { timeoutMs: 3000 });
12
- /**
13
- * npm and pnpm are `.cmd` shims on Windows, and Node starts a `.cmd` only through a shell. The
14
- * words are joined rather than passed as arguments, which Node 24 deprecates alongside `shell`;
15
- * that is safe only because they come from `updateCommand`, never from the person typing.
16
- */
17
- export const spawnPlan = ([command, ...args], platform = process.platform) => platform === "win32"
18
- ? { file: [command, ...args].join(" "), args: [], shell: true }
19
- : { file: command, args, shell: false };
20
- /** stdout stays one result: whatever the package manager prints goes to stderr. */
21
- export const runUpdate = (argv, environment = {}) => {
22
- if (environment.spawn)
23
- return environment.spawn(argv);
24
- const { file, args, shell } = spawnPlan(argv);
25
- const { status, error } = spawnSync(file, args, { stdio: ["inherit", 2, 2], shell });
26
- if (error)
27
- throw new Error(`could not start ${argv[0]}: ${error.message}`);
28
- return status ?? 1;
29
- };
11
+ /** The package manager's output goes to stderr, so stdout stays one result. */
12
+ export const runUpdate = (argv, environment = {}) => environment.spawn ? environment.spawn(argv) : runPackageManager(argv);
30
13
  const statePath = (env) => join(resolvePaths({ appName: "max-cli", prefix: "MAX", env }).state, "update-check.json");
31
14
  /**
32
15
  * The daily "a newer version exists" line, or `undefined`. Started beside the command and awaited
33
16
  * after it, so asking npm costs the command nothing; any failure is silence, never an error.
34
17
  */
35
- export const updateNotice = async (argv, { tty, environment = {}, env = process.env, }) => {
18
+ export const updateNotice = (argv, { tty, environment = {}, env = process.env, }) => {
36
19
  try {
37
- const [command] = argv.filter((word) => !word.startsWith("-"));
38
- if (command === "complete" || command === "update")
39
- return undefined;
40
- const settings = resolveSettings({}, { env });
41
20
  const pretty = !argv.includes("--json") && !argv.includes("--jsonl") && (tty ?? process.stdout.isTTY === true);
42
- const told = mayNotify({
21
+ return sharedNotice({
22
+ argv,
23
+ packageName: PACKAGE,
24
+ command: "max",
25
+ version: VERSION,
26
+ statePath: statePath(env),
27
+ fetch: environment.fetch ?? fetch,
28
+ ...(environment.now ? { now: environment.now } : {}),
43
29
  format: pretty ? "pretty" : "json",
44
30
  stderrIsTTY: environment.stderrIsTTY ?? process.stderr.isTTY === true,
45
31
  quiet: argv.includes("--quiet"),
46
- enabled: settings.updateCheck,
32
+ enabled: resolveSettings({}, { env }).updateCheck,
47
33
  installer: installer(environment),
48
34
  env,
49
35
  offVariables: ["MAX_NO_UPDATE_CHECK"],
50
36
  });
51
- if (!told)
52
- return undefined;
53
- const path = statePath(env);
54
- const now = (environment.now ?? Date.now)();
55
- let state = readUpdateState(path);
56
- if (checkIsDue(state, now)) {
57
- const found = await latestVersion(PACKAGE, environment.fetch ?? fetch, { timeoutMs: 1000 });
58
- const seen = found ?? state?.latest;
59
- state = seen ? { checkedAt: now, latest: seen } : { checkedAt: now };
60
- writeUpdateState(path, state);
61
- }
62
- return state?.latest && isNewer(state.latest, VERSION)
63
- ? `max ${state.latest} is out — you have ${VERSION}. \`max update\` installs it.`
64
- : undefined;
65
37
  }
66
38
  catch {
67
- return undefined;
39
+ return Promise.resolve(undefined);
68
40
  }
69
41
  };
70
42
  //# sourceMappingURL=update.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"update.js","sourceRoot":"","sources":["../src/update.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../src/update.ts"],"names":[],"mappings":"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"}
package/dist/version.d.ts CHANGED
@@ -1,3 +1,3 @@
1
1
  /** The one the running command reports. `pnpm version:check` fails when it and package.json disagree. */
2
- export declare const VERSION = "0.7.0";
2
+ export declare const VERSION = "0.8.0";
3
3
  //# sourceMappingURL=version.d.ts.map
package/dist/version.js CHANGED
@@ -1,3 +1,3 @@
1
1
  /** The one the running command reports. `pnpm version:check` fails when it and package.json disagree. */
2
- export const VERSION = "0.7.0";
2
+ export const VERSION = "0.8.0";
3
3
  //# sourceMappingURL=version.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@leemour/max-cli",
3
- "version": "0.7.0",
3
+ "version": "0.8.0",
4
4
  "description": "A local command line interface for a personal MAX Messenger account, built for agents and scripts",
5
5
  "license": "MIT",
6
6
  "author": "Viacheslav Ptsarev",
@@ -37,6 +37,8 @@
37
37
  "probe:download": "pnpm build && node --experimental-strip-types scripts/probe-download.ts",
38
38
  "probe:upload": "pnpm build && node --experimental-strip-types scripts/probe-upload.ts",
39
39
  "probe:reply": "pnpm build && node --experimental-strip-types scripts/probe-reply.ts",
40
+ "probe:scheduled": "pnpm build && node --experimental-strip-types scripts/probe-scheduled.ts",
41
+ "probe:delete": "pnpm build && node --experimental-strip-types scripts/probe-delete.ts",
40
42
  "probe:edits": "pnpm build && node --experimental-strip-types scripts/probe-edits.ts",
41
43
  "probe:attachments": "pnpm build && node --experimental-strip-types scripts/probe-attachments.ts",
42
44
  "verify:live": "pnpm build && node --experimental-strip-types scripts/verify-commands.ts",
@@ -51,16 +53,19 @@
51
53
  "probe:edit-pin-forward": "pnpm build && node --experimental-strip-types scripts/probe-edit-pin-forward.ts",
52
54
  "probe:groups": "pnpm build && node --experimental-strip-types scripts/probe-groups.ts",
53
55
  "probe:members": "pnpm build && node --experimental-strip-types scripts/probe-members.ts",
54
- "probe:account": "pnpm build && node --experimental-strip-types scripts/probe-account.ts"
56
+ "probe:account": "pnpm build && node --experimental-strip-types scripts/probe-account.ts",
57
+ "probe:message-count": "pnpm build && node --experimental-strip-types scripts/probe-message-count.ts"
55
58
  },
56
59
  "dependencies": {
57
60
  "@bomb.sh/tab": "0.0.22",
58
- "@leemour/cli-core": "^0.5.0",
61
+ "@leemour/cli-core": "^0.6.0",
59
62
  "@modelcontextprotocol/server": "~2.0.0",
60
63
  "@valibot/to-json-schema": "^1.8.0",
61
64
  "commander": "^15.0.0",
62
65
  "lossless-json": "^4.3.1",
66
+ "ogg-opus-decoder": "1.7.5",
63
67
  "qrcode-generator": "2.0.4",
68
+ "sherpa-onnx": "1.13.8",
64
69
  "string-width": "^8.2.2",
65
70
  "valibot": "^1.5.0",
66
71
  "wrap-ansi": "^10.0.2",