@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.
- package/bin/adcp.js +346 -0
- package/dist/lib/adapters/governance-adapter.d.ts +88 -0
- package/dist/lib/adapters/governance-adapter.d.ts.map +1 -0
- package/dist/lib/adapters/governance-adapter.js +96 -0
- package/dist/lib/adapters/governance-adapter.js.map +1 -0
- package/dist/lib/adapters/index.d.ts +1 -0
- package/dist/lib/adapters/index.d.ts.map +1 -1
- package/dist/lib/adapters/index.js +7 -1
- package/dist/lib/adapters/index.js.map +1 -1
- package/dist/lib/agents/index.generated.d.ts +33 -1
- package/dist/lib/agents/index.generated.d.ts.map +1 -1
- package/dist/lib/agents/index.generated.js +48 -0
- package/dist/lib/agents/index.generated.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 +19 -2
- package/dist/lib/core/AsyncHandler.d.ts.map +1 -1
- package/dist/lib/core/AsyncHandler.js.map +1 -1
- package/dist/lib/core/ConversationTypes.d.ts +8 -2
- package/dist/lib/core/ConversationTypes.d.ts.map +1 -1
- package/dist/lib/core/GovernanceMiddleware.d.ts +86 -0
- package/dist/lib/core/GovernanceMiddleware.d.ts.map +1 -0
- package/dist/lib/core/GovernanceMiddleware.js +289 -0
- package/dist/lib/core/GovernanceMiddleware.js.map +1 -0
- package/dist/lib/core/GovernanceTypes.d.ts +118 -0
- package/dist/lib/core/GovernanceTypes.d.ts.map +1 -0
- package/dist/lib/core/GovernanceTypes.js +69 -0
- package/dist/lib/core/GovernanceTypes.js.map +1 -0
- package/dist/lib/core/SingleAgentClient.d.ts +103 -1
- package/dist/lib/core/SingleAgentClient.d.ts.map +1 -1
- package/dist/lib/core/SingleAgentClient.js +151 -0
- package/dist/lib/core/SingleAgentClient.js.map +1 -1
- package/dist/lib/core/TaskExecutor.d.ts +10 -0
- package/dist/lib/core/TaskExecutor.d.ts.map +1 -1
- package/dist/lib/core/TaskExecutor.js +95 -10
- package/dist/lib/core/TaskExecutor.js.map +1 -1
- package/dist/lib/index.d.ts +6 -2
- package/dist/lib/index.d.ts.map +1 -1
- package/dist/lib/index.js +22 -4
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/observability/index.d.ts +8 -0
- package/dist/lib/observability/index.d.ts.map +1 -0
- package/dist/lib/observability/index.js +17 -0
- package/dist/lib/observability/index.js.map +1 -0
- package/dist/lib/observability/tracing.d.ts +42 -0
- package/dist/lib/observability/tracing.d.ts.map +1 -0
- package/dist/lib/observability/tracing.js +126 -0
- package/dist/lib/observability/tracing.js.map +1 -0
- package/dist/lib/protocols/a2a.d.ts.map +1 -1
- package/dist/lib/protocols/a2a.js +16 -1
- package/dist/lib/protocols/a2a.js.map +1 -1
- package/dist/lib/protocols/index.d.ts.map +1 -1
- package/dist/lib/protocols/index.js +37 -29
- package/dist/lib/protocols/index.js.map +1 -1
- package/dist/lib/protocols/mcp.d.ts.map +1 -1
- package/dist/lib/protocols/mcp.js +21 -1
- package/dist/lib/protocols/mcp.js.map +1 -1
- package/dist/lib/registry/types.generated.d.ts +754 -5
- package/dist/lib/registry/types.generated.d.ts.map +1 -1
- package/dist/lib/registry/types.generated.js +1 -1
- package/dist/lib/testing/agent-tester.d.ts +1 -1
- package/dist/lib/testing/agent-tester.d.ts.map +1 -1
- package/dist/lib/testing/agent-tester.js +36 -11
- 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 +12 -0
- package/dist/lib/testing/compliance/briefs.d.ts.map +1 -0
- package/dist/lib/testing/compliance/briefs.js +157 -0
- package/dist/lib/testing/compliance/briefs.js.map +1 -0
- package/dist/lib/testing/compliance/comply.d.ts +26 -0
- package/dist/lib/testing/compliance/comply.d.ts.map +1 -0
- package/dist/lib/testing/compliance/comply.js +540 -0
- package/dist/lib/testing/compliance/comply.js.map +1 -0
- package/dist/lib/testing/compliance/convince.d.ts +27 -0
- package/dist/lib/testing/compliance/convince.d.ts.map +1 -0
- package/dist/lib/testing/compliance/convince.js +418 -0
- package/dist/lib/testing/compliance/convince.js.map +1 -0
- package/dist/lib/testing/compliance/index.d.ts +13 -0
- package/dist/lib/testing/compliance/index.d.ts.map +1 -0
- package/dist/lib/testing/compliance/index.js +22 -0
- package/dist/lib/testing/compliance/index.js.map +1 -0
- package/dist/lib/testing/compliance/types.d.ts +123 -0
- package/dist/lib/testing/compliance/types.d.ts.map +1 -0
- package/dist/lib/testing/compliance/types.js +9 -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 +15 -1
- package/dist/lib/testing/index.js.map +1 -1
- package/dist/lib/testing/orchestrator.d.ts +0 -2
- package/dist/lib/testing/orchestrator.d.ts.map +1 -1
- package/dist/lib/testing/orchestrator.js +14 -3
- package/dist/lib/testing/orchestrator.js.map +1 -1
- package/dist/lib/testing/scenarios/capabilities.d.ts.map +1 -1
- package/dist/lib/testing/scenarios/capabilities.js +70 -9
- package/dist/lib/testing/scenarios/capabilities.js.map +1 -1
- package/dist/lib/testing/scenarios/creative.d.ts +14 -0
- package/dist/lib/testing/scenarios/creative.d.ts.map +1 -1
- package/dist/lib/testing/scenarios/creative.js +261 -55
- 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 +48 -0
- package/dist/lib/testing/scenarios/governance.d.ts.map +1 -1
- package/dist/lib/testing/scenarios/governance.js +725 -39
- package/dist/lib/testing/scenarios/governance.js.map +1 -1
- package/dist/lib/testing/scenarios/index.d.ts +3 -3
- package/dist/lib/testing/scenarios/index.d.ts.map +1 -1
- package/dist/lib/testing/scenarios/index.js +8 -1
- package/dist/lib/testing/scenarios/index.js.map +1 -1
- package/dist/lib/testing/scenarios/media-buy.d.ts +14 -5
- package/dist/lib/testing/scenarios/media-buy.d.ts.map +1 -1
- package/dist/lib/testing/scenarios/media-buy.js +358 -63
- 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 +3 -2
- package/dist/lib/testing/types.d.ts.map +1 -1
- package/dist/lib/types/core.generated.d.ts +629 -5
- 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 +13059 -11101
- package/dist/lib/types/schemas.generated.d.ts.map +1 -1
- package/dist/lib/types/schemas.generated.js +573 -107
- package/dist/lib/types/schemas.generated.js.map +1 -1
- package/dist/lib/types/tools.generated.d.ts +1827 -360
- package/dist/lib/types/tools.generated.d.ts.map +1 -1
- package/dist/lib/utils/capabilities.d.ts +17 -2
- package/dist/lib/utils/capabilities.d.ts.map +1 -1
- package/dist/lib/utils/capabilities.js +26 -2
- package/dist/lib/utils/capabilities.js.map +1 -1
- 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"}
|