@maestrogtm/maestro-gtm 0.10.16
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/dist/ai-RNHSWSNV.js +158 -0
- package/dist/ai-RNHSWSNV.js.map +1 -0
- package/dist/app-PSZH2J56.js +54 -0
- package/dist/app-PSZH2J56.js.map +1 -0
- package/dist/batch-ZCHN54YJ.js +28 -0
- package/dist/batch-ZCHN54YJ.js.map +1 -0
- package/dist/campaign-XDXQA7KX.js +119 -0
- package/dist/campaign-XDXQA7KX.js.map +1 -0
- package/dist/chunk-365Q36GF.js +54 -0
- package/dist/chunk-365Q36GF.js.map +1 -0
- package/dist/chunk-4IV6QS4U.js +122 -0
- package/dist/chunk-4IV6QS4U.js.map +1 -0
- package/dist/chunk-6GLLK5KO.js +64 -0
- package/dist/chunk-6GLLK5KO.js.map +1 -0
- package/dist/chunk-6UNBW5SN.js +686 -0
- package/dist/chunk-6UNBW5SN.js.map +1 -0
- package/dist/chunk-A7JD6EYV.js +92 -0
- package/dist/chunk-A7JD6EYV.js.map +1 -0
- package/dist/chunk-ARNVJPFM.js +139 -0
- package/dist/chunk-ARNVJPFM.js.map +1 -0
- package/dist/chunk-AX6BOEF2.js +345 -0
- package/dist/chunk-AX6BOEF2.js.map +1 -0
- package/dist/chunk-C3T7QPSO.js +507 -0
- package/dist/chunk-C3T7QPSO.js.map +1 -0
- package/dist/chunk-FG43GILY.js +46 -0
- package/dist/chunk-FG43GILY.js.map +1 -0
- package/dist/chunk-FS6DCNCA.js +139 -0
- package/dist/chunk-FS6DCNCA.js.map +1 -0
- package/dist/chunk-I6GRD4X7.js +1144 -0
- package/dist/chunk-I6GRD4X7.js.map +1 -0
- package/dist/chunk-IP34URKR.js +621 -0
- package/dist/chunk-IP34URKR.js.map +1 -0
- package/dist/chunk-JFSKOY7Z.js +252 -0
- package/dist/chunk-JFSKOY7Z.js.map +1 -0
- package/dist/chunk-M25KLO7T.js +3272 -0
- package/dist/chunk-M25KLO7T.js.map +1 -0
- package/dist/chunk-M3G2WREL.js +57 -0
- package/dist/chunk-M3G2WREL.js.map +1 -0
- package/dist/chunk-MFFACSBE.js +4266 -0
- package/dist/chunk-MFFACSBE.js.map +1 -0
- package/dist/chunk-PZ5AY32C.js +10 -0
- package/dist/chunk-PZ5AY32C.js.map +1 -0
- package/dist/chunk-QZH3XFOQ.js +2636 -0
- package/dist/chunk-QZH3XFOQ.js.map +1 -0
- package/dist/chunk-SPWDMOEU.js +1940 -0
- package/dist/chunk-SPWDMOEU.js.map +1 -0
- package/dist/chunk-TP3BZDVV.js +28 -0
- package/dist/chunk-TP3BZDVV.js.map +1 -0
- package/dist/chunk-UBJUBYSQ.js +18 -0
- package/dist/chunk-UBJUBYSQ.js.map +1 -0
- package/dist/chunk-VNKXGHWY.js +20 -0
- package/dist/chunk-VNKXGHWY.js.map +1 -0
- package/dist/chunk-WKLCPIFB.js +9862 -0
- package/dist/chunk-WKLCPIFB.js.map +1 -0
- package/dist/chunk-YV5XOXRQ.js +7 -0
- package/dist/chunk-YV5XOXRQ.js.map +1 -0
- package/dist/cli-Z3BNNJYQ.js +852 -0
- package/dist/cli-Z3BNNJYQ.js.map +1 -0
- package/dist/client-Y34LNEWN.js +8 -0
- package/dist/client-Y34LNEWN.js.map +1 -0
- package/dist/config.js +17 -0
- package/dist/config.js.map +1 -0
- package/dist/configure-XSENK4X5.js +64 -0
- package/dist/configure-XSENK4X5.js.map +1 -0
- package/dist/context.js +10 -0
- package/dist/context.js.map +1 -0
- package/dist/crm-QBNHVBYV.js +86 -0
- package/dist/crm-QBNHVBYV.js.map +1 -0
- package/dist/dfy-X3OXIYRA.js +356 -0
- package/dist/dfy-X3OXIYRA.js.map +1 -0
- package/dist/dist-LGCJKGBS.js +121 -0
- package/dist/dist-LGCJKGBS.js.map +1 -0
- package/dist/engagement-C4U7LPJH.js +463 -0
- package/dist/engagement-C4U7LPJH.js.map +1 -0
- package/dist/enrich-F5GPVZFE.js +226 -0
- package/dist/enrich-F5GPVZFE.js.map +1 -0
- package/dist/extract-DS5N6SSJ.js +155 -0
- package/dist/extract-DS5N6SSJ.js.map +1 -0
- package/dist/feedback-AIXKXNM5.js +51 -0
- package/dist/feedback-AIXKXNM5.js.map +1 -0
- package/dist/fetch-QJDSPI63.js +87 -0
- package/dist/fetch-QJDSPI63.js.map +1 -0
- package/dist/handlers.js +13 -0
- package/dist/handlers.js.map +1 -0
- package/dist/index.js +38 -0
- package/dist/index.js.map +1 -0
- package/dist/list-HL7NQQJX.js +236 -0
- package/dist/list-HL7NQQJX.js.map +1 -0
- package/dist/maestro-N7Q2JX22.js +903 -0
- package/dist/maestro-N7Q2JX22.js.map +1 -0
- package/dist/prospect-RUOT43H6.js +532 -0
- package/dist/prospect-RUOT43H6.js.map +1 -0
- package/dist/providers/factory.js +10 -0
- package/dist/providers/factory.js.map +1 -0
- package/dist/providers/registry.js +8 -0
- package/dist/providers/registry.js.map +1 -0
- package/dist/provision-FT5NWN77.js +394 -0
- package/dist/provision-FT5NWN77.js.map +1 -0
- package/dist/recipe-JU3SXMZF.js +137 -0
- package/dist/recipe-JU3SXMZF.js.map +1 -0
- package/dist/review-5SB6DYDZ.js +70 -0
- package/dist/review-5SB6DYDZ.js.map +1 -0
- package/dist/sdk-LVBHNQ6T.js +3852 -0
- package/dist/sdk-LVBHNQ6T.js.map +1 -0
- package/dist/server-REKYQZ2E.js +22 -0
- package/dist/server-REKYQZ2E.js.map +1 -0
- package/dist/status-V3EEFS7S.js +114 -0
- package/dist/status-V3EEFS7S.js.map +1 -0
- package/dist/tam-J6NDBP5W.js +682 -0
- package/dist/tam-J6NDBP5W.js.map +1 -0
- package/dist/tools.js +80 -0
- package/dist/tools.js.map +1 -0
- package/dist/validation.js +12 -0
- package/dist/validation.js.map +1 -0
- package/package.json +77 -0
|
@@ -0,0 +1,356 @@
|
|
|
1
|
+
import {
|
|
2
|
+
resolveTenantId
|
|
3
|
+
} from "./chunk-VNKXGHWY.js";
|
|
4
|
+
import {
|
|
5
|
+
deriveOverallStage,
|
|
6
|
+
deriveSmartState,
|
|
7
|
+
findActivityLog,
|
|
8
|
+
findAutomationRuns,
|
|
9
|
+
findDeliverablesByEngagement,
|
|
10
|
+
findEngagement,
|
|
11
|
+
listEngagements
|
|
12
|
+
} from "./chunk-MFFACSBE.js";
|
|
13
|
+
import {
|
|
14
|
+
getSupabase
|
|
15
|
+
} from "./chunk-FG43GILY.js";
|
|
16
|
+
import "./chunk-SPWDMOEU.js";
|
|
17
|
+
import {
|
|
18
|
+
createGtmError
|
|
19
|
+
} from "./chunk-UBJUBYSQ.js";
|
|
20
|
+
import "./chunk-WKLCPIFB.js";
|
|
21
|
+
import {
|
|
22
|
+
logError
|
|
23
|
+
} from "./chunk-6GLLK5KO.js";
|
|
24
|
+
import "./chunk-PZ5AY32C.js";
|
|
25
|
+
|
|
26
|
+
// src/handlers/dfy.ts
|
|
27
|
+
var CONTENT_POST_SELECT = "id, title, status, content_type, pillar, created_at, updated_at";
|
|
28
|
+
async function resolveEngagement(supabase, tenantId, args) {
|
|
29
|
+
const engagementId = args.engagement_id;
|
|
30
|
+
const name = args.name;
|
|
31
|
+
if (engagementId) {
|
|
32
|
+
const engagement = await findEngagement(supabase, engagementId);
|
|
33
|
+
if (!engagement) throw createGtmError("QUERY_INVALID", `Engagement not found: ${engagementId}`);
|
|
34
|
+
if (engagement.tenant_id !== tenantId) {
|
|
35
|
+
throw createGtmError("QUERY_INVALID", "Engagement does not belong to this tenant");
|
|
36
|
+
}
|
|
37
|
+
return engagement;
|
|
38
|
+
}
|
|
39
|
+
if (name) {
|
|
40
|
+
const all = await listEngagements(supabase, tenantId);
|
|
41
|
+
const lower = name.toLowerCase();
|
|
42
|
+
const match = all.find(
|
|
43
|
+
(e) => e.client_name.toLowerCase().includes(lower) || e.client_company && e.client_company.toLowerCase().includes(lower)
|
|
44
|
+
);
|
|
45
|
+
if (!match)
|
|
46
|
+
throw createGtmError("QUERY_INVALID", `No engagement found matching name: "${name}"`);
|
|
47
|
+
return match;
|
|
48
|
+
}
|
|
49
|
+
throw createGtmError("QUERY_INVALID", "engagement_id or name is required");
|
|
50
|
+
}
|
|
51
|
+
async function handleDfy(args, ctx) {
|
|
52
|
+
const action = args.action;
|
|
53
|
+
const supabase = getSupabase();
|
|
54
|
+
const tenantId = resolveTenantId(args, ctx);
|
|
55
|
+
switch (action) {
|
|
56
|
+
// ─── List ──────────────────────────────────────
|
|
57
|
+
case "list": {
|
|
58
|
+
const filters = {};
|
|
59
|
+
if (args.status_filter) filters.status = args.status_filter;
|
|
60
|
+
if (args.engagement_type) filters.engagement_type = args.engagement_type;
|
|
61
|
+
let engagements = await listEngagements(supabase, tenantId, filters);
|
|
62
|
+
const name = args.name;
|
|
63
|
+
if (name) {
|
|
64
|
+
const lower = name.toLowerCase();
|
|
65
|
+
engagements = engagements.filter(
|
|
66
|
+
(e) => e.client_name.toLowerCase().includes(lower) || e.client_company && e.client_company.toLowerCase().includes(lower)
|
|
67
|
+
);
|
|
68
|
+
}
|
|
69
|
+
const summaries = await Promise.all(
|
|
70
|
+
engagements.map(async (e) => {
|
|
71
|
+
const deliverables = await findDeliverablesByEngagement(supabase, e.id);
|
|
72
|
+
const overallStage = deriveOverallStage(e);
|
|
73
|
+
const completed = deliverables.filter(
|
|
74
|
+
(d) => ["completed", "approved", "delivered"].includes(d.status)
|
|
75
|
+
).length;
|
|
76
|
+
return {
|
|
77
|
+
id: e.id,
|
|
78
|
+
client_name: e.client_name,
|
|
79
|
+
client_company: e.client_company,
|
|
80
|
+
status: e.status,
|
|
81
|
+
engagement_type: e.engagement_type,
|
|
82
|
+
intake_status: e.intake_status,
|
|
83
|
+
content_stage: e.content_stage,
|
|
84
|
+
outbound_stage: e.outbound_stage,
|
|
85
|
+
overall_stage: overallStage,
|
|
86
|
+
deliverables_completed: completed,
|
|
87
|
+
deliverables_total: deliverables.length,
|
|
88
|
+
created_at: e.created_at
|
|
89
|
+
};
|
|
90
|
+
})
|
|
91
|
+
);
|
|
92
|
+
return { action: "list", count: summaries.length, engagements: summaries };
|
|
93
|
+
}
|
|
94
|
+
// ─── Status ────────────────────────────────────
|
|
95
|
+
case "status": {
|
|
96
|
+
const engagement = await resolveEngagement(supabase, tenantId, args);
|
|
97
|
+
const deliverables = await findDeliverablesByEngagement(supabase, engagement.id);
|
|
98
|
+
const activity = await findActivityLog(supabase, engagement.id, { limit: 10 });
|
|
99
|
+
const overallStage = deriveOverallStage(engagement);
|
|
100
|
+
const deliverableSummaries = deliverables.map((d) => ({
|
|
101
|
+
id: d.id,
|
|
102
|
+
name: d.name,
|
|
103
|
+
category: d.category,
|
|
104
|
+
status: d.status,
|
|
105
|
+
automation_type: d.automation_type,
|
|
106
|
+
automation_status: d.automation_status,
|
|
107
|
+
track: d.track,
|
|
108
|
+
smart_state: deriveSmartState(d, deliverables),
|
|
109
|
+
due_date: d.due_date,
|
|
110
|
+
revision_count: d.revision_count
|
|
111
|
+
}));
|
|
112
|
+
return {
|
|
113
|
+
action: "status",
|
|
114
|
+
engagement: {
|
|
115
|
+
id: engagement.id,
|
|
116
|
+
client_name: engagement.client_name,
|
|
117
|
+
client_company: engagement.client_company,
|
|
118
|
+
status: engagement.status,
|
|
119
|
+
engagement_type: engagement.engagement_type,
|
|
120
|
+
intake_status: engagement.intake_status,
|
|
121
|
+
content_stage: engagement.content_stage,
|
|
122
|
+
outbound_stage: engagement.outbound_stage,
|
|
123
|
+
overall_stage: overallStage,
|
|
124
|
+
has_processed_intake: !!engagement.processed_intake,
|
|
125
|
+
has_magnetlab_user: !!engagement.magnetlab_user_id,
|
|
126
|
+
has_linkedin: !!engagement.linkedin_url,
|
|
127
|
+
has_slack_channel: !!engagement.slack_channel_id,
|
|
128
|
+
created_at: engagement.created_at,
|
|
129
|
+
updated_at: engagement.updated_at
|
|
130
|
+
},
|
|
131
|
+
deliverables: deliverableSummaries,
|
|
132
|
+
recent_activity: activity.map((a) => ({
|
|
133
|
+
action: a.action,
|
|
134
|
+
description: a.description,
|
|
135
|
+
actor: a.actor,
|
|
136
|
+
created_at: a.created_at
|
|
137
|
+
}))
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
// ─── Content ───────────────────────────────────
|
|
141
|
+
case "content": {
|
|
142
|
+
const engagement = await resolveEngagement(supabase, tenantId, args);
|
|
143
|
+
if (!engagement.magnetlab_user_id) {
|
|
144
|
+
return {
|
|
145
|
+
action: "content",
|
|
146
|
+
engagement_id: engagement.id,
|
|
147
|
+
client_name: engagement.client_name,
|
|
148
|
+
error: "No magnetlab_user_id set \u2014 content pipeline has not been connected.",
|
|
149
|
+
content_items: [],
|
|
150
|
+
count: 0
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
const { data: posts, error } = await supabase.from("cp_pipeline_posts").select(CONTENT_POST_SELECT).eq("user_id", engagement.magnetlab_user_id).order("created_at", { ascending: false }).limit(50);
|
|
154
|
+
if (error) {
|
|
155
|
+
logError("dfy.handler.content", error, {
|
|
156
|
+
engagementId: engagement.id,
|
|
157
|
+
magnetlabUserId: engagement.magnetlab_user_id
|
|
158
|
+
});
|
|
159
|
+
return {
|
|
160
|
+
action: "content",
|
|
161
|
+
engagement_id: engagement.id,
|
|
162
|
+
client_name: engagement.client_name,
|
|
163
|
+
error: "Failed to query content items",
|
|
164
|
+
content_items: [],
|
|
165
|
+
count: 0
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
const items = posts ?? [];
|
|
169
|
+
const byStatus = {};
|
|
170
|
+
for (const p of items) {
|
|
171
|
+
const s = p.status;
|
|
172
|
+
byStatus[s] = (byStatus[s] ?? 0) + 1;
|
|
173
|
+
}
|
|
174
|
+
return {
|
|
175
|
+
action: "content",
|
|
176
|
+
engagement_id: engagement.id,
|
|
177
|
+
client_name: engagement.client_name,
|
|
178
|
+
count: items.length,
|
|
179
|
+
by_status: byStatus,
|
|
180
|
+
content_items: items
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
// ─── Pipeline ──────────────────────────────────
|
|
184
|
+
case "pipeline": {
|
|
185
|
+
const engagements = await listEngagements(supabase, tenantId);
|
|
186
|
+
const active = engagements.filter(
|
|
187
|
+
(e) => !["completed", "cancelled", "churned"].includes(e.status)
|
|
188
|
+
);
|
|
189
|
+
const pipeline = {};
|
|
190
|
+
for (const e of active) {
|
|
191
|
+
const overallStage = deriveOverallStage(e);
|
|
192
|
+
if (!pipeline[overallStage]) pipeline[overallStage] = [];
|
|
193
|
+
pipeline[overallStage].push({
|
|
194
|
+
id: e.id,
|
|
195
|
+
client_name: e.client_name,
|
|
196
|
+
client_company: e.client_company,
|
|
197
|
+
status: e.status,
|
|
198
|
+
intake_status: e.intake_status,
|
|
199
|
+
content_stage: e.content_stage,
|
|
200
|
+
outbound_stage: e.outbound_stage
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
return {
|
|
204
|
+
action: "pipeline",
|
|
205
|
+
total_active: active.length,
|
|
206
|
+
stages: pipeline
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
// ─── Diagnose ──────────────────────────────────
|
|
210
|
+
case "diagnose": {
|
|
211
|
+
const engagement = await resolveEngagement(supabase, tenantId, args);
|
|
212
|
+
const deliverables = await findDeliverablesByEngagement(supabase, engagement.id);
|
|
213
|
+
const activity = await findActivityLog(supabase, engagement.id, { limit: 5 });
|
|
214
|
+
const automationRuns = await findAutomationRuns(supabase, engagement.id, { limit: 20 });
|
|
215
|
+
const overallStage = deriveOverallStage(engagement);
|
|
216
|
+
const issues = [];
|
|
217
|
+
if (engagement.intake_status !== "ready") {
|
|
218
|
+
issues.push(`Intake not ready (status: ${engagement.intake_status})`);
|
|
219
|
+
}
|
|
220
|
+
if (!engagement.processed_intake) {
|
|
221
|
+
issues.push("No processed intake \u2014 content generation cannot run");
|
|
222
|
+
}
|
|
223
|
+
if (!engagement.magnetlab_user_id) {
|
|
224
|
+
issues.push("No magnetlab_user_id \u2014 content pipeline not connected");
|
|
225
|
+
}
|
|
226
|
+
if (!engagement.linkedin_url) {
|
|
227
|
+
issues.push("No LinkedIn URL set");
|
|
228
|
+
}
|
|
229
|
+
const failedRuns = automationRuns.filter((r) => r.status === "failed");
|
|
230
|
+
if (failedRuns.length > 0) {
|
|
231
|
+
for (const r of failedRuns.slice(0, 5)) {
|
|
232
|
+
const errorDetail = r.output_data?.error ?? r.output?.error ?? "unknown error";
|
|
233
|
+
issues.push(`Failed automation: ${r.automation_type} (${r.created_at}) \u2014 ${errorDetail}`);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
const twoHoursAgo = new Date(Date.now() - 2 * 60 * 60 * 1e3).toISOString();
|
|
237
|
+
const stuckDeliverables = deliverables.filter(
|
|
238
|
+
(d) => d.automation_status === "running" && d.updated_at < twoHoursAgo
|
|
239
|
+
);
|
|
240
|
+
if (stuckDeliverables.length > 0) {
|
|
241
|
+
for (const d of stuckDeliverables) {
|
|
242
|
+
issues.push(`Stuck deliverable: "${d.name}" running since ${d.updated_at}`);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
const blocked = deliverables.filter((d) => {
|
|
246
|
+
if (d.status !== "pending" || !d.depends_on?.length) return false;
|
|
247
|
+
const completedIds = new Set(
|
|
248
|
+
deliverables.filter((dd) => ["completed", "approved", "delivered"].includes(dd.status)).map((dd) => dd.id)
|
|
249
|
+
);
|
|
250
|
+
return !d.depends_on.every((depId) => completedIds.has(depId));
|
|
251
|
+
});
|
|
252
|
+
if (blocked.length > 0) {
|
|
253
|
+
for (const d of blocked) {
|
|
254
|
+
issues.push(`Blocked: "${d.name}" waiting on dependencies`);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
return {
|
|
258
|
+
action: "diagnose",
|
|
259
|
+
engagement_id: engagement.id,
|
|
260
|
+
client_name: engagement.client_name,
|
|
261
|
+
status: engagement.status,
|
|
262
|
+
intake_status: engagement.intake_status,
|
|
263
|
+
content_stage: engagement.content_stage,
|
|
264
|
+
outbound_stage: engagement.outbound_stage,
|
|
265
|
+
overall_stage: overallStage,
|
|
266
|
+
issues: issues.length > 0 ? issues : ["No issues detected \u2014 engagement appears healthy"],
|
|
267
|
+
deliverable_summary: deliverables.map((d) => ({
|
|
268
|
+
name: d.name,
|
|
269
|
+
status: d.status,
|
|
270
|
+
automation_status: d.automation_status,
|
|
271
|
+
smart_state: deriveSmartState(d, deliverables)
|
|
272
|
+
})),
|
|
273
|
+
recent_activity: activity.map((a) => ({
|
|
274
|
+
action: a.action,
|
|
275
|
+
description: a.description,
|
|
276
|
+
created_at: a.created_at
|
|
277
|
+
})),
|
|
278
|
+
failed_automation_runs: failedRuns.slice(0, 5).map((r) => ({
|
|
279
|
+
automation_type: r.automation_type,
|
|
280
|
+
status: r.status,
|
|
281
|
+
created_at: r.created_at,
|
|
282
|
+
error: r.output_data?.error ?? r.output?.error ?? null
|
|
283
|
+
}))
|
|
284
|
+
};
|
|
285
|
+
}
|
|
286
|
+
// ─── Queue ─────────────────────────────────────
|
|
287
|
+
case "queue": {
|
|
288
|
+
const engagements = await listEngagements(supabase, tenantId);
|
|
289
|
+
const activeEngagements = engagements.filter(
|
|
290
|
+
(e) => !["completed", "cancelled", "churned"].includes(e.status)
|
|
291
|
+
);
|
|
292
|
+
const items = [];
|
|
293
|
+
const today = (/* @__PURE__ */ new Date()).toISOString().split("T")[0];
|
|
294
|
+
const twoHoursAgo = new Date(Date.now() - 2 * 60 * 60 * 1e3).toISOString();
|
|
295
|
+
for (const e of activeEngagements) {
|
|
296
|
+
const deliverables = await findDeliverablesByEngagement(supabase, e.id);
|
|
297
|
+
const automationRuns = await findAutomationRuns(supabase, e.id, {
|
|
298
|
+
status: "failed",
|
|
299
|
+
limit: 5
|
|
300
|
+
});
|
|
301
|
+
for (const r of automationRuns) {
|
|
302
|
+
items.push({
|
|
303
|
+
type: "failed_automation",
|
|
304
|
+
severity: "high",
|
|
305
|
+
engagement_id: e.id,
|
|
306
|
+
client_name: e.client_name,
|
|
307
|
+
automation_type: r.automation_type,
|
|
308
|
+
failed_at: r.created_at,
|
|
309
|
+
error: r.output_data?.error ?? r.output?.error ?? null
|
|
310
|
+
});
|
|
311
|
+
}
|
|
312
|
+
for (const d of deliverables) {
|
|
313
|
+
if (d.automation_status === "running" && d.updated_at < twoHoursAgo) {
|
|
314
|
+
items.push({
|
|
315
|
+
type: "stuck_deliverable",
|
|
316
|
+
severity: "high",
|
|
317
|
+
engagement_id: e.id,
|
|
318
|
+
client_name: e.client_name,
|
|
319
|
+
deliverable_name: d.name,
|
|
320
|
+
running_since: d.updated_at
|
|
321
|
+
});
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
for (const d of deliverables) {
|
|
325
|
+
if (d.status === "pending" && d.due_date && d.due_date < today) {
|
|
326
|
+
items.push({
|
|
327
|
+
type: "past_due",
|
|
328
|
+
severity: "medium",
|
|
329
|
+
engagement_id: e.id,
|
|
330
|
+
client_name: e.client_name,
|
|
331
|
+
deliverable_name: d.name,
|
|
332
|
+
due_date: d.due_date
|
|
333
|
+
});
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
items.sort((a, b) => {
|
|
338
|
+
const sevOrder = { high: 0, medium: 1, low: 2 };
|
|
339
|
+
const aS = sevOrder[a.severity] ?? 2;
|
|
340
|
+
const bS = sevOrder[b.severity] ?? 2;
|
|
341
|
+
return aS - bS;
|
|
342
|
+
});
|
|
343
|
+
return {
|
|
344
|
+
action: "queue",
|
|
345
|
+
count: items.length,
|
|
346
|
+
items
|
|
347
|
+
};
|
|
348
|
+
}
|
|
349
|
+
default:
|
|
350
|
+
throw createGtmError("QUERY_INVALID", `Unknown dfy action: ${action}`);
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
export {
|
|
354
|
+
handleDfy
|
|
355
|
+
};
|
|
356
|
+
//# sourceMappingURL=dfy-X3OXIYRA.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/handlers/dfy.ts"],"sourcesContent":["/** DFY handler. Routes dfy tool actions to @maestro/gtm DFY domain functions.\n * Purpose: Query DFY engagement status, content, pipeline, diagnostics, and action queue.\n * Constraint: Uses shared getSupabase() utility. Two-step tenant scoping on child tables. */\n\nimport type { SupabaseClient } from '@supabase/supabase-js';\n\nimport { logError } from '@maestro/logging';\nimport {\n findEngagement,\n listEngagements,\n findDeliverablesByEngagement,\n findActivityLog,\n findAutomationRuns,\n deriveOverallStage,\n deriveSmartState,\n} from '@maestro/gtm';\n\nimport { createGtmError } from '../errors.js';\nimport { getSupabase } from '../utils/supabase.js';\nimport { resolveTenantId } from '../utils/tenant.js';\nimport type { HandlerContext } from './index.js';\n\n// ─── Constants ────────────────────────────────────────────\n\nconst CONTENT_POST_SELECT =\n 'id, title, status, content_type, pillar, created_at, updated_at' as const;\n\n// ─── Engagement Resolution ──────────────────────────────\n\n/** Resolve an engagement by ID or name search. Verifies tenant ownership. */\nasync function resolveEngagement(\n supabase: SupabaseClient,\n tenantId: string,\n args: Record<string, unknown>\n) {\n const engagementId = args.engagement_id as string | undefined;\n const name = args.name as string | undefined;\n\n if (engagementId) {\n const engagement = await findEngagement(supabase, engagementId);\n if (!engagement) throw createGtmError('QUERY_INVALID', `Engagement not found: ${engagementId}`);\n if (engagement.tenant_id !== tenantId) {\n throw createGtmError('QUERY_INVALID', 'Engagement does not belong to this tenant');\n }\n return engagement;\n }\n\n if (name) {\n const all = await listEngagements(supabase, tenantId);\n const lower = name.toLowerCase();\n const match = all.find(\n (e) =>\n e.client_name.toLowerCase().includes(lower) ||\n (e.client_company && e.client_company.toLowerCase().includes(lower))\n );\n if (!match)\n throw createGtmError('QUERY_INVALID', `No engagement found matching name: \"${name}\"`);\n return match;\n }\n\n throw createGtmError('QUERY_INVALID', 'engagement_id or name is required');\n}\n\n// ─── Handler ─────────────────────────────────────────────\n\nexport async function handleDfy(\n args: Record<string, unknown>,\n ctx: HandlerContext\n): Promise<unknown> {\n const action = args.action as string;\n const supabase = getSupabase();\n const tenantId = resolveTenantId(args, ctx);\n\n switch (action) {\n // ─── List ──────────────────────────────────────\n case 'list': {\n const filters: { status?: string; engagement_type?: string } = {};\n if (args.status_filter) filters.status = args.status_filter as string;\n if (args.engagement_type) filters.engagement_type = args.engagement_type as string;\n\n let engagements = await listEngagements(supabase, tenantId, filters);\n\n // Optional name filter\n const name = args.name as string | undefined;\n if (name) {\n const lower = name.toLowerCase();\n engagements = engagements.filter(\n (e) =>\n e.client_name.toLowerCase().includes(lower) ||\n (e.client_company && e.client_company.toLowerCase().includes(lower))\n );\n }\n\n const summaries = await Promise.all(\n engagements.map(async (e) => {\n const deliverables = await findDeliverablesByEngagement(supabase, e.id);\n const overallStage = deriveOverallStage(e);\n const completed = deliverables.filter((d) =>\n ['completed', 'approved', 'delivered'].includes(d.status)\n ).length;\n\n return {\n id: e.id,\n client_name: e.client_name,\n client_company: e.client_company,\n status: e.status,\n engagement_type: e.engagement_type,\n intake_status: e.intake_status,\n content_stage: e.content_stage,\n outbound_stage: e.outbound_stage,\n overall_stage: overallStage,\n deliverables_completed: completed,\n deliverables_total: deliverables.length,\n created_at: e.created_at,\n };\n })\n );\n\n return { action: 'list', count: summaries.length, engagements: summaries };\n }\n\n // ─── Status ────────────────────────────────────\n case 'status': {\n const engagement = await resolveEngagement(supabase, tenantId, args);\n const deliverables = await findDeliverablesByEngagement(supabase, engagement.id);\n const activity = await findActivityLog(supabase, engagement.id, { limit: 10 });\n const overallStage = deriveOverallStage(engagement);\n\n const deliverableSummaries = deliverables.map((d) => ({\n id: d.id,\n name: d.name,\n category: d.category,\n status: d.status,\n automation_type: d.automation_type,\n automation_status: d.automation_status,\n track: d.track,\n smart_state: deriveSmartState(d, deliverables),\n due_date: d.due_date,\n revision_count: d.revision_count,\n }));\n\n return {\n action: 'status',\n engagement: {\n id: engagement.id,\n client_name: engagement.client_name,\n client_company: engagement.client_company,\n status: engagement.status,\n engagement_type: engagement.engagement_type,\n intake_status: engagement.intake_status,\n content_stage: engagement.content_stage,\n outbound_stage: engagement.outbound_stage,\n overall_stage: overallStage,\n has_processed_intake: !!engagement.processed_intake,\n has_magnetlab_user: !!engagement.magnetlab_user_id,\n has_linkedin: !!engagement.linkedin_url,\n has_slack_channel: !!engagement.slack_channel_id,\n created_at: engagement.created_at,\n updated_at: engagement.updated_at,\n },\n deliverables: deliverableSummaries,\n recent_activity: activity.map((a) => ({\n action: a.action,\n description: a.description,\n actor: a.actor,\n created_at: a.created_at,\n })),\n };\n }\n\n // ─── Content ───────────────────────────────────\n case 'content': {\n const engagement = await resolveEngagement(supabase, tenantId, args);\n\n if (!engagement.magnetlab_user_id) {\n return {\n action: 'content',\n engagement_id: engagement.id,\n client_name: engagement.client_name,\n error: 'No magnetlab_user_id set — content pipeline has not been connected.',\n content_items: [],\n count: 0,\n };\n }\n\n // Cross-boundary query — same pattern as daily-check.ts:290\n const { data: posts, error } = await supabase\n .from('cp_pipeline_posts')\n .select(CONTENT_POST_SELECT)\n .eq('user_id', engagement.magnetlab_user_id)\n .order('created_at', { ascending: false })\n .limit(50);\n\n if (error) {\n logError('dfy.handler.content', error, {\n engagementId: engagement.id,\n magnetlabUserId: engagement.magnetlab_user_id,\n });\n return {\n action: 'content',\n engagement_id: engagement.id,\n client_name: engagement.client_name,\n error: 'Failed to query content items',\n content_items: [],\n count: 0,\n };\n }\n\n const items = posts ?? [];\n const byStatus: Record<string, number> = {};\n for (const p of items) {\n const s = (p as Record<string, unknown>).status as string;\n byStatus[s] = (byStatus[s] ?? 0) + 1;\n }\n\n return {\n action: 'content',\n engagement_id: engagement.id,\n client_name: engagement.client_name,\n count: items.length,\n by_status: byStatus,\n content_items: items,\n };\n }\n\n // ─── Pipeline ──────────────────────────────────\n case 'pipeline': {\n const engagements = await listEngagements(supabase, tenantId);\n\n // Filter to non-terminal\n const active = engagements.filter(\n (e) => !['completed', 'cancelled', 'churned'].includes(e.status)\n );\n\n const pipeline: Record<string, unknown[]> = {};\n\n for (const e of active) {\n const overallStage = deriveOverallStage(e);\n\n if (!pipeline[overallStage]) pipeline[overallStage] = [];\n pipeline[overallStage].push({\n id: e.id,\n client_name: e.client_name,\n client_company: e.client_company,\n status: e.status,\n intake_status: e.intake_status,\n content_stage: e.content_stage,\n outbound_stage: e.outbound_stage,\n });\n }\n\n return {\n action: 'pipeline',\n total_active: active.length,\n stages: pipeline,\n };\n }\n\n // ─── Diagnose ──────────────────────────────────\n case 'diagnose': {\n const engagement = await resolveEngagement(supabase, tenantId, args);\n const deliverables = await findDeliverablesByEngagement(supabase, engagement.id);\n const activity = await findActivityLog(supabase, engagement.id, { limit: 5 });\n const automationRuns = await findAutomationRuns(supabase, engagement.id, { limit: 20 });\n const overallStage = deriveOverallStage(engagement);\n\n const issues: string[] = [];\n\n // Check intake\n if (engagement.intake_status !== 'ready') {\n issues.push(`Intake not ready (status: ${engagement.intake_status})`);\n }\n if (!engagement.processed_intake) {\n issues.push('No processed intake — content generation cannot run');\n }\n if (!engagement.magnetlab_user_id) {\n issues.push('No magnetlab_user_id — content pipeline not connected');\n }\n if (!engagement.linkedin_url) {\n issues.push('No LinkedIn URL set');\n }\n\n // Check failed automations\n const failedRuns = automationRuns.filter((r) => r.status === 'failed');\n if (failedRuns.length > 0) {\n for (const r of failedRuns.slice(0, 5)) {\n const errorDetail =\n (r.output_data as Record<string, unknown>)?.error ??\n (r.output as Record<string, unknown>)?.error ??\n 'unknown error';\n issues.push(`Failed automation: ${r.automation_type} (${r.created_at}) — ${errorDetail}`);\n }\n }\n\n // Check stuck deliverables (running >2hr)\n const twoHoursAgo = new Date(Date.now() - 2 * 60 * 60 * 1000).toISOString();\n const stuckDeliverables = deliverables.filter(\n (d) => d.automation_status === 'running' && d.updated_at < twoHoursAgo\n );\n if (stuckDeliverables.length > 0) {\n for (const d of stuckDeliverables) {\n issues.push(`Stuck deliverable: \"${d.name}\" running since ${d.updated_at}`);\n }\n }\n\n // Check blocked deliverables\n const blocked = deliverables.filter((d) => {\n if (d.status !== 'pending' || !d.depends_on?.length) return false;\n const completedIds = new Set(\n deliverables\n .filter((dd) => ['completed', 'approved', 'delivered'].includes(dd.status))\n .map((dd) => dd.id)\n );\n return !d.depends_on.every((depId) => completedIds.has(depId));\n });\n if (blocked.length > 0) {\n for (const d of blocked) {\n issues.push(`Blocked: \"${d.name}\" waiting on dependencies`);\n }\n }\n\n return {\n action: 'diagnose',\n engagement_id: engagement.id,\n client_name: engagement.client_name,\n status: engagement.status,\n intake_status: engagement.intake_status,\n content_stage: engagement.content_stage,\n outbound_stage: engagement.outbound_stage,\n overall_stage: overallStage,\n issues: issues.length > 0 ? issues : ['No issues detected — engagement appears healthy'],\n deliverable_summary: deliverables.map((d) => ({\n name: d.name,\n status: d.status,\n automation_status: d.automation_status,\n smart_state: deriveSmartState(d, deliverables),\n })),\n recent_activity: activity.map((a) => ({\n action: a.action,\n description: a.description,\n created_at: a.created_at,\n })),\n failed_automation_runs: failedRuns.slice(0, 5).map((r) => ({\n automation_type: r.automation_type,\n status: r.status,\n created_at: r.created_at,\n error:\n (r.output_data as Record<string, unknown>)?.error ??\n (r.output as Record<string, unknown>)?.error ??\n null,\n })),\n };\n }\n\n // ─── Queue ─────────────────────────────────────\n case 'queue': {\n const engagements = await listEngagements(supabase, tenantId);\n const activeEngagements = engagements.filter(\n (e) => !['completed', 'cancelled', 'churned'].includes(e.status)\n );\n\n const items: unknown[] = [];\n const today = new Date().toISOString().split('T')[0];\n const twoHoursAgo = new Date(Date.now() - 2 * 60 * 60 * 1000).toISOString();\n\n for (const e of activeEngagements) {\n const deliverables = await findDeliverablesByEngagement(supabase, e.id);\n const automationRuns = await findAutomationRuns(supabase, e.id, {\n status: 'failed',\n limit: 5,\n });\n\n // Failed automations\n for (const r of automationRuns) {\n items.push({\n type: 'failed_automation',\n severity: 'high',\n engagement_id: e.id,\n client_name: e.client_name,\n automation_type: r.automation_type,\n failed_at: r.created_at,\n error:\n (r.output_data as Record<string, unknown>)?.error ??\n (r.output as Record<string, unknown>)?.error ??\n null,\n });\n }\n\n // Stuck deliverables (running >2hr)\n for (const d of deliverables) {\n if (d.automation_status === 'running' && d.updated_at < twoHoursAgo) {\n items.push({\n type: 'stuck_deliverable',\n severity: 'high',\n engagement_id: e.id,\n client_name: e.client_name,\n deliverable_name: d.name,\n running_since: d.updated_at,\n });\n }\n }\n\n // Past-due deliverables\n for (const d of deliverables) {\n if (d.status === 'pending' && d.due_date && d.due_date < today) {\n items.push({\n type: 'past_due',\n severity: 'medium',\n engagement_id: e.id,\n client_name: e.client_name,\n deliverable_name: d.name,\n due_date: d.due_date,\n });\n }\n }\n }\n\n // Sort by severity (high first)\n items.sort((a, b) => {\n const sevOrder: Record<string, number> = { high: 0, medium: 1, low: 2 };\n const aS = sevOrder[(a as Record<string, string>).severity] ?? 2;\n const bS = sevOrder[(b as Record<string, string>).severity] ?? 2;\n return aS - bS;\n });\n\n return {\n action: 'queue',\n count: items.length,\n items,\n };\n }\n\n default:\n throw createGtmError('QUERY_INVALID', `Unknown dfy action: ${action}`);\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ApiClientError,
|
|
3
|
+
ApifyClient,
|
|
4
|
+
ApolloClient,
|
|
5
|
+
AttioClient,
|
|
6
|
+
BaseApiClient,
|
|
7
|
+
BetterContactClient,
|
|
8
|
+
BlitzAdapter,
|
|
9
|
+
BlitzApiClient,
|
|
10
|
+
BlitzApiEmailAdapter,
|
|
11
|
+
BlueprintGeneratorClient,
|
|
12
|
+
BouncebanAdapter,
|
|
13
|
+
BrightDataClient,
|
|
14
|
+
CalComClient,
|
|
15
|
+
DataForSeoClient,
|
|
16
|
+
DiscoClient,
|
|
17
|
+
EnrichmentClient,
|
|
18
|
+
ExaClient,
|
|
19
|
+
GeminiClient,
|
|
20
|
+
GscClient,
|
|
21
|
+
HarvestClient,
|
|
22
|
+
HeyReachClient,
|
|
23
|
+
HunterClient,
|
|
24
|
+
INSTANTLY_STATUS_LABELS,
|
|
25
|
+
ImdbProClient,
|
|
26
|
+
InstantlyClient,
|
|
27
|
+
LeadMagicAdapter,
|
|
28
|
+
LeadMagicClient,
|
|
29
|
+
LinearClient,
|
|
30
|
+
MailinAdapter,
|
|
31
|
+
PLUSVIBE_VARIABLES,
|
|
32
|
+
PlusVibeClient,
|
|
33
|
+
ProspeoAdapter,
|
|
34
|
+
ProspeoClient,
|
|
35
|
+
RecallClient,
|
|
36
|
+
ResendClient,
|
|
37
|
+
SerperClient,
|
|
38
|
+
SlackClient,
|
|
39
|
+
SmartLeadClient,
|
|
40
|
+
StripeClient,
|
|
41
|
+
TwentyClient,
|
|
42
|
+
TwilioClient,
|
|
43
|
+
UnipileClient,
|
|
44
|
+
ZapmailClient,
|
|
45
|
+
ZeroBounceAdapter,
|
|
46
|
+
createHeliconeConfig,
|
|
47
|
+
extractLinkedInUsername,
|
|
48
|
+
generateBlueprintSlug,
|
|
49
|
+
getCallTranscriptForClient,
|
|
50
|
+
parseKondoWebhook,
|
|
51
|
+
recommendOfferFromIncome,
|
|
52
|
+
scoreEngagement,
|
|
53
|
+
verifyHmacSha256,
|
|
54
|
+
verifySlackWebhook,
|
|
55
|
+
verifyStripeWebhook,
|
|
56
|
+
verifySvixWebhook,
|
|
57
|
+
verifyTwilioWebhook,
|
|
58
|
+
verifyWebhook
|
|
59
|
+
} from "./chunk-WKLCPIFB.js";
|
|
60
|
+
import "./chunk-6GLLK5KO.js";
|
|
61
|
+
import "./chunk-PZ5AY32C.js";
|
|
62
|
+
export {
|
|
63
|
+
ApiClientError,
|
|
64
|
+
ApifyClient,
|
|
65
|
+
ApolloClient,
|
|
66
|
+
AttioClient,
|
|
67
|
+
BaseApiClient,
|
|
68
|
+
BetterContactClient,
|
|
69
|
+
BlitzAdapter,
|
|
70
|
+
BlitzApiClient,
|
|
71
|
+
BlitzApiEmailAdapter,
|
|
72
|
+
BlueprintGeneratorClient,
|
|
73
|
+
BouncebanAdapter,
|
|
74
|
+
BrightDataClient,
|
|
75
|
+
CalComClient,
|
|
76
|
+
DataForSeoClient,
|
|
77
|
+
DiscoClient,
|
|
78
|
+
EnrichmentClient,
|
|
79
|
+
ExaClient,
|
|
80
|
+
GeminiClient,
|
|
81
|
+
GscClient,
|
|
82
|
+
HarvestClient,
|
|
83
|
+
HeyReachClient,
|
|
84
|
+
HunterClient,
|
|
85
|
+
INSTANTLY_STATUS_LABELS,
|
|
86
|
+
ImdbProClient,
|
|
87
|
+
InstantlyClient,
|
|
88
|
+
LeadMagicAdapter,
|
|
89
|
+
LeadMagicClient,
|
|
90
|
+
LinearClient,
|
|
91
|
+
MailinAdapter,
|
|
92
|
+
PLUSVIBE_VARIABLES,
|
|
93
|
+
PlusVibeClient,
|
|
94
|
+
ProspeoAdapter,
|
|
95
|
+
ProspeoClient,
|
|
96
|
+
RecallClient,
|
|
97
|
+
ResendClient,
|
|
98
|
+
SerperClient,
|
|
99
|
+
SlackClient,
|
|
100
|
+
SmartLeadClient,
|
|
101
|
+
StripeClient,
|
|
102
|
+
TwentyClient,
|
|
103
|
+
TwilioClient,
|
|
104
|
+
UnipileClient,
|
|
105
|
+
ZapmailClient,
|
|
106
|
+
ZeroBounceAdapter,
|
|
107
|
+
createHeliconeConfig,
|
|
108
|
+
extractLinkedInUsername,
|
|
109
|
+
generateBlueprintSlug,
|
|
110
|
+
getCallTranscriptForClient,
|
|
111
|
+
parseKondoWebhook,
|
|
112
|
+
recommendOfferFromIncome,
|
|
113
|
+
scoreEngagement,
|
|
114
|
+
verifyHmacSha256,
|
|
115
|
+
verifySlackWebhook,
|
|
116
|
+
verifyStripeWebhook,
|
|
117
|
+
verifySvixWebhook,
|
|
118
|
+
verifyTwilioWebhook,
|
|
119
|
+
verifyWebhook
|
|
120
|
+
};
|
|
121
|
+
//# sourceMappingURL=dist-LGCJKGBS.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|