@adcp/sdk 5.25.1 → 6.0.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 (288) hide show
  1. package/README.md +45 -7
  2. package/dist/lib/compliance-fixtures/index.d.ts +1 -1
  3. package/dist/lib/compliance-fixtures/index.js +1 -1
  4. package/dist/lib/core/AgentClient.d.ts.map +1 -1
  5. package/dist/lib/core/SingleAgentClient.d.ts.map +1 -1
  6. package/dist/lib/core/SingleAgentClient.js +15 -0
  7. package/dist/lib/core/SingleAgentClient.js.map +1 -1
  8. package/dist/lib/core/TaskExecutor.d.ts +7 -0
  9. package/dist/lib/core/TaskExecutor.d.ts.map +1 -1
  10. package/dist/lib/core/TaskExecutor.js +9 -2
  11. package/dist/lib/core/TaskExecutor.js.map +1 -1
  12. package/dist/lib/index.d.ts +1 -1
  13. package/dist/lib/index.d.ts.map +1 -1
  14. package/dist/lib/index.js +7 -8
  15. package/dist/lib/index.js.map +1 -1
  16. package/dist/lib/schemas/index.d.ts +1 -1
  17. package/dist/lib/schemas/index.js +1 -1
  18. package/dist/lib/server/create-adcp-server.d.ts +129 -11
  19. package/dist/lib/server/create-adcp-server.d.ts.map +1 -1
  20. package/dist/lib/server/create-adcp-server.js +112 -2
  21. package/dist/lib/server/create-adcp-server.js.map +1 -1
  22. package/dist/lib/server/ctx-metadata/backends/memory.d.ts +27 -0
  23. package/dist/lib/server/ctx-metadata/backends/memory.d.ts.map +1 -0
  24. package/dist/lib/server/ctx-metadata/backends/memory.js +72 -0
  25. package/dist/lib/server/ctx-metadata/backends/memory.js.map +1 -0
  26. package/dist/lib/server/ctx-metadata/backends/pg.d.ts +62 -0
  27. package/dist/lib/server/ctx-metadata/backends/pg.d.ts.map +1 -0
  28. package/dist/lib/server/ctx-metadata/backends/pg.js +145 -0
  29. package/dist/lib/server/ctx-metadata/backends/pg.js.map +1 -0
  30. package/dist/lib/server/ctx-metadata/index.d.ts +15 -0
  31. package/dist/lib/server/ctx-metadata/index.d.ts.map +1 -0
  32. package/dist/lib/server/ctx-metadata/index.js +28 -0
  33. package/dist/lib/server/ctx-metadata/index.js.map +1 -0
  34. package/dist/lib/server/ctx-metadata/store.d.ts +177 -0
  35. package/dist/lib/server/ctx-metadata/store.d.ts.map +1 -0
  36. package/dist/lib/server/ctx-metadata/store.js +327 -0
  37. package/dist/lib/server/ctx-metadata/store.js.map +1 -0
  38. package/dist/lib/server/ctx-metadata/wire-shape.d.ts +55 -0
  39. package/dist/lib/server/ctx-metadata/wire-shape.d.ts.map +1 -0
  40. package/dist/lib/server/ctx-metadata/wire-shape.js +121 -0
  41. package/dist/lib/server/ctx-metadata/wire-shape.js.map +1 -0
  42. package/dist/lib/server/decisioning/account.d.ts +309 -0
  43. package/dist/lib/server/decisioning/account.d.ts.map +1 -0
  44. package/dist/lib/server/decisioning/account.js +102 -0
  45. package/dist/lib/server/decisioning/account.js.map +1 -0
  46. package/dist/lib/server/decisioning/admin-router.d.ts +75 -0
  47. package/dist/lib/server/decisioning/admin-router.d.ts.map +1 -0
  48. package/dist/lib/server/decisioning/admin-router.js +120 -0
  49. package/dist/lib/server/decisioning/admin-router.js.map +1 -0
  50. package/dist/lib/server/decisioning/assembly-helpers.d.ts +204 -0
  51. package/dist/lib/server/decisioning/assembly-helpers.d.ts.map +1 -0
  52. package/dist/lib/server/decisioning/assembly-helpers.js +173 -0
  53. package/dist/lib/server/decisioning/assembly-helpers.js.map +1 -0
  54. package/dist/lib/server/decisioning/async-outcome.d.ts +154 -0
  55. package/dist/lib/server/decisioning/async-outcome.d.ts.map +1 -0
  56. package/dist/lib/server/decisioning/async-outcome.js +239 -0
  57. package/dist/lib/server/decisioning/async-outcome.js.map +1 -0
  58. package/dist/lib/server/decisioning/capabilities.d.ts +251 -0
  59. package/dist/lib/server/decisioning/capabilities.d.ts.map +1 -0
  60. package/dist/lib/server/decisioning/capabilities.js +16 -0
  61. package/dist/lib/server/decisioning/capabilities.js.map +1 -0
  62. package/dist/lib/server/decisioning/context.d.ts +212 -0
  63. package/dist/lib/server/decisioning/context.d.ts.map +1 -0
  64. package/dist/lib/server/decisioning/context.js +26 -0
  65. package/dist/lib/server/decisioning/context.js.map +1 -0
  66. package/dist/lib/server/decisioning/errors-typed.d.ts +104 -0
  67. package/dist/lib/server/decisioning/errors-typed.d.ts.map +1 -0
  68. package/dist/lib/server/decisioning/errors-typed.js +304 -0
  69. package/dist/lib/server/decisioning/errors-typed.js.map +1 -0
  70. package/dist/lib/server/decisioning/helpers.d.ts +131 -0
  71. package/dist/lib/server/decisioning/helpers.d.ts.map +1 -0
  72. package/dist/lib/server/decisioning/helpers.js +134 -0
  73. package/dist/lib/server/decisioning/helpers.js.map +1 -0
  74. package/dist/lib/server/decisioning/index.d.ts +46 -0
  75. package/dist/lib/server/decisioning/index.d.ts.map +1 -0
  76. package/dist/lib/server/decisioning/index.js +120 -0
  77. package/dist/lib/server/decisioning/index.js.map +1 -0
  78. package/dist/lib/server/decisioning/list-helpers.d.ts +53 -0
  79. package/dist/lib/server/decisioning/list-helpers.d.ts.map +1 -0
  80. package/dist/lib/server/decisioning/list-helpers.js +96 -0
  81. package/dist/lib/server/decisioning/list-helpers.js.map +1 -0
  82. package/dist/lib/server/decisioning/manifest-helpers.d.ts +56 -0
  83. package/dist/lib/server/decisioning/manifest-helpers.d.ts.map +1 -0
  84. package/dist/lib/server/decisioning/manifest-helpers.js +78 -0
  85. package/dist/lib/server/decisioning/manifest-helpers.js.map +1 -0
  86. package/dist/lib/server/decisioning/pagination.d.ts +21 -0
  87. package/dist/lib/server/decisioning/pagination.d.ts.map +1 -0
  88. package/dist/lib/server/decisioning/pagination.js +12 -0
  89. package/dist/lib/server/decisioning/pagination.js.map +1 -0
  90. package/dist/lib/server/decisioning/platform.d.ts +188 -0
  91. package/dist/lib/server/decisioning/platform.d.ts.map +1 -0
  92. package/dist/lib/server/decisioning/platform.js +19 -0
  93. package/dist/lib/server/decisioning/platform.js.map +1 -0
  94. package/dist/lib/server/decisioning/runtime/from-platform.d.ts +510 -0
  95. package/dist/lib/server/decisioning/runtime/from-platform.d.ts.map +1 -0
  96. package/dist/lib/server/decisioning/runtime/from-platform.js +2196 -0
  97. package/dist/lib/server/decisioning/runtime/from-platform.js.map +1 -0
  98. package/dist/lib/server/decisioning/runtime/postgres-task-registry.d.ts +114 -0
  99. package/dist/lib/server/decisioning/runtime/postgres-task-registry.d.ts.map +1 -0
  100. package/dist/lib/server/decisioning/runtime/postgres-task-registry.js +247 -0
  101. package/dist/lib/server/decisioning/runtime/postgres-task-registry.js.map +1 -0
  102. package/dist/lib/server/decisioning/runtime/protocol-for-tool.d.ts +32 -0
  103. package/dist/lib/server/decisioning/runtime/protocol-for-tool.d.ts.map +1 -0
  104. package/dist/lib/server/decisioning/runtime/protocol-for-tool.js +127 -0
  105. package/dist/lib/server/decisioning/runtime/protocol-for-tool.js.map +1 -0
  106. package/dist/lib/server/decisioning/runtime/task-registry.d.ts +105 -0
  107. package/dist/lib/server/decisioning/runtime/task-registry.d.ts.map +1 -0
  108. package/dist/lib/server/decisioning/runtime/task-registry.js +96 -0
  109. package/dist/lib/server/decisioning/runtime/task-registry.js.map +1 -0
  110. package/dist/lib/server/decisioning/runtime/to-context.d.ts +54 -0
  111. package/dist/lib/server/decisioning/runtime/to-context.d.ts.map +1 -0
  112. package/dist/lib/server/decisioning/runtime/to-context.js +166 -0
  113. package/dist/lib/server/decisioning/runtime/to-context.js.map +1 -0
  114. package/dist/lib/server/decisioning/runtime/validate-platform.d.ts +20 -0
  115. package/dist/lib/server/decisioning/runtime/validate-platform.d.ts.map +1 -0
  116. package/dist/lib/server/decisioning/runtime/validate-platform.js +93 -0
  117. package/dist/lib/server/decisioning/runtime/validate-platform.js.map +1 -0
  118. package/dist/lib/server/decisioning/specialisms/audiences.d.ts +72 -0
  119. package/dist/lib/server/decisioning/specialisms/audiences.d.ts.map +1 -0
  120. package/dist/lib/server/decisioning/specialisms/audiences.js +15 -0
  121. package/dist/lib/server/decisioning/specialisms/audiences.js.map +1 -0
  122. package/dist/lib/server/decisioning/specialisms/brand-rights.d.ts +92 -0
  123. package/dist/lib/server/decisioning/specialisms/brand-rights.d.ts.map +1 -0
  124. package/dist/lib/server/decisioning/specialisms/brand-rights.js +28 -0
  125. package/dist/lib/server/decisioning/specialisms/brand-rights.js.map +1 -0
  126. package/dist/lib/server/decisioning/specialisms/campaign-governance.d.ts +67 -0
  127. package/dist/lib/server/decisioning/specialisms/campaign-governance.d.ts.map +1 -0
  128. package/dist/lib/server/decisioning/specialisms/campaign-governance.js +31 -0
  129. package/dist/lib/server/decisioning/specialisms/campaign-governance.js.map +1 -0
  130. package/dist/lib/server/decisioning/specialisms/content-standards.d.ts +78 -0
  131. package/dist/lib/server/decisioning/specialisms/content-standards.d.ts.map +1 -0
  132. package/dist/lib/server/decisioning/specialisms/content-standards.js +35 -0
  133. package/dist/lib/server/decisioning/specialisms/content-standards.js.map +1 -0
  134. package/dist/lib/server/decisioning/specialisms/creative-ad-server.d.ts +81 -0
  135. package/dist/lib/server/decisioning/specialisms/creative-ad-server.d.ts.map +1 -0
  136. package/dist/lib/server/decisioning/specialisms/creative-ad-server.js +28 -0
  137. package/dist/lib/server/decisioning/specialisms/creative-ad-server.js.map +1 -0
  138. package/dist/lib/server/decisioning/specialisms/creative.d.ts +144 -0
  139. package/dist/lib/server/decisioning/specialisms/creative.d.ts.map +1 -0
  140. package/dist/lib/server/decisioning/specialisms/creative.js +19 -0
  141. package/dist/lib/server/decisioning/specialisms/creative.js.map +1 -0
  142. package/dist/lib/server/decisioning/specialisms/lists.d.ts +61 -0
  143. package/dist/lib/server/decisioning/specialisms/lists.d.ts.map +1 -0
  144. package/dist/lib/server/decisioning/specialisms/lists.js +30 -0
  145. package/dist/lib/server/decisioning/specialisms/lists.js.map +1 -0
  146. package/dist/lib/server/decisioning/specialisms/sales.d.ts +163 -0
  147. package/dist/lib/server/decisioning/specialisms/sales.d.ts.map +1 -0
  148. package/dist/lib/server/decisioning/specialisms/sales.js +64 -0
  149. package/dist/lib/server/decisioning/specialisms/sales.js.map +1 -0
  150. package/dist/lib/server/decisioning/specialisms/signals.d.ts +64 -0
  151. package/dist/lib/server/decisioning/specialisms/signals.d.ts.map +1 -0
  152. package/dist/lib/server/decisioning/specialisms/signals.js +28 -0
  153. package/dist/lib/server/decisioning/specialisms/signals.js.map +1 -0
  154. package/dist/lib/server/decisioning/start-time.d.ts +76 -0
  155. package/dist/lib/server/decisioning/start-time.d.ts.map +1 -0
  156. package/dist/lib/server/decisioning/start-time.js +81 -0
  157. package/dist/lib/server/decisioning/start-time.js.map +1 -0
  158. package/dist/lib/server/decisioning/status-changes.d.ts +165 -0
  159. package/dist/lib/server/decisioning/status-changes.d.ts.map +1 -0
  160. package/dist/lib/server/decisioning/status-changes.js +131 -0
  161. package/dist/lib/server/decisioning/status-changes.js.map +1 -0
  162. package/dist/lib/server/decisioning/status-mappers.d.ts +46 -0
  163. package/dist/lib/server/decisioning/status-mappers.d.ts.map +1 -0
  164. package/dist/lib/server/decisioning/status-mappers.js +46 -0
  165. package/dist/lib/server/decisioning/status-mappers.js.map +1 -0
  166. package/dist/lib/server/decisioning/tenant-registry.d.ts +289 -0
  167. package/dist/lib/server/decisioning/tenant-registry.d.ts.map +1 -0
  168. package/dist/lib/server/decisioning/tenant-registry.js +503 -0
  169. package/dist/lib/server/decisioning/tenant-registry.js.map +1 -0
  170. package/dist/lib/server/express-adapter.d.ts +1 -1
  171. package/dist/lib/server/express-adapter.js +1 -1
  172. package/dist/lib/server/governance.d.ts +1 -1
  173. package/dist/lib/server/governance.js +1 -1
  174. package/dist/lib/server/idempotency/store.d.ts +1 -1
  175. package/dist/lib/server/idempotency/store.js +1 -1
  176. package/dist/lib/server/index.d.ts +9 -2
  177. package/dist/lib/server/index.d.ts.map +1 -1
  178. package/dist/lib/server/index.js +79 -4
  179. package/dist/lib/server/index.js.map +1 -1
  180. package/dist/lib/server/legacy/v5/index.d.ts +38 -0
  181. package/dist/lib/server/legacy/v5/index.d.ts.map +1 -0
  182. package/dist/lib/server/legacy/v5/index.js +60 -0
  183. package/dist/lib/server/legacy/v5/index.js.map +1 -0
  184. package/dist/lib/server/normalize-errors.d.ts +88 -0
  185. package/dist/lib/server/normalize-errors.d.ts.map +1 -0
  186. package/dist/lib/server/normalize-errors.js +146 -0
  187. package/dist/lib/server/normalize-errors.js.map +1 -0
  188. package/dist/lib/server/pick-safe-details.d.ts +90 -0
  189. package/dist/lib/server/pick-safe-details.d.ts.map +1 -0
  190. package/dist/lib/server/pick-safe-details.js +148 -0
  191. package/dist/lib/server/pick-safe-details.js.map +1 -0
  192. package/dist/lib/server/postgres-state-store.d.ts +1 -1
  193. package/dist/lib/server/postgres-state-store.js +1 -1
  194. package/dist/lib/server/responses.d.ts +38 -0
  195. package/dist/lib/server/responses.d.ts.map +1 -1
  196. package/dist/lib/server/responses.js +38 -0
  197. package/dist/lib/server/responses.js.map +1 -1
  198. package/dist/lib/server/state-store.d.ts +1 -1
  199. package/dist/lib/server/state-store.js +1 -1
  200. package/dist/lib/server/test-controller.d.ts +10 -3
  201. package/dist/lib/server/test-controller.d.ts.map +1 -1
  202. package/dist/lib/server/test-controller.js +10 -3
  203. package/dist/lib/server/test-controller.js.map +1 -1
  204. package/dist/lib/testing/comply-controller.d.ts +47 -1
  205. package/dist/lib/testing/comply-controller.d.ts.map +1 -1
  206. package/dist/lib/testing/comply-controller.js +11 -4
  207. package/dist/lib/testing/comply-controller.js.map +1 -1
  208. package/dist/lib/testing/index.d.ts +1 -1
  209. package/dist/lib/testing/index.d.ts.map +1 -1
  210. package/dist/lib/testing/index.js.map +1 -1
  211. package/dist/lib/testing/personas/index.d.ts +143 -0
  212. package/dist/lib/testing/personas/index.d.ts.map +1 -0
  213. package/dist/lib/testing/personas/index.js +190 -0
  214. package/dist/lib/testing/personas/index.js.map +1 -0
  215. package/dist/lib/testing/storyboard/index.d.ts +1 -1
  216. package/dist/lib/testing/storyboard/index.d.ts.map +1 -1
  217. package/dist/lib/testing/storyboard/index.js +3 -2
  218. package/dist/lib/testing/storyboard/index.js.map +1 -1
  219. package/dist/lib/testing/storyboard/runner.d.ts +13 -0
  220. package/dist/lib/testing/storyboard/runner.d.ts.map +1 -1
  221. package/dist/lib/testing/storyboard/runner.js +179 -7
  222. package/dist/lib/testing/storyboard/runner.js.map +1 -1
  223. package/dist/lib/types/asset-instances.d.ts +1 -0
  224. package/dist/lib/types/asset-instances.d.ts.map +1 -1
  225. package/dist/lib/types/core.generated.d.ts +203 -98
  226. package/dist/lib/types/core.generated.d.ts.map +1 -1
  227. package/dist/lib/types/core.generated.js +1 -1
  228. package/dist/lib/types/index.d.ts +1 -0
  229. package/dist/lib/types/index.d.ts.map +1 -1
  230. package/dist/lib/types/index.js.map +1 -1
  231. package/dist/lib/types/schemas.generated.d.ts +599 -159
  232. package/dist/lib/types/schemas.generated.d.ts.map +1 -1
  233. package/dist/lib/types/schemas.generated.js +175 -94
  234. package/dist/lib/types/schemas.generated.js.map +1 -1
  235. package/dist/lib/types/tools.generated.d.ts +315 -46
  236. package/dist/lib/types/tools.generated.d.ts.map +1 -1
  237. package/dist/lib/utils/capabilities.d.ts +1 -1
  238. package/dist/lib/utils/capabilities.d.ts.map +1 -1
  239. package/dist/lib/utils/capabilities.js +6 -0
  240. package/dist/lib/utils/capabilities.js.map +1 -1
  241. package/dist/lib/validation/schema-validator.d.ts +13 -0
  242. package/dist/lib/validation/schema-validator.d.ts.map +1 -1
  243. package/dist/lib/validation/schema-validator.js +240 -3
  244. package/dist/lib/validation/schema-validator.js.map +1 -1
  245. package/dist/lib/version.d.ts +3 -3
  246. package/dist/lib/version.d.ts.map +1 -1
  247. package/dist/lib/version.js +3 -3
  248. package/dist/lib/version.js.map +1 -1
  249. package/docs/guides/BUILD-AN-AGENT.md +30 -5
  250. package/docs/llms.txt +28 -17
  251. package/examples/README.md +3 -1
  252. package/examples/decisioning-platform-broadcast-tv.ts +300 -0
  253. package/examples/decisioning-platform-identity-graph.ts +214 -0
  254. package/examples/decisioning-platform-mock-seller.ts +332 -0
  255. package/examples/decisioning-platform-multi-tenant.ts +128 -0
  256. package/examples/decisioning-platform-programmatic.ts +254 -0
  257. package/examples/signals-agent.ts +1 -1
  258. package/package.json +13 -2
  259. package/skills/build-brand-rights-agent/SKILL.md +10 -3
  260. package/skills/build-creative-agent/SKILL.md +94 -64
  261. package/skills/build-decisioning-creative-template/SKILL.md +554 -0
  262. package/skills/build-decisioning-platform/SKILL.md +304 -0
  263. package/skills/build-decisioning-platform/advanced/BRAND-RIGHTS.md +25 -0
  264. package/skills/build-decisioning-platform/advanced/COMPLIANCE.md +23 -0
  265. package/skills/build-decisioning-platform/advanced/GOVERNANCE.md +24 -0
  266. package/skills/build-decisioning-platform/advanced/HITL.md +34 -0
  267. package/skills/build-decisioning-platform/advanced/IDEMPOTENCY.md +52 -0
  268. package/skills/build-decisioning-platform/advanced/MULTI-TENANT.md +47 -0
  269. package/skills/build-decisioning-platform/advanced/OAUTH.md +22 -0
  270. package/skills/build-decisioning-platform/advanced/REFERENCE.md +991 -0
  271. package/skills/build-decisioning-platform/advanced/SANDBOX.md +24 -0
  272. package/skills/build-decisioning-platform/advanced/STATE-MACHINE.md +52 -0
  273. package/skills/build-decisioning-signal-marketplace/SKILL.md +269 -0
  274. package/skills/build-generative-seller-agent/SKILL.md +89 -53
  275. package/skills/build-governance-agent/SKILL.md +76 -45
  276. package/skills/build-retail-media-agent/SKILL.md +87 -62
  277. package/skills/build-seller-agent/SKILL.md +384 -255
  278. package/skills/build-seller-agent/deployment.md +5 -3
  279. package/skills/build-seller-agent/specialisms/audience-sync.md +0 -2
  280. package/skills/build-seller-agent/specialisms/sales-broadcast-tv.md +0 -2
  281. package/skills/build-seller-agent/specialisms/sales-guaranteed.md +0 -2
  282. package/skills/build-seller-agent/specialisms/sales-non-guaranteed.md +0 -2
  283. package/skills/build-seller-agent/specialisms/sales-proposal-mode.md +0 -2
  284. package/skills/build-seller-agent/specialisms/sales-social.md +0 -2
  285. package/skills/build-seller-agent/specialisms/signed-requests.md +0 -2
  286. package/skills/build-si-agent/SKILL.md +40 -32
  287. package/skills/build-signals-agent/SKILL.md +139 -92
  288. package/skills/call-adcp-agent.previous/SKILL.md +5 -0
