@cleanslop/cli 0.1.0-beta.2 → 0.1.0-beta.20
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/README.md +5 -4
- package/assets/skill-core.md +25 -7
- package/dist/action.d.ts +4 -1
- package/dist/action.js +24 -0
- package/dist/action.js.map +1 -1
- package/dist/args.d.ts +1 -1
- package/dist/args.js +31 -9
- package/dist/args.js.map +1 -1
- package/dist/commands/credits.d.ts +30 -1
- package/dist/commands/credits.js +302 -43
- package/dist/commands/credits.js.map +1 -1
- package/dist/commands/email.js +22 -0
- package/dist/commands/email.js.map +1 -1
- package/dist/commands/link-login.js +4 -4
- package/dist/commands/link-login.js.map +1 -1
- package/dist/commands/login.d.ts +1 -0
- package/dist/commands/login.js +22 -8
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/logout.d.ts +2 -1
- package/dist/commands/logout.js +48 -23
- package/dist/commands/logout.js.map +1 -1
- package/dist/commands/redeem.d.ts +7 -0
- package/dist/commands/redeem.js +33 -0
- package/dist/commands/redeem.js.map +1 -0
- package/dist/commands/scan-upload.js +48 -27
- package/dist/commands/scan-upload.js.map +1 -1
- package/dist/commands/scan.js +45 -4
- package/dist/commands/scan.js.map +1 -1
- package/dist/config.d.ts +3 -3
- package/dist/config.js +2 -2
- package/dist/config.js.map +1 -1
- package/dist/connect.d.ts +15 -0
- package/dist/connect.js +100 -0
- package/dist/connect.js.map +1 -0
- package/dist/credentials.d.ts +14 -0
- package/dist/credentials.js +25 -7
- package/dist/credentials.js.map +1 -1
- package/dist/done-question.d.ts +20 -0
- package/dist/done-question.js +25 -0
- package/dist/done-question.js.map +1 -0
- package/dist/exit.d.ts +29 -0
- package/dist/exit.js +12 -0
- package/dist/exit.js.map +1 -1
- package/dist/git.d.ts +8 -1
- package/dist/git.js +35 -1
- package/dist/git.js.map +1 -1
- package/dist/http.js +74 -4
- package/dist/http.js.map +1 -1
- package/dist/link.d.ts +45 -11
- package/dist/link.js +154 -43
- package/dist/link.js.map +1 -1
- package/dist/main.js +8 -3
- package/dist/main.js.map +1 -1
- package/dist/output.js +6 -1
- package/dist/output.js.map +1 -1
- package/dist/pack.d.ts +19 -3
- package/dist/pack.js +30 -2
- package/dist/pack.js.map +1 -1
- package/dist/skill.d.ts +1 -1
- package/dist/skill.js +2 -1
- package/dist/skill.js.map +1 -1
- package/dist/top-up.d.ts +8 -0
- package/dist/top-up.js +35 -0
- package/dist/top-up.js.map +1 -0
- package/dist/types.d.ts +18 -1
- package/package.json +1 -1
package/dist/commands/credits.js
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { writeAction } from "../action.js";
|
|
2
|
+
import { doneQuestion } from "../done-question.js";
|
|
2
3
|
import { asRecord, httpRequest, requireOk } from "../http.js";
|
|
3
|
-
import { createLinkSpendRequest, ensureLinkPaymentScope, retrieveLinkSpendRequest, retrieveSharedPaymentToken, } from "../link.js";
|
|
4
|
+
import { createLinkSpendRequest, ensureLinkPaymentScope, grantLinkPayments, linkAuthMode, linkSpendRequestTestMode, retrieveLinkSpendRequest, retrieveSharedPaymentToken, } from "../link.js";
|
|
4
5
|
import { deletePendingSpend, readPendingSpend, requireToken, resolveOrigin, writePendingSpend, } from "../credentials.js";
|
|
5
6
|
import { actionError, CliError, EXIT_OK, EXIT_PAYMENT, usageError, } from "../exit.js";
|
|
7
|
+
import { NOT_NOW, promoOffered, topUpQuestion, withPromoHint } from "../top-up.js";
|
|
6
8
|
const CREDIT_PACKS = {
|
|
7
9
|
p5: 5,
|
|
8
10
|
p15: 15,
|
|
@@ -17,10 +19,101 @@ function spendRequestContext(pack, scans) {
|
|
|
17
19
|
}
|
|
18
20
|
/** Fixed Link approval budget. Auto-buy ignores `scan --wait`. */
|
|
19
21
|
export const LINK_APPROVAL_WAIT_MS = 10 * 60 * 1000;
|
|
22
|
+
/**
|
|
23
|
+
* `--resume` budget. The human has usually approved already; anything longer
|
|
24
|
+
* would outlast an agent's foreground shell call.
|
|
25
|
+
*/
|
|
26
|
+
export const LINK_RESUME_WAIT_MS = 60 * 1000;
|
|
27
|
+
const BUY_COMMAND = "cleanslop credits buy --link";
|
|
28
|
+
/**
|
|
29
|
+
* How long to poll Link for approval. `--no-wait` checks once, `--resume`
|
|
30
|
+
* polls briefly, and the default (a human at a terminal) waits 10 minutes.
|
|
31
|
+
*/
|
|
20
32
|
export function linkApprovalWaitMs(args, opts = {}) {
|
|
21
33
|
if (opts.autoBuy)
|
|
22
34
|
return LINK_APPROVAL_WAIT_MS;
|
|
23
|
-
|
|
35
|
+
switch (linkAuthMode(args)) {
|
|
36
|
+
case "no-wait":
|
|
37
|
+
return 0;
|
|
38
|
+
case "resume":
|
|
39
|
+
return LINK_RESUME_WAIT_MS;
|
|
40
|
+
case "wait":
|
|
41
|
+
return args.wait ? args.waitMs : LINK_APPROVAL_WAIT_MS;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/** Cents to a display price, e.g. `5.00 USD`. */
|
|
45
|
+
export function formatPackPrice(amount, currency) {
|
|
46
|
+
return `${(amount / 100).toFixed(2)} ${currency.toUpperCase()}`;
|
|
47
|
+
}
|
|
48
|
+
/** `p15 (15 scans, 25.00 USD, 1.67 USD per scan, best value)`. */
|
|
49
|
+
export function describePackOffer(offer) {
|
|
50
|
+
const scans = CREDIT_PACKS[offer.pack];
|
|
51
|
+
const parts = [
|
|
52
|
+
`${scans} scans`,
|
|
53
|
+
formatPackPrice(offer.amount, offer.currency),
|
|
54
|
+
`${formatPackPrice(Math.round(offer.amount / scans), offer.currency)} per scan`,
|
|
55
|
+
];
|
|
56
|
+
if (offer.best)
|
|
57
|
+
parts.push("best value");
|
|
58
|
+
return `${offer.pack} (${parts.join(", ")})`;
|
|
59
|
+
}
|
|
60
|
+
const APPROVE_THEN_RESUME = `relay its approval prompt (Link notifies their Link app; there is usually no link), and after they approve run \`${BUY_COMMAND} --resume\`.`;
|
|
61
|
+
/** Asks the human to pick from every pack CleanSlop offers. */
|
|
62
|
+
function choosePackPrompt(offers, tail = "") {
|
|
63
|
+
const list = new Intl.ListFormat("en", { type: "disjunction" }).format(offers.map(describePackOffer));
|
|
64
|
+
return `Ask the human which CleanSlop credit pack to buy with Link: ${list}. If they pick one, run \`${BUY_COMMAND} --pack <pack> --no-wait\`, ${APPROVE_THEN_RESUME}${tail}`;
|
|
65
|
+
}
|
|
66
|
+
function buyCommand(pack) {
|
|
67
|
+
return `${BUY_COMMAND} --pack ${pack} --no-wait`;
|
|
68
|
+
}
|
|
69
|
+
function packOption(offer) {
|
|
70
|
+
const scans = CREDIT_PACKS[offer.pack];
|
|
71
|
+
const perScan = formatPackPrice(Math.round(offer.amount / scans), offer.currency);
|
|
72
|
+
return {
|
|
73
|
+
value: offer.pack,
|
|
74
|
+
label: `${scans} scans · ${formatPackPrice(offer.amount, offer.currency)}`,
|
|
75
|
+
description: `${perScan} per scan${offer.best ? ", best value" : ""}`,
|
|
76
|
+
run: buyCommand(offer.pack),
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
/** Every offered pack plus "Not now": at most four options. */
|
|
80
|
+
function packQuestion(offers, lead = "") {
|
|
81
|
+
return {
|
|
82
|
+
id: "link_credit_pack",
|
|
83
|
+
header: "Credits",
|
|
84
|
+
question: `${lead}Which CleanSlop credit pack should I buy with Link? You approve the payment in your Link app.`,
|
|
85
|
+
options: [...offers.map(packOption), NOT_NOW],
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* The "buy" answer beside a promo code: one named pack buys it; several run
|
|
90
|
+
* `credits buy` again with `--no-promo` so it asks only which pack.
|
|
91
|
+
*/
|
|
92
|
+
function buyOption(offers) {
|
|
93
|
+
const [only] = offers;
|
|
94
|
+
if (offers.length === 1 && only) {
|
|
95
|
+
return {
|
|
96
|
+
value: only.pack,
|
|
97
|
+
label: `Buy ${only.pack}`,
|
|
98
|
+
description: describePackOffer(only),
|
|
99
|
+
run: buyCommand(only.pack),
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
return {
|
|
103
|
+
value: "buy",
|
|
104
|
+
label: "Buy with Link",
|
|
105
|
+
description: offers.map(describePackOffer).join("; "),
|
|
106
|
+
run: `${BUY_COMMAND} --no-promo --no-wait`,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
/** Yes/no for one pack the human or the CLI already named. */
|
|
110
|
+
function buyPackQuestion(id, question, pack, label = `Buy ${pack}`) {
|
|
111
|
+
return {
|
|
112
|
+
id,
|
|
113
|
+
header: "Credits",
|
|
114
|
+
question,
|
|
115
|
+
options: [{ value: pack, label, run: buyCommand(pack) }, NOT_NOW],
|
|
116
|
+
};
|
|
24
117
|
}
|
|
25
118
|
function purchaseUrlFor(origin) {
|
|
26
119
|
return `${origin}/api/agent/v1/credits/purchases`;
|
|
@@ -47,15 +140,20 @@ function asStripeSptOffer(value) {
|
|
|
47
140
|
: "usd",
|
|
48
141
|
networkId,
|
|
49
142
|
purchaseUrl,
|
|
143
|
+
...(rec.best === true ? { best: true } : {}),
|
|
50
144
|
};
|
|
51
145
|
}
|
|
52
|
-
/**
|
|
53
|
-
export function
|
|
146
|
+
/** Every `stripe_spt` offer in a 402 `out_of_scans` body, in server order. */
|
|
147
|
+
export function stripeSptOffersFromErrorBody(json) {
|
|
54
148
|
const payment = asRecord(asRecord(json)?.payment);
|
|
55
149
|
const methods = Array.isArray(payment?.methods) ? payment.methods : [];
|
|
56
|
-
|
|
150
|
+
return methods
|
|
57
151
|
.map(asStripeSptOffer)
|
|
58
152
|
.filter((offer) => offer != null);
|
|
153
|
+
}
|
|
154
|
+
/** Read a matching `stripe_spt` offer from a 402 `out_of_scans` body. */
|
|
155
|
+
export function stripeSptOfferFromErrorBody(json, packHint) {
|
|
156
|
+
const offers = stripeSptOffersFromErrorBody(json);
|
|
59
157
|
if (offers.length === 0)
|
|
60
158
|
return null;
|
|
61
159
|
const wanted = packHint && isCreditPackId(packHint) ? packHint : "p5";
|
|
@@ -71,26 +169,84 @@ function tokenMissingAction(spendRequestId) {
|
|
|
71
169
|
async function persistPending(deps, pending) {
|
|
72
170
|
await writePendingSpend(deps, pending);
|
|
73
171
|
}
|
|
74
|
-
|
|
172
|
+
/**
|
|
173
|
+
* Tells the server (billing Slack) about a spend-request transition it cannot
|
|
174
|
+
* see. Once per event per request; a network error or an older server that
|
|
175
|
+
* 404s never blocks the purchase. Call before deleting the pending file.
|
|
176
|
+
*/
|
|
177
|
+
async function reportSpendRequest(deps, token, pending, event) {
|
|
178
|
+
if (pending.reported?.includes(event))
|
|
179
|
+
return;
|
|
180
|
+
try {
|
|
181
|
+
await httpRequest(deps, pending.origin, "POST", "/api/agent/v1/credits/spend-requests", {
|
|
182
|
+
token,
|
|
183
|
+
body: {
|
|
184
|
+
event,
|
|
185
|
+
spendRequestId: pending.spendRequestId,
|
|
186
|
+
pack: pending.pack,
|
|
187
|
+
amount: pending.amount,
|
|
188
|
+
currency: pending.currency,
|
|
189
|
+
testMode: pending.testMode === true,
|
|
190
|
+
ageMs: Math.max(0, deps.clock.now() - pending.createdAt),
|
|
191
|
+
},
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
catch {
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
pending.reported = [...(pending.reported ?? []), event];
|
|
198
|
+
await persistPending(deps, pending);
|
|
199
|
+
}
|
|
200
|
+
/** link-cli 0.27 prints no approval page for live requests; Link notifies the app. */
|
|
201
|
+
const IN_LINK_APP = "in their Link app (Link sends them a notification; there is no link to open)";
|
|
202
|
+
/** Approving in Link, then `--resume`; "Not now" leaves the request pending. */
|
|
203
|
+
function paymentApprovalQuestion(what, approvalUrl) {
|
|
204
|
+
const where = approvalUrl
|
|
205
|
+
? `Open ${approvalUrl} and approve ${what}.`
|
|
206
|
+
: `Approve ${what} in your Link app (Link sends you a notification).`;
|
|
207
|
+
return doneQuestion({
|
|
208
|
+
id: "link_payment_approval",
|
|
209
|
+
header: "Approve",
|
|
210
|
+
question: `${where} Done?`,
|
|
211
|
+
then: { run: `${BUY_COMMAND} --resume` },
|
|
212
|
+
notNow: "Nothing is charged unless you approve",
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
function notApprovedYet(pending) {
|
|
216
|
+
const where = pending.approvalUrl ? "in Link" : IN_LINK_APP;
|
|
217
|
+
return actionError("The Link payment is not approved yet.", {
|
|
218
|
+
kind: "approve",
|
|
219
|
+
humanPrompt: `Ask the human to approve this CleanSlop credit pack (${pending.pack}) ${where}. After they approve, run \`${BUY_COMMAND} --resume\`. Do not start a new purchase.`,
|
|
220
|
+
...(pending.approvalUrl ? { url: pending.approvalUrl } : {}),
|
|
221
|
+
question: paymentApprovalQuestion(`the CleanSlop credit pack (${pending.pack})`, pending.approvalUrl),
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
/** Checks the spend request at least once, then polls until `waitMs` runs out. */
|
|
225
|
+
async function pollUntilApproved(deps, token, pending, waitMs, onMissingScope) {
|
|
75
226
|
const deadline = deps.clock.now() + waitMs;
|
|
76
|
-
|
|
77
|
-
const snap = await retrieveLinkSpendRequest(deps, pending.spendRequestId
|
|
227
|
+
for (;;) {
|
|
228
|
+
const snap = await retrieveLinkSpendRequest(deps, pending.spendRequestId, {
|
|
229
|
+
testMode: pending.testMode,
|
|
230
|
+
onMissingScope,
|
|
231
|
+
});
|
|
78
232
|
switch (snap.status) {
|
|
79
233
|
case "approved":
|
|
234
|
+
await reportSpendRequest(deps, token, pending, "approved");
|
|
80
235
|
return;
|
|
81
236
|
case "denied":
|
|
82
237
|
case "expired":
|
|
83
238
|
case "canceled":
|
|
239
|
+
await reportSpendRequest(deps, token, pending, snap.status);
|
|
84
240
|
deletePendingSpend(deps);
|
|
85
241
|
throw actionError(`The Link spend request was ${snap.status}.`, {
|
|
86
242
|
kind: "ask_human",
|
|
87
|
-
humanPrompt: `The Link payment was ${snap.status}. Ask the person to
|
|
243
|
+
humanPrompt: `The Link payment was ${snap.status}. Ask the person whether to try again; if yes, run \`${BUY_COMMAND} --pack ${pending.pack} --no-wait\` for a new spend request.`,
|
|
244
|
+
question: buyPackQuestion("link_payment_retry", `The Link payment for ${pending.pack} was ${snap.status}. Try again with a new payment?`, pending.pack, "Try again"),
|
|
88
245
|
});
|
|
89
246
|
case "requires_action":
|
|
90
|
-
if (snap.resolution === "auto_resume")
|
|
91
|
-
await deps.clock.sleep(2000);
|
|
247
|
+
if (snap.resolution === "auto_resume")
|
|
92
248
|
break;
|
|
93
|
-
|
|
249
|
+
await reportSpendRequest(deps, token, pending, "requires_action");
|
|
94
250
|
deletePendingSpend(deps);
|
|
95
251
|
throw actionError(snap.displayMessage ?? "This spend request needs another approval step.", {
|
|
96
252
|
kind: "ask_human",
|
|
@@ -99,19 +255,16 @@ async function pollUntilApproved(deps, pending, waitMs) {
|
|
|
99
255
|
});
|
|
100
256
|
case "pending":
|
|
101
257
|
case "unknown":
|
|
102
|
-
await deps.clock.sleep(2000);
|
|
103
258
|
break;
|
|
104
259
|
default: {
|
|
105
260
|
const _exhaustive = snap.status;
|
|
106
261
|
throw _exhaustive;
|
|
107
262
|
}
|
|
108
263
|
}
|
|
264
|
+
if (deps.clock.now() >= deadline)
|
|
265
|
+
throw notApprovedYet(pending);
|
|
266
|
+
await deps.clock.sleep(2000);
|
|
109
267
|
}
|
|
110
|
-
throw actionError("Timed out waiting for Link payment approval.", {
|
|
111
|
-
kind: "ask_human",
|
|
112
|
-
humanPrompt: "The person has not approved the Link payment yet. Run `cleanslop credits buy --link --resume` after they approve it.",
|
|
113
|
-
code: pending.spendRequestId,
|
|
114
|
-
});
|
|
115
268
|
}
|
|
116
269
|
async function postPurchase(deps, origin, pending, token, sharedPaymentToken) {
|
|
117
270
|
const result = await httpRequest(deps, origin, "POST", "/api/agent/v1/credits/purchases", {
|
|
@@ -137,7 +290,50 @@ async function postPurchase(deps, origin, pending, token, sharedPaymentToken) {
|
|
|
137
290
|
const paymentIntentId = typeof rec?.paymentIntentId === "string" ? rec.paymentIntentId : null;
|
|
138
291
|
return { credits, pack, paymentIntentId };
|
|
139
292
|
}
|
|
293
|
+
/** Reads this grant's Link packs from `GET /credits/offers` (same shape as a 402). */
|
|
294
|
+
async function fetchStripeSptOffer(deps, origin, token, args) {
|
|
295
|
+
const packHint = args.pack;
|
|
296
|
+
const result = await httpRequest(deps, origin, "GET", "/api/agent/v1/credits/offers", {
|
|
297
|
+
token,
|
|
298
|
+
});
|
|
299
|
+
requireOk(result);
|
|
300
|
+
// An agent shell must not pick a pack for the human; a terminal keeps p5.
|
|
301
|
+
const offers = stripeSptOffersFromErrorBody(result.json);
|
|
302
|
+
const agentPicks = !packHint && !deps.io.stdinIsTTY;
|
|
303
|
+
// While a promo code is possible, ask buy-or-promo first (packs plus
|
|
304
|
+
// "Not now" already fill a question); "Buy" reruns with --no-promo.
|
|
305
|
+
if (agentPicks && !args.noPromo && offers.length > 0 && promoOffered(result.json)) {
|
|
306
|
+
throw actionError("Choose how to add scans.", {
|
|
307
|
+
kind: "ask_human",
|
|
308
|
+
humanPrompt: withPromoHint(choosePackPrompt(offers), true),
|
|
309
|
+
question: topUpQuestion(buyOption(offers), "This account can still use a CleanSlop promo code. How do you want to add scans?"),
|
|
310
|
+
});
|
|
311
|
+
}
|
|
312
|
+
if (agentPicks && offers.length > 1) {
|
|
313
|
+
throw actionError("Choose a Link credit pack.", {
|
|
314
|
+
kind: "ask_human",
|
|
315
|
+
humanPrompt: choosePackPrompt(offers),
|
|
316
|
+
question: packQuestion(offers),
|
|
317
|
+
});
|
|
318
|
+
}
|
|
319
|
+
const offer = stripeSptOfferFromErrorBody(result.json, packHint);
|
|
320
|
+
if (offer)
|
|
321
|
+
return offer;
|
|
322
|
+
const message = asRecord(asRecord(result.json)?.payment)?.message;
|
|
323
|
+
const text = typeof message === "string" && message.trim()
|
|
324
|
+
? message.trim()
|
|
325
|
+
: "Link credit packs are not available for this account.";
|
|
326
|
+
throw new CliError(text, EXIT_PAYMENT, { kind: "ask_human", humanPrompt: text });
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* Buys a Link credit pack. Default mode (a human at a terminal) creates the
|
|
330
|
+
* spend request and waits up to 10 minutes. `--no-wait` creates it (or checks
|
|
331
|
+
* the saved one), prints the approve block, and exits 10; `--resume` finishes
|
|
332
|
+
* the saved request. A saved request for this origin is always reused rather
|
|
333
|
+
* than replaced, so retries never send the person a second approval.
|
|
334
|
+
*/
|
|
140
335
|
export async function buyLinkCredits(deps, args, offer = null, opts = {}) {
|
|
336
|
+
const mode = linkAuthMode(args);
|
|
141
337
|
const origin = resolveOrigin(deps);
|
|
142
338
|
const stored = requireToken(deps, origin);
|
|
143
339
|
const storedPending = readPendingSpend(deps);
|
|
@@ -149,12 +345,6 @@ export async function buyLinkCredits(deps, args, offer = null, opts = {}) {
|
|
|
149
345
|
});
|
|
150
346
|
}
|
|
151
347
|
const resumeId = args.spendRequestId?.trim() || existing?.spendRequestId || null;
|
|
152
|
-
if (args.resume && !resumeId) {
|
|
153
|
-
throw actionError("No pending Link spend request to resume.", {
|
|
154
|
-
kind: "ask_human",
|
|
155
|
-
humanPrompt: "There is no pending spend request. Run `cleanslop credits buy --link --pack p5` after a scan 402, or resume the saved spend request.",
|
|
156
|
-
});
|
|
157
|
-
}
|
|
158
348
|
let pending;
|
|
159
349
|
if (resumeId) {
|
|
160
350
|
const fromStore = existing && existing.spendRequestId === resumeId ? existing : null;
|
|
@@ -174,30 +364,57 @@ export async function buyLinkCredits(deps, args, offer = null, opts = {}) {
|
|
|
174
364
|
"",
|
|
175
365
|
purchaseUrl: purchaseUrlFor(origin),
|
|
176
366
|
createdAt: fromStore?.createdAt ?? deps.clock.now(),
|
|
367
|
+
...(fromStore?.approvalUrl ? { approvalUrl: fromStore.approvalUrl } : {}),
|
|
368
|
+
...(Array.isArray(fromStore?.reported) ? { reported: fromStore.reported } : {}),
|
|
177
369
|
};
|
|
178
370
|
if (!pending.amount || !pending.networkId) {
|
|
179
371
|
throw usageError("Resuming a spend request still needs the saved pack price and network id.");
|
|
180
372
|
}
|
|
373
|
+
const testMode = linkSpendRequestTestMode(deps, pending.networkId);
|
|
374
|
+
// Older CLIs created live requests against test profiles. Link approves
|
|
375
|
+
// those but never issues a token, so --resume would wait forever.
|
|
376
|
+
const savedTestMode = fromStore?.testMode ??
|
|
377
|
+
(fromStore ? deps.env.get("CLEANSLOP_LINK_TEST")?.trim() === "1" : testMode);
|
|
378
|
+
if (savedTestMode !== testMode) {
|
|
379
|
+
deletePendingSpend(deps);
|
|
380
|
+
throw actionError("This Link spend request cannot be completed.", {
|
|
381
|
+
kind: "ask_human",
|
|
382
|
+
humanPrompt: `This Link payment was created in ${savedTestMode ? "test" : "live"} mode, but CleanSlop at ${origin} takes ${testMode ? "test" : "live"}-mode payments, so Link will never issue its token and no charge can go through. Tell the human they can cancel it in their Link app. Then run \`${BUY_COMMAND} --pack ${pending.pack} --no-wait\` for a new spend request.`,
|
|
383
|
+
question: buyPackQuestion("link_payment_restart", `Your earlier Link payment for ${pending.pack} cannot finish. After cancelling it in your Link app, start a new one?`, pending.pack, "Start a new payment"),
|
|
384
|
+
});
|
|
385
|
+
}
|
|
386
|
+
pending.testMode = testMode;
|
|
181
387
|
await persistPending(deps, pending);
|
|
388
|
+
// The session may have changed since the request was made (a new
|
|
389
|
+
// `login --link`, or `link-cli auth logout`), and retrieve needs payments.
|
|
390
|
+
await ensureLinkPaymentScope(deps, { mode, command: BUY_COMMAND });
|
|
182
391
|
}
|
|
183
392
|
else {
|
|
393
|
+
const chosen = offer ??
|
|
394
|
+
(args.amount == null
|
|
395
|
+
? await fetchStripeSptOffer(deps, origin, stored.token, args)
|
|
396
|
+
: null);
|
|
184
397
|
const pack = isCreditPackId(args.pack)
|
|
185
398
|
? args.pack
|
|
186
|
-
:
|
|
187
|
-
const amount = args.amount ??
|
|
399
|
+
: chosen?.pack ?? "p5";
|
|
400
|
+
const amount = args.amount ?? chosen?.amount ?? null;
|
|
188
401
|
const networkId = args.networkId?.trim() ||
|
|
189
402
|
deps.env.get("CLEANSLOP_STRIPE_PROFILE_ID")?.trim() ||
|
|
190
|
-
|
|
403
|
+
chosen?.networkId ||
|
|
191
404
|
"";
|
|
192
405
|
if (!amount) {
|
|
193
|
-
throw usageError("credits buy --link needs a
|
|
406
|
+
throw usageError("credits buy --link needs a pack price from CleanSlop or a test --amount");
|
|
194
407
|
}
|
|
195
408
|
if (!networkId) {
|
|
196
|
-
throw usageError("credits buy --link needs a
|
|
409
|
+
throw usageError("credits buy --link needs a Stripe network id from CleanSlop or CLEANSLOP_STRIPE_PROFILE_ID");
|
|
197
410
|
}
|
|
198
411
|
const scans = CREDIT_PACKS[pack];
|
|
199
|
-
const currency =
|
|
200
|
-
|
|
412
|
+
const currency = chosen?.currency ?? "usd";
|
|
413
|
+
const testMode = linkSpendRequestTestMode(deps, networkId);
|
|
414
|
+
await ensureLinkPaymentScope(deps, {
|
|
415
|
+
mode,
|
|
416
|
+
command: `${BUY_COMMAND} --pack ${pack}`,
|
|
417
|
+
});
|
|
201
418
|
const created = await createLinkSpendRequest(deps, {
|
|
202
419
|
networkId,
|
|
203
420
|
amount,
|
|
@@ -206,6 +423,7 @@ export async function buyLinkCredits(deps, args, offer = null, opts = {}) {
|
|
|
206
423
|
lineItem: `name:CleanSlop ${scans} scan credits,unit_amount:${amount},quantity:1`,
|
|
207
424
|
total: `type:total,display_text:Total,amount:${amount}`,
|
|
208
425
|
idempotencyKey: deps.randomId(),
|
|
426
|
+
testMode,
|
|
209
427
|
});
|
|
210
428
|
pending = {
|
|
211
429
|
version: 1,
|
|
@@ -217,24 +435,40 @@ export async function buyLinkCredits(deps, args, offer = null, opts = {}) {
|
|
|
217
435
|
networkId,
|
|
218
436
|
purchaseUrl: purchaseUrlFor(origin),
|
|
219
437
|
createdAt: deps.clock.now(),
|
|
438
|
+
...(created.approvalUrl ? { approvalUrl: created.approvalUrl } : {}),
|
|
439
|
+
testMode,
|
|
220
440
|
};
|
|
221
441
|
await persistPending(deps, pending);
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
442
|
+
await reportSpendRequest(deps, stored.token, pending, "created");
|
|
443
|
+
const price = formatPackPrice(amount, currency);
|
|
444
|
+
const ask = created.approvalUrl
|
|
445
|
+
? `Ask the human to open this link and approve this CleanSlop credit pack (${pack}: ${scans} scans for ${price}). Link may also send a notification.`
|
|
446
|
+
: `Ask the human to approve this CleanSlop credit pack (${pack}: ${scans} scans for ${price}) ${IN_LINK_APP}.`;
|
|
447
|
+
const url = created.approvalUrl ? { url: created.approvalUrl } : {};
|
|
448
|
+
if (mode !== "wait") {
|
|
449
|
+
throw actionError("Link payment approval pending.", {
|
|
225
450
|
kind: "approve",
|
|
226
|
-
humanPrompt:
|
|
227
|
-
url
|
|
451
|
+
humanPrompt: `${ask} After they approve, run \`${BUY_COMMAND} --resume\`.`,
|
|
452
|
+
...url,
|
|
453
|
+
question: paymentApprovalQuestion(`the CleanSlop credit pack (${pack}: ${scans} scans for ${price})`, created.approvalUrl),
|
|
228
454
|
});
|
|
229
455
|
}
|
|
230
|
-
|
|
231
|
-
deps.io.stderr(`${packLine}\n`);
|
|
232
|
-
}
|
|
456
|
+
writeAction(deps, { kind: "approve", humanPrompt: `${ask} Waiting for approval.`, ...url });
|
|
233
457
|
}
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
458
|
+
// Link refuses retrieve without the payment scope even when `auth status`
|
|
459
|
+
// did not report the session's scopes: upgrade once, then retry.
|
|
460
|
+
let regranted = false;
|
|
461
|
+
const onMissingScope = async () => {
|
|
462
|
+
if (regranted)
|
|
463
|
+
return false;
|
|
464
|
+
regranted = true;
|
|
465
|
+
await grantLinkPayments(deps, { mode, command: BUY_COMMAND });
|
|
466
|
+
return true;
|
|
467
|
+
};
|
|
468
|
+
await pollUntilApproved(deps, stored.token, pending, linkApprovalWaitMs(args, opts), onMissingScope);
|
|
469
|
+
const sharedPaymentToken = await retrieveSharedPaymentToken(deps, pending.spendRequestId, { testMode: pending.testMode, onMissingScope });
|
|
237
470
|
if (!sharedPaymentToken) {
|
|
471
|
+
await reportSpendRequest(deps, stored.token, pending, "token_missing");
|
|
238
472
|
tokenMissingAction(pending.spendRequestId);
|
|
239
473
|
}
|
|
240
474
|
const paid = await postPurchase(deps, origin, pending, stored.token, sharedPaymentToken);
|
|
@@ -254,13 +488,38 @@ export async function runCredits(deps, args) {
|
|
|
254
488
|
}
|
|
255
489
|
return buyLinkCredits(deps, args);
|
|
256
490
|
}
|
|
257
|
-
/**
|
|
491
|
+
/**
|
|
492
|
+
* If a scan 402 offers `stripe_spt`: a human at a terminal buys that pack in
|
|
493
|
+
* place and the scan retries once. An agent (no TTY) gets a top-up block that
|
|
494
|
+
* sends it through `credits buy --link --no-wait` / `--resume`, because a
|
|
495
|
+
* 10-minute approval wait outlasts its shell call.
|
|
496
|
+
*/
|
|
258
497
|
export async function recoverOutOfScansIfOffered(deps, args, result, retry) {
|
|
259
498
|
if (result.status !== 402)
|
|
260
499
|
return result;
|
|
261
500
|
const offer = stripeSptOfferFromErrorBody(result.json, args.pack);
|
|
262
501
|
if (!offer)
|
|
263
502
|
return result;
|
|
503
|
+
if (!deps.io.stdinIsTTY) {
|
|
504
|
+
const tail = " Then rerun the scan.";
|
|
505
|
+
// An explicit --pack is the human's choice; otherwise offer every pack.
|
|
506
|
+
const named = args.pack === offer.pack;
|
|
507
|
+
const offers = stripeSptOffersFromErrorBody(result.json);
|
|
508
|
+
const promo = promoOffered(result.json);
|
|
509
|
+
throw new CliError("This account is out of scans.", EXIT_PAYMENT, {
|
|
510
|
+
kind: "top-up",
|
|
511
|
+
humanPrompt: withPromoHint(named
|
|
512
|
+
? `Ask the human whether to buy CleanSlop credit pack ${describePackOffer(offer)} with Link. If yes, run \`${BUY_COMMAND} --pack ${offer.pack} --no-wait\`, ${APPROVE_THEN_RESUME}${tail}`
|
|
513
|
+
: choosePackPrompt(offers, tail), promo),
|
|
514
|
+
// Three packs plus "Not now" already fill a question, so a possible
|
|
515
|
+
// promo code asks buy-or-promo first and `credits buy` asks the pack.
|
|
516
|
+
question: promo
|
|
517
|
+
? topUpQuestion(buyOption(named ? [offer] : offers))
|
|
518
|
+
: named
|
|
519
|
+
? buyPackQuestion("link_credit_pack", `This account is out of scans. Buy CleanSlop credit pack ${describePackOffer(offer)} with Link? You approve the payment in your Link app.`, offer.pack)
|
|
520
|
+
: packQuestion(offers, "This account is out of scans. "),
|
|
521
|
+
});
|
|
522
|
+
}
|
|
264
523
|
await buyLinkCredits(deps, args, offer, { autoBuy: true });
|
|
265
524
|
return retry();
|
|
266
525
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credits.js","sourceRoot":"","sources":["../../src/commands/credits.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"credits.js","sourceRoot":"","sources":["../../src/commands/credits.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/email.js
CHANGED
|
@@ -2,6 +2,26 @@ import { requireToken, resolveOrigin, peekStoredCreds } from "../credentials.js"
|
|
|
2
2
|
import { CliError, EXIT_ACTION, EXIT_OK, usageError } from "../exit.js";
|
|
3
3
|
import { httpRequest, requireOk } from "../http.js";
|
|
4
4
|
import { writeJson } from "../output.js";
|
|
5
|
+
function shellQuote(text) {
|
|
6
|
+
return `'${text.replace(/'/g, `'\\''`)}'`;
|
|
7
|
+
}
|
|
8
|
+
/** Yes runs `--consent` with the exact question; no stops. */
|
|
9
|
+
function emailQuestion(scanId, prompt) {
|
|
10
|
+
return {
|
|
11
|
+
id: "scan_email",
|
|
12
|
+
header: "Email",
|
|
13
|
+
question: prompt,
|
|
14
|
+
options: [
|
|
15
|
+
{
|
|
16
|
+
value: "granted",
|
|
17
|
+
label: "Yes",
|
|
18
|
+
description: "Email the report",
|
|
19
|
+
run: `cleanslop email ${scanId} --consent ${shellQuote(prompt)} --reply yes`,
|
|
20
|
+
},
|
|
21
|
+
{ value: "declined", label: "No", description: "Do not email it" },
|
|
22
|
+
],
|
|
23
|
+
};
|
|
24
|
+
}
|
|
5
25
|
function resolveScanId(deps, origin, id) {
|
|
6
26
|
if (id)
|
|
7
27
|
return id;
|
|
@@ -27,6 +47,8 @@ export async function runEmail(deps, args) {
|
|
|
27
47
|
throw new CliError("Ask the human the exact question above. If they agree, rerun with --consent quoting it.", EXIT_ACTION, {
|
|
28
48
|
kind: "ask_human",
|
|
29
49
|
humanPrompt: prompt,
|
|
50
|
+
// The server's question names a recipient; the fallback is not a question.
|
|
51
|
+
...(body.prompt ? { question: emailQuestion(scanId, body.prompt) } : {}),
|
|
30
52
|
});
|
|
31
53
|
}
|
|
32
54
|
const result = await httpRequest(deps, origin, "POST", `/api/agent/v1/scans/${encodeURIComponent(scanId)}/email`, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"email.js","sourceRoot":"","sources":["../../src/commands/email.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEjF,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE,UAAU,
|
|
1
|
+
{"version":3,"file":"email.js","sourceRoot":"","sources":["../../src/commands/email.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import { CLIENT_ID, TERMS_UPDATED_ON } from "../config.js";
|
|
2
|
+
import { offerGithubAfterLinkFailure } from "../connect.js";
|
|
2
3
|
import { resolveOrigin, storeToken } from "../credentials.js";
|
|
3
4
|
import { CliError, EXIT_OK, EXIT_POLICY, EXIT_UNEXPECTED } from "../exit.js";
|
|
4
5
|
import { asErrorBody, hasIdentityPresentationChallenge, httpRequest, throwHttpError, } from "../http.js";
|
|
5
|
-
import {
|
|
6
|
+
import { linkAttestation, linkAuthMode, linkSignupBody, presentLinkIdentity, readLinkClaimsChallenge, requireLinkSignupConsent, } from "../link.js";
|
|
6
7
|
export async function runLinkLogin(deps, args) {
|
|
7
8
|
const authMode = linkAuthMode(args);
|
|
8
9
|
const origin = resolveOrigin(deps);
|
|
9
10
|
const consentSource = await requireLinkSignupConsent(deps, args, origin);
|
|
10
|
-
await
|
|
11
|
-
const attestation = await popAttestation(deps);
|
|
11
|
+
const attestation = await linkAttestation(deps, { mode: authMode }).catch(offerGithubAfterLinkFailure);
|
|
12
12
|
const started = await httpRequest(deps, origin, "POST", "/oauth/link", {
|
|
13
13
|
headers: { Authorization: attestation.authorization },
|
|
14
14
|
body: linkSignupBody(deps, TERMS_UPDATED_ON, consentSource),
|
|
@@ -20,7 +20,7 @@ export async function runLinkLogin(deps, args) {
|
|
|
20
20
|
const presented = await presentLinkIdentity(deps, {
|
|
21
21
|
aud: challenge.aud,
|
|
22
22
|
nonce: challenge.nonce,
|
|
23
|
-
});
|
|
23
|
+
}).catch(offerGithubAfterLinkFailure);
|
|
24
24
|
const completed = await httpRequest(deps, origin, "POST", "/oauth/link", {
|
|
25
25
|
headers: {
|
|
26
26
|
Authorization: attestation.authorization,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"link-login.js","sourceRoot":"","sources":["../../src/commands/link-login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE9D,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7E,OAAO,EACL,WAAW,EACX,gCAAgC,EAChC,WAAW,EACX,cAAc,GACf,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,
|
|
1
|
+
{"version":3,"file":"link-login.js","sourceRoot":"","sources":["../../src/commands/link-login.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/login.d.ts
CHANGED
|
@@ -3,4 +3,5 @@ import type { ParsedArgs } from "../types.js";
|
|
|
3
3
|
/** Matches server DEVICE_EXTEND_TTL_MS — first /connect view extends the code. */
|
|
4
4
|
export declare const DEVICE_POLL_GRACE_MS: number;
|
|
5
5
|
export declare function devicePollDeadline(expiresAt: number): number;
|
|
6
|
+
export declare const GITHUB_RESUME_COMMAND = "cleanslop login --resume";
|
|
6
7
|
export declare function runLogin(deps: CliDeps, args: ParsedArgs): Promise<number>;
|