@adcp/client 4.9.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.
- package/bin/adcp.js +232 -0
- package/dist/lib/auth/oauth/MCPOAuthProvider.d.ts +10 -0
- package/dist/lib/auth/oauth/MCPOAuthProvider.d.ts.map +1 -1
- package/dist/lib/auth/oauth/MCPOAuthProvider.js +19 -0
- package/dist/lib/auth/oauth/MCPOAuthProvider.js.map +1 -1
- package/dist/lib/core/AgentClient.d.ts +92 -1
- package/dist/lib/core/AgentClient.d.ts.map +1 -1
- package/dist/lib/core/AgentClient.js +237 -0
- package/dist/lib/core/AgentClient.js.map +1 -1
- package/dist/lib/core/AsyncHandler.d.ts +18 -1
- package/dist/lib/core/AsyncHandler.d.ts.map +1 -1
- package/dist/lib/core/AsyncHandler.js.map +1 -1
- package/dist/lib/core/SingleAgentClient.d.ts +70 -2
- package/dist/lib/core/SingleAgentClient.d.ts.map +1 -1
- package/dist/lib/core/SingleAgentClient.js +106 -0
- package/dist/lib/core/SingleAgentClient.js.map +1 -1
- package/dist/lib/registry/types.generated.d.ts +12 -12
- package/dist/lib/registry/types.generated.js +1 -1
- package/dist/lib/testing/agent-tester.d.ts.map +1 -1
- package/dist/lib/testing/agent-tester.js.map +1 -1
- package/dist/lib/testing/client.d.ts +6 -1
- package/dist/lib/testing/client.d.ts.map +1 -1
- package/dist/lib/testing/client.js +36 -19
- package/dist/lib/testing/client.js.map +1 -1
- package/dist/lib/testing/compliance/briefs.d.ts +11 -0
- package/dist/lib/testing/compliance/briefs.d.ts.map +1 -0
- package/dist/lib/testing/compliance/briefs.js +156 -0
- package/dist/lib/testing/compliance/briefs.js.map +1 -0
- package/dist/lib/testing/compliance/comply.d.ts +28 -0
- package/dist/lib/testing/compliance/comply.d.ts.map +1 -0
- package/dist/lib/testing/compliance/comply.js +617 -0
- package/dist/lib/testing/compliance/comply.js.map +1 -0
- package/dist/lib/testing/compliance/index.d.ts +12 -0
- package/dist/lib/testing/compliance/index.d.ts.map +1 -0
- package/dist/lib/testing/compliance/index.js +20 -0
- package/dist/lib/testing/compliance/index.js.map +1 -0
- package/dist/lib/testing/compliance/profiles.d.ts +30 -0
- package/dist/lib/testing/compliance/profiles.d.ts.map +1 -0
- package/dist/lib/testing/compliance/profiles.js +388 -0
- package/dist/lib/testing/compliance/profiles.js.map +1 -0
- package/dist/lib/testing/compliance/types.d.ts +121 -0
- package/dist/lib/testing/compliance/types.d.ts.map +1 -0
- package/dist/lib/testing/compliance/types.js +6 -0
- package/dist/lib/testing/compliance/types.js.map +1 -0
- package/dist/lib/testing/index.d.ts +1 -0
- package/dist/lib/testing/index.d.ts.map +1 -1
- package/dist/lib/testing/index.js +13 -1
- package/dist/lib/testing/index.js.map +1 -1
- package/dist/lib/testing/scenarios/capabilities.d.ts.map +1 -1
- package/dist/lib/testing/scenarios/capabilities.js +14 -13
- package/dist/lib/testing/scenarios/capabilities.js.map +1 -1
- package/dist/lib/testing/scenarios/creative.d.ts.map +1 -1
- package/dist/lib/testing/scenarios/creative.js +21 -14
- package/dist/lib/testing/scenarios/creative.js.map +1 -1
- package/dist/lib/testing/scenarios/discovery.d.ts.map +1 -1
- package/dist/lib/testing/scenarios/discovery.js +7 -5
- package/dist/lib/testing/scenarios/discovery.js.map +1 -1
- package/dist/lib/testing/scenarios/edge-cases.d.ts.map +1 -1
- package/dist/lib/testing/scenarios/edge-cases.js +90 -112
- package/dist/lib/testing/scenarios/edge-cases.js.map +1 -1
- package/dist/lib/testing/scenarios/governance.d.ts.map +1 -1
- package/dist/lib/testing/scenarios/governance.js +50 -39
- package/dist/lib/testing/scenarios/governance.js.map +1 -1
- package/dist/lib/testing/scenarios/media-buy.d.ts +6 -5
- package/dist/lib/testing/scenarios/media-buy.d.ts.map +1 -1
- package/dist/lib/testing/scenarios/media-buy.js +141 -51
- package/dist/lib/testing/scenarios/media-buy.js.map +1 -1
- package/dist/lib/testing/scenarios/schema-compliance.d.ts.map +1 -1
- package/dist/lib/testing/scenarios/schema-compliance.js +26 -22
- package/dist/lib/testing/scenarios/schema-compliance.js.map +1 -1
- package/dist/lib/testing/scenarios/signals.d.ts +4 -8
- package/dist/lib/testing/scenarios/signals.d.ts.map +1 -1
- package/dist/lib/testing/scenarios/signals.js +17 -59
- package/dist/lib/testing/scenarios/signals.js.map +1 -1
- package/dist/lib/testing/scenarios/sponsored-intelligence.d.ts.map +1 -1
- package/dist/lib/testing/scenarios/sponsored-intelligence.js +23 -19
- package/dist/lib/testing/scenarios/sponsored-intelligence.js.map +1 -1
- package/dist/lib/testing/types.d.ts +2 -1
- package/dist/lib/testing/types.d.ts.map +1 -1
- package/dist/lib/types/core.generated.d.ts +22 -104
- package/dist/lib/types/core.generated.d.ts.map +1 -1
- package/dist/lib/types/core.generated.js +1 -1
- package/dist/lib/types/schemas.generated.d.ts +75 -187
- package/dist/lib/types/schemas.generated.d.ts.map +1 -1
- package/dist/lib/types/schemas.generated.js +16 -44
- package/dist/lib/types/schemas.generated.js.map +1 -1
- package/dist/lib/types/tools.generated.d.ts +23 -105
- package/dist/lib/types/tools.generated.d.ts.map +1 -1
- package/dist/lib/utils/capabilities.d.ts +1 -1
- package/dist/lib/utils/capabilities.d.ts.map +1 -1
- package/dist/lib/utils/capabilities.js +6 -6
- package/dist/lib/utils/capabilities.js.map +1 -1
- package/dist/lib/utils/request-normalizer.d.ts.map +1 -1
- package/dist/lib/utils/request-normalizer.js +12 -0
- package/dist/lib/utils/request-normalizer.js.map +1 -1
- package/dist/lib/version.d.ts +3 -3
- package/dist/lib/version.d.ts.map +1 -1
- package/dist/lib/version.js +3 -3
- package/dist/lib/version.js.map +1 -1
- package/package.json +5 -2
|
@@ -0,0 +1,617 @@
|
|
|
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
|
+
const profiles_1 = require("./profiles");
|
|
49
|
+
/**
|
|
50
|
+
* Maps each track to its constituent scenarios and a human-readable label.
|
|
51
|
+
*/
|
|
52
|
+
const TRACK_DEFINITIONS = {
|
|
53
|
+
core: {
|
|
54
|
+
label: 'Core Protocol',
|
|
55
|
+
scenarios: ['health_check', 'discovery', 'capability_discovery', 'schema_compliance'],
|
|
56
|
+
},
|
|
57
|
+
products: {
|
|
58
|
+
label: 'Product Discovery',
|
|
59
|
+
scenarios: ['pricing_edge_cases', 'behavior_analysis', 'response_consistency'],
|
|
60
|
+
},
|
|
61
|
+
media_buy: {
|
|
62
|
+
label: 'Media Buy Lifecycle',
|
|
63
|
+
scenarios: ['create_media_buy', 'full_sales_flow', 'creative_inline', 'temporal_validation'],
|
|
64
|
+
},
|
|
65
|
+
creative: {
|
|
66
|
+
label: 'Creative Management',
|
|
67
|
+
scenarios: ['creative_sync', 'creative_flow'],
|
|
68
|
+
},
|
|
69
|
+
reporting: {
|
|
70
|
+
label: 'Reporting',
|
|
71
|
+
// full_sales_flow covers get_media_buy_delivery — but we assess it as a
|
|
72
|
+
// separate track concern by checking if the agent has the tool
|
|
73
|
+
scenarios: ['full_sales_flow'],
|
|
74
|
+
},
|
|
75
|
+
governance: {
|
|
76
|
+
label: 'Governance',
|
|
77
|
+
scenarios: ['governance_property_lists', 'governance_content_standards', 'property_list_filters'],
|
|
78
|
+
},
|
|
79
|
+
signals: {
|
|
80
|
+
label: 'Signals',
|
|
81
|
+
scenarios: ['signals_flow'],
|
|
82
|
+
},
|
|
83
|
+
si: {
|
|
84
|
+
label: 'Sponsored Intelligence',
|
|
85
|
+
scenarios: ['si_session_lifecycle', 'si_availability', 'si_handoff'],
|
|
86
|
+
},
|
|
87
|
+
audiences: {
|
|
88
|
+
label: 'Audience Management',
|
|
89
|
+
scenarios: ['sync_audiences'],
|
|
90
|
+
},
|
|
91
|
+
};
|
|
92
|
+
/**
|
|
93
|
+
* Which tools make a track "applicable" — if the agent has at least one
|
|
94
|
+
* of these tools, the track should be attempted.
|
|
95
|
+
*/
|
|
96
|
+
const TRACK_RELEVANCE = {
|
|
97
|
+
core: [], // always applicable
|
|
98
|
+
products: ['get_products'],
|
|
99
|
+
media_buy: ['create_media_buy'],
|
|
100
|
+
creative: ['sync_creatives', 'build_creative', 'list_creative_formats'],
|
|
101
|
+
reporting: ['get_media_buy_delivery'],
|
|
102
|
+
governance: ['create_property_list', 'list_content_standards'],
|
|
103
|
+
signals: ['get_signals'],
|
|
104
|
+
si: ['si_initiate_session'],
|
|
105
|
+
audiences: ['sync_audiences'],
|
|
106
|
+
};
|
|
107
|
+
const TRACK_ORDER = [
|
|
108
|
+
'core',
|
|
109
|
+
'products',
|
|
110
|
+
'media_buy',
|
|
111
|
+
'creative',
|
|
112
|
+
'reporting',
|
|
113
|
+
'governance',
|
|
114
|
+
'signals',
|
|
115
|
+
'si',
|
|
116
|
+
'audiences',
|
|
117
|
+
];
|
|
118
|
+
function isTrackApplicable(track, tools) {
|
|
119
|
+
const relevantTools = TRACK_RELEVANCE[track];
|
|
120
|
+
if (relevantTools.length === 0)
|
|
121
|
+
return true;
|
|
122
|
+
return relevantTools.some(t => tools.includes(t));
|
|
123
|
+
}
|
|
124
|
+
function isAuthError(step) {
|
|
125
|
+
if (!step.error || step.passed)
|
|
126
|
+
return false;
|
|
127
|
+
const e = step.error.toLowerCase();
|
|
128
|
+
return (e.includes('authentication') ||
|
|
129
|
+
e.includes('x-adcp-auth') ||
|
|
130
|
+
e.includes('unauthorized') ||
|
|
131
|
+
e.includes('missing auth') ||
|
|
132
|
+
e.includes('401'));
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Check if a scenario failed entirely due to auth errors.
|
|
136
|
+
* Returns true if every failed step is an auth error.
|
|
137
|
+
*/
|
|
138
|
+
function isAuthOnlyFailure(result) {
|
|
139
|
+
if (result.overall_passed)
|
|
140
|
+
return false;
|
|
141
|
+
const failedSteps = (result.steps ?? []).filter(s => !s.passed);
|
|
142
|
+
return failedSteps.length > 0 && failedSteps.every(isAuthError);
|
|
143
|
+
}
|
|
144
|
+
function computeTrackStatus(results, skippedCount, hasAuth) {
|
|
145
|
+
if (results.length === 0)
|
|
146
|
+
return 'skip';
|
|
147
|
+
// When running without auth, scenarios that failed only due to auth
|
|
148
|
+
// don't count as failures
|
|
149
|
+
const effectiveResults = results.map(r => {
|
|
150
|
+
if (!hasAuth && isAuthOnlyFailure(r)) {
|
|
151
|
+
return { ...r, _authSkipped: true, overall_passed: true };
|
|
152
|
+
}
|
|
153
|
+
return r;
|
|
154
|
+
});
|
|
155
|
+
const passed = effectiveResults.filter(r => r.overall_passed).length;
|
|
156
|
+
const total = effectiveResults.length;
|
|
157
|
+
if (passed === total)
|
|
158
|
+
return 'pass';
|
|
159
|
+
if (passed === 0)
|
|
160
|
+
return 'fail';
|
|
161
|
+
return 'partial';
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Collect advisory observations from test results.
|
|
165
|
+
* Analyzes the actual data for quality signals that aren't pass/fail.
|
|
166
|
+
*/
|
|
167
|
+
function collectObservations(track, results, profile) {
|
|
168
|
+
const observations = [];
|
|
169
|
+
// Core track observations
|
|
170
|
+
if (track === 'core') {
|
|
171
|
+
if (!profile.adcp_version || profile.adcp_version === 'v2') {
|
|
172
|
+
observations.push({
|
|
173
|
+
category: 'best_practice',
|
|
174
|
+
severity: 'suggestion',
|
|
175
|
+
track,
|
|
176
|
+
message: 'Agent does not declare v3 protocol support. V3 provides richer capabilities and is recommended.',
|
|
177
|
+
evidence: { detected_version: profile.adcp_version || 'unknown' },
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
if (profile.tools.length < 3) {
|
|
181
|
+
observations.push({
|
|
182
|
+
category: 'completeness',
|
|
183
|
+
severity: 'info',
|
|
184
|
+
track,
|
|
185
|
+
message: `Agent exposes ${profile.tools.length} tool(s). Most production agents expose 5+.`,
|
|
186
|
+
evidence: { tool_count: profile.tools.length, tools: profile.tools },
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
// Products track observations
|
|
191
|
+
if (track === 'products') {
|
|
192
|
+
for (const result of results) {
|
|
193
|
+
for (const step of result.steps ?? []) {
|
|
194
|
+
if (step.response_preview && step.task === 'get_products') {
|
|
195
|
+
try {
|
|
196
|
+
const preview = JSON.parse(step.response_preview);
|
|
197
|
+
if (preview.products_count !== undefined) {
|
|
198
|
+
if (preview.products_count === 0) {
|
|
199
|
+
observations.push({
|
|
200
|
+
category: 'completeness',
|
|
201
|
+
severity: 'warning',
|
|
202
|
+
track,
|
|
203
|
+
message: 'Agent returned 0 products. Buyers cannot transact without product inventory.',
|
|
204
|
+
evidence: { products_count: 0 },
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
else if (preview.products_count > 50) {
|
|
208
|
+
observations.push({
|
|
209
|
+
category: 'best_practice',
|
|
210
|
+
severity: 'suggestion',
|
|
211
|
+
track,
|
|
212
|
+
message: `Agent returned ${preview.products_count} products for a single brief. Consider curating to 5-15 most relevant products.`,
|
|
213
|
+
evidence: { products_count: preview.products_count },
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
if (preview.channels && preview.channels.length === 1) {
|
|
218
|
+
observations.push({
|
|
219
|
+
category: 'completeness',
|
|
220
|
+
severity: 'info',
|
|
221
|
+
track,
|
|
222
|
+
message: `Agent only serves ${preview.channels[0]} channel. Multi-channel inventory broadens demand.`,
|
|
223
|
+
evidence: { channels: preview.channels },
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
catch {
|
|
228
|
+
// response_preview isn't always JSON
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
// Creative track observations
|
|
235
|
+
if (track === 'creative') {
|
|
236
|
+
const hasSync = profile.tools.includes('sync_creatives');
|
|
237
|
+
const hasFormats = profile.tools.includes('list_creative_formats');
|
|
238
|
+
if (hasSync && !hasFormats) {
|
|
239
|
+
observations.push({
|
|
240
|
+
category: 'best_practice',
|
|
241
|
+
severity: 'suggestion',
|
|
242
|
+
track,
|
|
243
|
+
message: 'Agent supports sync_creatives but not list_creative_formats. ' +
|
|
244
|
+
'Buyers need to know what formats you accept before sending creatives.',
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
// Check for slow responses
|
|
249
|
+
for (const result of results) {
|
|
250
|
+
for (const step of result.steps ?? []) {
|
|
251
|
+
if (step.passed && step.duration_ms > 10000) {
|
|
252
|
+
observations.push({
|
|
253
|
+
category: 'performance',
|
|
254
|
+
severity: 'warning',
|
|
255
|
+
track,
|
|
256
|
+
message: `Step "${step.step}" took ${(step.duration_ms / 1000).toFixed(1)}s. Buyers expect sub-5s responses.`,
|
|
257
|
+
evidence: { step: step.step, duration_ms: step.duration_ms },
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
return observations;
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Run compliance assessment against an agent.
|
|
266
|
+
* Assesses all applicable tracks independently — never stops at first failure.
|
|
267
|
+
*/
|
|
268
|
+
async function comply(agentUrl, options = {}) {
|
|
269
|
+
const start = Date.now();
|
|
270
|
+
const { tracks: trackFilter, platform_type, ...testOptions } = options;
|
|
271
|
+
const platformProfile = platform_type ? (0, profiles_1.getPlatformProfile)(platform_type) : undefined;
|
|
272
|
+
const effectiveOptions = {
|
|
273
|
+
...testOptions,
|
|
274
|
+
dry_run: testOptions.dry_run !== false,
|
|
275
|
+
test_session_id: testOptions.test_session_id || `comply-${Date.now()}`,
|
|
276
|
+
};
|
|
277
|
+
// Discover agent capabilities first
|
|
278
|
+
const client = (0, client_1.createTestClient)(agentUrl, effectiveOptions.protocol ?? 'mcp', effectiveOptions);
|
|
279
|
+
const { profile, step: profileStep } = await (0, client_1.discoverAgentProfile)(client);
|
|
280
|
+
if (!profileStep.passed) {
|
|
281
|
+
const errorMsg = profileStep.error || 'Unknown error';
|
|
282
|
+
const observations = [];
|
|
283
|
+
// Check for auth errors — either explicit 401/Unauthorized or MCP SDK's generic
|
|
284
|
+
// "Failed to discover" which often wraps a 401
|
|
285
|
+
const isExplicitAuthError = errorMsg.includes('401') ||
|
|
286
|
+
errorMsg.includes('Unauthorized') ||
|
|
287
|
+
errorMsg.includes('unauthorized') ||
|
|
288
|
+
errorMsg.includes('authentication') ||
|
|
289
|
+
errorMsg.includes('JWS') ||
|
|
290
|
+
errorMsg.includes('JWT') ||
|
|
291
|
+
errorMsg.includes('signature verification');
|
|
292
|
+
// When MCP SDK wraps the error, probe the endpoint directly
|
|
293
|
+
let isAuthError = isExplicitAuthError;
|
|
294
|
+
if (!isAuthError && errorMsg.includes('Failed to discover')) {
|
|
295
|
+
try {
|
|
296
|
+
const probe = await fetch(agentUrl, { method: 'POST', headers: { 'Content-Type': 'application/json' } });
|
|
297
|
+
if (probe.status === 401 || probe.status === 403) {
|
|
298
|
+
isAuthError = true;
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
catch {
|
|
302
|
+
// Network error — not an auth issue
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
const headline = isAuthError ? `Authentication required` : `Agent unreachable — ${errorMsg}`;
|
|
306
|
+
if (isAuthError) {
|
|
307
|
+
// Check if agent supports OAuth
|
|
308
|
+
const { discoverOAuthMetadata } = await Promise.resolve().then(() => __importStar(require('../../auth/oauth/discovery')));
|
|
309
|
+
const oauthMeta = await discoverOAuthMetadata(agentUrl);
|
|
310
|
+
if (oauthMeta) {
|
|
311
|
+
observations.push({
|
|
312
|
+
category: 'auth',
|
|
313
|
+
severity: 'error',
|
|
314
|
+
message: `Agent requires OAuth (issuer: ${oauthMeta.issuer || 'unknown'}). Save credentials: adcp --save-auth <alias> ${agentUrl} --oauth`,
|
|
315
|
+
});
|
|
316
|
+
}
|
|
317
|
+
else {
|
|
318
|
+
observations.push({
|
|
319
|
+
category: 'auth',
|
|
320
|
+
severity: 'error',
|
|
321
|
+
message: 'Agent returned 401. Check your --auth token.',
|
|
322
|
+
});
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
return {
|
|
326
|
+
agent_url: agentUrl,
|
|
327
|
+
agent_profile: profile,
|
|
328
|
+
tracks: [],
|
|
329
|
+
summary: {
|
|
330
|
+
tracks_passed: 0,
|
|
331
|
+
tracks_failed: 0,
|
|
332
|
+
tracks_skipped: 0,
|
|
333
|
+
tracks_partial: 0,
|
|
334
|
+
tracks_expected: 0,
|
|
335
|
+
headline,
|
|
336
|
+
},
|
|
337
|
+
observations,
|
|
338
|
+
tested_at: new Date().toISOString(),
|
|
339
|
+
total_duration_ms: Date.now() - start,
|
|
340
|
+
dry_run: effectiveOptions.dry_run !== false,
|
|
341
|
+
};
|
|
342
|
+
}
|
|
343
|
+
const tracksToRun = trackFilter ?? TRACK_ORDER;
|
|
344
|
+
const trackResults = [];
|
|
345
|
+
const allObservations = [];
|
|
346
|
+
for (const track of tracksToRun) {
|
|
347
|
+
const def = TRACK_DEFINITIONS[track];
|
|
348
|
+
if (!def)
|
|
349
|
+
continue;
|
|
350
|
+
if (!isTrackApplicable(track, profile.tools)) {
|
|
351
|
+
const isExpected = track !== 'core' && (platformProfile?.expected_tracks.includes(track) ?? false);
|
|
352
|
+
trackResults.push({
|
|
353
|
+
track,
|
|
354
|
+
status: isExpected ? 'expected' : 'skip',
|
|
355
|
+
label: def.label,
|
|
356
|
+
scenarios: [],
|
|
357
|
+
skipped_scenarios: def.scenarios,
|
|
358
|
+
observations: [],
|
|
359
|
+
duration_ms: 0,
|
|
360
|
+
});
|
|
361
|
+
continue;
|
|
362
|
+
}
|
|
363
|
+
const trackStart = Date.now();
|
|
364
|
+
const applicable = (0, orchestrator_1.getApplicableScenarios)(profile.tools, def.scenarios);
|
|
365
|
+
const skipped = def.scenarios.filter(s => !applicable.includes(s));
|
|
366
|
+
// Track is relevant (agent has some related tools) but no scenarios match
|
|
367
|
+
// the specific tool combinations. Report as pass with an observation.
|
|
368
|
+
if (applicable.length === 0) {
|
|
369
|
+
const relevantTools = TRACK_RELEVANCE[track].filter(t => profile.tools.includes(t));
|
|
370
|
+
const observations = [
|
|
371
|
+
{
|
|
372
|
+
category: 'completeness',
|
|
373
|
+
severity: 'info',
|
|
374
|
+
track,
|
|
375
|
+
message: `Agent has ${relevantTools.join(', ')} but no test scenarios cover this tool combination. ` +
|
|
376
|
+
`Compliance tests exist for: ${def.scenarios.join(', ')}.`,
|
|
377
|
+
evidence: { tools_present: relevantTools, scenarios_available: def.scenarios },
|
|
378
|
+
},
|
|
379
|
+
];
|
|
380
|
+
allObservations.push(...observations);
|
|
381
|
+
trackResults.push({
|
|
382
|
+
track,
|
|
383
|
+
status: 'pass',
|
|
384
|
+
label: def.label,
|
|
385
|
+
scenarios: [],
|
|
386
|
+
skipped_scenarios: skipped,
|
|
387
|
+
observations,
|
|
388
|
+
duration_ms: Date.now() - trackStart,
|
|
389
|
+
});
|
|
390
|
+
continue;
|
|
391
|
+
}
|
|
392
|
+
// Run each applicable scenario for this track
|
|
393
|
+
const results = [];
|
|
394
|
+
for (const scenario of applicable) {
|
|
395
|
+
const result = await (0, agent_tester_1.testAgent)(agentUrl, scenario, effectiveOptions);
|
|
396
|
+
results.push(result);
|
|
397
|
+
}
|
|
398
|
+
const observations = collectObservations(track, results, profile);
|
|
399
|
+
// Detect auth-only failures when running without auth
|
|
400
|
+
const hasAuth = !!effectiveOptions.auth;
|
|
401
|
+
const authSkippedScenarios = !hasAuth ? results.filter(r => isAuthOnlyFailure(r)).map(r => r.scenario) : [];
|
|
402
|
+
if (authSkippedScenarios.length > 0) {
|
|
403
|
+
observations.push({
|
|
404
|
+
category: 'auth',
|
|
405
|
+
severity: 'info',
|
|
406
|
+
track,
|
|
407
|
+
message: `${authSkippedScenarios.length} scenario(s) require authentication: ${authSkippedScenarios.join(', ')}. ` +
|
|
408
|
+
`Re-run with --auth to test.`,
|
|
409
|
+
evidence: { scenarios: authSkippedScenarios },
|
|
410
|
+
});
|
|
411
|
+
}
|
|
412
|
+
allObservations.push(...observations);
|
|
413
|
+
const status = computeTrackStatus(results, skipped.length, hasAuth);
|
|
414
|
+
trackResults.push({
|
|
415
|
+
track,
|
|
416
|
+
status,
|
|
417
|
+
label: def.label,
|
|
418
|
+
scenarios: results,
|
|
419
|
+
skipped_scenarios: skipped,
|
|
420
|
+
observations,
|
|
421
|
+
duration_ms: Date.now() - trackStart,
|
|
422
|
+
});
|
|
423
|
+
}
|
|
424
|
+
// Build platform coherence result if platform type was declared
|
|
425
|
+
let platformCoherence;
|
|
426
|
+
if (platformProfile) {
|
|
427
|
+
const findings = platformProfile.checkCoherence(profile);
|
|
428
|
+
const missingTracks = platformProfile.expected_tracks.filter(t => !isTrackApplicable(t, profile.tools) && t !== 'core');
|
|
429
|
+
// Add coherence findings as observations
|
|
430
|
+
for (const finding of findings) {
|
|
431
|
+
allObservations.push({
|
|
432
|
+
category: 'coherence',
|
|
433
|
+
severity: finding.severity,
|
|
434
|
+
message: `${finding.expected} — ${finding.actual}. ${finding.guidance}`,
|
|
435
|
+
evidence: { platform_type: platformProfile.type },
|
|
436
|
+
});
|
|
437
|
+
}
|
|
438
|
+
platformCoherence = {
|
|
439
|
+
platform_type: platformProfile.type,
|
|
440
|
+
label: platformProfile.label,
|
|
441
|
+
expected_tracks: platformProfile.expected_tracks,
|
|
442
|
+
missing_tracks: missingTracks,
|
|
443
|
+
findings,
|
|
444
|
+
coherent: findings.filter(f => f.severity === 'error' || f.severity === 'warning').length === 0 &&
|
|
445
|
+
missingTracks.length === 0,
|
|
446
|
+
};
|
|
447
|
+
}
|
|
448
|
+
const summary = buildSummary(trackResults);
|
|
449
|
+
return {
|
|
450
|
+
agent_url: agentUrl,
|
|
451
|
+
agent_profile: profile,
|
|
452
|
+
tracks: trackResults,
|
|
453
|
+
summary,
|
|
454
|
+
observations: allObservations,
|
|
455
|
+
platform_coherence: platformCoherence,
|
|
456
|
+
tested_at: new Date().toISOString(),
|
|
457
|
+
total_duration_ms: Date.now() - start,
|
|
458
|
+
dry_run: effectiveOptions.dry_run !== false,
|
|
459
|
+
};
|
|
460
|
+
}
|
|
461
|
+
function buildSummary(tracks) {
|
|
462
|
+
const passed = tracks.filter(t => t.status === 'pass').length;
|
|
463
|
+
const failed = tracks.filter(t => t.status === 'fail').length;
|
|
464
|
+
const skipped = tracks.filter(t => t.status === 'skip').length;
|
|
465
|
+
const partial = tracks.filter(t => t.status === 'partial').length;
|
|
466
|
+
const expected = tracks.filter(t => t.status === 'expected').length;
|
|
467
|
+
const attempted = passed + failed + partial;
|
|
468
|
+
let headline;
|
|
469
|
+
if (attempted === 0) {
|
|
470
|
+
headline = 'No applicable tracks found for this agent';
|
|
471
|
+
}
|
|
472
|
+
else if (failed === 0 && partial === 0) {
|
|
473
|
+
headline = `All ${passed} track(s) pass`;
|
|
474
|
+
}
|
|
475
|
+
else if (passed === 0 && partial === 0) {
|
|
476
|
+
headline = `All ${failed} attempted track(s) failing`;
|
|
477
|
+
}
|
|
478
|
+
else {
|
|
479
|
+
const parts = [];
|
|
480
|
+
if (passed > 0)
|
|
481
|
+
parts.push(`${passed} passing`);
|
|
482
|
+
if (partial > 0)
|
|
483
|
+
parts.push(`${partial} partial`);
|
|
484
|
+
if (failed > 0)
|
|
485
|
+
parts.push(`${failed} failing`);
|
|
486
|
+
headline = parts.join(', ');
|
|
487
|
+
}
|
|
488
|
+
if (expected > 0) {
|
|
489
|
+
headline += `, ${expected} expected`;
|
|
490
|
+
}
|
|
491
|
+
return {
|
|
492
|
+
tracks_passed: passed,
|
|
493
|
+
tracks_failed: failed,
|
|
494
|
+
tracks_skipped: skipped,
|
|
495
|
+
tracks_partial: partial,
|
|
496
|
+
tracks_expected: expected,
|
|
497
|
+
headline,
|
|
498
|
+
};
|
|
499
|
+
}
|
|
500
|
+
/**
|
|
501
|
+
* Format compliance results for terminal display.
|
|
502
|
+
*/
|
|
503
|
+
function formatComplianceResults(result) {
|
|
504
|
+
let output = '';
|
|
505
|
+
// Header
|
|
506
|
+
const overallIcon = result.summary.tracks_failed === 0 && result.summary.tracks_partial === 0 ? '✅' : '❌';
|
|
507
|
+
output += `\n${overallIcon} AdCP Compliance Report\n`;
|
|
508
|
+
output += `${'─'.repeat(50)}\n`;
|
|
509
|
+
output += `Agent: ${result.agent_url}\n`;
|
|
510
|
+
output += `Name: ${result.agent_profile.name}\n`;
|
|
511
|
+
output += `Tools: ${result.agent_profile.tools.length}\n`;
|
|
512
|
+
output += `Mode: ${result.dry_run ? 'Dry Run' : 'Live'}\n`;
|
|
513
|
+
if (result.platform_coherence) {
|
|
514
|
+
output += `Platform: ${result.platform_coherence.label}\n`;
|
|
515
|
+
}
|
|
516
|
+
output += `Duration: ${(result.total_duration_ms / 1000).toFixed(1)}s\n\n`;
|
|
517
|
+
// Summary line
|
|
518
|
+
output += `${result.summary.headline}\n\n`;
|
|
519
|
+
// Track results
|
|
520
|
+
output += `Capability Tracks\n`;
|
|
521
|
+
output += `${'─'.repeat(50)}\n`;
|
|
522
|
+
for (const track of result.tracks) {
|
|
523
|
+
const icon = track.status === 'pass'
|
|
524
|
+
? '✅'
|
|
525
|
+
: track.status === 'fail'
|
|
526
|
+
? '❌'
|
|
527
|
+
: track.status === 'partial'
|
|
528
|
+
? '⚠️'
|
|
529
|
+
: track.status === 'expected'
|
|
530
|
+
? '🔲'
|
|
531
|
+
: '⏭️';
|
|
532
|
+
const scenarioCount = track.scenarios.length;
|
|
533
|
+
const passedCount = track.scenarios.filter(s => s.overall_passed).length;
|
|
534
|
+
if (track.status === 'skip') {
|
|
535
|
+
output += `${icon} ${track.label} (not applicable)\n`;
|
|
536
|
+
}
|
|
537
|
+
else if (track.status === 'expected') {
|
|
538
|
+
const label = result.platform_coherence?.label ?? 'declared platform type';
|
|
539
|
+
output += `${icon} ${track.label} (expected for ${label})\n`;
|
|
540
|
+
}
|
|
541
|
+
else {
|
|
542
|
+
output += `${icon} ${track.label} ${passedCount}/${scenarioCount} scenarios pass`;
|
|
543
|
+
output += ` (${(track.duration_ms / 1000).toFixed(1)}s)\n`;
|
|
544
|
+
// Show failed scenarios with details
|
|
545
|
+
for (const scenario of track.scenarios) {
|
|
546
|
+
if (!scenario.overall_passed) {
|
|
547
|
+
output += ` ❌ ${scenario.scenario}\n`;
|
|
548
|
+
const failedSteps = (scenario.steps ?? []).filter(s => !s.passed);
|
|
549
|
+
for (const step of failedSteps.slice(0, 3)) {
|
|
550
|
+
output += ` ${step.step}`;
|
|
551
|
+
if (step.error)
|
|
552
|
+
output += `: ${step.error}`;
|
|
553
|
+
output += '\n';
|
|
554
|
+
}
|
|
555
|
+
if (failedSteps.length > 3) {
|
|
556
|
+
output += ` ... and ${failedSteps.length - 3} more\n`;
|
|
557
|
+
}
|
|
558
|
+
}
|
|
559
|
+
}
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
// Platform coherence
|
|
563
|
+
if (result.platform_coherence) {
|
|
564
|
+
const pc = result.platform_coherence;
|
|
565
|
+
output += `\nPlatform Coherence (${pc.label})\n`;
|
|
566
|
+
output += `${'─'.repeat(50)}\n`;
|
|
567
|
+
if (pc.coherent) {
|
|
568
|
+
output += `✅ Agent is coherent with ${pc.label} expectations\n`;
|
|
569
|
+
}
|
|
570
|
+
else {
|
|
571
|
+
if (pc.missing_tracks.length > 0) {
|
|
572
|
+
output += `Expected tracks: ${pc.expected_tracks.join(', ')}\n`;
|
|
573
|
+
output += `Missing tracks: ${pc.missing_tracks.join(', ')}\n\n`;
|
|
574
|
+
}
|
|
575
|
+
for (const finding of pc.findings) {
|
|
576
|
+
const icon = finding.severity === 'error' ? '❌' : finding.severity === 'warning' ? '⚠️' : '💡';
|
|
577
|
+
output += `${icon} ${finding.expected}\n`;
|
|
578
|
+
output += ` ${finding.actual}\n`;
|
|
579
|
+
output += ` → ${finding.guidance}\n`;
|
|
580
|
+
}
|
|
581
|
+
}
|
|
582
|
+
}
|
|
583
|
+
// Advisory observations (excluding coherence — shown above)
|
|
584
|
+
const nonCoherenceObs = result.observations.filter(o => o.category !== 'coherence');
|
|
585
|
+
if (nonCoherenceObs.length > 0) {
|
|
586
|
+
output += `\nAdvisory Observations\n`;
|
|
587
|
+
output += `${'─'.repeat(50)}\n`;
|
|
588
|
+
const byCategory = new Map();
|
|
589
|
+
for (const obs of nonCoherenceObs) {
|
|
590
|
+
const cat = obs.category;
|
|
591
|
+
if (!byCategory.has(cat))
|
|
592
|
+
byCategory.set(cat, []);
|
|
593
|
+
byCategory.get(cat).push(obs);
|
|
594
|
+
}
|
|
595
|
+
for (const [_category, observations] of byCategory) {
|
|
596
|
+
for (const obs of observations) {
|
|
597
|
+
const icon = obs.severity === 'error'
|
|
598
|
+
? '❌'
|
|
599
|
+
: obs.severity === 'warning'
|
|
600
|
+
? '⚠️'
|
|
601
|
+
: obs.severity === 'suggestion'
|
|
602
|
+
? '💡'
|
|
603
|
+
: 'ℹ️';
|
|
604
|
+
output += `${icon} ${obs.message}\n`;
|
|
605
|
+
}
|
|
606
|
+
}
|
|
607
|
+
}
|
|
608
|
+
output += '\n';
|
|
609
|
+
return output;
|
|
610
|
+
}
|
|
611
|
+
/**
|
|
612
|
+
* Format compliance results as JSON.
|
|
613
|
+
*/
|
|
614
|
+
function formatComplianceResultsJSON(result) {
|
|
615
|
+
return JSON.stringify(result, null, 2);
|
|
616
|
+
}
|
|
617
|
+
//# 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,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AdCP Compliance Assessment
|
|
3
|
+
*
|
|
4
|
+
* comply → "Your agent works" (deterministic, per-track)
|
|
5
|
+
*/
|
|
6
|
+
export { comply, formatComplianceResults, formatComplianceResultsJSON } from './comply';
|
|
7
|
+
export type { ComplyOptions } from './comply';
|
|
8
|
+
export { SAMPLE_BRIEFS, getBriefById, getBriefsByVertical } from './briefs';
|
|
9
|
+
export { getPlatformProfile, getAllPlatformTypes } from './profiles';
|
|
10
|
+
export type { PlatformProfile } from './profiles';
|
|
11
|
+
export type { ComplianceTrack, TrackResult, TrackStatus, ComplianceResult, ComplianceSummary, AdvisoryObservation, ObservationCategory, ObservationSeverity, SampleBrief, PlatformType, SalesPlatformType, CreativeAgentType, SponsoredIntelligenceType, AINativePlatformType, CoherenceFinding, PlatformCoherenceResult, } from './types';
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lib/testing/compliance/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,EAAE,uBAAuB,EAAE,2BAA2B,EAAE,MAAM,UAAU,CAAC;AACxF,YAAY,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE9C,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAE5E,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACrE,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,YAAY,EACV,eAAe,EACf,WAAW,EACX,WAAW,EACX,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACnB,WAAW,EACX,YAAY,EACZ,iBAAiB,EACjB,iBAAiB,EACjB,yBAAyB,EACzB,oBAAoB,EACpB,gBAAgB,EAChB,uBAAuB,GACxB,MAAM,SAAS,CAAC"}
|