@wirecat/whatsapp-cli 0.0.0-stage → 0.1.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 (110) hide show
  1. package/LICENSE +204 -0
  2. package/README.md +282 -2
  3. package/dist/adapter/adapter.d.ts +9 -0
  4. package/dist/adapter/adapter.d.ts.map +1 -0
  5. package/dist/adapter/adapter.js +326 -0
  6. package/dist/adapter/adapter.js.map +1 -0
  7. package/dist/adapter/checks.d.ts +7 -0
  8. package/dist/adapter/checks.d.ts.map +1 -0
  9. package/dist/adapter/checks.js +3 -0
  10. package/dist/adapter/checks.js.map +1 -0
  11. package/dist/adapter/errors.d.ts +18 -0
  12. package/dist/adapter/errors.d.ts.map +1 -0
  13. package/dist/adapter/errors.js +40 -0
  14. package/dist/adapter/errors.js.map +1 -0
  15. package/dist/adapter/format-markdown.d.ts +8 -0
  16. package/dist/adapter/format-markdown.d.ts.map +1 -0
  17. package/dist/adapter/format-markdown.js +80 -0
  18. package/dist/adapter/format-markdown.js.map +1 -0
  19. package/dist/adapter/groups.d.ts +21 -0
  20. package/dist/adapter/groups.d.ts.map +1 -0
  21. package/dist/adapter/groups.js +210 -0
  22. package/dist/adapter/groups.js.map +1 -0
  23. package/dist/adapter/map.d.ts +9 -0
  24. package/dist/adapter/map.d.ts.map +1 -0
  25. package/dist/adapter/map.js +72 -0
  26. package/dist/adapter/map.js.map +1 -0
  27. package/dist/adapter/polls.d.ts +21 -0
  28. package/dist/adapter/polls.d.ts.map +1 -0
  29. package/dist/adapter/polls.js +103 -0
  30. package/dist/adapter/polls.js.map +1 -0
  31. package/dist/app.d.ts +6 -0
  32. package/dist/app.d.ts.map +1 -0
  33. package/dist/app.js +16 -0
  34. package/dist/app.js.map +1 -0
  35. package/dist/bin/wa.d.ts +3 -0
  36. package/dist/bin/wa.d.ts.map +1 -0
  37. package/dist/bin/wa.js +27 -0
  38. package/dist/bin/wa.js.map +1 -0
  39. package/dist/commands/answer.d.ts +7 -0
  40. package/dist/commands/answer.d.ts.map +1 -0
  41. package/dist/commands/answer.js +11 -0
  42. package/dist/commands/answer.js.map +1 -0
  43. package/dist/commands/session.d.ts +37 -0
  44. package/dist/commands/session.d.ts.map +1 -0
  45. package/dist/commands/session.js +202 -0
  46. package/dist/commands/session.js.map +1 -0
  47. package/dist/commands/setup.d.ts +3 -0
  48. package/dist/commands/setup.d.ts.map +1 -0
  49. package/dist/commands/setup.js +192 -0
  50. package/dist/commands/setup.js.map +1 -0
  51. package/dist/commands/update.d.ts +2 -0
  52. package/dist/commands/update.d.ts.map +1 -0
  53. package/dist/commands/update.js +36 -0
  54. package/dist/commands/update.js.map +1 -0
  55. package/dist/diagnose.d.ts +77 -0
  56. package/dist/diagnose.d.ts.map +1 -0
  57. package/dist/diagnose.js +84 -0
  58. package/dist/diagnose.js.map +1 -0
  59. package/dist/engine/contract.d.ts +617 -0
  60. package/dist/engine/contract.d.ts.map +1 -0
  61. package/dist/engine/contract.js +186 -0
  62. package/dist/engine/contract.js.map +1 -0
  63. package/dist/engine/events.d.ts +9 -0
  64. package/dist/engine/events.d.ts.map +1 -0
  65. package/dist/engine/events.js +23 -0
  66. package/dist/engine/events.js.map +1 -0
  67. package/dist/engine/go-engine.d.ts +23 -0
  68. package/dist/engine/go-engine.d.ts.map +1 -0
  69. package/dist/engine/go-engine.js +238 -0
  70. package/dist/engine/go-engine.js.map +1 -0
  71. package/dist/engine/groups.d.ts +159 -0
  72. package/dist/engine/groups.d.ts.map +1 -0
  73. package/dist/engine/groups.js +64 -0
  74. package/dist/engine/groups.js.map +1 -0
  75. package/dist/engine-binary.d.ts +5 -0
  76. package/dist/engine-binary.d.ts.map +1 -0
  77. package/dist/engine-binary.js +18 -0
  78. package/dist/engine-binary.js.map +1 -0
  79. package/dist/install/postinstall.d.ts +8 -0
  80. package/dist/install/postinstall.d.ts.map +1 -0
  81. package/dist/install/postinstall.js +62 -0
  82. package/dist/install/postinstall.js.map +1 -0
  83. package/dist/messenger.d.ts +64 -0
  84. package/dist/messenger.d.ts.map +1 -0
  85. package/dist/messenger.js +171 -0
  86. package/dist/messenger.js.map +1 -0
  87. package/dist/paths.d.ts +5 -0
  88. package/dist/paths.d.ts.map +1 -0
  89. package/dist/paths.js +7 -0
  90. package/dist/paths.js.map +1 -0
  91. package/dist/program.d.ts +8 -0
  92. package/dist/program.d.ts.map +1 -0
  93. package/dist/program.js +114 -0
  94. package/dist/program.js.map +1 -0
  95. package/dist/reasons.d.ts +4 -0
  96. package/dist/reasons.d.ts.map +1 -0
  97. package/dist/reasons.js +13 -0
  98. package/dist/reasons.js.map +1 -0
  99. package/dist/update.d.ts +8 -0
  100. package/dist/update.d.ts.map +1 -0
  101. package/dist/update.js +26 -0
  102. package/dist/update.js.map +1 -0
  103. package/dist/version.d.ts +2 -0
  104. package/dist/version.d.ts.map +1 -0
  105. package/dist/version.js +2 -0
  106. package/dist/version.js.map +1 -0
  107. package/install/postinstall.mjs +3 -0
  108. package/install/windows.ps1 +161 -0
  109. package/package.json +89 -4
  110. package/skills/whatsapp-cli/SKILL.md +290 -0
