@leemour/max-cli 0.7.0 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +198 -79
- package/dist/cache/schema.d.ts +13 -8
- package/dist/cache/schema.d.ts.map +1 -1
- package/dist/cache/schema.js +84 -23
- package/dist/cache/schema.js.map +1 -1
- package/dist/cache/store.d.ts +15 -0
- package/dist/cache/store.d.ts.map +1 -1
- package/dist/cache/store.js +32 -3
- package/dist/cache/store.js.map +1 -1
- package/dist/client.d.ts +28 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +112 -13
- package/dist/client.js.map +1 -1
- package/dist/commands/chats.d.ts.map +1 -1
- package/dist/commands/chats.js +8 -0
- package/dist/commands/chats.js.map +1 -1
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +6 -2
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/context.d.ts +14 -2
- package/dist/commands/context.d.ts.map +1 -1
- package/dist/commands/context.js +18 -19
- package/dist/commands/context.js.map +1 -1
- package/dist/commands/export.d.ts +3 -0
- package/dist/commands/export.d.ts.map +1 -0
- package/dist/commands/export.js +83 -0
- package/dist/commands/export.js.map +1 -0
- package/dist/commands/mcp.d.ts.map +1 -1
- package/dist/commands/mcp.js +9 -2
- package/dist/commands/mcp.js.map +1 -1
- package/dist/commands/messages.d.ts.map +1 -1
- package/dist/commands/messages.js +126 -3
- package/dist/commands/messages.js.map +1 -1
- package/dist/commands/models.d.ts +7 -0
- package/dist/commands/models.d.ts.map +1 -0
- package/dist/commands/models.js +47 -0
- package/dist/commands/models.js.map +1 -0
- package/dist/commands/serve.d.ts.map +1 -1
- package/dist/commands/serve.js +50 -2
- package/dist/commands/serve.js.map +1 -1
- package/dist/commands/session.d.ts.map +1 -1
- package/dist/commands/session.js +13 -3
- package/dist/commands/session.js.map +1 -1
- package/dist/commands/watch.d.ts.map +1 -1
- package/dist/commands/watch.js +12 -16
- package/dist/commands/watch.js.map +1 -1
- package/dist/config.d.ts +18 -2
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +58 -4
- package/dist/config.js.map +1 -1
- package/dist/domain/map.d.ts.map +1 -1
- package/dist/domain/map.js +5 -0
- package/dist/domain/map.js.map +1 -1
- package/dist/domain/models.d.ts +14 -0
- package/dist/domain/models.d.ts.map +1 -1
- package/dist/domain/models.js.map +1 -1
- package/dist/download.d.ts +2 -0
- package/dist/download.d.ts.map +1 -1
- package/dist/download.js +11 -0
- package/dist/download.js.map +1 -1
- package/dist/export.d.ts +26 -0
- package/dist/export.d.ts.map +1 -0
- package/dist/export.js +75 -0
- package/dist/export.js.map +1 -0
- package/dist/generated/client.generated.d.ts +2 -0
- package/dist/generated/client.generated.d.ts.map +1 -1
- package/dist/generated/client.generated.js +2 -0
- package/dist/generated/client.generated.js.map +1 -1
- package/dist/generated/opcodes.generated.d.ts +0 -9
- package/dist/generated/opcodes.generated.d.ts.map +1 -1
- package/dist/generated/opcodes.generated.js +0 -9
- package/dist/generated/opcodes.generated.js.map +1 -1
- package/dist/generated/operations.generated.d.ts +24 -6
- package/dist/generated/operations.generated.d.ts.map +1 -1
- package/dist/generated/operations.generated.js +4 -2
- package/dist/generated/operations.generated.js.map +1 -1
- package/dist/mcp/confirm.d.ts +7 -0
- package/dist/mcp/confirm.d.ts.map +1 -1
- package/dist/mcp/confirm.js +16 -7
- package/dist/mcp/confirm.js.map +1 -1
- package/dist/mcp/instructions.d.ts +5 -1
- package/dist/mcp/instructions.d.ts.map +1 -1
- package/dist/mcp/instructions.js +16 -2
- package/dist/mcp/instructions.js.map +1 -1
- package/dist/mcp/server.d.ts +3 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +22 -3
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/session.d.ts +1 -1
- package/dist/mcp/session.d.ts.map +1 -1
- package/dist/mcp/session.js +1 -1
- package/dist/mcp/session.js.map +1 -1
- package/dist/mcp/tools.d.ts +8 -1
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +87 -10
- package/dist/mcp/tools.js.map +1 -1
- package/dist/program.d.ts.map +1 -1
- package/dist/program.js +6 -2
- package/dist/program.js.map +1 -1
- package/dist/protocol/connection.d.ts +2 -1
- package/dist/protocol/connection.d.ts.map +1 -1
- package/dist/protocol/connection.js +45 -14
- package/dist/protocol/connection.js.map +1 -1
- package/dist/protocol/frame.d.ts +22 -14
- package/dist/protocol/frame.d.ts.map +1 -1
- package/dist/protocol/frame.js +116 -37
- package/dist/protocol/frame.js.map +1 -1
- package/dist/protocol/lz4.d.ts +15 -0
- package/dist/protocol/lz4.d.ts.map +1 -0
- package/dist/protocol/lz4.js +154 -0
- package/dist/protocol/lz4.js.map +1 -0
- package/dist/sends/guard.d.ts +7 -3
- package/dist/sends/guard.d.ts.map +1 -1
- package/dist/sends/guard.js +32 -11
- package/dist/sends/guard.js.map +1 -1
- package/dist/sends/journal.d.ts +6 -1
- package/dist/sends/journal.d.ts.map +1 -1
- package/dist/sends/journal.js.map +1 -1
- package/dist/sends/permissions.d.ts +11 -0
- package/dist/sends/permissions.d.ts.map +1 -0
- package/dist/sends/permissions.js +47 -0
- package/dist/sends/permissions.js.map +1 -0
- package/dist/server/lines.d.ts +4 -0
- package/dist/server/lines.d.ts.map +1 -1
- package/dist/server/lines.js +11 -2
- package/dist/server/lines.js.map +1 -1
- package/dist/server/server-connection.d.ts +25 -15
- package/dist/server/server-connection.d.ts.map +1 -1
- package/dist/server/server-connection.js +69 -63
- package/dist/server/server-connection.js.map +1 -1
- package/dist/server/server.d.ts +7 -0
- package/dist/server/server.d.ts.map +1 -1
- package/dist/server/server.js +84 -19
- package/dist/server/server.js.map +1 -1
- package/dist/server/start.d.ts +23 -1
- package/dist/server/start.d.ts.map +1 -1
- package/dist/server/start.js +61 -7
- package/dist/server/start.js.map +1 -1
- package/dist/session/adopt.d.ts.map +1 -1
- package/dist/session/adopt.js +4 -0
- package/dist/session/adopt.js.map +1 -1
- package/dist/session/handshake.d.ts +5 -3
- package/dist/session/handshake.d.ts.map +1 -1
- package/dist/session/handshake.js +3 -3
- package/dist/session/handshake.js.map +1 -1
- package/dist/spec/identity.d.ts +5 -4
- package/dist/spec/identity.d.ts.map +1 -1
- package/dist/spec/identity.js +5 -4
- package/dist/spec/identity.js.map +1 -1
- package/dist/spec/index.js +4 -4
- package/dist/spec/index.js.map +1 -1
- package/dist/spec/operations/chats.d.ts +16 -6
- package/dist/spec/operations/chats.d.ts.map +1 -1
- package/dist/spec/operations/chats.js +38 -9
- package/dist/spec/operations/chats.js.map +1 -1
- package/dist/spec/operations/messages.d.ts +13 -1
- package/dist/spec/operations/messages.d.ts.map +1 -1
- package/dist/spec/operations/messages.js +18 -4
- package/dist/spec/operations/messages.js.map +1 -1
- package/dist/spec/operations/session.d.ts +5 -4
- package/dist/spec/operations/session.d.ts.map +1 -1
- package/dist/spec/operations/session.js +7 -6
- package/dist/spec/operations/session.js.map +1 -1
- package/dist/spec/scalars.js +2 -2
- package/dist/testing/mock-max.d.ts +5 -1
- package/dist/testing/mock-max.d.ts.map +1 -1
- package/dist/testing/mock-max.js +6 -3
- package/dist/testing/mock-max.js.map +1 -1
- package/dist/transcribe/index.d.ts +34 -0
- package/dist/transcribe/index.d.ts.map +1 -0
- package/dist/transcribe/index.js +43 -0
- package/dist/transcribe/index.js.map +1 -0
- package/dist/transcribe/install.d.ts +18 -0
- package/dist/transcribe/install.d.ts.map +1 -0
- package/dist/transcribe/install.js +67 -0
- package/dist/transcribe/install.js.map +1 -0
- package/dist/transcribe/models.d.ts +32 -0
- package/dist/transcribe/models.d.ts.map +1 -0
- package/dist/transcribe/models.js +124 -0
- package/dist/transcribe/models.js.map +1 -0
- package/dist/transcribe/speech.d.ts +25 -0
- package/dist/transcribe/speech.d.ts.map +1 -0
- package/dist/transcribe/speech.js +105 -0
- package/dist/transcribe/speech.js.map +1 -0
- package/dist/update.d.ts +1 -11
- package/dist/update.d.ts.map +1 -1
- package/dist/update.js +14 -42
- package/dist/update.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +9 -3
- package/skills/max-cli/SKILL.md +19 -3
|
@@ -11,17 +11,27 @@ export declare const chatsHistory: import("../define.js").Operation<v.StrictObje
|
|
|
11
11
|
readonly from: v.NumberSchema<undefined>;
|
|
12
12
|
readonly forward: v.NumberSchema<undefined>;
|
|
13
13
|
readonly backward: v.NumberSchema<undefined>;
|
|
14
|
-
readonly forwardTime: v.NumberSchema<undefined>;
|
|
15
|
-
readonly backwardTime: v.NumberSchema<undefined>;
|
|
16
|
-
|
|
17
|
-
readonly
|
|
14
|
+
readonly forwardTime: v.OptionalSchema<v.NumberSchema<undefined>, undefined>;
|
|
15
|
+
readonly backwardTime: v.OptionalSchema<v.NumberSchema<undefined>, undefined>;
|
|
16
|
+
/** `DELAYED` is the queue of scheduled messages, read with `from: 1` and `forward` (measured 2026-09-24). */
|
|
17
|
+
readonly itemType: v.OptionalSchema<v.PicklistSchema<["REGULAR", "DELAYED"], undefined>, undefined>;
|
|
18
|
+
readonly getChat: v.OptionalSchema<v.BooleanSchema<undefined>, undefined>;
|
|
18
19
|
readonly getMessages: v.BooleanSchema<undefined>;
|
|
19
20
|
/** False for the same reason as on login: a script reading is not a person looking. */
|
|
20
|
-
readonly interactive: v.LiteralSchema<false, undefined>;
|
|
21
|
+
readonly interactive: v.OptionalSchema<v.LiteralSchema<false, undefined>, undefined>;
|
|
21
22
|
}, undefined>, v.LooseObjectSchema<{
|
|
22
23
|
readonly messages: v.OptionalSchema<v.ArraySchema<v.LooseObjectSchema<{}, undefined>, undefined>, undefined>;
|
|
23
24
|
}, undefined>>;
|
|
24
|
-
export declare const
|
|
25
|
+
export declare const chatsMark: import("../define.js").Operation<v.StrictObjectSchema<{
|
|
26
|
+
readonly type: v.LiteralSchema<"READ_MESSAGE", undefined>;
|
|
27
|
+
readonly chatId: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "an id is a whole number written as a string">, v.TransformAction<string, bigint>]>;
|
|
28
|
+
readonly messageId: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "an id is a whole number written as a string">, v.TransformAction<string, bigint>]>;
|
|
29
|
+
/** When it was read, in milliseconds. */
|
|
30
|
+
readonly mark: v.NumberSchema<undefined>;
|
|
31
|
+
}, undefined>, v.LooseObjectSchema<{
|
|
32
|
+
readonly unread: v.OptionalSchema<v.NumberSchema<undefined>, undefined>;
|
|
33
|
+
readonly mark: v.OptionalSchema<v.NumberSchema<undefined>, undefined>;
|
|
34
|
+
}, undefined>>;
|
|
25
35
|
export declare const chatsLinkInfo: import("../define.js").Operation<v.StrictObjectSchema<{
|
|
26
36
|
readonly link: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
|
|
27
37
|
}, undefined>, v.LooseObjectSchema<{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chats.d.ts","sourceRoot":"","sources":["../../../src/spec/operations/chats.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAI5B,eAAO,MAAM,SAAS;IAMlB,6DAA6D;;;;;cAU/D,CAAA;AAEF,eAAO,MAAM,YAAY
|
|
1
|
+
{"version":3,"file":"chats.d.ts","sourceRoot":"","sources":["../../../src/spec/operations/chats.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAI5B,eAAO,MAAM,SAAS;IAMlB,6DAA6D;;;;;cAU/D,CAAA;AAEF,eAAO,MAAM,YAAY;;;;;;;IAcrB,6GAA6G;;;;IAI7G,uFAAuF;;;;cAWzF,CAAA;AAEF,eAAO,MAAM,SAAS;;;;IAalB,yCAAyC;;;;;cAc3C,CAAA;AAKF,eAAO,MAAM,aAAa;;;;cAYxB,CAAA;AAEF,eAAO,MAAM,SAAS;;;;cAapB,CAAA;AAEF,eAAO,MAAM,UAAU;;;;cAYrB,CAAA;AAEF,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;cA6BtB,CAAA;AAEF,eAAO,MAAM,YAAY;;;;;;cAgBvB,CAAA;AAEF,eAAO,MAAM,kBAAkB;;;;IAS3B,uCAAuC;;;IAGvC,iGAAiG;;IAEjG,mGAAmG;;;;cAarG,CAAA;AAEF,eAAO,MAAM,UAAU,oCAOrB,CAAA"}
|
|
@@ -28,23 +28,52 @@ export const chatsHistory = defineOperation({
|
|
|
28
28
|
from: v.number(),
|
|
29
29
|
forward: v.number(),
|
|
30
30
|
backward: v.number(),
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
31
|
+
// web.max.ru sends chatId, from, forward, backward, getMessages and nothing else (captured
|
|
32
|
+
// 2026-09-25). We add `interactive: false` until its absence is measured on an unread chat.
|
|
33
|
+
forwardTime: v.optional(v.number()),
|
|
34
|
+
backwardTime: v.optional(v.number()),
|
|
35
|
+
/** `DELAYED` is the queue of scheduled messages, read with `from: 1` and `forward` (measured 2026-09-24). */
|
|
36
|
+
itemType: v.optional(v.picklist(["REGULAR", "DELAYED"])),
|
|
37
|
+
getChat: v.optional(v.boolean()),
|
|
35
38
|
getMessages: v.boolean(),
|
|
36
39
|
/** False for the same reason as on login: a script reading is not a person looking. */
|
|
37
|
-
interactive: v.literal(false),
|
|
40
|
+
interactive: v.optional(v.literal(false)),
|
|
38
41
|
}),
|
|
39
42
|
response: v.looseObject({ messages: v.optional(v.array(v.looseObject({}))) }),
|
|
40
|
-
provenance: {
|
|
43
|
+
provenance: {
|
|
44
|
+
confidence: "measured",
|
|
45
|
+
sources: [
|
|
46
|
+
"measured against MAX 2026-09-19",
|
|
47
|
+
"`DELAYED` from web.max.ru (2026-09-24, `FIND-78`), measured 2026-09-24 in Saved messages (`pnpm probe:scheduled`)",
|
|
48
|
+
],
|
|
49
|
+
},
|
|
41
50
|
});
|
|
42
|
-
export const
|
|
51
|
+
export const chatsMark = defineOperation({
|
|
43
52
|
name: "chats.mark",
|
|
44
53
|
constant: "CHAT_MARK",
|
|
45
54
|
opcode: 50,
|
|
46
|
-
|
|
47
|
-
|
|
55
|
+
auth: true,
|
|
56
|
+
/**
|
|
57
|
+
* Sent only by `max chats read` and `messages list --mark-read`: reading never sends it, and the
|
|
58
|
+
* tests that assert so stay (REQUIREMENTS §19).
|
|
59
|
+
*/
|
|
60
|
+
request: v.strictObject({
|
|
61
|
+
type: v.literal("READ_MESSAGE"),
|
|
62
|
+
chatId: id(),
|
|
63
|
+
messageId: id(),
|
|
64
|
+
/** When it was read, in milliseconds. */
|
|
65
|
+
mark: v.number(),
|
|
66
|
+
}),
|
|
67
|
+
response: v.looseObject({ unread: v.optional(v.number()), mark: v.optional(v.number()) }),
|
|
68
|
+
provenance: {
|
|
69
|
+
confidence: "observed",
|
|
70
|
+
sources: [
|
|
71
|
+
"PyMax `api/messages/service.py` read_message, `payloads.py` ReadMessagesPayload, `types/domain/message.py` ReadState (53103f0)",
|
|
72
|
+
"tsmax",
|
|
73
|
+
"max-api-docs/protocol/chats.md",
|
|
74
|
+
],
|
|
75
|
+
notes: "Not measured: the shape is PyMax's. PyMax also sends `type: READ_REACTION`, which is not used here (`CLI-33`).",
|
|
76
|
+
},
|
|
48
77
|
});
|
|
49
78
|
/** `join/<token>` — what 57 and 89 take for a private link. A public channel's link goes whole. */
|
|
50
79
|
const link = () => v.pipe(v.string(), v.minLength(1));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chats.js","sourceRoot":"","sources":["../../../src/spec/operations/chats.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAC5B,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAC7D,OAAO,EAAE,EAAE,EAAE,MAAM,eAAe,CAAA;AAElC,MAAM,CAAC,MAAM,SAAS,GAAG,eAAe,CAAC;IACvC,IAAI,EAAE,YAAY;IAClB,QAAQ,EAAE,YAAY;IACtB,MAAM,EAAE,EAAE;IACV,IAAI,EAAE,IAAI;IACV,OAAO,EAAE,CAAC,CAAC,YAAY,CAAC;QACtB,6DAA6D;QAC7D,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;QAClB,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;KAClE,CAAC;IACF,QAAQ,EAAE,CAAC,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1E,UAAU,EAAE;QACV,UAAU,EAAE,UAAU;QACtB,OAAO,EAAE,CAAC,iCAAiC,EAAE,gCAAgC,CAAC;QAC9E,KAAK,EAAE,gGAAgG;KACxG;CACF,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,eAAe,CAAC;IAC1C,IAAI,EAAE,eAAe;IACrB,QAAQ,EAAE,cAAc;IACxB,MAAM,EAAE,EAAE;IACV,IAAI,EAAE,IAAI;IACV,OAAO,EAAE,CAAC,CAAC,YAAY,CAAC;QACtB,MAAM,EAAE,EAAE,EAAE;QACZ,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;QAChB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;QACnB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;QACpB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;
|
|
1
|
+
{"version":3,"file":"chats.js","sourceRoot":"","sources":["../../../src/spec/operations/chats.ts"],"names":[],"mappings":"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"}
|
|
@@ -25,6 +25,14 @@ export declare const messagesSend: import("../define.js").Operation<v.UnionSchem
|
|
|
25
25
|
readonly messageId: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "an id is a whole number written as a string">, v.TransformAction<string, bigint>]>;
|
|
26
26
|
readonly chatId: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "an id is a whole number written as a string">, v.TransformAction<string, bigint>]>;
|
|
27
27
|
}, undefined>], undefined>, undefined>;
|
|
28
|
+
/**
|
|
29
|
+
* When MAX itself sends it, in epoch milliseconds — the message waits in the chat's DELAYED
|
|
30
|
+
* history until then. The answer adds `notifySender` and `notifyOpponents`, which we leave
|
|
31
|
+
* to MAX as the web client does (measured 2026-09-24, `FIND-139`).
|
|
32
|
+
*/
|
|
33
|
+
readonly delayedAttributes: v.OptionalSchema<v.StrictObjectSchema<{
|
|
34
|
+
readonly timeToFire: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>]>;
|
|
35
|
+
}, undefined>, undefined>;
|
|
28
36
|
}, undefined>;
|
|
29
37
|
readonly notify: v.BooleanSchema<undefined>;
|
|
30
38
|
}, undefined>, v.StrictObjectSchema<{
|
|
@@ -79,5 +87,9 @@ export declare const messagesUnreact: import("../define.js").Operation<v.StrictO
|
|
|
79
87
|
}, undefined>, v.LooseObjectSchema<{
|
|
80
88
|
readonly reactionInfo: v.OptionalSchema<v.LooseObjectSchema<{}, undefined>, undefined>;
|
|
81
89
|
}, undefined>>;
|
|
82
|
-
export declare const
|
|
90
|
+
export declare const messagesDelete: import("../define.js").Operation<v.StrictObjectSchema<{
|
|
91
|
+
readonly chatId: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "an id is a whole number written as a string">, v.TransformAction<string, bigint>]>;
|
|
92
|
+
readonly messageIds: v.ArraySchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "an id is a whole number written as a string">, v.TransformAction<string, bigint>]>, undefined>;
|
|
93
|
+
readonly forMe: v.BooleanSchema<undefined>;
|
|
94
|
+
}, undefined>, v.LooseObjectSchema<{}, undefined>>;
|
|
83
95
|
//# sourceMappingURL=messages.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../../src/spec/operations/messages.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAI5B,eAAO,MAAM,YAAY;;;QASjB,2FAA2F;;QAE3F;;;WAGG;;QAEH,+GAA+G;;;;;;;QAG/G,+FAA+F
|
|
1
|
+
{"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../../src/spec/operations/messages.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAI5B,eAAO,MAAM,YAAY;;;QASjB,2FAA2F;;QAE3F;;;WAGG;;QAEH,+GAA+G;;;;;;;QAG/G,+FAA+F;;;;;;;;;QAQ/F;;;;WAIG;;;;;;;;;;;;;;;;;;;;;cAwCT,CAAA;AAEF,eAAO,MAAM,YAAY;;;;;;;;;IAUrB,2FAA2F;;;;cAgB7F,CAAA;AAEF,eAAO,MAAM,iBAAiB;;;;;cAiB5B,CAAA;AAEF,eAAO,MAAM,aAAa;;;;;;;;;cAqBxB,CAAA;AAEF,eAAO,MAAM,eAAe;;;;;cAY1B,CAAA;AAEF,eAAO,MAAM,cAAc;;;;kDAczB,CAAA"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as v from "valibot";
|
|
2
|
-
import { defineOperation
|
|
2
|
+
import { defineOperation } from "../define.js";
|
|
3
3
|
import { id } from "../scalars.js";
|
|
4
4
|
export const messagesSend = defineOperation({
|
|
5
5
|
name: "messages.send",
|
|
@@ -26,6 +26,12 @@ export const messagesSend = defineOperation({
|
|
|
26
26
|
/** `chatId` is the chat the message is forwarded **from** (web.max.ru, PyMax). */
|
|
27
27
|
v.strictObject({ type: v.literal("FORWARD"), messageId: id(), chatId: id() }),
|
|
28
28
|
])),
|
|
29
|
+
/**
|
|
30
|
+
* When MAX itself sends it, in epoch milliseconds — the message waits in the chat's DELAYED
|
|
31
|
+
* history until then. The answer adds `notifySender` and `notifyOpponents`, which we leave
|
|
32
|
+
* to MAX as the web client does (measured 2026-09-24, `FIND-139`).
|
|
33
|
+
*/
|
|
34
|
+
delayedAttributes: v.optional(v.strictObject({ timeToFire: v.pipe(v.number(), v.integer()) })),
|
|
29
35
|
}),
|
|
30
36
|
notify: v.boolean(),
|
|
31
37
|
}),
|
|
@@ -58,6 +64,7 @@ export const messagesSend = defineOperation({
|
|
|
58
64
|
"the FORWARD link: web.max.ru `_app/immutable/chunks/5oCuRT0F.js` (2026-09-24), PyMax `api/messages/payloads.py:56-73`",
|
|
59
65
|
"a forward with no `text` and no `elements` measured 2026-09-24 in Saved messages (`pnpm probe:edit-pin-forward`)",
|
|
60
66
|
"group creation measured 2026-09-24 (`pnpm probe:groups`); shape from PyMax create_group",
|
|
67
|
+
"`delayedAttributes` from web.max.ru (2026-09-24, `FIND-78`), measured 2026-09-24 in Saved messages (`pnpm probe:scheduled`)",
|
|
61
68
|
],
|
|
62
69
|
notes: "How long MAX remembers a `cid` is still unmeasured (`PROTO-2`); the two probes were seconds apart. " +
|
|
63
70
|
"The forward was measured from chat 0 to chat 0, so that `link.chatId` is the source rests on the two clients.",
|
|
@@ -140,11 +147,18 @@ export const messagesUnreact = defineOperation({
|
|
|
140
147
|
notes: "Answers the reactions left, `{reactionInfo: {}}` when none. A second call is answered the same.",
|
|
141
148
|
},
|
|
142
149
|
});
|
|
143
|
-
export const
|
|
150
|
+
export const messagesDelete = defineOperation({
|
|
144
151
|
name: "messages.delete",
|
|
145
152
|
constant: "MSG_DELETE",
|
|
146
153
|
opcode: 66,
|
|
147
|
-
|
|
148
|
-
|
|
154
|
+
auth: true,
|
|
155
|
+
request: v.strictObject({ chatId: id(), messageIds: v.array(id()), forMe: v.boolean() }),
|
|
156
|
+
response: v.looseObject({}),
|
|
157
|
+
provenance: {
|
|
158
|
+
confidence: "observed",
|
|
159
|
+
sources: ["PyMax 2.4.1 `delete_message`", "tsmax"],
|
|
160
|
+
notes: "`forMe: true` removes the messages for this account only, `false` for everyone in the chat. Sent only by " +
|
|
161
|
+
"`max messages delete`, on the owner's word each time (`NEED-32` corrected, `MAX-47`). Not yet measured.",
|
|
162
|
+
},
|
|
149
163
|
});
|
|
150
164
|
//# sourceMappingURL=messages.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messages.js","sourceRoot":"","sources":["../../../src/spec/operations/messages.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAC5B,OAAO,EAAE,eAAe,EAAE,
|
|
1
|
+
{"version":3,"file":"messages.js","sourceRoot":"","sources":["../../../src/spec/operations/messages.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,6 +15,7 @@ export declare const sessionInit: import("../define.js").Operation<v.StrictObjec
|
|
|
15
15
|
readonly osVersion: v.StringSchema<undefined>;
|
|
16
16
|
readonly deviceName: v.StringSchema<undefined>;
|
|
17
17
|
readonly headerUserAgent: v.StringSchema<undefined>;
|
|
18
|
+
readonly isPwa: v.LiteralSchema<false, undefined>;
|
|
18
19
|
readonly appVersion: v.StringSchema<undefined>;
|
|
19
20
|
readonly screen: v.StringSchema<undefined>;
|
|
20
21
|
readonly timezone: v.StringSchema<undefined>;
|
|
@@ -23,13 +24,13 @@ export declare const sessionInit: import("../define.js").Operation<v.StrictObjec
|
|
|
23
24
|
}, undefined>, v.LooseObjectSchema<{}, undefined>>;
|
|
24
25
|
export declare const sessionLogin: import("../define.js").Operation<v.StrictObjectSchema<{
|
|
25
26
|
readonly token: v.StringSchema<undefined>;
|
|
27
|
+
readonly chatsCount: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 1, undefined>, v.MaxValueAction<number, 100, undefined>]>;
|
|
26
28
|
/**
|
|
27
|
-
* False, always
|
|
28
|
-
*
|
|
29
|
-
*
|
|
29
|
+
* False, always: we are a script reading, and claiming a human is present is the small lie that
|
|
30
|
+
* becomes a side effect nobody can trace (`RES-5`). **Correction 2026-09-25:** this said the web
|
|
31
|
+
* client sends true; its LOGIN on a live socket sent `false` too — `true` goes in its pings.
|
|
30
32
|
*/
|
|
31
33
|
readonly interactive: v.LiteralSchema<false, undefined>;
|
|
32
|
-
readonly chatsCount: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 1, undefined>, v.MaxValueAction<number, 100, undefined>]>;
|
|
33
34
|
/**
|
|
34
35
|
* **Delta markers, not flags** — measured 2026-09-20. Each is a moment in time, and MAX
|
|
35
36
|
* returns only what changed in that collection since it. `0` means "everything", which is what
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../src/spec/operations/session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../src/spec/operations/session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAuB5B;;;GAGG;AACH,eAAO,MAAM,WAAW;;kDAYtB,CAAA;AAEF,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;kDAYtB,CAAA;AAEF,eAAO,MAAM,YAAY;;;IAUrB;;;;OAIG;;IAEH;;;;;;;;;;;OAWG;;;;;;;;;IAUH;;;;;;;;;;;;;;OAcG;;IAEH;;;;;;;;;;;;;;OAcG;;;;;;;cAkBL,CAAA;AAEF,eAAO,MAAM,MAAM,oCAOjB,CAAA"}
|
|
@@ -14,6 +14,7 @@ const WebUserAgent = v.strictObject({
|
|
|
14
14
|
osVersion: v.string(),
|
|
15
15
|
deviceName: v.string(),
|
|
16
16
|
headerUserAgent: v.string(),
|
|
17
|
+
isPwa: v.literal(false),
|
|
17
18
|
appVersion: v.string(),
|
|
18
19
|
screen: v.string(),
|
|
19
20
|
timezone: v.string(),
|
|
@@ -55,15 +56,15 @@ export const sessionLogin = defineOperation({
|
|
|
55
56
|
auth: false,
|
|
56
57
|
request: v.strictObject({
|
|
57
58
|
token: v.string(),
|
|
58
|
-
/**
|
|
59
|
-
* False, always. The web client sends true because a person is looking at it; we are a script
|
|
60
|
-
* reading, and claiming a human is present is the small lie that becomes a side effect nobody
|
|
61
|
-
* can trace (`RES-5`).
|
|
62
|
-
*/
|
|
63
|
-
interactive: v.literal(false),
|
|
64
59
|
// 100 works and 200 comes back `'chatsCount' out of range`; refusing locally beats a round
|
|
65
60
|
// trip that only tells us what we already know. The real boundary is `PROTO-3`.
|
|
66
61
|
chatsCount: v.pipe(v.number(), v.integer(), v.minValue(1), v.maxValue(100)),
|
|
62
|
+
/**
|
|
63
|
+
* False, always: we are a script reading, and claiming a human is present is the small lie that
|
|
64
|
+
* becomes a side effect nobody can trace (`RES-5`). **Correction 2026-09-25:** this said the web
|
|
65
|
+
* client sends true; its LOGIN on a live socket sent `false` too — `true` goes in its pings.
|
|
66
|
+
*/
|
|
67
|
+
interactive: v.literal(false),
|
|
67
68
|
/**
|
|
68
69
|
* **Delta markers, not flags** — measured 2026-09-20. Each is a moment in time, and MAX
|
|
69
70
|
* returns only what changed in that collection since it. `0` means "everything", which is what
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/spec/operations/session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAC5B,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAE7D;;;;;GAKG;AACH,MAAM,YAAY,GAAG,CAAC,CAAC,YAAY,CAAC;IAClC,UAAU,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;IAC5B,cAAc,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC;IACpC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;IAClB,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;IACxB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;IACrB,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;IACtB,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE;IAC3B,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;IACtB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;IAClB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;CACrB,CAAC,CAAA;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,eAAe,CAAC;IACzC,IAAI,EAAE,cAAc;IACpB,QAAQ,EAAE,MAAM;IAChB,MAAM,EAAE,CAAC;IACT,IAAI,EAAE,IAAI;IACV,OAAO,EAAE,CAAC,CAAC,YAAY,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;IACrD,QAAQ,EAAE,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC;IAC3B,UAAU,EAAE;QACV,UAAU,EAAE,WAAW;QACvB,OAAO,EAAE,CAAC,uEAAuE,EAAE,uBAAuB,CAAC;QAC3G,KAAK,EAAE,mEAAmE;KAC3E;CACF,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,eAAe,CAAC;IACzC,IAAI,EAAE,cAAc;IACpB,QAAQ,EAAE,cAAc;IACxB,MAAM,EAAE,CAAC;IACT,IAAI,EAAE,KAAK;IACX,OAAO,EAAE,CAAC,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;IAC1E,QAAQ,EAAE,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC;IAC3B,UAAU,EAAE;QACV,UAAU,EAAE,UAAU;QACtB,OAAO,EAAE,CAAC,iCAAiC,EAAE,+BAA+B,EAAE,sBAAsB,CAAC;QACrG,KAAK,EAAE,2DAA2D;KACnE;CACF,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,eAAe,CAAC;IAC1C,IAAI,EAAE,eAAe;IACrB,QAAQ,EAAE,OAAO;IACjB,MAAM,EAAE,EAAE;IACV,IAAI,EAAE,KAAK;IACX,OAAO,EAAE,CAAC,CAAC,YAAY,CAAC;QACtB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;QACjB
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/spec/operations/session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAC5B,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAE7D;;;;;GAKG;AACH,MAAM,YAAY,GAAG,CAAC,CAAC,YAAY,CAAC;IAClC,UAAU,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;IAC5B,cAAc,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC;IACpC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;IAClB,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;IACxB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;IACrB,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;IACtB,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE;IAC3B,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;IACvB,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;IACtB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;IAClB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;CACrB,CAAC,CAAA;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,eAAe,CAAC;IACzC,IAAI,EAAE,cAAc;IACpB,QAAQ,EAAE,MAAM;IAChB,MAAM,EAAE,CAAC;IACT,IAAI,EAAE,IAAI;IACV,OAAO,EAAE,CAAC,CAAC,YAAY,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;IACrD,QAAQ,EAAE,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC;IAC3B,UAAU,EAAE;QACV,UAAU,EAAE,WAAW;QACvB,OAAO,EAAE,CAAC,uEAAuE,EAAE,uBAAuB,CAAC;QAC3G,KAAK,EAAE,mEAAmE;KAC3E;CACF,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,eAAe,CAAC;IACzC,IAAI,EAAE,cAAc;IACpB,QAAQ,EAAE,cAAc;IACxB,MAAM,EAAE,CAAC;IACT,IAAI,EAAE,KAAK;IACX,OAAO,EAAE,CAAC,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;IAC1E,QAAQ,EAAE,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC;IAC3B,UAAU,EAAE;QACV,UAAU,EAAE,UAAU;QACtB,OAAO,EAAE,CAAC,iCAAiC,EAAE,+BAA+B,EAAE,sBAAsB,CAAC;QACrG,KAAK,EAAE,2DAA2D;KACnE;CACF,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,eAAe,CAAC;IAC1C,IAAI,EAAE,eAAe;IACrB,QAAQ,EAAE,OAAO;IACjB,MAAM,EAAE,EAAE;IACV,IAAI,EAAE,KAAK;IACX,OAAO,EAAE,CAAC,CAAC,YAAY,CAAC;QACtB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;QACjB,2FAA2F;QAC3F,gFAAgF;QAChF,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC3E;;;;WAIG;QACH,WAAW,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;QAC7B;;;;;;;;;;;WAWG;QACH,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;QACrB,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;QACxB,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;QACxB,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;KACvB,CAAC;IACF,QAAQ,EAAE,CAAC,CAAC,WAAW,CAAC;QACtB,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QACtC,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7C,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC;QAChD;;;;;;;;;;;;;;WAcG;QACH,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;QACjC;;;;;;;;;;;;;;WAcG;QACH,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAC7B,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;QACjC,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAC5B,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;QACnC,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;QAC/B,gBAAgB,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;KAC1C,CAAC;IACF,UAAU,EAAE;QACV,UAAU,EAAE,UAAU;QACtB,OAAO,EAAE;YACP,iCAAiC;YACjC,2DAA2D;YAC3D,0FAA0F;SAC3F;QACD,KAAK,EACH,uIAAuI;KAC1I;CACF,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,MAAM,GAAG,aAAa,CAAC;IAClC,IAAI,EAAE,gBAAgB;IACtB,QAAQ,EAAE,QAAQ;IAClB,MAAM,EAAE,EAAE;IACV,MAAM,EACJ,sMAAsM;IACxM,UAAU,EAAE,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,+BAA+B,CAAC,EAAE;CACnF,CAAC,CAAA"}
|
package/dist/spec/scalars.js
CHANGED
|
@@ -7,8 +7,8 @@ import * as v from "valibot";
|
|
|
7
7
|
* never arithmetic. The write direction did not exist, and `Number(id)` was standing in for it:
|
|
8
8
|
* `Number("7268926000000000001")` is `7268926000000000000`, which is a different chat.
|
|
9
9
|
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
10
|
+
* The frame codec sends a `bigint` as a 64-bit integer wrapped in MessagePack extension 1, the way
|
|
11
|
+
* web.max.ru sends an id, so every digit reaches MAX (`src/protocol/frame.ts`).
|
|
12
12
|
*/
|
|
13
13
|
const WHOLE_NUMBER = /^-?\d+$/;
|
|
14
14
|
export const toWireId = (value) => BigInt(value);
|
|
@@ -18,12 +18,14 @@ export interface MockMax {
|
|
|
18
18
|
opcode: number;
|
|
19
19
|
payload: Payload;
|
|
20
20
|
}[];
|
|
21
|
+
/** The same requests as bytes, for a test about what went on the wire rather than what it meant. */
|
|
22
|
+
wire: Uint8Array[];
|
|
21
23
|
/** Calls with no scripted answer. Any left at the end of a test fail it (`unscripted.ts`). */
|
|
22
24
|
unexpected: number[];
|
|
23
25
|
/** What the client answered to MAX's own frames — a ping, a new message. */
|
|
24
26
|
answered: {
|
|
25
27
|
opcode: number;
|
|
26
|
-
seq: number
|
|
28
|
+
seq: number;
|
|
27
29
|
payload: Payload | null;
|
|
28
30
|
}[];
|
|
29
31
|
closed: boolean;
|
|
@@ -31,6 +33,8 @@ export interface MockMax {
|
|
|
31
33
|
push: (opcode: number, payload: Payload, seq: number) => void;
|
|
32
34
|
/** MAX drops the socket from its side. */
|
|
33
35
|
drop: () => void;
|
|
36
|
+
/** Bytes exactly as given — for a frame no encoder of ours would write. */
|
|
37
|
+
pushBytes: (bytes: Uint8Array) => void;
|
|
34
38
|
}
|
|
35
39
|
/** Every mock built since the last call, and forgets them — so each test sees only its own. */
|
|
36
40
|
export declare const takeBuiltMocks: () => MockMax[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mock-max.d.ts","sourceRoot":"","sources":["../../src/testing/mock-max.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,IAAI,CAAA;AACnC,OAAO,EAAqC,KAAK,OAAO,EAAE,MAAM,sBAAsB,CAAA;AAEtF,MAAM,WAAW,cAAc;IAC7B;;;;;OAKG;IACH,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,CAAC,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,GAAG,SAAS,CAAC,CAAC,CAAA;IAC9E,oIAAoI;IACpI,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAA;CAC7D;AAED,MAAM,WAAW,OAAO;IACtB,YAAY,EAAE,MAAM,SAAS,CAAA;IAC7B,sFAAsF;IACtF,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,EAAE,CAAA;IAC5C,8FAA8F;IAC9F,UAAU,EAAE,MAAM,EAAE,CAAA;IACpB,4EAA4E;IAC5E,QAAQ,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"mock-max.d.ts","sourceRoot":"","sources":["../../src/testing/mock-max.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,IAAI,CAAA;AACnC,OAAO,EAAqC,KAAK,OAAO,EAAE,MAAM,sBAAsB,CAAA;AAEtF,MAAM,WAAW,cAAc;IAC7B;;;;;OAKG;IACH,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,CAAC,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,GAAG,SAAS,CAAC,CAAC,CAAA;IAC9E,oIAAoI;IACpI,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAA;CAC7D;AAED,MAAM,WAAW,OAAO;IACtB,YAAY,EAAE,MAAM,SAAS,CAAA;IAC7B,sFAAsF;IACtF,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,EAAE,CAAA;IAC5C,oGAAoG;IACpG,IAAI,EAAE,UAAU,EAAE,CAAA;IAClB,8FAA8F;IAC9F,UAAU,EAAE,MAAM,EAAE,CAAA;IACpB,4EAA4E;IAC5E,QAAQ,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAA;KAAE,EAAE,CAAA;IACpE,MAAM,EAAE,OAAO,CAAA;IACf,uEAAuE;IACvE,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IAC7D,0CAA0C;IAC1C,IAAI,EAAE,MAAM,IAAI,CAAA;IAChB,2EAA2E;IAC3E,SAAS,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAA;CACvC;AAID,+FAA+F;AAC/F,eAAO,MAAM,cAAc,QAAO,OAAO,EAAqB,CAAA;AAE9D;;;;;;GAMG;AACH,eAAO,MAAM,OAAO,GAAI,qBAA0B,cAAc,KAAG,OA0ElE,CAAA"}
|
package/dist/testing/mock-max.js
CHANGED
|
@@ -20,11 +20,13 @@ export const mockMax = ({ answers, refuse = {} }) => {
|
|
|
20
20
|
const state = {
|
|
21
21
|
createSocket,
|
|
22
22
|
sent: [],
|
|
23
|
+
wire: [],
|
|
23
24
|
unexpected: [],
|
|
24
25
|
answered: [],
|
|
25
26
|
closed: false,
|
|
26
27
|
push: (opcode, payload, seq) => socket.answer({ seq, opcode, payload, cmd: Command.REQUEST }),
|
|
27
28
|
drop: () => queueMicrotask(() => socket.emit("close")),
|
|
29
|
+
pushBytes: (bytes) => queueMicrotask(() => socket.emit("message", Buffer.from(bytes))),
|
|
28
30
|
};
|
|
29
31
|
built.push(state);
|
|
30
32
|
const socket = new (class extends EventEmitter {
|
|
@@ -39,10 +41,11 @@ export const mockMax = ({ answers, refuse = {} }) => {
|
|
|
39
41
|
return;
|
|
40
42
|
}
|
|
41
43
|
state.sent.push({ opcode: frame.opcode, payload: frame.payload ?? {} });
|
|
44
|
+
state.wire.push(Uint8Array.from(raw));
|
|
42
45
|
const rule = refuse[frame.opcode];
|
|
43
46
|
const refusal = typeof rule === "function" ? rule() : rule;
|
|
44
47
|
if (refusal !== undefined) {
|
|
45
|
-
this.answer({ seq: frame.seq
|
|
48
|
+
this.answer({ seq: frame.seq, opcode: frame.opcode, payload: { error: refusal }, cmd: Command.ERROR });
|
|
46
49
|
return;
|
|
47
50
|
}
|
|
48
51
|
const answer = answers[frame.opcode];
|
|
@@ -53,10 +56,10 @@ export const mockMax = ({ answers, refuse = {} }) => {
|
|
|
53
56
|
const payload = typeof answer === "function" ? answer(frame.payload ?? {}) : answer;
|
|
54
57
|
if (payload === undefined)
|
|
55
58
|
return; // Silence: the caller will time out, as MAX sometimes does.
|
|
56
|
-
this.answer({ seq: frame.seq
|
|
59
|
+
this.answer({ seq: frame.seq, opcode: frame.opcode, payload, cmd: Command.RESPONSE });
|
|
57
60
|
}
|
|
58
61
|
answer(frame) {
|
|
59
|
-
queueMicrotask(() => this.emit("message", encodeFrame(frame)));
|
|
62
|
+
queueMicrotask(() => this.emit("message", Buffer.from(encodeFrame(frame))));
|
|
60
63
|
}
|
|
61
64
|
/**
|
|
62
65
|
* ⚠ **Emits `error` on the way out, the way `ws` does when a socket is closed before it
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mock-max.js","sourceRoot":"","sources":["../../src/testing/mock-max.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE1C,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAgB,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"mock-max.js","sourceRoot":"","sources":["../../src/testing/mock-max.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { CliError } from "@leemour/cli-core";
|
|
2
|
+
import type { CacheStore } from "../cache/index.js";
|
|
3
|
+
import type { MaxClient } from "../client.js";
|
|
4
|
+
import type { AttachmentLink, Id } from "../domain/models.js";
|
|
5
|
+
import { type SpeechModel } from "./models.js";
|
|
6
|
+
import { type Recognizer } from "./speech.js";
|
|
7
|
+
export interface Transcript {
|
|
8
|
+
chatId: Id;
|
|
9
|
+
messageId: Id;
|
|
10
|
+
text: string;
|
|
11
|
+
model: string;
|
|
12
|
+
/** Length of the recording; `null` when the text came from the cache. */
|
|
13
|
+
seconds: number | null;
|
|
14
|
+
cached: boolean;
|
|
15
|
+
}
|
|
16
|
+
export interface TranscribeOptions {
|
|
17
|
+
model: SpeechModel;
|
|
18
|
+
directory: string;
|
|
19
|
+
cache?: CacheStore | undefined;
|
|
20
|
+
/** Called once the audio is in hand, so the connection closes before the long part begins. */
|
|
21
|
+
release?: () => Promise<void>;
|
|
22
|
+
fetchAudio?: (link: AttachmentLink) => Promise<Uint8Array>;
|
|
23
|
+
open?: (model: SpeechModel, directory: string) => Recognizer;
|
|
24
|
+
}
|
|
25
|
+
export declare const notDownloaded: (model: SpeechModel) => CliError;
|
|
26
|
+
/**
|
|
27
|
+
* One voice message to text, on this machine. A text already heard by the same model comes from
|
|
28
|
+
* the cache, with no connection and no model loaded.
|
|
29
|
+
*
|
|
30
|
+
* ⚠ **The model is never downloaded from here** (`NEED-231`): an agent calling this through MCP must
|
|
31
|
+
* not start a 230–670 MB download. The refusal names the command that does it.
|
|
32
|
+
*/
|
|
33
|
+
export declare const transcribe: (client: MaxClient, chatId: Id, messageId: Id, { model, directory, cache, release, fetchAudio, open }: TranscribeOptions) => Promise<Transcript>;
|
|
34
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/transcribe/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAC7C,OAAO,KAAK,EAAE,cAAc,EAAE,EAAE,EAAE,MAAM,qBAAqB,CAAA;AAG7D,OAAO,EAAE,KAAK,WAAW,EAAO,MAAM,aAAa,CAAA;AACnD,OAAO,EAA6B,KAAK,UAAU,EAAe,MAAM,aAAa,CAAA;AAErF,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,EAAE,CAAA;IACV,SAAS,EAAE,EAAE,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,yEAAyE;IACzE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,MAAM,EAAE,OAAO,CAAA;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,WAAW,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,CAAC,EAAE,UAAU,GAAG,SAAS,CAAA;IAC9B,8FAA8F;IAC9F,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAC7B,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,OAAO,CAAC,UAAU,CAAC,CAAA;IAC1D,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,KAAK,UAAU,CAAA;CAC7D;AAED,eAAO,MAAM,aAAa,GAAI,OAAO,WAAW,KAAG,QAKhD,CAAA;AAKH;;;;;;GAMG;AACH,eAAO,MAAM,UAAU,GACrB,QAAQ,SAAS,EACjB,QAAQ,EAAE,EACV,WAAW,EAAE,EACb,wDAAqF,iBAAiB,KACrG,OAAO,CAAC,UAAU,CA0BpB,CAAA"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { CliError } from "@leemour/cli-core";
|
|
2
|
+
import { fetchBytes } from "../download.js";
|
|
3
|
+
import { installedBytes, isInstalled, megabytes, modelPath, vadPath } from "./install.js";
|
|
4
|
+
import { VAD } from "./models.js";
|
|
5
|
+
import { decodeOgg, openRecognizer, toModelRate } from "./speech.js";
|
|
6
|
+
export const notDownloaded = (model) => new CliError("not_found", `the speech model ${model.id} is not downloaded — \`max models audio download ${model.id}\` fetches it ` +
|
|
7
|
+
`(${megabytes(installedBytes(model) + VAD.bytes)}, once)`);
|
|
8
|
+
const openInstalled = (model, directory) => openRecognizer(model, modelPath(directory, model), vadPath(directory));
|
|
9
|
+
/**
|
|
10
|
+
* One voice message to text, on this machine. A text already heard by the same model comes from
|
|
11
|
+
* the cache, with no connection and no model loaded.
|
|
12
|
+
*
|
|
13
|
+
* ⚠ **The model is never downloaded from here** (`NEED-231`): an agent calling this through MCP must
|
|
14
|
+
* not start a 230–670 MB download. The refusal names the command that does it.
|
|
15
|
+
*/
|
|
16
|
+
export const transcribe = async (client, chatId, messageId, { model, directory, cache, release, fetchAudio = fetchBytes, open = openInstalled }) => {
|
|
17
|
+
const kept = cache?.messages.transcript(chatId, messageId);
|
|
18
|
+
if (kept && kept.model === model.id) {
|
|
19
|
+
return { chatId, messageId, text: kept.text, model: model.id, seconds: null, cached: true };
|
|
20
|
+
}
|
|
21
|
+
if (!isInstalled(model, directory))
|
|
22
|
+
throw notDownloaded(model);
|
|
23
|
+
const { links } = await client.messages.links(chatId, messageId);
|
|
24
|
+
const voice = links.find((link) => link.kind === "audio");
|
|
25
|
+
if (!voice)
|
|
26
|
+
throw new CliError("validation_error", `message ${messageId} has no voice recording to transcribe`);
|
|
27
|
+
const bytes = await fetchAudio(voice);
|
|
28
|
+
await release?.();
|
|
29
|
+
const { samples, rate } = await decodeOgg(bytes).catch((error) => {
|
|
30
|
+
throw new CliError("invalid_response", `the recording could not be read as Ogg Opus: ${error.message}`);
|
|
31
|
+
});
|
|
32
|
+
const pcm = toModelRate(samples, rate);
|
|
33
|
+
const recognizer = open(model, directory);
|
|
34
|
+
try {
|
|
35
|
+
const text = recognizer.recognize(pcm);
|
|
36
|
+
cache?.messages.keepTranscript(chatId, messageId, text, model.id);
|
|
37
|
+
return { chatId, messageId, text, model: model.id, seconds: Math.round(samples.length / rate), cached: false };
|
|
38
|
+
}
|
|
39
|
+
finally {
|
|
40
|
+
recognizer.free();
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/transcribe/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -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"}
|