@cleanslop/cli 0.0.0-stage → 0.1.0-beta.1.2

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 (96) hide show
  1. package/README.md +86 -2
  2. package/assets/skill-core.md +62 -0
  3. package/dist/action.d.ts +5 -0
  4. package/dist/action.js +22 -0
  5. package/dist/action.js.map +1 -0
  6. package/dist/args.d.ts +4 -0
  7. package/dist/args.js +243 -0
  8. package/dist/args.js.map +1 -0
  9. package/dist/commands/credits.d.ts +29 -0
  10. package/dist/commands/credits.js +267 -0
  11. package/dist/commands/credits.js.map +1 -0
  12. package/dist/commands/email.d.ts +3 -0
  13. package/dist/commands/email.js +51 -0
  14. package/dist/commands/email.js.map +1 -0
  15. package/dist/commands/link-identity.d.ts +3 -0
  16. package/dist/commands/link-identity.js +37 -0
  17. package/dist/commands/link-identity.js.map +1 -0
  18. package/dist/commands/link-login.d.ts +3 -0
  19. package/dist/commands/link-login.js +63 -0
  20. package/dist/commands/link-login.js.map +1 -0
  21. package/dist/commands/login.d.ts +6 -0
  22. package/dist/commands/login.js +198 -0
  23. package/dist/commands/login.js.map +1 -0
  24. package/dist/commands/logout.d.ts +2 -0
  25. package/dist/commands/logout.js +40 -0
  26. package/dist/commands/logout.js.map +1 -0
  27. package/dist/commands/report.d.ts +8 -0
  28. package/dist/commands/report.js +55 -0
  29. package/dist/commands/report.js.map +1 -0
  30. package/dist/commands/scan-upload.d.ts +3 -0
  31. package/dist/commands/scan-upload.js +85 -0
  32. package/dist/commands/scan-upload.js.map +1 -0
  33. package/dist/commands/scan.d.ts +3 -0
  34. package/dist/commands/scan.js +81 -0
  35. package/dist/commands/scan.js.map +1 -0
  36. package/dist/commands/setup.d.ts +19 -0
  37. package/dist/commands/setup.js +154 -0
  38. package/dist/commands/setup.js.map +1 -0
  39. package/dist/commands/status.d.ts +3 -0
  40. package/dist/commands/status.js +29 -0
  41. package/dist/commands/status.js.map +1 -0
  42. package/dist/commands/whoami.d.ts +3 -0
  43. package/dist/commands/whoami.js +44 -0
  44. package/dist/commands/whoami.js.map +1 -0
  45. package/dist/config.d.ts +26 -0
  46. package/dist/config.js +46 -0
  47. package/dist/config.js.map +1 -0
  48. package/dist/credentials.d.ts +64 -0
  49. package/dist/credentials.js +220 -0
  50. package/dist/credentials.js.map +1 -0
  51. package/dist/deps.d.ts +58 -0
  52. package/dist/deps.js +148 -0
  53. package/dist/deps.js.map +1 -0
  54. package/dist/exit.d.ts +24 -0
  55. package/dist/exit.js +29 -0
  56. package/dist/exit.js.map +1 -0
  57. package/dist/git.d.ts +14 -0
  58. package/dist/git.js +161 -0
  59. package/dist/git.js.map +1 -0
  60. package/dist/http.d.ts +16 -0
  61. package/dist/http.js +210 -0
  62. package/dist/http.js.map +1 -0
  63. package/dist/index.d.ts +2 -0
  64. package/dist/index.js +10 -0
  65. package/dist/index.js.map +1 -0
  66. package/dist/link.d.ts +106 -0
  67. package/dist/link.js +650 -0
  68. package/dist/link.js.map +1 -0
  69. package/dist/main.d.ts +6 -0
  70. package/dist/main.js +75 -0
  71. package/dist/main.js.map +1 -0
  72. package/dist/mcp-config.d.ts +13 -0
  73. package/dist/mcp-config.js +65 -0
  74. package/dist/mcp-config.js.map +1 -0
  75. package/dist/output.d.ts +9 -0
  76. package/dist/output.js +65 -0
  77. package/dist/output.js.map +1 -0
  78. package/dist/pack.d.ts +30 -0
  79. package/dist/pack.js +283 -0
  80. package/dist/pack.js.map +1 -0
  81. package/dist/redact.d.ts +2 -0
  82. package/dist/redact.js +17 -0
  83. package/dist/redact.js.map +1 -0
  84. package/dist/skill.d.ts +10 -0
  85. package/dist/skill.js +110 -0
  86. package/dist/skill.js.map +1 -0
  87. package/dist/types.d.ts +144 -0
  88. package/dist/types.js +2 -0
  89. package/dist/types.js.map +1 -0
  90. package/dist/ustar.d.ts +7 -0
  91. package/dist/ustar.js +128 -0
  92. package/dist/ustar.js.map +1 -0
  93. package/dist/wait.d.ts +11 -0
  94. package/dist/wait.js +80 -0
  95. package/dist/wait.js.map +1 -0
  96. package/package.json +30 -4
