@adcp/client 4.8.0 → 4.10.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 (149) hide show
  1. package/bin/adcp.js +346 -0
  2. package/dist/lib/adapters/governance-adapter.d.ts +88 -0
  3. package/dist/lib/adapters/governance-adapter.d.ts.map +1 -0
  4. package/dist/lib/adapters/governance-adapter.js +96 -0
  5. package/dist/lib/adapters/governance-adapter.js.map +1 -0
  6. package/dist/lib/adapters/index.d.ts +1 -0
  7. package/dist/lib/adapters/index.d.ts.map +1 -1
  8. package/dist/lib/adapters/index.js +7 -1
  9. package/dist/lib/adapters/index.js.map +1 -1
  10. package/dist/lib/agents/index.generated.d.ts +33 -1
  11. package/dist/lib/agents/index.generated.d.ts.map +1 -1
  12. package/dist/lib/agents/index.generated.js +48 -0
  13. package/dist/lib/agents/index.generated.js.map +1 -1
  14. package/dist/lib/core/AgentClient.d.ts +92 -1
  15. package/dist/lib/core/AgentClient.d.ts.map +1 -1
  16. package/dist/lib/core/AgentClient.js +237 -0
  17. package/dist/lib/core/AgentClient.js.map +1 -1
  18. package/dist/lib/core/AsyncHandler.d.ts +19 -2
  19. package/dist/lib/core/AsyncHandler.d.ts.map +1 -1
  20. package/dist/lib/core/AsyncHandler.js.map +1 -1
  21. package/dist/lib/core/ConversationTypes.d.ts +8 -2
  22. package/dist/lib/core/ConversationTypes.d.ts.map +1 -1
  23. package/dist/lib/core/GovernanceMiddleware.d.ts +86 -0
  24. package/dist/lib/core/GovernanceMiddleware.d.ts.map +1 -0
  25. package/dist/lib/core/GovernanceMiddleware.js +289 -0
  26. package/dist/lib/core/GovernanceMiddleware.js.map +1 -0
  27. package/dist/lib/core/GovernanceTypes.d.ts +118 -0
  28. package/dist/lib/core/GovernanceTypes.d.ts.map +1 -0
  29. package/dist/lib/core/GovernanceTypes.js +69 -0
  30. package/dist/lib/core/GovernanceTypes.js.map +1 -0
  31. package/dist/lib/core/SingleAgentClient.d.ts +103 -1
  32. package/dist/lib/core/SingleAgentClient.d.ts.map +1 -1
  33. package/dist/lib/core/SingleAgentClient.js +151 -0
  34. package/dist/lib/core/SingleAgentClient.js.map +1 -1
  35. package/dist/lib/core/TaskExecutor.d.ts +10 -0
  36. package/dist/lib/core/TaskExecutor.d.ts.map +1 -1
  37. package/dist/lib/core/TaskExecutor.js +95 -10
  38. package/dist/lib/core/TaskExecutor.js.map +1 -1
  39. package/dist/lib/index.d.ts +6 -2
  40. package/dist/lib/index.d.ts.map +1 -1
  41. package/dist/lib/index.js +22 -4
  42. package/dist/lib/index.js.map +1 -1
  43. package/dist/lib/observability/index.d.ts +8 -0
  44. package/dist/lib/observability/index.d.ts.map +1 -0
  45. package/dist/lib/observability/index.js +17 -0
  46. package/dist/lib/observability/index.js.map +1 -0
  47. package/dist/lib/observability/tracing.d.ts +42 -0
  48. package/dist/lib/observability/tracing.d.ts.map +1 -0
  49. package/dist/lib/observability/tracing.js +126 -0
  50. package/dist/lib/observability/tracing.js.map +1 -0
  51. package/dist/lib/protocols/a2a.d.ts.map +1 -1
  52. package/dist/lib/protocols/a2a.js +16 -1
  53. package/dist/lib/protocols/a2a.js.map +1 -1
  54. package/dist/lib/protocols/index.d.ts.map +1 -1
  55. package/dist/lib/protocols/index.js +37 -29
  56. package/dist/lib/protocols/index.js.map +1 -1
  57. package/dist/lib/protocols/mcp.d.ts.map +1 -1
  58. package/dist/lib/protocols/mcp.js +21 -1
  59. package/dist/lib/protocols/mcp.js.map +1 -1
  60. package/dist/lib/registry/types.generated.d.ts +754 -5
  61. package/dist/lib/registry/types.generated.d.ts.map +1 -1
  62. package/dist/lib/registry/types.generated.js +1 -1
  63. package/dist/lib/testing/agent-tester.d.ts +1 -1
  64. package/dist/lib/testing/agent-tester.d.ts.map +1 -1
  65. package/dist/lib/testing/agent-tester.js +36 -11
  66. package/dist/lib/testing/agent-tester.js.map +1 -1
  67. package/dist/lib/testing/client.d.ts +6 -1
  68. package/dist/lib/testing/client.d.ts.map +1 -1
  69. package/dist/lib/testing/client.js +36 -19
  70. package/dist/lib/testing/client.js.map +1 -1
  71. package/dist/lib/testing/compliance/briefs.d.ts +12 -0
  72. package/dist/lib/testing/compliance/briefs.d.ts.map +1 -0
  73. package/dist/lib/testing/compliance/briefs.js +157 -0
  74. package/dist/lib/testing/compliance/briefs.js.map +1 -0
  75. package/dist/lib/testing/compliance/comply.d.ts +26 -0
  76. package/dist/lib/testing/compliance/comply.d.ts.map +1 -0
  77. package/dist/lib/testing/compliance/comply.js +540 -0
  78. package/dist/lib/testing/compliance/comply.js.map +1 -0
  79. package/dist/lib/testing/compliance/convince.d.ts +27 -0
  80. package/dist/lib/testing/compliance/convince.d.ts.map +1 -0
  81. package/dist/lib/testing/compliance/convince.js +418 -0
  82. package/dist/lib/testing/compliance/convince.js.map +1 -0
  83. package/dist/lib/testing/compliance/index.d.ts +13 -0
  84. package/dist/lib/testing/compliance/index.d.ts.map +1 -0
  85. package/dist/lib/testing/compliance/index.js +22 -0
  86. package/dist/lib/testing/compliance/index.js.map +1 -0
  87. package/dist/lib/testing/compliance/types.d.ts +123 -0
  88. package/dist/lib/testing/compliance/types.d.ts.map +1 -0
  89. package/dist/lib/testing/compliance/types.js +9 -0
  90. package/dist/lib/testing/compliance/types.js.map +1 -0
  91. package/dist/lib/testing/index.d.ts +1 -0
  92. package/dist/lib/testing/index.d.ts.map +1 -1
  93. package/dist/lib/testing/index.js +15 -1
  94. package/dist/lib/testing/index.js.map +1 -1
  95. package/dist/lib/testing/orchestrator.d.ts +0 -2
  96. package/dist/lib/testing/orchestrator.d.ts.map +1 -1
  97. package/dist/lib/testing/orchestrator.js +14 -3
  98. package/dist/lib/testing/orchestrator.js.map +1 -1
  99. package/dist/lib/testing/scenarios/capabilities.d.ts.map +1 -1
  100. package/dist/lib/testing/scenarios/capabilities.js +70 -9
  101. package/dist/lib/testing/scenarios/capabilities.js.map +1 -1
  102. package/dist/lib/testing/scenarios/creative.d.ts +14 -0
  103. package/dist/lib/testing/scenarios/creative.d.ts.map +1 -1
  104. package/dist/lib/testing/scenarios/creative.js +261 -55
  105. package/dist/lib/testing/scenarios/creative.js.map +1 -1
  106. package/dist/lib/testing/scenarios/discovery.d.ts.map +1 -1
  107. package/dist/lib/testing/scenarios/discovery.js +7 -5
  108. package/dist/lib/testing/scenarios/discovery.js.map +1 -1
  109. package/dist/lib/testing/scenarios/edge-cases.d.ts.map +1 -1
  110. package/dist/lib/testing/scenarios/edge-cases.js +90 -112
  111. package/dist/lib/testing/scenarios/edge-cases.js.map +1 -1
  112. package/dist/lib/testing/scenarios/governance.d.ts +48 -0
  113. package/dist/lib/testing/scenarios/governance.d.ts.map +1 -1
  114. package/dist/lib/testing/scenarios/governance.js +725 -39
  115. package/dist/lib/testing/scenarios/governance.js.map +1 -1
  116. package/dist/lib/testing/scenarios/index.d.ts +3 -3
  117. package/dist/lib/testing/scenarios/index.d.ts.map +1 -1
  118. package/dist/lib/testing/scenarios/index.js +8 -1
  119. package/dist/lib/testing/scenarios/index.js.map +1 -1
  120. package/dist/lib/testing/scenarios/media-buy.d.ts +14 -5
  121. package/dist/lib/testing/scenarios/media-buy.d.ts.map +1 -1
  122. package/dist/lib/testing/scenarios/media-buy.js +358 -63
  123. package/dist/lib/testing/scenarios/media-buy.js.map +1 -1
  124. package/dist/lib/testing/scenarios/schema-compliance.d.ts.map +1 -1
  125. package/dist/lib/testing/scenarios/schema-compliance.js +26 -22
  126. package/dist/lib/testing/scenarios/schema-compliance.js.map +1 -1
  127. package/dist/lib/testing/scenarios/signals.d.ts +4 -8
  128. package/dist/lib/testing/scenarios/signals.d.ts.map +1 -1
  129. package/dist/lib/testing/scenarios/signals.js +17 -59
  130. package/dist/lib/testing/scenarios/signals.js.map +1 -1
  131. package/dist/lib/testing/scenarios/sponsored-intelligence.d.ts.map +1 -1
  132. package/dist/lib/testing/scenarios/sponsored-intelligence.js +23 -19
  133. package/dist/lib/testing/scenarios/sponsored-intelligence.js.map +1 -1
  134. package/dist/lib/testing/types.d.ts +3 -2
  135. package/dist/lib/testing/types.d.ts.map +1 -1
  136. package/dist/lib/types/core.generated.d.ts +629 -5
  137. package/dist/lib/types/core.generated.d.ts.map +1 -1
  138. package/dist/lib/types/core.generated.js +1 -1
  139. package/dist/lib/types/schemas.generated.d.ts +13059 -11101
  140. package/dist/lib/types/schemas.generated.d.ts.map +1 -1
  141. package/dist/lib/types/schemas.generated.js +573 -107
  142. package/dist/lib/types/schemas.generated.js.map +1 -1
  143. package/dist/lib/types/tools.generated.d.ts +1827 -360
  144. package/dist/lib/types/tools.generated.d.ts.map +1 -1
  145. package/dist/lib/utils/capabilities.d.ts +17 -2
  146. package/dist/lib/utils/capabilities.d.ts.map +1 -1
  147. package/dist/lib/utils/capabilities.js +26 -2
  148. package/dist/lib/utils/capabilities.js.map +1 -1
  149. package/package.json +13 -3
