@vibes.diy/api-svc 14.3.172 → 14.3.174
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/backend-do-addr.js +4 -3
- package/intern/backend-do-addr.js.map +1 -1
- package/intern/latest-screenshot.d.ts +1 -0
- package/intern/latest-screenshot.js +3 -0
- package/intern/latest-screenshot.js.map +1 -1
- package/intern/resolve-backend-session-user.js.map +1 -1
- package/intern/timing-safe-equal.d.ts +1 -0
- package/intern/timing-safe-equal.js +10 -0
- package/intern/timing-safe-equal.js.map +1 -0
- package/package.json +13 -13
- package/public/campaign-health-readout-source.d.ts +36 -0
- package/public/campaign-health-readout-source.js +321 -0
- package/public/campaign-health-readout-source.js.map +1 -0
- package/public/campaign-health-readout.d.ts +103 -0
- package/public/campaign-health-readout.js +438 -0
- package/public/campaign-health-readout.js.map +1 -0
- package/public/github-webhook.d.ts +2 -1
- package/public/github-webhook.js +2 -9
- package/public/github-webhook.js.map +1 -1
- package/public/report-campaign-health.js +24 -14
- package/public/report-campaign-health.js.map +1 -1
- package/public/vibe-traffic-source.d.ts +7 -0
- package/public/vibe-traffic-source.js +1 -1
- package/public/vibe-traffic-source.js.map +1 -1
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { timingSafeEqualString } from "./timing-safe-equal.js";
|
|
1
2
|
export const BACKEND_OWNER_HEADER = "x-vibe-owner";
|
|
2
3
|
export const BACKEND_SLUG_HEADER = "x-vibe-slug";
|
|
3
4
|
export const BACKEND_OP_HEADER = "x-backend-op";
|
|
@@ -11,9 +12,9 @@ export const BACKEND_INTERNAL_AUTH_HEADER = "x-backend-internal-auth";
|
|
|
11
12
|
export const BACKEND_DENY_HEADER = "x-backend-deny";
|
|
12
13
|
export const VIBES_SESSION_USER_HEADER = "x-vibes-session-user";
|
|
13
14
|
export function isControlPlaneAuthorized(secret, provided) {
|
|
14
|
-
if (!secret)
|
|
15
|
-
return
|
|
16
|
-
return provided
|
|
15
|
+
if (!secret || provided === null)
|
|
16
|
+
return false;
|
|
17
|
+
return timingSafeEqualString(provided, secret);
|
|
17
18
|
}
|
|
18
19
|
export const VIBES_RESERVED_HEADER_PREFIX = "x-vibes-";
|
|
19
20
|
export function sanitizeBackendApiForwardHeaders(headers, target) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backend-do-addr.js","sourceRoot":"","sources":["../../jsr/intern/backend-do-addr.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"backend-do-addr.js","sourceRoot":"","sources":["../../jsr/intern/backend-do-addr.ts"],"names":[],"mappings":"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"}
|
|
@@ -24,5 +24,6 @@ export declare function loadLatestScreenshotDataUrl(vctx: VibesApiSQLCtx, app: {
|
|
|
24
24
|
export declare function screenshotViewportSentence(shot: Pick<LatestScreenshot, "viewport" | "width" | "height">): string;
|
|
25
25
|
export declare const SCREENSHOT_EXAMPLE_RECORDS_SENTENCE = "The records it shows are the release's seed.json examples in a throwaway store, so it shows the app's look and never what the person saved; their own records are read with query_docs.";
|
|
26
26
|
export declare const SCREENSHOT_NO_DATA_RECORDS_SENTENCE = "It was taken without opening the app's records, so it shows the app's look and none of what the person saved; their own records are read with query_docs.";
|
|
27
|
+
export declare const SCREENSHOT_EMPTY_SEED_RECORDS_SENTENCE = "It was taken on a fresh throwaway store with no seed.json example records, so anything it shows came from the app itself and none of it is what the person saved; their own records are read with query_docs.";
|
|
27
28
|
export declare const SCREENSHOT_UNSTAMPED_RECORDS_SENTENCE = "It predates the record of how screenshots are taken, so any records it shows reflect that older capture rather than what the person has saved now; their own records are read with query_docs.";
|
|
28
29
|
export declare function screenshotRecordsSentence(capture: ScreenshotCaptureKind | undefined): string;
|
|
@@ -90,6 +90,7 @@ export function screenshotViewportSentence(shot) {
|
|
|
90
90
|
}
|
|
91
91
|
export const SCREENSHOT_EXAMPLE_RECORDS_SENTENCE = "The records it shows are the release's seed.json examples in a throwaway store, so it shows the app's look and never what the person saved; their own records are read with query_docs.";
|
|
92
92
|
export const SCREENSHOT_NO_DATA_RECORDS_SENTENCE = "It was taken without opening the app's records, so it shows the app's look and none of what the person saved; their own records are read with query_docs.";
|
|
93
|
+
export const SCREENSHOT_EMPTY_SEED_RECORDS_SENTENCE = "It was taken on a fresh throwaway store with no seed.json example records, so anything it shows came from the app itself and none of it is what the person saved; their own records are read with query_docs.";
|
|
93
94
|
export const SCREENSHOT_UNSTAMPED_RECORDS_SENTENCE = "It predates the record of how screenshots are taken, so any records it shows reflect that older capture rather than what the person has saved now; their own records are read with query_docs.";
|
|
94
95
|
export function screenshotRecordsSentence(capture) {
|
|
95
96
|
switch (capture) {
|
|
@@ -97,6 +98,8 @@ export function screenshotRecordsSentence(capture) {
|
|
|
97
98
|
return SCREENSHOT_EXAMPLE_RECORDS_SENTENCE;
|
|
98
99
|
case "no-data":
|
|
99
100
|
return SCREENSHOT_NO_DATA_RECORDS_SENTENCE;
|
|
101
|
+
case "empty-seed":
|
|
102
|
+
return SCREENSHOT_EMPTY_SEED_RECORDS_SENTENCE;
|
|
100
103
|
default:
|
|
101
104
|
return SCREENSHOT_UNSTAMPED_RECORDS_SENTENCE;
|
|
102
105
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"latest-screenshot.js","sourceRoot":"","sources":["../../jsr/intern/latest-screenshot.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"latest-screenshot.js","sourceRoot":"","sources":["../../jsr/intern/latest-screenshot.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve-backend-session-user.js","sourceRoot":"","sources":["../../jsr/intern/resolve-backend-session-user.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAClE,OAAO,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AAuBxE,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,IAAoB,EACpB,OAAmE;IAEnE,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IACtC,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACrD,OAAO,QAAQ,EAAE,MAAM,IAAI,IAAI,CAAC;AAClC,CAAC;
|
|
1
|
+
{"version":3,"file":"resolve-backend-session-user.js","sourceRoot":"","sources":["../../jsr/intern/resolve-backend-session-user.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAClE,OAAO,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AAuBxE,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,IAAoB,EACpB,OAAmE;IAEnE,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IACtC,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACrD,OAAO,QAAQ,EAAE,MAAM,IAAI,IAAI,CAAC;AAClC,CAAC;AAoBD,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,IAAoB,EACpB,OAAmE,EACnE,QAAqF;IAErF,MAAM,MAAM,GAAG,QAAQ,CAAC,cAAc,CAAC;IACvC,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,QAAQ,CAAC,YAAY,KAAK,MAAM,EAAE,CAAC;QACxF,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;QAC/D,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,EAAE;YAAE,OAAO,OAAO,CAAC;IACzD,CAAC;IACD,OAAO,2BAA2B,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AACpD,CAAC;AAaD,MAAM,UAAU,wBAAwB,CACtC,OAAmE,EACnE,QAAqF;IAErF,MAAM,MAAM,GAAG,QAAQ,CAAC,cAAc,CAAC;IACvC,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,QAAQ,CAAC,YAAY,KAAK,MAAM;QAAE,OAAO,KAAK,CAAC;IACxG,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;IAC7D,OAAO,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;AACxC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function timingSafeEqualString(a: string, b: string): boolean;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export function timingSafeEqualString(a, b) {
|
|
2
|
+
if (a.length !== b.length)
|
|
3
|
+
return false;
|
|
4
|
+
let diff = 0;
|
|
5
|
+
for (let i = 0; i < a.length; i = i + 1) {
|
|
6
|
+
diff = diff | (a.charCodeAt(i) ^ b.charCodeAt(i));
|
|
7
|
+
}
|
|
8
|
+
return diff === 0;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=timing-safe-equal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timing-safe-equal.js","sourceRoot":"","sources":["../../jsr/intern/timing-safe-equal.ts"],"names":[],"mappings":"AAUA,MAAM,UAAU,qBAAqB,CAAC,CAAS,EAAE,CAAS;IACxD,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACxC,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;QACxC,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,IAAI,KAAK,CAAC,CAAC;AACpB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vibes.diy/api-svc",
|
|
3
|
-
"version": "14.3.
|
|
3
|
+
"version": "14.3.174",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./index.js",
|
|
@@ -41,21 +41,21 @@
|
|
|
41
41
|
"@neondatabase/serverless": "~1.2.0",
|
|
42
42
|
"@noble/hashes": "~2.4.0",
|
|
43
43
|
"@shadcn/lint": "~0.2.0",
|
|
44
|
-
"@vibes.diy/api-pkg": "14.3.
|
|
45
|
-
"@vibes.diy/api-sql": "14.3.
|
|
46
|
-
"@vibes.diy/api-types": "14.3.
|
|
47
|
-
"@vibes.diy/call-ai-v2": "14.3.
|
|
48
|
-
"@vibes.diy/identity": "14.3.
|
|
49
|
-
"@vibes.diy/look": "14.3.
|
|
50
|
-
"@vibes.diy/pouf": "14.3.
|
|
51
|
-
"@vibes.diy/prompts": "14.3.
|
|
52
|
-
"@vibes.diy/vibe-db-explorer": "14.3.
|
|
53
|
-
"@vibes.diy/vibe-runtime": "14.3.
|
|
54
|
-
"@vibes.diy/vibe-types": "14.3.
|
|
44
|
+
"@vibes.diy/api-pkg": "14.3.174",
|
|
45
|
+
"@vibes.diy/api-sql": "14.3.174",
|
|
46
|
+
"@vibes.diy/api-types": "14.3.174",
|
|
47
|
+
"@vibes.diy/call-ai-v2": "14.3.174",
|
|
48
|
+
"@vibes.diy/identity": "14.3.174",
|
|
49
|
+
"@vibes.diy/look": "14.3.174",
|
|
50
|
+
"@vibes.diy/pouf": "14.3.174",
|
|
51
|
+
"@vibes.diy/prompts": "14.3.174",
|
|
52
|
+
"@vibes.diy/vibe-db-explorer": "14.3.174",
|
|
53
|
+
"@vibes.diy/vibe-runtime": "14.3.174",
|
|
54
|
+
"@vibes.diy/vibe-types": "14.3.174",
|
|
55
55
|
"acorn": "~8.17.0",
|
|
56
56
|
"acorn-jsx": "~5.3.2",
|
|
57
57
|
"arktype": "~2.2.6",
|
|
58
|
-
"call-ai": "14.3.
|
|
58
|
+
"call-ai": "14.3.174",
|
|
59
59
|
"charwise": "~3.0.1",
|
|
60
60
|
"cookie": "~2.0.1",
|
|
61
61
|
"csv-parse": "~7.0.3",
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { Result } from "@adviser/cement";
|
|
2
|
+
import type { ResReportCampaignReadout, ResReportTopVibesByTrafficSource } from "@vibes.diy/api-types";
|
|
3
|
+
import { type RawAttributedPerson } from "./campaign-health-readout.js";
|
|
4
|
+
import { type FetchLike } from "./vibe-traffic-source.js";
|
|
5
|
+
export declare const META_GRAPH_BASE = "https://graph.facebook.com/v19.0";
|
|
6
|
+
export declare const MAX_SEGMENT_DAYS = 28;
|
|
7
|
+
export declare const META_NOTE = "Meta Graph insights by the hour in the account's time zone. Spend, link clicks and Lead count/points are Meta's own figures (7-day click attribution). Frequency and placements are day-granular, so they include the whole first day of the segment.";
|
|
8
|
+
export declare const READOUT_POSTHOG_NOTE = "PostHog counts PEOPLE who entered a session through an ad click (fbclid on the session entry), attributed to their first utm_campaign. It is US-only and fail-closed (#4257) and lossy to ad blockers, so every visitor and prompter count is a FLOOR and every cost per real prompt is a ceiling. A person is bucketed by the time of their first ad click in the window.";
|
|
9
|
+
export declare const STAFF_NOTE = "Staff are excluded by Clerk userId (VIBES_ADMIN_USER_IDS and the known-staff list) via PostHog distinct ids. Staff recognised only by handle (e.g. meghanthegreat, announced-pour-bring) are NOT excluded here \u2014 PostHog persons carry no handle. An ad-click entry makes staff rare in these counts.";
|
|
10
|
+
export declare function metaGraphGet<T>(fetchImpl: FetchLike, path: string, token: string): Promise<Result<T>>;
|
|
11
|
+
export declare function attributionQuery(utms: readonly string[], sinceTs: number, staffUserIds: readonly string[]): string;
|
|
12
|
+
export declare function numList(v: unknown): number[];
|
|
13
|
+
export declare function fetchAttributedPersons(opts: {
|
|
14
|
+
readonly apiKey: string | undefined;
|
|
15
|
+
readonly projectId: string | undefined;
|
|
16
|
+
readonly host?: string;
|
|
17
|
+
readonly utms: readonly string[];
|
|
18
|
+
readonly sinceTs: number;
|
|
19
|
+
readonly staffUserIds: readonly string[];
|
|
20
|
+
readonly fetchImpl: FetchLike;
|
|
21
|
+
}): Promise<{
|
|
22
|
+
persons: RawAttributedPerson[] | undefined;
|
|
23
|
+
health: ResReportTopVibesByTrafficSource;
|
|
24
|
+
}>;
|
|
25
|
+
export declare function buildCampaignReadout(deps: {
|
|
26
|
+
readonly token: string;
|
|
27
|
+
readonly account: string;
|
|
28
|
+
readonly posthog: {
|
|
29
|
+
readonly apiKey?: string;
|
|
30
|
+
readonly projectId?: string;
|
|
31
|
+
readonly host?: string;
|
|
32
|
+
};
|
|
33
|
+
readonly staffUserIds: readonly string[];
|
|
34
|
+
readonly fetchImpl: FetchLike;
|
|
35
|
+
readonly now: Date;
|
|
36
|
+
}): Promise<ResReportCampaignReadout>;
|
|
@@ -0,0 +1,321 @@
|
|
|
1
|
+
import { Result, exception2Result } from "@adviser/cement";
|
|
2
|
+
import { BENCHMARK_COST_PER_PROMPT, INTERVAL_LEVEL, MIN_PROMPTERS, aggregateAttribution, compareToControl, dailyTrend, effectiveSegmentStart, evaluateChecklist, extractUtmCampaign, parseHourlyInsight, parseSegmentStart, placementRows, promptVerdict, sumHours, zonedDay, personsInWindow, } from "./campaign-health-readout.js";
|
|
3
|
+
import { DEFAULT_POSTHOG_QUERY_HOST, hogql } from "./vibe-traffic-source.js";
|
|
4
|
+
export const META_GRAPH_BASE = "https://graph.facebook.com/v19.0";
|
|
5
|
+
const FALLBACK_TZ = "America/Los_Angeles";
|
|
6
|
+
export const MAX_SEGMENT_DAYS = 28;
|
|
7
|
+
const NO_EDIT_FALLBACK_DAYS = 7;
|
|
8
|
+
const PERSON_ROW_CAP = 50_000;
|
|
9
|
+
export const META_NOTE = "Meta Graph insights by the hour in the account's time zone. Spend, link clicks and Lead count/points are Meta's own figures (7-day click attribution). Frequency and placements are day-granular, so they include the whole first day of the segment.";
|
|
10
|
+
export const READOUT_POSTHOG_NOTE = "PostHog counts PEOPLE who entered a session through an ad click (fbclid on the session entry), attributed to their first utm_campaign. It is US-only and fail-closed (#4257) and lossy to ad blockers, so every visitor and prompter count is a FLOOR and every cost per real prompt is a ceiling. A person is bucketed by the time of their first ad click in the window.";
|
|
11
|
+
export const STAFF_NOTE = "Staff are excluded by Clerk userId (VIBES_ADMIN_USER_IDS and the known-staff list) via PostHog distinct ids. Staff recognised only by handle (e.g. meghanthegreat, announced-pour-bring) are NOT excluded here — PostHog persons carry no handle. An ad-click entry makes staff rare in these counts.";
|
|
12
|
+
export async function metaGraphGet(fetchImpl, path, token) {
|
|
13
|
+
const sep = path.includes("?") ? "&" : "?";
|
|
14
|
+
const rRes = await exception2Result(() => fetchImpl(`${META_GRAPH_BASE}${path}${sep}access_token=${encodeURIComponent(token)}`, { signal: AbortSignal.timeout(15_000) }));
|
|
15
|
+
if (rRes.isErr())
|
|
16
|
+
return Result.Err(rRes.Err());
|
|
17
|
+
const rJson = await exception2Result(() => rRes.Ok().json());
|
|
18
|
+
if (rJson.isErr())
|
|
19
|
+
return Result.Err(rJson.Err());
|
|
20
|
+
const json = rJson.Ok();
|
|
21
|
+
if (json.error !== undefined)
|
|
22
|
+
return Result.Err(new Error(`Meta API: ${json.error.message}`));
|
|
23
|
+
return Result.Ok(json);
|
|
24
|
+
}
|
|
25
|
+
async function metaGetAll(fetchImpl, path, token, maxPages = 10) {
|
|
26
|
+
const out = [];
|
|
27
|
+
let after = undefined;
|
|
28
|
+
for (let page = 0; page < maxPages; page++) {
|
|
29
|
+
const cursor = after === undefined ? "" : `&after=${encodeURIComponent(after)}`;
|
|
30
|
+
const r = await metaGraphGet(fetchImpl, `${path}${cursor}`, token);
|
|
31
|
+
if (r.isErr())
|
|
32
|
+
return Result.Err(r.Err());
|
|
33
|
+
out.push(...(r.Ok().data ?? []));
|
|
34
|
+
if (r.Ok().paging?.next === undefined)
|
|
35
|
+
break;
|
|
36
|
+
after = r.Ok().paging?.cursors?.after;
|
|
37
|
+
if (after === undefined)
|
|
38
|
+
break;
|
|
39
|
+
}
|
|
40
|
+
return Result.Ok(out);
|
|
41
|
+
}
|
|
42
|
+
function errText(e) {
|
|
43
|
+
return e instanceof Error ? e.message : String(e);
|
|
44
|
+
}
|
|
45
|
+
const SAFE_TOKEN = /^[A-Za-z0-9._-]+$/;
|
|
46
|
+
function sqlList(values) {
|
|
47
|
+
return values
|
|
48
|
+
.filter((v) => SAFE_TOKEN.test(v))
|
|
49
|
+
.map((v) => `'${v}'`)
|
|
50
|
+
.join(",");
|
|
51
|
+
}
|
|
52
|
+
export function attributionQuery(utms, sinceTs, staffUserIds) {
|
|
53
|
+
const utmList = sqlList(utms);
|
|
54
|
+
const staff = sqlList(staffUserIds);
|
|
55
|
+
const staffClause = staff === "" ? "" : `\n AND person_id NOT IN (SELECT person_id FROM person_distinct_ids WHERE distinct_id IN (${staff}))`;
|
|
56
|
+
return `SELECT
|
|
57
|
+
argMinIf(properties.utm_campaign, timestamp, properties.utm_campaign IN (${utmList})) AS cell,
|
|
58
|
+
arraySort(groupArrayIf(toUnixTimestamp(timestamp), position(properties.$session_entry_url, 'fbclid=') > 0 OR properties.$session_entry_fbclid IS NOT NULL)) AS clicked_ats,
|
|
59
|
+
arraySort(groupArrayIf(toUnixTimestamp(timestamp), event = 'composer_engaged')) AS touched_ats,
|
|
60
|
+
arraySort(groupArrayIf(toUnixTimestamp(timestamp), event = 'prompt_submitted' AND properties.via = 'typed')) AS typed_ats
|
|
61
|
+
FROM events
|
|
62
|
+
WHERE timestamp >= toDateTime(${Math.floor(sinceTs)})${staffClause}
|
|
63
|
+
GROUP BY person_id
|
|
64
|
+
HAVING isNotNull(cell) AND cell != '' AND length(clicked_ats) > 0
|
|
65
|
+
LIMIT ${PERSON_ROW_CAP}`;
|
|
66
|
+
}
|
|
67
|
+
export function numList(v) {
|
|
68
|
+
const xs = Array.isArray(v) ? v : v === null || v === undefined ? [] : [v];
|
|
69
|
+
return xs
|
|
70
|
+
.map(num)
|
|
71
|
+
.filter((t) => t > 0)
|
|
72
|
+
.sort((x, y) => x - y);
|
|
73
|
+
}
|
|
74
|
+
function num(v) {
|
|
75
|
+
const x = typeof v === "number" ? v : Number(v);
|
|
76
|
+
return Number.isFinite(x) ? x : 0;
|
|
77
|
+
}
|
|
78
|
+
export async function fetchAttributedPersons(opts) {
|
|
79
|
+
const base = { id: "posthog", label: "PostHog ad-click people", note: READOUT_POSTHOG_NOTE };
|
|
80
|
+
if (opts.apiKey === undefined || opts.apiKey === "" || opts.projectId === undefined || opts.projectId === "") {
|
|
81
|
+
return {
|
|
82
|
+
persons: undefined,
|
|
83
|
+
health: { ...base, available: false, error: "POSTHOG_QUERY_API_KEY / POSTHOG_PROJECT_ID are not configured" },
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
if (sqlList(opts.utms) === "") {
|
|
87
|
+
return {
|
|
88
|
+
persons: undefined,
|
|
89
|
+
health: { ...base, available: false, error: "no utm_campaign found on the active ad sets' ads, so nothing to attribute" },
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
const r = await hogql({
|
|
93
|
+
apiKey: opts.apiKey,
|
|
94
|
+
projectId: opts.projectId,
|
|
95
|
+
host: opts.host === undefined || opts.host === "" ? DEFAULT_POSTHOG_QUERY_HOST : opts.host,
|
|
96
|
+
fetchImpl: opts.fetchImpl,
|
|
97
|
+
}, attributionQuery(opts.utms, opts.sinceTs, opts.staffUserIds));
|
|
98
|
+
if (r.isErr())
|
|
99
|
+
return { persons: undefined, health: { ...base, available: false, error: errText(r.Err()) } };
|
|
100
|
+
const persons = r.Ok().map((row) => ({
|
|
101
|
+
utmCampaign: typeof row[0] === "string" ? row[0] : "",
|
|
102
|
+
clicks: numList(row[1]),
|
|
103
|
+
touches: numList(row[2]),
|
|
104
|
+
typed: numList(row[3]),
|
|
105
|
+
}));
|
|
106
|
+
return {
|
|
107
|
+
persons,
|
|
108
|
+
health: { ...base, available: true, ...(persons.length >= PERSON_ROW_CAP ? { truncated: true } : {}) },
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
function timeRange(fromTs, toTs, tz) {
|
|
112
|
+
return `time_range=${encodeURIComponent(JSON.stringify({ since: zonedDay(fromTs, tz), until: zonedDay(toTs - 1, tz) }))}`;
|
|
113
|
+
}
|
|
114
|
+
function windowOf(hours, fromTs, toTs, nowTs, dailyBudget, people) {
|
|
115
|
+
const t = sumHours(hours, fromTs, toTs);
|
|
116
|
+
const h = Math.max(0, (Math.min(toTs, nowTs) - fromTs) / 3600);
|
|
117
|
+
return {
|
|
118
|
+
fromTs,
|
|
119
|
+
toTs,
|
|
120
|
+
hours: h,
|
|
121
|
+
...t,
|
|
122
|
+
...(dailyBudget === undefined ? {} : { budget: (dailyBudget * h) / 24 }),
|
|
123
|
+
...(people === undefined
|
|
124
|
+
? {}
|
|
125
|
+
: {
|
|
126
|
+
visitors: people.visitors,
|
|
127
|
+
touched: people.touched,
|
|
128
|
+
typedPrompters: people.typedPrompters,
|
|
129
|
+
...(people.typedPrompters > 0 ? { costPerPrompt: t.spend / people.typedPrompters } : {}),
|
|
130
|
+
}),
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
export async function buildCampaignReadout(deps) {
|
|
134
|
+
const { token, account, fetchImpl } = deps;
|
|
135
|
+
const nowTs = Math.floor(deps.now.getTime() / 1000);
|
|
136
|
+
const hourNow = Math.floor(nowTs / 3600) * 3600;
|
|
137
|
+
const todayFrom = hourNow - 23 * 3600;
|
|
138
|
+
const toTs = hourNow + 3600;
|
|
139
|
+
const metaBase = { id: "meta", label: "Meta Ads insights", note: META_NOTE };
|
|
140
|
+
const empty = (metaError, tz) => ({
|
|
141
|
+
accountTimezone: tz,
|
|
142
|
+
benchmarkCostPerPrompt: BENCHMARK_COST_PER_PROMPT,
|
|
143
|
+
minPrompters: MIN_PROMPTERS,
|
|
144
|
+
intervalLevel: INTERVAL_LEVEL,
|
|
145
|
+
sources: [
|
|
146
|
+
{ ...metaBase, available: false, error: metaError },
|
|
147
|
+
{
|
|
148
|
+
id: "posthog",
|
|
149
|
+
label: "PostHog ad-click people",
|
|
150
|
+
note: READOUT_POSTHOG_NOTE,
|
|
151
|
+
available: false,
|
|
152
|
+
error: "not read: no ad sets",
|
|
153
|
+
},
|
|
154
|
+
],
|
|
155
|
+
staffNote: STAFF_NOTE,
|
|
156
|
+
adSets: [],
|
|
157
|
+
comparisons: [],
|
|
158
|
+
});
|
|
159
|
+
const [rTz, rAdsets] = await Promise.all([
|
|
160
|
+
metaGraphGet(fetchImpl, `/${account}?fields=timezone_name`, token),
|
|
161
|
+
metaGetAll(fetchImpl, `/${account}/adsets?fields=id,name,campaign{name},effective_status,daily_budget,end_time,learning_stage_info&effective_status=${encodeURIComponent(JSON.stringify(["ACTIVE"]))}&limit=100`, token),
|
|
162
|
+
]);
|
|
163
|
+
const tz = rTz.isOk() && rTz.Ok().timezone_name !== undefined ? rTz.Ok().timezone_name : FALLBACK_TZ;
|
|
164
|
+
if (rAdsets.isErr())
|
|
165
|
+
return empty(errText(rAdsets.Err()), tz);
|
|
166
|
+
const active = rAdsets
|
|
167
|
+
.Ok()
|
|
168
|
+
.filter((a) => a.effective_status === "ACTIVE")
|
|
169
|
+
.filter((a) => a.end_time === undefined || new Date(a.end_time).getTime() > deps.now.getTime());
|
|
170
|
+
const metaErrors = [];
|
|
171
|
+
const perAdset = await Promise.all(active.map(async (adset) => {
|
|
172
|
+
const sigEdit = parseSegmentStart(adset.learning_stage_info);
|
|
173
|
+
const earliest = hourNow - MAX_SEGMENT_DAYS * 86_400;
|
|
174
|
+
const segFrom = Math.max(earliest, sigEdit === undefined ? hourNow - NO_EDIT_FALLBACK_DAYS * 86_400 : Math.min(effectiveSegmentStart(sigEdit), toTs));
|
|
175
|
+
const fetchFrom = Math.min(segFrom, todayFrom);
|
|
176
|
+
const [rAds, rHours, rFreq, rPlace] = await Promise.all([
|
|
177
|
+
metaGetAll(fetchImpl, `/${adset.id}/ads?fields=creative{url_tags,object_story_spec{link_data{link}}}&limit=100`, token, 3),
|
|
178
|
+
metaGetAll(fetchImpl, `/${adset.id}/insights?fields=spend,impressions,inline_link_clicks,actions,action_values&breakdowns=hourly_stats_aggregated_by_advertiser_time_zone&time_increment=1&${timeRange(fetchFrom, toTs, tz)}&limit=500`, token),
|
|
179
|
+
metaGraphGet(fetchImpl, `/${adset.id}/insights?fields=frequency,reach,impressions&${timeRange(segFrom, toTs, tz)}`, token),
|
|
180
|
+
metaGetAll(fetchImpl, `/${adset.id}/insights?fields=spend,action_values&breakdowns=publisher_platform,platform_position&${timeRange(segFrom, toTs, tz)}&limit=100`, token, 3),
|
|
181
|
+
]);
|
|
182
|
+
const utms = new Set();
|
|
183
|
+
for (const ad of rAds.isOk() ? rAds.Ok() : []) {
|
|
184
|
+
const u = extractUtmCampaign(ad.creative?.object_story_spec?.link_data?.link, ad.creative?.url_tags);
|
|
185
|
+
if (u !== undefined)
|
|
186
|
+
utms.add(u);
|
|
187
|
+
}
|
|
188
|
+
if (rAds.isErr())
|
|
189
|
+
metaErrors.push(`ads for ${adset.name}: ${errText(rAds.Err())}`);
|
|
190
|
+
if (rHours.isErr())
|
|
191
|
+
metaErrors.push(`hourly insights for ${adset.name}: ${errText(rHours.Err())}`);
|
|
192
|
+
const freqRaw = rFreq.isOk() ? rFreq.Ok().data?.[0]?.frequency : undefined;
|
|
193
|
+
const freq = freqRaw === undefined ? undefined : Number(freqRaw);
|
|
194
|
+
return {
|
|
195
|
+
adset,
|
|
196
|
+
utms: [...utms].sort(),
|
|
197
|
+
hours: rHours.isOk()
|
|
198
|
+
? rHours
|
|
199
|
+
.Ok()
|
|
200
|
+
.map((r) => parseHourlyInsight(r, tz))
|
|
201
|
+
.filter((h) => h !== undefined)
|
|
202
|
+
: undefined,
|
|
203
|
+
...(rHours.isErr() ? { hoursError: errText(rHours.Err()) } : {}),
|
|
204
|
+
frequency: freq !== undefined && Number.isFinite(freq) ? freq : undefined,
|
|
205
|
+
placements: rPlace.isOk() ? rPlace.Ok() : undefined,
|
|
206
|
+
...(rPlace.isErr() ? { placementsError: errText(rPlace.Err()) } : {}),
|
|
207
|
+
segFrom,
|
|
208
|
+
};
|
|
209
|
+
}));
|
|
210
|
+
const utmToAdset = new Map();
|
|
211
|
+
for (const a of perAdset)
|
|
212
|
+
for (const u of a.utms)
|
|
213
|
+
utmToAdset.set(u, a.adset.id);
|
|
214
|
+
const phSince = perAdset.reduce((m, a) => Math.min(m, a.segFrom, todayFrom), todayFrom);
|
|
215
|
+
const ph = perAdset.length === 0
|
|
216
|
+
? {
|
|
217
|
+
persons: undefined,
|
|
218
|
+
health: {
|
|
219
|
+
id: "posthog",
|
|
220
|
+
label: "PostHog ad-click people",
|
|
221
|
+
note: READOUT_POSTHOG_NOTE,
|
|
222
|
+
available: false,
|
|
223
|
+
error: "not read: no active ad sets",
|
|
224
|
+
},
|
|
225
|
+
}
|
|
226
|
+
: await fetchAttributedPersons({
|
|
227
|
+
apiKey: deps.posthog.apiKey,
|
|
228
|
+
projectId: deps.posthog.projectId,
|
|
229
|
+
...(deps.posthog.host === undefined ? {} : { host: deps.posthog.host }),
|
|
230
|
+
utms: [...utmToAdset.keys()],
|
|
231
|
+
sinceTs: phSince,
|
|
232
|
+
staffUserIds: deps.staffUserIds,
|
|
233
|
+
fetchImpl,
|
|
234
|
+
});
|
|
235
|
+
const segAgg = new Map();
|
|
236
|
+
const adSets = perAdset.map((a) => {
|
|
237
|
+
const budgetCents = Number(a.adset.daily_budget);
|
|
238
|
+
const dailyBudget = Number.isFinite(budgetCents) && budgetCents > 0 ? budgetCents / 100 : undefined;
|
|
239
|
+
const metaMissing = a.hours === undefined;
|
|
240
|
+
const peopleMissing = metaMissing || a.utms.length === 0;
|
|
241
|
+
const hours = a.hours ?? [];
|
|
242
|
+
const personsFor = (from) => {
|
|
243
|
+
if (ph.persons === undefined || peopleMissing)
|
|
244
|
+
return undefined;
|
|
245
|
+
const key = String(from);
|
|
246
|
+
const agg = segAgg.get(key) ?? aggregateAttribution(personsInWindow(ph.persons, from, toTs), utmToAdset, from, toTs);
|
|
247
|
+
segAgg.set(key, agg);
|
|
248
|
+
return agg.get(a.adset.id) ?? { visitors: 0, touched: 0, typedPrompters: 0 };
|
|
249
|
+
};
|
|
250
|
+
const segment = windowOf(hours, a.segFrom, toTs, nowTs, dailyBudget, personsFor(a.segFrom));
|
|
251
|
+
const today = windowOf(hours, todayFrom, toTs, nowTs, dailyBudget, personsFor(todayFrom));
|
|
252
|
+
const sigEdit = parseSegmentStart(a.adset.learning_stage_info);
|
|
253
|
+
const check = evaluateChecklist({
|
|
254
|
+
budget: segment.budget,
|
|
255
|
+
spend: segment.spend,
|
|
256
|
+
learningStatus: a.adset.learning_stage_info?.status,
|
|
257
|
+
typedPrompters: segment.typedPrompters,
|
|
258
|
+
costPerPrompt: segment.costPerPrompt,
|
|
259
|
+
leads: segment.leads,
|
|
260
|
+
leadPoints: segment.leadPoints,
|
|
261
|
+
frequency: a.frequency,
|
|
262
|
+
benchmark: BENCHMARK_COST_PER_PROMPT,
|
|
263
|
+
});
|
|
264
|
+
const conv = a.adset.learning_stage_info?.conversions;
|
|
265
|
+
return {
|
|
266
|
+
adsetId: a.adset.id,
|
|
267
|
+
adsetName: a.adset.name,
|
|
268
|
+
campaignName: a.adset.campaign?.name ?? "",
|
|
269
|
+
utmCampaigns: a.utms,
|
|
270
|
+
...(dailyBudget === undefined ? {} : { dailyBudget }),
|
|
271
|
+
...(a.adset.learning_stage_info?.status === undefined ? {} : { learningStatus: a.adset.learning_stage_info.status }),
|
|
272
|
+
...(typeof conv === "number" ? { learningConversions: conv } : {}),
|
|
273
|
+
...(sigEdit === undefined ? {} : { lastSigEditTs: sigEdit }),
|
|
274
|
+
segment,
|
|
275
|
+
today,
|
|
276
|
+
...(a.frequency === undefined ? {} : { frequency: a.frequency }),
|
|
277
|
+
verdict: metaMissing
|
|
278
|
+
? { kind: "no-data", label: "no Meta spend data" }
|
|
279
|
+
: promptVerdict(segment.spend, segment.typedPrompters, BENCHMARK_COST_PER_PROMPT, INTERVAL_LEVEL),
|
|
280
|
+
checklist: check.items,
|
|
281
|
+
ready: check.ready,
|
|
282
|
+
daily: dailyTrend({
|
|
283
|
+
hours,
|
|
284
|
+
persons: peopleMissing || ph.persons === undefined ? undefined : personsInWindow(ph.persons, a.segFrom, toTs),
|
|
285
|
+
adsetUtms: new Set(a.utms),
|
|
286
|
+
fromTs: a.segFrom,
|
|
287
|
+
toTs,
|
|
288
|
+
tz,
|
|
289
|
+
}),
|
|
290
|
+
placements: a.placements === undefined ? [] : placementRows(a.placements),
|
|
291
|
+
...(a.placementsError === undefined ? {} : { placementsError: a.placementsError }),
|
|
292
|
+
};
|
|
293
|
+
});
|
|
294
|
+
adSets.sort((x, y) => y.segment.spend - x.segment.spend);
|
|
295
|
+
const comparisons = [];
|
|
296
|
+
const withPeople = adSets.filter((a) => a.segment.typedPrompters !== undefined);
|
|
297
|
+
if (withPeople.length >= 2) {
|
|
298
|
+
const isBroad = (a) => a.utmCampaigns.some((u) => /broad/i.test(u)) || /broad/i.test(a.campaignName) || /broad/i.test(a.adsetName);
|
|
299
|
+
const control = withPeople.find(isBroad) ?? withPeople[0];
|
|
300
|
+
const label = (a) => a.utmCampaigns[0] ?? a.adsetName;
|
|
301
|
+
for (const a of withPeople) {
|
|
302
|
+
if (a === control)
|
|
303
|
+
continue;
|
|
304
|
+
comparisons.push(compareToControl({ name: label(a), spend: a.segment.spend, prompts: a.segment.typedPrompters ?? 0 }, { name: label(control), spend: control.segment.spend, prompts: control.segment.typedPrompters ?? 0 }, INTERVAL_LEVEL));
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
const metaHealth = metaErrors.length === 0
|
|
308
|
+
? { ...metaBase, available: true }
|
|
309
|
+
: { ...metaBase, available: perAdset.some((a) => a.hours !== undefined), error: metaErrors.join("; ") };
|
|
310
|
+
return {
|
|
311
|
+
accountTimezone: tz,
|
|
312
|
+
benchmarkCostPerPrompt: BENCHMARK_COST_PER_PROMPT,
|
|
313
|
+
minPrompters: MIN_PROMPTERS,
|
|
314
|
+
intervalLevel: INTERVAL_LEVEL,
|
|
315
|
+
sources: [metaHealth, ph.health],
|
|
316
|
+
staffNote: STAFF_NOTE,
|
|
317
|
+
adSets,
|
|
318
|
+
comparisons,
|
|
319
|
+
};
|
|
320
|
+
}
|
|
321
|
+
//# sourceMappingURL=campaign-health-readout-source.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"campaign-health-readout-source.js","sourceRoot":"","sources":["../../jsr/public/campaign-health-readout-source.ts"],"names":[],"mappings":"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"}
|