@vibes.diy/api-svc 14.3.173 → 14.3.175
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/agent-session-instruction.d.ts +2 -2
- package/intern/agent-session-instruction.js +2 -2
- package/intern/agent-session-instruction.js.map +1 -1
- package/intern/grouped-vibe-import-map.d.ts +1 -0
- package/intern/grouped-vibe-import-map.js +2 -1
- package/intern/grouped-vibe-import-map.js.map +1 -1
- package/intern/notification-prefs.d.ts +3 -0
- package/intern/notification-prefs.js +37 -2
- package/intern/notification-prefs.js.map +1 -1
- package/intern/notify-vibe-published.d.ts +1 -0
- package/intern/notify-vibe-published.js +3 -1
- package/intern/notify-vibe-published.js.map +1 -1
- package/intern/opens-check.js +1 -0
- package/intern/opens-check.js.map +1 -1
- package/intern/settings-carry-policy.js +1 -0
- package/intern/settings-carry-policy.js.map +1 -1
- package/package.json +18 -18
- package/public/app-settings-sql-upsert.js +5 -2
- package/public/app-settings-sql-upsert.js.map +1 -1
- package/public/auto-enhance.d.ts +12 -0
- package/public/auto-enhance.js +20 -0
- package/public/auto-enhance.js.map +1 -0
- 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/ensure-app-settings.js +21 -1
- package/public/ensure-app-settings.js.map +1 -1
- package/public/ensure-app-slug-item.js +20 -0
- package/public/ensure-app-slug-item.js.map +1 -1
- package/public/list-notifications.js +11 -2
- package/public/list-notifications.js.map +1 -1
- package/public/publish-app.d.ts +1 -0
- package/public/publish-app.js +17 -1
- package/public/publish-app.js.map +1 -1
- package/public/report-campaign-health.js +24 -14
- package/public/report-campaign-health.js.map +1 -1
- package/public/set-mode-fsid.js +15 -1
- package/public/set-mode-fsid.js.map +1 -1
- package/public/set-version-lock.js +11 -0
- package/public/set-version-lock.js.map +1 -1
- package/public/settings-envelope-readout.js +2 -0
- package/public/settings-envelope-readout.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,8 +1,8 @@
|
|
|
1
1
|
import { exception2Result } from "@adviser/cement";
|
|
2
|
-
import { isAppScopedEntry, keyForEntry, isActiveCachedSuggestion, isActiveCachedSuggestionBless, isActiveColorTheme, isActiveStyle, isDraftStyle, isActiveDbAcl, isActiveEnv, isActiveIcon, isActiveIconDescription, isActiveModelSettingCodegen, isActiveModelSettingImg, isActiveModelSettingRuntime, isActiveAnonWrite, isActiveEditorWritesOnly, isActiveAppNature, effectiveAppNature, isActivePosture, isActivePrivacySensitive, isActiveSkills, isActiveTheme, isActiveTitle, isActiveLayoutArchetype, isActiveFlourishes, isEnablePublicAccess, isEnableRequest, } from "@vibes.diy/api-types";
|
|
2
|
+
import { isAppScopedEntry, keyForEntry, isActiveCachedSuggestion, isActiveCachedSuggestionBless, isActiveColorTheme, isActiveStyle, isDraftStyle, isActiveDbAcl, isActiveEnv, isActiveIcon, isActiveIconDescription, isActiveModelSettingCodegen, isActiveModelSettingImg, isActiveModelSettingRuntime, isActiveAnonWrite, isActiveEditorWritesOnly, isActiveAutoEnhance, isActiveAppNature, effectiveAppNature, isActivePosture, isActivePrivacySensitive, isActiveSkills, isActiveTheme, isActiveTitle, isActiveLayoutArchetype, isActiveFlourishes, isEnablePublicAccess, isEnableRequest, } from "@vibes.diy/api-types";
|
|
3
3
|
import { canonicalizeAppScopedEntry, promoteAppSettingItem, readComposedSettings, writeAppSettingItems, } from "./app-setting-items.js";
|
|
4
4
|
export function buildEnsureEntryResult(entries) {
|
|
5
|
-
const wireEntries = entries.filter((e) => isActiveEditorWritesOnly(e) === false && isActiveAppNature(e) === false);
|
|
5
|
+
const wireEntries = entries.filter((e) => isActiveEditorWritesOnly(e) === false && isActiveAppNature(e) === false && isActiveAutoEnhance(e) === false);
|
|
6
6
|
let storedNature;
|
|
7
7
|
const result = {
|
|
8
8
|
entries: wireEntries,
|
|
@@ -109,6 +109,9 @@ export function buildEnsureEntryResult(entries) {
|
|
|
109
109
|
case isActiveEditorWritesOnly(e):
|
|
110
110
|
result.entry.editorWritesOnly = e.enable;
|
|
111
111
|
break;
|
|
112
|
+
case isActiveAutoEnhance(e):
|
|
113
|
+
result.entry.autoEnhance = e.enable;
|
|
114
|
+
break;
|
|
112
115
|
case isActiveAppNature(e):
|
|
113
116
|
storedNature = e.nature;
|
|
114
117
|
break;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-settings-sql-upsert.js","sourceRoot":"","sources":["../../jsr/public/app-settings-sql-upsert.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAKL,gBAAgB,EAChB,WAAW,EACX,wBAAwB,EACxB,6BAA6B,EAC7B,kBAAkB,EAClB,aAAa,EACb,YAAY,EACZ,aAAa,EACb,WAAW,EACX,YAAY,EACZ,uBAAuB,EACvB,2BAA2B,EAC3B,uBAAuB,EACvB,2BAA2B,EAC3B,iBAAiB,EACjB,wBAAwB,EACxB,iBAAiB,EACjB,kBAAkB,EAElB,eAAe,EACf,wBAAwB,EACxB,cAAc,EACd,aAAa,EACb,aAAa,EACb,uBAAuB,EACvB,kBAAkB,EAClB,oBAAoB,EACpB,eAAe,GAChB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,0BAA0B,EAC1B,qBAAqB,EACrB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,wBAAwB,CAAC;AAEhC,MAAM,UAAU,sBAAsB,CAAC,OAAsB;
|
|
1
|
+
{"version":3,"file":"app-settings-sql-upsert.js","sourceRoot":"","sources":["../../jsr/public/app-settings-sql-upsert.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Result } from "@adviser/cement";
|
|
2
|
+
import { type ResAutoEnhanceOff } from "@vibes.diy/api-types";
|
|
3
|
+
import type { VibesApiSQLCtx } from "../types.js";
|
|
4
|
+
export declare function autoEnhanceAllowed(vctx: Pick<VibesApiSQLCtx, "sql">, args: {
|
|
5
|
+
ownerHandle: string;
|
|
6
|
+
appSlug: string;
|
|
7
|
+
}): Promise<Result<boolean>>;
|
|
8
|
+
export declare function adminPushRefusal(vctx: VibesApiSQLCtx, args: {
|
|
9
|
+
actingUserId: string;
|
|
10
|
+
ownerHandle: string;
|
|
11
|
+
appSlug: string;
|
|
12
|
+
}): Promise<Result<ResAutoEnhanceOff | undefined>>;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Result } from "@adviser/cement";
|
|
2
|
+
import { mkResAutoEnhanceOff } from "@vibes.diy/api-types";
|
|
3
|
+
import { loadAppSettingsSnapshot } from "./app-settings-snapshot.js";
|
|
4
|
+
import { logAdminOverride } from "./platform-admin.js";
|
|
5
|
+
export async function autoEnhanceAllowed(vctx, args) {
|
|
6
|
+
const rSnap = await loadAppSettingsSnapshot(vctx, args);
|
|
7
|
+
if (rSnap.isErr())
|
|
8
|
+
return Result.Err(rSnap);
|
|
9
|
+
return Result.Ok(rSnap.Ok().entry.autoEnhance !== false);
|
|
10
|
+
}
|
|
11
|
+
export async function adminPushRefusal(vctx, args) {
|
|
12
|
+
const rAllowed = await autoEnhanceAllowed(vctx, args);
|
|
13
|
+
if (rAllowed.isErr())
|
|
14
|
+
return Result.Err(rAllowed);
|
|
15
|
+
if (rAllowed.Ok())
|
|
16
|
+
return Result.Ok(undefined);
|
|
17
|
+
logAdminOverride(vctx, { op: "support-push-refused", ...args });
|
|
18
|
+
return Result.Ok(mkResAutoEnhanceOff());
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=auto-enhance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-enhance.js","sourceRoot":"","sources":["../../jsr/public/auto-enhance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,mBAAmB,EAA0B,MAAM,sBAAsB,CAAC;AAEnF,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AACrE,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAMvD,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,IAAiC,EACjC,IAA8C;IAE9C,MAAM,KAAK,GAAG,MAAM,uBAAuB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACxD,IAAI,KAAK,CAAC,KAAK,EAAE;QAAE,OAAO,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC5C,OAAO,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,KAAK,KAAK,CAAC,CAAC;AAC3D,CAAC;AAYD,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,IAAoB,EACpB,IAAoE;IAEpE,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACtD,IAAI,QAAQ,CAAC,KAAK,EAAE;QAAE,OAAO,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAClD,IAAI,QAAQ,CAAC,EAAE,EAAE;QAAE,OAAO,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;IAC/C,gBAAgB,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,sBAAsB,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;IAChE,OAAO,MAAM,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC,CAAC;AAC1C,CAAC"}
|
|
@@ -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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"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import type { ResReportCampaignReadoutCheck, ResReportCampaignReadoutComparison, ResReportCampaignReadoutDay, ResReportCampaignReadoutPlacement, ResReportCampaignReadoutVerdict } from "@vibes.diy/api-types";
|
|
2
|
+
export declare const BENCHMARK_COST_PER_PROMPT = 54;
|
|
3
|
+
export declare const MIN_PROMPTERS = 10;
|
|
4
|
+
export declare const INTERVAL_LEVEL = 0.9;
|
|
5
|
+
export declare function poissonCI(k: number, level: number): [number, number];
|
|
6
|
+
export interface CostCI {
|
|
7
|
+
readonly point: number;
|
|
8
|
+
readonly lower: number;
|
|
9
|
+
readonly upper: number;
|
|
10
|
+
}
|
|
11
|
+
export declare function costPerPromptCI(spend: number, prompts: number, level: number): CostCI;
|
|
12
|
+
export declare function promptVerdict(spend: number, prompts: number | undefined, benchmark: number, level?: number): ResReportCampaignReadoutVerdict;
|
|
13
|
+
export interface CompareSide {
|
|
14
|
+
readonly name: string;
|
|
15
|
+
readonly spend: number;
|
|
16
|
+
readonly prompts: number;
|
|
17
|
+
}
|
|
18
|
+
export declare function compareToControl(cell: CompareSide, control: CompareSide, level: number): ResReportCampaignReadoutComparison;
|
|
19
|
+
export declare function parseSegmentStart(info: unknown): number | undefined;
|
|
20
|
+
export declare function effectiveSegmentStart(sigEditTs: number): number;
|
|
21
|
+
export declare function zonedDay(unixSec: number, tz: string): string;
|
|
22
|
+
export declare function zonedHourToUnix(day: string, hour: number, tz: string): number;
|
|
23
|
+
export interface MetaActionLike {
|
|
24
|
+
readonly action_type: string;
|
|
25
|
+
readonly value: string;
|
|
26
|
+
}
|
|
27
|
+
export declare function leadCount(actions: readonly MetaActionLike[] | undefined): number;
|
|
28
|
+
export declare function leadPoints(actionValues: readonly MetaActionLike[] | undefined): number;
|
|
29
|
+
export interface MetaHourlyRow {
|
|
30
|
+
readonly date_start: string;
|
|
31
|
+
readonly hourly_stats_aggregated_by_advertiser_time_zone?: string;
|
|
32
|
+
readonly spend?: string;
|
|
33
|
+
readonly impressions?: string;
|
|
34
|
+
readonly inline_link_clicks?: string;
|
|
35
|
+
readonly actions?: readonly MetaActionLike[];
|
|
36
|
+
readonly action_values?: readonly MetaActionLike[];
|
|
37
|
+
}
|
|
38
|
+
export interface MetaTotals {
|
|
39
|
+
readonly spend: number;
|
|
40
|
+
readonly impressions: number;
|
|
41
|
+
readonly linkClicks: number;
|
|
42
|
+
readonly leads: number;
|
|
43
|
+
readonly leadPoints: number;
|
|
44
|
+
}
|
|
45
|
+
export interface MetaHour extends MetaTotals {
|
|
46
|
+
readonly startTs: number;
|
|
47
|
+
readonly day: string;
|
|
48
|
+
}
|
|
49
|
+
export declare function parseHourlyInsight(row: MetaHourlyRow, tz: string): MetaHour | undefined;
|
|
50
|
+
export declare function sumHours(hours: readonly MetaHour[], fromTs: number, toTs: number): MetaTotals;
|
|
51
|
+
export declare function extractUtmCampaign(link: string | undefined, urlTags: string | undefined): string | undefined;
|
|
52
|
+
export interface AttributedPerson {
|
|
53
|
+
readonly utmCampaign: string;
|
|
54
|
+
readonly clickedAt: number;
|
|
55
|
+
readonly touchedAt: number;
|
|
56
|
+
readonly typedAt: number;
|
|
57
|
+
}
|
|
58
|
+
export interface AttributionCounts {
|
|
59
|
+
readonly visitors: number;
|
|
60
|
+
readonly touched: number;
|
|
61
|
+
readonly typedPrompters: number;
|
|
62
|
+
}
|
|
63
|
+
export interface RawAttributedPerson {
|
|
64
|
+
readonly utmCampaign: string;
|
|
65
|
+
readonly clicks: readonly number[];
|
|
66
|
+
readonly touches: readonly number[];
|
|
67
|
+
readonly typed: readonly number[];
|
|
68
|
+
}
|
|
69
|
+
export declare function personsInWindow(raw: readonly RawAttributedPerson[], fromTs: number, toTs: number): AttributedPerson[];
|
|
70
|
+
export declare function aggregateAttribution(persons: readonly AttributedPerson[], utmToAdset: ReadonlyMap<string, string>, fromTs: number, toTs: number): Map<string, AttributionCounts>;
|
|
71
|
+
export declare function dailyTrend(input: {
|
|
72
|
+
readonly hours: readonly MetaHour[];
|
|
73
|
+
readonly persons: readonly AttributedPerson[] | undefined;
|
|
74
|
+
readonly adsetUtms: ReadonlySet<string>;
|
|
75
|
+
readonly fromTs: number;
|
|
76
|
+
readonly toTs: number;
|
|
77
|
+
readonly tz: string;
|
|
78
|
+
}): ResReportCampaignReadoutDay[];
|
|
79
|
+
export interface MetaPlacementRow {
|
|
80
|
+
readonly publisher_platform?: string;
|
|
81
|
+
readonly platform_position?: string;
|
|
82
|
+
readonly spend?: string;
|
|
83
|
+
readonly action_values?: readonly MetaActionLike[];
|
|
84
|
+
}
|
|
85
|
+
export declare function placementRows(rows: readonly MetaPlacementRow[]): ResReportCampaignReadoutPlacement[];
|
|
86
|
+
export declare const DELIVERY_MIN = 0.9;
|
|
87
|
+
export declare const NON_TOUCH_MIN = 0.8;
|
|
88
|
+
export declare const FREQUENCY_MAX = 2;
|
|
89
|
+
export interface ChecklistInput {
|
|
90
|
+
readonly budget: number | undefined;
|
|
91
|
+
readonly spend: number;
|
|
92
|
+
readonly learningStatus: string | undefined;
|
|
93
|
+
readonly typedPrompters: number | undefined;
|
|
94
|
+
readonly costPerPrompt: number | undefined;
|
|
95
|
+
readonly leads: number;
|
|
96
|
+
readonly leadPoints: number;
|
|
97
|
+
readonly frequency: number | undefined;
|
|
98
|
+
readonly benchmark: number;
|
|
99
|
+
}
|
|
100
|
+
export declare function evaluateChecklist(input: ChecklistInput): {
|
|
101
|
+
items: ResReportCampaignReadoutCheck[];
|
|
102
|
+
ready: boolean;
|
|
103
|
+
};
|