@adcp/sdk 12.0.0 → 12.0.2

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 (959) hide show
  1. package/dist/lib/adapters/content-standards-adapter.mjs +0 -6
  2. package/dist/lib/adapters/content-standards-adapter.mjs.map +1 -1
  3. package/dist/lib/adapters/derived-account-store.mjs +0 -6
  4. package/dist/lib/adapters/derived-account-store.mjs.map +1 -1
  5. package/dist/lib/adapters/governance-adapter.mjs +0 -6
  6. package/dist/lib/adapters/governance-adapter.mjs.map +1 -1
  7. package/dist/lib/adapters/implicit-account-store.mjs +0 -6
  8. package/dist/lib/adapters/implicit-account-store.mjs.map +1 -1
  9. package/dist/lib/adapters/index.mjs +0 -6
  10. package/dist/lib/adapters/index.mjs.map +1 -1
  11. package/dist/lib/adapters/legacy/v2-5/create_media_buy.mjs +0 -6
  12. package/dist/lib/adapters/legacy/v2-5/create_media_buy.mjs.map +1 -1
  13. package/dist/lib/adapters/legacy/v2-5/get_products.mjs +0 -6
  14. package/dist/lib/adapters/legacy/v2-5/get_products.mjs.map +1 -1
  15. package/dist/lib/adapters/legacy/v2-5/index.mjs +0 -6
  16. package/dist/lib/adapters/legacy/v2-5/index.mjs.map +1 -1
  17. package/dist/lib/adapters/legacy/v2-5/list_creative_formats.mjs +0 -6
  18. package/dist/lib/adapters/legacy/v2-5/list_creative_formats.mjs.map +1 -1
  19. package/dist/lib/adapters/legacy/v2-5/preview_creative.mjs +0 -6
  20. package/dist/lib/adapters/legacy/v2-5/preview_creative.mjs.map +1 -1
  21. package/dist/lib/adapters/legacy/v2-5/sync_creatives.mjs +0 -6
  22. package/dist/lib/adapters/legacy/v2-5/sync_creatives.mjs.map +1 -1
  23. package/dist/lib/adapters/legacy/v2-5/types.mjs +0 -6
  24. package/dist/lib/adapters/legacy/v2-5/update_media_buy.mjs +0 -6
  25. package/dist/lib/adapters/legacy/v2-5/update_media_buy.mjs.map +1 -1
  26. package/dist/lib/adapters/oauth-passthrough-resolver.mjs +0 -6
  27. package/dist/lib/adapters/oauth-passthrough-resolver.mjs.map +1 -1
  28. package/dist/lib/adapters/property-list-adapter.mjs +0 -6
  29. package/dist/lib/adapters/property-list-adapter.mjs.map +1 -1
  30. package/dist/lib/adapters/roster-account-store.mjs +0 -6
  31. package/dist/lib/adapters/roster-account-store.mjs.map +1 -1
  32. package/dist/lib/adapters/si-session-manager.mjs +0 -6
  33. package/dist/lib/adapters/si-session-manager.mjs.map +1 -1
  34. package/dist/lib/adapters/version/3.0/brand-fields.mjs +0 -6
  35. package/dist/lib/adapters/version/3.0/brand-fields.mjs.map +1 -1
  36. package/dist/lib/adapters/version/3.0/get-products.mjs +0 -6
  37. package/dist/lib/adapters/version/3.0/get-products.mjs.map +1 -1
  38. package/dist/lib/adapters/version/3.0/index.mjs +0 -6
  39. package/dist/lib/adapters/version/3.0/index.mjs.map +1 -1
  40. package/dist/lib/adapters/version/3.0/sync-accounts.mjs +0 -6
  41. package/dist/lib/adapters/version/3.0/sync-accounts.mjs.map +1 -1
  42. package/dist/lib/adapters/version/index.mjs +0 -6
  43. package/dist/lib/adapters/version/index.mjs.map +1 -1
  44. package/dist/lib/adapters/version/types.mjs +0 -6
  45. package/dist/lib/advanced.mjs +0 -6
  46. package/dist/lib/advanced.mjs.map +1 -1
  47. package/dist/lib/agents/index.generated.mjs +0 -6
  48. package/dist/lib/agents/index.generated.mjs.map +1 -1
  49. package/dist/lib/auth/index.mjs +0 -6
  50. package/dist/lib/auth/index.mjs.map +1 -1
  51. package/dist/lib/auth/oauth/CLIFlowHandler.mjs +0 -6
  52. package/dist/lib/auth/oauth/CLIFlowHandler.mjs.map +1 -1
  53. package/dist/lib/auth/oauth/ClientCredentialsFlow.mjs +0 -6
  54. package/dist/lib/auth/oauth/ClientCredentialsFlow.mjs.map +1 -1
  55. package/dist/lib/auth/oauth/MCPOAuthProvider.mjs +0 -6
  56. package/dist/lib/auth/oauth/MCPOAuthProvider.mjs.map +1 -1
  57. package/dist/lib/auth/oauth/NonInteractiveFlowHandler.mjs +0 -6
  58. package/dist/lib/auth/oauth/NonInteractiveFlowHandler.mjs.map +1 -1
  59. package/dist/lib/auth/oauth/authorization-required.mjs +0 -6
  60. package/dist/lib/auth/oauth/authorization-required.mjs.map +1 -1
  61. package/dist/lib/auth/oauth/diagnose.mjs +0 -6
  62. package/dist/lib/auth/oauth/diagnose.mjs.map +1 -1
  63. package/dist/lib/auth/oauth/diagnostics.mjs +0 -6
  64. package/dist/lib/auth/oauth/diagnostics.mjs.map +1 -1
  65. package/dist/lib/auth/oauth/discovery.mjs +0 -6
  66. package/dist/lib/auth/oauth/discovery.mjs.map +1 -1
  67. package/dist/lib/auth/oauth/file-storage.mjs +0 -6
  68. package/dist/lib/auth/oauth/file-storage.mjs.map +1 -1
  69. package/dist/lib/auth/oauth/index.mjs +0 -6
  70. package/dist/lib/auth/oauth/index.mjs.map +1 -1
  71. package/dist/lib/auth/oauth/secret-resolver.mjs +0 -6
  72. package/dist/lib/auth/oauth/secret-resolver.mjs.map +1 -1
  73. package/dist/lib/auth/oauth/storage-registry.mjs +0 -6
  74. package/dist/lib/auth/oauth/storage-registry.mjs.map +1 -1
  75. package/dist/lib/auth/oauth/types.mjs +0 -6
  76. package/dist/lib/auth/oauth/types.mjs.map +1 -1
  77. package/dist/lib/auth/oauth/web-flow.mjs +0 -6
  78. package/dist/lib/auth/oauth/web-flow.mjs.map +1 -1
  79. package/dist/lib/brand/index.mjs +0 -6
  80. package/dist/lib/brand/index.mjs.map +1 -1
  81. package/dist/lib/canonical-references/index.mjs +6 -7
  82. package/dist/lib/canonical-references/index.mjs.map +1 -1
  83. package/dist/lib/client/index.mjs +0 -6
  84. package/dist/lib/client/index.mjs.map +1 -1
  85. package/dist/lib/compliance/index.mjs +0 -6
  86. package/dist/lib/compliance/index.mjs.map +1 -1
  87. package/dist/lib/compliance-fixtures/index.mjs +0 -6
  88. package/dist/lib/compliance-fixtures/index.mjs.map +1 -1
  89. package/dist/lib/compliance-fixtures/test-authorization-server.mjs +0 -6
  90. package/dist/lib/compliance-fixtures/test-authorization-server.mjs.map +1 -1
  91. package/dist/lib/conformance/index.mjs +0 -6
  92. package/dist/lib/conformance/index.mjs.map +1 -1
  93. package/dist/lib/conformance/invariants/uniformError.mjs +0 -6
  94. package/dist/lib/conformance/invariants/uniformError.mjs.map +1 -1
  95. package/dist/lib/conformance/invariants/uniformErrorComparator.mjs +0 -6
  96. package/dist/lib/conformance/invariants/uniformErrorComparator.mjs.map +1 -1
  97. package/dist/lib/conformance/oracle.mjs +0 -6
  98. package/dist/lib/conformance/oracle.mjs.map +1 -1
  99. package/dist/lib/conformance/runConformance.mjs +0 -6
  100. package/dist/lib/conformance/runConformance.mjs.map +1 -1
  101. package/dist/lib/conformance/runners.mjs +0 -6
  102. package/dist/lib/conformance/runners.mjs.map +1 -1
  103. package/dist/lib/conformance/schemaArbitrary.mjs +0 -6
  104. package/dist/lib/conformance/schemaArbitrary.mjs.map +1 -1
  105. package/dist/lib/conformance/schemaLoader.mjs +5 -6
  106. package/dist/lib/conformance/schemaLoader.mjs.map +1 -1
  107. package/dist/lib/conformance/seeder.mjs +0 -6
  108. package/dist/lib/conformance/seeder.mjs.map +1 -1
  109. package/dist/lib/conformance/types.mjs +0 -6
  110. package/dist/lib/conformance/types.mjs.map +1 -1
  111. package/dist/lib/conformance/webhook.mjs +0 -6
  112. package/dist/lib/conformance/webhook.mjs.map +1 -1
  113. package/dist/lib/core/ADCPMultiAgentClient.mjs +0 -6
  114. package/dist/lib/core/ADCPMultiAgentClient.mjs.map +1 -1
  115. package/dist/lib/core/AgentClient.mjs +0 -6
  116. package/dist/lib/core/AgentClient.mjs.map +1 -1
  117. package/dist/lib/core/AsyncHandler.mjs +0 -6
  118. package/dist/lib/core/AsyncHandler.mjs.map +1 -1
  119. package/dist/lib/core/ConfigurationManager.mjs +0 -6
  120. package/dist/lib/core/ConfigurationManager.mjs.map +1 -1
  121. package/dist/lib/core/ConversationTypes.mjs +0 -6
  122. package/dist/lib/core/CreativeAgentClient.mjs +0 -6
  123. package/dist/lib/core/CreativeAgentClient.mjs.map +1 -1
  124. package/dist/lib/core/GovernanceMiddleware.mjs +0 -6
  125. package/dist/lib/core/GovernanceMiddleware.mjs.map +1 -1
  126. package/dist/lib/core/GovernanceTypes.mjs +0 -6
  127. package/dist/lib/core/GovernanceTypes.mjs.map +1 -1
  128. package/dist/lib/core/ProtocolResponseParser.mjs +0 -6
  129. package/dist/lib/core/ProtocolResponseParser.mjs.map +1 -1
  130. package/dist/lib/core/ResponseValidator.mjs +0 -6
  131. package/dist/lib/core/ResponseValidator.mjs.map +1 -1
  132. package/dist/lib/core/SingleAgentClient.mjs +0 -6
  133. package/dist/lib/core/SingleAgentClient.mjs.map +1 -1
  134. package/dist/lib/core/TaskEventTypes.mjs +0 -6
  135. package/dist/lib/core/TaskEventTypes.mjs.map +1 -1
  136. package/dist/lib/core/TaskExecutor.mjs +0 -6
  137. package/dist/lib/core/TaskExecutor.mjs.map +1 -1
  138. package/dist/lib/core/match.mjs +0 -6
  139. package/dist/lib/core/match.mjs.map +1 -1
  140. package/dist/lib/core/task-status.mjs +0 -6
  141. package/dist/lib/core/task-status.mjs.map +1 -1
  142. package/dist/lib/core/webhook-url.mjs +0 -6
  143. package/dist/lib/core/webhook-url.mjs.map +1 -1
  144. package/dist/lib/discovery/adagents-redirects.mjs +0 -6
  145. package/dist/lib/discovery/adagents-redirects.mjs.map +1 -1
  146. package/dist/lib/discovery/agent-directory.mjs +0 -6
  147. package/dist/lib/discovery/agent-directory.mjs.map +1 -1
  148. package/dist/lib/discovery/inline-publisher-properties.mjs +0 -6
  149. package/dist/lib/discovery/inline-publisher-properties.mjs.map +1 -1
  150. package/dist/lib/discovery/network-consistency-checker.mjs +0 -6
  151. package/dist/lib/discovery/network-consistency-checker.mjs.map +1 -1
  152. package/dist/lib/discovery/property-crawler.mjs +0 -6
  153. package/dist/lib/discovery/property-crawler.mjs.map +1 -1
  154. package/dist/lib/discovery/property-index.mjs +0 -6
  155. package/dist/lib/discovery/property-index.mjs.map +1 -1
  156. package/dist/lib/discovery/publisher-property-selector.mjs +0 -6
  157. package/dist/lib/discovery/publisher-property-selector.mjs.map +1 -1
  158. package/dist/lib/discovery/resolve-agent-properties.mjs +0 -6
  159. package/dist/lib/discovery/resolve-agent-properties.mjs.map +1 -1
  160. package/dist/lib/discovery/types.mjs +0 -6
  161. package/dist/lib/discovery/validate-adagents.mjs +0 -6
  162. package/dist/lib/discovery/validate-adagents.mjs.map +1 -1
  163. package/dist/lib/enums.mjs +0 -6
  164. package/dist/lib/enums.mjs.map +1 -1
  165. package/dist/lib/errors/index.mjs +0 -6
  166. package/dist/lib/errors/index.mjs.map +1 -1
  167. package/dist/lib/express-mcp/index.mjs +0 -6
  168. package/dist/lib/express-mcp/index.mjs.map +1 -1
  169. package/dist/lib/governance/index.mjs +0 -6
  170. package/dist/lib/governance/index.mjs.map +1 -1
  171. package/dist/lib/handlers/types.mjs +0 -6
  172. package/dist/lib/handlers/types.mjs.map +1 -1
  173. package/dist/lib/index.d.mts +1 -1
  174. package/dist/lib/index.d.ts +1 -1
  175. package/dist/lib/index.d.ts.map +1 -1
  176. package/dist/lib/index.js.map +1 -1
  177. package/dist/lib/index.mjs +0 -6
  178. package/dist/lib/index.mjs.map +1 -1
  179. package/dist/lib/media-buy/available-actions.mjs +0 -6
  180. package/dist/lib/media-buy/available-actions.mjs.map +1 -1
  181. package/dist/lib/media-buy/index.mjs +0 -6
  182. package/dist/lib/media-buy/index.mjs.map +1 -1
  183. package/dist/lib/media-buy/preflight.mjs +0 -6
  184. package/dist/lib/media-buy/preflight.mjs.map +1 -1
  185. package/dist/lib/media-buy/property-policy.mjs +0 -6
  186. package/dist/lib/media-buy/property-policy.mjs.map +1 -1
  187. package/dist/lib/media-buy/types.mjs +0 -6
  188. package/dist/lib/media-buy/types.mjs.map +1 -1
  189. package/dist/lib/media-buy/update-fields.generated.mjs +0 -6
  190. package/dist/lib/media-buy/update-fields.generated.mjs.map +1 -1
  191. package/dist/lib/mock-server/creative-ad-server/seed-data.mjs +0 -6
  192. package/dist/lib/mock-server/creative-ad-server/seed-data.mjs.map +1 -1
  193. package/dist/lib/mock-server/creative-ad-server/server.mjs +0 -6
  194. package/dist/lib/mock-server/creative-ad-server/server.mjs.map +1 -1
  195. package/dist/lib/mock-server/creative-template/seed-data.mjs +0 -6
  196. package/dist/lib/mock-server/creative-template/seed-data.mjs.map +1 -1
  197. package/dist/lib/mock-server/creative-template/server.mjs +0 -6
  198. package/dist/lib/mock-server/creative-template/server.mjs.map +1 -1
  199. package/dist/lib/mock-server/index.mjs +0 -6
  200. package/dist/lib/mock-server/index.mjs.map +1 -1
  201. package/dist/lib/mock-server/sales-guaranteed/recipe.mjs +0 -6
  202. package/dist/lib/mock-server/sales-guaranteed/recipe.mjs.map +1 -1
  203. package/dist/lib/mock-server/sales-guaranteed/seed-data.mjs +0 -6
  204. package/dist/lib/mock-server/sales-guaranteed/seed-data.mjs.map +1 -1
  205. package/dist/lib/mock-server/sales-guaranteed/server.mjs +0 -6
  206. package/dist/lib/mock-server/sales-guaranteed/server.mjs.map +1 -1
  207. package/dist/lib/mock-server/sales-non-guaranteed/recipe.mjs +0 -6
  208. package/dist/lib/mock-server/sales-non-guaranteed/recipe.mjs.map +1 -1
  209. package/dist/lib/mock-server/sales-non-guaranteed/seed-data.mjs +0 -6
  210. package/dist/lib/mock-server/sales-non-guaranteed/seed-data.mjs.map +1 -1
  211. package/dist/lib/mock-server/sales-non-guaranteed/server.mjs +0 -6
  212. package/dist/lib/mock-server/sales-non-guaranteed/server.mjs.map +1 -1
  213. package/dist/lib/mock-server/sales-social/seed-data.mjs +0 -6
  214. package/dist/lib/mock-server/sales-social/seed-data.mjs.map +1 -1
  215. package/dist/lib/mock-server/sales-social/server.mjs +0 -6
  216. package/dist/lib/mock-server/sales-social/server.mjs.map +1 -1
  217. package/dist/lib/mock-server/scenario.mjs +0 -6
  218. package/dist/lib/mock-server/scenario.mjs.map +1 -1
  219. package/dist/lib/mock-server/signal-marketplace/seed-data.mjs +0 -6
  220. package/dist/lib/mock-server/signal-marketplace/seed-data.mjs.map +1 -1
  221. package/dist/lib/mock-server/signal-marketplace/server.mjs +0 -6
  222. package/dist/lib/mock-server/signal-marketplace/server.mjs.map +1 -1
  223. package/dist/lib/mock-server/sponsored-intelligence/seed-data.mjs +0 -6
  224. package/dist/lib/mock-server/sponsored-intelligence/seed-data.mjs.map +1 -1
  225. package/dist/lib/mock-server/sponsored-intelligence/server.mjs +0 -6
  226. package/dist/lib/mock-server/sponsored-intelligence/server.mjs.map +1 -1
  227. package/dist/lib/net/address-guards.mjs +0 -6
  228. package/dist/lib/net/address-guards.mjs.map +1 -1
  229. package/dist/lib/net/index.mjs +0 -6
  230. package/dist/lib/net/index.mjs.map +1 -1
  231. package/dist/lib/net/ssrf-fetch.mjs +0 -6
  232. package/dist/lib/net/ssrf-fetch.mjs.map +1 -1
  233. package/dist/lib/observability/index.mjs +0 -6
  234. package/dist/lib/observability/index.mjs.map +1 -1
  235. package/dist/lib/observability/tracing.mjs +6 -7
  236. package/dist/lib/observability/tracing.mjs.map +1 -1
  237. package/dist/lib/protocols/a2a.mjs +0 -6
  238. package/dist/lib/protocols/a2a.mjs.map +1 -1
  239. package/dist/lib/protocols/abort.mjs +0 -6
  240. package/dist/lib/protocols/abort.mjs.map +1 -1
  241. package/dist/lib/protocols/index.mjs +0 -6
  242. package/dist/lib/protocols/index.mjs.map +1 -1
  243. package/dist/lib/protocols/mcp-modern.mjs +0 -6
  244. package/dist/lib/protocols/mcp-modern.mjs.map +1 -1
  245. package/dist/lib/protocols/mcp-tasks.mjs +0 -6
  246. package/dist/lib/protocols/mcp-tasks.mjs.map +1 -1
  247. package/dist/lib/protocols/mcp.mjs +0 -6
  248. package/dist/lib/protocols/mcp.mjs.map +1 -1
  249. package/dist/lib/protocols/rawResponseCapture.mjs +0 -6
  250. package/dist/lib/protocols/rawResponseCapture.mjs.map +1 -1
  251. package/dist/lib/protocols/responseSizeLimit.mjs +0 -6
  252. package/dist/lib/protocols/responseSizeLimit.mjs.map +1 -1
  253. package/dist/lib/protocols/transportDiagnostics.mjs +0 -6
  254. package/dist/lib/protocols/transportDiagnostics.mjs.map +1 -1
  255. package/dist/lib/registry/cursor-store.mjs +0 -6
  256. package/dist/lib/registry/cursor-store.mjs.map +1 -1
  257. package/dist/lib/registry/feed-stream.mjs +0 -6
  258. package/dist/lib/registry/feed-stream.mjs.map +1 -1
  259. package/dist/lib/registry/index.mjs +0 -6
  260. package/dist/lib/registry/index.mjs.map +1 -1
  261. package/dist/lib/registry/property-registry.mjs +0 -6
  262. package/dist/lib/registry/property-registry.mjs.map +1 -1
  263. package/dist/lib/registry/sync.mjs +0 -6
  264. package/dist/lib/registry/sync.mjs.map +1 -1
  265. package/dist/lib/registry/types.generated.mjs +0 -6
  266. package/dist/lib/registry/types.mjs +0 -6
  267. package/dist/lib/schemas/index.mjs +0 -6
  268. package/dist/lib/schemas/index.mjs.map +1 -1
  269. package/dist/lib/schemas-data/v2.5/_provenance.json +1 -1
  270. package/dist/lib/server/a2a-adapter.mjs +0 -6
  271. package/dist/lib/server/a2a-adapter.mjs.map +1 -1
  272. package/dist/lib/server/account-mode.mjs +0 -6
  273. package/dist/lib/server/account-mode.mjs.map +1 -1
  274. package/dist/lib/server/adcp-server.mjs +0 -6
  275. package/dist/lib/server/adcp-server.mjs.map +1 -1
  276. package/dist/lib/server/auth-introspection.mjs +0 -6
  277. package/dist/lib/server/auth-introspection.mjs.map +1 -1
  278. package/dist/lib/server/auth-signature.mjs +0 -6
  279. package/dist/lib/server/auth-signature.mjs.map +1 -1
  280. package/dist/lib/server/auth.mjs +0 -6
  281. package/dist/lib/server/auth.mjs.map +1 -1
  282. package/dist/lib/server/create-adcp-server.d.mts +13 -0
  283. package/dist/lib/server/create-adcp-server.d.ts +13 -0
  284. package/dist/lib/server/create-adcp-server.d.ts.map +1 -1
  285. package/dist/lib/server/create-adcp-server.js +3 -2
  286. package/dist/lib/server/create-adcp-server.js.map +1 -1
  287. package/dist/lib/server/create-adcp-server.mjs +3 -8
  288. package/dist/lib/server/create-adcp-server.mjs.map +1 -1
  289. package/dist/lib/server/credential-policy.mjs +0 -6
  290. package/dist/lib/server/credential-policy.mjs.map +1 -1
  291. package/dist/lib/server/ctx-metadata/backends/memory.mjs +0 -6
  292. package/dist/lib/server/ctx-metadata/backends/memory.mjs.map +1 -1
  293. package/dist/lib/server/ctx-metadata/backends/pg.mjs +0 -6
  294. package/dist/lib/server/ctx-metadata/backends/pg.mjs.map +1 -1
  295. package/dist/lib/server/ctx-metadata/backends/redis.mjs +0 -6
  296. package/dist/lib/server/ctx-metadata/backends/redis.mjs.map +1 -1
  297. package/dist/lib/server/ctx-metadata/index.mjs +0 -6
  298. package/dist/lib/server/ctx-metadata/index.mjs.map +1 -1
  299. package/dist/lib/server/ctx-metadata/store.mjs +0 -6
  300. package/dist/lib/server/ctx-metadata/store.mjs.map +1 -1
  301. package/dist/lib/server/ctx-metadata/wire-shape.mjs +0 -6
  302. package/dist/lib/server/ctx-metadata/wire-shape.mjs.map +1 -1
  303. package/dist/lib/server/decisioning/account.mjs +0 -6
  304. package/dist/lib/server/decisioning/account.mjs.map +1 -1
  305. package/dist/lib/server/decisioning/admin-router.mjs +0 -6
  306. package/dist/lib/server/decisioning/admin-router.mjs.map +1 -1
  307. package/dist/lib/server/decisioning/assembly-helpers.mjs +0 -6
  308. package/dist/lib/server/decisioning/assembly-helpers.mjs.map +1 -1
  309. package/dist/lib/server/decisioning/async-outcome.mjs +0 -6
  310. package/dist/lib/server/decisioning/async-outcome.mjs.map +1 -1
  311. package/dist/lib/server/decisioning/buyer-agent.mjs +0 -6
  312. package/dist/lib/server/decisioning/buyer-agent.mjs.map +1 -1
  313. package/dist/lib/server/decisioning/capabilities.mjs +0 -6
  314. package/dist/lib/server/decisioning/capabilities.mjs.map +1 -1
  315. package/dist/lib/server/decisioning/compose.mjs +0 -6
  316. package/dist/lib/server/decisioning/compose.mjs.map +1 -1
  317. package/dist/lib/server/decisioning/context.mjs +0 -6
  318. package/dist/lib/server/decisioning/errors-typed.mjs +0 -6
  319. package/dist/lib/server/decisioning/errors-typed.mjs.map +1 -1
  320. package/dist/lib/server/decisioning/helpers.mjs +0 -6
  321. package/dist/lib/server/decisioning/helpers.mjs.map +1 -1
  322. package/dist/lib/server/decisioning/index.mjs +0 -6
  323. package/dist/lib/server/decisioning/index.mjs.map +1 -1
  324. package/dist/lib/server/decisioning/list-helpers.mjs +0 -6
  325. package/dist/lib/server/decisioning/list-helpers.mjs.map +1 -1
  326. package/dist/lib/server/decisioning/manifest-helpers.mjs +0 -6
  327. package/dist/lib/server/decisioning/manifest-helpers.mjs.map +1 -1
  328. package/dist/lib/server/decisioning/pagination.mjs +0 -6
  329. package/dist/lib/server/decisioning/platform-helpers.mjs +0 -6
  330. package/dist/lib/server/decisioning/platform-helpers.mjs.map +1 -1
  331. package/dist/lib/server/decisioning/platform.mjs +0 -6
  332. package/dist/lib/server/decisioning/proposal/dispatch.mjs +0 -6
  333. package/dist/lib/server/decisioning/proposal/dispatch.mjs.map +1 -1
  334. package/dist/lib/server/decisioning/proposal/index.mjs +0 -6
  335. package/dist/lib/server/decisioning/proposal/index.mjs.map +1 -1
  336. package/dist/lib/server/decisioning/proposal/lifecycle.mjs +0 -6
  337. package/dist/lib/server/decisioning/proposal/lifecycle.mjs.map +1 -1
  338. package/dist/lib/server/decisioning/proposal/mock-manager.mjs +0 -6
  339. package/dist/lib/server/decisioning/proposal/mock-manager.mjs.map +1 -1
  340. package/dist/lib/server/decisioning/proposal/store.mjs +0 -6
  341. package/dist/lib/server/decisioning/proposal/store.mjs.map +1 -1
  342. package/dist/lib/server/decisioning/proposal/types.mjs +0 -6
  343. package/dist/lib/server/decisioning/proposal/types.mjs.map +1 -1
  344. package/dist/lib/server/decisioning/resolve-presets.mjs +0 -6
  345. package/dist/lib/server/decisioning/resolve-presets.mjs.map +1 -1
  346. package/dist/lib/server/decisioning/runtime/entity-hydration.generated.mjs +0 -6
  347. package/dist/lib/server/decisioning/runtime/entity-hydration.generated.mjs.map +1 -1
  348. package/dist/lib/server/decisioning/runtime/from-platform.mjs +0 -6
  349. package/dist/lib/server/decisioning/runtime/from-platform.mjs.map +1 -1
  350. package/dist/lib/server/decisioning/runtime/observed-modes.mjs +0 -6
  351. package/dist/lib/server/decisioning/runtime/observed-modes.mjs.map +1 -1
  352. package/dist/lib/server/decisioning/runtime/postgres-task-registry.mjs +0 -6
  353. package/dist/lib/server/decisioning/runtime/postgres-task-registry.mjs.map +1 -1
  354. package/dist/lib/server/decisioning/runtime/protocol-for-tool.mjs +0 -6
  355. package/dist/lib/server/decisioning/runtime/protocol-for-tool.mjs.map +1 -1
  356. package/dist/lib/server/decisioning/runtime/task-registry.mjs +0 -6
  357. package/dist/lib/server/decisioning/runtime/task-registry.mjs.map +1 -1
  358. package/dist/lib/server/decisioning/runtime/to-context.mjs +0 -6
  359. package/dist/lib/server/decisioning/runtime/to-context.mjs.map +1 -1
  360. package/dist/lib/server/decisioning/runtime/validate-platform.mjs +0 -6
  361. package/dist/lib/server/decisioning/runtime/validate-platform.mjs.map +1 -1
  362. package/dist/lib/server/decisioning/specialisms/audiences.mjs +0 -6
  363. package/dist/lib/server/decisioning/specialisms/brand-rights.mjs +0 -6
  364. package/dist/lib/server/decisioning/specialisms/campaign-governance.mjs +0 -6
  365. package/dist/lib/server/decisioning/specialisms/content-standards.mjs +0 -6
  366. package/dist/lib/server/decisioning/specialisms/creative-ad-server.mjs +0 -6
  367. package/dist/lib/server/decisioning/specialisms/creative.mjs +0 -6
  368. package/dist/lib/server/decisioning/specialisms/lists.mjs +0 -6
  369. package/dist/lib/server/decisioning/specialisms/sales.mjs +0 -6
  370. package/dist/lib/server/decisioning/specialisms/signals.mjs +0 -6
  371. package/dist/lib/server/decisioning/specialisms/sponsored-intelligence.mjs +0 -6
  372. package/dist/lib/server/decisioning/start-time.mjs +0 -6
  373. package/dist/lib/server/decisioning/start-time.mjs.map +1 -1
  374. package/dist/lib/server/decisioning/status-changes.mjs +0 -6
  375. package/dist/lib/server/decisioning/status-changes.mjs.map +1 -1
  376. package/dist/lib/server/decisioning/status-mappers.mjs +0 -6
  377. package/dist/lib/server/decisioning/status-mappers.mjs.map +1 -1
  378. package/dist/lib/server/decisioning/tenant-registry.mjs +0 -6
  379. package/dist/lib/server/decisioning/tenant-registry.mjs.map +1 -1
  380. package/dist/lib/server/decisioning/tenant-store.mjs +0 -6
  381. package/dist/lib/server/decisioning/tenant-store.mjs.map +1 -1
  382. package/dist/lib/server/decisioning/validate-specialisms.mjs +0 -6
  383. package/dist/lib/server/decisioning/validate-specialisms.mjs.map +1 -1
  384. package/dist/lib/server/dynamic-registry.mjs +0 -6
  385. package/dist/lib/server/dynamic-registry.mjs.map +1 -1
  386. package/dist/lib/server/envelope-allowlist.mjs +0 -6
  387. package/dist/lib/server/envelope-allowlist.mjs.map +1 -1
  388. package/dist/lib/server/error-arm-tools.mjs +5 -6
  389. package/dist/lib/server/error-arm-tools.mjs.map +1 -1
  390. package/dist/lib/server/errors.mjs +0 -6
  391. package/dist/lib/server/errors.mjs.map +1 -1
  392. package/dist/lib/server/example-tld-guard.mjs +0 -6
  393. package/dist/lib/server/example-tld-guard.mjs.map +1 -1
  394. package/dist/lib/server/express-adapter.mjs +0 -6
  395. package/dist/lib/server/express-adapter.mjs.map +1 -1
  396. package/dist/lib/server/governance.mjs +0 -6
  397. package/dist/lib/server/governance.mjs.map +1 -1
  398. package/dist/lib/server/idempotency/backends/lazy.mjs +0 -6
  399. package/dist/lib/server/idempotency/backends/lazy.mjs.map +1 -1
  400. package/dist/lib/server/idempotency/backends/memory.mjs +0 -6
  401. package/dist/lib/server/idempotency/backends/memory.mjs.map +1 -1
  402. package/dist/lib/server/idempotency/backends/pg.mjs +0 -6
  403. package/dist/lib/server/idempotency/backends/pg.mjs.map +1 -1
  404. package/dist/lib/server/idempotency/backends/redis.mjs +0 -6
  405. package/dist/lib/server/idempotency/backends/redis.mjs.map +1 -1
  406. package/dist/lib/server/idempotency/index.mjs +0 -6
  407. package/dist/lib/server/idempotency/index.mjs.map +1 -1
  408. package/dist/lib/server/idempotency/store.mjs +0 -6
  409. package/dist/lib/server/idempotency/store.mjs.map +1 -1
  410. package/dist/lib/server/index.d.mts +1 -1
  411. package/dist/lib/server/index.d.ts +1 -1
  412. package/dist/lib/server/index.d.ts.map +1 -1
  413. package/dist/lib/server/index.js.map +1 -1
  414. package/dist/lib/server/index.mjs +0 -6
  415. package/dist/lib/server/index.mjs.map +1 -1
  416. package/dist/lib/server/legacy/v5/index.d.mts +1 -1
  417. package/dist/lib/server/legacy/v5/index.d.ts +1 -1
  418. package/dist/lib/server/legacy/v5/index.d.ts.map +1 -1
  419. package/dist/lib/server/legacy/v5/index.js.map +1 -1
  420. package/dist/lib/server/legacy/v5/index.mjs +0 -6
  421. package/dist/lib/server/legacy/v5/index.mjs.map +1 -1
  422. package/dist/lib/server/mcp-modern-server.mjs +0 -6
  423. package/dist/lib/server/mcp-modern-server.mjs.map +1 -1
  424. package/dist/lib/server/media-buy-actions.mjs +0 -6
  425. package/dist/lib/server/media-buy-actions.mjs.map +1 -1
  426. package/dist/lib/server/media-buy-helpers.mjs +0 -6
  427. package/dist/lib/server/media-buy-helpers.mjs.map +1 -1
  428. package/dist/lib/server/media-buy-store.mjs +0 -6
  429. package/dist/lib/server/media-buy-store.mjs.map +1 -1
  430. package/dist/lib/server/normalize-errors.mjs +0 -6
  431. package/dist/lib/server/normalize-errors.mjs.map +1 -1
  432. package/dist/lib/server/operational-platform.mjs +0 -6
  433. package/dist/lib/server/operational-platform.mjs.map +1 -1
  434. package/dist/lib/server/pick-safe-details.mjs +0 -6
  435. package/dist/lib/server/pick-safe-details.mjs.map +1 -1
  436. package/dist/lib/server/pin-and-bind-fetch.mjs +0 -6
  437. package/dist/lib/server/pin-and-bind-fetch.mjs.map +1 -1
  438. package/dist/lib/server/postgres-state-store.mjs +0 -6
  439. package/dist/lib/server/postgres-state-store.mjs.map +1 -1
  440. package/dist/lib/server/postgres-task-store.mjs +0 -6
  441. package/dist/lib/server/postgres-task-store.mjs.map +1 -1
  442. package/dist/lib/server/product-defaults.mjs +0 -6
  443. package/dist/lib/server/product-defaults.mjs.map +1 -1
  444. package/dist/lib/server/redact.mjs +0 -6
  445. package/dist/lib/server/redact.mjs.map +1 -1
  446. package/dist/lib/server/responses.mjs +0 -6
  447. package/dist/lib/server/responses.mjs.map +1 -1
  448. package/dist/lib/server/serve.mjs +0 -6
  449. package/dist/lib/server/serve.mjs.map +1 -1
  450. package/dist/lib/server/socket-mode/conformance-client.mjs +0 -6
  451. package/dist/lib/server/socket-mode/conformance-client.mjs.map +1 -1
  452. package/dist/lib/server/socket-mode/index.mjs +0 -6
  453. package/dist/lib/server/socket-mode/index.mjs.map +1 -1
  454. package/dist/lib/server/socket-mode/ws-transport.mjs +0 -6
  455. package/dist/lib/server/socket-mode/ws-transport.mjs.map +1 -1
  456. package/dist/lib/server/state-machine.mjs +0 -6
  457. package/dist/lib/server/state-machine.mjs.map +1 -1
  458. package/dist/lib/server/state-store.mjs +0 -6
  459. package/dist/lib/server/state-store.mjs.map +1 -1
  460. package/dist/lib/server/structured-serialize.mjs +0 -6
  461. package/dist/lib/server/structured-serialize.mjs.map +1 -1
  462. package/dist/lib/server/targeting-helpers.mjs +0 -6
  463. package/dist/lib/server/targeting-helpers.mjs.map +1 -1
  464. package/dist/lib/server/tasks.mjs +0 -6
  465. package/dist/lib/server/tasks.mjs.map +1 -1
  466. package/dist/lib/server/test-controller-bridge.mjs +0 -6
  467. package/dist/lib/server/test-controller-bridge.mjs.map +1 -1
  468. package/dist/lib/server/test-controller.mjs +0 -6
  469. package/dist/lib/server/test-controller.mjs.map +1 -1
  470. package/dist/lib/server/upstream-helpers.mjs +0 -6
  471. package/dist/lib/server/upstream-helpers.mjs.map +1 -1
  472. package/dist/lib/server/webhook-emitter.mjs +0 -6
  473. package/dist/lib/server/webhook-emitter.mjs.map +1 -1
  474. package/dist/lib/server/wire-safe.mjs +0 -6
  475. package/dist/lib/server/wire-safe.mjs.map +1 -1
  476. package/dist/lib/server/wire-spec-fields.generated.mjs +0 -6
  477. package/dist/lib/server/wire-spec-fields.generated.mjs.map +1 -1
  478. package/dist/lib/server/wrap-envelope.mjs +0 -6
  479. package/dist/lib/server/wrap-envelope.mjs.map +1 -1
  480. package/dist/lib/signing/agent-context.mjs +0 -6
  481. package/dist/lib/signing/agent-context.mjs.map +1 -1
  482. package/dist/lib/signing/agent-fetch.mjs +0 -6
  483. package/dist/lib/signing/agent-fetch.mjs.map +1 -1
  484. package/dist/lib/signing/agent-resolver/canonicalize.mjs +0 -6
  485. package/dist/lib/signing/agent-resolver/canonicalize.mjs.map +1 -1
  486. package/dist/lib/signing/agent-resolver/capabilities-types.mjs +0 -6
  487. package/dist/lib/signing/agent-resolver/capabilities-types.mjs.map +1 -1
  488. package/dist/lib/signing/agent-resolver/consistency.mjs +0 -6
  489. package/dist/lib/signing/agent-resolver/consistency.mjs.map +1 -1
  490. package/dist/lib/signing/agent-resolver/errors.mjs +0 -6
  491. package/dist/lib/signing/agent-resolver/errors.mjs.map +1 -1
  492. package/dist/lib/signing/agent-resolver/etld.mjs +0 -6
  493. package/dist/lib/signing/agent-resolver/etld.mjs.map +1 -1
  494. package/dist/lib/signing/agent-resolver/fetch-helpers.mjs +0 -6
  495. package/dist/lib/signing/agent-resolver/fetch-helpers.mjs.map +1 -1
  496. package/dist/lib/signing/agent-resolver/index.mjs +0 -6
  497. package/dist/lib/signing/agent-resolver/index.mjs.map +1 -1
  498. package/dist/lib/signing/agent-resolver/jwks-set.mjs +0 -6
  499. package/dist/lib/signing/agent-resolver/jwks-set.mjs.map +1 -1
  500. package/dist/lib/signing/agent-resolver/resolve-agent.mjs +0 -6
  501. package/dist/lib/signing/agent-resolver/resolve-agent.mjs.map +1 -1
  502. package/dist/lib/signing/agent-resolver/select-agent.mjs +0 -6
  503. package/dist/lib/signing/agent-resolver/select-agent.mjs.map +1 -1
  504. package/dist/lib/signing/agent-resolver/strict-json.mjs +0 -6
  505. package/dist/lib/signing/agent-resolver/strict-json.mjs.map +1 -1
  506. package/dist/lib/signing/brand-jwks.mjs +0 -6
  507. package/dist/lib/signing/brand-jwks.mjs.map +1 -1
  508. package/dist/lib/signing/canonicalize.mjs +0 -6
  509. package/dist/lib/signing/canonicalize.mjs.map +1 -1
  510. package/dist/lib/signing/capability-cache.mjs +0 -6
  511. package/dist/lib/signing/capability-cache.mjs.map +1 -1
  512. package/dist/lib/signing/capability-priming.mjs +0 -6
  513. package/dist/lib/signing/capability-priming.mjs.map +1 -1
  514. package/dist/lib/signing/client.mjs +0 -6
  515. package/dist/lib/signing/client.mjs.map +1 -1
  516. package/dist/lib/signing/content-digest.mjs +0 -6
  517. package/dist/lib/signing/content-digest.mjs.map +1 -1
  518. package/dist/lib/signing/crypto.mjs +0 -6
  519. package/dist/lib/signing/crypto.mjs.map +1 -1
  520. package/dist/lib/signing/ecdsa-encoding.mjs +0 -6
  521. package/dist/lib/signing/ecdsa-encoding.mjs.map +1 -1
  522. package/dist/lib/signing/errors.mjs +0 -6
  523. package/dist/lib/signing/errors.mjs.map +1 -1
  524. package/dist/lib/signing/fetch-async.mjs +0 -6
  525. package/dist/lib/signing/fetch-async.mjs.map +1 -1
  526. package/dist/lib/signing/fetch.mjs +0 -6
  527. package/dist/lib/signing/fetch.mjs.map +1 -1
  528. package/dist/lib/signing/index.mjs +0 -6
  529. package/dist/lib/signing/index.mjs.map +1 -1
  530. package/dist/lib/signing/jwks-helpers.mjs +0 -6
  531. package/dist/lib/signing/jwks-helpers.mjs.map +1 -1
  532. package/dist/lib/signing/jwks-https.mjs +0 -6
  533. package/dist/lib/signing/jwks-https.mjs.map +1 -1
  534. package/dist/lib/signing/jwks.mjs +0 -6
  535. package/dist/lib/signing/jwks.mjs.map +1 -1
  536. package/dist/lib/signing/middleware.mjs +0 -6
  537. package/dist/lib/signing/middleware.mjs.map +1 -1
  538. package/dist/lib/signing/parser.mjs +0 -6
  539. package/dist/lib/signing/parser.mjs.map +1 -1
  540. package/dist/lib/signing/postgres-replay-store.mjs +0 -6
  541. package/dist/lib/signing/postgres-replay-store.mjs.map +1 -1
  542. package/dist/lib/signing/protocol-response.mjs +0 -6
  543. package/dist/lib/signing/protocol-response.mjs.map +1 -1
  544. package/dist/lib/signing/provider.mjs +0 -6
  545. package/dist/lib/signing/redis-replay-store.mjs +0 -6
  546. package/dist/lib/signing/redis-replay-store.mjs.map +1 -1
  547. package/dist/lib/signing/replay.mjs +0 -6
  548. package/dist/lib/signing/replay.mjs.map +1 -1
  549. package/dist/lib/signing/request-context.mjs +0 -6
  550. package/dist/lib/signing/request-context.mjs.map +1 -1
  551. package/dist/lib/signing/revocation-https.mjs +0 -6
  552. package/dist/lib/signing/revocation-https.mjs.map +1 -1
  553. package/dist/lib/signing/revocation.mjs +0 -6
  554. package/dist/lib/signing/revocation.mjs.map +1 -1
  555. package/dist/lib/signing/server.mjs +0 -6
  556. package/dist/lib/signing/server.mjs.map +1 -1
  557. package/dist/lib/signing/signer-async.mjs +0 -6
  558. package/dist/lib/signing/signer-async.mjs.map +1 -1
  559. package/dist/lib/signing/signer.mjs +0 -6
  560. package/dist/lib/signing/signer.mjs.map +1 -1
  561. package/dist/lib/signing/testing.mjs +0 -6
  562. package/dist/lib/signing/testing.mjs.map +1 -1
  563. package/dist/lib/signing/types.mjs +0 -6
  564. package/dist/lib/signing/types.mjs.map +1 -1
  565. package/dist/lib/signing/verifier.mjs +0 -6
  566. package/dist/lib/signing/verifier.mjs.map +1 -1
  567. package/dist/lib/signing/webhook-auth-detection.mjs +0 -6
  568. package/dist/lib/signing/webhook-auth-detection.mjs.map +1 -1
  569. package/dist/lib/signing/webhook-verifier.mjs +0 -6
  570. package/dist/lib/signing/webhook-verifier.mjs.map +1 -1
  571. package/dist/lib/storage/MemoryStorage.mjs +0 -6
  572. package/dist/lib/storage/MemoryStorage.mjs.map +1 -1
  573. package/dist/lib/storage/interfaces.mjs +0 -6
  574. package/dist/lib/substitution/encoder/SubstitutionEncoder.mjs +0 -6
  575. package/dist/lib/substitution/encoder/SubstitutionEncoder.mjs.map +1 -1
  576. package/dist/lib/substitution/encoder/index.mjs +0 -6
  577. package/dist/lib/substitution/encoder/index.mjs.map +1 -1
  578. package/dist/lib/substitution/index.mjs +0 -6
  579. package/dist/lib/substitution/index.mjs.map +1 -1
  580. package/dist/lib/substitution/observer/SubstitutionObserver.mjs +0 -6
  581. package/dist/lib/substitution/observer/SubstitutionObserver.mjs.map +1 -1
  582. package/dist/lib/substitution/observer/alignment.mjs +0 -6
  583. package/dist/lib/substitution/observer/alignment.mjs.map +1 -1
  584. package/dist/lib/substitution/observer/assertions.mjs +0 -6
  585. package/dist/lib/substitution/observer/assertions.mjs.map +1 -1
  586. package/dist/lib/substitution/observer/html-parser.mjs +0 -6
  587. package/dist/lib/substitution/observer/html-parser.mjs.map +1 -1
  588. package/dist/lib/substitution/observer/index.mjs +0 -6
  589. package/dist/lib/substitution/observer/index.mjs.map +1 -1
  590. package/dist/lib/substitution/observer/ssrf.mjs +0 -6
  591. package/dist/lib/substitution/observer/ssrf.mjs.map +1 -1
  592. package/dist/lib/substitution/rfc3986.mjs +0 -6
  593. package/dist/lib/substitution/rfc3986.mjs.map +1 -1
  594. package/dist/lib/substitution/translate.mjs +0 -6
  595. package/dist/lib/substitution/translate.mjs.map +1 -1
  596. package/dist/lib/substitution/types.mjs +0 -6
  597. package/dist/lib/substitution/vectors.mjs +0 -6
  598. package/dist/lib/substitution/vectors.mjs.map +1 -1
  599. package/dist/lib/testing/agent-tester.mjs +0 -6
  600. package/dist/lib/testing/agent-tester.mjs.map +1 -1
  601. package/dist/lib/testing/client.mjs +0 -6
  602. package/dist/lib/testing/client.mjs.map +1 -1
  603. package/dist/lib/testing/compliance/briefs.mjs +0 -6
  604. package/dist/lib/testing/compliance/briefs.mjs.map +1 -1
  605. package/dist/lib/testing/compliance/comply.mjs +0 -6
  606. package/dist/lib/testing/compliance/comply.mjs.map +1 -1
  607. package/dist/lib/testing/compliance/index.mjs +0 -6
  608. package/dist/lib/testing/compliance/index.mjs.map +1 -1
  609. package/dist/lib/testing/compliance/spec-conformance.mjs +0 -6
  610. package/dist/lib/testing/compliance/spec-conformance.mjs.map +1 -1
  611. package/dist/lib/testing/compliance/storyboard-tracks.mjs +0 -6
  612. package/dist/lib/testing/compliance/storyboard-tracks.mjs.map +1 -1
  613. package/dist/lib/testing/compliance/summary.mjs +0 -6
  614. package/dist/lib/testing/compliance/summary.mjs.map +1 -1
  615. package/dist/lib/testing/compliance/types.mjs +0 -6
  616. package/dist/lib/testing/comply-controller.mjs +0 -6
  617. package/dist/lib/testing/comply-controller.mjs.map +1 -1
  618. package/dist/lib/testing/controller-assertions.mjs +0 -6
  619. package/dist/lib/testing/controller-assertions.mjs.map +1 -1
  620. package/dist/lib/testing/formatter.mjs +0 -6
  621. package/dist/lib/testing/formatter.mjs.map +1 -1
  622. package/dist/lib/testing/index.mjs +0 -6
  623. package/dist/lib/testing/index.mjs.map +1 -1
  624. package/dist/lib/testing/local-agent-runner.mjs +0 -6
  625. package/dist/lib/testing/local-agent-runner.mjs.map +1 -1
  626. package/dist/lib/testing/orchestrator.mjs +0 -6
  627. package/dist/lib/testing/orchestrator.mjs.map +1 -1
  628. package/dist/lib/testing/personas/index.mjs +0 -6
  629. package/dist/lib/testing/personas/index.mjs.map +1 -1
  630. package/dist/lib/testing/scenarios/brand-rights.mjs +0 -6
  631. package/dist/lib/testing/scenarios/brand-rights.mjs.map +1 -1
  632. package/dist/lib/testing/scenarios/capabilities.mjs +0 -6
  633. package/dist/lib/testing/scenarios/capabilities.mjs.map +1 -1
  634. package/dist/lib/testing/scenarios/creative.mjs +0 -6
  635. package/dist/lib/testing/scenarios/creative.mjs.map +1 -1
  636. package/dist/lib/testing/scenarios/deterministic.mjs +0 -6
  637. package/dist/lib/testing/scenarios/deterministic.mjs.map +1 -1
  638. package/dist/lib/testing/scenarios/discovery.mjs +0 -6
  639. package/dist/lib/testing/scenarios/discovery.mjs.map +1 -1
  640. package/dist/lib/testing/scenarios/edge-cases.mjs +0 -6
  641. package/dist/lib/testing/scenarios/edge-cases.mjs.map +1 -1
  642. package/dist/lib/testing/scenarios/error-compliance.mjs +0 -6
  643. package/dist/lib/testing/scenarios/error-compliance.mjs.map +1 -1
  644. package/dist/lib/testing/scenarios/governance.mjs +0 -6
  645. package/dist/lib/testing/scenarios/governance.mjs.map +1 -1
  646. package/dist/lib/testing/scenarios/health.mjs +0 -6
  647. package/dist/lib/testing/scenarios/health.mjs.map +1 -1
  648. package/dist/lib/testing/scenarios/index.mjs +0 -6
  649. package/dist/lib/testing/scenarios/index.mjs.map +1 -1
  650. package/dist/lib/testing/scenarios/media-buy.mjs +0 -6
  651. package/dist/lib/testing/scenarios/media-buy.mjs.map +1 -1
  652. package/dist/lib/testing/scenarios/schema-compliance.mjs +0 -6
  653. package/dist/lib/testing/scenarios/schema-compliance.mjs.map +1 -1
  654. package/dist/lib/testing/scenarios/signals.mjs +0 -6
  655. package/dist/lib/testing/scenarios/signals.mjs.map +1 -1
  656. package/dist/lib/testing/scenarios/sponsored-intelligence.mjs +0 -6
  657. package/dist/lib/testing/scenarios/sponsored-intelligence.mjs.map +1 -1
  658. package/dist/lib/testing/scenarios/trusted-match.mjs +0 -6
  659. package/dist/lib/testing/scenarios/trusted-match.mjs.map +1 -1
  660. package/dist/lib/testing/seed-merge.mjs +0 -6
  661. package/dist/lib/testing/seed-merge.mjs.map +1 -1
  662. package/dist/lib/testing/storyboard/agent-routing.mjs +0 -6
  663. package/dist/lib/testing/storyboard/agent-routing.mjs.map +1 -1
  664. package/dist/lib/testing/storyboard/assertions.mjs +0 -6
  665. package/dist/lib/testing/storyboard/assertions.mjs.map +1 -1
  666. package/dist/lib/testing/storyboard/canonical-format-satisfaction.mjs +0 -6
  667. package/dist/lib/testing/storyboard/canonical-format-satisfaction.mjs.map +1 -1
  668. package/dist/lib/testing/storyboard/compliance.mjs +5 -6
  669. package/dist/lib/testing/storyboard/compliance.mjs.map +1 -1
  670. package/dist/lib/testing/storyboard/context.mjs +0 -6
  671. package/dist/lib/testing/storyboard/context.mjs.map +1 -1
  672. package/dist/lib/testing/storyboard/default-invariants.mjs +0 -6
  673. package/dist/lib/testing/storyboard/default-invariants.mjs.map +1 -1
  674. package/dist/lib/testing/storyboard/index.mjs +0 -6
  675. package/dist/lib/testing/storyboard/index.mjs.map +1 -1
  676. package/dist/lib/testing/storyboard/junit.mjs +0 -6
  677. package/dist/lib/testing/storyboard/junit.mjs.map +1 -1
  678. package/dist/lib/testing/storyboard/loader.mjs +0 -6
  679. package/dist/lib/testing/storyboard/loader.mjs.map +1 -1
  680. package/dist/lib/testing/storyboard/parallel-dispatch.mjs +0 -6
  681. package/dist/lib/testing/storyboard/parallel-dispatch.mjs.map +1 -1
  682. package/dist/lib/testing/storyboard/path.mjs +0 -6
  683. package/dist/lib/testing/storyboard/path.mjs.map +1 -1
  684. package/dist/lib/testing/storyboard/probes.mjs +0 -6
  685. package/dist/lib/testing/storyboard/probes.mjs.map +1 -1
  686. package/dist/lib/testing/storyboard/rate-limit-trip.mjs +0 -6
  687. package/dist/lib/testing/storyboard/rate-limit-trip.mjs.map +1 -1
  688. package/dist/lib/testing/storyboard/rejection-hints.mjs +0 -6
  689. package/dist/lib/testing/storyboard/rejection-hints.mjs.map +1 -1
  690. package/dist/lib/testing/storyboard/request-builder.mjs +0 -6
  691. package/dist/lib/testing/storyboard/request-builder.mjs.map +1 -1
  692. package/dist/lib/testing/storyboard/request-signing/builder.mjs +0 -6
  693. package/dist/lib/testing/storyboard/request-signing/builder.mjs.map +1 -1
  694. package/dist/lib/testing/storyboard/request-signing/grader.mjs +0 -6
  695. package/dist/lib/testing/storyboard/request-signing/grader.mjs.map +1 -1
  696. package/dist/lib/testing/storyboard/request-signing/index.mjs +0 -6
  697. package/dist/lib/testing/storyboard/request-signing/index.mjs.map +1 -1
  698. package/dist/lib/testing/storyboard/request-signing/probe-dispatch.mjs +0 -6
  699. package/dist/lib/testing/storyboard/request-signing/probe-dispatch.mjs.map +1 -1
  700. package/dist/lib/testing/storyboard/request-signing/probe.mjs +0 -6
  701. package/dist/lib/testing/storyboard/request-signing/probe.mjs.map +1 -1
  702. package/dist/lib/testing/storyboard/request-signing/synthesize.mjs +0 -6
  703. package/dist/lib/testing/storyboard/request-signing/synthesize.mjs.map +1 -1
  704. package/dist/lib/testing/storyboard/request-signing/test-kit.mjs +0 -6
  705. package/dist/lib/testing/storyboard/request-signing/test-kit.mjs.map +1 -1
  706. package/dist/lib/testing/storyboard/request-signing/types.mjs +0 -6
  707. package/dist/lib/testing/storyboard/request-signing/types.mjs.map +1 -1
  708. package/dist/lib/testing/storyboard/request-signing/vector-loader.mjs +0 -6
  709. package/dist/lib/testing/storyboard/request-signing/vector-loader.mjs.map +1 -1
  710. package/dist/lib/testing/storyboard/runner.mjs +0 -6
  711. package/dist/lib/testing/storyboard/runner.mjs.map +1 -1
  712. package/dist/lib/testing/storyboard/sandbox-entities.mjs +0 -6
  713. package/dist/lib/testing/storyboard/sandbox-entities.mjs.map +1 -1
  714. package/dist/lib/testing/storyboard/seeding.mjs +0 -6
  715. package/dist/lib/testing/storyboard/seeding.mjs.map +1 -1
  716. package/dist/lib/testing/storyboard/shape-drift-hints.mjs +0 -6
  717. package/dist/lib/testing/storyboard/shape-drift-hints.mjs.map +1 -1
  718. package/dist/lib/testing/storyboard/signer-grader/grader.mjs +0 -6
  719. package/dist/lib/testing/storyboard/signer-grader/grader.mjs.map +1 -1
  720. package/dist/lib/testing/storyboard/signer-grader/index.mjs +0 -6
  721. package/dist/lib/testing/storyboard/signer-grader/index.mjs.map +1 -1
  722. package/dist/lib/testing/storyboard/signer-grader/types.mjs +0 -6
  723. package/dist/lib/testing/storyboard/strict-validation-hints.mjs +0 -6
  724. package/dist/lib/testing/storyboard/strict-validation-hints.mjs.map +1 -1
  725. package/dist/lib/testing/storyboard/task-map.mjs +0 -6
  726. package/dist/lib/testing/storyboard/task-map.mjs.map +1 -1
  727. package/dist/lib/testing/storyboard/test-kit.mjs +0 -6
  728. package/dist/lib/testing/storyboard/test-kit.mjs.map +1 -1
  729. package/dist/lib/testing/storyboard/types.mjs +0 -6
  730. package/dist/lib/testing/storyboard/types.mjs.map +1 -1
  731. package/dist/lib/testing/storyboard/validations.mjs +0 -6
  732. package/dist/lib/testing/storyboard/validations.mjs.map +1 -1
  733. package/dist/lib/testing/storyboard/webhook-assertions.mjs +0 -6
  734. package/dist/lib/testing/storyboard/webhook-assertions.mjs.map +1 -1
  735. package/dist/lib/testing/storyboard/webhook-receiver.mjs +0 -6
  736. package/dist/lib/testing/storyboard/webhook-receiver.mjs.map +1 -1
  737. package/dist/lib/testing/stubs/governance-agent-stub.mjs +0 -6
  738. package/dist/lib/testing/stubs/governance-agent-stub.mjs.map +1 -1
  739. package/dist/lib/testing/stubs/index.mjs +0 -6
  740. package/dist/lib/testing/stubs/index.mjs.map +1 -1
  741. package/dist/lib/testing/test-controller.mjs +0 -6
  742. package/dist/lib/testing/test-controller.mjs.map +1 -1
  743. package/dist/lib/testing/test-helpers.mjs +0 -6
  744. package/dist/lib/testing/test-helpers.mjs.map +1 -1
  745. package/dist/lib/testing/types.mjs +0 -6
  746. package/dist/lib/types/adcp.mjs +0 -6
  747. package/dist/lib/types/adcp.mjs.map +1 -1
  748. package/dist/lib/types/asset-instances.mjs +0 -6
  749. package/dist/lib/types/compat.mjs +0 -6
  750. package/dist/lib/types/compat.mjs.map +1 -1
  751. package/dist/lib/types/core.generated.mjs +0 -6
  752. package/dist/lib/types/enums.generated.mjs +0 -6
  753. package/dist/lib/types/enums.generated.mjs.map +1 -1
  754. package/dist/lib/types/error-codes.mjs +0 -6
  755. package/dist/lib/types/error-codes.mjs.map +1 -1
  756. package/dist/lib/types/error-details.aliases.mjs +0 -6
  757. package/dist/lib/types/error-details.aliases.mjs.map +1 -1
  758. package/dist/lib/types/format-asset-slots.mjs +0 -6
  759. package/dist/lib/types/forward-compat-error-codes.mjs +0 -6
  760. package/dist/lib/types/forward-compat-error-codes.mjs.map +1 -1
  761. package/dist/lib/types/index.mjs +0 -6
  762. package/dist/lib/types/index.mjs.map +1 -1
  763. package/dist/lib/types/inline-enums.aliases.mjs +0 -6
  764. package/dist/lib/types/inline-enums.aliases.mjs.map +1 -1
  765. package/dist/lib/types/inline-enums.generated.mjs +0 -6
  766. package/dist/lib/types/inline-enums.generated.mjs.map +1 -1
  767. package/dist/lib/types/manifest.generated.mjs +0 -6
  768. package/dist/lib/types/manifest.generated.mjs.map +1 -1
  769. package/dist/lib/types/schemas.generated.mjs +0 -6
  770. package/dist/lib/types/schemas.generated.mjs.map +1 -1
  771. package/dist/lib/types/server-payload-aliases.mjs +0 -6
  772. package/dist/lib/types/server-payload.mjs +0 -6
  773. package/dist/lib/types/sync-rows.mjs +0 -6
  774. package/dist/lib/types/tools.generated.mjs +0 -6
  775. package/dist/lib/types/v2-5/index.mjs +0 -6
  776. package/dist/lib/types/v2-5/index.mjs.map +1 -1
  777. package/dist/lib/types/v2-5/tools.generated.mjs +0 -6
  778. package/dist/lib/types/v3-1-beta/index.mjs +0 -6
  779. package/dist/lib/types/v3-1-beta/index.mjs.map +1 -1
  780. package/dist/lib/types/v3-1-beta/tools.generated.mjs +0 -6
  781. package/dist/lib/types/wellknown-schemas.generated.mjs +0 -6
  782. package/dist/lib/types/wellknown-schemas.generated.mjs.map +1 -1
  783. package/dist/lib/upstream-recorder/constants.mjs +0 -6
  784. package/dist/lib/upstream-recorder/constants.mjs.map +1 -1
  785. package/dist/lib/upstream-recorder/index.mjs +0 -6
  786. package/dist/lib/upstream-recorder/index.mjs.map +1 -1
  787. package/dist/lib/upstream-recorder/recorder.mjs +0 -6
  788. package/dist/lib/upstream-recorder/recorder.mjs.map +1 -1
  789. package/dist/lib/upstream-recorder/types.mjs +0 -6
  790. package/dist/lib/upstream-recorder/types.mjs.map +1 -1
  791. package/dist/lib/utils/a2a-artifacts.mjs +0 -6
  792. package/dist/lib/utils/a2a-artifacts.mjs.map +1 -1
  793. package/dist/lib/utils/a2a-discovery.mjs +0 -6
  794. package/dist/lib/utils/a2a-discovery.mjs.map +1 -1
  795. package/dist/lib/utils/activation-key-builders.mjs +0 -6
  796. package/dist/lib/utils/activation-key-builders.mjs.map +1 -1
  797. package/dist/lib/utils/adcp-version-config.mjs +0 -6
  798. package/dist/lib/utils/adcp-version-config.mjs.map +1 -1
  799. package/dist/lib/utils/asset-builders.mjs +0 -6
  800. package/dist/lib/utils/asset-builders.mjs.map +1 -1
  801. package/dist/lib/utils/build-creative-return-builders.mjs +0 -6
  802. package/dist/lib/utils/build-creative-return-builders.mjs.map +1 -1
  803. package/dist/lib/utils/buyer-retry-policy.mjs +0 -6
  804. package/dist/lib/utils/buyer-retry-policy.mjs.map +1 -1
  805. package/dist/lib/utils/capabilities.mjs +0 -6
  806. package/dist/lib/utils/capabilities.mjs.map +1 -1
  807. package/dist/lib/utils/capability-rollups.mjs +0 -6
  808. package/dist/lib/utils/capability-rollups.mjs.map +1 -1
  809. package/dist/lib/utils/creative-adapter.mjs +0 -6
  810. package/dist/lib/utils/creative-adapter.mjs.map +1 -1
  811. package/dist/lib/utils/creative-delivery.mjs +0 -6
  812. package/dist/lib/utils/creative-delivery.mjs.map +1 -1
  813. package/dist/lib/utils/deprecation.mjs +0 -6
  814. package/dist/lib/utils/deprecation.mjs.map +1 -1
  815. package/dist/lib/utils/envelope-status-compat.mjs +0 -6
  816. package/dist/lib/utils/envelope-status-compat.mjs.map +1 -1
  817. package/dist/lib/utils/error-extraction.mjs +0 -6
  818. package/dist/lib/utils/error-extraction.mjs.map +1 -1
  819. package/dist/lib/utils/extract-result.mjs +0 -6
  820. package/dist/lib/utils/extract-result.mjs.map +1 -1
  821. package/dist/lib/utils/format-asset-slot-builders.mjs +0 -6
  822. package/dist/lib/utils/format-asset-slot-builders.mjs.map +1 -1
  823. package/dist/lib/utils/format-assets.mjs +0 -6
  824. package/dist/lib/utils/format-assets.mjs.map +1 -1
  825. package/dist/lib/utils/format-render-builders.mjs +0 -6
  826. package/dist/lib/utils/format-render-builders.mjs.map +1 -1
  827. package/dist/lib/utils/format-renders.mjs +0 -6
  828. package/dist/lib/utils/format-renders.mjs.map +1 -1
  829. package/dist/lib/utils/get-products-cache-scope.mjs +0 -6
  830. package/dist/lib/utils/get-products-cache-scope.mjs.map +1 -1
  831. package/dist/lib/utils/glob.mjs +0 -6
  832. package/dist/lib/utils/glob.mjs.map +1 -1
  833. package/dist/lib/utils/global-async-local-storage.mjs +0 -6
  834. package/dist/lib/utils/global-async-local-storage.mjs.map +1 -1
  835. package/dist/lib/utils/idempotency.mjs +0 -6
  836. package/dist/lib/utils/idempotency.mjs.map +1 -1
  837. package/dist/lib/utils/index.mjs +0 -6
  838. package/dist/lib/utils/index.mjs.map +1 -1
  839. package/dist/lib/utils/jcs.mjs +0 -6
  840. package/dist/lib/utils/jcs.mjs.map +1 -1
  841. package/dist/lib/utils/json-depth.mjs +0 -6
  842. package/dist/lib/utils/json-depth.mjs.map +1 -1
  843. package/dist/lib/utils/logger.mjs +0 -6
  844. package/dist/lib/utils/logger.mjs.map +1 -1
  845. package/dist/lib/utils/media-buy-delivery-notification-builders.mjs +0 -6
  846. package/dist/lib/utils/media-buy-delivery-notification-builders.mjs.map +1 -1
  847. package/dist/lib/utils/media-buy-status.mjs +0 -6
  848. package/dist/lib/utils/media-buy-status.mjs.map +1 -1
  849. package/dist/lib/utils/pagination.mjs +0 -6
  850. package/dist/lib/utils/pagination.mjs.map +1 -1
  851. package/dist/lib/utils/preview-creative-builders.mjs +0 -6
  852. package/dist/lib/utils/preview-creative-builders.mjs.map +1 -1
  853. package/dist/lib/utils/preview-normalizer.mjs +0 -6
  854. package/dist/lib/utils/preview-normalizer.mjs.map +1 -1
  855. package/dist/lib/utils/preview-utils.mjs +0 -6
  856. package/dist/lib/utils/preview-utils.mjs.map +1 -1
  857. package/dist/lib/utils/pricing-adapter.mjs +0 -6
  858. package/dist/lib/utils/pricing-adapter.mjs.map +1 -1
  859. package/dist/lib/utils/probe-policy.mjs +0 -6
  860. package/dist/lib/utils/probe-policy.mjs.map +1 -1
  861. package/dist/lib/utils/protocol-detection.mjs +0 -6
  862. package/dist/lib/utils/protocol-detection.mjs.map +1 -1
  863. package/dist/lib/utils/redact-secrets.mjs +0 -6
  864. package/dist/lib/utils/redact-secrets.mjs.map +1 -1
  865. package/dist/lib/utils/redis-default-prefix-warn.mjs +0 -6
  866. package/dist/lib/utils/redis-default-prefix-warn.mjs.map +1 -1
  867. package/dist/lib/utils/render-builders.mjs +0 -6
  868. package/dist/lib/utils/render-builders.mjs.map +1 -1
  869. package/dist/lib/utils/request-normalizer.mjs +0 -6
  870. package/dist/lib/utils/request-normalizer.mjs.map +1 -1
  871. package/dist/lib/utils/response-schemas.mjs +0 -6
  872. package/dist/lib/utils/response-schemas.mjs.map +1 -1
  873. package/dist/lib/utils/response-unwrapper.mjs +0 -6
  874. package/dist/lib/utils/response-unwrapper.mjs.map +1 -1
  875. package/dist/lib/utils/retry.mjs +0 -6
  876. package/dist/lib/utils/retry.mjs.map +1 -1
  877. package/dist/lib/utils/signal-discovery-helpers.mjs +0 -6
  878. package/dist/lib/utils/signal-discovery-helpers.mjs.map +1 -1
  879. package/dist/lib/utils/signal-id-builders.mjs +0 -6
  880. package/dist/lib/utils/signal-id-builders.mjs.map +1 -1
  881. package/dist/lib/utils/sync-creatives-adapter.mjs +0 -6
  882. package/dist/lib/utils/sync-creatives-adapter.mjs.map +1 -1
  883. package/dist/lib/utils/task-state.mjs +0 -6
  884. package/dist/lib/utils/task-state.mjs.map +1 -1
  885. package/dist/lib/utils/tool-request-schemas.mjs +0 -6
  886. package/dist/lib/utils/tool-request-schemas.mjs.map +1 -1
  887. package/dist/lib/utils/typeGuards.mjs +0 -6
  888. package/dist/lib/utils/typeGuards.mjs.map +1 -1
  889. package/dist/lib/utils/union-errors.mjs +0 -6
  890. package/dist/lib/utils/union-errors.mjs.map +1 -1
  891. package/dist/lib/utils/validate-user-agent.mjs +0 -6
  892. package/dist/lib/utils/validate-user-agent.mjs.map +1 -1
  893. package/dist/lib/v2/format-schema/fetch.mjs +0 -6
  894. package/dist/lib/v2/format-schema/fetch.mjs.map +1 -1
  895. package/dist/lib/v2/format-schema/index.mjs +0 -6
  896. package/dist/lib/v2/format-schema/index.mjs.map +1 -1
  897. package/dist/lib/v2/format-schema/regex-safety.mjs +0 -6
  898. package/dist/lib/v2/format-schema/regex-safety.mjs.map +1 -1
  899. package/dist/lib/v2/format-schema/resolver.mjs +7 -8
  900. package/dist/lib/v2/format-schema/resolver.mjs.map +1 -1
  901. package/dist/lib/v2/format-schema/sandbox-refs.mjs +0 -6
  902. package/dist/lib/v2/format-schema/sandbox-refs.mjs.map +1 -1
  903. package/dist/lib/v2/projection/augment-response.mjs +0 -6
  904. package/dist/lib/v2/projection/augment-response.mjs.map +1 -1
  905. package/dist/lib/v2/projection/builders.mjs +0 -6
  906. package/dist/lib/v2/projection/builders.mjs.map +1 -1
  907. package/dist/lib/v2/projection/cache-versions.mjs +0 -6
  908. package/dist/lib/v2/projection/cache-versions.mjs.map +1 -1
  909. package/dist/lib/v2/projection/canonical-properties.mjs +5 -6
  910. package/dist/lib/v2/projection/canonical-properties.mjs.map +1 -1
  911. package/dist/lib/v2/projection/catalog.mjs +5 -6
  912. package/dist/lib/v2/projection/catalog.mjs.map +1 -1
  913. package/dist/lib/v2/projection/constants.mjs +0 -6
  914. package/dist/lib/v2/projection/constants.mjs.map +1 -1
  915. package/dist/lib/v2/projection/index.mjs +0 -6
  916. package/dist/lib/v2/projection/index.mjs.map +1 -1
  917. package/dist/lib/v2/projection/registry.mjs +5 -6
  918. package/dist/lib/v2/projection/registry.mjs.map +1 -1
  919. package/dist/lib/v2/projection/types.mjs +0 -6
  920. package/dist/lib/v2/projection/v1-to-v2.mjs +0 -6
  921. package/dist/lib/v2/projection/v1-to-v2.mjs.map +1 -1
  922. package/dist/lib/v2/projection/v2-to-v1.mjs +0 -6
  923. package/dist/lib/v2/projection/v2-to-v1.mjs.map +1 -1
  924. package/dist/lib/v2/projection/write-side.mjs +0 -6
  925. package/dist/lib/v2/projection/write-side.mjs.map +1 -1
  926. package/dist/lib/v2/publisher-catalog/formats.mjs +0 -6
  927. package/dist/lib/v2/publisher-catalog/formats.mjs.map +1 -1
  928. package/dist/lib/v2/publisher-catalog/index.mjs +0 -6
  929. package/dist/lib/v2/publisher-catalog/index.mjs.map +1 -1
  930. package/dist/lib/validation/client-hooks.mjs +0 -6
  931. package/dist/lib/validation/client-hooks.mjs.map +1 -1
  932. package/dist/lib/validation/hints.mjs +0 -6
  933. package/dist/lib/validation/hints.mjs.map +1 -1
  934. package/dist/lib/validation/index.mjs +0 -6
  935. package/dist/lib/validation/index.mjs.map +1 -1
  936. package/dist/lib/validation/schema-errors.mjs +0 -6
  937. package/dist/lib/validation/schema-errors.mjs.map +1 -1
  938. package/dist/lib/validation/schema-loader.mjs +5 -6
  939. package/dist/lib/validation/schema-loader.mjs.map +1 -1
  940. package/dist/lib/validation/schema-validator.mjs +0 -6
  941. package/dist/lib/validation/schema-validator.mjs.map +1 -1
  942. package/dist/lib/validation/sync-creatives.mjs +0 -6
  943. package/dist/lib/validation/sync-creatives.mjs.map +1 -1
  944. package/dist/lib/version.d.mts +3 -3
  945. package/dist/lib/version.d.ts +3 -3
  946. package/dist/lib/version.js +3 -3
  947. package/dist/lib/version.js.map +1 -1
  948. package/dist/lib/version.mjs +3 -9
  949. package/dist/lib/version.mjs.map +1 -1
  950. package/dist/lib/webhooks/index.mjs +0 -6
  951. package/dist/lib/webhooks/index.mjs.map +1 -1
  952. package/dist/lib/wholesale-feed-sync/index.mjs +0 -6
  953. package/dist/lib/wholesale-feed-sync/index.mjs.map +1 -1
  954. package/dist/lib/wholesale-feed-sync/sync.mjs +0 -6
  955. package/dist/lib/wholesale-feed-sync/sync.mjs.map +1 -1
  956. package/dist/lib/wholesale-feed-sync/types.mjs +0 -6
  957. package/dist/lib/wholesale-feed-sync/webhook-notification.mjs +0 -6
  958. package/dist/lib/wholesale-feed-sync/webhook-notification.mjs.map +1 -1
  959. package/package.json +2 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/lib/conformance/invariants/uniformErrorComparator.ts"],"sourcesContent":["// Byte-equivalence comparator for the uniform-error-response invariant.\n//\n// Hard fails (populate `differences`, set `equivalent: false`):\n// - HTTP status diverges\n// - Error envelope fields diverge (code, message, field, details)\n// when both bodies parse as JSON error envelopes\n// - Raw body bytes diverge when bodies don't parse as recognized\n// error envelopes (MCP isError wrappers still compared body-level)\n// - Response headers diverge outside the narrow allowlist\n//\n// Soft metadata (populate `latencyDeltaMs`, no verdict change):\n// - Latency delta between the two probes. Extreme deltas are a\n// short-circuit-on-unknown smell (seller skips access check when\n// the id is well-formed-gibberish) — reviewers should inspect, but\n// one paired probe isn't enough to statistically fail on it.\n\nimport type { RawHttpCapture } from '../../protocols/rawResponseCapture';\n\nexport interface ProbeComparisonResult {\n equivalent: boolean;\n differences: string[];\n latencyDeltaMs: number;\n}\n\n/**\n * Response headers that MAY legitimately differ between two otherwise\n * identical probes. Everything else MUST match. Closed allowlist —\n * unknown headers default to must-match, which forces sellers to be\n * explicit about per-request fields.\n *\n * Three categories are covered:\n * 1. Timing/diagnostic: `Date`, `Server`, `Server-Timing`, `Age`, `Via`\n * 2. Request-ID / distributed tracing: `X-Request-Id`,\n * `X-Correlation-Id`, `X-Trace-Id`, `Traceparent`, `Tracestate`\n * 3. CDN insertions: `CF-Ray` (Cloudflare), `X-Amz-Cf-Id`\n * (CloudFront), `X-Amz-Request-Id` / `X-Amzn-Trace-Id` (AWS LB /\n * API Gateway). These are inserted by the edge for every request\n * and would otherwise false-positive fail any seller behind a CDN.\n *\n * NOT allowlisted (must-match) — and worth calling out because they\n * look variable but actually carry signal:\n * - `Content-Length`: byte-equivalent bodies have equal length.\n * Divergence = body divergence.\n * - `Vary`: content-negotiation policy is per-resource, not\n * per-request. Divergence implies the seller routed the two\n * probes through different handlers.\n * - `Content-Type`: same story — one codepath emits JSON, the other\n * emits HTML error page = leak.\n * - `ETag`, `Cache-Control`, `X-RateLimit-*`: attacker-visible side\n * channels that MUST NOT differ.\n *\n * Header names are normalized to lowercase before membership check.\n */\nconst HEADER_ALLOWLIST: ReadonlySet<string> = new Set([\n // Timing / diagnostic\n 'date',\n 'server',\n 'server-timing',\n 'age',\n 'via',\n // Request id / distributed tracing\n 'x-request-id',\n 'x-correlation-id',\n 'x-trace-id',\n 'traceparent',\n 'tracestate',\n // CDN / edge insertions\n 'cf-ray',\n 'x-amz-cf-id',\n 'x-amz-request-id',\n 'x-amzn-trace-id',\n 'fly-request-id',\n // Rate-limit counters (RFC 9331 + legacy). A well-behaved rate\n // limiter decrements uniformly on every request regardless of\n // resolution state, so the counter differs between probes with no\n // signal value. A leaky rate limiter that decrements only on the\n // \"found\" branch would still be caught via HTTP-status divergence\n // (the found branch would race a 429 eventually, the unfound\n // branch wouldn't) — but at that point the agent is advertising\n // existence through a separate channel, which the status check\n // covers. Keep these allowlisted; document the narrow gap.\n 'ratelimit',\n 'ratelimit-limit',\n 'ratelimit-policy',\n 'ratelimit-remaining',\n 'ratelimit-reset',\n 'x-ratelimit-limit',\n 'x-ratelimit-remaining',\n 'x-ratelimit-reset',\n]);\n\nexport function compareProbes(a: RawHttpCapture, b: RawHttpCapture): ProbeComparisonResult {\n const differences: string[] = [];\n\n if (a.status !== b.status) {\n differences.push(`HTTP status diverges: ${a.status} vs ${b.status}`);\n }\n\n diffHeaders(a.headers, b.headers, differences);\n diffBodies(a.body, b.body, differences);\n\n return {\n equivalent: differences.length === 0,\n differences,\n latencyDeltaMs: Math.abs(a.latencyMs - b.latencyMs),\n };\n}\n\nfunction diffHeaders(headersA: Record<string, string>, headersB: Record<string, string>, differences: string[]): void {\n const namesA = normalizedNames(headersA);\n const namesB = normalizedNames(headersB);\n const allNames = new Set([...namesA.keys(), ...namesB.keys()]);\n for (const lower of allNames) {\n if (HEADER_ALLOWLIST.has(lower)) continue;\n const valueA = namesA.get(lower);\n const valueB = namesB.get(lower);\n if (valueA === undefined && valueB !== undefined) {\n differences.push(`header \"${lower}\" present on probe B only: ${JSON.stringify(valueB)}`);\n } else if (valueA !== undefined && valueB === undefined) {\n differences.push(`header \"${lower}\" present on probe A only: ${JSON.stringify(valueA)}`);\n } else if (valueA !== valueB) {\n differences.push(`header \"${lower}\" diverges: ${JSON.stringify(valueA)} vs ${JSON.stringify(valueB)}`);\n }\n }\n}\n\nfunction normalizedNames(headers: Record<string, string>): Map<string, string> {\n const out = new Map<string, string>();\n for (const [name, value] of Object.entries(headers)) {\n out.set(name.toLowerCase(), value);\n }\n return out;\n}\n\n/**\n * Body comparison order:\n *\n * 1. Exact string match — the happy path for sellers whose transport\n * fully normalizes per-request metadata.\n * 2. JSON parse on both sides. If both parse:\n * a. If both carry a recognizable error envelope, compare envelope\n * fields + MCP isError / A2A state ONLY. Per-request metadata\n * (JSON-RPC id, MCP request id, timestamps) legitimately varies\n * and would otherwise mask the real invariant signal.\n * b. Otherwise, structural equality — catches reordered keys that\n * raw compare would call a miss.\n * 3. Non-JSON or mixed — raw byte-length hint.\n */\nfunction diffBodies(bodyA: string, bodyB: string, differences: string[]): void {\n if (bodyA === bodyB) return;\n\n const parsedA = tryParseJson(bodyA);\n const parsedB = tryParseJson(bodyB);\n if (parsedA !== undefined && parsedB !== undefined) {\n // State indicators (MCP isError, A2A task state) run unconditionally\n // — they're protocol-level signals that live outside the error\n // envelope and MUST match even when the domain body is empty.\n diffStateIndicators(parsedA, parsedB, differences);\n\n const envA = extractEnvelope(parsedA);\n const envB = extractEnvelope(parsedB);\n if (envA !== undefined || envB !== undefined) {\n diffEnvelopeFields(envA, envB, differences);\n return;\n }\n // Neither side is a recognizable error envelope — both are success\n // bodies (e.g., `get_signals` returning an empty match list for an\n // unknown id). Peel the JSON-RPC + MCP CallToolResult wrappers so\n // per-request metadata (jsonrpc id, MCP request id) doesn't mask\n // the real structural comparison.\n if (deepEqual(peelWrappers(parsedA), peelWrappers(parsedB))) return;\n if (differences.length === 0) {\n differences.push('response body diverges (parsed JSON differs)');\n }\n return;\n }\n\n differences.push(`response body diverges (${bodyA.length} bytes vs ${bodyB.length} bytes)`);\n}\n\n/**\n * Strip known per-request metadata wrappers so success bodies compare\n * structurally. Peels JSON-RPC `{ jsonrpc, id, result }` → `result`,\n * then collapses MCP CallToolResult to its domain payload:\n * - `structuredContent` (L3) wins when present\n * - else `content[].text` parsed as JSON (L2 fallback)\n * - `_meta` (MCP per-request metadata carrying e.g. related-task id)\n * is always stripped\n * No-op on shapes we don't recognize.\n */\nfunction peelWrappers(body: unknown): unknown {\n if (!body || typeof body !== 'object') return body;\n const obj = body as Record<string, unknown>;\n if (typeof obj.jsonrpc === 'string' && 'id' in obj) {\n if (obj.result !== undefined) return peelWrappers(obj.result);\n if (obj.error !== undefined) return peelWrappers(obj.error);\n }\n // MCP CallToolResult: prefer the structured domain payload, falling\n // through to the text content if structuredContent is absent.\n if (obj.structuredContent !== undefined) return obj.structuredContent;\n if (Array.isArray(obj.content)) {\n for (const part of obj.content) {\n const text = (part as { type?: string; text?: string })?.text;\n if (typeof text === 'string') {\n const parsed = tryParseJson(text);\n if (parsed !== undefined) return parsed;\n }\n }\n }\n // A2A Task / Message — reduce to just the data parts' payloads so\n // per-request ids (task.id, contextId, artifactId, messageId,\n // status.timestamp) don't fail structural compare when the domain\n // data is actually identical.\n if (obj.kind === 'task' && Array.isArray(obj.artifacts)) {\n return collectA2ADataParts(obj.artifacts);\n }\n if (obj.kind === 'message' && Array.isArray(obj.parts)) {\n return collectA2ADataParts([obj]);\n }\n // Strip `_meta` — MCP's per-request metadata channel — before\n // handing the object back for structural comparison.\n if ('_meta' in obj) {\n const { _meta, ...rest } = obj;\n void _meta;\n return rest;\n }\n return obj;\n}\n\nfunction collectA2ADataParts(source: unknown[]): unknown[] {\n const out: unknown[] = [];\n for (const entry of source) {\n const parts = (entry as { parts?: unknown })?.parts;\n if (!Array.isArray(parts)) continue;\n for (const part of parts) {\n const p = part as { kind?: string; data?: unknown; text?: unknown };\n if (p?.kind === 'data' && p.data !== undefined) out.push(p.data);\n else if (p?.kind === 'text' && typeof p.text === 'string') out.push({ text: p.text });\n }\n }\n return out;\n}\n\nfunction tryParseJson(text: string): unknown {\n if (text.length === 0) return undefined;\n const payload = text.startsWith('event:') || text.startsWith('data:') ? extractSsePayload(text) : text;\n if (!payload) return undefined;\n try {\n return JSON.parse(payload);\n } catch {\n return undefined;\n }\n}\n\n/**\n * Extract the JSON payload from an SSE-formatted response body.\n * MCP's StreamableHTTP transport returns single-shot responses as\n * ```\n * event: message\n * data: {\"jsonrpc\":\"2.0\",...}\n * ```\n * rather than a bare JSON document. Concatenates consecutive `data:`\n * lines per SSE spec; returns the last event's payload when multiple\n * events are present (the tool result is always the final one).\n */\nfunction extractSsePayload(text: string): string | undefined {\n const lines = text.split(/\\r?\\n/);\n let current: string[] = [];\n let last: string | undefined;\n for (const line of lines) {\n if (line === '') {\n if (current.length > 0) {\n last = current.join('\\n');\n current = [];\n }\n continue;\n }\n if (line.startsWith('data:')) {\n current.push(line.slice(5).replace(/^ /, ''));\n }\n }\n if (current.length > 0) last = current.join('\\n');\n return last;\n}\n\n/** Field-level diff on two extracted envelopes. Either side may be undefined. */\nfunction diffEnvelopeFields(\n envA: ErrorEnvelope | undefined,\n envB: ErrorEnvelope | undefined,\n differences: string[]\n): void {\n if (envA === undefined && envB === undefined) return;\n if (envA === undefined) {\n differences.push('error envelope present on probe B only (probe A was not a recognized error shape)');\n return;\n }\n if (envB === undefined) {\n differences.push('error envelope present on probe A only (probe B was not a recognized error shape)');\n return;\n }\n const fields: Array<keyof ErrorEnvelope> = ['code', 'message', 'field', 'details'];\n for (const field of fields) {\n const vA = envA[field];\n const vB = envB[field];\n if (vA === undefined && vB === undefined) continue;\n if (!deepEqual(vA, vB)) {\n differences.push(`error.${field} diverges: ${safeSlice(vA)} vs ${safeSlice(vB)}`);\n }\n }\n}\n\n/**\n * MCP `isError` and A2A `task.status.state` live outside the error\n * envelope but must match — a seller that flips `isError` or the A2A\n * state between probes is leaking existence info through transport-\n * level state even when the domain envelope matches.\n */\nfunction diffStateIndicators(a: unknown, b: unknown, differences: string[]): void {\n const isErrorA = extractIsError(a);\n const isErrorB = extractIsError(b);\n if (isErrorA !== isErrorB) {\n differences.push(`MCP isError diverges: ${isErrorA} vs ${isErrorB}`);\n }\n const stateA = extractA2AState(a);\n const stateB = extractA2AState(b);\n if (stateA !== stateB) {\n differences.push(`A2A task.status.state diverges: ${stateA} vs ${stateB}`);\n }\n}\n\ninterface ErrorEnvelope {\n code?: unknown;\n message?: unknown;\n field?: unknown;\n details?: unknown;\n}\n\nfunction extractEnvelope(body: unknown): ErrorEnvelope | undefined {\n if (!body || typeof body !== 'object') return undefined;\n const obj = body as Record<string, unknown>;\n\n // JSON-RPC wrapper — `result` carries the MCP CallToolResult on\n // success, `error` carries a JSON-RPC error on transport-level\n // failures. Recurse into whichever is present before the domain\n // extractors below.\n if (typeof obj.jsonrpc === 'string' && 'id' in obj && (obj.result !== undefined || obj.error !== undefined)) {\n if (obj.result !== undefined) {\n const inner = extractEnvelope(obj.result);\n if (inner) return inner;\n }\n if (obj.error !== undefined) {\n const inner = extractEnvelope(obj.error);\n if (inner) return inner;\n }\n return undefined;\n }\n\n // MCP CallToolResult: { isError?, structuredContent?, content?[{type:'text',text}] }.\n // Prefer structuredContent — it's the normalized shape the AdCP\n // server SDK emits. Fall back to parsing the text content for\n // agents that only set `content`.\n if (obj.structuredContent && typeof obj.structuredContent === 'object') {\n const inner = extractEnvelope(obj.structuredContent);\n if (inner) return inner;\n }\n if (Array.isArray(obj.content) && obj.content.length > 0) {\n for (const part of obj.content) {\n const text = (part as { type?: string; text?: string })?.text;\n if (typeof text === 'string') {\n const parsed = tryParseJson(text);\n if (parsed && typeof parsed === 'object') {\n const inner = extractEnvelope(parsed);\n if (inner) return inner;\n }\n }\n }\n }\n\n // A2A Task: { kind:'task', status, artifacts:[{ parts:[{ kind:'data', data }] }] }.\n // AdCP sellers over A2A return errors as `adcp_error` nested in an\n // artifact's data part. Walk every data part — agents may split parts\n // or use the last-artifact convention from the response unwrapper.\n if (Array.isArray(obj.artifacts)) {\n for (const artifact of obj.artifacts) {\n const parts = (artifact as { parts?: unknown })?.parts;\n if (Array.isArray(parts)) {\n for (const part of parts) {\n const data = (part as { kind?: string; data?: unknown })?.data;\n if (data && typeof data === 'object') {\n const inner = extractEnvelope(data);\n if (inner) return inner;\n }\n }\n }\n }\n }\n\n // A2A Message: { kind:'message', parts:[{ kind:'data', data }] }.\n // Sellers that skip the Task wrapper and reply with a Message\n // directly still carry the AdCP payload in a data part.\n if (obj.kind === 'message' && Array.isArray(obj.parts)) {\n for (const part of obj.parts) {\n const data = (part as { kind?: string; data?: unknown })?.data;\n if (data && typeof data === 'object') {\n const inner = extractEnvelope(data);\n if (inner) return inner;\n }\n }\n }\n\n // AdCP server SDK emits { adcp_error: { code, message, ... } }.\n if (obj.adcp_error && typeof obj.adcp_error === 'object') {\n return obj.adcp_error as ErrorEnvelope;\n }\n\n // AdCP `errors[0]` — preferred over bare `error` since the spec\n // ships a plural array.\n if (Array.isArray(obj.errors) && obj.errors.length > 0) {\n const first = obj.errors[0];\n if (first && typeof first === 'object') return first as ErrorEnvelope;\n }\n\n // Bare `error` — plain domain envelope or JSON-RPC error with `data`\n // carrying the AdCP code.\n if (typeof obj.error === 'object' && obj.error !== null) {\n const e = obj.error as Record<string, unknown>;\n if (e.data && typeof e.data === 'object') return e.data as ErrorEnvelope;\n return e as ErrorEnvelope;\n }\n\n return undefined;\n}\n\nfunction extractIsError(body: unknown): boolean | undefined {\n if (!body || typeof body !== 'object') return undefined;\n const obj = body as Record<string, unknown>;\n // JSON-RPC wrapper — CallToolResult sits under `result`.\n if (typeof obj.jsonrpc === 'string' && obj.result && typeof obj.result === 'object') {\n return extractIsError(obj.result);\n }\n const value = obj.isError;\n return typeof value === 'boolean' ? value : undefined;\n}\n\nfunction extractA2AState(body: unknown): string | undefined {\n if (!body || typeof body !== 'object') return undefined;\n const obj = body as Record<string, unknown>;\n // A2A messages wrap the task under `result` inside JSON-RPC.\n if (typeof obj.jsonrpc === 'string' && obj.result && typeof obj.result === 'object') {\n return extractA2AState(obj.result);\n }\n const state = (obj as { task?: { status?: { state?: unknown } } }).task?.status?.state;\n if (typeof state === 'string') return state;\n // A2A payloads sometimes embed the status directly on the result.\n const directStatus = (obj as { status?: { state?: unknown } }).status?.state;\n return typeof directStatus === 'string' ? directStatus : undefined;\n}\n\nfunction safeSlice(value: unknown, limit = 120): string {\n try {\n const s = JSON.stringify(value);\n if (!s) return String(value);\n return s.length <= limit ? s : s.slice(0, limit) + '…';\n } catch {\n return String(value);\n }\n}\n\nfunction deepEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (typeof a !== typeof b) return false;\n if (a === null || b === null) return a === b;\n if (typeof a !== 'object') return a === b;\n if (Array.isArray(a)) {\n if (!Array.isArray(b) || a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) if (!deepEqual(a[i], b[i])) return false;\n return true;\n }\n if (Array.isArray(b)) return false;\n const aKeys = Object.keys(a as object).sort();\n const bKeys = Object.keys(b as object).sort();\n if (aKeys.length !== bKeys.length) return false;\n for (let i = 0; i < aKeys.length; i++) if (aKeys[i] !== bKeys[i]) return false;\n for (const key of aKeys) {\n if (!deepEqual((a as Record<string, unknown>)[key], (b as Record<string, unknown>)[key])) return false;\n }\n return true;\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../../src/lib/conformance/invariants/uniformErrorComparator.ts"],"sourcesContent":["// Byte-equivalence comparator for the uniform-error-response invariant.\n//\n// Hard fails (populate `differences`, set `equivalent: false`):\n// - HTTP status diverges\n// - Error envelope fields diverge (code, message, field, details)\n// when both bodies parse as JSON error envelopes\n// - Raw body bytes diverge when bodies don't parse as recognized\n// error envelopes (MCP isError wrappers still compared body-level)\n// - Response headers diverge outside the narrow allowlist\n//\n// Soft metadata (populate `latencyDeltaMs`, no verdict change):\n// - Latency delta between the two probes. Extreme deltas are a\n// short-circuit-on-unknown smell (seller skips access check when\n// the id is well-formed-gibberish) — reviewers should inspect, but\n// one paired probe isn't enough to statistically fail on it.\n\nimport type { RawHttpCapture } from '../../protocols/rawResponseCapture';\n\nexport interface ProbeComparisonResult {\n equivalent: boolean;\n differences: string[];\n latencyDeltaMs: number;\n}\n\n/**\n * Response headers that MAY legitimately differ between two otherwise\n * identical probes. Everything else MUST match. Closed allowlist —\n * unknown headers default to must-match, which forces sellers to be\n * explicit about per-request fields.\n *\n * Three categories are covered:\n * 1. Timing/diagnostic: `Date`, `Server`, `Server-Timing`, `Age`, `Via`\n * 2. Request-ID / distributed tracing: `X-Request-Id`,\n * `X-Correlation-Id`, `X-Trace-Id`, `Traceparent`, `Tracestate`\n * 3. CDN insertions: `CF-Ray` (Cloudflare), `X-Amz-Cf-Id`\n * (CloudFront), `X-Amz-Request-Id` / `X-Amzn-Trace-Id` (AWS LB /\n * API Gateway). These are inserted by the edge for every request\n * and would otherwise false-positive fail any seller behind a CDN.\n *\n * NOT allowlisted (must-match) — and worth calling out because they\n * look variable but actually carry signal:\n * - `Content-Length`: byte-equivalent bodies have equal length.\n * Divergence = body divergence.\n * - `Vary`: content-negotiation policy is per-resource, not\n * per-request. Divergence implies the seller routed the two\n * probes through different handlers.\n * - `Content-Type`: same story — one codepath emits JSON, the other\n * emits HTML error page = leak.\n * - `ETag`, `Cache-Control`, `X-RateLimit-*`: attacker-visible side\n * channels that MUST NOT differ.\n *\n * Header names are normalized to lowercase before membership check.\n */\nconst HEADER_ALLOWLIST: ReadonlySet<string> = new Set([\n // Timing / diagnostic\n 'date',\n 'server',\n 'server-timing',\n 'age',\n 'via',\n // Request id / distributed tracing\n 'x-request-id',\n 'x-correlation-id',\n 'x-trace-id',\n 'traceparent',\n 'tracestate',\n // CDN / edge insertions\n 'cf-ray',\n 'x-amz-cf-id',\n 'x-amz-request-id',\n 'x-amzn-trace-id',\n 'fly-request-id',\n // Rate-limit counters (RFC 9331 + legacy). A well-behaved rate\n // limiter decrements uniformly on every request regardless of\n // resolution state, so the counter differs between probes with no\n // signal value. A leaky rate limiter that decrements only on the\n // \"found\" branch would still be caught via HTTP-status divergence\n // (the found branch would race a 429 eventually, the unfound\n // branch wouldn't) — but at that point the agent is advertising\n // existence through a separate channel, which the status check\n // covers. Keep these allowlisted; document the narrow gap.\n 'ratelimit',\n 'ratelimit-limit',\n 'ratelimit-policy',\n 'ratelimit-remaining',\n 'ratelimit-reset',\n 'x-ratelimit-limit',\n 'x-ratelimit-remaining',\n 'x-ratelimit-reset',\n]);\n\nexport function compareProbes(a: RawHttpCapture, b: RawHttpCapture): ProbeComparisonResult {\n const differences: string[] = [];\n\n if (a.status !== b.status) {\n differences.push(`HTTP status diverges: ${a.status} vs ${b.status}`);\n }\n\n diffHeaders(a.headers, b.headers, differences);\n diffBodies(a.body, b.body, differences);\n\n return {\n equivalent: differences.length === 0,\n differences,\n latencyDeltaMs: Math.abs(a.latencyMs - b.latencyMs),\n };\n}\n\nfunction diffHeaders(headersA: Record<string, string>, headersB: Record<string, string>, differences: string[]): void {\n const namesA = normalizedNames(headersA);\n const namesB = normalizedNames(headersB);\n const allNames = new Set([...namesA.keys(), ...namesB.keys()]);\n for (const lower of allNames) {\n if (HEADER_ALLOWLIST.has(lower)) continue;\n const valueA = namesA.get(lower);\n const valueB = namesB.get(lower);\n if (valueA === undefined && valueB !== undefined) {\n differences.push(`header \"${lower}\" present on probe B only: ${JSON.stringify(valueB)}`);\n } else if (valueA !== undefined && valueB === undefined) {\n differences.push(`header \"${lower}\" present on probe A only: ${JSON.stringify(valueA)}`);\n } else if (valueA !== valueB) {\n differences.push(`header \"${lower}\" diverges: ${JSON.stringify(valueA)} vs ${JSON.stringify(valueB)}`);\n }\n }\n}\n\nfunction normalizedNames(headers: Record<string, string>): Map<string, string> {\n const out = new Map<string, string>();\n for (const [name, value] of Object.entries(headers)) {\n out.set(name.toLowerCase(), value);\n }\n return out;\n}\n\n/**\n * Body comparison order:\n *\n * 1. Exact string match — the happy path for sellers whose transport\n * fully normalizes per-request metadata.\n * 2. JSON parse on both sides. If both parse:\n * a. If both carry a recognizable error envelope, compare envelope\n * fields + MCP isError / A2A state ONLY. Per-request metadata\n * (JSON-RPC id, MCP request id, timestamps) legitimately varies\n * and would otherwise mask the real invariant signal.\n * b. Otherwise, structural equality — catches reordered keys that\n * raw compare would call a miss.\n * 3. Non-JSON or mixed — raw byte-length hint.\n */\nfunction diffBodies(bodyA: string, bodyB: string, differences: string[]): void {\n if (bodyA === bodyB) return;\n\n const parsedA = tryParseJson(bodyA);\n const parsedB = tryParseJson(bodyB);\n if (parsedA !== undefined && parsedB !== undefined) {\n // State indicators (MCP isError, A2A task state) run unconditionally\n // — they're protocol-level signals that live outside the error\n // envelope and MUST match even when the domain body is empty.\n diffStateIndicators(parsedA, parsedB, differences);\n\n const envA = extractEnvelope(parsedA);\n const envB = extractEnvelope(parsedB);\n if (envA !== undefined || envB !== undefined) {\n diffEnvelopeFields(envA, envB, differences);\n return;\n }\n // Neither side is a recognizable error envelope — both are success\n // bodies (e.g., `get_signals` returning an empty match list for an\n // unknown id). Peel the JSON-RPC + MCP CallToolResult wrappers so\n // per-request metadata (jsonrpc id, MCP request id) doesn't mask\n // the real structural comparison.\n if (deepEqual(peelWrappers(parsedA), peelWrappers(parsedB))) return;\n if (differences.length === 0) {\n differences.push('response body diverges (parsed JSON differs)');\n }\n return;\n }\n\n differences.push(`response body diverges (${bodyA.length} bytes vs ${bodyB.length} bytes)`);\n}\n\n/**\n * Strip known per-request metadata wrappers so success bodies compare\n * structurally. Peels JSON-RPC `{ jsonrpc, id, result }` → `result`,\n * then collapses MCP CallToolResult to its domain payload:\n * - `structuredContent` (L3) wins when present\n * - else `content[].text` parsed as JSON (L2 fallback)\n * - `_meta` (MCP per-request metadata carrying e.g. related-task id)\n * is always stripped\n * No-op on shapes we don't recognize.\n */\nfunction peelWrappers(body: unknown): unknown {\n if (!body || typeof body !== 'object') return body;\n const obj = body as Record<string, unknown>;\n if (typeof obj.jsonrpc === 'string' && 'id' in obj) {\n if (obj.result !== undefined) return peelWrappers(obj.result);\n if (obj.error !== undefined) return peelWrappers(obj.error);\n }\n // MCP CallToolResult: prefer the structured domain payload, falling\n // through to the text content if structuredContent is absent.\n if (obj.structuredContent !== undefined) return obj.structuredContent;\n if (Array.isArray(obj.content)) {\n for (const part of obj.content) {\n const text = (part as { type?: string; text?: string })?.text;\n if (typeof text === 'string') {\n const parsed = tryParseJson(text);\n if (parsed !== undefined) return parsed;\n }\n }\n }\n // A2A Task / Message — reduce to just the data parts' payloads so\n // per-request ids (task.id, contextId, artifactId, messageId,\n // status.timestamp) don't fail structural compare when the domain\n // data is actually identical.\n if (obj.kind === 'task' && Array.isArray(obj.artifacts)) {\n return collectA2ADataParts(obj.artifacts);\n }\n if (obj.kind === 'message' && Array.isArray(obj.parts)) {\n return collectA2ADataParts([obj]);\n }\n // Strip `_meta` — MCP's per-request metadata channel — before\n // handing the object back for structural comparison.\n if ('_meta' in obj) {\n const { _meta, ...rest } = obj;\n void _meta;\n return rest;\n }\n return obj;\n}\n\nfunction collectA2ADataParts(source: unknown[]): unknown[] {\n const out: unknown[] = [];\n for (const entry of source) {\n const parts = (entry as { parts?: unknown })?.parts;\n if (!Array.isArray(parts)) continue;\n for (const part of parts) {\n const p = part as { kind?: string; data?: unknown; text?: unknown };\n if (p?.kind === 'data' && p.data !== undefined) out.push(p.data);\n else if (p?.kind === 'text' && typeof p.text === 'string') out.push({ text: p.text });\n }\n }\n return out;\n}\n\nfunction tryParseJson(text: string): unknown {\n if (text.length === 0) return undefined;\n const payload = text.startsWith('event:') || text.startsWith('data:') ? extractSsePayload(text) : text;\n if (!payload) return undefined;\n try {\n return JSON.parse(payload);\n } catch {\n return undefined;\n }\n}\n\n/**\n * Extract the JSON payload from an SSE-formatted response body.\n * MCP's StreamableHTTP transport returns single-shot responses as\n * ```\n * event: message\n * data: {\"jsonrpc\":\"2.0\",...}\n * ```\n * rather than a bare JSON document. Concatenates consecutive `data:`\n * lines per SSE spec; returns the last event's payload when multiple\n * events are present (the tool result is always the final one).\n */\nfunction extractSsePayload(text: string): string | undefined {\n const lines = text.split(/\\r?\\n/);\n let current: string[] = [];\n let last: string | undefined;\n for (const line of lines) {\n if (line === '') {\n if (current.length > 0) {\n last = current.join('\\n');\n current = [];\n }\n continue;\n }\n if (line.startsWith('data:')) {\n current.push(line.slice(5).replace(/^ /, ''));\n }\n }\n if (current.length > 0) last = current.join('\\n');\n return last;\n}\n\n/** Field-level diff on two extracted envelopes. Either side may be undefined. */\nfunction diffEnvelopeFields(\n envA: ErrorEnvelope | undefined,\n envB: ErrorEnvelope | undefined,\n differences: string[]\n): void {\n if (envA === undefined && envB === undefined) return;\n if (envA === undefined) {\n differences.push('error envelope present on probe B only (probe A was not a recognized error shape)');\n return;\n }\n if (envB === undefined) {\n differences.push('error envelope present on probe A only (probe B was not a recognized error shape)');\n return;\n }\n const fields: Array<keyof ErrorEnvelope> = ['code', 'message', 'field', 'details'];\n for (const field of fields) {\n const vA = envA[field];\n const vB = envB[field];\n if (vA === undefined && vB === undefined) continue;\n if (!deepEqual(vA, vB)) {\n differences.push(`error.${field} diverges: ${safeSlice(vA)} vs ${safeSlice(vB)}`);\n }\n }\n}\n\n/**\n * MCP `isError` and A2A `task.status.state` live outside the error\n * envelope but must match — a seller that flips `isError` or the A2A\n * state between probes is leaking existence info through transport-\n * level state even when the domain envelope matches.\n */\nfunction diffStateIndicators(a: unknown, b: unknown, differences: string[]): void {\n const isErrorA = extractIsError(a);\n const isErrorB = extractIsError(b);\n if (isErrorA !== isErrorB) {\n differences.push(`MCP isError diverges: ${isErrorA} vs ${isErrorB}`);\n }\n const stateA = extractA2AState(a);\n const stateB = extractA2AState(b);\n if (stateA !== stateB) {\n differences.push(`A2A task.status.state diverges: ${stateA} vs ${stateB}`);\n }\n}\n\ninterface ErrorEnvelope {\n code?: unknown;\n message?: unknown;\n field?: unknown;\n details?: unknown;\n}\n\nfunction extractEnvelope(body: unknown): ErrorEnvelope | undefined {\n if (!body || typeof body !== 'object') return undefined;\n const obj = body as Record<string, unknown>;\n\n // JSON-RPC wrapper — `result` carries the MCP CallToolResult on\n // success, `error` carries a JSON-RPC error on transport-level\n // failures. Recurse into whichever is present before the domain\n // extractors below.\n if (typeof obj.jsonrpc === 'string' && 'id' in obj && (obj.result !== undefined || obj.error !== undefined)) {\n if (obj.result !== undefined) {\n const inner = extractEnvelope(obj.result);\n if (inner) return inner;\n }\n if (obj.error !== undefined) {\n const inner = extractEnvelope(obj.error);\n if (inner) return inner;\n }\n return undefined;\n }\n\n // MCP CallToolResult: { isError?, structuredContent?, content?[{type:'text',text}] }.\n // Prefer structuredContent — it's the normalized shape the AdCP\n // server SDK emits. Fall back to parsing the text content for\n // agents that only set `content`.\n if (obj.structuredContent && typeof obj.structuredContent === 'object') {\n const inner = extractEnvelope(obj.structuredContent);\n if (inner) return inner;\n }\n if (Array.isArray(obj.content) && obj.content.length > 0) {\n for (const part of obj.content) {\n const text = (part as { type?: string; text?: string })?.text;\n if (typeof text === 'string') {\n const parsed = tryParseJson(text);\n if (parsed && typeof parsed === 'object') {\n const inner = extractEnvelope(parsed);\n if (inner) return inner;\n }\n }\n }\n }\n\n // A2A Task: { kind:'task', status, artifacts:[{ parts:[{ kind:'data', data }] }] }.\n // AdCP sellers over A2A return errors as `adcp_error` nested in an\n // artifact's data part. Walk every data part — agents may split parts\n // or use the last-artifact convention from the response unwrapper.\n if (Array.isArray(obj.artifacts)) {\n for (const artifact of obj.artifacts) {\n const parts = (artifact as { parts?: unknown })?.parts;\n if (Array.isArray(parts)) {\n for (const part of parts) {\n const data = (part as { kind?: string; data?: unknown })?.data;\n if (data && typeof data === 'object') {\n const inner = extractEnvelope(data);\n if (inner) return inner;\n }\n }\n }\n }\n }\n\n // A2A Message: { kind:'message', parts:[{ kind:'data', data }] }.\n // Sellers that skip the Task wrapper and reply with a Message\n // directly still carry the AdCP payload in a data part.\n if (obj.kind === 'message' && Array.isArray(obj.parts)) {\n for (const part of obj.parts) {\n const data = (part as { kind?: string; data?: unknown })?.data;\n if (data && typeof data === 'object') {\n const inner = extractEnvelope(data);\n if (inner) return inner;\n }\n }\n }\n\n // AdCP server SDK emits { adcp_error: { code, message, ... } }.\n if (obj.adcp_error && typeof obj.adcp_error === 'object') {\n return obj.adcp_error as ErrorEnvelope;\n }\n\n // AdCP `errors[0]` — preferred over bare `error` since the spec\n // ships a plural array.\n if (Array.isArray(obj.errors) && obj.errors.length > 0) {\n const first = obj.errors[0];\n if (first && typeof first === 'object') return first as ErrorEnvelope;\n }\n\n // Bare `error` — plain domain envelope or JSON-RPC error with `data`\n // carrying the AdCP code.\n if (typeof obj.error === 'object' && obj.error !== null) {\n const e = obj.error as Record<string, unknown>;\n if (e.data && typeof e.data === 'object') return e.data as ErrorEnvelope;\n return e as ErrorEnvelope;\n }\n\n return undefined;\n}\n\nfunction extractIsError(body: unknown): boolean | undefined {\n if (!body || typeof body !== 'object') return undefined;\n const obj = body as Record<string, unknown>;\n // JSON-RPC wrapper — CallToolResult sits under `result`.\n if (typeof obj.jsonrpc === 'string' && obj.result && typeof obj.result === 'object') {\n return extractIsError(obj.result);\n }\n const value = obj.isError;\n return typeof value === 'boolean' ? value : undefined;\n}\n\nfunction extractA2AState(body: unknown): string | undefined {\n if (!body || typeof body !== 'object') return undefined;\n const obj = body as Record<string, unknown>;\n // A2A messages wrap the task under `result` inside JSON-RPC.\n if (typeof obj.jsonrpc === 'string' && obj.result && typeof obj.result === 'object') {\n return extractA2AState(obj.result);\n }\n const state = (obj as { task?: { status?: { state?: unknown } } }).task?.status?.state;\n if (typeof state === 'string') return state;\n // A2A payloads sometimes embed the status directly on the result.\n const directStatus = (obj as { status?: { state?: unknown } }).status?.state;\n return typeof directStatus === 'string' ? directStatus : undefined;\n}\n\nfunction safeSlice(value: unknown, limit = 120): string {\n try {\n const s = JSON.stringify(value);\n if (!s) return String(value);\n return s.length <= limit ? s : s.slice(0, limit) + '…';\n } catch {\n return String(value);\n }\n}\n\nfunction deepEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (typeof a !== typeof b) return false;\n if (a === null || b === null) return a === b;\n if (typeof a !== 'object') return a === b;\n if (Array.isArray(a)) {\n if (!Array.isArray(b) || a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) if (!deepEqual(a[i], b[i])) return false;\n return true;\n }\n if (Array.isArray(b)) return false;\n const aKeys = Object.keys(a as object).sort();\n const bKeys = Object.keys(b as object).sort();\n if (aKeys.length !== bKeys.length) return false;\n for (let i = 0; i < aKeys.length; i++) if (aKeys[i] !== bKeys[i]) return false;\n for (const key of aKeys) {\n if (!deepEqual((a as Record<string, unknown>)[key], (b as Record<string, unknown>)[key])) return false;\n }\n return true;\n}\n"],"mappings":"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","names":[]}
