@koda-sl/baker-cli 0.24.0-dev.55a07065 → 0.25.0-dev.55a07065
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/README.md +79 -46
- package/dist/cli.js +1 -1
- package/dist/commands/ads/meta/ads.d.ts +5 -1
- package/dist/commands/ads/meta/ads.d.ts.map +1 -1
- package/dist/commands/ads/meta/ads.js +11 -8
- package/dist/commands/ads/meta/ads.js.map +1 -1
- package/dist/commands/ads/meta/adsets.d.ts +5 -1
- package/dist/commands/ads/meta/adsets.d.ts.map +1 -1
- package/dist/commands/ads/meta/adsets.js +9 -6
- package/dist/commands/ads/meta/adsets.js.map +1 -1
- package/dist/commands/ads/meta/campaigns.d.ts +5 -1
- package/dist/commands/ads/meta/campaigns.d.ts.map +1 -1
- package/dist/commands/ads/meta/campaigns.js +12 -9
- package/dist/commands/ads/meta/campaigns.js.map +1 -1
- package/dist/commands/ads/meta/index.d.ts +15 -0
- package/dist/commands/ads/meta/index.d.ts.map +1 -1
- package/dist/commands/ads/meta/index.js +36 -33
- package/dist/commands/ads/meta/index.js.map +1 -1
- package/dist/commands/ads/meta/insights.d.ts +26 -14
- package/dist/commands/ads/meta/insights.d.ts.map +1 -1
- package/dist/commands/ads/meta/insights.js +154 -78
- package/dist/commands/ads/meta/insights.js.map +1 -1
- package/dist/commands/ads/meta/presets.d.ts +23 -11
- package/dist/commands/ads/meta/presets.d.ts.map +1 -1
- package/dist/commands/ads/meta/presets.js +62 -86
- package/dist/commands/ads/meta/presets.js.map +1 -1
- package/dist/commands/ads/meta/shared.d.ts +6 -0
- package/dist/commands/ads/meta/shared.d.ts.map +1 -1
- package/dist/commands/ads/meta/shared.js +15 -0
- package/dist/commands/ads/meta/shared.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
import { defineCommand } from "citty";
|
|
2
2
|
import { apiPost } from "../../../client.js";
|
|
3
3
|
import { writeAdsJson, writeAdsOutput } from "../output.js";
|
|
4
|
-
import {
|
|
4
|
+
import { composeFields, getIntent, listIntents } from "./presets.js";
|
|
5
5
|
import { csvOrJson, getDateRange, handleMetaError } from "./shared.js";
|
|
6
6
|
const POLL_INTERVAL_MS = 5_000;
|
|
7
7
|
const POLL_MAX_MS = 10 * 60_000;
|
|
8
|
+
/** Default attribution windows — only these still work as of Jan 2026 (1d_view + 28d_click also valid but rarely used). */
|
|
9
|
+
const DEFAULT_ATTRIBUTION_WINDOWS = ["7d_click", "1d_view"];
|
|
10
|
+
/** Default filter — strip rows that didn't deliver. Almost always what we want. */
|
|
11
|
+
const DEFAULT_FILTERING = [{ field: "impressions", operator: "GREATER_THAN", value: 0 }];
|
|
8
12
|
function commaSplit(input) {
|
|
9
13
|
if (!input)
|
|
10
14
|
return undefined;
|
|
@@ -23,21 +27,50 @@ function parseFiltering(raw) {
|
|
|
23
27
|
handleMetaError(new Error("Invalid --filtering JSON"));
|
|
24
28
|
}
|
|
25
29
|
}
|
|
26
|
-
function
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
+
function pickIntent(name) {
|
|
31
|
+
if (!name)
|
|
32
|
+
return "baseline";
|
|
33
|
+
const found = getIntent(name);
|
|
34
|
+
if (!found) {
|
|
35
|
+
handleMetaError(new Error(`Unknown --intent: ${name}. Use --list-intents to see options.`));
|
|
30
36
|
}
|
|
31
|
-
return
|
|
37
|
+
return found.name;
|
|
32
38
|
}
|
|
33
|
-
function
|
|
34
|
-
const
|
|
35
|
-
if (!
|
|
36
|
-
|
|
39
|
+
function pickLevel(args) {
|
|
40
|
+
const raw = args.level;
|
|
41
|
+
if (!raw)
|
|
42
|
+
return "account";
|
|
43
|
+
if (raw !== "account" && raw !== "campaign" && raw !== "adset" && raw !== "ad") {
|
|
44
|
+
handleMetaError(new Error("--level must be one of: account|campaign|adset|ad"));
|
|
45
|
+
}
|
|
46
|
+
return raw;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Auto-async heuristic. Heavy queries that would time out as sync go async
|
|
50
|
+
* automatically — the user shouldn't have to think about it.
|
|
51
|
+
*
|
|
52
|
+
* - level=ad with breakdowns
|
|
53
|
+
* - >2 breakdowns at any level
|
|
54
|
+
* - explicit time range > 90 days
|
|
55
|
+
* - level=ad over an account-level object with a wide window
|
|
56
|
+
*/
|
|
57
|
+
function shouldAutoAsync(body) {
|
|
58
|
+
const breakdownCount = (body.breakdowns ?? []).length;
|
|
59
|
+
if (body.level === "ad" && breakdownCount > 0 && body.object.startsWith("act_")) {
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
if (breakdownCount > 2) {
|
|
63
|
+
return true;
|
|
64
|
+
}
|
|
65
|
+
if (body.since && body.until) {
|
|
66
|
+
const days = (Date.parse(body.until) - Date.parse(body.since)) / 86_400_000;
|
|
67
|
+
if (days > 90) {
|
|
68
|
+
return true;
|
|
69
|
+
}
|
|
37
70
|
}
|
|
38
|
-
return
|
|
71
|
+
return false;
|
|
39
72
|
}
|
|
40
|
-
function applyDateRange(body, args
|
|
73
|
+
function applyDateRange(body, args) {
|
|
41
74
|
const range = getDateRange(args);
|
|
42
75
|
if (range.datePreset)
|
|
43
76
|
body.datePreset = range.datePreset;
|
|
@@ -46,29 +79,46 @@ function applyDateRange(body, args, preset) {
|
|
|
46
79
|
if (range.until)
|
|
47
80
|
body.until = range.until;
|
|
48
81
|
if (!body.datePreset && !(body.since && body.until)) {
|
|
49
|
-
body.datePreset =
|
|
82
|
+
body.datePreset = "last_7d";
|
|
50
83
|
}
|
|
51
84
|
}
|
|
52
|
-
function
|
|
53
|
-
const
|
|
85
|
+
function buildFiltering(args) {
|
|
86
|
+
const explicit = parseFiltering(args.filtering);
|
|
87
|
+
if (explicit)
|
|
88
|
+
return explicit;
|
|
89
|
+
if (args["include-undelivered"])
|
|
90
|
+
return undefined;
|
|
91
|
+
return DEFAULT_FILTERING;
|
|
92
|
+
}
|
|
93
|
+
function buildAttributionWindows(args) {
|
|
94
|
+
const explicit = commaSplit(args["attribution-windows"]);
|
|
95
|
+
if (explicit)
|
|
96
|
+
return explicit;
|
|
97
|
+
return DEFAULT_ATTRIBUTION_WINDOWS;
|
|
98
|
+
}
|
|
99
|
+
function buildBody(args) {
|
|
100
|
+
const intent = pickIntent(args.intent);
|
|
101
|
+
const level = pickLevel(args);
|
|
102
|
+
const intentDef = getIntent(intent);
|
|
103
|
+
const explicitFields = commaSplit(args.fields);
|
|
104
|
+
const fields = explicitFields ?? composeFields(intent, level);
|
|
54
105
|
const breakdowns = commaSplit(args.breakdowns);
|
|
55
|
-
const actionBreakdowns = commaSplit(args["action-breakdowns"]);
|
|
56
|
-
const attributionWindows = commaSplit(args["attribution-windows"]);
|
|
106
|
+
const actionBreakdowns = commaSplit(args["action-breakdowns"]) ?? intentDef?.actionBreakdowns;
|
|
57
107
|
const body = {
|
|
58
108
|
object: args.object,
|
|
59
|
-
level
|
|
60
|
-
fields
|
|
109
|
+
level,
|
|
110
|
+
fields,
|
|
61
111
|
timeIncrement: args["time-increment"],
|
|
62
|
-
breakdowns
|
|
63
|
-
actionBreakdowns
|
|
64
|
-
filtering:
|
|
65
|
-
attributionWindows:
|
|
112
|
+
breakdowns,
|
|
113
|
+
actionBreakdowns,
|
|
114
|
+
filtering: buildFiltering(args),
|
|
115
|
+
attributionWindows: buildAttributionWindows(args),
|
|
66
116
|
useAccountAttributionSetting: Boolean(args["use-account-attribution"]),
|
|
67
117
|
useUnifiedAttributionSetting: Boolean(args["use-unified-attribution"]),
|
|
68
|
-
limit: args.limit ? Number(args.limit) :
|
|
118
|
+
limit: args.limit ? Number(args.limit) : 1000,
|
|
69
119
|
skipCache: Boolean(args["skip-cache"]),
|
|
70
120
|
};
|
|
71
|
-
applyDateRange(body, args
|
|
121
|
+
applyDateRange(body, args);
|
|
72
122
|
return body;
|
|
73
123
|
}
|
|
74
124
|
async function pollAsync(reportRunId) {
|
|
@@ -85,90 +135,116 @@ async function pollAsync(reportRunId) {
|
|
|
85
135
|
}
|
|
86
136
|
handleMetaError(new Error("Async insights polling timed out after 10 minutes"));
|
|
87
137
|
}
|
|
138
|
+
async function runAsync(body) {
|
|
139
|
+
const submit = await apiPost("/api/ads/meta/insights/async", body);
|
|
140
|
+
process.stderr.write(`Async insights job: ${submit.reportRunId}\n`);
|
|
141
|
+
await pollAsync(submit.reportRunId);
|
|
142
|
+
return apiPost("/api/ads/meta/insights/async/result", {
|
|
143
|
+
reportRunId: submit.reportRunId,
|
|
144
|
+
fields: body.fields,
|
|
145
|
+
limit: body.limit,
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
/** Insights rows have nested `actions[]` arrays. Sort by the named action_type's value descending. */
|
|
149
|
+
function sortRowsBySpendDesc(rows) {
|
|
150
|
+
return [...rows].sort((a, b) => {
|
|
151
|
+
const sa = Number(a.spend ?? 0);
|
|
152
|
+
const sb = Number(b.spend ?? 0);
|
|
153
|
+
if (Number.isNaN(sa) || Number.isNaN(sb))
|
|
154
|
+
return 0;
|
|
155
|
+
return sb - sa;
|
|
156
|
+
});
|
|
157
|
+
}
|
|
88
158
|
export const insightsCommand = defineCommand({
|
|
89
159
|
meta: {
|
|
90
160
|
name: "insights",
|
|
91
|
-
description: `
|
|
161
|
+
description: `Performance reporting — the main Meta tool for AI agents.
|
|
92
162
|
|
|
93
|
-
|
|
94
|
-
|
|
163
|
+
Smart defaults so the AI doesn't have to remember every flag:
|
|
164
|
+
--level account (set --level campaign|adset|ad to drill in)
|
|
165
|
+
--intent baseline (or revenue|funnel|ranking|video|identity)
|
|
166
|
+
--date-preset last_7d (override with --since/--until)
|
|
167
|
+
--attribution-windows 7d_click,1d_view (the only ones still working post Jan 2026)
|
|
168
|
+
filter: impressions > 0 (skip undelivered rows; --include-undelivered to keep)
|
|
169
|
+
sort: spend descending (when result fits in memory)
|
|
170
|
+
auto-async when query is heavy (level=ad + breakdowns, big date ranges, etc.)
|
|
95
171
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
.map((p) => ` ${p.name} — ${p.description}`)
|
|
99
|
-
.join("\n")}
|
|
172
|
+
Identity fields (campaign_name, ad_name etc.) are appended automatically based on --level so rows
|
|
173
|
+
are self-describing.
|
|
100
174
|
|
|
101
|
-
Examples:
|
|
102
|
-
|
|
103
|
-
baker ads meta insights --object
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
175
|
+
Examples — common AI questions:
|
|
176
|
+
# "How is GreenLeaf doing this week?"
|
|
177
|
+
baker ads meta insights --object act_123
|
|
178
|
+
|
|
179
|
+
# "Which campaigns are profitable?"
|
|
180
|
+
baker ads meta insights --object act_123 --level campaign --intent revenue --date-preset last_28d
|
|
181
|
+
|
|
182
|
+
# "Which creatives need a refresh?"
|
|
183
|
+
baker ads meta insights --object act_123 --level ad --intent ranking --date-preset last_14d
|
|
184
|
+
|
|
185
|
+
# "Where do users drop off the funnel?"
|
|
186
|
+
baker ads meta insights --object act_123 --intent funnel
|
|
187
|
+
|
|
188
|
+
# "Should we shift budget to Instagram?"
|
|
189
|
+
baker ads meta insights --object act_123 --level adset --breakdowns publisher_platform,platform_position
|
|
190
|
+
|
|
191
|
+
# Custom field set (escape hatch)
|
|
192
|
+
baker ads meta insights --object act_123 --fields impressions,spend,actions
|
|
193
|
+
|
|
194
|
+
Async is automatic for heavy queries; pass --async to force it, or --no-async to refuse fallback.`,
|
|
107
195
|
},
|
|
108
196
|
args: {
|
|
109
197
|
object: {
|
|
110
198
|
type: "string",
|
|
111
|
-
description: "Object ID — act_<id> for account, or campaign/adset/ad ID",
|
|
199
|
+
description: "Object ID — act_<id> for account, or a campaign/adset/ad ID",
|
|
112
200
|
required: true,
|
|
113
201
|
},
|
|
114
|
-
level: { type: "string", description: "account|campaign|adset|ad" },
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
"list-
|
|
202
|
+
level: { type: "string", description: "account|campaign|adset|ad (default: account)" },
|
|
203
|
+
intent: { type: "string", description: "baseline|revenue|funnel|ranking|video|identity (default: baseline)" },
|
|
204
|
+
fields: { type: "string", description: "Comma-separated field list (overrides --intent bundle)" },
|
|
205
|
+
"list-intents": { type: "boolean", description: "Print available intents and exit" },
|
|
118
206
|
"date-preset": { type: "string", description: "Meta date preset (last_7d, last_28d, today, ...)" },
|
|
119
207
|
since: { type: "string", description: "Custom start date YYYY-MM-DD" },
|
|
120
208
|
until: { type: "string", description: "Custom end date YYYY-MM-DD" },
|
|
121
209
|
"time-increment": { type: "string", description: "1 (day) | monthly | all_days" },
|
|
122
|
-
breakdowns: { type: "string", description: "Comma-separated breakdowns" },
|
|
123
|
-
"action-breakdowns": {
|
|
124
|
-
|
|
210
|
+
breakdowns: { type: "string", description: "Comma-separated breakdowns (e.g. publisher_platform,age)" },
|
|
211
|
+
"action-breakdowns": {
|
|
212
|
+
type: "string",
|
|
213
|
+
description: "Slice the actions[] array (default: action_type for revenue/funnel)",
|
|
214
|
+
},
|
|
215
|
+
filtering: { type: "string", description: "Override default filter — JSON array of {field,operator,value}" },
|
|
216
|
+
"include-undelivered": { type: "boolean", description: "Keep rows where impressions=0 (off by default)" },
|
|
125
217
|
"attribution-windows": {
|
|
126
218
|
type: "string",
|
|
127
|
-
description: "
|
|
219
|
+
description: "Override default 7d_click,1d_view (only 1d_view, 1d_click, 7d_click, 28d_click work post Jan 2026)",
|
|
128
220
|
},
|
|
129
221
|
"use-account-attribution": { type: "boolean", description: "Use account-saved attribution setting" },
|
|
130
222
|
"use-unified-attribution": { type: "boolean", description: "Use ad-set unified attribution setting" },
|
|
131
|
-
limit: { type: "string", description: "Max rows (default
|
|
132
|
-
async: { type: "boolean", description: "
|
|
223
|
+
limit: { type: "string", description: "Max rows (default 1000)" },
|
|
224
|
+
async: { type: "boolean", description: "Force async submit-and-poll path" },
|
|
225
|
+
"no-async": { type: "boolean", description: "Refuse the auto-async fallback for heavy queries" },
|
|
226
|
+
"no-sort": { type: "boolean", description: "Skip default spend-desc sort" },
|
|
133
227
|
"skip-cache": { type: "boolean", description: "Bypass server-side cache" },
|
|
134
228
|
output: { type: "string", description: "Output format", default: "json" },
|
|
135
229
|
},
|
|
136
230
|
run: async ({ args }) => {
|
|
137
|
-
if (args["list-
|
|
138
|
-
writeAdsJson({ ok: true, data:
|
|
231
|
+
if (args["list-intents"]) {
|
|
232
|
+
writeAdsJson({ ok: true, data: listIntents() });
|
|
139
233
|
return;
|
|
140
234
|
}
|
|
141
|
-
const
|
|
142
|
-
const
|
|
143
|
-
|
|
144
|
-
handleMetaError(new Error(`Unknown preset: ${presetName}. Use --list-presets.`));
|
|
145
|
-
}
|
|
146
|
-
const body = buildBodyFromArgs(args, preset);
|
|
235
|
+
const body = buildBody(args);
|
|
236
|
+
const fmt = csvOrJson(args);
|
|
237
|
+
const wantAsync = Boolean(args.async) || (!args["no-async"] && shouldAutoAsync(body));
|
|
147
238
|
try {
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
const result = await apiPost("/api/ads/meta/insights/async/result", {
|
|
153
|
-
reportRunId: submit.reportRunId,
|
|
154
|
-
fields: body.fields,
|
|
155
|
-
limit: body.limit,
|
|
156
|
-
});
|
|
157
|
-
const fmt = csvOrJson(args);
|
|
158
|
-
if (fmt !== "json") {
|
|
159
|
-
writeAdsOutput(result, fmt, body.fields);
|
|
160
|
-
return;
|
|
161
|
-
}
|
|
162
|
-
writeAdsJson({ ok: true, data: result });
|
|
163
|
-
return;
|
|
164
|
-
}
|
|
165
|
-
const data = await apiPost("/api/ads/meta/insights", body);
|
|
166
|
-
const fmt = csvOrJson(args);
|
|
239
|
+
const rows = wantAsync
|
|
240
|
+
? await runAsync(body)
|
|
241
|
+
: await apiPost("/api/ads/meta/insights", body);
|
|
242
|
+
const sorted = args["no-sort"] ? rows : sortRowsBySpendDesc(rows);
|
|
167
243
|
if (fmt !== "json") {
|
|
168
|
-
writeAdsOutput(
|
|
244
|
+
writeAdsOutput(sorted, fmt, body.fields);
|
|
169
245
|
return;
|
|
170
246
|
}
|
|
171
|
-
writeAdsJson({ ok: true, data });
|
|
247
|
+
writeAdsJson({ ok: true, data: sorted });
|
|
172
248
|
}
|
|
173
249
|
catch (err) {
|
|
174
250
|
handleMetaError(err);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"insights.js","sourceRoot":"","sources":["../../../../src/commands/ads/meta/insights.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC5D,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"insights.js","sourceRoot":"","sources":["../../../../src/commands/ads/meta/insights.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,18 +1,30 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
2
|
+
* Insights field bundles. Picked for AI agent ergonomics: small, focused field
|
|
3
|
+
* lists that answer one specific question without forcing the AI to enumerate
|
|
4
|
+
* Meta's 500+ insights fields.
|
|
5
|
+
*
|
|
6
|
+
* Two-axis design:
|
|
7
|
+
* --intent (field bundle, default: baseline) — what data to ask for
|
|
8
|
+
* --level (object granularity, default: account) — at what granularity
|
|
9
|
+
*
|
|
10
|
+
* Intents are independent of level — pass `--intent ranking --level ad` to flag
|
|
11
|
+
* creatives, or `--intent revenue --level campaign` for ROAS by campaign.
|
|
12
|
+
*
|
|
13
|
+
* Identity fields (campaign_name etc.) are appended automatically based on
|
|
14
|
+
* level so the AI can read rows without joining.
|
|
4
15
|
*/
|
|
5
|
-
export
|
|
6
|
-
|
|
16
|
+
export type InsightsLevel = "account" | "campaign" | "adset" | "ad";
|
|
17
|
+
export type InsightsIntent = "baseline" | "revenue" | "funnel" | "ranking" | "video" | "identity";
|
|
18
|
+
interface IntentDefinition {
|
|
19
|
+
name: InsightsIntent;
|
|
7
20
|
description: string;
|
|
8
|
-
level: "account" | "campaign" | "adset" | "ad";
|
|
9
21
|
fields: string[];
|
|
10
|
-
breakdowns
|
|
22
|
+
/** Action breakdowns to slice the actions[] array — empty if not needed. */
|
|
11
23
|
actionBreakdowns?: string[];
|
|
12
|
-
attributionWindows?: string[];
|
|
13
|
-
defaultDatePreset: string;
|
|
14
|
-
defaultLimit: number;
|
|
15
24
|
}
|
|
16
|
-
|
|
17
|
-
export declare function
|
|
25
|
+
/** Compose final field list: intent metrics + level-specific identity fields, deduplicated. */
|
|
26
|
+
export declare function composeFields(intent: InsightsIntent, level: InsightsLevel): string[];
|
|
27
|
+
export declare function getIntent(name: string): IntentDefinition | undefined;
|
|
28
|
+
export declare function listIntents(): IntentDefinition[];
|
|
29
|
+
export {};
|
|
18
30
|
//# sourceMappingURL=presets.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"presets.d.ts","sourceRoot":"","sources":["../../../../src/commands/ads/meta/presets.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"presets.d.ts","sourceRoot":"","sources":["../../../../src/commands/ads/meta/presets.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,UAAU,GAAG,OAAO,GAAG,IAAI,CAAC;AAEpE,MAAM,MAAM,cAAc,GAAG,UAAU,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,GAAG,UAAU,CAAC;AAElG,UAAU,gBAAgB;IACxB,IAAI,EAAE,cAAc,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,4EAA4E;IAC5E,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC7B;AAsDD,+FAA+F;AAC/F,wBAAgB,aAAa,CAAC,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,aAAa,GAAG,MAAM,EAAE,CAYpF;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS,CAEpE;AAED,wBAAgB,WAAW,IAAI,gBAAgB,EAAE,CAEhD"}
|
|
@@ -1,92 +1,45 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
2
|
+
* Insights field bundles. Picked for AI agent ergonomics: small, focused field
|
|
3
|
+
* lists that answer one specific question without forcing the AI to enumerate
|
|
4
|
+
* Meta's 500+ insights fields.
|
|
5
|
+
*
|
|
6
|
+
* Two-axis design:
|
|
7
|
+
* --intent (field bundle, default: baseline) — what data to ask for
|
|
8
|
+
* --level (object granularity, default: account) — at what granularity
|
|
9
|
+
*
|
|
10
|
+
* Intents are independent of level — pass `--intent ranking --level ad` to flag
|
|
11
|
+
* creatives, or `--intent revenue --level campaign` for ROAS by campaign.
|
|
12
|
+
*
|
|
13
|
+
* Identity fields (campaign_name etc.) are appended automatically based on
|
|
14
|
+
* level so the AI can read rows without joining.
|
|
4
15
|
*/
|
|
5
|
-
const
|
|
6
|
-
|
|
7
|
-
name: "
|
|
8
|
-
description: "
|
|
9
|
-
|
|
10
|
-
fields: [
|
|
11
|
-
"campaign_id",
|
|
12
|
-
"campaign_name",
|
|
13
|
-
"objective",
|
|
14
|
-
"impressions",
|
|
15
|
-
"spend",
|
|
16
|
-
"clicks",
|
|
17
|
-
"ctr",
|
|
18
|
-
"cpc",
|
|
19
|
-
"actions",
|
|
20
|
-
"action_values",
|
|
21
|
-
"purchase_roas",
|
|
22
|
-
],
|
|
23
|
-
actionBreakdowns: ["action_type"],
|
|
24
|
-
defaultDatePreset: "last_7d",
|
|
25
|
-
defaultLimit: 1000,
|
|
16
|
+
const INSIGHTS_INTENTS = {
|
|
17
|
+
baseline: {
|
|
18
|
+
name: "baseline",
|
|
19
|
+
description: "Spend, impressions, clicks, CTR, CPC, CPM. The default question: 'how is delivery?'",
|
|
20
|
+
fields: ["impressions", "reach", "frequency", "spend", "clicks", "ctr", "cpc", "cpm"],
|
|
26
21
|
},
|
|
27
|
-
|
|
28
|
-
name: "
|
|
29
|
-
description: "
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
"ad_id",
|
|
33
|
-
"ad_name",
|
|
34
|
-
"campaign_name",
|
|
35
|
-
"adset_name",
|
|
36
|
-
"impressions",
|
|
37
|
-
"spend",
|
|
38
|
-
"ctr",
|
|
39
|
-
"cpc",
|
|
40
|
-
"quality_ranking",
|
|
41
|
-
"engagement_rate_ranking",
|
|
42
|
-
"conversion_rate_ranking",
|
|
43
|
-
],
|
|
44
|
-
defaultDatePreset: "last_7d",
|
|
45
|
-
defaultLimit: 2000,
|
|
46
|
-
},
|
|
47
|
-
"placement-breakdown": {
|
|
48
|
-
name: "placement-breakdown",
|
|
49
|
-
description: "Spend & CPM by Facebook/Instagram placement and device.",
|
|
50
|
-
level: "adset",
|
|
51
|
-
fields: ["adset_id", "adset_name", "impressions", "spend", "ctr", "cpm", "actions"],
|
|
52
|
-
breakdowns: ["publisher_platform", "platform_position", "impression_device"],
|
|
53
|
-
defaultDatePreset: "last_14d",
|
|
54
|
-
defaultLimit: 5000,
|
|
55
|
-
},
|
|
56
|
-
"device-breakdown": {
|
|
57
|
-
name: "device-breakdown",
|
|
58
|
-
description: "Conversion performance by device + OS.",
|
|
59
|
-
level: "ad",
|
|
60
|
-
fields: ["ad_id", "ad_name", "impressions", "clicks", "spend", "actions", "purchase_roas"],
|
|
61
|
-
breakdowns: ["device_platform", "impression_device"],
|
|
62
|
-
defaultDatePreset: "last_7d",
|
|
63
|
-
defaultLimit: 5000,
|
|
64
|
-
},
|
|
65
|
-
"audience-breakdown": {
|
|
66
|
-
name: "audience-breakdown",
|
|
67
|
-
description: "Demographic split (age/gender/country) at adset level.",
|
|
68
|
-
level: "adset",
|
|
69
|
-
fields: ["adset_id", "adset_name", "impressions", "spend", "actions"],
|
|
70
|
-
breakdowns: ["age", "gender", "country"],
|
|
71
|
-
defaultDatePreset: "last_28d",
|
|
72
|
-
defaultLimit: 10000,
|
|
22
|
+
revenue: {
|
|
23
|
+
name: "revenue",
|
|
24
|
+
description: "Spend, conversions, action_values, purchase_roas. 'How much money are we making?'",
|
|
25
|
+
fields: ["spend", "actions", "action_values", "conversions", "conversion_values", "purchase_roas"],
|
|
26
|
+
actionBreakdowns: ["action_type"],
|
|
73
27
|
},
|
|
74
28
|
funnel: {
|
|
75
29
|
name: "funnel",
|
|
76
|
-
description: "Impression → click → landing page
|
|
77
|
-
|
|
78
|
-
fields: ["ad_id", "ad_name", "impressions", "clicks", "inline_link_clicks", "actions", "action_values", "spend"],
|
|
30
|
+
description: "Impression → click → landing page → action. 'Where do users drop off?'",
|
|
31
|
+
fields: ["impressions", "clicks", "inline_link_clicks", "outbound_clicks", "actions", "spend"],
|
|
79
32
|
actionBreakdowns: ["action_type"],
|
|
80
|
-
defaultDatePreset: "last_7d",
|
|
81
|
-
defaultLimit: 2000,
|
|
82
33
|
},
|
|
83
|
-
|
|
84
|
-
name: "
|
|
85
|
-
description: "
|
|
86
|
-
|
|
34
|
+
ranking: {
|
|
35
|
+
name: "ranking",
|
|
36
|
+
description: "Quality, engagement, conversion-rate rankings. 'Which creatives need a refresh?'",
|
|
37
|
+
fields: ["impressions", "spend", "ctr", "quality_ranking", "engagement_rate_ranking", "conversion_rate_ranking"],
|
|
38
|
+
},
|
|
39
|
+
video: {
|
|
40
|
+
name: "video",
|
|
41
|
+
description: "Watch funnel, thruplay cost. 'How are video creatives holding attention?'",
|
|
87
42
|
fields: [
|
|
88
|
-
"ad_id",
|
|
89
|
-
"ad_name",
|
|
90
43
|
"impressions",
|
|
91
44
|
"spend",
|
|
92
45
|
"video_play_actions",
|
|
@@ -97,14 +50,37 @@ const META_INSIGHTS_PRESETS = {
|
|
|
97
50
|
"video_thruplay_watched_actions",
|
|
98
51
|
"cost_per_thruplay",
|
|
99
52
|
],
|
|
100
|
-
|
|
101
|
-
|
|
53
|
+
},
|
|
54
|
+
identity: {
|
|
55
|
+
name: "identity",
|
|
56
|
+
description: "Just the names + spend — for cheap roll-up summaries.",
|
|
57
|
+
fields: ["spend", "impressions"],
|
|
102
58
|
},
|
|
103
59
|
};
|
|
104
|
-
|
|
105
|
-
|
|
60
|
+
const IDENTITY_FIELDS_BY_LEVEL = {
|
|
61
|
+
account: ["account_id", "account_name", "account_currency"],
|
|
62
|
+
campaign: ["campaign_id", "campaign_name", "objective"],
|
|
63
|
+
adset: ["adset_id", "adset_name", "campaign_id", "campaign_name"],
|
|
64
|
+
ad: ["ad_id", "ad_name", "adset_id", "adset_name", "campaign_id", "campaign_name"],
|
|
65
|
+
};
|
|
66
|
+
/** Compose final field list: intent metrics + level-specific identity fields, deduplicated. */
|
|
67
|
+
export function composeFields(intent, level) {
|
|
68
|
+
const intentFields = INSIGHTS_INTENTS[intent].fields;
|
|
69
|
+
const identity = IDENTITY_FIELDS_BY_LEVEL[level];
|
|
70
|
+
const seen = new Set();
|
|
71
|
+
const out = [];
|
|
72
|
+
for (const f of [...identity, ...intentFields]) {
|
|
73
|
+
if (!seen.has(f)) {
|
|
74
|
+
seen.add(f);
|
|
75
|
+
out.push(f);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return out;
|
|
79
|
+
}
|
|
80
|
+
export function getIntent(name) {
|
|
81
|
+
return INSIGHTS_INTENTS[name];
|
|
106
82
|
}
|
|
107
|
-
export function
|
|
108
|
-
return Object.values(
|
|
83
|
+
export function listIntents() {
|
|
84
|
+
return Object.values(INSIGHTS_INTENTS);
|
|
109
85
|
}
|
|
110
86
|
//# sourceMappingURL=presets.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"presets.js","sourceRoot":"","sources":["../../../../src/commands/ads/meta/presets.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"presets.js","sourceRoot":"","sources":["../../../../src/commands/ads/meta/presets.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAcH,MAAM,gBAAgB,GAA6C;IACjE,QAAQ,EAAE;QACR,IAAI,EAAE,UAAU;QAChB,WAAW,EAAE,qFAAqF;QAClG,MAAM,EAAE,CAAC,aAAa,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;KACtF;IACD,OAAO,EAAE;QACP,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,mFAAmF;QAChG,MAAM,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,aAAa,EAAE,mBAAmB,EAAE,eAAe,CAAC;QAClG,gBAAgB,EAAE,CAAC,aAAa,CAAC;KAClC;IACD,MAAM,EAAE;QACN,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,wEAAwE;QACrF,MAAM,EAAE,CAAC,aAAa,EAAE,QAAQ,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,SAAS,EAAE,OAAO,CAAC;QAC9F,gBAAgB,EAAE,CAAC,aAAa,CAAC;KAClC;IACD,OAAO,EAAE;QACP,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,kFAAkF;QAC/F,MAAM,EAAE,CAAC,aAAa,EAAE,OAAO,EAAE,KAAK,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,yBAAyB,CAAC;KACjH;IACD,KAAK,EAAE;QACL,IAAI,EAAE,OAAO;QACb,WAAW,EAAE,2EAA2E;QACxF,MAAM,EAAE;YACN,aAAa;YACb,OAAO;YACP,oBAAoB;YACpB,2BAA2B;YAC3B,2BAA2B;YAC3B,2BAA2B;YAC3B,4BAA4B;YAC5B,gCAAgC;YAChC,mBAAmB;SACpB;KACF;IACD,QAAQ,EAAE;QACR,IAAI,EAAE,UAAU;QAChB,WAAW,EAAE,uDAAuD;QACpE,MAAM,EAAE,CAAC,OAAO,EAAE,aAAa,CAAC;KACjC;CACF,CAAC;AAEF,MAAM,wBAAwB,GAAoC;IAChE,OAAO,EAAE,CAAC,YAAY,EAAE,cAAc,EAAE,kBAAkB,CAAC;IAC3D,QAAQ,EAAE,CAAC,aAAa,EAAE,eAAe,EAAE,WAAW,CAAC;IACvD,KAAK,EAAE,CAAC,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,eAAe,CAAC;IACjE,EAAE,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,eAAe,CAAC;CACnF,CAAC;AAEF,+FAA+F;AAC/F,MAAM,UAAU,aAAa,CAAC,MAAsB,EAAE,KAAoB;IACxE,MAAM,YAAY,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC;IACrD,MAAM,QAAQ,GAAG,wBAAwB,CAAC,KAAK,CAAC,CAAC;IACjD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,KAAK,MAAM,CAAC,IAAI,CAAC,GAAG,QAAQ,EAAE,GAAG,YAAY,CAAC,EAAE,CAAC;QAC/C,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YACjB,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACZ,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACd,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,OAAO,gBAAgB,CAAC,IAAsB,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,OAAO,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;AACzC,CAAC"}
|
|
@@ -9,4 +9,10 @@ export declare function getDateRange(args: Record<string, unknown>): {
|
|
|
9
9
|
export declare function todayIso(): string;
|
|
10
10
|
export declare function daysAgoIso(days: number): string;
|
|
11
11
|
export declare function csvOrJson(args: Record<string, unknown>): string;
|
|
12
|
+
/**
|
|
13
|
+
* Default to ACTIVE-only on listings — that's almost always what an AI agent or
|
|
14
|
+
* a human glance wants. Pass `--effective-status ACTIVE,PAUSED` to override, or
|
|
15
|
+
* `--all-statuses` to drop the filter entirely.
|
|
16
|
+
*/
|
|
17
|
+
export declare function resolveEffectiveStatus(args: Record<string, unknown>): string | undefined;
|
|
12
18
|
//# sourceMappingURL=shared.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../../../src/commands/ads/meta/shared.ts"],"names":[],"mappings":"AAQA,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,GAAG,KAAK,CAmBnD;AAED,qGAAqG;AACrG,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAczE;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAMnH;AAED,wBAAgB,QAAQ,IAAI,MAAM,CAEjC;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAE/D"}
|
|
1
|
+
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../../../src/commands/ads/meta/shared.ts"],"names":[],"mappings":"AAQA,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,GAAG,KAAK,CAmBnD;AAED,qGAAqG;AACrG,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAczE;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAMnH;AAED,wBAAgB,QAAQ,IAAI,MAAM,CAEjC;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAE/D;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,GAAG,SAAS,CASxF"}
|