@leemour/max-cli 0.6.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 (252) hide show
  1. package/README.md +201 -74
  2. package/dist/cache/index.d.ts +1 -0
  3. package/dist/cache/index.d.ts.map +1 -1
  4. package/dist/cache/index.js +4 -4
  5. package/dist/cache/index.js.map +1 -1
  6. package/dist/cache/schema.d.ts +13 -8
  7. package/dist/cache/schema.d.ts.map +1 -1
  8. package/dist/cache/schema.js +84 -23
  9. package/dist/cache/schema.js.map +1 -1
  10. package/dist/cache/store.d.ts +15 -0
  11. package/dist/cache/store.d.ts.map +1 -1
  12. package/dist/cache/store.js +32 -3
  13. package/dist/cache/store.js.map +1 -1
  14. package/dist/client.d.ts +205 -9
  15. package/dist/client.d.ts.map +1 -1
  16. package/dist/client.js +866 -31
  17. package/dist/client.js.map +1 -1
  18. package/dist/commands/account.d.ts.map +1 -1
  19. package/dist/commands/account.js +71 -3
  20. package/dist/commands/account.js.map +1 -1
  21. package/dist/commands/chats.d.ts.map +1 -1
  22. package/dist/commands/chats.js +167 -0
  23. package/dist/commands/chats.js.map +1 -1
  24. package/dist/commands/complete.d.ts +10 -0
  25. package/dist/commands/complete.d.ts.map +1 -0
  26. package/dist/commands/complete.js +89 -0
  27. package/dist/commands/complete.js.map +1 -0
  28. package/dist/commands/config.d.ts.map +1 -1
  29. package/dist/commands/config.js +10 -4
  30. package/dist/commands/config.js.map +1 -1
  31. package/dist/commands/contacts.d.ts +3 -0
  32. package/dist/commands/contacts.d.ts.map +1 -1
  33. package/dist/commands/contacts.js +85 -0
  34. package/dist/commands/contacts.js.map +1 -1
  35. package/dist/commands/context.d.ts +22 -3
  36. package/dist/commands/context.d.ts.map +1 -1
  37. package/dist/commands/context.js +26 -7
  38. package/dist/commands/context.js.map +1 -1
  39. package/dist/commands/export.d.ts +3 -0
  40. package/dist/commands/export.d.ts.map +1 -0
  41. package/dist/commands/export.js +83 -0
  42. package/dist/commands/export.js.map +1 -0
  43. package/dist/commands/folders.d.ts +4 -0
  44. package/dist/commands/folders.d.ts.map +1 -0
  45. package/dist/commands/folders.js +76 -0
  46. package/dist/commands/folders.js.map +1 -0
  47. package/dist/commands/inbox.js +2 -2
  48. package/dist/commands/inbox.js.map +1 -1
  49. package/dist/commands/mcp.d.ts +3 -0
  50. package/dist/commands/mcp.d.ts.map +1 -0
  51. package/dist/commands/mcp.js +24 -0
  52. package/dist/commands/mcp.js.map +1 -0
  53. package/dist/commands/messages.d.ts.map +1 -1
  54. package/dist/commands/messages.js +210 -5
  55. package/dist/commands/messages.js.map +1 -1
  56. package/dist/commands/models.d.ts +7 -0
  57. package/dist/commands/models.d.ts.map +1 -0
  58. package/dist/commands/models.js +47 -0
  59. package/dist/commands/models.js.map +1 -0
  60. package/dist/commands/reactions.d.ts.map +1 -1
  61. package/dist/commands/reactions.js +17 -0
  62. package/dist/commands/reactions.js.map +1 -1
  63. package/dist/commands/serve.d.ts +10 -0
  64. package/dist/commands/serve.d.ts.map +1 -0
  65. package/dist/commands/serve.js +98 -0
  66. package/dist/commands/serve.js.map +1 -0
  67. package/dist/commands/session.d.ts.map +1 -1
  68. package/dist/commands/session.js +16 -3
  69. package/dist/commands/session.js.map +1 -1
  70. package/dist/commands/update.d.ts +7 -0
  71. package/dist/commands/update.d.ts.map +1 -0
  72. package/dist/commands/update.js +53 -0
  73. package/dist/commands/update.js.map +1 -0
  74. package/dist/commands/watch.d.ts +9 -0
  75. package/dist/commands/watch.d.ts.map +1 -0
  76. package/dist/commands/watch.js +64 -0
  77. package/dist/commands/watch.js.map +1 -0
  78. package/dist/config.d.ts +32 -1
  79. package/dist/config.d.ts.map +1 -1
  80. package/dist/config.js +82 -5
  81. package/dist/config.js.map +1 -1
  82. package/dist/domain/map.d.ts +8 -1
  83. package/dist/domain/map.d.ts.map +1 -1
  84. package/dist/domain/map.js +47 -1
  85. package/dist/domain/map.js.map +1 -1
  86. package/dist/domain/models.d.ts +61 -0
  87. package/dist/domain/models.d.ts.map +1 -1
  88. package/dist/domain/models.js.map +1 -1
  89. package/dist/download.d.ts +2 -0
  90. package/dist/download.d.ts.map +1 -1
  91. package/dist/download.js +11 -0
  92. package/dist/download.js.map +1 -1
  93. package/dist/export.d.ts +26 -0
  94. package/dist/export.d.ts.map +1 -0
  95. package/dist/export.js +75 -0
  96. package/dist/export.js.map +1 -0
  97. package/dist/generated/client.generated.d.ts +28 -0
  98. package/dist/generated/client.generated.d.ts.map +1 -1
  99. package/dist/generated/client.generated.js +28 -0
  100. package/dist/generated/client.generated.js.map +1 -1
  101. package/dist/generated/opcodes.generated.d.ts +23 -13
  102. package/dist/generated/opcodes.generated.d.ts.map +1 -1
  103. package/dist/generated/opcodes.generated.js +23 -13
  104. package/dist/generated/opcodes.generated.js.map +1 -1
  105. package/dist/generated/operations.generated.d.ts +180 -6
  106. package/dist/generated/operations.generated.d.ts.map +1 -1
  107. package/dist/generated/operations.generated.js +29 -4
  108. package/dist/generated/operations.generated.js.map +1 -1
  109. package/dist/mcp/confirm.d.ts +31 -0
  110. package/dist/mcp/confirm.d.ts.map +1 -0
  111. package/dist/mcp/confirm.js +62 -0
  112. package/dist/mcp/confirm.js.map +1 -0
  113. package/dist/mcp/instructions.d.ts +14 -0
  114. package/dist/mcp/instructions.d.ts.map +1 -0
  115. package/dist/mcp/instructions.js +39 -0
  116. package/dist/mcp/instructions.js.map +1 -0
  117. package/dist/mcp/server.d.ts +25 -0
  118. package/dist/mcp/server.d.ts.map +1 -0
  119. package/dist/mcp/server.js +57 -0
  120. package/dist/mcp/server.js.map +1 -0
  121. package/dist/mcp/session.d.ts +28 -0
  122. package/dist/mcp/session.d.ts.map +1 -0
  123. package/dist/mcp/session.js +91 -0
  124. package/dist/mcp/session.js.map +1 -0
  125. package/dist/mcp/tools.d.ts +15 -0
  126. package/dist/mcp/tools.d.ts.map +1 -0
  127. package/dist/mcp/tools.js +351 -0
  128. package/dist/mcp/tools.js.map +1 -0
  129. package/dist/program.d.ts.map +1 -1
  130. package/dist/program.js +23 -2
  131. package/dist/program.js.map +1 -1
  132. package/dist/protocol/connection.d.ts +10 -8
  133. package/dist/protocol/connection.d.ts.map +1 -1
  134. package/dist/protocol/connection.js +64 -7
  135. package/dist/protocol/connection.js.map +1 -1
  136. package/dist/protocol/frame.d.ts +2 -1
  137. package/dist/protocol/frame.d.ts.map +1 -1
  138. package/dist/protocol/frame.js.map +1 -1
  139. package/dist/rendering/messages.d.ts.map +1 -1
  140. package/dist/rendering/messages.js +17 -9
  141. package/dist/rendering/messages.js.map +1 -1
  142. package/dist/sends/guard.d.ts +8 -3
  143. package/dist/sends/guard.d.ts.map +1 -1
  144. package/dist/sends/guard.js +40 -15
  145. package/dist/sends/guard.js.map +1 -1
  146. package/dist/sends/journal.d.ts +20 -2
  147. package/dist/sends/journal.d.ts.map +1 -1
  148. package/dist/sends/journal.js.map +1 -1
  149. package/dist/sends/permissions.d.ts +11 -0
  150. package/dist/sends/permissions.d.ts.map +1 -0
  151. package/dist/sends/permissions.js +47 -0
  152. package/dist/sends/permissions.js.map +1 -0
  153. package/dist/server/lines.d.ts +9 -0
  154. package/dist/server/lines.d.ts.map +1 -0
  155. package/dist/server/lines.js +25 -0
  156. package/dist/server/lines.js.map +1 -0
  157. package/dist/server/server-connection.d.ts +45 -0
  158. package/dist/server/server-connection.d.ts.map +1 -0
  159. package/dist/server/server-connection.js +201 -0
  160. package/dist/server/server-connection.js.map +1 -0
  161. package/dist/server/server.d.ts +69 -0
  162. package/dist/server/server.d.ts.map +1 -0
  163. package/dist/server/server.js +360 -0
  164. package/dist/server/server.js.map +1 -0
  165. package/dist/server/start.d.ts +28 -0
  166. package/dist/server/start.d.ts.map +1 -0
  167. package/dist/server/start.js +80 -0
  168. package/dist/server/start.js.map +1 -0
  169. package/dist/server/subscribe.d.ts +9 -0
  170. package/dist/server/subscribe.d.ts.map +1 -0
  171. package/dist/server/subscribe.js +26 -0
  172. package/dist/server/subscribe.js.map +1 -0
  173. package/dist/session/adopt.d.ts.map +1 -1
  174. package/dist/session/adopt.js +4 -0
  175. package/dist/session/adopt.js.map +1 -1
  176. package/dist/session/browser.d.ts +1 -1
  177. package/dist/session/browser.d.ts.map +1 -1
  178. package/dist/session/browser.js +86 -59
  179. package/dist/session/browser.js.map +1 -1
  180. package/dist/session/handshake.d.ts +1 -1
  181. package/dist/session/store.d.ts +2 -0
  182. package/dist/session/store.d.ts.map +1 -1
  183. package/dist/session/store.js +4 -0
  184. package/dist/session/store.js.map +1 -1
  185. package/dist/spec/define.d.ts.map +1 -1
  186. package/dist/spec/define.js +14 -1
  187. package/dist/spec/define.js.map +1 -1
  188. package/dist/spec/index.d.ts.map +1 -1
  189. package/dist/spec/index.js +30 -7
  190. package/dist/spec/index.js.map +1 -1
  191. package/dist/spec/operations/account.d.ts +20 -0
  192. package/dist/spec/operations/account.d.ts.map +1 -0
  193. package/dist/spec/operations/account.js +62 -0
  194. package/dist/spec/operations/account.js.map +1 -0
  195. package/dist/spec/operations/chats.d.ts +66 -2
  196. package/dist/spec/operations/chats.d.ts.map +1 -1
  197. package/dist/spec/operations/chats.js +153 -5
  198. package/dist/spec/operations/chats.js.map +1 -1
  199. package/dist/spec/operations/contacts.d.ts +19 -1
  200. package/dist/spec/operations/contacts.d.ts.map +1 -1
  201. package/dist/spec/operations/contacts.js +49 -6
  202. package/dist/spec/operations/contacts.js.map +1 -1
  203. package/dist/spec/operations/folders.d.ts +24 -0
  204. package/dist/spec/operations/folders.d.ts.map +1 -0
  205. package/dist/spec/operations/folders.js +64 -0
  206. package/dist/spec/operations/folders.js.map +1 -0
  207. package/dist/spec/operations/messages.d.ts +56 -6
  208. package/dist/spec/operations/messages.d.ts.map +1 -1
  209. package/dist/spec/operations/messages.js +104 -21
  210. package/dist/spec/operations/messages.js.map +1 -1
  211. package/dist/spec/operations/session.d.ts +7 -0
  212. package/dist/spec/operations/session.d.ts.map +1 -1
  213. package/dist/spec/operations/session.js +17 -0
  214. package/dist/spec/operations/session.js.map +1 -1
  215. package/dist/spec/operations/uploads.d.ts +18 -0
  216. package/dist/spec/operations/uploads.d.ts.map +1 -0
  217. package/dist/spec/operations/uploads.js +35 -0
  218. package/dist/spec/operations/uploads.js.map +1 -0
  219. package/dist/testing/mock-max.d.ts +12 -2
  220. package/dist/testing/mock-max.d.ts.map +1 -1
  221. package/dist/testing/mock-max.js +15 -2
  222. package/dist/testing/mock-max.js.map +1 -1
  223. package/dist/testing/sandbox.js +2 -0
  224. package/dist/testing/sandbox.js.map +1 -1
  225. package/dist/transcribe/index.d.ts +34 -0
  226. package/dist/transcribe/index.d.ts.map +1 -0
  227. package/dist/transcribe/index.js +43 -0
  228. package/dist/transcribe/index.js.map +1 -0
  229. package/dist/transcribe/install.d.ts +18 -0
  230. package/dist/transcribe/install.d.ts.map +1 -0
  231. package/dist/transcribe/install.js +67 -0
  232. package/dist/transcribe/install.js.map +1 -0
  233. package/dist/transcribe/models.d.ts +32 -0
  234. package/dist/transcribe/models.d.ts.map +1 -0
  235. package/dist/transcribe/models.js +124 -0
  236. package/dist/transcribe/models.js.map +1 -0
  237. package/dist/transcribe/speech.d.ts +25 -0
  238. package/dist/transcribe/speech.d.ts.map +1 -0
  239. package/dist/transcribe/speech.js +105 -0
  240. package/dist/transcribe/speech.js.map +1 -0
  241. package/dist/update.d.ts +26 -0
  242. package/dist/update.d.ts.map +1 -0
  243. package/dist/update.js +42 -0
  244. package/dist/update.js.map +1 -0
  245. package/dist/upload.d.ts +10 -0
  246. package/dist/upload.d.ts.map +1 -0
  247. package/dist/upload.js +61 -0
  248. package/dist/upload.js.map +1 -0
  249. package/dist/version.d.ts +1 -1
  250. package/dist/version.js +1 -1
  251. package/package.json +17 -3
  252. package/skills/max-cli/SKILL.md +28 -3
