@wirecat/whatsapp-cli 0.0.0-stage → 0.2.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 (134) hide show
  1. package/LICENSE +204 -0
  2. package/README.md +401 -2
  3. package/dist/adapter/adapter.d.ts +13 -0
  4. package/dist/adapter/adapter.d.ts.map +1 -0
  5. package/dist/adapter/adapter.js +554 -0
  6. package/dist/adapter/adapter.js.map +1 -0
  7. package/dist/adapter/channels.d.ts +43 -0
  8. package/dist/adapter/channels.d.ts.map +1 -0
  9. package/dist/adapter/channels.js +100 -0
  10. package/dist/adapter/channels.js.map +1 -0
  11. package/dist/adapter/checks.d.ts +6 -0
  12. package/dist/adapter/checks.d.ts.map +1 -0
  13. package/dist/adapter/checks.js +2 -0
  14. package/dist/adapter/checks.js.map +1 -0
  15. package/dist/adapter/errors.d.ts +13 -0
  16. package/dist/adapter/errors.d.ts.map +1 -0
  17. package/dist/adapter/errors.js +38 -0
  18. package/dist/adapter/errors.js.map +1 -0
  19. package/dist/adapter/format-markdown.d.ts +8 -0
  20. package/dist/adapter/format-markdown.d.ts.map +1 -0
  21. package/dist/adapter/format-markdown.js +80 -0
  22. package/dist/adapter/format-markdown.js.map +1 -0
  23. package/dist/adapter/groups.d.ts +25 -0
  24. package/dist/adapter/groups.d.ts.map +1 -0
  25. package/dist/adapter/groups.js +252 -0
  26. package/dist/adapter/groups.js.map +1 -0
  27. package/dist/adapter/map.d.ts +23 -0
  28. package/dist/adapter/map.d.ts.map +1 -0
  29. package/dist/adapter/map.js +121 -0
  30. package/dist/adapter/map.js.map +1 -0
  31. package/dist/adapter/pins.d.ts +11 -0
  32. package/dist/adapter/pins.d.ts.map +1 -0
  33. package/dist/adapter/pins.js +10 -0
  34. package/dist/adapter/pins.js.map +1 -0
  35. package/dist/adapter/polls.d.ts +21 -0
  36. package/dist/adapter/polls.d.ts.map +1 -0
  37. package/dist/adapter/polls.js +103 -0
  38. package/dist/adapter/polls.js.map +1 -0
  39. package/dist/adapter/privacy.d.ts +18 -0
  40. package/dist/adapter/privacy.d.ts.map +1 -0
  41. package/dist/adapter/privacy.js +94 -0
  42. package/dist/adapter/privacy.js.map +1 -0
  43. package/dist/adapter/settings.d.ts +21 -0
  44. package/dist/adapter/settings.d.ts.map +1 -0
  45. package/dist/adapter/settings.js +76 -0
  46. package/dist/adapter/settings.js.map +1 -0
  47. package/dist/app.d.ts +6 -0
  48. package/dist/app.d.ts.map +1 -0
  49. package/dist/app.js +16 -0
  50. package/dist/app.js.map +1 -0
  51. package/dist/bin/wa.d.ts +3 -0
  52. package/dist/bin/wa.d.ts.map +1 -0
  53. package/dist/bin/wa.js +14 -0
  54. package/dist/bin/wa.js.map +1 -0
  55. package/dist/commands/session.d.ts +48 -0
  56. package/dist/commands/session.d.ts.map +1 -0
  57. package/dist/commands/session.js +201 -0
  58. package/dist/commands/session.js.map +1 -0
  59. package/dist/commands/setup.d.ts +3 -0
  60. package/dist/commands/setup.d.ts.map +1 -0
  61. package/dist/commands/setup.js +140 -0
  62. package/dist/commands/setup.js.map +1 -0
  63. package/dist/commands/update.d.ts +2 -0
  64. package/dist/commands/update.d.ts.map +1 -0
  65. package/dist/commands/update.js +17 -0
  66. package/dist/commands/update.js.map +1 -0
  67. package/dist/diagnose.d.ts +77 -0
  68. package/dist/diagnose.d.ts.map +1 -0
  69. package/dist/diagnose.js +84 -0
  70. package/dist/diagnose.js.map +1 -0
  71. package/dist/engine/channels.d.ts +100 -0
  72. package/dist/engine/channels.d.ts.map +1 -0
  73. package/dist/engine/channels.js +29 -0
  74. package/dist/engine/channels.js.map +1 -0
  75. package/dist/engine/contract.d.ts +1049 -0
  76. package/dist/engine/contract.d.ts.map +1 -0
  77. package/dist/engine/contract.js +353 -0
  78. package/dist/engine/contract.js.map +1 -0
  79. package/dist/engine/events.d.ts +9 -0
  80. package/dist/engine/events.d.ts.map +1 -0
  81. package/dist/engine/events.js +23 -0
  82. package/dist/engine/events.js.map +1 -0
  83. package/dist/engine/go-engine.d.ts +23 -0
  84. package/dist/engine/go-engine.d.ts.map +1 -0
  85. package/dist/engine/go-engine.js +227 -0
  86. package/dist/engine/go-engine.js.map +1 -0
  87. package/dist/engine/groups.d.ts +171 -0
  88. package/dist/engine/groups.d.ts.map +1 -0
  89. package/dist/engine/groups.js +66 -0
  90. package/dist/engine/groups.js.map +1 -0
  91. package/dist/engine/privacy.d.ts +33 -0
  92. package/dist/engine/privacy.d.ts.map +1 -0
  93. package/dist/engine/privacy.js +23 -0
  94. package/dist/engine/privacy.js.map +1 -0
  95. package/dist/engine/settings.d.ts +45 -0
  96. package/dist/engine/settings.d.ts.map +1 -0
  97. package/dist/engine/settings.js +34 -0
  98. package/dist/engine/settings.js.map +1 -0
  99. package/dist/engine-binary.d.ts +5 -0
  100. package/dist/engine-binary.d.ts.map +1 -0
  101. package/dist/engine-binary.js +18 -0
  102. package/dist/engine-binary.js.map +1 -0
  103. package/dist/install/postinstall.d.ts +8 -0
  104. package/dist/install/postinstall.d.ts.map +1 -0
  105. package/dist/install/postinstall.js +63 -0
  106. package/dist/install/postinstall.js.map +1 -0
  107. package/dist/messenger.d.ts +63 -0
  108. package/dist/messenger.d.ts.map +1 -0
  109. package/dist/messenger.js +186 -0
  110. package/dist/messenger.js.map +1 -0
  111. package/dist/paths.d.ts +5 -0
  112. package/dist/paths.d.ts.map +1 -0
  113. package/dist/paths.js +7 -0
  114. package/dist/paths.js.map +1 -0
  115. package/dist/program.d.ts +12 -0
  116. package/dist/program.d.ts.map +1 -0
  117. package/dist/program.js +86 -0
  118. package/dist/program.js.map +1 -0
  119. package/dist/reasons.d.ts +4 -0
  120. package/dist/reasons.d.ts.map +1 -0
  121. package/dist/reasons.js +21 -0
  122. package/dist/reasons.js.map +1 -0
  123. package/dist/update.d.ts +7 -0
  124. package/dist/update.d.ts.map +1 -0
  125. package/dist/update.js +19 -0
  126. package/dist/update.js.map +1 -0
  127. package/dist/version.d.ts +2 -0
  128. package/dist/version.d.ts.map +1 -0
  129. package/dist/version.js +2 -0
  130. package/dist/version.js.map +1 -0
  131. package/install/postinstall.mjs +3 -0
  132. package/install/windows.ps1 +161 -0
  133. package/package.json +89 -4
  134. package/skills/whatsapp-cli/SKILL.md +325 -0
