@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/registry/sync.ts"],"sourcesContent":["import { EventEmitter } from 'node:events';\nimport type { RegistryClient } from './index';\nimport type {\n AgentSearchResult,\n AgentCompliance,\n AuthorizationEntry,\n AgentSearchResponse,\n FeedFreshness,\n} from './types.generated';\nimport type { CatalogEvent, FeedResponse, PropertyEventPayload, PropertyIdentifier, ResolvedBrand } from './types';\nimport type { FeedStreamQuery } from './feed-stream';\nimport {\n FeedStreamCursorExpiredError,\n FeedStreamUnsupportedError,\n FeedStreamHttpError,\n sanitizeStreamText,\n} from './feed-stream';\nimport type { CursorStore } from './cursor-store';\nimport { InMemoryCursorStore } from './cursor-store';\n\n// ====== Configuration ======\n\nexport interface RegistrySyncConfig {\n /** RegistryClient instance to use for API calls. */\n client: RegistryClient;\n /**\n * Feed transport for tailing changes after bootstrap:\n * - `'auto'` (default): try the SSE stream, fall back to polling on an\n * unsupported endpoint (404/406), proxy/network failure, or stream parse\n * failure.\n * - `'stream'`: SSE only; reconnect on failure and never fall back to polling.\n * - `'poll'`: polling only.\n */\n transport?: 'auto' | 'stream' | 'poll';\n /** Polling interval in milliseconds. Default: 30000 (30s). */\n pollIntervalMs?: number;\n /**\n * Comma-separated event type filter (glob, e.g. `authorization.*`) applied to\n * every feed read (bootstrap drain, polling, and SSE).\n *\n * A persisted cursor is scoped to the logical `types` subscription it was\n * minted under: a cursor from a broader subscription can skip events that were\n * filtered out previously. This is NOT enforced by the cursor store (the store\n * holds only the cursor string), so if you change `types` you must\n * `reset()` before `start()`. With a persistent {@link FileCursorStore} that\n * survives restarts, changing `types` between deploys against the same store\n * path will silently resume from a foreign cursor — point each subscription at\n * its own store path, or clear the store when the filter changes.\n */\n types?: string;\n /** Max events requested per feed page (polling and SSE). Default: 1000. */\n feedPageLimit?: number;\n /**\n * Server-side caught-up interval hint for the SSE stream, in **seconds** (5–60,\n * default 15) — maps to the `poll_interval_seconds` query param. Note the unit:\n * `pollIntervalMs` and `streamIdleTimeoutMs` are milliseconds.\n */\n streamPollIntervalSeconds?: number;\n /**\n * Client-side idle watchdog: reconnect the stream if no feed page or heartbeat\n * arrives within this window. Must exceed the server poll interval.\n * Default: 90000 (90s).\n */\n streamIdleTimeoutMs?: number;\n /** Reconnect backoff floor in ms. Default: 1000. */\n streamReconnectMinMs?: number;\n /** Reconnect backoff ceiling in ms. Default: 30000. */\n streamReconnectMaxMs?: number;\n /**\n * Consecutive stream failures (with no successful message in between) before\n * `'auto'` mode falls back to polling. Default: 3. Ignored in `'stream'` mode.\n */\n maxStreamFailures?: number;\n /** Choose which indexes to maintain. */\n indexes?: {\n /** Agent inventory profiles. Default: true. */\n agents?: boolean;\n /** Authorization entries (agent→domain mappings). Default: true. */\n authorizations?: boolean;\n /** Property feed records (property_rid→property and publisher domain→properties). Default: true. */\n properties?: boolean;\n /** Ordered brand hierarchy chains (self → parents → house). Default: true. */\n brandHierarchies?: boolean;\n };\n /** Optional cursor store for persisting the feed cursor between restarts. */\n cursorStore?: CursorStore;\n /** Called when RegistrySync intentionally ignores an event family it does not index. */\n onIgnoredEvent?: (event: CatalogEvent, reason: string) => void;\n /** Called on errors during polling/bootstrap. */\n onError?: (error: Error) => void;\n}\n\nexport type RegistrySyncState = 'idle' | 'bootstrapping' | 'syncing' | 'error';\n\n/** Active feed transport once syncing. */\nexport type RegistrySyncTransport = 'stream' | 'poll';\n\n/**\n * Outcome of one SSE connection, driving the reconnect loop.\n * - `closed`: the server ended the stream cleanly (EOF), no error.\n * - `reconnect`: a transport/parse failure or a server `feed_stream_error` —\n * counts toward `auto` polling fallback.\n */\ntype StreamDisposition = 'closed' | 'reconnect' | 'rebootstrap' | 'fallback' | 'fatal' | 'stopped';\ntype RegistrySyncComplianceStatus = AgentCompliance['status'] | 'opted_out';\ntype AuthorizationRemoveOptions = {\n matchByRowId?: boolean;\n fallbackToTupleOnMissingRowId?: boolean;\n};\n\n// ====== Event types ======\n\nexport interface RegistrySyncEvents {\n bootstrap: [{ agentCount: number; authorizationCount: number }];\n sync: [{ cursor: string; eventsApplied: number }];\n /** Emitted for each event applied during polling. Not emitted during bootstrap. */\n event: [{ event: CatalogEvent }];\n error: [{ error: Error }];\n /** Emitted when an agent's compliance status changes. */\n compliance_changed: [\n { agentUrl: string; previousStatus: RegistrySyncComplianceStatus; currentStatus: RegistrySyncComplianceStatus },\n ];\n stateChange: [{ from: RegistrySyncState; to: RegistrySyncState }];\n /** Emitted whenever a feed page or heartbeat carries freshness metadata, for lag monitoring. */\n freshness: [{ freshness: FeedFreshness }];\n /** Emitted when the active feed transport changes (e.g. stream → polling fallback). */\n transport: [{ transport: RegistrySyncTransport }];\n /** Emitted when an event is intentionally not indexed by RegistrySync. */\n ignoredEvent: [{ event: CatalogEvent; reason: string }];\n}\n\n// ====== Agent filter for client-side search ======\n\nexport interface AgentFilter {\n type?: string;\n channels?: string[];\n markets?: string[];\n categories?: string[];\n property_types?: string[];\n tags?: string[];\n delivery_types?: string[];\n has_tmp?: boolean;\n min_properties?: number;\n compliance_status?: RegistrySyncComplianceStatus[];\n}\n\nexport type RegistrySyncProperty = {\n /** Stable registry property RID. */\n property_rid: string;\n /** Publisher domain that owns the property, when supplied by the feed. */\n publisher_domain?: string;\n identifiers?: PropertyIdentifier[];\n classification?: string;\n source?: PropertyEventPayload['source'];\n property?: PropertyEventPayload['property'];\n changed_fields?: string[];\n last_resolved_at?: string;\n reactivated_at?: string;\n reason?: string;\n evidence?: string;\n [key: string]: unknown;\n};\n\n// ====== RegistrySync ======\n\n/**\n * In-memory replica of the AdCP registry.\n *\n * Bootstraps from the agent search endpoint, then tails the change feed —\n * Server-Sent Events by default (`transport: 'auto'`), falling back to polling\n * `/api/registry/feed` when streaming is unavailable — to keep its indexes\n * current for zero-latency lookups.\n *\n * **Staleness:** lookups (`getAgent`, `isAuthorized`, the authorization getters)\n * return the last synced state. After a transient failure the engine keeps\n * reconnecting/polling, but a fatal error (e.g. `401`) leaves `state === 'error'`\n * while the indexes still hold their last values. For decisions where staleness\n * is unsafe (e.g. authorization enforcement), gate on `state` and\n * `getLagSeconds()` / `getFreshness()` rather than trusting a lookup blindly.\n * Index size is bounded only by registry trust — a replica mirrors the whole\n * registry, so an untrusted/compromised feed could grow memory without limit.\n *\n * @example\n * ```ts\n * const client = new RegistryClient({ apiKey: 'sk_...' });\n * const sync = new RegistrySync({ client }); // transport: 'auto' (SSE, polling fallback)\n *\n * // Zero-latency lookups\n * sync.on('event', ({ event }) => console.log('registry change:', event.event_type));\n *\n * // Lag monitoring for the SSE feed\n * sync.on('transport', ({ transport }) => console.log('feed transport:', transport));\n * sync.on('freshness', ({ freshness }) => {\n * if ((freshness.lag_seconds ?? 0) > 300) console.warn('registry feed lag > 5m');\n * });\n *\n * await sync.start();\n * const agent = sync.getAgent('https://ads.example.com');\n * const authorized = sync.isAuthorized('https://ads.example.com', 'publisher.com');\n * const ctv = sync.findAgents({ channels: ['ctv'], markets: ['US'] });\n * sync.stop();\n * ```\n */\nexport class RegistrySync extends EventEmitter<RegistrySyncEvents> {\n private readonly client: RegistryClient;\n private readonly transportMode: 'auto' | 'stream' | 'poll';\n private readonly pollIntervalMs: number;\n private readonly types: string | undefined;\n private readonly feedPageLimit: number;\n private readonly streamPollIntervalSeconds: number;\n private readonly streamIdleTimeoutMs: number;\n private readonly streamReconnectMinMs: number;\n private readonly streamReconnectMaxMs: number;\n private readonly maxStreamFailures: number;\n private readonly indexAgents: boolean;\n private readonly indexAuthorizations: boolean;\n private readonly indexProperties: boolean;\n private readonly indexBrandHierarchies: boolean;\n private readonly ignoredEventHandler: ((event: CatalogEvent, reason: string) => void) | undefined;\n private readonly errorHandler: ((error: Error) => void) | undefined;\n private readonly cursorStore: CursorStore;\n\n private _state: RegistrySyncState = 'idle';\n private cursor: string | null = null;\n private pollTimer: ReturnType<typeof setTimeout> | null = null;\n\n // Streaming state\n private activeTransport: RegistrySyncTransport | null = null;\n private streamController: AbortController | null = null;\n private streamIdleTimer: ReturnType<typeof setTimeout> | null = null;\n private lastFreshness: FeedFreshness | null = null;\n /**\n * Incremented by stop()/reset() and each start(). Async work (bootstrap,\n * rebootstrap, the stream loop) captures its generation and bails the moment\n * it no longer matches — so a stop() that lands mid-bootstrap is honored and\n * a stale loop can never resume after the caller stopped or restarted.\n */\n private generation = 0;\n\n // Indexes\n private agents = new Map<string, AgentSearchResult>();\n private authByDomain = new Map<string, AuthorizationEntry[]>();\n private authByAgent = new Map<string, AuthorizationEntry[]>();\n private authLocationsById = new Map<string, { agentKey: string; domainKey: string }>();\n private propertiesByRid = new Map<string, RegistrySyncProperty>();\n private propertyRidsByDomain = new Map<string, Set<string>>();\n private propertyAliasesByRid = new Map<string, string>();\n private brandAncestorsByDomain = new Map<string, string[]>();\n private brandHierarchyByDomain = new Map<string, ResolvedBrand[]>();\n private brandHierarchyKeysByEntity = new Map<string, Set<string>>();\n private brandHierarchyEntityByKey = new Map<string, string>();\n\n constructor(config: RegistrySyncConfig) {\n super();\n this.client = config.client;\n this.transportMode = config.transport ?? 'auto';\n this.pollIntervalMs = config.pollIntervalMs ?? 30_000;\n this.types = config.types;\n this.feedPageLimit = config.feedPageLimit ?? 1000;\n // Fail closed on out-of-range values rather than letting the registry reject\n // them with a 400 that the reconnect/poll loop would hot-retry forever.\n if (!Number.isInteger(this.feedPageLimit) || this.feedPageLimit < 1 || this.feedPageLimit > 10_000) {\n throw new Error('feedPageLimit must be an integer between 1 and 10000');\n }\n this.streamPollIntervalSeconds = config.streamPollIntervalSeconds ?? 15;\n if (\n !Number.isInteger(this.streamPollIntervalSeconds) ||\n this.streamPollIntervalSeconds < 5 ||\n this.streamPollIntervalSeconds > 60\n ) {\n throw new Error('streamPollIntervalSeconds must be an integer between 5 and 60');\n }\n this.streamIdleTimeoutMs = config.streamIdleTimeoutMs ?? 90_000;\n this.streamReconnectMinMs = config.streamReconnectMinMs ?? 1_000;\n this.streamReconnectMaxMs = config.streamReconnectMaxMs ?? 30_000;\n this.maxStreamFailures = config.maxStreamFailures ?? 3;\n this.indexAgents = config.indexes?.agents !== false;\n this.indexAuthorizations = config.indexes?.authorizations !== false;\n this.indexProperties = config.indexes?.properties !== false;\n this.indexBrandHierarchies = config.indexes?.brandHierarchies !== false;\n this.cursorStore = config.cursorStore ?? new InMemoryCursorStore();\n this.ignoredEventHandler = config.onIgnoredEvent;\n this.errorHandler = config.onError;\n }\n\n // ====== Lifecycle ======\n\n /** Bootstrap from the registry and begin tailing the event feed. */\n async start(): Promise<void> {\n if (this._state === 'syncing' || this._state === 'bootstrapping') return;\n const gen = ++this.generation;\n await this.bootstrap(gen);\n // A stop()/reset() (or another start()) during bootstrap bumps the\n // generation; beginSync re-validates both generation and state before\n // starting the sync loop.\n this.beginSync(gen);\n }\n\n /** Stop tailing the feed. In-memory state is preserved. */\n stop(): void {\n // Invalidate any in-flight bootstrap/rebootstrap/stream loop, even while\n // state is still 'bootstrapping'.\n this.generation++;\n if (this.pollTimer) {\n clearTimeout(this.pollTimer);\n this.pollTimer = null;\n }\n this.abortStream();\n this.activeTransport = null;\n if (this._state === 'syncing' || this._state === 'bootstrapping') {\n this.setState('idle');\n }\n }\n\n /**\n * Stop, clear all in-memory state, and drop the persisted cursor. Call start()\n * again to re-bootstrap from scratch. Because this clears the stored cursor,\n * it is the correct way to switch the `types` subscription: `reset()` then\n * `start()` begins a fresh subscription rather than resuming a cursor minted\n * under the previous filter.\n */\n async reset(): Promise<void> {\n this.stop();\n this.clearIndexes();\n this.cursor = null;\n this.lastFreshness = null;\n await this.cursorStore.clearCursor();\n this.setState('idle');\n }\n\n /** Begin tailing the feed using the configured transport. Bootstrap leaves state at 'syncing'. */\n private beginSync(gen: number): void {\n if (gen !== this.generation || this._state !== 'syncing') return;\n if (this.transportMode === 'poll') {\n this.setTransport('poll');\n this.schedulePoll(gen);\n return;\n }\n this.setTransport('stream');\n void this.runStream(gen);\n }\n\n // ====== Agent Lookups ======\n\n /** Get an agent by URL. */\n getAgent(url: string): AgentSearchResult | undefined {\n return this.agents.get(url);\n }\n\n /** Get all agents in the index. */\n getAgents(): AgentSearchResult[] {\n return [...this.agents.values()];\n }\n\n /** Find agents matching a filter. All specified dimensions use AND; values within arrays use OR. */\n findAgents(filter: AgentFilter): AgentSearchResult[] {\n return this.getAgents().filter(agent => {\n const p = agent.inventory_profile;\n if (filter.type && agent.type !== filter.type) return false;\n if (filter.channels?.length && !filter.channels.some(c => p.channels.includes(c))) return false;\n if (filter.markets?.length && !filter.markets.some(m => p.markets.includes(m))) return false;\n if (filter.categories?.length && !filter.categories.some(c => p.categories.includes(c))) return false;\n if (filter.property_types?.length && !filter.property_types.some(t => p.property_types.includes(t))) return false;\n if (filter.tags?.length && !filter.tags.some(t => p.tags.includes(t))) return false;\n if (filter.delivery_types?.length && !filter.delivery_types.some(d => p.delivery_types.includes(d))) return false;\n if (filter.has_tmp != null && p.has_tmp !== filter.has_tmp) return false;\n if (filter.min_properties != null && p.property_count < filter.min_properties) return false;\n if (filter.compliance_status?.length) {\n const status = (agent.compliance_summary?.status ?? 'unknown') as RegistrySyncComplianceStatus;\n if (!filter.compliance_status.includes(status)) return false;\n }\n return true;\n });\n }\n\n // ====== Authorization Lookups ======\n\n /** Get all authorizations for a publisher domain. */\n getAuthorizationsForDomain(domain: string): AuthorizationEntry[] {\n return this.authByDomain.get(this.authDomainKey(domain)) ?? [];\n }\n\n /** Get all authorizations for an agent. */\n getAuthorizationsForAgent(agentUrl: string): AuthorizationEntry[] {\n const entries: AuthorizationEntry[] = [];\n for (const key of this.authAgentKeysForUrl(agentUrl)) {\n for (const entry of this.authByAgent.get(key) ?? []) {\n if (!entries.includes(entry)) entries.push(entry);\n }\n }\n return entries;\n }\n\n /**\n * Check if an agent has any authorization for a publisher domain.\n * Does not evaluate property_id scoping, time bounds, or effective dates.\n * For scoped checks, use getAuthorizationsForDomain() and inspect entries directly.\n *\n * Returns the last synced state — see the class-level staleness note. For\n * enforcement, confirm `state === 'syncing'` and an acceptable `getLagSeconds()`\n * before trusting an allow decision, so a stalled feed can't serve a stale\n * authorization after a missed revocation.\n */\n isAuthorized(agentUrl: string, domain: string): boolean {\n const entries = this.authByDomain.get(this.authDomainKey(domain));\n return entries != null && entries.some(entry => this.authorizationAgentMatches(entry, agentUrl));\n }\n\n // ====== Property Lookups ======\n\n /** Get a property feed record by property_rid. Merged aliases resolve to their canonical RID. */\n getProperty(rid: string): RegistrySyncProperty | undefined {\n const property = this.propertiesByRid.get(this.resolvePropertyRid(rid));\n return property ? this.cloneProperty(property) : undefined;\n }\n\n /** Get all property feed records for a publisher domain. */\n getPropertiesForDomain(domain: string): RegistrySyncProperty[] {\n const rids = this.propertyRidsByDomain.get(this.normalizeDomainKey(domain));\n if (!rids) return [];\n const properties: RegistrySyncProperty[] = [];\n for (const rid of rids) {\n const property = this.propertiesByRid.get(this.resolvePropertyRid(rid));\n if (property) properties.push(this.cloneProperty(property));\n }\n return properties;\n }\n\n // ====== Brand Hierarchy Lookups ======\n\n /**\n * Get the ordered corporate ancestor domain chain for a brand domain.\n *\n * The returned array includes the resolved brand itself as the first entry and\n * the house domain as the last entry when known.\n */\n getAncestors(domain: string): string[] {\n return [...(this.brandAncestorsByDomain.get(this.normalizeDomainKey(domain)) ?? [])];\n }\n\n /** Get the ordered resolved brand chain for a brand domain, when the feed supplied it. */\n getBrandHierarchy(domain: string): ResolvedBrand[] {\n return (this.brandHierarchyByDomain.get(this.normalizeDomainKey(domain)) ?? []).map(brand => ({ ...brand }));\n }\n\n // ====== State ======\n\n get state(): RegistrySyncState {\n return this._state;\n }\n\n getCursor(): string | null {\n return this.cursor;\n }\n\n getStats(): { agents: number; authorizations: number; properties: number; brandHierarchies: number } {\n let authCount = 0;\n for (const entries of this.authByDomain.values()) authCount += entries.length;\n return {\n agents: this.agents.size,\n authorizations: authCount,\n properties: this.propertiesByRid.size,\n brandHierarchies: this.brandHierarchyKeysByEntity.size,\n };\n }\n\n /** The active feed transport once syncing, or null when idle. */\n getTransport(): RegistrySyncTransport | null {\n return this.activeTransport;\n }\n\n /**\n * Latest feed freshness metadata, or null if the registry has not reported it\n * yet (e.g. before the first feed page/heartbeat lands). For push updates,\n * prefer the `freshness` event over polling this right after `start()`.\n */\n getFreshness(): FeedFreshness | null {\n return this.lastFreshness;\n }\n\n /** Latest feed lag in seconds, or null when unavailable. Convenience over getFreshness(). */\n getLagSeconds(): number | null {\n return this.lastFreshness?.lag_seconds ?? null;\n }\n\n // ====== Private: Bootstrap ======\n\n private async bootstrap(gen: number): Promise<void> {\n this.setState('bootstrapping');\n try {\n // Restore cursor from store if available\n const storedCursor = await this.cursorStore.getCursor();\n if (storedCursor) {\n this.cursor = storedCursor;\n }\n\n // Paginate searchAgents to load all agents\n if (this.indexAgents) {\n let cursor: string | undefined;\n do {\n const query: Record<string, unknown> = { limit: 200 };\n if (cursor) query.cursor = cursor;\n const res: AgentSearchResponse = await this.client.searchAgents(query as any);\n for (const agent of res.results) {\n this.agents.set(agent.url, agent);\n }\n cursor = res.has_more && res.cursor ? res.cursor : undefined;\n } while (cursor);\n }\n\n // Get initial feed cursor and apply any events\n await this.drainFeed(gen);\n\n // A stop()/reset() landed mid-bootstrap: do not flip to 'syncing' or emit.\n if (gen !== this.generation) return;\n\n this.setState('syncing');\n this.emit('bootstrap', {\n agentCount: this.agents.size,\n authorizationCount: this.getStats().authorizations,\n });\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n // If we were stopped mid-bootstrap, swallow the abort rather than parking\n // the engine in 'error'.\n if (gen !== this.generation) return;\n this.setState('error');\n this.errorHandler?.(error);\n this.emit('error', { error });\n throw error;\n }\n }\n\n /** Clear all state, drop the persisted cursor, and bootstrap again from scratch. */\n private async rebootstrap(gen: number): Promise<void> {\n this.clearIndexes();\n this.cursor = null;\n await this.cursorStore.clearCursor();\n await this.bootstrap(gen);\n }\n\n // ====== Private: Polling ======\n\n private schedulePoll(gen: number): void {\n this.pollTimer = setTimeout(() => this.pollLoop(gen), this.pollIntervalMs);\n }\n\n private async pollLoop(gen: number): Promise<void> {\n if (gen !== this.generation) return;\n try {\n await this.poll(gen);\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n this.emit('error', { error });\n this.errorHandler?.(error);\n }\n // Schedule next poll even after errors (will retry), unless stopped/superseded.\n if (gen === this.generation && this._state === 'syncing') {\n this.schedulePoll(gen);\n }\n }\n\n private async poll(gen: number): Promise<void> {\n let totalEventsApplied = 0;\n let hasMore = true;\n\n while (hasMore) {\n const feed: FeedResponse = await this.client.getFeed(this.feedQuery());\n\n if (feed.cursor_expired) {\n // Cursor aged out of retention: drop state and re-bootstrap, then resume.\n try {\n await this.rebootstrap(gen);\n } catch {\n // bootstrap() already emitted 'error' and parked state in 'error'.\n // Restore 'syncing' so pollLoop reschedules and retries (mirrors the\n // stream path, which also keeps trying after a failed rebootstrap).\n if (gen === this.generation && this._state === 'error') this.setState('syncing');\n }\n return;\n }\n\n for (const event of feed.events) {\n this.applyEvent(event);\n this.emit('event', { event });\n totalEventsApplied++;\n }\n\n this.observeFreshness(feed.freshness);\n\n if (feed.cursor) {\n this.cursor = feed.cursor;\n }\n\n hasMore = feed.has_more && feed.cursor != null;\n }\n\n await this.persistCursor();\n\n if (totalEventsApplied > 0) {\n this.emit('sync', { cursor: this.cursor!, eventsApplied: totalEventsApplied });\n }\n }\n\n /**\n * Drain all available feed pages. Used during bootstrap (does not emit 'event' per event).\n */\n private async drainFeed(gen: number): Promise<void> {\n let hasMore = true;\n let recoveredFromExpiry = false;\n while (hasMore) {\n const feed: FeedResponse = await this.client.getFeed(this.feedQuery());\n if (feed.cursor_expired) {\n // Stored cursor aged out of retention: drop it and retry once from the\n // start of the window. A second expiry (now cursor-less) means a\n // misbehaving server — stop draining rather than hot-looping.\n this.cursor = null;\n await this.cursorStore.clearCursor();\n if (recoveredFromExpiry) break;\n recoveredFromExpiry = true;\n continue;\n }\n for (const event of feed.events) {\n this.applyEvent(event);\n }\n this.observeFreshness(feed.freshness);\n if (feed.cursor) this.cursor = feed.cursor;\n hasMore = feed.has_more && feed.cursor != null;\n }\n // A stop()/reset() during the drain bumps the generation — don't persist a\n // cursor a later start() would read back.\n if (gen === this.generation) await this.persistCursor();\n }\n\n // ====== Private: Streaming ======\n\n private async runStream(gen: number): Promise<void> {\n // `consecutiveFailures` drives 'auto' polling fallback. It counts connections\n // that ended in a transport/parse failure — a heartbeat does NOT reset it\n // (else heartbeat → malformed-frame → reconnect could loop forever and never\n // fall back, despite the parse-failure fallback contract). It resets only on\n // real feed progress or a clean close that delivered something.\n // `consecutiveRebootstraps` bounds a tight cursor_expired loop.\n let consecutiveFailures = 0;\n let consecutiveRebootstraps = 0;\n\n while (gen === this.generation && this.transportMode !== 'poll') {\n const controller = new AbortController();\n this.streamController = controller;\n let feedApplied = false;\n let receivedAny = false;\n let disposition: StreamDisposition;\n\n try {\n disposition = await this.streamConnection(gen, controller.signal, isFeed => {\n receivedAny = true;\n if (isFeed) feedApplied = true;\n });\n } catch (err) {\n // Aborted by stop()/reset() (which bumps the generation): exit quietly.\n if (controller.signal.aborted && gen !== this.generation) {\n return;\n }\n const error = err instanceof Error ? err : new Error(String(err));\n disposition = this.classifyStreamError(error);\n if (disposition === 'reconnect' || disposition === 'fatal') {\n this.emit('error', { error });\n this.errorHandler?.(error);\n }\n } finally {\n this.clearStreamIdleTimer();\n }\n\n if (gen !== this.generation) return;\n // Applying a feed page proves the stream works end to end.\n if (feedApplied) {\n consecutiveFailures = 0;\n consecutiveRebootstraps = 0;\n }\n\n if (disposition === 'stopped') return;\n\n if (disposition === 'fatal') {\n // Permanent error (e.g. 400/401): retrying cannot help. Park in 'error'.\n this.setState('error');\n this.activeTransport = null;\n return;\n }\n\n if (disposition === 'rebootstrap') {\n let ok = false;\n try {\n await this.rebootstrap(gen);\n ok = true;\n } catch {\n // bootstrap() already emitted 'error' and parked state in 'error'.\n }\n if (gen !== this.generation) return;\n if (!ok) {\n consecutiveFailures++;\n if (this.shouldFallBack(consecutiveFailures)) {\n this.fallBackToPolling(gen);\n return;\n }\n // Recover: bootstrap left us in 'error'. In 'stream' mode the contract\n // is to keep reconnecting, so restore 'syncing' and back off.\n this.setState('syncing');\n await this.delay(this.reconnectBackoffMs(consecutiveFailures), controller.signal);\n if (gen !== this.generation) return;\n continue;\n }\n // Successful re-bootstrap. Back off proportionally to repeated expiries\n // so a server stuck emitting cursor_expired can't drive a tight loop.\n consecutiveRebootstraps++;\n await this.delay(this.reconnectBackoffMs(consecutiveRebootstraps), controller.signal);\n if (gen !== this.generation) return;\n continue;\n }\n\n if (disposition === 'fallback') {\n this.fallBackToPolling(gen);\n return;\n }\n\n if (disposition === 'closed' && receivedAny) {\n // Clean close after real activity (feed or heartbeat): the transport\n // works; reconnect promptly without counting it as a failure.\n consecutiveFailures = 0;\n await this.delay(this.reconnectBackoffMs(0), controller.signal);\n if (gen !== this.generation) return;\n continue;\n }\n\n // 'reconnect' (transport/parse failure or server feed_stream_error), or a\n // clean close that delivered nothing — count toward fallback so 'auto'\n // degrades to polling rather than looping on a stream that never delivers.\n consecutiveFailures++;\n if (this.shouldFallBack(consecutiveFailures)) {\n this.fallBackToPolling(gen);\n return;\n }\n await this.delay(this.reconnectBackoffMs(consecutiveFailures), controller.signal);\n if (gen !== this.generation) return;\n }\n }\n\n /**\n * Consume one SSE connection. Invokes `onMessage(isFeed)` for each feed page\n * (true) or heartbeat (false) received. Returns the disposition for the\n * reconnect loop: `closed` on a clean server EOF, `reconnect` on a server\n * `feed_stream_error`, `rebootstrap` on `cursor_expired`, `stopped` if the\n * engine was stopped mid-stream.\n */\n private async streamConnection(\n gen: number,\n signal: AbortSignal,\n onMessage: (isFeed: boolean) => void\n ): Promise<StreamDisposition> {\n this.armStreamIdleTimer();\n const query: FeedStreamQuery = {\n cursor: this.cursor ?? undefined,\n types: this.types,\n limit: this.feedPageLimit,\n pollIntervalSeconds: this.streamPollIntervalSeconds,\n };\n\n for await (const msg of this.client.streamFeed(query, { signal })) {\n if (gen !== this.generation) return 'stopped';\n this.armStreamIdleTimer();\n\n if (msg.type === 'feed') {\n onMessage(true);\n await this.applyStreamPage(msg.page);\n } else if (msg.type === 'heartbeat') {\n onMessage(false);\n // Heartbeats keep the connection alive and expose freshness; they do NOT\n // advance the cursor and do NOT count as feed progress for fallback.\n this.observeFreshness(msg.heartbeat.freshness);\n } else {\n // 'error' — the server closes the stream after this frame.\n if (msg.error.error === 'cursor_expired') {\n return 'rebootstrap';\n }\n // Registry-supplied strings are untrusted: escape before logging/emitting.\n const code = sanitizeStreamText(msg.error.error);\n const detail = msg.error.message ? ` (${sanitizeStreamText(msg.error.message)})` : '';\n const error = new Error(`registry feed stream error: ${code}${detail}`);\n this.emit('error', { error });\n this.errorHandler?.(error);\n return 'reconnect';\n }\n }\n\n // Stream closed cleanly by the server — reconnect from the last cursor.\n return 'closed';\n }\n\n /** Apply one SSE feed page: events, freshness, then advance + persist the cursor. */\n private async applyStreamPage(page: FeedResponse): Promise<void> {\n let applied = 0;\n for (const event of page.events) {\n this.applyEvent(event);\n this.emit('event', { event });\n applied++;\n }\n this.observeFreshness(page.freshness);\n\n // Advance the cursor only after the full page is applied, so a mid-page\n // disconnect resumes from the last fully-applied page.\n if (page.cursor) {\n this.cursor = page.cursor;\n try {\n await this.persistCursor();\n } catch (err) {\n // Persisting is best-effort; replay after restart is idempotent.\n const error = err instanceof Error ? err : new Error(String(err));\n this.emit('error', { error });\n this.errorHandler?.(error);\n }\n }\n\n if (applied > 0) {\n this.emit('sync', { cursor: this.cursor!, eventsApplied: applied });\n }\n }\n\n private classifyStreamError(error: Error): StreamDisposition {\n if (error instanceof FeedStreamCursorExpiredError) return 'rebootstrap';\n if (error instanceof FeedStreamUnsupportedError) {\n // Endpoint absent (older registry) or a proxy returned non-stream content.\n return this.transportMode === 'auto' ? 'fallback' : 'reconnect';\n }\n if (error instanceof FeedStreamHttpError && (error.status === 400 || error.status === 401)) {\n // Permanent client-side error: a malformed request or bad credentials.\n // Retrying (or polling, which hits the same status) cannot recover.\n return 'fatal';\n }\n // Other HTTP errors, parse failures, idle timeouts, network/abort errors.\n return 'reconnect';\n }\n\n private shouldFallBack(consecutiveFailures: number): boolean {\n return this.transportMode === 'auto' && consecutiveFailures >= this.maxStreamFailures;\n }\n\n private fallBackToPolling(gen: number): void {\n if (gen !== this.generation || this._state !== 'syncing') return;\n this.abortStream();\n this.setTransport('poll');\n this.schedulePoll(gen);\n }\n\n private armStreamIdleTimer(): void {\n this.clearStreamIdleTimer();\n const controller = this.streamController;\n if (!controller) return;\n this.streamIdleTimer = setTimeout(() => {\n controller.abort(new Error('registry feed stream idle timeout'));\n }, this.streamIdleTimeoutMs);\n this.streamIdleTimer.unref?.();\n }\n\n private clearStreamIdleTimer(): void {\n if (this.streamIdleTimer) {\n clearTimeout(this.streamIdleTimer);\n this.streamIdleTimer = null;\n }\n }\n\n private abortStream(): void {\n this.clearStreamIdleTimer();\n if (this.streamController) {\n this.streamController.abort();\n this.streamController = null;\n }\n }\n\n private reconnectBackoffMs(attempt: number): number {\n const exp = this.streamReconnectMinMs * 2 ** Math.max(0, attempt - 1);\n return Math.min(this.streamReconnectMaxMs, Math.max(this.streamReconnectMinMs, exp));\n }\n\n private delay(ms: number, signal: AbortSignal): Promise<void> {\n if (signal.aborted) return Promise.resolve();\n return new Promise(resolve => {\n const onAbort = () => {\n clearTimeout(timer);\n resolve();\n };\n const timer = setTimeout(() => {\n signal.removeEventListener('abort', onAbort);\n resolve();\n }, ms);\n timer.unref?.();\n signal.addEventListener('abort', onAbort, { once: true });\n });\n }\n\n // ====== Private: Shared feed helpers ======\n\n private feedQuery(): { cursor?: string; types?: string; limit: number } {\n const query: { cursor?: string; types?: string; limit: number } = { limit: this.feedPageLimit };\n if (this.cursor) query.cursor = this.cursor;\n if (this.types) query.types = this.types;\n return query;\n }\n\n private observeFreshness(freshness: FeedFreshness | undefined): void {\n if (!freshness) return;\n this.lastFreshness = freshness;\n this.emit('freshness', { freshness });\n }\n\n private async persistCursor(): Promise<void> {\n if (this.cursor) {\n await this.cursorStore.setCursor(this.cursor);\n }\n }\n\n private setTransport(transport: RegistrySyncTransport): void {\n if (this.activeTransport === transport) return;\n this.activeTransport = transport;\n this.emit('transport', { transport });\n }\n\n // ====== Private: Event Application ======\n\n private applyEvent(event: CatalogEvent): void {\n const payload = this.asRecord(event.payload);\n\n switch (event.event_type) {\n case 'agent.discovered':\n case 'agent.profile_updated': {\n if (!this.indexAgents) break;\n const existing = this.agents.get(event.entity_id);\n const inventoryProfile = this.isAgentInventoryProfile(payload.inventory_profile)\n ? payload.inventory_profile\n : undefined;\n if (existing && inventoryProfile) {\n this.agents.set(event.entity_id, {\n ...existing,\n inventory_profile: inventoryProfile,\n });\n } else if (!existing) {\n // New agent: use payload data or create stub\n this.agents.set(event.entity_id, {\n url: event.entity_id,\n name: typeof payload.name === 'string' ? payload.name : event.entity_id,\n type: typeof payload.type === 'string' ? payload.type : 'unknown',\n inventory_profile: inventoryProfile ?? this.emptyInventoryProfile(),\n match: { score: 0, matched_filters: [] },\n });\n }\n break;\n }\n\n case 'agent.removed': {\n if (this.indexAgents) this.agents.delete(event.entity_id);\n if (this.indexAuthorizations) this.removeAuthorizationsForAgent(event.entity_id);\n break;\n }\n\n case 'authorization.granted': {\n if (!this.indexAuthorizations) break;\n if (!this.isAuthorizationPayload(payload)) break;\n if (typeof payload.authorization_type !== 'string') break;\n this.upsertAuthorizationEntry(this.authorizationEntryFromEvent(payload));\n break;\n }\n\n case 'authorization.modified': {\n if (!this.indexAuthorizations) break;\n if (!this.isAuthorizationPayload(payload)) break;\n const entry = this.authorizationEntryFromEvent(payload);\n if (!entry.id && !entry.authorization_type) break;\n this.upsertAuthorizationEntry(entry, { fallbackToTupleOnMissingRowId: true });\n break;\n }\n\n case 'authorization.revoked': {\n if (!this.indexAuthorizations) break;\n if (!this.isAuthorizationPayload(payload)) break;\n const entry = this.authorizationEntryFromEvent(payload);\n this.removeAuthorizationEntries(entry, {\n matchByRowId: Boolean(entry.id || !entry.authorization_type),\n fallbackToTupleOnMissingRowId: true,\n });\n break;\n }\n\n case 'agent.compliance_changed': {\n if (this.indexAgents) {\n const existing = this.agents.get(event.entity_id);\n const summary = payload.compliance_summary;\n if (existing && this.isAgentCompliance(summary)) {\n this.agents.set(event.entity_id, {\n ...existing,\n compliance_summary: summary,\n });\n }\n }\n this.emit('compliance_changed', {\n agentUrl: event.entity_id,\n previousStatus: (typeof payload.previous_status === 'string'\n ? payload.previous_status\n : 'unknown') as RegistrySyncComplianceStatus,\n currentStatus: (typeof payload.current_status === 'string'\n ? payload.current_status\n : 'unknown') as RegistrySyncComplianceStatus,\n });\n break;\n }\n\n case 'property.created':\n case 'property.updated':\n case 'property.reactivated':\n case 'property.stale': {\n if (this.indexProperties) this.upsertPropertyEvent(payload);\n break;\n }\n\n case 'property.merged': {\n if (this.indexProperties) this.handlePropertyMerge(payload);\n break;\n }\n\n case 'brand.hierarchy_updated':\n case 'brand.updated':\n case 'brand.resolved': {\n if (this.indexBrandHierarchies) this.applyBrandHierarchyEvent(event.entity_id, payload);\n break;\n }\n\n case 'brand.removed':\n case 'brand.deleted': {\n if (this.indexBrandHierarchies) this.deleteBrandHierarchy(event.entity_id, payload);\n break;\n }\n\n case 'collection.created':\n case 'collection.updated':\n case 'collection.merged':\n case 'collection.removed': {\n this.ignoreEvent(event, 'collection.* indexing requires typed collection schemas and a reference consumer');\n break;\n }\n\n case 'publisher.adagents_changed':\n case 'publisher.adagents_discovered': {\n this.ignoreEvent(event, 'publisher.* indexing requires a reference consumer');\n break;\n }\n\n default:\n this.ignoreEvent(event, 'unknown or unsupported registry feed event type');\n break;\n }\n }\n\n // ====== Private: Helpers ======\n\n private clearIndexes(): void {\n this.agents.clear();\n this.authByDomain.clear();\n this.authByAgent.clear();\n this.authLocationsById.clear();\n this.propertiesByRid.clear();\n this.propertyRidsByDomain.clear();\n this.propertyAliasesByRid.clear();\n this.brandAncestorsByDomain.clear();\n this.brandHierarchyByDomain.clear();\n this.brandHierarchyKeysByEntity.clear();\n this.brandHierarchyEntityByKey.clear();\n }\n\n private ignoreEvent(event: CatalogEvent, reason: string): void {\n this.ignoredEventHandler?.(event, reason);\n this.emit('ignoredEvent', { event, reason });\n }\n\n private upsertAuthorizationEntry(\n entry: AuthorizationEntry,\n options?: { fallbackToTupleOnMissingRowId?: boolean }\n ): void {\n const normalizedEntry = this.normalizeAuthorizationEntry(entry);\n this.removeAuthorizationEntries(normalizedEntry, {\n matchByRowId: Boolean(normalizedEntry.id),\n fallbackToTupleOnMissingRowId: options?.fallbackToTupleOnMissingRowId,\n });\n\n const domainKey = this.authDomainKey(normalizedEntry.publisher_domain);\n const domainEntries = this.authByDomain.get(domainKey) ?? [];\n domainEntries.push(normalizedEntry);\n this.authByDomain.set(domainKey, domainEntries);\n\n const agentKey = this.authAgentKey(normalizedEntry);\n for (const key of this.authAgentKeys(normalizedEntry)) {\n const agentEntries = this.authByAgent.get(key) ?? [];\n agentEntries.push(normalizedEntry);\n this.authByAgent.set(key, agentEntries);\n }\n\n if (normalizedEntry.id) {\n this.authLocationsById.set(normalizedEntry.id, {\n agentKey,\n domainKey,\n });\n }\n }\n\n private normalizeAuthorizationEntry(entry: AuthorizationEntry): AuthorizationEntry {\n if (entry.effective_until || !entry.effective_to) return entry;\n return { ...entry, effective_until: entry.effective_to };\n }\n\n private authorizationEntryFromEvent(entry: AuthorizationEntry): AuthorizationEntry {\n return this.normalizeAuthorizationEntry(entry);\n }\n\n private removeAuthorizationsForAgent(agentUrl: string): void {\n const agentKeys = this.authAgentKeysForUrl(agentUrl);\n for (const [key, entries] of this.authByAgent) {\n if (entries.some(entry => this.authorizationAgentMatches(entry, agentUrl))) agentKeys.add(key);\n }\n\n for (const agentKey of agentKeys) {\n const entries = [...(this.authByAgent.get(agentKey) ?? [])];\n for (const entry of entries) {\n this.removeAuthorizationEntries(entry, {\n matchByRowId: Boolean(entry.id),\n fallbackToTupleOnMissingRowId: true,\n });\n }\n this.authByAgent.delete(agentKey);\n }\n }\n\n private removeAuthorizationEntries(target: AuthorizationEntry, options?: AuthorizationRemoveOptions): void {\n const normalizedTarget = this.normalizeAuthorizationEntry(target);\n const domainKeys = new Set<string>([this.authDomainKey(normalizedTarget.publisher_domain)]);\n const agentKeys = this.authAgentKeys(normalizedTarget);\n let effectiveOptions = options;\n\n if (normalizedTarget.id && options?.matchByRowId) {\n const existingLocation = this.authLocationsById.get(normalizedTarget.id);\n if (!existingLocation && options.fallbackToTupleOnMissingRowId) {\n effectiveOptions = { ...options, matchByRowId: false };\n }\n if (existingLocation) {\n domainKeys.add(existingLocation.domainKey);\n agentKeys.add(existingLocation.agentKey);\n }\n }\n\n for (const domain of domainKeys) {\n const entries = this.authByDomain.get(domain);\n if (!entries) continue;\n for (const entry of entries) {\n if (this.authorizationMatches(entry, normalizedTarget, effectiveOptions)) {\n for (const key of this.authAgentKeys(entry)) agentKeys.add(key);\n }\n }\n }\n\n for (const domain of domainKeys) {\n this.removeAuthorizationEntriesFromBucket(this.authByDomain, domain, normalizedTarget, effectiveOptions);\n }\n\n for (const agentUrl of agentKeys) {\n this.removeAuthorizationEntriesFromBucket(this.authByAgent, agentUrl, normalizedTarget, effectiveOptions);\n }\n }\n\n private removeAuthorizationEntriesFromBucket(\n bucket: Map<string, AuthorizationEntry[]>,\n key: string,\n target: AuthorizationEntry,\n options?: AuthorizationRemoveOptions\n ): void {\n const entries = bucket.get(key);\n if (!entries) return;\n\n const filtered: AuthorizationEntry[] = [];\n for (const entry of entries) {\n if (this.authorizationMatches(entry, target, options)) {\n if (entry.id) this.authLocationsById.delete(entry.id);\n } else {\n filtered.push(entry);\n }\n }\n if (filtered.length > 0) bucket.set(key, filtered);\n else bucket.delete(key);\n }\n\n private authorizationMatches(\n entry: AuthorizationEntry,\n target: AuthorizationEntry,\n options?: AuthorizationRemoveOptions\n ): boolean {\n if (target.id && options?.matchByRowId) return entry.id === target.id;\n if (!this.authorizationEntriesShareAgent(entry, target)) return false;\n if (this.authDomainKey(entry.publisher_domain) !== this.authDomainKey(target.publisher_domain)) return false;\n if (target.authorization_type) return entry.authorization_type === target.authorization_type;\n return true;\n }\n\n private authorizationAgentMatches(entry: AuthorizationEntry, agentUrl: string): boolean {\n return this.authAgentKeysOverlap(this.authAgentKeys(entry), this.authAgentKeysForUrl(agentUrl));\n }\n\n private authorizationEntriesShareAgent(\n left: Pick<AuthorizationEntry, 'agent_url' | 'agent_url_canonical'>,\n right: Pick<AuthorizationEntry, 'agent_url' | 'agent_url_canonical'>\n ): boolean {\n return this.authAgentKeysOverlap(this.authAgentKeys(left), this.authAgentKeys(right));\n }\n\n private authDomainKey(domain: string): string {\n return this.normalizeDomainKey(domain);\n }\n\n private authAgentKey(entry: Pick<AuthorizationEntry, 'agent_url' | 'agent_url_canonical'>): string {\n return this.authAgentKeyFromUrl(entry.agent_url);\n }\n\n private authAgentKeys(entry: Pick<AuthorizationEntry, 'agent_url' | 'agent_url_canonical'>): Set<string> {\n const keys = this.authAgentKeysForUrl(entry.agent_url);\n if (entry.agent_url_canonical?.trim()) {\n for (const key of this.authAgentKeysForUrl(entry.agent_url_canonical)) keys.add(key);\n }\n return keys;\n }\n\n private authAgentKeysForUrl(agentUrl: string): Set<string> {\n const trimmed = agentUrl.trim();\n const keys = new Set<string>();\n if (trimmed) keys.add(trimmed);\n keys.add(this.authAgentKeyFromUrl(agentUrl));\n return keys;\n }\n\n private authAgentKeysOverlap(left: Set<string>, right: Set<string>): boolean {\n for (const key of left) {\n if (right.has(key)) return true;\n }\n return false;\n }\n\n private authAgentKeyFromUrl(agentUrl: string): string {\n const trimmed = agentUrl.trim();\n if (!trimmed) return trimmed;\n\n try {\n const parsed = new URL(trimmed);\n if (parsed.host) return `${parsed.protocol.toLowerCase()}//${parsed.host.toLowerCase()}`;\n } catch {\n // Fall through to best-effort normalization for malformed or scheme-less values.\n }\n\n const schemeEnd = trimmed.indexOf('://');\n const authorityStart = schemeEnd > 0 ? schemeEnd + 3 : 0;\n let authorityEnd = trimmed.length;\n for (const delimiter of ['/', '?', '#'] as const) {\n const index = trimmed.indexOf(delimiter, authorityStart);\n if (index >= 0 && index < authorityEnd) authorityEnd = index;\n }\n if (authorityEnd === authorityStart) return trimmed.toLowerCase();\n\n const scheme = schemeEnd > 0 ? `${trimmed.slice(0, authorityStart).toLowerCase()}` : '';\n return `${scheme}${trimmed.slice(authorityStart, authorityEnd).toLowerCase()}`;\n }\n\n private upsertPropertyEvent(payload: Record<string, unknown>): void {\n const rid = this.propertyRidFromPayload(payload);\n if (!rid) return;\n const canonicalRid = this.resolvePropertyRid(rid);\n const existing = this.propertiesByRid.get(canonicalRid);\n const next = this.propertyFromPayload(canonicalRid, payload, existing);\n if (!next) return;\n\n this.setPropertyEntry(next, existing);\n }\n\n private handlePropertyMerge(payload: Record<string, unknown>): void {\n if (typeof payload.alias_rid !== 'string' || typeof payload.canonical_rid !== 'string') return;\n const aliasRid = this.resolvePropertyRid(payload.alias_rid);\n const canonicalRid = this.resolvePropertyRid(payload.canonical_rid);\n if (!aliasRid || !canonicalRid || aliasRid === canonicalRid) return;\n\n const aliasEntry = this.propertiesByRid.get(aliasRid);\n const canonicalEntry = this.propertiesByRid.get(canonicalRid);\n const payloadEntry = this.propertyFromPayload(canonicalRid, payload);\n this.propertyAliasesByRid.set(payload.alias_rid, canonicalRid);\n this.propertyAliasesByRid.set(aliasRid, canonicalRid);\n\n if (!aliasEntry && !canonicalEntry && !payloadEntry) return;\n\n const merged: RegistrySyncProperty = {\n ...(aliasEntry ? this.cloneProperty(aliasEntry) : {}),\n ...(canonicalEntry ? this.cloneProperty(canonicalEntry) : {}),\n ...(payloadEntry ? this.cloneProperty(payloadEntry) : {}),\n property_rid: canonicalRid,\n };\n if (!merged.publisher_domain) {\n merged.publisher_domain = canonicalEntry?.publisher_domain ?? aliasEntry?.publisher_domain;\n }\n\n this.deletePropertyEntry(aliasRid);\n this.setPropertyEntry(merged, canonicalEntry);\n }\n\n private propertyFromPayload(\n rid: string,\n payload: Record<string, unknown>,\n existing?: RegistrySyncProperty\n ): RegistrySyncProperty | null {\n const publisherDomain = this.propertyDomainFromPayload(payload) ?? existing?.publisher_domain;\n const next: RegistrySyncProperty = existing ? this.cloneProperty(existing) : { property_rid: rid };\n let hasPayloadFields = false;\n\n for (const [key, value] of Object.entries(payload)) {\n if (value === undefined || key === 'alias_rid' || key === 'canonical_rid') continue;\n hasPayloadFields = true;\n next[key] = this.cloneJsonValue(value);\n }\n next.property_rid = rid;\n if (publisherDomain) next.publisher_domain = publisherDomain;\n\n return hasPayloadFields || publisherDomain || existing ? next : null;\n }\n\n private setPropertyEntry(entry: RegistrySyncProperty, previous?: RegistrySyncProperty): void {\n if (previous?.publisher_domain && previous.publisher_domain !== entry.publisher_domain) {\n this.removePropertyRidFromDomain(entry.property_rid, previous.publisher_domain);\n }\n this.propertiesByRid.set(entry.property_rid, this.cloneProperty(entry));\n if (entry.publisher_domain) {\n const key = this.normalizeDomainKey(entry.publisher_domain);\n const rids = this.propertyRidsByDomain.get(key) ?? new Set<string>();\n rids.add(entry.property_rid);\n this.propertyRidsByDomain.set(key, rids);\n }\n }\n\n private deletePropertyEntry(rid: string): void {\n const entry = this.propertiesByRid.get(rid);\n if (entry?.publisher_domain) this.removePropertyRidFromDomain(rid, entry.publisher_domain);\n this.propertiesByRid.delete(rid);\n }\n\n private removePropertyRidFromDomain(rid: string, domain: string): void {\n const key = this.normalizeDomainKey(domain);\n const rids = this.propertyRidsByDomain.get(key);\n if (!rids) return;\n rids.delete(rid);\n if (rids.size === 0) this.propertyRidsByDomain.delete(key);\n }\n\n private propertyRidFromPayload(payload: Record<string, unknown>): string | null {\n if (typeof payload.property_rid === 'string' && payload.property_rid.trim()) return payload.property_rid;\n if (typeof payload.rid === 'string' && payload.rid.trim()) return payload.rid;\n if (typeof payload.id === 'string' && payload.id.trim()) return payload.id;\n return null;\n }\n\n private propertyDomainFromPayload(payload: Record<string, unknown>): string | undefined {\n if (typeof payload.publisher_domain === 'string' && payload.publisher_domain.trim())\n return payload.publisher_domain;\n const property = this.asRecord(payload.property);\n return typeof property.publisher_domain === 'string' && property.publisher_domain.trim()\n ? property.publisher_domain\n : undefined;\n }\n\n private stringValue(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim() ? value : undefined;\n }\n\n private resolvePropertyRid(rid: string): string {\n let current = rid;\n const seen = new Set<string>();\n while (this.propertyAliasesByRid.has(current) && !seen.has(current)) {\n seen.add(current);\n current = this.propertyAliasesByRid.get(current)!;\n }\n return current;\n }\n\n private cloneProperty(property: RegistrySyncProperty): RegistrySyncProperty {\n return this.cloneJsonValue(property) as RegistrySyncProperty;\n }\n\n private applyBrandHierarchyEvent(entityId: string, payload: Record<string, unknown>): void {\n const resolvedChain = this.extractResolvedBrandChain(payload.chain);\n const domainChain =\n resolvedChain.length > 0\n ? resolvedChain.map(brand => this.domainFromBrand(brand)).filter((domain): domain is string => domain != null)\n : (this.extractDomainChain(payload.chain) ??\n this.extractDomainChain(payload.ancestor_domains) ??\n this.extractDomainChain(payload.domains));\n\n if (!domainChain || domainChain.length === 0) return;\n\n const keys = new Set<string>();\n keys.add(this.normalizeDomainKey(entityId));\n for (const field of ['domain', 'canonical_domain', 'canonical_id'] as const) {\n const value = payload[field];\n if (typeof value === 'string' && value.trim()) keys.add(this.normalizeDomainKey(value));\n }\n keys.add(this.normalizeDomainKey(domainChain[0]!));\n\n const entityKey = this.normalizeDomainKey(entityId);\n const entitiesToClear = new Set<string>([entityKey]);\n for (const key of keys) {\n const existingEntity = this.brandHierarchyEntityByKey.get(key);\n if (existingEntity) entitiesToClear.add(existingEntity);\n }\n for (const key of entitiesToClear) this.clearBrandHierarchyEntity(key);\n\n for (const key of keys) {\n this.brandAncestorsByDomain.set(key, [...domainChain]);\n if (resolvedChain.length > 0)\n this.brandHierarchyByDomain.set(\n key,\n resolvedChain.map(brand => ({ ...brand }))\n );\n else this.brandHierarchyByDomain.delete(key);\n this.brandHierarchyEntityByKey.set(key, entityKey);\n }\n this.brandHierarchyKeysByEntity.set(entityKey, keys);\n }\n\n private deleteBrandHierarchy(entityId: string, payload: Record<string, unknown>): void {\n const keys = new Set<string>([this.normalizeDomainKey(entityId)]);\n for (const field of ['domain', 'canonical_domain', 'canonical_id'] as const) {\n const value = payload[field];\n if (typeof value === 'string' && value.trim()) keys.add(this.normalizeDomainKey(value));\n }\n const entitiesToClear = new Set<string>();\n for (const key of keys) {\n const existingEntity = this.brandHierarchyEntityByKey.get(key);\n if (existingEntity) entitiesToClear.add(existingEntity);\n }\n if (entitiesToClear.size > 0) {\n for (const key of entitiesToClear) this.clearBrandHierarchyEntity(key);\n return;\n }\n for (const key of keys) {\n this.brandAncestorsByDomain.delete(key);\n this.brandHierarchyByDomain.delete(key);\n this.brandHierarchyEntityByKey.delete(key);\n }\n }\n\n private clearBrandHierarchyEntity(entityKey: string): void {\n const keys = this.brandHierarchyKeysByEntity.get(entityKey);\n if (!keys) return;\n for (const key of keys) {\n this.brandAncestorsByDomain.delete(key);\n this.brandHierarchyByDomain.delete(key);\n this.brandHierarchyEntityByKey.delete(key);\n }\n this.brandHierarchyKeysByEntity.delete(entityKey);\n }\n\n private asRecord(value: unknown): Record<string, unknown> {\n return value && typeof value === 'object' && !Array.isArray(value) ? (value as Record<string, unknown>) : {};\n }\n\n private emptyInventoryProfile(): AgentSearchResult['inventory_profile'] {\n return {\n channels: [],\n property_types: [],\n markets: [],\n categories: [],\n category_taxonomy: 'iab_content_3.0',\n tags: [],\n delivery_types: [],\n property_count: 0,\n publisher_count: 0,\n has_tmp: false,\n };\n }\n\n private isStringArray(value: unknown): value is string[] {\n return Array.isArray(value) && value.every(item => typeof item === 'string');\n }\n\n private isAgentInventoryProfile(value: unknown): value is AgentSearchResult['inventory_profile'] {\n const profile = this.asRecord(value);\n return (\n this.isStringArray(profile.channels) &&\n this.isStringArray(profile.property_types) &&\n this.isStringArray(profile.markets) &&\n this.isStringArray(profile.categories) &&\n (typeof profile.category_taxonomy === 'string' || profile.category_taxonomy === null) &&\n this.isStringArray(profile.tags) &&\n this.isStringArray(profile.delivery_types) &&\n (profile.format_ids === undefined || this.isStringArray(profile.format_ids)) &&\n typeof profile.property_count === 'number' &&\n typeof profile.publisher_count === 'number' &&\n typeof profile.has_tmp === 'boolean'\n );\n }\n\n private isAuthorizationPayload(value: unknown): value is AuthorizationEntry {\n const payload = this.asRecord(value);\n return (\n (payload.id === undefined || this.stringValue(payload.id) !== undefined) &&\n this.stringValue(payload.agent_url) !== undefined &&\n this.stringValue(payload.publisher_domain) !== undefined &&\n (payload.authorization_type === undefined || this.stringValue(payload.authorization_type) !== undefined) &&\n (payload.property_ids === undefined || this.isStringArray(payload.property_ids)) &&\n (payload.property_tags === undefined || this.isStringArray(payload.property_tags)) &&\n (payload.placement_ids === undefined || this.isStringArray(payload.placement_ids)) &&\n (payload.placement_tags === undefined || this.isStringArray(payload.placement_tags)) &&\n (payload.countries === undefined || this.isStringArray(payload.countries)) &&\n (payload.effective_from === undefined || typeof payload.effective_from === 'string') &&\n (payload.effective_until === undefined || typeof payload.effective_until === 'string') &&\n (payload.effective_to === undefined || typeof payload.effective_to === 'string')\n );\n }\n\n private isAgentCompliance(value: unknown): value is AgentCompliance {\n const summary = this.asRecord(value);\n const statuses = new Set(['passing', 'degraded', 'failing', 'unknown', 'opted_out']);\n const lifecycleStages = new Set(['development', 'testing', 'production', 'deprecated']);\n if (summary.status === 'opted_out') {\n return (\n (summary.lifecycle_stage === undefined ||\n (typeof summary.lifecycle_stage === 'string' && lifecycleStages.has(summary.lifecycle_stage))) &&\n (summary.tracks === undefined ||\n (summary.tracks != null && typeof summary.tracks === 'object' && !Array.isArray(summary.tracks))) &&\n (summary.streak_days === undefined || typeof summary.streak_days === 'number') &&\n (summary.last_checked_at === undefined ||\n typeof summary.last_checked_at === 'string' ||\n summary.last_checked_at === null) &&\n (summary.headline === undefined || typeof summary.headline === 'string' || summary.headline === null)\n );\n }\n return (\n typeof summary.status === 'string' &&\n statuses.has(summary.status) &&\n typeof summary.lifecycle_stage === 'string' &&\n lifecycleStages.has(summary.lifecycle_stage) &&\n summary.tracks != null &&\n typeof summary.tracks === 'object' &&\n !Array.isArray(summary.tracks) &&\n typeof summary.streak_days === 'number' &&\n (typeof summary.last_checked_at === 'string' || summary.last_checked_at === null) &&\n (typeof summary.headline === 'string' || summary.headline === null)\n );\n }\n\n private isResolvedBrand(value: unknown): value is ResolvedBrand {\n const brand = this.asRecord(value);\n return typeof brand.canonical_id === 'string' && typeof brand.canonical_domain === 'string';\n }\n\n private cloneJsonValue<T>(value: T): T {\n if (Array.isArray(value)) return value.map(item => this.cloneJsonValue(item)) as T;\n if (value && typeof value === 'object') {\n const copy: Record<string, unknown> = {};\n for (const [key, nested] of Object.entries(value)) {\n copy[key] = this.cloneJsonValue(nested);\n }\n return copy as T;\n }\n return value;\n }\n\n private extractResolvedBrandChain(value: unknown): ResolvedBrand[] {\n if (!Array.isArray(value)) return [];\n return value.filter(item => this.isResolvedBrand(item));\n }\n\n private extractDomainChain(value: unknown): string[] | null {\n if (!Array.isArray(value)) return null;\n const domains: string[] = [];\n for (const item of value) {\n if (typeof item === 'string' && item.trim()) {\n domains.push(item);\n continue;\n }\n if (item && typeof item === 'object' && !Array.isArray(item)) {\n const domain = this.domainFromBrand(item as Partial<ResolvedBrand>);\n if (domain) domains.push(domain);\n }\n }\n return domains.length > 0 ? domains : null;\n }\n\n private domainFromBrand(brand: Partial<ResolvedBrand>): string | null {\n return brand.canonical_domain ?? brand.canonical_id ?? null;\n }\n\n private normalizeDomainKey(domain: string): string {\n return domain.trim().toLowerCase();\n }\n\n private setState(next: RegistrySyncState): void {\n const from = this._state;\n if (from === next) return;\n this._state = next;\n this.emit('stateChange', { from, to: next });\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/lib/registry/sync.ts"],"sourcesContent":["import { EventEmitter } from 'node:events';\nimport type { RegistryClient } from './index';\nimport type {\n AgentSearchResult,\n AgentCompliance,\n AuthorizationEntry,\n AgentSearchResponse,\n FeedFreshness,\n} from './types.generated';\nimport type { CatalogEvent, FeedResponse, PropertyEventPayload, PropertyIdentifier, ResolvedBrand } from './types';\nimport type { FeedStreamQuery } from './feed-stream';\nimport {\n FeedStreamCursorExpiredError,\n FeedStreamUnsupportedError,\n FeedStreamHttpError,\n sanitizeStreamText,\n} from './feed-stream';\nimport type { CursorStore } from './cursor-store';\nimport { InMemoryCursorStore } from './cursor-store';\n\n// ====== Configuration ======\n\nexport interface RegistrySyncConfig {\n /** RegistryClient instance to use for API calls. */\n client: RegistryClient;\n /**\n * Feed transport for tailing changes after bootstrap:\n * - `'auto'` (default): try the SSE stream, fall back to polling on an\n * unsupported endpoint (404/406), proxy/network failure, or stream parse\n * failure.\n * - `'stream'`: SSE only; reconnect on failure and never fall back to polling.\n * - `'poll'`: polling only.\n */\n transport?: 'auto' | 'stream' | 'poll';\n /** Polling interval in milliseconds. Default: 30000 (30s). */\n pollIntervalMs?: number;\n /**\n * Comma-separated event type filter (glob, e.g. `authorization.*`) applied to\n * every feed read (bootstrap drain, polling, and SSE).\n *\n * A persisted cursor is scoped to the logical `types` subscription it was\n * minted under: a cursor from a broader subscription can skip events that were\n * filtered out previously. This is NOT enforced by the cursor store (the store\n * holds only the cursor string), so if you change `types` you must\n * `reset()` before `start()`. With a persistent {@link FileCursorStore} that\n * survives restarts, changing `types` between deploys against the same store\n * path will silently resume from a foreign cursor — point each subscription at\n * its own store path, or clear the store when the filter changes.\n */\n types?: string;\n /** Max events requested per feed page (polling and SSE). Default: 1000. */\n feedPageLimit?: number;\n /**\n * Server-side caught-up interval hint for the SSE stream, in **seconds** (5–60,\n * default 15) — maps to the `poll_interval_seconds` query param. Note the unit:\n * `pollIntervalMs` and `streamIdleTimeoutMs` are milliseconds.\n */\n streamPollIntervalSeconds?: number;\n /**\n * Client-side idle watchdog: reconnect the stream if no feed page or heartbeat\n * arrives within this window. Must exceed the server poll interval.\n * Default: 90000 (90s).\n */\n streamIdleTimeoutMs?: number;\n /** Reconnect backoff floor in ms. Default: 1000. */\n streamReconnectMinMs?: number;\n /** Reconnect backoff ceiling in ms. Default: 30000. */\n streamReconnectMaxMs?: number;\n /**\n * Consecutive stream failures (with no successful message in between) before\n * `'auto'` mode falls back to polling. Default: 3. Ignored in `'stream'` mode.\n */\n maxStreamFailures?: number;\n /** Choose which indexes to maintain. */\n indexes?: {\n /** Agent inventory profiles. Default: true. */\n agents?: boolean;\n /** Authorization entries (agent→domain mappings). Default: true. */\n authorizations?: boolean;\n /** Property feed records (property_rid→property and publisher domain→properties). Default: true. */\n properties?: boolean;\n /** Ordered brand hierarchy chains (self → parents → house). Default: true. */\n brandHierarchies?: boolean;\n };\n /** Optional cursor store for persisting the feed cursor between restarts. */\n cursorStore?: CursorStore;\n /** Called when RegistrySync intentionally ignores an event family it does not index. */\n onIgnoredEvent?: (event: CatalogEvent, reason: string) => void;\n /** Called on errors during polling/bootstrap. */\n onError?: (error: Error) => void;\n}\n\nexport type RegistrySyncState = 'idle' | 'bootstrapping' | 'syncing' | 'error';\n\n/** Active feed transport once syncing. */\nexport type RegistrySyncTransport = 'stream' | 'poll';\n\n/**\n * Outcome of one SSE connection, driving the reconnect loop.\n * - `closed`: the server ended the stream cleanly (EOF), no error.\n * - `reconnect`: a transport/parse failure or a server `feed_stream_error` —\n * counts toward `auto` polling fallback.\n */\ntype StreamDisposition = 'closed' | 'reconnect' | 'rebootstrap' | 'fallback' | 'fatal' | 'stopped';\ntype RegistrySyncComplianceStatus = AgentCompliance['status'] | 'opted_out';\ntype AuthorizationRemoveOptions = {\n matchByRowId?: boolean;\n fallbackToTupleOnMissingRowId?: boolean;\n};\n\n// ====== Event types ======\n\nexport interface RegistrySyncEvents {\n bootstrap: [{ agentCount: number; authorizationCount: number }];\n sync: [{ cursor: string; eventsApplied: number }];\n /** Emitted for each event applied during polling. Not emitted during bootstrap. */\n event: [{ event: CatalogEvent }];\n error: [{ error: Error }];\n /** Emitted when an agent's compliance status changes. */\n compliance_changed: [\n { agentUrl: string; previousStatus: RegistrySyncComplianceStatus; currentStatus: RegistrySyncComplianceStatus },\n ];\n stateChange: [{ from: RegistrySyncState; to: RegistrySyncState }];\n /** Emitted whenever a feed page or heartbeat carries freshness metadata, for lag monitoring. */\n freshness: [{ freshness: FeedFreshness }];\n /** Emitted when the active feed transport changes (e.g. stream → polling fallback). */\n transport: [{ transport: RegistrySyncTransport }];\n /** Emitted when an event is intentionally not indexed by RegistrySync. */\n ignoredEvent: [{ event: CatalogEvent; reason: string }];\n}\n\n// ====== Agent filter for client-side search ======\n\nexport interface AgentFilter {\n type?: string;\n channels?: string[];\n markets?: string[];\n categories?: string[];\n property_types?: string[];\n tags?: string[];\n delivery_types?: string[];\n has_tmp?: boolean;\n min_properties?: number;\n compliance_status?: RegistrySyncComplianceStatus[];\n}\n\nexport type RegistrySyncProperty = {\n /** Stable registry property RID. */\n property_rid: string;\n /** Publisher domain that owns the property, when supplied by the feed. */\n publisher_domain?: string;\n identifiers?: PropertyIdentifier[];\n classification?: string;\n source?: PropertyEventPayload['source'];\n property?: PropertyEventPayload['property'];\n changed_fields?: string[];\n last_resolved_at?: string;\n reactivated_at?: string;\n reason?: string;\n evidence?: string;\n [key: string]: unknown;\n};\n\n// ====== RegistrySync ======\n\n/**\n * In-memory replica of the AdCP registry.\n *\n * Bootstraps from the agent search endpoint, then tails the change feed —\n * Server-Sent Events by default (`transport: 'auto'`), falling back to polling\n * `/api/registry/feed` when streaming is unavailable — to keep its indexes\n * current for zero-latency lookups.\n *\n * **Staleness:** lookups (`getAgent`, `isAuthorized`, the authorization getters)\n * return the last synced state. After a transient failure the engine keeps\n * reconnecting/polling, but a fatal error (e.g. `401`) leaves `state === 'error'`\n * while the indexes still hold their last values. For decisions where staleness\n * is unsafe (e.g. authorization enforcement), gate on `state` and\n * `getLagSeconds()` / `getFreshness()` rather than trusting a lookup blindly.\n * Index size is bounded only by registry trust — a replica mirrors the whole\n * registry, so an untrusted/compromised feed could grow memory without limit.\n *\n * @example\n * ```ts\n * const client = new RegistryClient({ apiKey: 'sk_...' });\n * const sync = new RegistrySync({ client }); // transport: 'auto' (SSE, polling fallback)\n *\n * // Zero-latency lookups\n * sync.on('event', ({ event }) => console.log('registry change:', event.event_type));\n *\n * // Lag monitoring for the SSE feed\n * sync.on('transport', ({ transport }) => console.log('feed transport:', transport));\n * sync.on('freshness', ({ freshness }) => {\n * if ((freshness.lag_seconds ?? 0) > 300) console.warn('registry feed lag > 5m');\n * });\n *\n * await sync.start();\n * const agent = sync.getAgent('https://ads.example.com');\n * const authorized = sync.isAuthorized('https://ads.example.com', 'publisher.com');\n * const ctv = sync.findAgents({ channels: ['ctv'], markets: ['US'] });\n * sync.stop();\n * ```\n */\nexport class RegistrySync extends EventEmitter<RegistrySyncEvents> {\n private readonly client: RegistryClient;\n private readonly transportMode: 'auto' | 'stream' | 'poll';\n private readonly pollIntervalMs: number;\n private readonly types: string | undefined;\n private readonly feedPageLimit: number;\n private readonly streamPollIntervalSeconds: number;\n private readonly streamIdleTimeoutMs: number;\n private readonly streamReconnectMinMs: number;\n private readonly streamReconnectMaxMs: number;\n private readonly maxStreamFailures: number;\n private readonly indexAgents: boolean;\n private readonly indexAuthorizations: boolean;\n private readonly indexProperties: boolean;\n private readonly indexBrandHierarchies: boolean;\n private readonly ignoredEventHandler: ((event: CatalogEvent, reason: string) => void) | undefined;\n private readonly errorHandler: ((error: Error) => void) | undefined;\n private readonly cursorStore: CursorStore;\n\n private _state: RegistrySyncState = 'idle';\n private cursor: string | null = null;\n private pollTimer: ReturnType<typeof setTimeout> | null = null;\n\n // Streaming state\n private activeTransport: RegistrySyncTransport | null = null;\n private streamController: AbortController | null = null;\n private streamIdleTimer: ReturnType<typeof setTimeout> | null = null;\n private lastFreshness: FeedFreshness | null = null;\n /**\n * Incremented by stop()/reset() and each start(). Async work (bootstrap,\n * rebootstrap, the stream loop) captures its generation and bails the moment\n * it no longer matches — so a stop() that lands mid-bootstrap is honored and\n * a stale loop can never resume after the caller stopped or restarted.\n */\n private generation = 0;\n\n // Indexes\n private agents = new Map<string, AgentSearchResult>();\n private authByDomain = new Map<string, AuthorizationEntry[]>();\n private authByAgent = new Map<string, AuthorizationEntry[]>();\n private authLocationsById = new Map<string, { agentKey: string; domainKey: string }>();\n private propertiesByRid = new Map<string, RegistrySyncProperty>();\n private propertyRidsByDomain = new Map<string, Set<string>>();\n private propertyAliasesByRid = new Map<string, string>();\n private brandAncestorsByDomain = new Map<string, string[]>();\n private brandHierarchyByDomain = new Map<string, ResolvedBrand[]>();\n private brandHierarchyKeysByEntity = new Map<string, Set<string>>();\n private brandHierarchyEntityByKey = new Map<string, string>();\n\n constructor(config: RegistrySyncConfig) {\n super();\n this.client = config.client;\n this.transportMode = config.transport ?? 'auto';\n this.pollIntervalMs = config.pollIntervalMs ?? 30_000;\n this.types = config.types;\n this.feedPageLimit = config.feedPageLimit ?? 1000;\n // Fail closed on out-of-range values rather than letting the registry reject\n // them with a 400 that the reconnect/poll loop would hot-retry forever.\n if (!Number.isInteger(this.feedPageLimit) || this.feedPageLimit < 1 || this.feedPageLimit > 10_000) {\n throw new Error('feedPageLimit must be an integer between 1 and 10000');\n }\n this.streamPollIntervalSeconds = config.streamPollIntervalSeconds ?? 15;\n if (\n !Number.isInteger(this.streamPollIntervalSeconds) ||\n this.streamPollIntervalSeconds < 5 ||\n this.streamPollIntervalSeconds > 60\n ) {\n throw new Error('streamPollIntervalSeconds must be an integer between 5 and 60');\n }\n this.streamIdleTimeoutMs = config.streamIdleTimeoutMs ?? 90_000;\n this.streamReconnectMinMs = config.streamReconnectMinMs ?? 1_000;\n this.streamReconnectMaxMs = config.streamReconnectMaxMs ?? 30_000;\n this.maxStreamFailures = config.maxStreamFailures ?? 3;\n this.indexAgents = config.indexes?.agents !== false;\n this.indexAuthorizations = config.indexes?.authorizations !== false;\n this.indexProperties = config.indexes?.properties !== false;\n this.indexBrandHierarchies = config.indexes?.brandHierarchies !== false;\n this.cursorStore = config.cursorStore ?? new InMemoryCursorStore();\n this.ignoredEventHandler = config.onIgnoredEvent;\n this.errorHandler = config.onError;\n }\n\n // ====== Lifecycle ======\n\n /** Bootstrap from the registry and begin tailing the event feed. */\n async start(): Promise<void> {\n if (this._state === 'syncing' || this._state === 'bootstrapping') return;\n const gen = ++this.generation;\n await this.bootstrap(gen);\n // A stop()/reset() (or another start()) during bootstrap bumps the\n // generation; beginSync re-validates both generation and state before\n // starting the sync loop.\n this.beginSync(gen);\n }\n\n /** Stop tailing the feed. In-memory state is preserved. */\n stop(): void {\n // Invalidate any in-flight bootstrap/rebootstrap/stream loop, even while\n // state is still 'bootstrapping'.\n this.generation++;\n if (this.pollTimer) {\n clearTimeout(this.pollTimer);\n this.pollTimer = null;\n }\n this.abortStream();\n this.activeTransport = null;\n if (this._state === 'syncing' || this._state === 'bootstrapping') {\n this.setState('idle');\n }\n }\n\n /**\n * Stop, clear all in-memory state, and drop the persisted cursor. Call start()\n * again to re-bootstrap from scratch. Because this clears the stored cursor,\n * it is the correct way to switch the `types` subscription: `reset()` then\n * `start()` begins a fresh subscription rather than resuming a cursor minted\n * under the previous filter.\n */\n async reset(): Promise<void> {\n this.stop();\n this.clearIndexes();\n this.cursor = null;\n this.lastFreshness = null;\n await this.cursorStore.clearCursor();\n this.setState('idle');\n }\n\n /** Begin tailing the feed using the configured transport. Bootstrap leaves state at 'syncing'. */\n private beginSync(gen: number): void {\n if (gen !== this.generation || this._state !== 'syncing') return;\n if (this.transportMode === 'poll') {\n this.setTransport('poll');\n this.schedulePoll(gen);\n return;\n }\n this.setTransport('stream');\n void this.runStream(gen);\n }\n\n // ====== Agent Lookups ======\n\n /** Get an agent by URL. */\n getAgent(url: string): AgentSearchResult | undefined {\n return this.agents.get(url);\n }\n\n /** Get all agents in the index. */\n getAgents(): AgentSearchResult[] {\n return [...this.agents.values()];\n }\n\n /** Find agents matching a filter. All specified dimensions use AND; values within arrays use OR. */\n findAgents(filter: AgentFilter): AgentSearchResult[] {\n return this.getAgents().filter(agent => {\n const p = agent.inventory_profile;\n if (filter.type && agent.type !== filter.type) return false;\n if (filter.channels?.length && !filter.channels.some(c => p.channels.includes(c))) return false;\n if (filter.markets?.length && !filter.markets.some(m => p.markets.includes(m))) return false;\n if (filter.categories?.length && !filter.categories.some(c => p.categories.includes(c))) return false;\n if (filter.property_types?.length && !filter.property_types.some(t => p.property_types.includes(t))) return false;\n if (filter.tags?.length && !filter.tags.some(t => p.tags.includes(t))) return false;\n if (filter.delivery_types?.length && !filter.delivery_types.some(d => p.delivery_types.includes(d))) return false;\n if (filter.has_tmp != null && p.has_tmp !== filter.has_tmp) return false;\n if (filter.min_properties != null && p.property_count < filter.min_properties) return false;\n if (filter.compliance_status?.length) {\n const status = (agent.compliance_summary?.status ?? 'unknown') as RegistrySyncComplianceStatus;\n if (!filter.compliance_status.includes(status)) return false;\n }\n return true;\n });\n }\n\n // ====== Authorization Lookups ======\n\n /** Get all authorizations for a publisher domain. */\n getAuthorizationsForDomain(domain: string): AuthorizationEntry[] {\n return this.authByDomain.get(this.authDomainKey(domain)) ?? [];\n }\n\n /** Get all authorizations for an agent. */\n getAuthorizationsForAgent(agentUrl: string): AuthorizationEntry[] {\n const entries: AuthorizationEntry[] = [];\n for (const key of this.authAgentKeysForUrl(agentUrl)) {\n for (const entry of this.authByAgent.get(key) ?? []) {\n if (!entries.includes(entry)) entries.push(entry);\n }\n }\n return entries;\n }\n\n /**\n * Check if an agent has any authorization for a publisher domain.\n * Does not evaluate property_id scoping, time bounds, or effective dates.\n * For scoped checks, use getAuthorizationsForDomain() and inspect entries directly.\n *\n * Returns the last synced state — see the class-level staleness note. For\n * enforcement, confirm `state === 'syncing'` and an acceptable `getLagSeconds()`\n * before trusting an allow decision, so a stalled feed can't serve a stale\n * authorization after a missed revocation.\n */\n isAuthorized(agentUrl: string, domain: string): boolean {\n const entries = this.authByDomain.get(this.authDomainKey(domain));\n return entries != null && entries.some(entry => this.authorizationAgentMatches(entry, agentUrl));\n }\n\n // ====== Property Lookups ======\n\n /** Get a property feed record by property_rid. Merged aliases resolve to their canonical RID. */\n getProperty(rid: string): RegistrySyncProperty | undefined {\n const property = this.propertiesByRid.get(this.resolvePropertyRid(rid));\n return property ? this.cloneProperty(property) : undefined;\n }\n\n /** Get all property feed records for a publisher domain. */\n getPropertiesForDomain(domain: string): RegistrySyncProperty[] {\n const rids = this.propertyRidsByDomain.get(this.normalizeDomainKey(domain));\n if (!rids) return [];\n const properties: RegistrySyncProperty[] = [];\n for (const rid of rids) {\n const property = this.propertiesByRid.get(this.resolvePropertyRid(rid));\n if (property) properties.push(this.cloneProperty(property));\n }\n return properties;\n }\n\n // ====== Brand Hierarchy Lookups ======\n\n /**\n * Get the ordered corporate ancestor domain chain for a brand domain.\n *\n * The returned array includes the resolved brand itself as the first entry and\n * the house domain as the last entry when known.\n */\n getAncestors(domain: string): string[] {\n return [...(this.brandAncestorsByDomain.get(this.normalizeDomainKey(domain)) ?? [])];\n }\n\n /** Get the ordered resolved brand chain for a brand domain, when the feed supplied it. */\n getBrandHierarchy(domain: string): ResolvedBrand[] {\n return (this.brandHierarchyByDomain.get(this.normalizeDomainKey(domain)) ?? []).map(brand => ({ ...brand }));\n }\n\n // ====== State ======\n\n get state(): RegistrySyncState {\n return this._state;\n }\n\n getCursor(): string | null {\n return this.cursor;\n }\n\n getStats(): { agents: number; authorizations: number; properties: number; brandHierarchies: number } {\n let authCount = 0;\n for (const entries of this.authByDomain.values()) authCount += entries.length;\n return {\n agents: this.agents.size,\n authorizations: authCount,\n properties: this.propertiesByRid.size,\n brandHierarchies: this.brandHierarchyKeysByEntity.size,\n };\n }\n\n /** The active feed transport once syncing, or null when idle. */\n getTransport(): RegistrySyncTransport | null {\n return this.activeTransport;\n }\n\n /**\n * Latest feed freshness metadata, or null if the registry has not reported it\n * yet (e.g. before the first feed page/heartbeat lands). For push updates,\n * prefer the `freshness` event over polling this right after `start()`.\n */\n getFreshness(): FeedFreshness | null {\n return this.lastFreshness;\n }\n\n /** Latest feed lag in seconds, or null when unavailable. Convenience over getFreshness(). */\n getLagSeconds(): number | null {\n return this.lastFreshness?.lag_seconds ?? null;\n }\n\n // ====== Private: Bootstrap ======\n\n private async bootstrap(gen: number): Promise<void> {\n this.setState('bootstrapping');\n try {\n // Restore cursor from store if available\n const storedCursor = await this.cursorStore.getCursor();\n if (storedCursor) {\n this.cursor = storedCursor;\n }\n\n // Paginate searchAgents to load all agents\n if (this.indexAgents) {\n let cursor: string | undefined;\n do {\n const query: Record<string, unknown> = { limit: 200 };\n if (cursor) query.cursor = cursor;\n const res: AgentSearchResponse = await this.client.searchAgents(query as any);\n for (const agent of res.results) {\n this.agents.set(agent.url, agent);\n }\n cursor = res.has_more && res.cursor ? res.cursor : undefined;\n } while (cursor);\n }\n\n // Get initial feed cursor and apply any events\n await this.drainFeed(gen);\n\n // A stop()/reset() landed mid-bootstrap: do not flip to 'syncing' or emit.\n if (gen !== this.generation) return;\n\n this.setState('syncing');\n this.emit('bootstrap', {\n agentCount: this.agents.size,\n authorizationCount: this.getStats().authorizations,\n });\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n // If we were stopped mid-bootstrap, swallow the abort rather than parking\n // the engine in 'error'.\n if (gen !== this.generation) return;\n this.setState('error');\n this.errorHandler?.(error);\n this.emit('error', { error });\n throw error;\n }\n }\n\n /** Clear all state, drop the persisted cursor, and bootstrap again from scratch. */\n private async rebootstrap(gen: number): Promise<void> {\n this.clearIndexes();\n this.cursor = null;\n await this.cursorStore.clearCursor();\n await this.bootstrap(gen);\n }\n\n // ====== Private: Polling ======\n\n private schedulePoll(gen: number): void {\n this.pollTimer = setTimeout(() => this.pollLoop(gen), this.pollIntervalMs);\n }\n\n private async pollLoop(gen: number): Promise<void> {\n if (gen !== this.generation) return;\n try {\n await this.poll(gen);\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n this.emit('error', { error });\n this.errorHandler?.(error);\n }\n // Schedule next poll even after errors (will retry), unless stopped/superseded.\n if (gen === this.generation && this._state === 'syncing') {\n this.schedulePoll(gen);\n }\n }\n\n private async poll(gen: number): Promise<void> {\n let totalEventsApplied = 0;\n let hasMore = true;\n\n while (hasMore) {\n const feed: FeedResponse = await this.client.getFeed(this.feedQuery());\n\n if (feed.cursor_expired) {\n // Cursor aged out of retention: drop state and re-bootstrap, then resume.\n try {\n await this.rebootstrap(gen);\n } catch {\n // bootstrap() already emitted 'error' and parked state in 'error'.\n // Restore 'syncing' so pollLoop reschedules and retries (mirrors the\n // stream path, which also keeps trying after a failed rebootstrap).\n if (gen === this.generation && this._state === 'error') this.setState('syncing');\n }\n return;\n }\n\n for (const event of feed.events) {\n this.applyEvent(event);\n this.emit('event', { event });\n totalEventsApplied++;\n }\n\n this.observeFreshness(feed.freshness);\n\n if (feed.cursor) {\n this.cursor = feed.cursor;\n }\n\n hasMore = feed.has_more && feed.cursor != null;\n }\n\n await this.persistCursor();\n\n if (totalEventsApplied > 0) {\n this.emit('sync', { cursor: this.cursor!, eventsApplied: totalEventsApplied });\n }\n }\n\n /**\n * Drain all available feed pages. Used during bootstrap (does not emit 'event' per event).\n */\n private async drainFeed(gen: number): Promise<void> {\n let hasMore = true;\n let recoveredFromExpiry = false;\n while (hasMore) {\n const feed: FeedResponse = await this.client.getFeed(this.feedQuery());\n if (feed.cursor_expired) {\n // Stored cursor aged out of retention: drop it and retry once from the\n // start of the window. A second expiry (now cursor-less) means a\n // misbehaving server — stop draining rather than hot-looping.\n this.cursor = null;\n await this.cursorStore.clearCursor();\n if (recoveredFromExpiry) break;\n recoveredFromExpiry = true;\n continue;\n }\n for (const event of feed.events) {\n this.applyEvent(event);\n }\n this.observeFreshness(feed.freshness);\n if (feed.cursor) this.cursor = feed.cursor;\n hasMore = feed.has_more && feed.cursor != null;\n }\n // A stop()/reset() during the drain bumps the generation — don't persist a\n // cursor a later start() would read back.\n if (gen === this.generation) await this.persistCursor();\n }\n\n // ====== Private: Streaming ======\n\n private async runStream(gen: number): Promise<void> {\n // `consecutiveFailures` drives 'auto' polling fallback. It counts connections\n // that ended in a transport/parse failure — a heartbeat does NOT reset it\n // (else heartbeat → malformed-frame → reconnect could loop forever and never\n // fall back, despite the parse-failure fallback contract). It resets only on\n // real feed progress or a clean close that delivered something.\n // `consecutiveRebootstraps` bounds a tight cursor_expired loop.\n let consecutiveFailures = 0;\n let consecutiveRebootstraps = 0;\n\n while (gen === this.generation && this.transportMode !== 'poll') {\n const controller = new AbortController();\n this.streamController = controller;\n let feedApplied = false;\n let receivedAny = false;\n let disposition: StreamDisposition;\n\n try {\n disposition = await this.streamConnection(gen, controller.signal, isFeed => {\n receivedAny = true;\n if (isFeed) feedApplied = true;\n });\n } catch (err) {\n // Aborted by stop()/reset() (which bumps the generation): exit quietly.\n if (controller.signal.aborted && gen !== this.generation) {\n return;\n }\n const error = err instanceof Error ? err : new Error(String(err));\n disposition = this.classifyStreamError(error);\n if (disposition === 'reconnect' || disposition === 'fatal') {\n this.emit('error', { error });\n this.errorHandler?.(error);\n }\n } finally {\n this.clearStreamIdleTimer();\n }\n\n if (gen !== this.generation) return;\n // Applying a feed page proves the stream works end to end.\n if (feedApplied) {\n consecutiveFailures = 0;\n consecutiveRebootstraps = 0;\n }\n\n if (disposition === 'stopped') return;\n\n if (disposition === 'fatal') {\n // Permanent error (e.g. 400/401): retrying cannot help. Park in 'error'.\n this.setState('error');\n this.activeTransport = null;\n return;\n }\n\n if (disposition === 'rebootstrap') {\n let ok = false;\n try {\n await this.rebootstrap(gen);\n ok = true;\n } catch {\n // bootstrap() already emitted 'error' and parked state in 'error'.\n }\n if (gen !== this.generation) return;\n if (!ok) {\n consecutiveFailures++;\n if (this.shouldFallBack(consecutiveFailures)) {\n this.fallBackToPolling(gen);\n return;\n }\n // Recover: bootstrap left us in 'error'. In 'stream' mode the contract\n // is to keep reconnecting, so restore 'syncing' and back off.\n this.setState('syncing');\n await this.delay(this.reconnectBackoffMs(consecutiveFailures), controller.signal);\n if (gen !== this.generation) return;\n continue;\n }\n // Successful re-bootstrap. Back off proportionally to repeated expiries\n // so a server stuck emitting cursor_expired can't drive a tight loop.\n consecutiveRebootstraps++;\n await this.delay(this.reconnectBackoffMs(consecutiveRebootstraps), controller.signal);\n if (gen !== this.generation) return;\n continue;\n }\n\n if (disposition === 'fallback') {\n this.fallBackToPolling(gen);\n return;\n }\n\n if (disposition === 'closed' && receivedAny) {\n // Clean close after real activity (feed or heartbeat): the transport\n // works; reconnect promptly without counting it as a failure.\n consecutiveFailures = 0;\n await this.delay(this.reconnectBackoffMs(0), controller.signal);\n if (gen !== this.generation) return;\n continue;\n }\n\n // 'reconnect' (transport/parse failure or server feed_stream_error), or a\n // clean close that delivered nothing — count toward fallback so 'auto'\n // degrades to polling rather than looping on a stream that never delivers.\n consecutiveFailures++;\n if (this.shouldFallBack(consecutiveFailures)) {\n this.fallBackToPolling(gen);\n return;\n }\n await this.delay(this.reconnectBackoffMs(consecutiveFailures), controller.signal);\n if (gen !== this.generation) return;\n }\n }\n\n /**\n * Consume one SSE connection. Invokes `onMessage(isFeed)` for each feed page\n * (true) or heartbeat (false) received. Returns the disposition for the\n * reconnect loop: `closed` on a clean server EOF, `reconnect` on a server\n * `feed_stream_error`, `rebootstrap` on `cursor_expired`, `stopped` if the\n * engine was stopped mid-stream.\n */\n private async streamConnection(\n gen: number,\n signal: AbortSignal,\n onMessage: (isFeed: boolean) => void\n ): Promise<StreamDisposition> {\n this.armStreamIdleTimer();\n const query: FeedStreamQuery = {\n cursor: this.cursor ?? undefined,\n types: this.types,\n limit: this.feedPageLimit,\n pollIntervalSeconds: this.streamPollIntervalSeconds,\n };\n\n for await (const msg of this.client.streamFeed(query, { signal })) {\n if (gen !== this.generation) return 'stopped';\n this.armStreamIdleTimer();\n\n if (msg.type === 'feed') {\n onMessage(true);\n await this.applyStreamPage(msg.page);\n } else if (msg.type === 'heartbeat') {\n onMessage(false);\n // Heartbeats keep the connection alive and expose freshness; they do NOT\n // advance the cursor and do NOT count as feed progress for fallback.\n this.observeFreshness(msg.heartbeat.freshness);\n } else {\n // 'error' — the server closes the stream after this frame.\n if (msg.error.error === 'cursor_expired') {\n return 'rebootstrap';\n }\n // Registry-supplied strings are untrusted: escape before logging/emitting.\n const code = sanitizeStreamText(msg.error.error);\n const detail = msg.error.message ? ` (${sanitizeStreamText(msg.error.message)})` : '';\n const error = new Error(`registry feed stream error: ${code}${detail}`);\n this.emit('error', { error });\n this.errorHandler?.(error);\n return 'reconnect';\n }\n }\n\n // Stream closed cleanly by the server — reconnect from the last cursor.\n return 'closed';\n }\n\n /** Apply one SSE feed page: events, freshness, then advance + persist the cursor. */\n private async applyStreamPage(page: FeedResponse): Promise<void> {\n let applied = 0;\n for (const event of page.events) {\n this.applyEvent(event);\n this.emit('event', { event });\n applied++;\n }\n this.observeFreshness(page.freshness);\n\n // Advance the cursor only after the full page is applied, so a mid-page\n // disconnect resumes from the last fully-applied page.\n if (page.cursor) {\n this.cursor = page.cursor;\n try {\n await this.persistCursor();\n } catch (err) {\n // Persisting is best-effort; replay after restart is idempotent.\n const error = err instanceof Error ? err : new Error(String(err));\n this.emit('error', { error });\n this.errorHandler?.(error);\n }\n }\n\n if (applied > 0) {\n this.emit('sync', { cursor: this.cursor!, eventsApplied: applied });\n }\n }\n\n private classifyStreamError(error: Error): StreamDisposition {\n if (error instanceof FeedStreamCursorExpiredError) return 'rebootstrap';\n if (error instanceof FeedStreamUnsupportedError) {\n // Endpoint absent (older registry) or a proxy returned non-stream content.\n return this.transportMode === 'auto' ? 'fallback' : 'reconnect';\n }\n if (error instanceof FeedStreamHttpError && (error.status === 400 || error.status === 401)) {\n // Permanent client-side error: a malformed request or bad credentials.\n // Retrying (or polling, which hits the same status) cannot recover.\n return 'fatal';\n }\n // Other HTTP errors, parse failures, idle timeouts, network/abort errors.\n return 'reconnect';\n }\n\n private shouldFallBack(consecutiveFailures: number): boolean {\n return this.transportMode === 'auto' && consecutiveFailures >= this.maxStreamFailures;\n }\n\n private fallBackToPolling(gen: number): void {\n if (gen !== this.generation || this._state !== 'syncing') return;\n this.abortStream();\n this.setTransport('poll');\n this.schedulePoll(gen);\n }\n\n private armStreamIdleTimer(): void {\n this.clearStreamIdleTimer();\n const controller = this.streamController;\n if (!controller) return;\n this.streamIdleTimer = setTimeout(() => {\n controller.abort(new Error('registry feed stream idle timeout'));\n }, this.streamIdleTimeoutMs);\n this.streamIdleTimer.unref?.();\n }\n\n private clearStreamIdleTimer(): void {\n if (this.streamIdleTimer) {\n clearTimeout(this.streamIdleTimer);\n this.streamIdleTimer = null;\n }\n }\n\n private abortStream(): void {\n this.clearStreamIdleTimer();\n if (this.streamController) {\n this.streamController.abort();\n this.streamController = null;\n }\n }\n\n private reconnectBackoffMs(attempt: number): number {\n const exp = this.streamReconnectMinMs * 2 ** Math.max(0, attempt - 1);\n return Math.min(this.streamReconnectMaxMs, Math.max(this.streamReconnectMinMs, exp));\n }\n\n private delay(ms: number, signal: AbortSignal): Promise<void> {\n if (signal.aborted) return Promise.resolve();\n return new Promise(resolve => {\n const onAbort = () => {\n clearTimeout(timer);\n resolve();\n };\n const timer = setTimeout(() => {\n signal.removeEventListener('abort', onAbort);\n resolve();\n }, ms);\n timer.unref?.();\n signal.addEventListener('abort', onAbort, { once: true });\n });\n }\n\n // ====== Private: Shared feed helpers ======\n\n private feedQuery(): { cursor?: string; types?: string; limit: number } {\n const query: { cursor?: string; types?: string; limit: number } = { limit: this.feedPageLimit };\n if (this.cursor) query.cursor = this.cursor;\n if (this.types) query.types = this.types;\n return query;\n }\n\n private observeFreshness(freshness: FeedFreshness | undefined): void {\n if (!freshness) return;\n this.lastFreshness = freshness;\n this.emit('freshness', { freshness });\n }\n\n private async persistCursor(): Promise<void> {\n if (this.cursor) {\n await this.cursorStore.setCursor(this.cursor);\n }\n }\n\n private setTransport(transport: RegistrySyncTransport): void {\n if (this.activeTransport === transport) return;\n this.activeTransport = transport;\n this.emit('transport', { transport });\n }\n\n // ====== Private: Event Application ======\n\n private applyEvent(event: CatalogEvent): void {\n const payload = this.asRecord(event.payload);\n\n switch (event.event_type) {\n case 'agent.discovered':\n case 'agent.profile_updated': {\n if (!this.indexAgents) break;\n const existing = this.agents.get(event.entity_id);\n const inventoryProfile = this.isAgentInventoryProfile(payload.inventory_profile)\n ? payload.inventory_profile\n : undefined;\n if (existing && inventoryProfile) {\n this.agents.set(event.entity_id, {\n ...existing,\n inventory_profile: inventoryProfile,\n });\n } else if (!existing) {\n // New agent: use payload data or create stub\n this.agents.set(event.entity_id, {\n url: event.entity_id,\n name: typeof payload.name === 'string' ? payload.name : event.entity_id,\n type: typeof payload.type === 'string' ? payload.type : 'unknown',\n inventory_profile: inventoryProfile ?? this.emptyInventoryProfile(),\n match: { score: 0, matched_filters: [] },\n });\n }\n break;\n }\n\n case 'agent.removed': {\n if (this.indexAgents) this.agents.delete(event.entity_id);\n if (this.indexAuthorizations) this.removeAuthorizationsForAgent(event.entity_id);\n break;\n }\n\n case 'authorization.granted': {\n if (!this.indexAuthorizations) break;\n if (!this.isAuthorizationPayload(payload)) break;\n if (typeof payload.authorization_type !== 'string') break;\n this.upsertAuthorizationEntry(this.authorizationEntryFromEvent(payload));\n break;\n }\n\n case 'authorization.modified': {\n if (!this.indexAuthorizations) break;\n if (!this.isAuthorizationPayload(payload)) break;\n const entry = this.authorizationEntryFromEvent(payload);\n if (!entry.id && !entry.authorization_type) break;\n this.upsertAuthorizationEntry(entry, { fallbackToTupleOnMissingRowId: true });\n break;\n }\n\n case 'authorization.revoked': {\n if (!this.indexAuthorizations) break;\n if (!this.isAuthorizationPayload(payload)) break;\n const entry = this.authorizationEntryFromEvent(payload);\n this.removeAuthorizationEntries(entry, {\n matchByRowId: Boolean(entry.id || !entry.authorization_type),\n fallbackToTupleOnMissingRowId: true,\n });\n break;\n }\n\n case 'agent.compliance_changed': {\n if (this.indexAgents) {\n const existing = this.agents.get(event.entity_id);\n const summary = payload.compliance_summary;\n if (existing && this.isAgentCompliance(summary)) {\n this.agents.set(event.entity_id, {\n ...existing,\n compliance_summary: summary,\n });\n }\n }\n this.emit('compliance_changed', {\n agentUrl: event.entity_id,\n previousStatus: (typeof payload.previous_status === 'string'\n ? payload.previous_status\n : 'unknown') as RegistrySyncComplianceStatus,\n currentStatus: (typeof payload.current_status === 'string'\n ? payload.current_status\n : 'unknown') as RegistrySyncComplianceStatus,\n });\n break;\n }\n\n case 'property.created':\n case 'property.updated':\n case 'property.reactivated':\n case 'property.stale': {\n if (this.indexProperties) this.upsertPropertyEvent(payload);\n break;\n }\n\n case 'property.merged': {\n if (this.indexProperties) this.handlePropertyMerge(payload);\n break;\n }\n\n case 'brand.hierarchy_updated':\n case 'brand.updated':\n case 'brand.resolved': {\n if (this.indexBrandHierarchies) this.applyBrandHierarchyEvent(event.entity_id, payload);\n break;\n }\n\n case 'brand.removed':\n case 'brand.deleted': {\n if (this.indexBrandHierarchies) this.deleteBrandHierarchy(event.entity_id, payload);\n break;\n }\n\n case 'collection.created':\n case 'collection.updated':\n case 'collection.merged':\n case 'collection.removed': {\n this.ignoreEvent(event, 'collection.* indexing requires typed collection schemas and a reference consumer');\n break;\n }\n\n case 'publisher.adagents_changed':\n case 'publisher.adagents_discovered': {\n this.ignoreEvent(event, 'publisher.* indexing requires a reference consumer');\n break;\n }\n\n default:\n this.ignoreEvent(event, 'unknown or unsupported registry feed event type');\n break;\n }\n }\n\n // ====== Private: Helpers ======\n\n private clearIndexes(): void {\n this.agents.clear();\n this.authByDomain.clear();\n this.authByAgent.clear();\n this.authLocationsById.clear();\n this.propertiesByRid.clear();\n this.propertyRidsByDomain.clear();\n this.propertyAliasesByRid.clear();\n this.brandAncestorsByDomain.clear();\n this.brandHierarchyByDomain.clear();\n this.brandHierarchyKeysByEntity.clear();\n this.brandHierarchyEntityByKey.clear();\n }\n\n private ignoreEvent(event: CatalogEvent, reason: string): void {\n this.ignoredEventHandler?.(event, reason);\n this.emit('ignoredEvent', { event, reason });\n }\n\n private upsertAuthorizationEntry(\n entry: AuthorizationEntry,\n options?: { fallbackToTupleOnMissingRowId?: boolean }\n ): void {\n const normalizedEntry = this.normalizeAuthorizationEntry(entry);\n this.removeAuthorizationEntries(normalizedEntry, {\n matchByRowId: Boolean(normalizedEntry.id),\n fallbackToTupleOnMissingRowId: options?.fallbackToTupleOnMissingRowId,\n });\n\n const domainKey = this.authDomainKey(normalizedEntry.publisher_domain);\n const domainEntries = this.authByDomain.get(domainKey) ?? [];\n domainEntries.push(normalizedEntry);\n this.authByDomain.set(domainKey, domainEntries);\n\n const agentKey = this.authAgentKey(normalizedEntry);\n for (const key of this.authAgentKeys(normalizedEntry)) {\n const agentEntries = this.authByAgent.get(key) ?? [];\n agentEntries.push(normalizedEntry);\n this.authByAgent.set(key, agentEntries);\n }\n\n if (normalizedEntry.id) {\n this.authLocationsById.set(normalizedEntry.id, {\n agentKey,\n domainKey,\n });\n }\n }\n\n private normalizeAuthorizationEntry(entry: AuthorizationEntry): AuthorizationEntry {\n if (entry.effective_until || !entry.effective_to) return entry;\n return { ...entry, effective_until: entry.effective_to };\n }\n\n private authorizationEntryFromEvent(entry: AuthorizationEntry): AuthorizationEntry {\n return this.normalizeAuthorizationEntry(entry);\n }\n\n private removeAuthorizationsForAgent(agentUrl: string): void {\n const agentKeys = this.authAgentKeysForUrl(agentUrl);\n for (const [key, entries] of this.authByAgent) {\n if (entries.some(entry => this.authorizationAgentMatches(entry, agentUrl))) agentKeys.add(key);\n }\n\n for (const agentKey of agentKeys) {\n const entries = [...(this.authByAgent.get(agentKey) ?? [])];\n for (const entry of entries) {\n this.removeAuthorizationEntries(entry, {\n matchByRowId: Boolean(entry.id),\n fallbackToTupleOnMissingRowId: true,\n });\n }\n this.authByAgent.delete(agentKey);\n }\n }\n\n private removeAuthorizationEntries(target: AuthorizationEntry, options?: AuthorizationRemoveOptions): void {\n const normalizedTarget = this.normalizeAuthorizationEntry(target);\n const domainKeys = new Set<string>([this.authDomainKey(normalizedTarget.publisher_domain)]);\n const agentKeys = this.authAgentKeys(normalizedTarget);\n let effectiveOptions = options;\n\n if (normalizedTarget.id && options?.matchByRowId) {\n const existingLocation = this.authLocationsById.get(normalizedTarget.id);\n if (!existingLocation && options.fallbackToTupleOnMissingRowId) {\n effectiveOptions = { ...options, matchByRowId: false };\n }\n if (existingLocation) {\n domainKeys.add(existingLocation.domainKey);\n agentKeys.add(existingLocation.agentKey);\n }\n }\n\n for (const domain of domainKeys) {\n const entries = this.authByDomain.get(domain);\n if (!entries) continue;\n for (const entry of entries) {\n if (this.authorizationMatches(entry, normalizedTarget, effectiveOptions)) {\n for (const key of this.authAgentKeys(entry)) agentKeys.add(key);\n }\n }\n }\n\n for (const domain of domainKeys) {\n this.removeAuthorizationEntriesFromBucket(this.authByDomain, domain, normalizedTarget, effectiveOptions);\n }\n\n for (const agentUrl of agentKeys) {\n this.removeAuthorizationEntriesFromBucket(this.authByAgent, agentUrl, normalizedTarget, effectiveOptions);\n }\n }\n\n private removeAuthorizationEntriesFromBucket(\n bucket: Map<string, AuthorizationEntry[]>,\n key: string,\n target: AuthorizationEntry,\n options?: AuthorizationRemoveOptions\n ): void {\n const entries = bucket.get(key);\n if (!entries) return;\n\n const filtered: AuthorizationEntry[] = [];\n for (const entry of entries) {\n if (this.authorizationMatches(entry, target, options)) {\n if (entry.id) this.authLocationsById.delete(entry.id);\n } else {\n filtered.push(entry);\n }\n }\n if (filtered.length > 0) bucket.set(key, filtered);\n else bucket.delete(key);\n }\n\n private authorizationMatches(\n entry: AuthorizationEntry,\n target: AuthorizationEntry,\n options?: AuthorizationRemoveOptions\n ): boolean {\n if (target.id && options?.matchByRowId) return entry.id === target.id;\n if (!this.authorizationEntriesShareAgent(entry, target)) return false;\n if (this.authDomainKey(entry.publisher_domain) !== this.authDomainKey(target.publisher_domain)) return false;\n if (target.authorization_type) return entry.authorization_type === target.authorization_type;\n return true;\n }\n\n private authorizationAgentMatches(entry: AuthorizationEntry, agentUrl: string): boolean {\n return this.authAgentKeysOverlap(this.authAgentKeys(entry), this.authAgentKeysForUrl(agentUrl));\n }\n\n private authorizationEntriesShareAgent(\n left: Pick<AuthorizationEntry, 'agent_url' | 'agent_url_canonical'>,\n right: Pick<AuthorizationEntry, 'agent_url' | 'agent_url_canonical'>\n ): boolean {\n return this.authAgentKeysOverlap(this.authAgentKeys(left), this.authAgentKeys(right));\n }\n\n private authDomainKey(domain: string): string {\n return this.normalizeDomainKey(domain);\n }\n\n private authAgentKey(entry: Pick<AuthorizationEntry, 'agent_url' | 'agent_url_canonical'>): string {\n return this.authAgentKeyFromUrl(entry.agent_url);\n }\n\n private authAgentKeys(entry: Pick<AuthorizationEntry, 'agent_url' | 'agent_url_canonical'>): Set<string> {\n const keys = this.authAgentKeysForUrl(entry.agent_url);\n if (entry.agent_url_canonical?.trim()) {\n for (const key of this.authAgentKeysForUrl(entry.agent_url_canonical)) keys.add(key);\n }\n return keys;\n }\n\n private authAgentKeysForUrl(agentUrl: string): Set<string> {\n const trimmed = agentUrl.trim();\n const keys = new Set<string>();\n if (trimmed) keys.add(trimmed);\n keys.add(this.authAgentKeyFromUrl(agentUrl));\n return keys;\n }\n\n private authAgentKeysOverlap(left: Set<string>, right: Set<string>): boolean {\n for (const key of left) {\n if (right.has(key)) return true;\n }\n return false;\n }\n\n private authAgentKeyFromUrl(agentUrl: string): string {\n const trimmed = agentUrl.trim();\n if (!trimmed) return trimmed;\n\n try {\n const parsed = new URL(trimmed);\n if (parsed.host) return `${parsed.protocol.toLowerCase()}//${parsed.host.toLowerCase()}`;\n } catch {\n // Fall through to best-effort normalization for malformed or scheme-less values.\n }\n\n const schemeEnd = trimmed.indexOf('://');\n const authorityStart = schemeEnd > 0 ? schemeEnd + 3 : 0;\n let authorityEnd = trimmed.length;\n for (const delimiter of ['/', '?', '#'] as const) {\n const index = trimmed.indexOf(delimiter, authorityStart);\n if (index >= 0 && index < authorityEnd) authorityEnd = index;\n }\n if (authorityEnd === authorityStart) return trimmed.toLowerCase();\n\n const scheme = schemeEnd > 0 ? `${trimmed.slice(0, authorityStart).toLowerCase()}` : '';\n return `${scheme}${trimmed.slice(authorityStart, authorityEnd).toLowerCase()}`;\n }\n\n private upsertPropertyEvent(payload: Record<string, unknown>): void {\n const rid = this.propertyRidFromPayload(payload);\n if (!rid) return;\n const canonicalRid = this.resolvePropertyRid(rid);\n const existing = this.propertiesByRid.get(canonicalRid);\n const next = this.propertyFromPayload(canonicalRid, payload, existing);\n if (!next) return;\n\n this.setPropertyEntry(next, existing);\n }\n\n private handlePropertyMerge(payload: Record<string, unknown>): void {\n if (typeof payload.alias_rid !== 'string' || typeof payload.canonical_rid !== 'string') return;\n const aliasRid = this.resolvePropertyRid(payload.alias_rid);\n const canonicalRid = this.resolvePropertyRid(payload.canonical_rid);\n if (!aliasRid || !canonicalRid || aliasRid === canonicalRid) return;\n\n const aliasEntry = this.propertiesByRid.get(aliasRid);\n const canonicalEntry = this.propertiesByRid.get(canonicalRid);\n const payloadEntry = this.propertyFromPayload(canonicalRid, payload);\n this.propertyAliasesByRid.set(payload.alias_rid, canonicalRid);\n this.propertyAliasesByRid.set(aliasRid, canonicalRid);\n\n if (!aliasEntry && !canonicalEntry && !payloadEntry) return;\n\n const merged: RegistrySyncProperty = {\n ...(aliasEntry ? this.cloneProperty(aliasEntry) : {}),\n ...(canonicalEntry ? this.cloneProperty(canonicalEntry) : {}),\n ...(payloadEntry ? this.cloneProperty(payloadEntry) : {}),\n property_rid: canonicalRid,\n };\n if (!merged.publisher_domain) {\n merged.publisher_domain = canonicalEntry?.publisher_domain ?? aliasEntry?.publisher_domain;\n }\n\n this.deletePropertyEntry(aliasRid);\n this.setPropertyEntry(merged, canonicalEntry);\n }\n\n private propertyFromPayload(\n rid: string,\n payload: Record<string, unknown>,\n existing?: RegistrySyncProperty\n ): RegistrySyncProperty | null {\n const publisherDomain = this.propertyDomainFromPayload(payload) ?? existing?.publisher_domain;\n const next: RegistrySyncProperty = existing ? this.cloneProperty(existing) : { property_rid: rid };\n let hasPayloadFields = false;\n\n for (const [key, value] of Object.entries(payload)) {\n if (value === undefined || key === 'alias_rid' || key === 'canonical_rid') continue;\n hasPayloadFields = true;\n next[key] = this.cloneJsonValue(value);\n }\n next.property_rid = rid;\n if (publisherDomain) next.publisher_domain = publisherDomain;\n\n return hasPayloadFields || publisherDomain || existing ? next : null;\n }\n\n private setPropertyEntry(entry: RegistrySyncProperty, previous?: RegistrySyncProperty): void {\n if (previous?.publisher_domain && previous.publisher_domain !== entry.publisher_domain) {\n this.removePropertyRidFromDomain(entry.property_rid, previous.publisher_domain);\n }\n this.propertiesByRid.set(entry.property_rid, this.cloneProperty(entry));\n if (entry.publisher_domain) {\n const key = this.normalizeDomainKey(entry.publisher_domain);\n const rids = this.propertyRidsByDomain.get(key) ?? new Set<string>();\n rids.add(entry.property_rid);\n this.propertyRidsByDomain.set(key, rids);\n }\n }\n\n private deletePropertyEntry(rid: string): void {\n const entry = this.propertiesByRid.get(rid);\n if (entry?.publisher_domain) this.removePropertyRidFromDomain(rid, entry.publisher_domain);\n this.propertiesByRid.delete(rid);\n }\n\n private removePropertyRidFromDomain(rid: string, domain: string): void {\n const key = this.normalizeDomainKey(domain);\n const rids = this.propertyRidsByDomain.get(key);\n if (!rids) return;\n rids.delete(rid);\n if (rids.size === 0) this.propertyRidsByDomain.delete(key);\n }\n\n private propertyRidFromPayload(payload: Record<string, unknown>): string | null {\n if (typeof payload.property_rid === 'string' && payload.property_rid.trim()) return payload.property_rid;\n if (typeof payload.rid === 'string' && payload.rid.trim()) return payload.rid;\n if (typeof payload.id === 'string' && payload.id.trim()) return payload.id;\n return null;\n }\n\n private propertyDomainFromPayload(payload: Record<string, unknown>): string | undefined {\n if (typeof payload.publisher_domain === 'string' && payload.publisher_domain.trim())\n return payload.publisher_domain;\n const property = this.asRecord(payload.property);\n return typeof property.publisher_domain === 'string' && property.publisher_domain.trim()\n ? property.publisher_domain\n : undefined;\n }\n\n private stringValue(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim() ? value : undefined;\n }\n\n private resolvePropertyRid(rid: string): string {\n let current = rid;\n const seen = new Set<string>();\n while (this.propertyAliasesByRid.has(current) && !seen.has(current)) {\n seen.add(current);\n current = this.propertyAliasesByRid.get(current)!;\n }\n return current;\n }\n\n private cloneProperty(property: RegistrySyncProperty): RegistrySyncProperty {\n return this.cloneJsonValue(property) as RegistrySyncProperty;\n }\n\n private applyBrandHierarchyEvent(entityId: string, payload: Record<string, unknown>): void {\n const resolvedChain = this.extractResolvedBrandChain(payload.chain);\n const domainChain =\n resolvedChain.length > 0\n ? resolvedChain.map(brand => this.domainFromBrand(brand)).filter((domain): domain is string => domain != null)\n : (this.extractDomainChain(payload.chain) ??\n this.extractDomainChain(payload.ancestor_domains) ??\n this.extractDomainChain(payload.domains));\n\n if (!domainChain || domainChain.length === 0) return;\n\n const keys = new Set<string>();\n keys.add(this.normalizeDomainKey(entityId));\n for (const field of ['domain', 'canonical_domain', 'canonical_id'] as const) {\n const value = payload[field];\n if (typeof value === 'string' && value.trim()) keys.add(this.normalizeDomainKey(value));\n }\n keys.add(this.normalizeDomainKey(domainChain[0]!));\n\n const entityKey = this.normalizeDomainKey(entityId);\n const entitiesToClear = new Set<string>([entityKey]);\n for (const key of keys) {\n const existingEntity = this.brandHierarchyEntityByKey.get(key);\n if (existingEntity) entitiesToClear.add(existingEntity);\n }\n for (const key of entitiesToClear) this.clearBrandHierarchyEntity(key);\n\n for (const key of keys) {\n this.brandAncestorsByDomain.set(key, [...domainChain]);\n if (resolvedChain.length > 0)\n this.brandHierarchyByDomain.set(\n key,\n resolvedChain.map(brand => ({ ...brand }))\n );\n else this.brandHierarchyByDomain.delete(key);\n this.brandHierarchyEntityByKey.set(key, entityKey);\n }\n this.brandHierarchyKeysByEntity.set(entityKey, keys);\n }\n\n private deleteBrandHierarchy(entityId: string, payload: Record<string, unknown>): void {\n const keys = new Set<string>([this.normalizeDomainKey(entityId)]);\n for (const field of ['domain', 'canonical_domain', 'canonical_id'] as const) {\n const value = payload[field];\n if (typeof value === 'string' && value.trim()) keys.add(this.normalizeDomainKey(value));\n }\n const entitiesToClear = new Set<string>();\n for (const key of keys) {\n const existingEntity = this.brandHierarchyEntityByKey.get(key);\n if (existingEntity) entitiesToClear.add(existingEntity);\n }\n if (entitiesToClear.size > 0) {\n for (const key of entitiesToClear) this.clearBrandHierarchyEntity(key);\n return;\n }\n for (const key of keys) {\n this.brandAncestorsByDomain.delete(key);\n this.brandHierarchyByDomain.delete(key);\n this.brandHierarchyEntityByKey.delete(key);\n }\n }\n\n private clearBrandHierarchyEntity(entityKey: string): void {\n const keys = this.brandHierarchyKeysByEntity.get(entityKey);\n if (!keys) return;\n for (const key of keys) {\n this.brandAncestorsByDomain.delete(key);\n this.brandHierarchyByDomain.delete(key);\n this.brandHierarchyEntityByKey.delete(key);\n }\n this.brandHierarchyKeysByEntity.delete(entityKey);\n }\n\n private asRecord(value: unknown): Record<string, unknown> {\n return value && typeof value === 'object' && !Array.isArray(value) ? (value as Record<string, unknown>) : {};\n }\n\n private emptyInventoryProfile(): AgentSearchResult['inventory_profile'] {\n return {\n channels: [],\n property_types: [],\n markets: [],\n categories: [],\n category_taxonomy: 'iab_content_3.0',\n tags: [],\n delivery_types: [],\n property_count: 0,\n publisher_count: 0,\n has_tmp: false,\n };\n }\n\n private isStringArray(value: unknown): value is string[] {\n return Array.isArray(value) && value.every(item => typeof item === 'string');\n }\n\n private isAgentInventoryProfile(value: unknown): value is AgentSearchResult['inventory_profile'] {\n const profile = this.asRecord(value);\n return (\n this.isStringArray(profile.channels) &&\n this.isStringArray(profile.property_types) &&\n this.isStringArray(profile.markets) &&\n this.isStringArray(profile.categories) &&\n (typeof profile.category_taxonomy === 'string' || profile.category_taxonomy === null) &&\n this.isStringArray(profile.tags) &&\n this.isStringArray(profile.delivery_types) &&\n (profile.format_ids === undefined || this.isStringArray(profile.format_ids)) &&\n typeof profile.property_count === 'number' &&\n typeof profile.publisher_count === 'number' &&\n typeof profile.has_tmp === 'boolean'\n );\n }\n\n private isAuthorizationPayload(value: unknown): value is AuthorizationEntry {\n const payload = this.asRecord(value);\n return (\n (payload.id === undefined || this.stringValue(payload.id) !== undefined) &&\n this.stringValue(payload.agent_url) !== undefined &&\n this.stringValue(payload.publisher_domain) !== undefined &&\n (payload.authorization_type === undefined || this.stringValue(payload.authorization_type) !== undefined) &&\n (payload.property_ids === undefined || this.isStringArray(payload.property_ids)) &&\n (payload.property_tags === undefined || this.isStringArray(payload.property_tags)) &&\n (payload.placement_ids === undefined || this.isStringArray(payload.placement_ids)) &&\n (payload.placement_tags === undefined || this.isStringArray(payload.placement_tags)) &&\n (payload.countries === undefined || this.isStringArray(payload.countries)) &&\n (payload.effective_from === undefined || typeof payload.effective_from === 'string') &&\n (payload.effective_until === undefined || typeof payload.effective_until === 'string') &&\n (payload.effective_to === undefined || typeof payload.effective_to === 'string')\n );\n }\n\n private isAgentCompliance(value: unknown): value is AgentCompliance {\n const summary = this.asRecord(value);\n const statuses = new Set(['passing', 'degraded', 'failing', 'unknown', 'opted_out']);\n const lifecycleStages = new Set(['development', 'testing', 'production', 'deprecated']);\n if (summary.status === 'opted_out') {\n return (\n (summary.lifecycle_stage === undefined ||\n (typeof summary.lifecycle_stage === 'string' && lifecycleStages.has(summary.lifecycle_stage))) &&\n (summary.tracks === undefined ||\n (summary.tracks != null && typeof summary.tracks === 'object' && !Array.isArray(summary.tracks))) &&\n (summary.streak_days === undefined || typeof summary.streak_days === 'number') &&\n (summary.last_checked_at === undefined ||\n typeof summary.last_checked_at === 'string' ||\n summary.last_checked_at === null) &&\n (summary.headline === undefined || typeof summary.headline === 'string' || summary.headline === null)\n );\n }\n return (\n typeof summary.status === 'string' &&\n statuses.has(summary.status) &&\n typeof summary.lifecycle_stage === 'string' &&\n lifecycleStages.has(summary.lifecycle_stage) &&\n summary.tracks != null &&\n typeof summary.tracks === 'object' &&\n !Array.isArray(summary.tracks) &&\n typeof summary.streak_days === 'number' &&\n (typeof summary.last_checked_at === 'string' || summary.last_checked_at === null) &&\n (typeof summary.headline === 'string' || summary.headline === null)\n );\n }\n\n private isResolvedBrand(value: unknown): value is ResolvedBrand {\n const brand = this.asRecord(value);\n return typeof brand.canonical_id === 'string' && typeof brand.canonical_domain === 'string';\n }\n\n private cloneJsonValue<T>(value: T): T {\n if (Array.isArray(value)) return value.map(item => this.cloneJsonValue(item)) as T;\n if (value && typeof value === 'object') {\n const copy: Record<string, unknown> = {};\n for (const [key, nested] of Object.entries(value)) {\n copy[key] = this.cloneJsonValue(nested);\n }\n return copy as T;\n }\n return value;\n }\n\n private extractResolvedBrandChain(value: unknown): ResolvedBrand[] {\n if (!Array.isArray(value)) return [];\n return value.filter(item => this.isResolvedBrand(item));\n }\n\n private extractDomainChain(value: unknown): string[] | null {\n if (!Array.isArray(value)) return null;\n const domains: string[] = [];\n for (const item of value) {\n if (typeof item === 'string' && item.trim()) {\n domains.push(item);\n continue;\n }\n if (item && typeof item === 'object' && !Array.isArray(item)) {\n const domain = this.domainFromBrand(item as Partial<ResolvedBrand>);\n if (domain) domains.push(domain);\n }\n }\n return domains.length > 0 ? domains : null;\n }\n\n private domainFromBrand(brand: Partial<ResolvedBrand>): string | null {\n return brand.canonical_domain ?? brand.canonical_id ?? null;\n }\n\n private normalizeDomainKey(domain: string): string {\n return domain.trim().toLowerCase();\n }\n\n private setState(next: RegistrySyncState): void {\n const from = this._state;\n if (from === next) return;\n this._state = next;\n this.emit('stateChange', { from, to: next });\n }\n}\n"],"mappings":"AAAA,SAAS,oBAAoB;AAW7B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP,SAAS,2BAA2B;AAyL7B,MAAM,qBAAqB,aAAiC;AAAA,EAChD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAET,SAA4B;AAAA,EAC5B,SAAwB;AAAA,EACxB,YAAkD;AAAA;AAAA,EAGlD,kBAAgD;AAAA,EAChD,mBAA2C;AAAA,EAC3C,kBAAwD;AAAA,EACxD,gBAAsC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOtC,aAAa;AAAA;AAAA,EAGb,SAAS,oBAAI,IAA+B;AAAA,EAC5C,eAAe,oBAAI,IAAkC;AAAA,EACrD,cAAc,oBAAI,IAAkC;AAAA,EACpD,oBAAoB,oBAAI,IAAqD;AAAA,EAC7E,kBAAkB,oBAAI,IAAkC;AAAA,EACxD,uBAAuB,oBAAI,IAAyB;AAAA,EACpD,uBAAuB,oBAAI,IAAoB;AAAA,EAC/C,yBAAyB,oBAAI,IAAsB;AAAA,EACnD,yBAAyB,oBAAI,IAA6B;AAAA,EAC1D,6BAA6B,oBAAI,IAAyB;AAAA,EAC1D,4BAA4B,oBAAI,IAAoB;AAAA,EAE5D,YAAY,QAA4B;AACtC,UAAM;AACN,SAAK,SAAS,OAAO;AACrB,SAAK,gBAAgB,OAAO,aAAa;AACzC,SAAK,iBAAiB,OAAO,kBAAkB;AAC/C,SAAK,QAAQ,OAAO;AACpB,SAAK,gBAAgB,OAAO,iBAAiB;AAG7C,QAAI,CAAC,OAAO,UAAU,KAAK,aAAa,KAAK,KAAK,gBAAgB,KAAK,KAAK,gBAAgB,KAAQ;AAClG,YAAM,IAAI,MAAM,sDAAsD;AAAA,IACxE;AACA,SAAK,4BAA4B,OAAO,6BAA6B;AACrE,QACE,CAAC,OAAO,UAAU,KAAK,yBAAyB,KAChD,KAAK,4BAA4B,KACjC,KAAK,4BAA4B,IACjC;AACA,YAAM,IAAI,MAAM,+DAA+D;AAAA,IACjF;AACA,SAAK,sBAAsB,OAAO,uBAAuB;AACzD,SAAK,uBAAuB,OAAO,wBAAwB;AAC3D,SAAK,uBAAuB,OAAO,wBAAwB;AAC3D,SAAK,oBAAoB,OAAO,qBAAqB;AACrD,SAAK,cAAc,OAAO,SAAS,WAAW;AAC9C,SAAK,sBAAsB,OAAO,SAAS,mBAAmB;AAC9D,SAAK,kBAAkB,OAAO,SAAS,eAAe;AACtD,SAAK,wBAAwB,OAAO,SAAS,qBAAqB;AAClE,SAAK,cAAc,OAAO,eAAe,IAAI,oBAAoB;AACjE,SAAK,sBAAsB,OAAO;AAClC,SAAK,eAAe,OAAO;AAAA,EAC7B;AAAA;AAAA;AAAA,EAKA,MAAM,QAAuB;AAC3B,QAAI,KAAK,WAAW,aAAa,KAAK,WAAW,gBAAiB;AAClE,UAAM,MAAM,EAAE,KAAK;AACnB,UAAM,KAAK,UAAU,GAAG;AAIxB,SAAK,UAAU,GAAG;AAAA,EACpB;AAAA;AAAA,EAGA,OAAa;AAGX,SAAK;AACL,QAAI,KAAK,WAAW;AAClB,mBAAa,KAAK,SAAS;AAC3B,WAAK,YAAY;AAAA,IACnB;AACA,SAAK,YAAY;AACjB,SAAK,kBAAkB;AACvB,QAAI,KAAK,WAAW,aAAa,KAAK,WAAW,iBAAiB;AAChE,WAAK,SAAS,MAAM;AAAA,IACtB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,QAAuB;AAC3B,SAAK,KAAK;AACV,SAAK,aAAa;AAClB,SAAK,SAAS;AACd,SAAK,gBAAgB;AACrB,UAAM,KAAK,YAAY,YAAY;AACnC,SAAK,SAAS,MAAM;AAAA,EACtB;AAAA;AAAA,EAGQ,UAAU,KAAmB;AACnC,QAAI,QAAQ,KAAK,cAAc,KAAK,WAAW,UAAW;AAC1D,QAAI,KAAK,kBAAkB,QAAQ;AACjC,WAAK,aAAa,MAAM;AACxB,WAAK,aAAa,GAAG;AACrB;AAAA,IACF;AACA,SAAK,aAAa,QAAQ;AAC1B,SAAK,KAAK,UAAU,GAAG;AAAA,EACzB;AAAA;AAAA;AAAA,EAKA,SAAS,KAA4C;AACnD,WAAO,KAAK,OAAO,IAAI,GAAG;AAAA,EAC5B;AAAA;AAAA,EAGA,YAAiC;AAC/B,WAAO,CAAC,GAAG,KAAK,OAAO,OAAO,CAAC;AAAA,EACjC;AAAA;AAAA,EAGA,WAAW,QAA0C;AACnD,WAAO,KAAK,UAAU,EAAE,OAAO,WAAS;AACtC,YAAM,IAAI,MAAM;AAChB,UAAI,OAAO,QAAQ,MAAM,SAAS,OAAO,KAAM,QAAO;AACtD,UAAI,OAAO,UAAU,UAAU,CAAC,OAAO,SAAS,KAAK,OAAK,EAAE,SAAS,SAAS,CAAC,CAAC,EAAG,QAAO;AAC1F,UAAI,OAAO,SAAS,UAAU,CAAC,OAAO,QAAQ,KAAK,OAAK,EAAE,QAAQ,SAAS,CAAC,CAAC,EAAG,QAAO;AACvF,UAAI,OAAO,YAAY,UAAU,CAAC,OAAO,WAAW,KAAK,OAAK,EAAE,WAAW,SAAS,CAAC,CAAC,EAAG,QAAO;AAChG,UAAI,OAAO,gBAAgB,UAAU,CAAC,OAAO,eAAe,KAAK,OAAK,EAAE,eAAe,SAAS,CAAC,CAAC,EAAG,QAAO;AAC5G,UAAI,OAAO,MAAM,UAAU,CAAC,OAAO,KAAK,KAAK,OAAK,EAAE,KAAK,SAAS,CAAC,CAAC,EAAG,QAAO;AAC9E,UAAI,OAAO,gBAAgB,UAAU,CAAC,OAAO,eAAe,KAAK,OAAK,EAAE,eAAe,SAAS,CAAC,CAAC,EAAG,QAAO;AAC5G,UAAI,OAAO,WAAW,QAAQ,EAAE,YAAY,OAAO,QAAS,QAAO;AACnE,UAAI,OAAO,kBAAkB,QAAQ,EAAE,iBAAiB,OAAO,eAAgB,QAAO;AACtF,UAAI,OAAO,mBAAmB,QAAQ;AACpC,cAAM,SAAU,MAAM,oBAAoB,UAAU;AACpD,YAAI,CAAC,OAAO,kBAAkB,SAAS,MAAM,EAAG,QAAO;AAAA,MACzD;AACA,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AAAA;AAAA;AAAA,EAKA,2BAA2B,QAAsC;AAC/D,WAAO,KAAK,aAAa,IAAI,KAAK,cAAc,MAAM,CAAC,KAAK,CAAC;AAAA,EAC/D;AAAA;AAAA,EAGA,0BAA0B,UAAwC;AAChE,UAAM,UAAgC,CAAC;AACvC,eAAW,OAAO,KAAK,oBAAoB,QAAQ,GAAG;AACpD,iBAAW,SAAS,KAAK,YAAY,IAAI,GAAG,KAAK,CAAC,GAAG;AACnD,YAAI,CAAC,QAAQ,SAAS,KAAK,EAAG,SAAQ,KAAK,KAAK;AAAA,MAClD;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,aAAa,UAAkB,QAAyB;AACtD,UAAM,UAAU,KAAK,aAAa,IAAI,KAAK,cAAc,MAAM,CAAC;AAChE,WAAO,WAAW,QAAQ,QAAQ,KAAK,WAAS,KAAK,0BAA0B,OAAO,QAAQ,CAAC;AAAA,EACjG;AAAA;AAAA;AAAA,EAKA,YAAY,KAA+C;AACzD,UAAM,WAAW,KAAK,gBAAgB,IAAI,KAAK,mBAAmB,GAAG,CAAC;AACtE,WAAO,WAAW,KAAK,cAAc,QAAQ,IAAI;AAAA,EACnD;AAAA;AAAA,EAGA,uBAAuB,QAAwC;AAC7D,UAAM,OAAO,KAAK,qBAAqB,IAAI,KAAK,mBAAmB,MAAM,CAAC;AAC1E,QAAI,CAAC,KAAM,QAAO,CAAC;AACnB,UAAM,aAAqC,CAAC;AAC5C,eAAW,OAAO,MAAM;AACtB,YAAM,WAAW,KAAK,gBAAgB,IAAI,KAAK,mBAAmB,GAAG,CAAC;AACtE,UAAI,SAAU,YAAW,KAAK,KAAK,cAAc,QAAQ,CAAC;AAAA,IAC5D;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,aAAa,QAA0B;AACrC,WAAO,CAAC,GAAI,KAAK,uBAAuB,IAAI,KAAK,mBAAmB,MAAM,CAAC,KAAK,CAAC,CAAE;AAAA,EACrF;AAAA;AAAA,EAGA,kBAAkB,QAAiC;AACjD,YAAQ,KAAK,uBAAuB,IAAI,KAAK,mBAAmB,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,YAAU,EAAE,GAAG,MAAM,EAAE;AAAA,EAC7G;AAAA;AAAA,EAIA,IAAI,QAA2B;AAC7B,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,YAA2B;AACzB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,WAAqG;AACnG,QAAI,YAAY;AAChB,eAAW,WAAW,KAAK,aAAa,OAAO,EAAG,cAAa,QAAQ;AACvE,WAAO;AAAA,MACL,QAAQ,KAAK,OAAO;AAAA,MACpB,gBAAgB;AAAA,MAChB,YAAY,KAAK,gBAAgB;AAAA,MACjC,kBAAkB,KAAK,2BAA2B;AAAA,IACpD;AAAA,EACF;AAAA;AAAA,EAGA,eAA6C;AAC3C,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,eAAqC;AACnC,WAAO,KAAK;AAAA,EACd;AAAA;AAAA,EAGA,gBAA+B;AAC7B,WAAO,KAAK,eAAe,eAAe;AAAA,EAC5C;AAAA;AAAA,EAIA,MAAc,UAAU,KAA4B;AAClD,SAAK,SAAS,eAAe;AAC7B,QAAI;AAEF,YAAM,eAAe,MAAM,KAAK,YAAY,UAAU;AACtD,UAAI,cAAc;AAChB,aAAK,SAAS;AAAA,MAChB;AAGA,UAAI,KAAK,aAAa;AACpB,YAAI;AACJ,WAAG;AACD,gBAAM,QAAiC,EAAE,OAAO,IAAI;AACpD,cAAI,OAAQ,OAAM,SAAS;AAC3B,gBAAM,MAA2B,MAAM,KAAK,OAAO,aAAa,KAAY;AAC5E,qBAAW,SAAS,IAAI,SAAS;AAC/B,iBAAK,OAAO,IAAI,MAAM,KAAK,KAAK;AAAA,UAClC;AACA,mBAAS,IAAI,YAAY,IAAI,SAAS,IAAI,SAAS;AAAA,QACrD,SAAS;AAAA,MACX;AAGA,YAAM,KAAK,UAAU,GAAG;AAGxB,UAAI,QAAQ,KAAK,WAAY;AAE7B,WAAK,SAAS,SAAS;AACvB,WAAK,KAAK,aAAa;AAAA,QACrB,YAAY,KAAK,OAAO;AAAA,QACxB,oBAAoB,KAAK,SAAS,EAAE;AAAA,MACtC,CAAC;AAAA,IACH,SAAS,KAAK;AACZ,YAAM,QAAQ,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC;AAGhE,UAAI,QAAQ,KAAK,WAAY;AAC7B,WAAK,SAAS,OAAO;AACrB,WAAK,eAAe,KAAK;AACzB,WAAK,KAAK,SAAS,EAAE,MAAM,CAAC;AAC5B,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA,EAGA,MAAc,YAAY,KAA4B;AACpD,SAAK,aAAa;AAClB,SAAK,SAAS;AACd,UAAM,KAAK,YAAY,YAAY;AACnC,UAAM,KAAK,UAAU,GAAG;AAAA,EAC1B;AAAA;AAAA,EAIQ,aAAa,KAAmB;AACtC,SAAK,YAAY,WAAW,MAAM,KAAK,SAAS,GAAG,GAAG,KAAK,cAAc;AAAA,EAC3E;AAAA,EAEA,MAAc,SAAS,KAA4B;AACjD,QAAI,QAAQ,KAAK,WAAY;AAC7B,QAAI;AACF,YAAM,KAAK,KAAK,GAAG;AAAA,IACrB,SAAS,KAAK;AACZ,YAAM,QAAQ,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC;AAChE,WAAK,KAAK,SAAS,EAAE,MAAM,CAAC;AAC5B,WAAK,eAAe,KAAK;AAAA,IAC3B;AAEA,QAAI,QAAQ,KAAK,cAAc,KAAK,WAAW,WAAW;AACxD,WAAK,aAAa,GAAG;AAAA,IACvB;AAAA,EACF;AAAA,EAEA,MAAc,KAAK,KAA4B;AAC7C,QAAI,qBAAqB;AACzB,QAAI,UAAU;AAEd,WAAO,SAAS;AACd,YAAM,OAAqB,MAAM,KAAK,OAAO,QAAQ,KAAK,UAAU,CAAC;AAErE,UAAI,KAAK,gBAAgB;AAEvB,YAAI;AACF,gBAAM,KAAK,YAAY,GAAG;AAAA,QAC5B,QAAQ;AAIN,cAAI,QAAQ,KAAK,cAAc,KAAK,WAAW,QAAS,MAAK,SAAS,SAAS;AAAA,QACjF;AACA;AAAA,MACF;AAEA,iBAAW,SAAS,KAAK,QAAQ;AAC/B,aAAK,WAAW,KAAK;AACrB,aAAK,KAAK,SAAS,EAAE,MAAM,CAAC;AAC5B;AAAA,MACF;AAEA,WAAK,iBAAiB,KAAK,SAAS;AAEpC,UAAI,KAAK,QAAQ;AACf,aAAK,SAAS,KAAK;AAAA,MACrB;AAEA,gBAAU,KAAK,YAAY,KAAK,UAAU;AAAA,IAC5C;AAEA,UAAM,KAAK,cAAc;AAEzB,QAAI,qBAAqB,GAAG;AAC1B,WAAK,KAAK,QAAQ,EAAE,QAAQ,KAAK,QAAS,eAAe,mBAAmB,CAAC;AAAA,IAC/E;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,UAAU,KAA4B;AAClD,QAAI,UAAU;AACd,QAAI,sBAAsB;AAC1B,WAAO,SAAS;AACd,YAAM,OAAqB,MAAM,KAAK,OAAO,QAAQ,KAAK,UAAU,CAAC;AACrE,UAAI,KAAK,gBAAgB;AAIvB,aAAK,SAAS;AACd,cAAM,KAAK,YAAY,YAAY;AACnC,YAAI,oBAAqB;AACzB,8BAAsB;AACtB;AAAA,MACF;AACA,iBAAW,SAAS,KAAK,QAAQ;AAC/B,aAAK,WAAW,KAAK;AAAA,MACvB;AACA,WAAK,iBAAiB,KAAK,SAAS;AACpC,UAAI,KAAK,OAAQ,MAAK,SAAS,KAAK;AACpC,gBAAU,KAAK,YAAY,KAAK,UAAU;AAAA,IAC5C;AAGA,QAAI,QAAQ,KAAK,WAAY,OAAM,KAAK,cAAc;AAAA,EACxD;AAAA;AAAA,EAIA,MAAc,UAAU,KAA4B;AAOlD,QAAI,sBAAsB;AAC1B,QAAI,0BAA0B;AAE9B,WAAO,QAAQ,KAAK,cAAc,KAAK,kBAAkB,QAAQ;AAC/D,YAAM,aAAa,IAAI,gBAAgB;AACvC,WAAK,mBAAmB;AACxB,UAAI,cAAc;AAClB,UAAI,cAAc;AAClB,UAAI;AAEJ,UAAI;AACF,sBAAc,MAAM,KAAK,iBAAiB,KAAK,WAAW,QAAQ,YAAU;AAC1E,wBAAc;AACd,cAAI,OAAQ,eAAc;AAAA,QAC5B,CAAC;AAAA,MACH,SAAS,KAAK;AAEZ,YAAI,WAAW,OAAO,WAAW,QAAQ,KAAK,YAAY;AACxD;AAAA,QACF;AACA,cAAM,QAAQ,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC;AAChE,sBAAc,KAAK,oBAAoB,KAAK;AAC5C,YAAI,gBAAgB,eAAe,gBAAgB,SAAS;AAC1D,eAAK,KAAK,SAAS,EAAE,MAAM,CAAC;AAC5B,eAAK,eAAe,KAAK;AAAA,QAC3B;AAAA,MACF,UAAE;AACA,aAAK,qBAAqB;AAAA,MAC5B;AAEA,UAAI,QAAQ,KAAK,WAAY;AAE7B,UAAI,aAAa;AACf,8BAAsB;AACtB,kCAA0B;AAAA,MAC5B;AAEA,UAAI,gBAAgB,UAAW;AAE/B,UAAI,gBAAgB,SAAS;AAE3B,aAAK,SAAS,OAAO;AACrB,aAAK,kBAAkB;AACvB;AAAA,MACF;AAEA,UAAI,gBAAgB,eAAe;AACjC,YAAI,KAAK;AACT,YAAI;AACF,gBAAM,KAAK,YAAY,GAAG;AAC1B,eAAK;AAAA,QACP,QAAQ;AAAA,QAER;AACA,YAAI,QAAQ,KAAK,WAAY;AAC7B,YAAI,CAAC,IAAI;AACP;AACA,cAAI,KAAK,eAAe,mBAAmB,GAAG;AAC5C,iBAAK,kBAAkB,GAAG;AAC1B;AAAA,UACF;AAGA,eAAK,SAAS,SAAS;AACvB,gBAAM,KAAK,MAAM,KAAK,mBAAmB,mBAAmB,GAAG,WAAW,MAAM;AAChF,cAAI,QAAQ,KAAK,WAAY;AAC7B;AAAA,QACF;AAGA;AACA,cAAM,KAAK,MAAM,KAAK,mBAAmB,uBAAuB,GAAG,WAAW,MAAM;AACpF,YAAI,QAAQ,KAAK,WAAY;AAC7B;AAAA,MACF;AAEA,UAAI,gBAAgB,YAAY;AAC9B,aAAK,kBAAkB,GAAG;AAC1B;AAAA,MACF;AAEA,UAAI,gBAAgB,YAAY,aAAa;AAG3C,8BAAsB;AACtB,cAAM,KAAK,MAAM,KAAK,mBAAmB,CAAC,GAAG,WAAW,MAAM;AAC9D,YAAI,QAAQ,KAAK,WAAY;AAC7B;AAAA,MACF;AAKA;AACA,UAAI,KAAK,eAAe,mBAAmB,GAAG;AAC5C,aAAK,kBAAkB,GAAG;AAC1B;AAAA,MACF;AACA,YAAM,KAAK,MAAM,KAAK,mBAAmB,mBAAmB,GAAG,WAAW,MAAM;AAChF,UAAI,QAAQ,KAAK,WAAY;AAAA,IAC/B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAc,iBACZ,KACA,QACA,WAC4B;AAC5B,SAAK,mBAAmB;AACxB,UAAM,QAAyB;AAAA,MAC7B,QAAQ,KAAK,UAAU;AAAA,MACvB,OAAO,KAAK;AAAA,MACZ,OAAO,KAAK;AAAA,MACZ,qBAAqB,KAAK;AAAA,IAC5B;AAEA,qBAAiB,OAAO,KAAK,OAAO,WAAW,OAAO,EAAE,OAAO,CAAC,GAAG;AACjE,UAAI,QAAQ,KAAK,WAAY,QAAO;AACpC,WAAK,mBAAmB;AAExB,UAAI,IAAI,SAAS,QAAQ;AACvB,kBAAU,IAAI;AACd,cAAM,KAAK,gBAAgB,IAAI,IAAI;AAAA,MACrC,WAAW,IAAI,SAAS,aAAa;AACnC,kBAAU,KAAK;AAGf,aAAK,iBAAiB,IAAI,UAAU,SAAS;AAAA,MAC/C,OAAO;AAEL,YAAI,IAAI,MAAM,UAAU,kBAAkB;AACxC,iBAAO;AAAA,QACT;AAEA,cAAM,OAAO,mBAAmB,IAAI,MAAM,KAAK;AAC/C,cAAM,SAAS,IAAI,MAAM,UAAU,KAAK,mBAAmB,IAAI,MAAM,OAAO,CAAC,MAAM;AACnF,cAAM,QAAQ,IAAI,MAAM,+BAA+B,IAAI,GAAG,MAAM,EAAE;AACtE,aAAK,KAAK,SAAS,EAAE,MAAM,CAAC;AAC5B,aAAK,eAAe,KAAK;AACzB,eAAO;AAAA,MACT;AAAA,IACF;AAGA,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,MAAc,gBAAgB,MAAmC;AAC/D,QAAI,UAAU;AACd,eAAW,SAAS,KAAK,QAAQ;AAC/B,WAAK,WAAW,KAAK;AACrB,WAAK,KAAK,SAAS,EAAE,MAAM,CAAC;AAC5B;AAAA,IACF;AACA,SAAK,iBAAiB,KAAK,SAAS;AAIpC,QAAI,KAAK,QAAQ;AACf,WAAK,SAAS,KAAK;AACnB,UAAI;AACF,cAAM,KAAK,cAAc;AAAA,MAC3B,SAAS,KAAK;AAEZ,cAAM,QAAQ,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC;AAChE,aAAK,KAAK,SAAS,EAAE,MAAM,CAAC;AAC5B,aAAK,eAAe,KAAK;AAAA,MAC3B;AAAA,IACF;AAEA,QAAI,UAAU,GAAG;AACf,WAAK,KAAK,QAAQ,EAAE,QAAQ,KAAK,QAAS,eAAe,QAAQ,CAAC;AAAA,IACpE;AAAA,EACF;AAAA,EAEQ,oBAAoB,OAAiC;AAC3D,QAAI,iBAAiB,6BAA8B,QAAO;AAC1D,QAAI,iBAAiB,4BAA4B;AAE/C,aAAO,KAAK,kBAAkB,SAAS,aAAa;AAAA,IACtD;AACA,QAAI,iBAAiB,wBAAwB,MAAM,WAAW,OAAO,MAAM,WAAW,MAAM;AAG1F,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,eAAe,qBAAsC;AAC3D,WAAO,KAAK,kBAAkB,UAAU,uBAAuB,KAAK;AAAA,EACtE;AAAA,EAEQ,kBAAkB,KAAmB;AAC3C,QAAI,QAAQ,KAAK,cAAc,KAAK,WAAW,UAAW;AAC1D,SAAK,YAAY;AACjB,SAAK,aAAa,MAAM;AACxB,SAAK,aAAa,GAAG;AAAA,EACvB;AAAA,EAEQ,qBAA2B;AACjC,SAAK,qBAAqB;AAC1B,UAAM,aAAa,KAAK;AACxB,QAAI,CAAC,WAAY;AACjB,SAAK,kBAAkB,WAAW,MAAM;AACtC,iBAAW,MAAM,IAAI,MAAM,mCAAmC,CAAC;AAAA,IACjE,GAAG,KAAK,mBAAmB;AAC3B,SAAK,gBAAgB,QAAQ;AAAA,EAC/B;AAAA,EAEQ,uBAA6B;AACnC,QAAI,KAAK,iBAAiB;AACxB,mBAAa,KAAK,eAAe;AACjC,WAAK,kBAAkB;AAAA,IACzB;AAAA,EACF;AAAA,EAEQ,cAAoB;AAC1B,SAAK,qBAAqB;AAC1B,QAAI,KAAK,kBAAkB;AACzB,WAAK,iBAAiB,MAAM;AAC5B,WAAK,mBAAmB;AAAA,IAC1B;AAAA,EACF;AAAA,EAEQ,mBAAmB,SAAyB;AAClD,UAAM,MAAM,KAAK,uBAAuB,KAAK,KAAK,IAAI,GAAG,UAAU,CAAC;AACpE,WAAO,KAAK,IAAI,KAAK,sBAAsB,KAAK,IAAI,KAAK,sBAAsB,GAAG,CAAC;AAAA,EACrF;AAAA,EAEQ,MAAM,IAAY,QAAoC;AAC5D,QAAI,OAAO,QAAS,QAAO,QAAQ,QAAQ;AAC3C,WAAO,IAAI,QAAQ,aAAW;AAC5B,YAAM,UAAU,MAAM;AACpB,qBAAa,KAAK;AAClB,gBAAQ;AAAA,MACV;AACA,YAAM,QAAQ,WAAW,MAAM;AAC7B,eAAO,oBAAoB,SAAS,OAAO;AAC3C,gBAAQ;AAAA,MACV,GAAG,EAAE;AACL,YAAM,QAAQ;AACd,aAAO,iBAAiB,SAAS,SAAS,EAAE,MAAM,KAAK,CAAC;AAAA,IAC1D,CAAC;AAAA,EACH;AAAA;AAAA,EAIQ,YAAgE;AACtE,UAAM,QAA4D,EAAE,OAAO,KAAK,cAAc;AAC9F,QAAI,KAAK,OAAQ,OAAM,SAAS,KAAK;AACrC,QAAI,KAAK,MAAO,OAAM,QAAQ,KAAK;AACnC,WAAO;AAAA,EACT;AAAA,EAEQ,iBAAiB,WAA4C;AACnE,QAAI,CAAC,UAAW;AAChB,SAAK,gBAAgB;AACrB,SAAK,KAAK,aAAa,EAAE,UAAU,CAAC;AAAA,EACtC;AAAA,EAEA,MAAc,gBAA+B;AAC3C,QAAI,KAAK,QAAQ;AACf,YAAM,KAAK,YAAY,UAAU,KAAK,MAAM;AAAA,IAC9C;AAAA,EACF;AAAA,EAEQ,aAAa,WAAwC;AAC3D,QAAI,KAAK,oBAAoB,UAAW;AACxC,SAAK,kBAAkB;AACvB,SAAK,KAAK,aAAa,EAAE,UAAU,CAAC;AAAA,EACtC;AAAA;AAAA,EAIQ,WAAW,OAA2B;AAC5C,UAAM,UAAU,KAAK,SAAS,MAAM,OAAO;AAE3C,YAAQ,MAAM,YAAY;AAAA,MACxB,KAAK;AAAA,MACL,KAAK,yBAAyB;AAC5B,YAAI,CAAC,KAAK,YAAa;AACvB,cAAM,WAAW,KAAK,OAAO,IAAI,MAAM,SAAS;AAChD,cAAM,mBAAmB,KAAK,wBAAwB,QAAQ,iBAAiB,IAC3E,QAAQ,oBACR;AACJ,YAAI,YAAY,kBAAkB;AAChC,eAAK,OAAO,IAAI,MAAM,WAAW;AAAA,YAC/B,GAAG;AAAA,YACH,mBAAmB;AAAA,UACrB,CAAC;AAAA,QACH,WAAW,CAAC,UAAU;AAEpB,eAAK,OAAO,IAAI,MAAM,WAAW;AAAA,YAC/B,KAAK,MAAM;AAAA,YACX,MAAM,OAAO,QAAQ,SAAS,WAAW,QAAQ,OAAO,MAAM;AAAA,YAC9D,MAAM,OAAO,QAAQ,SAAS,WAAW,QAAQ,OAAO;AAAA,YACxD,mBAAmB,oBAAoB,KAAK,sBAAsB;AAAA,YAClE,OAAO,EAAE,OAAO,GAAG,iBAAiB,CAAC,EAAE;AAAA,UACzC,CAAC;AAAA,QACH;AACA;AAAA,MACF;AAAA,MAEA,KAAK,iBAAiB;AACpB,YAAI,KAAK,YAAa,MAAK,OAAO,OAAO,MAAM,SAAS;AACxD,YAAI,KAAK,oBAAqB,MAAK,6BAA6B,MAAM,SAAS;AAC/E;AAAA,MACF;AAAA,MAEA,KAAK,yBAAyB;AAC5B,YAAI,CAAC,KAAK,oBAAqB;AAC/B,YAAI,CAAC,KAAK,uBAAuB,OAAO,EAAG;AAC3C,YAAI,OAAO,QAAQ,uBAAuB,SAAU;AACpD,aAAK,yBAAyB,KAAK,4BAA4B,OAAO,CAAC;AACvE;AAAA,MACF;AAAA,MAEA,KAAK,0BAA0B;AAC7B,YAAI,CAAC,KAAK,oBAAqB;AAC/B,YAAI,CAAC,KAAK,uBAAuB,OAAO,EAAG;AAC3C,cAAM,QAAQ,KAAK,4BAA4B,OAAO;AACtD,YAAI,CAAC,MAAM,MAAM,CAAC,MAAM,mBAAoB;AAC5C,aAAK,yBAAyB,OAAO,EAAE,+BAA+B,KAAK,CAAC;AAC5E;AAAA,MACF;AAAA,MAEA,KAAK,yBAAyB;AAC5B,YAAI,CAAC,KAAK,oBAAqB;AAC/B,YAAI,CAAC,KAAK,uBAAuB,OAAO,EAAG;AAC3C,cAAM,QAAQ,KAAK,4BAA4B,OAAO;AACtD,aAAK,2BAA2B,OAAO;AAAA,UACrC,cAAc,QAAQ,MAAM,MAAM,CAAC,MAAM,kBAAkB;AAAA,UAC3D,+BAA+B;AAAA,QACjC,CAAC;AACD;AAAA,MACF;AAAA,MAEA,KAAK,4BAA4B;AAC/B,YAAI,KAAK,aAAa;AACpB,gBAAM,WAAW,KAAK,OAAO,IAAI,MAAM,SAAS;AAChD,gBAAM,UAAU,QAAQ;AACxB,cAAI,YAAY,KAAK,kBAAkB,OAAO,GAAG;AAC/C,iBAAK,OAAO,IAAI,MAAM,WAAW;AAAA,cAC/B,GAAG;AAAA,cACH,oBAAoB;AAAA,YACtB,CAAC;AAAA,UACH;AAAA,QACF;AACA,aAAK,KAAK,sBAAsB;AAAA,UAC9B,UAAU,MAAM;AAAA,UAChB,gBAAiB,OAAO,QAAQ,oBAAoB,WAChD,QAAQ,kBACR;AAAA,UACJ,eAAgB,OAAO,QAAQ,mBAAmB,WAC9C,QAAQ,iBACR;AAAA,QACN,CAAC;AACD;AAAA,MACF;AAAA,MAEA,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK,kBAAkB;AACrB,YAAI,KAAK,gBAAiB,MAAK,oBAAoB,OAAO;AAC1D;AAAA,MACF;AAAA,MAEA,KAAK,mBAAmB;AACtB,YAAI,KAAK,gBAAiB,MAAK,oBAAoB,OAAO;AAC1D;AAAA,MACF;AAAA,MAEA,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK,kBAAkB;AACrB,YAAI,KAAK,sBAAuB,MAAK,yBAAyB,MAAM,WAAW,OAAO;AACtF;AAAA,MACF;AAAA,MAEA,KAAK;AAAA,MACL,KAAK,iBAAiB;AACpB,YAAI,KAAK,sBAAuB,MAAK,qBAAqB,MAAM,WAAW,OAAO;AAClF;AAAA,MACF;AAAA,MAEA,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK,sBAAsB;AACzB,aAAK,YAAY,OAAO,kFAAkF;AAC1G;AAAA,MACF;AAAA,MAEA,KAAK;AAAA,MACL,KAAK,iCAAiC;AACpC,aAAK,YAAY,OAAO,oDAAoD;AAC5E;AAAA,MACF;AAAA,MAEA;AACE,aAAK,YAAY,OAAO,iDAAiD;AACzE;AAAA,IACJ;AAAA,EACF;AAAA;AAAA,EAIQ,eAAqB;AAC3B,SAAK,OAAO,MAAM;AAClB,SAAK,aAAa,MAAM;AACxB,SAAK,YAAY,MAAM;AACvB,SAAK,kBAAkB,MAAM;AAC7B,SAAK,gBAAgB,MAAM;AAC3B,SAAK,qBAAqB,MAAM;AAChC,SAAK,qBAAqB,MAAM;AAChC,SAAK,uBAAuB,MAAM;AAClC,SAAK,uBAAuB,MAAM;AAClC,SAAK,2BAA2B,MAAM;AACtC,SAAK,0BAA0B,MAAM;AAAA,EACvC;AAAA,EAEQ,YAAY,OAAqB,QAAsB;AAC7D,SAAK,sBAAsB,OAAO,MAAM;AACxC,SAAK,KAAK,gBAAgB,EAAE,OAAO,OAAO,CAAC;AAAA,EAC7C;AAAA,EAEQ,yBACN,OACA,SACM;AACN,UAAM,kBAAkB,KAAK,4BAA4B,KAAK;AAC9D,SAAK,2BAA2B,iBAAiB;AAAA,MAC/C,cAAc,QAAQ,gBAAgB,EAAE;AAAA,MACxC,+BAA+B,SAAS;AAAA,IAC1C,CAAC;AAED,UAAM,YAAY,KAAK,cAAc,gBAAgB,gBAAgB;AACrE,UAAM,gBAAgB,KAAK,aAAa,IAAI,SAAS,KAAK,CAAC;AAC3D,kBAAc,KAAK,eAAe;AAClC,SAAK,aAAa,IAAI,WAAW,aAAa;AAE9C,UAAM,WAAW,KAAK,aAAa,eAAe;AAClD,eAAW,OAAO,KAAK,cAAc,eAAe,GAAG;AACrD,YAAM,eAAe,KAAK,YAAY,IAAI,GAAG,KAAK,CAAC;AACnD,mBAAa,KAAK,eAAe;AACjC,WAAK,YAAY,IAAI,KAAK,YAAY;AAAA,IACxC;AAEA,QAAI,gBAAgB,IAAI;AACtB,WAAK,kBAAkB,IAAI,gBAAgB,IAAI;AAAA,QAC7C;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEQ,4BAA4B,OAA+C;AACjF,QAAI,MAAM,mBAAmB,CAAC,MAAM,aAAc,QAAO;AACzD,WAAO,EAAE,GAAG,OAAO,iBAAiB,MAAM,aAAa;AAAA,EACzD;AAAA,EAEQ,4BAA4B,OAA+C;AACjF,WAAO,KAAK,4BAA4B,KAAK;AAAA,EAC/C;AAAA,EAEQ,6BAA6B,UAAwB;AAC3D,UAAM,YAAY,KAAK,oBAAoB,QAAQ;AACnD,eAAW,CAAC,KAAK,OAAO,KAAK,KAAK,aAAa;AAC7C,UAAI,QAAQ,KAAK,WAAS,KAAK,0BAA0B,OAAO,QAAQ,CAAC,EAAG,WAAU,IAAI,GAAG;AAAA,IAC/F;AAEA,eAAW,YAAY,WAAW;AAChC,YAAM,UAAU,CAAC,GAAI,KAAK,YAAY,IAAI,QAAQ,KAAK,CAAC,CAAE;AAC1D,iBAAW,SAAS,SAAS;AAC3B,aAAK,2BAA2B,OAAO;AAAA,UACrC,cAAc,QAAQ,MAAM,EAAE;AAAA,UAC9B,+BAA+B;AAAA,QACjC,CAAC;AAAA,MACH;AACA,WAAK,YAAY,OAAO,QAAQ;AAAA,IAClC;AAAA,EACF;AAAA,EAEQ,2BAA2B,QAA4B,SAA4C;AACzG,UAAM,mBAAmB,KAAK,4BAA4B,MAAM;AAChE,UAAM,aAAa,oBAAI,IAAY,CAAC,KAAK,cAAc,iBAAiB,gBAAgB,CAAC,CAAC;AAC1F,UAAM,YAAY,KAAK,cAAc,gBAAgB;AACrD,QAAI,mBAAmB;AAEvB,QAAI,iBAAiB,MAAM,SAAS,cAAc;AAChD,YAAM,mBAAmB,KAAK,kBAAkB,IAAI,iBAAiB,EAAE;AACvE,UAAI,CAAC,oBAAoB,QAAQ,+BAA+B;AAC9D,2BAAmB,EAAE,GAAG,SAAS,cAAc,MAAM;AAAA,MACvD;AACA,UAAI,kBAAkB;AACpB,mBAAW,IAAI,iBAAiB,SAAS;AACzC,kBAAU,IAAI,iBAAiB,QAAQ;AAAA,MACzC;AAAA,IACF;AAEA,eAAW,UAAU,YAAY;AAC/B,YAAM,UAAU,KAAK,aAAa,IAAI,MAAM;AAC5C,UAAI,CAAC,QAAS;AACd,iBAAW,SAAS,SAAS;AAC3B,YAAI,KAAK,qBAAqB,OAAO,kBAAkB,gBAAgB,GAAG;AACxE,qBAAW,OAAO,KAAK,cAAc,KAAK,EAAG,WAAU,IAAI,GAAG;AAAA,QAChE;AAAA,MACF;AAAA,IACF;AAEA,eAAW,UAAU,YAAY;AAC/B,WAAK,qCAAqC,KAAK,cAAc,QAAQ,kBAAkB,gBAAgB;AAAA,IACzG;AAEA,eAAW,YAAY,WAAW;AAChC,WAAK,qCAAqC,KAAK,aAAa,UAAU,kBAAkB,gBAAgB;AAAA,IAC1G;AAAA,EACF;AAAA,EAEQ,qCACN,QACA,KACA,QACA,SACM;AACN,UAAM,UAAU,OAAO,IAAI,GAAG;AAC9B,QAAI,CAAC,QAAS;AAEd,UAAM,WAAiC,CAAC;AACxC,eAAW,SAAS,SAAS;AAC3B,UAAI,KAAK,qBAAqB,OAAO,QAAQ,OAAO,GAAG;AACrD,YAAI,MAAM,GAAI,MAAK,kBAAkB,OAAO,MAAM,EAAE;AAAA,MACtD,OAAO;AACL,iBAAS,KAAK,KAAK;AAAA,MACrB;AAAA,IACF;AACA,QAAI,SAAS,SAAS,EAAG,QAAO,IAAI,KAAK,QAAQ;AAAA,QAC5C,QAAO,OAAO,GAAG;AAAA,EACxB;AAAA,EAEQ,qBACN,OACA,QACA,SACS;AACT,QAAI,OAAO,MAAM,SAAS,aAAc,QAAO,MAAM,OAAO,OAAO;AACnE,QAAI,CAAC,KAAK,+BAA+B,OAAO,MAAM,EAAG,QAAO;AAChE,QAAI,KAAK,cAAc,MAAM,gBAAgB,MAAM,KAAK,cAAc,OAAO,gBAAgB,EAAG,QAAO;AACvG,QAAI,OAAO,mBAAoB,QAAO,MAAM,uBAAuB,OAAO;AAC1E,WAAO;AAAA,EACT;AAAA,EAEQ,0BAA0B,OAA2B,UAA2B;AACtF,WAAO,KAAK,qBAAqB,KAAK,cAAc,KAAK,GAAG,KAAK,oBAAoB,QAAQ,CAAC;AAAA,EAChG;AAAA,EAEQ,+BACN,MACA,OACS;AACT,WAAO,KAAK,qBAAqB,KAAK,cAAc,IAAI,GAAG,KAAK,cAAc,KAAK,CAAC;AAAA,EACtF;AAAA,EAEQ,cAAc,QAAwB;AAC5C,WAAO,KAAK,mBAAmB,MAAM;AAAA,EACvC;AAAA,EAEQ,aAAa,OAA8E;AACjG,WAAO,KAAK,oBAAoB,MAAM,SAAS;AAAA,EACjD;AAAA,EAEQ,cAAc,OAAmF;AACvG,UAAM,OAAO,KAAK,oBAAoB,MAAM,SAAS;AACrD,QAAI,MAAM,qBAAqB,KAAK,GAAG;AACrC,iBAAW,OAAO,KAAK,oBAAoB,MAAM,mBAAmB,EAAG,MAAK,IAAI,GAAG;AAAA,IACrF;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,oBAAoB,UAA+B;AACzD,UAAM,UAAU,SAAS,KAAK;AAC9B,UAAM,OAAO,oBAAI,IAAY;AAC7B,QAAI,QAAS,MAAK,IAAI,OAAO;AAC7B,SAAK,IAAI,KAAK,oBAAoB,QAAQ,CAAC;AAC3C,WAAO;AAAA,EACT;AAAA,EAEQ,qBAAqB,MAAmB,OAA6B;AAC3E,eAAW,OAAO,MAAM;AACtB,UAAI,MAAM,IAAI,GAAG,EAAG,QAAO;AAAA,IAC7B;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,oBAAoB,UAA0B;AACpD,UAAM,UAAU,SAAS,KAAK;AAC9B,QAAI,CAAC,QAAS,QAAO;AAErB,QAAI;AACF,YAAM,SAAS,IAAI,IAAI,OAAO;AAC9B,UAAI,OAAO,KAAM,QAAO,GAAG,OAAO,SAAS,YAAY,CAAC,KAAK,OAAO,KAAK,YAAY,CAAC;AAAA,IACxF,QAAQ;AAAA,IAER;AAEA,UAAM,YAAY,QAAQ,QAAQ,KAAK;AACvC,UAAM,iBAAiB,YAAY,IAAI,YAAY,IAAI;AACvD,QAAI,eAAe,QAAQ;AAC3B,eAAW,aAAa,CAAC,KAAK,KAAK,GAAG,GAAY;AAChD,YAAM,QAAQ,QAAQ,QAAQ,WAAW,cAAc;AACvD,UAAI,SAAS,KAAK,QAAQ,aAAc,gBAAe;AAAA,IACzD;AACA,QAAI,iBAAiB,eAAgB,QAAO,QAAQ,YAAY;AAEhE,UAAM,SAAS,YAAY,IAAI,GAAG,QAAQ,MAAM,GAAG,cAAc,EAAE,YAAY,CAAC,KAAK;AACrF,WAAO,GAAG,MAAM,GAAG,QAAQ,MAAM,gBAAgB,YAAY,EAAE,YAAY,CAAC;AAAA,EAC9E;AAAA,EAEQ,oBAAoB,SAAwC;AAClE,UAAM,MAAM,KAAK,uBAAuB,OAAO;AAC/C,QAAI,CAAC,IAAK;AACV,UAAM,eAAe,KAAK,mBAAmB,GAAG;AAChD,UAAM,WAAW,KAAK,gBAAgB,IAAI,YAAY;AACtD,UAAM,OAAO,KAAK,oBAAoB,cAAc,SAAS,QAAQ;AACrE,QAAI,CAAC,KAAM;AAEX,SAAK,iBAAiB,MAAM,QAAQ;AAAA,EACtC;AAAA,EAEQ,oBAAoB,SAAwC;AAClE,QAAI,OAAO,QAAQ,cAAc,YAAY,OAAO,QAAQ,kBAAkB,SAAU;AACxF,UAAM,WAAW,KAAK,mBAAmB,QAAQ,SAAS;AAC1D,UAAM,eAAe,KAAK,mBAAmB,QAAQ,aAAa;AAClE,QAAI,CAAC,YAAY,CAAC,gBAAgB,aAAa,aAAc;AAE7D,UAAM,aAAa,KAAK,gBAAgB,IAAI,QAAQ;AACpD,UAAM,iBAAiB,KAAK,gBAAgB,IAAI,YAAY;AAC5D,UAAM,eAAe,KAAK,oBAAoB,cAAc,OAAO;AACnE,SAAK,qBAAqB,IAAI,QAAQ,WAAW,YAAY;AAC7D,SAAK,qBAAqB,IAAI,UAAU,YAAY;AAEpD,QAAI,CAAC,cAAc,CAAC,kBAAkB,CAAC,aAAc;AAErD,UAAM,SAA+B;AAAA,MACnC,GAAI,aAAa,KAAK,cAAc,UAAU,IAAI,CAAC;AAAA,MACnD,GAAI,iBAAiB,KAAK,cAAc,cAAc,IAAI,CAAC;AAAA,MAC3D,GAAI,eAAe,KAAK,cAAc,YAAY,IAAI,CAAC;AAAA,MACvD,cAAc;AAAA,IAChB;AACA,QAAI,CAAC,OAAO,kBAAkB;AAC5B,aAAO,mBAAmB,gBAAgB,oBAAoB,YAAY;AAAA,IAC5E;AAEA,SAAK,oBAAoB,QAAQ;AACjC,SAAK,iBAAiB,QAAQ,cAAc;AAAA,EAC9C;AAAA,EAEQ,oBACN,KACA,SACA,UAC6B;AAC7B,UAAM,kBAAkB,KAAK,0BAA0B,OAAO,KAAK,UAAU;AAC7E,UAAM,OAA6B,WAAW,KAAK,cAAc,QAAQ,IAAI,EAAE,cAAc,IAAI;AACjG,QAAI,mBAAmB;AAEvB,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,OAAO,GAAG;AAClD,UAAI,UAAU,UAAa,QAAQ,eAAe,QAAQ,gBAAiB;AAC3E,yBAAmB;AACnB,WAAK,GAAG,IAAI,KAAK,eAAe,KAAK;AAAA,IACvC;AACA,SAAK,eAAe;AACpB,QAAI,gBAAiB,MAAK,mBAAmB;AAE7C,WAAO,oBAAoB,mBAAmB,WAAW,OAAO;AAAA,EAClE;AAAA,EAEQ,iBAAiB,OAA6B,UAAuC;AAC3F,QAAI,UAAU,oBAAoB,SAAS,qBAAqB,MAAM,kBAAkB;AACtF,WAAK,4BAA4B,MAAM,cAAc,SAAS,gBAAgB;AAAA,IAChF;AACA,SAAK,gBAAgB,IAAI,MAAM,cAAc,KAAK,cAAc,KAAK,CAAC;AACtE,QAAI,MAAM,kBAAkB;AAC1B,YAAM,MAAM,KAAK,mBAAmB,MAAM,gBAAgB;AAC1D,YAAM,OAAO,KAAK,qBAAqB,IAAI,GAAG,KAAK,oBAAI,IAAY;AACnE,WAAK,IAAI,MAAM,YAAY;AAC3B,WAAK,qBAAqB,IAAI,KAAK,IAAI;AAAA,IACzC;AAAA,EACF;AAAA,EAEQ,oBAAoB,KAAmB;AAC7C,UAAM,QAAQ,KAAK,gBAAgB,IAAI,GAAG;AAC1C,QAAI,OAAO,iBAAkB,MAAK,4BAA4B,KAAK,MAAM,gBAAgB;AACzF,SAAK,gBAAgB,OAAO,GAAG;AAAA,EACjC;AAAA,EAEQ,4BAA4B,KAAa,QAAsB;AACrE,UAAM,MAAM,KAAK,mBAAmB,MAAM;AAC1C,UAAM,OAAO,KAAK,qBAAqB,IAAI,GAAG;AAC9C,QAAI,CAAC,KAAM;AACX,SAAK,OAAO,GAAG;AACf,QAAI,KAAK,SAAS,EAAG,MAAK,qBAAqB,OAAO,GAAG;AAAA,EAC3D;AAAA,EAEQ,uBAAuB,SAAiD;AAC9E,QAAI,OAAO,QAAQ,iBAAiB,YAAY,QAAQ,aAAa,KAAK,EAAG,QAAO,QAAQ;AAC5F,QAAI,OAAO,QAAQ,QAAQ,YAAY,QAAQ,IAAI,KAAK,EAAG,QAAO,QAAQ;AAC1E,QAAI,OAAO,QAAQ,OAAO,YAAY,QAAQ,GAAG,KAAK,EAAG,QAAO,QAAQ;AACxE,WAAO;AAAA,EACT;AAAA,EAEQ,0BAA0B,SAAsD;AACtF,QAAI,OAAO,QAAQ,qBAAqB,YAAY,QAAQ,iBAAiB,KAAK;AAChF,aAAO,QAAQ;AACjB,UAAM,WAAW,KAAK,SAAS,QAAQ,QAAQ;AAC/C,WAAO,OAAO,SAAS,qBAAqB,YAAY,SAAS,iBAAiB,KAAK,IACnF,SAAS,mBACT;AAAA,EACN;AAAA,EAEQ,YAAY,OAAoC;AACtD,WAAO,OAAO,UAAU,YAAY,MAAM,KAAK,IAAI,QAAQ;AAAA,EAC7D;AAAA,EAEQ,mBAAmB,KAAqB;AAC9C,QAAI,UAAU;AACd,UAAM,OAAO,oBAAI,IAAY;AAC7B,WAAO,KAAK,qBAAqB,IAAI,OAAO,KAAK,CAAC,KAAK,IAAI,OAAO,GAAG;AACnE,WAAK,IAAI,OAAO;AAChB,gBAAU,KAAK,qBAAqB,IAAI,OAAO;AAAA,IACjD;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,cAAc,UAAsD;AAC1E,WAAO,KAAK,eAAe,QAAQ;AAAA,EACrC;AAAA,EAEQ,yBAAyB,UAAkB,SAAwC;AACzF,UAAM,gBAAgB,KAAK,0BAA0B,QAAQ,KAAK;AAClE,UAAM,cACJ,cAAc,SAAS,IACnB,cAAc,IAAI,WAAS,KAAK,gBAAgB,KAAK,CAAC,EAAE,OAAO,CAAC,WAA6B,UAAU,IAAI,IAC1G,KAAK,mBAAmB,QAAQ,KAAK,KACtC,KAAK,mBAAmB,QAAQ,gBAAgB,KAChD,KAAK,mBAAmB,QAAQ,OAAO;AAE7C,QAAI,CAAC,eAAe,YAAY,WAAW,EAAG;AAE9C,UAAM,OAAO,oBAAI,IAAY;AAC7B,SAAK,IAAI,KAAK,mBAAmB,QAAQ,CAAC;AAC1C,eAAW,SAAS,CAAC,UAAU,oBAAoB,cAAc,GAAY;AAC3E,YAAM,QAAQ,QAAQ,KAAK;AAC3B,UAAI,OAAO,UAAU,YAAY,MAAM,KAAK,EAAG,MAAK,IAAI,KAAK,mBAAmB,KAAK,CAAC;AAAA,IACxF;AACA,SAAK,IAAI,KAAK,mBAAmB,YAAY,CAAC,CAAE,CAAC;AAEjD,UAAM,YAAY,KAAK,mBAAmB,QAAQ;AAClD,UAAM,kBAAkB,oBAAI,IAAY,CAAC,SAAS,CAAC;AACnD,eAAW,OAAO,MAAM;AACtB,YAAM,iBAAiB,KAAK,0BAA0B,IAAI,GAAG;AAC7D,UAAI,eAAgB,iBAAgB,IAAI,cAAc;AAAA,IACxD;AACA,eAAW,OAAO,gBAAiB,MAAK,0BAA0B,GAAG;AAErE,eAAW,OAAO,MAAM;AACtB,WAAK,uBAAuB,IAAI,KAAK,CAAC,GAAG,WAAW,CAAC;AACrD,UAAI,cAAc,SAAS;AACzB,aAAK,uBAAuB;AAAA,UAC1B;AAAA,UACA,cAAc,IAAI,YAAU,EAAE,GAAG,MAAM,EAAE;AAAA,QAC3C;AAAA,UACG,MAAK,uBAAuB,OAAO,GAAG;AAC3C,WAAK,0BAA0B,IAAI,KAAK,SAAS;AAAA,IACnD;AACA,SAAK,2BAA2B,IAAI,WAAW,IAAI;AAAA,EACrD;AAAA,EAEQ,qBAAqB,UAAkB,SAAwC;AACrF,UAAM,OAAO,oBAAI,IAAY,CAAC,KAAK,mBAAmB,QAAQ,CAAC,CAAC;AAChE,eAAW,SAAS,CAAC,UAAU,oBAAoB,cAAc,GAAY;AAC3E,YAAM,QAAQ,QAAQ,KAAK;AAC3B,UAAI,OAAO,UAAU,YAAY,MAAM,KAAK,EAAG,MAAK,IAAI,KAAK,mBAAmB,KAAK,CAAC;AAAA,IACxF;AACA,UAAM,kBAAkB,oBAAI,IAAY;AACxC,eAAW,OAAO,MAAM;AACtB,YAAM,iBAAiB,KAAK,0BAA0B,IAAI,GAAG;AAC7D,UAAI,eAAgB,iBAAgB,IAAI,cAAc;AAAA,IACxD;AACA,QAAI,gBAAgB,OAAO,GAAG;AAC5B,iBAAW,OAAO,gBAAiB,MAAK,0BAA0B,GAAG;AACrE;AAAA,IACF;AACA,eAAW,OAAO,MAAM;AACtB,WAAK,uBAAuB,OAAO,GAAG;AACtC,WAAK,uBAAuB,OAAO,GAAG;AACtC,WAAK,0BAA0B,OAAO,GAAG;AAAA,IAC3C;AAAA,EACF;AAAA,EAEQ,0BAA0B,WAAyB;AACzD,UAAM,OAAO,KAAK,2BAA2B,IAAI,SAAS;AAC1D,QAAI,CAAC,KAAM;AACX,eAAW,OAAO,MAAM;AACtB,WAAK,uBAAuB,OAAO,GAAG;AACtC,WAAK,uBAAuB,OAAO,GAAG;AACtC,WAAK,0BAA0B,OAAO,GAAG;AAAA,IAC3C;AACA,SAAK,2BAA2B,OAAO,SAAS;AAAA,EAClD;AAAA,EAEQ,SAAS,OAAyC;AACxD,WAAO,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,IAAK,QAAoC,CAAC;AAAA,EAC7G;AAAA,EAEQ,wBAAgE;AACtE,WAAO;AAAA,MACL,UAAU,CAAC;AAAA,MACX,gBAAgB,CAAC;AAAA,MACjB,SAAS,CAAC;AAAA,MACV,YAAY,CAAC;AAAA,MACb,mBAAmB;AAAA,MACnB,MAAM,CAAC;AAAA,MACP,gBAAgB,CAAC;AAAA,MACjB,gBAAgB;AAAA,MAChB,iBAAiB;AAAA,MACjB,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EAEQ,cAAc,OAAmC;AACvD,WAAO,MAAM,QAAQ,KAAK,KAAK,MAAM,MAAM,UAAQ,OAAO,SAAS,QAAQ;AAAA,EAC7E;AAAA,EAEQ,wBAAwB,OAAiE;AAC/F,UAAM,UAAU,KAAK,SAAS,KAAK;AACnC,WACE,KAAK,cAAc,QAAQ,QAAQ,KACnC,KAAK,cAAc,QAAQ,cAAc,KACzC,KAAK,cAAc,QAAQ,OAAO,KAClC,KAAK,cAAc,QAAQ,UAAU,MACpC,OAAO,QAAQ,sBAAsB,YAAY,QAAQ,sBAAsB,SAChF,KAAK,cAAc,QAAQ,IAAI,KAC/B,KAAK,cAAc,QAAQ,cAAc,MACxC,QAAQ,eAAe,UAAa,KAAK,cAAc,QAAQ,UAAU,MAC1E,OAAO,QAAQ,mBAAmB,YAClC,OAAO,QAAQ,oBAAoB,YACnC,OAAO,QAAQ,YAAY;AAAA,EAE/B;AAAA,EAEQ,uBAAuB,OAA6C;AAC1E,UAAM,UAAU,KAAK,SAAS,KAAK;AACnC,YACG,QAAQ,OAAO,UAAa,KAAK,YAAY,QAAQ,EAAE,MAAM,WAC9D,KAAK,YAAY,QAAQ,SAAS,MAAM,UACxC,KAAK,YAAY,QAAQ,gBAAgB,MAAM,WAC9C,QAAQ,uBAAuB,UAAa,KAAK,YAAY,QAAQ,kBAAkB,MAAM,YAC7F,QAAQ,iBAAiB,UAAa,KAAK,cAAc,QAAQ,YAAY,OAC7E,QAAQ,kBAAkB,UAAa,KAAK,cAAc,QAAQ,aAAa,OAC/E,QAAQ,kBAAkB,UAAa,KAAK,cAAc,QAAQ,aAAa,OAC/E,QAAQ,mBAAmB,UAAa,KAAK,cAAc,QAAQ,cAAc,OACjF,QAAQ,cAAc,UAAa,KAAK,cAAc,QAAQ,SAAS,OACvE,QAAQ,mBAAmB,UAAa,OAAO,QAAQ,mBAAmB,cAC1E,QAAQ,oBAAoB,UAAa,OAAO,QAAQ,oBAAoB,cAC5E,QAAQ,iBAAiB,UAAa,OAAO,QAAQ,iBAAiB;AAAA,EAE3E;AAAA,EAEQ,kBAAkB,OAA0C;AAClE,UAAM,UAAU,KAAK,SAAS,KAAK;AACnC,UAAM,WAAW,oBAAI,IAAI,CAAC,WAAW,YAAY,WAAW,WAAW,WAAW,CAAC;AACnF,UAAM,kBAAkB,oBAAI,IAAI,CAAC,eAAe,WAAW,cAAc,YAAY,CAAC;AACtF,QAAI,QAAQ,WAAW,aAAa;AAClC,cACG,QAAQ,oBAAoB,UAC1B,OAAO,QAAQ,oBAAoB,YAAY,gBAAgB,IAAI,QAAQ,eAAe,OAC5F,QAAQ,WAAW,UACjB,QAAQ,UAAU,QAAQ,OAAO,QAAQ,WAAW,YAAY,CAAC,MAAM,QAAQ,QAAQ,MAAM,OAC/F,QAAQ,gBAAgB,UAAa,OAAO,QAAQ,gBAAgB,cACpE,QAAQ,oBAAoB,UAC3B,OAAO,QAAQ,oBAAoB,YACnC,QAAQ,oBAAoB,UAC7B,QAAQ,aAAa,UAAa,OAAO,QAAQ,aAAa,YAAY,QAAQ,aAAa;AAAA,IAEpG;AACA,WACE,OAAO,QAAQ,WAAW,YAC1B,SAAS,IAAI,QAAQ,MAAM,KAC3B,OAAO,QAAQ,oBAAoB,YACnC,gBAAgB,IAAI,QAAQ,eAAe,KAC3C,QAAQ,UAAU,QAClB,OAAO,QAAQ,WAAW,YAC1B,CAAC,MAAM,QAAQ,QAAQ,MAAM,KAC7B,OAAO,QAAQ,gBAAgB,aAC9B,OAAO,QAAQ,oBAAoB,YAAY,QAAQ,oBAAoB,UAC3E,OAAO,QAAQ,aAAa,YAAY,QAAQ,aAAa;AAAA,EAElE;AAAA,EAEQ,gBAAgB,OAAwC;AAC9D,UAAM,QAAQ,KAAK,SAAS,KAAK;AACjC,WAAO,OAAO,MAAM,iBAAiB,YAAY,OAAO,MAAM,qBAAqB;AAAA,EACrF;AAAA,EAEQ,eAAkB,OAAa;AACrC,QAAI,MAAM,QAAQ,KAAK,EAAG,QAAO,MAAM,IAAI,UAAQ,KAAK,eAAe,IAAI,CAAC;AAC5E,QAAI,SAAS,OAAO,UAAU,UAAU;AACtC,YAAM,OAAgC,CAAC;AACvC,iBAAW,CAAC,KAAK,MAAM,KAAK,OAAO,QAAQ,KAAK,GAAG;AACjD,aAAK,GAAG,IAAI,KAAK,eAAe,MAAM;AAAA,MACxC;AACA,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,0BAA0B,OAAiC;AACjE,QAAI,CAAC,MAAM,QAAQ,KAAK,EAAG,QAAO,CAAC;AACnC,WAAO,MAAM,OAAO,UAAQ,KAAK,gBAAgB,IAAI,CAAC;AAAA,EACxD;AAAA,EAEQ,mBAAmB,OAAiC;AAC1D,QAAI,CAAC,MAAM,QAAQ,KAAK,EAAG,QAAO;AAClC,UAAM,UAAoB,CAAC;AAC3B,eAAW,QAAQ,OAAO;AACxB,UAAI,OAAO,SAAS,YAAY,KAAK,KAAK,GAAG;AAC3C,gBAAQ,KAAK,IAAI;AACjB;AAAA,MACF;AACA,UAAI,QAAQ,OAAO,SAAS,YAAY,CAAC,MAAM,QAAQ,IAAI,GAAG;AAC5D,cAAM,SAAS,KAAK,gBAAgB,IAA8B;AAClE,YAAI,OAAQ,SAAQ,KAAK,MAAM;AAAA,MACjC;AAAA,IACF;AACA,WAAO,QAAQ,SAAS,IAAI,UAAU;AAAA,EACxC;AAAA,EAEQ,gBAAgB,OAA8C;AACpE,WAAO,MAAM,oBAAoB,MAAM,gBAAgB;AAAA,EACzD;AAAA,EAEQ,mBAAmB,QAAwB;AACjD,WAAO,OAAO,KAAK,EAAE,YAAY;AAAA,EACnC;AAAA,EAEQ,SAAS,MAA+B;AAC9C,UAAM,OAAO,KAAK;AAClB,QAAI,SAAS,KAAM;AACnB,SAAK,SAAS;AACd,SAAK,KAAK,eAAe,EAAE,MAAM,IAAI,KAAK,CAAC;AAAA,EAC7C;AACF;","names":[]}
@@ -1,7 +1 @@
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
  //# sourceMappingURL=types.generated.mjs.map