@@ -1,9 +1,3 @@
1
- import { fileURLToPath as __adcpFileURLToPath } from 'node:url';
2
- import { dirname as __adcpDirname } from 'node:path';
3
- import { createRequire as __adcpCreateRequire } from 'node:module';
4
- const __filename = __adcpFileURLToPath(import.meta.url);
5
- const __dirname = __adcpDirname(__filename);
6
- const require = __adcpCreateRequire(import.meta.url);
7
1
  import Ajv from "ajv";
8
2
  import addFormats from "ajv-formats";
9
3
  import { loadResponseSchema } from "./schemaLoader.mjs";
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/conformance/oracle.ts"],"sourcesContent":["import Ajv from 'ajv';\nimport addFormats from 'ajv-formats';\nimport type { TaskResult } from '../core/ConversationTypes';\nimport type { ConformanceToolName, OracleVerdict } from './types';\nimport { loadResponseSchema, type ConformanceSchemaOptions } from './schemaLoader';\n\nexport interface OracleInput {\n tool: ConformanceToolName;\n request: unknown;\n /** TaskResult envelope returned by AgentClient.executeTask. */\n result: TaskResult<unknown>;\n /** Auth token that was used to make the request — checked for leaks. */\n authToken?: string;\n /** Schema bundle override for same-PR / external conformance runs. */\n schemas?: ConformanceSchemaOptions;\n}\n\nexport interface OracleOutput {\n verdict: OracleVerdict;\n invariantFailures: string[];\n}\n\n// Substring signatures (fast) — match language-specific stack frame shapes.\n// Haystack is JSON-encoded so real \\n become literal \"\\n\" (two chars);\n// signatures use literal \\n characters and match the JSON-escape form.\nconst STACK_TRACE_SIGNATURES = [\n ' at ', // V8 / Node\n 'Traceback (most recent call last)', // Python\n 'node_modules/',\n '.py\", line',\n '\\\\n File \"', // Python, JSON-escaped newline\n 'goroutine ', // Go runtime panic header\n '\\\\n\\\\tat ', // JVM \"\\tat com.foo.Bar(Bar.java:42)\" frames in JSON-encoded body\n 'Stack trace:\\\\n#0 ', // PHP uncaught-exception traceback preamble\n];\n\n// Regex signatures (slower, run second) — shapes that need structure to\n// avoid over-matching on innocent strings.\nconst STACK_TRACE_REGEXES: readonly RegExp[] = [\n // Go: `main.fn(0x1234)\\n\\t/app/main.go:42 +0x1a`\n /\\.go:\\d+ \\+0x[0-9a-f]+/,\n // PHP: `#7 /var/www/foo.php(42): Bar->baz()` — numbered frame with file:line\n /#\\d+ [^\\s]+\\.php\\(\\d+\\):/,\n // JVM: `\\n\\tat com.foo.Bar.method(Bar.java:42)` — fully-qualified\n // method with source:line. Anchored to whitespace/newline so an\n // echoed Javadoc reference in prose (`\"at com.foo.Bar(Bar.java:42)\"`)\n // doesn't trigger the detector — real stack frames sit on their own\n // indented line.\n /(?:\\\\n\\s*|^\\s+|\\n\\s+)at [\\w$.]+\\.[\\w$]+\\([\\w$]+\\.(?:java|kt|kts|scala|groovy):\\d+\\)/,\n // .NET: `at Foo.Bar.Baz() in /path/to/X.cs:line 42` — method invocation\n // followed by ` in ` and a file:line marker. The method-name charset\n // includes parens/brackets for generic and overloaded signatures.\n /at [\\w.<>`,()[\\]]+ in [^:\\s]+\\.(?:cs|vb|fs):line \\d+/,\n];\n\nconst FS_PATH_SIGNATURES = [/\\/Users\\/[^ \"']+/, /\\/home\\/[^ \"']+/, /[A-Z]:\\\\\\\\Users\\\\\\\\/];\n\nlet cachedAjv: Ajv | null = null;\nfunction getAjv(): Ajv {\n if (cachedAjv) return cachedAjv;\n const ajv = new Ajv({ allErrors: true, strict: false, validateFormats: true });\n addFormats(ajv);\n cachedAjv = ajv;\n return ajv;\n}\n\nconst compiledValidators = new Map<string, ReturnType<Ajv['compile']>>();\n\nfunction schemaCacheKey(tool: ConformanceToolName, options: ConformanceSchemaOptions | undefined): string {\n return `${tool}\\0${options?.schemaRoot ?? ''}\\0${options?.version ?? ''}`;\n}\n\nfunction responseValidator(tool: ConformanceToolName, options?: ConformanceSchemaOptions): ReturnType<Ajv['compile']> {\n const cacheKey = schemaCacheKey(tool, options);\n const cached = compiledValidators.get(cacheKey);\n if (cached) return cached;\n const schema = loadResponseSchema(tool, options);\n const validator = getAjv().compile(schema);\n compiledValidators.set(cacheKey, validator);\n return validator;\n}\n\n/**\n * Does the response schema declare a top-level `context` property —\n * either directly or on one of its `oneOf` branches? When it does, a\n * request-context that's not echoed is an invariant violation; when it\n * doesn't, a missing context field is silent tolerance.\n */\nconst responseSchemaHasContext = new Map<string, boolean>();\nfunction responseEchoesContext(tool: ConformanceToolName, options?: ConformanceSchemaOptions): boolean {\n const cacheKey = schemaCacheKey(tool, options);\n const cached = responseSchemaHasContext.get(cacheKey);\n if (cached !== undefined) return cached;\n const schema = loadResponseSchema(tool, options) as {\n properties?: Record<string, unknown>;\n oneOf?: Array<{ properties?: Record<string, unknown> }>;\n };\n const direct = !!schema.properties && 'context' in schema.properties;\n const branched = Array.isArray(schema.oneOf) && schema.oneOf.some(b => !!b.properties && 'context' in b.properties);\n const answer = direct || branched;\n responseSchemaHasContext.set(cacheKey, answer);\n return answer;\n}\n\n/**\n * Warm the response-schema validator for a tool. Throws if Ajv can't\n * compile — the runner uses that as the signal to skip the tool rather\n * than fail every iteration. Separated from `evaluate()` so the failure\n * surfaces once per tool, not once per sample.\n */\nexport function prepareResponseValidator(tool: ConformanceToolName, options?: ConformanceSchemaOptions): void {\n responseValidator(tool, options);\n}\n\n/**\n * Classify a tool response under the two-path oracle.\n *\n * Accepted: `TaskResult.data` validates against the response schema.\n * Rejected: `TaskResult.success === false` with a well-formed error\n * envelope (non-empty code, human-readable message).\n * Invalid: neither — the agent crashed, truncated the envelope, leaked a\n * stack trace, or echoed a credential.\n *\n * Invariants hold on both accepted and rejected paths: no credential leak,\n * no stack trace / filesystem path in the response body, and `context` is\n * echoed unchanged when the caller supplied one.\n */\nexport function evaluate(input: OracleInput): OracleOutput {\n const { tool, request, result, authToken, schemas } = input;\n const invariantFailures: string[] = [];\n\n checkNoAuthLeak(result, authToken, invariantFailures);\n checkNoStackLeak(result, invariantFailures);\n checkNoFilesystemLeak(result, invariantFailures);\n checkContextEchoed(tool, request, result, invariantFailures, schemas);\n\n if (result.success === false) {\n checkErrorEnvelope(result, invariantFailures);\n return {\n verdict: invariantFailures.length === 0 ? 'rejected' : 'invalid',\n invariantFailures,\n };\n }\n\n if (result.status !== 'completed' || result.data === undefined) {\n // Intermediate states (working/submitted/input-required) don't exercise\n // the response-schema path — treat as rejected (nothing to invariant-check).\n return { verdict: 'rejected', invariantFailures };\n }\n\n const validate = responseValidator(tool, schemas);\n const payloadForValidation = responsePayloadForValidation(result);\n if (!validate(payloadForValidation)) {\n const errors = (validate.errors ?? []).slice(0, 3).map(formatAjvError);\n invariantFailures.push(`response schema mismatch: ${errors.join('; ')}`);\n return { verdict: 'invalid', invariantFailures };\n }\n\n return {\n verdict: invariantFailures.length === 0 ? 'accepted' : 'invalid',\n invariantFailures,\n };\n}\n\nfunction responsePayloadForValidation(result: TaskResult<unknown>): unknown {\n if (!result.data || typeof result.data !== 'object' || Array.isArray(result.data)) return result.data;\n const data = result.data as Record<string, unknown>;\n return data.status === undefined ? { status: result.status, ...data } : data;\n}\n\n/**\n * Stringify every channel an agent can leak through: payload, error\n * message, `adcpError.code`/`.message`/`.details`, correlation id, and\n * task metadata. The earlier version scanned only `result.data` and\n * `result.error`, so leaks through `adcpError.details.stack` slipped\n * past.\n */\nfunction buildLeakHaystack(result: TaskResult<unknown>): string {\n const parts: unknown[] = [\n result.data,\n result.error,\n result.adcpError,\n (result as { correlationId?: unknown }).correlationId,\n (result as { metadata?: unknown }).metadata,\n ];\n return parts.map(p => (p === undefined ? '' : safeStringify(p))).join(' ');\n}\n\nfunction checkNoAuthLeak(result: TaskResult<unknown>, authToken: string | undefined, failures: string[]): void {\n // 8-char floor catches random 4-byte coincidences without triggering on\n // every short hex-looking string. Detects verbatim echo only — agents\n // can evade by re-encoding. Documented in docs/guides/CONFORMANCE.md.\n if (!authToken || authToken.length < 8) return;\n if (buildLeakHaystack(result).includes(authToken)) failures.push('auth token echoed in response body');\n}\n\nfunction checkNoStackLeak(result: TaskResult<unknown>, failures: string[]): void {\n const haystack = buildLeakHaystack(result);\n for (const sig of STACK_TRACE_SIGNATURES) {\n if (haystack.includes(sig)) {\n failures.push(`stack trace leak (matched ${JSON.stringify(sig)})`);\n return;\n }\n }\n for (const rx of STACK_TRACE_REGEXES) {\n if (rx.test(haystack)) {\n failures.push(`stack trace leak (matched ${rx.source})`);\n return;\n }\n }\n}\n\nfunction checkNoFilesystemLeak(result: TaskResult<unknown>, failures: string[]): void {\n const haystack = buildLeakHaystack(result);\n for (const sig of FS_PATH_SIGNATURES) {\n if (sig.test(haystack)) {\n failures.push(`filesystem path leak (matched ${sig.source})`);\n return;\n }\n }\n}\n\nfunction checkContextEchoed(\n tool: ConformanceToolName,\n request: unknown,\n result: TaskResult<unknown>,\n failures: string[],\n schemas?: ConformanceSchemaOptions\n): void {\n const reqContext = (request as { context?: unknown } | undefined)?.context;\n if (reqContext === undefined) return;\n const respContext = (result.data as { context?: unknown } | undefined)?.context;\n if (respContext === undefined) {\n // When the response schema declares a `context` property, a missing\n // echo IS a violation — the spec requires unchanged pass-through.\n // When the schema omits `context` (some discovery-only responses do),\n // silent tolerance stands.\n if (responseEchoesContext(tool, schemas)) {\n failures.push('request.context not echoed on response (schema declares context but response omitted it)');\n }\n return;\n }\n if (!deepEqual(reqContext, respContext)) {\n failures.push('request.context not echoed unchanged on response');\n }\n}\n\nfunction checkErrorEnvelope(result: TaskResult<unknown>, failures: string[]): void {\n if (!result.error || typeof result.error !== 'string' || result.error.length === 0) {\n failures.push('error envelope missing human-readable message');\n }\n const code = result.adcpError?.code;\n if (code === undefined) {\n failures.push('error envelope missing reason code');\n return;\n }\n if (typeof code !== 'string' || code.length === 0) {\n failures.push(`reason code is not a non-empty string: ${JSON.stringify(code)}`);\n return;\n }\n if (!/^[A-Z][A-Z0-9_]*$/.test(code)) {\n failures.push(`reason code \"${code}\" is not uppercase-snake format per spec`);\n }\n}\n\nfunction formatAjvError(e: { instancePath?: string; message?: string; keyword?: string }): string {\n const path = e.instancePath || '(root)';\n return `${path}: ${e.message ?? e.keyword ?? 'invalid'}`;\n}\n\nfunction safeStringify(value: unknown): string {\n try {\n return JSON.stringify(value) ?? '';\n } catch {\n return '';\n }\n}\n\n/**\n * Key-order-insensitive structural equality. JSON.stringify-based compare\n * produces false positives when an agent round-trips `context` through a\n * dict/map that doesn't preserve insertion order (Python, Go).\n */\nfunction deepEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (typeof a !== typeof b) return false;\n if (a === null || b === null) return a === b;\n if (typeof a !== 'object') return a === b;\n if (Array.isArray(a)) {\n if (!Array.isArray(b) || a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) if (!deepEqual(a[i], b[i])) return false;\n return true;\n }\n if (Array.isArray(b)) return false;\n const aKeys = Object.keys(a as object).sort();\n const bKeys = Object.keys(b as object).sort();\n if (aKeys.length !== bKeys.length) return false;\n for (let i = 0; i < aKeys.length; i++) if (aKeys[i] !== bKeys[i]) return false;\n for (const key of aKeys) {\n if (!deepEqual((a as Record<string, unknown>)[key], (b as Record<string, unknown>)[key])) return false;\n }\n return true;\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/lib/conformance/oracle.ts"],"sourcesContent":["import Ajv from 'ajv';\nimport addFormats from 'ajv-formats';\nimport type { TaskResult } from '../core/ConversationTypes';\nimport type { ConformanceToolName, OracleVerdict } from './types';\nimport { loadResponseSchema, type ConformanceSchemaOptions } from './schemaLoader';\n\nexport interface OracleInput {\n tool: ConformanceToolName;\n request: unknown;\n /** TaskResult envelope returned by AgentClient.executeTask. */\n result: TaskResult<unknown>;\n /** Auth token that was used to make the request — checked for leaks. */\n authToken?: string;\n /** Schema bundle override for same-PR / external conformance runs. */\n schemas?: ConformanceSchemaOptions;\n}\n\nexport interface OracleOutput {\n verdict: OracleVerdict;\n invariantFailures: string[];\n}\n\n// Substring signatures (fast) — match language-specific stack frame shapes.\n// Haystack is JSON-encoded so real \\n become literal \"\\n\" (two chars);\n// signatures use literal \\n characters and match the JSON-escape form.\nconst STACK_TRACE_SIGNATURES = [\n ' at ', // V8 / Node\n 'Traceback (most recent call last)', // Python\n 'node_modules/',\n '.py\", line',\n '\\\\n File \"', // Python, JSON-escaped newline\n 'goroutine ', // Go runtime panic header\n '\\\\n\\\\tat ', // JVM \"\\tat com.foo.Bar(Bar.java:42)\" frames in JSON-encoded body\n 'Stack trace:\\\\n#0 ', // PHP uncaught-exception traceback preamble\n];\n\n// Regex signatures (slower, run second) — shapes that need structure to\n// avoid over-matching on innocent strings.\nconst STACK_TRACE_REGEXES: readonly RegExp[] = [\n // Go: `main.fn(0x1234)\\n\\t/app/main.go:42 +0x1a`\n /\\.go:\\d+ \\+0x[0-9a-f]+/,\n // PHP: `#7 /var/www/foo.php(42): Bar->baz()` — numbered frame with file:line\n /#\\d+ [^\\s]+\\.php\\(\\d+\\):/,\n // JVM: `\\n\\tat com.foo.Bar.method(Bar.java:42)` — fully-qualified\n // method with source:line. Anchored to whitespace/newline so an\n // echoed Javadoc reference in prose (`\"at com.foo.Bar(Bar.java:42)\"`)\n // doesn't trigger the detector — real stack frames sit on their own\n // indented line.\n /(?:\\\\n\\s*|^\\s+|\\n\\s+)at [\\w$.]+\\.[\\w$]+\\([\\w$]+\\.(?:java|kt|kts|scala|groovy):\\d+\\)/,\n // .NET: `at Foo.Bar.Baz() in /path/to/X.cs:line 42` — method invocation\n // followed by ` in ` and a file:line marker. The method-name charset\n // includes parens/brackets for generic and overloaded signatures.\n /at [\\w.<>`,()[\\]]+ in [^:\\s]+\\.(?:cs|vb|fs):line \\d+/,\n];\n\nconst FS_PATH_SIGNATURES = [/\\/Users\\/[^ \"']+/, /\\/home\\/[^ \"']+/, /[A-Z]:\\\\\\\\Users\\\\\\\\/];\n\nlet cachedAjv: Ajv | null = null;\nfunction getAjv(): Ajv {\n if (cachedAjv) return cachedAjv;\n const ajv = new Ajv({ allErrors: true, strict: false, validateFormats: true });\n addFormats(ajv);\n cachedAjv = ajv;\n return ajv;\n}\n\nconst compiledValidators = new Map<string, ReturnType<Ajv['compile']>>();\n\nfunction schemaCacheKey(tool: ConformanceToolName, options: ConformanceSchemaOptions | undefined): string {\n return `${tool}\\0${options?.schemaRoot ?? ''}\\0${options?.version ?? ''}`;\n}\n\nfunction responseValidator(tool: ConformanceToolName, options?: ConformanceSchemaOptions): ReturnType<Ajv['compile']> {\n const cacheKey = schemaCacheKey(tool, options);\n const cached = compiledValidators.get(cacheKey);\n if (cached) return cached;\n const schema = loadResponseSchema(tool, options);\n const validator = getAjv().compile(schema);\n compiledValidators.set(cacheKey, validator);\n return validator;\n}\n\n/**\n * Does the response schema declare a top-level `context` property —\n * either directly or on one of its `oneOf` branches? When it does, a\n * request-context that's not echoed is an invariant violation; when it\n * doesn't, a missing context field is silent tolerance.\n */\nconst responseSchemaHasContext = new Map<string, boolean>();\nfunction responseEchoesContext(tool: ConformanceToolName, options?: ConformanceSchemaOptions): boolean {\n const cacheKey = schemaCacheKey(tool, options);\n const cached = responseSchemaHasContext.get(cacheKey);\n if (cached !== undefined) return cached;\n const schema = loadResponseSchema(tool, options) as {\n properties?: Record<string, unknown>;\n oneOf?: Array<{ properties?: Record<string, unknown> }>;\n };\n const direct = !!schema.properties && 'context' in schema.properties;\n const branched = Array.isArray(schema.oneOf) && schema.oneOf.some(b => !!b.properties && 'context' in b.properties);\n const answer = direct || branched;\n responseSchemaHasContext.set(cacheKey, answer);\n return answer;\n}\n\n/**\n * Warm the response-schema validator for a tool. Throws if Ajv can't\n * compile — the runner uses that as the signal to skip the tool rather\n * than fail every iteration. Separated from `evaluate()` so the failure\n * surfaces once per tool, not once per sample.\n */\nexport function prepareResponseValidator(tool: ConformanceToolName, options?: ConformanceSchemaOptions): void {\n responseValidator(tool, options);\n}\n\n/**\n * Classify a tool response under the two-path oracle.\n *\n * Accepted: `TaskResult.data` validates against the response schema.\n * Rejected: `TaskResult.success === false` with a well-formed error\n * envelope (non-empty code, human-readable message).\n * Invalid: neither — the agent crashed, truncated the envelope, leaked a\n * stack trace, or echoed a credential.\n *\n * Invariants hold on both accepted and rejected paths: no credential leak,\n * no stack trace / filesystem path in the response body, and `context` is\n * echoed unchanged when the caller supplied one.\n */\nexport function evaluate(input: OracleInput): OracleOutput {\n const { tool, request, result, authToken, schemas } = input;\n const invariantFailures: string[] = [];\n\n checkNoAuthLeak(result, authToken, invariantFailures);\n checkNoStackLeak(result, invariantFailures);\n checkNoFilesystemLeak(result, invariantFailures);\n checkContextEchoed(tool, request, result, invariantFailures, schemas);\n\n if (result.success === false) {\n checkErrorEnvelope(result, invariantFailures);\n return {\n verdict: invariantFailures.length === 0 ? 'rejected' : 'invalid',\n invariantFailures,\n };\n }\n\n if (result.status !== 'completed' || result.data === undefined) {\n // Intermediate states (working/submitted/input-required) don't exercise\n // the response-schema path — treat as rejected (nothing to invariant-check).\n return { verdict: 'rejected', invariantFailures };\n }\n\n const validate = responseValidator(tool, schemas);\n const payloadForValidation = responsePayloadForValidation(result);\n if (!validate(payloadForValidation)) {\n const errors = (validate.errors ?? []).slice(0, 3).map(formatAjvError);\n invariantFailures.push(`response schema mismatch: ${errors.join('; ')}`);\n return { verdict: 'invalid', invariantFailures };\n }\n\n return {\n verdict: invariantFailures.length === 0 ? 'accepted' : 'invalid',\n invariantFailures,\n };\n}\n\nfunction responsePayloadForValidation(result: TaskResult<unknown>): unknown {\n if (!result.data || typeof result.data !== 'object' || Array.isArray(result.data)) return result.data;\n const data = result.data as Record<string, unknown>;\n return data.status === undefined ? { status: result.status, ...data } : data;\n}\n\n/**\n * Stringify every channel an agent can leak through: payload, error\n * message, `adcpError.code`/`.message`/`.details`, correlation id, and\n * task metadata. The earlier version scanned only `result.data` and\n * `result.error`, so leaks through `adcpError.details.stack` slipped\n * past.\n */\nfunction buildLeakHaystack(result: TaskResult<unknown>): string {\n const parts: unknown[] = [\n result.data,\n result.error,\n result.adcpError,\n (result as { correlationId?: unknown }).correlationId,\n (result as { metadata?: unknown }).metadata,\n ];\n return parts.map(p => (p === undefined ? '' : safeStringify(p))).join(' ');\n}\n\nfunction checkNoAuthLeak(result: TaskResult<unknown>, authToken: string | undefined, failures: string[]): void {\n // 8-char floor catches random 4-byte coincidences without triggering on\n // every short hex-looking string. Detects verbatim echo only — agents\n // can evade by re-encoding. Documented in docs/guides/CONFORMANCE.md.\n if (!authToken || authToken.length < 8) return;\n if (buildLeakHaystack(result).includes(authToken)) failures.push('auth token echoed in response body');\n}\n\nfunction checkNoStackLeak(result: TaskResult<unknown>, failures: string[]): void {\n const haystack = buildLeakHaystack(result);\n for (const sig of STACK_TRACE_SIGNATURES) {\n if (haystack.includes(sig)) {\n failures.push(`stack trace leak (matched ${JSON.stringify(sig)})`);\n return;\n }\n }\n for (const rx of STACK_TRACE_REGEXES) {\n if (rx.test(haystack)) {\n failures.push(`stack trace leak (matched ${rx.source})`);\n return;\n }\n }\n}\n\nfunction checkNoFilesystemLeak(result: TaskResult<unknown>, failures: string[]): void {\n const haystack = buildLeakHaystack(result);\n for (const sig of FS_PATH_SIGNATURES) {\n if (sig.test(haystack)) {\n failures.push(`filesystem path leak (matched ${sig.source})`);\n return;\n }\n }\n}\n\nfunction checkContextEchoed(\n tool: ConformanceToolName,\n request: unknown,\n result: TaskResult<unknown>,\n failures: string[],\n schemas?: ConformanceSchemaOptions\n): void {\n const reqContext = (request as { context?: unknown } | undefined)?.context;\n if (reqContext === undefined) return;\n const respContext = (result.data as { context?: unknown } | undefined)?.context;\n if (respContext === undefined) {\n // When the response schema declares a `context` property, a missing\n // echo IS a violation — the spec requires unchanged pass-through.\n // When the schema omits `context` (some discovery-only responses do),\n // silent tolerance stands.\n if (responseEchoesContext(tool, schemas)) {\n failures.push('request.context not echoed on response (schema declares context but response omitted it)');\n }\n return;\n }\n if (!deepEqual(reqContext, respContext)) {\n failures.push('request.context not echoed unchanged on response');\n }\n}\n\nfunction checkErrorEnvelope(result: TaskResult<unknown>, failures: string[]): void {\n if (!result.error || typeof result.error !== 'string' || result.error.length === 0) {\n failures.push('error envelope missing human-readable message');\n }\n const code = result.adcpError?.code;\n if (code === undefined) {\n failures.push('error envelope missing reason code');\n return;\n }\n if (typeof code !== 'string' || code.length === 0) {\n failures.push(`reason code is not a non-empty string: ${JSON.stringify(code)}`);\n return;\n }\n if (!/^[A-Z][A-Z0-9_]*$/.test(code)) {\n failures.push(`reason code \"${code}\" is not uppercase-snake format per spec`);\n }\n}\n\nfunction formatAjvError(e: { instancePath?: string; message?: string; keyword?: string }): string {\n const path = e.instancePath || '(root)';\n return `${path}: ${e.message ?? e.keyword ?? 'invalid'}`;\n}\n\nfunction safeStringify(value: unknown): string {\n try {\n return JSON.stringify(value) ?? '';\n } catch {\n return '';\n }\n}\n\n/**\n * Key-order-insensitive structural equality. JSON.stringify-based compare\n * produces false positives when an agent round-trips `context` through a\n * dict/map that doesn't preserve insertion order (Python, Go).\n */\nfunction deepEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (typeof a !== typeof b) return false;\n if (a === null || b === null) return a === b;\n if (typeof a !== 'object') return a === b;\n if (Array.isArray(a)) {\n if (!Array.isArray(b) || a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) if (!deepEqual(a[i], b[i])) return false;\n return true;\n }\n if (Array.isArray(b)) return false;\n const aKeys = Object.keys(a as object).sort();\n const bKeys = Object.keys(b as object).sort();\n if (aKeys.length !== bKeys.length) return false;\n for (let i = 0; i < aKeys.length; i++) if (aKeys[i] !== bKeys[i]) return false;\n for (const key of aKeys) {\n if (!deepEqual((a as Record<string, unknown>)[key], (b as Record<string, unknown>)[key])) return false;\n }\n return true;\n}\n"],"mappings":"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","names":[]}
@@ -1,9 +1,3 @@
1
- import { fileURLToPath as __adcpFileURLToPath } from 'node:url';
2
- import { dirname as __adcpDirname } from 'node:path';
3
- import { createRequire as __adcpCreateRequire } from 'node:module';
4
- const __filename = __adcpFileURLToPath(import.meta.url);
5
- const __dirname = __adcpDirname(__filename);
6
- const require = __adcpCreateRequire(import.meta.url);
7
1
  import { AgentClient } from "../core/AgentClient.mjs";