@@ -0,0 +1,227 @@
1
+ import { spawn } from "node:child_process";
2
+ import { createInterface } from "node:readline";
3
+ import * as v from "valibot";
4
+ import { engineBinary, enginePackage } from "../engine-binary.js";
5
+ import { goChannels } from "./channels.js";
6
+ import { EngineError, engineError, engineEvent, hello, isWrite, keyFields, loginCode, PROTOCOL, waAccount, waChat, waChatCard, waDownloaded, waMessage, waOlder, } from "./contract.js";
7
+ import { eventHub } from "./events.js";
8
+ import { goGroups } from "./groups.js";
9
+ import { goPrivacy } from "./privacy.js";
10
+ import { goSettings } from "./settings.js";
11
+ const HELLO_WAIT_MS = 15_000;
12
+ const CLOSE_WAIT_MS = 5_000;
13
+ const STOPPED = () => new EngineError("provider_unavailable", "the WhatsApp engine stopped unexpectedly", "engine.stopped");
14
+ const CUT = () => new EngineError("outcome_unknown", "the WhatsApp engine stopped before WhatsApp confirmed the change; it may have gone through — check first", "engine.stopped-mid-write");
15
+ const missing = () => new EngineError("provider_unavailable", `the WhatsApp engine is not installed — ${enginePackage()} is missing: reinstall @wirecat/whatsapp-cli ` +
16
+ "without --omit=optional, or set WA_ENGINE to the engine's path");
17
+ /**
18
+ * Runs the Go engine as a child process and speaks JSON lines with it. It starts the engine and waits for its hello;
19
+ * a refusal there (the lock is held, the profile is not linked) rejects with the engine's own code and wording.
20
+ */
21
+ export const startGoEngine = async (options) => {
22
+ const env = options.env ?? process.env;
23
+ const command = options.command ?? { file: engineBinary(env), args: [] };
24
+ const args = [
25
+ ...command.args,
26
+ "--store",
27
+ options.storePath,
28
+ "--holder",
29
+ options.holder,
30
+ ...(options.link ? ["--link"] : []),
31
+ ];
32
+ const child = spawn(command.file, args, { env, stdio: ["pipe", "pipe", "pipe"], windowsHide: true });
33
+ const hub = eventHub();
34
+ const pending = new Map();
35
+ let nextId = 1;
36
+ let self = null;
37
+ let closing = false;
38
+ let exited = false;
39
+ let onCode;
40
+ let greet;
41
+ // A binary that never started fires "error" and no "exit".
42
+ const exit = new Promise((resolve) => {
43
+ child.once("close", () => resolve());
44
+ child.once("error", () => resolve());
45
+ });
46
+ const failAll = (error) => {
47
+ greet?.reject(error());
48
+ for (const waiting of pending.values())
49
+ waiting.reject(isWrite(waiting.op) ? CUT() : error());
50
+ pending.clear();
51
+ };
52
+ child.once("error", (error) => {
53
+ exited = true;
54
+ failAll(error.code === "ENOENT" || error.code === "EACCES" ? missing : STOPPED);
55
+ });
56
+ // "close", not "exit": an answer the engine wrote just before it ended is still in the pipe at "exit".
57
+ child.once("close", () => {
58
+ exited = true;
59
+ failAll(STOPPED);
60
+ if (!closing)
61
+ hub.emit({ event: "connection", state: "stopped" });
62
+ });
63
+ child.stdin?.on("error", () => { });
64
+ createInterface({ input: child.stderr }).on("line", (line) => options.warn?.(line));
65
+ const onLine = (line) => {
66
+ let value;
67
+ try {
68
+ value = JSON.parse(line);
69
+ }
70
+ catch {
71
+ return;
72
+ }
73
+ if ("hello" in value) {
74
+ const said = v.parse(hello, value.hello);
75
+ if (said.protocol !== PROTOCOL) {
76
+ greet?.reject(new EngineError("provider_unavailable", `the WhatsApp engine speaks protocol ${said.protocol}, this wa needs ${PROTOCOL} — reinstall wa`));
77
+ return;
78
+ }
79
+ self = said.self;
80
+ greet?.resolve();
81
+ }
82
+ else if ("refused" in value) {
83
+ const refused = v.parse(engineError, value.refused);
84
+ greet?.reject(new EngineError(refused.code, refused.message, refused.reason, refused.until));
85
+ }
86
+ else if ("login" in value) {
87
+ onCode?.(v.parse(loginCode, value));
88
+ }
89
+ else if ("event" in value) {
90
+ const event = v.safeParse(engineEvent, value);
91
+ if (event.success)
92
+ hub.emit(event.output);
93
+ else
94
+ options.warn?.("the WhatsApp engine sent an event this wa cannot read; it was skipped");
95
+ }
96
+ else if (typeof value.id === "number") {
97
+ const waiting = pending.get(value.id);
98
+ pending.delete(value.id);
99
+ if (!waiting)
100
+ return;
101
+ if ("error" in value) {
102
+ const refused = v.parse(engineError, value.error);
103
+ waiting.reject(new EngineError(refused.code, refused.message, refused.reason, refused.until));
104
+ }
105
+ else
106
+ waiting.resolve(value.ok);
107
+ }
108
+ };
109
+ createInterface({ input: child.stdout }).on("line", onLine);
110
+ const request = (op, fields, schema) => {
111
+ if (exited)
112
+ return Promise.reject(STOPPED());
113
+ const id = nextId++;
114
+ const answer = new Promise((resolve, reject) => pending.set(id, { op, resolve, reject }));
115
+ child.stdin?.write(`${JSON.stringify({ id, op, ...fields })}\n`);
116
+ return answer.then((value) => v.parse(schema, value));
117
+ };
118
+ const close = async () => {
119
+ if (closing)
120
+ return exit;
121
+ closing = true;
122
+ if (!exited) {
123
+ const asked = request("close", {}, v.unknown()).catch(() => { });
124
+ child.stdin?.end();
125
+ await Promise.race([asked.then(() => exit), delay(CLOSE_WAIT_MS)]);
126
+ if (!exited)
127
+ child.kill("SIGKILL");
128
+ }
129
+ await exit;
130
+ };
131
+ try {
132
+ await new Promise((resolve, reject) => {
133
+ greet = { resolve, reject };
134
+ setTimeout(() => reject(new EngineError("timeout", "the WhatsApp engine did not start in time")), HELLO_WAIT_MS).unref();
135
+ });
136
+ }
137
+ catch (error) {
138
+ await close();
139
+ throw error;
140
+ }
141
+ finally {
142
+ greet = undefined;
143
+ }
144
+ let connecting;
145
+ const nothing = v.nullable(v.unknown());
146
+ const jidAnswer = v.pipe(v.string(), v.includes("@"));
147
+ return {
148
+ self: () => self,
149
+ ready: async (signal) => {
150
+ connecting ??= request("connect", {}, nothing);
151
+ await Promise.race([connecting, aborted(signal)]);
152
+ },
153
+ me: () => request("me", {}, waAccount),
154
+ directory: () => request("directory", {}, v.array(waChat)),
155
+ chat: (jid) => request("chat", { jid }, waChatCard),
156
+ send: ({ chat, text, id, replyTo, quoted }) => request("send", { chat, text, sendId: id, ...replyFields(replyTo, quoted) }, waMessage),
157
+ edit: (key, text) => request("edit", { ...keyFields(key), text }, waMessage),
158
+ revoke: async (key) => {
159
+ await request("revoke", keyFields(key), nothing);
160
+ },
161
+ react: async (key, emoji) => {
162
+ await request("react", { ...keyFields(key), emoji }, nothing);
163
+ },
164
+ markRead: async (key) => {
165
+ await request("read", keyFields(key), nothing);
166
+ },
167
+ sendMedia: ({ chat, text, id, replyTo, quoted, file }) => request("sendMedia", { chat, text, sendId: id, file, ...replyFields(replyTo, quoted) }, waMessage),
168
+ sendAlbum: ({ chat, text, id, replyTo, quoted, files }) => request("sendAlbum", { chat, text, sendId: id, files, ...replyFields(replyTo, quoted) }, waMessage),
169
+ download: (attachment, path, key) => request("download", { attachment, path, ...keyFields(key) }, waDownloaded),
170
+ forward: ({ chat, id, text, attachment }) => request("forward", { chat, sendId: id, text, ...(attachment ? { attachment } : {}) }, waMessage),
171
+ older: (anchor, count) => request("older", { ...keyFields(anchor), timestamp: anchor.timestamp, count }, waOlder),
172
+ createPoll: ({ chat, id, question, answers, multiple }) => request("createPoll", { chat, sendId: id, question, answers, ...(multiple ? { multiple } : {}) }, waMessage),
173
+ vote: async (key, answers) => {
174
+ await request("vote", { ...keyFields(key), answers }, nothing);
175
+ },
176
+ pin: async (key, duration) => {
177
+ await request("pin", { ...keyFields(key), ...(duration === undefined ? {} : { duration }) }, nothing);
178
+ },
179
+ unpin: async (key) => {
180
+ await request("unpin", keyFields(key), nothing);
181
+ },
182
+ link: async (linking, show) => {
183
+ onCode = show;
184
+ try {
185
+ const account = await request("link", { ...linking }, waAccount);
186
+ self = account.jid;
187
+ return account;
188
+ }
189
+ finally {
190
+ onCode = undefined;
191
+ }
192
+ },
193
+ logout: async () => {
194
+ await request("logout", {}, nothing);
195
+ self = null;
196
+ },
197
+ storedChats: async (chats, recipients) => {
198
+ await request("storedChats", { chats, ...(recipients?.length ? { recipients } : {}) }, nothing);
199
+ },
200
+ canonicalChat: (jid) => request("canonicalChat", { jid }, jidAnswer),
201
+ listen: (kinds, onEvent) => hub.listen(kinds, onEvent),
202
+ close,
203
+ ...goGroups(request),
204
+ ...goPrivacy(request),
205
+ ...goSettings(request),
206
+ ...goChannels(request),
207
+ };
208
+ };
209
+ const replyFields = (replyTo, quoted) => ({
210
+ ...(replyTo === undefined ? {} : { replyTo }),
211
+ ...(quoted === undefined
212
+ ? {}
213
+ : {
214
+ quote: {
215
+ fromMe: quoted.fromMe,
216
+ text: quoted.text,
217
+ ...(quoted.sender === null ? {} : { sender: quoted.sender }),
218
+ },
219
+ }),
220
+ });
221
+ const delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms).unref());
222
+ const aborted = (signal) => new Promise((resolve) => {
223
+ if (signal.aborted)
224
+ resolve();
225
+ signal.addEventListener("abort", () => resolve(), { once: true });
226
+ });
227
+ //# sourceMappingURL=go-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"go-engine.js","sourceRoot":"","sources":["../../src/engine/go-engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,171 @@
1
+ import * as v from "valibot";
2
+ import { type EngineOp, type WaContact } from "./contract.js";
3
+ export declare const waMember: v.StrictObjectSchema<{
4
+ readonly jid: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.IncludesAction<string, "@", undefined>]>;
5
+ readonly name: v.NullableSchema<v.StringSchema<undefined>, undefined>;
6
+ readonly role: v.PicklistSchema<["owner", "admin", "member"], undefined>;
7
+ }, undefined>;
8
+ /**
9
+ * A group in WhatsApp's own terms. `addMode` is who may add members; `announce`, only admins send; `locked`, only
10
+ * admins change the name and description; `ephemeral`, seconds until messages disappear, 0 for never. `link` is
11
+ * `null` unless it was asked for and the account may see it.
12
+ */
13
+ export declare const waGroup: v.StrictObjectSchema<{
14
+ readonly chat: v.StrictObjectSchema<{
15
+ readonly jid: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.IncludesAction<string, "@", undefined>]>;
16
+ readonly name: v.OptionalSchema<v.NullableSchema<v.StringSchema<undefined>, undefined>, undefined>;
17
+ readonly kind: v.PicklistSchema<["dm", "self", "group", "newsletter", "broadcast"], undefined>;
18
+ readonly unread: v.OptionalSchema<v.NullableSchema<v.NumberSchema<undefined>, undefined>, undefined>;
19
+ readonly lastMessageAt: v.OptionalSchema<v.NullableSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.IsoTimestampAction<string, undefined>]>, undefined>, undefined>;
20
+ readonly participants: v.OptionalSchema<v.NullableSchema<v.NumberSchema<undefined>, undefined>, undefined>;
21
+ readonly archived: v.OptionalSchema<v.BooleanSchema<undefined>, undefined>;
22
+ readonly muted: v.OptionalSchema<v.BooleanSchema<undefined>, undefined>;
23
+ readonly parent: v.OptionalSchema<v.NullableSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.IncludesAction<string, "@", undefined>]>, undefined>, undefined>;
24
+ readonly community: v.OptionalSchema<v.LiteralSchema<true, undefined>, undefined>;
25
+ readonly membershipState: v.OptionalSchema<v.PicklistSchema<["left", "member"], undefined>, undefined>;
26
+ }, undefined>;
27
+ readonly description: v.NullableSchema<v.StringSchema<undefined>, undefined>;
28
+ readonly link: v.NullableSchema<v.StringSchema<undefined>, undefined>;
29
+ readonly addMode: v.PicklistSchema<["admin_add", "all_member_add", ""], undefined>;
30
+ readonly approval: v.BooleanSchema<undefined>;
31
+ readonly announce: v.BooleanSchema<undefined>;
32
+ readonly locked: v.BooleanSchema<undefined>;
33
+ readonly ephemeral: v.NumberSchema<undefined>;
34
+ readonly members: v.ArraySchema<v.StrictObjectSchema<{
35
+ readonly jid: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.IncludesAction<string, "@", undefined>]>;
36
+ readonly name: v.NullableSchema<v.StringSchema<undefined>, undefined>;
37
+ readonly role: v.PicklistSchema<["owner", "admin", "member"], undefined>;
38
+ }, undefined>, undefined>;
39
+ }, undefined>;
40
+ /** `notAdded`: who could not be added, by their privacy or the group's limits, in the form they were named. */
41
+ export declare const waCreated: v.StrictObjectSchema<{
42
+ readonly group: v.StrictObjectSchema<{
43
+ readonly chat: v.StrictObjectSchema<{
44
+ readonly jid: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.IncludesAction<string, "@", undefined>]>;
45
+ readonly name: v.OptionalSchema<v.NullableSchema<v.StringSchema<undefined>, undefined>, undefined>;
46
+ readonly kind: v.PicklistSchema<["dm", "self", "group", "newsletter", "broadcast"], undefined>;
47
+ readonly unread: v.OptionalSchema<v.NullableSchema<v.NumberSchema<undefined>, undefined>, undefined>;
48
+ readonly lastMessageAt: v.OptionalSchema<v.NullableSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.IsoTimestampAction<string, undefined>]>, undefined>, undefined>;
49
+ readonly participants: v.OptionalSchema<v.NullableSchema<v.NumberSchema<undefined>, undefined>, undefined>;
50
+ readonly archived: v.OptionalSchema<v.BooleanSchema<undefined>, undefined>;
51
+ readonly muted: v.OptionalSchema<v.BooleanSchema<undefined>, undefined>;
52
+ readonly parent: v.OptionalSchema<v.NullableSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.IncludesAction<string, "@", undefined>]>, undefined>, undefined>;
53
+ readonly community: v.OptionalSchema<v.LiteralSchema<true, undefined>, undefined>;
54
+ readonly membershipState: v.OptionalSchema<v.PicklistSchema<["left", "member"], undefined>, undefined>;
55
+ }, undefined>;
56
+ readonly description: v.NullableSchema<v.StringSchema<undefined>, undefined>;
57
+ readonly link: v.NullableSchema<v.StringSchema<undefined>, undefined>;
58
+ readonly addMode: v.PicklistSchema<["admin_add", "all_member_add", ""], undefined>;
59
+ readonly approval: v.BooleanSchema<undefined>;
60
+ readonly announce: v.BooleanSchema<undefined>;
61
+ readonly locked: v.BooleanSchema<undefined>;
62
+ readonly ephemeral: v.NumberSchema<undefined>;
63
+ readonly members: v.ArraySchema<v.StrictObjectSchema<{
64
+ readonly jid: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.IncludesAction<string, "@", undefined>]>;
65
+ readonly name: v.NullableSchema<v.StringSchema<undefined>, undefined>;
66
+ readonly role: v.PicklistSchema<["owner", "admin", "member"], undefined>;
67
+ }, undefined>, undefined>;
68
+ }, undefined>;
69
+ readonly notAdded: v.ArraySchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.IncludesAction<string, "@", undefined>]>, undefined>;
70
+ }, undefined>;
71
+ export declare const waJoined: v.StrictObjectSchema<{
72
+ readonly group: v.NullableSchema<v.StrictObjectSchema<{
73
+ readonly chat: v.StrictObjectSchema<{
74
+ readonly jid: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.IncludesAction<string, "@", undefined>]>;
75
+ readonly name: v.OptionalSchema<v.NullableSchema<v.StringSchema<undefined>, undefined>, undefined>;
76
+ readonly kind: v.PicklistSchema<["dm", "self", "group", "newsletter", "broadcast"], undefined>;
77
+ readonly unread: v.OptionalSchema<v.NullableSchema<v.NumberSchema<undefined>, undefined>, undefined>;
78
+ readonly lastMessageAt: v.OptionalSchema<v.NullableSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.IsoTimestampAction<string, undefined>]>, undefined>, undefined>;
79
+ readonly participants: v.OptionalSchema<v.NullableSchema<v.NumberSchema<undefined>, undefined>, undefined>;
80
+ readonly archived: v.OptionalSchema<v.BooleanSchema<undefined>, undefined>;
81
+ readonly muted: v.OptionalSchema<v.BooleanSchema<undefined>, undefined>;
82
+ readonly parent: v.OptionalSchema<v.NullableSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.IncludesAction<string, "@", undefined>]>, undefined>, undefined>;
83
+ readonly community: v.OptionalSchema<v.LiteralSchema<true, undefined>, undefined>;
84
+ readonly membershipState: v.OptionalSchema<v.PicklistSchema<["left", "member"], undefined>, undefined>;
85
+ }, undefined>;
86
+ readonly description: v.NullableSchema<v.StringSchema<undefined>, undefined>;
87
+ readonly link: v.NullableSchema<v.StringSchema<undefined>, undefined>;
88
+ readonly addMode: v.PicklistSchema<["admin_add", "all_member_add", ""], undefined>;
89
+ readonly approval: v.BooleanSchema<undefined>;
90
+ readonly announce: v.BooleanSchema<undefined>;
91
+ readonly locked: v.BooleanSchema<undefined>;
92
+ readonly ephemeral: v.NumberSchema<undefined>;
93
+ readonly members: v.ArraySchema<v.StrictObjectSchema<{
94
+ readonly jid: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.IncludesAction<string, "@", undefined>]>;
95
+ readonly name: v.NullableSchema<v.StringSchema<undefined>, undefined>;
96
+ readonly role: v.PicklistSchema<["owner", "admin", "member"], undefined>;
97
+ }, undefined>, undefined>;
98
+ }, undefined>, undefined>;
99
+ readonly requested: v.BooleanSchema<undefined>;
100
+ }, undefined>;
101
+ export declare const waNotAdded: v.StrictObjectSchema<{
102
+ readonly notAdded: v.ArraySchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.IncludesAction<string, "@", undefined>]>, undefined>;
103
+ }, undefined>;
104
+ export declare const waJoinRequest: v.StrictObjectSchema<{
105
+ readonly jid: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.IncludesAction<string, "@", undefined>]>;
106
+ readonly name: v.NullableSchema<v.StringSchema<undefined>, undefined>;
107
+ readonly requestedAt: v.NullableSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.IsoTimestampAction<string, undefined>]>, undefined>;
108
+ }, undefined>;
109
+ /** `photo` is `null` when their privacy hides it; `verified` is WhatsApp's badge on an official business. */
110
+ export declare const waProfile: v.StrictObjectSchema<{
111
+ readonly jid: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.IncludesAction<string, "@", undefined>]>;
112
+ readonly name: v.NullableSchema<v.StringSchema<undefined>, undefined>;
113
+ readonly about: v.NullableSchema<v.StringSchema<undefined>, undefined>;
114
+ readonly business: v.BooleanSchema<undefined>;
115
+ readonly verified: v.BooleanSchema<undefined>;
116
+ readonly contact: v.BooleanSchema<undefined>;
117
+ readonly photo: v.NullableSchema<v.BooleanSchema<undefined>, undefined>;
118
+ }, undefined>;
119
+ export type WaMember = v.InferOutput<typeof waMember>;
120
+ export type WaGroup = v.InferOutput<typeof waGroup>;
121
+ export type WaCreated = v.InferOutput<typeof waCreated>;
122
+ export type WaJoined = v.InferOutput<typeof waJoined>;
123
+ export type WaJoinRequest = v.InferOutput<typeof waJoinRequest>;
124
+ export type WaProfile = v.InferOutput<typeof waProfile>;
125
+ /** What `updateGroup` changes; a field left out stays. */
126
+ export interface WaGroupChange {
127
+ title?: string;
128
+ description?: string;
129
+ addMode?: "admin_add" | "all_member_add";
130
+ approval?: boolean;
131
+ announce?: boolean;
132
+ locked?: boolean;
133
+ /** Seconds, one of WhatsApp's own timers; 0 turns it off. */
134
+ ephemeral?: number;
135
+ }
136
+ export type WaParticipantAction = "add" | "remove" | "promote" | "demote";
137
+ /** The engine's group and people requests. Every write here is seen by other people. */
138
+ export interface GroupEngine {
139
+ /** One group and its members; the invite link only with `withLink`, and only when the account may see it. */
140
+ group(jid: string, options?: {
141
+ withLink?: boolean;
142
+ }): Promise<WaGroup>;
143
+ /** The people are told they were added. */
144
+ createGroup(title: string, people: string[]): Promise<WaCreated>;
145
+ /** By an invite link; `requested` when the group's admins approve who joins. */
146
+ join(link: string): Promise<WaJoined>;
147
+ leave(jid: string): Promise<void>;
148
+ updateGroup(jid: string, change: WaGroupChange): Promise<WaGroup>;
149
+ /** The group's photo from a JPEG at `path`, an absolute path; the engine refuses one WhatsApp would not take. */
150
+ setGroupPhoto(jid: string, path: string): Promise<WaGroup>;
151
+ removeGroupPhoto(jid: string): Promise<WaGroup>;
152
+ /** A new invite link; the old one stops working. */
153
+ resetInviteLink(jid: string): Promise<WaGroup>;
154
+ /** Adds, removes, promotes to admin or demotes; only `add` may leave some out. */
155
+ participants(jid: string, action: WaParticipantAction, people: string[]): Promise<{
156
+ notAdded: string[];
157
+ }>;
158
+ joinRequests(jid: string): Promise<WaJoinRequest[]>;
159
+ answerJoinRequest(jid: string, person: string, accept: boolean): Promise<void>;
160
+ /** Reading it tells them nothing. */
161
+ profile(jid: string): Promise<WaProfile>;
162
+ block(jid: string, blocked: boolean): Promise<void>;
163
+ /** Whether one number has WhatsApp; nothing is sent to it. The engine takes one lookup every few seconds. */
164
+ lookup(phone: string): Promise<WaContact>;
165
+ /** The phone's address book, as the engine's store holds it. */
166
+ contacts(): Promise<WaContact[]>;
167
+ }
168
+ export type EngineRequest = <T>(op: EngineOp, fields: Record<string, unknown>, schema: v.GenericSchema<unknown, T>) => Promise<T>;
169
+ /** The group and people requests over the Go engine's JSON lines. */
170
+ export declare const goGroups: (request: EngineRequest) => GroupEngine;
171
+ //# sourceMappingURL=groups.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"groups.d.ts","sourceRoot":"","sources":["../../src/engine/groups.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAC5B,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,SAAS,EAAqB,MAAM,eAAe,CAAA;AAKhF,eAAO,MAAM,QAAQ;;;;aAInB,CAAA;AAEF;;;;GAIG;AACH,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;aAUlB,CAAA;AAEF,+GAA+G;AAC/G,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aAA6D,CAAA;AACnF,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aAAyE,CAAA;AAC9F,eAAO,MAAM,UAAU;;aAA6C,CAAA;AACpE,eAAO,MAAM,aAAa;;;;aAAuF,CAAA;AAEjH,6GAA6G;AAC7G,eAAO,MAAM,SAAS;;;;;;;;aAQpB,CAAA;AAEF,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,QAAQ,CAAC,CAAA;AACrD,MAAM,MAAM,OAAO,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,OAAO,CAAC,CAAA;AACnD,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,SAAS,CAAC,CAAA;AACvD,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,QAAQ,CAAC,CAAA;AACrD,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,aAAa,CAAC,CAAA;AAC/D,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,SAAS,CAAC,CAAA;AAEvD,0DAA0D;AAC1D,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,OAAO,CAAC,EAAE,WAAW,GAAG,gBAAgB,CAAA;IACxC,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,6DAA6D;IAC7D,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,MAAM,mBAAmB,GAAG,KAAK,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAA;AAEzE,wFAAwF;AACxF,MAAM,WAAW,WAAW;IAC1B,6GAA6G;IAC7G,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IACtE,2CAA2C;IAC3C,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC,CAAA;IAChE,gFAAgF;IAChF,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;IACrC,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACjC,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IACjE,iHAAiH;IACjH,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAC1D,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAC/C,oDAAoD;IACpD,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAC9C,kFAAkF;IAClF,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAA;IACzG,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAAA;IACnD,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC9E,qCAAqC;IACrC,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAAA;IACxC,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACnD,6GAA6G;IAC7G,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAAA;IACzC,gEAAgE;IAChE,QAAQ,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC,CAAA;CACjC;AAED,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,EAC5B,EAAE,EAAE,QAAQ,EACZ,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,MAAM,EAAE,CAAC,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC,CAAC,KAChC,OAAO,CAAC,CAAC,CAAC,CAAA;AAIf,qEAAqE;AACrE,eAAO,MAAM,QAAQ,YAAa,aAAa,KAAG,WAsBhD,CAAA"}
@@ -0,0 +1,66 @@
1
+ import * as v from "valibot";
2
+ import { waChat, waContact } from "./contract.js";
3
+ const jid = v.pipe(v.string(), v.includes("@"));
4
+ const time = v.pipe(v.string(), v.isoTimestamp());
5
+ export const waMember = v.strictObject({
6
+ jid,
7
+ name: v.nullable(v.string()),
8
+ role: v.picklist(["owner", "admin", "member"]),
9
+ });
10
+ /**
11
+ * A group in WhatsApp's own terms. `addMode` is who may add members; `announce`, only admins send; `locked`, only
12
+ * admins change the name and description; `ephemeral`, seconds until messages disappear, 0 for never. `link` is
13
+ * `null` unless it was asked for and the account may see it.
14
+ */
15
+ export const waGroup = v.strictObject({
16
+ chat: waChat,
17
+ description: v.nullable(v.string()),
18
+ link: v.nullable(v.string()),
19
+ addMode: v.picklist(["admin_add", "all_member_add", ""]),
20
+ approval: v.boolean(),
21
+ announce: v.boolean(),
22
+ locked: v.boolean(),
23
+ ephemeral: v.number(),
24
+ members: v.array(waMember),
25
+ });
26
+ /** `notAdded`: who could not be added, by their privacy or the group's limits, in the form they were named. */
27
+ export const waCreated = v.strictObject({ group: waGroup, notAdded: v.array(jid) });
28
+ export const waJoined = v.strictObject({ group: v.nullable(waGroup), requested: v.boolean() });
29
+ export const waNotAdded = v.strictObject({ notAdded: v.array(jid) });
30
+ export const waJoinRequest = v.strictObject({ jid, name: v.nullable(v.string()), requestedAt: v.nullable(time) });
31
+ /** `photo` is `null` when their privacy hides it; `verified` is WhatsApp's badge on an official business. */
32
+ export const waProfile = v.strictObject({
33
+ jid,
34
+ name: v.nullable(v.string()),
35
+ about: v.nullable(v.string()),
36
+ business: v.boolean(),
37
+ verified: v.boolean(),
38
+ contact: v.boolean(),
39
+ photo: v.nullable(v.boolean()),
40
+ });
41
+ const nothing = v.nullable(v.unknown());
42
+ /** The group and people requests over the Go engine's JSON lines. */
43
+ export const goGroups = (request) => ({
44
+ group: (jid, { withLink = false } = {}) => request("group", { jid, ...(withLink ? { withLink } : {}) }, waGroup),
45
+ createGroup: (title, people) => request("createGroup", { title, people }, waCreated),
46
+ join: (link) => request("join", { link }, waJoined),
47
+ leave: async (jid) => {
48
+ await request("leave", { jid }, nothing);
49
+ },
50
+ updateGroup: (jid, change) => request("updateGroup", { jid, ...change }, waGroup),
51
+ setGroupPhoto: (jid, path) => request("setGroupPhoto", { jid, path }, waGroup),
52
+ removeGroupPhoto: (jid) => request("setGroupPhoto", { jid, removePhoto: true }, waGroup),
53
+ resetInviteLink: (jid) => request("resetLink", { jid }, waGroup),
54
+ participants: (jid, action, people) => request("participants", { jid, action, people }, waNotAdded),
55
+ joinRequests: (jid) => request("requests", { jid }, v.array(waJoinRequest)),
56
+ answerJoinRequest: async (jid, person, accept) => {
57
+ await request("answerRequest", { jid, people: [person], accept }, nothing);
58
+ },
59
+ profile: (jid) => request("profile", { jid }, waProfile),
60
+ block: async (jid, blocked) => {
61
+ await request("block", { jid, blocked }, nothing);
62
+ },
63
+ lookup: (phone) => request("lookup", { phone }, waContact),
64
+ contacts: () => request("contacts", {}, v.array(waContact)),
65
+ });
66
+ //# sourceMappingURL=groups.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"groups.js","sourceRoot":"","sources":["../../src/engine/groups.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAC5B,OAAO,EAAiC,MAAM,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAEhF,MAAM,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAA;AAC/C,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,YAAY,EAAE,CAAC,CAAA;AAEjD,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,CAAC,YAAY,CAAC;IACrC,GAAG;IACH,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAC5B,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;CAC/C,CAAC,CAAA;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,CAAC,YAAY,CAAC;IACpC,IAAI,EAAE,MAAM;IACZ,WAAW,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IACnC,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAC5B,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,gBAAgB,EAAE,EAAE,CAAC,CAAC;IACxD,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE;IACrB,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE;IACrB,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE;IACnB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;IACrB,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC;CAC3B,CAAC,CAAA;AAEF,+GAA+G;AAC/G,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;AACnF,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAA;AAC9F,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAC,YAAY,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;AACpE,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC,YAAY,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;AAEjH,6GAA6G;AAC7G,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,CAAC,YAAY,CAAC;IACtC,GAAG;IACH,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAC5B,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAC7B,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE;IACrB,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE;IACrB,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE;IACpB,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;CAC/B,CAAC,CAAA;AAyDF,MAAM,OAAO,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAA;AAEvC,qEAAqE;AACrE,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,OAAsB,EAAe,EAAE,CAAC,CAAC;IAChE,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE,QAAQ,GAAG,KAAK,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,CAAC;IAChH,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,SAAS,CAAC;IACpF,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,EAAE,QAAQ,CAAC;IACnD,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QACnB,MAAM,OAAO,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,EAAE,OAAO,CAAC,CAAA;IAC1C,CAAC;IACD,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,GAAG,EAAE,GAAG,MAAM,EAAE,EAAE,OAAO,CAAC;IACjF,aAAa,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,OAAO,CAAC;IAC9E,gBAAgB,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,OAAO,CAAC;IACxF,eAAe,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,GAAG,EAAE,EAAE,OAAO,CAAC;IAChE,YAAY,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,UAAU,CAAC;IACnG,YAAY,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IAC3E,iBAAiB,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;QAC/C,MAAM,OAAO,CAAC,eAAe,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,CAAA;IAC5E,CAAC;IACD,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,GAAG,EAAE,EAAE,SAAS,CAAC;IACxD,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE;QAC5B,MAAM,OAAO,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,OAAO,CAAC,CAAA;IACnD,CAAC;IACD,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,EAAE,SAAS,CAAC;IAC1D,QAAQ,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;CAC5D,CAAC,CAAA"}
@@ -0,0 +1,33 @@
1
+ import * as v from "valibot";
2
+ import type { EngineRequest } from "./groups.js";
3
+ /**
4
+ * The account's privacy in WhatsApp's own names and values (whatsmeow's `types.PrivacySettings`): `groupadd` who may
5
+ * add the account to groups, `last` who sees last seen, `online` who sees it online (`match_last_seen`: those who see
6
+ * last seen), `calladd` whose calls ring (`known`: unknown callers are silenced), `profile` who sees the profile photo,
7
+ * `status` who sees the about text, `readreceipts` whether read receipts go (`all`) or not (`none`). An audience is
8
+ * `all`, `contacts`, `contact_blacklist` (contacts but those the phone excepts) or `none`. `""` is a setting WhatsApp
9
+ * did not send.
10
+ */
11
+ export declare const waPrivacy: v.StrictObjectSchema<{
12
+ readonly groupadd: v.StringSchema<undefined>;
13
+ readonly last: v.StringSchema<undefined>;
14
+ readonly online: v.StringSchema<undefined>;
15
+ readonly calladd: v.StringSchema<undefined>;
16
+ readonly profile: v.StringSchema<undefined>;
17
+ readonly status: v.StringSchema<undefined>;
18
+ readonly readreceipts: v.StringSchema<undefined>;
19
+ }, undefined>;
20
+ export type WaPrivacy = v.InferOutput<typeof waPrivacy>;
21
+ export interface WaPrivacyChange {
22
+ name: keyof WaPrivacy;
23
+ value: string;
24
+ }
25
+ /** The engine's privacy requests. A change is seen by everyone the setting is about. */
26
+ export interface PrivacyEngine {
27
+ /** Asked of WhatsApp each time, never from a cache another device may have outdated. */
28
+ privacy(): Promise<WaPrivacy>;
29
+ /** In order, one request each; answers every setting as it now is. Nothing is sent unless every change is valid. */
30
+ setPrivacy(changes: WaPrivacyChange[]): Promise<WaPrivacy>;
31
+ }
32
+ export declare const goPrivacy: (request: EngineRequest) => PrivacyEngine;
33
+ //# sourceMappingURL=privacy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"privacy.d.ts","sourceRoot":"","sources":["../../src/engine/privacy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAC5B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAEhD;;;;;;;GAOG;AACH,eAAO,MAAM,SAAS;;;;;;;;aAQpB,CAAA;AAEF,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,SAAS,CAAC,CAAA;AAEvD,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,SAAS,CAAA;IACrB,KAAK,EAAE,MAAM,CAAA;CACd;AAED,wFAAwF;AACxF,MAAM,WAAW,aAAa;IAC5B,wFAAwF;IACxF,OAAO,IAAI,OAAO,CAAC,SAAS,CAAC,CAAA;IAC7B,oHAAoH;IACpH,UAAU,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC,CAAA;CAC3D;AAED,eAAO,MAAM,SAAS,YAAa,aAAa,KAAG,aAGjD,CAAA"}
@@ -0,0 +1,23 @@
1
+ import * as v from "valibot";
2
+ /**
3
+ * The account's privacy in WhatsApp's own names and values (whatsmeow's `types.PrivacySettings`): `groupadd` who may
4
+ * add the account to groups, `last` who sees last seen, `online` who sees it online (`match_last_seen`: those who see
5
+ * last seen), `calladd` whose calls ring (`known`: unknown callers are silenced), `profile` who sees the profile photo,
6
+ * `status` who sees the about text, `readreceipts` whether read receipts go (`all`) or not (`none`). An audience is
7
+ * `all`, `contacts`, `contact_blacklist` (contacts but those the phone excepts) or `none`. `""` is a setting WhatsApp
8
+ * did not send.
9
+ */
10
+ export const waPrivacy = v.strictObject({
11
+ groupadd: v.string(),
12
+ last: v.string(),
13
+ online: v.string(),
14
+ calladd: v.string(),
15
+ profile: v.string(),
16
+ status: v.string(),
17
+ readreceipts: v.string(),
18
+ });
19
+ export const goPrivacy = (request) => ({
20
+ privacy: () => request("privacy", {}, waPrivacy),
21
+ setPrivacy: (changes) => request("setPrivacy", { privacy: changes }, waPrivacy),
22
+ });
23
+ //# sourceMappingURL=privacy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"privacy.js","sourceRoot":"","sources":["../../src/engine/privacy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAG5B;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,CAAC,YAAY,CAAC;IACtC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;IACpB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;IAClB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;IAClB,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;CACzB,CAAC,CAAA;AAiBF,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,OAAsB,EAAiB,EAAE,CAAC,CAAC;IACnE,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,EAAE,SAAS,CAAC;IAChD,UAAU,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,SAAS,CAAC;CAChF,CAAC,CAAA"}
@@ -0,0 +1,45 @@
1
+ import { type WaAccount, type WaAnchor, type WaKey } from "./contract.js";
2
+ import type { EngineRequest } from "./groups.js";
3
+ /** The account's own name, "about" line and photo; a field left out stays. */
4
+ export interface WaProfileChange {
5
+ pushName?: string;
6
+ about?: string;
7
+ /** The new photo's absolute path: a square JPEG of 190 to 720 pixels a side, checked before anything changes. */
8
+ path?: string;
9
+ }
10
+ /** The engine's writes to the account's synced settings, which WhatsApp syncs to the account's other devices. */
11
+ export interface SettingsEngine {
12
+ /** `until`: `forever`, an ISO 8601 time, or `null` to unmute. Nobody in the chat is told. */
13
+ mute(jid: string, until: string | null): Promise<void>;
14
+ /**
15
+ * The name goes to the owner's devices as a setting, then the about and the photo to WhatsApp; answers the account
16
+ * as it now is.
17
+ */
18
+ updateProfile(change: WaProfileChange): Promise<WaAccount>;
19
+ /**
20
+ * Deletes `last`'s chat from the account's devices, up to `last`, the chat's newest stored message: WhatsApp needs
21
+ * it to know what the deletion covers. The photos and files the phone saved from it stay. Nobody else is told.
22
+ */
23
+ deleteChat(last: WaAnchor): Promise<void>;
24
+ /** Deletes every message of `last`'s chat up to `last`, starred ones too, and keeps the chat; as `deleteChat`. */
25
+ clearChat(last: WaAnchor): Promise<void>;
26
+ /**
27
+ * Deletes `message` from the account's devices alone; the others in the chat keep it. WhatsApp names the message by
28
+ * its key and the time it was sent, both from the store. The photos and files the phone saved from it stay.
29
+ */
30
+ deleteForMe(message: WaAnchor): Promise<void>;
31
+ /** Stars `message`, or takes the star off, on the account's devices alone; nobody in the chat is told. */
32
+ star(message: WaKey, starred: boolean): Promise<void>;
33
+ /** Moves `last`'s chat into the archive, which unpins it, or back out; bounded by `last` as `deleteChat` is. */
34
+ archiveChat(last: WaAnchor, archived: boolean): Promise<void>;
35
+ /** Pins the chat at the top of the account's chat list, or unpins it. Not a message pin. */
36
+ pinChat(jid: string, pinned: boolean): Promise<void>;
37
+ /**
38
+ * Marks `last`'s chat read on the account's devices up to `last`, which takes a mark-unread off; no receipt is sent.
39
+ */
40
+ markChatRead(last: WaAnchor): Promise<void>;
41
+ /** Marks `last`'s chat unread on the account's devices; no receipt is sent or taken back. */
42
+ markChatUnread(last: WaAnchor): Promise<void>;
43
+ }
44
+ export declare const goSettings: (request: EngineRequest) => SettingsEngine;
45
+ //# sourceMappingURL=settings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../src/engine/settings.ts"],"names":[],"mappings":"AACA,OAAO,EAAa,KAAK,SAAS,EAAE,KAAK,QAAQ,EAAE,KAAK,KAAK,EAAa,MAAM,eAAe,CAAA;AAC/F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAEhD,8EAA8E;AAC9E,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,iHAAiH;IACjH,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,iHAAiH;AACjH,MAAM,WAAW,cAAc;IAC7B,6FAA6F;IAC7F,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACtD;;;OAGG;IACH,aAAa,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,SAAS,CAAC,CAAA;IAC1D;;;OAGG;IACH,UAAU,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACzC,kHAAkH;IAClH,SAAS,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACxC;;;OAGG;IACH,WAAW,CAAC,OAAO,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC7C,0GAA0G;IAC1G,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACrD,gHAAgH;IAChH,WAAW,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC7D,4FAA4F;IAC5F,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACpD;;OAEG;IACH,YAAY,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC3C,6FAA6F;IAC7F,cAAc,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAC9C;AAID,eAAO,MAAM,UAAU,YAAa,aAAa,KAAG,cAiClD,CAAA"}