@@ -0,0 +1,190 @@
1
+ "use strict";
2
+ /**
3
+ * Canonical buyer personas — typed, immutable test fixtures every
4
+ * adopter would otherwise rewrite. Each persona carries enough identity
5
+ * (brand domain, account_id, promoted_offering, brief) to drive the
6
+ * common AdCP request shapes without surface-area surprises.
7
+ *
8
+ * Use when you want a deterministic buyer to drive an integration test
9
+ * against your seller / signal / creative agent. Pair with the builder
10
+ * helpers below to construct wire-shaped requests in one line.
11
+ *
12
+ * The four shipped personas span the verticals and budget classes most
13
+ * sellers see: enterprise CTV, performance social, premium B2B, and
14
+ * geo-targeted local. Adopters who need richer coverage extend the
15
+ * pattern; this set intentionally stays small to keep the surface
16
+ * stable through preview.
17
+ *
18
+ * Status: Preview / 6.0.
19
+ *
20
+ * @example
21
+ * ```ts
22
+ * import { dtcSkincareBuyer, buildGetProductsRequest } from '@adcp/sdk/testing/personas';
23
+ *
24
+ * const result = await server.dispatchTestRequest({
25
+ * method: 'tools/call',
26
+ * params: {
27
+ * name: 'get_products',
28
+ * arguments: buildGetProductsRequest(dtcSkincareBuyer),
29
+ * },
30
+ * });
31
+ * ```
32
+ *
33
+ * @public
34
+ */
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.ALL_PERSONAS = exports.restaurantLocalBuyer = exports.b2bSaasBuyer = exports.luxuryAutoBuyer = exports.dtcSkincareBuyer = void 0;
37
+ exports.getPersonaById = getPersonaById;
38
+ exports.buildAccountReference = buildAccountReference;
39
+ exports.buildBrandReference = buildBrandReference;
40
+ exports.buildGetProductsRequest = buildGetProductsRequest;
41
+ /**
42
+ * DTC ecommerce on a tight performance budget. Social-first, Gen-Z
43
+ * audience, $50K test budget, performance pricing models preferred.
44
+ * Mirrors the `dtc_skincare_genZ` SampleBrief.
45
+ *
46
+ * @public
47
+ */
48
+ exports.dtcSkincareBuyer = {
49
+ id: 'dtc_skincare_buyer',
50
+ name: 'Glow Lab — DTC Skincare',
51
+ vertical: 'Beauty & Personal Care',
52
+ brand: { domain: 'glowlab.example.com', name: 'Glow Lab' },
53
+ account_id: 'acc_glowlab',
54
+ promoted_offering: 'Glow Lab Vitamin C Serum + first-time-buyer 20% off',
55
+ brief: 'Direct-to-consumer skincare brand targeting Gen Z females (18-25). ' +
56
+ 'Social-first campaign with UGC-style creative preferred. ' +
57
+ 'Goal is driving trial purchases through a 20% off promo code. ' +
58
+ 'Performance-oriented: need clear CPA/CPC pricing.',
59
+ budget: { amount: 50_000, currency: 'USD' },
60
+ channels: ['social', 'display'],
61
+ };
62
+ /**
63
+ * Luxury automotive launch. High-impact video + premium display, $500K
64
+ * Q3 flight, brand safety critical. Mirrors the `luxury_auto_ev`
65
+ * SampleBrief.
66
+ *
67
+ * @public
68
+ */
69
+ exports.luxuryAutoBuyer = {
70
+ id: 'luxury_auto_buyer',
71
+ name: 'Velara Motors — EV Launch',
72
+ vertical: 'Automotive',
73
+ brand: { domain: 'velaramotors.example.com', name: 'Velara Motors' },
74
+ account_id: 'acc_velara',
75
+ promoted_offering: 'Velara V1 — luxury electric crossover SUV',
76
+ brief: 'Luxury automotive brand launching a new electric crossover SUV. ' +
77
+ 'Targeting high-income households ($150K+ HHI), ages 30-55, in major US metros. ' +
78
+ 'Need high-impact video and premium display placements. ' +
79
+ 'Q3 flight (July-September). Key message: "The future of luxury driving." ' +
80
+ 'Brand safety is critical — no UGC or controversial adjacency.',
81
+ budget: { amount: 500_000, currency: 'USD' },
82
+ channels: ['olv', 'ctv', 'display'],
83
+ };
84
+ /**
85
+ * Enterprise B2B SaaS awareness — premium publisher placements,
86
+ * viewability benchmarks, $200K over six weeks. Mirrors the
87
+ * `b2b_saas_awareness` SampleBrief.
88
+ *
89
+ * @public
90
+ */
91
+ exports.b2bSaasBuyer = {
92
+ id: 'b2b_saas_buyer',
93
+ name: 'Threadline — Workflow Platform',
94
+ vertical: 'Technology / B2B',
95
+ brand: { domain: 'threadline.example.com', name: 'Threadline' },
96
+ account_id: 'acc_threadline',
97
+ promoted_offering: 'Threadline workflow platform — annual enterprise plan',
98
+ brief: 'Enterprise SaaS company building brand awareness among IT decision-makers and C-suite executives. ' +
99
+ 'Looking for premium editorial environments — business, technology, and finance publishers. ' +
100
+ 'Display and native content placements preferred. CTV is acceptable if targeting is precise. ' +
101
+ 'Viewability benchmarks are important — need 70%+ viewability guarantee.',
102
+ budget: { amount: 200_000, currency: 'USD' },
103
+ channels: ['display', 'ctv'],
104
+ };
105
+ /**
106
+ * Regional QSR / restaurant chain — geo-targeted mobile + display
107
+ * within radius, foot-traffic attribution. Mirrors the
108
+ * `restaurant_local` SampleBrief.
109
+ *
110
+ * @public
111
+ */
112
+ exports.restaurantLocalBuyer = {
113
+ id: 'restaurant_local_buyer',
114
+ name: 'Anchor & Oak — Regional Chain',
115
+ vertical: 'QSR / Restaurant',
116
+ brand: { domain: 'anchorandoak.example.com', name: 'Anchor & Oak' },
117
+ account_id: 'acc_anchoroak',
118
+ promoted_offering: 'Anchor & Oak summer menu — promoted across 15 metros',
119
+ brief: 'Regional restaurant chain promoting a new menu launch across 15 metro areas. ' +
120
+ 'Need geo-targeted mobile and display ads within 5-mile radius of each location. ' +
121
+ 'Audio/podcast ads are also interesting if available. ' +
122
+ 'Performance tracking: need foot traffic attribution or store visit metrics.',
123
+ budget: { amount: 75_000, currency: 'USD' },
124
+ channels: ['display', 'audio'],
125
+ };
126
+ /**
127
+ * All shipped personas, in stable order. Adopters iterate this array
128
+ * to run a scenario across every canonical buyer in one loop.
129
+ *
130
+ * @public
131
+ */
132
+ exports.ALL_PERSONAS = [
133
+ exports.dtcSkincareBuyer,
134
+ exports.luxuryAutoBuyer,
135
+ exports.b2bSaasBuyer,
136
+ exports.restaurantLocalBuyer,
137
+ ];
138
+ /**
139
+ * Look up a persona by `id`. Returns `undefined` for unknown IDs —
140
+ * test code asserting on a specific persona should narrow with a
141
+ * non-null check.
142
+ *
143
+ * @public
144
+ */
145
+ function getPersonaById(id) {
146
+ return exports.ALL_PERSONAS.find(p => p.id === id);
147
+ }
148
+ // ---------------------------------------------------------------------------
149
+ // Wire-shape builders
150
+ // ---------------------------------------------------------------------------
151
+ /**
152
+ * Build an {@link AccountReference} pointing at the persona's account.
153
+ * Discriminated-union narrowing concern: the wire shape allows
154
+ * `account_id`, `brand`, or `brand + operator`. This builder always
155
+ * returns the `account_id` arm — adopters who need the brand-arm shape
156
+ * should compose `buildBrandReference(persona)` with their own operator.
157
+ *
158
+ * @public
159
+ */
160
+ function buildAccountReference(persona) {
161
+ return { account_id: persona.account_id };
162
+ }
163
+ /**
164
+ * Build a {@link BrandReference} from the persona's brand identity.
165
+ * Domain is the canonical field; name is dropped (the wire spec doesn't
166
+ * carry it on `BrandReference` — sellers resolve via brand.json).
167
+ *
168
+ * @public
169
+ */
170
+ function buildBrandReference(persona) {
171
+ return { domain: persona.brand.domain };
172
+ }
173
+ /**
174
+ * Build a wire-shaped {@link GetProductsRequest} keyed to this persona —
175
+ * `buying_mode: 'brief'`, the persona's `brief` text, brand reference,
176
+ * and account reference. Pass `overrides` to add `filters`,
177
+ * `preferred_delivery_types`, `time_budget`, etc.
178
+ *
179
+ * @public
180
+ */
181
+ function buildGetProductsRequest(persona, overrides) {
182
+ return {
183
+ buying_mode: 'brief',
184
+ brief: persona.brief,
185
+ brand: buildBrandReference(persona),
186
+ account: buildAccountReference(persona),
187
+ ...overrides,
188
+ };
189
+ }
190
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/lib/testing/personas/index.ts"],"names":[],"mappings":"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"}
@@ -16,7 +16,7 @@ export type { CapturedWebhook, CreateWebhookReceiverOptions, RetryReplayPolicy,
16
16
  export { createRunnerVariables } from './context';
17
17
  export type { RunnerVariables } from './context';
18
18
  export { WEBHOOK_ASSERTION_TASKS } from './webhook-assertions';
19
- export { runStoryboard, runStoryboardStep, getFirstStepPreview, summarizeStrictValidation, listStrictOnlyFailures, resolveCapabilityPath, } from './runner';
19
+ export { runStoryboard, runStoryboardStep, getFirstStepPreview, summarizeStrictValidation, listStrictOnlyFailures, resolveCapabilityPath, buildDiscoveryFailedResult, } from './runner';
20
20
  export { parseStoryboard, loadStoryboardFile } from './loader';
21
21
  export { getComplianceCacheDir, loadComplianceIndex, listBundles, loadBundleStoryboards, listAllComplianceStoryboards, getComplianceStoryboardById, findBundleById, resolveBundleOrStoryboard, resolveStoryboardsForCapabilities, CapabilityResolutionError, PROTOCOL_TO_PATH, } from './compliance';
22
22
  export type { AgentCapabilities, BundleKind, BundleRef, CapabilityResolutionCode, ComplianceIndex, ComplianceIndexProtocol, ComplianceIndexSpecialism, NotApplicableStoryboard, ResolveOptions, ResolvedBundle, ResolvedStoryboards, } from './compliance';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lib/testing/storyboard/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lib/testing/storyboard/index.ts"],"names":[],"mappings":"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"}
@@ -8,8 +8,8 @@
8
8
  * and is pulled into `compliance/cache/{version}/` via `npm run sync-schemas`.
9
9
  */
10
10
  Object.defineProperty(exports, "__esModule", { value: true });
11
- exports.AdagentsJsonSchema = exports.BrandJsonSchema = exports.PROBE_TASK_ALLOWLIST = exports.TestKitValidationError = exports.validateTestKit = exports.runValidations = exports.hasRequestBuilder = exports.buildRequest = exports.detectContextRejectionHints = exports.applyContextInputs = exports.applyContextOutputsWithProvenance = exports.applyContextOutputs = exports.injectContext = exports.extractContextWithProvenance = exports.extractContext = exports.CONTEXT_EXTRACTORS = exports.setPath = exports.resolvePath = exports.parsePath = exports.executeStoryboardTask = exports.TASK_TO_METHOD = exports.PROTOCOL_TO_PATH = exports.CapabilityResolutionError = exports.resolveStoryboardsForCapabilities = exports.resolveBundleOrStoryboard = exports.findBundleById = exports.getComplianceStoryboardById = exports.listAllComplianceStoryboards = exports.loadBundleStoryboards = exports.listBundles = exports.loadComplianceIndex = exports.getComplianceCacheDir = exports.loadStoryboardFile = exports.parseStoryboard = exports.resolveCapabilityPath = exports.listStrictOnlyFailures = exports.summarizeStrictValidation = exports.getFirstStepPreview = exports.runStoryboardStep = exports.runStoryboard = exports.WEBHOOK_ASSERTION_TASKS = exports.createRunnerVariables = exports.createWebhookReceiver = exports.resolveAssertions = exports.clearAssertionRegistry = exports.listDefaultAssertions = exports.listAssertions = exports.getAssertion = exports.registerAssertion = exports.WEBHOOK_IDEMPOTENCY_KEY_PATTERN = void 0;
12
- exports.clearSandboxCache = exports.isSandboxDomain = exports.getSandboxBrand = exports.getSandboxBrands = exports.getSandboxEntities = void 0;
11
+ exports.BrandJsonSchema = exports.PROBE_TASK_ALLOWLIST = exports.TestKitValidationError = exports.validateTestKit = exports.runValidations = exports.hasRequestBuilder = exports.buildRequest = exports.detectContextRejectionHints = exports.applyContextInputs = exports.applyContextOutputsWithProvenance = exports.applyContextOutputs = exports.injectContext = exports.extractContextWithProvenance = exports.extractContext = exports.CONTEXT_EXTRACTORS = exports.setPath = exports.resolvePath = exports.parsePath = exports.executeStoryboardTask = exports.TASK_TO_METHOD = exports.PROTOCOL_TO_PATH = exports.CapabilityResolutionError = exports.resolveStoryboardsForCapabilities = exports.resolveBundleOrStoryboard = exports.findBundleById = exports.getComplianceStoryboardById = exports.listAllComplianceStoryboards = exports.loadBundleStoryboards = exports.listBundles = exports.loadComplianceIndex = exports.getComplianceCacheDir = exports.loadStoryboardFile = exports.parseStoryboard = exports.buildDiscoveryFailedResult = exports.resolveCapabilityPath = exports.listStrictOnlyFailures = exports.summarizeStrictValidation = exports.getFirstStepPreview = exports.runStoryboardStep = exports.runStoryboard = exports.WEBHOOK_ASSERTION_TASKS = exports.createRunnerVariables = exports.createWebhookReceiver = exports.resolveAssertions = exports.clearAssertionRegistry = exports.listDefaultAssertions = exports.listAssertions = exports.getAssertion = exports.registerAssertion = exports.WEBHOOK_IDEMPOTENCY_KEY_PATTERN = void 0;
12
+ exports.clearSandboxCache = exports.isSandboxDomain = exports.getSandboxBrand = exports.getSandboxBrands = exports.getSandboxEntities = exports.AdagentsJsonSchema = void 0;
13
13
  // Side-effect import: registers the default cross-step assertions that
14
14
  // upstream storyboards reference by id (idempotency.conflict_no_payload_leak,
15
15
  // context.no_secret_echo, governance.denial_blocks_mutation). Without this
@@ -44,6 +44,7 @@ Object.defineProperty(exports, "getFirstStepPreview", { enumerable: true, get: f
44
44
  Object.defineProperty(exports, "summarizeStrictValidation", { enumerable: true, get: function () { return runner_1.summarizeStrictValidation; } });
45
45
  Object.defineProperty(exports, "listStrictOnlyFailures", { enumerable: true, get: function () { return runner_1.listStrictOnlyFailures; } });
46
46
  Object.defineProperty(exports, "resolveCapabilityPath", { enumerable: true, get: function () { return runner_1.resolveCapabilityPath; } });
47
+ Object.defineProperty(exports, "buildDiscoveryFailedResult", { enumerable: true, get: function () { return runner_1.buildDiscoveryFailedResult; } });
47
48
  // Parser (single-file load for spec evolution / targeted testing)
48
49
  var loader_1 = require("./loader");
49
50
  Object.defineProperty(exports, "parseStoryboard", { enumerable: true, get: function () { return loader_1.parseStoryboard; } });
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/lib/testing/storyboard/index.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;;;AAEH,uEAAuE;AACvE,8EAA8E;AAC9E,2EAA2E;AAC3E,uEAAuE;AACvE,4EAA4E;AAC5E,qEAAqE;AACrE,gCAA8B;AAqC9B,iCAA0D;AAAjD,wHAAA,+BAA+B,OAAA;AAExC,8DAA8D;AAC9D,2CAOsB;AANpB,+GAAA,iBAAiB,OAAA;AACjB,0GAAA,YAAY,OAAA;AACZ,4GAAA,cAAc,OAAA;AACd,mHAAA,qBAAqB,OAAA;AACrB,oHAAA,sBAAsB,OAAA;AACtB,+GAAA,iBAAiB,OAAA;AAInB,0FAA0F;AAC1F,uDAA2D;AAAlD,yHAAA,qBAAqB,OAAA;AAU9B,kFAAkF;AAClF,qCAAkD;AAAzC,gHAAA,qBAAqB,OAAA;AAG9B,iCAAiC;AACjC,2DAA+D;AAAtD,6HAAA,uBAAuB,OAAA;AAEhC,SAAS;AACT,mCAOkB;AANhB,uGAAA,aAAa,OAAA;AACb,2GAAA,iBAAiB,OAAA;AACjB,6GAAA,mBAAmB,OAAA;AACnB,mHAAA,yBAAyB,OAAA;AACzB,gHAAA,sBAAsB,OAAA;AACtB,+GAAA,qBAAqB,OAAA;AAGvB,kEAAkE;AAClE,mCAA+D;AAAtD,yGAAA,eAAe,OAAA;AAAE,4GAAA,kBAAkB,OAAA;AAE5C,iDAAiD;AACjD,2CAYsB;AAXpB,mHAAA,qBAAqB,OAAA;AACrB,iHAAA,mBAAmB,OAAA;AACnB,yGAAA,WAAW,OAAA;AACX,mHAAA,qBAAqB,OAAA;AACrB,0HAAA,4BAA4B,OAAA;AAC5B,yHAAA,2BAA2B,OAAA;AAC3B,4GAAA,cAAc,OAAA;AACd,uHAAA,yBAAyB,OAAA;AACzB,+HAAA,iCAAiC,OAAA;AACjC,uHAAA,yBAAyB,OAAA;AACzB,8GAAA,gBAAgB,OAAA;AAgBlB,eAAe;AACf,uCAAmE;AAA1D,0GAAA,cAAc,OAAA;AAAE,iHAAA,qBAAqB,OAAA;AAE9C,iBAAiB;AACjB,+BAAyD;AAAhD,iGAAA,SAAS,OAAA;AAAE,mGAAA,WAAW,OAAA;AAAE,+FAAA,OAAO,OAAA;AAExC,UAAU;AACV,qCAQmB;AAPjB,6GAAA,kBAAkB,OAAA;AAClB,yGAAA,cAAc,OAAA;AACd,uHAAA,4BAA4B,OAAA;AAC5B,wGAAA,aAAa,OAAA;AACb,8GAAA,mBAAmB,OAAA;AACnB,4HAAA,iCAAiC,OAAA;AACjC,6GAAA,kBAAkB,OAAA;AAIpB,wCAAwC;AACxC,qDAAgE;AAAvD,8HAAA,2BAA2B,OAAA;AAEpC,kBAAkB;AAClB,qDAAoE;AAA3D,+GAAA,YAAY,OAAA;AAAE,oHAAA,iBAAiB,OAAA;AAExC,cAAc;AACd,6CAA+C;AAAtC,6GAAA,cAAc,OAAA;AAEvB,iEAAiE;AACjE,wEAAwE;AACxE,qEAAqE;AACrE,qEAAqE;AAErE,6BAA6B;AAC7B,uCAA2F;AAAlF,2GAAA,eAAe,OAAA;AAAE,kHAAA,sBAAsB,OAAA;AAAE,gHAAA,oBAAoB,OAAA;AAItE,uFAA8F;AAArF,8HAAA,eAAe,OAAA;AAAE,iIAAA,kBAAkB,OAAA;AAE5C,uDAM4B;AAL1B,sHAAA,kBAAkB,OAAA;AAClB,oHAAA,gBAAgB,OAAA;AAChB,mHAAA,eAAe,OAAA;AACf,mHAAA,eAAe,OAAA;AACf,qHAAA,iBAAiB,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/lib/testing/storyboard/index.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;;;AAEH,uEAAuE;AACvE,8EAA8E;AAC9E,2EAA2E;AAC3E,uEAAuE;AACvE,4EAA4E;AAC5E,qEAAqE;AACrE,gCAA8B;AAqC9B,iCAA0D;AAAjD,wHAAA,+BAA+B,OAAA;AAExC,8DAA8D;AAC9D,2CAOsB;AANpB,+GAAA,iBAAiB,OAAA;AACjB,0GAAA,YAAY,OAAA;AACZ,4GAAA,cAAc,OAAA;AACd,mHAAA,qBAAqB,OAAA;AACrB,oHAAA,sBAAsB,OAAA;AACtB,+GAAA,iBAAiB,OAAA;AAInB,0FAA0F;AAC1F,uDAA2D;AAAlD,yHAAA,qBAAqB,OAAA;AAU9B,kFAAkF;AAClF,qCAAkD;AAAzC,gHAAA,qBAAqB,OAAA;AAG9B,iCAAiC;AACjC,2DAA+D;AAAtD,6HAAA,uBAAuB,OAAA;AAEhC,SAAS;AACT,mCAQkB;AAPhB,uGAAA,aAAa,OAAA;AACb,2GAAA,iBAAiB,OAAA;AACjB,6GAAA,mBAAmB,OAAA;AACnB,mHAAA,yBAAyB,OAAA;AACzB,gHAAA,sBAAsB,OAAA;AACtB,+GAAA,qBAAqB,OAAA;AACrB,oHAAA,0BAA0B,OAAA;AAG5B,kEAAkE;AAClE,mCAA+D;AAAtD,yGAAA,eAAe,OAAA;AAAE,4GAAA,kBAAkB,OAAA;AAE5C,iDAAiD;AACjD,2CAYsB;AAXpB,mHAAA,qBAAqB,OAAA;AACrB,iHAAA,mBAAmB,OAAA;AACnB,yGAAA,WAAW,OAAA;AACX,mHAAA,qBAAqB,OAAA;AACrB,0HAAA,4BAA4B,OAAA;AAC5B,yHAAA,2BAA2B,OAAA;AAC3B,4GAAA,cAAc,OAAA;AACd,uHAAA,yBAAyB,OAAA;AACzB,+HAAA,iCAAiC,OAAA;AACjC,uHAAA,yBAAyB,OAAA;AACzB,8GAAA,gBAAgB,OAAA;AAgBlB,eAAe;AACf,uCAAmE;AAA1D,0GAAA,cAAc,OAAA;AAAE,iHAAA,qBAAqB,OAAA;AAE9C,iBAAiB;AACjB,+BAAyD;AAAhD,iGAAA,SAAS,OAAA;AAAE,mGAAA,WAAW,OAAA;AAAE,+FAAA,OAAO,OAAA;AAExC,UAAU;AACV,qCAQmB;AAPjB,6GAAA,kBAAkB,OAAA;AAClB,yGAAA,cAAc,OAAA;AACd,uHAAA,4BAA4B,OAAA;AAC5B,wGAAA,aAAa,OAAA;AACb,8GAAA,mBAAmB,OAAA;AACnB,4HAAA,iCAAiC,OAAA;AACjC,6GAAA,kBAAkB,OAAA;AAIpB,wCAAwC;AACxC,qDAAgE;AAAvD,8HAAA,2BAA2B,OAAA;AAEpC,kBAAkB;AAClB,qDAAoE;AAA3D,+GAAA,YAAY,OAAA;AAAE,oHAAA,iBAAiB,OAAA;AAExC,cAAc;AACd,6CAA+C;AAAtC,6GAAA,cAAc,OAAA;AAEvB,iEAAiE;AACjE,wEAAwE;AACxE,qEAAqE;AACrE,qEAAqE;AAErE,6BAA6B;AAC7B,uCAA2F;AAAlF,2GAAA,eAAe,OAAA;AAAE,kHAAA,sBAAsB,OAAA;AAAE,gHAAA,oBAAoB,OAAA;AAItE,uFAA8F;AAArF,8HAAA,eAAe,OAAA;AAAE,iIAAA,kBAAkB,OAAA;AAE5C,uDAM4B;AAL1B,sHAAA,kBAAkB,OAAA;AAClB,oHAAA,gBAAgB,OAAA;AAChB,mHAAA,eAAe,OAAA;AACf,mHAAA,eAAe,OAAA;AACf,qHAAA,iBAAiB,OAAA"}
@@ -6,6 +6,7 @@
6
6
  * - runStoryboardStep(): run a single step (stateless, LLM-friendly)
7
7
  */
8
8
  import type { Storyboard, StoryboardStep, StoryboardContext, StoryboardRunOptions, StoryboardResult, StoryboardPhaseResult, StoryboardStepResult, StoryboardStepPreview, StrictValidationSummary, SchemaValidationError } from './types';
9
+ import type { TestStepResult } from '../types';
9
10
  /**
10
11
  * Walk a dotted key path (e.g. `"adcp.idempotency.supported"`) through a
11
12
  * nested object. Returns `undefined` when any segment is missing or the
@@ -34,6 +35,18 @@ export declare function __defaultAuthHeadersForRawProbeForTest(options: Storyboa
34
35
  * empty on instance B.
35
36
  */
36
37
  export declare function runStoryboard(agentUrlOrUrls: string | string[], storyboard: Storyboard, options?: StoryboardRunOptions): Promise<StoryboardResult>;
38
+ /**
39
+ * Build a hard-failure StoryboardResult for when agent capability
40
+ * discovery (`get_agent_info` / MCP `tools/list`) failed. Surfacing
41
+ * discovery errors as a hard storyboard failure prevents the silent
42
+ * "X/X clean, 100% skipped" failure mode where transport / auth
43
+ * misconfiguration produced an empty `agentTools: []` and every step
44
+ * skipped with `missing_tool`.
45
+ *
46
+ * @public — exported for direct testing of the failure-result shape;
47
+ * called from `runStoryboard` when discovery throws.
48
+ */
49
+ export declare function buildDiscoveryFailedResult(agentUrls: string[], storyboard: Storyboard, discoveryStep: TestStepResult): StoryboardResult;
37
50
  /**
38
51
  * Walk every response_schema validation and aggregate the strict/lenient
39
52
  * delta. Always returns a summary; `observable: false` signals "run had
@@ -1 +1 @@
1
- {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../../../src/lib/testing/storyboard/runner.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAmDH,OAAO,KAAK,EAYV,UAAU,EACV,cAAc,EAEd,iBAAiB,EACjB,oBAAoB,EACpB,gBAAgB,EAEhB,qBAAqB,EACrB,oBAAoB,EACpB,qBAAqB,EACrB,uBAAuB,EACvB,qBAAqB,EAEtB,MAAM,SAAS,CAAC;AA0CjB;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAQ/E;AA4ID,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAE9D;AAED,wBAAgB,8BAA8B,CAC5C,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,GAC1C,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAEpC;AAED,wBAAgB,sCAAsC,CACpD,OAAO,EAAE,oBAAoB,GAC5B,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAEpC;AAiDD;;;;;;;;;;GAUG;AACH,wBAAsB,aAAa,CACjC,cAAc,EAAE,MAAM,GAAG,MAAM,EAAE,EACjC,UAAU,EAAE,UAAU,EACtB,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,gBAAgB,CAAC,CAuC3B;AAgzBD;;;;;;;;;;;;;;;;GAgBG;AACH;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,qBAAqB,EAAE,GAC9B,KAAK,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,qBAAqB,EAAE,CAAA;CAAE,CAAC,CA0B9G;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,qBAAqB,EAAE,GAAG,uBAAuB,CA4BlG;AAMD;;;;;GAKG;AACH,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,UAAU,EACtB,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,oBAAoB,CAAC,CAiE/B;AAs7BD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,OAAO,EAAE,oBAAoB,EAC7B,QAAQ,CAAC,EAAE,MAAM,GAChB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAwCzB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,cAAc,GACnB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAKzB;AA8OD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,UAAU,EACtB,OAAO,GAAE,iBAAsB,GAC9B,qBAAqB,GAAG,SAAS,CAgBnC"}
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../../../src/lib/testing/storyboard/runner.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAmDH,OAAO,KAAK,EAYV,UAAU,EACV,cAAc,EAEd,iBAAiB,EACjB,oBAAoB,EACpB,gBAAgB,EAEhB,qBAAqB,EACrB,oBAAoB,EACpB,qBAAqB,EACrB,uBAAuB,EACvB,qBAAqB,EAEtB,MAAM,SAAS,CAAC;AAEjB,OAAO,KAAK,EAA4B,cAAc,EAAE,MAAM,UAAU,CAAC;AAwCzE;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAQ/E;AAwJD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAE9D;AAED,wBAAgB,8BAA8B,CAC5C,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,GAC1C,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAEpC;AAED,wBAAgB,sCAAsC,CACpD,OAAO,EAAE,oBAAoB,GAC5B,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAEpC;AAiDD;;;;;;;;;;GAUG;AACH,wBAAsB,aAAa,CACjC,cAAc,EAAE,MAAM,GAAG,MAAM,EAAE,EACjC,UAAU,EAAE,UAAU,EACtB,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,gBAAgB,CAAC,CAuC3B;AA4DD;;;;;;;;;;GAUG;AACH,wBAAgB,0BAA0B,CACxC,SAAS,EAAE,MAAM,EAAE,EACnB,UAAU,EAAE,UAAU,EACtB,aAAa,EAAE,cAAc,GAC5B,gBAAgB,CA6ClB;AAizBD;;;;;;;;;;;;;;;;GAgBG;AACH;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,qBAAqB,EAAE,GAC9B,KAAK,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,qBAAqB,EAAE,CAAA;CAAE,CAAC,CA0B9G;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,qBAAqB,EAAE,GAAG,uBAAuB,CA4BlG;AAMD;;;;;GAKG;AACH,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,UAAU,EACtB,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,oBAAoB,CAAC,CAsE/B;AA89BD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,OAAO,EAAE,oBAAoB,EAC7B,QAAQ,CAAC,EAAE,MAAM,GAChB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAwCzB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,cAAc,GACnB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAKzB;AA8OD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,UAAU,EACtB,OAAO,GAAE,iBAAsB,GAC9B,qBAAqB,GAAG,SAAS,CAgBnC"}
@@ -12,6 +12,7 @@ exports.__redactSecretsForTest = __redactSecretsForTest;
12
12
  exports.__filterResponseHeadersForTest = __filterResponseHeadersForTest;
13
13
  exports.__defaultAuthHeadersForRawProbeForTest = __defaultAuthHeadersForRawProbeForTest;
14
14
  exports.runStoryboard = runStoryboard;
15
+ exports.buildDiscoveryFailedResult = buildDiscoveryFailedResult;
15
16
  exports.listStrictOnlyFailures = listStrictOnlyFailures;
16
17
  exports.summarizeStrictValidation = summarizeStrictValidation;
17
18
  exports.runStoryboardStep = runStoryboardStep;
@@ -88,6 +89,17 @@ function resolveCapabilityPath(raw, dottedPath) {
88
89
  function buildSkip(reason, detail) {
89
90
  return { reason, detail: detail ?? SKIP_DETAILS[reason] };
90
91
  }
92
+ /**
93
+ * True for skip reasons that imply the step's state never materialized —
94
+ * the runner treats these as equivalent to a failed stateful step for
95
+ * cascade-skip purposes. Benign skips (peer branch took, OAuth wasn't
96
+ * advertised, controller seeding cascaded — all handled elsewhere) don't
97
+ * appear here. Accepts both the canonical `RunnerSkipReason` and the
98
+ * detailed variant so callers don't need to narrow before checking.
99
+ */
100
+ function isMissingStateSkipReason(reason) {
101
+ return reason === 'missing_tool' || reason === 'missing_test_controller' || reason === 'not_applicable';
102
+ }
91
103
  /**
92
104
  * Resolve each phase's branch-set membership, combining explicit
93
105
  * `branch_set: { id, semantics }` declarations with the implicit detection
@@ -383,6 +395,63 @@ function buildCapabilityUnsupportedResult(agentUrls, storyboard, detail) {
383
395
  },
384
396
  };
385
397
  }
398
+ /**
399
+ * Build a hard-failure StoryboardResult for when agent capability
400
+ * discovery (`get_agent_info` / MCP `tools/list`) failed. Surfacing
401
+ * discovery errors as a hard storyboard failure prevents the silent
402
+ * "X/X clean, 100% skipped" failure mode where transport / auth
403
+ * misconfiguration produced an empty `agentTools: []` and every step
404
+ * skipped with `missing_tool`.
405
+ *
406
+ * @public — exported for direct testing of the failure-result shape;
407
+ * called from `runStoryboard` when discovery throws.
408
+ */
409
+ function buildDiscoveryFailedResult(agentUrls, storyboard, discoveryStep) {
410
+ const detail = discoveryStep.error ?? 'Discovery failed (no agent tools advertised).';
411
+ const syntheticStep = {
412
+ storyboard_id: storyboard.id,
413
+ step_id: 'discovery_failed',
414
+ phase_id: 'discovery_failed',
415
+ title: 'Storyboard failed: agent capability discovery did not succeed',
416
+ task: '',
417
+ passed: false,
418
+ skipped: false,
419
+ duration_ms: discoveryStep.duration_ms,
420
+ validations: [],
421
+ context: {},
422
+ error: `Discovery failure: ${detail}. The runner refuses to proceed with empty agentTools — that mode produces silent "all clean" reports when the underlying transport / auth / network policy is broken. Fix the discovery error before re-running.`,
423
+ extraction: { path: 'none' },
424
+ };
425
+ return {
426
+ storyboard_id: storyboard.id,
427
+ storyboard_title: storyboard.title,
428
+ agent_url: agentUrls[0],
429
+ overall_passed: false,
430
+ phases: [
431
+ {
432
+ phase_id: 'discovery_failed',
433
+ phase_title: 'Discovery failed',
434
+ passed: false,
435
+ steps: [syntheticStep],
436
+ duration_ms: discoveryStep.duration_ms,
437
+ },
438
+ ],
439
+ context: {},
440
+ total_duration_ms: discoveryStep.duration_ms,
441
+ passed_count: 0,
442
+ failed_count: 1,
443
+ skipped_count: 0,
444
+ tested_at: new Date().toISOString(),
445
+ strict_validation_summary: {
446
+ observable: false,
447
+ checked: 0,
448
+ passed: 0,
449
+ failed: 0,
450
+ strict_only_failures: 0,
451
+ lenient_also_failed: 0,
452
+ },
453
+ };
454
+ }
386
455
  /**
387
456
  * Build a minimal StoryboardResult for a storyboard skipped because the agent
388
457
  * does not advertise any of the tools listed in `required_tools`. The result
@@ -460,10 +529,26 @@ async function executeStoryboardPass(agentUrls, storyboard, options, dispatchOff
460
529
  let profile;
461
530
  if (!options._client) {
462
531
  const discovered = await (0, client_1.getOrDiscoverProfile)(clients[0], options);
532
+ // Discovery failure must surface as a HARD STORYBOARD FAILURE, not a
533
+ // silent empty `agentTools: []` that lets every step skip with
534
+ // `missing_tool`. The latter mode produces "X/X clean" summaries with
535
+ // 100% skipped — invisible CI failure when transport setup is broken
536
+ // (auth misconfig, MCP transport-fallback bugs, network policy, etc.).
537
+ // See: https://github.com/adcontextprotocol/adcp-client/issues/...
538
+ if (discovered.step.passed === false) {
539
+ if (!options._client)
540
+ await (0, protocols_1.closeConnections)(options.protocol);
541
+ return buildDiscoveryFailedResult(agentUrls, storyboard, discovered.step);
542
+ }
463
543
  profile = discovered.profile;
464
- // Populate agentTools from discovered profile if not already set
544
+ // Populate agentTools and _profile from discovered profile if not already set.
545
+ // _profile is threaded into executeStep so capability-based skip gates
546
+ // (e.g. account-mode branching) can read raw_capabilities at step time.
465
547
  if (!options.agentTools && profile?.tools) {
466
- options = { ...options, agentTools: profile.tools };
548
+ options = { ...options, agentTools: profile.tools, _profile: profile };
549
+ }
550
+ else if (profile && !options._profile) {
551
+ options = { ...options, _profile: profile };
467
552
  }
468
553
  }
469
554
  else {
@@ -533,6 +618,14 @@ async function executeStoryboardPass(agentUrls, storyboard, options, dispatchOff
533
618
  let passedCount = 0;
534
619
  let failedCount = 0;
535
620
  let skippedCount = 0;
621
+ // Stateful-cascade flags live at storyboard scope, NOT phase scope —
622
+ // cross-phase storyboards (e.g. signal_marketplace/governance_denied:
623
+ // setup in phases 1-2, consumption in phase 3) need the cascade to
624
+ // survive phase boundaries. Once a stateful step in any phase failed
625
+ // or skipped to materialize state, every downstream stateful step
626
+ // stays cascade-skipped regardless of which phase it lives in.
627
+ let statefulFailed = false;
628
+ let statefulSkipTrigger = null;
536
629
  // Step results whose failures the main loop added to failedCount. The
537
630
  // branch-set post-pass decrements only for entries that were actually
538
631
  // counted, so an optional phase that hit `presenceDetected` (a PRM 2xx
@@ -681,7 +774,10 @@ async function executeStoryboardPass(agentUrls, storyboard, options, dispatchOff
681
774
  const phaseStart = Date.now();
682
775
  const stepResults = [];
683
776
  let phasePassed = true;
684
- let statefulFailed = false;
777
+ // `statefulFailed` and `statefulSkipTrigger` live at storyboard
778
+ // scope (declared above the phase loop) so the cascade survives
779
+ // cross-phase setup → assertion patterns. See declaration site for
780
+ // the rationale (signal_marketplace/governance_denied story).
685
781
  // PRM presence-probe state (adcp-client#677). `phaseAbsent` flips when
686
782
  // /.well-known/oauth-protected-resource returns 404 — subsequent steps
687
783
  // in this phase cascade-skip instead of failing their http_status:200
@@ -767,9 +863,15 @@ async function executeStoryboardPass(agentUrls, storyboard, options, dispatchOff
767
863
  skippedCount++;
768
864
  continue;
769
865
  }
770
- // Skip remaining steps if a stateful dependency failed
866
+ // Skip remaining steps if a stateful dependency failed (or
867
+ // skipped for a missing-state reason). The detail message
868
+ // distinguishes the two so adopters reading the cascade know
869
+ // whether to look at a real failure or a structural mismatch
870
+ // (storyboard step requires a tool the agent doesn't advertise).
771
871
  if (statefulFailed && step.stateful) {
772
- const detail = 'Skipped: prior stateful step failed.';
872
+ const detail = statefulSkipTrigger
873
+ ? `Skipped: prior stateful step "${statefulSkipTrigger.stepId}" skipped (${statefulSkipTrigger.reason}); state never materialized.`
874
+ : 'Skipped: prior stateful step failed.';
773
875
  stepResults.push({
774
876
  storyboard_id: storyboard.id,
775
877
  step_id: step.id,
@@ -874,6 +976,26 @@ async function executeStoryboardPass(agentUrls, storyboard, options, dispatchOff
874
976
  if (result.skipped) {
875
977
  skippedCount++;
876
978
  context = result.context;
979
+ // Cascade-skip extension: a stateful step that SKIPS for a
980
+ // missing-state reason (`missing_tool`, `missing_test_controller`,
981
+ // `not_applicable`) is morally equivalent to a stateful step that
982
+ // failed — the state downstream steps depend on never
983
+ // materialized. Without this trip, a follow-up stateful step
984
+ // runs against absent state and surfaces a misleading
985
+ // assertion failure. Skips that imply state DID materialize via
986
+ // another path (`peer_branch_taken`, `controller_seeding_failed`
987
+ // — already handled by phase-level cascade, `oauth_not_advertised`
988
+ // — phase-absent path) deliberately don't trip the flag.
989
+ if (step.stateful && isMissingStateSkipReason(result.skip_reason)) {
990
+ statefulFailed = true;
991
+ // Record provenance for the cascade detail message. First trip
992
+ // wins — subsequent triggers don't overwrite, since the cascade
993
+ // text references the originating diagnostic (the leftmost
994
+ // missing-state stateful step in the phase).
995
+ if (statefulSkipTrigger === null) {
996
+ statefulSkipTrigger = { stepId: step.id, reason: result.skip_reason ?? 'missing_tool' };
997
+ }
998
+ }
877
999
  }
878
1000
  else if (result.passed) {
879
1001
  context = result.context;
@@ -891,8 +1013,15 @@ async function executeStoryboardPass(agentUrls, storyboard, options, dispatchOff
891
1013
  failedCount++;
892
1014
  countedAsFailed.add(result);
893
1015
  }
894
- if (step.stateful)
1016
+ if (step.stateful) {
895
1017
  statefulFailed = true;
1018
+ // Real failure takes precedence over a prior skip-trigger in
1019
+ // the cascade detail message — failures are the worse
1020
+ // diagnostic, so downstream cascade-skipped steps should
1021
+ // reference the failure rather than the earlier benign-ish
1022
+ // missing-state skip.
1023
+ statefulSkipTrigger = null;
1024
+ }
896
1025
  // In multi-instance mode, annotate the failure with the cross-instance
897
1026
  // attribution block so CI readers pattern-match it as a deployment bug.
898
1027
  if (isMultiInstance) {
@@ -1198,11 +1327,16 @@ async function runStoryboardStep(agentUrl, storyboard, stepId, options = {}) {
1198
1327
  const client = (0, client_1.getOrCreateClient)(agentUrl, options);
1199
1328
  // Discover agent profile for standalone step execution. Captured so the
1200
1329
  // executeStep call below can thread `library_version` through to
1201
- // shape-drift hint detection (issue #850).
1330
+ // shape-drift hint detection (issue #850). Also threads _profile into
1331
+ // options so capability-based skip gates in executeStep (e.g. account-mode
1332
+ // branching) can read raw_capabilities, mirroring executeStoryboardPass.
1202
1333
  let profile;
1203
1334
  if (!options._client) {
1204
1335
  const discovered = await (0, client_1.getOrDiscoverProfile)(client, options);
1205
1336
  profile = discovered.profile;
1337
+ if (profile && !options._profile) {
1338
+ options = { ...options, _profile: profile };
1339
+ }
1206
1340
  }
1207
1341
  else {
1208
1342
  profile = options._profile;
@@ -1315,6 +1449,44 @@ client, step, phaseId, context, allSteps, options, state) {
1315
1449
  extraction: { path: 'none' },
1316
1450
  };
1317
1451
  }
1452
+ // Account-mode capability gate: sync_accounts is exclusive to implicit mode
1453
+ // (require_operator_auth: false). When the seller declared explicit mode
1454
+ // (require_operator_auth: true), sync_accounts does not apply — grade
1455
+ // not_applicable rather than missing_tool so adopters can distinguish
1456
+ // "your capability declaration says this path isn't yours" from "you forgot
1457
+ // to implement a required tool."
1458
+ //
1459
+ // list_accounts is NOT gated here: it appears in audience_sync and other
1460
+ // storyboard flows regardless of account mode, so it is always applicable.
1461
+ //
1462
+ // Requires _profile threaded from the discovery block in
1463
+ // executeStoryboardPass or runStoryboardStep.
1464
+ if (effectiveStep.task === 'sync_accounts') {
1465
+ const rawCaps = options._profile?.raw_capabilities;
1466
+ if (rawCaps !== undefined) {
1467
+ const requireOperatorAuth = resolveCapabilityPath(rawCaps, 'account.require_operator_auth');
1468
+ if (requireOperatorAuth === true) {
1469
+ const detail = `Agent declared explicit account mode (require_operator_auth: true); ` +
1470
+ `sync_accounts is not applicable — list_accounts is the correct tool for this account shape.`;
1471
+ const next = getNextStepPreview(step.id, allSteps, context, runState.runnerVars);
1472
+ return {
1473
+ step_id: step.id,
1474
+ phase_id: phaseId,
1475
+ title: step.title,
1476
+ task: step.task,
1477
+ passed: true,
1478
+ skipped: true,
1479
+ skip_reason: 'not_applicable',
1480
+ skip: buildSkip('not_applicable', detail),
1481
+ duration_ms: 0,
1482
+ validations: [],
1483
+ context,
1484
+ next,
1485
+ extraction: { path: 'none' },
1486
+ };
1487
+ }
1488
+ }
1489
+ }
1318
1490
  // Skip if agent doesn't implement the tool this step calls.
1319
1491
  if (options.agentTools && !options.agentTools.includes(effectiveStep.task)) {
1320
1492
  const next = getNextStepPreview(step.id, allSteps, context, runState.runnerVars);