8
2
  import { DEFAULT_TOOLS, DEFAULT_TOOLS_WITH_UPDATES } from "./types.mjs";
9
3
  import { detectSchemaVersion, hasSchemas } from "./schemaLoader.mjs";
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/conformance/runConformance.ts"],"sourcesContent":["import { AgentClient } from '../core/AgentClient';\nimport type { AgentConfig } from '../types';\nimport type {\n ConformanceFailure,\n ConformanceFixtures,\n ConformanceReport,\n ConformanceToolName,\n ConformanceToolStats,\n RunConformanceOptions,\n} from './types';\nimport { DEFAULT_TOOLS, DEFAULT_TOOLS_WITH_UPDATES } from './types';\nimport { detectSchemaVersion, hasSchemas } from './schemaLoader';\nimport type { ConformanceSchemaOptions } from './schemaLoader';\nimport { runToolFuzz } from './runners';\nimport { seedFixtures, type SeedWarning } from './seeder';\nimport {\n runUniformErrorInvariant,\n toolsEligibleForUniformError,\n type UniformErrorReport,\n} from './invariants/uniformError';\n\nconst DEFAULT_MAX_FAILURES = 20;\nconst DEFAULT_MAX_FAILURE_PAYLOAD_BYTES = 8192;\nconst MIN_FAILURE_PAYLOAD_BYTES = 256;\n\n/**\n * Fuzz an AdCP agent against its published JSON schemas.\n *\n * Generates schema-valid requests for each tool, calls the agent, and\n * classifies each response under the two-path oracle: valid success\n * payloads pass; valid error envelopes with uppercase-snake reason codes\n * also pass. Invalid responses, stack-trace leaks, and reason-code\n * violations surface as failures with a shrunk reproduction seed.\n *\n * With `autoSeed: true`, the fuzzer first calls {@link seedFixtures} to\n * create a property list, a content-standards config, and a media buy,\n * then includes Tier-3 update tools in the run using the seeded IDs.\n */\nexport async function runConformance(\n agentUrl: string,\n options: RunConformanceOptions = {}\n): Promise<ConformanceReport> {\n const startedAt = new Date();\n const seed = options.seed ?? Math.floor(Math.random() * 0x7fffffff);\n const turnBudget = options.turnBudget ?? 50;\n const maxFailures = options.maxFailures ?? DEFAULT_MAX_FAILURES;\n const maxFailurePayloadBytes = Math.max(\n MIN_FAILURE_PAYLOAD_BYTES,\n options.maxFailurePayloadBytes ?? DEFAULT_MAX_FAILURE_PAYLOAD_BYTES\n );\n const schemaOptions = buildSchemaOptions(options);\n\n // Auto-seed BEFORE building the fuzzing client so the seeder's warnings\n // reach the report. Explicit caller fixtures win against any seeder\n // conflict — that's the contract `autoSeed` promises.\n let seededFixtures: ConformanceFixtures = {};\n let seedWarnings: SeedWarning[] = [];\n if (options.autoSeed) {\n const seedResult = await seedFixtures(agentUrl, {\n protocol: options.protocol,\n authToken: options.authToken,\n agentConfig: options.agentConfig,\n brand: options.seedBrand,\n });\n seededFixtures = seedResult.fixtures;\n seedWarnings = seedResult.warnings;\n }\n const mergedFixtures = mergeFixtures(seededFixtures, options.fixtures);\n\n // Include update tools when we have at least one seeded/supplied ID\n // they can target. Fuzzing update_* with only random IDs just exercises\n // REFERENCE_NOT_FOUND, which Phase-2 get_* tools already cover.\n const haveRealIds = hasUsableFixtures(mergedFixtures);\n const defaultTools = haveRealIds ? DEFAULT_TOOLS_WITH_UPDATES : DEFAULT_TOOLS;\n const tools = options.tools ?? defaultTools;\n\n const agent = buildAgentClient(agentUrl, options);\n\n const perTool: Record<string, ConformanceToolStats> = {};\n const failures: ConformanceFailure[] = [];\n let totalRuns = 0;\n let droppedFailures = 0;\n\n for (const [i, tool] of tools.entries()) {\n if (!hasSchemas(tool, schemaOptions)) {\n perTool[tool] = {\n runs: 0,\n accepted: 0,\n rejected: 0,\n failed: 0,\n skipped: true,\n skipReason: 'missing_schemas',\n };\n continue;\n }\n // Offset each tool's seed so they don't all explore the same corner\n // of generator space — still deterministic vs. the caller-provided seed.\n const toolSeed = seed + i * 1_000_003;\n const { stats, failures: toolFailures } = await runToolFuzz(tool, agent, {\n seed: toolSeed,\n numRuns: turnBudget,\n authToken: options.authToken,\n maxFailurePayloadBytes,\n fixtures: mergedFixtures,\n schemas: schemaOptions,\n });\n perTool[tool] = stats;\n totalRuns += stats.runs;\n for (const f of toolFailures) {\n if (failures.length >= maxFailures) {\n droppedFailures++;\n continue;\n }\n failures.push(f);\n }\n }\n\n // Uniform-error-response invariant (issue #731 / adcp spec\n // § error-handling). Runs AFTER the main fuzz loop so normal stats are\n // already collected; this is a discrete paired-probe pass per\n // T2-eligible tool and adds a bounded number of extra requests (two\n // per eligible tool). Runs regardless of fuzz outcomes — a broken\n // response envelope elsewhere shouldn't mask a cross-tenant leak.\n const uniformError: UniformErrorReport[] = [];\n const proberAgent = options.authTokenCrossTenant\n ? buildAgentClient(agentUrl, { ...options, authToken: options.authTokenCrossTenant })\n : agent;\n for (const tool of toolsEligibleForUniformError()) {\n if (options.tools && !options.tools.includes(tool)) continue;\n if (!hasSchemas(tool, schemaOptions)) continue;\n const report = await runUniformErrorInvariant(tool, {\n prober: proberAgent,\n fixtures: mergedFixtures,\n crossTenantConfigured: !!options.authTokenCrossTenant,\n maxBodyBytes: maxFailurePayloadBytes,\n });\n uniformError.push(report);\n }\n\n const completedAt = new Date();\n return {\n agentUrl,\n seed,\n schemaVersion: detectSchemaVersion(schemaOptions),\n ...(options.schemaRoot ? { schemaRoot: options.schemaRoot } : {}),\n protocol: options.protocol ?? options.agentConfig?.protocol ?? 'mcp',\n turnBudget,\n fixturesUsed: mergedFixtures,\n autoSeeded: !!options.autoSeed,\n seedWarnings,\n totalRuns,\n totalFailures: failures.length + droppedFailures,\n droppedFailures,\n perTool,\n failures,\n uniformError,\n startedAt: startedAt.toISOString(),\n completedAt: completedAt.toISOString(),\n durationMs: completedAt.getTime() - startedAt.getTime(),\n };\n}\n\n/**\n * Merge seeded fixtures with explicit caller-supplied ones. Explicit\n * pools fully replace the seeded pool for that key — they don't\n * concatenate — because callers with their own test tenants typically\n * want only their IDs, not the seeder's. Empty explicit pools fall\n * through to the seeded value rather than wiping it; callers building\n * fixtures from a dynamic source occasionally pass `[]` by accident.\n */\nfunction mergeFixtures(seeded: ConformanceFixtures, explicit: ConformanceFixtures | undefined): ConformanceFixtures {\n if (!explicit || Object.keys(explicit).length === 0) return seeded;\n const merged: ConformanceFixtures = { ...seeded };\n for (const [key, pool] of Object.entries(explicit)) {\n if (pool && pool.length > 0) {\n (merged as Record<string, readonly string[]>)[key] = pool;\n }\n }\n return merged;\n}\n\nfunction hasUsableFixtures(fixtures: ConformanceFixtures): boolean {\n return Object.values(fixtures).some(pool => Array.isArray(pool) && pool.length > 0);\n}\n\nfunction buildAgentClient(agentUrl: string, options: RunConformanceOptions): AgentClient {\n // Spread agentConfig FIRST so explicit keys below win. An earlier\n // version spread agentConfig last, which silently overrode\n // `auth_token` when a caller passed `agentConfig: { auth_token: ... }`\n // alongside `options.authToken`. For the cross-tenant prober that\n // meant the prober client could be built with tenant A's token\n // while the invariant reported mode: 'cross-tenant'.\n const config: AgentConfig = {\n ...options.agentConfig,\n id: options.agentConfig?.id ?? 'conformance-fuzzer',\n name: options.agentConfig?.name ?? 'AdCP Conformance Fuzzer',\n agent_uri: agentUrl,\n protocol: options.protocol ?? options.agentConfig?.protocol ?? 'mcp',\n auth_token: options.authToken ?? options.agentConfig?.auth_token,\n };\n return new AgentClient(config);\n}\n\nfunction buildSchemaOptions(options: RunConformanceOptions): ConformanceSchemaOptions | undefined {\n if (!options.version && !options.schemaRoot) return undefined;\n return {\n ...(options.version ? { version: options.version } : {}),\n ...(options.schemaRoot ? { schemaRoot: options.schemaRoot } : {}),\n };\n}\n\n// Re-export the tool-name type so consumers don't have to dual-import.\nexport type { ConformanceToolName };\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/lib/conformance/runConformance.ts"],"sourcesContent":["import { AgentClient } from '../core/AgentClient';\nimport type { AgentConfig } from '../types';\nimport type {\n ConformanceFailure,\n ConformanceFixtures,\n ConformanceReport,\n ConformanceToolName,\n ConformanceToolStats,\n RunConformanceOptions,\n} from './types';\nimport { DEFAULT_TOOLS, DEFAULT_TOOLS_WITH_UPDATES } from './types';\nimport { detectSchemaVersion, hasSchemas } from './schemaLoader';\nimport type { ConformanceSchemaOptions } from './schemaLoader';\nimport { runToolFuzz } from './runners';\nimport { seedFixtures, type SeedWarning } from './seeder';\nimport {\n runUniformErrorInvariant,\n toolsEligibleForUniformError,\n type UniformErrorReport,\n} from './invariants/uniformError';\n\nconst DEFAULT_MAX_FAILURES = 20;\nconst DEFAULT_MAX_FAILURE_PAYLOAD_BYTES = 8192;\nconst MIN_FAILURE_PAYLOAD_BYTES = 256;\n\n/**\n * Fuzz an AdCP agent against its published JSON schemas.\n *\n * Generates schema-valid requests for each tool, calls the agent, and\n * classifies each response under the two-path oracle: valid success\n * payloads pass; valid error envelopes with uppercase-snake reason codes\n * also pass. Invalid responses, stack-trace leaks, and reason-code\n * violations surface as failures with a shrunk reproduction seed.\n *\n * With `autoSeed: true`, the fuzzer first calls {@link seedFixtures} to\n * create a property list, a content-standards config, and a media buy,\n * then includes Tier-3 update tools in the run using the seeded IDs.\n */\nexport async function runConformance(\n agentUrl: string,\n options: RunConformanceOptions = {}\n): Promise<ConformanceReport> {\n const startedAt = new Date();\n const seed = options.seed ?? Math.floor(Math.random() * 0x7fffffff);\n const turnBudget = options.turnBudget ?? 50;\n const maxFailures = options.maxFailures ?? DEFAULT_MAX_FAILURES;\n const maxFailurePayloadBytes = Math.max(\n MIN_FAILURE_PAYLOAD_BYTES,\n options.maxFailurePayloadBytes ?? DEFAULT_MAX_FAILURE_PAYLOAD_BYTES\n );\n const schemaOptions = buildSchemaOptions(options);\n\n // Auto-seed BEFORE building the fuzzing client so the seeder's warnings\n // reach the report. Explicit caller fixtures win against any seeder\n // conflict — that's the contract `autoSeed` promises.\n let seededFixtures: ConformanceFixtures = {};\n let seedWarnings: SeedWarning[] = [];\n if (options.autoSeed) {\n const seedResult = await seedFixtures(agentUrl, {\n protocol: options.protocol,\n authToken: options.authToken,\n agentConfig: options.agentConfig,\n brand: options.seedBrand,\n });\n seededFixtures = seedResult.fixtures;\n seedWarnings = seedResult.warnings;\n }\n const mergedFixtures = mergeFixtures(seededFixtures, options.fixtures);\n\n // Include update tools when we have at least one seeded/supplied ID\n // they can target. Fuzzing update_* with only random IDs just exercises\n // REFERENCE_NOT_FOUND, which Phase-2 get_* tools already cover.\n const haveRealIds = hasUsableFixtures(mergedFixtures);\n const defaultTools = haveRealIds ? DEFAULT_TOOLS_WITH_UPDATES : DEFAULT_TOOLS;\n const tools = options.tools ?? defaultTools;\n\n const agent = buildAgentClient(agentUrl, options);\n\n const perTool: Record<string, ConformanceToolStats> = {};\n const failures: ConformanceFailure[] = [];\n let totalRuns = 0;\n let droppedFailures = 0;\n\n for (const [i, tool] of tools.entries()) {\n if (!hasSchemas(tool, schemaOptions)) {\n perTool[tool] = {\n runs: 0,\n accepted: 0,\n rejected: 0,\n failed: 0,\n skipped: true,\n skipReason: 'missing_schemas',\n };\n continue;\n }\n // Offset each tool's seed so they don't all explore the same corner\n // of generator space — still deterministic vs. the caller-provided seed.\n const toolSeed = seed + i * 1_000_003;\n const { stats, failures: toolFailures } = await runToolFuzz(tool, agent, {\n seed: toolSeed,\n numRuns: turnBudget,\n authToken: options.authToken,\n maxFailurePayloadBytes,\n fixtures: mergedFixtures,\n schemas: schemaOptions,\n });\n perTool[tool] = stats;\n totalRuns += stats.runs;\n for (const f of toolFailures) {\n if (failures.length >= maxFailures) {\n droppedFailures++;\n continue;\n }\n failures.push(f);\n }\n }\n\n // Uniform-error-response invariant (issue #731 / adcp spec\n // § error-handling). Runs AFTER the main fuzz loop so normal stats are\n // already collected; this is a discrete paired-probe pass per\n // T2-eligible tool and adds a bounded number of extra requests (two\n // per eligible tool). Runs regardless of fuzz outcomes — a broken\n // response envelope elsewhere shouldn't mask a cross-tenant leak.\n const uniformError: UniformErrorReport[] = [];\n const proberAgent = options.authTokenCrossTenant\n ? buildAgentClient(agentUrl, { ...options, authToken: options.authTokenCrossTenant })\n : agent;\n for (const tool of toolsEligibleForUniformError()) {\n if (options.tools && !options.tools.includes(tool)) continue;\n if (!hasSchemas(tool, schemaOptions)) continue;\n const report = await runUniformErrorInvariant(tool, {\n prober: proberAgent,\n fixtures: mergedFixtures,\n crossTenantConfigured: !!options.authTokenCrossTenant,\n maxBodyBytes: maxFailurePayloadBytes,\n });\n uniformError.push(report);\n }\n\n const completedAt = new Date();\n return {\n agentUrl,\n seed,\n schemaVersion: detectSchemaVersion(schemaOptions),\n ...(options.schemaRoot ? { schemaRoot: options.schemaRoot } : {}),\n protocol: options.protocol ?? options.agentConfig?.protocol ?? 'mcp',\n turnBudget,\n fixturesUsed: mergedFixtures,\n autoSeeded: !!options.autoSeed,\n seedWarnings,\n totalRuns,\n totalFailures: failures.length + droppedFailures,\n droppedFailures,\n perTool,\n failures,\n uniformError,\n startedAt: startedAt.toISOString(),\n completedAt: completedAt.toISOString(),\n durationMs: completedAt.getTime() - startedAt.getTime(),\n };\n}\n\n/**\n * Merge seeded fixtures with explicit caller-supplied ones. Explicit\n * pools fully replace the seeded pool for that key — they don't\n * concatenate — because callers with their own test tenants typically\n * want only their IDs, not the seeder's. Empty explicit pools fall\n * through to the seeded value rather than wiping it; callers building\n * fixtures from a dynamic source occasionally pass `[]` by accident.\n */\nfunction mergeFixtures(seeded: ConformanceFixtures, explicit: ConformanceFixtures | undefined): ConformanceFixtures {\n if (!explicit || Object.keys(explicit).length === 0) return seeded;\n const merged: ConformanceFixtures = { ...seeded };\n for (const [key, pool] of Object.entries(explicit)) {\n if (pool && pool.length > 0) {\n (merged as Record<string, readonly string[]>)[key] = pool;\n }\n }\n return merged;\n}\n\nfunction hasUsableFixtures(fixtures: ConformanceFixtures): boolean {\n return Object.values(fixtures).some(pool => Array.isArray(pool) && pool.length > 0);\n}\n\nfunction buildAgentClient(agentUrl: string, options: RunConformanceOptions): AgentClient {\n // Spread agentConfig FIRST so explicit keys below win. An earlier\n // version spread agentConfig last, which silently overrode\n // `auth_token` when a caller passed `agentConfig: { auth_token: ... }`\n // alongside `options.authToken`. For the cross-tenant prober that\n // meant the prober client could be built with tenant A's token\n // while the invariant reported mode: 'cross-tenant'.\n const config: AgentConfig = {\n ...options.agentConfig,\n id: options.agentConfig?.id ?? 'conformance-fuzzer',\n name: options.agentConfig?.name ?? 'AdCP Conformance Fuzzer',\n agent_uri: agentUrl,\n protocol: options.protocol ?? options.agentConfig?.protocol ?? 'mcp',\n auth_token: options.authToken ?? options.agentConfig?.auth_token,\n };\n return new AgentClient(config);\n}\n\nfunction buildSchemaOptions(options: RunConformanceOptions): ConformanceSchemaOptions | undefined {\n if (!options.version && !options.schemaRoot) return undefined;\n return {\n ...(options.version ? { version: options.version } : {}),\n ...(options.schemaRoot ? { schemaRoot: options.schemaRoot } : {}),\n };\n}\n\n// Re-export the tool-name type so consumers don't have to dual-import.\nexport type { ConformanceToolName };\n"],"mappings":"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","names":[]}
@@ -1,9 +1,3 @@
1
- import { fileURLToPath as __adcpFileURLToPath } from 'node:url';
2
- import { dirname as __adcpDirname } from 'node:path';
3
- import { createRequire as __adcpCreateRequire } from 'node:module';
4
- const __filename = __adcpFileURLToPath(import.meta.url);
5
- const __dirname = __adcpDirname(__filename);
6
- const require = __adcpCreateRequire(import.meta.url);
7
1
  import fc from "fast-check";
8
2
  import { schemaToArbitrary } from "./schemaArbitrary.mjs";
9
3
  import { ADCP_MAJOR_VERSION } from "../version.mjs";
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/conformance/runners.ts"],"sourcesContent":["import fc from 'fast-check';\nimport type { AgentClient } from '../core/AgentClient';\nimport type {\n ConformanceFailure,\n ConformanceFixtures,\n ConformanceToolName,\n ConformanceToolStats,\n SkipReason,\n} from './types';\nimport { schemaToArbitrary } from './schemaArbitrary';\nimport { ADCP_MAJOR_VERSION } from '../version';\nimport { loadRequestSchema, type ConformanceSchemaOptions } from './schemaLoader';\nimport { evaluate, prepareResponseValidator } from './oracle';\n\nexport interface RunnerOptions {\n seed: number;\n numRuns: number;\n authToken?: string;\n /** Cap per-failure serialized payload size (bytes). */\n maxFailurePayloadBytes: number;\n /** ID pools for Tier-2 fixture injection. See ConformanceFixtures. */\n fixtures?: ConformanceFixtures;\n /** Schema bundle override for same-PR / external conformance runs. */\n schemas?: ConformanceSchemaOptions;\n}\n\nexport interface RunnerResult {\n stats: ConformanceToolStats;\n failures: ConformanceFailure[];\n}\n\n/**\n * Fuzz a single tool against a connected agent. Uses fast-check's\n * `fc.check` for property generation + shrinking; a response that trips\n * the oracle is minimized to the smallest request that still reproduces\n * the failure before it's collected in the report.\n *\n * Returns the tool skipped when the agent declares it unsupported or when\n * the response schema can't be compiled — those aren't oracle failures,\n * they're environmental conditions.\n */\nexport async function runToolFuzz(\n tool: ConformanceToolName,\n agent: AgentClient,\n options: RunnerOptions\n): Promise<RunnerResult> {\n // Compile the response schema up front. Ajv sometimes fails on bundled\n // schemas that still carry unresolved `$defs` refs (known upstream gap) —\n // skip the tool cleanly rather than flag every run as invalid.\n try {\n prepareResponseValidator(tool, options.schemas);\n } catch (err) {\n return {\n stats: skipStats('unresolvable_schema', (err as Error)?.message),\n failures: [],\n };\n }\n\n const schema = loadRequestSchema(tool, options.schemas);\n const arb = schemaToArbitrary(schema, { fixtures: options.fixtures }) as fc.Arbitrary<Record<string, unknown>>;\n\n // Counts only increment on fresh samples. `fc.check` re-runs the property\n // during shrinking; we don't want those replays in the accepted/rejected\n // tally. Track the minimum sample count we've seen and skip stat updates\n // on replayed samples by hashing the sample.\n const seenSamples = new Set<string>();\n const stats: ConformanceToolStats = { runs: 0, accepted: 0, rejected: 0, failed: 0, skipped: false };\n let transportUnsupported: string | null = null;\n\n const property = fc.asyncProperty(arb, async request => {\n const sampleKey = safeHash(request);\n const isFreshSample = !seenSamples.has(sampleKey);\n if (isFreshSample) {\n seenSamples.add(sampleKey);\n stats.runs++;\n }\n\n // Pin transport-envelope fields the buyer SDK manages itself.\n // `applyVersionEnvelope` (PR #1073) auto-fills these on outbound\n // requests, but the schema-driven arbitrary may overwrite them with\n // out-of-window integers (1-99 per schema bounds). `createAdcpServer`'s\n // single-field VERSION_UNSUPPORTED check (#1075) would then reject\n // every probe before the handler runs, masking handler bugs the\n // fuzzer is meant to catch. Version negotiation is exercised\n // separately by storyboards (`error_compliance/unsupported_major_version`).\n const probeRequest =\n 'adcp_major_version' in request || 'adcp_version' in request\n ? { ...request, adcp_major_version: ADCP_MAJOR_VERSION }\n : request;\n\n let result;\n try {\n result = await agent.executeTask(tool, probeRequest);\n } catch (err) {\n const message = (err as Error)?.message ?? String(err);\n // SDK throws FeatureUnsupportedError when the agent's declared\n // capabilities don't list the tool. That's the agent saying \"not\n // my job\" — not a conformance failure.\n if ((err as Error)?.name === 'FeatureUnsupportedError' || /does not support/i.test(message)) {\n transportUnsupported = message;\n return; // pass — we'll convert the whole tool to skipped below\n }\n throw new InvariantViolation({ thrown: String(err), name: (err as Error)?.name, message }, [\n 'unhandled transport error: ' + message,\n ]);\n }\n\n const verdict = evaluate({ tool, request, result, authToken: options.authToken, schemas: options.schemas });\n if (isFreshSample) {\n if (verdict.verdict === 'accepted') stats.accepted++;\n else if (verdict.verdict === 'rejected') stats.rejected++;\n }\n\n if (verdict.verdict === 'invalid') {\n throw new InvariantViolation(result, verdict.invariantFailures);\n }\n });\n\n const details = await fc.check(property, {\n seed: options.seed,\n numRuns: options.numRuns,\n verbose: 0,\n });\n\n if (transportUnsupported) {\n return { stats: skipStats('feature_unsupported', transportUnsupported), failures: [] };\n }\n\n if (!details.failed) {\n return { stats, failures: [] };\n }\n\n stats.failed = 1;\n const shrunkInput = (details.counterexample as [Record<string, unknown>] | null)?.[0];\n const err = details.errorInstance;\n const invariantFailures =\n err instanceof InvariantViolation\n ? err.invariantFailures\n : ['fuzz assertion failed: ' + ((err as Error | undefined)?.message ?? 'unknown')];\n const response = err instanceof InvariantViolation ? err.response : undefined;\n\n return {\n stats,\n failures: [\n {\n tool,\n path: details.counterexamplePath ?? undefined,\n seed: options.seed,\n shrunk: (details.numShrinks ?? 0) > 0,\n input: truncateForReport(shrunkInput, options.maxFailurePayloadBytes),\n response: truncateForReport(response, options.maxFailurePayloadBytes),\n verdict: 'invalid',\n invariantFailures,\n },\n ],\n };\n}\n\nfunction skipStats(reason: SkipReason, detail?: string): ConformanceToolStats {\n return {\n runs: 0,\n accepted: 0,\n rejected: 0,\n failed: 0,\n skipped: true,\n skipReason: reason,\n ...(detail ? { _detail: detail } : {}),\n } as ConformanceToolStats;\n}\n\nfunction safeHash(value: unknown): string {\n try {\n return JSON.stringify(value) ?? '';\n } catch {\n return String(value);\n }\n}\n\nfunction truncateForReport(value: unknown, maxBytes: number): unknown {\n if (value === undefined || value === null) return value;\n let serialized: string;\n try {\n serialized = JSON.stringify(value) ?? '';\n } catch {\n return { _truncated: true, _reason: 'unserializable' };\n }\n if (serialized.length <= maxBytes) return value;\n return {\n _truncated: true,\n _originalBytes: serialized.length,\n preview: serialized.slice(0, Math.max(256, maxBytes - 64)),\n };\n}\n\nclass InvariantViolation extends Error {\n constructor(\n public readonly response: unknown,\n public readonly invariantFailures: string[]\n ) {\n super(invariantFailures.join('; '));\n this.name = 'InvariantViolation';\n }\n}\n"],"mappings":"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","names":["err"]}
1
+ {"version":3,"sources":["../../../src/lib/conformance/runners.ts"],"sourcesContent":["import fc from 'fast-check';\nimport type { AgentClient } from '../core/AgentClient';\nimport type {\n ConformanceFailure,\n ConformanceFixtures,\n ConformanceToolName,\n ConformanceToolStats,\n SkipReason,\n} from './types';\nimport { schemaToArbitrary } from './schemaArbitrary';\nimport { ADCP_MAJOR_VERSION } from '../version';\nimport { loadRequestSchema, type ConformanceSchemaOptions } from './schemaLoader';\nimport { evaluate, prepareResponseValidator } from './oracle';\n\nexport interface RunnerOptions {\n seed: number;\n numRuns: number;\n authToken?: string;\n /** Cap per-failure serialized payload size (bytes). */\n maxFailurePayloadBytes: number;\n /** ID pools for Tier-2 fixture injection. See ConformanceFixtures. */\n fixtures?: ConformanceFixtures;\n /** Schema bundle override for same-PR / external conformance runs. */\n schemas?: ConformanceSchemaOptions;\n}\n\nexport interface RunnerResult {\n stats: ConformanceToolStats;\n failures: ConformanceFailure[];\n}\n\n/**\n * Fuzz a single tool against a connected agent. Uses fast-check's\n * `fc.check` for property generation + shrinking; a response that trips\n * the oracle is minimized to the smallest request that still reproduces\n * the failure before it's collected in the report.\n *\n * Returns the tool skipped when the agent declares it unsupported or when\n * the response schema can't be compiled — those aren't oracle failures,\n * they're environmental conditions.\n */\nexport async function runToolFuzz(\n tool: ConformanceToolName,\n agent: AgentClient,\n options: RunnerOptions\n): Promise<RunnerResult> {\n // Compile the response schema up front. Ajv sometimes fails on bundled\n // schemas that still carry unresolved `$defs` refs (known upstream gap) —\n // skip the tool cleanly rather than flag every run as invalid.\n try {\n prepareResponseValidator(tool, options.schemas);\n } catch (err) {\n return {\n stats: skipStats('unresolvable_schema', (err as Error)?.message),\n failures: [],\n };\n }\n\n const schema = loadRequestSchema(tool, options.schemas);\n const arb = schemaToArbitrary(schema, { fixtures: options.fixtures }) as fc.Arbitrary<Record<string, unknown>>;\n\n // Counts only increment on fresh samples. `fc.check` re-runs the property\n // during shrinking; we don't want those replays in the accepted/rejected\n // tally. Track the minimum sample count we've seen and skip stat updates\n // on replayed samples by hashing the sample.\n const seenSamples = new Set<string>();\n const stats: ConformanceToolStats = { runs: 0, accepted: 0, rejected: 0, failed: 0, skipped: false };\n let transportUnsupported: string | null = null;\n\n const property = fc.asyncProperty(arb, async request => {\n const sampleKey = safeHash(request);\n const isFreshSample = !seenSamples.has(sampleKey);\n if (isFreshSample) {\n seenSamples.add(sampleKey);\n stats.runs++;\n }\n\n // Pin transport-envelope fields the buyer SDK manages itself.\n // `applyVersionEnvelope` (PR #1073) auto-fills these on outbound\n // requests, but the schema-driven arbitrary may overwrite them with\n // out-of-window integers (1-99 per schema bounds). `createAdcpServer`'s\n // single-field VERSION_UNSUPPORTED check (#1075) would then reject\n // every probe before the handler runs, masking handler bugs the\n // fuzzer is meant to catch. Version negotiation is exercised\n // separately by storyboards (`error_compliance/unsupported_major_version`).\n const probeRequest =\n 'adcp_major_version' in request || 'adcp_version' in request\n ? { ...request, adcp_major_version: ADCP_MAJOR_VERSION }\n : request;\n\n let result;\n try {\n result = await agent.executeTask(tool, probeRequest);\n } catch (err) {\n const message = (err as Error)?.message ?? String(err);\n // SDK throws FeatureUnsupportedError when the agent's declared\n // capabilities don't list the tool. That's the agent saying \"not\n // my job\" — not a conformance failure.\n if ((err as Error)?.name === 'FeatureUnsupportedError' || /does not support/i.test(message)) {\n transportUnsupported = message;\n return; // pass — we'll convert the whole tool to skipped below\n }\n throw new InvariantViolation({ thrown: String(err), name: (err as Error)?.name, message }, [\n 'unhandled transport error: ' + message,\n ]);\n }\n\n const verdict = evaluate({ tool, request, result, authToken: options.authToken, schemas: options.schemas });\n if (isFreshSample) {\n if (verdict.verdict === 'accepted') stats.accepted++;\n else if (verdict.verdict === 'rejected') stats.rejected++;\n }\n\n if (verdict.verdict === 'invalid') {\n throw new InvariantViolation(result, verdict.invariantFailures);\n }\n });\n\n const details = await fc.check(property, {\n seed: options.seed,\n numRuns: options.numRuns,\n verbose: 0,\n });\n\n if (transportUnsupported) {\n return { stats: skipStats('feature_unsupported', transportUnsupported), failures: [] };\n }\n\n if (!details.failed) {\n return { stats, failures: [] };\n }\n\n stats.failed = 1;\n const shrunkInput = (details.counterexample as [Record<string, unknown>] | null)?.[0];\n const err = details.errorInstance;\n const invariantFailures =\n err instanceof InvariantViolation\n ? err.invariantFailures\n : ['fuzz assertion failed: ' + ((err as Error | undefined)?.message ?? 'unknown')];\n const response = err instanceof InvariantViolation ? err.response : undefined;\n\n return {\n stats,\n failures: [\n {\n tool,\n path: details.counterexamplePath ?? undefined,\n seed: options.seed,\n shrunk: (details.numShrinks ?? 0) > 0,\n input: truncateForReport(shrunkInput, options.maxFailurePayloadBytes),\n response: truncateForReport(response, options.maxFailurePayloadBytes),\n verdict: 'invalid',\n invariantFailures,\n },\n ],\n };\n}\n\nfunction skipStats(reason: SkipReason, detail?: string): ConformanceToolStats {\n return {\n runs: 0,\n accepted: 0,\n rejected: 0,\n failed: 0,\n skipped: true,\n skipReason: reason,\n ...(detail ? { _detail: detail } : {}),\n } as ConformanceToolStats;\n}\n\nfunction safeHash(value: unknown): string {\n try {\n return JSON.stringify(value) ?? '';\n } catch {\n return String(value);\n }\n}\n\nfunction truncateForReport(value: unknown, maxBytes: number): unknown {\n if (value === undefined || value === null) return value;\n let serialized: string;\n try {\n serialized = JSON.stringify(value) ?? '';\n } catch {\n return { _truncated: true, _reason: 'unserializable' };\n }\n if (serialized.length <= maxBytes) return value;\n return {\n _truncated: true,\n _originalBytes: serialized.length,\n preview: serialized.slice(0, Math.max(256, maxBytes - 64)),\n };\n}\n\nclass InvariantViolation extends Error {\n constructor(\n public readonly response: unknown,\n public readonly invariantFailures: string[]\n ) {\n super(invariantFailures.join('; '));\n this.name = 'InvariantViolation';\n }\n}\n"],"mappings":"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","names":["err"]}
@@ -1,9 +1,3 @@
1
- import { fileURLToPath as __adcpFileURLToPath } from 'node:url';
2
- import { dirname as __adcpDirname } from 'node:path';
3
- import { createRequire as __adcpCreateRequire } from 'node:module';
4
- const __filename = __adcpFileURLToPath(import.meta.url);
5
- const __dirname = __adcpDirname(__filename);
6
- const require = __adcpCreateRequire(import.meta.url);
7
1
  import fc from "fast-check";
8
2
  function resolveLocalRef(root, ref) {
9
3
  if (!root || !ref.startsWith("#/")) return void 0;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/conformance/schemaArbitrary.ts"],"sourcesContent":["import fc from 'fast-check';\nimport type { ConformanceFixtures } from './types';\n\ntype JsonSchema = Record<string, unknown> & { type?: string | string[] };\n\nexport interface ArbitraryOptions {\n /**\n * ID pools. When a property name matches (e.g. `creative_id`,\n * `creative_ids`), the generator draws from the pool instead of\n * producing random strings. See {@link resolvePoolForKey}.\n */\n fixtures?: ConformanceFixtures;\n /**\n * Root schema used to resolve `$ref` pointers like `#/$defs/Name` or\n * `#/definitions/Name`. Set once at the top of `schemaToArbitrary` and\n * threaded through recursive calls. AdCP 3.0.1 introduced bundler-side\n * enum hoisting (adcp#3170) that emits these pointers; without root\n * resolution, the generator falls through to `fc.anything()` and produces\n * samples that fail validation.\n */\n rootSchema?: JsonSchema;\n /**\n * Set of `$ref` pointers already in the resolution chain. Cycle guard —\n * AdCP's bundled schemas don't ship self-referential defs today, but a\n * future schema that did would otherwise stack-overflow this generator.\n * On revisit, the generator returns `fc.anything()` rather than recursing.\n */\n seenRefs?: Set<string>;\n}\n\n/** Resolve a `#/`-prefixed JSON pointer against the root schema. */\nfunction resolveLocalRef(root: JsonSchema | undefined, ref: string): JsonSchema | undefined {\n if (!root || !ref.startsWith('#/')) return undefined;\n const segments = ref\n .slice(2)\n .split('/')\n .map(s => s.replace(/~1/g, '/').replace(/~0/g, '~'));\n let node: unknown = root;\n for (const seg of segments) {\n if (!node || typeof node !== 'object') return undefined;\n node = (node as Record<string, unknown>)[seg];\n }\n return node && typeof node === 'object' ? (node as JsonSchema) : undefined;\n}\n\n/**\n * Converts a draft-07 JSON Schema into a fast-check arbitrary that\n * produces schema-valid values. Covers the subset of JSON Schema used\n * by AdCP bundled request schemas. Unsupported constructs fall through\n * to a permissive arbitrary rather than throwing, so the fuzzer keeps\n * running on the remainder of the schema.\n */\nexport function schemaToArbitrary(schema: JsonSchema, opts: ArbitraryOptions = {}): fc.Arbitrary<unknown> {\n if (!schema || typeof schema !== 'object') return fc.anything();\n\n // Pin the root on the first call so $ref resolution always finds the\n // bundler's `$defs` / `definitions` block. Recursive calls re-use the\n // same root rather than re-pinning to a sub-schema.\n const rootSchema = opts.rootSchema ?? schema;\n const optsWithRoot: ArbitraryOptions = opts.rootSchema ? opts : { ...opts, rootSchema };\n\n if (typeof schema.$ref === 'string') {\n const ref = schema.$ref;\n const seenRefs = optsWithRoot.seenRefs ?? new Set<string>();\n if (seenRefs.has(ref)) return fc.anything();\n const resolved = resolveLocalRef(rootSchema, ref);\n if (resolved) {\n const nextSeen = new Set(seenRefs);\n nextSeen.add(ref);\n return schemaToArbitrary(resolved, { ...optsWithRoot, seenRefs: nextSeen });\n }\n return fc.anything();\n }\n\n if ('const' in schema) return fc.constant(schema.const);\n if (Array.isArray(schema.enum)) return fc.constantFrom(...(schema.enum as unknown[]));\n\n // Composite-shape oneOf: the whole value is one of the branches.\n // Only replaces the dispatch when the outer schema has no standalone\n // `properties` — otherwise oneOf is a side-constraint we generate past.\n if (Array.isArray(schema.oneOf) && !hasOwnProperties(schema)) {\n return fc.oneof(...schema.oneOf.map(s => schemaToArbitrary(s as JsonSchema, optsWithRoot)));\n }\n if (Array.isArray(schema.anyOf) && !hasOwnProperties(schema)) {\n return fc.oneof(...schema.anyOf.map(s => schemaToArbitrary(s as JsonSchema, optsWithRoot)));\n }\n // `allOf` is usually conditional (if/then/else) in AdCP schemas; the base\n // shape on the outer schema is the right generator. Ignoring the `if`\n // occasionally produces a sample that violates the conditional — an\n // acceptable cost for not hand-rolling if/then semantics.\n\n const type = normalizeType(schema);\n switch (type) {\n case 'string':\n return stringArb(schema);\n case 'integer':\n return integerArb(schema);\n case 'number':\n return numberArb(schema);\n case 'boolean':\n return fc.boolean();\n case 'null':\n return fc.constant(null);\n case 'array':\n return arrayArb(schema, optsWithRoot);\n case 'object':\n return objectArb(schema, optsWithRoot);\n default:\n return fc.anything();\n }\n}\n\n// Years 2020-2040 — well inside Ajv's date-time format validator. Fast-check's\n// default `fc.date()` produces ISO strings outside the RFC-3339 range (e.g.,\n// `+041510-07-24T...`) that the format validator rejects.\nconst DATE_MIN = new Date('2020-01-01T00:00:00Z');\nconst DATE_MAX = new Date('2040-12-31T23:59:59Z');\nfunction boundedDate(): fc.Arbitrary<Date> {\n return fc.date({ min: DATE_MIN, max: DATE_MAX, noInvalidDate: true });\n}\n\nfunction hasOwnProperties(schema: JsonSchema): boolean {\n return !!schema.properties && Object.keys(schema.properties).length > 0;\n}\n\nfunction normalizeType(schema: JsonSchema): string {\n if (typeof schema.type === 'string') return schema.type;\n if (Array.isArray(schema.type) && typeof schema.type[0] === 'string') return schema.type[0];\n if (schema.properties || schema.required || schema.additionalProperties !== undefined) return 'object';\n if (schema.items) return 'array';\n return 'unknown';\n}\n\nfunction stringArb(schema: JsonSchema): fc.Arbitrary<string> {\n const pattern = schema.pattern as string | undefined;\n const format = schema.format as string | undefined;\n const minLength = (schema.minLength as number | undefined) ?? 0;\n const maxLength = (schema.maxLength as number | undefined) ?? 32;\n\n // format:uri often co-occurs with pattern `^https://`. Let format take\n // precedence (and narrow schemes when the pattern hints at it) so we\n // produce genuine RFC-3986 URIs rather than pattern-shaped noise that\n // Ajv's format validator rejects.\n if (format === 'uri' || format === 'uri-reference') {\n const httpsOnly = pattern === '^https://' || pattern === '^https:' || pattern === '^https:\\\\/\\\\/';\n return fc.webUrl({ validSchemes: httpsOnly ? ['https'] : ['http', 'https'] });\n }\n if (format === 'email') return fc.emailAddress();\n if (format === 'uuid') return fc.uuid();\n if (format === 'date-time') return boundedDate().map(d => d.toISOString());\n if (format === 'date') return boundedDate().map(d => d.toISOString().slice(0, 10));\n\n if (pattern) {\n try {\n return fc.stringMatching(new RegExp(pattern));\n } catch {\n /* fallthrough */\n }\n }\n return fc.string({ minLength: Math.max(1, minLength), maxLength });\n}\n\nfunction integerArb(schema: JsonSchema): fc.Arbitrary<number> {\n const min = (schema.minimum as number | undefined) ?? -1000;\n const max = (schema.maximum as number | undefined) ?? 1000;\n return fc.integer({ min: Math.ceil(min), max: Math.floor(max) });\n}\n\nfunction numberArb(schema: JsonSchema): fc.Arbitrary<number> {\n const min = (schema.minimum as number | undefined) ?? -1000;\n const max = (schema.maximum as number | undefined) ?? 1000;\n return fc.double({ min, max, noNaN: true, noDefaultInfinity: true });\n}\n\nfunction arrayArb(schema: JsonSchema, opts: ArbitraryOptions): fc.Arbitrary<unknown[]> {\n const items = (schema.items as JsonSchema | undefined) ?? {};\n const minItems = (schema.minItems as number | undefined) ?? 0;\n const maxItems = (schema.maxItems as number | undefined) ?? Math.max(minItems, 3);\n const unique = schema.uniqueItems === true;\n if (unique) {\n return fc.uniqueArray(schemaToArbitrary(items, opts), {\n minLength: minItems,\n maxLength: maxItems,\n selector: x => JSON.stringify(x),\n });\n }\n return fc.array(schemaToArbitrary(items, opts), { minLength: minItems, maxLength: maxItems });\n}\n\ninterface ObjectShape {\n properties: Record<string, JsonSchema>;\n required: Set<string>;\n additionalProperties: boolean | JsonSchema;\n hasPatternProperties: boolean;\n}\n\nfunction objectArb(schema: JsonSchema, opts: ArbitraryOptions): fc.Arbitrary<Record<string, unknown>> {\n const shape = readObjectShape(schema);\n const anyOfRequired = collectAnyOfRequired(schema);\n const oneOfBranches = collectExclusiveOneOfBranches(schema);\n const propertySpec = buildPropertyRecordSpec(shape, opts);\n const declared = new Set(Object.keys(propertySpec));\n const baseRequired = Array.from(shape.required).filter(k => declared.has(k));\n const dependencies = readDependencies(schema, declared);\n\n const base =\n oneOfBranches.length > 0\n ? fc.nat(oneOfBranches.length - 1).chain(idx => {\n const branch = oneOfBranches[idx]!;\n const forbidden = new Set(branch.forbidden);\n const branchSpec = Object.fromEntries(Object.entries(propertySpec).filter(([key]) => !forbidden.has(key)));\n const requiredKeys = Array.from(new Set([...baseRequired, ...branch.required.filter(k => k in branchSpec)]));\n return fc.record(branchSpec, { requiredKeys });\n })\n : anyOfRequired.length === 0\n ? fc.record(propertySpec, { requiredKeys: baseRequired })\n : fc.nat(anyOfRequired.length - 1).chain(idx => {\n const branch = anyOfRequired[idx]!;\n const requiredKeys = Array.from(new Set([...baseRequired, ...branch.filter(k => declared.has(k))]));\n return fc.record(propertySpec, { requiredKeys });\n });\n\n let withDeps = base;\n if (dependencies.length > 0) withDeps = base.map(value => enforceDependencies(value, dependencies));\n withDeps = withDeps.map(value => enforceKnownConditionals(enforceSimpleConditionals(value, schema), shape));\n\n // Unknown-property probe: when the schema allows additional properties,\n // sometimes inject one. Exercises the \"unknown-field tolerance\"\n // surface — a common crash source where agents deserialize into a\n // strict struct and reject keys they weren't expecting. Kept at ~15%\n // frequency and capped at one extra key so overall sample validity\n // stays high; the oracle's two-path design absorbs the rest.\n if (shape.additionalProperties !== true || shape.hasPatternProperties) return withDeps;\n return withDeps.chain(value => injectExtraProperty(value, declared));\n}\n\nfunction enforceKnownConditionals(value: Record<string, unknown>, shape: ObjectShape): Record<string, unknown> {\n let current = value;\n\n if (declares(shape, 'discovery_mode')) {\n current = enforceSignalsDiscoveryMode(current);\n }\n\n if (declares(shape, 'format_id') && declares(shape, 'format_kind')) {\n current = enforceCreativeManifestFormatSelector(current);\n }\n\n if (declares(shape, 'scope') && declares(shape, 'format_option_id') && declares(shape, 'publisher_domain')) {\n current = enforceFormatOptionRef(current);\n }\n\n return current;\n}\n\nfunction declares(shape: ObjectShape, key: string): boolean {\n return Object.prototype.hasOwnProperty.call(shape.properties, key);\n}\n\nfunction enforceSignalsDiscoveryMode(value: Record<string, unknown>): Record<string, unknown> {\n const hasWholesaleVersion = 'if_wholesale_feed_version' in value || 'if_pricing_version' in value;\n const current = { ...value };\n\n if (hasWholesaleVersion) {\n current.discovery_mode = 'wholesale';\n }\n\n if (current.discovery_mode === 'wholesale') {\n delete current.signal_spec;\n delete current.signal_ids;\n return current;\n }\n\n if (!('signal_spec' in current) && !('signal_ids' in current)) {\n current.signal_spec = 'conformance probe';\n }\n\n return current;\n}\n\nfunction enforceCreativeManifestFormatSelector(value: Record<string, unknown>): Record<string, unknown> {\n const current = { ...value };\n\n if ('format_id' in current && 'format_kind' in current) {\n delete current.format_kind;\n } else if (!('format_id' in current) && !('format_kind' in current)) {\n current.format_kind = 'image';\n }\n\n return current;\n}\n\nfunction enforceFormatOptionRef(value: Record<string, unknown>): Record<string, unknown> {\n const current = { ...value };\n\n if (current.scope === 'product') {\n delete current.publisher_domain;\n return current;\n }\n\n if (current.scope === 'publisher') {\n if (typeof current.publisher_domain !== 'string' || !DOMAIN_RE.test(current.publisher_domain)) {\n current.publisher_domain = 'example.com';\n }\n }\n\n return current;\n}\n\nconst DOMAIN_RE = /^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$/;\n\n/**\n * Probabilistically adds a single unknown key to `value`. The key name\n * is drawn from a fixed vocabulary that deliberately avoids collisions\n * with well-known AdCP property names, and the value is a minimal\n * primitive. Most samples pass through unchanged.\n */\nfunction injectExtraProperty(\n value: Record<string, unknown>,\n declared: Set<string>\n): fc.Arbitrary<Record<string, unknown>> {\n const candidates = EXTRA_PROPERTY_NAMES.filter(k => !(k in value) && !declared.has(k));\n if (candidates.length === 0) return fc.constant(value);\n // 85% pass-through, 15% injection. `fc.nat({max: 19})` gives a 0-19\n // roll; values 0-2 (~15%) trigger injection.\n return fc.nat({ max: 19 }).chain(roll => {\n if (roll > 2) return fc.constant(value);\n return fc.tuple(fc.constantFrom(...candidates), EXTRA_VALUE_ARB).map(([key, v]) => ({ ...value, [key]: v }));\n });\n}\n\nconst EXTRA_PROPERTY_NAMES: readonly string[] = [\n 'x_conformance_probe',\n '_debug_trace',\n 'probe_key',\n 'unknown_field',\n 'test_vendor_ext',\n];\nconst EXTRA_VALUE_ARB: fc.Arbitrary<unknown> = fc.oneof(\n fc.string({ minLength: 1, maxLength: 16 }),\n fc.integer({ min: 0, max: 999 }),\n fc.boolean()\n);\n\nfunction readDependencies(schema: JsonSchema, declared: Set<string>): Array<[string, string[]]> {\n const raw = schema.dependencies;\n if (!raw || typeof raw !== 'object') return [];\n const out: Array<[string, string[]]> = [];\n for (const [key, deps] of Object.entries(raw as Record<string, unknown>)) {\n if (Array.isArray(deps) && declared.has(key)) {\n out.push([key, deps.filter(d => typeof d === 'string' && declared.has(d as string)) as string[]]);\n }\n }\n return out;\n}\n\nfunction enforceDependencies(\n value: Record<string, unknown>,\n dependencies: Array<[string, string[]]>\n): Record<string, unknown> {\n let current = value;\n for (const [key, deps] of dependencies) {\n if (!(key in current)) continue;\n const missing = deps.filter(d => !(d in current));\n if (missing.length === 0) continue;\n // Drop the trigger key rather than fabricate values — keeping the sample\n // schema-valid costs us that property but preserves determinism.\n const { [key]: _dropped, ...rest } = current;\n void _dropped;\n current = rest;\n }\n return current;\n}\n\nfunction readObjectShape(schema: JsonSchema): ObjectShape {\n const properties = ((schema.properties as Record<string, JsonSchema>) ?? {}) as Record<string, JsonSchema>;\n const required = new Set<string>(Array.isArray(schema.required) ? (schema.required as string[]) : []);\n const additionalProperties =\n typeof schema.additionalProperties === 'boolean'\n ? schema.additionalProperties\n : ((schema.additionalProperties as JsonSchema | undefined) ?? true);\n return { properties, required, additionalProperties, hasPatternProperties: !!schema.patternProperties };\n}\n\nfunction collectAnyOfRequired(schema: JsonSchema): string[][] {\n if (!Array.isArray(schema.anyOf)) return [];\n const out: string[][] = [];\n for (const branch of schema.anyOf as JsonSchema[]) {\n if (branch && Array.isArray(branch.required) && Object.keys(branch).every(k => k === 'required' || k === 'type')) {\n out.push(branch.required as string[]);\n }\n }\n return out;\n}\n\ninterface ExclusiveBranch {\n required: string[];\n forbidden: string[];\n}\n\nfunction collectExclusiveOneOfBranches(schema: JsonSchema): ExclusiveBranch[] {\n if (!Array.isArray(schema.oneOf)) return [];\n const branches: ExclusiveBranch[] = [];\n for (const branch of schema.oneOf as JsonSchema[]) {\n if (!branch || typeof branch !== 'object') return [];\n if (!Array.isArray(branch.required) || branch.required.length === 0) return [];\n const not = branch.not as JsonSchema | undefined;\n if (!not || !Array.isArray(not.required)) return [];\n const allowedKeys = new Set(['title', 'description', 'required', 'not']);\n if (Object.keys(branch).some(k => !allowedKeys.has(k))) return [];\n if (Object.keys(not).some(k => k !== 'required')) return [];\n branches.push({ required: branch.required as string[], forbidden: not.required as string[] });\n }\n return branches;\n}\n\nfunction enforceSimpleConditionals(value: Record<string, unknown>, schema: JsonSchema): Record<string, unknown> {\n let current = { ...value };\n for (const entry of (schema.allOf as JsonSchema[] | undefined) ?? []) {\n current = enforceRequiredTriggerConst(current, entry);\n }\n current = enforceConstThenForbidden(current, schema);\n return current;\n}\n\nfunction enforceRequiredTriggerConst(value: Record<string, unknown>, schema: JsonSchema): Record<string, unknown> {\n const anyOf = (schema.if as JsonSchema | undefined)?.anyOf as JsonSchema[] | undefined;\n const thenProps = (schema.then as JsonSchema | undefined)?.properties as Record<string, JsonSchema> | undefined;\n if (!Array.isArray(anyOf) || !thenProps) return value;\n const triggered = anyOf.some(branch => {\n const required = branch?.required;\n return Array.isArray(required) && required.some(name => typeof name === 'string' && name in value);\n });\n if (!triggered) return value;\n\n let current = value;\n for (const [key, prop] of Object.entries(thenProps)) {\n if (prop && typeof prop === 'object' && 'const' in prop) {\n current = { ...current, [key]: prop.const };\n }\n }\n return current;\n}\n\nfunction enforceConstThenForbidden(value: Record<string, unknown>, schema: JsonSchema): Record<string, unknown> {\n const ifSchema = schema.if as JsonSchema | undefined;\n const thenSchema = schema.then as JsonSchema | undefined;\n const ifProps = ifSchema?.properties as Record<string, JsonSchema> | undefined;\n const thenNot = thenSchema?.not as JsonSchema | undefined;\n const thenAnyOf = thenNot?.anyOf as JsonSchema[] | undefined;\n if (!ifProps || !Array.isArray(thenAnyOf)) return value;\n\n const matches = Object.entries(ifProps).every(([key, prop]) => {\n return prop && typeof prop === 'object' && 'const' in prop && value[key] === prop.const;\n });\n if (!matches) return value;\n\n const forbidden = new Set<string>();\n for (const branch of thenAnyOf) {\n if (Array.isArray(branch?.required)) {\n for (const key of branch.required) {\n if (typeof key === 'string') forbidden.add(key);\n }\n }\n }\n if (forbidden.size === 0) return value;\n\n const next = { ...value };\n for (const key of forbidden) delete next[key];\n return next;\n}\n\nfunction buildPropertyRecordSpec(shape: ObjectShape, opts: ArbitraryOptions): Record<string, fc.Arbitrary<unknown>> {\n const spec: Record<string, fc.Arbitrary<unknown>> = {};\n for (const [key, subSchema] of Object.entries(shape.properties)) {\n const fixtureArb = fixtureArbitraryForProperty(key, subSchema, opts.fixtures);\n spec[key] = fixtureArb ?? schemaToArbitrary(subSchema, opts);\n }\n // Honor additionalProperties: false by not emitting keys outside the declared set.\n // Additional-property generation (when the schema allows) is deferred — the\n // stateless tier schemas don't rely on that branch being exercised.\n void shape.additionalProperties;\n return spec;\n}\n\n/**\n * Map an AdCP request-property name to the fixture pool it should draw\n * from. Covers singular and plural forms of the well-known ID shapes.\n */\nconst PROPERTY_TO_POOL: Record<string, keyof ConformanceFixtures> = {\n creative_id: 'creative_ids',\n creative_ids: 'creative_ids',\n media_buy_id: 'media_buy_ids',\n media_buy_ids: 'media_buy_ids',\n list_id: 'list_ids',\n list_ids: 'list_ids',\n standards_id: 'standards_ids',\n standards_ids: 'standards_ids',\n task_id: 'task_ids',\n taskId: 'task_ids',\n plan_id: 'plan_ids',\n account_id: 'account_ids',\n package_id: 'package_ids',\n package_ids: 'package_ids',\n};\n\nfunction resolvePoolForKey(key: string, fixtures: ConformanceFixtures): readonly string[] | null {\n const poolName = PROPERTY_TO_POOL[key];\n if (!poolName) return null;\n const pool = fixtures[poolName];\n return pool && pool.length > 0 ? pool : null;\n}\n\n/**\n * If property `key` should be filled from a fixture pool, returns a\n * `fc.constantFrom`-backed arbitrary; otherwise `null` so the caller\n * falls through to schema-derived generation.\n *\n * Pool values are filtered against the sub-schema's string constraints\n * (`pattern`, `minLength`, `maxLength`). This closes two problems:\n *\n * 1. Name-collision: a pool can legitimately match a bare property\n * name in a nested context where the semantic is different (e.g.,\n * `account_id` appears both as a top-level ID and inside a nested\n * oneOf branch). The nested occurrence typically has a tighter\n * pattern; non-matching pool values drop out and the generator\n * falls through to schema-derived strings.\n * 2. Pattern bypass: a pool of `['abc']` drawn into a field requiring\n * `^mb_[a-z0-9]+$` would produce schema-invalid samples that the\n * oracle would score as the agent's fault. Filtering keeps the\n * generated request schema-valid.\n *\n * Handles two shapes — scalar `{ type: 'string' }` and plain array\n * `{ type: 'array', items: { type: 'string' } }`. Nested-structured IDs\n * (e.g. `signal_id` as an object with a discriminator) fall through to\n * schema-derived generation; fixture support for those is a P3 concern.\n */\nfunction fixtureArbitraryForProperty(\n key: string,\n subSchema: JsonSchema,\n fixtures: ConformanceFixtures | undefined\n): fc.Arbitrary<unknown> | null {\n if (!fixtures) return null;\n const pool = resolvePoolForKey(key, fixtures);\n if (!pool) return null;\n\n const type = normalizeType(subSchema);\n if (type === 'string') {\n const valid = pool.filter(v => satisfiesStringConstraints(v, subSchema));\n return valid.length > 0 ? fc.constantFrom(...valid) : null;\n }\n if (type === 'array') {\n const items = (subSchema.items as JsonSchema | undefined) ?? {};\n if (normalizeType(items) === 'string') {\n const valid = pool.filter(v => satisfiesStringConstraints(v, items));\n if (valid.length === 0) return null;\n const minItems = (subSchema.minItems as number | undefined) ?? 0;\n const declaredMax = subSchema.maxItems as number | undefined;\n // Capped at valid-pool size — `fc.constantFrom` can repeat, but\n // the schema usually asks for distinct IDs, so we keep the array\n // length ≤ valid-pool.\n const maxItems = Math.min(declaredMax ?? valid.length, valid.length);\n return fc.array(fc.constantFrom(...valid), {\n minLength: minItems,\n maxLength: Math.max(minItems, maxItems),\n });\n }\n }\n return null;\n}\n\nfunction satisfiesStringConstraints(value: string, schema: JsonSchema): boolean {\n if (typeof value !== 'string') return false;\n const minLength = schema.minLength as number | undefined;\n const maxLength = schema.maxLength as number | undefined;\n if (minLength !== undefined && value.length < minLength) return false;\n if (maxLength !== undefined && value.length > maxLength) return false;\n const pattern = schema.pattern as string | undefined;\n if (pattern) {\n try {\n if (!new RegExp(pattern).test(value)) return false;\n } catch {\n // Bad regex in the schema — err on the side of letting the pool\n // value through rather than silently dropping every fixture.\n }\n }\n return true;\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/lib/conformance/schemaArbitrary.ts"],"sourcesContent":["import fc from 'fast-check';\nimport type { ConformanceFixtures } from './types';\n\ntype JsonSchema = Record<string, unknown> & { type?: string | string[] };\n\nexport interface ArbitraryOptions {\n /**\n * ID pools. When a property name matches (e.g. `creative_id`,\n * `creative_ids`), the generator draws from the pool instead of\n * producing random strings. See {@link resolvePoolForKey}.\n */\n fixtures?: ConformanceFixtures;\n /**\n * Root schema used to resolve `$ref` pointers like `#/$defs/Name` or\n * `#/definitions/Name`. Set once at the top of `schemaToArbitrary` and\n * threaded through recursive calls. AdCP 3.0.1 introduced bundler-side\n * enum hoisting (adcp#3170) that emits these pointers; without root\n * resolution, the generator falls through to `fc.anything()` and produces\n * samples that fail validation.\n */\n rootSchema?: JsonSchema;\n /**\n * Set of `$ref` pointers already in the resolution chain. Cycle guard —\n * AdCP's bundled schemas don't ship self-referential defs today, but a\n * future schema that did would otherwise stack-overflow this generator.\n * On revisit, the generator returns `fc.anything()` rather than recursing.\n */\n seenRefs?: Set<string>;\n}\n\n/** Resolve a `#/`-prefixed JSON pointer against the root schema. */\nfunction resolveLocalRef(root: JsonSchema | undefined, ref: string): JsonSchema | undefined {\n if (!root || !ref.startsWith('#/')) return undefined;\n const segments = ref\n .slice(2)\n .split('/')\n .map(s => s.replace(/~1/g, '/').replace(/~0/g, '~'));\n let node: unknown = root;\n for (const seg of segments) {\n if (!node || typeof node !== 'object') return undefined;\n node = (node as Record<string, unknown>)[seg];\n }\n return node && typeof node === 'object' ? (node as JsonSchema) : undefined;\n}\n\n/**\n * Converts a draft-07 JSON Schema into a fast-check arbitrary that\n * produces schema-valid values. Covers the subset of JSON Schema used\n * by AdCP bundled request schemas. Unsupported constructs fall through\n * to a permissive arbitrary rather than throwing, so the fuzzer keeps\n * running on the remainder of the schema.\n */\nexport function schemaToArbitrary(schema: JsonSchema, opts: ArbitraryOptions = {}): fc.Arbitrary<unknown> {\n if (!schema || typeof schema !== 'object') return fc.anything();\n\n // Pin the root on the first call so $ref resolution always finds the\n // bundler's `$defs` / `definitions` block. Recursive calls re-use the\n // same root rather than re-pinning to a sub-schema.\n const rootSchema = opts.rootSchema ?? schema;\n const optsWithRoot: ArbitraryOptions = opts.rootSchema ? opts : { ...opts, rootSchema };\n\n if (typeof schema.$ref === 'string') {\n const ref = schema.$ref;\n const seenRefs = optsWithRoot.seenRefs ?? new Set<string>();\n if (seenRefs.has(ref)) return fc.anything();\n const resolved = resolveLocalRef(rootSchema, ref);\n if (resolved) {\n const nextSeen = new Set(seenRefs);\n nextSeen.add(ref);\n return schemaToArbitrary(resolved, { ...optsWithRoot, seenRefs: nextSeen });\n }\n return fc.anything();\n }\n\n if ('const' in schema) return fc.constant(schema.const);\n if (Array.isArray(schema.enum)) return fc.constantFrom(...(schema.enum as unknown[]));\n\n // Composite-shape oneOf: the whole value is one of the branches.\n // Only replaces the dispatch when the outer schema has no standalone\n // `properties` — otherwise oneOf is a side-constraint we generate past.\n if (Array.isArray(schema.oneOf) && !hasOwnProperties(schema)) {\n return fc.oneof(...schema.oneOf.map(s => schemaToArbitrary(s as JsonSchema, optsWithRoot)));\n }\n if (Array.isArray(schema.anyOf) && !hasOwnProperties(schema)) {\n return fc.oneof(...schema.anyOf.map(s => schemaToArbitrary(s as JsonSchema, optsWithRoot)));\n }\n // `allOf` is usually conditional (if/then/else) in AdCP schemas; the base\n // shape on the outer schema is the right generator. Ignoring the `if`\n // occasionally produces a sample that violates the conditional — an\n // acceptable cost for not hand-rolling if/then semantics.\n\n const type = normalizeType(schema);\n switch (type) {\n case 'string':\n return stringArb(schema);\n case 'integer':\n return integerArb(schema);\n case 'number':\n return numberArb(schema);\n case 'boolean':\n return fc.boolean();\n case 'null':\n return fc.constant(null);\n case 'array':\n return arrayArb(schema, optsWithRoot);\n case 'object':\n return objectArb(schema, optsWithRoot);\n default:\n return fc.anything();\n }\n}\n\n// Years 2020-2040 — well inside Ajv's date-time format validator. Fast-check's\n// default `fc.date()` produces ISO strings outside the RFC-3339 range (e.g.,\n// `+041510-07-24T...`) that the format validator rejects.\nconst DATE_MIN = new Date('2020-01-01T00:00:00Z');\nconst DATE_MAX = new Date('2040-12-31T23:59:59Z');\nfunction boundedDate(): fc.Arbitrary<Date> {\n return fc.date({ min: DATE_MIN, max: DATE_MAX, noInvalidDate: true });\n}\n\nfunction hasOwnProperties(schema: JsonSchema): boolean {\n return !!schema.properties && Object.keys(schema.properties).length > 0;\n}\n\nfunction normalizeType(schema: JsonSchema): string {\n if (typeof schema.type === 'string') return schema.type;\n if (Array.isArray(schema.type) && typeof schema.type[0] === 'string') return schema.type[0];\n if (schema.properties || schema.required || schema.additionalProperties !== undefined) return 'object';\n if (schema.items) return 'array';\n return 'unknown';\n}\n\nfunction stringArb(schema: JsonSchema): fc.Arbitrary<string> {\n const pattern = schema.pattern as string | undefined;\n const format = schema.format as string | undefined;\n const minLength = (schema.minLength as number | undefined) ?? 0;\n const maxLength = (schema.maxLength as number | undefined) ?? 32;\n\n // format:uri often co-occurs with pattern `^https://`. Let format take\n // precedence (and narrow schemes when the pattern hints at it) so we\n // produce genuine RFC-3986 URIs rather than pattern-shaped noise that\n // Ajv's format validator rejects.\n if (format === 'uri' || format === 'uri-reference') {\n const httpsOnly = pattern === '^https://' || pattern === '^https:' || pattern === '^https:\\\\/\\\\/';\n return fc.webUrl({ validSchemes: httpsOnly ? ['https'] : ['http', 'https'] });\n }\n if (format === 'email') return fc.emailAddress();\n if (format === 'uuid') return fc.uuid();\n if (format === 'date-time') return boundedDate().map(d => d.toISOString());\n if (format === 'date') return boundedDate().map(d => d.toISOString().slice(0, 10));\n\n if (pattern) {\n try {\n return fc.stringMatching(new RegExp(pattern));\n } catch {\n /* fallthrough */\n }\n }\n return fc.string({ minLength: Math.max(1, minLength), maxLength });\n}\n\nfunction integerArb(schema: JsonSchema): fc.Arbitrary<number> {\n const min = (schema.minimum as number | undefined) ?? -1000;\n const max = (schema.maximum as number | undefined) ?? 1000;\n return fc.integer({ min: Math.ceil(min), max: Math.floor(max) });\n}\n\nfunction numberArb(schema: JsonSchema): fc.Arbitrary<number> {\n const min = (schema.minimum as number | undefined) ?? -1000;\n const max = (schema.maximum as number | undefined) ?? 1000;\n return fc.double({ min, max, noNaN: true, noDefaultInfinity: true });\n}\n\nfunction arrayArb(schema: JsonSchema, opts: ArbitraryOptions): fc.Arbitrary<unknown[]> {\n const items = (schema.items as JsonSchema | undefined) ?? {};\n const minItems = (schema.minItems as number | undefined) ?? 0;\n const maxItems = (schema.maxItems as number | undefined) ?? Math.max(minItems, 3);\n const unique = schema.uniqueItems === true;\n if (unique) {\n return fc.uniqueArray(schemaToArbitrary(items, opts), {\n minLength: minItems,\n maxLength: maxItems,\n selector: x => JSON.stringify(x),\n });\n }\n return fc.array(schemaToArbitrary(items, opts), { minLength: minItems, maxLength: maxItems });\n}\n\ninterface ObjectShape {\n properties: Record<string, JsonSchema>;\n required: Set<string>;\n additionalProperties: boolean | JsonSchema;\n hasPatternProperties: boolean;\n}\n\nfunction objectArb(schema: JsonSchema, opts: ArbitraryOptions): fc.Arbitrary<Record<string, unknown>> {\n const shape = readObjectShape(schema);\n const anyOfRequired = collectAnyOfRequired(schema);\n const oneOfBranches = collectExclusiveOneOfBranches(schema);\n const propertySpec = buildPropertyRecordSpec(shape, opts);\n const declared = new Set(Object.keys(propertySpec));\n const baseRequired = Array.from(shape.required).filter(k => declared.has(k));\n const dependencies = readDependencies(schema, declared);\n\n const base =\n oneOfBranches.length > 0\n ? fc.nat(oneOfBranches.length - 1).chain(idx => {\n const branch = oneOfBranches[idx]!;\n const forbidden = new Set(branch.forbidden);\n const branchSpec = Object.fromEntries(Object.entries(propertySpec).filter(([key]) => !forbidden.has(key)));\n const requiredKeys = Array.from(new Set([...baseRequired, ...branch.required.filter(k => k in branchSpec)]));\n return fc.record(branchSpec, { requiredKeys });\n })\n : anyOfRequired.length === 0\n ? fc.record(propertySpec, { requiredKeys: baseRequired })\n : fc.nat(anyOfRequired.length - 1).chain(idx => {\n const branch = anyOfRequired[idx]!;\n const requiredKeys = Array.from(new Set([...baseRequired, ...branch.filter(k => declared.has(k))]));\n return fc.record(propertySpec, { requiredKeys });\n });\n\n let withDeps = base;\n if (dependencies.length > 0) withDeps = base.map(value => enforceDependencies(value, dependencies));\n withDeps = withDeps.map(value => enforceKnownConditionals(enforceSimpleConditionals(value, schema), shape));\n\n // Unknown-property probe: when the schema allows additional properties,\n // sometimes inject one. Exercises the \"unknown-field tolerance\"\n // surface — a common crash source where agents deserialize into a\n // strict struct and reject keys they weren't expecting. Kept at ~15%\n // frequency and capped at one extra key so overall sample validity\n // stays high; the oracle's two-path design absorbs the rest.\n if (shape.additionalProperties !== true || shape.hasPatternProperties) return withDeps;\n return withDeps.chain(value => injectExtraProperty(value, declared));\n}\n\nfunction enforceKnownConditionals(value: Record<string, unknown>, shape: ObjectShape): Record<string, unknown> {\n let current = value;\n\n if (declares(shape, 'discovery_mode')) {\n current = enforceSignalsDiscoveryMode(current);\n }\n\n if (declares(shape, 'format_id') && declares(shape, 'format_kind')) {\n current = enforceCreativeManifestFormatSelector(current);\n }\n\n if (declares(shape, 'scope') && declares(shape, 'format_option_id') && declares(shape, 'publisher_domain')) {\n current = enforceFormatOptionRef(current);\n }\n\n return current;\n}\n\nfunction declares(shape: ObjectShape, key: string): boolean {\n return Object.prototype.hasOwnProperty.call(shape.properties, key);\n}\n\nfunction enforceSignalsDiscoveryMode(value: Record<string, unknown>): Record<string, unknown> {\n const hasWholesaleVersion = 'if_wholesale_feed_version' in value || 'if_pricing_version' in value;\n const current = { ...value };\n\n if (hasWholesaleVersion) {\n current.discovery_mode = 'wholesale';\n }\n\n if (current.discovery_mode === 'wholesale') {\n delete current.signal_spec;\n delete current.signal_ids;\n return current;\n }\n\n if (!('signal_spec' in current) && !('signal_ids' in current)) {\n current.signal_spec = 'conformance probe';\n }\n\n return current;\n}\n\nfunction enforceCreativeManifestFormatSelector(value: Record<string, unknown>): Record<string, unknown> {\n const current = { ...value };\n\n if ('format_id' in current && 'format_kind' in current) {\n delete current.format_kind;\n } else if (!('format_id' in current) && !('format_kind' in current)) {\n current.format_kind = 'image';\n }\n\n return current;\n}\n\nfunction enforceFormatOptionRef(value: Record<string, unknown>): Record<string, unknown> {\n const current = { ...value };\n\n if (current.scope === 'product') {\n delete current.publisher_domain;\n return current;\n }\n\n if (current.scope === 'publisher') {\n if (typeof current.publisher_domain !== 'string' || !DOMAIN_RE.test(current.publisher_domain)) {\n current.publisher_domain = 'example.com';\n }\n }\n\n return current;\n}\n\nconst DOMAIN_RE = /^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$/;\n\n/**\n * Probabilistically adds a single unknown key to `value`. The key name\n * is drawn from a fixed vocabulary that deliberately avoids collisions\n * with well-known AdCP property names, and the value is a minimal\n * primitive. Most samples pass through unchanged.\n */\nfunction injectExtraProperty(\n value: Record<string, unknown>,\n declared: Set<string>\n): fc.Arbitrary<Record<string, unknown>> {\n const candidates = EXTRA_PROPERTY_NAMES.filter(k => !(k in value) && !declared.has(k));\n if (candidates.length === 0) return fc.constant(value);\n // 85% pass-through, 15% injection. `fc.nat({max: 19})` gives a 0-19\n // roll; values 0-2 (~15%) trigger injection.\n return fc.nat({ max: 19 }).chain(roll => {\n if (roll > 2) return fc.constant(value);\n return fc.tuple(fc.constantFrom(...candidates), EXTRA_VALUE_ARB).map(([key, v]) => ({ ...value, [key]: v }));\n });\n}\n\nconst EXTRA_PROPERTY_NAMES: readonly string[] = [\n 'x_conformance_probe',\n '_debug_trace',\n 'probe_key',\n 'unknown_field',\n 'test_vendor_ext',\n];\nconst EXTRA_VALUE_ARB: fc.Arbitrary<unknown> = fc.oneof(\n fc.string({ minLength: 1, maxLength: 16 }),\n fc.integer({ min: 0, max: 999 }),\n fc.boolean()\n);\n\nfunction readDependencies(schema: JsonSchema, declared: Set<string>): Array<[string, string[]]> {\n const raw = schema.dependencies;\n if (!raw || typeof raw !== 'object') return [];\n const out: Array<[string, string[]]> = [];\n for (const [key, deps] of Object.entries(raw as Record<string, unknown>)) {\n if (Array.isArray(deps) && declared.has(key)) {\n out.push([key, deps.filter(d => typeof d === 'string' && declared.has(d as string)) as string[]]);\n }\n }\n return out;\n}\n\nfunction enforceDependencies(\n value: Record<string, unknown>,\n dependencies: Array<[string, string[]]>\n): Record<string, unknown> {\n let current = value;\n for (const [key, deps] of dependencies) {\n if (!(key in current)) continue;\n const missing = deps.filter(d => !(d in current));\n if (missing.length === 0) continue;\n // Drop the trigger key rather than fabricate values — keeping the sample\n // schema-valid costs us that property but preserves determinism.\n const { [key]: _dropped, ...rest } = current;\n void _dropped;\n current = rest;\n }\n return current;\n}\n\nfunction readObjectShape(schema: JsonSchema): ObjectShape {\n const properties = ((schema.properties as Record<string, JsonSchema>) ?? {}) as Record<string, JsonSchema>;\n const required = new Set<string>(Array.isArray(schema.required) ? (schema.required as string[]) : []);\n const additionalProperties =\n typeof schema.additionalProperties === 'boolean'\n ? schema.additionalProperties\n : ((schema.additionalProperties as JsonSchema | undefined) ?? true);\n return { properties, required, additionalProperties, hasPatternProperties: !!schema.patternProperties };\n}\n\nfunction collectAnyOfRequired(schema: JsonSchema): string[][] {\n if (!Array.isArray(schema.anyOf)) return [];\n const out: string[][] = [];\n for (const branch of schema.anyOf as JsonSchema[]) {\n if (branch && Array.isArray(branch.required) && Object.keys(branch).every(k => k === 'required' || k === 'type')) {\n out.push(branch.required as string[]);\n }\n }\n return out;\n}\n\ninterface ExclusiveBranch {\n required: string[];\n forbidden: string[];\n}\n\nfunction collectExclusiveOneOfBranches(schema: JsonSchema): ExclusiveBranch[] {\n if (!Array.isArray(schema.oneOf)) return [];\n const branches: ExclusiveBranch[] = [];\n for (const branch of schema.oneOf as JsonSchema[]) {\n if (!branch || typeof branch !== 'object') return [];\n if (!Array.isArray(branch.required) || branch.required.length === 0) return [];\n const not = branch.not as JsonSchema | undefined;\n if (!not || !Array.isArray(not.required)) return [];\n const allowedKeys = new Set(['title', 'description', 'required', 'not']);\n if (Object.keys(branch).some(k => !allowedKeys.has(k))) return [];\n if (Object.keys(not).some(k => k !== 'required')) return [];\n branches.push({ required: branch.required as string[], forbidden: not.required as string[] });\n }\n return branches;\n}\n\nfunction enforceSimpleConditionals(value: Record<string, unknown>, schema: JsonSchema): Record<string, unknown> {\n let current = { ...value };\n for (const entry of (schema.allOf as JsonSchema[] | undefined) ?? []) {\n current = enforceRequiredTriggerConst(current, entry);\n }\n current = enforceConstThenForbidden(current, schema);\n return current;\n}\n\nfunction enforceRequiredTriggerConst(value: Record<string, unknown>, schema: JsonSchema): Record<string, unknown> {\n const anyOf = (schema.if as JsonSchema | undefined)?.anyOf as JsonSchema[] | undefined;\n const thenProps = (schema.then as JsonSchema | undefined)?.properties as Record<string, JsonSchema> | undefined;\n if (!Array.isArray(anyOf) || !thenProps) return value;\n const triggered = anyOf.some(branch => {\n const required = branch?.required;\n return Array.isArray(required) && required.some(name => typeof name === 'string' && name in value);\n });\n if (!triggered) return value;\n\n let current = value;\n for (const [key, prop] of Object.entries(thenProps)) {\n if (prop && typeof prop === 'object' && 'const' in prop) {\n current = { ...current, [key]: prop.const };\n }\n }\n return current;\n}\n\nfunction enforceConstThenForbidden(value: Record<string, unknown>, schema: JsonSchema): Record<string, unknown> {\n const ifSchema = schema.if as JsonSchema | undefined;\n const thenSchema = schema.then as JsonSchema | undefined;\n const ifProps = ifSchema?.properties as Record<string, JsonSchema> | undefined;\n const thenNot = thenSchema?.not as JsonSchema | undefined;\n const thenAnyOf = thenNot?.anyOf as JsonSchema[] | undefined;\n if (!ifProps || !Array.isArray(thenAnyOf)) return value;\n\n const matches = Object.entries(ifProps).every(([key, prop]) => {\n return prop && typeof prop === 'object' && 'const' in prop && value[key] === prop.const;\n });\n if (!matches) return value;\n\n const forbidden = new Set<string>();\n for (const branch of thenAnyOf) {\n if (Array.isArray(branch?.required)) {\n for (const key of branch.required) {\n if (typeof key === 'string') forbidden.add(key);\n }\n }\n }\n if (forbidden.size === 0) return value;\n\n const next = { ...value };\n for (const key of forbidden) delete next[key];\n return next;\n}\n\nfunction buildPropertyRecordSpec(shape: ObjectShape, opts: ArbitraryOptions): Record<string, fc.Arbitrary<unknown>> {\n const spec: Record<string, fc.Arbitrary<unknown>> = {};\n for (const [key, subSchema] of Object.entries(shape.properties)) {\n const fixtureArb = fixtureArbitraryForProperty(key, subSchema, opts.fixtures);\n spec[key] = fixtureArb ?? schemaToArbitrary(subSchema, opts);\n }\n // Honor additionalProperties: false by not emitting keys outside the declared set.\n // Additional-property generation (when the schema allows) is deferred — the\n // stateless tier schemas don't rely on that branch being exercised.\n void shape.additionalProperties;\n return spec;\n}\n\n/**\n * Map an AdCP request-property name to the fixture pool it should draw\n * from. Covers singular and plural forms of the well-known ID shapes.\n */\nconst PROPERTY_TO_POOL: Record<string, keyof ConformanceFixtures> = {\n creative_id: 'creative_ids',\n creative_ids: 'creative_ids',\n media_buy_id: 'media_buy_ids',\n media_buy_ids: 'media_buy_ids',\n list_id: 'list_ids',\n list_ids: 'list_ids',\n standards_id: 'standards_ids',\n standards_ids: 'standards_ids',\n task_id: 'task_ids',\n taskId: 'task_ids',\n plan_id: 'plan_ids',\n account_id: 'account_ids',\n package_id: 'package_ids',\n package_ids: 'package_ids',\n};\n\nfunction resolvePoolForKey(key: string, fixtures: ConformanceFixtures): readonly string[] | null {\n const poolName = PROPERTY_TO_POOL[key];\n if (!poolName) return null;\n const pool = fixtures[poolName];\n return pool && pool.length > 0 ? pool : null;\n}\n\n/**\n * If property `key` should be filled from a fixture pool, returns a\n * `fc.constantFrom`-backed arbitrary; otherwise `null` so the caller\n * falls through to schema-derived generation.\n *\n * Pool values are filtered against the sub-schema's string constraints\n * (`pattern`, `minLength`, `maxLength`). This closes two problems:\n *\n * 1. Name-collision: a pool can legitimately match a bare property\n * name in a nested context where the semantic is different (e.g.,\n * `account_id` appears both as a top-level ID and inside a nested\n * oneOf branch). The nested occurrence typically has a tighter\n * pattern; non-matching pool values drop out and the generator\n * falls through to schema-derived strings.\n * 2. Pattern bypass: a pool of `['abc']` drawn into a field requiring\n * `^mb_[a-z0-9]+$` would produce schema-invalid samples that the\n * oracle would score as the agent's fault. Filtering keeps the\n * generated request schema-valid.\n *\n * Handles two shapes — scalar `{ type: 'string' }` and plain array\n * `{ type: 'array', items: { type: 'string' } }`. Nested-structured IDs\n * (e.g. `signal_id` as an object with a discriminator) fall through to\n * schema-derived generation; fixture support for those is a P3 concern.\n */\nfunction fixtureArbitraryForProperty(\n key: string,\n subSchema: JsonSchema,\n fixtures: ConformanceFixtures | undefined\n): fc.Arbitrary<unknown> | null {\n if (!fixtures) return null;\n const pool = resolvePoolForKey(key, fixtures);\n if (!pool) return null;\n\n const type = normalizeType(subSchema);\n if (type === 'string') {\n const valid = pool.filter(v => satisfiesStringConstraints(v, subSchema));\n return valid.length > 0 ? fc.constantFrom(...valid) : null;\n }\n if (type === 'array') {\n const items = (subSchema.items as JsonSchema | undefined) ?? {};\n if (normalizeType(items) === 'string') {\n const valid = pool.filter(v => satisfiesStringConstraints(v, items));\n if (valid.length === 0) return null;\n const minItems = (subSchema.minItems as number | undefined) ?? 0;\n const declaredMax = subSchema.maxItems as number | undefined;\n // Capped at valid-pool size — `fc.constantFrom` can repeat, but\n // the schema usually asks for distinct IDs, so we keep the array\n // length ≤ valid-pool.\n const maxItems = Math.min(declaredMax ?? valid.length, valid.length);\n return fc.array(fc.constantFrom(...valid), {\n minLength: minItems,\n maxLength: Math.max(minItems, maxItems),\n });\n }\n }\n return null;\n}\n\nfunction satisfiesStringConstraints(value: string, schema: JsonSchema): boolean {\n if (typeof value !== 'string') return false;\n const minLength = schema.minLength as number | undefined;\n const maxLength = schema.maxLength as number | undefined;\n if (minLength !== undefined && value.length < minLength) return false;\n if (maxLength !== undefined && value.length > maxLength) return false;\n const pattern = schema.pattern as string | undefined;\n if (pattern) {\n try {\n if (!new RegExp(pattern).test(value)) return false;\n } catch {\n // Bad regex in the schema — err on the side of letting the pool\n // value through rather than silently dropping every fixture.\n }\n }\n return true;\n}\n"],"mappings":"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","names":[]}
@@ -1,9 +1,8 @@
1
- import { fileURLToPath as __adcpFileURLToPath } from 'node:url';
2
- import { dirname as __adcpDirname } from 'node:path';
3
- import { createRequire as __adcpCreateRequire } from 'node:module';
4
- const __filename = __adcpFileURLToPath(import.meta.url);
5
- const __dirname = __adcpDirname(__filename);
6
- const require = __adcpCreateRequire(import.meta.url);
1
+ import { fileURLToPath as __adcpFileURLToPath } from "node:url";
2
+ import { dirname as __adcpDirname } from "node:path";
3
+ import { createRequire as __adcpCreateRequire } from "node:module";
4
+ const __dirname = __adcpDirname(__adcpFileURLToPath(import.meta.url));
5
+ const require2 = __adcpCreateRequire(import.meta.url);
7
6
  import * as fs from "fs";
8
7
  import * as path from "path";
9
8
  import { ADCP_VERSION } from "../version.mjs";