@@ -1,7 +1 @@
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
  //# sourceMappingURL=types.mjs.map
@@ -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 * as schemas from "../types/schemas.generated.mjs";
8
2
  import { TOOL_REQUEST_SCHEMAS } from "../utils/tool-request-schemas.mjs";
9
3
  export * from "../types/schemas.generated.mjs";
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/schemas/index.ts"],"sourcesContent":["/**\n * Consolidated schema exports for MCP tool registration.\n *\n * The generated Zod schemas in `../types/schemas.generated` cover every\n * AdCP tool — the framework-registered {@link AdcpToolMap} tools AND\n * tools like `creative_approval`, `search_brands`, and brand verification\n * tasks that ship as `customTools` extensions because the spec models them\n * outside the SDK's framework-registered surface.\n *\n * This module re-exports the generated schemas plus two convenience\n * helpers for the `customTools` registration path:\n *\n * - {@link TOOL_INPUT_SHAPES}: `toolName → raw Zod shape` map, ready to\n * pass as `inputSchema` to MCP SDK's `server.registerTool()` when the\n * request schema is a ZodObject.\n * - {@link TOOL_INPUT_SCHEMAS}: `toolName → full Zod schema` map for\n * custom tools whose request schema is a union/intersection and cannot\n * be represented as a raw shape without weakening validation.\n * - {@link TOOL_RESPONSE_SCHEMAS}: `toolName → full Zod response schema`\n * map for response validation and compliance tooling.\n * - {@link customToolFor}: sugar for registering a single custom tool\n * with type-safe `handler` params derived from the schema's shape.\n * - {@link customToolForSchema}: same sugar for full Zod schemas.\n *\n * ```ts\n * import { createAdcpServer } from '@adcp/sdk/server/legacy/v5';\n * import { TOOL_INPUT_SHAPES, customToolFor } from '@adcp/sdk/schemas';\n *\n * createAdcpServer({\n * customTools: {\n * creative_approval: customToolFor(\n * 'creative_approval',\n * 'Accept a buyer creative for approval.',\n * TOOL_INPUT_SHAPES.creative_approval,\n * async (args, extra) => { ... },\n * ),\n * },\n * ...,\n * });\n * ```\n */\n\nimport type { z } from 'zod';\nimport * as schemas from '../types/schemas.generated';\nimport { TOOL_REQUEST_SCHEMAS } from '../utils/tool-request-schemas';\nimport type { KnownToolRequestSchemas } from '../utils/tool-request-schemas';\n\nexport * from '../types/schemas.generated';\nexport { TOOL_REQUEST_SCHEMAS } from '../utils/tool-request-schemas';\nexport { TOOL_RESPONSE_SCHEMAS } from '../utils/response-schemas';\nexport {\n SyncCreativesItemSchema,\n SyncCreativesSuccessStrictSchema,\n SyncCreativesResponseStrictSchema,\n SyncCreativesActionSchema,\n} from '../validation/sync-creatives';\nexport type { SyncCreativesItem, SyncCreativesSuccessStrict } from '../validation/sync-creatives';\n\ntype InputShape = Record<string, z.ZodType>;\ntype InputSchema = z.ZodType;\ntype ShapeOf<T> = T extends { shape: infer TShape extends InputShape } ? TShape : never;\ntype ToolInputShapes = {\n [K in keyof KnownToolRequestSchemas]: ShapeOf<KnownToolRequestSchemas[K]>;\n} & {\n creative_approval: typeof schemas.CreativeApprovalRequestSchema.shape;\n search_brands: typeof schemas.SearchBrandsRequestSchema.shape;\n verify_brand_claims: typeof schemas.VerifyBrandClaimsRequestBulkSchema.shape;\n} & {\n readonly [toolName: string]: Readonly<InputShape> | undefined;\n};\n\ntype ToolInputSchemas = {\n [K in keyof KnownToolRequestSchemas]: KnownToolRequestSchemas[K];\n} & {\n creative_approval: typeof schemas.CreativeApprovalRequestSchema;\n search_brands: typeof schemas.SearchBrandsRequestSchema;\n verify_brand_claim: typeof schemas.VerifyBrandClaimRequestSchema;\n verify_brand_claims: typeof schemas.VerifyBrandClaimsRequestBulkSchema;\n} & {\n readonly [toolName: string]: InputSchema | undefined;\n};\n\nfunction shapeOf<T extends { shape?: InputShape }>(s: T | undefined): T['shape'] | undefined {\n const candidate = s?.shape;\n return candidate && typeof candidate === 'object' ? candidate : undefined;\n}\n\n/**\n * Map of every known AdCP tool name to its Zod input shape — i.e., the\n * `.shape` of its request schema, ready to pass as `inputSchema` to MCP\n * SDK's `server.registerTool()`.\n *\n * Superset of {@link TOOL_REQUEST_SCHEMAS}: covers every tool already\n * registered with the framework (get_products, create_media_buy,\n * sync_catalogs, check_governance, comply_test_controller, all five\n * *_collection_list tools, validate_property_delivery, acquire_rights,\n * et al.) PLUS shape-compatible custom surfaces such as `creative_approval`,\n * `search_brands`, and `verify_brand_claims` so sellers don't have to\n * hand-author shapes for those either.\n *\n * `verify_brand_claim` is intentionally not present here: its request schema\n * is an envelope intersected with a claim-variant union, so use\n * {@link TOOL_INPUT_SCHEMAS} with {@link customToolForSchema} to preserve the\n * discriminated union at validation time.\n *\n * Known tool names retain exact `.shape` field types for IDE completion and\n * handler inference. Arbitrary string lookups return `undefined` until callers\n * narrow the tool name to a known key.\n *\n * If a future AdCP release adds a new tool with a generated request\n * schema, add its entry here (or to `TOOL_REQUEST_SCHEMAS` if it's\n * framework-registrable) — CI's `ci:schema-check` catches missing\n * map entries by diffing against the generated schemas.\n */\nexport const TOOL_INPUT_SHAPES = Object.freeze({\n ...Object.fromEntries(\n Object.entries(TOOL_REQUEST_SCHEMAS).map(([k, s]) => {\n const shape = shapeOf(s);\n if (!shape) {\n throw new Error(\n `TOOL_REQUEST_SCHEMAS[\"${k}\"] has no .shape — schema must be a ZodObject (use merge() not and())`\n );\n }\n return [k, shape] as const;\n })\n ),\n creative_approval: schemas.CreativeApprovalRequestSchema.shape,\n search_brands: schemas.SearchBrandsRequestSchema.shape,\n verify_brand_claims: schemas.VerifyBrandClaimsRequestBulkSchema.shape,\n}) as Readonly<ToolInputShapes>;\n\n/**\n * Map of known AdCP tool names to their full generated Zod request schemas.\n *\n * Prefer {@link TOOL_INPUT_SHAPES} when registering a shape-compatible tool\n * with `registerTool()`. Use this map for union/intersection request schemas,\n * notably `verify_brand_claim`, where a raw shape would lose the correlation\n * between `claim_type` and the corresponding `claim` payload.\n */\nexport const TOOL_INPUT_SCHEMAS = Object.freeze({\n ...TOOL_REQUEST_SCHEMAS,\n creative_approval: schemas.CreativeApprovalRequestSchema,\n search_brands: schemas.SearchBrandsRequestSchema,\n verify_brand_claim: schemas.VerifyBrandClaimRequestSchema,\n verify_brand_claims: schemas.VerifyBrandClaimsRequestBulkSchema,\n}) as Readonly<ToolInputSchemas>;\n\n/**\n * Register a custom tool with MCP-compatible `inputSchema` + handler\n * wiring. Returns an object shaped for\n * `AdcpServerConfig.customTools[name]` — pass it straight through.\n *\n * Why it exists: sellers adding tools outside `AdcpToolMap` have to\n * publish an `inputSchema` via `tools/list` (MCP spec requirement). Doing\n * that by hand means authoring a Zod shape that matches the generated\n * AdCP spec schema — easy to drift silently. Using this helper guarantees\n * the advertised shape is the same shape the SDK validates the request\n * against.\n */\nexport function customToolFor<TShape extends InputShape>(\n name: string,\n description: string,\n inputSchema: TShape,\n handler: (args: z.input<z.ZodObject<TShape>>, extra?: unknown) => unknown | Promise<unknown>\n): {\n description: string;\n inputSchema: TShape;\n handler: (args: z.input<z.ZodObject<TShape>>, extra?: unknown) => unknown | Promise<unknown>;\n} {\n // `name` participates in the return contract's narrowing only indirectly\n // (via the caller's key when spread into `customTools`). Callers retain\n // it as a parameter so future stricter registration (logging, metrics,\n // schema-registry lookups) can be added without an API break.\n void name;\n return { description, inputSchema, handler };\n}\n\n/**\n * Register a custom tool whose MCP `inputSchema` is a full Zod schema rather\n * than a raw shape. Use this for request schemas with top-level unions or\n * intersections, where `.shape` would either be unavailable or would weaken\n * runtime validation.\n */\nexport function customToolForSchema<TSchema extends InputSchema>(\n name: string,\n description: string,\n inputSchema: TSchema,\n handler: (args: z.input<TSchema>, extra?: unknown) => unknown | Promise<unknown>\n): {\n description: string;\n inputSchema: TSchema;\n handler: (args: z.input<TSchema>, extra?: unknown) => unknown | Promise<unknown>;\n} {\n void name;\n return { description, inputSchema, handler };\n}\n"],"mappings":";;;;;;AA2CA,YAAY,aAAa;AACzB,SAAS,4BAA4B;AAGrC,cAAc;AACd,SAAS,wBAAAA,6BAA4B;AACrC,SAAS,6BAA6B;AACtC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AA2BP,SAAS,QAA0C,GAA0C;AAC3F,QAAM,YAAY,GAAG;AACrB,SAAO,aAAa,OAAO,cAAc,WAAW,YAAY;AAClE;AA6BO,MAAM,oBAAoB,OAAO,OAAO;AAAA,EAC7C,GAAG,OAAO;AAAA,IACR,OAAO,QAAQ,oBAAoB,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM;AACnD,YAAM,QAAQ,QAAQ,CAAC;AACvB,UAAI,CAAC,OAAO;AACV,cAAM,IAAI;AAAA,UACR,yBAAyB,CAAC;AAAA,QAC5B;AAAA,MACF;AACA,aAAO,CAAC,GAAG,KAAK;AAAA,IAClB,CAAC;AAAA,EACH;AAAA,EACA,mBAAmB,QAAQ,8BAA8B;AAAA,EACzD,eAAe,QAAQ,0BAA0B;AAAA,EACjD,qBAAqB,QAAQ,mCAAmC;AAClE,CAAC;AAUM,MAAM,qBAAqB,OAAO,OAAO;AAAA,EAC9C,GAAG;AAAA,EACH,mBAAmB,QAAQ;AAAA,EAC3B,eAAe,QAAQ;AAAA,EACvB,oBAAoB,QAAQ;AAAA,EAC5B,qBAAqB,QAAQ;AAC/B,CAAC;AAcM,SAAS,cACd,MACA,aACA,aACA,SAKA;AAKA,OAAK;AACL,SAAO,EAAE,aAAa,aAAa,QAAQ;AAC7C;AAQO,SAAS,oBACd,MACA,aACA,aACA,SAKA;AACA,OAAK;AACL,SAAO,EAAE,aAAa,aAAa,QAAQ;AAC7C;","names":["TOOL_REQUEST_SCHEMAS"]}
1
+ {"version":3,"sources":["../../../src/lib/schemas/index.ts"],"sourcesContent":["/**\n * Consolidated schema exports for MCP tool registration.\n *\n * The generated Zod schemas in `../types/schemas.generated` cover every\n * AdCP tool — the framework-registered {@link AdcpToolMap} tools AND\n * tools like `creative_approval`, `search_brands`, and brand verification\n * tasks that ship as `customTools` extensions because the spec models them\n * outside the SDK's framework-registered surface.\n *\n * This module re-exports the generated schemas plus two convenience\n * helpers for the `customTools` registration path:\n *\n * - {@link TOOL_INPUT_SHAPES}: `toolName → raw Zod shape` map, ready to\n * pass as `inputSchema` to MCP SDK's `server.registerTool()` when the\n * request schema is a ZodObject.\n * - {@link TOOL_INPUT_SCHEMAS}: `toolName → full Zod schema` map for\n * custom tools whose request schema is a union/intersection and cannot\n * be represented as a raw shape without weakening validation.\n * - {@link TOOL_RESPONSE_SCHEMAS}: `toolName → full Zod response schema`\n * map for response validation and compliance tooling.\n * - {@link customToolFor}: sugar for registering a single custom tool\n * with type-safe `handler` params derived from the schema's shape.\n * - {@link customToolForSchema}: same sugar for full Zod schemas.\n *\n * ```ts\n * import { createAdcpServer } from '@adcp/sdk/server/legacy/v5';\n * import { TOOL_INPUT_SHAPES, customToolFor } from '@adcp/sdk/schemas';\n *\n * createAdcpServer({\n * customTools: {\n * creative_approval: customToolFor(\n * 'creative_approval',\n * 'Accept a buyer creative for approval.',\n * TOOL_INPUT_SHAPES.creative_approval,\n * async (args, extra) => { ... },\n * ),\n * },\n * ...,\n * });\n * ```\n */\n\nimport type { z } from 'zod';\nimport * as schemas from '../types/schemas.generated';\nimport { TOOL_REQUEST_SCHEMAS } from '../utils/tool-request-schemas';\nimport type { KnownToolRequestSchemas } from '../utils/tool-request-schemas';\n\nexport * from '../types/schemas.generated';\nexport { TOOL_REQUEST_SCHEMAS } from '../utils/tool-request-schemas';\nexport { TOOL_RESPONSE_SCHEMAS } from '../utils/response-schemas';\nexport {\n SyncCreativesItemSchema,\n SyncCreativesSuccessStrictSchema,\n SyncCreativesResponseStrictSchema,\n SyncCreativesActionSchema,\n} from '../validation/sync-creatives';\nexport type { SyncCreativesItem, SyncCreativesSuccessStrict } from '../validation/sync-creatives';\n\ntype InputShape = Record<string, z.ZodType>;\ntype InputSchema = z.ZodType;\ntype ShapeOf<T> = T extends { shape: infer TShape extends InputShape } ? TShape : never;\ntype ToolInputShapes = {\n [K in keyof KnownToolRequestSchemas]: ShapeOf<KnownToolRequestSchemas[K]>;\n} & {\n creative_approval: typeof schemas.CreativeApprovalRequestSchema.shape;\n search_brands: typeof schemas.SearchBrandsRequestSchema.shape;\n verify_brand_claims: typeof schemas.VerifyBrandClaimsRequestBulkSchema.shape;\n} & {\n readonly [toolName: string]: Readonly<InputShape> | undefined;\n};\n\ntype ToolInputSchemas = {\n [K in keyof KnownToolRequestSchemas]: KnownToolRequestSchemas[K];\n} & {\n creative_approval: typeof schemas.CreativeApprovalRequestSchema;\n search_brands: typeof schemas.SearchBrandsRequestSchema;\n verify_brand_claim: typeof schemas.VerifyBrandClaimRequestSchema;\n verify_brand_claims: typeof schemas.VerifyBrandClaimsRequestBulkSchema;\n} & {\n readonly [toolName: string]: InputSchema | undefined;\n};\n\nfunction shapeOf<T extends { shape?: InputShape }>(s: T | undefined): T['shape'] | undefined {\n const candidate = s?.shape;\n return candidate && typeof candidate === 'object' ? candidate : undefined;\n}\n\n/**\n * Map of every known AdCP tool name to its Zod input shape — i.e., the\n * `.shape` of its request schema, ready to pass as `inputSchema` to MCP\n * SDK's `server.registerTool()`.\n *\n * Superset of {@link TOOL_REQUEST_SCHEMAS}: covers every tool already\n * registered with the framework (get_products, create_media_buy,\n * sync_catalogs, check_governance, comply_test_controller, all five\n * *_collection_list tools, validate_property_delivery, acquire_rights,\n * et al.) PLUS shape-compatible custom surfaces such as `creative_approval`,\n * `search_brands`, and `verify_brand_claims` so sellers don't have to\n * hand-author shapes for those either.\n *\n * `verify_brand_claim` is intentionally not present here: its request schema\n * is an envelope intersected with a claim-variant union, so use\n * {@link TOOL_INPUT_SCHEMAS} with {@link customToolForSchema} to preserve the\n * discriminated union at validation time.\n *\n * Known tool names retain exact `.shape` field types for IDE completion and\n * handler inference. Arbitrary string lookups return `undefined` until callers\n * narrow the tool name to a known key.\n *\n * If a future AdCP release adds a new tool with a generated request\n * schema, add its entry here (or to `TOOL_REQUEST_SCHEMAS` if it's\n * framework-registrable) — CI's `ci:schema-check` catches missing\n * map entries by diffing against the generated schemas.\n */\nexport const TOOL_INPUT_SHAPES = Object.freeze({\n ...Object.fromEntries(\n Object.entries(TOOL_REQUEST_SCHEMAS).map(([k, s]) => {\n const shape = shapeOf(s);\n if (!shape) {\n throw new Error(\n `TOOL_REQUEST_SCHEMAS[\"${k}\"] has no .shape — schema must be a ZodObject (use merge() not and())`\n );\n }\n return [k, shape] as const;\n })\n ),\n creative_approval: schemas.CreativeApprovalRequestSchema.shape,\n search_brands: schemas.SearchBrandsRequestSchema.shape,\n verify_brand_claims: schemas.VerifyBrandClaimsRequestBulkSchema.shape,\n}) as Readonly<ToolInputShapes>;\n\n/**\n * Map of known AdCP tool names to their full generated Zod request schemas.\n *\n * Prefer {@link TOOL_INPUT_SHAPES} when registering a shape-compatible tool\n * with `registerTool()`. Use this map for union/intersection request schemas,\n * notably `verify_brand_claim`, where a raw shape would lose the correlation\n * between `claim_type` and the corresponding `claim` payload.\n */\nexport const TOOL_INPUT_SCHEMAS = Object.freeze({\n ...TOOL_REQUEST_SCHEMAS,\n creative_approval: schemas.CreativeApprovalRequestSchema,\n search_brands: schemas.SearchBrandsRequestSchema,\n verify_brand_claim: schemas.VerifyBrandClaimRequestSchema,\n verify_brand_claims: schemas.VerifyBrandClaimsRequestBulkSchema,\n}) as Readonly<ToolInputSchemas>;\n\n/**\n * Register a custom tool with MCP-compatible `inputSchema` + handler\n * wiring. Returns an object shaped for\n * `AdcpServerConfig.customTools[name]` — pass it straight through.\n *\n * Why it exists: sellers adding tools outside `AdcpToolMap` have to\n * publish an `inputSchema` via `tools/list` (MCP spec requirement). Doing\n * that by hand means authoring a Zod shape that matches the generated\n * AdCP spec schema — easy to drift silently. Using this helper guarantees\n * the advertised shape is the same shape the SDK validates the request\n * against.\n */\nexport function customToolFor<TShape extends InputShape>(\n name: string,\n description: string,\n inputSchema: TShape,\n handler: (args: z.input<z.ZodObject<TShape>>, extra?: unknown) => unknown | Promise<unknown>\n): {\n description: string;\n inputSchema: TShape;\n handler: (args: z.input<z.ZodObject<TShape>>, extra?: unknown) => unknown | Promise<unknown>;\n} {\n // `name` participates in the return contract's narrowing only indirectly\n // (via the caller's key when spread into `customTools`). Callers retain\n // it as a parameter so future stricter registration (logging, metrics,\n // schema-registry lookups) can be added without an API break.\n void name;\n return { description, inputSchema, handler };\n}\n\n/**\n * Register a custom tool whose MCP `inputSchema` is a full Zod schema rather\n * than a raw shape. Use this for request schemas with top-level unions or\n * intersections, where `.shape` would either be unavailable or would weaken\n * runtime validation.\n */\nexport function customToolForSchema<TSchema extends InputSchema>(\n name: string,\n description: string,\n inputSchema: TSchema,\n handler: (args: z.input<TSchema>, extra?: unknown) => unknown | Promise<unknown>\n): {\n description: string;\n inputSchema: TSchema;\n handler: (args: z.input<TSchema>, extra?: unknown) => unknown | Promise<unknown>;\n} {\n void name;\n return { description, inputSchema, handler };\n}\n"],"mappings":"AA2CA,YAAY,aAAa;AACzB,SAAS,4BAA4B;AAGrC,cAAc;AACd,SAAS,wBAAAA,6BAA4B;AACrC,SAAS,6BAA6B;AACtC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AA2BP,SAAS,QAA0C,GAA0C;AAC3F,QAAM,YAAY,GAAG;AACrB,SAAO,aAAa,OAAO,cAAc,WAAW,YAAY;AAClE;AA6BO,MAAM,oBAAoB,OAAO,OAAO;AAAA,EAC7C,GAAG,OAAO;AAAA,IACR,OAAO,QAAQ,oBAAoB,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM;AACnD,YAAM,QAAQ,QAAQ,CAAC;AACvB,UAAI,CAAC,OAAO;AACV,cAAM,IAAI;AAAA,UACR,yBAAyB,CAAC;AAAA,QAC5B;AAAA,MACF;AACA,aAAO,CAAC,GAAG,KAAK;AAAA,IAClB,CAAC;AAAA,EACH;AAAA,EACA,mBAAmB,QAAQ,8BAA8B;AAAA,EACzD,eAAe,QAAQ,0BAA0B;AAAA,EACjD,qBAAqB,QAAQ,mCAAmC;AAClE,CAAC;AAUM,MAAM,qBAAqB,OAAO,OAAO;AAAA,EAC9C,GAAG;AAAA,EACH,mBAAmB,QAAQ;AAAA,EAC3B,eAAe,QAAQ;AAAA,EACvB,oBAAoB,QAAQ;AAAA,EAC5B,qBAAqB,QAAQ;AAC/B,CAAC;AAcM,SAAS,cACd,MACA,aACA,aACA,SAKA;AAKA,OAAK;AACL,SAAO,EAAE,aAAa,aAAa,QAAQ;AAC7C;AAQO,SAAS,oBACd,MACA,aACA,aACA,SAKA;AACA,OAAK;AACL,SAAO,EAAE,aAAa,aAAa,QAAQ;AAC7C;","names":["TOOL_REQUEST_SCHEMAS"]}
@@ -4,5 +4,5 @@
4
4
  "source_sha": "4e553ad955f83b49c7d221ab5c3ff78237ad02e3",
5
5
  "source_tarball_sha256": "580656d6466ef9f0d1119985e6726c2efea718dc671e2ad30957fcb2fd54af0f",
6
6
  "upstream_adcp_version": "2.5.3",
7
- "synced_at": "2026-07-15T15:35:17.745Z"
7
+ "synced_at": "2026-07-18T19:51:07.488Z"
8
8
  }
@@ -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 {
8
2
  DefaultRequestHandler,
9
3
  InMemoryTaskStore as SdkInMemoryTaskStore,