@wuapidev/cli 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.
- package/LICENSE +21 -0
- package/README.md +84 -0
- package/dist/args.d.ts +17 -0
- package/dist/args.d.ts.map +1 -0
- package/dist/args.js +96 -0
- package/dist/args.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +7 -0
- package/dist/cli.js.map +1 -0
- package/dist/context.d.ts +45 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +120 -0
- package/dist/context.js.map +1 -0
- package/dist/credentials.d.ts +31 -0
- package/dist/credentials.d.ts.map +1 -0
- package/dist/credentials.js +90 -0
- package/dist/credentials.js.map +1 -0
- package/dist/dialcodes.d.ts +5 -0
- package/dist/dialcodes.d.ts.map +1 -0
- package/dist/dialcodes.js +51 -0
- package/dist/dialcodes.js.map +1 -0
- package/dist/dispatch.d.ts +37 -0
- package/dist/dispatch.d.ts.map +1 -0
- package/dist/dispatch.js +225 -0
- package/dist/dispatch.js.map +1 -0
- package/dist/dotenv.d.ts +7 -0
- package/dist/dotenv.d.ts.map +1 -0
- package/dist/dotenv.js +67 -0
- package/dist/dotenv.js.map +1 -0
- package/dist/errors.d.ts +24 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +41 -0
- package/dist/errors.js.map +1 -0
- package/dist/files.d.ts +4 -0
- package/dist/files.d.ts.map +1 -0
- package/dist/files.js +35 -0
- package/dist/files.js.map +1 -0
- package/dist/generated/operations.d.ts +3 -0
- package/dist/generated/operations.d.ts.map +1 -0
- package/dist/generated/operations.js +4462 -0
- package/dist/generated/operations.js.map +1 -0
- package/dist/help.d.ts +13 -0
- package/dist/help.d.ts.map +1 -0
- package/dist/help.js +176 -0
- package/dist/help.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/io.d.ts +35 -0
- package/dist/io.d.ts.map +1 -0
- package/dist/io.js +103 -0
- package/dist/io.js.map +1 -0
- package/dist/link.d.ts +26 -0
- package/dist/link.d.ts.map +1 -0
- package/dist/link.js +226 -0
- package/dist/link.js.map +1 -0
- package/dist/login.d.ts +30 -0
- package/dist/login.d.ts.map +1 -0
- package/dist/login.js +224 -0
- package/dist/login.js.map +1 -0
- package/dist/main.d.ts +3 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +88 -0
- package/dist/main.js.map +1 -0
- package/dist/mcp.d.ts +3 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +127 -0
- package/dist/mcp.js.map +1 -0
- package/dist/operation.d.ts +32 -0
- package/dist/operation.d.ts.map +1 -0
- package/dist/operation.js +3 -0
- package/dist/operation.js.map +1 -0
- package/dist/paths.d.ts +12 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +27 -0
- package/dist/paths.js.map +1 -0
- package/dist/profiles.d.ts +6 -0
- package/dist/profiles.d.ts.map +1 -0
- package/dist/profiles.js +119 -0
- package/dist/profiles.js.map +1 -0
- package/dist/qr.d.ts +19 -0
- package/dist/qr.d.ts.map +1 -0
- package/dist/qr.js +198 -0
- package/dist/qr.js.map +1 -0
- package/dist/send.d.ts +3 -0
- package/dist/send.d.ts.map +1 -0
- package/dist/send.js +73 -0
- package/dist/send.js.map +1 -0
- package/dist/version.d.ts +3 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +3 -0
- package/dist/version.js.map +1 -0
- package/package.json +61 -0
package/dist/link.js
ADDED
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
// `wuapi link`: create an account (a WhatsApp number linked as a device), show
|
|
2
|
+
// its QR code or pairing code, and wait until it is `ready`. `wuapi wait`: the
|
|
3
|
+
// waiting half, for an account that already exists.
|
|
4
|
+
//
|
|
5
|
+
// Waiting polls GET /v1/accounts/{id} every 2 s, bounded by --timeout. A
|
|
6
|
+
// failed poll (network drop, timeout, 5xx) is retried on the next tick; only a
|
|
7
|
+
// terminal state (failed, logged out, link timeout, ...) or the deadline ends it.
|
|
8
|
+
import { writeFileSync } from "node:fs";
|
|
9
|
+
import { tmpdir } from "node:os";
|
|
10
|
+
import { join } from "node:path";
|
|
11
|
+
import { randomUUID } from "node:crypto";
|
|
12
|
+
import { WuapiError } from "@wuapidev/sdk";
|
|
13
|
+
import { allowOnly, boolFlag, numberFlag, stringFlag } from "./args.js";
|
|
14
|
+
import { emit, log, makeClient } from "./context.js";
|
|
15
|
+
import { countryFromPhone, normalizePhone } from "./dialcodes.js";
|
|
16
|
+
import { CliError, usage } from "./errors.js";
|
|
17
|
+
import { qrToTerminal, pngFromDataUrl } from "./qr.js";
|
|
18
|
+
const POLL_MS = 2_000;
|
|
19
|
+
const LINK_PATH = "WhatsApp > Settings > Linked devices > Link a device";
|
|
20
|
+
/** Reasons an account does not come back from on its own within a wait. */
|
|
21
|
+
const TERMINAL_REASONS = new Set(["logged_out", "link_timeout", "free_limit_reached", "proxy_paused", "temporary_ban", "activation_required"]);
|
|
22
|
+
/** Worth another poll: the network, a timeout, rate limiting or a server error. */
|
|
23
|
+
export function isTransient(e) {
|
|
24
|
+
if (!(e instanceof WuapiError))
|
|
25
|
+
return false;
|
|
26
|
+
return e.status === 0 ? e.code === "network_error" || e.code === "timeout" : e.status === 429 || e.status >= 500;
|
|
27
|
+
}
|
|
28
|
+
function terminal(account) {
|
|
29
|
+
if (account.status === "failed") {
|
|
30
|
+
return new CliError("account_failed", `Account ${account.id} failed${account.lastError ? `: ${account.lastError}` : ""}. Run \`wuapi accounts reconnect ${account.id}\` to start over.`, {
|
|
31
|
+
details: { accountId: account.id, status: account.status, lastError: account.lastError },
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
if (account.status === "disconnected" && !account.reconnecting && account.disconnectReason && TERMINAL_REASONS.has(account.disconnectReason)) {
|
|
35
|
+
const hint = account.disconnectReason === "link_timeout"
|
|
36
|
+
? ` Run \`wuapi accounts reconnect ${account.id}\` for a new code.`
|
|
37
|
+
: account.disconnectReason === "logged_out"
|
|
38
|
+
? " The phone removed this linked device."
|
|
39
|
+
: "";
|
|
40
|
+
return new CliError(`account_${account.disconnectReason}`, `Account ${account.id} is disconnected (${account.disconnectReason}).${hint}`, {
|
|
41
|
+
details: { accountId: account.id, status: account.status, disconnectReason: account.disconnectReason },
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
return undefined;
|
|
45
|
+
}
|
|
46
|
+
function qrFiles(accountId) {
|
|
47
|
+
const safe = accountId.replace(/[^A-Za-z0-9_-]/g, "");
|
|
48
|
+
return { png: join(tmpdir(), `wuapi-qr-${safe}.png`), html: join(tmpdir(), `wuapi-qr-${safe}.html`) };
|
|
49
|
+
}
|
|
50
|
+
function writeQrFiles(accountId, dataUrl, linked = false) {
|
|
51
|
+
const files = qrFiles(accountId);
|
|
52
|
+
if (!linked)
|
|
53
|
+
writeFileSync(files.png, pngFromDataUrl(dataUrl));
|
|
54
|
+
// The page reloads itself, so it always shows the newest code.
|
|
55
|
+
const body = linked
|
|
56
|
+
? "<h1>Linked</h1><p>The number is linked. You can close this tab.</p>"
|
|
57
|
+
: `<h1>Scan with WhatsApp</h1><p>${LINK_PATH}. The code refreshes on its own.</p><img src="${files.png.split(/[\\/]/).pop()}?t=${Date.now()}" width="320" height="320" alt="QR code">`;
|
|
58
|
+
writeFileSync(files.html, `<!doctype html><meta charset="utf-8">${linked ? "" : '<meta http-equiv="refresh" content="3">'}<title>wuapi: link a number</title><body style="font-family:system-ui;text-align:center;padding:2rem">${body}</body>`);
|
|
59
|
+
return files;
|
|
60
|
+
}
|
|
61
|
+
function showCodes(ctx, account, shown, open) {
|
|
62
|
+
let changed = false;
|
|
63
|
+
if (account.status === "qr_ready" && account.qrCodeUrl && account.qrCodeUrl !== shown.qr) {
|
|
64
|
+
const first = shown.qr === null;
|
|
65
|
+
shown.qr = account.qrCodeUrl;
|
|
66
|
+
changed = true;
|
|
67
|
+
let files;
|
|
68
|
+
try {
|
|
69
|
+
files = writeQrFiles(account.id, account.qrCodeUrl);
|
|
70
|
+
shown.qrFile = files.png;
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
files = undefined;
|
|
74
|
+
}
|
|
75
|
+
if (open && files && !shown.opened) {
|
|
76
|
+
ctx.io.open(files.html);
|
|
77
|
+
shown.opened = true;
|
|
78
|
+
}
|
|
79
|
+
if (ctx.json) {
|
|
80
|
+
log(ctx, `wuapi: ${first ? "QR code ready" : "QR code refreshed"}${files ? `: ${files.png}` : ""}`);
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
const art = qrToTerminal(account.qrCodeUrl, ctx.io.stdoutIsTTY && !ctx.io.env.NO_COLOR);
|
|
84
|
+
ctx.io.out(`${first ? "" : "\nThe QR code refreshed:\n"}${art ?? `(Cannot draw the QR code here${files ? `; open ${files.png}` : ""}.)`}\n`);
|
|
85
|
+
if (first)
|
|
86
|
+
ctx.io.out(`Scan it: ${LINK_PATH}.${files && !open ? `\nOr open it in a browser: wuapi link --open, or ${files.html}` : ""}\n`);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
if (account.status !== "ready" && account.pairingCode && account.pairingCode !== shown.code) {
|
|
90
|
+
const first = shown.code === null;
|
|
91
|
+
shown.code = account.pairingCode;
|
|
92
|
+
changed = true;
|
|
93
|
+
if (ctx.json)
|
|
94
|
+
log(ctx, `wuapi: pairing code ${account.pairingCode}`);
|
|
95
|
+
else {
|
|
96
|
+
ctx.io.out(`${first ? "" : "\nNew pairing code (the last one expired):\n"}\n Pairing code: ${account.pairingCode}\n\n`);
|
|
97
|
+
if (first)
|
|
98
|
+
ctx.io.out(`On the phone: ${LINK_PATH} > Link with phone number instead, and type the code.\n`);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return changed;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Polls the account until it is ready (or, with `untilCode`, until it shows a
|
|
105
|
+
* QR code or pairing code), printing each new code. Bounded by `timeoutMs`.
|
|
106
|
+
*/
|
|
107
|
+
export async function waitForAccount(ctx, client, accountId, opts) {
|
|
108
|
+
const deadline = ctx.io.now() + opts.timeoutMs;
|
|
109
|
+
const shown = { qr: null, code: null, qrFile: null, opened: false };
|
|
110
|
+
let last;
|
|
111
|
+
let lastStatus = "";
|
|
112
|
+
let failures = 0;
|
|
113
|
+
for (;;) {
|
|
114
|
+
let account;
|
|
115
|
+
try {
|
|
116
|
+
account = await client.accounts.get(accountId);
|
|
117
|
+
failures = 0;
|
|
118
|
+
}
|
|
119
|
+
catch (e) {
|
|
120
|
+
if (!isTransient(e))
|
|
121
|
+
throw e;
|
|
122
|
+
failures++;
|
|
123
|
+
if (failures === 1 || failures % 10 === 0)
|
|
124
|
+
log(ctx, `wuapi: ${e.message} Retrying...`);
|
|
125
|
+
}
|
|
126
|
+
if (account) {
|
|
127
|
+
last = account;
|
|
128
|
+
if (account.status !== lastStatus) {
|
|
129
|
+
if (lastStatus && (ctx.json || !ctx.io.stdoutIsTTY || account.status !== "qr_ready"))
|
|
130
|
+
log(ctx, `wuapi: status ${account.status}`);
|
|
131
|
+
lastStatus = account.status;
|
|
132
|
+
}
|
|
133
|
+
if (account.status === "ready") {
|
|
134
|
+
if (shown.qr && shown.opened) {
|
|
135
|
+
try {
|
|
136
|
+
writeQrFiles(account.id, "", true);
|
|
137
|
+
}
|
|
138
|
+
catch {
|
|
139
|
+
// The page just keeps its last code.
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
return { account, shown };
|
|
143
|
+
}
|
|
144
|
+
const t = terminal(account);
|
|
145
|
+
if (t)
|
|
146
|
+
throw t;
|
|
147
|
+
const changed = showCodes(ctx, account, shown, opts.open ?? false);
|
|
148
|
+
if (opts.untilCode && (shown.qr || shown.code) && changed)
|
|
149
|
+
return { account, shown };
|
|
150
|
+
}
|
|
151
|
+
if (ctx.io.now() + POLL_MS > deadline) {
|
|
152
|
+
throw new CliError("wait_timeout", `Timed out waiting for account ${accountId}${last ? ` (status ${last.status})` : ""}. Run \`wuapi wait ${accountId}\` to keep waiting.`, { details: { accountId, status: last?.status ?? null } });
|
|
153
|
+
}
|
|
154
|
+
await ctx.io.sleep(POLL_MS);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
function readyText(account) {
|
|
158
|
+
return `Linked${account.phone ? ` ${account.phone}` : ""}${account.profileName ? ` (${account.profileName})` : ""}. Account ${account.id} is ready.`;
|
|
159
|
+
}
|
|
160
|
+
function readyJson(account) {
|
|
161
|
+
return { accountId: account.id, status: account.status, phone: account.phone, profileName: account.profileName, account };
|
|
162
|
+
}
|
|
163
|
+
export async function link(ctx) {
|
|
164
|
+
allowOnly(ctx.args, ["phone", "country", "city", "name", "open", "no-wait", "timeout"]);
|
|
165
|
+
if (ctx.args.positionals.length > 1)
|
|
166
|
+
throw usage("wuapi link takes flags only: wuapi link [--phone +E164] [--country XX] [--city name] [--name label]");
|
|
167
|
+
const phoneFlag = stringFlag(ctx.args, "phone");
|
|
168
|
+
const phone = phoneFlag === undefined ? undefined : normalizePhone(phoneFlag);
|
|
169
|
+
if (phoneFlag !== undefined && !phone)
|
|
170
|
+
throw usage("--phone must be a phone number in international format, like +584121234567.");
|
|
171
|
+
const countryFlag = stringFlag(ctx.args, "country");
|
|
172
|
+
if (countryFlag !== undefined && !/^[A-Za-z]{2}$/.test(countryFlag))
|
|
173
|
+
throw usage("--country must be a two-letter ISO code, like VE or US.");
|
|
174
|
+
const country = (countryFlag ?? (phone ? countryFromPhone(phone) : undefined))?.toUpperCase();
|
|
175
|
+
if (!country) {
|
|
176
|
+
throw new CliError("missing_country", phone
|
|
177
|
+
? `Cannot tell the country of ${phone}. Pass --country XX (ISO code), the country the number's traffic should exit from.`
|
|
178
|
+
: "Pass --country XX (ISO code, like VE or US): the number's own country, where its traffic exits from. Or pass --phone to link by pairing code; the country then defaults to the number's.", { exitCode: 2 });
|
|
179
|
+
}
|
|
180
|
+
const city = stringFlag(ctx.args, "city");
|
|
181
|
+
const name = stringFlag(ctx.args, "name");
|
|
182
|
+
const timeoutMs = numberFlag(ctx.args, "timeout", 300) * 1000;
|
|
183
|
+
const noWait = boolFlag(ctx.args, "no-wait");
|
|
184
|
+
const open = boolFlag(ctx.args, "open");
|
|
185
|
+
const client = makeClient(ctx);
|
|
186
|
+
// The proxy location: the country's biggest city, or the best match for --city.
|
|
187
|
+
const page = await client.proxyLocations.list(city ? { q: city, country, limit: 1 } : { country, limit: 1 }).page();
|
|
188
|
+
const location = page.items[0];
|
|
189
|
+
if (!location) {
|
|
190
|
+
throw new CliError("unsupported_proxy_location", city ? `No proxy location matches "${city}" in ${country}. See https://wuapi.dev/proxy-locations.` : `No proxy location in ${country}. See https://wuapi.dev/proxy-locations.`, { exitCode: 2 });
|
|
191
|
+
}
|
|
192
|
+
log(ctx, `wuapi: proxy location ${location.cityName}, ${location.countryName} (${location.country}/${location.city})`);
|
|
193
|
+
// One idempotency key for the create: the SDK's retries replay it instead of
|
|
194
|
+
// creating a second account.
|
|
195
|
+
const account = await client.accounts.create({
|
|
196
|
+
proxyLocation: { country: location.country, city: location.city },
|
|
197
|
+
...(name ? { name } : {}),
|
|
198
|
+
...(phone ? { pairingPhone: phone } : {}),
|
|
199
|
+
}, { idempotencyKey: randomUUID() });
|
|
200
|
+
log(ctx, `wuapi: created account ${account.id}`);
|
|
201
|
+
if (noWait) {
|
|
202
|
+
const { account: withCode, shown } = await waitForAccount(ctx, client, account.id, { timeoutMs, untilCode: true, open });
|
|
203
|
+
emit(ctx, {
|
|
204
|
+
accountId: withCode.id,
|
|
205
|
+
status: withCode.status,
|
|
206
|
+
...(withCode.pairingCode ? { pairingCode: withCode.pairingCode, pairingCodeExpiresAt: withCode.pairingCodeExpiresAt } : {}),
|
|
207
|
+
...(withCode.qrCodeUrl ? { qrCodeUrl: withCode.qrCodeUrl } : {}),
|
|
208
|
+
...(shown.qrFile ? { qrCodeFile: shown.qrFile } : {}),
|
|
209
|
+
}, () => withCode.status === "ready"
|
|
210
|
+
? readyText(withCode)
|
|
211
|
+
: `Account ${withCode.id} created. Codes rotate: run \`wuapi wait ${withCode.id}\` to show new ones and wait until it is linked.`);
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
const { account: ready } = await waitForAccount(ctx, client, account.id, { timeoutMs, open });
|
|
215
|
+
emit(ctx, readyJson(ready), () => readyText(ready));
|
|
216
|
+
}
|
|
217
|
+
export async function wait(ctx) {
|
|
218
|
+
allowOnly(ctx.args, ["timeout", "open"]);
|
|
219
|
+
const accountId = ctx.args.positionals[1];
|
|
220
|
+
if (!accountId || ctx.args.positionals.length > 2)
|
|
221
|
+
throw usage("Usage: wuapi wait <accountId> [--timeout 300]");
|
|
222
|
+
const client = makeClient(ctx);
|
|
223
|
+
const { account } = await waitForAccount(ctx, client, accountId, { timeoutMs: numberFlag(ctx.args, "timeout", 300) * 1000, open: boolFlag(ctx.args, "open") });
|
|
224
|
+
emit(ctx, readyJson(account), () => readyText(account));
|
|
225
|
+
}
|
|
226
|
+
//# sourceMappingURL=link.js.map
|
package/dist/link.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"link.js","sourceRoot":"","sources":["../src/link.ts"],"names":[],"mappings":"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"}
|
package/dist/login.d.ts
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { type Ctx } from "./context.js";
|
|
2
|
+
import { type Named } from "./credentials.js";
|
|
3
|
+
export interface DeviceCode {
|
|
4
|
+
deviceCode: string;
|
|
5
|
+
userCode: string;
|
|
6
|
+
verificationUri: string;
|
|
7
|
+
verificationUriComplete: string;
|
|
8
|
+
expiresIn: number;
|
|
9
|
+
interval: number;
|
|
10
|
+
}
|
|
11
|
+
export interface TokenGrant {
|
|
12
|
+
apiKey: string;
|
|
13
|
+
keyPrefix: string;
|
|
14
|
+
organization: Named;
|
|
15
|
+
project: Named | null;
|
|
16
|
+
}
|
|
17
|
+
/** POST /cli/device/code, retried a few times on network errors and 5xx. */
|
|
18
|
+
export declare function requestDeviceCode(ctx: Ctx, baseUrl: string): Promise<DeviceCode>;
|
|
19
|
+
/**
|
|
20
|
+
* Polls POST /cli/device/token every `interval` seconds until the person
|
|
21
|
+
* approves, denies, or the code expires. `slow_down` adds 5 s to the
|
|
22
|
+
* interval; network errors, timeouts, 429 and 5xx just wait for the next poll.
|
|
23
|
+
*/
|
|
24
|
+
export declare function pollForToken(ctx: Ctx, baseUrl: string, pending: {
|
|
25
|
+
deviceCode: string;
|
|
26
|
+
interval: number;
|
|
27
|
+
expiresAt: number;
|
|
28
|
+
}): Promise<TokenGrant>;
|
|
29
|
+
export declare function login(ctx: Ctx): Promise<void>;
|
|
30
|
+
//# sourceMappingURL=login.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../src/login.ts"],"names":[],"mappings":"AAOA,OAAO,EAOL,KAAK,GAAG,EACT,MAAM,cAAc,CAAC;AACtB,OAAO,EAA0D,KAAK,KAAK,EAAgB,MAAM,kBAAkB,CAAC;AASpH,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,uBAAuB,EAAE,MAAM,CAAC;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB;AASD,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,KAAK,CAAC;IACpB,OAAO,EAAE,KAAK,GAAG,IAAI,CAAC;CACvB;AA4CD,4EAA4E;AAC5E,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAsBtF;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,UAAU,CAAC,CAuCvJ;AAuDD,wBAAsB,KAAK,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CA0CnD"}
|
package/dist/login.js
ADDED
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
// `wuapi login`: the device authorization flow. The CLI asks the API for a
|
|
2
|
+
// code, the person approves it in the browser (signed in to wuapi), and the
|
|
3
|
+
// CLI polls until the API hands over a new API key, which is stored as a
|
|
4
|
+
// profile. Networks drop (mobile, residential): every request is bounded and a
|
|
5
|
+
// failed poll is simply retried until the code expires.
|
|
6
|
+
import { allowOnly, boolFlag, stringFlag } from "./args.js";
|
|
7
|
+
import { credsPath, emit, log, pendingPath, readCreds, resolveBaseUrl, } from "./context.js";
|
|
8
|
+
import { defaultProfileName, saveCredentials, uniqueProfileName } from "./credentials.js";
|
|
9
|
+
import { ensureGitignored, writeDotenvKey } from "./dotenv.js";
|
|
10
|
+
import { CliError, usage } from "./errors.js";
|
|
11
|
+
import { readJson, removeFile, writePrivateJson } from "./files.js";
|
|
12
|
+
import { DEFAULT_BASE_URL } from "@wuapidev/sdk";
|
|
13
|
+
import { VERSION } from "./version.js";
|
|
14
|
+
const REQUEST_TIMEOUT_MS = 15_000;
|
|
15
|
+
async function post(ctx, url, body) {
|
|
16
|
+
const controller = new AbortController();
|
|
17
|
+
const timer = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS);
|
|
18
|
+
try {
|
|
19
|
+
const res = await ctx.io.fetch(url, {
|
|
20
|
+
method: "POST",
|
|
21
|
+
headers: { "Content-Type": "application/json", Accept: "application/json", "User-Agent": `wuapi-cli/${VERSION}` },
|
|
22
|
+
body: JSON.stringify(body),
|
|
23
|
+
signal: controller.signal,
|
|
24
|
+
});
|
|
25
|
+
const text = await res.text();
|
|
26
|
+
let parsed = undefined;
|
|
27
|
+
try {
|
|
28
|
+
parsed = text ? JSON.parse(text) : undefined;
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
parsed = undefined;
|
|
32
|
+
}
|
|
33
|
+
return { kind: "response", status: res.status, body: parsed };
|
|
34
|
+
}
|
|
35
|
+
catch (e) {
|
|
36
|
+
const cause = e?.cause?.code;
|
|
37
|
+
const message = controller.signal.aborted ? "request timed out" : typeof cause === "string" ? cause : e instanceof Error ? e.message : String(e);
|
|
38
|
+
return { kind: "network", message };
|
|
39
|
+
}
|
|
40
|
+
finally {
|
|
41
|
+
clearTimeout(timer);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
function errorCode(body) {
|
|
45
|
+
const b = body;
|
|
46
|
+
if (typeof b?.error === "string")
|
|
47
|
+
return b.error;
|
|
48
|
+
if (typeof b?.error?.code === "string")
|
|
49
|
+
return b.error.code;
|
|
50
|
+
if (typeof b?.code === "string")
|
|
51
|
+
return b.code;
|
|
52
|
+
return undefined;
|
|
53
|
+
}
|
|
54
|
+
function isDeviceCode(v) {
|
|
55
|
+
const d = v;
|
|
56
|
+
return typeof d?.deviceCode === "string" && typeof d.userCode === "string" && typeof d.verificationUri === "string";
|
|
57
|
+
}
|
|
58
|
+
/** POST /cli/device/code, retried a few times on network errors and 5xx. */
|
|
59
|
+
export async function requestDeviceCode(ctx, baseUrl) {
|
|
60
|
+
const attempts = 4;
|
|
61
|
+
for (let i = 1;; i++) {
|
|
62
|
+
const r = await post(ctx, `${baseUrl}/cli/device/code`, { clientName: ctx.io.hostname });
|
|
63
|
+
if (r.kind === "response" && r.status >= 200 && r.status < 300 && isDeviceCode(r.body)) {
|
|
64
|
+
const d = r.body;
|
|
65
|
+
return {
|
|
66
|
+
...d,
|
|
67
|
+
verificationUriComplete: d.verificationUriComplete || d.verificationUri,
|
|
68
|
+
expiresIn: Number(d.expiresIn) > 0 ? Number(d.expiresIn) : 600,
|
|
69
|
+
interval: Number(d.interval) > 0 ? Number(d.interval) : 5,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
const retryable = r.kind === "network" || r.status >= 500;
|
|
73
|
+
if (!retryable || i >= attempts) {
|
|
74
|
+
if (r.kind === "network")
|
|
75
|
+
throw new CliError("network_error", `Could not reach ${baseUrl}: ${r.message}.`);
|
|
76
|
+
const message = r.body?.message;
|
|
77
|
+
throw new CliError(errorCode(r.body) ?? `http_${r.status}`, `Could not start the login: ${typeof message === "string" ? message : `HTTP ${r.status}`}`);
|
|
78
|
+
}
|
|
79
|
+
log(ctx, `wuapi: ${r.kind === "network" ? r.message : `HTTP ${r.status}`}; retrying...`);
|
|
80
|
+
await ctx.io.sleep(1000 * i);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Polls POST /cli/device/token every `interval` seconds until the person
|
|
85
|
+
* approves, denies, or the code expires. `slow_down` adds 5 s to the
|
|
86
|
+
* interval; network errors, timeouts, 429 and 5xx just wait for the next poll.
|
|
87
|
+
*/
|
|
88
|
+
export async function pollForToken(ctx, baseUrl, pending) {
|
|
89
|
+
let interval = Math.max(1, pending.interval);
|
|
90
|
+
let failures = 0;
|
|
91
|
+
for (;;) {
|
|
92
|
+
if (ctx.io.now() >= pending.expiresAt) {
|
|
93
|
+
throw new CliError("expired_token", "The login code expired before it was approved. Run `wuapi login` again.");
|
|
94
|
+
}
|
|
95
|
+
await ctx.io.sleep(interval * 1000);
|
|
96
|
+
const r = await post(ctx, `${baseUrl}/cli/device/token`, { deviceCode: pending.deviceCode });
|
|
97
|
+
if (r.kind === "network") {
|
|
98
|
+
failures++;
|
|
99
|
+
if (failures === 1 || failures % 5 === 0)
|
|
100
|
+
log(ctx, `wuapi: ${r.message}; still waiting...`);
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
if (r.status === 200) {
|
|
104
|
+
const g = r.body;
|
|
105
|
+
if (typeof g?.apiKey !== "string" || typeof g.organization?.id !== "string") {
|
|
106
|
+
throw new CliError("invalid_response", "The API answered the login with an unexpected body.");
|
|
107
|
+
}
|
|
108
|
+
return { apiKey: g.apiKey, keyPrefix: g.keyPrefix, organization: g.organization, project: g.project ?? null };
|
|
109
|
+
}
|
|
110
|
+
const code = errorCode(r.body);
|
|
111
|
+
if (r.status === 400 || r.status === 401 || r.status === 403) {
|
|
112
|
+
if (code === "authorization_pending")
|
|
113
|
+
continue;
|
|
114
|
+
if (code === "slow_down") {
|
|
115
|
+
interval += 5;
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
if (code === "expired_token")
|
|
119
|
+
throw new CliError("expired_token", "The login code expired before it was approved. Run `wuapi login` again.");
|
|
120
|
+
if (code === "access_denied")
|
|
121
|
+
throw new CliError("access_denied", "The login was denied in the browser.");
|
|
122
|
+
if (code === "invalid_grant")
|
|
123
|
+
throw new CliError("invalid_grant", "The login code is not valid (already used, or unknown). Run `wuapi login` again.");
|
|
124
|
+
}
|
|
125
|
+
if (r.status === 429 || r.status >= 500) {
|
|
126
|
+
failures++;
|
|
127
|
+
if (r.status === 429)
|
|
128
|
+
interval += 5;
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
throw new CliError(code ?? `http_${r.status}`, `The login failed (HTTP ${r.status}${code ? `, ${code}` : ""}).`);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
function codeText(code, finishHint) {
|
|
135
|
+
return [
|
|
136
|
+
"",
|
|
137
|
+
` Open: ${code.verificationUriComplete}`,
|
|
138
|
+
` Code: ${code.userCode}`,
|
|
139
|
+
"",
|
|
140
|
+
finishHint ? "Approve it in the browser, then run `wuapi login --finish`." : "Approve it in the browser to finish. Waiting...",
|
|
141
|
+
].join("\n");
|
|
142
|
+
}
|
|
143
|
+
/** Stores the new key as a profile (current), plus ./.env with --env. Never prints the key. */
|
|
144
|
+
function finish(ctx, baseUrl, grant) {
|
|
145
|
+
const creds = readCreds(ctx);
|
|
146
|
+
const profile = {
|
|
147
|
+
apiKey: grant.apiKey,
|
|
148
|
+
...(baseUrl !== DEFAULT_BASE_URL ? { baseUrl } : {}),
|
|
149
|
+
organization: { id: grant.organization.id, name: grant.organization.name },
|
|
150
|
+
project: grant.project ? { id: grant.project.id, name: grant.project.name } : null,
|
|
151
|
+
...(grant.keyPrefix ? { keyPrefix: grant.keyPrefix } : {}),
|
|
152
|
+
createdAt: new Date(ctx.io.now()).toISOString(),
|
|
153
|
+
};
|
|
154
|
+
const explicit = stringFlag(ctx.args, "profile");
|
|
155
|
+
const name = explicit ?? uniqueProfileName(creds, defaultProfileName(profile.organization, profile.project), profile);
|
|
156
|
+
creds.profiles[name] = profile;
|
|
157
|
+
creds.current = name;
|
|
158
|
+
saveCredentials(creds, credsPath(ctx));
|
|
159
|
+
let envFile;
|
|
160
|
+
let gitignored = false;
|
|
161
|
+
if (boolFlag(ctx.args, "env")) {
|
|
162
|
+
envFile = writeDotenvKey(ctx.io.cwd, grant.apiKey);
|
|
163
|
+
gitignored = ensureGitignored(ctx.io.cwd);
|
|
164
|
+
}
|
|
165
|
+
const where = profile.project ? `${profile.organization.name} / ${profile.project.name}` : profile.organization.name;
|
|
166
|
+
emit(ctx, {
|
|
167
|
+
profile: name,
|
|
168
|
+
organization: profile.organization,
|
|
169
|
+
project: profile.project,
|
|
170
|
+
keyPrefix: grant.keyPrefix ?? null,
|
|
171
|
+
credentialsPath: credsPath(ctx),
|
|
172
|
+
...(envFile ? { envFile } : {}),
|
|
173
|
+
}, () => [
|
|
174
|
+
`Logged in to ${where} (profile ${name}).`,
|
|
175
|
+
`Key ${grant.keyPrefix ?? ""}... saved to ${credsPath(ctx)}.`,
|
|
176
|
+
...(envFile ? [`WUAPI_API_KEY written to ${envFile}${gitignored ? " (.env added to .gitignore)" : ""}.`] : []),
|
|
177
|
+
].join("\n"));
|
|
178
|
+
}
|
|
179
|
+
export async function login(ctx) {
|
|
180
|
+
allowOnly(ctx.args, ["env", "no-browser", "start", "finish"]);
|
|
181
|
+
if (ctx.args.positionals.length > 1)
|
|
182
|
+
throw usage("wuapi login takes no arguments.");
|
|
183
|
+
const start = boolFlag(ctx.args, "start");
|
|
184
|
+
const fin = boolFlag(ctx.args, "finish");
|
|
185
|
+
if (start && fin)
|
|
186
|
+
throw usage("Use --start or --finish, not both.");
|
|
187
|
+
const path = pendingPath(ctx);
|
|
188
|
+
if (fin) {
|
|
189
|
+
const pending = readJson(path);
|
|
190
|
+
if (!pending?.deviceCode)
|
|
191
|
+
throw new CliError("no_pending_login", "No login is waiting. Run `wuapi login --start` first.");
|
|
192
|
+
if (ctx.io.now() >= pending.expiresAt) {
|
|
193
|
+
removeFile(path);
|
|
194
|
+
throw new CliError("expired_token", "The login code expired before it was approved. Run `wuapi login --start` again.");
|
|
195
|
+
}
|
|
196
|
+
log(ctx, `Waiting for approval of code ${pending.userCode} (${pending.verificationUriComplete})...`);
|
|
197
|
+
try {
|
|
198
|
+
const grant = await pollForToken(ctx, pending.baseUrl, pending);
|
|
199
|
+
removeFile(path);
|
|
200
|
+
finish(ctx, pending.baseUrl, grant);
|
|
201
|
+
}
|
|
202
|
+
catch (e) {
|
|
203
|
+
if (e instanceof CliError && ["expired_token", "access_denied", "invalid_grant"].includes(e.code))
|
|
204
|
+
removeFile(path);
|
|
205
|
+
throw e;
|
|
206
|
+
}
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
const baseUrl = resolveBaseUrl(ctx);
|
|
210
|
+
const code = await requestDeviceCode(ctx, baseUrl);
|
|
211
|
+
const expiresAt = ctx.io.now() + code.expiresIn * 1000;
|
|
212
|
+
if (!boolFlag(ctx.args, "no-browser"))
|
|
213
|
+
ctx.io.open(code.verificationUriComplete);
|
|
214
|
+
if (start) {
|
|
215
|
+
const pending = { ...code, baseUrl, expiresAt, createdAt: new Date(ctx.io.now()).toISOString() };
|
|
216
|
+
writePrivateJson(path, pending);
|
|
217
|
+
emit(ctx, { url: code.verificationUriComplete, code: code.userCode, expiresIn: code.expiresIn }, () => codeText(code, true));
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
log(ctx, codeText(code, false));
|
|
221
|
+
const grant = await pollForToken(ctx, baseUrl, { deviceCode: code.deviceCode, interval: code.interval, expiresAt });
|
|
222
|
+
finish(ctx, baseUrl, grant);
|
|
223
|
+
}
|
|
224
|
+
//# sourceMappingURL=login.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../src/login.ts"],"names":[],"mappings":"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"}
|
package/dist/main.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAuDlC,wBAAsB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAmBlE"}
|
package/dist/main.js
ADDED
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
// Routes a command line to its command. Returns the exit code; never exits.
|
|
2
|
+
import { parseArgs } from "./args.js";
|
|
3
|
+
import { makeCtx } from "./context.js";
|
|
4
|
+
import { dispatch, findOperation } from "./dispatch.js";
|
|
5
|
+
import { toErrorBody, usage } from "./errors.js";
|
|
6
|
+
import { help } from "./help.js";
|
|
7
|
+
import { link, wait } from "./link.js";
|
|
8
|
+
import { login } from "./login.js";
|
|
9
|
+
import { mcp } from "./mcp.js";
|
|
10
|
+
import { listProfiles, logout, switchProfile, whoami } from "./profiles.js";
|
|
11
|
+
import { send } from "./send.js";
|
|
12
|
+
import { VERSION } from "./version.js";
|
|
13
|
+
const COMMANDS = {
|
|
14
|
+
login,
|
|
15
|
+
logout,
|
|
16
|
+
whoami,
|
|
17
|
+
profiles: listProfiles,
|
|
18
|
+
switch: switchProfile,
|
|
19
|
+
link,
|
|
20
|
+
wait,
|
|
21
|
+
send,
|
|
22
|
+
mcp,
|
|
23
|
+
};
|
|
24
|
+
async function route(ctx) {
|
|
25
|
+
const { positionals, flags } = ctx.args;
|
|
26
|
+
if (flags.has("version") && positionals.length === 0) {
|
|
27
|
+
ctx.io.out(ctx.json ? `${JSON.stringify({ version: VERSION })}\n` : `${VERSION}\n`);
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
const [first, ...rest] = positionals;
|
|
31
|
+
if (first === undefined)
|
|
32
|
+
return help(ctx, [], findOperation);
|
|
33
|
+
if (first === "help")
|
|
34
|
+
return help(ctx, rest, findOperation);
|
|
35
|
+
// `wuapi profile list` is `wuapi profiles`.
|
|
36
|
+
if (first === "profile") {
|
|
37
|
+
if (rest[0] === "list" || rest.length === 0)
|
|
38
|
+
return listProfiles({ ...ctx, args: { ...ctx.args, positionals: ["profiles"] } });
|
|
39
|
+
if (rest[0] === "switch" || rest[0] === "use")
|
|
40
|
+
return switchProfile({ ...ctx, args: { ...ctx.args, positionals: ["switch", ...rest.slice(1)] } });
|
|
41
|
+
throw usage("Usage: wuapi profile list | wuapi switch <profile>");
|
|
42
|
+
}
|
|
43
|
+
const command = COMMANDS[first];
|
|
44
|
+
if (command) {
|
|
45
|
+
if (flags.has("help"))
|
|
46
|
+
return help(ctx, [first], findOperation);
|
|
47
|
+
return command(ctx);
|
|
48
|
+
}
|
|
49
|
+
const found = findOperation(positionals);
|
|
50
|
+
if (found.op) {
|
|
51
|
+
if (flags.has("help"))
|
|
52
|
+
return help(ctx, positionals.slice(0, found.used), findOperation);
|
|
53
|
+
return dispatch(ctx, found.op, positionals.slice(found.used));
|
|
54
|
+
}
|
|
55
|
+
if (found.resource) {
|
|
56
|
+
if (flags.has("help") || positionals.length === found.used)
|
|
57
|
+
return help(ctx, positionals.slice(0, found.used), findOperation);
|
|
58
|
+
throw usage(`Unknown method "${positionals[found.used]}". Run \`wuapi help ${positionals.slice(0, found.used).join(" ")}\`.`);
|
|
59
|
+
}
|
|
60
|
+
throw usage(`Unknown command "${first}". Run \`wuapi help\`.`);
|
|
61
|
+
}
|
|
62
|
+
export async function main(argv, io) {
|
|
63
|
+
let ctx;
|
|
64
|
+
try {
|
|
65
|
+
ctx = makeCtx(io, parseArgs(argv));
|
|
66
|
+
}
|
|
67
|
+
catch (e) {
|
|
68
|
+
const { body, exitCode } = toErrorBody(e);
|
|
69
|
+
if (argv.includes("--json"))
|
|
70
|
+
io.out(`${JSON.stringify({ error: body })}\n`);
|
|
71
|
+
else
|
|
72
|
+
io.err(`wuapi: ${body.message}\n`);
|
|
73
|
+
return exitCode;
|
|
74
|
+
}
|
|
75
|
+
try {
|
|
76
|
+
await route(ctx);
|
|
77
|
+
return 0;
|
|
78
|
+
}
|
|
79
|
+
catch (e) {
|
|
80
|
+
const { body, exitCode } = toErrorBody(e);
|
|
81
|
+
if (ctx.json)
|
|
82
|
+
io.out(`${JSON.stringify({ error: body }, null, 2)}\n`);
|
|
83
|
+
else
|
|
84
|
+
io.err(`wuapi: ${body.message}${body.code !== "usage" ? ` (${body.code})` : ""}\n`);
|
|
85
|
+
return exitCode;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=main.js.map
|
package/dist/main.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"AAOA,OAAO,EAAwB,KAAK,GAAG,EAAE,MAAM,cAAc,CAAC;AA+C9D,wBAAgB,GAAG,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,CAyElC"}
|