@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.
- package/LICENSE +204 -0
- package/README.md +401 -2
- package/dist/adapter/adapter.d.ts +13 -0
- package/dist/adapter/adapter.d.ts.map +1 -0
- package/dist/adapter/adapter.js +554 -0
- package/dist/adapter/adapter.js.map +1 -0
- package/dist/adapter/channels.d.ts +43 -0
- package/dist/adapter/channels.d.ts.map +1 -0
- package/dist/adapter/channels.js +100 -0
- package/dist/adapter/channels.js.map +1 -0
- package/dist/adapter/checks.d.ts +6 -0
- package/dist/adapter/checks.d.ts.map +1 -0
- package/dist/adapter/checks.js +2 -0
- package/dist/adapter/checks.js.map +1 -0
- package/dist/adapter/errors.d.ts +13 -0
- package/dist/adapter/errors.d.ts.map +1 -0
- package/dist/adapter/errors.js +38 -0
- package/dist/adapter/errors.js.map +1 -0
- package/dist/adapter/format-markdown.d.ts +8 -0
- package/dist/adapter/format-markdown.d.ts.map +1 -0
- package/dist/adapter/format-markdown.js +80 -0
- package/dist/adapter/format-markdown.js.map +1 -0
- package/dist/adapter/groups.d.ts +25 -0
- package/dist/adapter/groups.d.ts.map +1 -0
- package/dist/adapter/groups.js +252 -0
- package/dist/adapter/groups.js.map +1 -0
- package/dist/adapter/map.d.ts +23 -0
- package/dist/adapter/map.d.ts.map +1 -0
- package/dist/adapter/map.js +121 -0
- package/dist/adapter/map.js.map +1 -0
- package/dist/adapter/pins.d.ts +11 -0
- package/dist/adapter/pins.d.ts.map +1 -0
- package/dist/adapter/pins.js +10 -0
- package/dist/adapter/pins.js.map +1 -0
- package/dist/adapter/polls.d.ts +21 -0
- package/dist/adapter/polls.d.ts.map +1 -0
- package/dist/adapter/polls.js +103 -0
- package/dist/adapter/polls.js.map +1 -0
- package/dist/adapter/privacy.d.ts +18 -0
- package/dist/adapter/privacy.d.ts.map +1 -0
- package/dist/adapter/privacy.js +94 -0
- package/dist/adapter/privacy.js.map +1 -0
- package/dist/adapter/settings.d.ts +21 -0
- package/dist/adapter/settings.d.ts.map +1 -0
- package/dist/adapter/settings.js +76 -0
- package/dist/adapter/settings.js.map +1 -0
- package/dist/app.d.ts +6 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +16 -0
- package/dist/app.js.map +1 -0
- package/dist/bin/wa.d.ts +3 -0
- package/dist/bin/wa.d.ts.map +1 -0
- package/dist/bin/wa.js +14 -0
- package/dist/bin/wa.js.map +1 -0
- package/dist/commands/session.d.ts +48 -0
- package/dist/commands/session.d.ts.map +1 -0
- package/dist/commands/session.js +201 -0
- package/dist/commands/session.js.map +1 -0
- package/dist/commands/setup.d.ts +3 -0
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/setup.js +140 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/commands/update.d.ts +2 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +17 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/diagnose.d.ts +77 -0
- package/dist/diagnose.d.ts.map +1 -0
- package/dist/diagnose.js +84 -0
- package/dist/diagnose.js.map +1 -0
- package/dist/engine/channels.d.ts +100 -0
- package/dist/engine/channels.d.ts.map +1 -0
- package/dist/engine/channels.js +29 -0
- package/dist/engine/channels.js.map +1 -0
- package/dist/engine/contract.d.ts +1049 -0
- package/dist/engine/contract.d.ts.map +1 -0
- package/dist/engine/contract.js +353 -0
- package/dist/engine/contract.js.map +1 -0
- package/dist/engine/events.d.ts +9 -0
- package/dist/engine/events.d.ts.map +1 -0
- package/dist/engine/events.js +23 -0
- package/dist/engine/events.js.map +1 -0
- package/dist/engine/go-engine.d.ts +23 -0
- package/dist/engine/go-engine.d.ts.map +1 -0
- package/dist/engine/go-engine.js +227 -0
- package/dist/engine/go-engine.js.map +1 -0
- package/dist/engine/groups.d.ts +171 -0
- package/dist/engine/groups.d.ts.map +1 -0
- package/dist/engine/groups.js +66 -0
- package/dist/engine/groups.js.map +1 -0
- package/dist/engine/privacy.d.ts +33 -0
- package/dist/engine/privacy.d.ts.map +1 -0
- package/dist/engine/privacy.js +23 -0
- package/dist/engine/privacy.js.map +1 -0
- package/dist/engine/settings.d.ts +45 -0
- package/dist/engine/settings.d.ts.map +1 -0
- package/dist/engine/settings.js +34 -0
- package/dist/engine/settings.js.map +1 -0
- package/dist/engine-binary.d.ts +5 -0
- package/dist/engine-binary.d.ts.map +1 -0
- package/dist/engine-binary.js +18 -0
- package/dist/engine-binary.js.map +1 -0
- package/dist/install/postinstall.d.ts +8 -0
- package/dist/install/postinstall.d.ts.map +1 -0
- package/dist/install/postinstall.js +63 -0
- package/dist/install/postinstall.js.map +1 -0
- package/dist/messenger.d.ts +63 -0
- package/dist/messenger.d.ts.map +1 -0
- package/dist/messenger.js +186 -0
- package/dist/messenger.js.map +1 -0
- package/dist/paths.d.ts +5 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +7 -0
- package/dist/paths.js.map +1 -0
- package/dist/program.d.ts +12 -0
- package/dist/program.d.ts.map +1 -0
- package/dist/program.js +86 -0
- package/dist/program.js.map +1 -0
- package/dist/reasons.d.ts +4 -0
- package/dist/reasons.d.ts.map +1 -0
- package/dist/reasons.js +21 -0
- package/dist/reasons.js.map +1 -0
- package/dist/update.d.ts +7 -0
- package/dist/update.d.ts.map +1 -0
- package/dist/update.js +19 -0
- package/dist/update.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +2 -0
- package/dist/version.js.map +1 -0
- package/install/postinstall.mjs +3 -0
- package/install/windows.ps1 +161 -0
- package/package.json +89 -4
- package/skills/whatsapp-cli/SKILL.md +325 -0
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import * as v from "valibot";
|
|
2
|
+
import { keyFields, waAccount } from "./contract.js";
|
|
3
|
+
const nothing = v.nullable(v.unknown());
|
|
4
|
+
export const goSettings = (request) => ({
|
|
5
|
+
mute: async (jid, until) => {
|
|
6
|
+
await request("mute", { jid, until }, nothing);
|
|
7
|
+
},
|
|
8
|
+
updateProfile: (change) => request("updateProfile", { ...change }, waAccount),
|
|
9
|
+
deleteChat: async (last) => {
|
|
10
|
+
await request("deleteChat", { ...keyFields(last), timestamp: last.timestamp }, nothing);
|
|
11
|
+
},
|
|
12
|
+
clearChat: async (last) => {
|
|
13
|
+
await request("clearChat", { ...keyFields(last), timestamp: last.timestamp }, nothing);
|
|
14
|
+
},
|
|
15
|
+
deleteForMe: async (message) => {
|
|
16
|
+
await request("deleteForMe", { ...keyFields(message), timestamp: message.timestamp }, nothing);
|
|
17
|
+
},
|
|
18
|
+
star: async (message, starred) => {
|
|
19
|
+
await request("star", { ...keyFields(message), starred }, nothing);
|
|
20
|
+
},
|
|
21
|
+
archiveChat: async (last, archived) => {
|
|
22
|
+
await request(archived ? "archiveChat" : "unarchiveChat", { ...keyFields(last), timestamp: last.timestamp }, nothing);
|
|
23
|
+
},
|
|
24
|
+
pinChat: async (jid, pinned) => {
|
|
25
|
+
await request(pinned ? "pinChat" : "unpinChat", { jid }, nothing);
|
|
26
|
+
},
|
|
27
|
+
markChatRead: async (last) => {
|
|
28
|
+
await request("markChatRead", { ...keyFields(last), timestamp: last.timestamp }, nothing);
|
|
29
|
+
},
|
|
30
|
+
markChatUnread: async (last) => {
|
|
31
|
+
await request("markChatUnread", { ...keyFields(last), timestamp: last.timestamp }, nothing);
|
|
32
|
+
},
|
|
33
|
+
});
|
|
34
|
+
//# sourceMappingURL=settings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../../src/engine/settings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAC5B,OAAO,EAAE,SAAS,EAA6C,SAAS,EAAE,MAAM,eAAe,CAAA;AA8C/F,MAAM,OAAO,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAA;AAEvC,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,OAAsB,EAAkB,EAAE,CAAC,CAAC;IACrE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;QACzB,MAAM,OAAO,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,OAAO,CAAC,CAAA;IAChD,CAAC;IACD,aAAa,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,GAAG,MAAM,EAAE,EAAE,SAAS,CAAC;IAC7E,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QACzB,MAAM,OAAO,CAAC,YAAY,EAAE,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,EAAE,OAAO,CAAC,CAAA;IACzF,CAAC;IACD,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QACxB,MAAM,OAAO,CAAC,WAAW,EAAE,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,EAAE,OAAO,CAAC,CAAA;IACxF,CAAC;IACD,WAAW,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QAC7B,MAAM,OAAO,CAAC,aAAa,EAAE,EAAE,GAAG,SAAS,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,EAAE,OAAO,CAAC,CAAA;IAChG,CAAC;IACD,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;QAC/B,MAAM,OAAO,CAAC,MAAM,EAAE,EAAE,GAAG,SAAS,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,EAAE,OAAO,CAAC,CAAA;IACpE,CAAC;IACD,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;QACpC,MAAM,OAAO,CACX,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,eAAe,EAC1C,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,EACjD,OAAO,CACR,CAAA;IACH,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE;QAC7B,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,EAAE,EAAE,GAAG,EAAE,EAAE,OAAO,CAAC,CAAA;IACnE,CAAC;IACD,YAAY,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QAC3B,MAAM,OAAO,CAAC,cAAc,EAAE,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,EAAE,OAAO,CAAC,CAAA;IAC3F,CAAC;IACD,cAAc,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QAC7B,MAAM,OAAO,CAAC,gBAAgB,EAAE,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,EAAE,OAAO,CAAC,CAAA;IAC7F,CAAC;CACF,CAAC,CAAA"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** The npm package that carries the engine for this system, an optional dependency of whatsapp-cli. */
|
|
2
|
+
export declare const enginePackage: (platform?: string, arch?: string) => string;
|
|
3
|
+
/** `WA_ENGINE`, else the engine package installed beside the CLI, else the binary `pnpm engine:build` writes. */
|
|
4
|
+
export declare const engineBinary: (env?: NodeJS.ProcessEnv) => string;
|
|
5
|
+
//# sourceMappingURL=engine-binary.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine-binary.d.ts","sourceRoot":"","sources":["../src/engine-binary.ts"],"names":[],"mappings":"AAMA,uGAAuG;AACvG,eAAO,MAAM,aAAa,cAAc,MAAM,SAA2B,MAAM,KAAkB,MACjD,CAAA;AAWhD,iHAAiH;AACjH,eAAO,MAAM,YAAY,SAAS,MAAM,CAAC,UAAU,KAAiB,MACsC,CAAA"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { createRequire } from "node:module";
|
|
2
|
+
import { dirname, join } from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
const EXE = process.platform === "win32" ? ".exe" : "";
|
|
5
|
+
/** The npm package that carries the engine for this system, an optional dependency of whatsapp-cli. */
|
|
6
|
+
export const enginePackage = (platform = process.platform, arch = process.arch) => `@wirecat/whatsapp-engine-${platform}-${arch}`;
|
|
7
|
+
const installed = () => {
|
|
8
|
+
try {
|
|
9
|
+
const manifest = createRequire(import.meta.url).resolve(`${enginePackage()}/package.json`);
|
|
10
|
+
return join(dirname(manifest), "bin", `wa-engine${EXE}`);
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
return undefined;
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
/** `WA_ENGINE`, else the engine package installed beside the CLI, else the binary `pnpm engine:build` writes. */
|
|
17
|
+
export const engineBinary = (env = process.env) => env.WA_ENGINE || installed() || fileURLToPath(new URL(`../engine/bin/wa-engine${EXE}`, import.meta.url));
|
|
18
|
+
//# sourceMappingURL=engine-binary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine-binary.js","sourceRoot":"","sources":["../src/engine-binary.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAExC,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAA;AAEtD,uGAAuG;AACvG,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,QAAQ,GAAW,OAAO,CAAC,QAAQ,EAAE,IAAI,GAAW,OAAO,CAAC,IAAI,EAAU,EAAE,CACxG,4BAA4B,QAAQ,IAAI,IAAI,EAAE,CAAA;AAEhD,MAAM,SAAS,GAAG,GAAuB,EAAE;IACzC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,aAAa,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,aAAa,EAAE,eAAe,CAAC,CAAA;QAC1F,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,YAAY,GAAG,EAAE,CAAC,CAAA;IAC1D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAA;IAClB,CAAC;AACH,CAAC,CAAA;AAED,iHAAiH;AACjH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,GAAG,GAAsB,OAAO,CAAC,GAAG,EAAU,EAAE,CAC3E,GAAG,CAAC,SAAS,IAAI,SAAS,EAAE,IAAI,aAAa,CAAC,IAAI,GAAG,CAAC,0BAA0B,GAAG,EAAE,EAAE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare const completeGlobalInstall: ({ env, platform, packageRoot, repair, note, }?: {
|
|
2
|
+
env?: NodeJS.ProcessEnv | undefined;
|
|
3
|
+
note?: ((message: string) => boolean) | undefined;
|
|
4
|
+
packageRoot?: string | undefined;
|
|
5
|
+
platform?: NodeJS.Platform | undefined;
|
|
6
|
+
repair?: ((prefix: string) => void) | undefined;
|
|
7
|
+
}) => void;
|
|
8
|
+
//# sourceMappingURL=postinstall.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postinstall.d.ts","sourceRoot":"","sources":["../../src/install/postinstall.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,qBAAqB;;sBA+Bf,MAAM;;;uBA3BL,MAAM;MA4BjB,IA6BR,CAAA"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { spawnSync } from "node:child_process";
|
|
2
|
+
import { dirname, join, resolve } from "node:path";
|
|
3
|
+
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
4
|
+
import { installSkill } from "@wirecat/cli-base/skill";
|
|
5
|
+
import { VERSION } from "../version.js";
|
|
6
|
+
const root = resolve(dirname(fileURLToPath(import.meta.url)), "../..");
|
|
7
|
+
export const completeGlobalInstall = ({ env = process.env, platform = process.platform, packageRoot = root, repair = (prefix) => {
|
|
8
|
+
const child = spawnSync("powershell.exe", [
|
|
9
|
+
"-NoProfile",
|
|
10
|
+
"-NonInteractive",
|
|
11
|
+
"-ExecutionPolicy",
|
|
12
|
+
"Bypass",
|
|
13
|
+
"-EncodedCommand",
|
|
14
|
+
Buffer.from("& $env:WA_INSTALL_SCRIPT -RepairOnly -Prefix $env:WA_INSTALL_PREFIX -NodeDirectory $env:WA_INSTALL_NODE -Json", "utf16le").toString("base64"),
|
|
15
|
+
], {
|
|
16
|
+
encoding: "utf8",
|
|
17
|
+
env: {
|
|
18
|
+
...env,
|
|
19
|
+
WA_INSTALL_SCRIPT: resolve(packageRoot, "install/windows.ps1"),
|
|
20
|
+
WA_INSTALL_PREFIX: prefix,
|
|
21
|
+
WA_INSTALL_NODE: dirname(process.execPath),
|
|
22
|
+
},
|
|
23
|
+
});
|
|
24
|
+
if (child.error || child.status !== 0)
|
|
25
|
+
throw new Error("Windows PATH setup failed; run the Windows installer from the installation guide");
|
|
26
|
+
}, note = (message) => process.stderr.write(`${message}\n`), } = {}) => {
|
|
27
|
+
if (env.npm_config_global !== "true")
|
|
28
|
+
return;
|
|
29
|
+
if (platform === "win32") {
|
|
30
|
+
const prefix = env.npm_config_prefix;
|
|
31
|
+
if (!prefix)
|
|
32
|
+
throw new Error("npm did not provide its global prefix; use the Windows installer");
|
|
33
|
+
repair(prefix);
|
|
34
|
+
note("wa: Windows user PATH updated; new terminals can run wa directly.");
|
|
35
|
+
}
|
|
36
|
+
// npm hides a lifecycle script's output, so writing into the owner's agent folders here must be asked for.
|
|
37
|
+
const agent = env.WA_INSTALL_AGENT;
|
|
38
|
+
if (agent === undefined || agent === "none") {
|
|
39
|
+
note("wa: agent skill not installed; wa personal setup offers it, or run wa skill install --for all.");
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
if (!["all", "codex", "cursor", "claude", "gemini"].includes(agent))
|
|
43
|
+
throw new Error("WA_INSTALL_AGENT must be all, codex, cursor, claude, gemini or none");
|
|
44
|
+
const targets = agent === "all"
|
|
45
|
+
? ["claude", "agents"]
|
|
46
|
+
: agent === "claude"
|
|
47
|
+
? ["claude"]
|
|
48
|
+
: ["agents"];
|
|
49
|
+
installSkill({ command: "wa", appName: "whatsapp-cli", version: VERSION }, pathToFileURL(join(packageRoot, "skills/whatsapp-cli/SKILL.md")), { env, targets });
|
|
50
|
+
note("wa: agent skill installed. Agent: read wa skill show before login; verify the installed skill is loaded.");
|
|
51
|
+
}
|
|
52
|
+
note("wa: link an account: wa personal session start (any profile name in place of personal).");
|
|
53
|
+
};
|
|
54
|
+
if (process.argv[1] && resolve(process.argv[1]) === fileURLToPath(import.meta.url)) {
|
|
55
|
+
try {
|
|
56
|
+
completeGlobalInstall();
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
process.stderr.write(`wa installation incomplete: ${error instanceof Error ? error.message : String(error)}\n`);
|
|
60
|
+
process.exitCode = 1;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=postinstall.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postinstall.js","sourceRoot":"","sources":["../../src/install/postinstall.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { type BaseContext, type BaseEnvironment, type Messenger } from "@wirecat/cli-core/cli";
|
|
2
|
+
import type { UpdateEnvironment } from "@wirecat/cli-core/update";
|
|
3
|
+
import type { Command } from "commander";
|
|
4
|
+
import { type WhatsAppEngine } from "./engine/contract.js";
|
|
5
|
+
export interface EngineRequest {
|
|
6
|
+
storePath: string;
|
|
7
|
+
/** The command holding the connection, named to anyone the engine's lock refuses. */
|
|
8
|
+
holder: string;
|
|
9
|
+
listen: boolean;
|
|
10
|
+
link: boolean;
|
|
11
|
+
}
|
|
12
|
+
export interface Environment extends BaseEnvironment {
|
|
13
|
+
/** Tests hand in an engine in memory. */
|
|
14
|
+
engine?: (request: EngineRequest) => WhatsAppEngine | Promise<WhatsAppEngine>;
|
|
15
|
+
/** Tests run a stand-in for the Go engine binary, through the real client. */
|
|
16
|
+
engineCommand?: {
|
|
17
|
+
file: string;
|
|
18
|
+
args: string[];
|
|
19
|
+
};
|
|
20
|
+
/** Tests shorten how long `session start` waits for the phone's history. */
|
|
21
|
+
historyWait?: {
|
|
22
|
+
firstMs: number;
|
|
23
|
+
quietMs: number;
|
|
24
|
+
slowMs?: number;
|
|
25
|
+
};
|
|
26
|
+
/** npm, the package manager and this install's path, for `upgrade` and the update notice; tests hand them in. */
|
|
27
|
+
update?: UpdateEnvironment;
|
|
28
|
+
}
|
|
29
|
+
/** A code to show while linking: the engine's, in the terms a command may see. */
|
|
30
|
+
export interface LinkCode {
|
|
31
|
+
login: "qr" | "pair";
|
|
32
|
+
code: string;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Starts the engine for the command's profile, or throws saying how to log in. Only a login (`link`) may start on
|
|
36
|
+
* a profile that has no device yet.
|
|
37
|
+
*/
|
|
38
|
+
export declare const openEngine: (command: Command, base: Pick<BaseContext, "settings" | "env" | "renderer">, { listen, link }?: {
|
|
39
|
+
listen?: boolean;
|
|
40
|
+
link?: boolean;
|
|
41
|
+
}) => Promise<WhatsAppEngine>;
|
|
42
|
+
export interface Linked {
|
|
43
|
+
account: {
|
|
44
|
+
id: string;
|
|
45
|
+
name: string | null;
|
|
46
|
+
};
|
|
47
|
+
/** Nothing was asked: the profile was linked before. */
|
|
48
|
+
alreadyLinked: boolean;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Links the profile's device, showing each code through `onCode`. A newly linked engine stays open and is handed to
|
|
52
|
+
* the command's next `connect`; an already linked one is closed and nothing is asked.
|
|
53
|
+
*/
|
|
54
|
+
export declare const linkDevice: (command: Command, base: Pick<BaseContext, "settings" | "env" | "renderer">, { method, phone, onCode, beforeLink, }: {
|
|
55
|
+
method: "qr" | "phone";
|
|
56
|
+
phone: () => Promise<string>;
|
|
57
|
+
onCode: (code: LinkCode) => void;
|
|
58
|
+
/** Throws when nobody could answer: a store can exist without a device, after a link that did not finish. */
|
|
59
|
+
beforeLink?: () => void;
|
|
60
|
+
}) => Promise<Linked>;
|
|
61
|
+
export declare const SKILL: import("url").URL;
|
|
62
|
+
export declare const WHATSAPP: Messenger;
|
|
63
|
+
//# sourceMappingURL=messenger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messenger.d.ts","sourceRoot":"","sources":["../src/messenger.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,eAAe,EAAiB,KAAK,SAAS,EAAE,MAAM,uBAAuB,CAAA;AAC7G,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AACjE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAQxC,OAAO,EAAe,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAIvE,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAA;IACjB,qFAAqF;IACrF,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,OAAO,CAAA;IACf,IAAI,EAAE,OAAO,CAAA;CACd;AAED,MAAM,WAAW,WAAY,SAAQ,eAAe;IAClD,yCAAyC;IACzC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC,CAAA;IAC7E,8EAA8E;IAC9E,aAAa,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,EAAE,CAAA;KAAE,CAAA;IAChD,4EAA4E;IAC5E,WAAW,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IACnE,iHAAiH;IACjH,MAAM,CAAC,EAAE,iBAAiB,CAAA;CAC3B;AAaD,kFAAkF;AAClF,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,IAAI,GAAG,MAAM,CAAA;IACpB,IAAI,EAAE,MAAM,CAAA;CACb;AAED;;;GAGG;AACH,eAAO,MAAM,UAAU,YACZ,OAAO,QACV,IAAI,CAAC,WAAW,EAAE,UAAU,GAAG,KAAK,GAAG,UAAU,CAAC,qBACtB;IAAE,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,KACrE,OAAO,CAAC,cAAc,CASxB,CAAA;AA+BD,MAAM,WAAW,MAAM;IACrB,OAAO,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAA;IAC5C,wDAAwD;IACxD,aAAa,EAAE,OAAO,CAAA;CACvB;AAED;;;GAGG;AACH,eAAO,MAAM,UAAU,YACZ,OAAO,QACV,IAAI,CAAC,WAAW,EAAE,UAAU,GAAG,KAAK,GAAG,UAAU,CAAC,0CAMrD;IACD,MAAM,EAAE,IAAI,GAAG,OAAO,CAAA;IACtB,KAAK,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAA;IAC5B,MAAM,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAA;IAChC,6GAA6G;IAC7G,UAAU,CAAC,EAAE,MAAM,IAAI,CAAA;CACxB,KACA,OAAO,CAAC,MAAM,CAkBhB,CAAA;AAED,eAAO,MAAM,KAAK,mBAA8D,CAAA;AAEhF,eAAO,MAAM,QAAQ,EAAE,SAmGtB,CAAA"}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { CliError } from "@wirecat/cli-base";
|
|
3
|
+
import { checkWords } from "@wirecat/cli-core";
|
|
4
|
+
import { environmentOf } from "@wirecat/cli-core/cli";
|
|
5
|
+
import { whatsAppAdapter } from "./adapter/adapter.js";
|
|
6
|
+
import { fromEngine } from "./adapter/errors.js";
|
|
7
|
+
import { ADMIN_RIGHTS, GROUP_SETTINGS } from "./adapter/groups.js";
|
|
8
|
+
import { PRIVACY_SETTINGS } from "./adapter/privacy.js";
|
|
9
|
+
import { resolveSettings, WA } from "./app.js";
|
|
10
|
+
import { diagnoseWhatsApp } from "./diagnose.js";
|
|
11
|
+
import { EngineError } from "./engine/contract.js";
|
|
12
|
+
import { startGoEngine } from "./engine/go-engine.js";
|
|
13
|
+
import { privateStore } from "./paths.js";
|
|
14
|
+
const holderOf = (command) => {
|
|
15
|
+
const words = [];
|
|
16
|
+
for (let at = command; at?.parent; at = at.parent)
|
|
17
|
+
words.unshift(at.name());
|
|
18
|
+
return words.join(" ") || "wa";
|
|
19
|
+
};
|
|
20
|
+
/** The commands the adapter's messages send a person to, with this profile named first. */
|
|
21
|
+
const wordsFor = (profile) => checkWords("wa", profile);
|
|
22
|
+
const loginHint = (profile) => wordsFor(profile)("session.start");
|
|
23
|
+
/**
|
|
24
|
+
* Starts the engine for the command's profile, or throws saying how to log in. Only a login (`link`) may start on
|
|
25
|
+
* a profile that has no device yet.
|
|
26
|
+
*/
|
|
27
|
+
export const openEngine = async (command, base, { listen = false, link = false } = {}) => {
|
|
28
|
+
const { profile } = base.settings;
|
|
29
|
+
const request = { storePath: privateStore(profile, base.env), holder: holderOf(command), listen, link };
|
|
30
|
+
const { engine: given, engineCommand, trackCloseable } = environmentOf(command);
|
|
31
|
+
// The engine ignores Ctrl+C and lives until its stdin closes, so the runner must be able to close it on a signal or
|
|
32
|
+
// a deadline: a login waiting for a scan would otherwise keep the process alive.
|
|
33
|
+
const engine = given ? await given(request) : await startEngine(request, base, engineCommand);
|
|
34
|
+
trackCloseable?.(engine);
|
|
35
|
+
return engine;
|
|
36
|
+
};
|
|
37
|
+
const startEngine = async (request, base, engineCommand) => {
|
|
38
|
+
const { profile } = base.settings;
|
|
39
|
+
if (!request.link && !existsSync(request.storePath))
|
|
40
|
+
throw new CliError("authentication_error", `profile "${profile}" is not linked to WhatsApp — run ${loginHint(profile)}`);
|
|
41
|
+
try {
|
|
42
|
+
return await startGoEngine({
|
|
43
|
+
...request,
|
|
44
|
+
env: base.env,
|
|
45
|
+
warn: base.renderer.warn,
|
|
46
|
+
...(engineCommand ? { command: engineCommand } : {}),
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
if (error instanceof EngineError && error.code === "authentication_error")
|
|
51
|
+
throw new CliError("authentication_error", `${error.message} — run ${loginHint(profile)}`);
|
|
52
|
+
if (error instanceof EngineError)
|
|
53
|
+
throw fromEngine(error);
|
|
54
|
+
throw error;
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
/** An engine that just linked, kept open for the command's next connect: the first history push comes on it. */
|
|
58
|
+
const handedOver = new WeakMap();
|
|
59
|
+
/**
|
|
60
|
+
* Links the profile's device, showing each code through `onCode`. A newly linked engine stays open and is handed to
|
|
61
|
+
* the command's next `connect`; an already linked one is closed and nothing is asked.
|
|
62
|
+
*/
|
|
63
|
+
export const linkDevice = async (command, base, { method, phone, onCode, beforeLink, }) => {
|
|
64
|
+
const engine = await openEngine(command, base, { link: true, listen: true });
|
|
65
|
+
let keep = false;
|
|
66
|
+
try {
|
|
67
|
+
const alreadyLinked = engine.self() !== null;
|
|
68
|
+
if (!alreadyLinked)
|
|
69
|
+
beforeLink?.();
|
|
70
|
+
const account = alreadyLinked
|
|
71
|
+
? await engine.me()
|
|
72
|
+
: await engine.link(method === "phone" ? { method, phone: await phone() } : { method }, onCode);
|
|
73
|
+
keep = !alreadyLinked;
|
|
74
|
+
if (keep)
|
|
75
|
+
handedOver.set(command, engine);
|
|
76
|
+
return { account: { id: account.jid, name: account.name }, alreadyLinked };
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
if (error instanceof EngineError)
|
|
80
|
+
throw fromEngine(error);
|
|
81
|
+
throw error;
|
|
82
|
+
}
|
|
83
|
+
finally {
|
|
84
|
+
if (!keep)
|
|
85
|
+
await engine.close();
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
export const SKILL = new URL("../skills/whatsapp-cli/SKILL.md", import.meta.url);
|
|
89
|
+
export const WHATSAPP = {
|
|
90
|
+
app: WA,
|
|
91
|
+
provider: "whatsapp",
|
|
92
|
+
name: "WhatsApp",
|
|
93
|
+
resolveSettings,
|
|
94
|
+
history: "store",
|
|
95
|
+
historyOnDemand: true,
|
|
96
|
+
// WhatsApp drops the older of two connections, so while serve holds the device every command runs through it.
|
|
97
|
+
connection: "exclusive",
|
|
98
|
+
// Ids are WhatsApp's own strings, so held stretches are keyed by time. A page is one request to the phone for older
|
|
99
|
+
// messages (the adapter's `history`), and WhatsApp's own clients ask 50 at a time.
|
|
100
|
+
fetching: { page: 50, maxPageSize: 50, pause: "2s", jitter: true, maxPages: 20, orderBy: "time" },
|
|
101
|
+
chatArgument: "a chat: its name, or its WhatsApp id (…@lid, …@g.us, …@newsletter)",
|
|
102
|
+
inviteLinks: /chat\.whatsapp\.com\/[A-Za-z0-9]+/i,
|
|
103
|
+
// The chat with yourself has your own id.
|
|
104
|
+
savedChatId: (account) => account.account,
|
|
105
|
+
partnerOf: (chat) => (chat.kind === "dialog" ? chat.id : undefined),
|
|
106
|
+
skill: SKILL,
|
|
107
|
+
diagnose: async (command, base) => diagnoseWhatsApp(base.settings.profile, base.env, environmentOf(command).update),
|
|
108
|
+
// What WhatsApp does not have, so the shared commands do not offer it: forum topics, folders, more than one
|
|
109
|
+
// invite link per group (`chats link reset` replaces the one there is), answering every join request at once,
|
|
110
|
+
// channel comments, history shown to people added later, and admins with some rights but not others: every admin
|
|
111
|
+
// gets them all, so `admins add` takes no `--can`.
|
|
112
|
+
topics: false,
|
|
113
|
+
folderOrder: false,
|
|
114
|
+
folderJoin: false,
|
|
115
|
+
inviteLinkCreate: false,
|
|
116
|
+
inviteLinkList: false,
|
|
117
|
+
inviteLinkRevoke: false,
|
|
118
|
+
joinRequestsAll: false,
|
|
119
|
+
channelComments: false,
|
|
120
|
+
addsWithHistory: false,
|
|
121
|
+
// A member's record has no date the account was made, so the moderation rule `newAccount` could never match.
|
|
122
|
+
knowsAccountAge: false,
|
|
123
|
+
// A document carries the name the recipient sees; WhatsApp has no spoiler and no caption above.
|
|
124
|
+
mediaOptions: ["fileName"],
|
|
125
|
+
// A sticker is an uploaded .webp, not one of a set. Meta's Cloud API caps an animated one at 500 KB and a still one
|
|
126
|
+
// at 100 KB; one cap has to let animated stickers through.
|
|
127
|
+
stickerFileBytes: 500 * 1024,
|
|
128
|
+
groupSettings: GROUP_SETTINGS,
|
|
129
|
+
groupPhoto: true,
|
|
130
|
+
groupPhotoRemoval: true,
|
|
131
|
+
profilePhotoTypes: [".jpg", ".jpeg"],
|
|
132
|
+
adminRights: ADMIN_RIGHTS,
|
|
133
|
+
pickAdminRights: false,
|
|
134
|
+
// A WhatsApp poll stays open, and any vote in it can be changed; everyone sees who voted for what.
|
|
135
|
+
pollClose: false,
|
|
136
|
+
pollRevote: false,
|
|
137
|
+
pollVoters: true,
|
|
138
|
+
pollAnonymous: false,
|
|
139
|
+
// Every message goes as the account, at once, with a notification.
|
|
140
|
+
silentSends: false,
|
|
141
|
+
sendAs: false,
|
|
142
|
+
scheduledSends: false,
|
|
143
|
+
// A pin is for the whole chat and tells its members; it ends after one of the lengths WhatsApp's apps offer.
|
|
144
|
+
quietPins: false,
|
|
145
|
+
pinDurations: [86_400, 604_800, 2_592_000],
|
|
146
|
+
pinDefaultDuration: 604_800,
|
|
147
|
+
// Nothing sends unless a typed command asked: WhatsApp bans accounts that answer like a bot.
|
|
148
|
+
autoReplies: false,
|
|
149
|
+
chatMute: true,
|
|
150
|
+
chatDeletion: true,
|
|
151
|
+
chatArchive: true,
|
|
152
|
+
chatPin: true,
|
|
153
|
+
chatMarkUnread: true,
|
|
154
|
+
lacks: [
|
|
155
|
+
"sessions",
|
|
156
|
+
"endOtherSessions",
|
|
157
|
+
"chatEvents",
|
|
158
|
+
"inspect",
|
|
159
|
+
"folders",
|
|
160
|
+
"createFolder",
|
|
161
|
+
"updateFolder",
|
|
162
|
+
"deleteFolder",
|
|
163
|
+
"addContact",
|
|
164
|
+
"removeContact",
|
|
165
|
+
"renameContact",
|
|
166
|
+
"importContacts",
|
|
167
|
+
],
|
|
168
|
+
deleteForMe: true,
|
|
169
|
+
privacy: true,
|
|
170
|
+
privacySettings: PRIVACY_SETTINGS,
|
|
171
|
+
messageStars: true,
|
|
172
|
+
connect: async (command, base, options = {}) => {
|
|
173
|
+
const linked = handedOver.get(command);
|
|
174
|
+
handedOver.delete(command);
|
|
175
|
+
const words = wordsFor(base.settings.profile);
|
|
176
|
+
if (linked)
|
|
177
|
+
return whatsAppAdapter(linked, options.stored, words, base.renderer.warn);
|
|
178
|
+
const engine = await openEngine(command, base, { listen: options.listen === true });
|
|
179
|
+
if (engine.self() === null) {
|
|
180
|
+
await engine.close();
|
|
181
|
+
throw new CliError("authentication_error", `profile "${base.settings.profile}" is not linked to WhatsApp — run ${loginHint(base.settings.profile)}`);
|
|
182
|
+
}
|
|
183
|
+
return whatsAppAdapter(engine, options.stored, words, base.renderer.warn);
|
|
184
|
+
},
|
|
185
|
+
};
|
|
186
|
+
//# sourceMappingURL=messenger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messenger.js","sourceRoot":"","sources":["../src/messenger.ts"],"names":[],"mappings":"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"}
|
package/dist/paths.d.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { type Paths } from "@wirecat/cli-base";
|
|
2
|
+
export declare const pathsFor: (env?: NodeJS.ProcessEnv) => Paths;
|
|
3
|
+
/** The engine's device store: the linked device's keys, a credential as good as a password. One device per file. */
|
|
4
|
+
export declare const privateStore: (profile: string, env?: NodeJS.ProcessEnv) => string;
|
|
5
|
+
//# sourceMappingURL=paths.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,KAAK,EAAgB,MAAM,mBAAmB,CAAA;AAG5D,eAAO,MAAM,QAAQ,SAAS,MAAM,CAAC,UAAU,KAAiB,KACE,CAAA;AAElE,oHAAoH;AACpH,eAAO,MAAM,YAAY,YAAa,MAAM,QAAO,MAAM,CAAC,UAAU,KAAiB,MACvB,CAAA"}
|
package/dist/paths.js
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { join } from "node:path";
|
|
2
|
+
import { resolvePaths } from "@wirecat/cli-base";
|
|
3
|
+
import { WA } from "./app.js";
|
|
4
|
+
export const pathsFor = (env = process.env) => resolvePaths({ appName: WA.appName, prefix: WA.envPrefix, env });
|
|
5
|
+
/** The engine's device store: the linked device's keys, a credential as good as a password. One device per file. */
|
|
6
|
+
export const privateStore = (profile, env = process.env) => join(pathsFor(env).state, "profiles", profile, "private.db");
|
|
7
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAc,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAC5D,OAAO,EAAE,EAAE,EAAE,MAAM,UAAU,CAAA;AAE7B,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,GAAG,GAAsB,OAAO,CAAC,GAAG,EAAS,EAAE,CACtE,YAAY,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,CAAA;AAElE,oHAAoH;AACpH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,OAAe,EAAE,GAAG,GAAsB,OAAO,CAAC,GAAG,EAAU,EAAE,CAC5F,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,CAAC,CAAA"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Command } from "commander";
|
|
2
|
+
import { type Environment } from "./messenger.js";
|
|
3
|
+
/**
|
|
4
|
+
* A revoked or missing login fails the same on every retry, and a restart during a ban would connect to WhatsApp
|
|
5
|
+
* again while it holds the account. `device.replaced` and `client.outdated` exit 12 with a crashed engine, which
|
|
6
|
+
* should restart, so an exit code cannot keep them from it.
|
|
7
|
+
*/
|
|
8
|
+
export declare const NO_RESTART_ON: number[];
|
|
9
|
+
export declare const createProgram: () => Command;
|
|
10
|
+
/** Never throws: every outcome is an exit code, and a failure is said once, on stderr. */
|
|
11
|
+
export declare const run: (argv: string[], environment?: Environment) => Promise<number>;
|
|
12
|
+
//# sourceMappingURL=program.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"program.d.ts","sourceRoot":"","sources":["../src/program.ts"],"names":[],"mappings":"AAuCA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAKxC,OAAO,EAAE,KAAK,WAAW,EAAmB,MAAM,gBAAgB,CAAA;AAGlE;;;;GAIG;AACH,eAAO,MAAM,aAAa,UAAyE,CAAA;AAkEnG,eAAO,MAAM,aAAa,QAAO,OAA6B,CAAA;AAE9D,0FAA0F;AAC1F,eAAO,MAAM,GAAG,SAAgB,MAAM,EAAE,gBAAe,WAAW,KAAQ,OAAO,CAAC,MAAM,CAUvF,CAAA"}
|
package/dist/program.js
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { exitCodeFor, processStreams } from "@wirecat/cli-base";
|
|
2
|
+
import { accountCommand, attachmentsCommand, chatsCommand, commandsCommand, completeCommand, configCommand, contactsCommand, conversationsCommand, createProgram as create, doctorCommand, floodCommand, imagesCommand, inboxCommand, mcpCommand, mentionsCommand, messagesCommand, metadataCommand, modelsCommand, pollsCommand, reactionsCommand, recipientsCommand, reviewCommand, run as runCli, runsCommand, searchCommand, searchesCommand, sendsCommand, serveCommand, serverCommand, skillCommand, statsCommand, storeCommand, tagsCommand, tasksCommand, watchCommand, } from "@wirecat/cli-core/cli";
|
|
3
|
+
import { CONFIG, WA } from "./app.js";
|
|
4
|
+
import { sessionCommand } from "./commands/session.js";
|
|
5
|
+
import { setupCommand } from "./commands/setup.js";
|
|
6
|
+
import { upgradeCommand } from "./commands/update.js";
|
|
7
|
+
import { SKILL, WHATSAPP } from "./messenger.js";
|
|
8
|
+
import { updateNotice } from "./update.js";
|
|
9
|
+
/**
|
|
10
|
+
* A revoked or missing login fails the same on every retry, and a restart during a ban would connect to WhatsApp
|
|
11
|
+
* again while it holds the account. `device.replaced` and `client.outdated` exit 12 with a crashed engine, which
|
|
12
|
+
* should restart, so an exit code cannot keep them from it.
|
|
13
|
+
*/
|
|
14
|
+
export const NO_RESTART_ON = [exitCodeFor("authentication_error"), exitCodeFor("permission_error")];
|
|
15
|
+
const definition = {
|
|
16
|
+
app: WA,
|
|
17
|
+
configuration: CONFIG,
|
|
18
|
+
configure: (program) => {
|
|
19
|
+
program.addHelpText("after", "\nGetting started after installation:\n" +
|
|
20
|
+
" wa personal setup Guided first run as profile personal; about 5 minutes\n" +
|
|
21
|
+
" wa personal setup --agent codex Link and install your agent's skill\n" +
|
|
22
|
+
" wa setup --help Linking choices, examples and Windows instructions\n" +
|
|
23
|
+
"Every account command names its profile first: `wa personal chats list`.\n" +
|
|
24
|
+
"\nFor agents:\n" +
|
|
25
|
+
" wa skill show Read the bundled instructions before using WhatsApp\n" +
|
|
26
|
+
" wa commands --json Discover commands, arguments and flags\n");
|
|
27
|
+
program.commands
|
|
28
|
+
.find((command) => command.name() === "skill")
|
|
29
|
+
?.addHelpText("after", "\nBefore the first link, an agent can read `wa skill show`; no device is needed.\n" +
|
|
30
|
+
"Run `wa personal setup --agent codex` for guided linking and skill installation.\n" +
|
|
31
|
+
"To install instructions separately: `wa skill install --for all`.\n");
|
|
32
|
+
},
|
|
33
|
+
commands: () => [
|
|
34
|
+
sessionCommand(),
|
|
35
|
+
setupCommand(),
|
|
36
|
+
accountCommand(WHATSAPP),
|
|
37
|
+
chatsCommand(WHATSAPP),
|
|
38
|
+
contactsCommand(WHATSAPP),
|
|
39
|
+
messagesCommand(WHATSAPP),
|
|
40
|
+
reactionsCommand(WHATSAPP),
|
|
41
|
+
pollsCommand(WHATSAPP),
|
|
42
|
+
modelsCommand(WHATSAPP),
|
|
43
|
+
inboxCommand(WHATSAPP),
|
|
44
|
+
reviewCommand(WHATSAPP),
|
|
45
|
+
watchCommand(WHATSAPP),
|
|
46
|
+
serveCommand(WHATSAPP),
|
|
47
|
+
serverCommand(WHATSAPP, { unit: { noRestartOn: NO_RESTART_ON } }),
|
|
48
|
+
storeCommand(WHATSAPP),
|
|
49
|
+
conversationsCommand(WHATSAPP),
|
|
50
|
+
attachmentsCommand(WHATSAPP),
|
|
51
|
+
tagsCommand(WHATSAPP),
|
|
52
|
+
mentionsCommand(WHATSAPP),
|
|
53
|
+
imagesCommand(WHATSAPP),
|
|
54
|
+
metadataCommand(WHATSAPP),
|
|
55
|
+
statsCommand(WHATSAPP),
|
|
56
|
+
tasksCommand(WHATSAPP),
|
|
57
|
+
searchCommand(WHATSAPP),
|
|
58
|
+
searchesCommand(WHATSAPP),
|
|
59
|
+
floodCommand(WHATSAPP),
|
|
60
|
+
recipientsCommand(WHATSAPP),
|
|
61
|
+
sendsCommand(WHATSAPP),
|
|
62
|
+
runsCommand(WA),
|
|
63
|
+
configCommand(WA, CONFIG),
|
|
64
|
+
doctorCommand(WHATSAPP),
|
|
65
|
+
commandsCommand(WA),
|
|
66
|
+
completeCommand(WHATSAPP, CONFIG),
|
|
67
|
+
upgradeCommand(),
|
|
68
|
+
mcpCommand(WHATSAPP),
|
|
69
|
+
skillCommand(WA, SKILL),
|
|
70
|
+
],
|
|
71
|
+
};
|
|
72
|
+
export const createProgram = () => create(definition);
|
|
73
|
+
/** Never throws: every outcome is an exit code, and a failure is said once, on stderr. */
|
|
74
|
+
export const run = async (argv, environment = {}) => {
|
|
75
|
+
const notice = updateNotice(argv, {
|
|
76
|
+
...(environment.tty === undefined ? {} : { tty: environment.tty }),
|
|
77
|
+
...(environment.update ? { environment: environment.update } : {}),
|
|
78
|
+
...(environment.env ? { env: environment.env } : {}),
|
|
79
|
+
});
|
|
80
|
+
const code = await runCli(argv, definition, environment);
|
|
81
|
+
const line = await notice;
|
|
82
|
+
if (line && code === 0)
|
|
83
|
+
(environment.streams ?? processStreams).diagnostic(line);
|
|
84
|
+
return code;
|
|
85
|
+
};
|
|
86
|
+
//# sourceMappingURL=program.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"program.js","sourceRoot":"","sources":["../src/program.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reasons.d.ts","sourceRoot":"","sources":["../src/reasons.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,WAAW,EAAE,MAAM,6BAA6B,CAAA;AAE7E,wFAAwF;AACxF,eAAO,MAAM,OAAO,EAAE,WAAW,EAqBhC,CAAA"}
|
package/dist/reasons.js
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { defineReasons } from "@wirecat/cli-base/standards";
|
|
2
|
+
/** Every reason wa raises beyond cli-core's, so an agent branches on it (WC-OUT-15). */
|
|
3
|
+
export const REASONS = defineReasons([
|
|
4
|
+
["device.in-use", "provider_unavailable", "another wa process holds this WhatsApp login"],
|
|
5
|
+
["device.replaced", "provider_unavailable", "another connection took over this WhatsApp login"],
|
|
6
|
+
["device.logged-out", "authentication_error", "WhatsApp logged this device out"],
|
|
7
|
+
["client.outdated", "provider_unavailable", "WhatsApp no longer accepts this version of wa"],
|
|
8
|
+
["account.banned", "permission_error", "WhatsApp has banned or restricted this account"],
|
|
9
|
+
["account.rate-limited", "rate_limited", "WhatsApp asked this account to slow down"],
|
|
10
|
+
["settings.keys-missing", "provider_unavailable", "WhatsApp has not sent the keys a settings change needs yet"],
|
|
11
|
+
["media.not-on-phone", "not_found", "neither WhatsApp nor the phone keeps this file any more"],
|
|
12
|
+
["media.phone-cannot-decrypt", "not_found", "the phone could not read the request to upload this file again"],
|
|
13
|
+
["media.phone-answer-unreadable", "provider_error", "the phone's answer about this file could not be read"],
|
|
14
|
+
["media.phone-failed", "provider_error", "the phone could not upload this file again"],
|
|
15
|
+
["media.phone-timeout", "timeout", "the phone did not upload this file again in time"],
|
|
16
|
+
["media.retry-failed", "provider_error", "the phone uploaded this file again, but the new copy did not download"],
|
|
17
|
+
["media.channel-file-forward", "validation_error", "a file from a WhatsApp channel cannot be forwarded"],
|
|
18
|
+
["engine.stopped", "provider_unavailable", "the WhatsApp engine stopped unexpectedly"],
|
|
19
|
+
["engine.stopped-mid-write", "outcome_unknown", "the WhatsApp engine stopped before WhatsApp confirmed a change"],
|
|
20
|
+
].map(([reason, code, message]) => ({ reason, code, message, details: [] })));
|
|
21
|
+
//# sourceMappingURL=reasons.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reasons.js","sourceRoot":"","sources":["../src/reasons.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAoB,MAAM,6BAA6B,CAAA;AAE7E,wFAAwF;AACxF,MAAM,CAAC,MAAM,OAAO,GAAkB,aAAa,CAE/C;IACE,CAAC,eAAe,EAAE,sBAAsB,EAAE,8CAA8C,CAAC;IACzF,CAAC,iBAAiB,EAAE,sBAAsB,EAAE,kDAAkD,CAAC;IAC/F,CAAC,mBAAmB,EAAE,sBAAsB,EAAE,iCAAiC,CAAC;IAChF,CAAC,iBAAiB,EAAE,sBAAsB,EAAE,+CAA+C,CAAC;IAC5F,CAAC,gBAAgB,EAAE,kBAAkB,EAAE,gDAAgD,CAAC;IACxF,CAAC,sBAAsB,EAAE,cAAc,EAAE,0CAA0C,CAAC;IACpF,CAAC,uBAAuB,EAAE,sBAAsB,EAAE,4DAA4D,CAAC;IAC/G,CAAC,oBAAoB,EAAE,WAAW,EAAE,yDAAyD,CAAC;IAC9F,CAAC,4BAA4B,EAAE,WAAW,EAAE,gEAAgE,CAAC;IAC7G,CAAC,+BAA+B,EAAE,gBAAgB,EAAE,sDAAsD,CAAC;IAC3G,CAAC,oBAAoB,EAAE,gBAAgB,EAAE,4CAA4C,CAAC;IACtF,CAAC,qBAAqB,EAAE,SAAS,EAAE,kDAAkD,CAAC;IACtF,CAAC,oBAAoB,EAAE,gBAAgB,EAAE,uEAAuE,CAAC;IACjH,CAAC,4BAA4B,EAAE,kBAAkB,EAAE,oDAAoD,CAAC;IACxG,CAAC,gBAAgB,EAAE,sBAAsB,EAAE,0CAA0C,CAAC;IACtF,CAAC,0BAA0B,EAAE,iBAAiB,EAAE,gEAAgE,CAAC;CAEpH,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,CAC7E,CAAA"}
|
package/dist/update.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type UpdateEnvironment } from "@wirecat/cli-core/update";
|
|
2
|
+
export type { UpdateEnvironment };
|
|
3
|
+
export declare const PACKAGE = "@wirecat/whatsapp-cli";
|
|
4
|
+
export declare const installer: ({ scriptPath }?: UpdateEnvironment) => import("@wirecat/cli-base/update").Installer, latest: (environment?: UpdateEnvironment) => Promise<string | undefined>, runUpdate: (argv: string[], environment?: UpdateEnvironment) => number, updateNotice: (argv: readonly string[], { tty, environment, env }?: import("@wirecat/cli-core/update").NoticeOptions) => Promise<string | undefined>;
|
|
5
|
+
/** This install's own entry point — after an update, the new code at the same path. */
|
|
6
|
+
export declare const waScript: () => string;
|
|
7
|
+
//# sourceMappingURL=update.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../src/update.ts"],"names":[],"mappings":"AAEA,OAAO,EAAa,KAAK,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAK5E,YAAY,EAAE,iBAAiB,EAAE,CAAA;AAEjC,eAAO,MAAM,OAAO,0BAA0B,CAAA;AAE9C,eAAO,MAAQ,SAAS,wFAAE,MAAM,oEAAE,SAAS,+DAAE,YAAY,wIAQvD,CAAA;AAEF,uFAAuF;AACvF,eAAO,MAAM,QAAQ,QAAO,MAAgE,CAAA"}
|