@@ -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;;;;;;;;;;IAerB,uFAAuF;;;;cAKzF,CAAA;AAEF,eAAO,MAAM,QAAQ,oCAOnB,CAAA"}
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;;;;;;;IAYrB,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"}
@@ -30,20 +30,168 @@ export const chatsHistory = defineOperation({
30
30
  backward: v.number(),
31
31
  forwardTime: v.number(),
32
32
  backwardTime: v.number(),
33
- itemType: v.literal("REGULAR"),
33
+ /** `DELAYED` is the queue of scheduled messages, read with `from: 1` and `forward` (measured 2026-09-24). */
34
+ itemType: v.picklist(["REGULAR", "DELAYED"]),
34
35
  getChat: v.boolean(),
35
36
  getMessages: v.boolean(),
36
37
  /** False for the same reason as on login: a script reading is not a person looking. */
37
38
  interactive: v.literal(false),
38
39
  }),
39
40
  response: v.looseObject({ messages: v.optional(v.array(v.looseObject({}))) }),
40
- provenance: { confidence: "measured", sources: ["measured against MAX 2026-09-19"] },
41
+ provenance: {
42
+ confidence: "measured",
43
+ sources: [
44
+ "measured against MAX 2026-09-19",
45
+ "`DELAYED` from web.max.ru (2026-09-24, `FIND-78`), measured 2026-09-24 in Saved messages (`pnpm probe:scheduled`)",
46
+ ],
47
+ },
41
48
  });
