@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/core/match.ts"],"sourcesContent":["import type { TaskResult } from './ConversationTypes';\n\n/**\n * Status discriminant values actually used by `TaskResult` variants. Narrower\n * than `TaskStatus` (which includes pre-response states like `'pending'`).\n */\ntype StatusOf<T> = TaskResult<T>['status'];\n\n/**\n * Narrow `TaskResult<T>` to the variant whose `status` includes `K`.\n *\n * Plain `Extract<TaskResult<T>, { status: K }>` returns `never` here because\n * `TaskResultFailure<T>` and `TaskResultIntermediate<T>` each cover multiple\n * status literals — neither is assignable to `{ status: K }` for a single\n * `K`. The distributive conditional below keeps a variant `U` when `K` is a\n * member of `U['status']`.\n */\ntype Narrow<T, K extends StatusOf<T>> =\n TaskResult<T> extends infer U ? (U extends { status: infer S } ? (K extends S ? U : never) : never) : never;\n\n/**\n * Exhaustive handler map: one arm per possible `status`. Omitting any arm is\n * a compile error — use {@link PartialMatchHandlers} with a `_` catchall to\n * handle a subset.\n */\nexport type MatchHandlers<T, R> = {\n [K in StatusOf<T>]: (r: Narrow<T, K>) => R;\n};\n\n/**\n * Partial handler map with a required `_` catchall. Any omitted status arm\n * routes to `_`, which receives the full `TaskResult<T>` type.\n */\nexport type PartialMatchHandlers<T, R> = Partial<{\n [K in StatusOf<T>]: (r: Narrow<T, K>) => R;\n}> & { _: (r: TaskResult<T>) => R };\n\n/**\n * Exhaustive pattern match on a {@link TaskResult}'s `status` discriminant.\n *\n * Each handler receives the variant narrowed to its status, so `data`,\n * `error`, `adcpError`, `deferred`, and `submitted` are correctly typed\n * without manual `if (result.status === ...)` guards.\n *\n * @example\n * ```ts\n * const rendered = match(result, {\n * completed: (r) => `OK: ${r.data.media_buy_id}`,\n * failed: (r) => `Error: ${r.adcpError?.code ?? r.error}`,\n * 'governance-denied': (r) => `Denied: ${r.error}`,\n * submitted: (r) => `Pending: ${r.metadata.taskId}`,\n * 'input-required': (r) => `Input: ${r.metadata.inputRequest?.question}`,\n * working: (r) => `Working: ${r.metadata.taskId}`,\n * deferred: (r) => `Deferred: ${r.deferred?.token}`,\n * });\n * ```\n *\n * @example With `_` catchall, other arms become optional:\n * ```ts\n * const label = match(result, {\n * completed: (r) => `OK: ${r.data.media_buy_id}`,\n * _: (r) => `${r.status}: ${r.metadata.taskId}`,\n * });\n * ```\n */\nexport function match<T, R>(result: TaskResult<T>, handlers: MatchHandlers<T, R>): R;\nexport function match<T, R>(result: TaskResult<T>, handlers: PartialMatchHandlers<T, R>): R;\nexport function match<T, R>(result: TaskResult<T>, handlers: Record<string, unknown>): R {\n // `result.status` originates from server responses (untrusted input on the\n // client boundary). Look up with `hasOwnProperty` so a hostile value like\n // `'__proto__'` or `'constructor'` resolves to `handlers._` instead of a\n // prototype method that fails with an unclear TypeError at call time.\n const own = Object.prototype.hasOwnProperty.call(handlers, result.status);\n const handler = (own ? handlers[result.status] : handlers._) as ((r: TaskResult<T>) => R) | undefined;\n if (typeof handler !== 'function') {\n throw new Error(`match: no handler for status \"${result.status}\" and no \"_\" catchall provided`);\n }\n return handler(result);\n}\n\n/**\n * Attach a non-enumerable `.match` method to a `TaskResult` so callers can\n * use the fluent form `result.match({ completed: ..., failed: ... })`.\n *\n * Non-enumerable so `JSON.stringify(result)`, `{...result}`, and\n * `Object.keys(result)` are unaffected — the method only surfaces through\n * direct property access and autocomplete. **Note:** because the method is\n * non-enumerable, shallow clones like `const r = {...result}` or\n * `structuredClone(result)` do NOT carry the method over. Use the free\n * function `match(clone, handlers)` on clones, or call `attachMatch(clone)`\n * to re-decorate.\n *\n * Idempotent: if `.match` is already present, the result is returned\n * unchanged. Safe to call on results that have already been decorated\n * (e.g., a result forwarded through multiple client layers).\n */\nexport function attachMatch<T>(result: TaskResult<T>): TaskResult<T> {\n if (result && typeof (result as { match?: unknown }).match === 'function') {\n return result;\n }\n Object.defineProperty(result, 'match', {\n value: function matchMethod<R>(this: TaskResult<T>, handlers: MatchHandlers<T, R> | PartialMatchHandlers<T, R>): R {\n return match(this, handlers as MatchHandlers<T, R>);\n },\n enumerable: false,\n configurable: true,\n writable: true,\n });\n return result;\n}\n"],"mappings":";;;;;;AAmEO,SAAS,MAAY,QAAuB,UAAsC;AAKvF,QAAM,MAAM,OAAO,UAAU,eAAe,KAAK,UAAU,OAAO,MAAM;AACxE,QAAM,UAAW,MAAM,SAAS,OAAO,MAAM,IAAI,SAAS;AAC1D,MAAI,OAAO,YAAY,YAAY;AACjC,UAAM,IAAI,MAAM,iCAAiC,OAAO,MAAM,gCAAgC;AAAA,EAChG;AACA,SAAO,QAAQ,MAAM;AACvB;AAkBO,SAAS,YAAe,QAAsC;AACnE,MAAI,UAAU,OAAQ,OAA+B,UAAU,YAAY;AACzE,WAAO;AAAA,EACT;AACA,SAAO,eAAe,QAAQ,SAAS;AAAA,IACrC,OAAO,SAAS,YAAoC,UAA+D;AACjH,aAAO,MAAM,MAAM,QAA+B;AAAA,IACpD;AAAA,IACA,YAAY;AAAA,IACZ,cAAc;AAAA,IACd,UAAU;AAAA,EACZ,CAAC;AACD,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../../../src/lib/core/match.ts"],"sourcesContent":["import type { TaskResult } from './ConversationTypes';\n\n/**\n * Status discriminant values actually used by `TaskResult` variants. Narrower\n * than `TaskStatus` (which includes pre-response states like `'pending'`).\n */\ntype StatusOf<T> = TaskResult<T>['status'];\n\n/**\n * Narrow `TaskResult<T>` to the variant whose `status` includes `K`.\n *\n * Plain `Extract<TaskResult<T>, { status: K }>` returns `never` here because\n * `TaskResultFailure<T>` and `TaskResultIntermediate<T>` each cover multiple\n * status literals — neither is assignable to `{ status: K }` for a single\n * `K`. The distributive conditional below keeps a variant `U` when `K` is a\n * member of `U['status']`.\n */\ntype Narrow<T, K extends StatusOf<T>> =\n TaskResult<T> extends infer U ? (U extends { status: infer S } ? (K extends S ? U : never) : never) : never;\n\n/**\n * Exhaustive handler map: one arm per possible `status`. Omitting any arm is\n * a compile error — use {@link PartialMatchHandlers} with a `_` catchall to\n * handle a subset.\n */\nexport type MatchHandlers<T, R> = {\n [K in StatusOf<T>]: (r: Narrow<T, K>) => R;\n};\n\n/**\n * Partial handler map with a required `_` catchall. Any omitted status arm\n * routes to `_`, which receives the full `TaskResult<T>` type.\n */\nexport type PartialMatchHandlers<T, R> = Partial<{\n [K in StatusOf<T>]: (r: Narrow<T, K>) => R;\n}> & { _: (r: TaskResult<T>) => R };\n\n/**\n * Exhaustive pattern match on a {@link TaskResult}'s `status` discriminant.\n *\n * Each handler receives the variant narrowed to its status, so `data`,\n * `error`, `adcpError`, `deferred`, and `submitted` are correctly typed\n * without manual `if (result.status === ...)` guards.\n *\n * @example\n * ```ts\n * const rendered = match(result, {\n * completed: (r) => `OK: ${r.data.media_buy_id}`,\n * failed: (r) => `Error: ${r.adcpError?.code ?? r.error}`,\n * 'governance-denied': (r) => `Denied: ${r.error}`,\n * submitted: (r) => `Pending: ${r.metadata.taskId}`,\n * 'input-required': (r) => `Input: ${r.metadata.inputRequest?.question}`,\n * working: (r) => `Working: ${r.metadata.taskId}`,\n * deferred: (r) => `Deferred: ${r.deferred?.token}`,\n * });\n * ```\n *\n * @example With `_` catchall, other arms become optional:\n * ```ts\n * const label = match(result, {\n * completed: (r) => `OK: ${r.data.media_buy_id}`,\n * _: (r) => `${r.status}: ${r.metadata.taskId}`,\n * });\n * ```\n */\nexport function match<T, R>(result: TaskResult<T>, handlers: MatchHandlers<T, R>): R;\nexport function match<T, R>(result: TaskResult<T>, handlers: PartialMatchHandlers<T, R>): R;\nexport function match<T, R>(result: TaskResult<T>, handlers: Record<string, unknown>): R {\n // `result.status` originates from server responses (untrusted input on the\n // client boundary). Look up with `hasOwnProperty` so a hostile value like\n // `'__proto__'` or `'constructor'` resolves to `handlers._` instead of a\n // prototype method that fails with an unclear TypeError at call time.\n const own = Object.prototype.hasOwnProperty.call(handlers, result.status);\n const handler = (own ? handlers[result.status] : handlers._) as ((r: TaskResult<T>) => R) | undefined;\n if (typeof handler !== 'function') {\n throw new Error(`match: no handler for status \"${result.status}\" and no \"_\" catchall provided`);\n }\n return handler(result);\n}\n\n/**\n * Attach a non-enumerable `.match` method to a `TaskResult` so callers can\n * use the fluent form `result.match({ completed: ..., failed: ... })`.\n *\n * Non-enumerable so `JSON.stringify(result)`, `{...result}`, and\n * `Object.keys(result)` are unaffected — the method only surfaces through\n * direct property access and autocomplete. **Note:** because the method is\n * non-enumerable, shallow clones like `const r = {...result}` or\n * `structuredClone(result)` do NOT carry the method over. Use the free\n * function `match(clone, handlers)` on clones, or call `attachMatch(clone)`\n * to re-decorate.\n *\n * Idempotent: if `.match` is already present, the result is returned\n * unchanged. Safe to call on results that have already been decorated\n * (e.g., a result forwarded through multiple client layers).\n */\nexport function attachMatch<T>(result: TaskResult<T>): TaskResult<T> {\n if (result && typeof (result as { match?: unknown }).match === 'function') {\n return result;\n }\n Object.defineProperty(result, 'match', {\n value: function matchMethod<R>(this: TaskResult<T>, handlers: MatchHandlers<T, R> | PartialMatchHandlers<T, R>): R {\n return match(this, handlers as MatchHandlers<T, R>);\n },\n enumerable: false,\n configurable: true,\n writable: true,\n });\n return result;\n}\n"],"mappings":"AAmEO,SAAS,MAAY,QAAuB,UAAsC;AAKvF,QAAM,MAAM,OAAO,UAAU,eAAe,KAAK,UAAU,OAAO,MAAM;AACxE,QAAM,UAAW,MAAM,SAAS,OAAO,MAAM,IAAI,SAAS;AAC1D,MAAI,OAAO,YAAY,YAAY;AACjC,UAAM,IAAI,MAAM,iCAAiC,OAAO,MAAM,gCAAgC;AAAA,EAChG;AACA,SAAO,QAAQ,MAAM;AACvB;AAkBO,SAAS,YAAe,QAAsC;AACnE,MAAI,UAAU,OAAQ,OAA+B,UAAU,YAAY;AACzE,WAAO;AAAA,EACT;AACA,SAAO,eAAe,QAAQ,SAAS;AAAA,IACrC,OAAO,SAAS,YAAoC,UAA+D;AACjH,aAAO,MAAM,MAAM,QAA+B;AAAA,IACpD;AAAA,IACA,YAAY;AAAA,IACZ,cAAc;AAAA,IACd,UAAU;AAAA,EACZ,CAAC;AACD,SAAO;AACT;","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 { getLatestA2ADataPartFromTask } from "../utils/a2a-artifacts.mjs";
8
2
  const ADCP_STATUS = {
9
3
  SUBMITTED: "submitted",
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/core/task-status.ts"],"sourcesContent":["import { getLatestA2ADataPartFromTask } from '../utils/a2a-artifacts';\n\n/**\n * ADCP standardized status values as per spec PR #78.\n */\nexport const ADCP_STATUS = {\n SUBMITTED: 'submitted',\n WORKING: 'working',\n INPUT_REQUIRED: 'input-required',\n COMPLETED: 'completed',\n FAILED: 'failed',\n CANCELED: 'canceled',\n REJECTED: 'rejected',\n AUTH_REQUIRED: 'auth-required',\n UNKNOWN: 'unknown',\n} as const;\n\nexport type ADCPStatus = (typeof ADCP_STATUS)[keyof typeof ADCP_STATUS];\n\n/**\n * Fields that belong to the task envelope, not to a domain payload. Derived\n * from `ProtocolEnvelope` (core/protocol-envelope.json) plus optional fields\n * that AdCP task-response schemas place at envelope level.\n */\nexport const TASK_ENVELOPE_FIELDS: ReadonlySet<string> = new Set([\n 'status',\n 'message',\n 'timestamp',\n 'context_id',\n 'task_id',\n 'replayed',\n 'push_notification_config',\n 'governance_context',\n 'adcp_version',\n 'errors',\n 'context',\n 'ext',\n]);\n\n/**\n * ADCP task-lifecycle statuses that never overlap with AdCP domain status\n * enums and can be trusted from response payload `status` unconditionally.\n */\nconst EXCLUSIVE_TASK_STATUSES: ReadonlySet<string> = new Set([\n ADCP_STATUS.SUBMITTED,\n ADCP_STATUS.WORKING,\n ADCP_STATUS.INPUT_REQUIRED,\n ADCP_STATUS.AUTH_REQUIRED,\n]);\n\nexport function isAdcpStatus(status: unknown): status is ADCPStatus {\n return typeof status === 'string' && (Object.values(ADCP_STATUS) as string[]).includes(status);\n}\n\n/**\n * Extract a task-lifecycle status from an AdCP payload while ignoring\n * domain-level `status` fields that collide with task status literals.\n */\nexport function extractAdcpTaskStatusFromPayload(payload: unknown): ADCPStatus | undefined {\n if (payload == null || typeof payload !== 'object' || Array.isArray(payload)) return undefined;\n\n const record = payload as Record<string, unknown>;\n const status = record.status;\n if (!isAdcpStatus(status)) return undefined;\n\n if (EXCLUSIVE_TASK_STATUSES.has(status)) {\n return status;\n }\n\n const hasDomainPayload = Object.keys(record).some(k => !TASK_ENVELOPE_FIELDS.has(k));\n if (hasDomainPayload) {\n return undefined;\n }\n\n return status;\n}\n\n/**\n * Extract the AdCP work-layer status from an A2A wrapped Task result, if\n * present. Returns `undefined` for non-AdCP A2A responses so callers can fall\n * back to the transport-layer status.\n */\nexport function extractAdcpStatusFromA2aTaskResult(result: unknown): ADCPStatus | undefined {\n if (result == null || typeof result !== 'object' || Array.isArray(result)) return undefined;\n if ((result as { kind?: unknown }).kind !== 'task') return undefined;\n const extracted = getLatestA2ADataPartFromTask(result);\n return extractAdcpTaskStatusFromPayload(extracted?.data);\n}\n"],"mappings":";;;;;;AAAA,SAAS,oCAAoC;AAKtC,MAAM,cAAc;AAAA,EACzB,WAAW;AAAA,EACX,SAAS;AAAA,EACT,gBAAgB;AAAA,EAChB,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,UAAU;AAAA,EACV,eAAe;AAAA,EACf,SAAS;AACX;AASO,MAAM,uBAA4C,oBAAI,IAAI;AAAA,EAC/D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAMD,MAAM,0BAA+C,oBAAI,IAAI;AAAA,EAC3D,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AACd,CAAC;AAEM,SAAS,aAAa,QAAuC;AAClE,SAAO,OAAO,WAAW,YAAa,OAAO,OAAO,WAAW,EAAe,SAAS,MAAM;AAC/F;AAMO,SAAS,iCAAiC,SAA0C;AACzF,MAAI,WAAW,QAAQ,OAAO,YAAY,YAAY,MAAM,QAAQ,OAAO,EAAG,QAAO;AAErF,QAAM,SAAS;AACf,QAAM,SAAS,OAAO;AACtB,MAAI,CAAC,aAAa,MAAM,EAAG,QAAO;AAElC,MAAI,wBAAwB,IAAI,MAAM,GAAG;AACvC,WAAO;AAAA,EACT;AAEA,QAAM,mBAAmB,OAAO,KAAK,MAAM,EAAE,KAAK,OAAK,CAAC,qBAAqB,IAAI,CAAC,CAAC;AACnF,MAAI,kBAAkB;AACpB,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAOO,SAAS,mCAAmC,QAAyC;AAC1F,MAAI,UAAU,QAAQ,OAAO,WAAW,YAAY,MAAM,QAAQ,MAAM,EAAG,QAAO;AAClF,MAAK,OAA8B,SAAS,OAAQ,QAAO;AAC3D,QAAM,YAAY,6BAA6B,MAAM;AACrD,SAAO,iCAAiC,WAAW,IAAI;AACzD;","names":[]}
1
+ {"version":3,"sources":["../../../src/lib/core/task-status.ts"],"sourcesContent":["import { getLatestA2ADataPartFromTask } from '../utils/a2a-artifacts';\n\n/**\n * ADCP standardized status values as per spec PR #78.\n */\nexport const ADCP_STATUS = {\n SUBMITTED: 'submitted',\n WORKING: 'working',\n INPUT_REQUIRED: 'input-required',\n COMPLETED: 'completed',\n FAILED: 'failed',\n CANCELED: 'canceled',\n REJECTED: 'rejected',\n AUTH_REQUIRED: 'auth-required',\n UNKNOWN: 'unknown',\n} as const;\n\nexport type ADCPStatus = (typeof ADCP_STATUS)[keyof typeof ADCP_STATUS];\n\n/**\n * Fields that belong to the task envelope, not to a domain payload. Derived\n * from `ProtocolEnvelope` (core/protocol-envelope.json) plus optional fields\n * that AdCP task-response schemas place at envelope level.\n */\nexport const TASK_ENVELOPE_FIELDS: ReadonlySet<string> = new Set([\n 'status',\n 'message',\n 'timestamp',\n 'context_id',\n 'task_id',\n 'replayed',\n 'push_notification_config',\n 'governance_context',\n 'adcp_version',\n 'errors',\n 'context',\n 'ext',\n]);\n\n/**\n * ADCP task-lifecycle statuses that never overlap with AdCP domain status\n * enums and can be trusted from response payload `status` unconditionally.\n */\nconst EXCLUSIVE_TASK_STATUSES: ReadonlySet<string> = new Set([\n ADCP_STATUS.SUBMITTED,\n ADCP_STATUS.WORKING,\n ADCP_STATUS.INPUT_REQUIRED,\n ADCP_STATUS.AUTH_REQUIRED,\n]);\n\nexport function isAdcpStatus(status: unknown): status is ADCPStatus {\n return typeof status === 'string' && (Object.values(ADCP_STATUS) as string[]).includes(status);\n}\n\n/**\n * Extract a task-lifecycle status from an AdCP payload while ignoring\n * domain-level `status` fields that collide with task status literals.\n */\nexport function extractAdcpTaskStatusFromPayload(payload: unknown): ADCPStatus | undefined {\n if (payload == null || typeof payload !== 'object' || Array.isArray(payload)) return undefined;\n\n const record = payload as Record<string, unknown>;\n const status = record.status;\n if (!isAdcpStatus(status)) return undefined;\n\n if (EXCLUSIVE_TASK_STATUSES.has(status)) {\n return status;\n }\n\n const hasDomainPayload = Object.keys(record).some(k => !TASK_ENVELOPE_FIELDS.has(k));\n if (hasDomainPayload) {\n return undefined;\n }\n\n return status;\n}\n\n/**\n * Extract the AdCP work-layer status from an A2A wrapped Task result, if\n * present. Returns `undefined` for non-AdCP A2A responses so callers can fall\n * back to the transport-layer status.\n */\nexport function extractAdcpStatusFromA2aTaskResult(result: unknown): ADCPStatus | undefined {\n if (result == null || typeof result !== 'object' || Array.isArray(result)) return undefined;\n if ((result as { kind?: unknown }).kind !== 'task') return undefined;\n const extracted = getLatestA2ADataPartFromTask(result);\n return extractAdcpTaskStatusFromPayload(extracted?.data);\n}\n"],"mappings":"AAAA,SAAS,oCAAoC;AAKtC,MAAM,cAAc;AAAA,EACzB,WAAW;AAAA,EACX,SAAS;AAAA,EACT,gBAAgB;AAAA,EAChB,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,UAAU;AAAA,EACV,eAAe;AAAA,EACf,SAAS;AACX;AASO,MAAM,uBAA4C,oBAAI,IAAI;AAAA,EAC/D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAMD,MAAM,0BAA+C,oBAAI,IAAI;AAAA,EAC3D,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AACd,CAAC;AAEM,SAAS,aAAa,QAAuC;AAClE,SAAO,OAAO,WAAW,YAAa,OAAO,OAAO,WAAW,EAAe,SAAS,MAAM;AAC/F;AAMO,SAAS,iCAAiC,SAA0C;AACzF,MAAI,WAAW,QAAQ,OAAO,YAAY,YAAY,MAAM,QAAQ,OAAO,EAAG,QAAO;AAErF,QAAM,SAAS;AACf,QAAM,SAAS,OAAO;AACtB,MAAI,CAAC,aAAa,MAAM,EAAG,QAAO;AAElC,MAAI,wBAAwB,IAAI,MAAM,GAAG;AACvC,WAAO;AAAA,EACT;AAEA,QAAM,mBAAmB,OAAO,KAAK,MAAM,EAAE,KAAK,OAAK,CAAC,qBAAqB,IAAI,CAAC,CAAC;AACnF,MAAI,kBAAkB;AACpB,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAOO,SAAS,mCAAmC,QAAyC;AAC1F,MAAI,UAAU,QAAQ,OAAO,WAAW,YAAY,MAAM,QAAQ,MAAM,EAAG,QAAO;AAClF,MAAK,OAA8B,SAAS,OAAQ,QAAO;AAC3D,QAAM,YAAY,6BAA6B,MAAM;AACrD,SAAO,iCAAiC,WAAW,IAAI;AACzD;","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
  function selectWebhookTemplate(config, taskName) {
8
2
  if (!config) return void 0;
9
3
  if (typeof config === "string") return config;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/core/webhook-url.ts"],"sourcesContent":["import type { TaskOptions, WebhookUrlTemplate } from './ConversationTypes';\n\nexport function selectWebhookTemplate(config: WebhookUrlTemplate | undefined, taskName: string): string | undefined {\n if (!config) return undefined;\n if (typeof config === 'string') return config;\n\n if (!config.template) return undefined;\n if (config.tools === undefined) return config.template;\n if (Array.isArray(config.tools)) {\n return config.tools.includes(taskName) ? config.template : undefined;\n }\n\n return config.tools(taskName) ? config.template : undefined;\n}\n\nexport function resolveWebhookUrl(\n config: WebhookUrlTemplate | undefined,\n agentId: string | undefined,\n taskName: string,\n operationId: string,\n options?: Pick<TaskOptions, 'disableWebhook'>\n): string | undefined {\n if (options?.disableWebhook || !agentId) return undefined;\n\n const template = selectWebhookTemplate(config, taskName);\n if (!template) return undefined;\n\n return template\n .replace(/{agent_id}/g, agentId)\n .replace(/{task_type}/g, taskName)\n .replace(/{operation_id}/g, operationId);\n}\n"],"mappings":";;;;;;AAEO,SAAS,sBAAsB,QAAwC,UAAsC;AAClH,MAAI,CAAC,OAAQ,QAAO;AACpB,MAAI,OAAO,WAAW,SAAU,QAAO;AAEvC,MAAI,CAAC,OAAO,SAAU,QAAO;AAC7B,MAAI,OAAO,UAAU,OAAW,QAAO,OAAO;AAC9C,MAAI,MAAM,QAAQ,OAAO,KAAK,GAAG;AAC/B,WAAO,OAAO,MAAM,SAAS,QAAQ,IAAI,OAAO,WAAW;AAAA,EAC7D;AAEA,SAAO,OAAO,MAAM,QAAQ,IAAI,OAAO,WAAW;AACpD;AAEO,SAAS,kBACd,QACA,SACA,UACA,aACA,SACoB;AACpB,MAAI,SAAS,kBAAkB,CAAC,QAAS,QAAO;AAEhD,QAAM,WAAW,sBAAsB,QAAQ,QAAQ;AACvD,MAAI,CAAC,SAAU,QAAO;AAEtB,SAAO,SACJ,QAAQ,eAAe,OAAO,EAC9B,QAAQ,gBAAgB,QAAQ,EAChC,QAAQ,mBAAmB,WAAW;AAC3C;","names":[]}
1
+ {"version":3,"sources":["../../../src/lib/core/webhook-url.ts"],"sourcesContent":["import type { TaskOptions, WebhookUrlTemplate } from './ConversationTypes';\n\nexport function selectWebhookTemplate(config: WebhookUrlTemplate | undefined, taskName: string): string | undefined {\n if (!config) return undefined;\n if (typeof config === 'string') return config;\n\n if (!config.template) return undefined;\n if (config.tools === undefined) return config.template;\n if (Array.isArray(config.tools)) {\n return config.tools.includes(taskName) ? config.template : undefined;\n }\n\n return config.tools(taskName) ? config.template : undefined;\n}\n\nexport function resolveWebhookUrl(\n config: WebhookUrlTemplate | undefined,\n agentId: string | undefined,\n taskName: string,\n operationId: string,\n options?: Pick<TaskOptions, 'disableWebhook'>\n): string | undefined {\n if (options?.disableWebhook || !agentId) return undefined;\n\n const template = selectWebhookTemplate(config, taskName);\n if (!template) return undefined;\n\n return template\n .replace(/{agent_id}/g, agentId)\n .replace(/{task_type}/g, taskName)\n .replace(/{operation_id}/g, operationId);\n}\n"],"mappings":"AAEO,SAAS,sBAAsB,QAAwC,UAAsC;AAClH,MAAI,CAAC,OAAQ,QAAO;AACpB,MAAI,OAAO,WAAW,SAAU,QAAO;AAEvC,MAAI,CAAC,OAAO,SAAU,QAAO;AAC7B,MAAI,OAAO,UAAU,OAAW,QAAO,OAAO;AAC9C,MAAI,MAAM,QAAQ,OAAO,KAAK,GAAG;AAC/B,WAAO,OAAO,MAAM,SAAS,QAAQ,IAAI,OAAO,WAAW;AAAA,EAC7D;AAEA,SAAO,OAAO,MAAM,QAAQ,IAAI,OAAO,WAAW;AACpD;AAEO,SAAS,kBACd,QACA,SACA,UACA,aACA,SACoB;AACpB,MAAI,SAAS,kBAAkB,CAAC,QAAS,QAAO;AAEhD,QAAM,WAAW,sBAAsB,QAAQ,QAAQ;AACvD,MAAI,CAAC,SAAU,QAAO;AAEtB,SAAO,SACJ,QAAQ,eAAe,OAAO,EAC9B,QAAQ,gBAAgB,QAAQ,EAChC,QAAQ,mBAAmB,WAAW;AAC3C;","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 { parse as parseTld } from "tldts";
8
2
  import { ssrfSafeFetch } from "../net/ssrf-fetch.mjs";
9
3
  import { isInternalProbesAllowed } from "../utils/probe-policy.mjs";
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/discovery/adagents-redirects.ts"],"sourcesContent":["import { parse as parseTld } from 'tldts';\n\nimport { ssrfSafeFetch, type SsrfFetchOptions, type SsrfFetchResult } from '../net/ssrf-fetch';\nimport { isInternalProbesAllowed } from '../utils/probe-policy';\n\nconst REDIRECT_STATUSES = new Set([301, 302, 303, 307, 308]);\nconst DEFAULT_WELL_KNOWN_REDIRECT_HOPS = 3;\n\nexport type AdAgentsRedirectRefusalCode =\n | 'redirect_refused'\n | 'redirect_missing_location'\n | 'redirect_scheme_changed'\n | 'redirect_cross_registrable_domain'\n | 'redirect_userinfo_not_allowed'\n | 'redirect_too_many';\n\nexport class AdAgentsRedirectRefusedError extends Error {\n readonly code: AdAgentsRedirectRefusalCode;\n readonly url: string;\n readonly location?: string;\n\n constructor(code: AdAgentsRedirectRefusalCode, message: string, meta: { url: string; location?: string }) {\n super(message);\n this.name = 'AdAgentsRedirectRefusedError';\n this.code = code;\n this.url = meta.url;\n this.location = meta.location;\n }\n}\n\nexport type AdAgentsRedirectPolicy =\n | { mode: 'none' }\n | { mode: 'same-registrable-domain'; originUrl: string; maxRedirects?: number };\n\nexport async function ssrfSafeFetchAdAgents(\n url: string,\n options: SsrfFetchOptions,\n policy: AdAgentsRedirectPolicy\n): Promise<SsrfFetchResult> {\n let currentUrl = url;\n let redirects = 0;\n const originUrl = policy.mode === 'same-registrable-domain' ? policy.originUrl : url;\n const maxRedirects =\n policy.mode === 'same-registrable-domain' ? (policy.maxRedirects ?? DEFAULT_WELL_KNOWN_REDIRECT_HOPS) : 0;\n\n while (true) {\n const result = await ssrfSafeFetch(currentUrl, options);\n if (!REDIRECT_STATUSES.has(result.status)) return result;\n\n const location = result.headers['location'];\n if (!location) {\n throw new AdAgentsRedirectRefusedError(\n 'redirect_missing_location',\n `HTTP ${result.status} redirect with no Location header`,\n { url: currentUrl }\n );\n }\n\n let next: URL;\n try {\n next = new URL(location, currentUrl);\n } catch {\n throw new AdAgentsRedirectRefusedError('redirect_refused', 'Invalid adagents.json redirect URL', {\n url: currentUrl,\n });\n }\n const nextUrl = next.toString();\n if (next.username || next.password) {\n throw new AdAgentsRedirectRefusedError(\n 'redirect_userinfo_not_allowed',\n 'adagents.json redirect must not include userinfo',\n { url: currentUrl, location: scrubUrl(next) }\n );\n }\n\n if (policy.mode === 'none') {\n throw new AdAgentsRedirectRefusedError(\n 'redirect_refused',\n 'Redirect refused while fetching authoritative adagents.json',\n { url: currentUrl, location: scrubUrl(next) }\n );\n }\n\n if (redirects >= maxRedirects) {\n throw new AdAgentsRedirectRefusedError(\n 'redirect_too_many',\n `Too many adagents.json redirects; maximum is ${maxRedirects}`,\n { url: currentUrl, location: scrubUrl(next) }\n );\n }\n\n validateSameRegistrableDomainRedirect(originUrl, currentUrl, nextUrl);\n redirects++;\n currentUrl = nextUrl;\n }\n}\n\nexport function validateSameRegistrableDomainRedirect(originUrl: string, currentUrl: string, nextUrl: string): void {\n let origin: URL;\n let next: URL;\n try {\n origin = new URL(originUrl);\n new URL(currentUrl);\n next = new URL(nextUrl);\n } catch {\n throw new AdAgentsRedirectRefusedError('redirect_refused', 'Invalid adagents.json redirect URL', {\n url: currentUrl,\n });\n }\n\n if (next.protocol !== origin.protocol) {\n throw new AdAgentsRedirectRefusedError('redirect_scheme_changed', 'adagents.json redirect changed scheme', {\n url: currentUrl,\n location: scrubUrl(next),\n });\n }\n\n if (!sameRegistrableDomain(origin, next)) {\n throw new AdAgentsRedirectRefusedError(\n 'redirect_cross_registrable_domain',\n 'adagents.json redirect crosses registrable domain',\n { url: currentUrl, location: scrubUrl(next) }\n );\n }\n}\n\nexport function sameRegistrableDomain(a: URL, b: URL): boolean {\n const aDomain = registrableDomain(a.hostname);\n const bDomain = registrableDomain(b.hostname);\n if (aDomain && bDomain) return aDomain === bDomain;\n\n // Loopback tests run through http://127.0.0.1 under the explicit internal\n // probe opt-in. Production publisher discovery should not treat IP literals\n // as registrable domains.\n return isInternalProbesAllowed() && a.hostname === b.hostname;\n}\n\nfunction registrableDomain(hostname: string): string | null {\n const parsed = parseTld(hostname, { allowPrivateDomains: true });\n if (parsed.isIp || !parsed.domain) return null;\n return parsed.domain.toLowerCase();\n}\n\nfunction scrubUrl(url: URL): string {\n const scrubbed = new URL(url.toString());\n scrubbed.username = '';\n scrubbed.password = '';\n scrubbed.search = '';\n scrubbed.hash = '';\n return scrubbed.toString();\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/lib/discovery/adagents-redirects.ts"],"sourcesContent":["import { parse as parseTld } from 'tldts';\n\nimport { ssrfSafeFetch, type SsrfFetchOptions, type SsrfFetchResult } from '../net/ssrf-fetch';\nimport { isInternalProbesAllowed } from '../utils/probe-policy';\n\nconst REDIRECT_STATUSES = new Set([301, 302, 303, 307, 308]);\nconst DEFAULT_WELL_KNOWN_REDIRECT_HOPS = 3;\n\nexport type AdAgentsRedirectRefusalCode =\n | 'redirect_refused'\n | 'redirect_missing_location'\n | 'redirect_scheme_changed'\n | 'redirect_cross_registrable_domain'\n | 'redirect_userinfo_not_allowed'\n | 'redirect_too_many';\n\nexport class AdAgentsRedirectRefusedError extends Error {\n readonly code: AdAgentsRedirectRefusalCode;\n readonly url: string;\n readonly location?: string;\n\n constructor(code: AdAgentsRedirectRefusalCode, message: string, meta: { url: string; location?: string }) {\n super(message);\n this.name = 'AdAgentsRedirectRefusedError';\n this.code = code;\n this.url = meta.url;\n this.location = meta.location;\n }\n}\n\nexport type AdAgentsRedirectPolicy =\n | { mode: 'none' }\n | { mode: 'same-registrable-domain'; originUrl: string; maxRedirects?: number };\n\nexport async function ssrfSafeFetchAdAgents(\n url: string,\n options: SsrfFetchOptions,\n policy: AdAgentsRedirectPolicy\n): Promise<SsrfFetchResult> {\n let currentUrl = url;\n let redirects = 0;\n const originUrl = policy.mode === 'same-registrable-domain' ? policy.originUrl : url;\n const maxRedirects =\n policy.mode === 'same-registrable-domain' ? (policy.maxRedirects ?? DEFAULT_WELL_KNOWN_REDIRECT_HOPS) : 0;\n\n while (true) {\n const result = await ssrfSafeFetch(currentUrl, options);\n if (!REDIRECT_STATUSES.has(result.status)) return result;\n\n const location = result.headers['location'];\n if (!location) {\n throw new AdAgentsRedirectRefusedError(\n 'redirect_missing_location',\n `HTTP ${result.status} redirect with no Location header`,\n { url: currentUrl }\n );\n }\n\n let next: URL;\n try {\n next = new URL(location, currentUrl);\n } catch {\n throw new AdAgentsRedirectRefusedError('redirect_refused', 'Invalid adagents.json redirect URL', {\n url: currentUrl,\n });\n }\n const nextUrl = next.toString();\n if (next.username || next.password) {\n throw new AdAgentsRedirectRefusedError(\n 'redirect_userinfo_not_allowed',\n 'adagents.json redirect must not include userinfo',\n { url: currentUrl, location: scrubUrl(next) }\n );\n }\n\n if (policy.mode === 'none') {\n throw new AdAgentsRedirectRefusedError(\n 'redirect_refused',\n 'Redirect refused while fetching authoritative adagents.json',\n { url: currentUrl, location: scrubUrl(next) }\n );\n }\n\n if (redirects >= maxRedirects) {\n throw new AdAgentsRedirectRefusedError(\n 'redirect_too_many',\n `Too many adagents.json redirects; maximum is ${maxRedirects}`,\n { url: currentUrl, location: scrubUrl(next) }\n );\n }\n\n validateSameRegistrableDomainRedirect(originUrl, currentUrl, nextUrl);\n redirects++;\n currentUrl = nextUrl;\n }\n}\n\nexport function validateSameRegistrableDomainRedirect(originUrl: string, currentUrl: string, nextUrl: string): void {\n let origin: URL;\n let next: URL;\n try {\n origin = new URL(originUrl);\n new URL(currentUrl);\n next = new URL(nextUrl);\n } catch {\n throw new AdAgentsRedirectRefusedError('redirect_refused', 'Invalid adagents.json redirect URL', {\n url: currentUrl,\n });\n }\n\n if (next.protocol !== origin.protocol) {\n throw new AdAgentsRedirectRefusedError('redirect_scheme_changed', 'adagents.json redirect changed scheme', {\n url: currentUrl,\n location: scrubUrl(next),\n });\n }\n\n if (!sameRegistrableDomain(origin, next)) {\n throw new AdAgentsRedirectRefusedError(\n 'redirect_cross_registrable_domain',\n 'adagents.json redirect crosses registrable domain',\n { url: currentUrl, location: scrubUrl(next) }\n );\n }\n}\n\nexport function sameRegistrableDomain(a: URL, b: URL): boolean {\n const aDomain = registrableDomain(a.hostname);\n const bDomain = registrableDomain(b.hostname);\n if (aDomain && bDomain) return aDomain === bDomain;\n\n // Loopback tests run through http://127.0.0.1 under the explicit internal\n // probe opt-in. Production publisher discovery should not treat IP literals\n // as registrable domains.\n return isInternalProbesAllowed() && a.hostname === b.hostname;\n}\n\nfunction registrableDomain(hostname: string): string | null {\n const parsed = parseTld(hostname, { allowPrivateDomains: true });\n if (parsed.isIp || !parsed.domain) return null;\n return parsed.domain.toLowerCase();\n}\n\nfunction scrubUrl(url: URL): string {\n const scrubbed = new URL(url.toString());\n scrubbed.username = '';\n scrubbed.password = '';\n scrubbed.search = '';\n scrubbed.hash = '';\n return scrubbed.toString();\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 { ssrfSafeFetch, SsrfRefusedError, decodeBodyAsJsonOrText } from "../net/ssrf-fetch.mjs";
8
2
  import { isInternalProbesAllowed } from "../utils/probe-policy.mjs";
9
3
  import { LIBRARY_VERSION } from "../version.mjs";
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/discovery/agent-directory.ts"],"sourcesContent":["/**\n * AAO Directory inverse-lookup wrapper per\n * [adcontextprotocol/adcp#4823](https://github.com/adcontextprotocol/adcp/issues/4823)\n * (spec PR [adcp#4828](https://github.com/adcontextprotocol/adcp/pull/4828)).\n *\n * Given an `agent_url`, fetch the set of publishers whose adagents.json\n * authorizes it from an AAO-compatible directory via\n * `GET /v1/agents/{agent_url}/publishers`. Returns an async iterator that\n * pages transparently — consumers iterate `PublisherEntry` values without\n * managing cursors.\n *\n * **Trust model.** The directory is discovery, not authorization. Each\n * `PublisherEntry` tells the operator which publisher's adagents.json to\n * verify directly via the SDK's per-domain primitives (`fetchAdAgents`,\n * `resolveAgentProperties`). The directory's `properties_authorized` and\n * `status` are operator-facing summaries; the publisher's own file remains\n * the trust root.\n *\n * **SSRF safety.** Outbound HTTP routes through {@link ssrfSafeFetch} —\n * private IPs, link-local, loopback, and metadata-service hosts are\n * refused. Adopters who centralize their directory on an internal host\n * must enable internal probes via the SDK's probe-policy.\n *\n * @public\n */\n\nimport { ssrfSafeFetch, SsrfRefusedError, decodeBodyAsJsonOrText } from '../net/ssrf-fetch';\nimport { isInternalProbesAllowed } from '../utils/probe-policy';\nimport { LIBRARY_VERSION } from '../version';\nimport { validateUserAgent } from '../utils/validate-user-agent';\n\n/**\n * Discovery provenance for a publisher → agent edge. Mirrors the\n * `discovery_method` enum on the AAO directory response. See the AAO\n * `agent-publishers.json` schema for trust-profile notes per value.\n */\nexport type DirectoryDiscoveryMethod =\n | 'direct'\n | 'authoritative_location'\n | 'adagents_authoritative'\n | 'ads_txt_managerdomain';\n\n/** Lifecycle state for a publisher → agent edge. */\nexport type DirectoryPublisherStatus = 'authorized' | 'revoked';\n\n/** Per-publisher entry in the directory's inverse-lookup response. */\nexport interface DirectoryPublisherEntry {\n publisher_domain: string;\n discovery_method: DirectoryDiscoveryMethod;\n /**\n * Manager file domain. Required when `discovery_method` is not `direct`;\n * null/absent for direct discovery.\n */\n manager_domain?: string | null;\n /**\n * Count of properties under THIS `publisher_domain` only that the\n * agent's selectors resolve to. Per-publisher count, never network-wide.\n */\n properties_authorized: number;\n /**\n * Count of properties under THIS `publisher_domain` only — total\n * inventory the publisher's file declares. Per-publisher count.\n */\n properties_total: number;\n /**\n * Whether the publisher's adagents.json entry for this agent pins\n * `signing_keys[]`. When true, signed responses MUST verify against\n * the pinned key set regardless of the agent's own JWKS.\n */\n signing_keys_pinned?: boolean;\n status: DirectoryPublisherStatus;\n /**\n * When the directory last fetched and validated this publisher's\n * adagents.json. Per-publisher freshness, distinct from the envelope's\n * `directory_indexed_at`.\n */\n last_verified_at: string;\n}\n\n/**\n * Single-page response envelope from\n * `GET /v1/agents/{agent_url}/publishers`. Mirrors the AAO\n * `agent-publishers.json` schema.\n */\nexport interface DirectoryLookupPage {\n /** Canonicalized echo of the agent_url that was looked up. */\n agent_url: string;\n /**\n * When the directory last completed a refresh of any publisher in this\n * result. NULL on empty pages — treat null as \"no freshness assertion\"\n * and do not advance local cache freshness.\n */\n directory_indexed_at: string | null;\n publishers: DirectoryPublisherEntry[];\n /** Opaque pagination cursor. Absent or null on the terminal page. */\n next_cursor?: string | null;\n}\n\n/**\n * Options for {@link fetchAgentAuthorizationsFromDirectory}.\n */\nexport interface FetchAgentAuthorizationsOptions {\n /**\n * Base URL of the AAO-compatible directory (e.g.\n * `https://aao.example.com`). Required — adopters explicitly pick which\n * directory they trust. The SDK does not default to a canonical AAO\n * host because directory choice is an operator decision.\n */\n directoryUrl: string;\n /** Return only entries verified after this timestamp. */\n since?: Date;\n /** Filter by lifecycle status. Default is server-defined. */\n status?: ReadonlyArray<DirectoryPublisherStatus>;\n /** Resume from a specific cursor (use the value from a prior page's `next_cursor`). */\n cursor?: string;\n /** Per-page size hint. The directory MAY enforce a lower cap. */\n limit?: number;\n /** Per-request timeout in milliseconds. Defaults to 30_000. */\n timeoutMs?: number;\n /** Custom `User-Agent` for outbound requests. */\n userAgent?: string;\n /**\n * AbortSignal that cancels both in-flight requests and the async\n * iterator. Once aborted, the iterator throws on the next `.next()` call.\n */\n signal?: AbortSignal;\n}\n\n/**\n * Iteration result. The iterator yields entries one-at-a-time across all\n * pages. After the terminal page is exhausted, iteration ends — no\n * sentinel value is emitted.\n */\nexport interface AgentAuthorizationsIterator extends AsyncIterableIterator<DirectoryPublisherEntry> {\n /**\n * Drain the iterator into an array. Convenience for small result sets;\n * adopters with potentially-large directories should iterate to bound\n * memory.\n */\n toArray(): Promise<DirectoryPublisherEntry[]>;\n}\n\nconst DEFAULT_TIMEOUT_MS = 30_000;\n/** Cap on a single directory response. AAO pages are typically <100 KiB. */\nconst MAX_RESPONSE_BYTES = 4 * 1024 * 1024;\n/**\n * Safety bound on total pages fetched. Prevents an infinite-loop bug in\n * the directory (or a hostile directory) from running the iterator forever.\n */\nconst MAX_PAGES = 10_000;\n\n/**\n * Fetch the set of publishers whose adagents.json authorizes `agentUrl`,\n * from an AAO-compatible directory. Returns an async iterator that yields\n * `DirectoryPublisherEntry` values across all pages.\n *\n * @example\n * ```ts\n * for await (const pub of fetchAgentAuthorizationsFromDirectory(myAgentUrl, {\n * directoryUrl: 'https://aao.example.com',\n * status: ['authorized'],\n * })) {\n * console.log(pub.publisher_domain, pub.properties_authorized);\n * }\n * ```\n *\n * @example Drain to array (small directories only):\n * ```ts\n * const iter = fetchAgentAuthorizationsFromDirectory(myAgentUrl, {\n * directoryUrl: 'https://aao.example.com',\n * });\n * const allPublishers = await iter.toArray();\n * ```\n */\nexport function fetchAgentAuthorizationsFromDirectory(\n agentUrl: string,\n options: FetchAgentAuthorizationsOptions\n): AgentAuthorizationsIterator {\n if (typeof agentUrl !== 'string' || agentUrl.length === 0) {\n throw new TypeError('fetchAgentAuthorizationsFromDirectory: agentUrl is required');\n }\n if (!options || typeof options.directoryUrl !== 'string' || options.directoryUrl.length === 0) {\n throw new TypeError('fetchAgentAuthorizationsFromDirectory: options.directoryUrl is required');\n }\n if (options.userAgent !== undefined) {\n validateUserAgent(options.userAgent);\n }\n\n const state: IteratorState = {\n agentUrl,\n options,\n cursor: options.cursor,\n pageIndex: 0,\n currentBatch: [],\n nextBatchIndex: 0,\n done: false,\n };\n\n const iter: AgentAuthorizationsIterator = {\n next: () => advance(state),\n return: async (value?: unknown) => {\n state.done = true;\n return { value, done: true } as IteratorResult<DirectoryPublisherEntry, unknown>;\n },\n throw: async (err?: unknown) => {\n state.done = true;\n throw err;\n },\n [Symbol.asyncIterator](): AgentAuthorizationsIterator {\n return this;\n },\n async toArray(): Promise<DirectoryPublisherEntry[]> {\n const out: DirectoryPublisherEntry[] = [];\n for await (const entry of this) out.push(entry);\n return out;\n },\n };\n\n return iter;\n}\n\ninterface IteratorState {\n agentUrl: string;\n options: FetchAgentAuthorizationsOptions;\n cursor: string | undefined;\n pageIndex: number;\n currentBatch: DirectoryPublisherEntry[];\n nextBatchIndex: number;\n done: boolean;\n}\n\nasync function advance(state: IteratorState): Promise<IteratorResult<DirectoryPublisherEntry>> {\n if (state.done) return { value: undefined, done: true };\n\n while (state.nextBatchIndex >= state.currentBatch.length) {\n if (state.pageIndex > 0 && state.cursor === undefined) {\n state.done = true;\n return { value: undefined, done: true };\n }\n if (state.pageIndex >= MAX_PAGES) {\n throw new Error(\n `fetchAgentAuthorizationsFromDirectory: refused to fetch beyond ${MAX_PAGES} pages — directory may be looping`\n );\n }\n const page = await fetchPage(state.agentUrl, state.options, state.cursor);\n state.pageIndex++;\n state.currentBatch = page.publishers;\n state.nextBatchIndex = 0;\n state.cursor = page.next_cursor ?? undefined;\n if (page.publishers.length === 0 && (state.cursor === undefined || state.cursor === null)) {\n state.done = true;\n return { value: undefined, done: true };\n }\n }\n\n const entry = state.currentBatch[state.nextBatchIndex];\n state.nextBatchIndex++;\n return { value: entry as DirectoryPublisherEntry, done: false };\n}\n\nasync function fetchPage(\n agentUrl: string,\n options: FetchAgentAuthorizationsOptions,\n cursor: string | undefined\n): Promise<DirectoryLookupPage> {\n const url = buildDirectoryUrl(options.directoryUrl, agentUrl, {\n since: options.since,\n status: options.status,\n cursor,\n limit: options.limit,\n });\n\n const headers: Record<string, string> = {\n accept: 'application/json',\n 'user-agent': options.userAgent ?? `@adcp/client/${LIBRARY_VERSION}`,\n };\n\n let response;\n try {\n response = await ssrfSafeFetch(url, {\n method: 'GET',\n headers,\n timeoutMs: options.timeoutMs ?? DEFAULT_TIMEOUT_MS,\n maxBodyBytes: MAX_RESPONSE_BYTES,\n allowPrivateIp: isInternalProbesAllowed(),\n signal: options.signal,\n });\n } catch (err) {\n if (err instanceof SsrfRefusedError) {\n throw new Error(`fetchAgentAuthorizationsFromDirectory: SSRF guard refused ${url}: ${err.code}`);\n }\n throw err;\n }\n\n if (response.status < 200 || response.status >= 300) {\n throw new Error(`fetchAgentAuthorizationsFromDirectory: directory returned HTTP ${response.status} for ${url}`);\n }\n\n const decoded = decodeBodyAsJsonOrText(response.body, response.headers['content-type']);\n if (decoded === null || typeof decoded !== 'object' || Array.isArray(decoded)) {\n throw new Error(`fetchAgentAuthorizationsFromDirectory: directory response was not a JSON object (${url})`);\n }\n\n return parseDirectoryPage(decoded, url);\n}\n\n/**\n * Parse a raw directory response into a {@link DirectoryLookupPage},\n * applying defensive checks on counterparty-controlled fields. Throws\n * descriptive errors when the response shape violates the schema; the\n * iterator surfaces these unchanged.\n */\nfunction parseDirectoryPage(raw: unknown, url: string): DirectoryLookupPage {\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) {\n throw new Error(`directory response is not a JSON object (${url})`);\n }\n const obj = raw as Record<string, unknown>;\n\n const agent_url = obj.agent_url;\n if (typeof agent_url !== 'string') {\n throw new Error(`directory response missing 'agent_url' string (${url})`);\n }\n const indexed = obj.directory_indexed_at;\n if (indexed !== null && typeof indexed !== 'string') {\n throw new Error(`directory response 'directory_indexed_at' must be string or null (${url})`);\n }\n const publishersRaw = obj.publishers;\n if (!Array.isArray(publishersRaw)) {\n throw new Error(`directory response 'publishers' must be an array (${url})`);\n }\n\n const publishers: DirectoryPublisherEntry[] = [];\n for (const p of publishersRaw) {\n const entry = parsePublisherEntry(p);\n if (entry !== null) publishers.push(entry);\n }\n\n const next_cursor =\n typeof obj.next_cursor === 'string' ? obj.next_cursor : obj.next_cursor === null ? null : undefined;\n\n return {\n agent_url,\n directory_indexed_at: indexed ?? null,\n publishers,\n next_cursor,\n };\n}\n\nfunction parsePublisherEntry(raw: unknown): DirectoryPublisherEntry | null {\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) return null;\n const o = raw as Record<string, unknown>;\n if (typeof o.publisher_domain !== 'string') return null;\n if (typeof o.discovery_method !== 'string') return null;\n if (!isDiscoveryMethod(o.discovery_method)) return null;\n if (!Number.isFinite(o.properties_authorized) || (o.properties_authorized as number) < 0) return null;\n if (!Number.isFinite(o.properties_total) || (o.properties_total as number) < 0) return null;\n if (o.status !== 'authorized' && o.status !== 'revoked') return null;\n if (typeof o.last_verified_at !== 'string') return null;\n\n // Per the `agent-publishers.json` schema's `allOf` conditional: when\n // `discovery_method` is anything other than `direct`, `manager_domain`\n // is required. Drop rows that violate this — the directory has nothing\n // to anchor the cross-publisher trust on, and a downstream consumer\n // would have no manager file to verify against. Witness, not translator.\n if (o.discovery_method !== 'direct' && typeof o.manager_domain !== 'string') {\n return null;\n }\n\n const entry: DirectoryPublisherEntry = {\n publisher_domain: o.publisher_domain,\n discovery_method: o.discovery_method as DirectoryDiscoveryMethod,\n properties_authorized: o.properties_authorized as number,\n properties_total: o.properties_total as number,\n status: o.status as DirectoryPublisherStatus,\n last_verified_at: o.last_verified_at,\n };\n if (typeof o.manager_domain === 'string') entry.manager_domain = o.manager_domain;\n else if (o.manager_domain === null) entry.manager_domain = null;\n if (typeof o.signing_keys_pinned === 'boolean') entry.signing_keys_pinned = o.signing_keys_pinned;\n return entry;\n}\n\nfunction isDiscoveryMethod(s: string): s is DirectoryDiscoveryMethod {\n return (\n s === 'direct' || s === 'authoritative_location' || s === 'adagents_authoritative' || s === 'ads_txt_managerdomain'\n );\n}\n\nfunction buildDirectoryUrl(\n base: string,\n agentUrl: string,\n query: {\n since?: Date;\n status?: ReadonlyArray<DirectoryPublisherStatus>;\n cursor?: string;\n limit?: number;\n }\n): string {\n const trimmed = base.endsWith('/') ? base.slice(0, -1) : base;\n const u = new URL(`${trimmed}/v1/agents/${encodeURIComponent(agentUrl)}/publishers`);\n if (query.since) u.searchParams.set('since', query.since.toISOString());\n if (query.status && query.status.length > 0) {\n for (const s of query.status) u.searchParams.append('status', s);\n }\n if (query.cursor) u.searchParams.set('cursor', query.cursor);\n if (typeof query.limit === 'number' && query.limit > 0) {\n u.searchParams.set('limit', String(Math.floor(query.limit)));\n }\n return u.toString();\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/lib/discovery/agent-directory.ts"],"sourcesContent":["/**\n * AAO Directory inverse-lookup wrapper per\n * [adcontextprotocol/adcp#4823](https://github.com/adcontextprotocol/adcp/issues/4823)\n * (spec PR [adcp#4828](https://github.com/adcontextprotocol/adcp/pull/4828)).\n *\n * Given an `agent_url`, fetch the set of publishers whose adagents.json\n * authorizes it from an AAO-compatible directory via\n * `GET /v1/agents/{agent_url}/publishers`. Returns an async iterator that\n * pages transparently — consumers iterate `PublisherEntry` values without\n * managing cursors.\n *\n * **Trust model.** The directory is discovery, not authorization. Each\n * `PublisherEntry` tells the operator which publisher's adagents.json to\n * verify directly via the SDK's per-domain primitives (`fetchAdAgents`,\n * `resolveAgentProperties`). The directory's `properties_authorized` and\n * `status` are operator-facing summaries; the publisher's own file remains\n * the trust root.\n *\n * **SSRF safety.** Outbound HTTP routes through {@link ssrfSafeFetch} —\n * private IPs, link-local, loopback, and metadata-service hosts are\n * refused. Adopters who centralize their directory on an internal host\n * must enable internal probes via the SDK's probe-policy.\n *\n * @public\n */\n\nimport { ssrfSafeFetch, SsrfRefusedError, decodeBodyAsJsonOrText } from '../net/ssrf-fetch';\nimport { isInternalProbesAllowed } from '../utils/probe-policy';\nimport { LIBRARY_VERSION } from '../version';\nimport { validateUserAgent } from '../utils/validate-user-agent';\n\n/**\n * Discovery provenance for a publisher → agent edge. Mirrors the\n * `discovery_method` enum on the AAO directory response. See the AAO\n * `agent-publishers.json` schema for trust-profile notes per value.\n */\nexport type DirectoryDiscoveryMethod =\n | 'direct'\n | 'authoritative_location'\n | 'adagents_authoritative'\n | 'ads_txt_managerdomain';\n\n/** Lifecycle state for a publisher → agent edge. */\nexport type DirectoryPublisherStatus = 'authorized' | 'revoked';\n\n/** Per-publisher entry in the directory's inverse-lookup response. */\nexport interface DirectoryPublisherEntry {\n publisher_domain: string;\n discovery_method: DirectoryDiscoveryMethod;\n /**\n * Manager file domain. Required when `discovery_method` is not `direct`;\n * null/absent for direct discovery.\n */\n manager_domain?: string | null;\n /**\n * Count of properties under THIS `publisher_domain` only that the\n * agent's selectors resolve to. Per-publisher count, never network-wide.\n */\n properties_authorized: number;\n /**\n * Count of properties under THIS `publisher_domain` only — total\n * inventory the publisher's file declares. Per-publisher count.\n */\n properties_total: number;\n /**\n * Whether the publisher's adagents.json entry for this agent pins\n * `signing_keys[]`. When true, signed responses MUST verify against\n * the pinned key set regardless of the agent's own JWKS.\n */\n signing_keys_pinned?: boolean;\n status: DirectoryPublisherStatus;\n /**\n * When the directory last fetched and validated this publisher's\n * adagents.json. Per-publisher freshness, distinct from the envelope's\n * `directory_indexed_at`.\n */\n last_verified_at: string;\n}\n\n/**\n * Single-page response envelope from\n * `GET /v1/agents/{agent_url}/publishers`. Mirrors the AAO\n * `agent-publishers.json` schema.\n */\nexport interface DirectoryLookupPage {\n /** Canonicalized echo of the agent_url that was looked up. */\n agent_url: string;\n /**\n * When the directory last completed a refresh of any publisher in this\n * result. NULL on empty pages — treat null as \"no freshness assertion\"\n * and do not advance local cache freshness.\n */\n directory_indexed_at: string | null;\n publishers: DirectoryPublisherEntry[];\n /** Opaque pagination cursor. Absent or null on the terminal page. */\n next_cursor?: string | null;\n}\n\n/**\n * Options for {@link fetchAgentAuthorizationsFromDirectory}.\n */\nexport interface FetchAgentAuthorizationsOptions {\n /**\n * Base URL of the AAO-compatible directory (e.g.\n * `https://aao.example.com`). Required — adopters explicitly pick which\n * directory they trust. The SDK does not default to a canonical AAO\n * host because directory choice is an operator decision.\n */\n directoryUrl: string;\n /** Return only entries verified after this timestamp. */\n since?: Date;\n /** Filter by lifecycle status. Default is server-defined. */\n status?: ReadonlyArray<DirectoryPublisherStatus>;\n /** Resume from a specific cursor (use the value from a prior page's `next_cursor`). */\n cursor?: string;\n /** Per-page size hint. The directory MAY enforce a lower cap. */\n limit?: number;\n /** Per-request timeout in milliseconds. Defaults to 30_000. */\n timeoutMs?: number;\n /** Custom `User-Agent` for outbound requests. */\n userAgent?: string;\n /**\n * AbortSignal that cancels both in-flight requests and the async\n * iterator. Once aborted, the iterator throws on the next `.next()` call.\n */\n signal?: AbortSignal;\n}\n\n/**\n * Iteration result. The iterator yields entries one-at-a-time across all\n * pages. After the terminal page is exhausted, iteration ends — no\n * sentinel value is emitted.\n */\nexport interface AgentAuthorizationsIterator extends AsyncIterableIterator<DirectoryPublisherEntry> {\n /**\n * Drain the iterator into an array. Convenience for small result sets;\n * adopters with potentially-large directories should iterate to bound\n * memory.\n */\n toArray(): Promise<DirectoryPublisherEntry[]>;\n}\n\nconst DEFAULT_TIMEOUT_MS = 30_000;\n/** Cap on a single directory response. AAO pages are typically <100 KiB. */\nconst MAX_RESPONSE_BYTES = 4 * 1024 * 1024;\n/**\n * Safety bound on total pages fetched. Prevents an infinite-loop bug in\n * the directory (or a hostile directory) from running the iterator forever.\n */\nconst MAX_PAGES = 10_000;\n\n/**\n * Fetch the set of publishers whose adagents.json authorizes `agentUrl`,\n * from an AAO-compatible directory. Returns an async iterator that yields\n * `DirectoryPublisherEntry` values across all pages.\n *\n * @example\n * ```ts\n * for await (const pub of fetchAgentAuthorizationsFromDirectory(myAgentUrl, {\n * directoryUrl: 'https://aao.example.com',\n * status: ['authorized'],\n * })) {\n * console.log(pub.publisher_domain, pub.properties_authorized);\n * }\n * ```\n *\n * @example Drain to array (small directories only):\n * ```ts\n * const iter = fetchAgentAuthorizationsFromDirectory(myAgentUrl, {\n * directoryUrl: 'https://aao.example.com',\n * });\n * const allPublishers = await iter.toArray();\n * ```\n */\nexport function fetchAgentAuthorizationsFromDirectory(\n agentUrl: string,\n options: FetchAgentAuthorizationsOptions\n): AgentAuthorizationsIterator {\n if (typeof agentUrl !== 'string' || agentUrl.length === 0) {\n throw new TypeError('fetchAgentAuthorizationsFromDirectory: agentUrl is required');\n }\n if (!options || typeof options.directoryUrl !== 'string' || options.directoryUrl.length === 0) {\n throw new TypeError('fetchAgentAuthorizationsFromDirectory: options.directoryUrl is required');\n }\n if (options.userAgent !== undefined) {\n validateUserAgent(options.userAgent);\n }\n\n const state: IteratorState = {\n agentUrl,\n options,\n cursor: options.cursor,\n pageIndex: 0,\n currentBatch: [],\n nextBatchIndex: 0,\n done: false,\n };\n\n const iter: AgentAuthorizationsIterator = {\n next: () => advance(state),\n return: async (value?: unknown) => {\n state.done = true;\n return { value, done: true } as IteratorResult<DirectoryPublisherEntry, unknown>;\n },\n throw: async (err?: unknown) => {\n state.done = true;\n throw err;\n },\n [Symbol.asyncIterator](): AgentAuthorizationsIterator {\n return this;\n },\n async toArray(): Promise<DirectoryPublisherEntry[]> {\n const out: DirectoryPublisherEntry[] = [];\n for await (const entry of this) out.push(entry);\n return out;\n },\n };\n\n return iter;\n}\n\ninterface IteratorState {\n agentUrl: string;\n options: FetchAgentAuthorizationsOptions;\n cursor: string | undefined;\n pageIndex: number;\n currentBatch: DirectoryPublisherEntry[];\n nextBatchIndex: number;\n done: boolean;\n}\n\nasync function advance(state: IteratorState): Promise<IteratorResult<DirectoryPublisherEntry>> {\n if (state.done) return { value: undefined, done: true };\n\n while (state.nextBatchIndex >= state.currentBatch.length) {\n if (state.pageIndex > 0 && state.cursor === undefined) {\n state.done = true;\n return { value: undefined, done: true };\n }\n if (state.pageIndex >= MAX_PAGES) {\n throw new Error(\n `fetchAgentAuthorizationsFromDirectory: refused to fetch beyond ${MAX_PAGES} pages — directory may be looping`\n );\n }\n const page = await fetchPage(state.agentUrl, state.options, state.cursor);\n state.pageIndex++;\n state.currentBatch = page.publishers;\n state.nextBatchIndex = 0;\n state.cursor = page.next_cursor ?? undefined;\n if (page.publishers.length === 0 && (state.cursor === undefined || state.cursor === null)) {\n state.done = true;\n return { value: undefined, done: true };\n }\n }\n\n const entry = state.currentBatch[state.nextBatchIndex];\n state.nextBatchIndex++;\n return { value: entry as DirectoryPublisherEntry, done: false };\n}\n\nasync function fetchPage(\n agentUrl: string,\n options: FetchAgentAuthorizationsOptions,\n cursor: string | undefined\n): Promise<DirectoryLookupPage> {\n const url = buildDirectoryUrl(options.directoryUrl, agentUrl, {\n since: options.since,\n status: options.status,\n cursor,\n limit: options.limit,\n });\n\n const headers: Record<string, string> = {\n accept: 'application/json',\n 'user-agent': options.userAgent ?? `@adcp/client/${LIBRARY_VERSION}`,\n };\n\n let response;\n try {\n response = await ssrfSafeFetch(url, {\n method: 'GET',\n headers,\n timeoutMs: options.timeoutMs ?? DEFAULT_TIMEOUT_MS,\n maxBodyBytes: MAX_RESPONSE_BYTES,\n allowPrivateIp: isInternalProbesAllowed(),\n signal: options.signal,\n });\n } catch (err) {\n if (err instanceof SsrfRefusedError) {\n throw new Error(`fetchAgentAuthorizationsFromDirectory: SSRF guard refused ${url}: ${err.code}`);\n }\n throw err;\n }\n\n if (response.status < 200 || response.status >= 300) {\n throw new Error(`fetchAgentAuthorizationsFromDirectory: directory returned HTTP ${response.status} for ${url}`);\n }\n\n const decoded = decodeBodyAsJsonOrText(response.body, response.headers['content-type']);\n if (decoded === null || typeof decoded !== 'object' || Array.isArray(decoded)) {\n throw new Error(`fetchAgentAuthorizationsFromDirectory: directory response was not a JSON object (${url})`);\n }\n\n return parseDirectoryPage(decoded, url);\n}\n\n/**\n * Parse a raw directory response into a {@link DirectoryLookupPage},\n * applying defensive checks on counterparty-controlled fields. Throws\n * descriptive errors when the response shape violates the schema; the\n * iterator surfaces these unchanged.\n */\nfunction parseDirectoryPage(raw: unknown, url: string): DirectoryLookupPage {\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) {\n throw new Error(`directory response is not a JSON object (${url})`);\n }\n const obj = raw as Record<string, unknown>;\n\n const agent_url = obj.agent_url;\n if (typeof agent_url !== 'string') {\n throw new Error(`directory response missing 'agent_url' string (${url})`);\n }\n const indexed = obj.directory_indexed_at;\n if (indexed !== null && typeof indexed !== 'string') {\n throw new Error(`directory response 'directory_indexed_at' must be string or null (${url})`);\n }\n const publishersRaw = obj.publishers;\n if (!Array.isArray(publishersRaw)) {\n throw new Error(`directory response 'publishers' must be an array (${url})`);\n }\n\n const publishers: DirectoryPublisherEntry[] = [];\n for (const p of publishersRaw) {\n const entry = parsePublisherEntry(p);\n if (entry !== null) publishers.push(entry);\n }\n\n const next_cursor =\n typeof obj.next_cursor === 'string' ? obj.next_cursor : obj.next_cursor === null ? null : undefined;\n\n return {\n agent_url,\n directory_indexed_at: indexed ?? null,\n publishers,\n next_cursor,\n };\n}\n\nfunction parsePublisherEntry(raw: unknown): DirectoryPublisherEntry | null {\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) return null;\n const o = raw as Record<string, unknown>;\n if (typeof o.publisher_domain !== 'string') return null;\n if (typeof o.discovery_method !== 'string') return null;\n if (!isDiscoveryMethod(o.discovery_method)) return null;\n if (!Number.isFinite(o.properties_authorized) || (o.properties_authorized as number) < 0) return null;\n if (!Number.isFinite(o.properties_total) || (o.properties_total as number) < 0) return null;\n if (o.status !== 'authorized' && o.status !== 'revoked') return null;\n if (typeof o.last_verified_at !== 'string') return null;\n\n // Per the `agent-publishers.json` schema's `allOf` conditional: when\n // `discovery_method` is anything other than `direct`, `manager_domain`\n // is required. Drop rows that violate this — the directory has nothing\n // to anchor the cross-publisher trust on, and a downstream consumer\n // would have no manager file to verify against. Witness, not translator.\n if (o.discovery_method !== 'direct' && typeof o.manager_domain !== 'string') {\n return null;\n }\n\n const entry: DirectoryPublisherEntry = {\n publisher_domain: o.publisher_domain,\n discovery_method: o.discovery_method as DirectoryDiscoveryMethod,\n properties_authorized: o.properties_authorized as number,\n properties_total: o.properties_total as number,\n status: o.status as DirectoryPublisherStatus,\n last_verified_at: o.last_verified_at,\n };\n if (typeof o.manager_domain === 'string') entry.manager_domain = o.manager_domain;\n else if (o.manager_domain === null) entry.manager_domain = null;\n if (typeof o.signing_keys_pinned === 'boolean') entry.signing_keys_pinned = o.signing_keys_pinned;\n return entry;\n}\n\nfunction isDiscoveryMethod(s: string): s is DirectoryDiscoveryMethod {\n return (\n s === 'direct' || s === 'authoritative_location' || s === 'adagents_authoritative' || s === 'ads_txt_managerdomain'\n );\n}\n\nfunction buildDirectoryUrl(\n base: string,\n agentUrl: string,\n query: {\n since?: Date;\n status?: ReadonlyArray<DirectoryPublisherStatus>;\n cursor?: string;\n limit?: number;\n }\n): string {\n const trimmed = base.endsWith('/') ? base.slice(0, -1) : base;\n const u = new URL(`${trimmed}/v1/agents/${encodeURIComponent(agentUrl)}/publishers`);\n if (query.since) u.searchParams.set('since', query.since.toISOString());\n if (query.status && query.status.length > 0) {\n for (const s of query.status) u.searchParams.append('status', s);\n }\n if (query.cursor) u.searchParams.set('cursor', query.cursor);\n if (typeof query.limit === 'number' && query.limit > 0) {\n u.searchParams.set('limit', String(Math.floor(query.limit)));\n }\n return u.toString();\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 { expandPublisherPropertySelector } from "./publisher-property-selector.mjs";
8
2
  function resolveInlinePublisherProperties(adAgents, selectors) {
9
3
  const parentProperties = Array.isArray(adAgents.properties) ? adAgents.properties : [];
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/discovery/inline-publisher-properties.ts"],"sourcesContent":["/**\n * Inline-resolution path for `publisher_properties` selectors per\n * [adcontextprotocol/adcp#4825](https://github.com/adcontextprotocol/adcp/issues/4825)\n * (spec PR [adcp#4827](https://github.com/adcontextprotocol/adcp/pull/4827)).\n *\n * The pattern: when a parent `adagents.json`'s top-level `properties[]`\n * carry `publisher_domain` entries that match the selector's target domain,\n * the consumer MAY satisfy the selector inline — without per-child federated\n * `adagents.json` fetches. The federated path stays correct (the spec\n * requires consumers that resolve federated to keep doing so), but small\n * managed-network adopters who centralize their property catalog on the\n * parent file can skip an N-domain fanout of HTTP fetches.\n *\n * Resolution rules:\n * - Match parent's `properties[]` by `publisher_domain` (case-insensitive).\n * - Apply the selector's predicate (`'all'` / `'by_id'` / `'by_tag'`) to\n * the matched subset.\n * - Honor `revoked_publisher_domains[]` on the parent file: a selector\n * targeting a revoked domain resolves to **zero properties** AND signals\n * that no federated fallback should fire for that domain.\n * - Divergence rule (per spec): when both inline and federated resolve and\n * disagree on `(publisher_domain, property_id)`, federated wins; SDK\n * SHOULD log. See {@link detectInlineFederatedDivergence}.\n *\n * @public\n */\n\nimport type { AdAgentsJson, Property, PublisherPropertySelector, SinglePublisherPropertySelector } from './types';\nimport { expandPublisherPropertySelector } from './publisher-property-selector';\n\n/**\n * Outcome of inline-resolving a single (singular-form) selector against the\n * parent file's `properties[]`.\n */\nexport interface InlineResolutionResult {\n /**\n * Properties matched inline. Empty when no parent entries had matching\n * `publisher_domain` OR when the domain is in `revoked_publisher_domains[]`.\n */\n properties: Property[];\n /**\n * Why inline resolution did not produce matches. Revocation is handled by\n * {@link resolveInlinePublisherProperties} (which short-circuits before\n * invoking this helper); per-selector callers using\n * {@link resolveSingularInline} directly must consult\n * `adAgents.revoked_publisher_domains[]` themselves before calling.\n */\n reason: 'matched' | 'domain_not_inline' | 'no_predicate_match';\n}\n\n/**\n * Inline-resolve every selector in a publisher_properties array against the\n * parent file's `properties[]`. Compact-form selectors are fanned out before\n * resolution.\n *\n * Returns:\n * - `inline_properties`: every property matched inline across all selectors\n * (de-duplicated by `property_id` when present, by reference identity\n * otherwise).\n * - `unresolved_selectors`: singular selectors that still need federated\n * resolution (inline produced no match AND domain is not revoked).\n * - `revoked_selectors`: singular selectors that were dropped because the\n * parent file lists their domain in `revoked_publisher_domains[]`.\n * Federated fallback MUST NOT fire for these.\n *\n * Witness, not translator: the function does not invent properties or\n * mutate the input. Counterparty-controlled fields (`publisher_domain`,\n * `tags`, `property_id`) are read defensively.\n */\nexport function resolveInlinePublisherProperties(\n adAgents: AdAgentsJson,\n selectors: ReadonlyArray<PublisherPropertySelector>\n): {\n inline_properties: Property[];\n unresolved_selectors: SinglePublisherPropertySelector[];\n revoked_selectors: SinglePublisherPropertySelector[];\n} {\n const parentProperties = Array.isArray(adAgents.properties) ? adAgents.properties : [];\n const revokedDomains = revokedDomainSet(adAgents.revoked_publisher_domains);\n\n const inline: Property[] = [];\n const unresolved: SinglePublisherPropertySelector[] = [];\n const revoked: SinglePublisherPropertySelector[] = [];\n const seenPropertyIds = new Set<string>();\n const seenRefs = new Set<Property>();\n\n for (const raw of selectors) {\n for (const sel of expandPublisherPropertySelector(raw)) {\n const domain = sel.publisher_domain.toLowerCase();\n if (revokedDomains.has(domain)) {\n revoked.push(sel);\n continue;\n }\n const result = resolveSingularInline(parentProperties, sel);\n if (result.reason === 'matched') {\n for (const p of result.properties) {\n if (p.property_id !== undefined) {\n if (seenPropertyIds.has(p.property_id)) continue;\n seenPropertyIds.add(p.property_id);\n } else if (seenRefs.has(p)) {\n continue;\n } else {\n seenRefs.add(p);\n }\n inline.push(p);\n }\n } else {\n // domain_not_inline OR no_predicate_match → federated may fall through\n unresolved.push(sel);\n }\n }\n }\n\n return { inline_properties: inline, unresolved_selectors: unresolved, revoked_selectors: revoked };\n}\n\n/**\n * Inline-resolve a single (singular-form) selector against a parent\n * `properties[]` list. Exported for adopters that want fine-grained control\n * over per-selector behavior (e.g., a custom federated fallback policy).\n */\nexport function resolveSingularInline(\n parentProperties: ReadonlyArray<Property>,\n selector: SinglePublisherPropertySelector\n): InlineResolutionResult {\n const wantedDomain = selector.publisher_domain.toLowerCase();\n const domainMatches = parentProperties.filter(p => {\n const d = p.publisher_domain;\n return typeof d === 'string' && d.toLowerCase() === wantedDomain;\n });\n if (domainMatches.length === 0) {\n return { properties: [], reason: 'domain_not_inline' };\n }\n\n switch (selector.selection_type) {\n case 'all':\n return { properties: domainMatches, reason: 'matched' };\n case 'by_id': {\n const idSet = new Set(selector.property_ids);\n const matched = domainMatches.filter(p => p.property_id !== undefined && idSet.has(p.property_id));\n return matched.length > 0\n ? { properties: matched, reason: 'matched' }\n : { properties: [], reason: 'no_predicate_match' };\n }\n case 'by_tag': {\n const tagSet = new Set(selector.property_tags);\n const matched = domainMatches.filter(p => Array.isArray(p.tags) && p.tags.some(t => tagSet.has(t)));\n return matched.length > 0\n ? { properties: matched, reason: 'matched' }\n : { properties: [], reason: 'no_predicate_match' };\n }\n }\n}\n\n/**\n * Divergence report for a single `(publisher_domain, property_id)` pair\n * that resolved differently inline vs federated. Per the spec, federated\n * wins; the report exists for the SDK / adopter to log.\n */\nexport interface InlineFederatedDivergence {\n publisher_domain: string;\n property_id: string;\n inline_property: Property;\n federated_property: Property;\n /** Field paths whose values differ (e.g. `['name', 'tags', 'identifiers']`). */\n differing_fields: string[];\n}\n\n/**\n * Compare inline-resolved properties against federated-resolved properties\n * for the same `(publisher_domain, property_id)` pairs and report divergence.\n * Properties without a `property_id` are not comparable across paths and are\n * skipped here.\n *\n * Per [adcp#4825](https://github.com/adcontextprotocol/adcp/issues/4825):\n * \"When both paths resolve to the same `(publisher_domain, property_id)`\n * and disagree, federated wins; SDK SHOULD log the divergence.\" This\n * function produces the divergence; the caller decides how to log.\n *\n * Field comparison is shallow JSON-equality on the spec-defined fields\n * (`property_type`, `name`, `identifiers`, `tags`, `publisher_domain`).\n * Vendor-extension fields (`[k: string]: unknown`) are not compared.\n */\nexport function detectInlineFederatedDivergence(\n inline: ReadonlyArray<Property>,\n federated: ReadonlyArray<Property>\n): InlineFederatedDivergence[] {\n const inlineByKey = indexPropertiesByDomainAndId(inline);\n const out: InlineFederatedDivergence[] = [];\n for (const fed of federated) {\n if (typeof fed.property_id !== 'string' || typeof fed.publisher_domain !== 'string') continue;\n const key = `${fed.publisher_domain.toLowerCase()}|${fed.property_id}`;\n const ours = inlineByKey.get(key);\n if (!ours) continue;\n const differing = compareSpecFields(ours, fed);\n if (differing.length > 0) {\n out.push({\n publisher_domain: fed.publisher_domain.toLowerCase(),\n property_id: fed.property_id,\n inline_property: ours,\n federated_property: fed,\n differing_fields: differing,\n });\n }\n }\n return out;\n}\n\nfunction indexPropertiesByDomainAndId(properties: ReadonlyArray<Property>): Map<string, Property> {\n const out = new Map<string, Property>();\n for (const p of properties) {\n if (typeof p.property_id !== 'string' || typeof p.publisher_domain !== 'string') continue;\n out.set(`${p.publisher_domain.toLowerCase()}|${p.property_id}`, p);\n }\n return out;\n}\n\nfunction compareSpecFields(a: Property, b: Property): string[] {\n const fields: Array<keyof Property> = ['property_type', 'name', 'identifiers', 'tags', 'publisher_domain'];\n const out: string[] = [];\n for (const f of fields) {\n if (!shallowEqual(a[f], b[f])) out.push(String(f));\n }\n return out;\n}\n\nfunction shallowEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (a == null || b == null) return a === b;\n if (typeof a !== typeof b) return false;\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) return false;\n return a.every((v, i) => shallowEqual(v, b[i]));\n }\n if (typeof a === 'object' && typeof b === 'object') {\n // Key-order-stable comparison — `JSON.stringify` reflects insertion order,\n // and inline objects vs federated-parsed objects can differ on order\n // (`{type, value}` vs `{value, type}` for PropertyIdentifier). Producing\n // false-positive divergences would make the SHOULD-log channel flap.\n const ka = Object.keys(a as Record<string, unknown>).sort();\n const kb = Object.keys(b as Record<string, unknown>).sort();\n if (ka.length !== kb.length || ka.some((k, i) => k !== kb[i])) return false;\n return ka.every(k => shallowEqual((a as Record<string, unknown>)[k], (b as Record<string, unknown>)[k]));\n }\n return false;\n}\n\nfunction revokedDomainSet(input: unknown): Set<string> {\n if (!Array.isArray(input)) return new Set();\n const out = new Set<string>();\n for (const item of input) {\n const domain =\n typeof item === 'string'\n ? item\n : item &&\n typeof item === 'object' &&\n typeof (item as { publisher_domain?: unknown }).publisher_domain === 'string'\n ? (item as { publisher_domain: string }).publisher_domain\n : undefined;\n if (domain && domain.length > 0) out.add(domain.toLowerCase());\n }\n return out;\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/lib/discovery/inline-publisher-properties.ts"],"sourcesContent":["/**\n * Inline-resolution path for `publisher_properties` selectors per\n * [adcontextprotocol/adcp#4825](https://github.com/adcontextprotocol/adcp/issues/4825)\n * (spec PR [adcp#4827](https://github.com/adcontextprotocol/adcp/pull/4827)).\n *\n * The pattern: when a parent `adagents.json`'s top-level `properties[]`\n * carry `publisher_domain` entries that match the selector's target domain,\n * the consumer MAY satisfy the selector inline — without per-child federated\n * `adagents.json` fetches. The federated path stays correct (the spec\n * requires consumers that resolve federated to keep doing so), but small\n * managed-network adopters who centralize their property catalog on the\n * parent file can skip an N-domain fanout of HTTP fetches.\n *\n * Resolution rules:\n * - Match parent's `properties[]` by `publisher_domain` (case-insensitive).\n * - Apply the selector's predicate (`'all'` / `'by_id'` / `'by_tag'`) to\n * the matched subset.\n * - Honor `revoked_publisher_domains[]` on the parent file: a selector\n * targeting a revoked domain resolves to **zero properties** AND signals\n * that no federated fallback should fire for that domain.\n * - Divergence rule (per spec): when both inline and federated resolve and\n * disagree on `(publisher_domain, property_id)`, federated wins; SDK\n * SHOULD log. See {@link detectInlineFederatedDivergence}.\n *\n * @public\n */\n\nimport type { AdAgentsJson, Property, PublisherPropertySelector, SinglePublisherPropertySelector } from './types';\nimport { expandPublisherPropertySelector } from './publisher-property-selector';\n\n/**\n * Outcome of inline-resolving a single (singular-form) selector against the\n * parent file's `properties[]`.\n */\nexport interface InlineResolutionResult {\n /**\n * Properties matched inline. Empty when no parent entries had matching\n * `publisher_domain` OR when the domain is in `revoked_publisher_domains[]`.\n */\n properties: Property[];\n /**\n * Why inline resolution did not produce matches. Revocation is handled by\n * {@link resolveInlinePublisherProperties} (which short-circuits before\n * invoking this helper); per-selector callers using\n * {@link resolveSingularInline} directly must consult\n * `adAgents.revoked_publisher_domains[]` themselves before calling.\n */\n reason: 'matched' | 'domain_not_inline' | 'no_predicate_match';\n}\n\n/**\n * Inline-resolve every selector in a publisher_properties array against the\n * parent file's `properties[]`. Compact-form selectors are fanned out before\n * resolution.\n *\n * Returns:\n * - `inline_properties`: every property matched inline across all selectors\n * (de-duplicated by `property_id` when present, by reference identity\n * otherwise).\n * - `unresolved_selectors`: singular selectors that still need federated\n * resolution (inline produced no match AND domain is not revoked).\n * - `revoked_selectors`: singular selectors that were dropped because the\n * parent file lists their domain in `revoked_publisher_domains[]`.\n * Federated fallback MUST NOT fire for these.\n *\n * Witness, not translator: the function does not invent properties or\n * mutate the input. Counterparty-controlled fields (`publisher_domain`,\n * `tags`, `property_id`) are read defensively.\n */\nexport function resolveInlinePublisherProperties(\n adAgents: AdAgentsJson,\n selectors: ReadonlyArray<PublisherPropertySelector>\n): {\n inline_properties: Property[];\n unresolved_selectors: SinglePublisherPropertySelector[];\n revoked_selectors: SinglePublisherPropertySelector[];\n} {\n const parentProperties = Array.isArray(adAgents.properties) ? adAgents.properties : [];\n const revokedDomains = revokedDomainSet(adAgents.revoked_publisher_domains);\n\n const inline: Property[] = [];\n const unresolved: SinglePublisherPropertySelector[] = [];\n const revoked: SinglePublisherPropertySelector[] = [];\n const seenPropertyIds = new Set<string>();\n const seenRefs = new Set<Property>();\n\n for (const raw of selectors) {\n for (const sel of expandPublisherPropertySelector(raw)) {\n const domain = sel.publisher_domain.toLowerCase();\n if (revokedDomains.has(domain)) {\n revoked.push(sel);\n continue;\n }\n const result = resolveSingularInline(parentProperties, sel);\n if (result.reason === 'matched') {\n for (const p of result.properties) {\n if (p.property_id !== undefined) {\n if (seenPropertyIds.has(p.property_id)) continue;\n seenPropertyIds.add(p.property_id);\n } else if (seenRefs.has(p)) {\n continue;\n } else {\n seenRefs.add(p);\n }\n inline.push(p);\n }\n } else {\n // domain_not_inline OR no_predicate_match → federated may fall through\n unresolved.push(sel);\n }\n }\n }\n\n return { inline_properties: inline, unresolved_selectors: unresolved, revoked_selectors: revoked };\n}\n\n/**\n * Inline-resolve a single (singular-form) selector against a parent\n * `properties[]` list. Exported for adopters that want fine-grained control\n * over per-selector behavior (e.g., a custom federated fallback policy).\n */\nexport function resolveSingularInline(\n parentProperties: ReadonlyArray<Property>,\n selector: SinglePublisherPropertySelector\n): InlineResolutionResult {\n const wantedDomain = selector.publisher_domain.toLowerCase();\n const domainMatches = parentProperties.filter(p => {\n const d = p.publisher_domain;\n return typeof d === 'string' && d.toLowerCase() === wantedDomain;\n });\n if (domainMatches.length === 0) {\n return { properties: [], reason: 'domain_not_inline' };\n }\n\n switch (selector.selection_type) {\n case 'all':\n return { properties: domainMatches, reason: 'matched' };\n case 'by_id': {\n const idSet = new Set(selector.property_ids);\n const matched = domainMatches.filter(p => p.property_id !== undefined && idSet.has(p.property_id));\n return matched.length > 0\n ? { properties: matched, reason: 'matched' }\n : { properties: [], reason: 'no_predicate_match' };\n }\n case 'by_tag': {\n const tagSet = new Set(selector.property_tags);\n const matched = domainMatches.filter(p => Array.isArray(p.tags) && p.tags.some(t => tagSet.has(t)));\n return matched.length > 0\n ? { properties: matched, reason: 'matched' }\n : { properties: [], reason: 'no_predicate_match' };\n }\n }\n}\n\n/**\n * Divergence report for a single `(publisher_domain, property_id)` pair\n * that resolved differently inline vs federated. Per the spec, federated\n * wins; the report exists for the SDK / adopter to log.\n */\nexport interface InlineFederatedDivergence {\n publisher_domain: string;\n property_id: string;\n inline_property: Property;\n federated_property: Property;\n /** Field paths whose values differ (e.g. `['name', 'tags', 'identifiers']`). */\n differing_fields: string[];\n}\n\n/**\n * Compare inline-resolved properties against federated-resolved properties\n * for the same `(publisher_domain, property_id)` pairs and report divergence.\n * Properties without a `property_id` are not comparable across paths and are\n * skipped here.\n *\n * Per [adcp#4825](https://github.com/adcontextprotocol/adcp/issues/4825):\n * \"When both paths resolve to the same `(publisher_domain, property_id)`\n * and disagree, federated wins; SDK SHOULD log the divergence.\" This\n * function produces the divergence; the caller decides how to log.\n *\n * Field comparison is shallow JSON-equality on the spec-defined fields\n * (`property_type`, `name`, `identifiers`, `tags`, `publisher_domain`).\n * Vendor-extension fields (`[k: string]: unknown`) are not compared.\n */\nexport function detectInlineFederatedDivergence(\n inline: ReadonlyArray<Property>,\n federated: ReadonlyArray<Property>\n): InlineFederatedDivergence[] {\n const inlineByKey = indexPropertiesByDomainAndId(inline);\n const out: InlineFederatedDivergence[] = [];\n for (const fed of federated) {\n if (typeof fed.property_id !== 'string' || typeof fed.publisher_domain !== 'string') continue;\n const key = `${fed.publisher_domain.toLowerCase()}|${fed.property_id}`;\n const ours = inlineByKey.get(key);\n if (!ours) continue;\n const differing = compareSpecFields(ours, fed);\n if (differing.length > 0) {\n out.push({\n publisher_domain: fed.publisher_domain.toLowerCase(),\n property_id: fed.property_id,\n inline_property: ours,\n federated_property: fed,\n differing_fields: differing,\n });\n }\n }\n return out;\n}\n\nfunction indexPropertiesByDomainAndId(properties: ReadonlyArray<Property>): Map<string, Property> {\n const out = new Map<string, Property>();\n for (const p of properties) {\n if (typeof p.property_id !== 'string' || typeof p.publisher_domain !== 'string') continue;\n out.set(`${p.publisher_domain.toLowerCase()}|${p.property_id}`, p);\n }\n return out;\n}\n\nfunction compareSpecFields(a: Property, b: Property): string[] {\n const fields: Array<keyof Property> = ['property_type', 'name', 'identifiers', 'tags', 'publisher_domain'];\n const out: string[] = [];\n for (const f of fields) {\n if (!shallowEqual(a[f], b[f])) out.push(String(f));\n }\n return out;\n}\n\nfunction shallowEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (a == null || b == null) return a === b;\n if (typeof a !== typeof b) return false;\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) return false;\n return a.every((v, i) => shallowEqual(v, b[i]));\n }\n if (typeof a === 'object' && typeof b === 'object') {\n // Key-order-stable comparison — `JSON.stringify` reflects insertion order,\n // and inline objects vs federated-parsed objects can differ on order\n // (`{type, value}` vs `{value, type}` for PropertyIdentifier). Producing\n // false-positive divergences would make the SHOULD-log channel flap.\n const ka = Object.keys(a as Record<string, unknown>).sort();\n const kb = Object.keys(b as Record<string, unknown>).sort();\n if (ka.length !== kb.length || ka.some((k, i) => k !== kb[i])) return false;\n return ka.every(k => shallowEqual((a as Record<string, unknown>)[k], (b as Record<string, unknown>)[k]));\n }\n return false;\n}\n\nfunction revokedDomainSet(input: unknown): Set<string> {\n if (!Array.isArray(input)) return new Set();\n const out = new Set<string>();\n for (const item of input) {\n const domain =\n typeof item === 'string'\n ? item\n : item &&\n typeof item === 'object' &&\n typeof (item as { publisher_domain?: unknown }).publisher_domain === 'string'\n ? (item as { publisher_domain: string }).publisher_domain\n : undefined;\n if (domain && domain.length > 0) out.add(domain.toLowerCase());\n }\n return out;\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 { createLogger } from "../utils/logger.mjs";
8
2
  import { LIBRARY_VERSION } from "../version.mjs";
9
3
  import { validateUserAgent } from "../utils/validate-user-agent.mjs";
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/discovery/network-consistency-checker.ts"],"sourcesContent":["/**\n * Network Consistency Checker for AdCP\n *\n * Validates managed publisher network deployments by checking that:\n * 1. The authoritative adagents.json is well-formed\n * 2. Each property domain has a valid pointer file\n * 3. No orphaned or stale pointer files exist\n * 4. All authorized agent endpoints are reachable\n */\n\nimport { createLogger, type LogLevel } from '../utils/logger';\nimport { LIBRARY_VERSION } from '../version';\nimport { validateUserAgent } from '../utils/validate-user-agent';\nimport { validateAgentUrl } from '../validation';\nimport { ssrfSafeFetch, SsrfRefusedError, SSRF_TRANSIENT_CODES, decodeBodyAsJsonOrText } from '../net/ssrf-fetch';\nimport { isInternalProbesAllowed } from '../utils/probe-policy';\nimport type { AdAgentsJson, AuthorizedAgent, Property } from './types';\nimport { AdAgentsRedirectRefusedError, ssrfSafeFetchAdAgents, type AdAgentsRedirectPolicy } from './adagents-redirects';\n\n// ====== Configuration ======\n\n/** Progress update emitted after each domain or agent check completes. */\nexport interface CheckProgress {\n phase: 'pointers' | 'orphans' | 'agents';\n completed: number;\n total: number;\n domain?: string;\n}\n\nexport interface NetworkConsistencyCheckerConfig {\n /** URL of the authoritative adagents.json file */\n authoritativeUrl?: string;\n /** Domains to check (if no authoritativeUrl, fetches pointer from first domain) */\n domains?: string[];\n /** Max parallel fetches (default 10, max 50) */\n concurrency?: number;\n /** Per-request timeout in ms (default 10000) */\n timeoutMs?: number;\n logLevel?: LogLevel;\n userAgent?: string;\n /** Called after each domain/agent check completes. */\n onProgress?: (progress: CheckProgress) => void;\n}\n\n// ====== Report types ======\n\nexport interface OrphanedPointer {\n domain: string;\n pointerUrl: string;\n}\n\nexport interface StalePointer {\n domain: string;\n pointerUrl: string;\n expectedUrl: string;\n}\n\nexport interface MissingPointer {\n domain: string;\n error: string;\n}\n\nexport interface SchemaError {\n field: string;\n message: string;\n}\n\nexport interface AgentHealthResult {\n url: string;\n reachable: boolean;\n statusCode?: number;\n error?: string;\n}\n\nexport type DomainStatus = 'ok' | 'missing_pointer' | 'stale_pointer' | 'orphaned_pointer' | 'error';\n\nexport interface DomainDetail {\n domain: string;\n status: DomainStatus;\n pointerUrl?: string;\n errors: string[];\n}\n\nexport interface CheckSummary {\n totalDomains: number;\n validPointers: number;\n orphanedPointers: number;\n stalePointers: number;\n missingPointers: number;\n schemaErrors: number;\n unreachableAgents: number;\n totalIssues: number;\n}\n\nexport interface NetworkCheckReport {\n checkedAt: string;\n authoritativeUrl: string;\n coverage: number;\n summary: CheckSummary;\n orphanedPointers: OrphanedPointer[];\n stalePointers: StalePointer[];\n missingPointers: MissingPointer[];\n schemaErrors: SchemaError[];\n agentHealth: AgentHealthResult[];\n domains: DomainDetail[];\n}\n\n// ====== Implementation ======\n\nconst DEFAULT_CONCURRENCY = 10;\nconst MAX_CONCURRENCY = 50;\nconst DEFAULT_TIMEOUT_MS = 10_000;\nconst MAX_RESPONSE_BYTES = 1_048_576; // 1 MB\n\nconst FETCH_HEADERS = {\n Accept: 'application/json, text/plain, */*',\n 'Accept-Language': 'en-US,en;q=0.9',\n 'Accept-Encoding': 'gzip, deflate, br',\n};\n\nexport class NetworkConsistencyChecker {\n private readonly authoritativeUrl?: string;\n private readonly domains: string[];\n private readonly concurrency: number;\n private readonly timeoutMs: number;\n private readonly logger: ReturnType<typeof createLogger>;\n private readonly userAgentHeader: string;\n private readonly fromHeader: string;\n private readonly onProgress?: (progress: CheckProgress) => void;\n\n constructor(config: NetworkConsistencyCheckerConfig) {\n if (!config.authoritativeUrl && (!config.domains || config.domains.length === 0)) {\n throw new Error('Either authoritativeUrl or domains must be provided');\n }\n if (config.userAgent) {\n validateUserAgent(config.userAgent);\n }\n\n this.authoritativeUrl = config.authoritativeUrl;\n this.domains = config.domains ?? [];\n this.concurrency = Math.min(config.concurrency ?? DEFAULT_CONCURRENCY, MAX_CONCURRENCY);\n this.timeoutMs = config.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n if (this.concurrency < 1) throw new Error('concurrency must be >= 1');\n if (this.timeoutMs < 1) throw new Error('timeoutMs must be >= 1');\n this.logger = createLogger({ level: config.logLevel ?? 'warn' }).child('NetworkConsistencyChecker');\n this.userAgentHeader = `adcp-network-checker/${LIBRARY_VERSION} (+https://adcontextprotocol.org)`;\n this.fromHeader = config.userAgent\n ? `adcp-network-checker@adcontextprotocol.org (${config.userAgent}; v${LIBRARY_VERSION})`\n : `adcp-network-checker@adcontextprotocol.org (v${LIBRARY_VERSION})`;\n this.onProgress = config.onProgress;\n }\n\n async check(): Promise<NetworkCheckReport> {\n const report: NetworkCheckReport = {\n checkedAt: new Date().toISOString(),\n authoritativeUrl: '',\n coverage: 0,\n summary: {\n totalDomains: 0,\n validPointers: 0,\n orphanedPointers: 0,\n stalePointers: 0,\n missingPointers: 0,\n schemaErrors: 0,\n unreachableAgents: 0,\n totalIssues: 0,\n },\n orphanedPointers: [],\n stalePointers: [],\n missingPointers: [],\n schemaErrors: [],\n agentHealth: [],\n domains: [],\n };\n\n // Step 1: Resolve and fetch the authoritative file\n const { url: resolvedUrl, data: authData } = await this.fetchAuthoritative(report);\n report.authoritativeUrl = resolvedUrl;\n\n if (!authData) {\n this.computeSummary(report, 0);\n return report;\n }\n\n // Step 2: Validate authoritative file schema\n this.validateSchema(authData, report);\n\n // Step 3: Extract domains from authoritative properties\n const authoritativeDomains = this.extractDomains(authData.properties ?? []);\n\n // Step 4: Check agent endpoint health\n if (authData.authorized_agents && authData.authorized_agents.length > 0) {\n report.agentHealth = await this.checkAgentHealth(authData.authorized_agents);\n }\n\n // Step 5: Check pointer files on authoritative domains\n await this.checkPointers(resolvedUrl, authoritativeDomains, report);\n\n // Step 6: Check for orphaned pointers (domains not in authoritative file)\n const extraDomains = this.domains.filter(d => !authoritativeDomains.has(d));\n if (extraDomains.length > 0) {\n await this.checkOrphanedPointers(resolvedUrl, extraDomains, report);\n }\n\n // Step 7: Compute coverage and summary\n const total = authoritativeDomains.size;\n const valid = report.domains.filter(d => d.status === 'ok').length;\n report.coverage = total > 0 ? valid / total : 0;\n this.computeSummary(report, total);\n\n return report;\n }\n\n private computeSummary(report: NetworkCheckReport, totalDomains: number): void {\n const unreachableAgents = report.agentHealth.filter(a => !a.reachable).length;\n report.summary = {\n totalDomains,\n validPointers: report.domains.filter(d => d.status === 'ok').length,\n orphanedPointers: report.orphanedPointers.length,\n stalePointers: report.stalePointers.length,\n missingPointers: report.missingPointers.length,\n schemaErrors: report.schemaErrors.length,\n unreachableAgents,\n totalIssues:\n report.schemaErrors.length +\n report.missingPointers.length +\n report.stalePointers.length +\n report.orphanedPointers.length +\n unreachableAgents,\n };\n }\n\n // ---- Internal methods ----\n\n private async fetchAuthoritative(report: NetworkCheckReport): Promise<{ url: string; data: AdAgentsJson | null }> {\n let url = this.authoritativeUrl;\n\n // If no authoritative URL, discover it from the first domain's pointer\n if (!url) {\n const firstDomain = this.domains[0];\n try {\n const pointerUrl = `https://${firstDomain}/.well-known/adagents.json`;\n const pointer = await this.fetchJsonWithUrl<AdAgentsJson>(pointerUrl, {\n mode: 'same-registrable-domain',\n originUrl: pointerUrl,\n });\n const pointerData = pointer.data;\n if (pointerData.authoritative_location) {\n url = pointerData.authoritative_location;\n } else {\n return { url: pointer.url, data: pointerData };\n }\n } catch (error) {\n report.schemaErrors.push({\n field: 'authoritative_location',\n message: `Failed to discover authoritative URL from ${firstDomain}: ${this.sanitizeError(error)}`,\n });\n return { url: '', data: null };\n }\n }\n\n try {\n const authoritative = await this.fetchJsonWithUrl<AdAgentsJson>(url, {\n mode: 'same-registrable-domain',\n originUrl: url,\n });\n const data = authoritative.data;\n const resolvedUrl = authoritative.url;\n\n // Follow at most one authoritative_location redirect\n if (data.authoritative_location && !data.authorized_agents) {\n const redirectUrl = data.authoritative_location;\n if (!redirectUrl.startsWith('https://')) {\n report.schemaErrors.push({\n field: 'authoritative_location',\n message: `authoritative_location must use HTTPS: ${redirectUrl}`,\n });\n return { url, data: null };\n }\n if (redirectUrl === resolvedUrl) {\n report.schemaErrors.push({\n field: 'authoritative_location',\n message: 'authoritative_location points to itself',\n });\n return { url: resolvedUrl, data: null };\n }\n const redirect = await this.fetchJsonWithUrl<AdAgentsJson>(redirectUrl, { mode: 'none' });\n const redirectData = redirect.data;\n // Do not follow further redirects from the redirect target\n return { url: redirect.url, data: redirectData };\n }\n\n return { url: resolvedUrl, data };\n } catch (error) {\n report.schemaErrors.push({\n field: '$root',\n message: `Failed to fetch authoritative file: ${this.sanitizeError(error)}`,\n });\n return { url: url ?? '', data: null };\n }\n }\n\n private validateSchema(data: AdAgentsJson, report: NetworkCheckReport): void {\n if (!data.authorized_agents || !Array.isArray(data.authorized_agents)) {\n report.schemaErrors.push({\n field: 'authorized_agents',\n message: 'Missing or invalid authorized_agents array',\n });\n } else {\n data.authorized_agents.forEach((agent, i) => {\n if (!agent.url) {\n report.schemaErrors.push({\n field: `authorized_agents[${i}].url`,\n message: 'Missing required url field',\n });\n }\n if (!agent.authorized_for) {\n report.schemaErrors.push({\n field: `authorized_agents[${i}].authorized_for`,\n message: 'Missing required authorized_for field',\n });\n }\n });\n }\n\n if (data.properties && Array.isArray(data.properties)) {\n data.properties.forEach((prop, i) => {\n if (!prop.name) {\n report.schemaErrors.push({\n field: `properties[${i}].name`,\n message: 'Missing required name field',\n });\n }\n if (!prop.property_type) {\n report.schemaErrors.push({\n field: `properties[${i}].property_type`,\n message: 'Missing required property_type field',\n });\n }\n if (!prop.identifiers || !Array.isArray(prop.identifiers) || prop.identifiers.length === 0) {\n report.schemaErrors.push({\n field: `properties[${i}].identifiers`,\n message: 'Missing or empty identifiers array',\n });\n }\n });\n }\n }\n\n private extractDomains(properties: Property[]): Set<string> {\n const domains = new Set<string>();\n for (const prop of properties) {\n for (const id of prop.identifiers ?? []) {\n if (id.type === 'domain' || id.type === 'subdomain') {\n domains.add(id.value.toLowerCase());\n }\n }\n if (prop.publisher_domain) {\n domains.add(prop.publisher_domain.toLowerCase());\n }\n }\n return domains;\n }\n\n private async checkAgentHealth(agents: AuthorizedAgent[]): Promise<AgentHealthResult[]> {\n let completed = 0;\n return this.runConcurrent(agents, async agent => {\n const result = await this.probeAgent(agent);\n completed++;\n this.onProgress?.({ phase: 'agents', completed, total: agents.length });\n return result;\n });\n }\n\n private async probeAgent(agent: AuthorizedAgent): Promise<AgentHealthResult> {\n try {\n validateAgentUrl(agent.url);\n } catch (error) {\n return {\n url: agent.url,\n reachable: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n // adcp-client#1633 review: share a single AbortController across the\n // initial probe AND any redirect-follow so the total wall-clock stays\n // bounded by `this.timeoutMs`. Without this, each ssrfSafeFetch gets a\n // fresh budget and a malicious redirect chain doubles the wait.\n const sharedSignal = AbortSignal.timeout(this.timeoutMs);\n try {\n // adcp-client#1633: route through ssrfSafeFetch for DNS-pin / TOCTOU\n // defense. validateAgentUrl above is the literal-hostname gate; the\n // fetcher below catches DNS-resolved private addresses and rebinds.\n // Each call DNS-pins independently, so following a redirect via a\n // second ssrfSafeFetch validates the redirect target against the\n // address guards too.\n let result = await ssrfSafeFetch(agent.url, {\n method: 'HEAD',\n timeoutMs: this.timeoutMs,\n allowPrivateIp: isInternalProbesAllowed(),\n signal: sharedSignal,\n // Body cap is irrelevant for HEAD but keep small as defense-in-depth\n // in case the seller incorrectly returns a body on HEAD.\n maxBodyBytes: 1024,\n headers: {\n ...FETCH_HEADERS,\n 'User-Agent': this.userAgentHeader,\n From: this.fromHeader,\n },\n });\n\n // Follow one redirect with SSRF validation. ssrfSafeFetch sets\n // `redirect: 'manual'` so 3xx surfaces here with status + Location.\n if (result.status >= 300 && result.status < 400) {\n const location = result.headers['location'];\n if (!location) {\n return { url: agent.url, reachable: false, error: 'Redirect with no Location header' };\n }\n const redirectUrl = new URL(location, agent.url).toString();\n if (!redirectUrl.startsWith('https://')) {\n return { url: agent.url, reachable: false, error: 'Redirect to non-HTTPS URL' };\n }\n validateAgentUrl(redirectUrl);\n result = await ssrfSafeFetch(redirectUrl, {\n method: 'HEAD',\n timeoutMs: this.timeoutMs,\n allowPrivateIp: isInternalProbesAllowed(),\n signal: sharedSignal,\n maxBodyBytes: 1024,\n headers: {\n ...FETCH_HEADERS,\n 'User-Agent': this.userAgentHeader,\n From: this.fromHeader,\n },\n });\n }\n\n return {\n url: agent.url,\n reachable: (result.status >= 200 && result.status < 300) || result.status === 405, // 405 = HEAD rejected but server is alive\n statusCode: result.status,\n };\n } catch (error) {\n return {\n url: agent.url,\n reachable: false,\n error: this.sanitizeError(error),\n };\n }\n }\n\n private async checkPointers(\n authoritativeUrl: string,\n authoritativeDomains: Set<string>,\n report: NetworkCheckReport\n ): Promise<void> {\n const domains = Array.from(authoritativeDomains);\n\n let completed = 0;\n const results = await this.runConcurrent(domains, async domain => {\n const result = await this.checkDomainPointer(domain, authoritativeUrl);\n completed++;\n this.onProgress?.({ phase: 'pointers', completed, total: domains.length, domain });\n return result;\n });\n\n for (const result of results) {\n report.domains.push(result.detail);\n if (result.missing) report.missingPointers.push(result.missing);\n if (result.stale) report.stalePointers.push(result.stale);\n }\n }\n\n private async checkDomainPointer(\n domain: string,\n authoritativeUrl: string\n ): Promise<{\n detail: DomainDetail;\n missing?: MissingPointer;\n stale?: StalePointer;\n }> {\n const url = `https://${domain}/.well-known/adagents.json`;\n\n try {\n const pointer = await this.fetchJsonWithUrl<AdAgentsJson>(url, {\n mode: 'same-registrable-domain',\n originUrl: url,\n });\n const data = pointer.data;\n\n if (data.authoritative_location) {\n if (data.authoritative_location === authoritativeUrl) {\n return {\n detail: {\n domain,\n status: 'ok',\n pointerUrl: data.authoritative_location,\n errors: [],\n },\n };\n } else {\n return {\n detail: {\n domain,\n status: 'stale_pointer',\n pointerUrl: data.authoritative_location,\n errors: [`Pointer references ${data.authoritative_location}, expected ${authoritativeUrl}`],\n },\n stale: {\n domain,\n pointerUrl: data.authoritative_location,\n expectedUrl: authoritativeUrl,\n },\n };\n }\n }\n\n // No authoritative_location — the domain hosts its own file\n if (pointer.url === authoritativeUrl) {\n return {\n detail: { domain, status: 'ok', errors: [] },\n };\n }\n\n return {\n detail: {\n domain,\n status: 'stale_pointer',\n errors: [`adagents.json exists but has no authoritative_location pointing to ${authoritativeUrl}`],\n },\n stale: {\n domain,\n pointerUrl: pointer.url,\n expectedUrl: authoritativeUrl,\n },\n };\n } catch (error) {\n const msg = this.sanitizeError(error);\n this.logger.debug(`Failed to fetch pointer from ${domain}: ${msg}`);\n return {\n detail: { domain, status: 'missing_pointer', errors: [msg] },\n missing: { domain, error: msg },\n };\n }\n }\n\n private async checkOrphanedPointers(\n authoritativeUrl: string,\n extraDomains: string[],\n report: NetworkCheckReport\n ): Promise<void> {\n let completed = 0;\n const results = await this.runConcurrent(\n extraDomains,\n async (\n domain\n ): Promise<{\n domain: string;\n orphaned: boolean;\n pointerUrl: string;\n } | null> => {\n try {\n const pointerUrl = `https://${domain}/.well-known/adagents.json`;\n const pointer = await this.fetchJsonWithUrl<AdAgentsJson>(pointerUrl, {\n mode: 'same-registrable-domain',\n originUrl: pointerUrl,\n });\n const data = pointer.data;\n const result =\n data.authoritative_location === authoritativeUrl\n ? { domain, orphaned: true, pointerUrl: data.authoritative_location }\n : !data.authoritative_location && pointer.url === authoritativeUrl\n ? { domain, orphaned: true, pointerUrl: pointer.url }\n : null;\n return result;\n } catch {\n return null;\n } finally {\n completed++;\n this.onProgress?.({ phase: 'orphans', completed, total: extraDomains.length, domain });\n }\n }\n );\n\n for (const result of results) {\n if (result?.orphaned) {\n report.orphanedPointers.push({\n domain: result.domain,\n pointerUrl: result.pointerUrl,\n });\n report.domains.push({\n domain: result.domain,\n status: 'orphaned_pointer',\n pointerUrl: result.pointerUrl,\n errors: ['Domain has pointer file but is not listed in authoritative properties'],\n });\n }\n }\n }\n\n private async fetchJson<T>(\n url: string,\n redirectPolicy: AdAgentsRedirectPolicy = { mode: 'same-registrable-domain', originUrl: url }\n ): Promise<T> {\n return (await this.fetchJsonWithUrl<T>(url, redirectPolicy)).data;\n }\n\n private async fetchJsonWithUrl<T>(\n url: string,\n redirectPolicy: AdAgentsRedirectPolicy = { mode: 'same-registrable-domain', originUrl: url }\n ): Promise<{ data: T; url: string }> {\n validateAgentUrl(url);\n // Shared AbortController: total wall-clock bounded by `this.timeoutMs`\n // across the initial fetch + any 1-redirect follow. See `probeAgent`\n // for the same pattern + rationale.\n const sharedSignal = AbortSignal.timeout(this.timeoutMs);\n try {\n // adcp-client#1633: ssrfSafeFetch handles DNS-pin / TOCTOU / body cap\n // / scheme guard / redirect: 'manual' in one wrapper. Each ssrfSafeFetch\n // call DNS-pins independently — the redirect-follow path below\n // re-validates against the address guards via the second invocation.\n const result = await ssrfSafeFetchAdAgents(\n url,\n {\n timeoutMs: this.timeoutMs,\n allowPrivateIp: isInternalProbesAllowed(),\n signal: sharedSignal,\n maxBodyBytes: MAX_RESPONSE_BYTES,\n headers: {\n ...FETCH_HEADERS,\n 'User-Agent': this.userAgentHeader,\n From: this.fromHeader,\n },\n },\n redirectPolicy\n );\n\n if (result.status < 200 || result.status >= 300) {\n throw new Error(`HTTP ${result.status}`);\n }\n const parsed = decodeBodyAsJsonOrText(result.body, result.headers['content-type']);\n if (typeof parsed === 'string') {\n // decodeBodyAsJsonOrText falls back to text on non-JSON or parse-fail.\n // The callers here (adagents.json) require JSON, so re-attempt parse\n // and surface a clear error if it's not.\n try {\n return { data: JSON.parse(parsed) as T, url: result.url };\n } catch {\n throw new Error('Response was not valid JSON');\n }\n }\n return { data: parsed as T, url: result.url };\n } catch (error) {\n if (error instanceof SsrfRefusedError && error.code === 'body_exceeds_limit') {\n throw new Error('Response too large');\n }\n throw error;\n }\n }\n\n private sanitizeError(error: unknown): string {\n // adcp-client#1633 review: SSRF policy refusals must surface distinctly\n // so operators can tell \"host unreachable\" apart from \"host refused on\n // policy grounds.\" Without this carve-out, an attacker-supplied URL\n // resolving to a private/IMDS address would masquerade as a generic\n // fetch failure (the catch-swallow class flagged in #1618 review).\n // The transient codes (DNS / body-cap) still surface as their plain\n // strings — the user-visible distinction is `[SSRF refused]` in front\n // of the policy-class messages.\n if (error instanceof SsrfRefusedError) {\n if (SSRF_TRANSIENT_CODES.has(error.code)) {\n // Map transient codes to existing strings the test suite expects.\n if (error.code === 'dns_lookup_failed' || error.code === 'dns_empty') return 'DNS resolution failed';\n if (error.code === 'body_exceeds_limit') return 'Response too large';\n }\n // Policy refusal: prefix so the report makes the distinction visible.\n return `[SSRF refused] ${error.message}`;\n }\n if (error instanceof AdAgentsRedirectRefusedError) {\n return error.message;\n }\n if (error instanceof Error) {\n if (error.name === 'AbortError') return 'Request timed out';\n if (error.message.startsWith('HTTP ')) return error.message;\n if (error.message.startsWith('Request timed out')) return error.message;\n if (error.message.includes('ECONNREFUSED')) return 'Connection refused';\n if (error.message.includes('ENOTFOUND')) return 'DNS resolution failed';\n if (error.message.includes('certificate')) return 'TLS error';\n if (error.message.includes('Response too large')) return 'Response too large';\n if (error.message.includes('not allowed')) return error.message;\n if (error.message.includes('must use HTTPS')) return error.message;\n if (error.message.includes('no Location header')) return error.message;\n }\n return 'Request failed';\n }\n\n /**\n * Run async operations with concurrency limit, preserving input order.\n */\n private async runConcurrent<T, R>(items: T[], fn: (item: T) => Promise<R>): Promise<R[]> {\n const results = new Array<R>(items.length);\n let active = 0;\n let nextIdx = 0;\n\n return new Promise<R[]>((resolve, reject) => {\n if (items.length === 0) return resolve([]);\n\n const next = (): void => {\n while (active < this.concurrency && nextIdx < items.length) {\n const i = nextIdx++;\n active++;\n fn(items[i]!)\n .then(r => {\n results[i] = r;\n active--;\n if (nextIdx >= items.length && active === 0) {\n resolve(results);\n } else {\n next();\n }\n })\n .catch(reject);\n }\n };\n next();\n });\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/lib/discovery/network-consistency-checker.ts"],"sourcesContent":["/**\n * Network Consistency Checker for AdCP\n *\n * Validates managed publisher network deployments by checking that:\n * 1. The authoritative adagents.json is well-formed\n * 2. Each property domain has a valid pointer file\n * 3. No orphaned or stale pointer files exist\n * 4. All authorized agent endpoints are reachable\n */\n\nimport { createLogger, type LogLevel } from '../utils/logger';\nimport { LIBRARY_VERSION } from '../version';\nimport { validateUserAgent } from '../utils/validate-user-agent';\nimport { validateAgentUrl } from '../validation';\nimport { ssrfSafeFetch, SsrfRefusedError, SSRF_TRANSIENT_CODES, decodeBodyAsJsonOrText } from '../net/ssrf-fetch';\nimport { isInternalProbesAllowed } from '../utils/probe-policy';\nimport type { AdAgentsJson, AuthorizedAgent, Property } from './types';\nimport { AdAgentsRedirectRefusedError, ssrfSafeFetchAdAgents, type AdAgentsRedirectPolicy } from './adagents-redirects';\n\n// ====== Configuration ======\n\n/** Progress update emitted after each domain or agent check completes. */\nexport interface CheckProgress {\n phase: 'pointers' | 'orphans' | 'agents';\n completed: number;\n total: number;\n domain?: string;\n}\n\nexport interface NetworkConsistencyCheckerConfig {\n /** URL of the authoritative adagents.json file */\n authoritativeUrl?: string;\n /** Domains to check (if no authoritativeUrl, fetches pointer from first domain) */\n domains?: string[];\n /** Max parallel fetches (default 10, max 50) */\n concurrency?: number;\n /** Per-request timeout in ms (default 10000) */\n timeoutMs?: number;\n logLevel?: LogLevel;\n userAgent?: string;\n /** Called after each domain/agent check completes. */\n onProgress?: (progress: CheckProgress) => void;\n}\n\n// ====== Report types ======\n\nexport interface OrphanedPointer {\n domain: string;\n pointerUrl: string;\n}\n\nexport interface StalePointer {\n domain: string;\n pointerUrl: string;\n expectedUrl: string;\n}\n\nexport interface MissingPointer {\n domain: string;\n error: string;\n}\n\nexport interface SchemaError {\n field: string;\n message: string;\n}\n\nexport interface AgentHealthResult {\n url: string;\n reachable: boolean;\n statusCode?: number;\n error?: string;\n}\n\nexport type DomainStatus = 'ok' | 'missing_pointer' | 'stale_pointer' | 'orphaned_pointer' | 'error';\n\nexport interface DomainDetail {\n domain: string;\n status: DomainStatus;\n pointerUrl?: string;\n errors: string[];\n}\n\nexport interface CheckSummary {\n totalDomains: number;\n validPointers: number;\n orphanedPointers: number;\n stalePointers: number;\n missingPointers: number;\n schemaErrors: number;\n unreachableAgents: number;\n totalIssues: number;\n}\n\nexport interface NetworkCheckReport {\n checkedAt: string;\n authoritativeUrl: string;\n coverage: number;\n summary: CheckSummary;\n orphanedPointers: OrphanedPointer[];\n stalePointers: StalePointer[];\n missingPointers: MissingPointer[];\n schemaErrors: SchemaError[];\n agentHealth: AgentHealthResult[];\n domains: DomainDetail[];\n}\n\n// ====== Implementation ======\n\nconst DEFAULT_CONCURRENCY = 10;\nconst MAX_CONCURRENCY = 50;\nconst DEFAULT_TIMEOUT_MS = 10_000;\nconst MAX_RESPONSE_BYTES = 1_048_576; // 1 MB\n\nconst FETCH_HEADERS = {\n Accept: 'application/json, text/plain, */*',\n 'Accept-Language': 'en-US,en;q=0.9',\n 'Accept-Encoding': 'gzip, deflate, br',\n};\n\nexport class NetworkConsistencyChecker {\n private readonly authoritativeUrl?: string;\n private readonly domains: string[];\n private readonly concurrency: number;\n private readonly timeoutMs: number;\n private readonly logger: ReturnType<typeof createLogger>;\n private readonly userAgentHeader: string;\n private readonly fromHeader: string;\n private readonly onProgress?: (progress: CheckProgress) => void;\n\n constructor(config: NetworkConsistencyCheckerConfig) {\n if (!config.authoritativeUrl && (!config.domains || config.domains.length === 0)) {\n throw new Error('Either authoritativeUrl or domains must be provided');\n }\n if (config.userAgent) {\n validateUserAgent(config.userAgent);\n }\n\n this.authoritativeUrl = config.authoritativeUrl;\n this.domains = config.domains ?? [];\n this.concurrency = Math.min(config.concurrency ?? DEFAULT_CONCURRENCY, MAX_CONCURRENCY);\n this.timeoutMs = config.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n if (this.concurrency < 1) throw new Error('concurrency must be >= 1');\n if (this.timeoutMs < 1) throw new Error('timeoutMs must be >= 1');\n this.logger = createLogger({ level: config.logLevel ?? 'warn' }).child('NetworkConsistencyChecker');\n this.userAgentHeader = `adcp-network-checker/${LIBRARY_VERSION} (+https://adcontextprotocol.org)`;\n this.fromHeader = config.userAgent\n ? `adcp-network-checker@adcontextprotocol.org (${config.userAgent}; v${LIBRARY_VERSION})`\n : `adcp-network-checker@adcontextprotocol.org (v${LIBRARY_VERSION})`;\n this.onProgress = config.onProgress;\n }\n\n async check(): Promise<NetworkCheckReport> {\n const report: NetworkCheckReport = {\n checkedAt: new Date().toISOString(),\n authoritativeUrl: '',\n coverage: 0,\n summary: {\n totalDomains: 0,\n validPointers: 0,\n orphanedPointers: 0,\n stalePointers: 0,\n missingPointers: 0,\n schemaErrors: 0,\n unreachableAgents: 0,\n totalIssues: 0,\n },\n orphanedPointers: [],\n stalePointers: [],\n missingPointers: [],\n schemaErrors: [],\n agentHealth: [],\n domains: [],\n };\n\n // Step 1: Resolve and fetch the authoritative file\n const { url: resolvedUrl, data: authData } = await this.fetchAuthoritative(report);\n report.authoritativeUrl = resolvedUrl;\n\n if (!authData) {\n this.computeSummary(report, 0);\n return report;\n }\n\n // Step 2: Validate authoritative file schema\n this.validateSchema(authData, report);\n\n // Step 3: Extract domains from authoritative properties\n const authoritativeDomains = this.extractDomains(authData.properties ?? []);\n\n // Step 4: Check agent endpoint health\n if (authData.authorized_agents && authData.authorized_agents.length > 0) {\n report.agentHealth = await this.checkAgentHealth(authData.authorized_agents);\n }\n\n // Step 5: Check pointer files on authoritative domains\n await this.checkPointers(resolvedUrl, authoritativeDomains, report);\n\n // Step 6: Check for orphaned pointers (domains not in authoritative file)\n const extraDomains = this.domains.filter(d => !authoritativeDomains.has(d));\n if (extraDomains.length > 0) {\n await this.checkOrphanedPointers(resolvedUrl, extraDomains, report);\n }\n\n // Step 7: Compute coverage and summary\n const total = authoritativeDomains.size;\n const valid = report.domains.filter(d => d.status === 'ok').length;\n report.coverage = total > 0 ? valid / total : 0;\n this.computeSummary(report, total);\n\n return report;\n }\n\n private computeSummary(report: NetworkCheckReport, totalDomains: number): void {\n const unreachableAgents = report.agentHealth.filter(a => !a.reachable).length;\n report.summary = {\n totalDomains,\n validPointers: report.domains.filter(d => d.status === 'ok').length,\n orphanedPointers: report.orphanedPointers.length,\n stalePointers: report.stalePointers.length,\n missingPointers: report.missingPointers.length,\n schemaErrors: report.schemaErrors.length,\n unreachableAgents,\n totalIssues:\n report.schemaErrors.length +\n report.missingPointers.length +\n report.stalePointers.length +\n report.orphanedPointers.length +\n unreachableAgents,\n };\n }\n\n // ---- Internal methods ----\n\n private async fetchAuthoritative(report: NetworkCheckReport): Promise<{ url: string; data: AdAgentsJson | null }> {\n let url = this.authoritativeUrl;\n\n // If no authoritative URL, discover it from the first domain's pointer\n if (!url) {\n const firstDomain = this.domains[0];\n try {\n const pointerUrl = `https://${firstDomain}/.well-known/adagents.json`;\n const pointer = await this.fetchJsonWithUrl<AdAgentsJson>(pointerUrl, {\n mode: 'same-registrable-domain',\n originUrl: pointerUrl,\n });\n const pointerData = pointer.data;\n if (pointerData.authoritative_location) {\n url = pointerData.authoritative_location;\n } else {\n return { url: pointer.url, data: pointerData };\n }\n } catch (error) {\n report.schemaErrors.push({\n field: 'authoritative_location',\n message: `Failed to discover authoritative URL from ${firstDomain}: ${this.sanitizeError(error)}`,\n });\n return { url: '', data: null };\n }\n }\n\n try {\n const authoritative = await this.fetchJsonWithUrl<AdAgentsJson>(url, {\n mode: 'same-registrable-domain',\n originUrl: url,\n });\n const data = authoritative.data;\n const resolvedUrl = authoritative.url;\n\n // Follow at most one authoritative_location redirect\n if (data.authoritative_location && !data.authorized_agents) {\n const redirectUrl = data.authoritative_location;\n if (!redirectUrl.startsWith('https://')) {\n report.schemaErrors.push({\n field: 'authoritative_location',\n message: `authoritative_location must use HTTPS: ${redirectUrl}`,\n });\n return { url, data: null };\n }\n if (redirectUrl === resolvedUrl) {\n report.schemaErrors.push({\n field: 'authoritative_location',\n message: 'authoritative_location points to itself',\n });\n return { url: resolvedUrl, data: null };\n }\n const redirect = await this.fetchJsonWithUrl<AdAgentsJson>(redirectUrl, { mode: 'none' });\n const redirectData = redirect.data;\n // Do not follow further redirects from the redirect target\n return { url: redirect.url, data: redirectData };\n }\n\n return { url: resolvedUrl, data };\n } catch (error) {\n report.schemaErrors.push({\n field: '$root',\n message: `Failed to fetch authoritative file: ${this.sanitizeError(error)}`,\n });\n return { url: url ?? '', data: null };\n }\n }\n\n private validateSchema(data: AdAgentsJson, report: NetworkCheckReport): void {\n if (!data.authorized_agents || !Array.isArray(data.authorized_agents)) {\n report.schemaErrors.push({\n field: 'authorized_agents',\n message: 'Missing or invalid authorized_agents array',\n });\n } else {\n data.authorized_agents.forEach((agent, i) => {\n if (!agent.url) {\n report.schemaErrors.push({\n field: `authorized_agents[${i}].url`,\n message: 'Missing required url field',\n });\n }\n if (!agent.authorized_for) {\n report.schemaErrors.push({\n field: `authorized_agents[${i}].authorized_for`,\n message: 'Missing required authorized_for field',\n });\n }\n });\n }\n\n if (data.properties && Array.isArray(data.properties)) {\n data.properties.forEach((prop, i) => {\n if (!prop.name) {\n report.schemaErrors.push({\n field: `properties[${i}].name`,\n message: 'Missing required name field',\n });\n }\n if (!prop.property_type) {\n report.schemaErrors.push({\n field: `properties[${i}].property_type`,\n message: 'Missing required property_type field',\n });\n }\n if (!prop.identifiers || !Array.isArray(prop.identifiers) || prop.identifiers.length === 0) {\n report.schemaErrors.push({\n field: `properties[${i}].identifiers`,\n message: 'Missing or empty identifiers array',\n });\n }\n });\n }\n }\n\n private extractDomains(properties: Property[]): Set<string> {\n const domains = new Set<string>();\n for (const prop of properties) {\n for (const id of prop.identifiers ?? []) {\n if (id.type === 'domain' || id.type === 'subdomain') {\n domains.add(id.value.toLowerCase());\n }\n }\n if (prop.publisher_domain) {\n domains.add(prop.publisher_domain.toLowerCase());\n }\n }\n return domains;\n }\n\n private async checkAgentHealth(agents: AuthorizedAgent[]): Promise<AgentHealthResult[]> {\n let completed = 0;\n return this.runConcurrent(agents, async agent => {\n const result = await this.probeAgent(agent);\n completed++;\n this.onProgress?.({ phase: 'agents', completed, total: agents.length });\n return result;\n });\n }\n\n private async probeAgent(agent: AuthorizedAgent): Promise<AgentHealthResult> {\n try {\n validateAgentUrl(agent.url);\n } catch (error) {\n return {\n url: agent.url,\n reachable: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n // adcp-client#1633 review: share a single AbortController across the\n // initial probe AND any redirect-follow so the total wall-clock stays\n // bounded by `this.timeoutMs`. Without this, each ssrfSafeFetch gets a\n // fresh budget and a malicious redirect chain doubles the wait.\n const sharedSignal = AbortSignal.timeout(this.timeoutMs);\n try {\n // adcp-client#1633: route through ssrfSafeFetch for DNS-pin / TOCTOU\n // defense. validateAgentUrl above is the literal-hostname gate; the\n // fetcher below catches DNS-resolved private addresses and rebinds.\n // Each call DNS-pins independently, so following a redirect via a\n // second ssrfSafeFetch validates the redirect target against the\n // address guards too.\n let result = await ssrfSafeFetch(agent.url, {\n method: 'HEAD',\n timeoutMs: this.timeoutMs,\n allowPrivateIp: isInternalProbesAllowed(),\n signal: sharedSignal,\n // Body cap is irrelevant for HEAD but keep small as defense-in-depth\n // in case the seller incorrectly returns a body on HEAD.\n maxBodyBytes: 1024,\n headers: {\n ...FETCH_HEADERS,\n 'User-Agent': this.userAgentHeader,\n From: this.fromHeader,\n },\n });\n\n // Follow one redirect with SSRF validation. ssrfSafeFetch sets\n // `redirect: 'manual'` so 3xx surfaces here with status + Location.\n if (result.status >= 300 && result.status < 400) {\n const location = result.headers['location'];\n if (!location) {\n return { url: agent.url, reachable: false, error: 'Redirect with no Location header' };\n }\n const redirectUrl = new URL(location, agent.url).toString();\n if (!redirectUrl.startsWith('https://')) {\n return { url: agent.url, reachable: false, error: 'Redirect to non-HTTPS URL' };\n }\n validateAgentUrl(redirectUrl);\n result = await ssrfSafeFetch(redirectUrl, {\n method: 'HEAD',\n timeoutMs: this.timeoutMs,\n allowPrivateIp: isInternalProbesAllowed(),\n signal: sharedSignal,\n maxBodyBytes: 1024,\n headers: {\n ...FETCH_HEADERS,\n 'User-Agent': this.userAgentHeader,\n From: this.fromHeader,\n },\n });\n }\n\n return {\n url: agent.url,\n reachable: (result.status >= 200 && result.status < 300) || result.status === 405, // 405 = HEAD rejected but server is alive\n statusCode: result.status,\n };\n } catch (error) {\n return {\n url: agent.url,\n reachable: false,\n error: this.sanitizeError(error),\n };\n }\n }\n\n private async checkPointers(\n authoritativeUrl: string,\n authoritativeDomains: Set<string>,\n report: NetworkCheckReport\n ): Promise<void> {\n const domains = Array.from(authoritativeDomains);\n\n let completed = 0;\n const results = await this.runConcurrent(domains, async domain => {\n const result = await this.checkDomainPointer(domain, authoritativeUrl);\n completed++;\n this.onProgress?.({ phase: 'pointers', completed, total: domains.length, domain });\n return result;\n });\n\n for (const result of results) {\n report.domains.push(result.detail);\n if (result.missing) report.missingPointers.push(result.missing);\n if (result.stale) report.stalePointers.push(result.stale);\n }\n }\n\n private async checkDomainPointer(\n domain: string,\n authoritativeUrl: string\n ): Promise<{\n detail: DomainDetail;\n missing?: MissingPointer;\n stale?: StalePointer;\n }> {\n const url = `https://${domain}/.well-known/adagents.json`;\n\n try {\n const pointer = await this.fetchJsonWithUrl<AdAgentsJson>(url, {\n mode: 'same-registrable-domain',\n originUrl: url,\n });\n const data = pointer.data;\n\n if (data.authoritative_location) {\n if (data.authoritative_location === authoritativeUrl) {\n return {\n detail: {\n domain,\n status: 'ok',\n pointerUrl: data.authoritative_location,\n errors: [],\n },\n };\n } else {\n return {\n detail: {\n domain,\n status: 'stale_pointer',\n pointerUrl: data.authoritative_location,\n errors: [`Pointer references ${data.authoritative_location}, expected ${authoritativeUrl}`],\n },\n stale: {\n domain,\n pointerUrl: data.authoritative_location,\n expectedUrl: authoritativeUrl,\n },\n };\n }\n }\n\n // No authoritative_location — the domain hosts its own file\n if (pointer.url === authoritativeUrl) {\n return {\n detail: { domain, status: 'ok', errors: [] },\n };\n }\n\n return {\n detail: {\n domain,\n status: 'stale_pointer',\n errors: [`adagents.json exists but has no authoritative_location pointing to ${authoritativeUrl}`],\n },\n stale: {\n domain,\n pointerUrl: pointer.url,\n expectedUrl: authoritativeUrl,\n },\n };\n } catch (error) {\n const msg = this.sanitizeError(error);\n this.logger.debug(`Failed to fetch pointer from ${domain}: ${msg}`);\n return {\n detail: { domain, status: 'missing_pointer', errors: [msg] },\n missing: { domain, error: msg },\n };\n }\n }\n\n private async checkOrphanedPointers(\n authoritativeUrl: string,\n extraDomains: string[],\n report: NetworkCheckReport\n ): Promise<void> {\n let completed = 0;\n const results = await this.runConcurrent(\n extraDomains,\n async (\n domain\n ): Promise<{\n domain: string;\n orphaned: boolean;\n pointerUrl: string;\n } | null> => {\n try {\n const pointerUrl = `https://${domain}/.well-known/adagents.json`;\n const pointer = await this.fetchJsonWithUrl<AdAgentsJson>(pointerUrl, {\n mode: 'same-registrable-domain',\n originUrl: pointerUrl,\n });\n const data = pointer.data;\n const result =\n data.authoritative_location === authoritativeUrl\n ? { domain, orphaned: true, pointerUrl: data.authoritative_location }\n : !data.authoritative_location && pointer.url === authoritativeUrl\n ? { domain, orphaned: true, pointerUrl: pointer.url }\n : null;\n return result;\n } catch {\n return null;\n } finally {\n completed++;\n this.onProgress?.({ phase: 'orphans', completed, total: extraDomains.length, domain });\n }\n }\n );\n\n for (const result of results) {\n if (result?.orphaned) {\n report.orphanedPointers.push({\n domain: result.domain,\n pointerUrl: result.pointerUrl,\n });\n report.domains.push({\n domain: result.domain,\n status: 'orphaned_pointer',\n pointerUrl: result.pointerUrl,\n errors: ['Domain has pointer file but is not listed in authoritative properties'],\n });\n }\n }\n }\n\n private async fetchJson<T>(\n url: string,\n redirectPolicy: AdAgentsRedirectPolicy = { mode: 'same-registrable-domain', originUrl: url }\n ): Promise<T> {\n return (await this.fetchJsonWithUrl<T>(url, redirectPolicy)).data;\n }\n\n private async fetchJsonWithUrl<T>(\n url: string,\n redirectPolicy: AdAgentsRedirectPolicy = { mode: 'same-registrable-domain', originUrl: url }\n ): Promise<{ data: T; url: string }> {\n validateAgentUrl(url);\n // Shared AbortController: total wall-clock bounded by `this.timeoutMs`\n // across the initial fetch + any 1-redirect follow. See `probeAgent`\n // for the same pattern + rationale.\n const sharedSignal = AbortSignal.timeout(this.timeoutMs);\n try {\n // adcp-client#1633: ssrfSafeFetch handles DNS-pin / TOCTOU / body cap\n // / scheme guard / redirect: 'manual' in one wrapper. Each ssrfSafeFetch\n // call DNS-pins independently — the redirect-follow path below\n // re-validates against the address guards via the second invocation.\n const result = await ssrfSafeFetchAdAgents(\n url,\n {\n timeoutMs: this.timeoutMs,\n allowPrivateIp: isInternalProbesAllowed(),\n signal: sharedSignal,\n maxBodyBytes: MAX_RESPONSE_BYTES,\n headers: {\n ...FETCH_HEADERS,\n 'User-Agent': this.userAgentHeader,\n From: this.fromHeader,\n },\n },\n redirectPolicy\n );\n\n if (result.status < 200 || result.status >= 300) {\n throw new Error(`HTTP ${result.status}`);\n }\n const parsed = decodeBodyAsJsonOrText(result.body, result.headers['content-type']);\n if (typeof parsed === 'string') {\n // decodeBodyAsJsonOrText falls back to text on non-JSON or parse-fail.\n // The callers here (adagents.json) require JSON, so re-attempt parse\n // and surface a clear error if it's not.\n try {\n return { data: JSON.parse(parsed) as T, url: result.url };\n } catch {\n throw new Error('Response was not valid JSON');\n }\n }\n return { data: parsed as T, url: result.url };\n } catch (error) {\n if (error instanceof SsrfRefusedError && error.code === 'body_exceeds_limit') {\n throw new Error('Response too large');\n }\n throw error;\n }\n }\n\n private sanitizeError(error: unknown): string {\n // adcp-client#1633 review: SSRF policy refusals must surface distinctly\n // so operators can tell \"host unreachable\" apart from \"host refused on\n // policy grounds.\" Without this carve-out, an attacker-supplied URL\n // resolving to a private/IMDS address would masquerade as a generic\n // fetch failure (the catch-swallow class flagged in #1618 review).\n // The transient codes (DNS / body-cap) still surface as their plain\n // strings — the user-visible distinction is `[SSRF refused]` in front\n // of the policy-class messages.\n if (error instanceof SsrfRefusedError) {\n if (SSRF_TRANSIENT_CODES.has(error.code)) {\n // Map transient codes to existing strings the test suite expects.\n if (error.code === 'dns_lookup_failed' || error.code === 'dns_empty') return 'DNS resolution failed';\n if (error.code === 'body_exceeds_limit') return 'Response too large';\n }\n // Policy refusal: prefix so the report makes the distinction visible.\n return `[SSRF refused] ${error.message}`;\n }\n if (error instanceof AdAgentsRedirectRefusedError) {\n return error.message;\n }\n if (error instanceof Error) {\n if (error.name === 'AbortError') return 'Request timed out';\n if (error.message.startsWith('HTTP ')) return error.message;\n if (error.message.startsWith('Request timed out')) return error.message;\n if (error.message.includes('ECONNREFUSED')) return 'Connection refused';\n if (error.message.includes('ENOTFOUND')) return 'DNS resolution failed';\n if (error.message.includes('certificate')) return 'TLS error';\n if (error.message.includes('Response too large')) return 'Response too large';\n if (error.message.includes('not allowed')) return error.message;\n if (error.message.includes('must use HTTPS')) return error.message;\n if (error.message.includes('no Location header')) return error.message;\n }\n return 'Request failed';\n }\n\n /**\n * Run async operations with concurrency limit, preserving input order.\n */\n private async runConcurrent<T, R>(items: T[], fn: (item: T) => Promise<R>): Promise<R[]> {\n const results = new Array<R>(items.length);\n let active = 0;\n let nextIdx = 0;\n\n return new Promise<R[]>((resolve, reject) => {\n if (items.length === 0) return resolve([]);\n\n const next = (): void => {\n while (active < this.concurrency && nextIdx < items.length) {\n const i = nextIdx++;\n active++;\n fn(items[i]!)\n .then(r => {\n results[i] = r;\n active--;\n if (nextIdx >= items.length && active === 0) {\n resolve(results);\n } else {\n next();\n }\n })\n .catch(reject);\n }\n };\n next();\n });\n }\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 { SingleAgentClient } from "../core/SingleAgentClient.mjs";
8
2
  import { getPropertyIndex } from "./property-index.mjs";
9
3
  import { createLogger } from "../utils/logger.mjs";