@vibes.diy/api-svc 10.6.1 → 10.6.3

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.
@@ -1,5 +1,5 @@
1
1
  import { exception2Result } from "@adviser/cement";
2
- import { and, eq, sql } from "drizzle-orm";
2
+ import { and, eq } from "drizzle-orm";
3
3
  import { isDirectChannel } from "@vibes.diy/api-types";
4
4
  import { isPublicReadable } from "../public/access-helpers.js";
5
5
  import { aclAllows, resolveDbAcl } from "../public/db-acl-resolver.js";
@@ -8,6 +8,7 @@ import { filterDocsByChannel } from "../public/channel-read-filter.js";
8
8
  import { decodeAccessOutputRows } from "../public/access-output-decoder.js";
9
9
  import { mintFilesUrls } from "../public/files-url-mint.js";
10
10
  import { resolveViewerChannels } from "../public/viewer-channel-resolver.js";
11
+ import { loadHeadDocs } from "../public/app-documents-head-query.js";
11
12
  export async function readAnonymousSeedDocs(vctx, ownerHandle, appSlug) {
12
13
  const r = await exception2Result(async () => readAnonymousSeedDocsInner(vctx, ownerHandle, appSlug));
13
14
  return r.isOk() ? r.Ok() : undefined;
@@ -33,27 +34,17 @@ async function readAnonymousSeedDocsInner(vctx, ownerHandle, appSlug) {
33
34
  const acl = rAcl.Ok();
34
35
  if (acl?.read !== undefined && !aclAllows(acl, "read", "none"))
35
36
  continue;
36
- const rows = await vctx.sql.db
37
- .select()
38
- .from(t)
39
- .where(and(eq(t.ownerHandle, ownerHandle), eq(t.appSlug, appSlug), eq(t.dbName, dbName)))
40
- .orderBy(sql `${t.docId}, ${t.seq}`);
41
- const latest = new Map();
42
- for (const row of rows)
43
- latest.set(row.docId, row);
44
- const docs = [];
45
- for (const row of latest.values()) {
46
- if (row.deleted === 1)
47
- continue;
48
- const doc = mintFilesUrls(row.data, {
37
+ const headDocs = await loadHeadDocs(vctx, { ownerHandle, appSlug, dbName });
38
+ const docs = headDocs.map((row) => ({
39
+ _id: row.docId,
40
+ ...mintFilesUrls(row.data, {
49
41
  ownerHandle,
50
42
  appSlug,
51
43
  dbName,
52
44
  docId: row.docId,
53
45
  svc: vctx.params.vibes.svc,
54
- });
55
- docs.push({ _id: row.docId, ...doc });
56
- }
46
+ }),
47
+ }));
57
48
  let visible = docs;
58
49
  const afbRow = await resolveAccessBinding(vctx, ownerHandle, appSlug, dbName);
59
50
  if (afbRow?.accessFnCid) {
@@ -1 +1 @@
1
- {"version":3,"file":"read-anonymous-seed-docs.js","sourceRoot":"","sources":["../../jsr/intern/read-anonymous-seed-docs.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"read-anonymous-seed-docs.js","sourceRoot":"","sources":["../../jsr/intern/read-anonymous-seed-docs.ts"],"names":[],"mappings":"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"}
@@ -6,6 +6,7 @@ export interface ServeWrapperHtmlWithSwrOpts {
6
6
  readonly inner: () => Promise<Response>;
7
7
  readonly waitUntil: (p: Promise<unknown>) => void;
8
8
  readonly enableCfRum: boolean;
9
+ readonly consentRequiredRegion: boolean;
9
10
  readonly workspaceNpmUrl: string;
10
11
  }
11
12
  export declare function toStoredWrapperResponse(res: Response, now: number): Response | undefined;
@@ -1,6 +1,6 @@
1
1
  import { CACHED_AT_HEADER, CACHE_STATE_HEADER, cachedAtOf, swrDecision } from "./swr-html-cache.js";
2
2
  import { parseVibePathname, vibePathnameHasFsId } from "./get-vibe-route-hints.js";
3
- function eligibleKey(req, enableCfRum, workspaceNpmUrl) {
3
+ function eligibleKey(req, enableCfRum, consentRequiredRegion, workspaceNpmUrl) {
4
4
  if (req.method !== "GET")
5
5
  return undefined;
6
6
  if (req.headers.get("Authorization") !== null)
@@ -17,7 +17,7 @@ function eligibleKey(req, enableCfRum, workspaceNpmUrl) {
17
17
  return undefined;
18
18
  if (vibePathnameHasFsId(url.pathname))
19
19
  return undefined;
20
- return `${url.origin}${url.pathname}?vibes-wrapper-swr=rum-${enableCfRum ? "1" : "0"}&ws=${encodeURIComponent(workspaceNpmUrl)}`;
20
+ return `${url.origin}${url.pathname}?vibes-wrapper-swr=rum-${enableCfRum ? "1" : "0"}&cr-${consentRequiredRegion ? "1" : "0"}&ws=${encodeURIComponent(workspaceNpmUrl)}`;
21
21
  }
22
22
  const STORED_CACHE_CONTROL = "public, s-maxage=86400";
23
23
  export function toStoredWrapperResponse(res, now) {
@@ -51,7 +51,7 @@ async function renderAndStore(opts, key) {
51
51
  return res;
52
52
  }
53
53
  export async function serveWrapperHtmlWithSwr(opts) {
54
- const key = eligibleKey(opts.request, opts.enableCfRum, opts.workspaceNpmUrl);
54
+ const key = eligibleKey(opts.request, opts.enableCfRum, opts.consentRequiredRegion, opts.workspaceNpmUrl);
55
55
  if (key === undefined)
56
56
  return opts.inner();
57
57
  const cached = await opts.cache.match(key);
@@ -1 +1 @@
1
- {"version":3,"file":"swr-wrapper-html-cache.js","sourceRoot":"","sources":["../../jsr/intern/swr-wrapper-html-cache.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"swr-wrapper-html-cache.js","sourceRoot":"","sources":["../../jsr/intern/swr-wrapper-html-cache.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,12 +1,13 @@
1
1
  {
2
2
  "name": "@vibes.diy/api-svc",
3
- "version": "10.6.1",
3
+ "version": "10.6.3",
4
4
  "license": "Apache-2.0",
5
5
  "type": "module",
6
6
  "main": "./index.js",
7
7
  "scripts": {
8
8
  "build": "core-cli tsc",
9
9
  "db:inspect": "tsx ./usage-report/inspect-db.ts",
10
+ "journey": "tsx ./usage-report/user-journey.ts",
10
11
  "db:inspect-report": "tsx ./usage-report/inspect-db-report.ts",
11
12
  "db:admin": "tsx ./usage-report/admin-db.ts",
12
13
  "admin:backfill-avatars": "tsx ./usage-report/backfill-avatars.ts",
@@ -15,27 +16,27 @@
15
16
  "dependencies": {
16
17
  "@adviser/cement": "~0.5.34",
17
18
  "@adviser/scopey": "~0.0.4",
18
- "@cf-wasm/quickjs": "~0.2.5",
19
+ "@cf-wasm/quickjs": "~0.2.6",
19
20
  "@cloudflare/workers-types": "~5.20260715.1",
20
21
  "@libsql/client": "~0.17.4",
21
22
  "@neondatabase/serverless": "~1.1.0",
22
23
  "@noble/hashes": "~2.2.0",
23
- "@vibes.diy/api-pkg": "10.6.1",
24
- "@vibes.diy/api-sql": "10.6.1",
25
- "@vibes.diy/api-types": "10.6.1",
26
- "@vibes.diy/call-ai-v2": "10.6.1",
27
- "@vibes.diy/identity": "10.6.1",
28
- "@vibes.diy/prompts": "10.6.1",
29
- "@vibes.diy/vibe-db-explorer": "10.6.1",
30
- "@vibes.diy/vibe-runtime": "10.6.1",
31
- "@vibes.diy/vibe-types": "10.6.1",
24
+ "@vibes.diy/api-pkg": "10.6.3",
25
+ "@vibes.diy/api-sql": "10.6.3",
26
+ "@vibes.diy/api-types": "10.6.3",
27
+ "@vibes.diy/call-ai-v2": "10.6.3",
28
+ "@vibes.diy/identity": "10.6.3",
29
+ "@vibes.diy/prompts": "10.6.3",
30
+ "@vibes.diy/vibe-db-explorer": "10.6.3",
31
+ "@vibes.diy/vibe-runtime": "10.6.3",
32
+ "@vibes.diy/vibe-types": "10.6.3",
32
33
  "acorn": "~8.17.0",
33
34
  "arktype": "~2.2.3",
34
- "call-ai": "10.6.1",
35
+ "call-ai": "10.6.3",
35
36
  "cookie": "~2.0.1",
36
37
  "csv-parse": "~7.0.1",
37
38
  "drizzle-orm": "~0.45.2",
38
- "jose": "~6.2.2",
39
+ "jose": "~6.2.4",
39
40
  "mime": "~4.1.0",
40
41
  "multiformats": "~14.0.4",
41
42
  "parse5": "~8.0.1",
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,232 @@
1
+ import { Pool } from "@neondatabase/serverless";
2
+ import { Result, exception2Result } from "@adviser/cement";
3
+ import { formatError, loadDevVars } from "./usage-report-util.js";
4
+ const AUTUMN_BASE = "https://api.useautumn.com/v1";
5
+ const FEATURE_ID = "ai_credits";
6
+ const CREDITS_PER_DOLLAR = 200;
7
+ const FREE_GRANT = 500;
8
+ const PLUS_GRANT = 1000;
9
+ const FALLBACK_USD_PER_MTOK = 5;
10
+ function arg(name) {
11
+ const i = process.argv.indexOf(name);
12
+ return i >= 0 ? process.argv[i + 1] : undefined;
13
+ }
14
+ function asString(v) {
15
+ return typeof v === "string" ? v : undefined;
16
+ }
17
+ function asNumber(v) {
18
+ return typeof v === "number" && Number.isFinite(v) ? v : undefined;
19
+ }
20
+ function ms(epochOrIso) {
21
+ if (epochOrIso === undefined)
22
+ return "-";
23
+ const d = typeof epochOrIso === "number" ? new Date(epochOrIso) : new Date(epochOrIso);
24
+ return Number.isNaN(d.getTime()) ? "-" : d.toISOString().slice(0, 16);
25
+ }
26
+ function redactEmail(email) {
27
+ if (email === undefined || email === "")
28
+ return "(none)";
29
+ const [user, domain] = email.split("@");
30
+ if (domain === undefined)
31
+ return "***";
32
+ const masked = user.length <= 2 ? `${user[0]}*` : `${user.slice(0, 2)}${"*".repeat(Math.max(1, user.length - 2))}`;
33
+ return `${masked}@${domain}`;
34
+ }
35
+ async function autumnPost(key, path, body) {
36
+ const res = await fetch(`${AUTUMN_BASE}${path}`, {
37
+ method: "POST",
38
+ headers: { authorization: `Bearer ${key}`, "x-api-version": "2.3.0", "content-type": "application/json" },
39
+ body: JSON.stringify(body),
40
+ });
41
+ return { status: res.status, json: (await res.json().catch(() => ({}))) };
42
+ }
43
+ async function autumnGet(key, path) {
44
+ const res = await fetch(`${AUTUMN_BASE}${path}`, {
45
+ method: "GET",
46
+ headers: { authorization: `Bearer ${key}`, "x-api-version": "2.3.0" },
47
+ });
48
+ return { status: res.status, json: (await res.json().catch(() => ({}))) };
49
+ }
50
+ function addMonthsIso(iso, n) {
51
+ const d = new Date(iso);
52
+ if (Number.isNaN(d.getTime()))
53
+ return iso;
54
+ d.setUTCMonth(d.getUTCMonth() + n);
55
+ return d.toISOString();
56
+ }
57
+ function wallCrossing(turns, from, to, grant) {
58
+ let cum = 0;
59
+ let maxPeriod = 0;
60
+ let crossedAt;
61
+ let crossedThisPeriod = false;
62
+ let crossPeriodTotal;
63
+ let periodEnd = addMonthsIso(from, 1);
64
+ const closePeriod = () => {
65
+ if (cum > maxPeriod)
66
+ maxPeriod = cum;
67
+ if (crossedThisPeriod && crossPeriodTotal === undefined)
68
+ crossPeriodTotal = cum;
69
+ };
70
+ for (const t of turns) {
71
+ if (t.created < from || t.created >= to)
72
+ continue;
73
+ while (t.created >= periodEnd) {
74
+ closePeriod();
75
+ cum = 0;
76
+ crossedThisPeriod = false;
77
+ periodEnd = addMonthsIso(periodEnd, 1);
78
+ }
79
+ cum += t.credits;
80
+ if (crossedAt === undefined && cum >= grant) {
81
+ crossedAt = t.created;
82
+ crossedThisPeriod = true;
83
+ }
84
+ }
85
+ closePeriod();
86
+ return { crossedAt, total: crossedAt !== undefined ? (crossPeriodTotal ?? 0) : maxPeriod };
87
+ }
88
+ async function run() {
89
+ loadDevVars();
90
+ const who = process.argv[2];
91
+ if (who === undefined || who.startsWith("--")) {
92
+ return Result.Err("usage: pnpm --dir vibes.diy/api/svc run journey <userId|handle> [--since 2026-05-01]");
93
+ }
94
+ const since = arg("--since") ?? "2026-05-01";
95
+ const connectionString = process.env["NEON_DATABASE_URL"] ?? process.env["DATABASE_URL"];
96
+ if (connectionString === undefined)
97
+ return Result.Err("NEON_DATABASE_URL is required (prod Neon)");
98
+ const autumnKey = process.env["AUTUMN_SECRET_KEY"];
99
+ const clerkKey = process.env["CLERK_SECRET_KEY"];
100
+ const pool = new Pool({ connectionString });
101
+ const result = await exception2Result(async () => {
102
+ let userId = who;
103
+ if (!who.startsWith("user_")) {
104
+ const r = await pool.query(`select "userId" from "UserSlugBindings" where "userSlug" = $1 limit 1`, [who]);
105
+ const row = r.rows[0];
106
+ if (row?.userId === undefined)
107
+ throw new Error(`no userId bound to handle "${who}"`);
108
+ userId = row.userId;
109
+ }
110
+ const handlesRes = await pool.query(`select "userSlug" as handle from "UserSlugBindings" where "userId" = $1 order by created`, [userId]);
111
+ const handles = handlesRes.rows.map((r) => r.handle);
112
+ const costExpr = `coalesce((ref#>>'{usage,given,0,cost}')::numeric, ("totalTokens"::numeric / 1000000) * ${FALLBACK_USD_PER_MTOK})`;
113
+ const creditsPerTurn = `round(${costExpr} * ${CREDITS_PER_DOLLAR})`;
114
+ const creditsSum = `round(sum(${costExpr}) * ${CREDITS_PER_DOLLAR})`;
115
+ const summaryRes = await pool.query(`select count(*) turns, count(distinct "chatId") chats, count(distinct substr(created,1,10)) active_days,
116
+ min(created) first_turn, max(created) last_turn, ${creditsSum} lifetime_credits
117
+ from "PromptContexts" where "userId" = $1`, [userId]);
118
+ const summary = (summaryRes.rows[0] ?? {});
119
+ const monthsRes = await pool.query(`select substr(created,1,7) mo, count(*) turns, ${creditsSum} credits
120
+ from "PromptContexts" where "userId" = $1 group by 1 order by 1`, [userId]);
121
+ const turnsRes = await pool.query(`select "chatId", created, ${creditsPerTurn} credits from "PromptContexts" where "userId" = $1 and created >= $2 order by created`, [userId, since]);
122
+ const turns = turnsRes.rows.map((r) => ({
123
+ chatId: asString(r.chatId) ?? "",
124
+ created: asString(r.created) ?? "",
125
+ credits: Number(r.credits ?? 0),
126
+ }));
127
+ const appsRes = await pool.query(`select "appSlug", max(created) created from "Apps" where "userId" = $1 group by 1 order by max(created) desc limit 6`, [userId]);
128
+ const chatAppRes = await pool.query(`select "chatId", "appSlug" from "ChatContexts" where "userId" = $1`, [userId]);
129
+ const chatApp = new Map();
130
+ for (const r of chatAppRes.rows)
131
+ chatApp.set(r.chatId, r.appSlug);
132
+ let plan = "unknown";
133
+ let remaining;
134
+ let usage;
135
+ let allowed;
136
+ let unlimited = false;
137
+ let custCreated;
138
+ let plusStarted;
139
+ let purchases = [];
140
+ let paidInvoices = [];
141
+ let autumnKnown = false;
142
+ if (autumnKey !== undefined && autumnKey !== "") {
143
+ const chk = await autumnPost(autumnKey, "/balances.check", { customer_id: userId, feature_id: FEATURE_ID });
144
+ autumnKnown = chk.status === 200;
145
+ const notFound = chk.status === 404 && JSON.stringify(chk.json).includes("customer_not_found");
146
+ if (!autumnKnown && !notFound) {
147
+ throw new Error(`autumn balances.check failed (${chk.status}) for ${userId}: ${JSON.stringify(chk.json).slice(0, 200)}`);
148
+ }
149
+ if (autumnKnown) {
150
+ const bal = (chk.json.balance ?? {});
151
+ remaining = asNumber(bal.remaining);
152
+ usage = asNumber(bal.usage);
153
+ allowed = chk.json.allowed;
154
+ unlimited = bal.unlimited === true;
155
+ const cust = await autumnGet(autumnKey, `/customers/${encodeURIComponent(userId)}?expand[]=invoices`);
156
+ const subs = Array.isArray(cust.json.subscriptions) ? cust.json.subscriptions : [];
157
+ const plusSub = subs.find((s) => s.plan_id === "plus");
158
+ plan = plusSub !== undefined ? "plus" : "free";
159
+ custCreated = asNumber(cust.json.created_at);
160
+ plusStarted = asNumber(plusSub?.started_at);
161
+ purchases = (Array.isArray(cust.json.purchases) ? cust.json.purchases : []);
162
+ paidInvoices = (Array.isArray(cust.json.invoices) ? cust.json.invoices : [])
163
+ .filter((iv) => iv.status === "paid")
164
+ .map((iv) => ({ plan_ids: iv.plan_ids, total: iv.total, created_at: asNumber(iv.created_at) }));
165
+ }
166
+ }
167
+ let email;
168
+ let name;
169
+ let signup;
170
+ if (clerkKey !== undefined && clerkKey !== "") {
171
+ const res = await fetch(`https://api.clerk.com/v1/users/${userId}`, { headers: { authorization: `Bearer ${clerkKey}` } });
172
+ if (res.ok) {
173
+ const u = (await res.json());
174
+ const emails = (Array.isArray(u.email_addresses) ? u.email_addresses : []);
175
+ const primary = emails.find((e) => e.id === u.primary_email_address_id) ?? emails[0];
176
+ email = asString(primary?.email_address);
177
+ name = [asString(u.first_name), asString(u.last_name)].filter(Boolean).join(" ") || undefined;
178
+ signup = ms(asNumber(u.created_at));
179
+ }
180
+ }
181
+ const freeEnd = plusStarted !== undefined ? new Date(plusStarted).toISOString() : "9999";
182
+ const freeFrom = custCreated !== undefined ? new Date(custCreated).toISOString() : since;
183
+ const free = wallCrossing(turns, freeFrom, freeEnd, FREE_GRANT);
184
+ const plus = plusStarted !== undefined ? wallCrossing(turns, new Date(plusStarted).toISOString(), "9999", PLUS_GRANT) : undefined;
185
+ const walledNow = autumnKnown && !unlimited && (allowed === false || (remaining === 0 && (usage ?? 0) > 0));
186
+ const converted = plan === "plus" ? "subscribed to Plus" : purchases.length > 0 ? "bought top-up(s)" : "none";
187
+ const wallChatId = free.crossedAt !== undefined ? turns.find((t) => t.created === free.crossedAt)?.chatId : undefined;
188
+ const wallApp = wallChatId !== undefined ? chatApp.get(wallChatId) : undefined;
189
+ const L = [];
190
+ L.push(`\n=== USER JOURNEY: ${who} ===`);
191
+ L.push(`userId: ${userId}`);
192
+ L.push(`handles: ${handles.join(", ") || "(none)"}`);
193
+ L.push(`identity: ${name ?? "(no name)"} ${redactEmail(email)} signup=${signup ?? "?"}`);
194
+ L.push(`\n-- spend timeline (PromptContexts, truth) --`);
195
+ L.push(`lifetime: ${asNumber(Number(summary.lifetime_credits)) ?? 0} credits over ${summary.turns} turns / ${summary.chats} chats / ${summary.active_days} active days`);
196
+ L.push(`window: first=${ms(asString(summary.first_turn))} last=${ms(asString(summary.last_turn))}`);
197
+ for (const r of monthsRes.rows)
198
+ L.push(` ${r.mo}: ${r.turns} turns, ${r.credits} credits`);
199
+ L.push(`\n-- what they built --`);
200
+ for (const r of appsRes.rows)
201
+ L.push(` ${r.appSlug} (@${r.created.slice(0, 10)})`);
202
+ L.push(`\n-- billing / wall / conversion (Autumn, read-only) --`);
203
+ if (!autumnKnown) {
204
+ L.push(` NOT in Autumn (customer_not_found) — no billing signal. Prod tracking began ~2026-07-11;`);
205
+ L.push(` pre-tracking users have no confirmable wall or conversion. Wall below is DB-inferred only.`);
206
+ }
207
+ else {
208
+ L.push(` plan=${plan} remaining=${remaining} usage=${usage} allowed=${String(allowed)}${unlimited ? " UNLIMITED(comped)" : ""}`);
209
+ L.push(` custCreated=${ms(custCreated)} plusStarted=${ms(plusStarted)}`);
210
+ L.push(` paidInvoices: ${JSON.stringify(paidInvoices.map((iv) => ({ plans: iv.plan_ids, usd: iv.total, at: ms(iv.created_at) })))}`);
211
+ }
212
+ L.push(` FREE 500-wall crossed at: ${free.crossedAt !== undefined ? ms(free.crossedAt) : "NOT reached"} (period spend ${free.total} cr, app=${wallApp ?? "?"})`);
213
+ if (plus !== undefined)
214
+ L.push(` PLUS 1000-wall crossed at: ${plus.crossedAt !== undefined ? ms(plus.crossedAt) : "NOT reached"} (period spend ${plus.total} cr)`);
215
+ L.push(`\n>> VERDICT: ${walledNow ? "currently WALLED" : autumnKnown ? "not currently walled" : "no Autumn record"} | converted: ${converted}`);
216
+ if (free.crossedAt !== undefined && plusStarted !== undefined && plusStarted > new Date(free.crossedAt).getTime()) {
217
+ const hrs = (plusStarted - new Date(free.crossedAt).getTime()) / 3.6e6;
218
+ L.push(`>> free-wall -> Plus in ${hrs.toFixed(1)}h (${(hrs / 24).toFixed(2)}d)`);
219
+ }
220
+ L.push(`\nNext step (per runbook): post the cohort summary to team Discord (agents/user-journey-runbook.md § Report to Discord).`);
221
+ console.log(L.join("\n"));
222
+ });
223
+ await pool.end();
224
+ return result;
225
+ }
226
+ run().then((result) => {
227
+ if (result.isErr()) {
228
+ console.error(formatError(result.Err()));
229
+ process.exitCode = 1;
230
+ }
231
+ });
232
+ //# sourceMappingURL=user-journey.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-journey.js","sourceRoot":"","sources":["../../jsr/usage-report/user-journey.ts"],"names":[],"mappings":"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"}