@@ -0,0 +1,540 @@
1
+ "use strict";
2
+ /**
3
+ * Compliance Engine
4
+ *
5
+ * Runs all applicable capability tracks against an agent
6
+ * and reports results for every track — never stops at the first failure.
7
+ */
8
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ var desc = Object.getOwnPropertyDescriptor(m, k);
11
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
+ desc = { enumerable: true, get: function() { return m[k]; } };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ }) : (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ }));
19
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
20
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
21
+ }) : function(o, v) {
22
+ o["default"] = v;
23
+ });
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.comply = comply;
43
+ exports.formatComplianceResults = formatComplianceResults;
44
+ exports.formatComplianceResultsJSON = formatComplianceResultsJSON;
45
+ const agent_tester_1 = require("../agent-tester");
46
+ const client_1 = require("../client");
47
+ const orchestrator_1 = require("../orchestrator");
48
+ /**
49
+ * Maps each track to its constituent scenarios and a human-readable label.
50
+ */
51
+ const TRACK_DEFINITIONS = {
52
+ core: {
53
+ label: 'Core Protocol',
54
+ scenarios: ['health_check', 'discovery', 'capability_discovery', 'schema_compliance'],
55
+ },
56
+ products: {
57
+ label: 'Product Discovery',
58
+ scenarios: ['pricing_edge_cases', 'behavior_analysis', 'response_consistency'],
59
+ },
60
+ media_buy: {
61
+ label: 'Media Buy Lifecycle',
62
+ scenarios: ['create_media_buy', 'full_sales_flow', 'creative_inline', 'temporal_validation'],
63
+ },
64
+ creative: {
65
+ label: 'Creative Management',
66
+ scenarios: ['creative_sync', 'creative_flow'],
67
+ },
68
+ reporting: {
69
+ label: 'Reporting',
70
+ // full_sales_flow covers get_media_buy_delivery — but we assess it as a
71
+ // separate track concern by checking if the agent has the tool
72
+ scenarios: ['full_sales_flow'],
73
+ },
74
+ governance: {
75
+ label: 'Governance',
76
+ scenarios: ['governance_property_lists', 'governance_content_standards', 'property_list_filters'],
77
+ },
78
+ signals: {
79
+ label: 'Signals',
80
+ scenarios: ['signals_flow'],
81
+ },
82
+ si: {
83
+ label: 'Sponsored Intelligence',
84
+ scenarios: ['si_session_lifecycle', 'si_availability', 'si_handoff'],
85
+ },
86
+ audiences: {
87
+ label: 'Audience Management',
88
+ scenarios: ['sync_audiences'],
89
+ },
90
+ };
91
+ /**
92
+ * Which tools make a track "applicable" — if the agent has at least one
93
+ * of these tools, the track should be attempted.
94
+ */
95
+ const TRACK_RELEVANCE = {
96
+ core: [], // always applicable
97
+ products: ['get_products'],
98
+ media_buy: ['create_media_buy'],
99
+ creative: ['sync_creatives', 'build_creative', 'list_creative_formats'],
100
+ reporting: ['get_media_buy_delivery'],
101
+ governance: ['create_property_list', 'list_content_standards'],
102
+ signals: ['get_signals'],
103
+ si: ['si_initiate_session'],
104
+ audiences: ['sync_audiences'],
105
+ };
106
+ const TRACK_ORDER = [
107
+ 'core',
108
+ 'products',
109
+ 'media_buy',
110
+ 'creative',
111
+ 'reporting',
112
+ 'governance',
113
+ 'signals',
114
+ 'si',
115
+ 'audiences',
116
+ ];
117
+ function isTrackApplicable(track, tools) {
118
+ const relevantTools = TRACK_RELEVANCE[track];
119
+ if (relevantTools.length === 0)
120
+ return true;
121
+ return relevantTools.some(t => tools.includes(t));
122
+ }
123
+ function isAuthError(step) {
124
+ if (!step.error || step.passed)
125
+ return false;
126
+ const e = step.error.toLowerCase();
127
+ return (e.includes('authentication') ||
128
+ e.includes('x-adcp-auth') ||
129
+ e.includes('unauthorized') ||
130
+ e.includes('missing auth') ||
131
+ e.includes('401'));
132
+ }
133
+ /**
134
+ * Check if a scenario failed entirely due to auth errors.
135
+ * Returns true if every failed step is an auth error.
136
+ */
137
+ function isAuthOnlyFailure(result) {
138
+ if (result.overall_passed)
139
+ return false;
140
+ const failedSteps = (result.steps ?? []).filter(s => !s.passed);
141
+ return failedSteps.length > 0 && failedSteps.every(isAuthError);
142
+ }
143
+ function computeTrackStatus(results, skippedCount, hasAuth) {
144
+ if (results.length === 0)
145
+ return 'skip';
146
+ // When running without auth, scenarios that failed only due to auth
147
+ // don't count as failures
148
+ const effectiveResults = results.map(r => {
149
+ if (!hasAuth && isAuthOnlyFailure(r)) {
150
+ return { ...r, _authSkipped: true, overall_passed: true };
151
+ }
152
+ return r;
153
+ });
154
+ const passed = effectiveResults.filter(r => r.overall_passed).length;
155
+ const total = effectiveResults.length;
156
+ if (passed === total)
157
+ return 'pass';
158
+ if (passed === 0)
159
+ return 'fail';
160
+ return 'partial';
161
+ }
162
+ /**
163
+ * Collect advisory observations from test results.
164
+ * Analyzes the actual data for quality signals that aren't pass/fail.
165
+ */
166
+ function collectObservations(track, results, profile) {
167
+ const observations = [];
168
+ // Core track observations
169
+ if (track === 'core') {
170
+ if (!profile.adcp_version || profile.adcp_version === 'v2') {
171
+ observations.push({
172
+ category: 'best_practice',
173
+ severity: 'suggestion',
174
+ track,
175
+ message: 'Agent does not declare v3 protocol support. V3 provides richer capabilities and is recommended.',
176
+ evidence: { detected_version: profile.adcp_version || 'unknown' },
177
+ });
178
+ }
179
+ if (profile.tools.length < 3) {
180
+ observations.push({
181
+ category: 'completeness',
182
+ severity: 'info',
183
+ track,
184
+ message: `Agent exposes ${profile.tools.length} tool(s). Most production agents expose 5+.`,
185
+ evidence: { tool_count: profile.tools.length, tools: profile.tools },
186
+ });
187
+ }
188
+ }
189
+ // Products track observations
190
+ if (track === 'products') {
191
+ for (const result of results) {
192
+ for (const step of result.steps ?? []) {
193
+ if (step.response_preview && step.task === 'get_products') {
194
+ try {
195
+ const preview = JSON.parse(step.response_preview);
196
+ if (preview.products_count !== undefined) {
197
+ if (preview.products_count === 0) {
198
+ observations.push({
199
+ category: 'completeness',
200
+ severity: 'warning',
201
+ track,
202
+ message: 'Agent returned 0 products. Buyers cannot transact without product inventory.',
203
+ evidence: { products_count: 0 },
204
+ });
205
+ }
206
+ else if (preview.products_count > 50) {
207
+ observations.push({
208
+ category: 'best_practice',
209
+ severity: 'suggestion',
210
+ track,
211
+ message: `Agent returned ${preview.products_count} products for a single brief. Consider curating to 5-15 most relevant products.`,
212
+ evidence: { products_count: preview.products_count },
213
+ });
214
+ }
215
+ }
216
+ if (preview.channels && preview.channels.length === 1) {
217
+ observations.push({
218
+ category: 'completeness',
219
+ severity: 'info',
220
+ track,
221
+ message: `Agent only serves ${preview.channels[0]} channel. Multi-channel inventory broadens demand.`,
222
+ evidence: { channels: preview.channels },
223
+ });
224
+ }
225
+ }
226
+ catch {
227
+ // response_preview isn't always JSON
228
+ }
229
+ }
230
+ }
231
+ }
232
+ }
233
+ // Creative track observations
234
+ if (track === 'creative') {
235
+ const hasSync = profile.tools.includes('sync_creatives');
236
+ const hasFormats = profile.tools.includes('list_creative_formats');
237
+ if (hasSync && !hasFormats) {
238
+ observations.push({
239
+ category: 'best_practice',
240
+ severity: 'suggestion',
241
+ track,
242
+ message: 'Agent supports sync_creatives but not list_creative_formats. ' +
243
+ 'Buyers need to know what formats you accept before sending creatives.',
244
+ });
245
+ }
246
+ }
247
+ // Check for slow responses
248
+ for (const result of results) {
249
+ for (const step of result.steps ?? []) {
250
+ if (step.passed && step.duration_ms > 10000) {
251
+ observations.push({
252
+ category: 'performance',
253
+ severity: 'warning',
254
+ track,
255
+ message: `Step "${step.step}" took ${(step.duration_ms / 1000).toFixed(1)}s. Buyers expect sub-5s responses.`,
256
+ evidence: { step: step.step, duration_ms: step.duration_ms },
257
+ });
258
+ }
259
+ }
260
+ }
261
+ return observations;
262
+ }
263
+ /**
264
+ * Run compliance assessment against an agent.
265
+ * Assesses all applicable tracks independently — never stops at first failure.
266
+ */
267
+ async function comply(agentUrl, options = {}) {
268
+ const start = Date.now();
269
+ const { tracks: trackFilter, ...testOptions } = options;
270
+ const effectiveOptions = {
271
+ ...testOptions,
272
+ dry_run: testOptions.dry_run !== false,
273
+ test_session_id: testOptions.test_session_id || `comply-${Date.now()}`,
274
+ };
275
+ // Discover agent capabilities first
276
+ const client = (0, client_1.createTestClient)(agentUrl, effectiveOptions.protocol ?? 'mcp', effectiveOptions);
277
+ const { profile, step: profileStep } = await (0, client_1.discoverAgentProfile)(client);
278
+ if (!profileStep.passed) {
279
+ const errorMsg = profileStep.error || 'Unknown error';
280
+ const observations = [];
281
+ // Check for auth errors — either explicit 401/Unauthorized or MCP SDK's generic
282
+ // "Failed to discover" which often wraps a 401
283
+ const isExplicitAuthError = errorMsg.includes('401') ||
284
+ errorMsg.includes('Unauthorized') ||
285
+ errorMsg.includes('unauthorized') ||
286
+ errorMsg.includes('authentication') ||
287
+ errorMsg.includes('JWS') ||
288
+ errorMsg.includes('JWT') ||
289
+ errorMsg.includes('signature verification');
290
+ // When MCP SDK wraps the error, probe the endpoint directly
291
+ let isAuthError = isExplicitAuthError;
292
+ if (!isAuthError && errorMsg.includes('Failed to discover')) {
293
+ try {
294
+ const probe = await fetch(agentUrl, { method: 'POST', headers: { 'Content-Type': 'application/json' } });
295
+ if (probe.status === 401 || probe.status === 403) {
296
+ isAuthError = true;
297
+ }
298
+ }
299
+ catch {
300
+ // Network error — not an auth issue
301
+ }
302
+ }
303
+ const headline = isAuthError ? `Authentication required` : `Agent unreachable — ${errorMsg}`;
304
+ if (isAuthError) {
305
+ // Check if agent supports OAuth
306
+ const { discoverOAuthMetadata } = await Promise.resolve().then(() => __importStar(require('../../auth/oauth/discovery')));
307
+ const oauthMeta = await discoverOAuthMetadata(agentUrl);
308
+ if (oauthMeta) {
309
+ observations.push({
310
+ category: 'auth',
311
+ severity: 'error',
312
+ message: `Agent requires OAuth (issuer: ${oauthMeta.issuer || 'unknown'}). Save credentials: adcp --save-auth <alias> ${agentUrl} --oauth`,
313
+ });
314
+ }
315
+ else {
316
+ observations.push({
317
+ category: 'auth',
318
+ severity: 'error',
319
+ message: 'Agent returned 401. Check your --auth token.',
320
+ });
321
+ }
322
+ }
323
+ return {
324
+ agent_url: agentUrl,
325
+ agent_profile: profile,
326
+ tracks: [],
327
+ summary: {
328
+ tracks_passed: 0,
329
+ tracks_failed: 0,
330
+ tracks_skipped: 0,
331
+ tracks_partial: 0,
332
+ headline,
333
+ },
334
+ observations,
335
+ tested_at: new Date().toISOString(),
336
+ total_duration_ms: Date.now() - start,
337
+ dry_run: effectiveOptions.dry_run !== false,
338
+ };
339
+ }
340
+ const tracksToRun = trackFilter ?? TRACK_ORDER;
341
+ const trackResults = [];
342
+ const allObservations = [];
343
+ for (const track of tracksToRun) {
344
+ const def = TRACK_DEFINITIONS[track];
345
+ if (!def)
346
+ continue;
347
+ if (!isTrackApplicable(track, profile.tools)) {
348
+ trackResults.push({
349
+ track,
350
+ status: 'skip',
351
+ label: def.label,
352
+ scenarios: [],
353
+ skipped_scenarios: def.scenarios,
354
+ observations: [],
355
+ duration_ms: 0,
356
+ });
357
+ continue;
358
+ }
359
+ const trackStart = Date.now();
360
+ const applicable = (0, orchestrator_1.getApplicableScenarios)(profile.tools, def.scenarios);
361
+ const skipped = def.scenarios.filter(s => !applicable.includes(s));
362
+ // Track is relevant (agent has some related tools) but no scenarios match
363
+ // the specific tool combinations. Report as pass with an observation.
364
+ if (applicable.length === 0) {
365
+ const relevantTools = TRACK_RELEVANCE[track].filter(t => profile.tools.includes(t));
366
+ const observations = [
367
+ {
368
+ category: 'completeness',
369
+ severity: 'info',
370
+ track,
371
+ message: `Agent has ${relevantTools.join(', ')} but no test scenarios cover this tool combination. ` +
372
+ `Compliance tests exist for: ${def.scenarios.join(', ')}.`,
373
+ evidence: { tools_present: relevantTools, scenarios_available: def.scenarios },
374
+ },
375
+ ];
376
+ allObservations.push(...observations);
377
+ trackResults.push({
378
+ track,
379
+ status: 'pass',
380
+ label: def.label,
381
+ scenarios: [],
382
+ skipped_scenarios: skipped,
383
+ observations,
384
+ duration_ms: Date.now() - trackStart,
385
+ });
386
+ continue;
387
+ }
388
+ // Run each applicable scenario for this track
389
+ const results = [];
390
+ for (const scenario of applicable) {
391
+ const result = await (0, agent_tester_1.testAgent)(agentUrl, scenario, effectiveOptions);
392
+ results.push(result);
393
+ }
394
+ const observations = collectObservations(track, results, profile);
395
+ // Detect auth-only failures when running without auth
396
+ const hasAuth = !!effectiveOptions.auth;
397
+ const authSkippedScenarios = !hasAuth ? results.filter(r => isAuthOnlyFailure(r)).map(r => r.scenario) : [];
398
+ if (authSkippedScenarios.length > 0) {
399
+ observations.push({
400
+ category: 'auth',
401
+ severity: 'info',
402
+ track,
403
+ message: `${authSkippedScenarios.length} scenario(s) require authentication: ${authSkippedScenarios.join(', ')}. ` +
404
+ `Re-run with --auth to test.`,
405
+ evidence: { scenarios: authSkippedScenarios },
406
+ });
407
+ }
408
+ allObservations.push(...observations);
409
+ const status = computeTrackStatus(results, skipped.length, hasAuth);
410
+ trackResults.push({
411
+ track,
412
+ status,
413
+ label: def.label,
414
+ scenarios: results,
415
+ skipped_scenarios: skipped,
416
+ observations,
417
+ duration_ms: Date.now() - trackStart,
418
+ });
419
+ }
420
+ const summary = buildSummary(trackResults);
421
+ return {
422
+ agent_url: agentUrl,
423
+ agent_profile: profile,
424
+ tracks: trackResults,
425
+ summary,
426
+ observations: allObservations,
427
+ tested_at: new Date().toISOString(),
428
+ total_duration_ms: Date.now() - start,
429
+ dry_run: effectiveOptions.dry_run !== false,
430
+ };
431
+ }
432
+ function buildSummary(tracks) {
433
+ const passed = tracks.filter(t => t.status === 'pass').length;
434
+ const failed = tracks.filter(t => t.status === 'fail').length;
435
+ const skipped = tracks.filter(t => t.status === 'skip').length;
436
+ const partial = tracks.filter(t => t.status === 'partial').length;
437
+ const attempted = passed + failed + partial;
438
+ let headline;
439
+ if (attempted === 0) {
440
+ headline = 'No applicable tracks found for this agent';
441
+ }
442
+ else if (failed === 0 && partial === 0) {
443
+ headline = `All ${passed} track(s) pass`;
444
+ }
445
+ else if (passed === 0 && partial === 0) {
446
+ headline = `All ${failed} attempted track(s) failing`;
447
+ }
448
+ else {
449
+ const parts = [];
450
+ if (passed > 0)
451
+ parts.push(`${passed} passing`);
452
+ if (partial > 0)
453
+ parts.push(`${partial} partial`);
454
+ if (failed > 0)
455
+ parts.push(`${failed} failing`);
456
+ headline = parts.join(', ');
457
+ }
458
+ return { tracks_passed: passed, tracks_failed: failed, tracks_skipped: skipped, tracks_partial: partial, headline };
459
+ }
460
+ /**
461
+ * Format compliance results for terminal display.
462
+ */
463
+ function formatComplianceResults(result) {
464
+ let output = '';
465
+ // Header
466
+ const overallIcon = result.summary.tracks_failed === 0 && result.summary.tracks_partial === 0 ? '✅' : '❌';
467
+ output += `\n${overallIcon} AdCP Compliance Report\n`;
468
+ output += `${'─'.repeat(50)}\n`;
469
+ output += `Agent: ${result.agent_url}\n`;
470
+ output += `Name: ${result.agent_profile.name}\n`;
471
+ output += `Tools: ${result.agent_profile.tools.length}\n`;
472
+ output += `Mode: ${result.dry_run ? 'Dry Run' : 'Live'}\n`;
473
+ output += `Duration: ${(result.total_duration_ms / 1000).toFixed(1)}s\n\n`;
474
+ // Summary line
475
+ output += `${result.summary.headline}\n\n`;
476
+ // Track results
477
+ output += `Capability Tracks\n`;
478
+ output += `${'─'.repeat(50)}\n`;
479
+ for (const track of result.tracks) {
480
+ const icon = track.status === 'pass' ? '✅' : track.status === 'fail' ? '❌' : track.status === 'partial' ? '⚠️' : '⏭️';
481
+ const scenarioCount = track.scenarios.length;
482
+ const passedCount = track.scenarios.filter(s => s.overall_passed).length;
483
+ if (track.status === 'skip') {
484
+ output += `${icon} ${track.label} (not applicable)\n`;
485
+ }
486
+ else {
487
+ output += `${icon} ${track.label} ${passedCount}/${scenarioCount} scenarios pass`;
488
+ output += ` (${(track.duration_ms / 1000).toFixed(1)}s)\n`;
489
+ // Show failed scenarios with details
490
+ for (const scenario of track.scenarios) {
491
+ if (!scenario.overall_passed) {
492
+ output += ` ❌ ${scenario.scenario}\n`;
493
+ const failedSteps = (scenario.steps ?? []).filter(s => !s.passed);
494
+ for (const step of failedSteps.slice(0, 3)) {
495
+ output += ` ${step.step}`;
496
+ if (step.error)
497
+ output += `: ${step.error}`;
498
+ output += '\n';
499
+ }
500
+ if (failedSteps.length > 3) {
501
+ output += ` ... and ${failedSteps.length - 3} more\n`;
502
+ }
503
+ }
504
+ }
505
+ }
506
+ }
507
+ // Advisory observations
508
+ if (result.observations.length > 0) {
509
+ output += `\nAdvisory Observations\n`;
510
+ output += `${'─'.repeat(50)}\n`;
511
+ const byCategory = new Map();
512
+ for (const obs of result.observations) {
513
+ const cat = obs.category;
514
+ if (!byCategory.has(cat))
515
+ byCategory.set(cat, []);
516
+ byCategory.get(cat).push(obs);
517
+ }
518
+ for (const [_category, observations] of byCategory) {
519
+ for (const obs of observations) {
520
+ const icon = obs.severity === 'error'
521
+ ? '❌'
522
+ : obs.severity === 'warning'
523
+ ? '⚠️'
524
+ : obs.severity === 'suggestion'
525
+ ? '💡'
526
+ : 'ℹ️';
527
+ output += `${icon} ${obs.message}\n`;
528
+ }
529
+ }
530
+ }
531
+ output += '\n';
532
+ return output;
533
+ }
534
+ /**
535
+ * Format compliance results as JSON.
536
+ */
537
+ function formatComplianceResultsJSON(result) {
538
+ return JSON.stringify(result, null, 2);
539
+ }
540
+ //# sourceMappingURL=comply.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comply.js","sourceRoot":"","sources":["../../../../src/lib/testing/compliance/comply.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Convince Engine — AI-Assessed Merchandising Quality
3
+ *
4
+ * Runs sample briefs against an agent's get_products endpoint
5
+ * and uses an LLM to evaluate the quality of responses.
6
+ *
7
+ * comply → "Your agent works"
8
+ * convince → "Your agent sells"
9
+ */
10
+ import type { TestOptions } from '../types';
11
+ import type { ConvinceResult, ConvinceOptions } from './types';
12
+ export interface FullConvinceOptions extends TestOptions, ConvinceOptions {
13
+ }
14
+ /**
15
+ * Run convince assessment against an agent.
16
+ * Sends sample briefs, evaluates product responses with AI.
17
+ */
18
+ export declare function convince(agentUrl: string, options?: FullConvinceOptions): Promise<ConvinceResult>;
19
+ /**
20
+ * Format convince results for terminal display.
21
+ */
22
+ export declare function formatConvinceResults(result: ConvinceResult): string;
23
+ /**
24
+ * Format convince results as JSON.
25
+ */
26
+ export declare function formatConvinceResultsJSON(result: ConvinceResult): string;
27
+ //# sourceMappingURL=convince.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"convince.d.ts","sourceRoot":"","sources":["../../../../src/lib/testing/compliance/convince.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,WAAW,EAA4B,MAAM,UAAU,CAAC;AAGtE,OAAO,KAAK,EAEV,cAAc,EAMd,eAAe,EAChB,MAAM,SAAS,CAAC;AA8JjB,MAAM,WAAW,mBAAoB,SAAQ,WAAW,EAAE,eAAe;CAAG;AAE5E;;;GAGG;AACH,wBAAsB,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,mBAAwB,GAAG,OAAO,CAAC,cAAc,CAAC,CAqH3G;AA+HD;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAqDpE;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAExE"}