@adcp/client 4.10.0 → 4.11.0

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.
Files changed (59) hide show
  1. package/bin/adcp.js +52 -158
  2. package/dist/lib/auth/oauth/MCPOAuthProvider.d.ts +10 -0
  3. package/dist/lib/auth/oauth/MCPOAuthProvider.d.ts.map +1 -1
  4. package/dist/lib/auth/oauth/MCPOAuthProvider.js +19 -0
  5. package/dist/lib/auth/oauth/MCPOAuthProvider.js.map +1 -1
  6. package/dist/lib/core/AgentClient.d.ts.map +1 -1
  7. package/dist/lib/core/SingleAgentClient.d.ts +1 -1
  8. package/dist/lib/testing/compliance/briefs.d.ts +2 -3
  9. package/dist/lib/testing/compliance/briefs.d.ts.map +1 -1
  10. package/dist/lib/testing/compliance/briefs.js +2 -3
  11. package/dist/lib/testing/compliance/briefs.js.map +1 -1
  12. package/dist/lib/testing/compliance/comply.d.ts +3 -1
  13. package/dist/lib/testing/compliance/comply.d.ts.map +1 -1
  14. package/dist/lib/testing/compliance/comply.js +84 -7
  15. package/dist/lib/testing/compliance/comply.js.map +1 -1
  16. package/dist/lib/testing/compliance/index.d.ts +5 -6
  17. package/dist/lib/testing/compliance/index.d.ts.map +1 -1
  18. package/dist/lib/testing/compliance/index.js +6 -8
  19. package/dist/lib/testing/compliance/index.js.map +1 -1
  20. package/dist/lib/testing/compliance/profiles.d.ts +30 -0
  21. package/dist/lib/testing/compliance/profiles.d.ts.map +1 -0
  22. package/dist/lib/testing/compliance/profiles.js +388 -0
  23. package/dist/lib/testing/compliance/profiles.js.map +1 -0
  24. package/dist/lib/testing/compliance/types.d.ts +56 -58
  25. package/dist/lib/testing/compliance/types.d.ts.map +1 -1
  26. package/dist/lib/testing/compliance/types.js +0 -3
  27. package/dist/lib/testing/compliance/types.js.map +1 -1
  28. package/dist/lib/testing/index.d.ts +1 -1
  29. package/dist/lib/testing/index.d.ts.map +1 -1
  30. package/dist/lib/testing/index.js +5 -7
  31. package/dist/lib/testing/index.js.map +1 -1
  32. package/dist/lib/testing/scenarios/media-buy.d.ts.map +1 -1
  33. package/dist/lib/testing/scenarios/media-buy.js +1 -0
  34. package/dist/lib/testing/scenarios/media-buy.js.map +1 -1
  35. package/dist/lib/types/core.generated.d.ts +21 -103
  36. package/dist/lib/types/core.generated.d.ts.map +1 -1
  37. package/dist/lib/types/core.generated.js +1 -1
  38. package/dist/lib/types/schemas.generated.d.ts +40 -152
  39. package/dist/lib/types/schemas.generated.d.ts.map +1 -1
  40. package/dist/lib/types/schemas.generated.js +15 -43
  41. package/dist/lib/types/schemas.generated.js.map +1 -1
  42. package/dist/lib/types/tools.generated.d.ts +22 -104
  43. package/dist/lib/types/tools.generated.d.ts.map +1 -1
  44. package/dist/lib/utils/capabilities.d.ts +1 -1
  45. package/dist/lib/utils/capabilities.d.ts.map +1 -1
  46. package/dist/lib/utils/capabilities.js +6 -6
  47. package/dist/lib/utils/capabilities.js.map +1 -1
  48. package/dist/lib/utils/request-normalizer.d.ts.map +1 -1
  49. package/dist/lib/utils/request-normalizer.js +12 -0
  50. package/dist/lib/utils/request-normalizer.js.map +1 -1
  51. package/dist/lib/version.d.ts +3 -3
  52. package/dist/lib/version.d.ts.map +1 -1
  53. package/dist/lib/version.js +3 -3
  54. package/dist/lib/version.js.map +1 -1
  55. package/package.json +1 -1
  56. package/dist/lib/testing/compliance/convince.d.ts +0 -27
  57. package/dist/lib/testing/compliance/convince.d.ts.map +0 -1
  58. package/dist/lib/testing/compliance/convince.js +0 -418
  59. package/dist/lib/testing/compliance/convince.js.map +0 -1
