@vibes.diy/api-svc 14.3.143 → 14.3.149

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 (57) hide show
  1. package/analytics.d.ts +13 -1
  2. package/analytics.js +33 -0
  3. package/analytics.js.map +1 -1
  4. package/billing.d.ts +8 -2
  5. package/billing.js +17 -2
  6. package/billing.js.map +1 -1
  7. package/intern/agent-session-instruction.d.ts +3 -2
  8. package/intern/agent-session-instruction.js +6 -5
  9. package/intern/agent-session-instruction.js.map +1 -1
  10. package/intern/backend-ai-callback.js +19 -1
  11. package/intern/backend-ai-callback.js.map +1 -1
  12. package/intern/credit-milestones.d.ts +5 -0
  13. package/intern/credit-milestones.js +24 -0
  14. package/intern/credit-milestones.js.map +1 -0
  15. package/intern/first-look.d.ts +24 -0
  16. package/intern/first-look.js +44 -0
  17. package/intern/first-look.js.map +1 -1
  18. package/intern/guest-credit-meter.js +5 -1
  19. package/intern/guest-credit-meter.js.map +1 -1
  20. package/intern/instruction-variant.d.ts +4 -0
  21. package/intern/instruction-variant.js +8 -0
  22. package/intern/instruction-variant.js.map +1 -1
  23. package/intern/mercury-first-build-seam.d.ts +3 -0
  24. package/intern/mercury-first-build-seam.js +27 -7
  25. package/intern/mercury-first-build-seam.js.map +1 -1
  26. package/intern/open-turn-sweep.d.ts +3 -0
  27. package/intern/open-turn-sweep.js +33 -6
  28. package/intern/open-turn-sweep.js.map +1 -1
  29. package/intern/render-vibe.js +7 -1
  30. package/intern/render-vibe.js.map +1 -1
  31. package/package.json +14 -13
  32. package/public/agent-turn-action.js +95 -59
  33. package/public/agent-turn-action.js.map +1 -1
  34. package/public/handle-prompt-context.d.ts +3 -1
  35. package/public/handle-prompt-context.js +17 -3
  36. package/public/handle-prompt-context.js.map +1 -1
  37. package/public/image-gen.js +17 -2
  38. package/public/image-gen.js.map +1 -1
  39. package/public/open-chat.js +4 -3
  40. package/public/open-chat.js.map +1 -1
  41. package/public/prompt-section-actions.js +1 -0
  42. package/public/prompt-section-actions.js.map +1 -1
  43. package/public/prompt-turn-settled.js +5 -0
  44. package/public/prompt-turn-settled.js.map +1 -1
  45. package/public/prompt-turn-terminal.js +2 -1
  46. package/public/prompt-turn-terminal.js.map +1 -1
  47. package/public/stream-assembly.d.ts +2 -0
  48. package/public/stream-assembly.js +1 -0
  49. package/public/stream-assembly.js.map +1 -1
  50. package/usage-report/grant-credits.js +7 -2
  51. package/usage-report/grant-credits.js.map +1 -1
  52. package/usage-report/qa-set-credits-util.d.ts +29 -0
  53. package/usage-report/qa-set-credits-util.js +143 -0
  54. package/usage-report/qa-set-credits-util.js.map +1 -0
  55. package/usage-report/qa-set-credits.d.ts +1 -0
  56. package/usage-report/qa-set-credits.js +60 -0
  57. package/usage-report/qa-set-credits.js.map +1 -0