42
- export const chatMark = reserveOpcode({
49
+ export const chatsMark = defineOperation({
43
50
  name: "chats.mark",
44
51
  constant: "CHAT_MARK",
45
52
  opcode: 50,
46
- reason: "Reading is observational by construction. Marking a conversation read is a change to somebody's account that no read command asked for, so 50 is declared here and never sent — and `src/client.test.ts` asserts its absence from everything the client sent.",
47
- provenance: { confidence: "confirmed", sources: ["tsmax", "max-api-docs/protocol/chats.md"] },
53
+ auth: true,
54
+ /**
55
+ * Sent only by `max chats read` and `messages list --mark-read`: reading never sends it, and the
56
+ * tests that assert so stay (REQUIREMENTS §19).
57
+ */
58
+ request: v.strictObject({
59
+ type: v.literal("READ_MESSAGE"),
60
+ chatId: id(),
61
+ messageId: id(),
62
+ /** When it was read, in milliseconds. */
63
+ mark: v.number(),
64
+ }),
65
+ response: v.looseObject({ unread: v.optional(v.number()), mark: v.optional(v.number()) }),
66
+ provenance: {
67
+ confidence: "observed",
68
+ sources: [
69
+ "PyMax `api/messages/service.py` read_message, `payloads.py` ReadMessagesPayload, `types/domain/message.py` ReadState (53103f0)",
70
+ "tsmax",
71
+ "max-api-docs/protocol/chats.md",
72
+ ],
73
+ notes: "Not measured: the shape is PyMax's. PyMax also sends `type: READ_REACTION`, which is not used here (`CLI-33`).",
74
+ },
75
+ });
76
+ /** `join/<token>` — what 57 and 89 take for a private link. A public channel's link goes whole. */
77
+ const link = () => v.pipe(v.string(), v.minLength(1));
78
+ export const chatsLinkInfo = defineOperation({
79
+ name: "chats.linkInfo",
80
+ constant: "LINK_INFO",
81
+ opcode: 89,
82
+ auth: true,
83
+ request: v.strictObject({ link: link() }),
84
+ response: v.looseObject({ chat: v.optional(v.looseObject({})) }),
85
+ provenance: {
86
+ confidence: "measured",
87
+ sources: ["measured against MAX 2026-09-24 (`pnpm probe:groups`)", "PyMax resolve_group_by_link"],
88
+ notes: "Joins nothing. Answers for a group the account has left, with `participants` empty.",
89
+ },
90
+ });
91
+ export const chatsJoin = defineOperation({
92
+ name: "chats.join",
93
+ constant: "CHAT_JOIN",
94
+ opcode: 57,
95
+ auth: true,
96
+ request: v.strictObject({ link: link() }),
97
+ response: v.looseObject({ chat: v.optional(v.looseObject({})) }),
98
+ provenance: {
99
+ confidence: "measured",
100
+ sources: ["measured against MAX 2026-09-24 with a private group link (`pnpm probe:groups`)", "PyMax join_group"],
101
+ notes: "A public channel's link (`https://max.ru/<name>`) goes whole, as PyMax join_channel sends it — not measured.",
102
+ },
103
+ });
104
+ export const chatsLeave = defineOperation({
105
+ name: "chats.leave",
106
+ constant: "CHAT_LEAVE",
107
+ opcode: 58,
108
+ auth: true,
109
+ request: v.strictObject({ chatId: id() }),
110
+ response: v.looseObject({ message: v.optional(v.looseObject({})) }),
111
+ provenance: {
112
+ confidence: "measured",
113
+ sources: ["measured against MAX 2026-09-24 (`pnpm probe:groups`)", "PyMax leave_group"],
114
+ notes: "Answers the service message about leaving, which the others in the chat see.",
115
+ },
116
+ });
117
+ export const chatsUpdate = defineOperation({
118
+ name: "chats.update",
119
+ constant: "CHAT_UPDATE",
120
+ opcode: 55,
121
+ auth: true,
122
+ request: v.union([
123
+ /** MAX calls the name `theme`. */
124
+ v.strictObject({ chatId: id(), theme: v.optional(v.string()), description: v.optional(v.string()) }),
125
+ /** Only the flags that change. */
126
+ v.strictObject({ chatId: id(), options: v.record(v.string(), v.boolean()) }),
127
+ v.strictObject({ chatId: id(), revokePrivateLink: v.literal(true) }),
128
+ /** `"0"` unpins — the web client sends `message?.id ?? 0n`. */
129
+ v.strictObject({ chatId: id(), pinMessageId: id(), notifyPin: v.boolean() }),
130
+ ]),
131
+ response: v.looseObject({ chat: v.optional(v.looseObject({})) }),
132
+ provenance: {
133
+ confidence: "measured",
134
+ sources: [
135
+ "measured against MAX 2026-09-24 (`pnpm probe:groups`, `pnpm probe:members`)",
136
+ "PyMax change_group_profile, change_group_settings, rework_invite_link",
137
+ "the pin: measured 2026-09-24 in a group the owner named (`pnpm probe:edit-pin-forward`, `PIN_CHAT`); web.max.ru `_app/immutable/chunks/5oCuRT0F.js`; PyMax `api/messages/payloads.py:95-98` (53103f0)",
138
+ ],
139
+ notes: "A setting changed from false to true, measured 2026-09-24 (`pnpm probe:members`). max-api-docs calls 55 a no-op; it sent `{chatId}` alone. " +
140
+ "Pinning: the web client does not notify by default and PyMax does; ours follows the web client (`NEED-196`). " +
141
+ "Refused on 2026-09-24 in Saved messages and in a dialog with a person — `not.found` to pin, " +
142
+ "`chat.not.found` to unpin. The web client's dialog class answers `viewerCanPin` with `false`: MAX pins " +
143
+ "only in groups and channels. In a group it answers `{chat}` with `pinnedMessage`, and 0 clears it.",
144
+ },
145
+ });
146
+ export const chatsMembers = defineOperation({
147
+ name: "chats.members",
148
+ constant: "CHAT_MEMBERS",
149
+ opcode: 59,
150
+ auth: true,
151
+ request: v.strictObject({
152
+ chatId: id(),
153
+ type: v.literal("JOIN_REQUEST"),
154
+ count: v.pipe(v.number(), v.integer(), v.minValue(1)),
155
+ }),
156
+ response: v.looseObject({ members: v.optional(v.array(v.looseObject({}))) }),
157
+ provenance: {
158
+ confidence: "measured",
159
+ sources: ["measured against MAX 2026-09-24 with no requests (`pnpm probe:groups`)", "PyMax get_join_requests"],
160
+ notes: "With no requests the answer is `{}` — no `members` at all. Each member is `{contact, presence}` in PyMax.",
161
+ },
162
+ });
163
+ export const chatsUpdateMembers = defineOperation({
164
+ name: "chats.updateMembers",
165
+ constant: "CHAT_MEMBERS_UPDATE",
166
+ opcode: 77,
167
+ auth: true,
168
+ request: v.strictObject({
169
+ chatId: id(),
170
+ userIds: v.pipe(v.array(id()), v.minLength(1)),
171
+ operation: v.picklist(["add", "remove"]),
172
+ /** Absent means an ordinary member. */
173
+ type: v.optional(v.picklist(["ADMIN", "JOIN_REQUEST"])),
174
+ showHistory: v.optional(v.boolean()),
175
+ /** Always 0 from us: anything else probably erases the removed person's messages (`NEED-32`). */
176
+ cleanMsgPeriod: v.optional(v.literal(0)),
177
+ /** A sum of admin rights: members 2, admins 4, info 8, pin 16, post 256, edit 512, delete 1024. */
178
+ permissions: v.optional(v.pipe(v.number(), v.integer(), v.minValue(0))),
179
+ }),
180
+ response: v.looseObject({ chat: v.optional(v.looseObject({})) }),
181
+ provenance: {
182
+ confidence: "measured",
183
+ sources: [
184
+ "measured against MAX 2026-09-24 with a second person who agreed (`pnpm probe:members`): add, make admin, take admin back, remove",
185
+ "PyMax invite_users_to_group, remove_users_from_group, add_admin, confirm_join_request, decline_join_request",
186
+ ],
187
+ notes: "Taking admin rights back is `type: ADMIN, operation: remove` — in no source, measured. The JOIN_REQUEST forms are PyMax's only: they need somebody asking to join (`MAX-41`). max-api-docs calls 77 pin/archive/mute; measured otherwise.",
188
+ },
189
+ });
190
+ export const chatDelete = reserveOpcode({
191
+ name: "chats.delete",
192
+ constant: "CHAT_DELETE",
193
+ opcode: 52,
194
+ reason: "Deleting a chat is left out of MAX-31 for the reason of `NEED-32`: a tool that can destroy a conversation for everyone in it is a poor trade for tidiness.",
195
+ provenance: { confidence: "observed", sources: ["PyMax delete_chat", "tsmax"] },
48
196
  });
49
197
  //# sourceMappingURL=chats.js.map
@@ -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;QACvB,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;QACxB,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC;QAC9B,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE;QACpB,WAAW,EAAE,CAAC,CAAC,OAAO,EAAE;QACxB,uFAAuF;QACvF,WAAW,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;KAC9B,CAAC;IACF,QAAQ,EAAE,CAAC,CAAC,WAAW,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7E,UAAU,EAAE,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,iCAAiC,CAAC,EAAE;CACrF,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,QAAQ,GAAG,aAAa,CAAC;IACpC,IAAI,EAAE,YAAY;IAClB,QAAQ,EAAE,WAAW;IACrB,MAAM,EAAE,EAAE;IACV,MAAM,EACJ,+PAA+P;IACjQ,UAAU,EAAE,EAAE,UAAU,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,OAAO,EAAE,gCAAgC,CAAC,EAAE;CAC9F,CAAC,CAAA"}
1
+ {"version":3,"file":"chats.js","sourceRoot":"","sources":["../../../src/spec/operations/chats.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,24 @@ export declare const contactsInfo: import("../define.js").Operation<v.StrictObje
4
4
  }, undefined>, v.LooseObjectSchema<{
5
5
  readonly contacts: v.OptionalSchema<v.ArraySchema<v.LooseObjectSchema<{}, undefined>, undefined>, undefined>;
6
6
  }, undefined>>;
7
- export declare const profile: import("../define.js").Reservation;
7
+ export declare const contactsByPhone: import("../define.js").Operation<v.StrictObjectSchema<{
8
+ readonly phone: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
9
+ }, undefined>, v.LooseObjectSchema<{
10
+ readonly contact: v.OptionalSchema<v.LooseObjectSchema<{}, undefined>, undefined>;
11
+ }, undefined>>;
12
+ export declare const contactsUpdate: import("../define.js").Operation<v.StrictObjectSchema<{
13
+ readonly contactId: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "an id is a whole number written as a string">, v.TransformAction<string, bigint>]>;
14
+ readonly action: v.PicklistSchema<["ADD", "REMOVE"], undefined>;
15
+ }, undefined>, v.LooseObjectSchema<{
16
+ readonly contact: v.OptionalSchema<v.LooseObjectSchema<{}, undefined>, undefined>;
17
+ }, undefined>>;
18
+ export declare const contactsImport: import("../define.js").Operation<v.StrictObjectSchema<{
19
+ /** Phone number to the name it was saved under. */
20
+ readonly contactList: v.RecordSchema<v.StringSchema<undefined>, v.StrictObjectSchema<{
21
+ readonly firstName: v.StringSchema<undefined>;
22
+ }, undefined>, undefined>;
23
+ }, undefined>, v.LooseObjectSchema<{
24
+ readonly contacts: v.OptionalSchema<v.ArraySchema<v.LooseObjectSchema<{}, undefined>, undefined>, undefined>;
25
+ }, undefined>>;
8
26
  export declare const unidentified36: import("../define.js").Reservation;
9
27
  //# sourceMappingURL=contacts.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"contacts.d.ts","sourceRoot":"","sources":["../../../src/spec/operations/contacts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAI5B,eAAO,MAAM,YAAY;;;;cAYvB,CAAA;AAEF,eAAO,MAAM,OAAO,oCAOlB,CAAA;AAEF,eAAO,MAAM,cAAc,oCAgBzB,CAAA"}
1
+ {"version":3,"file":"contacts.d.ts","sourceRoot":"","sources":["../../../src/spec/operations/contacts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAI5B,eAAO,MAAM,YAAY;;;;cAYvB,CAAA;AAIF,eAAO,MAAM,eAAe;;;;cAgB1B,CAAA;AAEF,eAAO,MAAM,cAAc;;;;;cAazB,CAAA;AAEF,eAAO,MAAM,cAAc;IAMvB,mDAAmD;;;;;;cAarD,CAAA;AAEF,eAAO,MAAM,cAAc,oCAgBzB,CAAA"}
@@ -14,12 +14,55 @@ export const contactsInfo = defineOperation({
14
14
  notes: "One request for every unknown id at once. A person with forty dialogs should not cost forty round trips.",
15
15
  },
16
16
  });
17
- export const profile = reserveOpcode({
18
- name: "account.update",
19
- constant: "PROFILE",
20
- opcode: 16,
21
- reason: "It does not read a profile, it updates one, and it refuses an empty payload. Your own profile arrives with the login response, so nothing needs to send this. It is declared here so that fact keeps a home.",
22
- provenance: { confidence: "measured", sources: ["measured against MAX 2026-09-19: refused an empty payload"] },
17
+ const webClient = "web.max.ru chunk `_app/immutable/chunks/5oCuRT0F.js`, read 2026-09-24";
18
+ export const contactsByPhone = defineOperation({
19
+ name: "contacts.byPhone",
20
+ constant: "CONTACT_INFO_BY_PHONE",
21
+ opcode: 46,
22
+ auth: true,
23
+ request: v.strictObject({ phone: v.pipe(v.string(), v.minLength(1)) }),
24
+ response: v.looseObject({ contact: v.optional(v.looseObject({})) }),
25
+ provenance: {
26
+ confidence: "measured",
27
+ sources: [
28
+ "measured against MAX 2026-09-24 (`pnpm probe:account`): the owner's own number answered with the owner",
29
+ webClient,
30
+ "PyMax 53103f0 `search_by_phone`",
31
+ ],
32
+ notes: "⚠ The request carries a phone number: nothing may log it, print it in an error or keep it in a fixture.",
33
+ },
34
+ });
35
+ export const contactsUpdate = defineOperation({
36
+ name: "contacts.update",
37
+ constant: "CONTACT_UPDATE",
38
+ opcode: 34,
39
+ auth: true,
40
+ request: v.strictObject({ contactId: id(), action: v.picklist(["ADD", "REMOVE"]) }),
41
+ response: v.looseObject({ contact: v.optional(v.looseObject({})) }),
42
+ provenance: {
43
+ confidence: "confirmed",
44
+ sources: [webClient, "PyMax 53103f0 `add_contact`, `remove_contact`"],
45
+ notes: "The web client also sends `UPDATE` (a name of your own for the person), `BLOCK` and `UNBLOCK` here. Only adding and removing are declared.",
46
+ },
47
+ });
48
+ export const contactsImport = defineOperation({
49
+ name: "contacts.import",
50
+ constant: "SYNC",
51
+ opcode: 21,
52
+ auth: true,
53
+ request: v.strictObject({
54
+ /** Phone number to the name it was saved under. */
55
+ contactList: v.record(v.string(), v.strictObject({ firstName: v.string() })),
56
+ }),
57
+ response: v.looseObject({ contacts: v.optional(v.array(v.looseObject({}))) }),
58
+ provenance: {
59
+ confidence: "measured",
60
+ sources: [
61
+ "measured against MAX 2026-09-24 (`pnpm probe:account`), the owner's own number only: answered `{phones: {<number>: <number>}}` and no contact",
62
+ "PyMax 53103f0 `import_contacts`",
63
+ ],
64
+ notes: "One witness, under a generic name: not found in the entry chunks of web.max.ru (2026-09-24), whose lazy chunks were not read. It uploads other people's numbers to MAX (`NEED-203`).",
65
+ },
23
66
  });
24
67
  export const unidentified36 = reserveOpcode({
25
68
  name: "protocol.unidentified36",
@@ -1 +1 @@
1
- {"version":3,"file":"contacts.js","sourceRoot":"","sources":["../../../src/spec/operations/contacts.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,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,EAAE,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;IACtD,QAAQ,EAAE,CAAC,CAAC,WAAW,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7E,UAAU,EAAE;QACV,UAAU,EAAE,UAAU;QACtB,OAAO,EAAE,CAAC,yDAAyD,CAAC;QACpE,KAAK,EAAE,0GAA0G;KAClH;CACF,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,OAAO,GAAG,aAAa,CAAC;IACnC,IAAI,EAAE,gBAAgB;IACtB,QAAQ,EAAE,SAAS;IACnB,MAAM,EAAE,EAAE;IACV,MAAM,EACJ,8MAA8M;IAChN,UAAU,EAAE,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,2DAA2D,CAAC,EAAE;CAC/G,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,aAAa,CAAC;IAC1C,IAAI,EAAE,yBAAyB;IAC/B,QAAQ,EAAE,iBAAiB;IAC3B,MAAM,EAAE,EAAE;IACV,MAAM,EACJ,oVAAoV;IACtV,UAAU,EAAE;QACV,UAAU,EAAE,SAAS;QACrB,OAAO,EAAE;YACP,sCAAsC;YACtC,mCAAmC;YACnC,gIAAgI;SACjI;QACD,KAAK,EACH,kNAAkN;KACrN;CACF,CAAC,CAAA"}
1
+ {"version":3,"file":"contacts.js","sourceRoot":"","sources":["../../../src/spec/operations/contacts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import * as v from "valibot";
2
+ export declare const foldersList: import("../define.js").Operation<v.StrictObjectSchema<{
3
+ readonly folderSync: v.NumberSchema<undefined>;
4
+ }, undefined>, v.LooseObjectSchema<{
5
+ readonly folders: v.OptionalSchema<v.ArraySchema<v.LooseObjectSchema<{}, undefined>, undefined>, undefined>;
6
+ readonly foldersOrder: v.OptionalSchema<v.ArraySchema<v.UnknownSchema, undefined>, undefined>;
7
+ readonly folderSync: v.OptionalSchema<v.NumberSchema<undefined>, undefined>;
8
+ }, undefined>>;
9
+ export declare const foldersUpdate: import("../define.js").Operation<v.StrictObjectSchema<{
10
+ id: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
11
+ title: v.StringSchema<undefined>;
12
+ include: v.OptionalSchema<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>, undefined>;
13
+ /** Sent back as they came: nobody has described what they hold. */
14
+ filters: v.ArraySchema<v.UnknownSchema, undefined>;
15
+ options: v.ArraySchema<v.UnknownSchema, undefined>;
16
+ favorites: v.OptionalSchema<v.ArraySchema<v.UnknownSchema, undefined>, undefined>;
17
+ }, undefined>, v.LooseObjectSchema<{
18
+ readonly folder: v.OptionalSchema<v.LooseObjectSchema<{}, undefined>, undefined>;
19
+ readonly folderSync: v.OptionalSchema<v.NumberSchema<undefined>, undefined>;
20
+ }, undefined>>;
21
+ export declare const foldersDelete: import("../define.js").Operation<v.StrictObjectSchema<{
22
+ readonly folderIds: v.ArraySchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>, undefined>;
23
+ }, undefined>, v.LooseObjectSchema<{}, undefined>>;
24
+ //# sourceMappingURL=folders.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"folders.d.ts","sourceRoot":"","sources":["../../../src/spec/operations/folders.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAgB5B,eAAO,MAAM,WAAW;;;;;;cAmBtB,CAAA;AAEF,eAAO,MAAM,aAAa;;;;IA3BxB,mEAAmE;;;;;;;cA4CnE,CAAA;AAEF,eAAO,MAAM,aAAa;;kDAYxB,CAAA"}
@@ -0,0 +1,64 @@
1
+ import * as v from "valibot";
2
+ import { defineOperation } from "../define.js";
3
+ import { id } from "../scalars.js";
4
+ const webClient = "web.max.ru chunk `_app/immutable/chunks/5oCuRT0F.js`, read 2026-09-24";
5
+ const Folder = {
6
+ id: v.pipe(v.string(), v.minLength(1)),
7
+ title: v.string(),
8
+ include: v.optional(v.array(id())),
9
+ /** Sent back as they came: nobody has described what they hold. */
10
+ filters: v.array(v.unknown()),
11
+ options: v.array(v.unknown()),
12
+ favorites: v.optional(v.array(v.unknown())),
13
+ };
14
+ export const foldersList = defineOperation({
15
+ name: "folders.list",
16
+ constant: "FOLDERS_GET",
17
+ opcode: 272,
18
+ auth: true,
19
+ request: v.strictObject({ folderSync: v.number() }),
20
+ response: v.looseObject({
21
+ folders: v.optional(v.array(v.looseObject({}))),
22
+ foldersOrder: v.optional(v.array(v.unknown())),
23
+ folderSync: v.optional(v.number()),
24
+ }),
25
+ provenance: {
26
+ confidence: "measured",
27
+ sources: [
28
+ "measured against MAX 2026-09-24 (`pnpm probe:account`): no folder of the owner's carries `include`",
29
+ webClient,
30
+ "PyMax 53103f0 `get_folders`",
31
+ ],
32
+ },
33
+ });
34
+ export const foldersUpdate = defineOperation({
35
+ name: "folders.update",
36
+ constant: "FOLDERS_UPDATE",
37
+ opcode: 274,
38
+ auth: true,
39
+ request: v.strictObject(Folder),
40
+ response: v.looseObject({ folder: v.optional(v.looseObject({})), folderSync: v.optional(v.number()) }),
41
+ provenance: {
42
+ confidence: "measured",
43
+ sources: [
44
+ "measured against MAX 2026-09-24 (`pnpm probe:account`): created, renamed and deleted a folder; a 21-character title came back `folder.validation.title.too-long`, 15 was taken",
45
+ webClient,
46
+ "PyMax 53103f0 `create_folder`, `update_folder`",
47
+ ],
48
+ notes: "Creates a folder under an id it has not seen, replaces one it has. **The whole folder**: the web client sends every field back, and PyMax's `include or []` would empty a folder whose title changed.",
49
+ },
50
+ });
51
+ export const foldersDelete = defineOperation({
52
+ name: "folders.delete",
53
+ constant: "FOLDERS_DELETE",
54
+ opcode: 276,
55
+ auth: true,
56
+ request: v.strictObject({ folderIds: v.array(v.pipe(v.string(), v.minLength(1))) }),
57
+ response: v.looseObject({}),
58
+ provenance: {
59
+ confidence: "measured",
60
+ sources: ["measured against MAX 2026-09-24 (`pnpm probe:account`)", webClient, "PyMax 53103f0 `delete_folder`"],
61
+ notes: "Deletes the folder, not the chats in it.",
62
+ },
63
+ });
64
+ //# sourceMappingURL=folders.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"folders.js","sourceRoot":"","sources":["../../../src/spec/operations/folders.ts"],"names":[],"mappings":"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"}
@@ -1,27 +1,67 @@
1
1
  import * as v from "valibot";
2
- export declare const messagesSend: import("../define.js").Operation<v.StrictObjectSchema<{
2
+ export declare const messagesSend: import("../define.js").Operation<v.UnionSchema<[v.StrictObjectSchema<{
3
3
  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>]>;
4
4
  readonly message: v.StrictObjectSchema<{
5
- readonly text: v.StringSchema<undefined>;
5
+ /** Left out on a forward, as the web client does: the forwarded message is the content. */
6
+ readonly text: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
6
7
  /**
7
8
  * The client id MAX deduplicates by — measured, and it is what makes one retry safe. It must
8
9
  * never be regenerated on a retry: a fresh one means a second message in somebody's chat.
9
10
  */
10
11
  readonly cid: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>]>;
11
12
  /** Markup in UTF-16 positions. STRONG, EMPHASIZED, STRIKETHROUGH, MONOSPACED read back from MAX 2026-09-24. */
12
- readonly elements: v.ArraySchema<v.StrictObjectSchema<{
13
+ readonly elements: v.OptionalSchema<v.ArraySchema<v.StrictObjectSchema<{
13
14
  readonly type: v.StringSchema<undefined>;
14
15
  readonly from: v.NumberSchema<undefined>;
15
16
  readonly length: v.NumberSchema<undefined>;
16
- }, undefined>, undefined>;
17
+ }, undefined>, undefined>, undefined>;
17
18
  readonly attaches: v.ArraySchema<v.UnknownSchema, undefined>;
18
19
  /** Read back as `{type, chatId, message}` — the quoted message whole (measured 2026-09-23). */
19
- readonly link: v.OptionalSchema<v.StrictObjectSchema<{
20
+ readonly link: v.OptionalSchema<v.VariantSchema<"type", [v.StrictObjectSchema<{
20
21
  readonly type: v.LiteralSchema<"REPLY", undefined>;
21
22
  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>]>;
23
+ }, undefined>, v.StrictObjectSchema<{
24
+ readonly type: v.LiteralSchema<"FORWARD", undefined>;
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
+ 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
+ }, 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>]>;
22
35
  }, undefined>, undefined>;
23
36
  }, undefined>;
24
37
  readonly notify: v.BooleanSchema<undefined>;
38
+ }, undefined>, v.StrictObjectSchema<{
39
+ readonly message: v.StrictObjectSchema<{
40
+ readonly cid: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>]>;
41
+ readonly attaches: v.TupleSchema<[v.StrictObjectSchema<{
42
+ readonly _type: v.LiteralSchema<"CONTROL", undefined>;
43
+ readonly event: v.LiteralSchema<"new", undefined>;
44
+ readonly chatType: v.LiteralSchema<"CHAT", undefined>;
45
+ readonly title: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
46
+ readonly userIds: 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>;
47
+ }, undefined>], undefined>;
48
+ }, undefined>;
49
+ readonly notify: v.BooleanSchema<undefined>;
50
+ }, undefined>], undefined>, v.LooseObjectSchema<{
51
+ readonly message: v.OptionalSchema<v.LooseObjectSchema<{}, undefined>, undefined>;
52
+ readonly chat: v.OptionalSchema<v.LooseObjectSchema<{}, undefined>, undefined>;
53
+ }, undefined>>;
54
+ export declare const messagesEdit: import("../define.js").Operation<v.StrictObjectSchema<{
55
+ 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>]>;
56
+ 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>]>;
57
+ readonly text: v.StringSchema<undefined>;
58
+ readonly elements: v.ArraySchema<v.StrictObjectSchema<{
59
+ readonly type: v.StringSchema<undefined>;
60
+ readonly from: v.NumberSchema<undefined>;
61
+ readonly length: v.NumberSchema<undefined>;
62
+ }, undefined>, undefined>;
63
+ /** `attachments`, not `attaches` as in MSG_SEND — every source spells them differently. */
64
+ readonly attachments: v.ArraySchema<v.UnknownSchema, undefined>;
25
65
  }, undefined>, v.LooseObjectSchema<{
26
66
  readonly message: v.OptionalSchema<v.LooseObjectSchema<{}, undefined>, undefined>;
27
67
  }, undefined>>;
@@ -41,5 +81,15 @@ export declare const messagesReact: import("../define.js").Operation<v.StrictObj
41
81
  }, undefined>, v.LooseObjectSchema<{
42
82
  readonly reactionInfo: v.OptionalSchema<v.LooseObjectSchema<{}, undefined>, undefined>;
43
83
  }, undefined>>;
44
- export declare const messageDelete: import("../define.js").Reservation;
84
+ export declare const messagesUnreact: import("../define.js").Operation<v.StrictObjectSchema<{
85
+ 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>]>;
86
+ 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>]>;
87
+ }, undefined>, v.LooseObjectSchema<{
88
+ readonly reactionInfo: v.OptionalSchema<v.LooseObjectSchema<{}, undefined>, undefined>;
89
+ }, undefined>>;
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>>;
45
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;;;;QASnB;;;WAGG;;QAEH,+GAA+G;;;;;;;QAG/G,+FAA+F;;;;;;;;;cAcnG,CAAA;AAEF,eAAO,MAAM,iBAAiB;;;;;cAiB5B,CAAA;AAEF,eAAO,MAAM,aAAa;;;;;;;;;cAqBxB,CAAA;AAEF,eAAO,MAAM,aAAa,oCAOxB,CAAA"}
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"}