@vibes.diy/api-svc 12.3.2 → 13.0.0

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 (55) hide show
  1. package/index.d.ts +1 -0
  2. package/index.js +1 -0
  3. package/index.js.map +1 -1
  4. package/intern/dead-letter-log.d.ts +10 -0
  5. package/intern/dead-letter-log.js +60 -0
  6. package/intern/dead-letter-log.js.map +1 -0
  7. package/intern/ensure-chat-id.d.ts +1 -0
  8. package/intern/ensure-chat-id.js +4 -2
  9. package/intern/ensure-chat-id.js.map +1 -1
  10. package/intern/get-open-turn.js +19 -6
  11. package/intern/get-open-turn.js.map +1 -1
  12. package/intern/half-open-turn.d.ts +5 -2
  13. package/intern/half-open-turn.js +7 -3
  14. package/intern/half-open-turn.js.map +1 -1
  15. package/intern/mint-admission.d.ts +1 -0
  16. package/intern/mint-admission.js +10 -0
  17. package/intern/mint-admission.js.map +1 -1
  18. package/intern/mint-fire-core.d.ts +2 -1
  19. package/intern/mint-fire-core.js +14 -7
  20. package/intern/mint-fire-core.js.map +1 -1
  21. package/intern/mint-job-store.d.ts +17 -7
  22. package/intern/mint-job-store.js +47 -5
  23. package/intern/mint-job-store.js.map +1 -1
  24. package/intern/prompt-assembly.d.ts +2 -0
  25. package/intern/prompt-assembly.js +9 -1
  26. package/intern/prompt-assembly.js.map +1 -1
  27. package/intern/work-tools.d.ts +13 -1
  28. package/intern/work-tools.js +45 -2
  29. package/intern/work-tools.js.map +1 -1
  30. package/package.json +14 -12
  31. package/public/llm-dispatch.d.ts +1 -0
  32. package/public/llm-dispatch.js +1 -1
  33. package/public/llm-dispatch.js.map +1 -1
  34. package/public/open-chat.js +9 -5
  35. package/public/open-chat.js.map +1 -1
  36. package/public/prompt-chat-section.d.ts +2 -2
  37. package/public/prompt-chat-section.js +20 -5
  38. package/public/prompt-chat-section.js.map +1 -1
  39. package/public/serv-entry-point.js +2 -1
  40. package/public/serv-entry-point.js.map +1 -1
  41. package/public/shared-mint.d.ts +1 -0
  42. package/public/shared-mint.js +10 -4
  43. package/public/shared-mint.js.map +1 -1
  44. package/usage-report/backfill-published-chips-util.d.ts +43 -0
  45. package/usage-report/backfill-published-chips-util.js +120 -0
  46. package/usage-report/backfill-published-chips-util.js.map +1 -0
  47. package/usage-report/backfill-published-chips.d.ts +1 -0
  48. package/usage-report/backfill-published-chips.js +97 -0
  49. package/usage-report/backfill-published-chips.js.map +1 -0
  50. package/usage-report/new-user-alert-util.d.ts +100 -0
  51. package/usage-report/new-user-alert-util.js +138 -0
  52. package/usage-report/new-user-alert-util.js.map +1 -0
  53. package/usage-report/new-user-alert.d.ts +1 -0
  54. package/usage-report/new-user-alert.js +227 -0
  55. package/usage-report/new-user-alert.js.map +1 -0
@@ -4,10 +4,15 @@ import { type } from "arktype";
4
4
  import { unwrapMsgBase, wrapMsgBase } from "../unwrap-msg-base.js";
5
5
  import { checkAuth } from "../check-auth.js";
6
6
  import { ensureChatId } from "../intern/ensure-chat-id.js";
7
- import { tryReserveMint, releaseMint } from "../intern/mint-admission.js";
7
+ import { tryReserveMint, mintReleaseOnce } from "../intern/mint-admission.js";
8
8
  export function firstTurnFromDispatch(dispatchResult) {
9
9
  return dispatchResult !== undefined && dispatchResult.isOk() && dispatchResult.Ok().accepted === true;
10
10
  }