@@ -0,0 +1,143 @@
1
+ import { Result, exception2Result } from "@adviser/cement";
2
+ import { AI_CREDITS_FEATURE_ID, AUTUMN_API_BASE, autumnErrorCode } from "../billing.js";
3
+ import { GRANT_API_VERSION } from "./grant-credits-util.js";
4
+ export const QA_PAYWALL_DRAIN_MODE = "qa-paywall-drain";
5
+ export const QA_INBOX_DOMAINS = [
6
+ "rexausolee.resend.app",
7
+ ];
8
+ const CLERK_API_BASE = "https://api.clerk.com/v1";
9
+ export function allEmailsOnQaDomain(emails, domains = QA_INBOX_DOMAINS) {
10
+ if (emails.length === 0)
11
+ return false;
12
+ const suffixes = domains.map((d) => `@${d.toLowerCase()}`);
13
+ return emails.every((e) => {
14
+ const lower = e.trim().toLowerCase();
15
+ return suffixes.some((s) => lower.endsWith(s));
16
+ });
17
+ }
18
+ function hasEnabledAutoRefill(json) {
19
+ const controls = json.billing_controls;
20
+ const topups = controls !== undefined && controls !== null && Array.isArray(controls.auto_topups) ? controls.auto_topups : [];
21
+ return topups.some((t) => typeof t === "object" &&
22
+ t !== null &&
23
+ t.feature_id === AI_CREDITS_FEATURE_ID &&
24
+ t.enabled === true);
25
+ }
26
+ export function readQaBalance(json) {
27
+ const balances = json.balances;
28
+ const feature = balances !== undefined && balances !== null
29
+ ? balances[AI_CREDITS_FEATURE_ID]
30
+ : undefined;
31
+ if (feature === undefined || feature === null) {
32
+ return { unlimited: false, remaining: undefined, plans: [], autoRefill: hasEnabledAutoRefill(json) };
33
+ }
34
+ const remaining = typeof feature.remaining === "number" && Number.isFinite(feature.remaining) ? feature.remaining : undefined;
35
+ const breakdown = Array.isArray(feature.breakdown) ? feature.breakdown : [];
36
+ const plans = [
37
+ ...new Set(breakdown
38
+ .filter((e) => typeof e === "object" && e !== null)
39
+ .map((e) => e.plan_id)
40
+ .filter((p) => typeof p === "string")),
41
+ ];
42
+ return { unlimited: feature.unlimited === true, remaining, plans, autoRefill: hasEnabledAutoRefill(json) };
43
+ }
44
+ async function toRes(res) {
45
+ return { status: res.status, json: (await res.json().catch(() => ({}))) };
46
+ }
47
+ function describeFailure(res) {
48
+ const code = autumnErrorCode(res.json);
49
+ const message = typeof res.json.message === "string" ? res.json.message : "";
50
+ return `${res.status} ${code ?? "no-code"}${message === "" ? "" : ` — ${message}`}`;
51
+ }
52
+ function clerkEmails(json) {
53
+ const raw = Array.isArray(json.email_addresses) ? json.email_addresses : [];
54
+ return raw
55
+ .filter((e) => typeof e === "object" && e !== null)
56
+ .map((e) => e.email_address)
57
+ .filter((e) => typeof e === "string");
58
+ }
59
+ export async function qaSetCredits(deps) {
60
+ if (Number.isInteger(deps.target) === false || deps.target < 0) {
61
+ return Result.Err(`--remaining must be a whole number ≥ 0, got ${deps.target}`);
62
+ }
63
+ const baseUrl = deps.baseUrl ?? AUTUMN_API_BASE;
64
+ const clerkBase = deps.clerkBaseUrl ?? CLERK_API_BASE;
65
+ const headers = { authorization: `Bearer ${deps.autumnKey}`, "x-api-version": GRANT_API_VERSION };
66
+ const readCustomer = () => deps.fetch(`${baseUrl}/customers/${encodeURIComponent(deps.userId)}`, { method: "GET", headers }).then(toRes);
67
+ return exception2Result(async () => {
68
+ const isLive = deps.autumnKey.startsWith("am_sk_live_");
69
+ deps.log(`QA drain of ${deps.userId} to ${deps.target} credits — org: ${isLive ? "PRODUCTION" : "sandbox"}`);
70
+ const clerk = await deps
71
+ .fetch(`${clerkBase}/users/${encodeURIComponent(deps.userId)}`, {
72
+ method: "GET",
73
+ headers: { authorization: `Bearer ${deps.clerkKey}` },
74
+ })
75
+ .then(toRes);
76
+ if (clerk.status >= 400) {
77
+ throw new Error(`Clerk user read failed: ${clerk.status}. Nothing was changed — a user we cannot see is not a QA account.`);
78
+ }
79
+ const emails = clerkEmails(clerk.json);
80
+ if (allEmailsOnQaDomain(emails) === false) {
81
+ throw new Error(`not a QA account: ${emails.length} email(s) on the Clerk user, not all on a QA inbox domain ` +
82
+ `(${QA_INBOX_DOMAINS.join(", ")}). Nothing was changed.`);
83
+ }
84
+ deps.log("qa-domain: ok");
85
+ const first = await readCustomer();
86
+ if (first.status >= 400) {
87
+ throw new Error(`customer read failed: ${describeFailure(first)}. Nothing was changed.`);
88
+ }
89
+ const before = readQaBalance(first.json);
90
+ const env = typeof first.json.env === "string" ? first.json.env : "(unknown)";
91
+ deps.log(`Customer env=${env} plan=${before.plans.length === 0 ? "(none)" : before.plans.join(",")}` +
92
+ ` unlimited=${before.unlimited} remaining=${before.remaining ?? "(absent)"}`);
93
+ if (before.unlimited) {
94
+ throw new Error("ai_credits is unlimited: true on this customer — there is no balance to lower. Nothing was changed.");
95
+ }
96
+ if (before.autoRefill) {
97
+ throw new Error("ai_credits auto-refill is enabled on this customer — a drain would trigger a real top-up charge. Turn auto-refill off first. Nothing was changed.");
98
+ }
99
+ if (before.remaining === undefined) {
100
+ throw new Error("the customer read carried no ai_credits.remaining — cannot compute a drain. Nothing was changed.");
101
+ }
102
+ if (deps.target >= before.remaining) {
103
+ throw new Error(`target ${deps.target} is not below current remaining ${before.remaining} — this lane only lowers. ` +
104
+ `To raise a balance use credits:grant. Nothing was changed.`);
105
+ }
106
+ const value = before.remaining - deps.target;
107
+ const body = {
108
+ customer_id: deps.userId,
109
+ feature_id: AI_CREDITS_FEATURE_ID,
110
+ value,
111
+ idempotency_key: deps.idempotencyKey,
112
+ properties: { mode: QA_PAYWALL_DRAIN_MODE },
113
+ };
114
+ if (deps.confirm === false) {
115
+ deps.log(`\nPLAN (dry run — nothing written):\n POST ${baseUrl}/balances.track\n ${JSON.stringify(body)}\n` +
116
+ ` -> remaining would read ${deps.target}.\n\nRe-run with --yes to apply.`);
117
+ return { changed: false, before: before.remaining, after: before.remaining };
118
+ }
119
+ const tracked = await deps
120
+ .fetch(`${baseUrl}/balances.track`, {
121
+ method: "POST",
122
+ headers: { ...headers, "content-type": "application/json" },
123
+ body: JSON.stringify(body),
124
+ })
125
+ .then(toRes);
126
+ if (tracked.status >= 400) {
127
+ throw new Error(`balances.track failed: ${describeFailure(tracked)}`);
128
+ }
129
+ deps.log(`\nbalances.track -> ${tracked.status}`);
130
+ const second = await readCustomer();
131
+ if (second.status >= 400) {
132
+ throw new Error(`balances.track answered ${tracked.status} but the read-back FAILED: ${describeFailure(second)}. Unverified.`);
133
+ }
134
+ const after = readQaBalance(second.json);
135
+ if (after.remaining !== deps.target) {
136
+ throw new Error(`DRAIN NOT PROVEN — read-back remaining=${after.remaining ?? "(absent)"}, expected ${deps.target}. ` +
137
+ `A 200 is never the proof; re-read before walking the paywall.`);
138
+ }
139
+ deps.log(`PROVEN: remaining ${before.remaining} -> ${after.remaining}`);
140
+ return { changed: true, before: before.remaining, after: after.remaining };
141
+ });
142
+ }
143
+ //# sourceMappingURL=qa-set-credits-util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qa-set-credits-util.js","sourceRoot":"","sources":["../../jsr/usage-report/qa-set-credits-util.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACxF,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAG5D,MAAM,CAAC,MAAM,qBAAqB,GAAG,kBAAkB,CAAC;AAOxD,MAAM,CAAC,MAAM,gBAAgB,GAAsB;IAGjD,uBAAuB;CACxB,CAAC;AAEF,MAAM,cAAc,GAAG,0BAA0B,CAAC;AAGlD,MAAM,UAAU,mBAAmB,CAAC,MAAyB,EAAE,OAAO,GAAsB,gBAAgB;IAC1G,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACtC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IAC3D,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;QACxB,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACrC,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;AACL,CAAC;AAcD,SAAS,oBAAoB,CAAC,IAA6B;IACzD,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAA8D,CAAC;IACrF,MAAM,MAAM,GAAG,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9H,OAAQ,MAAoB,CAAC,IAAI,CAC/B,CAAC,CAAC,EAAE,EAAE,CACJ,OAAO,CAAC,KAAK,QAAQ;QACrB,CAAC,KAAK,IAAI;QACT,CAA6B,CAAC,UAAU,KAAK,qBAAqB;QAClE,CAA6B,CAAC,OAAO,KAAK,IAAI,CAClD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAA6B;IACzD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAsD,CAAC;IAC7E,MAAM,OAAO,GACX,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,IAAI;QACzC,CAAC,CAAE,QAAQ,CAAC,qBAAqB,CAAgD;QACjF,CAAC,CAAC,SAAS,CAAC;IAChB,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QAC9C,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,EAAE,UAAU,EAAE,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC;IACvG,CAAC;IACD,MAAM,SAAS,GAAG,OAAO,OAAO,CAAC,SAAS,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;IAC9H,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAE,OAAO,CAAC,SAAuB,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3F,MAAM,KAAK,GAAG;QACZ,GAAG,IAAI,GAAG,CACR,SAAS;aACN,MAAM,CAAC,CAAC,CAAC,EAAgC,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,CAAC;aAChF,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;aACrB,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CACrD;KACF,CAAC;IACF,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,KAAK,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC;AAC7G,CAAC;AA6BD,KAAK,UAAU,KAAK,CAAC,GAAa;IAChC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAA4B,EAAE,CAAC;AACvG,CAAC;AAID,SAAS,eAAe,CAAC,GAAY;IACnC,MAAM,IAAI,GAAG,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACvC,MAAM,OAAO,GAAG,OAAO,GAAG,CAAC,IAAI,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7E,OAAO,GAAG,GAAG,CAAC,MAAM,IAAI,IAAI,IAAI,SAAS,GAAG,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,OAAO,EAAE,EAAE,CAAC;AACtF,CAAC;AAED,SAAS,WAAW,CAAC,IAA6B;IAChD,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAE,IAAI,CAAC,eAA6B,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3F,OAAO,GAAG;SACP,MAAM,CAAC,CAAC,CAAC,EAAgC,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,CAAC;SAChF,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC;SAC3B,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC;AACvD,CAAC;AAGD,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAe;IAChD,IAAI,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,KAAK,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/D,OAAO,MAAM,CAAC,GAAG,CAAC,+CAA+C,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IAClF,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,eAAe,CAAC;IAChD,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,IAAI,cAAc,CAAC;IACtD,MAAM,OAAO,GAAG,EAAE,aAAa,EAAE,UAAU,IAAI,CAAC,SAAS,EAAE,EAAE,eAAe,EAAE,iBAAiB,EAAE,CAAC;IAClG,MAAM,YAAY,GAAG,GAAqB,EAAE,CAC1C,IAAI,CAAC,KAAK,CAAC,GAAG,OAAO,cAAc,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAEhH,OAAO,gBAAgB,CAAC,KAAK,IAAI,EAAE;QACjC,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;QACxD,IAAI,CAAC,GAAG,CAAC,eAAe,IAAI,CAAC,MAAM,OAAO,IAAI,CAAC,MAAM,mBAAmB,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;QAG7G,MAAM,KAAK,GAAG,MAAM,IAAI;aACrB,KAAK,CAAC,GAAG,SAAS,UAAU,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE;YAC9D,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,IAAI,CAAC,QAAQ,EAAE,EAAE;SACtD,CAAC;aACD,IAAI,CAAC,KAAK,CAAC,CAAC;QACf,IAAI,KAAK,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,2BAA2B,KAAK,CAAC,MAAM,mEAAmE,CAAC,CAAC;QAC9H,CAAC;QACD,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,mBAAmB,CAAC,MAAM,CAAC,KAAK,KAAK,EAAE,CAAC;YAE1C,MAAM,IAAI,KAAK,CACb,qBAAqB,MAAM,CAAC,MAAM,4DAA4D;gBAC5F,IAAI,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,yBAAyB,CAC3D,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QAG1B,MAAM,KAAK,GAAG,MAAM,YAAY,EAAE,CAAC;QACnC,IAAI,KAAK,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,yBAAyB,eAAe,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;QAC3F,CAAC;QACD,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,GAAG,GAAG,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC;QAC9E,IAAI,CAAC,GAAG,CACN,gBAAgB,GAAG,SAAS,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;YACzF,cAAc,MAAM,CAAC,SAAS,cAAc,MAAM,CAAC,SAAS,IAAI,UAAU,EAAE,CAC/E,CAAC;QAEF,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,qGAAqG,CAAC,CAAC;QACzH,CAAC;QAID,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CACb,mJAAmJ,CACpJ,CAAC;QACJ,CAAC;QACD,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,kGAAkG,CAAC,CAAC;QACtH,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CACb,UAAU,IAAI,CAAC,MAAM,mCAAmC,MAAM,CAAC,SAAS,4BAA4B;gBAClG,4DAA4D,CAC/D,CAAC;QACJ,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC;QAC7C,MAAM,IAAI,GAAG;YACX,WAAW,EAAE,IAAI,CAAC,MAAM;YACxB,UAAU,EAAE,qBAAqB;YACjC,KAAK;YACL,eAAe,EAAE,IAAI,CAAC,cAAc;YACpC,UAAU,EAAE,EAAE,IAAI,EAAE,qBAAqB,EAAE;SAC5C,CAAC;QAGF,IAAI,IAAI,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;YAC3B,IAAI,CAAC,GAAG,CACN,+CAA+C,OAAO,sBAAsB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI;gBAClG,6BAA6B,IAAI,CAAC,MAAM,kCAAkC,CAC7E,CAAC;YACF,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC;QAC/E,CAAC;QAGD,MAAM,OAAO,GAAG,MAAM,IAAI;aACvB,KAAK,CAAC,GAAG,OAAO,iBAAiB,EAAE;YAClC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,GAAG,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC3D,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC3B,CAAC;aACD,IAAI,CAAC,KAAK,CAAC,CAAC;QACf,IAAI,OAAO,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,0BAA0B,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACxE,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,uBAAuB,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QAGlD,MAAM,MAAM,GAAG,MAAM,YAAY,EAAE,CAAC;QACpC,IAAI,MAAM,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CACb,2BAA2B,OAAO,CAAC,MAAM,8BAA8B,eAAe,CAAC,MAAM,CAAC,eAAe,CAC9G,CAAC;QACJ,CAAC;QACD,MAAM,KAAK,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,KAAK,CAAC,SAAS,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CACb,0CAA0C,KAAK,CAAC,SAAS,IAAI,UAAU,cAAc,IAAI,CAAC,MAAM,IAAI;gBAClG,+DAA+D,CAClE,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,qBAAqB,MAAM,CAAC,SAAS,OAAO,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;QACxE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC;IAC7E,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,60 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { Result } from "@adviser/cement";
3
+ import { qaSetCredits } from "./qa-set-credits-util.js";
4
+ import { arg, flag, formatError, loadDevVars } from "./usage-report-util.js";
5
+ function nonEmpty(v) {
6
+ return v === undefined || v === "" ? undefined : v;
7
+ }
8
+ async function run() {
9
+ const userId = (arg("--user") ?? "").trim();
10
+ if (userId === "") {
11
+ return Result.Err("--user <clerk userId> is required");
12
+ }
13
+ const rawTarget = (arg("--remaining") ?? "").trim();
14
+ if (rawTarget === "" || /^\d+$/.test(rawTarget) === false) {
15
+ return Result.Err(`--remaining <N> is required (whole number ≥ 0), got ${JSON.stringify(rawTarget)}`);
16
+ }
17
+ const target = Number(rawTarget);
18
+ loadDevVars();
19
+ const sandbox = flag("--sandbox");
20
+ const autumnVar = sandbox ? "AUTUMN_SECRET_KEY_SANDBOX" : "AUTUMN_SECRET_KEY";
21
+ const autumnKey = nonEmpty(process.env[autumnVar]);
22
+ if (autumnKey === undefined) {
23
+ return Result.Err(`${autumnVar} not found in env or svc/.dev.vars`);
24
+ }
25
+ if (sandbox && autumnKey.startsWith("am_sk_live_")) {
26
+ return Result.Err(`${autumnVar} holds a LIVE key — refusing to run --sandbox against production`);
27
+ }
28
+ const clerkKey = sandbox
29
+ ? (nonEmpty(process.env.CLERK_SECRET_KEY_PREVIEW) ?? nonEmpty(process.env.CLERK_SECRET_KEY))
30
+ : nonEmpty(process.env.CLERK_SECRET_KEY);
31
+ if (clerkKey === undefined) {
32
+ return Result.Err("CLERK_SECRET_KEY not found in env or svc/.dev.vars (needed for the QA-account check)");
33
+ }
34
+ const r = await qaSetCredits({
35
+ userId,
36
+ target,
37
+ confirm: flag("--yes"),
38
+ autumnKey,
39
+ clerkKey,
40
+ idempotencyKey: `qa-paywall-drain-${userId}-${randomUUID()}`,
41
+ log: (line) => process.stdout.write(`${line}\n`),
42
+ fetch: globalThis.fetch.bind(globalThis),
43
+ });
44
+ if (r.isErr()) {
45
+ return Result.Err(r);
46
+ }
47
+ return Result.Ok(undefined);
48
+ }
49
+ run()
50
+ .then((r) => {
51
+ if (r.isErr()) {
52
+ process.stderr.write(`${formatError(r.Err())}\n`);
53
+ process.exit(1);
54
+ }
55
+ })
56
+ .catch((e) => {
57
+ process.stderr.write(`${formatError(e)}\n`);
58
+ process.exit(1);
59
+ });
60
+ //# sourceMappingURL=qa-set-credits.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qa-set-credits.js","sourceRoot":"","sources":["../../jsr/usage-report/qa-set-credits.ts"],"names":[],"mappings":"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"}