@@ -1,418 +0,0 @@
1
- "use strict";
2
- /**
3
- * Convince Engine — AI-Assessed Merchandising Quality
4
- *
5
- * Runs sample briefs against an agent's get_products endpoint
6
- * and uses an LLM to evaluate the quality of responses.
7
- *
8
- * comply → "Your agent works"
9
- * convince → "Your agent sells"
10
- */
11
- Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.convince = convince;
13
- exports.formatConvinceResults = formatConvinceResults;
14
- exports.formatConvinceResultsJSON = formatConvinceResultsJSON;
15
- const client_1 = require("../client");
16
- const briefs_1 = require("./briefs");
17
- const EVALUATION_PROMPT = `You are an expert ad tech buyer evaluating a sales agent's product catalog response.
18
-
19
- A buyer sent a brief to a sales agent requesting advertising products. Below is the brief and the agent's response. Evaluate the response across these dimensions:
20
-
21
- 1. **relevance** — Do the returned products match the brief's audience, format, and objective?
22
- 2. **specificity** — Are products tailored to this brief or generic inventory?
23
- 3. **completeness** — Are the fields populated that buyers use to decide? (audience, targeting, pricing, descriptions)
24
- 4. **pricing** — Is the pricing model appropriate for the brief's goals and budget?
25
- 5. **merchandising** — Would a buyer pick this over a competitor's response? Are product names compelling vs internal codes?
26
-
27
- Rate each dimension as "strong", "moderate", or "weak" with a specific observation (not generic).
28
-
29
- Then provide:
30
- - A 2-3 sentence summary of the overall quality
31
- - Top 3 specific, actionable improvements (not generic advice)
32
-
33
- IMPORTANT: Be specific. Reference actual product names, field values, and counts from the response. Do not give generic advice like "add more targeting" — say "3 of 5 products have no audience fields; add demographic or interest targeting to the Premium Display product."
34
-
35
- Respond in this exact JSON format:
36
- {
37
- "dimensions": [
38
- {"dimension": "relevance", "rating": "strong|moderate|weak", "observation": "..."},
39
- {"dimension": "specificity", "rating": "strong|moderate|weak", "observation": "..."},
40
- {"dimension": "completeness", "rating": "strong|moderate|weak", "observation": "..."},
41
- {"dimension": "pricing", "rating": "strong|moderate|weak", "observation": "..."},
42
- {"dimension": "merchandising", "rating": "strong|moderate|weak", "observation": "..."}
43
- ],
44
- "summary": "...",
45
- "top_actions": ["...", "...", "..."]
46
- }`;
47
- /**
48
- * Call an LLM to evaluate a product response against a brief.
49
- */
50
- async function evaluateWithLLM(brief, products, options) {
51
- const userMessage = `## Brief
52
- **Name:** ${brief.name}
53
- **Vertical:** ${brief.vertical}
54
- **Budget:** ${brief.budget_context || 'Not specified'}
55
- **Expected Channels:** ${brief.expected_channels?.join(', ') || 'Any'}
56
-
57
- ${brief.brief}
58
-
59
- ## Evaluation Hints
60
- ${brief.evaluation_hints}
61
-
62
- ## Agent Response
63
- Products returned: ${products.length}
64
-
65
- \`\`\`json
66
- ${JSON.stringify(products, null, 2).slice(0, 8000)}
67
- \`\`\``;
68
- let responseText;
69
- if (options.anthropic_api_key) {
70
- responseText = await callAnthropic(EVALUATION_PROMPT, userMessage, options.anthropic_api_key, options.model);
71
- }
72
- else if (options.gemini_api_key) {
73
- responseText = await callGemini(EVALUATION_PROMPT, userMessage, options.gemini_api_key, options.model);
74
- }
75
- else {
76
- throw new Error('No LLM API key provided. Set --anthropic-key or --gemini-key');
77
- }
78
- return parseEvaluation(responseText);
79
- }
80
- async function callAnthropic(system, user, apiKey, model) {
81
- const response = await fetch('https://api.anthropic.com/v1/messages', {
82
- method: 'POST',
83
- headers: {
84
- 'Content-Type': 'application/json',
85
- 'x-api-key': apiKey,
86
- 'anthropic-version': '2023-06-01',
87
- },
88
- body: JSON.stringify({
89
- model: model || 'claude-sonnet-4-20250514',
90
- max_tokens: 2000,
91
- system,
92
- messages: [{ role: 'user', content: user }],
93
- }),
94
- });
95
- if (!response.ok) {
96
- const body = await response.text();
97
- throw new Error(`Anthropic API error ${response.status}: ${body}`);
98
- }
99
- const data = (await response.json());
100
- return data.content[0].text;
101
- }
102
- async function callGemini(system, user, apiKey, model) {
103
- const geminiModel = model || 'gemini-2.0-flash';
104
- const response = await fetch(`https://generativelanguage.googleapis.com/v1beta/models/${geminiModel}:generateContent?key=${apiKey}`, {
105
- method: 'POST',
106
- headers: { 'Content-Type': 'application/json' },
107
- body: JSON.stringify({
108
- systemInstruction: { parts: [{ text: system }] },
109
- contents: [{ parts: [{ text: user }] }],
110
- generationConfig: { responseMimeType: 'application/json' },
111
- }),
112
- });
113
- if (!response.ok) {
114
- const body = await response.text();
115
- throw new Error(`Gemini API error ${response.status}: ${body}`);
116
- }
117
- const data = (await response.json());
118
- return data.candidates[0].content.parts[0].text;
119
- }
120
- function parseEvaluation(text) {
121
- // Extract JSON from the response (handle markdown code blocks)
122
- const jsonMatch = text.match(/\{[\s\S]*\}/);
123
- if (!jsonMatch) {
124
- throw new Error('Could not parse LLM evaluation response as JSON');
125
- }
126
- const parsed = JSON.parse(jsonMatch[0]);
127
- const validDimensions = ['relevance', 'specificity', 'completeness', 'pricing', 'merchandising'];
128
- const validRatings = ['strong', 'moderate', 'weak'];
129
- const dimensions = (parsed.dimensions || [])
130
- .filter(d => validDimensions.includes(d.dimension) && validRatings.includes(d.rating))
131
- .map(d => ({
132
- dimension: d.dimension,
133
- rating: d.rating,
134
- observation: d.observation || '',
135
- }));
136
- return {
137
- dimensions,
138
- summary: parsed.summary || 'No summary provided',
139
- top_actions: parsed.top_actions || [],
140
- };
141
- }
142
- /**
143
- * Run convince assessment against an agent.
144
- * Sends sample briefs, evaluates product responses with AI.
145
- */
146
- async function convince(agentUrl, options = {}) {
147
- const start = Date.now();
148
- if (!options.anthropic_api_key && !options.gemini_api_key) {
149
- const anthropicKey = process.env.ANTHROPIC_API_KEY;
150
- const geminiKey = process.env.GEMINI_API_KEY;
151
- if (anthropicKey)
152
- options.anthropic_api_key = anthropicKey;
153
- else if (geminiKey)
154
- options.gemini_api_key = geminiKey;
155
- else
156
- throw new Error('No LLM API key. Set ANTHROPIC_API_KEY or GEMINI_API_KEY environment variable.');
157
- }
158
- const effectiveOptions = {
159
- ...options,
160
- dry_run: options.dry_run !== false,
161
- test_session_id: options.test_session_id || `convince-${Date.now()}`,
162
- };
163
- // Discover agent
164
- const client = (0, client_1.createTestClient)(agentUrl, effectiveOptions.protocol ?? 'mcp', effectiveOptions);
165
- const { profile, step: profileStep } = await (0, client_1.discoverAgentProfile)(client);
166
- if (!profileStep.passed) {
167
- return {
168
- agent_url: agentUrl,
169
- agent_profile: profile,
170
- assessments: [],
171
- patterns: [],
172
- overall_summary: 'Agent unreachable — cannot assess merchandising quality',
173
- tested_at: new Date().toISOString(),
174
- total_duration_ms: Date.now() - start,
175
- evaluator: options.anthropic_api_key ? 'anthropic' : 'gemini',
176
- dry_run: effectiveOptions.dry_run !== false,
177
- };
178
- }
179
- if (!profile.tools.includes('get_products')) {
180
- return {
181
- agent_url: agentUrl,
182
- agent_profile: profile,
183
- assessments: [],
184
- patterns: [],
185
- overall_summary: 'Agent does not support get_products — nothing to assess for merchandising quality',
186
- tested_at: new Date().toISOString(),
187
- total_duration_ms: Date.now() - start,
188
- evaluator: options.anthropic_api_key ? 'anthropic' : 'gemini',
189
- dry_run: effectiveOptions.dry_run !== false,
190
- };
191
- }
192
- // Select briefs to run
193
- const briefs = options.brief_ids ? briefs_1.SAMPLE_BRIEFS.filter(b => options.brief_ids.includes(b.id)) : briefs_1.SAMPLE_BRIEFS;
194
- const assessments = [];
195
- for (const brief of briefs) {
196
- try {
197
- // Call get_products with the sample brief
198
- const result = (await client.getProducts({
199
- buying_mode: 'brief',
200
- brief: brief.brief,
201
- brand: (0, client_1.resolveBrand)(effectiveOptions),
202
- // eslint-disable-next-line @typescript-eslint/no-explicit-any -- bypasses strict request typing
203
- }));
204
- const products = result?.success ? (result.data?.products ?? []) : [];
205
- if (!result?.success) {
206
- assessments.push({
207
- brief,
208
- products_returned: 0,
209
- dimensions: [],
210
- summary: `Agent returned error: ${result?.error || 'unknown error'}`,
211
- top_actions: ['Fix the error returned by get_products before assessing merchandising quality'],
212
- raw_response: result?.data,
213
- });
214
- continue;
215
- }
216
- // Evaluate with LLM
217
- const evaluation = await evaluateWithLLM(brief, products, options);
218
- assessments.push({
219
- brief,
220
- products_returned: products.length,
221
- dimensions: evaluation.dimensions,
222
- summary: evaluation.summary,
223
- top_actions: evaluation.top_actions,
224
- raw_response: products,
225
- });
226
- }
227
- catch (error) {
228
- assessments.push({
229
- brief,
230
- products_returned: 0,
231
- dimensions: [],
232
- summary: `Error evaluating: ${error instanceof Error ? error.message : String(error)}`,
233
- top_actions: [],
234
- });
235
- }
236
- }
237
- // Detect cross-brief patterns
238
- const patterns = detectPatterns(assessments);
239
- // Generate overall summary
240
- const overall_summary = generateOverallSummary(assessments, patterns, profile);
241
- return {
242
- agent_url: agentUrl,
243
- agent_profile: profile,
244
- assessments,
245
- patterns,
246
- overall_summary,
247
- tested_at: new Date().toISOString(),
248
- total_duration_ms: Date.now() - start,
249
- evaluator: options.anthropic_api_key ? 'anthropic' : 'gemini',
250
- dry_run: effectiveOptions.dry_run !== false,
251
- };
252
- }
253
- function detectPatterns(assessments) {
254
- const patterns = [];
255
- // Count ratings across all assessments
256
- const ratingCounts = {
257
- relevance: { strong: 0, moderate: 0, weak: 0 },
258
- specificity: { strong: 0, moderate: 0, weak: 0 },
259
- completeness: { strong: 0, moderate: 0, weak: 0 },
260
- pricing: { strong: 0, moderate: 0, weak: 0 },
261
- merchandising: { strong: 0, moderate: 0, weak: 0 },
262
- };
263
- for (const assessment of assessments) {
264
- for (const dim of assessment.dimensions) {
265
- if (ratingCounts[dim.dimension]) {
266
- ratingCounts[dim.dimension][dim.rating]++;
267
- }
268
- }
269
- }
270
- const total = assessments.filter(a => a.dimensions.length > 0).length;
271
- if (total === 0)
272
- return patterns;
273
- // Find consistently weak dimensions
274
- for (const [dim, counts] of Object.entries(ratingCounts)) {
275
- if (counts.weak >= total * 0.6) {
276
- patterns.push({
277
- pattern: `${dim} is consistently weak`,
278
- frequency: `Weak in ${counts.weak} of ${total} briefs`,
279
- impact: getImpactDescription(dim),
280
- });
281
- }
282
- else if (counts.strong >= total * 0.6) {
283
- patterns.push({
284
- pattern: `${dim} is a strength`,
285
- frequency: `Strong in ${counts.strong} of ${total} briefs`,
286
- impact: `This is competitive advantage — maintain and highlight it.`,
287
- });
288
- }
289
- }
290
- // Check for zero-product responses
291
- const emptyResponses = assessments.filter(a => a.products_returned === 0).length;
292
- if (emptyResponses > 0) {
293
- patterns.push({
294
- pattern: 'Empty responses to valid briefs',
295
- frequency: `${emptyResponses} of ${assessments.length} briefs returned 0 products`,
296
- impact: 'Buyers will move to another agent immediately if they get no products. This is the most impactful issue to fix.',
297
- });
298
- }
299
- // Check for identical product counts (might indicate static catalog)
300
- const counts = assessments.map(a => a.products_returned).filter(c => c > 0);
301
- const uniqueCounts = new Set(counts);
302
- if (counts.length > 2 && uniqueCounts.size === 1) {
303
- patterns.push({
304
- pattern: 'Same number of products returned for every brief',
305
- frequency: `Always ${counts[0]} products across ${counts.length} different briefs`,
306
- impact: 'Suggests a static catalog rather than brief-responsive product selection. Buyers expect curated results.',
307
- });
308
- }
309
- return patterns;
310
- }
311
- function getImpactDescription(dimension) {
312
- switch (dimension) {
313
- case 'relevance':
314
- return "Buyers filter on relevance first. Irrelevant products mean you're not even in consideration.";
315
- case 'specificity':
316
- return 'Generic products lose to tailored ones. Buyers want to see you understand their brief.';
317
- case 'completeness':
318
- return 'Missing fields force buyers to guess. They will pick the agent that gives them complete information.';
319
- case 'pricing':
320
- return 'Wrong pricing model signals misalignment. Performance briefs need CPC/CPA, awareness needs CPM.';
321
- case 'merchandising':
322
- return 'Product names and descriptions are your first impression. Internal codes vs compelling names is the difference.';
323
- }
324
- }
325
- function generateOverallSummary(assessments, patterns, profile) {
326
- const withDimensions = assessments.filter(a => a.dimensions.length > 0);
327
- if (withDimensions.length === 0) {
328
- return 'Could not assess merchandising quality — no successful product responses to evaluate.';
329
- }
330
- // Count overall ratings
331
- let strong = 0;
332
- let moderate = 0;
333
- let weak = 0;
334
- for (const a of withDimensions) {
335
- for (const d of a.dimensions) {
336
- if (d.rating === 'strong')
337
- strong++;
338
- else if (d.rating === 'moderate')
339
- moderate++;
340
- else
341
- weak++;
342
- }
343
- }
344
- const total = strong + moderate + weak;
345
- const strongPct = Math.round((strong / total) * 100);
346
- const weakPct = Math.round((weak / total) * 100);
347
- let summary = `Assessed ${withDimensions.length} brief(s) against ${profile.name}. `;
348
- if (weakPct > 50) {
349
- summary += `Merchandising quality needs work: ${weakPct}% of dimension scores were weak. `;
350
- }
351
- else if (strongPct > 50) {
352
- summary += `Strong merchandising: ${strongPct}% of dimension scores were strong. `;
353
- }
354
- else {
355
- summary += `Mixed results: ${strongPct}% strong, ${weakPct}% weak across all dimensions. `;
356
- }
357
- // Add top pattern
358
- const weakPatterns = patterns.filter(p => p.pattern.includes('weak') || p.pattern.includes('Empty'));
359
- if (weakPatterns.length > 0) {
360
- summary += `Key issue: ${weakPatterns[0].pattern.toLowerCase()}.`;
361
- }
362
- return summary;
363
- }
364
- /**
365
- * Format convince results for terminal display.
366
- */
367
- function formatConvinceResults(result) {
368
- let output = '';
369
- output += `\n🎯 AdCP Convince Report\n`;
370
- output += `${'─'.repeat(50)}\n`;
371
- output += `Agent: ${result.agent_url}\n`;
372
- output += `Name: ${result.agent_profile.name}\n`;
373
- output += `Evaluator: ${result.evaluator}\n`;
374
- output += `Duration: ${(result.total_duration_ms / 1000).toFixed(1)}s\n\n`;
375
- output += `${result.overall_summary}\n\n`;
376
- // Per-brief results
377
- for (const assessment of result.assessments) {
378
- output += `${'─'.repeat(50)}\n`;
379
- output += `📋 ${assessment.brief.name}\n`;
380
- output += ` ${assessment.brief.vertical} | ${assessment.brief.budget_context || 'No budget'}\n`;
381
- output += ` Products returned: ${assessment.products_returned}\n\n`;
382
- if (assessment.dimensions.length === 0) {
383
- output += ` ${assessment.summary}\n\n`;
384
- continue;
385
- }
386
- // Dimension scores
387
- for (const dim of assessment.dimensions) {
388
- const icon = dim.rating === 'strong' ? '🟢' : dim.rating === 'moderate' ? '🟡' : '🔴';
389
- output += ` ${icon} ${dim.dimension}: ${dim.observation}\n`;
390
- }
391
- output += `\n ${assessment.summary}\n`;
392
- if (assessment.top_actions.length > 0) {
393
- output += `\n Actions:\n`;
394
- for (const action of assessment.top_actions) {
395
- output += ` → ${action}\n`;
396
- }
397
- }
398
- output += '\n';
399
- }
400
- // Cross-brief patterns
401
- if (result.patterns.length > 0) {
402
- output += `${'─'.repeat(50)}\n`;
403
- output += `Cross-Brief Patterns\n\n`;
404
- for (const pattern of result.patterns) {
405
- output += ` ${pattern.pattern}\n`;
406
- output += ` ${pattern.frequency}\n`;
407
- output += ` Impact: ${pattern.impact}\n\n`;
408
- }
409
- }
410
- return output;
411
- }
412
- /**
413
- * Format convince results as JSON.
414
- */
415
- function formatConvinceResultsJSON(result) {
416
- return JSON.stringify(result, null, 2);
417
- }
418
- //# sourceMappingURL=convince.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"convince.js","sourceRoot":"","sources":["../../../../src/lib/testing/compliance/convince.ts"],"names":[],"mappings":"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"}