@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.
Files changed (131) hide show
  1. package/README.md +13 -0
  2. package/bin/adcp.js +100 -205
  3. package/dist/lib/core/ADCPMultiAgentClient.js.map +1 -1
  4. package/dist/lib/core/AgentClient.d.ts.map +1 -1
  5. package/dist/lib/core/GovernanceMiddleware.d.ts.map +1 -1
  6. package/dist/lib/core/GovernanceMiddleware.js +2 -1
  7. package/dist/lib/core/GovernanceMiddleware.js.map +1 -1
  8. package/dist/lib/core/SingleAgentClient.d.ts.map +1 -1
  9. package/dist/lib/core/SingleAgentClient.js.map +1 -1
  10. package/dist/lib/core/TaskExecutor.d.ts.map +1 -1
  11. package/dist/lib/core/TaskExecutor.js +10 -2
  12. package/dist/lib/core/TaskExecutor.js.map +1 -1
  13. package/dist/lib/index.d.ts +5 -1
  14. package/dist/lib/index.d.ts.map +1 -1
  15. package/dist/lib/index.js +19 -4
  16. package/dist/lib/index.js.map +1 -1
  17. package/dist/lib/protocols/index.d.ts +1 -1
  18. package/dist/lib/protocols/index.d.ts.map +1 -1
  19. package/dist/lib/protocols/index.js +2 -1
  20. package/dist/lib/protocols/index.js.map +1 -1
  21. package/dist/lib/protocols/mcp.d.ts +15 -3
  22. package/dist/lib/protocols/mcp.d.ts.map +1 -1
  23. package/dist/lib/protocols/mcp.js +205 -75
  24. package/dist/lib/protocols/mcp.js.map +1 -1
  25. package/dist/lib/server/errors.d.ts +62 -0
  26. package/dist/lib/server/errors.d.ts.map +1 -0
  27. package/dist/lib/server/errors.js +54 -0
  28. package/dist/lib/server/errors.js.map +1 -0
  29. package/dist/lib/server/index.d.ts +5 -0
  30. package/dist/lib/server/index.d.ts.map +1 -0
  31. package/dist/lib/server/index.js +11 -0
  32. package/dist/lib/server/index.js.map +1 -0
  33. package/dist/lib/server/responses.d.ts +64 -0
  34. package/dist/lib/server/responses.d.ts.map +1 -0
  35. package/dist/lib/server/responses.js +85 -0
  36. package/dist/lib/server/responses.js.map +1 -0
  37. package/dist/lib/testing/agent-tester.d.ts +1 -1
  38. package/dist/lib/testing/agent-tester.d.ts.map +1 -1
  39. package/dist/lib/testing/agent-tester.js +40 -1
  40. package/dist/lib/testing/agent-tester.js.map +1 -1
  41. package/dist/lib/testing/client.d.ts +6 -0
  42. package/dist/lib/testing/client.d.ts.map +1 -1
  43. package/dist/lib/testing/client.js +42 -3
  44. package/dist/lib/testing/client.js.map +1 -1
  45. package/dist/lib/testing/compliance/comply.d.ts.map +1 -1
  46. package/dist/lib/testing/compliance/comply.js +87 -2
  47. package/dist/lib/testing/compliance/comply.js.map +1 -1
  48. package/dist/lib/testing/compliance/index.d.ts +1 -1
  49. package/dist/lib/testing/compliance/index.d.ts.map +1 -1
  50. package/dist/lib/testing/compliance/index.js +2 -1
  51. package/dist/lib/testing/compliance/index.js.map +1 -1
  52. package/dist/lib/testing/compliance/profiles.d.ts +7 -0
  53. package/dist/lib/testing/compliance/profiles.d.ts.map +1 -1
  54. package/dist/lib/testing/compliance/profiles.js +10 -0
  55. package/dist/lib/testing/compliance/profiles.js.map +1 -1
  56. package/dist/lib/testing/compliance/types.d.ts +2 -2
  57. package/dist/lib/testing/compliance/types.d.ts.map +1 -1
  58. package/dist/lib/testing/index.d.ts +2 -2
  59. package/dist/lib/testing/index.d.ts.map +1 -1
  60. package/dist/lib/testing/index.js +7 -2
  61. package/dist/lib/testing/index.js.map +1 -1
  62. package/dist/lib/testing/orchestrator.d.ts.map +1 -1
  63. package/dist/lib/testing/orchestrator.js +14 -0
  64. package/dist/lib/testing/orchestrator.js.map +1 -1
  65. package/dist/lib/testing/scenarios/capabilities.js.map +1 -1
  66. package/dist/lib/testing/scenarios/creative.js +1 -1
  67. package/dist/lib/testing/scenarios/creative.js.map +1 -1
  68. package/dist/lib/testing/scenarios/edge-cases.js.map +1 -1
  69. package/dist/lib/testing/scenarios/error-compliance.d.ts +30 -0
  70. package/dist/lib/testing/scenarios/error-compliance.d.ts.map +1 -0
  71. package/dist/lib/testing/scenarios/error-compliance.js +382 -0
  72. package/dist/lib/testing/scenarios/error-compliance.js.map +1 -0
  73. package/dist/lib/testing/scenarios/governance.js.map +1 -1
  74. package/dist/lib/testing/scenarios/index.d.ts +2 -1
  75. package/dist/lib/testing/scenarios/index.d.ts.map +1 -1
  76. package/dist/lib/testing/scenarios/index.js +9 -1
  77. package/dist/lib/testing/scenarios/index.js.map +1 -1
  78. package/dist/lib/testing/scenarios/media-buy.d.ts +24 -0
  79. package/dist/lib/testing/scenarios/media-buy.d.ts.map +1 -1
  80. package/dist/lib/testing/scenarios/media-buy.js +341 -1
  81. package/dist/lib/testing/scenarios/media-buy.js.map +1 -1
  82. package/dist/lib/testing/scenarios/schema-compliance.d.ts.map +1 -1
  83. package/dist/lib/testing/scenarios/schema-compliance.js +3 -0
  84. package/dist/lib/testing/scenarios/schema-compliance.js.map +1 -1
  85. package/dist/lib/testing/scenarios/signals.d.ts.map +1 -1
  86. package/dist/lib/testing/scenarios/signals.js +24 -22
  87. package/dist/lib/testing/scenarios/signals.js.map +1 -1
  88. package/dist/lib/testing/scenarios/sponsored-intelligence.js.map +1 -1
  89. package/dist/lib/testing/types.d.ts +1 -1
  90. package/dist/lib/testing/types.d.ts.map +1 -1
  91. package/dist/lib/types/core.generated.d.ts +25 -2
  92. package/dist/lib/types/core.generated.d.ts.map +1 -1
  93. package/dist/lib/types/core.generated.js +1 -1
  94. package/dist/lib/types/schemas.generated.d.ts +371 -330
  95. package/dist/lib/types/schemas.generated.d.ts.map +1 -1
  96. package/dist/lib/types/schemas.generated.js +78 -84
  97. package/dist/lib/types/schemas.generated.js.map +1 -1
  98. package/dist/lib/types/tools.generated.d.ts +131 -122
  99. package/dist/lib/types/tools.generated.d.ts.map +1 -1
  100. package/dist/lib/utils/capabilities.d.ts +1 -1
  101. package/dist/lib/utils/capabilities.d.ts.map +1 -1
  102. package/dist/lib/utils/capabilities.js +17 -8
  103. package/dist/lib/utils/capabilities.js.map +1 -1
  104. package/dist/lib/utils/creative-adapter.d.ts.map +1 -1
  105. package/dist/lib/utils/creative-adapter.js.map +1 -1
  106. package/dist/lib/utils/error-extraction.d.ts +57 -0
  107. package/dist/lib/utils/error-extraction.d.ts.map +1 -0
  108. package/dist/lib/utils/error-extraction.js +174 -0
  109. package/dist/lib/utils/error-extraction.js.map +1 -0
  110. package/dist/lib/utils/index.d.ts +2 -0
  111. package/dist/lib/utils/index.d.ts.map +1 -1
  112. package/dist/lib/utils/index.js +7 -1
  113. package/dist/lib/utils/index.js.map +1 -1
  114. package/dist/lib/utils/preview-utils.d.ts.map +1 -1
  115. package/dist/lib/utils/preview-utils.js +32 -16
  116. package/dist/lib/utils/preview-utils.js.map +1 -1
  117. package/dist/lib/utils/request-normalizer.d.ts.map +1 -1
  118. package/dist/lib/utils/request-normalizer.js +15 -1
  119. package/dist/lib/utils/request-normalizer.js.map +1 -1
  120. package/dist/lib/utils/response-schemas.d.ts +9 -0
  121. package/dist/lib/utils/response-schemas.d.ts.map +1 -0
  122. package/dist/lib/utils/response-schemas.js +59 -0
  123. package/dist/lib/utils/response-schemas.js.map +1 -0
  124. package/dist/lib/utils/response-unwrapper.d.ts +2 -2
  125. package/dist/lib/utils/response-unwrapper.d.ts.map +1 -1
  126. package/dist/lib/utils/response-unwrapper.js +54 -91
  127. package/dist/lib/utils/response-unwrapper.js.map +1 -1
  128. package/dist/lib/validation/index.d.ts.map +1 -1
  129. package/dist/lib/validation/index.js +3 -2
  130. package/dist/lib/validation/index.js.map +1 -1
  131. 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,yCAWqB;AAVnB,+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;AAG5B,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"}
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;AAItF;;GAEG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,GAAG,IAAI,CAiBvF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,EAAE,eAAe,CAAC,EAAE,MAAM,EAAE,GAAG,aAAa,GAAG,IAAI,CAStG;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,OAAO,EAChB,aAAa,EAAE,aAAa,EAC5B,OAAO,EAAE,WAAW,EACpB,MAAM,GAAE;IACN,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAC7C,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB,GACL,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAyCzB;AA8DD;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC;IAAE,KAAK,EAAE,cAAc,EAAE,CAAC;IAAC,OAAO,CAAC,EAAE,YAAY,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CA2GnF;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC;IAAE,KAAK,EAAE,cAAc,EAAE,CAAC;IAAC,OAAO,CAAC,EAAE,YAAY,CAAA;CAAE,CAAC,CAqI9D;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC;IAAE,KAAK,EAAE,cAAc,EAAE,CAAC;IAAC,OAAO,CAAC,EAAE,YAAY,CAAA;CAAE,CAAC,CA+I9D;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC;IAAE,KAAK,EAAE,cAAc,EAAE,CAAC;IAAC,OAAO,CAAC,EAAE,YAAY,CAAA;CAAE,CAAC,CAuJ9D;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC;IAAE,KAAK,EAAE,cAAc,EAAE,CAAC;IAAC,OAAO,CAAC,EAAE,YAAY,CAAA;CAAE,CAAC,CAwK9D;AAMD;;;;;;GAMG;AACH,wBAAsB,0BAA0B,CAC9C,OAAO,EAAE,WAAW,EACpB,KAAK,EAAE,MAAM,EAAE,EACf,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,UAAU,CAAC,GACrE,OAAO,CAAC;IAAE,UAAU,EAAE,gBAAgB,GAAG,SAAS,CAAC;IAAC,KAAK,EAAE,cAAc,EAAE,CAAA;CAAE,CAAC,CAmEhF;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC;IAAE,KAAK,EAAE,cAAc,EAAE,CAAC;IAAC,OAAO,CAAC,EAAE,YAAY,CAAA;CAAE,CAAC,CA+J9D"}
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
- name: `Inline Test Creative ${Date.now()}`,
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