@vibes.diy/api-svc 13.1.2 → 13.1.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.
@@ -0,0 +1,46 @@
1
+ import { Result } from "@adviser/cement";
2
+ export interface ClerkSignupEmailAddress {
3
+ readonly id?: string;
4
+ readonly email_address: string;
5
+ }
6
+ export interface ClerkSignupData {
7
+ readonly id: string;
8
+ readonly username: string | null;
9
+ readonly first_name: string | null;
10
+ readonly last_name: string | null;
11
+ readonly email_addresses: readonly ClerkSignupEmailAddress[];
12
+ readonly created_at: number;
13
+ readonly primary_email_address_id?: string | null;
14
+ }
15
+ export declare const FORBIDDEN_PROPERTIES: ReadonlySet<string>;
16
+ export type SignupUpsertAction = "noop" | "merge" | "create";
17
+ export interface SignupUpsertResult {
18
+ readonly action: SignupUpsertAction;
19
+ readonly id: string;
20
+ }
21
+ export type UpsertSignupContactParams = PlanSignupContactParams;
22
+ export declare function normaliseEmail(raw: string | undefined | null): string | undefined;
23
+ export declare function resolvePrimaryEmail(data: ClerkSignupData): string | undefined;
24
+ export declare function identityProperties(data: ClerkSignupData, handles?: readonly string[]): Record<string, string>;
25
+ export declare function buildSignupProperties(data: ClerkSignupData, existing: Record<string, unknown> | undefined, handles?: readonly string[]): Record<string, string>;
26
+ export type SignupPlan = {
27
+ readonly action: "noop";
28
+ readonly id: string;
29
+ } | {
30
+ readonly action: "merge";
31
+ readonly id: string;
32
+ readonly existing: Record<string, string>;
33
+ } | {
34
+ readonly action: "create";
35
+ };
36
+ export interface PlanSignupContactParams {
37
+ readonly token: string;
38
+ readonly data: ClerkSignupData;
39
+ readonly handles?: readonly string[];
40
+ readonly enrichWhenLinked?: boolean;
41
+ readonly fetchFn?: typeof fetch;
42
+ }
43
+ export declare function changedProperties(existing: Record<string, string>, properties: Record<string, string>): Record<string, string>;
44
+ export declare function planSignupContact(params: PlanSignupContactParams): Promise<Result<SignupPlan>>;
45
+ export declare function upsertSignupContact(params: UpsertSignupContactParams): Promise<Result<SignupUpsertResult>>;
46
+ export declare function syncSignupToHubSpot(token: string, data: ClerkSignupData, fetchFn?: typeof fetch): Promise<void>;
@@ -0,0 +1,237 @@
1
+ import { exception2Result, Result } from "@adviser/cement";
2
+ const HUBSPOT_API_BASE = "https://api.hubapi.com";
3
+ const CONTACTS_PATH = "/crm/v3/objects/contacts";
4
+ export const FORBIDDEN_PROPERTIES = new Set([
5
+ "lifecyclestage",
6
+ "hubspot_owner_id",
7
+ "hs_marketable_status",
8
+ "hs_email_optout",
9
+ "lead_source_detail",
10
+ "opt_in_status",
11
+ "opt_in_source",
12
+ "opt_in_date",
13
+ "email_consent",
14
+ "quote_consent",
15
+ ]);
16
+ export function normaliseEmail(raw) {
17
+ if (raw === undefined || raw === null)
18
+ return undefined;
19
+ const trimmed = raw.trim().toLowerCase();
20
+ const at = trimmed.lastIndexOf("@");
21
+ if (at < 0)
22
+ return undefined;
23
+ let local = trimmed.slice(0, at);
24
+ let domain = trimmed.slice(at + 1);
25
+ if (domain === "googlemail.com") {
26
+ domain = "gmail.com";
27
+ }
28
+ const plus = local.indexOf("+");
29
+ if (plus >= 0) {
30
+ local = local.slice(0, plus);
31
+ }
32
+ if (domain === "gmail.com") {
33
+ local = local.replaceAll(".", "");
34
+ }
35
+ if (local === "" || domain === "")
36
+ return undefined;
37
+ return `${local}@${domain}`;
38
+ }
39
+ function isPresent(value) {
40
+ return typeof value === "string" && value.trim() !== "";
41
+ }
42
+ export function resolvePrimaryEmail(data) {
43
+ const byId = isPresent(data.primary_email_address_id) === true
44
+ ? data.email_addresses.find((e) => e.id === data.primary_email_address_id)
45
+ : undefined;
46
+ const chosen = byId ?? data.email_addresses[0];
47
+ return isPresent(chosen?.email_address) === true ? chosen?.email_address.trim() : undefined;
48
+ }
49
+ export function identityProperties(data, handles = []) {
50
+ const props = { clerk_user_id: data.id };
51
+ const cleanHandles = handles.filter((h) => isPresent(h) === true).map((h) => h.trim());
52
+ if (cleanHandles.length > 0) {
53
+ props.vibes_handles_all = cleanHandles.join("\n");
54
+ props.vibes_handle_recent = cleanHandles[cleanHandles.length - 1];
55
+ }
56
+ return props;
57
+ }
58
+ export function buildSignupProperties(data, existing, handles = []) {
59
+ const isCreate = existing === undefined;
60
+ const props = identityProperties(data, handles);
61
+ const absent = (key) => isPresent(existing?.[key]) === false;
62
+ if (absent("vibes_diy_signup_date")) {
63
+ props.vibes_diy_signup_date = new Date(data.created_at).toISOString();
64
+ }
65
+ if (absent("lead_source")) {
66
+ props.lead_source = "dashboard";
67
+ }
68
+ if (isPresent(data.first_name) === true && absent("firstname")) {
69
+ props.firstname = (data.first_name ?? "").trim();
70
+ }
71
+ if (isPresent(data.last_name) === true && absent("lastname")) {
72
+ props.lastname = (data.last_name ?? "").trim();
73
+ }
74
+ if (isCreate === true) {
75
+ const email = resolvePrimaryEmail(data);
76
+ if (email !== undefined) {
77
+ props.email = email;
78
+ }
79
+ }
80
+ return Object.fromEntries(Object.entries(props).filter(([key]) => FORBIDDEN_PROPERTIES.has(key) === false && key.startsWith("hs_") === false));
81
+ }
82
+ const READ_PROPERTIES = [
83
+ "email",
84
+ "clerk_user_id",
85
+ "vibes_diy_signup_date",
86
+ "lead_source",
87
+ "firstname",
88
+ "lastname",
89
+ "vibes_handles_all",
90
+ "vibes_handle_recent",
91
+ ];
92
+ function authHeaders(token) {
93
+ return { Authorization: `Bearer ${token}`, "Content-Type": "application/json" };
94
+ }
95
+ async function searchContact(fetchFn, token, propertyName, value) {
96
+ const rRes = await exception2Result(() => fetchFn(`${HUBSPOT_API_BASE}${CONTACTS_PATH}/search`, {
97
+ method: "POST",
98
+ headers: authHeaders(token),
99
+ body: JSON.stringify({
100
+ filterGroups: [{ filters: [{ propertyName, operator: "EQ", value }] }],
101
+ properties: READ_PROPERTIES,
102
+ limit: 1,
103
+ }),
104
+ }));
105
+ if (rRes.isErr())
106
+ return Result.Err(rRes.Err());
107
+ const res = rRes.Ok();
108
+ if (res.ok === false) {
109
+ return Result.Err(new Error(`hubspot search on ${propertyName} failed: ${res.status}`));
110
+ }
111
+ const rBody = await exception2Result(() => res.json());
112
+ if (rBody.isErr())
113
+ return Result.Err(rBody.Err());
114
+ return Result.Ok(rBody.Ok().results?.[0]);
115
+ }
116
+ async function fetchContactProperties(fetchFn, token, id) {
117
+ const url = `${HUBSPOT_API_BASE}${CONTACTS_PATH}/${encodeURIComponent(id)}?properties=${READ_PROPERTIES.join(",")}`;
118
+ const rRes = await exception2Result(() => fetchFn(url, { method: "GET", headers: authHeaders(token) }));
119
+ if (rRes.isErr())
120
+ return Result.Err(rRes.Err());
121
+ if (rRes.Ok().ok === false) {
122
+ return Result.Err(new Error(`hubspot read of ${id} failed: ${rRes.Ok().status}`));
123
+ }
124
+ const rBody = await exception2Result(() => rRes.Ok().json());
125
+ if (rBody.isErr())
126
+ return Result.Err(rBody.Err());
127
+ return Result.Ok(rBody.Ok().properties ?? {});
128
+ }
129
+ async function patchContact(fetchFn, token, id, properties) {
130
+ const rRes = await exception2Result(() => fetchFn(`${HUBSPOT_API_BASE}${CONTACTS_PATH}/${encodeURIComponent(id)}`, {
131
+ method: "PATCH",
132
+ headers: authHeaders(token),
133
+ body: JSON.stringify({ properties }),
134
+ }));
135
+ if (rRes.isErr())
136
+ return Result.Err(rRes.Err());
137
+ if (rRes.Ok().ok === false) {
138
+ return Result.Err(new Error(`hubspot patch of ${id} failed: ${rRes.Ok().status}`));
139
+ }
140
+ return Result.Ok({ action: "merge", id });
141
+ }
142
+ function conflictingIdFrom(body) {
143
+ const match = /Existing ID:\s*(\d+)/.exec(body);
144
+ return match?.[1];
145
+ }
146
+ export function changedProperties(existing, properties) {
147
+ return Object.fromEntries(Object.entries(properties).filter(([key, value]) => existing[key] !== value));
148
+ }
149
+ export async function planSignupContact(params) {
150
+ const { token, data } = params;
151
+ const fetchFn = params.fetchFn ?? fetch.bind(globalThis);
152
+ const handles = params.handles ?? [];
153
+ const email = resolvePrimaryEmail(data);
154
+ if (email === undefined) {
155
+ return Result.Err(new Error(`clerk user ${data.id} has no email address`));
156
+ }
157
+ const rByClerkId = await searchContact(fetchFn, token, "clerk_user_id", data.id);
158
+ if (rByClerkId.isErr())
159
+ return Result.Err(rByClerkId.Err());
160
+ const alreadyLinked = rByClerkId.Ok();
161
+ if (alreadyLinked !== undefined) {
162
+ const existing = alreadyLinked.properties ?? {};
163
+ const pending = params.enrichWhenLinked === true ? changedProperties(existing, buildSignupProperties(data, existing, handles)) : {};
164
+ return Result.Ok(Object.keys(pending).length > 0
165
+ ? { action: "merge", id: alreadyLinked.id, existing }
166
+ : { action: "noop", id: alreadyLinked.id });
167
+ }
168
+ const ours = normaliseEmail(email);
169
+ const searchTerms = [email];
170
+ if (ours !== undefined && ours !== email.trim().toLowerCase()) {
171
+ searchTerms.push(ours);
172
+ }
173
+ for (const term of searchTerms) {
174
+ const rByEmail = await searchContact(fetchFn, token, "email", term);
175
+ if (rByEmail.isErr())
176
+ return Result.Err(rByEmail.Err());
177
+ const hit = rByEmail.Ok();
178
+ if (hit !== undefined && ours !== undefined && normaliseEmail(hit.properties?.email) === ours) {
179
+ return Result.Ok({ action: "merge", id: hit.id, existing: hit.properties ?? {} });
180
+ }
181
+ }
182
+ return Result.Ok({ action: "create" });
183
+ }
184
+ export async function upsertSignupContact(params) {
185
+ const { token, data } = params;
186
+ const fetchFn = params.fetchFn ?? fetch.bind(globalThis);
187
+ const handles = params.handles ?? [];
188
+ const rPlan = await planSignupContact(params);
189
+ if (rPlan.isErr())
190
+ return Result.Err(rPlan.Err());
191
+ const plan = rPlan.Ok();
192
+ if (plan.action === "noop") {
193
+ return Result.Ok({ action: "noop", id: plan.id });
194
+ }
195
+ if (plan.action === "merge") {
196
+ return patchContact(fetchFn, token, plan.id, buildSignupProperties(data, plan.existing, handles));
197
+ }
198
+ const rCreate = await exception2Result(() => fetchFn(`${HUBSPOT_API_BASE}${CONTACTS_PATH}`, {
199
+ method: "POST",
200
+ headers: authHeaders(token),
201
+ body: JSON.stringify({ properties: buildSignupProperties(data, undefined, handles) }),
202
+ }));
203
+ if (rCreate.isErr())
204
+ return Result.Err(rCreate.Err());
205
+ const created = rCreate.Ok();
206
+ if (created.status === 409) {
207
+ const rText = await exception2Result(() => created.text());
208
+ const conflictId = rText.isOk() ? conflictingIdFrom(rText.Ok()) : undefined;
209
+ if (conflictId === undefined) {
210
+ return Result.Err(new Error(`hubspot create conflicted but reported no existing id for clerk user ${data.id}`));
211
+ }
212
+ const rExisting = await fetchContactProperties(fetchFn, token, conflictId);
213
+ const properties = rExisting.isOk() ? buildSignupProperties(data, rExisting.Ok(), handles) : identityProperties(data, handles);
214
+ if (rExisting.isErr()) {
215
+ console.error("[hubspot-signup] could not read conflicting contact, writing identity only:", rExisting.Err().message);
216
+ }
217
+ return patchContact(fetchFn, token, conflictId, properties);
218
+ }
219
+ if (created.ok === false) {
220
+ return Result.Err(new Error(`hubspot create failed: ${created.status}`));
221
+ }
222
+ const rBody = await exception2Result(() => created.json());
223
+ if (rBody.isErr())
224
+ return Result.Err(rBody.Err());
225
+ const id = rBody.Ok().id;
226
+ if (id === undefined) {
227
+ return Result.Err(new Error("hubspot create returned no id"));
228
+ }
229
+ return Result.Ok({ action: "create", id });
230
+ }
231
+ export async function syncSignupToHubSpot(token, data, fetchFn) {
232
+ const rUpsert = await exception2Result(() => upsertSignupContact({ token, data, fetchFn }));
233
+ if (rUpsert.isErr()) {
234
+ console.error("[hubspot-signup] signup sync failed:", rUpsert.Err().message);
235
+ }
236
+ }
237
+ //# sourceMappingURL=hubspot-signup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hubspot-signup.js","sourceRoot":"","sources":["../../jsr/intern/hubspot-signup.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vibes.diy/api-svc",
3
- "version": "13.1.2",
3
+ "version": "13.1.3",
4
4
  "license": "Apache-2.0",