@@ -0,0 +1,84 @@
1
+ import { accessSync, closeSync, constants, existsSync, openSync, readSync, statSync } from "node:fs";
2
+ import { dirname } from "node:path";
3
+ import { engineBinary } from "./engine-binary.js";
4
+ import { privateStore } from "./paths.js";
5
+ import { installer } from "./update.js";
6
+ const octal = (mode) => `0${mode.toString(8)}`;
7
+ /** Whether the engine binary is there to start — never started here. */
8
+ export const engineState = (env, update = {}) => {
9
+ const path = engineBinary(env);
10
+ try {
11
+ accessSync(path, constants.X_OK);
12
+ return { path, found: true };
13
+ }
14
+ catch {
15
+ const hint = installer(update) === "checkout"
16
+ ? "build it with `pnpm engine:build`"
17
+ : "reinstall wa, or set WA_ENGINE to the engine's path";
18
+ return { path, found: false, hint };
19
+ }
20
+ };
21
+ /** The device keys' file modes, from `stat` alone: the keys are a credential and are never opened here. */
22
+ export const deviceModes = (storePath, platform = process.platform) => {
23
+ if (platform === "win32")
24
+ return { checked: false, reason: "Windows has no Unix file modes" };
25
+ const wanted = [
26
+ ...[storePath, `${storePath}-wal`, `${storePath}-shm`].map((path) => [path, 0o600]),
27
+ [dirname(storePath), 0o700],
28
+ ];
29
+ const problems = wanted.flatMap(([path, want]) => {
30
+ if (!existsSync(path))
31
+ return [];
32
+ const mode = statSync(path).mode & 0o777;
33
+ if ((mode & 0o077) === 0)
34
+ return [];
35
+ return [
36
+ {
37
+ path,
38
+ mode: octal(mode),
39
+ want: octal(want),
40
+ fix: `chmod ${want.toString(8)} '${path.replaceAll("'", `'\\''`)}'`,
41
+ },
42
+ ];
43
+ });
44
+ return { checked: true, ok: problems.length === 0, problems };
45
+ };
46
+ const alive = (pid) => {
47
+ try {
48
+ process.kill(pid, 0);
49
+ return true;
50
+ }
51
+ catch (error) {
52
+ return error instanceof Error && "code" in error && error.code === "EPERM";
53
+ }
54
+ };
55
+ /**
56
+ * Who last held the device's lock, from the name the engine writes into it. The engine never clears that name, so
57
+ * the holder counts as running only while a process with its pid is.
58
+ */
59
+ export const lockState = (lockPath) => {
60
+ if (!existsSync(lockPath))
61
+ return { path: lockPath, holder: null, pid: null, running: false };
62
+ const buffer = Buffer.alloc(200);
63
+ const fd = openSync(lockPath, "r");
64
+ let read;
65
+ try {
66
+ read = readSync(fd, buffer, 0, buffer.length, 0);
67
+ }
68
+ finally {
69
+ closeSync(fd);
70
+ }
71
+ const holder = buffer.subarray(0, read).toString("utf8").split("\n")[0]?.trim() || null;
72
+ const pid = Number(/\(pid (\d+)\)$/.exec(holder ?? "")?.[1]) || null;
73
+ return { path: lockPath, holder, pid, running: pid !== null && alive(pid) };
74
+ };
75
+ /** `doctor`'s WhatsApp block: the engine, the device keys and the lock, read from disk without starting anything. */
76
+ export const diagnoseWhatsApp = (profile, env, update) => {
77
+ const store = privateStore(profile, env);
78
+ return {
79
+ engine: engineState(env, update),
80
+ device: { path: store, exists: existsSync(store), files: deviceModes(store) },
81
+ lock: lockState(`${store}.lock`),
82
+ };
83
+ };
84
+ //# sourceMappingURL=diagnose.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnose.js","sourceRoot":"","sources":["../src/diagnose.ts"],"names":[],"mappings":"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"}