@adcp/client 4.12.0 → 4.14.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/README.md +13 -0
- package/bin/adcp.js +100 -205
- package/dist/lib/core/ADCPMultiAgentClient.js.map +1 -1
- package/dist/lib/core/AgentClient.d.ts.map +1 -1
- package/dist/lib/core/GovernanceMiddleware.d.ts.map +1 -1
- package/dist/lib/core/GovernanceMiddleware.js +2 -1
- package/dist/lib/core/GovernanceMiddleware.js.map +1 -1
- package/dist/lib/core/SingleAgentClient.d.ts.map +1 -1
- package/dist/lib/core/SingleAgentClient.js.map +1 -1
- package/dist/lib/core/TaskExecutor.d.ts.map +1 -1
- package/dist/lib/core/TaskExecutor.js +10 -2
- package/dist/lib/core/TaskExecutor.js.map +1 -1
- package/dist/lib/index.d.ts +5 -1
- package/dist/lib/index.d.ts.map +1 -1
- package/dist/lib/index.js +19 -4
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/protocols/index.d.ts +1 -1
- package/dist/lib/protocols/index.d.ts.map +1 -1
- package/dist/lib/protocols/index.js +2 -1
- package/dist/lib/protocols/index.js.map +1 -1
- package/dist/lib/protocols/mcp.d.ts +15 -3
- package/dist/lib/protocols/mcp.d.ts.map +1 -1
- package/dist/lib/protocols/mcp.js +205 -75
- package/dist/lib/protocols/mcp.js.map +1 -1
- package/dist/lib/server/errors.d.ts +62 -0
- package/dist/lib/server/errors.d.ts.map +1 -0
- package/dist/lib/server/errors.js +54 -0
- package/dist/lib/server/errors.js.map +1 -0
- package/dist/lib/server/index.d.ts +5 -0
- package/dist/lib/server/index.d.ts.map +1 -0
- package/dist/lib/server/index.js +11 -0
- package/dist/lib/server/index.js.map +1 -0
- package/dist/lib/server/responses.d.ts +64 -0
- package/dist/lib/server/responses.d.ts.map +1 -0
- package/dist/lib/server/responses.js +85 -0
- package/dist/lib/server/responses.js.map +1 -0
- 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 +40 -1
- package/dist/lib/testing/agent-tester.js.map +1 -1
- package/dist/lib/testing/client.d.ts +6 -0
- package/dist/lib/testing/client.d.ts.map +1 -1
- package/dist/lib/testing/client.js +42 -3
- package/dist/lib/testing/client.js.map +1 -1
- package/dist/lib/testing/compliance/comply.d.ts.map +1 -1
- package/dist/lib/testing/compliance/comply.js +87 -2
- package/dist/lib/testing/compliance/comply.js.map +1 -1
- package/dist/lib/testing/compliance/index.d.ts +1 -1
- package/dist/lib/testing/compliance/index.d.ts.map +1 -1
- package/dist/lib/testing/compliance/index.js +2 -1
- package/dist/lib/testing/compliance/index.js.map +1 -1
- package/dist/lib/testing/compliance/profiles.d.ts +7 -0
- package/dist/lib/testing/compliance/profiles.d.ts.map +1 -1
- package/dist/lib/testing/compliance/profiles.js +10 -0
- package/dist/lib/testing/compliance/profiles.js.map +1 -1
- package/dist/lib/testing/compliance/types.d.ts +2 -2
- package/dist/lib/testing/compliance/types.d.ts.map +1 -1
- package/dist/lib/testing/index.d.ts +2 -2
- package/dist/lib/testing/index.d.ts.map +1 -1
- package/dist/lib/testing/index.js +7 -2
- package/dist/lib/testing/index.js.map +1 -1
- package/dist/lib/testing/orchestrator.d.ts.map +1 -1
- package/dist/lib/testing/orchestrator.js +14 -0
- package/dist/lib/testing/orchestrator.js.map +1 -1
- package/dist/lib/testing/scenarios/capabilities.js.map +1 -1
- package/dist/lib/testing/scenarios/creative.js +1 -1
- package/dist/lib/testing/scenarios/creative.js.map +1 -1
- package/dist/lib/testing/scenarios/edge-cases.js.map +1 -1
- package/dist/lib/testing/scenarios/error-compliance.d.ts +30 -0
- package/dist/lib/testing/scenarios/error-compliance.d.ts.map +1 -0
- package/dist/lib/testing/scenarios/error-compliance.js +382 -0
- package/dist/lib/testing/scenarios/error-compliance.js.map +1 -0
- package/dist/lib/testing/scenarios/governance.js.map +1 -1
- package/dist/lib/testing/scenarios/index.d.ts +2 -1
- package/dist/lib/testing/scenarios/index.d.ts.map +1 -1
- package/dist/lib/testing/scenarios/index.js +9 -1
- package/dist/lib/testing/scenarios/index.js.map +1 -1
- package/dist/lib/testing/scenarios/media-buy.d.ts +24 -0
- package/dist/lib/testing/scenarios/media-buy.d.ts.map +1 -1
- package/dist/lib/testing/scenarios/media-buy.js +341 -1
- 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 +3 -0
- package/dist/lib/testing/scenarios/schema-compliance.js.map +1 -1
- package/dist/lib/testing/scenarios/signals.d.ts.map +1 -1
- package/dist/lib/testing/scenarios/signals.js +24 -22
- package/dist/lib/testing/scenarios/signals.js.map +1 -1
- package/dist/lib/testing/scenarios/sponsored-intelligence.js.map +1 -1
- package/dist/lib/testing/types.d.ts +1 -1
- package/dist/lib/testing/types.d.ts.map +1 -1
- package/dist/lib/types/core.generated.d.ts +25 -2
- 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 +371 -330
- package/dist/lib/types/schemas.generated.d.ts.map +1 -1
- package/dist/lib/types/schemas.generated.js +78 -84
- package/dist/lib/types/schemas.generated.js.map +1 -1
- package/dist/lib/types/tools.generated.d.ts +131 -122
- 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 +17 -8
- package/dist/lib/utils/capabilities.js.map +1 -1
- package/dist/lib/utils/creative-adapter.d.ts.map +1 -1
- package/dist/lib/utils/creative-adapter.js.map +1 -1
- package/dist/lib/utils/error-extraction.d.ts +57 -0
- package/dist/lib/utils/error-extraction.d.ts.map +1 -0
- package/dist/lib/utils/error-extraction.js +174 -0
- package/dist/lib/utils/error-extraction.js.map +1 -0
- package/dist/lib/utils/index.d.ts +2 -0
- package/dist/lib/utils/index.d.ts.map +1 -1
- package/dist/lib/utils/index.js +7 -1
- package/dist/lib/utils/index.js.map +1 -1
- package/dist/lib/utils/preview-utils.d.ts.map +1 -1
- package/dist/lib/utils/preview-utils.js +32 -16
- package/dist/lib/utils/preview-utils.js.map +1 -1
- package/dist/lib/utils/request-normalizer.d.ts.map +1 -1
- package/dist/lib/utils/request-normalizer.js +15 -1
- package/dist/lib/utils/request-normalizer.js.map +1 -1
- package/dist/lib/utils/response-schemas.d.ts +9 -0
- package/dist/lib/utils/response-schemas.d.ts.map +1 -0
- package/dist/lib/utils/response-schemas.js +59 -0
- package/dist/lib/utils/response-schemas.js.map +1 -0
- package/dist/lib/utils/response-unwrapper.d.ts +2 -2
- package/dist/lib/utils/response-unwrapper.d.ts.map +1 -1
- package/dist/lib/utils/response-unwrapper.js +54 -91
- package/dist/lib/utils/response-unwrapper.js.map +1 -1
- package/dist/lib/validation/index.d.ts.map +1 -1
- package/dist/lib/validation/index.js +3 -2
- package/dist/lib/validation/index.js.map +1 -1
- package/package.json +19 -1
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* Re-exports all test scenarios for easy importing.
|
|
6
6
|
*/
|
|
7
7
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
-
exports.testSchemaCompliance = exports.likelySupportsV3 = exports.testCapabilityDiscovery = exports.hasSITools = exports.testSIHandoff = exports.testSIAvailability = exports.testSISessionLifecycle = exports.hasCampaignGovernanceTools = exports.hasGovernanceTools = exports.testCampaignGovernanceDelivery = exports.testCampaignGovernanceConditions = exports.testCampaignGovernanceDenied = exports.testCampaignGovernance = exports.testPropertyListFilters = exports.testGovernanceContentStandards = exports.testGovernancePropertyLists = exports.testResponseConsistency = exports.testBehaviorAnalysis = exports.testTemporalValidation = exports.testPricingEdgeCases = exports.testValidation = exports.testErrorHandling = exports.testSignalsFlow = exports.testCreativeLifecycle = exports.testCreativeFlow = exports.buildCreateMediaBuyRequest = exports.selectPricingOption = exports.selectProduct = exports.resolveAccountForAudiences = exports.testSyncAudiences = exports.testCreativeReference = exports.testCreativeInline = exports.testCreativeSync = exports.testFullSalesFlow = exports.testCreateMediaBuy = exports.testDiscovery = exports.testHealthCheck = void 0;
|
|
8
|
+
exports.testErrorTransport = exports.testErrorStructure = exports.testErrorCodes = exports.testSchemaCompliance = exports.likelySupportsV3 = exports.testCapabilityDiscovery = exports.hasSITools = exports.testSIHandoff = exports.testSIAvailability = exports.testSISessionLifecycle = exports.hasCampaignGovernanceTools = exports.hasGovernanceTools = exports.testCampaignGovernanceDelivery = exports.testCampaignGovernanceConditions = exports.testCampaignGovernanceDenied = exports.testCampaignGovernance = exports.testPropertyListFilters = exports.testGovernanceContentStandards = exports.testGovernancePropertyLists = exports.testResponseConsistency = exports.testBehaviorAnalysis = exports.testTemporalValidation = exports.testPricingEdgeCases = exports.testValidation = exports.testErrorHandling = exports.testSignalsFlow = exports.testCreativeLifecycle = exports.testCreativeFlow = exports.testPackageLifecycle = exports.testTerminalStateEnforcement = exports.testMediaBuyLifecycle = exports.buildCreateMediaBuyRequest = exports.selectPricingOption = exports.selectProduct = exports.resolveAccountForAudiences = exports.testSyncAudiences = exports.testCreativeReference = exports.testCreativeInline = exports.testCreativeSync = exports.testFullSalesFlow = exports.testCreateMediaBuy = exports.testDiscovery = exports.testHealthCheck = void 0;
|
|
9
9
|
// Health check
|
|
10
10
|
var health_1 = require("./health");
|
|
11
11
|
Object.defineProperty(exports, "testHealthCheck", { enumerable: true, get: function () { return health_1.testHealthCheck; } });
|
|
@@ -24,6 +24,9 @@ Object.defineProperty(exports, "resolveAccountForAudiences", { enumerable: true,
|
|
|
24
24
|
Object.defineProperty(exports, "selectProduct", { enumerable: true, get: function () { return media_buy_1.selectProduct; } });
|
|
25
25
|
Object.defineProperty(exports, "selectPricingOption", { enumerable: true, get: function () { return media_buy_1.selectPricingOption; } });
|
|
26
26
|
Object.defineProperty(exports, "buildCreateMediaBuyRequest", { enumerable: true, get: function () { return media_buy_1.buildCreateMediaBuyRequest; } });
|
|
27
|
+
Object.defineProperty(exports, "testMediaBuyLifecycle", { enumerable: true, get: function () { return media_buy_1.testMediaBuyLifecycle; } });
|
|
28
|
+
Object.defineProperty(exports, "testTerminalStateEnforcement", { enumerable: true, get: function () { return media_buy_1.testTerminalStateEnforcement; } });
|
|
29
|
+
Object.defineProperty(exports, "testPackageLifecycle", { enumerable: true, get: function () { return media_buy_1.testPackageLifecycle; } });
|
|
27
30
|
// Creative agent testing
|
|
28
31
|
var creative_1 = require("./creative");
|
|
29
32
|
Object.defineProperty(exports, "testCreativeFlow", { enumerable: true, get: function () { return creative_1.testCreativeFlow; } });
|
|
@@ -63,4 +66,9 @@ Object.defineProperty(exports, "likelySupportsV3", { enumerable: true, get: func
|
|
|
63
66
|
// Schema compliance testing
|
|
64
67
|
var schema_compliance_1 = require("./schema-compliance");
|
|
65
68
|
Object.defineProperty(exports, "testSchemaCompliance", { enumerable: true, get: function () { return schema_compliance_1.testSchemaCompliance; } });
|
|
69
|
+
// Error compliance testing (transport error mapping spec)
|
|
70
|
+
var error_compliance_1 = require("./error-compliance");
|
|
71
|
+
Object.defineProperty(exports, "testErrorCodes", { enumerable: true, get: function () { return error_compliance_1.testErrorCodes; } });
|
|
72
|
+
Object.defineProperty(exports, "testErrorStructure", { enumerable: true, get: function () { return error_compliance_1.testErrorStructure; } });
|
|
73
|
+
Object.defineProperty(exports, "testErrorTransport", { enumerable: true, get: function () { return error_compliance_1.testErrorTransport; } });
|
|
66
74
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/lib/testing/scenarios/index.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAEH,eAAe;AACf,mCAA2C;AAAlC,yGAAA,eAAe,OAAA;AAExB,YAAY;AACZ,yCAA4C;AAAnC,0GAAA,aAAa,OAAA;AAEtB,yBAAyB;AACzB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/lib/testing/scenarios/index.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAEH,eAAe;AACf,mCAA2C;AAAlC,yGAAA,eAAe,OAAA;AAExB,YAAY;AACZ,yCAA4C;AAAnC,0GAAA,aAAa,OAAA;AAEtB,yBAAyB;AACzB,yCAcqB;AAbnB,+GAAA,kBAAkB,OAAA;AAClB,8GAAA,iBAAiB,OAAA;AACjB,6GAAA,gBAAgB,OAAA;AAChB,+GAAA,kBAAkB,OAAA;AAClB,kHAAA,qBAAqB,OAAA;AACrB,8GAAA,iBAAiB,OAAA;AACjB,uHAAA,0BAA0B,OAAA;AAC1B,0GAAA,aAAa,OAAA;AACb,gHAAA,mBAAmB,OAAA;AACnB,uHAAA,0BAA0B,OAAA;AAC1B,kHAAA,qBAAqB,OAAA;AACrB,yHAAA,4BAA4B,OAAA;AAC5B,iHAAA,oBAAoB,OAAA;AAGtB,yBAAyB;AACzB,uCAAqE;AAA5D,4GAAA,gBAAgB,OAAA;AAAE,iHAAA,qBAAqB,OAAA;AAEhD,wBAAwB;AACxB,qCAA4C;AAAnC,0GAAA,eAAe,OAAA;AAExB,oBAAoB;AACpB,2CAOsB;AANpB,+GAAA,iBAAiB,OAAA;AACjB,4GAAA,cAAc,OAAA;AACd,kHAAA,oBAAoB,OAAA;AACpB,oHAAA,sBAAsB,OAAA;AACtB,kHAAA,oBAAoB,OAAA;AACpB,qHAAA,uBAAuB,OAAA;AAGzB,iCAAiC;AACjC,2CAUsB;AATpB,yHAAA,2BAA2B,OAAA;AAC3B,4HAAA,8BAA8B,OAAA;AAC9B,qHAAA,uBAAuB,OAAA;AACvB,oHAAA,sBAAsB,OAAA;AACtB,0HAAA,4BAA4B,OAAA;AAC5B,8HAAA,gCAAgC,OAAA;AAChC,4HAAA,8BAA8B,OAAA;AAC9B,gHAAA,kBAAkB,OAAA;AAClB,wHAAA,0BAA0B,OAAA;AAG5B,kDAAkD;AAClD,mEAAiH;AAAxG,gIAAA,sBAAsB,OAAA;AAAE,4HAAA,kBAAkB,OAAA;AAAE,uHAAA,aAAa,OAAA;AAAE,oHAAA,UAAU,OAAA;AAE9E,kCAAkC;AAClC,+CAA2E;AAAlE,uHAAA,uBAAuB,OAAA;AAAE,gHAAA,gBAAgB,OAAA;AAElD,4BAA4B;AAC5B,yDAA2D;AAAlD,yHAAA,oBAAoB,OAAA;AAE7B,0DAA0D;AAC1D,uDAA4F;AAAnF,kHAAA,cAAc,OAAA;AAAE,sHAAA,kBAAkB,OAAA;AAAE,sHAAA,kBAAkB,OAAA"}
|
|
@@ -85,4 +85,28 @@ export declare function testSyncAudiences(agentUrl: string, options: TestOptions
|
|
|
85
85
|
steps: TestStepResult[];
|
|
86
86
|
profile?: AgentProfile;
|
|
87
87
|
}>;
|
|
88
|
+
/**
|
|
89
|
+
* Test: Media Buy Lifecycle
|
|
90
|
+
* Exercises the full state machine: create -> pause -> resume -> get status -> cancel
|
|
91
|
+
*/
|
|
92
|
+
export declare function testMediaBuyLifecycle(agentUrl: string, options: TestOptions): Promise<{
|
|
93
|
+
steps: TestStepResult[];
|
|
94
|
+
profile?: AgentProfile;
|
|
95
|
+
}>;
|
|
96
|
+
/**
|
|
97
|
+
* Test: Terminal State Enforcement
|
|
98
|
+
* Verifies agents reject updates to media buys in terminal states.
|
|
99
|
+
*/
|
|
100
|
+
export declare function testTerminalStateEnforcement(agentUrl: string, options: TestOptions): Promise<{
|
|
101
|
+
steps: TestStepResult[];
|
|
102
|
+
profile?: AgentProfile;
|
|
103
|
+
}>;
|
|
104
|
+
/**
|
|
105
|
+
* Test: Package Lifecycle
|
|
106
|
+
* Tests package-level pause/resume independent of media buy status.
|
|
107
|
+
*/
|
|
108
|
+
export declare function testPackageLifecycle(agentUrl: string, options: TestOptions): Promise<{
|
|
109
|
+
steps: TestStepResult[];
|
|
110
|
+
profile?: AgentProfile;
|
|
111
|
+
}>;
|
|
88
112
|
//# sourceMappingURL=media-buy.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"media-buy.d.ts","sourceRoot":"","sources":["../../../../src/lib/testing/scenarios/media-buy.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EACV,gBAAgB,EAKjB,MAAM,6BAA6B,CAAC;AACrC,OAAO,KAAK,EAAE,OAAO,EAAE,aAAa,EAAY,MAAM,4BAA4B,CAAC;AACnF,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"media-buy.d.ts","sourceRoot":"","sources":["../../../../src/lib/testing/scenarios/media-buy.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,6 +19,9 @@ exports.testCreativeInline = testCreativeInline;
|
|
|
19
19
|
exports.testCreativeReference = testCreativeReference;
|
|
20
20
|
exports.resolveAccountForAudiences = resolveAccountForAudiences;
|
|
21
21
|
exports.testSyncAudiences = testSyncAudiences;
|
|
22
|
+
exports.testMediaBuyLifecycle = testMediaBuyLifecycle;
|
|
23
|
+
exports.testTerminalStateEnforcement = testTerminalStateEnforcement;
|
|
24
|
+
exports.testPackageLifecycle = testPackageLifecycle;
|
|
22
25
|
const client_1 = require("../client");
|
|
23
26
|
const discovery_1 = require("./discovery");
|
|
24
27
|
/**
|
|
@@ -112,8 +115,10 @@ function selectFormatId(product, fallback = getDefaultFormatId()) {
|
|
|
112
115
|
return fallback;
|
|
113
116
|
}
|
|
114
117
|
function buildStaticInlineCreative(formatId) {
|
|
118
|
+
const ts = Date.now();
|
|
115
119
|
return {
|
|
116
|
-
|
|
120
|
+
creative_id: `test-inline-${ts}`,
|
|
121
|
+
name: `Inline Test Creative ${ts}`,
|
|
117
122
|
format_id: formatId,
|
|
118
123
|
assets: {
|
|
119
124
|
primary: {
|
|
@@ -205,6 +210,7 @@ async function testCreateMediaBuy(agentUrl, options) {
|
|
|
205
210
|
async () => client.createMediaBuy(createRequest));
|
|
206
211
|
let mediaBuyId;
|
|
207
212
|
if (createResult?.success && createResult?.data) {
|
|
213
|
+
steps.push((0, client_1.validateResponseSchema)('create_media_buy', createResult.data));
|
|
208
214
|
const mediaBuy = createResult.data;
|
|
209
215
|
const nested = mediaBuy.media_buy;
|
|
210
216
|
mediaBuyId = (mediaBuy.media_buy_id || nested?.media_buy_id);
|
|
@@ -274,6 +280,7 @@ async function testFullSalesFlow(agentUrl, options) {
|
|
|
274
280
|
include_snapshot: true,
|
|
275
281
|
}));
|
|
276
282
|
if (snapshotResult?.success && snapshotResult?.data) {
|
|
283
|
+
steps.push((0, client_1.validateResponseSchema)('get_media_buys', snapshotResult.data));
|
|
277
284
|
const mediaBuys = snapshotResult.data.media_buys || [];
|
|
278
285
|
const mediaBuy = mediaBuys.find((item) => item.media_buy_id === mediaBuyId) || mediaBuys[0];
|
|
279
286
|
const packages = mediaBuy?.packages || [];
|
|
@@ -469,6 +476,26 @@ async function testCreativeInline(agentUrl, options) {
|
|
|
469
476
|
});
|
|
470
477
|
return { steps, profile };
|
|
471
478
|
}
|
|
479
|
+
// Check if agent declares inline creative support via capabilities
|
|
480
|
+
if (profile.tools.includes('get_adcp_capabilities')) {
|
|
481
|
+
try {
|
|
482
|
+
const capResult = (await client.getAdcpCapabilities({}));
|
|
483
|
+
const capData = capResult?.data;
|
|
484
|
+
if (capData?.media_buy?.features?.inline_creative_management === false) {
|
|
485
|
+
steps.push({
|
|
486
|
+
step: 'Create media buy with inline creative',
|
|
487
|
+
task: 'create_media_buy',
|
|
488
|
+
passed: true,
|
|
489
|
+
duration_ms: 0,
|
|
490
|
+
details: 'Skipped: agent declares inline_creative_management: false',
|
|
491
|
+
});
|
|
492
|
+
return { steps, profile };
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
catch {
|
|
496
|
+
// If capabilities check fails, proceed with the test
|
|
497
|
+
}
|
|
498
|
+
}
|
|
472
499
|
// Get products
|
|
473
500
|
const { result: productsResult } = await (0, client_1.runStep)('Fetch products for inline creative test', 'get_products', async () => client.getProducts({
|
|
474
501
|
buying_mode: 'brief',
|
|
@@ -547,6 +574,7 @@ async function testCreativeInline(agentUrl, options) {
|
|
|
547
574
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- intentional: test request bypasses strict typing
|
|
548
575
|
async () => client.createMediaBuy(createRequest));
|
|
549
576
|
if (createResult?.success && createResult?.data) {
|
|
577
|
+
steps.push((0, client_1.validateResponseSchema)('create_media_buy', createResult.data));
|
|
550
578
|
const mediaBuy = createResult.data;
|
|
551
579
|
const nested = mediaBuy.media_buy;
|
|
552
580
|
const mediaBuyId = (mediaBuy.media_buy_id || nested?.media_buy_id);
|
|
@@ -679,6 +707,7 @@ async function testCreativeReference(agentUrl, options) {
|
|
|
679
707
|
});
|
|
680
708
|
const { result: createResult, step: createStep } = await (0, client_1.runStep)('Create media buy with referenced creative', 'create_media_buy', async () => client.executeTask('create_media_buy', createRequest));
|
|
681
709
|
if (createResult?.success && createResult?.data) {
|
|
710
|
+
steps.push((0, client_1.validateResponseSchema)('create_media_buy', createResult.data));
|
|
682
711
|
const mediaBuy = createResult.data;
|
|
683
712
|
const mediaBuyId = mediaBuy.media_buy_id || mediaBuy.media_buy?.media_buy_id;
|
|
684
713
|
const packages = mediaBuy.packages || mediaBuy.media_buy?.packages;
|
|
@@ -883,4 +912,315 @@ async function testSyncAudiences(agentUrl, options) {
|
|
|
883
912
|
steps.push(deleteStep);
|
|
884
913
|
return { steps, profile };
|
|
885
914
|
}
|
|
915
|
+
// ---------------------------------------------------------------------------
|
|
916
|
+
// State Machine Compliance Scenarios
|
|
917
|
+
// ---------------------------------------------------------------------------
|
|
918
|
+
/**
|
|
919
|
+
* Extract media buy status from a response, handling nested shapes.
|
|
920
|
+
*/
|
|
921
|
+
function extractStatus(data) {
|
|
922
|
+
const nested = data.media_buy;
|
|
923
|
+
return (data.status ?? nested?.status);
|
|
924
|
+
}
|
|
925
|
+
/**
|
|
926
|
+
* Test: Media Buy Lifecycle
|
|
927
|
+
* Exercises the full state machine: create -> pause -> resume -> get status -> cancel
|
|
928
|
+
*/
|
|
929
|
+
async function testMediaBuyLifecycle(agentUrl, options) {
|
|
930
|
+
const steps = [];
|
|
931
|
+
const client = (0, client_1.createTestClient)(agentUrl, options.protocol || 'mcp', options);
|
|
932
|
+
// Create a media buy to work with
|
|
933
|
+
const { steps: createSteps, profile, mediaBuyId } = await testCreateMediaBuy(agentUrl, options);
|
|
934
|
+
steps.push(...createSteps);
|
|
935
|
+
if (!mediaBuyId || !profile?.tools.includes('update_media_buy')) {
|
|
936
|
+
return { steps, profile };
|
|
937
|
+
}
|
|
938
|
+
// Step 1: Pause the media buy
|
|
939
|
+
const { result: pauseResult, step: pauseStep } = await (0, client_1.runStep)('Pause media buy', 'update_media_buy', async () => client.updateMediaBuy({
|
|
940
|
+
media_buy_id: mediaBuyId,
|
|
941
|
+
paused: true,
|
|
942
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- intentional: test request bypasses strict typing
|
|
943
|
+
}));
|
|
944
|
+
if (pauseResult?.success && pauseResult?.data) {
|
|
945
|
+
const data = pauseResult.data;
|
|
946
|
+
const status = extractStatus(data);
|
|
947
|
+
pauseStep.details = `Paused media buy, status: ${status}`;
|
|
948
|
+
pauseStep.response_preview = JSON.stringify({ media_buy_id: mediaBuyId, status }, null, 2);
|
|
949
|
+
if (status && status !== 'paused') {
|
|
950
|
+
pauseStep.warnings = [`Expected status 'paused', got '${status}'`];
|
|
951
|
+
}
|
|
952
|
+
}
|
|
953
|
+
else if (pauseResult && !pauseResult.success) {
|
|
954
|
+
pauseStep.passed = false;
|
|
955
|
+
pauseStep.error = pauseResult.error || 'Pause operation failed';
|
|
956
|
+
}
|
|
957
|
+
steps.push(pauseStep);
|
|
958
|
+
// Step 2: Resume the media buy
|
|
959
|
+
const { result: resumeResult, step: resumeStep } = await (0, client_1.runStep)('Resume media buy', 'update_media_buy', async () => client.updateMediaBuy({
|
|
960
|
+
media_buy_id: mediaBuyId,
|
|
961
|
+
paused: false,
|
|
962
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- intentional: test request bypasses strict typing
|
|
963
|
+
}));
|
|
964
|
+
if (resumeResult?.success && resumeResult?.data) {
|
|
965
|
+
const data = resumeResult.data;
|
|
966
|
+
const status = extractStatus(data);
|
|
967
|
+
resumeStep.details = `Resumed media buy, status: ${status}`;
|
|
968
|
+
resumeStep.response_preview = JSON.stringify({ media_buy_id: mediaBuyId, status }, null, 2);
|
|
969
|
+
if (status && status !== 'active' && status !== 'pending_activation') {
|
|
970
|
+
resumeStep.warnings = [`Expected status 'active' or 'pending_activation', got '${status}'`];
|
|
971
|
+
}
|
|
972
|
+
}
|
|
973
|
+
else if (resumeResult && !resumeResult.success) {
|
|
974
|
+
resumeStep.passed = false;
|
|
975
|
+
resumeStep.error = resumeResult.error || 'Resume operation failed';
|
|
976
|
+
}
|
|
977
|
+
steps.push(resumeStep);
|
|
978
|
+
// Step 3: Get status and check valid_actions (if get_media_buys available)
|
|
979
|
+
if (profile.tools.includes('get_media_buys')) {
|
|
980
|
+
const { result: statusResult, step: statusStep } = await (0, client_1.runStep)('Get media buy status and valid_actions', 'get_media_buys', async () => client.executeTask('get_media_buys', {
|
|
981
|
+
media_buy_ids: [mediaBuyId],
|
|
982
|
+
}));
|
|
983
|
+
if (statusResult?.success && statusResult?.data) {
|
|
984
|
+
const mediaBuys = (statusResult.data.media_buys || []);
|
|
985
|
+
const mediaBuy = mediaBuys.find((item) => item.media_buy_id === mediaBuyId) || mediaBuys[0];
|
|
986
|
+
if (!mediaBuy) {
|
|
987
|
+
statusStep.passed = false;
|
|
988
|
+
statusStep.error = 'get_media_buys did not return the created media buy';
|
|
989
|
+
}
|
|
990
|
+
else {
|
|
991
|
+
const validActions = mediaBuy.valid_actions;
|
|
992
|
+
statusStep.details = `Status: ${mediaBuy.status}, valid_actions: ${validActions ? validActions.join(', ') : 'not provided'}`;
|
|
993
|
+
statusStep.response_preview = JSON.stringify({
|
|
994
|
+
media_buy_id: mediaBuy.media_buy_id,
|
|
995
|
+
status: mediaBuy.status,
|
|
996
|
+
valid_actions: validActions,
|
|
997
|
+
}, null, 2);
|
|
998
|
+
}
|
|
999
|
+
}
|
|
1000
|
+
else if (statusResult && !statusResult.success) {
|
|
1001
|
+
statusStep.passed = false;
|
|
1002
|
+
statusStep.error = statusResult.error || 'get_media_buys failed';
|
|
1003
|
+
}
|
|
1004
|
+
steps.push(statusStep);
|
|
1005
|
+
}
|
|
1006
|
+
// Step 4: Cancel the media buy
|
|
1007
|
+
const { result: cancelResult, step: cancelStep } = await (0, client_1.runStep)('Cancel media buy', 'update_media_buy', async () => client.updateMediaBuy({
|
|
1008
|
+
media_buy_id: mediaBuyId,
|
|
1009
|
+
canceled: true,
|
|
1010
|
+
cancellation_reason: 'AdCP compliance test — lifecycle scenario',
|
|
1011
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- intentional: test request bypasses strict typing
|
|
1012
|
+
}));
|
|
1013
|
+
if (cancelResult?.success && cancelResult?.data) {
|
|
1014
|
+
const data = cancelResult.data;
|
|
1015
|
+
const status = extractStatus(data);
|
|
1016
|
+
cancelStep.details = `Canceled media buy, status: ${status}`;
|
|
1017
|
+
cancelStep.response_preview = JSON.stringify({ media_buy_id: mediaBuyId, status }, null, 2);
|
|
1018
|
+
if (status && status !== 'canceled') {
|
|
1019
|
+
cancelStep.warnings = [`Expected status 'canceled', got '${status}'`];
|
|
1020
|
+
}
|
|
1021
|
+
}
|
|
1022
|
+
else if (cancelResult && !cancelResult.success) {
|
|
1023
|
+
// NOT_CANCELLABLE is a valid response — agent may not support cancellation
|
|
1024
|
+
const error = cancelResult.error || '';
|
|
1025
|
+
if (error.includes('NOT_CANCELLABLE') || error.includes('not_cancellable')) {
|
|
1026
|
+
cancelStep.passed = true;
|
|
1027
|
+
cancelStep.details = 'Agent does not support cancellation (NOT_CANCELLABLE)';
|
|
1028
|
+
}
|
|
1029
|
+
else {
|
|
1030
|
+
cancelStep.passed = false;
|
|
1031
|
+
cancelStep.error = cancelResult.error || 'Cancel operation failed';
|
|
1032
|
+
}
|
|
1033
|
+
}
|
|
1034
|
+
steps.push(cancelStep);
|
|
1035
|
+
return { steps, profile };
|
|
1036
|
+
}
|
|
1037
|
+
/**
|
|
1038
|
+
* Test: Terminal State Enforcement
|
|
1039
|
+
* Verifies agents reject updates to media buys in terminal states.
|
|
1040
|
+
*/
|
|
1041
|
+
async function testTerminalStateEnforcement(agentUrl, options) {
|
|
1042
|
+
const steps = [];
|
|
1043
|
+
const client = (0, client_1.createTestClient)(agentUrl, options.protocol || 'mcp', options);
|
|
1044
|
+
// Create and cancel a media buy
|
|
1045
|
+
const { steps: createSteps, profile, mediaBuyId } = await testCreateMediaBuy(agentUrl, options);
|
|
1046
|
+
steps.push(...createSteps);
|
|
1047
|
+
if (!mediaBuyId || !profile?.tools.includes('update_media_buy')) {
|
|
1048
|
+
return { steps, profile };
|
|
1049
|
+
}
|
|
1050
|
+
// Cancel the media buy to put it in a terminal state
|
|
1051
|
+
const { result: cancelResult, step: cancelStep } = await (0, client_1.runStep)('Cancel media buy (setup)', 'update_media_buy', async () => client.updateMediaBuy({
|
|
1052
|
+
media_buy_id: mediaBuyId,
|
|
1053
|
+
canceled: true,
|
|
1054
|
+
cancellation_reason: 'AdCP compliance test — terminal state enforcement',
|
|
1055
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- intentional: test request bypasses strict typing
|
|
1056
|
+
}));
|
|
1057
|
+
if (cancelResult?.success && cancelResult?.data) {
|
|
1058
|
+
const data = cancelResult.data;
|
|
1059
|
+
cancelStep.details = `Canceled media buy, status: ${extractStatus(data)}`;
|
|
1060
|
+
}
|
|
1061
|
+
else if (cancelResult && !cancelResult.success) {
|
|
1062
|
+
const error = cancelResult.error || '';
|
|
1063
|
+
if (error.includes('NOT_CANCELLABLE') || error.includes('not_cancellable')) {
|
|
1064
|
+
// Agent doesn't support cancellation — can't test terminal state enforcement
|
|
1065
|
+
cancelStep.passed = true;
|
|
1066
|
+
cancelStep.details = 'Agent does not support cancellation — skipping terminal state tests';
|
|
1067
|
+
steps.push(cancelStep);
|
|
1068
|
+
return { steps, profile };
|
|
1069
|
+
}
|
|
1070
|
+
cancelStep.passed = false;
|
|
1071
|
+
cancelStep.error = cancelResult.error || 'Cancel setup failed';
|
|
1072
|
+
}
|
|
1073
|
+
steps.push(cancelStep);
|
|
1074
|
+
// Try to pause the canceled media buy — should be rejected
|
|
1075
|
+
const { result: pauseResult, step: pauseStep } = await (0, client_1.runStep)('Update canceled media buy (expect rejection)', 'update_media_buy', async () => client.updateMediaBuy({
|
|
1076
|
+
media_buy_id: mediaBuyId,
|
|
1077
|
+
paused: true,
|
|
1078
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- intentional: test request bypasses strict typing
|
|
1079
|
+
}));
|
|
1080
|
+
if (pauseResult?.success) {
|
|
1081
|
+
pauseStep.passed = false;
|
|
1082
|
+
pauseStep.error = 'Agent accepted update to canceled media buy — should reject with INVALID_STATE';
|
|
1083
|
+
}
|
|
1084
|
+
else if (pauseResult) {
|
|
1085
|
+
// Agent returned { success: false } — correct behavior
|
|
1086
|
+
pauseStep.passed = true;
|
|
1087
|
+
const error = pauseResult.error || '';
|
|
1088
|
+
const hasExpectedCode = error.includes('INVALID_STATE') || error.includes('invalid_state');
|
|
1089
|
+
pauseStep.details = hasExpectedCode
|
|
1090
|
+
? 'Correctly rejected with INVALID_STATE'
|
|
1091
|
+
: `Correctly rejected update to canceled media buy: ${error}`;
|
|
1092
|
+
if (!hasExpectedCode && error) {
|
|
1093
|
+
pauseStep.warnings = ['Agent rejected the update but did not use INVALID_STATE error code'];
|
|
1094
|
+
}
|
|
1095
|
+
}
|
|
1096
|
+
// else: pauseResult is undefined (exception thrown) — runStep already set passed=false and error
|
|
1097
|
+
steps.push(pauseStep);
|
|
1098
|
+
// Try to cancel again — should also be rejected (or idempotent)
|
|
1099
|
+
const { result: reCancelResult, step: reCancelStep } = await (0, client_1.runStep)('Cancel already-canceled media buy (expect rejection)', 'update_media_buy', async () => client.updateMediaBuy({
|
|
1100
|
+
media_buy_id: mediaBuyId,
|
|
1101
|
+
canceled: true,
|
|
1102
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- intentional: test request bypasses strict typing
|
|
1103
|
+
}));
|
|
1104
|
+
if (reCancelResult?.success) {
|
|
1105
|
+
// Idempotent cancellation is acceptable
|
|
1106
|
+
reCancelStep.passed = true;
|
|
1107
|
+
reCancelStep.details = 'Agent accepted re-cancellation (idempotent) — acceptable behavior';
|
|
1108
|
+
}
|
|
1109
|
+
else if (reCancelResult) {
|
|
1110
|
+
reCancelStep.passed = true;
|
|
1111
|
+
const error = reCancelResult.error || '';
|
|
1112
|
+
reCancelStep.details = `Correctly rejected re-cancellation: ${error}`;
|
|
1113
|
+
}
|
|
1114
|
+
steps.push(reCancelStep);
|
|
1115
|
+
return { steps, profile };
|
|
1116
|
+
}
|
|
1117
|
+
/**
|
|
1118
|
+
* Test: Package Lifecycle
|
|
1119
|
+
* Tests package-level pause/resume independent of media buy status.
|
|
1120
|
+
*/
|
|
1121
|
+
async function testPackageLifecycle(agentUrl, options) {
|
|
1122
|
+
const steps = [];
|
|
1123
|
+
const client = (0, client_1.createTestClient)(agentUrl, options.protocol || 'mcp', options);
|
|
1124
|
+
// Create a media buy
|
|
1125
|
+
const { steps: createSteps, profile, mediaBuyId } = await testCreateMediaBuy(agentUrl, options);
|
|
1126
|
+
steps.push(...createSteps);
|
|
1127
|
+
if (!mediaBuyId || !profile?.tools.includes('update_media_buy')) {
|
|
1128
|
+
return { steps, profile };
|
|
1129
|
+
}
|
|
1130
|
+
// Find a package ID — try get_media_buys first, fall back to convention
|
|
1131
|
+
let packageId = 'pkg-0';
|
|
1132
|
+
if (profile.tools.includes('get_media_buys')) {
|
|
1133
|
+
const { result: fetchResult, step: fetchStep } = await (0, client_1.runStep)('Fetch package IDs', 'get_media_buys', async () => client.executeTask('get_media_buys', {
|
|
1134
|
+
media_buy_ids: [mediaBuyId],
|
|
1135
|
+
}));
|
|
1136
|
+
if (fetchResult?.success && fetchResult?.data) {
|
|
1137
|
+
const mediaBuys = (fetchResult.data.media_buys || []);
|
|
1138
|
+
const mediaBuy = mediaBuys.find((item) => item.media_buy_id === mediaBuyId) || mediaBuys[0];
|
|
1139
|
+
const packages = (mediaBuy?.packages || []);
|
|
1140
|
+
if (packages[0]?.package_id) {
|
|
1141
|
+
packageId = packages[0].package_id;
|
|
1142
|
+
fetchStep.details = `Found package ${packageId}`;
|
|
1143
|
+
}
|
|
1144
|
+
else {
|
|
1145
|
+
fetchStep.details = `No packages found, falling back to '${packageId}'`;
|
|
1146
|
+
}
|
|
1147
|
+
}
|
|
1148
|
+
else if (fetchResult && !fetchResult.success) {
|
|
1149
|
+
fetchStep.passed = false;
|
|
1150
|
+
fetchStep.error = fetchResult.error || 'get_media_buys failed during package ID discovery';
|
|
1151
|
+
}
|
|
1152
|
+
steps.push(fetchStep);
|
|
1153
|
+
}
|
|
1154
|
+
// Step 1: Pause a package
|
|
1155
|
+
const { result: pauseResult, step: pauseStep } = await (0, client_1.runStep)('Pause package', 'update_media_buy', async () => client.updateMediaBuy({
|
|
1156
|
+
media_buy_id: mediaBuyId,
|
|
1157
|
+
packages: [{ package_id: packageId, paused: true }],
|
|
1158
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- intentional: test request bypasses strict typing
|
|
1159
|
+
}));
|
|
1160
|
+
if (pauseResult?.success && pauseResult?.data) {
|
|
1161
|
+
const data = pauseResult.data;
|
|
1162
|
+
const affectedPackages = (data.affected_packages || []);
|
|
1163
|
+
const pkg = affectedPackages.find(p => p.package_id === packageId) || affectedPackages[0];
|
|
1164
|
+
pauseStep.details = `Paused package ${packageId}, paused: ${pkg?.paused}`;
|
|
1165
|
+
pauseStep.response_preview = JSON.stringify({
|
|
1166
|
+
media_buy_id: mediaBuyId,
|
|
1167
|
+
media_buy_status: extractStatus(data),
|
|
1168
|
+
package_id: pkg?.package_id,
|
|
1169
|
+
package_paused: pkg?.paused,
|
|
1170
|
+
}, null, 2);
|
|
1171
|
+
}
|
|
1172
|
+
else if (pauseResult && !pauseResult.success) {
|
|
1173
|
+
pauseStep.passed = false;
|
|
1174
|
+
pauseStep.error = pauseResult.error || 'Package pause failed';
|
|
1175
|
+
}
|
|
1176
|
+
steps.push(pauseStep);
|
|
1177
|
+
// Step 2: Resume the package
|
|
1178
|
+
const { result: resumeResult, step: resumeStep } = await (0, client_1.runStep)('Resume package', 'update_media_buy', async () => client.updateMediaBuy({
|
|
1179
|
+
media_buy_id: mediaBuyId,
|
|
1180
|
+
packages: [{ package_id: packageId, paused: false }],
|
|
1181
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- intentional: test request bypasses strict typing
|
|
1182
|
+
}));
|
|
1183
|
+
if (resumeResult?.success && resumeResult?.data) {
|
|
1184
|
+
const data = resumeResult.data;
|
|
1185
|
+
const affectedPackages = (data.affected_packages || []);
|
|
1186
|
+
const pkg = affectedPackages.find(p => p.package_id === packageId) || affectedPackages[0];
|
|
1187
|
+
resumeStep.details = `Resumed package ${packageId}, paused: ${pkg?.paused}`;
|
|
1188
|
+
resumeStep.response_preview = JSON.stringify({
|
|
1189
|
+
media_buy_id: mediaBuyId,
|
|
1190
|
+
media_buy_status: extractStatus(data),
|
|
1191
|
+
package_id: pkg?.package_id,
|
|
1192
|
+
package_paused: pkg?.paused,
|
|
1193
|
+
}, null, 2);
|
|
1194
|
+
}
|
|
1195
|
+
else if (resumeResult && !resumeResult.success) {
|
|
1196
|
+
resumeStep.passed = false;
|
|
1197
|
+
resumeStep.error = resumeResult.error || 'Package resume failed';
|
|
1198
|
+
}
|
|
1199
|
+
steps.push(resumeStep);
|
|
1200
|
+
// Step 3: Verify media buy is still active
|
|
1201
|
+
if (profile.tools.includes('get_media_buys')) {
|
|
1202
|
+
const { result: verifyResult, step: verifyStep } = await (0, client_1.runStep)('Verify media buy still active after package operations', 'get_media_buys', async () => client.executeTask('get_media_buys', {
|
|
1203
|
+
media_buy_ids: [mediaBuyId],
|
|
1204
|
+
}));
|
|
1205
|
+
if (verifyResult?.success && verifyResult?.data) {
|
|
1206
|
+
const mediaBuys = (verifyResult.data.media_buys || []);
|
|
1207
|
+
const mediaBuy = mediaBuys.find((item) => item.media_buy_id === mediaBuyId) || mediaBuys[0];
|
|
1208
|
+
const status = mediaBuy?.status;
|
|
1209
|
+
if (status === 'active' || status === 'pending_activation') {
|
|
1210
|
+
verifyStep.details = `Media buy still ${status} after package-level operations`;
|
|
1211
|
+
}
|
|
1212
|
+
else {
|
|
1213
|
+
verifyStep.details = `Media buy status is '${status}' — expected 'active' or 'pending_activation'`;
|
|
1214
|
+
verifyStep.warnings = [`Package-level pause/resume changed media buy status to '${status}'`];
|
|
1215
|
+
}
|
|
1216
|
+
verifyStep.response_preview = JSON.stringify({ media_buy_id: mediaBuy?.media_buy_id, status }, null, 2);
|
|
1217
|
+
}
|
|
1218
|
+
else if (verifyResult && !verifyResult.success) {
|
|
1219
|
+
verifyStep.passed = false;
|
|
1220
|
+
verifyStep.error = verifyResult.error || 'get_media_buys verification failed';
|
|
1221
|
+
}
|
|
1222
|
+
steps.push(verifyStep);
|
|
1223
|
+
}
|
|
1224
|
+
return { steps, profile };
|
|
1225
|
+
}
|
|
886
1226
|
//# sourceMappingURL=media-buy.js.map
|