5
5
  "type": "module",
6
6
  "main": "./index.js",
@@ -14,6 +14,7 @@
14
14
  "db:admin": "tsx ./usage-report/admin-db.ts",
15
15
  "promo:create": "tsx ./usage-report/create-promo-code.ts",
16
16
  "admin:backfill-avatars": "tsx ./usage-report/backfill-avatars.ts",
17
+ "admin:backfill-hubspot-contacts": "tsx ./usage-report/backfill-hubspot-contacts.ts",
17
18
  "admin:backfill-first-message-embeddings": "tsx ./usage-report/backfill-first-message-embeddings.ts",
18
19
  "admin:backfill-geo-country": "tsx ./usage-report/backfill-geo-country.ts",
19
20
  "admin:backfill-published-chips": "tsx ./usage-report/backfill-published-chips.ts",
@@ -27,18 +28,18 @@
27
28
  "@libsql/client": "~0.17.4",
28
29
  "@neondatabase/serverless": "~1.1.0",
29
30
  "@noble/hashes": "~2.3.0",
30
- "@vibes.diy/api-pkg": "13.1.2",
31
- "@vibes.diy/api-sql": "13.1.2",
32
- "@vibes.diy/api-types": "13.1.2",
33
- "@vibes.diy/call-ai-v2": "13.1.2",
34
- "@vibes.diy/identity": "13.1.2",
35
- "@vibes.diy/prompts": "13.1.2",
36
- "@vibes.diy/vibe-db-explorer": "13.1.2",
37
- "@vibes.diy/vibe-runtime": "13.1.2",
38
- "@vibes.diy/vibe-types": "13.1.2",
31
+ "@vibes.diy/api-pkg": "13.1.3",
32
+ "@vibes.diy/api-sql": "13.1.3",
33
+ "@vibes.diy/api-types": "13.1.3",
34
+ "@vibes.diy/call-ai-v2": "13.1.3",
35
+ "@vibes.diy/identity": "13.1.3",
36
+ "@vibes.diy/prompts": "13.1.3",
37
+ "@vibes.diy/vibe-db-explorer": "13.1.3",
38
+ "@vibes.diy/vibe-runtime": "13.1.3",
39
+ "@vibes.diy/vibe-types": "13.1.3",
39
40
  "acorn": "~8.17.0",