11
+ export async function settleMintJobOrder(release, mintJobOrder) {
12
+ release();
13
+ if (mintJobOrder !== undefined)
14
+ await exception2Result(() => mintJobOrder);
15
+ }
11
16
  export const sharedMint = {
12
17
  hash: "shared-mint-handler",
13
18
  validate: unwrapMsgBase(async (msg) => {
@@ -31,6 +36,7 @@ export const sharedMint = {
31
36
  }));
32
37
  return Result.Ok(EventoResult.Continue);
33
38
  }
39
+ const release = mintReleaseOnce(adm);
34
40
  try {
35
41
  const openChatShaped = {
36
42
  ...req,
@@ -47,7 +53,7 @@ export const sharedMint = {
47
53
  }));
48
54
  return Result.Ok(EventoResult.Continue);
49
55
  }
50
- const { appSlug, ownerHandle, chatId, draft } = rChatId.Ok();
56
+ const { appSlug, ownerHandle, chatId, draft, mintJobOrder } = rChatId.Ok();
51
57
  const dispatch = vctx.dispatchMintFire;
52
58
  let dispatchResult;
53
59
  if (req.deferFire !== true && dispatch !== undefined) {
@@ -62,11 +68,11 @@ export const sharedMint = {
62
68
  ...(firstTurnFired ? { firstTurnFired: true } : {}),
63
69
  ...(draft === true ? { draft: true } : {}),
64
70
  });
71
+ await settleMintJobOrder(release, mintJobOrder);
65
72
  return Result.Ok(EventoResult.Continue);
66
73
  }
67
74
  finally {
68
- if (adm !== undefined)
69
- releaseMint(adm);
75
+ release();
70
76
  }
71
77
  }),
72
78
  };