package/dist/link.js ADDED
@@ -0,0 +1,650 @@
1
+ import { writeAction } from "./action.js";
2
+ import { CLIENT_ID, LINK_CLI_NPX_TIMEOUT_MS, LINK_CLI_PACKAGE, LINK_CLI_TIMEOUT_MS, } from "./config.js";
3
+ import { actionError, CliError, EXIT_ACTION, EXIT_UNEXPECTED, usageError, } from "./exit.js";
4
+ import { detectAgentHint } from "./git.js";
5
+ import { asRecord } from "./http.js";
6
+ import { redactSecrets } from "./redact.js";
7
+ const LINK_INSTALL_HINT = "Could not run Stripe's link-cli: it is not on PATH and npx is unavailable. Install Node.js (with npm) or set CLEANSLOP_LINK_CLI.";
8
+ const EMPTY_POOL_HINT = "Link did not issue agent attestations. Run `cleanslop login --link` again; if it repeats, contact CleanSlop support.";
9
+ const LINK_AUTH_CLIENT_NAME = "CleanSlop";
10
+ /**
11
+ * Spend-request / SPT grant. Login never requests this. `credits buy` adds it
12
+ * with `auth upgrade` (or `auth login` when there is no session yet).
13
+ */
14
+ export const LINK_PAYMENT_SCOPE = "payment_methods.agentic";
15
+ /**
16
+ * link-cli 0.27 defaults to `userinfo:read payment_methods.agentic` when
17
+ * `--scope` is omitted. Login must pass a non-empty non-payment scope.
18
+ * Email still comes from the identity presentation; we never call
19
+ * `user-info retrieve`.
20
+ */
21
+ export const LINK_LOGIN_SCOPE = "userinfo:read";
22
+ export const LINK_IDENTITY_CLAIMS = ["email", "email_verified"];
23
+ const LINK_AUTH_POLL_MS = 5_000;
24
+ const LINK_AUTH_WAIT_MS = 5 * 60_000;
25
+ const LINK_ATTESTATION_BATCH = "10";
26
+ const EMPTY_POOL_PATTERN = /pool is empty|ATTESTATION_POOL_EMPTY|no attestation/i;
27
+ const MISSING_CREDENTIAL_PATTERN = /no saved identity credential|no credential|not found|empty/i;
28
+ function linkEnv(deps) {
29
+ return {
30
+ ...process.env,
31
+ LINK_IDENTITY_COMMANDS: "1",
32
+ // link-cli's postinstall otherwise adds Stripe's payment skill to the
33
+ // person's agent setup when the npx fallback installs it.
34
+ LINK_CLI_SKIP_SKILL_INSTALL: "1",
35
+ PATH: deps.env.get("PATH") ?? process.env.PATH ?? "",
36
+ };
37
+ }
38
+ const PATH_LINK_CLI = { file: "link-cli", prefix: [] };
39
+ const NPX_LINK_CLI = {
40
+ file: "npx",
41
+ prefix: ["--yes", "--package", LINK_CLI_PACKAGE, "--", "link-cli"],
42
+ };
43
+ /** Per-run choice between `link-cli` on PATH and the pinned npx copy. */
44
+ const resolvedLinkCli = new WeakMap();
45
+ function execLinkCli(deps, cmd, args, timeout) {
46
+ return deps.execFile(cmd.file, [...cmd.prefix, ...args], {
47
+ // The first npx run downloads link-cli and its dependencies.
48
+ timeout: cmd === NPX_LINK_CLI ? Math.max(timeout, LINK_CLI_NPX_TIMEOUT_MS) : timeout,
49
+ env: linkEnv(deps),
50
+ });
51
+ }
52
+ /**
53
+ * `CLEANSLOP_LINK_CLI`, else `link-cli` on PATH, else the pinned
54
+ * `@stripe/link-cli` through npx, so `npx @cleanslop/cli` needs nothing else
55
+ * installed.
56
+ */
57
+ export async function runLinkCli(deps, args, opts = {}) {
58
+ const timeout = opts.timeout ?? LINK_CLI_TIMEOUT_MS;
59
+ const override = deps.env.get("CLEANSLOP_LINK_CLI")?.trim();
60
+ if (override) {
61
+ return execLinkCli(deps, { file: override, prefix: [] }, args, timeout);
62
+ }
63
+ const known = resolvedLinkCli.get(deps);
64
+ if (known)
65
+ return execLinkCli(deps, known, args, timeout);
66
+ const onPath = await execLinkCli(deps, PATH_LINK_CLI, args, timeout);
67
+ if (onPath.code !== 127) {
68
+ resolvedLinkCli.set(deps, PATH_LINK_CLI);
69
+ return onPath;
70
+ }
71
+ resolvedLinkCli.set(deps, NPX_LINK_CLI);
72
+ return execLinkCli(deps, NPX_LINK_CLI, args, timeout);
73
+ }
74
+ function throwLinkCliFailure(result, fallback) {
75
+ const detail = redactSecrets((result.stderr || result.stdout || "").trim());
76
+ if (result.code === 127) {
77
+ throw actionError(LINK_INSTALL_HINT, {
78
+ kind: "ask_human",
79
+ humanPrompt: LINK_INSTALL_HINT,
80
+ });
81
+ }
82
+ if (EMPTY_POOL_PATTERN.test(`${result.stderr} ${result.stdout}`)) {
83
+ throw actionError("Link did not issue agent attestations.", {
84
+ kind: "ask_human",
85
+ humanPrompt: EMPTY_POOL_HINT,
86
+ });
87
+ }
88
+ throw new CliError(detail || fallback, EXIT_ACTION);
89
+ }
90
+ function parseLinkJson(stdout) {
91
+ const trimmed = stdout.trim();
92
+ if (!trimmed)
93
+ return null;
94
+ try {
95
+ const parsed = JSON.parse(trimmed);
96
+ // Polling commands (`auth status`, `auth login`) print an array of snapshots.
97
+ return asRecord(Array.isArray(parsed) ? parsed[parsed.length - 1] : parsed);
98
+ }
99
+ catch {
100
+ return null;
101
+ }
102
+ }
103
+ export function linkScopeTokens(scope) {
104
+ if (typeof scope === "string") {
105
+ return scope.trim().split(/[\s,]+/).filter(Boolean);
106
+ }
107
+ if (Array.isArray(scope)) {
108
+ return scope.filter((item) => typeof item === "string" && item.trim() !== "");
109
+ }
110
+ return [];
111
+ }
112
+ /** Never relays `auth status` output: it carries a Link access-token prefix. */
113
+ async function readLinkSession(deps) {
114
+ const result = await runLinkCli(deps, ["auth", "status", "--format", "json"]);
115
+ if (!result.ok)
116
+ throwLinkCliFailure(result, "Could not check the Link session.");
117
+ const json = parseLinkJson(result.stdout);
118
+ const authenticated = json?.authenticated === true;
119
+ return {
120
+ authenticated,
121
+ hasPaymentScope: authenticated && linkScopeTokens(json?.scope).includes(LINK_PAYMENT_SCOPE),
122
+ };
123
+ }
124
+ export function linkAuthMode(args) {
125
+ if (args.noWait && args.resume) {
126
+ throw usageError("Use either --no-wait or --resume, not both.");
127
+ }
128
+ if (args.noWait)
129
+ return "no-wait";
130
+ return args.resume ? "resume" : "wait";
131
+ }
132
+ function linkAuthAsk(kind) {
133
+ switch (kind) {
134
+ case "login":
135
+ return "Ask the human to open this link and approve CleanSlop in the Link app (Link may also send a notification).";
136
+ case "upgrade":
137
+ return "Ask the human to open this link and allow CleanSlop to request Link payments (Link may also send a notification).";
138
+ default: {
139
+ const _exhaustive = kind;
140
+ return _exhaustive;
141
+ }
142
+ }
143
+ }
144
+ /**
145
+ * Starts a Link device approval (`auth login` or `auth upgrade`) and prints the
146
+ * approval link. `wait` then polls in-process; `no-wait` exits 10 so a
147
+ * foreground agent can relay the link, and `resume` polls the request
148
+ * link-cli already has pending without starting a new one.
149
+ */
150
+ async function completeLinkDeviceAuth(deps, opts) {
151
+ const { kind, scope, mode, command } = opts;
152
+ let approval = {};
153
+ if (mode !== "resume") {
154
+ const started = await runLinkCli(deps, [
155
+ "auth",
156
+ kind,
157
+ "--client-name",
158
+ LINK_AUTH_CLIENT_NAME,
159
+ "--scope",
160
+ scope,
161
+ "--format",
162
+ "json",
163
+ ]);
164
+ if (!started.ok) {
165
+ throwLinkCliFailure(started, kind === "upgrade"
166
+ ? "Could not start a Link payment grant."
167
+ : "Could not start Link sign-in.");
168
+ }
169
+ const json = parseLinkJson(started.stdout);
170
+ const url = typeof json?.verification_url === "string" ? json.verification_url : "";
171
+ const phrase = typeof json?.phrase === "string" ? json.phrase : undefined;
172
+ if (!url) {
173
+ throw new CliError("link-cli did not return a Link approval link.", EXIT_UNEXPECTED);
174
+ }
175
+ approval = { url, ...(phrase ? { code: phrase } : {}) };
176
+ const ask = linkAuthAsk(kind);
177
+ if (mode === "no-wait") {
178
+ throw actionError("Link approval pending.", {
179
+ kind: "approve",
180
+ humanPrompt: `${ask} After they approve, run the same command with --resume instead of --no-wait.`,
181
+ ...approval,
182
+ });
183
+ }
184
+ writeAction(deps, {
185
+ kind: "approve",
186
+ humanPrompt: `${ask} Waiting for approval.`,
187
+ ...approval,
188
+ });
189
+ }
190
+ const deadline = deps.clock.now() + LINK_AUTH_WAIT_MS;
191
+ while (deps.clock.now() < deadline) {
192
+ await deps.clock.sleep(LINK_AUTH_POLL_MS);
193
+ // A pending `auth upgrade` reports authenticated:false until approved, so
194
+ // signed-in is the completion signal for both kinds. Do not wait on
195
+ // `scope`: link-cli only reports it when Link's token response carries it.
196
+ if ((await readLinkSession(deps)).authenticated)
197
+ return;
198
+ }
199
+ throw actionError("Link approval timed out.", {
200
+ kind: "approve",
201
+ ...approval,
202
+ humanPrompt: `The Link approval was not completed in time. Run \`${command}${mode === "resume" ? " --no-wait" : ""}\` again for a new link.`,
203
+ });
204
+ }
205
+ /**
206
+ * Starts Link's device sign-in when link-cli has no session (a fresh machine or
207
+ * cloud sandbox). Does not request `payment_methods.agentic`.
208
+ */
209
+ export async function ensureLinkAuth(deps, opts = {}) {
210
+ if ((await readLinkSession(deps)).authenticated)
211
+ return;
212
+ await completeLinkDeviceAuth(deps, {
213
+ kind: "login",
214
+ scope: LINK_LOGIN_SCOPE,
215
+ mode: opts.mode ?? "wait",
216
+ command: opts.command ?? "cleanslop login --link",
217
+ });
218
+ }
219
+ /**
220
+ * Ensures the Link session can create spend requests. Existing sessions that
221
+ * already granted `payment_methods.agentic` are left as-is. A session without
222
+ * that grant is widened with `auth upgrade`. No session logs in with the
223
+ * payment scope so a cold `credits buy` is one approval, not login + upgrade.
224
+ */
225
+ export async function ensureLinkPaymentScope(deps, opts = {}) {
226
+ const mode = opts.mode ?? "wait";
227
+ const command = opts.command ?? "cleanslop credits buy --link";
228
+ const session = await readLinkSession(deps);
229
+ if (!session.authenticated) {
230
+ await completeLinkDeviceAuth(deps, {
231
+ kind: "login",
232
+ scope: LINK_PAYMENT_SCOPE,
233
+ mode,
234
+ command,
235
+ });
236
+ return;
237
+ }
238
+ if (session.hasPaymentScope)
239
+ return;
240
+ await completeLinkDeviceAuth(deps, {
241
+ kind: "upgrade",
242
+ scope: LINK_PAYMENT_SCOPE,
243
+ mode,
244
+ command,
245
+ });
246
+ }
247
+ async function tryPopAttestation(deps) {
248
+ const result = await runLinkCli(deps, [
249
+ "identity",
250
+ "attestations",
251
+ "pop",
252
+ "--format",
253
+ "json",
254
+ ]);
255
+ if (!result.ok) {
256
+ if (EMPTY_POOL_PATTERN.test(`${result.stderr} ${result.stdout}`))
257
+ return null;
258
+ throwLinkCliFailure(result, "Could not pop a Link attestation.");
259
+ }
260
+ const json = parseLinkJson(result.stdout);
261
+ const authorization = typeof json?.authorization === "string" ? json.authorization.trim() : "";
262
+ return authorization ? { authorization } : null;
263
+ }
264
+ /** Refills an empty pool. Link issues attestations without a per-request approval. */
265
+ export async function popAttestation(deps) {
266
+ const pooled = await tryPopAttestation(deps);
267
+ if (pooled)
268
+ return pooled;
269
+ const requested = await runLinkCli(deps, [
270
+ "identity",
271
+ "attestations",
272
+ "request",
273
+ "--count",
274
+ LINK_ATTESTATION_BATCH,
275
+ "--format",
276
+ "json",
277
+ ]);
278
+ if (!requested.ok) {
279
+ throwLinkCliFailure(requested, "Could not request Link attestations.");
280
+ }
281
+ const refilled = await tryPopAttestation(deps);
282
+ if (refilled)
283
+ return refilled;
284
+ throw actionError("Link did not issue agent attestations.", {
285
+ kind: "ask_human",
286
+ humanPrompt: EMPTY_POOL_HINT,
287
+ });
288
+ }
289
+ export async function requestLinkCredentials(deps) {
290
+ // link-cli 0.27 has no claim filter on request; Link still mints a local
291
+ // pack that can include name and phone. We only present email claims.
292
+ const result = await runLinkCli(deps, ["identity", "credentials", "request"], {
293
+ timeout: 120_000,
294
+ });
295
+ if (!result.ok) {
296
+ throw actionError("Link did not issue an identity credential.", {
297
+ kind: "ask_human",
298
+ humanPrompt: "Ask the human to check the Link app for a pending CleanSlop request, then run the same cleanslop command again.",
299
+ });
300
+ }
301
+ }
302
+ export async function presentLinkIdentity(deps, input) {
303
+ const args = [
304
+ "identity",
305
+ "credentials",
306
+ "present",
307
+ "--aud",
308
+ input.aud,
309
+ "--nonce",
310
+ input.nonce,
311
+ ...LINK_IDENTITY_CLAIMS.flatMap((claim) => ["--claim", claim]),
312
+ "--format",
313
+ "json",
314
+ ];
315
+ let result = await runLinkCli(deps, args);
316
+ const missingCred = !result.ok &&
317
+ MISSING_CREDENTIAL_PATTERN.test(`${result.stderr} ${result.stdout}`);
318
+ if (missingCred) {
319
+ await requestLinkCredentials(deps);
320
+ result = await runLinkCli(deps, args);
321
+ }
322
+ if (!result.ok) {
323
+ throwLinkCliFailure(result, "Could not present a Link identity.");
324
+ }
325
+ const json = parseLinkJson(result.stdout);
326
+ const presentation = typeof json?.presentation === "string" ? json.presentation.trim() : "";
327
+ if (!presentation) {
328
+ throw new CliError("link-cli did not return an identity presentation.", EXIT_UNEXPECTED);
329
+ }
330
+ return { presentation };
331
+ }
332
+ export function readLinkClaimsChallenge(body, origin) {
333
+ const rec = asRecord(body);
334
+ if (!rec) {
335
+ throw new CliError("Link challenge was not JSON.", EXIT_UNEXPECTED);
336
+ }
337
+ const aud = typeof rec.aud === "string" ? rec.aud : "";
338
+ if (aud !== origin) {
339
+ throw actionError(`Refusing Link challenge: audience ${aud || "(missing)"} is not ${origin}.`, {
340
+ kind: "ask_human",
341
+ humanPrompt: "The Link challenge audience did not match CLEANSLOP_ORIGIN. Check AUTH_URL / CLEANSLOP_ORIGIN.",
342
+ });
343
+ }
344
+ const claimsRaw = rec.claims;
345
+ const claims = Array.isArray(claimsRaw)
346
+ ? claimsRaw.filter((item) => typeof item === "string")
347
+ : [];
348
+ const expected = [...LINK_IDENTITY_CLAIMS];
349
+ const sameClaims = claims.length === expected.length &&
350
+ expected.every((name) => claims.includes(name));
351
+ if (!sameClaims) {
352
+ throw actionError("Refusing Link challenge: claims must be exactly email and email_verified.", {
353
+ kind: "ask_human",
354
+ humanPrompt: "CleanSlop will only accept a Link email presentation. The server asked for different claims.",
355
+ });
356
+ }
357
+ const interactionId = typeof rec.interaction_id === "string" ? rec.interaction_id : "";
358
+ const nonce = typeof rec.nonce === "string" ? rec.nonce : "";
359
+ if (!interactionId || !nonce) {
360
+ throw new CliError("Link challenge was missing nonce or interaction_id.", EXIT_UNEXPECTED);
361
+ }
362
+ return { aud, nonce, claims, interactionId };
363
+ }
364
+ export function linkTermsUrl(origin) {
365
+ return `${origin}/terms`;
366
+ }
367
+ export function linkTermsQuestion(termsUrl) {
368
+ return `Agree to the CleanSlop terms (${termsUrl})?`;
369
+ }
370
+ export function linkShareEmailQuestion(origin) {
371
+ return `Create or sign in to a CleanSlop account (${origin}) with your Link-verified email?`;
372
+ }
373
+ export function linkBridgeEmailQuestion(origin) {
374
+ return `Connect your Link-verified email to this CleanSlop account (${origin})?`;
375
+ }
376
+ export async function requireLinkSignupConsent(deps, args, origin) {
377
+ const termsUrl = linkTermsUrl(origin);
378
+ const shareQuestion = linkShareEmailQuestion(origin);
379
+ deps.io.stderr(`CleanSlop terms: ${termsUrl}\n`);
380
+ if (!args.acceptTerms || !args.yesShareEmail) {
381
+ if (!deps.io.stdinIsTTY) {
382
+ throw actionError("Human consent is required.", {
383
+ kind: "ask_human",
384
+ humanPrompt: `${linkTermsQuestion(termsUrl)}\n\n${shareQuestion}`,
385
+ url: termsUrl,
386
+ });
387
+ }
388
+ }
389
+ if (!args.acceptTerms) {
390
+ const agreed = await deps.confirm(linkTermsQuestion(termsUrl));
391
+ if (!agreed) {
392
+ throw actionError("Terms were not accepted.", {
393
+ kind: "ask_human",
394
+ humanPrompt: linkTermsQuestion(termsUrl),
395
+ url: termsUrl,
396
+ });
397
+ }
398
+ }
399
+ if (!args.yesShareEmail) {
400
+ const agreed = await deps.confirm(shareQuestion);
401
+ if (!agreed) {
402
+ throw actionError("Email sharing was declined.", {
403
+ kind: "ask_human",
404
+ humanPrompt: shareQuestion,
405
+ });
406
+ }
407
+ }
408
+ return args.acceptTerms && args.yesShareEmail ? "flag" : "tty";
409
+ }
410
+ export async function requireLinkBridgeConsent(deps, args, origin) {
411
+ const question = linkBridgeEmailQuestion(origin);
412
+ if (!args.yesShareEmail) {
413
+ if (!deps.io.stdinIsTTY) {
414
+ throw actionError("Human consent is required.", {
415
+ kind: "ask_human",
416
+ humanPrompt: question,
417
+ });
418
+ }
419
+ const agreed = await deps.confirm(question);
420
+ if (!agreed) {
421
+ throw actionError("Email sharing was declined.", {
422
+ kind: "ask_human",
423
+ humanPrompt: question,
424
+ });
425
+ }
426
+ }
427
+ return args.yesShareEmail ? "flag" : "tty";
428
+ }
429
+ /** Same schedule as link-cli `runMppPayWithSpendRequest`. */
430
+ export const SPT_RETRIEVAL_DELAYS_MS = [
431
+ 0, 1000, 1000, 1000, 1000, 2000, 2000, 2000, 2000,
432
+ ];
433
+ function spendRequestStatus(raw) {
434
+ switch (raw) {
435
+ case "pending":
436
+ case "pending_approval":
437
+ case "created":
438
+ return "pending";
439
+ case "approved":
440
+ case "denied":
441
+ case "expired":
442
+ case "requires_action":
443
+ case "canceled":
444
+ return raw;
445
+ default:
446
+ return "unknown";
447
+ }
448
+ }
449
+ function extractApprovalUrl(json) {
450
+ for (const key of ["approval_url", "approval_link", "approvalUrl"]) {
451
+ const value = json[key];
452
+ if (typeof value === "string") {
453
+ const url = value.trim();
454
+ if (/^https?:\/\//i.test(url))
455
+ return url;
456
+ }
457
+ }
458
+ return null;
459
+ }
460
+ function extractSharedPaymentToken(json) {
461
+ const token = json.shared_payment_token ?? json.sharedPaymentToken;
462
+ if (typeof token === "string" && token.startsWith("spt_"))
463
+ return token;
464
+ const rec = asRecord(token);
465
+ if (!rec)
466
+ return null;
467
+ const id = rec.id ?? rec.token;
468
+ return typeof id === "string" && id.startsWith("spt_") ? id : null;
469
+ }
470
+ function snapshotFromSpendRecord(json) {
471
+ const id = typeof json.id === "string" ? json.id.trim() : "";
472
+ if (!id)
473
+ return null;
474
+ const status = spendRequestStatus(typeof json.status === "string" ? json.status : "");
475
+ const next = asRecord(json.next_action);
476
+ const resolutionRaw = next?.resolution;
477
+ const resolution = typeof resolutionRaw === "string"
478
+ ? resolutionRaw
479
+ : typeof asRecord(resolutionRaw)?.type === "string"
480
+ ? String(asRecord(resolutionRaw)?.type)
481
+ : null;
482
+ const displayMessage = (typeof next?.display_message === "string" && next.display_message) ||
483
+ (typeof json.display_message === "string" && json.display_message) ||
484
+ null;
485
+ return {
486
+ id,
487
+ status,
488
+ displayMessage,
489
+ resolution,
490
+ sharedPaymentToken: extractSharedPaymentToken(json),
491
+ approvalUrl: extractApprovalUrl(json),
492
+ };
493
+ }
494
+ export function parseSpendRequestJson(stdout) {
495
+ const trimmed = stdout.trim();
496
+ if (!trimmed)
497
+ return null;
498
+ let parsed;
499
+ try {
500
+ parsed = JSON.parse(trimmed);
501
+ }
502
+ catch {
503
+ return null;
504
+ }
505
+ const records = Array.isArray(parsed) ? parsed : [parsed];
506
+ for (let i = records.length - 1; i >= 0; i--) {
507
+ const json = asRecord(records[i]);
508
+ if (!json)
509
+ continue;
510
+ const snap = snapshotFromSpendRecord(json);
511
+ if (snap)
512
+ return snap;
513
+ }
514
+ return null;
515
+ }
516
+ /** Hidden test override. Exact `"1"` appends `--test` on spend-request create. */
517
+ export function linkSpendRequestTestArgs(deps) {
518
+ return deps.env.get("CLEANSLOP_LINK_TEST")?.trim() === "1" ? ["--test"] : [];
519
+ }
520
+ export function isLinkSpendRequestNotFound(result) {
521
+ const text = `${result.stderr} ${result.stdout}`;
522
+ if (/\bNOT_FOUND\b/.test(text))
523
+ return true;
524
+ return /spend request \S+ not found/i.test(text);
525
+ }
526
+ function spendRequestsFromListJson(stdout) {
527
+ const trimmed = stdout.trim();
528
+ if (!trimmed)
529
+ return [];
530
+ let parsed;
531
+ try {
532
+ parsed = JSON.parse(trimmed);
533
+ }
534
+ catch {
535
+ return [];
536
+ }
537
+ const rec = asRecord(parsed);
538
+ const records = Array.isArray(parsed)
539
+ ? parsed
540
+ : Array.isArray(rec?.data)
541
+ ? rec.data
542
+ : [parsed];
543
+ const out = [];
544
+ for (const item of records) {
545
+ const snap = snapshotFromSpendRecord(asRecord(item) ?? {});
546
+ if (snap)
547
+ out.push(snap);
548
+ }
549
+ return out;
550
+ }
551
+ async function retrieveLinkSpendRequestFromList(deps, spendRequestId) {
552
+ const result = await runLinkCli(deps, [
553
+ "spend-request",
554
+ "list",
555
+ "--include-history",
556
+ "--format",
557
+ "json",
558
+ ]);
559
+ if (!result.ok)
560
+ return null;
561
+ return (spendRequestsFromListJson(result.stdout).find((row) => row.id === spendRequestId) ??
562
+ null);
563
+ }
564
+ export async function createLinkSpendRequest(deps, input) {
565
+ const result = await runLinkCli(deps, [
566
+ "spend-request",
567
+ "create",
568
+ "--credential-type",
569
+ "shared_payment_token",
570
+ "--network-id",
571
+ input.networkId,
572
+ "--amount",
573
+ String(input.amount),
574
+ "--currency",
575
+ input.currency,
576
+ "--context",
577
+ input.context,
578
+ "--line-item",
579
+ input.lineItem,
580
+ "--total",
581
+ input.total,
582
+ "--idempotency-key",
583
+ input.idempotencyKey,
584
+ "--request-approval",
585
+ ...linkSpendRequestTestArgs(deps),
586
+ "--format",
587
+ "json",
588
+ ]);
589
+ if (!result.ok) {
590
+ throwLinkCliFailure(result, "Could not create a Link spend request.");
591
+ }
592
+ const parsed = parseSpendRequestJson(result.stdout);
593
+ if (!parsed) {
594
+ throw new CliError("link-cli did not return a spend request id.", EXIT_UNEXPECTED);
595
+ }
596
+ return parsed;
597
+ }
598
+ export async function retrieveLinkSpendRequest(deps, spendRequestId, opts = {}) {
599
+ const args = ["spend-request", "retrieve", spendRequestId, "--format", "json"];
600
+ if (opts.includeSpt) {
601
+ args.push("--include", "shared_payment_token");
602
+ }
603
+ const result = await runLinkCli(deps, args);
604
+ if (result.ok) {
605
+ const parsed = parseSpendRequestJson(result.stdout);
606
+ if (!parsed) {
607
+ throw new CliError("link-cli spend-request retrieve returned invalid JSON.", EXIT_UNEXPECTED);
608
+ }
609
+ return parsed;
610
+ }
611
+ // link-cli 0.27 create --test writes a test-mode id; retrieve has no --test
612
+ // and 404s in live. List still sees the request.
613
+ const testMode = linkSpendRequestTestArgs(deps).length > 0;
614
+ if (testMode && isLinkSpendRequestNotFound(result)) {
615
+ const fromList = await retrieveLinkSpendRequestFromList(deps, spendRequestId);
616
+ // `list` takes no --include, so it may never carry the token. Fail here
617
+ // rather than retrying a token that cannot arrive.
618
+ if (fromList &&
619
+ opts.includeSpt &&
620
+ fromList.status === "approved" &&
621
+ !fromList.sharedPaymentToken) {
622
+ throw new CliError("Link test mode approved the spend request, but link-cli cannot return its payment token (retrieve 404s and list has no token).", EXIT_UNEXPECTED);
623
+ }
624
+ if (fromList)
625
+ return fromList;
626
+ }
627
+ throwLinkCliFailure(result, "Could not retrieve the Link spend request.");
628
+ }
629
+ export async function retrieveSharedPaymentToken(deps, spendRequestId) {
630
+ for (const delayMs of SPT_RETRIEVAL_DELAYS_MS) {
631
+ if (delayMs > 0)
632
+ await deps.clock.sleep(delayMs);
633
+ const snap = await retrieveLinkSpendRequest(deps, spendRequestId, {
634
+ includeSpt: true,
635
+ });
636
+ if (snap.sharedPaymentToken)
637
+ return snap.sharedPaymentToken;
638
+ }
639
+ return null;
640
+ }
641
+ export function linkSignupBody(deps, acceptTerms, consentSource) {
642
+ return {
643
+ client: CLIENT_ID,
644
+ agentHint: detectAgentHint(deps.env),
645
+ hostHint: deps.env.hostname().slice(0, 64),
646
+ acceptTerms,
647
+ consentSource,
648
+ };
649
+ }
650
+ //# sourceMappingURL=link.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"link.js","sourceRoot":"","sources":["../src/link.ts"],"names":[],"mappings":"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"}