40
41
  "arktype": "~2.2.3",
41
- "call-ai": "13.1.2",
42
+ "call-ai": "13.1.3",
42
43
  "charwise": "~3.0.1",
43
44
  "cookie": "~2.0.1",
44
45
  "csv-parse": "~7.0.1",
@@ -0,0 +1,62 @@
1
+ import { type Exclusions } from "./new-user-alert-util.js";
2
+ export declare const POPULATIONS: {
3
+ readonly all: "every Clerk account";
4
+ readonly makers: "accounts that ever sent a codegen turn";
5
+ readonly handles: "accounts that ever claimed a handle";
6
+ };
7
+ export type PopulationKey = keyof typeof POPULATIONS;
8
+ export declare function isPopulationKey(value: string | undefined): value is PopulationKey;
9
+ export interface BackfillAccount {
10
+ readonly userId: string;
11
+ readonly email?: string;
12
+ readonly handles: readonly string[];
13
+ readonly codegenTurns: number;
14
+ }
15
+ export declare function inPopulation(account: BackfillAccount, population: PopulationKey): boolean;
16
+ export interface SelectionResult {
17
+ readonly selected: readonly BackfillAccount[];
18
+ readonly excludedStaff: number;
19
+ readonly excludedPopulation: number;
20
+ readonly excludedNoEmail: number;
21
+ }
22
+ export declare function selectAccounts(accounts: readonly BackfillAccount[], population: PopulationKey, exclusions: Exclusions): SelectionResult;
23
+ type PlannedAction = "noop" | "merge" | "create" | "failed";
24
+ export interface PlanEntry {
25
+ readonly userId: string;
26
+ readonly handles: readonly string[];
27
+ readonly action: PlannedAction;
28
+ readonly contactId?: string;
29
+ readonly reason?: string;
30
+ }
31
+ export interface PlanCounts {
32
+ readonly noop: number;
33
+ readonly merge: number;
34
+ readonly create: number;
35
+ readonly failed: number;
36
+ readonly total: number;
37
+ }
38
+ export declare function countPlan(entries: readonly PlanEntry[]): PlanCounts;
39
+ export interface Reconciliation {
40
+ readonly intended: number;
41
+ readonly linkedContacts: number;
42
+ readonly linkedBefore: number;
43
+ readonly created: number;
44
+ readonly merged: number;
45
+ readonly failed: number;
46
+ }
47
+ export interface ReconciliationVerdict {
48
+ readonly ok: boolean;
49
+ readonly drift: number;
50
+ readonly lines: readonly string[];
51
+ }
52
+ export declare function reconcile(r: Reconciliation): ReconciliationVerdict;
53
+ export interface ReportInput {
54
+ readonly population: PopulationKey;
55
+ readonly selection: SelectionResult;
56
+ readonly counts: PlanCounts;
57
+ readonly apply: boolean;
58
+ readonly stripeOrphans?: number;
59
+ readonly listCaveat?: boolean;
60
+ }
61
+ export declare function formatPlanReport(input: ReportInput): string;
62
+ export {};
@@ -0,0 +1,87 @@
1
+ import { isStaffOrQa } from "./new-user-alert-util.js";
2
+ export const POPULATIONS = {
3
+ all: "every Clerk account",
4
+ makers: "accounts that ever sent a codegen turn",
5
+ handles: "accounts that ever claimed a handle",
6
+ };
7
+ export function isPopulationKey(value) {
8
+ return value !== undefined && Object.hasOwn(POPULATIONS, value);
9
+ }
10
+ export function inPopulation(account, population) {
11
+ switch (population) {
12
+ case "makers":
13
+ return account.codegenTurns > 0;
14
+ case "handles":
15
+ return account.handles.length > 0;
16
+ case "all":
17
+ return true;
18
+ }
19
+ }
20
+ export function selectAccounts(accounts, population, exclusions) {
21
+ const selected = [];
22
+ let excludedStaff = 0;
23
+ let excludedPopulation = 0;
24
+ let excludedNoEmail = 0;
25
+ for (const account of accounts) {
26
+ if (!inPopulation(account, population)) {
27
+ excludedPopulation = excludedPopulation + 1;
28
+ continue;
29
+ }
30
+ if (isStaffOrQa({ userId: account.userId, email: account.email, handles: account.handles }, exclusions)) {
31
+ excludedStaff = excludedStaff + 1;
32
+ continue;
33
+ }
34
+ if (account.email === undefined || account.email.trim() === "") {
35
+ excludedNoEmail = excludedNoEmail + 1;
36
+ continue;
37
+ }
38
+ selected.push(account);
39
+ }
40
+ return { selected, excludedStaff, excludedPopulation, excludedNoEmail };
41
+ }
42
+ export function countPlan(entries) {
43
+ const counts = { noop: 0, merge: 0, create: 0, failed: 0 };
44
+ for (const entry of entries) {
45
+ counts[entry.action] = counts[entry.action] + 1;
46
+ }
47
+ return { ...counts, total: entries.length };
48
+ }
49
+ export function reconcile(r) {
50
+ const expected = r.linkedBefore + r.created + r.merged;
51
+ const drift = r.linkedContacts - expected;
52
+ const lines = [
53
+ `intended population: ${r.intended}`,
54
+ `contacts with clerk_user_id before: ${r.linkedBefore}`,
55
+ `created: ${r.created} merged: ${r.merged} failed: ${r.failed}`,
56
+ `contacts with clerk_user_id after: ${r.linkedContacts} (expected ${expected})`,
57
+ ];
58
+ if (drift !== 0) {
59
+ lines.push(`DRIFT ${drift > 0 ? "+" : ""}${drift} — do not round this away. A positive drift means contacts ` +
60
+ `gained a join key that this run did not write; a negative one means writes did not land, or ` +
61
+ `HubSpot's search index has not caught up yet (it lags writes — re-read before concluding).`);
62
+ }
63
+ if (r.failed > 0) {
64
+ lines.push(`${r.failed} account(s) failed — re-run; the upsert is idempotent and a failure leaves no partial contact.`);
65
+ }
66
+ return { ok: drift === 0 && r.failed === 0, drift, lines };
67
+ }
68
+ export function formatPlanReport(input) {
69
+ const { counts, selection } = input;
70
+ const lines = [
71
+ `population: ${input.population} — ${POPULATIONS[input.population]}`,
72
+ `mode: ${input.apply ? "APPLY (writing)" : "DRY RUN (reads only)"}`,
73
+ ``,
74
+ `candidates ${selection.selected.length}` +
75
+ ` (excluded: ${selection.excludedPopulation} out of population,` +
76
+ ` ${selection.excludedStaff} staff/QA, ${selection.excludedNoEmail} with no email)`,
77
+ `no-op ${counts.noop} merge ${counts.merge} create ${counts.create} failed ${counts.failed}`,
78
+ ];
79
+ if (input.stripeOrphans !== undefined) {
80
+ lines.push(``, `contacts with stripe_customer_id and no clerk_user_id: ${input.stripeOrphans}`, ` (the orphan class — a contact Stripe minted at checkout with no join key.`, ` Merge targets here, and the standing counter for them belongs to traction#117.)`);
81
+ }
82
+ if (input.listCaveat === true && counts.create + counts.merge > 0) {
83
+ lines.push(``, `List 53 "Vibes DIY Users" is DYNAMIC on vibes_diy_signup_date IS_KNOWN, so up to`, `${counts.create + counts.merge} of these contacts will join it without anyone deciding to add them.`, `Accepted caveat, not a mailability breach: hs_marketable_status stays false and is`, `read-only via the API. Nothing here writes a list, a consent property or a mailable state.`);
84
+ }
85
+ return lines.join("\n");
86
+ }
87
+ //# sourceMappingURL=backfill-hubspot-contacts-util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backfill-hubspot-contacts-util.js","sourceRoot":"","sources":["../../jsr/usage-report/backfill-hubspot-contacts-util.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,222 @@
1
+ import { Pool } from "@neondatabase/serverless";
2
+ import fs from "node:fs";
3
+ import { Result, exception2Result } from "@adviser/cement";
4
+ import { formatError, loadDevVars } from "./usage-report-util.js";
5
+ import { resolveExclusions } from "./new-user-alert-util.js";
6
+ import { countPlan, formatPlanReport, isPopulationKey, POPULATIONS, reconcile, selectAccounts, } from "./backfill-hubspot-contacts-util.js";
7
+ import { planSignupContact, upsertSignupContact } from "../intern/hubspot-signup.js";
8
+ const CLERK_PAGE_SIZE = 500;
9
+ const REQUEST_GAP_MS = 60;
10
+ function arg(name) {
11
+ const i = process.argv.indexOf(name);
12
+ return i >= 0 ? process.argv[i + 1] : undefined;
13
+ }
14
+ function flag(name) {
15
+ return process.argv.includes(name);
16
+ }
17
+ function asString(v) {
18
+ return typeof v === "string" ? v : undefined;
19
+ }
20
+ function sleep(ms) {
21
+ return new Promise((resolve) => setTimeout(resolve, ms));
22
+ }
23
+ async function clerkAllUsers(key) {
24
+ const users = [];
25
+ for (let offset = 0;; offset += CLERK_PAGE_SIZE) {
26
+ const res = await fetch(`https://api.clerk.com/v1/users?limit=${CLERK_PAGE_SIZE}&offset=${offset}&order_by=%2Bcreated_at`, {
27
+ headers: { authorization: `Bearer ${key}` },
28
+ });
29
+ if (!res.ok)
30
+ throw new Error(`clerk GET /users failed: ${res.status}`);
31
+ const rows = (await res.json());
32
+ for (const r of rows) {
33
+ const id = asString(r.id);
34
+ if (id === undefined)
35
+ continue;
36
+ users.push({
37
+ id,
38
+ username: asString(r.username) ?? null,
39
+ first_name: asString(r.first_name) ?? null,
40
+ last_name: asString(r.last_name) ?? null,
41
+ email_addresses: (Array.isArray(r.email_addresses) ? r.email_addresses : []).map((e) => ({
42
+ id: asString(e.id),
43
+ email_address: asString(e.email_address) ?? "",
44
+ })),
45
+ created_at: typeof r.created_at === "number" ? r.created_at : 0,
46
+ primary_email_address_id: asString(r.primary_email_address_id) ?? null,
47
+ });
48
+ }
49
+ if (rows.length < CLERK_PAGE_SIZE)
50
+ return users;
51
+ }
52
+ }
53
+ async function contactCount(token, filters) {
54
+ const rRes = await exception2Result(() => fetch("https://api.hubapi.com/crm/v3/objects/contacts/search", {
55
+ method: "POST",
56
+ headers: { authorization: `Bearer ${token}`, "Content-Type": "application/json" },
57
+ body: JSON.stringify({ filterGroups: [{ filters }], properties: ["email"], limit: 1 }),
58
+ }));
59
+ if (rRes.isErr())
60
+ return Result.Err(rRes.Err());
61
+ if (rRes.Ok().ok === false)
62
+ return Result.Err(new Error(`hubspot count failed: ${rRes.Ok().status}`));
63
+ const rBody = await exception2Result(() => rRes.Ok().json());
64
+ if (rBody.isErr())
65
+ return Result.Err(rBody.Err());
66
+ return Result.Ok(rBody.Ok().total ?? 0);
67
+ }
68
+ async function run() {
69
+ loadDevVars();
70
+ const population = arg("--population");
71
+ if (!isPopulationKey(population)) {
72
+ return Result.Err([
73
+ "usage: admin:backfill-hubspot-contacts --population <key> [--apply] [--limit N] [--only ids] [--out FILE]",
74
+ ...Object.entries(POPULATIONS).map(([key, description]) => ` --population ${key.padEnd(8)} ${description}`),
75
+ "",
76
+ "--population has no default on purpose: it is the decision the issue asks a human to make.",
77
+ ].join("\n"));
78
+ }
79
+ const clerkKey = process.env["CLERK_SECRET_KEY"];
80
+ if (clerkKey === undefined || clerkKey === "")
81
+ return Result.Err("CLERK_SECRET_KEY is required");
82
+ const token = process.env["HUBSPOT_TOKEN"];
83
+ if (token === undefined || token === "")
84
+ return Result.Err("HUBSPOT_TOKEN is required (private app, contacts read+write)");
85
+ const connectionString = process.env["NEON_DATABASE_URL"] ?? process.env["DATABASE_URL"];
86
+ if (connectionString === undefined)
87
+ return Result.Err("NEON_DATABASE_URL is required (prod Neon)");
88
+ const apply = flag("--apply");
89
+ const limitRaw = arg("--limit");
90
+ const limit = limitRaw === undefined ? Number.POSITIVE_INFINITY : Number(limitRaw);
91
+ if (!Number.isFinite(limit) && limitRaw !== undefined)
92
+ return Result.Err("--limit must be a number");
93
+ const only = new Set((arg("--only") ?? "")
94
+ .split(",")
95
+ .map((s) => s.trim())
96
+ .filter((s) => s !== ""));
97
+ const exclusions = resolveExclusions({
98
+ ALERT_EXCLUDE_DOMAINS: process.env["ALERT_EXCLUDE_DOMAINS"],
99
+ ALERT_EXCLUDE_USER_IDS: process.env["ALERT_EXCLUDE_USER_IDS"],
100
+ });
101
+ const pool = new Pool({ connectionString });
102
+ const result = await exception2Result(async () => {
103
+ const clerkUsers = await clerkAllUsers(clerkKey);
104
+ const handleRes = await pool.query(`select "userId", "userSlug" as handle from "UserSlugBindings" order by "userId", created`);
105
+ const handles = new Map();
106
+ for (const r of handleRes.rows) {
107
+ handles.set(r.userId, [...(handles.get(r.userId) ?? []), r.handle]);
108
+ }
109
+ const turnRes = await pool.query(`select "userId", count(*)::int as turns from "PromptContexts" group by "userId"`);
110
+ const turns = new Map();
111
+ for (const r of turnRes.rows) {
112
+ turns.set(r.userId, r.turns);
113
+ }
114
+ console.log(`[backfill] clerk_accounts=${clerkUsers.length} accounts_with_handle=${handles.size} ` +
115
+ `handle_rows=${handleRes.rows.length} accounts_with_codegen_turn=${turns.size}`);
116
+ const accounts = clerkUsers.map((u) => ({
117
+ userId: u.id,
118
+ email: u.email_addresses.find((e) => e.id === u.primary_email_address_id)?.email_address ?? u.email_addresses[0]?.email_address,
119
+ handles: handles.get(u.id) ?? [],
120
+ codegenTurns: turns.get(u.id) ?? 0,
121
+ }));
122
+ const selection = selectAccounts(accounts, population, exclusions);
123
+ const byId = new Map(clerkUsers.map((u) => [u.id, u]));
124
+ const candidates = selection.selected.filter((a) => only.size === 0 || only.has(a.userId));
125
+ const rBefore = await contactCount(token, [{ propertyName: "clerk_user_id", operator: "HAS_PROPERTY" }]);
126
+ if (rBefore.isErr())
127
+ throw rBefore.Err();
128
+ const linkedBefore = rBefore.Ok();
129
+ const entries = [];
130
+ let acted = 0;
131
+ let created = 0;
132
+ let merged = 0;
133
+ for (const account of candidates) {
134
+ const data = byId.get(account.userId);
135
+ if (data === undefined)
136
+ continue;
137
+ const shared = {
138
+ token,
139
+ data,
140
+ handles: account.handles,
141
+ enrichWhenLinked: true,
142
+ };
143
+ const rPlan = await planSignupContact(shared);
144
+ await sleep(REQUEST_GAP_MS);
145
+ if (rPlan.isErr()) {
146
+ entries.push({ userId: account.userId, handles: account.handles, action: "failed", reason: rPlan.Err().message });
147
+ continue;
148
+ }
149
+ const plan = rPlan.Ok();
150
+ if (plan.action === "noop" || !apply || acted >= limit) {
151
+ entries.push({
152
+ userId: account.userId,
153
+ handles: account.handles,
154
+ action: plan.action,
155
+ contactId: plan.action === "create" ? undefined : plan.id,
156
+ reason: plan.action !== "noop" && apply && acted >= limit ? "not applied: --limit reached" : undefined,
157
+ });
158
+ continue;
159
+ }
160
+ const rWrite = await upsertSignupContact(shared);
161
+ await sleep(REQUEST_GAP_MS);
162
+ if (rWrite.isErr()) {
163
+ entries.push({ userId: account.userId, handles: account.handles, action: "failed", reason: rWrite.Err().message });
164
+ continue;
165
+ }
166
+ acted = acted + 1;
167
+ const write = rWrite.Ok();
168
+ if (write.action === "create")
169
+ created = created + 1;
170
+ if (write.action === "merge")
171
+ merged = merged + 1;
172
+ entries.push({ userId: account.userId, handles: account.handles, action: write.action, contactId: write.id });
173
+ }
174
+ const rOrphans = await contactCount(token, [
175
+ { propertyName: "stripe_customer_id", operator: "HAS_PROPERTY" },
176
+ { propertyName: "clerk_user_id", operator: "NOT_HAS_PROPERTY" },
177
+ ]);
178
+ const counts = countPlan(entries);
179
+ console.log("");
180
+ console.log(formatPlanReport({
181
+ population: population,
182
+ selection,
183
+ counts,
184
+ apply,
185
+ stripeOrphans: rOrphans.isOk() ? rOrphans.Ok() : undefined,
186
+ listCaveat: true,
187
+ }));
188
+ const out = arg("--out");
189
+ if (out !== undefined) {
190
+ fs.writeFileSync(out, JSON.stringify({ population, apply, counts, entries }, null, 2));
191
+ console.log(`\nplan written to ${out} (clerk ids and handles only — no addresses)`);
192
+ }
193
+ if (!apply) {
194
+ console.log("\nDRY RUN — nothing was written. Re-run with --apply once the diff above has been read.");
195
+ return;
196
+ }
197
+ await sleep(10_000);
198
+ const rAfter = await contactCount(token, [{ propertyName: "clerk_user_id", operator: "HAS_PROPERTY" }]);
199
+ if (rAfter.isErr())
200
+ throw rAfter.Err();
201
+ const verdict = reconcile({
202
+ intended: candidates.length,
203
+ linkedBefore,
204
+ linkedContacts: rAfter.Ok(),
205
+ created,
206
+ merged,
207
+ failed: counts.failed,
208
+ });
209
+ console.log(`\nreconciliation${verdict.ok ? "" : " — NEEDS EXPLAINING"}:`);
210
+ for (const line of verdict.lines)
211
+ console.log(` ${line}`);
212
+ });
213
+ await pool.end();
214
+ return result;
215
+ }
216
+ run().then((result) => {
217
+ if (result.isErr()) {
218
+ console.error(formatError(result.Err()));
219
+ process.exitCode = 1;
220
+ }
221
+ });
222
+ //# sourceMappingURL=backfill-hubspot-contacts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backfill-hubspot-contacts.js","sourceRoot":"","sources":["../../jsr/usage-report/backfill-hubspot-contacts.ts"],"names":[],"mappings":"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"}
@@ -6,7 +6,14 @@ export const KNOWN_STAFF_EMAIL_DOMAINS = ["vibes.diy", "fireproof.storage"];
6
6
  export const KNOWN_STAFF_USER_IDS = [
7
7
  "user_36Fi1eXwJjcK02rYZFeZAQ0kORp",
8
8
  ];
9
- export const EXCLUDED_HANDLE_PATTERNS = [/^qa$/i, /^system$/i, /^jchris/i];
9
+ export const EXCLUDED_HANDLE_PATTERNS = [
10
+ /^qa$/i,
11
+ /^system$/i,
12
+ /^jchris/i,
13
+ /^chris-dev$/i,
14
+ /^jchanimal$/i,
15
+ /^bot$/i,
16
+ ];
10
17
  function splitList(raw) {
11
18
  return (raw ?? "")
12
19
  .split(",")
@@ -1 +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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"}
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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"}