@@ -1 +1 @@
1
- {"version":3,"file":"shared-mint.js","sourceRoot":"","sources":["../../jsr/public/shared-mint.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"shared-mint.js","sourceRoot":"","sources":["../../jsr/public/shared-mint.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ import { Result } from "@adviser/cement";
2
+ import { VibesApiSQLCtx } from "../types.js";
3
+ export interface ChipBackfillCandidate {
4
+ readonly ownerHandle: string;
5
+ readonly appSlug: string;
6
+ readonly releaseSeq: number;
7
+ }
8
+ export declare function parsePositiveIntFlag(args: readonly string[], flag: string): Result<number | undefined>;
9
+ export type ChipBackfillOutcome = "stamped" | "stamped-empty" | "skipped" | "planned" | "failed";
10
+ export interface ChipBackfillRow {
11
+ readonly ownerHandle: string;
12
+ readonly appSlug: string;
13
+ readonly outcome: ChipBackfillOutcome;
14
+ readonly releaseSeq?: number;
15
+ readonly chips?: readonly string[];
16
+ readonly reason?: string;
17
+ }
18
+ export interface ChipBackfillSummary {
19
+ readonly candidates: number;
20
+ readonly stamped: number;
21
+ readonly stampedEmpty: number;
22
+ readonly skipped: number;
23
+ readonly planned: number;
24
+ readonly failed: number;
25
+ readonly rows: readonly ChipBackfillRow[];
26
+ }
27
+ export interface ChipBackfillOptions {
28
+ readonly apply: boolean;
29
+ readonly limit?: number;
30
+ readonly concurrency?: number;
31
+ readonly ownerHandle?: string;
32
+ readonly onRow?: (row: ChipBackfillRow, done: number, total: number) => void;
33
+ }
34
+ export declare const DEFAULT_CHIP_BACKFILL_CONCURRENCY = 2;
35
+ export declare function discoverUnstampedApps(vctx: VibesApiSQLCtx, opts?: {
36
+ readonly limit?: number;
37
+ readonly ownerHandle?: string;
38
+ }): Promise<ChipBackfillCandidate[]>;
39
+ export declare function processApp(vctx: VibesApiSQLCtx, app: {
40
+ readonly ownerHandle: string;
41
+ readonly appSlug: string;
42
+ }, apply: boolean): Promise<ChipBackfillRow>;
43
+ export declare function runChipBackfill(vctx: VibesApiSQLCtx, opts: ChipBackfillOptions): Promise<ChipBackfillSummary>;
@@ -0,0 +1,120 @@
1
+ import { and, desc, eq, isNull } from "drizzle-orm/sql/expressions";
2
+ import { Result } from "@adviser/cement";
3
+ import { readChipStamp, stampReleaseChips } from "../public/chip-stamp.js";
4
+ import { selectLatestAppPerSlug } from "../public/select-app.js";
5
+ export function parsePositiveIntFlag(args, flag) {
6
+ const i = args.indexOf(flag);
7
+ if (i < 0)
8
+ return Result.Ok(undefined);
9
+ const raw = args[i + 1];
10
+ if (raw === undefined || raw.startsWith("--")) {
11
+ return Result.Err(`${flag} requires a positive integer value (got ${raw === undefined ? "nothing" : `"${raw}"`})`);
12
+ }
13
+ const n = Number(raw);
14
+ if (Number.isFinite(n) === false || Number.isInteger(n) === false || n <= 0) {
15
+ return Result.Err(`${flag} requires a positive integer value (got "${raw}")`);
16
+ }
17
+ return Result.Ok(n);
18
+ }
19
+ export const DEFAULT_CHIP_BACKFILL_CONCURRENCY = 2;
20
+ export async function discoverUnstampedApps(vctx, opts) {
21
+ const t = vctx.sql.tables.apps;
22
+ const ownerScope = opts?.ownerHandle;
23
+ const rows = await vctx.sql.db
24
+ .select({ ownerHandle: t.ownerHandle, appSlug: t.appSlug, releaseSeq: t.releaseSeq })
25
+ .from(t)
26
+ .where(ownerScope === undefined
27
+ ? and(eq(t.mode, "production"), isNull(t.publishedChips))
28
+ : and(eq(t.mode, "production"), isNull(t.publishedChips), eq(t.ownerHandle, ownerScope)))
29
+ .orderBy(t.ownerHandle, t.appSlug, desc(t.releaseSeq));
30
+ const seen = new Set();
31
+ const out = [];
32
+ for (const r of rows) {
33
+ const key = `${r.ownerHandle}/${r.appSlug}`;
34
+ if (seen.has(key))
35
+ continue;
36
+ seen.add(key);
37
+ out.push({ ownerHandle: r.ownerHandle, appSlug: r.appSlug, releaseSeq: r.releaseSeq });
38
+ if (opts?.limit !== undefined && out.length >= opts.limit)
39
+ break;
40
+ }
41
+ return out;
42
+ }
43
+ async function readStampAt(vctx, p) {
44
+ const t = vctx.sql.tables.apps;
45
+ const rows = await vctx.sql.db
46
+ .select({ publishedChips: t.publishedChips })
47
+ .from(t)
48
+ .where(and(eq(t.appSlug, p.appSlug), eq(t.userId, p.userId), eq(t.releaseSeq, p.releaseSeq)))
49
+ .limit(1);
50
+ if (rows[0] === undefined)
51
+ return undefined;
52
+ return readChipStamp(rows[0].publishedChips);
53
+ }
54
+ export async function processApp(vctx, app, apply) {
55
+ const base = { ownerHandle: app.ownerHandle, appSlug: app.appSlug };
56
+ try {
57
+ const live = await selectLatestAppPerSlug(vctx, app);
58
+ if (live === undefined)
59
+ return { ...base, outcome: "skipped", reason: "no app row" };
60
+ if (live.mode !== "production")
61
+ return { ...base, outcome: "skipped", reason: "live release is not production" };
62
+ if (readChipStamp(live.publishedChips) !== undefined) {
63
+ return { ...base, outcome: "skipped", releaseSeq: live.releaseSeq, reason: "already stamped" };
64
+ }
65
+ if (apply === false)
66
+ return { ...base, outcome: "planned", releaseSeq: live.releaseSeq };
67
+ await stampReleaseChips(vctx, {
68
+ ownerHandle: app.ownerHandle,
69
+ appSlug: app.appSlug,
70
+ userId: live.userId,
71
+ releaseSeq: live.releaseSeq,
72
+ fsId: live.fsId,
73
+ });
74
+ const written = await readStampAt(vctx, { appSlug: app.appSlug, userId: live.userId, releaseSeq: live.releaseSeq });
75
+ if (written === undefined) {
76
+ return { ...base, outcome: "failed", releaseSeq: live.releaseSeq, reason: "row still unstamped after stampReleaseChips" };
77
+ }
78
+ return {
79
+ ...base,
80
+ outcome: written.length === 0 ? "stamped-empty" : "stamped",
81
+ releaseSeq: live.releaseSeq,
82
+ chips: written,
83
+ };
84
+ }
85
+ catch (e) {
86
+ return { ...base, outcome: "failed", reason: e instanceof Error ? e.message : String(e) };
87
+ }
88
+ }
89
+ export async function runChipBackfill(vctx, opts) {
90
+ const candidates = await discoverUnstampedApps(vctx, { limit: opts.limit, ownerHandle: opts.ownerHandle });
91
+ const rows = new Array(candidates.length);
92
+ const concurrency = Math.max(1, opts.concurrency ?? DEFAULT_CHIP_BACKFILL_CONCURRENCY);
93
+ let next = 0;
94
+ let done = 0;
95
+ async function worker() {
96
+ for (;;) {
97
+ const i = next;
98
+ next += 1;
99
+ const app = candidates[i];
100
+ if (app === undefined)
101
+ return;
102
+ const row = await processApp(vctx, app, opts.apply);
103
+ rows[i] = row;
104
+ done += 1;
105
+ opts.onRow?.(row, done, candidates.length);
106
+ }
107
+ }
108
+ await Promise.all(Array.from({ length: Math.min(concurrency, candidates.length) }, () => worker()));
109
+ const count = (o) => rows.filter((r) => r.outcome === o).length;
110
+ return {
111
+ candidates: candidates.length,
112
+ stamped: count("stamped"),
113
+ stampedEmpty: count("stamped-empty"),
114
+ skipped: count("skipped"),
115
+ planned: count("planned"),
116
+ failed: count("failed"),
117
+ rows,
118
+ };
119
+ }
120
+ //# sourceMappingURL=backfill-published-chips-util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backfill-published-chips-util.js","sourceRoot":"","sources":["../../jsr/usage-report/backfill-published-chips-util.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,97 @@
1
+ import { Pool } from "@neondatabase/serverless";
2
+ import { drizzle as drizzleNeon } from "drizzle-orm/neon-serverless";
3
+ import { Result, exception2Result } from "@adviser/cement";
4
+ import { ensureSuperThis } from "@vibes.diy/identity";
5
+ import { createVibesApiTables } from "@vibes.diy/api-sql";
6
+ import { DEFAULT_CHIP_BACKFILL_CONCURRENCY, parsePositiveIntFlag, runChipBackfill, } from "./backfill-published-chips-util.js";
7
+ import { formatError, loadDevVars } from "./usage-report-util.js";
8
+ const PROGRESS_EVERY = 25;
9
+ function printUsage() {
10
+ console.log(`
11
+ Usage:
12
+ pnpm --dir vibes.diy/api/svc run admin:backfill-published-chips # dry run (read-only)
13
+ pnpm --dir vibes.diy/api/svc run admin:backfill-published-chips -- --apply # write pass
14
+ ... -- --apply --limit 50 # cap for a controlled batch
15
+ ... -- --apply --concurrency 4 # default ${DEFAULT_CHIP_BACKFILL_CONCURRENCY}
16
+
17
+ --limit and --concurrency take a POSITIVE INTEGER. A bad value is an error, not
18
+ a fallback — an unusable --limit must never quietly mean "sweep everything".
19
+
20
+ Environment:
21
+ NEON_DATABASE_URL read/discovery connection (dry run)
22
+ NEON_DATABASE_ADMIN_URL write connection (required for --apply)
23
+ `.trim());
24
+ }
25
+ function describe(row) {
26
+ const label = `@${row.ownerHandle}/${row.appSlug}`;
27
+ const seq = row.releaseSeq === undefined ? "" : ` seq=${row.releaseSeq}`;
28
+ const chips = row.chips === undefined ? "" : ` ${JSON.stringify(row.chips)}`;
29
+ const reason = row.reason === undefined ? "" : ` (${row.reason})`;
30
+ return `${row.outcome.toUpperCase().padEnd(14)}${label}${seq}${chips}${reason}`;
31
+ }
32
+ async function run() {
33
+ loadDevVars();
34
+ const args = process.argv.slice(2);
35
+ if (args.includes("--help") || args.includes("-h")) {
36
+ printUsage();
37
+ return Result.Ok(undefined);
38
+ }
39
+ const apply = args.includes("--apply");
40
+ const rLimit = parsePositiveIntFlag(args, "--limit");
41
+ if (rLimit.isErr()) {
42
+ printUsage();
43
+ return Result.Err(rLimit.Err());
44
+ }
45
+ const rConcurrency = parsePositiveIntFlag(args, "--concurrency");
46
+ if (rConcurrency.isErr()) {
47
+ printUsage();
48
+ return Result.Err(rConcurrency.Err());
49
+ }
50
+ const limit = rLimit.Ok();
51
+ const concurrency = rConcurrency.Ok() ?? DEFAULT_CHIP_BACKFILL_CONCURRENCY;
52
+ const connectionString = apply ? process.env["NEON_DATABASE_ADMIN_URL"] : process.env["NEON_DATABASE_URL"];
53
+ if (connectionString === undefined) {
54
+ printUsage();
55
+ return Result.Err(`${apply ? "NEON_DATABASE_ADMIN_URL" : "NEON_DATABASE_URL"} is required (set in .dev.vars or env)`);
56
+ }
57
+ const pool = new Pool({ connectionString });
58
+ const db = drizzleNeon(pool);
59
+ const vctx = {
60
+ sthis: ensureSuperThis(),
61
+ sql: { db, tables: createVibesApiTables("pg"), flavour: "pg" },
62
+ };
63
+ const result = await exception2Result(async () => {
64
+ const summary = await runChipBackfill(vctx, {
65
+ apply,
66
+ ...(limit === undefined ? {} : { limit }),
67
+ concurrency,
68
+ onRow: (row, done, total) => {
69
+ if (row.outcome === "failed" || row.outcome === "skipped")
70
+ console.log(describe(row));
71
+ if (done % PROGRESS_EVERY === 0 || done === total)
72
+ console.log(` … ${done}/${total}`);
73
+ },
74
+ });
75
+ console.log(`\ncandidates=${summary.candidates} (apps with at least one unstamped production release)`);
76
+ if (apply === false) {
77
+ console.log(`planned=${summary.planned} skipped=${summary.skipped} (skipped = live release already stamped or not production — nothing to do)\nDry run — nothing written. Re-run with --apply (concurrency ${concurrency}).`);
78
+ return;
79
+ }
80
+ console.log(`stamped=${summary.stamped} stamped-empty=${summary.stampedEmpty} skipped=${summary.skipped} failed=${summary.failed}\n` +
81
+ `skipped = live release already stamped or not production (nothing to do); only failed leaves an app on the expensive path.`);
82
+ if (summary.failed > 0) {
83
+ throw new Error(`sweep finished with ${summary.failed} failed app(s) — re-run to retry (already-stamped rows are skipped)`);
84
+ }
85
+ });
86
+ await pool.end();
87
+ if (result.isErr())
88
+ return Result.Err(result.Err());
89
+ return Result.Ok(undefined);
90
+ }
91
+ run().then((r) => {
92
+ if (r.isErr()) {
93
+ console.error(formatError(r.Err()));
94
+ process.exit(1);
95
+ }
96
+ });
97
+ //# sourceMappingURL=backfill-published-chips.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backfill-published-chips.js","sourceRoot":"","sources":["../../jsr/usage-report/backfill-published-chips.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,100 @@
1
+ export declare function sanitizeForDiscord(value: string): string;
2
+ export declare const KNOWN_STAFF_EMAIL_DOMAINS: readonly string[];
3
+ export declare const KNOWN_STAFF_USER_IDS: readonly string[];
4
+ export declare const EXCLUDED_HANDLE_PATTERNS: readonly RegExp[];
5
+ export interface ExclusionEnv {
6
+ readonly ALERT_EXCLUDE_DOMAINS?: string;
7
+ readonly ALERT_EXCLUDE_USER_IDS?: string;
8
+ }
9
+ export interface Exclusions {
10
+ readonly domains: ReadonlySet<string>;
11
+ readonly userIds: ReadonlySet<string>;
12
+ }
13
+ export declare function resolveExclusions(env: ExclusionEnv): Exclusions;
14
+ export declare function isStaffOrQa(person: {
15
+ readonly userId: string;
16
+ readonly email?: string;
17
+ readonly handles: readonly string[];
18
+ }, exclusions: Exclusions): boolean;
19
+ export declare const SEED_DOC_PREFIX = "seed:";
20
+ export declare const MAX_LISTED_ACTIVATIONS = 10;
21
+ export declare const TOP_APPS_LISTED = 3;
22
+ export declare const DISCORD_DESCRIPTION_LIMIT = 4096;
23
+ export declare function isSeedDoc(docId: string): boolean;
24
+ export declare function appUrl(ownerHandle: string, appSlug: string): string;
25
+ export interface FirstTurnRow {
26
+ readonly userId: string;
27
+ readonly firstTurn: string;
28
+ }
29
+ export declare function selectActivations<T extends FirstTurnRow>(rows: readonly T[], sinceIso: string): T[];
30
+ export interface AppWriterRow {
31
+ readonly writerUserId: string;
32
+ readonly docs: number;
33
+ readonly seedDocs: number;
34
+ }
35
+ export interface AppUsage {
36
+ readonly docs: number;
37
+ readonly otherWriters: number;
38
+ }
39
+ export declare function summarizeAppUsage(rows: readonly AppWriterRow[], ownerUserId: string): AppUsage;
40
+ export interface SignupTailRow {
41
+ readonly userId: string;
42
+ readonly turns: number;
43
+ readonly wroteTo: readonly string[];
44
+ readonly ownHandles: readonly string[];
45
+ }
46
+ export interface SignupTail {
47
+ readonly appUsers: number;
48
+ readonly noOps: number;
49
+ readonly topApps: readonly {
50
+ readonly app: string;
51
+ readonly newUsers: number;
52
+ }[];
53
+ }
54
+ export declare function splitSignupTail(rows: readonly SignupTailRow[], topN?: number): SignupTail;
55
+ export type HubSpotLookup = {
56
+ readonly state: "found";
57
+ readonly url: string;
58
+ } | {
59
+ readonly state: "absent";
60
+ } | {
61
+ readonly state: "failed";
62
+ readonly reason: string;
63
+ };
64
+ export interface ActivationApp {
65
+ readonly appSlug: string;
66
+ readonly ownerHandle: string;
67
+ readonly published: boolean;
68
+ readonly docs: number;
69
+ readonly otherWriters: number;
70
+ }
71
+ export interface ActivationCard {
72
+ readonly userId: string;
73
+ readonly handles: readonly string[];
74
+ readonly firstTurn: string;
75
+ readonly turns: number;
76
+ readonly credits: number;
77
+ readonly apps: readonly ActivationApp[];
78
+ readonly email?: string;
79
+ readonly name?: string;
80
+ readonly signup?: string;
81
+ readonly hubspot?: HubSpotLookup;
82
+ }
83
+ export interface DiscordEmbedBody {
84
+ readonly content?: string;
85
+ readonly allowed_mentions?: {
86
+ readonly parse: readonly string[];
87
+ };
88
+ readonly embeds?: readonly {
89
+ readonly title?: string;
90
+ readonly description?: string;
91
+ readonly color?: number;
92
+ }[];
93
+ }
94
+ export interface AlertInput {
95
+ readonly activations: readonly ActivationCard[];
96
+ readonly tail: SignupTail;
97
+ readonly sinceHours: number;
98
+ readonly now: string;
99
+ }
100
+ export declare function buildAlertEmbed(input: AlertInput): DiscordEmbedBody | undefined;
@@ -0,0 +1,138 @@
1
+ const DISCORD_MARKUP_RE = /[\\`*_~|>#[\]()]/g;
2
+ export function sanitizeForDiscord(value) {
3
+ return value.replaceAll(DISCORD_MARKUP_RE, (c) => `\\${c}`);
4
+ }
5
+ export const KNOWN_STAFF_EMAIL_DOMAINS = ["vibes.diy", "fireproof.storage"];
6
+ export const KNOWN_STAFF_USER_IDS = [
7
+ "user_36Fi1eXwJjcK02rYZFeZAQ0kORp",
8
+ ];
9
+ export const EXCLUDED_HANDLE_PATTERNS = [/^qa$/i, /^system$/i, /^jchris/i];
10
+ function splitList(raw) {
11
+ return (raw ?? "")
12
+ .split(",")
13
+ .map((s) => s.trim())
14
+ .filter((s) => s !== "");
15
+ }
16
+ export function resolveExclusions(env) {
17
+ return {
18
+ domains: new Set([...KNOWN_STAFF_EMAIL_DOMAINS, ...splitList(env.ALERT_EXCLUDE_DOMAINS)].map((d) => d.toLowerCase())),
19
+ userIds: new Set([...KNOWN_STAFF_USER_IDS, ...splitList(env.ALERT_EXCLUDE_USER_IDS)]),
20
+ };
21
+ }
22
+ export function isStaffOrQa(person, exclusions) {
23
+ if (exclusions.userIds.has(person.userId))
24
+ return true;
25
+ const domain = person.email?.split("@")[1]?.trim().toLowerCase();
26
+ if (domain !== undefined && exclusions.domains.has(domain))
27
+ return true;
28
+ return person.handles.some((h) => EXCLUDED_HANDLE_PATTERNS.some((re) => re.test(h.trim())));
29
+ }
30
+ export const SEED_DOC_PREFIX = "seed:";
31
+ export const MAX_LISTED_ACTIVATIONS = 10;
32
+ export const TOP_APPS_LISTED = 3;
33
+ export const DISCORD_DESCRIPTION_LIMIT = 4096;
34
+ const DISCORD_EMBED_COLOR = 5763719;
35
+ const SECOND_DAY_MS = 24 * 60 * 60 * 1000;
36
+ export function isSeedDoc(docId) {
37
+ return docId.startsWith(SEED_DOC_PREFIX);
38
+ }
39
+ export function appUrl(ownerHandle, appSlug) {
40
+ return `https://vibes.diy/vibe/${ownerHandle}/${appSlug}`;
41
+ }
42
+ export function selectActivations(rows, sinceIso) {
43
+ return rows.filter((r) => r.firstTurn >= sinceIso).sort((a, b) => a.firstTurn.localeCompare(b.firstTurn));
44
+ }
45
+ export function summarizeAppUsage(rows, ownerUserId) {
46
+ const real = rows.map((r) => ({ ...r, realDocs: r.docs - r.seedDocs })).filter((r) => r.realDocs > 0);
47
+ return {
48
+ docs: real.reduce((sum, r) => sum + r.realDocs, 0),
49
+ otherWriters: real.filter((r) => r.writerUserId !== ownerUserId).length,
50
+ };
51
+ }
52
+ export function splitSignupTail(rows, topN = TOP_APPS_LISTED) {
53
+ const drawnBy = new Map();
54
+ let appUsers = 0;
55
+ let noOps = 0;
56
+ for (const r of rows) {
57
+ if (r.turns > 0)
58
+ continue;
59
+ const own = new Set(r.ownHandles);
60
+ const others = [...new Set(r.wroteTo)].filter((a) => !own.has(a.split("/")[0] ?? ""));
61
+ if (others.length === 0) {
62
+ noOps += 1;
63
+ continue;
64
+ }
65
+ appUsers += 1;
66
+ for (const app of others)
67
+ drawnBy.set(app, (drawnBy.get(app) ?? 0) + 1);
68
+ }
69
+ const topApps = [...drawnBy.entries()]
70
+ .map(([app, newUsers]) => ({ app, newUsers }))
71
+ .sort((a, b) => b.newUsers - a.newUsers || a.app.localeCompare(b.app))
72
+ .slice(0, topN);
73
+ return { appUsers, noOps, topApps };
74
+ }
75
+ function renderHubSpot(h) {
76
+ switch (h.state) {
77
+ case "found":
78
+ return ` HubSpot: ${h.url}`;
79
+ case "absent":
80
+ return ` HubSpot: not in HubSpot`;
81
+ case "failed":
82
+ return ` HubSpot: lookup failed \\(${sanitizeForDiscord(h.reason)}\\) — not checked`;
83
+ }
84
+ }
85
+ function renderCard(c, nowMs) {
86
+ const who = c.handles.length > 0 ? c.handles.map((h) => `@${sanitizeForDiscord(h)}`).join(" / ") : `(no handle) ${c.userId}`;
87
+ const secondDay = nowMs - new Date(c.firstTurn).getTime() > SECOND_DAY_MS ? " _(2nd day in window)_" : "";
88
+ const head = [
89
+ `**${who}**`,
90
+ c.email === undefined ? undefined : sanitizeForDiscord(c.email),
91
+ `${c.turns} turn${c.turns === 1 ? "" : "s"} / ${c.credits} credits`,
92
+ c.name === undefined ? undefined : sanitizeForDiscord(c.name),
93
+ ]
94
+ .filter((p) => p !== undefined)
95
+ .join(" · ");
96
+ const lines = [`${head}${secondDay}`];
97
+ for (const a of c.apps) {
98
+ const writers = a.otherWriters > 0 ? ` — ${a.otherWriters} other writer${a.otherWriters === 1 ? "" : "s"}` : "";
99
+ lines.push(a.published
100
+ ? ` ${appUrl(a.ownerHandle, a.appSlug)}${writers}`
101
+ : ` ${sanitizeForDiscord(`${a.ownerHandle}/${a.appSlug}`)} — not published${writers}`);
102
+ }
103
+ if (c.hubspot !== undefined)
104
+ lines.push(renderHubSpot(c.hubspot));
105
+ return lines.join("\n");
106
+ }
107
+ function renderTail(tail) {
108
+ const lines = [];
109
+ const drew = tail.topApps.length > 0
110
+ ? ` — mostly ${tail.topApps.map((t) => `${sanitizeForDiscord(t.app)} (${t.newUsers})`).join(", ")}`
111
+ : "";
112
+ lines.push(`${tail.appUsers} arrived to use somebody's vibe rather than build one${drew}.`);
113
+ lines.push(`${tail.noOps} signed up and did nothing at all.`);
114
+ return lines.join("\n");
115
+ }
116
+ export function buildAlertEmbed(input) {
117
+ if (input.activations.length === 0)
118
+ return undefined;
119
+ const nowMs = new Date(input.now).getTime();
120
+ const shown = input.activations.slice(0, MAX_LISTED_ACTIVATIONS);
121
+ const blocks = shown.map((c) => renderCard(c, nowMs));
122
+ const overflow = input.activations.length - shown.length;
123
+ if (overflow > 0)
124
+ blocks.push(`…and ${overflow} more`);
125
+ blocks.push(`—\n${renderTail(input.tail)}`);
126
+ let description = blocks.join("\n\n");
127
+ if (description.length > DISCORD_DESCRIPTION_LIMIT) {
128
+ const ellipsis = "\n…(truncated)";
129
+ description = `${description.slice(0, DISCORD_DESCRIPTION_LIMIT - ellipsis.length)}${ellipsis}`;
130
+ }
131
+ const n = input.activations.length;
132
+ return {
133
+ content: `🌱 ${n} new maker${n === 1 ? "" : "s"} in the last ${input.sinceHours}h`,
134
+ allowed_mentions: { parse: [] },
135
+ embeds: [{ title: `New activations (last ${input.sinceHours}h)`, description, color: DISCORD_EMBED_COLOR }],
136
+ };
137
+ }
138
+ //# sourceMappingURL=new-user-alert-util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"new-user-alert-util.js","sourceRoot":"","sources":["../../jsr/usage-report/new-user-alert-util.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};