@vibes.diy/api-svc 10.6.1 → 10.6.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.
- package/intern/read-anonymous-seed-docs.js +8 -17
- package/intern/read-anonymous-seed-docs.js.map +1 -1
- package/intern/swr-wrapper-html-cache.d.ts +1 -0
- package/intern/swr-wrapper-html-cache.js +3 -3
- package/intern/swr-wrapper-html-cache.js.map +1 -1
- package/package.json +14 -13
- package/usage-report/user-journey.d.ts +1 -0
- package/usage-report/user-journey.js +232 -0
- package/usage-report/user-journey.js.map +1 -0
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { exception2Result } from "@adviser/cement";
|
|
2
|
-
import { and, eq
|
|
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
|
|
37
|
-
|
|
38
|
-
.
|
|
39
|
-
|
|
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
|
-
|
|
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":"AAeA,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,
|
|
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":"AAgBA,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAmB,UAAU,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAErH,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;
|
|
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.
|
|
3
|
+
"version": "10.6.2",
|
|
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.
|
|
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.
|
|
24
|
-
"@vibes.diy/api-sql": "10.6.
|
|
25
|
-
"@vibes.diy/api-types": "10.6.
|
|
26
|
-
"@vibes.diy/call-ai-v2": "10.6.
|
|
27
|
-
"@vibes.diy/identity": "10.6.
|
|
28
|
-
"@vibes.diy/prompts": "10.6.
|
|
29
|
-
"@vibes.diy/vibe-db-explorer": "10.6.
|
|
30
|
-
"@vibes.diy/vibe-runtime": "10.6.
|
|
31
|
-
"@vibes.diy/vibe-types": "10.6.
|
|
24
|
+
"@vibes.diy/api-pkg": "10.6.2",
|
|
25
|
+
"@vibes.diy/api-sql": "10.6.2",
|
|
26
|
+
"@vibes.diy/api-types": "10.6.2",
|
|
27
|
+
"@vibes.diy/call-ai-v2": "10.6.2",
|
|
28
|
+
"@vibes.diy/identity": "10.6.2",
|
|
29
|
+
"@vibes.diy/prompts": "10.6.2",
|
|
30
|
+
"@vibes.diy/vibe-db-explorer": "10.6.2",
|
|
31
|
+
"@vibes.diy/vibe-runtime": "10.6.2",
|
|
32
|
+
"@vibes.diy/vibe-types": "10.6.2",
|
|
32
33
|
"acorn": "~8.17.0",
|
|
33
34
|
"arktype": "~2.2.3",
|
|
34
|
-
"call-ai": "10.6.
|
|
35
|
+
"call-ai": "10.6.2",
|
|
35
36
|
"cookie": "~2.0.1",
|
|
36
37
|
"csv-parse": "~7.0.1",
|
|
37
38
|
"drizzle-orm": "~0.45.2",
|
|
38
|
-
"jose": "~6.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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"}
|