@adcp/sdk 12.0.0 → 12.0.1

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 (942) 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.mjs +0 -6
  174. package/dist/lib/index.mjs.map +1 -1
  175. package/dist/lib/media-buy/available-actions.mjs +0 -6
  176. package/dist/lib/media-buy/available-actions.mjs.map +1 -1
  177. package/dist/lib/media-buy/index.mjs +0 -6
  178. package/dist/lib/media-buy/index.mjs.map +1 -1
  179. package/dist/lib/media-buy/preflight.mjs +0 -6
  180. package/dist/lib/media-buy/preflight.mjs.map +1 -1
  181. package/dist/lib/media-buy/property-policy.mjs +0 -6
  182. package/dist/lib/media-buy/property-policy.mjs.map +1 -1
  183. package/dist/lib/media-buy/types.mjs +0 -6
  184. package/dist/lib/media-buy/types.mjs.map +1 -1
  185. package/dist/lib/media-buy/update-fields.generated.mjs +0 -6
  186. package/dist/lib/media-buy/update-fields.generated.mjs.map +1 -1
  187. package/dist/lib/mock-server/creative-ad-server/seed-data.mjs +0 -6
  188. package/dist/lib/mock-server/creative-ad-server/seed-data.mjs.map +1 -1
  189. package/dist/lib/mock-server/creative-ad-server/server.mjs +0 -6
  190. package/dist/lib/mock-server/creative-ad-server/server.mjs.map +1 -1
  191. package/dist/lib/mock-server/creative-template/seed-data.mjs +0 -6
  192. package/dist/lib/mock-server/creative-template/seed-data.mjs.map +1 -1
  193. package/dist/lib/mock-server/creative-template/server.mjs +0 -6
  194. package/dist/lib/mock-server/creative-template/server.mjs.map +1 -1
  195. package/dist/lib/mock-server/index.mjs +0 -6
  196. package/dist/lib/mock-server/index.mjs.map +1 -1
  197. package/dist/lib/mock-server/sales-guaranteed/recipe.mjs +0 -6
  198. package/dist/lib/mock-server/sales-guaranteed/recipe.mjs.map +1 -1
  199. package/dist/lib/mock-server/sales-guaranteed/seed-data.mjs +0 -6
  200. package/dist/lib/mock-server/sales-guaranteed/seed-data.mjs.map +1 -1
  201. package/dist/lib/mock-server/sales-guaranteed/server.mjs +0 -6
  202. package/dist/lib/mock-server/sales-guaranteed/server.mjs.map +1 -1
  203. package/dist/lib/mock-server/sales-non-guaranteed/recipe.mjs +0 -6
  204. package/dist/lib/mock-server/sales-non-guaranteed/recipe.mjs.map +1 -1
  205. package/dist/lib/mock-server/sales-non-guaranteed/seed-data.mjs +0 -6
  206. package/dist/lib/mock-server/sales-non-guaranteed/seed-data.mjs.map +1 -1
  207. package/dist/lib/mock-server/sales-non-guaranteed/server.mjs +0 -6
  208. package/dist/lib/mock-server/sales-non-guaranteed/server.mjs.map +1 -1
  209. package/dist/lib/mock-server/sales-social/seed-data.mjs +0 -6
  210. package/dist/lib/mock-server/sales-social/seed-data.mjs.map +1 -1
  211. package/dist/lib/mock-server/sales-social/server.mjs +0 -6
  212. package/dist/lib/mock-server/sales-social/server.mjs.map +1 -1
  213. package/dist/lib/mock-server/scenario.mjs +0 -6
  214. package/dist/lib/mock-server/scenario.mjs.map +1 -1
  215. package/dist/lib/mock-server/signal-marketplace/seed-data.mjs +0 -6
  216. package/dist/lib/mock-server/signal-marketplace/seed-data.mjs.map +1 -1
  217. package/dist/lib/mock-server/signal-marketplace/server.mjs +0 -6
  218. package/dist/lib/mock-server/signal-marketplace/server.mjs.map +1 -1
  219. package/dist/lib/mock-server/sponsored-intelligence/seed-data.mjs +0 -6
  220. package/dist/lib/mock-server/sponsored-intelligence/seed-data.mjs.map +1 -1
  221. package/dist/lib/mock-server/sponsored-intelligence/server.mjs +0 -6
  222. package/dist/lib/mock-server/sponsored-intelligence/server.mjs.map +1 -1
  223. package/dist/lib/net/address-guards.mjs +0 -6
  224. package/dist/lib/net/address-guards.mjs.map +1 -1
  225. package/dist/lib/net/index.mjs +0 -6
  226. package/dist/lib/net/index.mjs.map +1 -1
  227. package/dist/lib/net/ssrf-fetch.mjs +0 -6
  228. package/dist/lib/net/ssrf-fetch.mjs.map +1 -1
  229. package/dist/lib/observability/index.mjs +0 -6
  230. package/dist/lib/observability/index.mjs.map +1 -1
  231. package/dist/lib/observability/tracing.mjs +6 -7
  232. package/dist/lib/observability/tracing.mjs.map +1 -1
  233. package/dist/lib/protocols/a2a.mjs +0 -6
  234. package/dist/lib/protocols/a2a.mjs.map +1 -1
  235. package/dist/lib/protocols/abort.mjs +0 -6
  236. package/dist/lib/protocols/abort.mjs.map +1 -1
  237. package/dist/lib/protocols/index.mjs +0 -6
  238. package/dist/lib/protocols/index.mjs.map +1 -1
  239. package/dist/lib/protocols/mcp-modern.mjs +0 -6
  240. package/dist/lib/protocols/mcp-modern.mjs.map +1 -1
  241. package/dist/lib/protocols/mcp-tasks.mjs +0 -6
  242. package/dist/lib/protocols/mcp-tasks.mjs.map +1 -1
  243. package/dist/lib/protocols/mcp.mjs +0 -6
  244. package/dist/lib/protocols/mcp.mjs.map +1 -1
  245. package/dist/lib/protocols/rawResponseCapture.mjs +0 -6
  246. package/dist/lib/protocols/rawResponseCapture.mjs.map +1 -1
  247. package/dist/lib/protocols/responseSizeLimit.mjs +0 -6
  248. package/dist/lib/protocols/responseSizeLimit.mjs.map +1 -1
  249. package/dist/lib/protocols/transportDiagnostics.mjs +0 -6
  250. package/dist/lib/protocols/transportDiagnostics.mjs.map +1 -1
  251. package/dist/lib/registry/cursor-store.mjs +0 -6
  252. package/dist/lib/registry/cursor-store.mjs.map +1 -1
  253. package/dist/lib/registry/feed-stream.mjs +0 -6
  254. package/dist/lib/registry/feed-stream.mjs.map +1 -1
  255. package/dist/lib/registry/index.mjs +0 -6
  256. package/dist/lib/registry/index.mjs.map +1 -1
  257. package/dist/lib/registry/property-registry.mjs +0 -6
  258. package/dist/lib/registry/property-registry.mjs.map +1 -1
  259. package/dist/lib/registry/sync.mjs +0 -6
  260. package/dist/lib/registry/sync.mjs.map +1 -1
  261. package/dist/lib/registry/types.generated.mjs +0 -6
  262. package/dist/lib/registry/types.mjs +0 -6
  263. package/dist/lib/schemas/index.mjs +0 -6
  264. package/dist/lib/schemas/index.mjs.map +1 -1
  265. package/dist/lib/schemas-data/v2.5/_provenance.json +1 -1
  266. package/dist/lib/server/a2a-adapter.mjs +0 -6
  267. package/dist/lib/server/a2a-adapter.mjs.map +1 -1
  268. package/dist/lib/server/account-mode.mjs +0 -6
  269. package/dist/lib/server/account-mode.mjs.map +1 -1
  270. package/dist/lib/server/adcp-server.mjs +0 -6
  271. package/dist/lib/server/adcp-server.mjs.map +1 -1
  272. package/dist/lib/server/auth-introspection.mjs +0 -6
  273. package/dist/lib/server/auth-introspection.mjs.map +1 -1
  274. package/dist/lib/server/auth-signature.mjs +0 -6
  275. package/dist/lib/server/auth-signature.mjs.map +1 -1
  276. package/dist/lib/server/auth.mjs +0 -6
  277. package/dist/lib/server/auth.mjs.map +1 -1
  278. package/dist/lib/server/create-adcp-server.mjs +0 -6
  279. package/dist/lib/server/create-adcp-server.mjs.map +1 -1
  280. package/dist/lib/server/credential-policy.mjs +0 -6
  281. package/dist/lib/server/credential-policy.mjs.map +1 -1
  282. package/dist/lib/server/ctx-metadata/backends/memory.mjs +0 -6
  283. package/dist/lib/server/ctx-metadata/backends/memory.mjs.map +1 -1
  284. package/dist/lib/server/ctx-metadata/backends/pg.mjs +0 -6
  285. package/dist/lib/server/ctx-metadata/backends/pg.mjs.map +1 -1
  286. package/dist/lib/server/ctx-metadata/backends/redis.mjs +0 -6
  287. package/dist/lib/server/ctx-metadata/backends/redis.mjs.map +1 -1
  288. package/dist/lib/server/ctx-metadata/index.mjs +0 -6
  289. package/dist/lib/server/ctx-metadata/index.mjs.map +1 -1
  290. package/dist/lib/server/ctx-metadata/store.mjs +0 -6
  291. package/dist/lib/server/ctx-metadata/store.mjs.map +1 -1
  292. package/dist/lib/server/ctx-metadata/wire-shape.mjs +0 -6
  293. package/dist/lib/server/ctx-metadata/wire-shape.mjs.map +1 -1
  294. package/dist/lib/server/decisioning/account.mjs +0 -6
  295. package/dist/lib/server/decisioning/account.mjs.map +1 -1
  296. package/dist/lib/server/decisioning/admin-router.mjs +0 -6
  297. package/dist/lib/server/decisioning/admin-router.mjs.map +1 -1
  298. package/dist/lib/server/decisioning/assembly-helpers.mjs +0 -6
  299. package/dist/lib/server/decisioning/assembly-helpers.mjs.map +1 -1
  300. package/dist/lib/server/decisioning/async-outcome.mjs +0 -6
  301. package/dist/lib/server/decisioning/async-outcome.mjs.map +1 -1
  302. package/dist/lib/server/decisioning/buyer-agent.mjs +0 -6
  303. package/dist/lib/server/decisioning/buyer-agent.mjs.map +1 -1
  304. package/dist/lib/server/decisioning/capabilities.mjs +0 -6
  305. package/dist/lib/server/decisioning/capabilities.mjs.map +1 -1
  306. package/dist/lib/server/decisioning/compose.mjs +0 -6
  307. package/dist/lib/server/decisioning/compose.mjs.map +1 -1
  308. package/dist/lib/server/decisioning/context.mjs +0 -6
  309. package/dist/lib/server/decisioning/errors-typed.mjs +0 -6
  310. package/dist/lib/server/decisioning/errors-typed.mjs.map +1 -1
  311. package/dist/lib/server/decisioning/helpers.mjs +0 -6
  312. package/dist/lib/server/decisioning/helpers.mjs.map +1 -1
  313. package/dist/lib/server/decisioning/index.mjs +0 -6
  314. package/dist/lib/server/decisioning/index.mjs.map +1 -1
  315. package/dist/lib/server/decisioning/list-helpers.mjs +0 -6
  316. package/dist/lib/server/decisioning/list-helpers.mjs.map +1 -1
  317. package/dist/lib/server/decisioning/manifest-helpers.mjs +0 -6
  318. package/dist/lib/server/decisioning/manifest-helpers.mjs.map +1 -1
  319. package/dist/lib/server/decisioning/pagination.mjs +0 -6
  320. package/dist/lib/server/decisioning/platform-helpers.mjs +0 -6
  321. package/dist/lib/server/decisioning/platform-helpers.mjs.map +1 -1
  322. package/dist/lib/server/decisioning/platform.mjs +0 -6
  323. package/dist/lib/server/decisioning/proposal/dispatch.mjs +0 -6
  324. package/dist/lib/server/decisioning/proposal/dispatch.mjs.map +1 -1
  325. package/dist/lib/server/decisioning/proposal/index.mjs +0 -6
  326. package/dist/lib/server/decisioning/proposal/index.mjs.map +1 -1
  327. package/dist/lib/server/decisioning/proposal/lifecycle.mjs +0 -6
  328. package/dist/lib/server/decisioning/proposal/lifecycle.mjs.map +1 -1
  329. package/dist/lib/server/decisioning/proposal/mock-manager.mjs +0 -6
  330. package/dist/lib/server/decisioning/proposal/mock-manager.mjs.map +1 -1
  331. package/dist/lib/server/decisioning/proposal/store.mjs +0 -6
  332. package/dist/lib/server/decisioning/proposal/store.mjs.map +1 -1
  333. package/dist/lib/server/decisioning/proposal/types.mjs +0 -6
  334. package/dist/lib/server/decisioning/proposal/types.mjs.map +1 -1
  335. package/dist/lib/server/decisioning/resolve-presets.mjs +0 -6
  336. package/dist/lib/server/decisioning/resolve-presets.mjs.map +1 -1
  337. package/dist/lib/server/decisioning/runtime/entity-hydration.generated.mjs +0 -6
  338. package/dist/lib/server/decisioning/runtime/entity-hydration.generated.mjs.map +1 -1
  339. package/dist/lib/server/decisioning/runtime/from-platform.mjs +0 -6
  340. package/dist/lib/server/decisioning/runtime/from-platform.mjs.map +1 -1
  341. package/dist/lib/server/decisioning/runtime/observed-modes.mjs +0 -6
  342. package/dist/lib/server/decisioning/runtime/observed-modes.mjs.map +1 -1
  343. package/dist/lib/server/decisioning/runtime/postgres-task-registry.mjs +0 -6
  344. package/dist/lib/server/decisioning/runtime/postgres-task-registry.mjs.map +1 -1
  345. package/dist/lib/server/decisioning/runtime/protocol-for-tool.mjs +0 -6
  346. package/dist/lib/server/decisioning/runtime/protocol-for-tool.mjs.map +1 -1
  347. package/dist/lib/server/decisioning/runtime/task-registry.mjs +0 -6
  348. package/dist/lib/server/decisioning/runtime/task-registry.mjs.map +1 -1
  349. package/dist/lib/server/decisioning/runtime/to-context.mjs +0 -6
  350. package/dist/lib/server/decisioning/runtime/to-context.mjs.map +1 -1
  351. package/dist/lib/server/decisioning/runtime/validate-platform.mjs +0 -6
  352. package/dist/lib/server/decisioning/runtime/validate-platform.mjs.map +1 -1
  353. package/dist/lib/server/decisioning/specialisms/audiences.mjs +0 -6
  354. package/dist/lib/server/decisioning/specialisms/brand-rights.mjs +0 -6
  355. package/dist/lib/server/decisioning/specialisms/campaign-governance.mjs +0 -6
  356. package/dist/lib/server/decisioning/specialisms/content-standards.mjs +0 -6
  357. package/dist/lib/server/decisioning/specialisms/creative-ad-server.mjs +0 -6
  358. package/dist/lib/server/decisioning/specialisms/creative.mjs +0 -6
  359. package/dist/lib/server/decisioning/specialisms/lists.mjs +0 -6
  360. package/dist/lib/server/decisioning/specialisms/sales.mjs +0 -6
  361. package/dist/lib/server/decisioning/specialisms/signals.mjs +0 -6
  362. package/dist/lib/server/decisioning/specialisms/sponsored-intelligence.mjs +0 -6
  363. package/dist/lib/server/decisioning/start-time.mjs +0 -6
  364. package/dist/lib/server/decisioning/start-time.mjs.map +1 -1
  365. package/dist/lib/server/decisioning/status-changes.mjs +0 -6
  366. package/dist/lib/server/decisioning/status-changes.mjs.map +1 -1
  367. package/dist/lib/server/decisioning/status-mappers.mjs +0 -6
  368. package/dist/lib/server/decisioning/status-mappers.mjs.map +1 -1
  369. package/dist/lib/server/decisioning/tenant-registry.mjs +0 -6
  370. package/dist/lib/server/decisioning/tenant-registry.mjs.map +1 -1
  371. package/dist/lib/server/decisioning/tenant-store.mjs +0 -6
  372. package/dist/lib/server/decisioning/tenant-store.mjs.map +1 -1
  373. package/dist/lib/server/decisioning/validate-specialisms.mjs +0 -6
  374. package/dist/lib/server/decisioning/validate-specialisms.mjs.map +1 -1
  375. package/dist/lib/server/dynamic-registry.mjs +0 -6
  376. package/dist/lib/server/dynamic-registry.mjs.map +1 -1
  377. package/dist/lib/server/envelope-allowlist.mjs +0 -6
  378. package/dist/lib/server/envelope-allowlist.mjs.map +1 -1
  379. package/dist/lib/server/error-arm-tools.mjs +5 -6
  380. package/dist/lib/server/error-arm-tools.mjs.map +1 -1
  381. package/dist/lib/server/errors.mjs +0 -6
  382. package/dist/lib/server/errors.mjs.map +1 -1
  383. package/dist/lib/server/example-tld-guard.mjs +0 -6
  384. package/dist/lib/server/example-tld-guard.mjs.map +1 -1
  385. package/dist/lib/server/express-adapter.mjs +0 -6
  386. package/dist/lib/server/express-adapter.mjs.map +1 -1
  387. package/dist/lib/server/governance.mjs +0 -6
  388. package/dist/lib/server/governance.mjs.map +1 -1
  389. package/dist/lib/server/idempotency/backends/lazy.mjs +0 -6
  390. package/dist/lib/server/idempotency/backends/lazy.mjs.map +1 -1
  391. package/dist/lib/server/idempotency/backends/memory.mjs +0 -6
  392. package/dist/lib/server/idempotency/backends/memory.mjs.map +1 -1
  393. package/dist/lib/server/idempotency/backends/pg.mjs +0 -6
  394. package/dist/lib/server/idempotency/backends/pg.mjs.map +1 -1
  395. package/dist/lib/server/idempotency/backends/redis.mjs +0 -6
  396. package/dist/lib/server/idempotency/backends/redis.mjs.map +1 -1
  397. package/dist/lib/server/idempotency/index.mjs +0 -6
  398. package/dist/lib/server/idempotency/index.mjs.map +1 -1
  399. package/dist/lib/server/idempotency/store.mjs +0 -6
  400. package/dist/lib/server/idempotency/store.mjs.map +1 -1
  401. package/dist/lib/server/index.mjs +0 -6
  402. package/dist/lib/server/index.mjs.map +1 -1
  403. package/dist/lib/server/legacy/v5/index.mjs +0 -6
  404. package/dist/lib/server/legacy/v5/index.mjs.map +1 -1
  405. package/dist/lib/server/mcp-modern-server.mjs +0 -6
  406. package/dist/lib/server/mcp-modern-server.mjs.map +1 -1
  407. package/dist/lib/server/media-buy-actions.mjs +0 -6
  408. package/dist/lib/server/media-buy-actions.mjs.map +1 -1
  409. package/dist/lib/server/media-buy-helpers.mjs +0 -6
  410. package/dist/lib/server/media-buy-helpers.mjs.map +1 -1
  411. package/dist/lib/server/media-buy-store.mjs +0 -6
  412. package/dist/lib/server/media-buy-store.mjs.map +1 -1
  413. package/dist/lib/server/normalize-errors.mjs +0 -6
  414. package/dist/lib/server/normalize-errors.mjs.map +1 -1
  415. package/dist/lib/server/operational-platform.mjs +0 -6
  416. package/dist/lib/server/operational-platform.mjs.map +1 -1
  417. package/dist/lib/server/pick-safe-details.mjs +0 -6
  418. package/dist/lib/server/pick-safe-details.mjs.map +1 -1
  419. package/dist/lib/server/pin-and-bind-fetch.mjs +0 -6
  420. package/dist/lib/server/pin-and-bind-fetch.mjs.map +1 -1
  421. package/dist/lib/server/postgres-state-store.mjs +0 -6
  422. package/dist/lib/server/postgres-state-store.mjs.map +1 -1
  423. package/dist/lib/server/postgres-task-store.mjs +0 -6
  424. package/dist/lib/server/postgres-task-store.mjs.map +1 -1
  425. package/dist/lib/server/product-defaults.mjs +0 -6
  426. package/dist/lib/server/product-defaults.mjs.map +1 -1
  427. package/dist/lib/server/redact.mjs +0 -6
  428. package/dist/lib/server/redact.mjs.map +1 -1
  429. package/dist/lib/server/responses.mjs +0 -6
  430. package/dist/lib/server/responses.mjs.map +1 -1
  431. package/dist/lib/server/serve.mjs +0 -6
  432. package/dist/lib/server/serve.mjs.map +1 -1
  433. package/dist/lib/server/socket-mode/conformance-client.mjs +0 -6
  434. package/dist/lib/server/socket-mode/conformance-client.mjs.map +1 -1
  435. package/dist/lib/server/socket-mode/index.mjs +0 -6
  436. package/dist/lib/server/socket-mode/index.mjs.map +1 -1
  437. package/dist/lib/server/socket-mode/ws-transport.mjs +0 -6
  438. package/dist/lib/server/socket-mode/ws-transport.mjs.map +1 -1
  439. package/dist/lib/server/state-machine.mjs +0 -6
  440. package/dist/lib/server/state-machine.mjs.map +1 -1
  441. package/dist/lib/server/state-store.mjs +0 -6
  442. package/dist/lib/server/state-store.mjs.map +1 -1
  443. package/dist/lib/server/structured-serialize.mjs +0 -6
  444. package/dist/lib/server/structured-serialize.mjs.map +1 -1
  445. package/dist/lib/server/targeting-helpers.mjs +0 -6
  446. package/dist/lib/server/targeting-helpers.mjs.map +1 -1
  447. package/dist/lib/server/tasks.mjs +0 -6
  448. package/dist/lib/server/tasks.mjs.map +1 -1
  449. package/dist/lib/server/test-controller-bridge.mjs +0 -6
  450. package/dist/lib/server/test-controller-bridge.mjs.map +1 -1
  451. package/dist/lib/server/test-controller.mjs +0 -6
  452. package/dist/lib/server/test-controller.mjs.map +1 -1
  453. package/dist/lib/server/upstream-helpers.mjs +0 -6
  454. package/dist/lib/server/upstream-helpers.mjs.map +1 -1
  455. package/dist/lib/server/webhook-emitter.mjs +0 -6
  456. package/dist/lib/server/webhook-emitter.mjs.map +1 -1
  457. package/dist/lib/server/wire-safe.mjs +0 -6
  458. package/dist/lib/server/wire-safe.mjs.map +1 -1
  459. package/dist/lib/server/wire-spec-fields.generated.mjs +0 -6
  460. package/dist/lib/server/wire-spec-fields.generated.mjs.map +1 -1
  461. package/dist/lib/server/wrap-envelope.mjs +0 -6
  462. package/dist/lib/server/wrap-envelope.mjs.map +1 -1
  463. package/dist/lib/signing/agent-context.mjs +0 -6
  464. package/dist/lib/signing/agent-context.mjs.map +1 -1
  465. package/dist/lib/signing/agent-fetch.mjs +0 -6
  466. package/dist/lib/signing/agent-fetch.mjs.map +1 -1
  467. package/dist/lib/signing/agent-resolver/canonicalize.mjs +0 -6
  468. package/dist/lib/signing/agent-resolver/canonicalize.mjs.map +1 -1
  469. package/dist/lib/signing/agent-resolver/capabilities-types.mjs +0 -6
  470. package/dist/lib/signing/agent-resolver/capabilities-types.mjs.map +1 -1
  471. package/dist/lib/signing/agent-resolver/consistency.mjs +0 -6
  472. package/dist/lib/signing/agent-resolver/consistency.mjs.map +1 -1
  473. package/dist/lib/signing/agent-resolver/errors.mjs +0 -6
  474. package/dist/lib/signing/agent-resolver/errors.mjs.map +1 -1
  475. package/dist/lib/signing/agent-resolver/etld.mjs +0 -6
  476. package/dist/lib/signing/agent-resolver/etld.mjs.map +1 -1
  477. package/dist/lib/signing/agent-resolver/fetch-helpers.mjs +0 -6
  478. package/dist/lib/signing/agent-resolver/fetch-helpers.mjs.map +1 -1
  479. package/dist/lib/signing/agent-resolver/index.mjs +0 -6
  480. package/dist/lib/signing/agent-resolver/index.mjs.map +1 -1
  481. package/dist/lib/signing/agent-resolver/jwks-set.mjs +0 -6
  482. package/dist/lib/signing/agent-resolver/jwks-set.mjs.map +1 -1
  483. package/dist/lib/signing/agent-resolver/resolve-agent.mjs +0 -6
  484. package/dist/lib/signing/agent-resolver/resolve-agent.mjs.map +1 -1
  485. package/dist/lib/signing/agent-resolver/select-agent.mjs +0 -6
  486. package/dist/lib/signing/agent-resolver/select-agent.mjs.map +1 -1
  487. package/dist/lib/signing/agent-resolver/strict-json.mjs +0 -6
  488. package/dist/lib/signing/agent-resolver/strict-json.mjs.map +1 -1
  489. package/dist/lib/signing/brand-jwks.mjs +0 -6
  490. package/dist/lib/signing/brand-jwks.mjs.map +1 -1
  491. package/dist/lib/signing/canonicalize.mjs +0 -6
  492. package/dist/lib/signing/canonicalize.mjs.map +1 -1
  493. package/dist/lib/signing/capability-cache.mjs +0 -6
  494. package/dist/lib/signing/capability-cache.mjs.map +1 -1
  495. package/dist/lib/signing/capability-priming.mjs +0 -6
  496. package/dist/lib/signing/capability-priming.mjs.map +1 -1
  497. package/dist/lib/signing/client.mjs +0 -6
  498. package/dist/lib/signing/client.mjs.map +1 -1
  499. package/dist/lib/signing/content-digest.mjs +0 -6
  500. package/dist/lib/signing/content-digest.mjs.map +1 -1
  501. package/dist/lib/signing/crypto.mjs +0 -6
  502. package/dist/lib/signing/crypto.mjs.map +1 -1
  503. package/dist/lib/signing/ecdsa-encoding.mjs +0 -6
  504. package/dist/lib/signing/ecdsa-encoding.mjs.map +1 -1
  505. package/dist/lib/signing/errors.mjs +0 -6
  506. package/dist/lib/signing/errors.mjs.map +1 -1
  507. package/dist/lib/signing/fetch-async.mjs +0 -6
  508. package/dist/lib/signing/fetch-async.mjs.map +1 -1
  509. package/dist/lib/signing/fetch.mjs +0 -6
  510. package/dist/lib/signing/fetch.mjs.map +1 -1
  511. package/dist/lib/signing/index.mjs +0 -6
  512. package/dist/lib/signing/index.mjs.map +1 -1
  513. package/dist/lib/signing/jwks-helpers.mjs +0 -6
  514. package/dist/lib/signing/jwks-helpers.mjs.map +1 -1
  515. package/dist/lib/signing/jwks-https.mjs +0 -6
  516. package/dist/lib/signing/jwks-https.mjs.map +1 -1
  517. package/dist/lib/signing/jwks.mjs +0 -6
  518. package/dist/lib/signing/jwks.mjs.map +1 -1
  519. package/dist/lib/signing/middleware.mjs +0 -6
  520. package/dist/lib/signing/middleware.mjs.map +1 -1
  521. package/dist/lib/signing/parser.mjs +0 -6
  522. package/dist/lib/signing/parser.mjs.map +1 -1
  523. package/dist/lib/signing/postgres-replay-store.mjs +0 -6
  524. package/dist/lib/signing/postgres-replay-store.mjs.map +1 -1
  525. package/dist/lib/signing/protocol-response.mjs +0 -6
  526. package/dist/lib/signing/protocol-response.mjs.map +1 -1
  527. package/dist/lib/signing/provider.mjs +0 -6
  528. package/dist/lib/signing/redis-replay-store.mjs +0 -6
  529. package/dist/lib/signing/redis-replay-store.mjs.map +1 -1
  530. package/dist/lib/signing/replay.mjs +0 -6
  531. package/dist/lib/signing/replay.mjs.map +1 -1
  532. package/dist/lib/signing/request-context.mjs +0 -6
  533. package/dist/lib/signing/request-context.mjs.map +1 -1
  534. package/dist/lib/signing/revocation-https.mjs +0 -6
  535. package/dist/lib/signing/revocation-https.mjs.map +1 -1
  536. package/dist/lib/signing/revocation.mjs +0 -6
  537. package/dist/lib/signing/revocation.mjs.map +1 -1
  538. package/dist/lib/signing/server.mjs +0 -6
  539. package/dist/lib/signing/server.mjs.map +1 -1
  540. package/dist/lib/signing/signer-async.mjs +0 -6
  541. package/dist/lib/signing/signer-async.mjs.map +1 -1
  542. package/dist/lib/signing/signer.mjs +0 -6
  543. package/dist/lib/signing/signer.mjs.map +1 -1
  544. package/dist/lib/signing/testing.mjs +0 -6
  545. package/dist/lib/signing/testing.mjs.map +1 -1
  546. package/dist/lib/signing/types.mjs +0 -6
  547. package/dist/lib/signing/types.mjs.map +1 -1
  548. package/dist/lib/signing/verifier.mjs +0 -6
  549. package/dist/lib/signing/verifier.mjs.map +1 -1
  550. package/dist/lib/signing/webhook-auth-detection.mjs +0 -6
  551. package/dist/lib/signing/webhook-auth-detection.mjs.map +1 -1
  552. package/dist/lib/signing/webhook-verifier.mjs +0 -6
  553. package/dist/lib/signing/webhook-verifier.mjs.map +1 -1
  554. package/dist/lib/storage/MemoryStorage.mjs +0 -6
  555. package/dist/lib/storage/MemoryStorage.mjs.map +1 -1
  556. package/dist/lib/storage/interfaces.mjs +0 -6
  557. package/dist/lib/substitution/encoder/SubstitutionEncoder.mjs +0 -6
  558. package/dist/lib/substitution/encoder/SubstitutionEncoder.mjs.map +1 -1
  559. package/dist/lib/substitution/encoder/index.mjs +0 -6
  560. package/dist/lib/substitution/encoder/index.mjs.map +1 -1
  561. package/dist/lib/substitution/index.mjs +0 -6
  562. package/dist/lib/substitution/index.mjs.map +1 -1
  563. package/dist/lib/substitution/observer/SubstitutionObserver.mjs +0 -6
  564. package/dist/lib/substitution/observer/SubstitutionObserver.mjs.map +1 -1
  565. package/dist/lib/substitution/observer/alignment.mjs +0 -6
  566. package/dist/lib/substitution/observer/alignment.mjs.map +1 -1
  567. package/dist/lib/substitution/observer/assertions.mjs +0 -6
  568. package/dist/lib/substitution/observer/assertions.mjs.map +1 -1
  569. package/dist/lib/substitution/observer/html-parser.mjs +0 -6
  570. package/dist/lib/substitution/observer/html-parser.mjs.map +1 -1
  571. package/dist/lib/substitution/observer/index.mjs +0 -6
  572. package/dist/lib/substitution/observer/index.mjs.map +1 -1
  573. package/dist/lib/substitution/observer/ssrf.mjs +0 -6
  574. package/dist/lib/substitution/observer/ssrf.mjs.map +1 -1
  575. package/dist/lib/substitution/rfc3986.mjs +0 -6
  576. package/dist/lib/substitution/rfc3986.mjs.map +1 -1
  577. package/dist/lib/substitution/translate.mjs +0 -6
  578. package/dist/lib/substitution/translate.mjs.map +1 -1
  579. package/dist/lib/substitution/types.mjs +0 -6
  580. package/dist/lib/substitution/vectors.mjs +0 -6
  581. package/dist/lib/substitution/vectors.mjs.map +1 -1
  582. package/dist/lib/testing/agent-tester.mjs +0 -6
  583. package/dist/lib/testing/agent-tester.mjs.map +1 -1
  584. package/dist/lib/testing/client.mjs +0 -6
  585. package/dist/lib/testing/client.mjs.map +1 -1
  586. package/dist/lib/testing/compliance/briefs.mjs +0 -6
  587. package/dist/lib/testing/compliance/briefs.mjs.map +1 -1
  588. package/dist/lib/testing/compliance/comply.mjs +0 -6
  589. package/dist/lib/testing/compliance/comply.mjs.map +1 -1
  590. package/dist/lib/testing/compliance/index.mjs +0 -6
  591. package/dist/lib/testing/compliance/index.mjs.map +1 -1
  592. package/dist/lib/testing/compliance/spec-conformance.mjs +0 -6
  593. package/dist/lib/testing/compliance/spec-conformance.mjs.map +1 -1
  594. package/dist/lib/testing/compliance/storyboard-tracks.mjs +0 -6
  595. package/dist/lib/testing/compliance/storyboard-tracks.mjs.map +1 -1
  596. package/dist/lib/testing/compliance/summary.mjs +0 -6
  597. package/dist/lib/testing/compliance/summary.mjs.map +1 -1
  598. package/dist/lib/testing/compliance/types.mjs +0 -6
  599. package/dist/lib/testing/comply-controller.mjs +0 -6
  600. package/dist/lib/testing/comply-controller.mjs.map +1 -1
  601. package/dist/lib/testing/controller-assertions.mjs +0 -6
  602. package/dist/lib/testing/controller-assertions.mjs.map +1 -1
  603. package/dist/lib/testing/formatter.mjs +0 -6
  604. package/dist/lib/testing/formatter.mjs.map +1 -1
  605. package/dist/lib/testing/index.mjs +0 -6
  606. package/dist/lib/testing/index.mjs.map +1 -1
  607. package/dist/lib/testing/local-agent-runner.mjs +0 -6
  608. package/dist/lib/testing/local-agent-runner.mjs.map +1 -1
  609. package/dist/lib/testing/orchestrator.mjs +0 -6
  610. package/dist/lib/testing/orchestrator.mjs.map +1 -1
  611. package/dist/lib/testing/personas/index.mjs +0 -6
  612. package/dist/lib/testing/personas/index.mjs.map +1 -1
  613. package/dist/lib/testing/scenarios/brand-rights.mjs +0 -6
  614. package/dist/lib/testing/scenarios/brand-rights.mjs.map +1 -1
  615. package/dist/lib/testing/scenarios/capabilities.mjs +0 -6
  616. package/dist/lib/testing/scenarios/capabilities.mjs.map +1 -1
  617. package/dist/lib/testing/scenarios/creative.mjs +0 -6
  618. package/dist/lib/testing/scenarios/creative.mjs.map +1 -1
  619. package/dist/lib/testing/scenarios/deterministic.mjs +0 -6
  620. package/dist/lib/testing/scenarios/deterministic.mjs.map +1 -1
  621. package/dist/lib/testing/scenarios/discovery.mjs +0 -6
  622. package/dist/lib/testing/scenarios/discovery.mjs.map +1 -1
  623. package/dist/lib/testing/scenarios/edge-cases.mjs +0 -6
  624. package/dist/lib/testing/scenarios/edge-cases.mjs.map +1 -1
  625. package/dist/lib/testing/scenarios/error-compliance.mjs +0 -6
  626. package/dist/lib/testing/scenarios/error-compliance.mjs.map +1 -1
  627. package/dist/lib/testing/scenarios/governance.mjs +0 -6
  628. package/dist/lib/testing/scenarios/governance.mjs.map +1 -1
  629. package/dist/lib/testing/scenarios/health.mjs +0 -6
  630. package/dist/lib/testing/scenarios/health.mjs.map +1 -1
  631. package/dist/lib/testing/scenarios/index.mjs +0 -6
  632. package/dist/lib/testing/scenarios/index.mjs.map +1 -1
  633. package/dist/lib/testing/scenarios/media-buy.mjs +0 -6
  634. package/dist/lib/testing/scenarios/media-buy.mjs.map +1 -1
  635. package/dist/lib/testing/scenarios/schema-compliance.mjs +0 -6
  636. package/dist/lib/testing/scenarios/schema-compliance.mjs.map +1 -1
  637. package/dist/lib/testing/scenarios/signals.mjs +0 -6
  638. package/dist/lib/testing/scenarios/signals.mjs.map +1 -1
  639. package/dist/lib/testing/scenarios/sponsored-intelligence.mjs +0 -6
  640. package/dist/lib/testing/scenarios/sponsored-intelligence.mjs.map +1 -1
  641. package/dist/lib/testing/scenarios/trusted-match.mjs +0 -6
  642. package/dist/lib/testing/scenarios/trusted-match.mjs.map +1 -1
  643. package/dist/lib/testing/seed-merge.mjs +0 -6
  644. package/dist/lib/testing/seed-merge.mjs.map +1 -1
  645. package/dist/lib/testing/storyboard/agent-routing.mjs +0 -6
  646. package/dist/lib/testing/storyboard/agent-routing.mjs.map +1 -1
  647. package/dist/lib/testing/storyboard/assertions.mjs +0 -6
  648. package/dist/lib/testing/storyboard/assertions.mjs.map +1 -1
  649. package/dist/lib/testing/storyboard/canonical-format-satisfaction.mjs +0 -6
  650. package/dist/lib/testing/storyboard/canonical-format-satisfaction.mjs.map +1 -1
  651. package/dist/lib/testing/storyboard/compliance.mjs +5 -6
  652. package/dist/lib/testing/storyboard/compliance.mjs.map +1 -1
  653. package/dist/lib/testing/storyboard/context.mjs +0 -6
  654. package/dist/lib/testing/storyboard/context.mjs.map +1 -1
  655. package/dist/lib/testing/storyboard/default-invariants.mjs +0 -6
  656. package/dist/lib/testing/storyboard/default-invariants.mjs.map +1 -1
  657. package/dist/lib/testing/storyboard/index.mjs +0 -6
  658. package/dist/lib/testing/storyboard/index.mjs.map +1 -1
  659. package/dist/lib/testing/storyboard/junit.mjs +0 -6
  660. package/dist/lib/testing/storyboard/junit.mjs.map +1 -1
  661. package/dist/lib/testing/storyboard/loader.mjs +0 -6
  662. package/dist/lib/testing/storyboard/loader.mjs.map +1 -1
  663. package/dist/lib/testing/storyboard/parallel-dispatch.mjs +0 -6
  664. package/dist/lib/testing/storyboard/parallel-dispatch.mjs.map +1 -1
  665. package/dist/lib/testing/storyboard/path.mjs +0 -6
  666. package/dist/lib/testing/storyboard/path.mjs.map +1 -1
  667. package/dist/lib/testing/storyboard/probes.mjs +0 -6
  668. package/dist/lib/testing/storyboard/probes.mjs.map +1 -1
  669. package/dist/lib/testing/storyboard/rate-limit-trip.mjs +0 -6
  670. package/dist/lib/testing/storyboard/rate-limit-trip.mjs.map +1 -1
  671. package/dist/lib/testing/storyboard/rejection-hints.mjs +0 -6
  672. package/dist/lib/testing/storyboard/rejection-hints.mjs.map +1 -1
  673. package/dist/lib/testing/storyboard/request-builder.mjs +0 -6
  674. package/dist/lib/testing/storyboard/request-builder.mjs.map +1 -1
  675. package/dist/lib/testing/storyboard/request-signing/builder.mjs +0 -6
  676. package/dist/lib/testing/storyboard/request-signing/builder.mjs.map +1 -1
  677. package/dist/lib/testing/storyboard/request-signing/grader.mjs +0 -6
  678. package/dist/lib/testing/storyboard/request-signing/grader.mjs.map +1 -1
  679. package/dist/lib/testing/storyboard/request-signing/index.mjs +0 -6
  680. package/dist/lib/testing/storyboard/request-signing/index.mjs.map +1 -1
  681. package/dist/lib/testing/storyboard/request-signing/probe-dispatch.mjs +0 -6
  682. package/dist/lib/testing/storyboard/request-signing/probe-dispatch.mjs.map +1 -1
  683. package/dist/lib/testing/storyboard/request-signing/probe.mjs +0 -6
  684. package/dist/lib/testing/storyboard/request-signing/probe.mjs.map +1 -1
  685. package/dist/lib/testing/storyboard/request-signing/synthesize.mjs +0 -6
  686. package/dist/lib/testing/storyboard/request-signing/synthesize.mjs.map +1 -1
  687. package/dist/lib/testing/storyboard/request-signing/test-kit.mjs +0 -6
  688. package/dist/lib/testing/storyboard/request-signing/test-kit.mjs.map +1 -1
  689. package/dist/lib/testing/storyboard/request-signing/types.mjs +0 -6
  690. package/dist/lib/testing/storyboard/request-signing/types.mjs.map +1 -1
  691. package/dist/lib/testing/storyboard/request-signing/vector-loader.mjs +0 -6
  692. package/dist/lib/testing/storyboard/request-signing/vector-loader.mjs.map +1 -1
  693. package/dist/lib/testing/storyboard/runner.mjs +0 -6
  694. package/dist/lib/testing/storyboard/runner.mjs.map +1 -1
  695. package/dist/lib/testing/storyboard/sandbox-entities.mjs +0 -6
  696. package/dist/lib/testing/storyboard/sandbox-entities.mjs.map +1 -1
  697. package/dist/lib/testing/storyboard/seeding.mjs +0 -6
  698. package/dist/lib/testing/storyboard/seeding.mjs.map +1 -1
  699. package/dist/lib/testing/storyboard/shape-drift-hints.mjs +0 -6
  700. package/dist/lib/testing/storyboard/shape-drift-hints.mjs.map +1 -1
  701. package/dist/lib/testing/storyboard/signer-grader/grader.mjs +0 -6
  702. package/dist/lib/testing/storyboard/signer-grader/grader.mjs.map +1 -1
  703. package/dist/lib/testing/storyboard/signer-grader/index.mjs +0 -6
  704. package/dist/lib/testing/storyboard/signer-grader/index.mjs.map +1 -1
  705. package/dist/lib/testing/storyboard/signer-grader/types.mjs +0 -6
  706. package/dist/lib/testing/storyboard/strict-validation-hints.mjs +0 -6
  707. package/dist/lib/testing/storyboard/strict-validation-hints.mjs.map +1 -1
  708. package/dist/lib/testing/storyboard/task-map.mjs +0 -6
  709. package/dist/lib/testing/storyboard/task-map.mjs.map +1 -1
  710. package/dist/lib/testing/storyboard/test-kit.mjs +0 -6
  711. package/dist/lib/testing/storyboard/test-kit.mjs.map +1 -1
  712. package/dist/lib/testing/storyboard/types.mjs +0 -6
  713. package/dist/lib/testing/storyboard/types.mjs.map +1 -1
  714. package/dist/lib/testing/storyboard/validations.mjs +0 -6
  715. package/dist/lib/testing/storyboard/validations.mjs.map +1 -1
  716. package/dist/lib/testing/storyboard/webhook-assertions.mjs +0 -6
  717. package/dist/lib/testing/storyboard/webhook-assertions.mjs.map +1 -1
  718. package/dist/lib/testing/storyboard/webhook-receiver.mjs +0 -6
  719. package/dist/lib/testing/storyboard/webhook-receiver.mjs.map +1 -1
  720. package/dist/lib/testing/stubs/governance-agent-stub.mjs +0 -6
  721. package/dist/lib/testing/stubs/governance-agent-stub.mjs.map +1 -1
  722. package/dist/lib/testing/stubs/index.mjs +0 -6
  723. package/dist/lib/testing/stubs/index.mjs.map +1 -1
  724. package/dist/lib/testing/test-controller.mjs +0 -6
  725. package/dist/lib/testing/test-controller.mjs.map +1 -1
  726. package/dist/lib/testing/test-helpers.mjs +0 -6
  727. package/dist/lib/testing/test-helpers.mjs.map +1 -1
  728. package/dist/lib/testing/types.mjs +0 -6
  729. package/dist/lib/types/adcp.mjs +0 -6
  730. package/dist/lib/types/adcp.mjs.map +1 -1
  731. package/dist/lib/types/asset-instances.mjs +0 -6
  732. package/dist/lib/types/compat.mjs +0 -6
  733. package/dist/lib/types/compat.mjs.map +1 -1
  734. package/dist/lib/types/core.generated.mjs +0 -6
  735. package/dist/lib/types/enums.generated.mjs +0 -6
  736. package/dist/lib/types/enums.generated.mjs.map +1 -1
  737. package/dist/lib/types/error-codes.mjs +0 -6
  738. package/dist/lib/types/error-codes.mjs.map +1 -1
  739. package/dist/lib/types/error-details.aliases.mjs +0 -6
  740. package/dist/lib/types/error-details.aliases.mjs.map +1 -1
  741. package/dist/lib/types/format-asset-slots.mjs +0 -6
  742. package/dist/lib/types/forward-compat-error-codes.mjs +0 -6
  743. package/dist/lib/types/forward-compat-error-codes.mjs.map +1 -1
  744. package/dist/lib/types/index.mjs +0 -6
  745. package/dist/lib/types/index.mjs.map +1 -1
  746. package/dist/lib/types/inline-enums.aliases.mjs +0 -6
  747. package/dist/lib/types/inline-enums.aliases.mjs.map +1 -1
  748. package/dist/lib/types/inline-enums.generated.mjs +0 -6
  749. package/dist/lib/types/inline-enums.generated.mjs.map +1 -1
  750. package/dist/lib/types/manifest.generated.mjs +0 -6
  751. package/dist/lib/types/manifest.generated.mjs.map +1 -1
  752. package/dist/lib/types/schemas.generated.mjs +0 -6
  753. package/dist/lib/types/schemas.generated.mjs.map +1 -1
  754. package/dist/lib/types/server-payload-aliases.mjs +0 -6
  755. package/dist/lib/types/server-payload.mjs +0 -6
  756. package/dist/lib/types/sync-rows.mjs +0 -6
  757. package/dist/lib/types/tools.generated.mjs +0 -6
  758. package/dist/lib/types/v2-5/index.mjs +0 -6
  759. package/dist/lib/types/v2-5/index.mjs.map +1 -1
  760. package/dist/lib/types/v2-5/tools.generated.mjs +0 -6
  761. package/dist/lib/types/v3-1-beta/index.mjs +0 -6
  762. package/dist/lib/types/v3-1-beta/index.mjs.map +1 -1
  763. package/dist/lib/types/v3-1-beta/tools.generated.mjs +0 -6
  764. package/dist/lib/types/wellknown-schemas.generated.mjs +0 -6
  765. package/dist/lib/types/wellknown-schemas.generated.mjs.map +1 -1
  766. package/dist/lib/upstream-recorder/constants.mjs +0 -6
  767. package/dist/lib/upstream-recorder/constants.mjs.map +1 -1
  768. package/dist/lib/upstream-recorder/index.mjs +0 -6
  769. package/dist/lib/upstream-recorder/index.mjs.map +1 -1
  770. package/dist/lib/upstream-recorder/recorder.mjs +0 -6
  771. package/dist/lib/upstream-recorder/recorder.mjs.map +1 -1
  772. package/dist/lib/upstream-recorder/types.mjs +0 -6
  773. package/dist/lib/upstream-recorder/types.mjs.map +1 -1
  774. package/dist/lib/utils/a2a-artifacts.mjs +0 -6
  775. package/dist/lib/utils/a2a-artifacts.mjs.map +1 -1
  776. package/dist/lib/utils/a2a-discovery.mjs +0 -6
  777. package/dist/lib/utils/a2a-discovery.mjs.map +1 -1
  778. package/dist/lib/utils/activation-key-builders.mjs +0 -6
  779. package/dist/lib/utils/activation-key-builders.mjs.map +1 -1
  780. package/dist/lib/utils/adcp-version-config.mjs +0 -6
  781. package/dist/lib/utils/adcp-version-config.mjs.map +1 -1
  782. package/dist/lib/utils/asset-builders.mjs +0 -6
  783. package/dist/lib/utils/asset-builders.mjs.map +1 -1
  784. package/dist/lib/utils/build-creative-return-builders.mjs +0 -6
  785. package/dist/lib/utils/build-creative-return-builders.mjs.map +1 -1
  786. package/dist/lib/utils/buyer-retry-policy.mjs +0 -6
  787. package/dist/lib/utils/buyer-retry-policy.mjs.map +1 -1
  788. package/dist/lib/utils/capabilities.mjs +0 -6
  789. package/dist/lib/utils/capabilities.mjs.map +1 -1
  790. package/dist/lib/utils/capability-rollups.mjs +0 -6
  791. package/dist/lib/utils/capability-rollups.mjs.map +1 -1
  792. package/dist/lib/utils/creative-adapter.mjs +0 -6
  793. package/dist/lib/utils/creative-adapter.mjs.map +1 -1
  794. package/dist/lib/utils/creative-delivery.mjs +0 -6
  795. package/dist/lib/utils/creative-delivery.mjs.map +1 -1
  796. package/dist/lib/utils/deprecation.mjs +0 -6
  797. package/dist/lib/utils/deprecation.mjs.map +1 -1
  798. package/dist/lib/utils/envelope-status-compat.mjs +0 -6
  799. package/dist/lib/utils/envelope-status-compat.mjs.map +1 -1
  800. package/dist/lib/utils/error-extraction.mjs +0 -6
  801. package/dist/lib/utils/error-extraction.mjs.map +1 -1
  802. package/dist/lib/utils/extract-result.mjs +0 -6
  803. package/dist/lib/utils/extract-result.mjs.map +1 -1
  804. package/dist/lib/utils/format-asset-slot-builders.mjs +0 -6
  805. package/dist/lib/utils/format-asset-slot-builders.mjs.map +1 -1
  806. package/dist/lib/utils/format-assets.mjs +0 -6
  807. package/dist/lib/utils/format-assets.mjs.map +1 -1
  808. package/dist/lib/utils/format-render-builders.mjs +0 -6
  809. package/dist/lib/utils/format-render-builders.mjs.map +1 -1
  810. package/dist/lib/utils/format-renders.mjs +0 -6
  811. package/dist/lib/utils/format-renders.mjs.map +1 -1
  812. package/dist/lib/utils/get-products-cache-scope.mjs +0 -6
  813. package/dist/lib/utils/get-products-cache-scope.mjs.map +1 -1
  814. package/dist/lib/utils/glob.mjs +0 -6
  815. package/dist/lib/utils/glob.mjs.map +1 -1
  816. package/dist/lib/utils/global-async-local-storage.mjs +0 -6
  817. package/dist/lib/utils/global-async-local-storage.mjs.map +1 -1
  818. package/dist/lib/utils/idempotency.mjs +0 -6
  819. package/dist/lib/utils/idempotency.mjs.map +1 -1
  820. package/dist/lib/utils/index.mjs +0 -6
  821. package/dist/lib/utils/index.mjs.map +1 -1
  822. package/dist/lib/utils/jcs.mjs +0 -6
  823. package/dist/lib/utils/jcs.mjs.map +1 -1
  824. package/dist/lib/utils/json-depth.mjs +0 -6
  825. package/dist/lib/utils/json-depth.mjs.map +1 -1
  826. package/dist/lib/utils/logger.mjs +0 -6
  827. package/dist/lib/utils/logger.mjs.map +1 -1
  828. package/dist/lib/utils/media-buy-delivery-notification-builders.mjs +0 -6
  829. package/dist/lib/utils/media-buy-delivery-notification-builders.mjs.map +1 -1
  830. package/dist/lib/utils/media-buy-status.mjs +0 -6
  831. package/dist/lib/utils/media-buy-status.mjs.map +1 -1
  832. package/dist/lib/utils/pagination.mjs +0 -6
  833. package/dist/lib/utils/pagination.mjs.map +1 -1
  834. package/dist/lib/utils/preview-creative-builders.mjs +0 -6
  835. package/dist/lib/utils/preview-creative-builders.mjs.map +1 -1
  836. package/dist/lib/utils/preview-normalizer.mjs +0 -6
  837. package/dist/lib/utils/preview-normalizer.mjs.map +1 -1
  838. package/dist/lib/utils/preview-utils.mjs +0 -6
  839. package/dist/lib/utils/preview-utils.mjs.map +1 -1
  840. package/dist/lib/utils/pricing-adapter.mjs +0 -6
  841. package/dist/lib/utils/pricing-adapter.mjs.map +1 -1
  842. package/dist/lib/utils/probe-policy.mjs +0 -6
  843. package/dist/lib/utils/probe-policy.mjs.map +1 -1
  844. package/dist/lib/utils/protocol-detection.mjs +0 -6
  845. package/dist/lib/utils/protocol-detection.mjs.map +1 -1
  846. package/dist/lib/utils/redact-secrets.mjs +0 -6
  847. package/dist/lib/utils/redact-secrets.mjs.map +1 -1
  848. package/dist/lib/utils/redis-default-prefix-warn.mjs +0 -6
  849. package/dist/lib/utils/redis-default-prefix-warn.mjs.map +1 -1
  850. package/dist/lib/utils/render-builders.mjs +0 -6
  851. package/dist/lib/utils/render-builders.mjs.map +1 -1
  852. package/dist/lib/utils/request-normalizer.mjs +0 -6
  853. package/dist/lib/utils/request-normalizer.mjs.map +1 -1
  854. package/dist/lib/utils/response-schemas.mjs +0 -6
  855. package/dist/lib/utils/response-schemas.mjs.map +1 -1
  856. package/dist/lib/utils/response-unwrapper.mjs +0 -6
  857. package/dist/lib/utils/response-unwrapper.mjs.map +1 -1
  858. package/dist/lib/utils/retry.mjs +0 -6
  859. package/dist/lib/utils/retry.mjs.map +1 -1
  860. package/dist/lib/utils/signal-discovery-helpers.mjs +0 -6
  861. package/dist/lib/utils/signal-discovery-helpers.mjs.map +1 -1
  862. package/dist/lib/utils/signal-id-builders.mjs +0 -6
  863. package/dist/lib/utils/signal-id-builders.mjs.map +1 -1
  864. package/dist/lib/utils/sync-creatives-adapter.mjs +0 -6
  865. package/dist/lib/utils/sync-creatives-adapter.mjs.map +1 -1
  866. package/dist/lib/utils/task-state.mjs +0 -6
  867. package/dist/lib/utils/task-state.mjs.map +1 -1
  868. package/dist/lib/utils/tool-request-schemas.mjs +0 -6
  869. package/dist/lib/utils/tool-request-schemas.mjs.map +1 -1
  870. package/dist/lib/utils/typeGuards.mjs +0 -6
  871. package/dist/lib/utils/typeGuards.mjs.map +1 -1
  872. package/dist/lib/utils/union-errors.mjs +0 -6
  873. package/dist/lib/utils/union-errors.mjs.map +1 -1
  874. package/dist/lib/utils/validate-user-agent.mjs +0 -6
  875. package/dist/lib/utils/validate-user-agent.mjs.map +1 -1
  876. package/dist/lib/v2/format-schema/fetch.mjs +0 -6
  877. package/dist/lib/v2/format-schema/fetch.mjs.map +1 -1
  878. package/dist/lib/v2/format-schema/index.mjs +0 -6
  879. package/dist/lib/v2/format-schema/index.mjs.map +1 -1
  880. package/dist/lib/v2/format-schema/regex-safety.mjs +0 -6
  881. package/dist/lib/v2/format-schema/regex-safety.mjs.map +1 -1
  882. package/dist/lib/v2/format-schema/resolver.mjs +7 -8
  883. package/dist/lib/v2/format-schema/resolver.mjs.map +1 -1
  884. package/dist/lib/v2/format-schema/sandbox-refs.mjs +0 -6
  885. package/dist/lib/v2/format-schema/sandbox-refs.mjs.map +1 -1
  886. package/dist/lib/v2/projection/augment-response.mjs +0 -6
  887. package/dist/lib/v2/projection/augment-response.mjs.map +1 -1
  888. package/dist/lib/v2/projection/builders.mjs +0 -6
  889. package/dist/lib/v2/projection/builders.mjs.map +1 -1
  890. package/dist/lib/v2/projection/cache-versions.mjs +0 -6
  891. package/dist/lib/v2/projection/cache-versions.mjs.map +1 -1
  892. package/dist/lib/v2/projection/canonical-properties.mjs +5 -6
  893. package/dist/lib/v2/projection/canonical-properties.mjs.map +1 -1
  894. package/dist/lib/v2/projection/catalog.mjs +5 -6
  895. package/dist/lib/v2/projection/catalog.mjs.map +1 -1
  896. package/dist/lib/v2/projection/constants.mjs +0 -6
  897. package/dist/lib/v2/projection/constants.mjs.map +1 -1
  898. package/dist/lib/v2/projection/index.mjs +0 -6
  899. package/dist/lib/v2/projection/index.mjs.map +1 -1
  900. package/dist/lib/v2/projection/registry.mjs +5 -6
  901. package/dist/lib/v2/projection/registry.mjs.map +1 -1
  902. package/dist/lib/v2/projection/types.mjs +0 -6
  903. package/dist/lib/v2/projection/v1-to-v2.mjs +0 -6
  904. package/dist/lib/v2/projection/v1-to-v2.mjs.map +1 -1
  905. package/dist/lib/v2/projection/v2-to-v1.mjs +0 -6
  906. package/dist/lib/v2/projection/v2-to-v1.mjs.map +1 -1
  907. package/dist/lib/v2/projection/write-side.mjs +0 -6
  908. package/dist/lib/v2/projection/write-side.mjs.map +1 -1
  909. package/dist/lib/v2/publisher-catalog/formats.mjs +0 -6
  910. package/dist/lib/v2/publisher-catalog/formats.mjs.map +1 -1
  911. package/dist/lib/v2/publisher-catalog/index.mjs +0 -6
  912. package/dist/lib/v2/publisher-catalog/index.mjs.map +1 -1
  913. package/dist/lib/validation/client-hooks.mjs +0 -6
  914. package/dist/lib/validation/client-hooks.mjs.map +1 -1
  915. package/dist/lib/validation/hints.mjs +0 -6
  916. package/dist/lib/validation/hints.mjs.map +1 -1
  917. package/dist/lib/validation/index.mjs +0 -6
  918. package/dist/lib/validation/index.mjs.map +1 -1
  919. package/dist/lib/validation/schema-errors.mjs +0 -6
  920. package/dist/lib/validation/schema-errors.mjs.map +1 -1
  921. package/dist/lib/validation/schema-loader.mjs +5 -6
  922. package/dist/lib/validation/schema-loader.mjs.map +1 -1
  923. package/dist/lib/validation/schema-validator.mjs +0 -6
  924. package/dist/lib/validation/schema-validator.mjs.map +1 -1
  925. package/dist/lib/validation/sync-creatives.mjs +0 -6
  926. package/dist/lib/validation/sync-creatives.mjs.map +1 -1
  927. package/dist/lib/version.d.mts +3 -3
  928. package/dist/lib/version.d.ts +3 -3
  929. package/dist/lib/version.js +3 -3
  930. package/dist/lib/version.js.map +1 -1
  931. package/dist/lib/version.mjs +3 -9
  932. package/dist/lib/version.mjs.map +1 -1
  933. package/dist/lib/webhooks/index.mjs +0 -6
  934. package/dist/lib/webhooks/index.mjs.map +1 -1
  935. package/dist/lib/wholesale-feed-sync/index.mjs +0 -6
  936. package/dist/lib/wholesale-feed-sync/index.mjs.map +1 -1
  937. package/dist/lib/wholesale-feed-sync/sync.mjs +0 -6
  938. package/dist/lib/wholesale-feed-sync/sync.mjs.map +1 -1
  939. package/dist/lib/wholesale-feed-sync/types.mjs +0 -6
  940. package/dist/lib/wholesale-feed-sync/webhook-notification.mjs +0 -6
  941. package/dist/lib/wholesale-feed-sync/webhook-notification.mjs.map +1 -1
  942. package/package.json +2 -1
@@ -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
  class MockProposalManager {
8
2
  capabilities;
9
3
  url;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/lib/server/decisioning/proposal/mock-manager.ts"],"sourcesContent":["/**\n * MockProposalManager — v1 default forwarder.\n *\n * Symmetric with the mock-mode dispatch pattern adopters use to point\n * `DecisioningPlatform` upstreams at a running `bin/adcp.js mock-server`.\n * Adopters who don't yet have proposal logic of their own start with this\n * class pointed at the appropriate mock-server specialism; their first\n * working seller agent runs against the mock fixtures with zero adopter\n * code on the proposal side. They implement their own\n * {@link ProposalManager} subtype incrementally as they replace\n * mock-served slices with real assembly logic.\n *\n * The mock-server lifecycle is **not** managed by the SDK. Adopters or CI\n * start it as needed (`bin/adcp.js mock-server sales-non-guaranteed`) and\n * pass the resulting URL to this class's constructor.\n *\n * Ports `adcp-client-python.src/adcp/decisioning/proposal_manager.py`'s\n * `MockProposalManager` (PR #504).\n *\n * **Runtime requirement**: uses `globalThis.fetch`, which lands as a built-in\n * on Node 20+ (the package declares `\"engines\": { \"node\": \">=20.0.0\" }`).\n * Adopters running on older Node, on Bun without the global, or in any\n * environment without a global `fetch` should pass an explicit `fetch`\n * implementation via the `fetch` constructor option.\n *\n * @public\n * @packageDocumentation\n */\n\nimport type { Account } from '../account';\nimport type { RequestContext } from '../context';\nimport type { GetProductsRequest } from '../../../types/tools.generated';\nimport type {\n ProposalCapabilities,\n ProposalGetProductsPayload,\n ProposalManager,\n ProposalSalesSpecialism,\n Recipe,\n} from './types';\n\n/**\n * Construction options for {@link MockProposalManager}.\n *\n * @public\n */\nexport interface MockProposalManagerOptions {\n /**\n * URL of the running mock-server. The forwarder POSTs\n * `GetProductsRequest` payloads to `${mockUpstreamUrl}/get_products`\n * and (when refine is enabled) `${mockUpstreamUrl}/refine_products`.\n *\n * Required and non-empty.\n */\n mockUpstreamUrl: string;\n\n /**\n * Which sales specialism this mock manager serves. Defaults to\n * `sales-non-guaranteed` (the catalog-style mock-server fixture).\n * Adopters wiring a guaranteed mock pass `sales-guaranteed` so the\n * framework's capability projection matches the fixtures.\n */\n salesSpecialism?: ProposalSalesSpecialism;\n\n /**\n * When true, the manager declares `refine` capability and forwards\n * `buying_mode: 'refine'` requests to `/refine_products`. Default\n * false — the framework falls through to `getProducts` for refine.\n */\n refine?: boolean;\n\n /**\n * Headers forwarded on every mock-server request (e.g. `X-Tenant-Id`).\n */\n defaultHeaders?: Readonly<Record<string, string>>;\n\n /**\n * Per-request timeout in milliseconds. Default 30 seconds.\n */\n timeoutMs?: number;\n\n /**\n * Optional `fetch` override for testing. Defaults to the global\n * `fetch` (Node 18+).\n */\n fetch?: typeof globalThis.fetch;\n}\n\n/**\n * v1 default forwarder. Dispatches `getProducts` / `refineProducts` to\n * a running mock-server.\n *\n * @public\n */\nexport class MockProposalManager<TRecipe extends Recipe = Recipe, TCtxMeta = unknown> implements ProposalManager<\n TRecipe,\n TCtxMeta\n> {\n readonly capabilities: ProposalCapabilities;\n private readonly url: string;\n private readonly headers: Readonly<Record<string, string>>;\n private readonly timeoutMs: number;\n private readonly fetchImpl: typeof globalThis.fetch;\n\n constructor(options: MockProposalManagerOptions) {\n if (!options.mockUpstreamUrl || typeof options.mockUpstreamUrl !== 'string') {\n throw new Error(\n 'MockProposalManager requires a non-empty `mockUpstreamUrl` pointing at a ' +\n 'running `bin/adcp.js mock-server <specialism>` instance.'\n );\n }\n this.capabilities = {\n salesSpecialism: options.salesSpecialism ?? 'sales-non-guaranteed',\n refine: options.refine ?? false,\n };\n // Strip trailing slashes (loop-based, not regex) so we keep\n // `${url}/get_products` clean without a quantifier-and-anchor\n // pattern CodeQL flags as polynomial-ReDoS-adjacent.\n let trimmed = options.mockUpstreamUrl;\n while (trimmed.endsWith('/')) trimmed = trimmed.slice(0, -1);\n this.url = trimmed;\n this.headers = options.defaultHeaders ?? {};\n this.timeoutMs = options.timeoutMs ?? 30_000;\n this.fetchImpl = options.fetch ?? globalThis.fetch;\n }\n\n /** The configured mock-server URL — useful for diagnostics. */\n get mockUpstreamUrl(): string {\n return this.url;\n }\n\n async getProducts(\n req: GetProductsRequest,\n _ctx: RequestContext<Account<TCtxMeta>>\n ): Promise<ProposalGetProductsPayload> {\n return this.forward('/get_products', req);\n }\n\n async refineProducts(\n req: GetProductsRequest,\n _ctx: RequestContext<Account<TCtxMeta>>\n ): Promise<ProposalGetProductsPayload> {\n if (!this.capabilities.refine) {\n // Adopter wired the manager without refine but the framework\n // dispatched here anyway — surface the inconsistency rather than\n // silently forwarding.\n throw new Error(\n 'MockProposalManager.refineProducts called but capabilities.refine is false. ' +\n 'Pass `refine: true` to the constructor to enable refine forwarding.'\n );\n }\n return this.forward('/refine_products', req);\n }\n\n private async forward(path: string, body: unknown): Promise<ProposalGetProductsPayload> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeoutMs);\n try {\n const response = await this.fetchImpl(`${this.url}${path}`, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n accept: 'application/json',\n ...this.headers,\n },\n body: JSON.stringify(body),\n signal: controller.signal,\n });\n if (!response.ok) {\n const text = await response.text().catch(() => '');\n throw new Error(\n `MockProposalManager: mock-server returned ${response.status} for ${path}` +\n (text ? `: ${text.slice(0, 500)}` : '')\n );\n }\n const json = (await response.json()) as ProposalGetProductsPayload;\n return json;\n } finally {\n clearTimeout(timer);\n }\n }\n}\n"],"mappings":";;;;;;AA6FO,MAAM,oBAGX;AAAA,EACS;AAAA,EACQ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEjB,YAAY,SAAqC;AAC/C,QAAI,CAAC,QAAQ,mBAAmB,OAAO,QAAQ,oBAAoB,UAAU;AAC3E,YAAM,IAAI;AAAA,QACR;AAAA,MAEF;AAAA,IACF;AACA,SAAK,eAAe;AAAA,MAClB,iBAAiB,QAAQ,mBAAmB;AAAA,MAC5C,QAAQ,QAAQ,UAAU;AAAA,IAC5B;AAIA,QAAI,UAAU,QAAQ;AACtB,WAAO,QAAQ,SAAS,GAAG,EAAG,WAAU,QAAQ,MAAM,GAAG,EAAE;AAC3D,SAAK,MAAM;AACX,SAAK,UAAU,QAAQ,kBAAkB,CAAC;AAC1C,SAAK,YAAY,QAAQ,aAAa;AACtC,SAAK,YAAY,QAAQ,SAAS,WAAW;AAAA,EAC/C;AAAA;AAAA,EAGA,IAAI,kBAA0B;AAC5B,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,YACJ,KACA,MACqC;AACrC,WAAO,KAAK,QAAQ,iBAAiB,GAAG;AAAA,EAC1C;AAAA,EAEA,MAAM,eACJ,KACA,MACqC;AACrC,QAAI,CAAC,KAAK,aAAa,QAAQ;AAI7B,YAAM,IAAI;AAAA,QACR;AAAA,MAEF;AAAA,IACF;AACA,WAAO,KAAK,QAAQ,oBAAoB,GAAG;AAAA,EAC7C;AAAA,EAEA,MAAc,QAAQ,MAAc,MAAoD;AACtF,UAAM,aAAa,IAAI,gBAAgB;AACvC,UAAM,QAAQ,WAAW,MAAM,WAAW,MAAM,GAAG,KAAK,SAAS;AACjE,QAAI;AACF,YAAM,WAAW,MAAM,KAAK,UAAU,GAAG,KAAK,GAAG,GAAG,IAAI,IAAI;AAAA,QAC1D,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,UAChB,QAAQ;AAAA,UACR,GAAG,KAAK;AAAA,QACV;AAAA,QACA,MAAM,KAAK,UAAU,IAAI;AAAA,QACzB,QAAQ,WAAW;AAAA,MACrB,CAAC;AACD,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,OAAO,MAAM,SAAS,KAAK,EAAE,MAAM,MAAM,EAAE;AACjD,cAAM,IAAI;AAAA,UACR,6CAA6C,SAAS,MAAM,QAAQ,IAAI,MACrE,OAAO,KAAK,KAAK,MAAM,GAAG,GAAG,CAAC,KAAK;AAAA,QACxC;AAAA,MACF;AACA,YAAM,OAAQ,MAAM,SAAS,KAAK;AAClC,aAAO;AAAA,IACT,UAAE;AACA,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF;AACF;","names":[]}
1
+ {"version":3,"sources":["../../../../../src/lib/server/decisioning/proposal/mock-manager.ts"],"sourcesContent":["/**\n * MockProposalManager — v1 default forwarder.\n *\n * Symmetric with the mock-mode dispatch pattern adopters use to point\n * `DecisioningPlatform` upstreams at a running `bin/adcp.js mock-server`.\n * Adopters who don't yet have proposal logic of their own start with this\n * class pointed at the appropriate mock-server specialism; their first\n * working seller agent runs against the mock fixtures with zero adopter\n * code on the proposal side. They implement their own\n * {@link ProposalManager} subtype incrementally as they replace\n * mock-served slices with real assembly logic.\n *\n * The mock-server lifecycle is **not** managed by the SDK. Adopters or CI\n * start it as needed (`bin/adcp.js mock-server sales-non-guaranteed`) and\n * pass the resulting URL to this class's constructor.\n *\n * Ports `adcp-client-python.src/adcp/decisioning/proposal_manager.py`'s\n * `MockProposalManager` (PR #504).\n *\n * **Runtime requirement**: uses `globalThis.fetch`, which lands as a built-in\n * on Node 20+ (the package declares `\"engines\": { \"node\": \">=20.0.0\" }`).\n * Adopters running on older Node, on Bun without the global, or in any\n * environment without a global `fetch` should pass an explicit `fetch`\n * implementation via the `fetch` constructor option.\n *\n * @public\n * @packageDocumentation\n */\n\nimport type { Account } from '../account';\nimport type { RequestContext } from '../context';\nimport type { GetProductsRequest } from '../../../types/tools.generated';\nimport type {\n ProposalCapabilities,\n ProposalGetProductsPayload,\n ProposalManager,\n ProposalSalesSpecialism,\n Recipe,\n} from './types';\n\n/**\n * Construction options for {@link MockProposalManager}.\n *\n * @public\n */\nexport interface MockProposalManagerOptions {\n /**\n * URL of the running mock-server. The forwarder POSTs\n * `GetProductsRequest` payloads to `${mockUpstreamUrl}/get_products`\n * and (when refine is enabled) `${mockUpstreamUrl}/refine_products`.\n *\n * Required and non-empty.\n */\n mockUpstreamUrl: string;\n\n /**\n * Which sales specialism this mock manager serves. Defaults to\n * `sales-non-guaranteed` (the catalog-style mock-server fixture).\n * Adopters wiring a guaranteed mock pass `sales-guaranteed` so the\n * framework's capability projection matches the fixtures.\n */\n salesSpecialism?: ProposalSalesSpecialism;\n\n /**\n * When true, the manager declares `refine` capability and forwards\n * `buying_mode: 'refine'` requests to `/refine_products`. Default\n * false — the framework falls through to `getProducts` for refine.\n */\n refine?: boolean;\n\n /**\n * Headers forwarded on every mock-server request (e.g. `X-Tenant-Id`).\n */\n defaultHeaders?: Readonly<Record<string, string>>;\n\n /**\n * Per-request timeout in milliseconds. Default 30 seconds.\n */\n timeoutMs?: number;\n\n /**\n * Optional `fetch` override for testing. Defaults to the global\n * `fetch` (Node 18+).\n */\n fetch?: typeof globalThis.fetch;\n}\n\n/**\n * v1 default forwarder. Dispatches `getProducts` / `refineProducts` to\n * a running mock-server.\n *\n * @public\n */\nexport class MockProposalManager<TRecipe extends Recipe = Recipe, TCtxMeta = unknown> implements ProposalManager<\n TRecipe,\n TCtxMeta\n> {\n readonly capabilities: ProposalCapabilities;\n private readonly url: string;\n private readonly headers: Readonly<Record<string, string>>;\n private readonly timeoutMs: number;\n private readonly fetchImpl: typeof globalThis.fetch;\n\n constructor(options: MockProposalManagerOptions) {\n if (!options.mockUpstreamUrl || typeof options.mockUpstreamUrl !== 'string') {\n throw new Error(\n 'MockProposalManager requires a non-empty `mockUpstreamUrl` pointing at a ' +\n 'running `bin/adcp.js mock-server <specialism>` instance.'\n );\n }\n this.capabilities = {\n salesSpecialism: options.salesSpecialism ?? 'sales-non-guaranteed',\n refine: options.refine ?? false,\n };\n // Strip trailing slashes (loop-based, not regex) so we keep\n // `${url}/get_products` clean without a quantifier-and-anchor\n // pattern CodeQL flags as polynomial-ReDoS-adjacent.\n let trimmed = options.mockUpstreamUrl;\n while (trimmed.endsWith('/')) trimmed = trimmed.slice(0, -1);\n this.url = trimmed;\n this.headers = options.defaultHeaders ?? {};\n this.timeoutMs = options.timeoutMs ?? 30_000;\n this.fetchImpl = options.fetch ?? globalThis.fetch;\n }\n\n /** The configured mock-server URL — useful for diagnostics. */\n get mockUpstreamUrl(): string {\n return this.url;\n }\n\n async getProducts(\n req: GetProductsRequest,\n _ctx: RequestContext<Account<TCtxMeta>>\n ): Promise<ProposalGetProductsPayload> {\n return this.forward('/get_products', req);\n }\n\n async refineProducts(\n req: GetProductsRequest,\n _ctx: RequestContext<Account<TCtxMeta>>\n ): Promise<ProposalGetProductsPayload> {\n if (!this.capabilities.refine) {\n // Adopter wired the manager without refine but the framework\n // dispatched here anyway — surface the inconsistency rather than\n // silently forwarding.\n throw new Error(\n 'MockProposalManager.refineProducts called but capabilities.refine is false. ' +\n 'Pass `refine: true` to the constructor to enable refine forwarding.'\n );\n }\n return this.forward('/refine_products', req);\n }\n\n private async forward(path: string, body: unknown): Promise<ProposalGetProductsPayload> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeoutMs);\n try {\n const response = await this.fetchImpl(`${this.url}${path}`, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n accept: 'application/json',\n ...this.headers,\n },\n body: JSON.stringify(body),\n signal: controller.signal,\n });\n if (!response.ok) {\n const text = await response.text().catch(() => '');\n throw new Error(\n `MockProposalManager: mock-server returned ${response.status} for ${path}` +\n (text ? `: ${text.slice(0, 500)}` : '')\n );\n }\n const json = (await response.json()) as ProposalGetProductsPayload;\n return json;\n } finally {\n clearTimeout(timer);\n }\n }\n}\n"],"mappings":"AA6FO,MAAM,oBAGX;AAAA,EACS;AAAA,EACQ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEjB,YAAY,SAAqC;AAC/C,QAAI,CAAC,QAAQ,mBAAmB,OAAO,QAAQ,oBAAoB,UAAU;AAC3E,YAAM,IAAI;AAAA,QACR;AAAA,MAEF;AAAA,IACF;AACA,SAAK,eAAe;AAAA,MAClB,iBAAiB,QAAQ,mBAAmB;AAAA,MAC5C,QAAQ,QAAQ,UAAU;AAAA,IAC5B;AAIA,QAAI,UAAU,QAAQ;AACtB,WAAO,QAAQ,SAAS,GAAG,EAAG,WAAU,QAAQ,MAAM,GAAG,EAAE;AAC3D,SAAK,MAAM;AACX,SAAK,UAAU,QAAQ,kBAAkB,CAAC;AAC1C,SAAK,YAAY,QAAQ,aAAa;AACtC,SAAK,YAAY,QAAQ,SAAS,WAAW;AAAA,EAC/C;AAAA;AAAA,EAGA,IAAI,kBAA0B;AAC5B,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,YACJ,KACA,MACqC;AACrC,WAAO,KAAK,QAAQ,iBAAiB,GAAG;AAAA,EAC1C;AAAA,EAEA,MAAM,eACJ,KACA,MACqC;AACrC,QAAI,CAAC,KAAK,aAAa,QAAQ;AAI7B,YAAM,IAAI;AAAA,QACR;AAAA,MAEF;AAAA,IACF;AACA,WAAO,KAAK,QAAQ,oBAAoB,GAAG;AAAA,EAC7C;AAAA,EAEA,MAAc,QAAQ,MAAc,MAAoD;AACtF,UAAM,aAAa,IAAI,gBAAgB;AACvC,UAAM,QAAQ,WAAW,MAAM,WAAW,MAAM,GAAG,KAAK,SAAS;AACjE,QAAI;AACF,YAAM,WAAW,MAAM,KAAK,UAAU,GAAG,KAAK,GAAG,GAAG,IAAI,IAAI;AAAA,QAC1D,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,UAChB,QAAQ;AAAA,UACR,GAAG,KAAK;AAAA,QACV;AAAA,QACA,MAAM,KAAK,UAAU,IAAI;AAAA,QACzB,QAAQ,WAAW;AAAA,MACrB,CAAC;AACD,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,OAAO,MAAM,SAAS,KAAK,EAAE,MAAM,MAAM,EAAE;AACjD,cAAM,IAAI;AAAA,UACR,6CAA6C,SAAS,MAAM,QAAQ,IAAI,MACrE,OAAO,KAAK,KAAK,MAAM,GAAG,GAAG,CAAC,KAAK;AAAA,QACxC;AAAA,MACF;AACA,YAAM,OAAQ,MAAM,SAAS,KAAK;AAClC,aAAO;AAAA,IACT,UAAE;AACA,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF;AACF;","names":[]}
@@ -1,9 +1,3 @@
1
- import { fileURLToPath as __adcpFileURLToPath } from 'node:url';
2
- import { dirname as __adcpDirname } from 'node:path';
3
- import { createRequire as __adcpCreateRequire } from 'node:module';
4
- const __filename = __adcpFileURLToPath(import.meta.url);
5
- const __dirname = __adcpDirname(__filename);
6
- const require = __adcpCreateRequire(import.meta.url);
7
1
  import { AdcpError } from "../async-outcome.mjs";
8
2
  const DEFAULT_DRAFT_TTL_MS = 24 * 60 * 60 * 1e3;
9
3
  const DEFAULT_COMMITTED_GRACE_MS = 7 * 24 * 60 * 60 * 1e3;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/lib/server/decisioning/proposal/store.ts"],"sourcesContent":["/**\n * ProposalStore — per-tenant proposal lifecycle persistence.\n *\n * The single ledger for proposal recipes across the entire lifecycle:\n * draft (in-flight refine iterations) → committed (post-finalize, with\n * `expires_at` hold window) → consumed (post-`create_media_buy`).\n *\n * Ports `adcp-client-python.src/adcp/decisioning/proposal_store.py`.\n *\n * State machine the framework drives:\n *\n * ```\n * ┌──── releaseConsumption ────┐\n * ▼ │\n * putDraft ─► DRAFT ─► commit ─► COMMITTED ─► tryReserveConsumption ─► CONSUMING\n * ▲ │\n * │ │\n * (refine finalizeConsumption\n * iteration) │\n * │ ▼\n * └─ putDraft (overwrite while DRAFT) ─┘ CONSUMED\n * (terminal)\n * ```\n *\n * The `COMMITTED → CONSUMING → CONSUMED` two-phase transition prevents the\n * inventory double-spend race that a check-then-act sequence on `COMMITTED`\n * would expose. Two parallel `create_media_buy(proposal_id=X)` calls cannot\n * both reserve the proposal — the second `tryReserveConsumption` raises\n * `PROPOSAL_NOT_COMMITTED` once the first transitions the record. Adapter\n * dispatch runs against the reservation; on success the framework calls\n * `finalizeConsumption`; on failure `releaseConsumption` rolls back to\n * COMMITTED so the buyer can retry.\n *\n * Transitions outside this graph (commit-from-COMMITTED with mismatched\n * payload, finalize-from-DRAFT, etc.) throw `AdcpError` with `INTERNAL_ERROR`\n * — those are framework / adopter bugs, not buyer-facing rejections.\n *\n * @public\n * @packageDocumentation\n */\n\nimport type { MaybePromise } from '../../create-adcp-server';\nimport { AdcpError } from '../async-outcome';\nimport type { Recipe } from './types';\n\n/**\n * Lifecycle states for a stored proposal.\n *\n * No `EXPIRED` member: the framework computes expiry from\n * {@link ProposalRecord.expiresAt} + the current clock + the adopter's\n * grace window. Storing expiry as a state would create a clock-driven\n * write the framework doesn't actually need.\n *\n * @public\n */\nexport type ProposalState = 'draft' | 'committed' | 'consuming' | 'consumed';\n\n/**\n * The framework's per-proposal storage row.\n *\n * @public\n */\nexport interface ProposalRecord<TRecipe extends Recipe = Recipe> {\n /** Stable identifier the buyer receives in the `proposals[]` wire array. */\n proposalId: string;\n /** Account that owns the proposal. Drives the cross-tenant check on `get`. */\n accountId: string;\n /** Current lifecycle state. */\n state: ProposalState;\n /**\n * `productId -> Recipe` mapping. The {@link ProposalManager} returned these\n * alongside products on `getProducts` / `refineProducts`; the framework\n * persists them so `DecisioningPlatform.createMediaBuy` can hydrate\n * `ctx.recipes` from this same record.\n */\n recipes: ReadonlyMap<string, TRecipe>;\n /**\n * The wire `Proposal` shape. Stored so the framework can re-emit it on\n * refine iterations or replay it post-finalize without round-tripping\n * through the manager again.\n */\n proposalPayload: Record<string, unknown>;\n /**\n * Set on `commit`. The inventory hold window; framework rejects\n * `create_media_buy` calls past this deadline (plus the adopter's grace).\n */\n expiresAt?: Date;\n /**\n * Set on `finalizeConsumption`. The accepted proposal's terminal binding\n * to a media buy; reverse-index lookups via `getByMediaBuyId` use this.\n */\n mediaBuyId?: string;\n /**\n * Captured at `putDraft` time. Adopters whose Recipe subtypes add required\n * fields later bump the schema and write a migration (or evict pre-bump\n * records). Framework reads but does not enforce.\n */\n recipeSchemaVersion?: number;\n}\n\n/**\n * Per-tenant proposal lifecycle persistence.\n *\n * Methods may return `T` or `Promise<T>` — the framework awaits at call time.\n * Mirrors the in-tree `MediaBuyStore` posture.\n *\n * @public\n */\nexport interface ProposalStore<TRecipe extends Recipe = Recipe> {\n /**\n * Drives the production-mode gate. `false` for {@link InMemoryProposalStore};\n * `true` for adopter-supplied durable backings (Postgres / Redis).\n */\n readonly isDurable: boolean;\n\n /**\n * Store / replace a draft proposal.\n *\n * Refine iterations call this with the same `proposalId` to overwrite.\n * Calling on a record currently in COMMITTED, CONSUMING, or CONSUMED is\n * rejected.\n */\n putDraft(args: {\n proposalId: string;\n accountId: string;\n recipes: ReadonlyMap<string, TRecipe>;\n proposalPayload: Record<string, unknown>;\n }): MaybePromise<void>;\n\n /**\n * Look up a proposal record. Cross-tenant probes return `null` rather\n * than the raw record — required to defeat principal-enumeration via\n * `proposalId` probing. The dispatch path always passes the\n * authenticated principal's `accountId`.\n *\n * **`expectedAccountId` is required.** Earlier preview made it optional\n * for \"framework-internal raw read\" callers, but every call site that\n * loads a record into a buyer-visible response path needs the tenant\n * gate. Direct-debug callers that legitimately want a raw record across\n * tenants should reach for a separate operator-tool surface, not bypass\n * this gate. Closes a sharp edge an adopter would silently miss.\n */\n get(proposalId: string, args: { expectedAccountId: string }): MaybePromise<ProposalRecord<TRecipe> | null>;\n\n /**\n * Promote DRAFT → COMMITTED. Idempotent on re-call with equal `expiresAt`\n * + `proposalPayload`. A second commit with different values raises\n * `INTERNAL_ERROR`.\n */\n commit(proposalId: string, args: { expiresAt: Date; proposalPayload: Record<string, unknown> }): MaybePromise<void>;\n\n /**\n * Atomic CAS: COMMITTED → CONSUMING.\n *\n * The framework calls this BEFORE dispatching `createMediaBuy`. Holds\n * the reservation until `finalizeConsumption` (success) or\n * `releaseConsumption` (rollback). Two parallel callers cannot both\n * reserve; the loser raises `PROPOSAL_NOT_COMMITTED`. SQL-backed\n * implementations use `SELECT … FOR UPDATE` or equivalent.\n *\n * @throws AdcpError `PROPOSAL_NOT_FOUND` when no record exists,\n * `PROPOSAL_NOT_COMMITTED` when state is not COMMITTED.\n */\n tryReserveConsumption(proposalId: string, args: { expectedAccountId: string }): MaybePromise<ProposalRecord<TRecipe>>;\n\n /**\n * Promote CONSUMING → CONSUMED and record the `mediaBuyId` back-reference\n * for `getByMediaBuyId` lookups.\n */\n finalizeConsumption(proposalId: string, args: { mediaBuyId: string; expectedAccountId: string }): MaybePromise<void>;\n\n /**\n * Rollback path: CONSUMING → COMMITTED. Idempotent on a record already\n * in COMMITTED. Called when the adapter's `createMediaBuy` raises so\n * the buyer can retry without `PROPOSAL_NOT_COMMITTED`.\n */\n releaseConsumption(proposalId: string, args: { expectedAccountId: string }): MaybePromise<void>;\n\n /**\n * Discard a proposal record. Idempotent — discarding an unknown id is\n * a no-op (no throw).\n */\n discard(proposalId: string): MaybePromise<void>;\n\n /**\n * Reverse-index lookup. Hydrate the (consumed) proposal that produced\n * this `mediaBuyId` for the given tenant.\n *\n * `expectedAccountId` is required (no default) because `mediaBuyId` is\n * adopter-controlled and can collide across tenants. SQL-backed impls\n * add a uniqueness constraint on `(accountId, mediaBuyId)` where\n * `mediaBuyId IS NOT NULL`.\n */\n getByMediaBuyId(\n mediaBuyId: string,\n args: { expectedAccountId: string }\n ): MaybePromise<ProposalRecord<TRecipe> | null>;\n}\n\n// ---------------------------------------------------------------------------\n// In-memory reference implementation\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_DRAFT_TTL_MS = 24 * 60 * 60 * 1000; // 24h\nconst DEFAULT_COMMITTED_GRACE_MS = 7 * 24 * 60 * 60 * 1000; // 7 days\n\n/**\n * Construction options for {@link InMemoryProposalStore}.\n *\n * @public\n */\nexport interface InMemoryProposalStoreOptions {\n /**\n * How long a draft proposal lives without a commit before being evicted.\n * Default 24h. Pass as milliseconds.\n */\n draftTtlMs?: number;\n /**\n * How long a committed (or consumed) proposal lives past its `expiresAt`\n * before eviction. Default 7 days. Pass as milliseconds.\n */\n committedGraceMs?: number;\n /**\n * Test-injectable clock. Defaults to `() => new Date()`.\n */\n clock?: () => Date;\n}\n\n/**\n * Process-local {@link ProposalStore} reference implementation.\n *\n * Storage is a plain `Map` — JS event-loop atomicity covers the critical\n * sections (no preemption between awaits within a method body since there\n * are no awaits). Adequate for local dev, CI, and tests; production\n * deployments wire a durable backing implementing the same interface.\n *\n * Eviction:\n *\n * - Drafts older than `draftTtlMs` (default 24h) are evicted on every\n * read / write.\n * - Committed proposals more than `committedGraceMs` past `expiresAt`\n * (default 7 days) are evicted.\n *\n * Eviction runs lazily — no background timer thread.\n *\n * Cross-tenant safety: `get` and `getByMediaBuyId` honor `expectedAccountId`\n * — cross-tenant probes return `null`, not the raw record.\n *\n * @public\n */\nexport class InMemoryProposalStore<TRecipe extends Recipe = Recipe> implements ProposalStore<TRecipe> {\n readonly isDurable = false;\n\n private readonly records: Map<string, ProposalRecord<TRecipe>> = new Map();\n // Reverse index keyed by `${accountId}::${mediaBuyId}`. Tenant scoping in\n // the key prevents collisions when adopter media_buy_ids overlap across\n // tenants (sequential IDs, deterministic test fixtures).\n private readonly mediaBuyIndex: Map<string, string> = new Map();\n private readonly creationTimes: Map<string, Date> = new Map();\n private readonly draftTtlMs: number;\n private readonly committedGraceMs: number;\n private readonly clock: () => Date;\n\n constructor(options: InMemoryProposalStoreOptions = {}) {\n this.draftTtlMs = options.draftTtlMs ?? DEFAULT_DRAFT_TTL_MS;\n this.committedGraceMs = options.committedGraceMs ?? DEFAULT_COMMITTED_GRACE_MS;\n this.clock = options.clock ?? (() => new Date());\n }\n\n private mediaBuyKey(accountId: string, mediaBuyId: string): string {\n return `${accountId}::${mediaBuyId}`;\n }\n\n private evictExpired(): void {\n const now = this.clock().getTime();\n const toRemove: string[] = [];\n for (const [proposalId, record] of this.records) {\n const created = this.creationTimes.get(proposalId)?.getTime() ?? now;\n if (record.state === 'draft') {\n if (now - created > this.draftTtlMs) toRemove.push(proposalId);\n } else if (record.expiresAt) {\n const deadline = record.expiresAt.getTime() + this.committedGraceMs;\n if (now > deadline) toRemove.push(proposalId);\n }\n }\n for (const proposalId of toRemove) {\n const removed = this.records.get(proposalId);\n this.records.delete(proposalId);\n this.creationTimes.delete(proposalId);\n if (removed?.mediaBuyId) {\n this.mediaBuyIndex.delete(this.mediaBuyKey(removed.accountId, removed.mediaBuyId));\n }\n }\n }\n\n putDraft(args: {\n proposalId: string;\n accountId: string;\n recipes: ReadonlyMap<string, TRecipe>;\n proposalPayload: Record<string, unknown>;\n }): void {\n this.evictExpired();\n const existing = this.records.get(args.proposalId);\n if (existing && existing.state !== 'draft') {\n throw new AdcpError('INTERNAL_ERROR', {\n recovery: 'terminal',\n message:\n `Cannot putDraft on proposal ${JSON.stringify(args.proposalId)} in state ` +\n `${JSON.stringify(existing.state)}; refine iterations are only valid on draft ` +\n `proposals. Once committed or consumed, a proposal_id is immutable.`,\n });\n }\n const record: ProposalRecord<TRecipe> = {\n proposalId: args.proposalId,\n accountId: args.accountId,\n state: 'draft',\n recipes: new Map(args.recipes),\n proposalPayload: { ...args.proposalPayload },\n };\n this.records.set(args.proposalId, record);\n // Refine iterations preserve the original creation time so the 24h\n // draft TTL is anchored to the start of the buyer's session, not the\n // most recent iteration.\n if (!this.creationTimes.has(args.proposalId)) {\n this.creationTimes.set(args.proposalId, this.clock());\n }\n }\n\n get(proposalId: string, args: { expectedAccountId: string }): ProposalRecord<TRecipe> | null {\n this.evictExpired();\n const record = this.records.get(proposalId);\n if (!record) return null;\n if (record.accountId !== args.expectedAccountId) {\n // Cross-tenant probe — return null, not raw record.\n return null;\n }\n return record;\n }\n\n commit(proposalId: string, args: { expiresAt: Date; proposalPayload: Record<string, unknown> }): void {\n this.evictExpired();\n const record = this.records.get(proposalId);\n if (!record) {\n throw new AdcpError('INTERNAL_ERROR', {\n recovery: 'terminal',\n message:\n `Cannot commit proposal ${JSON.stringify(proposalId)}: not in store. The ` +\n `framework's finalize dispatch must putDraft before commit.`,\n });\n }\n const payload = { ...args.proposalPayload };\n if (record.state === 'committed') {\n const sameDeadline = record.expiresAt?.getTime() === args.expiresAt.getTime();\n const samePayload = JSON.stringify(record.proposalPayload) === JSON.stringify(payload);\n if (sameDeadline && samePayload) return;\n throw new AdcpError('INTERNAL_ERROR', {\n recovery: 'terminal',\n message:\n `Proposal ${JSON.stringify(proposalId)} already committed with a different ` +\n `expires_at or payload — re-commit with different values is a developer bug.`,\n });\n }\n if (record.state !== 'draft') {\n throw new AdcpError('INTERNAL_ERROR', {\n recovery: 'terminal',\n message:\n `Cannot commit proposal ${JSON.stringify(proposalId)} from state ` +\n `${JSON.stringify(record.state)}; commit requires DRAFT.`,\n });\n }\n this.records.set(proposalId, {\n ...record,\n state: 'committed',\n expiresAt: args.expiresAt,\n proposalPayload: payload,\n });\n }\n\n tryReserveConsumption(proposalId: string, args: { expectedAccountId: string }): ProposalRecord<TRecipe> {\n this.evictExpired();\n const record = this.records.get(proposalId);\n // Cross-tenant probe collapses to PROPOSAL_NOT_FOUND — same\n // principal-enumeration defense as `get`.\n if (!record || record.accountId !== args.expectedAccountId) {\n throw new AdcpError('PROPOSAL_NOT_FOUND', {\n recovery: 'correctable',\n message: `Proposal ${JSON.stringify(proposalId)} not found.`,\n field: 'proposal_id',\n });\n }\n if (record.state !== 'committed') {\n throw new AdcpError('PROPOSAL_NOT_COMMITTED', {\n recovery: 'correctable',\n message:\n `Proposal ${JSON.stringify(proposalId)} is in state ${JSON.stringify(record.state)}; ` +\n `create_media_buy requires a committed proposal that hasn't been accepted or ` +\n `reserved by another request.`,\n field: 'proposal_id',\n });\n }\n const reserved: ProposalRecord<TRecipe> = { ...record, state: 'consuming' };\n this.records.set(proposalId, reserved);\n return reserved;\n }\n\n finalizeConsumption(proposalId: string, args: { mediaBuyId: string; expectedAccountId: string }): void {\n const record = this.records.get(proposalId);\n if (!record || record.accountId !== args.expectedAccountId) {\n throw new AdcpError('INTERNAL_ERROR', {\n recovery: 'terminal',\n message: `finalizeConsumption: proposal ${JSON.stringify(proposalId)} not found for ` + `the expected tenant.`,\n });\n }\n if (record.state === 'consumed') {\n // Idempotent on already-CONSUMED with the same mediaBuyId.\n if (record.mediaBuyId === args.mediaBuyId) return;\n throw new AdcpError('INTERNAL_ERROR', {\n recovery: 'terminal',\n message:\n `Proposal ${JSON.stringify(proposalId)} already consumed by ` +\n `media_buy_id=${JSON.stringify(record.mediaBuyId)}; cannot re-consume as ` +\n `${JSON.stringify(args.mediaBuyId)}.`,\n });\n }\n if (record.state !== 'consuming') {\n throw new AdcpError('INTERNAL_ERROR', {\n recovery: 'terminal',\n message:\n `finalizeConsumption requires CONSUMING; proposal ${JSON.stringify(proposalId)} ` +\n `is in ${JSON.stringify(record.state)}. Framework must call ` +\n `tryReserveConsumption first.`,\n });\n }\n this.records.set(proposalId, {\n ...record,\n state: 'consumed',\n mediaBuyId: args.mediaBuyId,\n });\n this.mediaBuyIndex.set(this.mediaBuyKey(record.accountId, args.mediaBuyId), proposalId);\n }\n\n releaseConsumption(proposalId: string, args: { expectedAccountId: string }): void {\n const record = this.records.get(proposalId);\n if (!record || record.accountId !== args.expectedAccountId) {\n // Idempotent — releasing an unknown id is a no-op so the\n // adapter-failure rollback path can be unconditional.\n return;\n }\n if (record.state === 'committed') {\n // Already rolled back.\n return;\n }\n if (record.state !== 'consuming') {\n throw new AdcpError('INTERNAL_ERROR', {\n recovery: 'terminal',\n message:\n `releaseConsumption requires CONSUMING; proposal ${JSON.stringify(proposalId)} ` +\n `is in ${JSON.stringify(record.state)}.`,\n });\n }\n this.records.set(proposalId, { ...record, state: 'committed' });\n }\n\n discard(proposalId: string): void {\n const record = this.records.get(proposalId);\n this.records.delete(proposalId);\n this.creationTimes.delete(proposalId);\n if (record?.mediaBuyId) {\n this.mediaBuyIndex.delete(this.mediaBuyKey(record.accountId, record.mediaBuyId));\n }\n }\n\n getByMediaBuyId(mediaBuyId: string, args: { expectedAccountId: string }): ProposalRecord<TRecipe> | null {\n this.evictExpired();\n const key = this.mediaBuyKey(args.expectedAccountId, mediaBuyId);\n const proposalId = this.mediaBuyIndex.get(key);\n if (!proposalId) return null;\n const record = this.records.get(proposalId);\n if (!record) {\n // Index drift — clean up.\n this.mediaBuyIndex.delete(key);\n return null;\n }\n return record;\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../../../src/lib/server/decisioning/proposal/store.ts"],"sourcesContent":["/**\n * ProposalStore — per-tenant proposal lifecycle persistence.\n *\n * The single ledger for proposal recipes across the entire lifecycle:\n * draft (in-flight refine iterations) → committed (post-finalize, with\n * `expires_at` hold window) → consumed (post-`create_media_buy`).\n *\n * Ports `adcp-client-python.src/adcp/decisioning/proposal_store.py`.\n *\n * State machine the framework drives:\n *\n * ```\n * ┌──── releaseConsumption ────┐\n * ▼ │\n * putDraft ─► DRAFT ─► commit ─► COMMITTED ─► tryReserveConsumption ─► CONSUMING\n * ▲ │\n * │ │\n * (refine finalizeConsumption\n * iteration) │\n * │ ▼\n * └─ putDraft (overwrite while DRAFT) ─┘ CONSUMED\n * (terminal)\n * ```\n *\n * The `COMMITTED → CONSUMING → CONSUMED` two-phase transition prevents the\n * inventory double-spend race that a check-then-act sequence on `COMMITTED`\n * would expose. Two parallel `create_media_buy(proposal_id=X)` calls cannot\n * both reserve the proposal — the second `tryReserveConsumption` raises\n * `PROPOSAL_NOT_COMMITTED` once the first transitions the record. Adapter\n * dispatch runs against the reservation; on success the framework calls\n * `finalizeConsumption`; on failure `releaseConsumption` rolls back to\n * COMMITTED so the buyer can retry.\n *\n * Transitions outside this graph (commit-from-COMMITTED with mismatched\n * payload, finalize-from-DRAFT, etc.) throw `AdcpError` with `INTERNAL_ERROR`\n * — those are framework / adopter bugs, not buyer-facing rejections.\n *\n * @public\n * @packageDocumentation\n */\n\nimport type { MaybePromise } from '../../create-adcp-server';\nimport { AdcpError } from '../async-outcome';\nimport type { Recipe } from './types';\n\n/**\n * Lifecycle states for a stored proposal.\n *\n * No `EXPIRED` member: the framework computes expiry from\n * {@link ProposalRecord.expiresAt} + the current clock + the adopter's\n * grace window. Storing expiry as a state would create a clock-driven\n * write the framework doesn't actually need.\n *\n * @public\n */\nexport type ProposalState = 'draft' | 'committed' | 'consuming' | 'consumed';\n\n/**\n * The framework's per-proposal storage row.\n *\n * @public\n */\nexport interface ProposalRecord<TRecipe extends Recipe = Recipe> {\n /** Stable identifier the buyer receives in the `proposals[]` wire array. */\n proposalId: string;\n /** Account that owns the proposal. Drives the cross-tenant check on `get`. */\n accountId: string;\n /** Current lifecycle state. */\n state: ProposalState;\n /**\n * `productId -> Recipe` mapping. The {@link ProposalManager} returned these\n * alongside products on `getProducts` / `refineProducts`; the framework\n * persists them so `DecisioningPlatform.createMediaBuy` can hydrate\n * `ctx.recipes` from this same record.\n */\n recipes: ReadonlyMap<string, TRecipe>;\n /**\n * The wire `Proposal` shape. Stored so the framework can re-emit it on\n * refine iterations or replay it post-finalize without round-tripping\n * through the manager again.\n */\n proposalPayload: Record<string, unknown>;\n /**\n * Set on `commit`. The inventory hold window; framework rejects\n * `create_media_buy` calls past this deadline (plus the adopter's grace).\n */\n expiresAt?: Date;\n /**\n * Set on `finalizeConsumption`. The accepted proposal's terminal binding\n * to a media buy; reverse-index lookups via `getByMediaBuyId` use this.\n */\n mediaBuyId?: string;\n /**\n * Captured at `putDraft` time. Adopters whose Recipe subtypes add required\n * fields later bump the schema and write a migration (or evict pre-bump\n * records). Framework reads but does not enforce.\n */\n recipeSchemaVersion?: number;\n}\n\n/**\n * Per-tenant proposal lifecycle persistence.\n *\n * Methods may return `T` or `Promise<T>` — the framework awaits at call time.\n * Mirrors the in-tree `MediaBuyStore` posture.\n *\n * @public\n */\nexport interface ProposalStore<TRecipe extends Recipe = Recipe> {\n /**\n * Drives the production-mode gate. `false` for {@link InMemoryProposalStore};\n * `true` for adopter-supplied durable backings (Postgres / Redis).\n */\n readonly isDurable: boolean;\n\n /**\n * Store / replace a draft proposal.\n *\n * Refine iterations call this with the same `proposalId` to overwrite.\n * Calling on a record currently in COMMITTED, CONSUMING, or CONSUMED is\n * rejected.\n */\n putDraft(args: {\n proposalId: string;\n accountId: string;\n recipes: ReadonlyMap<string, TRecipe>;\n proposalPayload: Record<string, unknown>;\n }): MaybePromise<void>;\n\n /**\n * Look up a proposal record. Cross-tenant probes return `null` rather\n * than the raw record — required to defeat principal-enumeration via\n * `proposalId` probing. The dispatch path always passes the\n * authenticated principal's `accountId`.\n *\n * **`expectedAccountId` is required.** Earlier preview made it optional\n * for \"framework-internal raw read\" callers, but every call site that\n * loads a record into a buyer-visible response path needs the tenant\n * gate. Direct-debug callers that legitimately want a raw record across\n * tenants should reach for a separate operator-tool surface, not bypass\n * this gate. Closes a sharp edge an adopter would silently miss.\n */\n get(proposalId: string, args: { expectedAccountId: string }): MaybePromise<ProposalRecord<TRecipe> | null>;\n\n /**\n * Promote DRAFT → COMMITTED. Idempotent on re-call with equal `expiresAt`\n * + `proposalPayload`. A second commit with different values raises\n * `INTERNAL_ERROR`.\n */\n commit(proposalId: string, args: { expiresAt: Date; proposalPayload: Record<string, unknown> }): MaybePromise<void>;\n\n /**\n * Atomic CAS: COMMITTED → CONSUMING.\n *\n * The framework calls this BEFORE dispatching `createMediaBuy`. Holds\n * the reservation until `finalizeConsumption` (success) or\n * `releaseConsumption` (rollback). Two parallel callers cannot both\n * reserve; the loser raises `PROPOSAL_NOT_COMMITTED`. SQL-backed\n * implementations use `SELECT … FOR UPDATE` or equivalent.\n *\n * @throws AdcpError `PROPOSAL_NOT_FOUND` when no record exists,\n * `PROPOSAL_NOT_COMMITTED` when state is not COMMITTED.\n */\n tryReserveConsumption(proposalId: string, args: { expectedAccountId: string }): MaybePromise<ProposalRecord<TRecipe>>;\n\n /**\n * Promote CONSUMING → CONSUMED and record the `mediaBuyId` back-reference\n * for `getByMediaBuyId` lookups.\n */\n finalizeConsumption(proposalId: string, args: { mediaBuyId: string; expectedAccountId: string }): MaybePromise<void>;\n\n /**\n * Rollback path: CONSUMING → COMMITTED. Idempotent on a record already\n * in COMMITTED. Called when the adapter's `createMediaBuy` raises so\n * the buyer can retry without `PROPOSAL_NOT_COMMITTED`.\n */\n releaseConsumption(proposalId: string, args: { expectedAccountId: string }): MaybePromise<void>;\n\n /**\n * Discard a proposal record. Idempotent — discarding an unknown id is\n * a no-op (no throw).\n */\n discard(proposalId: string): MaybePromise<void>;\n\n /**\n * Reverse-index lookup. Hydrate the (consumed) proposal that produced\n * this `mediaBuyId` for the given tenant.\n *\n * `expectedAccountId` is required (no default) because `mediaBuyId` is\n * adopter-controlled and can collide across tenants. SQL-backed impls\n * add a uniqueness constraint on `(accountId, mediaBuyId)` where\n * `mediaBuyId IS NOT NULL`.\n */\n getByMediaBuyId(\n mediaBuyId: string,\n args: { expectedAccountId: string }\n ): MaybePromise<ProposalRecord<TRecipe> | null>;\n}\n\n// ---------------------------------------------------------------------------\n// In-memory reference implementation\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_DRAFT_TTL_MS = 24 * 60 * 60 * 1000; // 24h\nconst DEFAULT_COMMITTED_GRACE_MS = 7 * 24 * 60 * 60 * 1000; // 7 days\n\n/**\n * Construction options for {@link InMemoryProposalStore}.\n *\n * @public\n */\nexport interface InMemoryProposalStoreOptions {\n /**\n * How long a draft proposal lives without a commit before being evicted.\n * Default 24h. Pass as milliseconds.\n */\n draftTtlMs?: number;\n /**\n * How long a committed (or consumed) proposal lives past its `expiresAt`\n * before eviction. Default 7 days. Pass as milliseconds.\n */\n committedGraceMs?: number;\n /**\n * Test-injectable clock. Defaults to `() => new Date()`.\n */\n clock?: () => Date;\n}\n\n/**\n * Process-local {@link ProposalStore} reference implementation.\n *\n * Storage is a plain `Map` — JS event-loop atomicity covers the critical\n * sections (no preemption between awaits within a method body since there\n * are no awaits). Adequate for local dev, CI, and tests; production\n * deployments wire a durable backing implementing the same interface.\n *\n * Eviction:\n *\n * - Drafts older than `draftTtlMs` (default 24h) are evicted on every\n * read / write.\n * - Committed proposals more than `committedGraceMs` past `expiresAt`\n * (default 7 days) are evicted.\n *\n * Eviction runs lazily — no background timer thread.\n *\n * Cross-tenant safety: `get` and `getByMediaBuyId` honor `expectedAccountId`\n * — cross-tenant probes return `null`, not the raw record.\n *\n * @public\n */\nexport class InMemoryProposalStore<TRecipe extends Recipe = Recipe> implements ProposalStore<TRecipe> {\n readonly isDurable = false;\n\n private readonly records: Map<string, ProposalRecord<TRecipe>> = new Map();\n // Reverse index keyed by `${accountId}::${mediaBuyId}`. Tenant scoping in\n // the key prevents collisions when adopter media_buy_ids overlap across\n // tenants (sequential IDs, deterministic test fixtures).\n private readonly mediaBuyIndex: Map<string, string> = new Map();\n private readonly creationTimes: Map<string, Date> = new Map();\n private readonly draftTtlMs: number;\n private readonly committedGraceMs: number;\n private readonly clock: () => Date;\n\n constructor(options: InMemoryProposalStoreOptions = {}) {\n this.draftTtlMs = options.draftTtlMs ?? DEFAULT_DRAFT_TTL_MS;\n this.committedGraceMs = options.committedGraceMs ?? DEFAULT_COMMITTED_GRACE_MS;\n this.clock = options.clock ?? (() => new Date());\n }\n\n private mediaBuyKey(accountId: string, mediaBuyId: string): string {\n return `${accountId}::${mediaBuyId}`;\n }\n\n private evictExpired(): void {\n const now = this.clock().getTime();\n const toRemove: string[] = [];\n for (const [proposalId, record] of this.records) {\n const created = this.creationTimes.get(proposalId)?.getTime() ?? now;\n if (record.state === 'draft') {\n if (now - created > this.draftTtlMs) toRemove.push(proposalId);\n } else if (record.expiresAt) {\n const deadline = record.expiresAt.getTime() + this.committedGraceMs;\n if (now > deadline) toRemove.push(proposalId);\n }\n }\n for (const proposalId of toRemove) {\n const removed = this.records.get(proposalId);\n this.records.delete(proposalId);\n this.creationTimes.delete(proposalId);\n if (removed?.mediaBuyId) {\n this.mediaBuyIndex.delete(this.mediaBuyKey(removed.accountId, removed.mediaBuyId));\n }\n }\n }\n\n putDraft(args: {\n proposalId: string;\n accountId: string;\n recipes: ReadonlyMap<string, TRecipe>;\n proposalPayload: Record<string, unknown>;\n }): void {\n this.evictExpired();\n const existing = this.records.get(args.proposalId);\n if (existing && existing.state !== 'draft') {\n throw new AdcpError('INTERNAL_ERROR', {\n recovery: 'terminal',\n message:\n `Cannot putDraft on proposal ${JSON.stringify(args.proposalId)} in state ` +\n `${JSON.stringify(existing.state)}; refine iterations are only valid on draft ` +\n `proposals. Once committed or consumed, a proposal_id is immutable.`,\n });\n }\n const record: ProposalRecord<TRecipe> = {\n proposalId: args.proposalId,\n accountId: args.accountId,\n state: 'draft',\n recipes: new Map(args.recipes),\n proposalPayload: { ...args.proposalPayload },\n };\n this.records.set(args.proposalId, record);\n // Refine iterations preserve the original creation time so the 24h\n // draft TTL is anchored to the start of the buyer's session, not the\n // most recent iteration.\n if (!this.creationTimes.has(args.proposalId)) {\n this.creationTimes.set(args.proposalId, this.clock());\n }\n }\n\n get(proposalId: string, args: { expectedAccountId: string }): ProposalRecord<TRecipe> | null {\n this.evictExpired();\n const record = this.records.get(proposalId);\n if (!record) return null;\n if (record.accountId !== args.expectedAccountId) {\n // Cross-tenant probe — return null, not raw record.\n return null;\n }\n return record;\n }\n\n commit(proposalId: string, args: { expiresAt: Date; proposalPayload: Record<string, unknown> }): void {\n this.evictExpired();\n const record = this.records.get(proposalId);\n if (!record) {\n throw new AdcpError('INTERNAL_ERROR', {\n recovery: 'terminal',\n message:\n `Cannot commit proposal ${JSON.stringify(proposalId)}: not in store. The ` +\n `framework's finalize dispatch must putDraft before commit.`,\n });\n }\n const payload = { ...args.proposalPayload };\n if (record.state === 'committed') {\n const sameDeadline = record.expiresAt?.getTime() === args.expiresAt.getTime();\n const samePayload = JSON.stringify(record.proposalPayload) === JSON.stringify(payload);\n if (sameDeadline && samePayload) return;\n throw new AdcpError('INTERNAL_ERROR', {\n recovery: 'terminal',\n message:\n `Proposal ${JSON.stringify(proposalId)} already committed with a different ` +\n `expires_at or payload — re-commit with different values is a developer bug.`,\n });\n }\n if (record.state !== 'draft') {\n throw new AdcpError('INTERNAL_ERROR', {\n recovery: 'terminal',\n message:\n `Cannot commit proposal ${JSON.stringify(proposalId)} from state ` +\n `${JSON.stringify(record.state)}; commit requires DRAFT.`,\n });\n }\n this.records.set(proposalId, {\n ...record,\n state: 'committed',\n expiresAt: args.expiresAt,\n proposalPayload: payload,\n });\n }\n\n tryReserveConsumption(proposalId: string, args: { expectedAccountId: string }): ProposalRecord<TRecipe> {\n this.evictExpired();\n const record = this.records.get(proposalId);\n // Cross-tenant probe collapses to PROPOSAL_NOT_FOUND — same\n // principal-enumeration defense as `get`.\n if (!record || record.accountId !== args.expectedAccountId) {\n throw new AdcpError('PROPOSAL_NOT_FOUND', {\n recovery: 'correctable',\n message: `Proposal ${JSON.stringify(proposalId)} not found.`,\n field: 'proposal_id',\n });\n }\n if (record.state !== 'committed') {\n throw new AdcpError('PROPOSAL_NOT_COMMITTED', {\n recovery: 'correctable',\n message:\n `Proposal ${JSON.stringify(proposalId)} is in state ${JSON.stringify(record.state)}; ` +\n `create_media_buy requires a committed proposal that hasn't been accepted or ` +\n `reserved by another request.`,\n field: 'proposal_id',\n });\n }\n const reserved: ProposalRecord<TRecipe> = { ...record, state: 'consuming' };\n this.records.set(proposalId, reserved);\n return reserved;\n }\n\n finalizeConsumption(proposalId: string, args: { mediaBuyId: string; expectedAccountId: string }): void {\n const record = this.records.get(proposalId);\n if (!record || record.accountId !== args.expectedAccountId) {\n throw new AdcpError('INTERNAL_ERROR', {\n recovery: 'terminal',\n message: `finalizeConsumption: proposal ${JSON.stringify(proposalId)} not found for ` + `the expected tenant.`,\n });\n }\n if (record.state === 'consumed') {\n // Idempotent on already-CONSUMED with the same mediaBuyId.\n if (record.mediaBuyId === args.mediaBuyId) return;\n throw new AdcpError('INTERNAL_ERROR', {\n recovery: 'terminal',\n message:\n `Proposal ${JSON.stringify(proposalId)} already consumed by ` +\n `media_buy_id=${JSON.stringify(record.mediaBuyId)}; cannot re-consume as ` +\n `${JSON.stringify(args.mediaBuyId)}.`,\n });\n }\n if (record.state !== 'consuming') {\n throw new AdcpError('INTERNAL_ERROR', {\n recovery: 'terminal',\n message:\n `finalizeConsumption requires CONSUMING; proposal ${JSON.stringify(proposalId)} ` +\n `is in ${JSON.stringify(record.state)}. Framework must call ` +\n `tryReserveConsumption first.`,\n });\n }\n this.records.set(proposalId, {\n ...record,\n state: 'consumed',\n mediaBuyId: args.mediaBuyId,\n });\n this.mediaBuyIndex.set(this.mediaBuyKey(record.accountId, args.mediaBuyId), proposalId);\n }\n\n releaseConsumption(proposalId: string, args: { expectedAccountId: string }): void {\n const record = this.records.get(proposalId);\n if (!record || record.accountId !== args.expectedAccountId) {\n // Idempotent — releasing an unknown id is a no-op so the\n // adapter-failure rollback path can be unconditional.\n return;\n }\n if (record.state === 'committed') {\n // Already rolled back.\n return;\n }\n if (record.state !== 'consuming') {\n throw new AdcpError('INTERNAL_ERROR', {\n recovery: 'terminal',\n message:\n `releaseConsumption requires CONSUMING; proposal ${JSON.stringify(proposalId)} ` +\n `is in ${JSON.stringify(record.state)}.`,\n });\n }\n this.records.set(proposalId, { ...record, state: 'committed' });\n }\n\n discard(proposalId: string): void {\n const record = this.records.get(proposalId);\n this.records.delete(proposalId);\n this.creationTimes.delete(proposalId);\n if (record?.mediaBuyId) {\n this.mediaBuyIndex.delete(this.mediaBuyKey(record.accountId, record.mediaBuyId));\n }\n }\n\n getByMediaBuyId(mediaBuyId: string, args: { expectedAccountId: string }): ProposalRecord<TRecipe> | null {\n this.evictExpired();\n const key = this.mediaBuyKey(args.expectedAccountId, mediaBuyId);\n const proposalId = this.mediaBuyIndex.get(key);\n if (!proposalId) return null;\n const record = this.records.get(proposalId);\n if (!record) {\n // Index drift — clean up.\n this.mediaBuyIndex.delete(key);\n return null;\n }\n return record;\n }\n}\n"],"mappings":"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","names":[]}
@@ -1,9 +1,3 @@
1
- import { fileURLToPath as __adcpFileURLToPath } from 'node:url';
2
- import { dirname as __adcpDirname } from 'node:path';
3
- import { createRequire as __adcpCreateRequire } from 'node:module';
4
- const __filename = __adcpFileURLToPath(import.meta.url);
5
- const __dirname = __adcpDirname(__filename);
6
- const require = __adcpCreateRequire(import.meta.url);
7
1
  function validateProposalCapabilities(caps) {
8
2
  const valid = ["sales-guaranteed", "sales-non-guaranteed"];
9
3
  if (!valid.includes(caps.salesSpecialism)) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/lib/server/decisioning/proposal/types.ts"],"sourcesContent":["/**\n * ProposalManager — primitives for the two-platform composition.\n *\n * The existing `DecisioningPlatform` conflates two concerns: assembling\n * proposals from briefs (`get_products`, refine) vs. executing media buys\n * against an upstream (`create_media_buy`, `update_media_buy`,\n * `get_media_buy_delivery`). The two-platform composition splits them: a\n * separate {@link ProposalManager} handles the proposal side; the\n * `DecisioningPlatform` keeps the execution side. Either platform can be\n * mock-backed independently.\n *\n * Ports the Python primitives shipped in `adcp-client-python` PRs #504\n * (v1) and #550 (v1.5):\n *\n * - {@link ProposalManager} — interface with `getProducts` (required)\n * plus optional `refineProducts` and `finalizeProposal`.\n * - {@link ProposalCapabilities} — sales-axis-scoped capability flags.\n * - {@link Recipe} — typed `recipe_kind`-discriminated base; adopters\n * subclass with their internal-config schema. Rides on\n * `Product.implementation_config` (opaque to the buyer).\n * - {@link CapabilityOverlap} — typed declaration of which wire\n * capabilities the buyer can configure on a product. The framework\n * validates buyer requests against the overlap pre-adapter.\n * - {@link FinalizeProposalRequest} / {@link FinalizeProposalSuccess} —\n * framework-internal shapes for the finalize lifecycle (wired in the\n * v1.5 dispatch helpers).\n *\n * @public\n * @packageDocumentation\n */\n\nimport type { MaybePromise } from '../../create-adcp-server';\nimport type { Account } from '../account';\nimport type { RequestContext } from '../context';\nimport type { GetProductsRequest, GetProductsResponse } from '../../../types/tools.generated';\nimport type { RequireCacheScopeWhenProducts, ServerPayload } from '../../../types/server-payload';\nimport type { TaskHandoff } from '../async-outcome';\n\nexport type ProposalGetProductsPayload = RequireCacheScopeWhenProducts<ServerPayload<GetProductsResponse>>;\n\n// ---------------------------------------------------------------------------\n// Capabilities\n// ---------------------------------------------------------------------------\n\n/**\n * Sales specialisms a {@link ProposalManager} can serve. Mirrors the\n * `sales-*` slugs in the spec's specialism enum.\n *\n * v1 scopes to the two `ProposalManager`-relevant flavours; broader\n * coverage (broadcast-tv, social, proposal-mode, catalog-driven) lands\n * as adopter signal grows.\n *\n * @public\n */\nexport type ProposalSalesSpecialism = 'sales-guaranteed' | 'sales-non-guaranteed';\n\n/**\n * Capability declaration for a {@link ProposalManager}.\n *\n * Sales-axis-scoped: proposal handling is a sales-specialism concern,\n * not a generic platform-wide concept. The `salesSpecialism` field\n * declares which AdCP sales specialism this manager serves; capability\n * flags declare which optional behaviours it supports.\n *\n * The framework reads this declaration at server-construction time to\n * decide which dispatch paths apply (e.g. `refineProducts` is only\n * invoked when `refine` is true; `finalizeProposal` is only invoked\n * when `finalize` is true).\n *\n * @public\n */\nexport interface ProposalCapabilities {\n /**\n * Which AdCP sales specialism this manager serves.\n *\n * `sales-guaranteed` for guaranteed-direct flows with proposal\n * lifecycle (finalize → committed proposal → media buy).\n *\n * `sales-non-guaranteed` for catalog-style flows where `getProducts`\n * returns a static catalog and buyers reference products directly at\n * `create_media_buy`.\n */\n salesSpecialism: ProposalSalesSpecialism;\n\n /**\n * When true, the manager implements {@link ProposalManager.refineProducts}\n * and the framework routes `get_products` requests with\n * `buying_mode: 'refine'` to that method. When false, refine requests\n * fall through to `getProducts` (or surface `UNSUPPORTED_FEATURE` if\n * the manager rejects them).\n */\n refine?: boolean;\n\n /**\n * When true, the manager implements {@link ProposalManager.finalizeProposal}\n * and the framework intercepts `refine[i].action: 'finalize'` entries to\n * commit drafts via the lifecycle helpers. When false, finalize entries\n * pass through to the underlying `getProducts` / `refineProducts` method\n * unchanged.\n */\n finalize?: boolean;\n\n /**\n * Grace window (in seconds) added to a committed proposal's `expires_at`\n * before the framework rejects `create_media_buy` calls referencing the\n * proposal with `PROPOSAL_EXPIRED`. Default 0 (strict).\n */\n expiresAtGraceSeconds?: number;\n\n /**\n * Signal-driven product assembly — the manager constructs products from\n * buyer signals at request time rather than enumerating a static\n * catalogue. Informational in v1.5; future PRs may validate that\n * inventory / signal stores are wired when this flag is set.\n */\n dynamicProducts?: boolean;\n\n /**\n * The manager consults rate cards (per buyer relationship per product)\n * when emitting prices. Informational in v1.5.\n */\n rateCardPricing?: boolean;\n\n /**\n * The manager reserves capacity at proposal time (typical for\n * guaranteed). Informational in v1.5; the `finalize` transition that\n * drives the actual hold is wired via the lifecycle helpers.\n */\n availabilityReservations?: boolean;\n}\n\n/**\n * Validate a {@link ProposalCapabilities} object. Throws when the declaration\n * is malformed (unknown `salesSpecialism`, negative `expiresAtGraceSeconds`).\n * The framework calls this at boot; adopters can call it from their own\n * config-validation code paths to fail fast on misconfiguration.\n *\n * Kept as a plain function rather than a class constructor to match the\n * codebase's preference for plain TS interfaces over runtime classes\n * for adopter-facing types.\n *\n * @public\n */\nexport function validateProposalCapabilities(caps: ProposalCapabilities): void {\n const valid: readonly ProposalSalesSpecialism[] = ['sales-guaranteed', 'sales-non-guaranteed'];\n if (!valid.includes(caps.salesSpecialism)) {\n throw new Error(\n `ProposalCapabilities.salesSpecialism must be one of ${JSON.stringify(valid)}. ` +\n `Got ${JSON.stringify(caps.salesSpecialism)}. v1.5 scopes ProposalManager to the two ` +\n `core sales specialisms; broader specialism support lands in subsequent releases.`\n );\n }\n if (caps.expiresAtGraceSeconds != null && caps.expiresAtGraceSeconds < 0) {\n throw new Error(\n `ProposalCapabilities.expiresAtGraceSeconds must be >= 0; got ${caps.expiresAtGraceSeconds}. ` +\n `The grace window extends the inventory hold past expires_at; negative values would shrink it.`\n );\n }\n}\n\n// ---------------------------------------------------------------------------\n// Recipe + CapabilityOverlap\n// ---------------------------------------------------------------------------\n\n/**\n * Per-product subset of wire capability flags that the buyer can\n * configure on this product.\n *\n * Buyer requests asking for capabilities outside this overlap are\n * rejected by the framework before the adapter sees them (validated by\n * the lifecycle helpers — see `proposal/lifecycle.ts`).\n *\n * Each field is `ReadonlySet<string> | undefined`:\n *\n * - `undefined` → framework does not gate this axis (open).\n * - `ReadonlySet` → buyer choices must be subsets of this set.\n * An empty set means deny-all on this axis.\n *\n * The undefined vs. empty-set distinction matches set intuition:\n * \"no constraint\" is `undefined`; \"allowed set is empty\" is `new Set()`.\n *\n * **Why no extras dict?** v1.5 deliberately omits an `extras` escape\n * hatch (per Python design § D4). Adopters with novel gating needs\n * extend the interface with typed fields; a dict bag leaves no paper\n * trail. If a new axis turns out to be widely useful, it lands as a\n * typed field on `CapabilityOverlap` upstream.\n *\n * @public\n */\nexport interface CapabilityOverlap {\n /**\n * Subset of wire `pricing_models` the buyer can choose. Validated\n * against the matching `PricingOption.pricing_model` on the buyer's\n * package.\n */\n pricingModels?: ReadonlySet<string>;\n\n /**\n * Subset of wire targeting dimensions (`geo`, `device_type`,\n * `language`, etc.). Validated against the keys present on the\n * buyer's `targeting_overlay`.\n */\n targetingDimensions?: ReadonlySet<string>;\n\n /**\n * Subset of `{ guaranteed, non_guaranteed }` the product offers.\n */\n deliveryTypes?: ReadonlySet<string>;\n\n /**\n * If the seller integrates signals, which signal types this product\n * accepts. An empty set means the seller explicitly refuses all\n * signals on this product; `undefined` means no framework gate.\n */\n signalTypes?: ReadonlySet<string>;\n}\n\n/**\n * Base type for typed product `implementation_config` payloads.\n *\n * Adopters declare a discriminated subtype with a literal `recipe_kind`:\n *\n * ```ts\n * interface GAMRecipe extends Recipe {\n * recipe_kind: 'gam';\n * line_item_template_id: string;\n * ad_unit_ids: readonly string[];\n * capability_overlap?: CapabilityOverlap;\n * }\n * ```\n *\n * The kind tag enables router-by-recipe-kind dispatch in the\n * multi-decisioning case (one ProposalManager + many DecisioningPlatforms,\n * each handling a subset of recipe kinds). v1.5 doesn't yet wire that\n * routing — adopters using a single DecisioningPlatform attach recipes\n * freely without registry validation.\n *\n * **The recipe is never on the buyer's wire surface.** It rides inside\n * `Product.implementation_config` (an opaque-to-buyer dict). Buyers treat\n * it as a black box; the framework persists it through the proposal\n * lifecycle so the executing DecisioningPlatform sees a stable view.\n *\n * `capability_overlap` is optional. When present, the framework activates\n * the v1.5 buyer-request validation seam against the declared subsets.\n *\n * @public\n */\nexport interface Recipe {\n /** Adapter-family discriminator. Subtypes narrow with a literal type. */\n recipe_kind: string;\n\n /**\n * Optional typed declaration of which wire capabilities the buyer can\n * configure on this product. `undefined` means no framework gating.\n * An explicit {@link CapabilityOverlap} activates the v1.5 validation.\n */\n capability_overlap?: CapabilityOverlap;\n}\n\n// ---------------------------------------------------------------------------\n// Finalize lifecycle shapes\n// ---------------------------------------------------------------------------\n\n/**\n * Framework-internal request shape passed to {@link ProposalManager.finalizeProposal}.\n *\n * Constructed by the framework dispatcher when a buyer's `get_products`\n * request with `buying_mode: 'refine'` carries a `refine[i].action: 'finalize'`\n * entry. Adopters don't parse the wire envelope; the framework projects.\n *\n * @public\n */\nexport interface FinalizeProposalRequest<TRecipe extends Recipe = Recipe> {\n /**\n * The draft proposal the buyer is asking to finalize. Hydrated from\n * the wire's `refine[i].proposal_id` field.\n */\n proposalId: string;\n\n /**\n * `product_id -> Recipe` mapping pulled from the {@link ProposalStore}\n * draft. The adopter's finalize logic typically lock-prices these and\n * emits the committed proposal.\n */\n recipes: ReadonlyMap<string, TRecipe>;\n\n /**\n * The draft's wire `Proposal` shape (the same payload the adopter\n * returned on the prior `getProducts` / `refineProducts` call).\n * Adopter typically modifies this with locked pricing and returns it\n * on {@link FinalizeProposalSuccess}.\n */\n proposalPayload: Record<string, unknown>;\n\n /**\n * The buyer's per-entry refine `ask` text — what they want finalized.\n * Free-form; adopter consumes.\n */\n ask?: string;\n\n /**\n * The parent {@link GetProductsRequest} so the adopter sees the full\n * envelope (account, etc.) without the framework projecting fields\n * one-by-one.\n */\n parentRequest: GetProductsRequest;\n}\n\n/**\n * Adopter-returned shape from {@link ProposalManager.finalizeProposal} —\n * inline commit.\n *\n * Framework calls `ProposalStore.commit` with these fields before\n * projecting the wire response. The buyer sees the committed `Proposal`\n * with `proposal_status: 'committed'` + `expires_at` populated on the\n * next `get_products` response payload.\n *\n * @public\n */\nexport interface FinalizeProposalSuccess<TRecipe extends Recipe = Recipe> {\n /**\n * The wire `Proposal` shape with locked pricing and\n * `proposal_status: 'committed'`. Adopter typically derives this from\n * {@link FinalizeProposalRequest.proposalPayload} with modifications.\n *\n * **Must be JSON-serializable end-to-end** — non-JSON values won't\n * survive a process restart through a durable {@link ProposalStore}.\n */\n proposal: Record<string, unknown>;\n\n /**\n * Inventory hold deadline. After this (plus the adopter's\n * {@link ProposalCapabilities.expiresAtGraceSeconds} window), the\n * framework rejects `create_media_buy` calls referencing the proposal\n * with `PROPOSAL_EXPIRED`.\n */\n expiresAt: Date;\n\n /**\n * Optional refreshed recipe mapping. Omitting preserves the draft's\n * recipes verbatim. Adopters whose finalize logic mutates recipe\n * fields (e.g. locking a line-item template id) supply a fresh\n * mapping.\n */\n recipes?: ReadonlyMap<string, TRecipe>;\n}\n\n// ---------------------------------------------------------------------------\n// ProposalManager interface\n// ---------------------------------------------------------------------------\n\ntype Ctx<TCtxMeta> = RequestContext<Account<TCtxMeta>>;\n\n/**\n * Assembles proposals from buyer briefs.\n *\n * Reads inventory, signals, rate cards, availability. Produces proposals\n * where each `Product` carries a typed `implementation_config` (a recipe;\n * see {@link Recipe}) that the bound `DecisioningPlatform` consumes at\n * `create_media_buy` time.\n *\n * Methods may be sync or async; the framework awaits whatever is\n * returned. Same convention as `SalesPlatform`.\n *\n * **Required surface:** {@link getProducts}.\n *\n * **Optional surfaces (capability-gated):**\n *\n * - {@link refineProducts} — only invoked when\n * {@link ProposalCapabilities.refine} is true.\n * - {@link finalizeProposal} — only invoked when\n * {@link ProposalCapabilities.finalize} is true. Wired by the\n * framework's lifecycle helpers; intercepts `refine[i].action: 'finalize'`\n * entries before the underlying `getProducts` / `refineProducts` runs.\n *\n * Throw `AdcpError` for buyer-fixable rejection (`BUDGET_TOO_LOW`,\n * `POLICY_VIOLATION`, `UNSUPPORTED_FEATURE`); the framework projects to\n * the wire structured-error envelope.\n *\n * Adopter typing tip: parameterize on your concrete `Recipe` subtype to\n * get end-to-end recipe typing through `ctx.recipes` in the bound\n * `DecisioningPlatform`'s methods:\n *\n * ```ts\n * type MyRecipe = GAMRecipe | KevelRecipe;\n * const manager: ProposalManager<MyRecipe, MyTenantMeta> = { ... };\n * ```\n *\n * @public\n */\nexport interface ProposalManager<TRecipe extends Recipe = Recipe, TCtxMeta = unknown> {\n /**\n * What this ProposalManager can do — sales specialism + capability flags.\n */\n capabilities: ProposalCapabilities;\n\n /**\n * Initial product discovery from a buyer brief.\n *\n * Each returned `Product` SHOULD carry an `implementation_config`\n * matching the bound `DecisioningPlatform`'s recipe schema (see\n * {@link Recipe}). The framework treats `implementation_config` as\n * opaque on the wire; recipe typing is enforced through the\n * `TRecipe` type parameter on the adopter side.\n *\n * For non-guaranteed flows: typically a static catalogue, possibly\n * filtered by buyer brief / signals.\n *\n * For guaranteed flows: typically a brief-driven assembly consulting\n * rate cards + availability. Adopters return draft proposals; the\n * buyer drives the finalize transition via subsequent refine calls\n * with `action: 'finalize'`.\n */\n getProducts(req: GetProductsRequest, ctx: Ctx<TCtxMeta>): MaybePromise<ProposalGetProductsPayload>;\n\n /**\n * Refine-mode iteration on a previous `getProducts` response.\n *\n * Per the spec, refine is a `buying_mode` value on `get_products` —\n * the wire envelope is the same. The framework routes refine requests\n * to this method when:\n *\n * 1. The wired ProposalManager declares `capabilities.refine` = true,\n * 2. The request has `buying_mode === 'refine'`, AND\n * 3. The manager implements this method.\n *\n * Otherwise refine requests fall through to {@link getProducts}.\n *\n * Adopters implementing `refineProducts` without `finalize` support\n * should treat `action: 'finalize'` entries as `UNSUPPORTED_FEATURE`\n * and return a structured error. Adopters with `finalize` support\n * see those entries intercepted by the framework before this method\n * is called.\n */\n refineProducts?(req: GetProductsRequest, ctx: Ctx<TCtxMeta>): MaybePromise<ProposalGetProductsPayload>;\n\n /**\n * Commit a draft proposal to firm pricing + inventory hold.\n *\n * Wired by the framework's lifecycle helpers when:\n *\n * 1. `capabilities.finalize === true`,\n * 2. The buyer's request has `buying_mode === 'refine'` with a\n * `refine[i]` entry of `{ scope: 'proposal', action: 'finalize',\n * proposal_id }`, AND\n * 3. The proposal_id resolves to a DRAFT entry in the\n * {@link ProposalStore}.\n *\n * Return a {@link FinalizeProposalSuccess} for inline commit (the\n * spec-default route), or a `TaskHandoff<FinalizeProposalSuccess>` to\n * promote to a HITL background task. The HITL commit hook is wired\n * in v1.6+; v1.5 inline-only.\n */\n finalizeProposal?(\n req: FinalizeProposalRequest<TRecipe>,\n ctx: Ctx<TCtxMeta>\n ): MaybePromise<FinalizeProposalSuccess<TRecipe> | TaskHandoff<FinalizeProposalSuccess<TRecipe>>>;\n}\n"],"mappings":";;;;;;AA+IO,SAAS,6BAA6B,MAAkC;AAC7E,QAAM,QAA4C,CAAC,oBAAoB,sBAAsB;AAC7F,MAAI,CAAC,MAAM,SAAS,KAAK,eAAe,GAAG;AACzC,UAAM,IAAI;AAAA,MACR,uDAAuD,KAAK,UAAU,KAAK,CAAC,SACnE,KAAK,UAAU,KAAK,eAAe,CAAC;AAAA,IAE/C;AAAA,EACF;AACA,MAAI,KAAK,yBAAyB,QAAQ,KAAK,wBAAwB,GAAG;AACxE,UAAM,IAAI;AAAA,MACR,gEAAgE,KAAK,qBAAqB;AAAA,IAE5F;AAAA,EACF;AACF;","names":[]}
1
+ {"version":3,"sources":["../../../../../src/lib/server/decisioning/proposal/types.ts"],"sourcesContent":["/**\n * ProposalManager — primitives for the two-platform composition.\n *\n * The existing `DecisioningPlatform` conflates two concerns: assembling\n * proposals from briefs (`get_products`, refine) vs. executing media buys\n * against an upstream (`create_media_buy`, `update_media_buy`,\n * `get_media_buy_delivery`). The two-platform composition splits them: a\n * separate {@link ProposalManager} handles the proposal side; the\n * `DecisioningPlatform` keeps the execution side. Either platform can be\n * mock-backed independently.\n *\n * Ports the Python primitives shipped in `adcp-client-python` PRs #504\n * (v1) and #550 (v1.5):\n *\n * - {@link ProposalManager} — interface with `getProducts` (required)\n * plus optional `refineProducts` and `finalizeProposal`.\n * - {@link ProposalCapabilities} — sales-axis-scoped capability flags.\n * - {@link Recipe} — typed `recipe_kind`-discriminated base; adopters\n * subclass with their internal-config schema. Rides on\n * `Product.implementation_config` (opaque to the buyer).\n * - {@link CapabilityOverlap} — typed declaration of which wire\n * capabilities the buyer can configure on a product. The framework\n * validates buyer requests against the overlap pre-adapter.\n * - {@link FinalizeProposalRequest} / {@link FinalizeProposalSuccess} —\n * framework-internal shapes for the finalize lifecycle (wired in the\n * v1.5 dispatch helpers).\n *\n * @public\n * @packageDocumentation\n */\n\nimport type { MaybePromise } from '../../create-adcp-server';\nimport type { Account } from '../account';\nimport type { RequestContext } from '../context';\nimport type { GetProductsRequest, GetProductsResponse } from '../../../types/tools.generated';\nimport type { RequireCacheScopeWhenProducts, ServerPayload } from '../../../types/server-payload';\nimport type { TaskHandoff } from '../async-outcome';\n\nexport type ProposalGetProductsPayload = RequireCacheScopeWhenProducts<ServerPayload<GetProductsResponse>>;\n\n// ---------------------------------------------------------------------------\n// Capabilities\n// ---------------------------------------------------------------------------\n\n/**\n * Sales specialisms a {@link ProposalManager} can serve. Mirrors the\n * `sales-*` slugs in the spec's specialism enum.\n *\n * v1 scopes to the two `ProposalManager`-relevant flavours; broader\n * coverage (broadcast-tv, social, proposal-mode, catalog-driven) lands\n * as adopter signal grows.\n *\n * @public\n */\nexport type ProposalSalesSpecialism = 'sales-guaranteed' | 'sales-non-guaranteed';\n\n/**\n * Capability declaration for a {@link ProposalManager}.\n *\n * Sales-axis-scoped: proposal handling is a sales-specialism concern,\n * not a generic platform-wide concept. The `salesSpecialism` field\n * declares which AdCP sales specialism this manager serves; capability\n * flags declare which optional behaviours it supports.\n *\n * The framework reads this declaration at server-construction time to\n * decide which dispatch paths apply (e.g. `refineProducts` is only\n * invoked when `refine` is true; `finalizeProposal` is only invoked\n * when `finalize` is true).\n *\n * @public\n */\nexport interface ProposalCapabilities {\n /**\n * Which AdCP sales specialism this manager serves.\n *\n * `sales-guaranteed` for guaranteed-direct flows with proposal\n * lifecycle (finalize → committed proposal → media buy).\n *\n * `sales-non-guaranteed` for catalog-style flows where `getProducts`\n * returns a static catalog and buyers reference products directly at\n * `create_media_buy`.\n */\n salesSpecialism: ProposalSalesSpecialism;\n\n /**\n * When true, the manager implements {@link ProposalManager.refineProducts}\n * and the framework routes `get_products` requests with\n * `buying_mode: 'refine'` to that method. When false, refine requests\n * fall through to `getProducts` (or surface `UNSUPPORTED_FEATURE` if\n * the manager rejects them).\n */\n refine?: boolean;\n\n /**\n * When true, the manager implements {@link ProposalManager.finalizeProposal}\n * and the framework intercepts `refine[i].action: 'finalize'` entries to\n * commit drafts via the lifecycle helpers. When false, finalize entries\n * pass through to the underlying `getProducts` / `refineProducts` method\n * unchanged.\n */\n finalize?: boolean;\n\n /**\n * Grace window (in seconds) added to a committed proposal's `expires_at`\n * before the framework rejects `create_media_buy` calls referencing the\n * proposal with `PROPOSAL_EXPIRED`. Default 0 (strict).\n */\n expiresAtGraceSeconds?: number;\n\n /**\n * Signal-driven product assembly — the manager constructs products from\n * buyer signals at request time rather than enumerating a static\n * catalogue. Informational in v1.5; future PRs may validate that\n * inventory / signal stores are wired when this flag is set.\n */\n dynamicProducts?: boolean;\n\n /**\n * The manager consults rate cards (per buyer relationship per product)\n * when emitting prices. Informational in v1.5.\n */\n rateCardPricing?: boolean;\n\n /**\n * The manager reserves capacity at proposal time (typical for\n * guaranteed). Informational in v1.5; the `finalize` transition that\n * drives the actual hold is wired via the lifecycle helpers.\n */\n availabilityReservations?: boolean;\n}\n\n/**\n * Validate a {@link ProposalCapabilities} object. Throws when the declaration\n * is malformed (unknown `salesSpecialism`, negative `expiresAtGraceSeconds`).\n * The framework calls this at boot; adopters can call it from their own\n * config-validation code paths to fail fast on misconfiguration.\n *\n * Kept as a plain function rather than a class constructor to match the\n * codebase's preference for plain TS interfaces over runtime classes\n * for adopter-facing types.\n *\n * @public\n */\nexport function validateProposalCapabilities(caps: ProposalCapabilities): void {\n const valid: readonly ProposalSalesSpecialism[] = ['sales-guaranteed', 'sales-non-guaranteed'];\n if (!valid.includes(caps.salesSpecialism)) {\n throw new Error(\n `ProposalCapabilities.salesSpecialism must be one of ${JSON.stringify(valid)}. ` +\n `Got ${JSON.stringify(caps.salesSpecialism)}. v1.5 scopes ProposalManager to the two ` +\n `core sales specialisms; broader specialism support lands in subsequent releases.`\n );\n }\n if (caps.expiresAtGraceSeconds != null && caps.expiresAtGraceSeconds < 0) {\n throw new Error(\n `ProposalCapabilities.expiresAtGraceSeconds must be >= 0; got ${caps.expiresAtGraceSeconds}. ` +\n `The grace window extends the inventory hold past expires_at; negative values would shrink it.`\n );\n }\n}\n\n// ---------------------------------------------------------------------------\n// Recipe + CapabilityOverlap\n// ---------------------------------------------------------------------------\n\n/**\n * Per-product subset of wire capability flags that the buyer can\n * configure on this product.\n *\n * Buyer requests asking for capabilities outside this overlap are\n * rejected by the framework before the adapter sees them (validated by\n * the lifecycle helpers — see `proposal/lifecycle.ts`).\n *\n * Each field is `ReadonlySet<string> | undefined`:\n *\n * - `undefined` → framework does not gate this axis (open).\n * - `ReadonlySet` → buyer choices must be subsets of this set.\n * An empty set means deny-all on this axis.\n *\n * The undefined vs. empty-set distinction matches set intuition:\n * \"no constraint\" is `undefined`; \"allowed set is empty\" is `new Set()`.\n *\n * **Why no extras dict?** v1.5 deliberately omits an `extras` escape\n * hatch (per Python design § D4). Adopters with novel gating needs\n * extend the interface with typed fields; a dict bag leaves no paper\n * trail. If a new axis turns out to be widely useful, it lands as a\n * typed field on `CapabilityOverlap` upstream.\n *\n * @public\n */\nexport interface CapabilityOverlap {\n /**\n * Subset of wire `pricing_models` the buyer can choose. Validated\n * against the matching `PricingOption.pricing_model` on the buyer's\n * package.\n */\n pricingModels?: ReadonlySet<string>;\n\n /**\n * Subset of wire targeting dimensions (`geo`, `device_type`,\n * `language`, etc.). Validated against the keys present on the\n * buyer's `targeting_overlay`.\n */\n targetingDimensions?: ReadonlySet<string>;\n\n /**\n * Subset of `{ guaranteed, non_guaranteed }` the product offers.\n */\n deliveryTypes?: ReadonlySet<string>;\n\n /**\n * If the seller integrates signals, which signal types this product\n * accepts. An empty set means the seller explicitly refuses all\n * signals on this product; `undefined` means no framework gate.\n */\n signalTypes?: ReadonlySet<string>;\n}\n\n/**\n * Base type for typed product `implementation_config` payloads.\n *\n * Adopters declare a discriminated subtype with a literal `recipe_kind`:\n *\n * ```ts\n * interface GAMRecipe extends Recipe {\n * recipe_kind: 'gam';\n * line_item_template_id: string;\n * ad_unit_ids: readonly string[];\n * capability_overlap?: CapabilityOverlap;\n * }\n * ```\n *\n * The kind tag enables router-by-recipe-kind dispatch in the\n * multi-decisioning case (one ProposalManager + many DecisioningPlatforms,\n * each handling a subset of recipe kinds). v1.5 doesn't yet wire that\n * routing — adopters using a single DecisioningPlatform attach recipes\n * freely without registry validation.\n *\n * **The recipe is never on the buyer's wire surface.** It rides inside\n * `Product.implementation_config` (an opaque-to-buyer dict). Buyers treat\n * it as a black box; the framework persists it through the proposal\n * lifecycle so the executing DecisioningPlatform sees a stable view.\n *\n * `capability_overlap` is optional. When present, the framework activates\n * the v1.5 buyer-request validation seam against the declared subsets.\n *\n * @public\n */\nexport interface Recipe {\n /** Adapter-family discriminator. Subtypes narrow with a literal type. */\n recipe_kind: string;\n\n /**\n * Optional typed declaration of which wire capabilities the buyer can\n * configure on this product. `undefined` means no framework gating.\n * An explicit {@link CapabilityOverlap} activates the v1.5 validation.\n */\n capability_overlap?: CapabilityOverlap;\n}\n\n// ---------------------------------------------------------------------------\n// Finalize lifecycle shapes\n// ---------------------------------------------------------------------------\n\n/**\n * Framework-internal request shape passed to {@link ProposalManager.finalizeProposal}.\n *\n * Constructed by the framework dispatcher when a buyer's `get_products`\n * request with `buying_mode: 'refine'` carries a `refine[i].action: 'finalize'`\n * entry. Adopters don't parse the wire envelope; the framework projects.\n *\n * @public\n */\nexport interface FinalizeProposalRequest<TRecipe extends Recipe = Recipe> {\n /**\n * The draft proposal the buyer is asking to finalize. Hydrated from\n * the wire's `refine[i].proposal_id` field.\n */\n proposalId: string;\n\n /**\n * `product_id -> Recipe` mapping pulled from the {@link ProposalStore}\n * draft. The adopter's finalize logic typically lock-prices these and\n * emits the committed proposal.\n */\n recipes: ReadonlyMap<string, TRecipe>;\n\n /**\n * The draft's wire `Proposal` shape (the same payload the adopter\n * returned on the prior `getProducts` / `refineProducts` call).\n * Adopter typically modifies this with locked pricing and returns it\n * on {@link FinalizeProposalSuccess}.\n */\n proposalPayload: Record<string, unknown>;\n\n /**\n * The buyer's per-entry refine `ask` text — what they want finalized.\n * Free-form; adopter consumes.\n */\n ask?: string;\n\n /**\n * The parent {@link GetProductsRequest} so the adopter sees the full\n * envelope (account, etc.) without the framework projecting fields\n * one-by-one.\n */\n parentRequest: GetProductsRequest;\n}\n\n/**\n * Adopter-returned shape from {@link ProposalManager.finalizeProposal} —\n * inline commit.\n *\n * Framework calls `ProposalStore.commit` with these fields before\n * projecting the wire response. The buyer sees the committed `Proposal`\n * with `proposal_status: 'committed'` + `expires_at` populated on the\n * next `get_products` response payload.\n *\n * @public\n */\nexport interface FinalizeProposalSuccess<TRecipe extends Recipe = Recipe> {\n /**\n * The wire `Proposal` shape with locked pricing and\n * `proposal_status: 'committed'`. Adopter typically derives this from\n * {@link FinalizeProposalRequest.proposalPayload} with modifications.\n *\n * **Must be JSON-serializable end-to-end** — non-JSON values won't\n * survive a process restart through a durable {@link ProposalStore}.\n */\n proposal: Record<string, unknown>;\n\n /**\n * Inventory hold deadline. After this (plus the adopter's\n * {@link ProposalCapabilities.expiresAtGraceSeconds} window), the\n * framework rejects `create_media_buy` calls referencing the proposal\n * with `PROPOSAL_EXPIRED`.\n */\n expiresAt: Date;\n\n /**\n * Optional refreshed recipe mapping. Omitting preserves the draft's\n * recipes verbatim. Adopters whose finalize logic mutates recipe\n * fields (e.g. locking a line-item template id) supply a fresh\n * mapping.\n */\n recipes?: ReadonlyMap<string, TRecipe>;\n}\n\n// ---------------------------------------------------------------------------\n// ProposalManager interface\n// ---------------------------------------------------------------------------\n\ntype Ctx<TCtxMeta> = RequestContext<Account<TCtxMeta>>;\n\n/**\n * Assembles proposals from buyer briefs.\n *\n * Reads inventory, signals, rate cards, availability. Produces proposals\n * where each `Product` carries a typed `implementation_config` (a recipe;\n * see {@link Recipe}) that the bound `DecisioningPlatform` consumes at\n * `create_media_buy` time.\n *\n * Methods may be sync or async; the framework awaits whatever is\n * returned. Same convention as `SalesPlatform`.\n *\n * **Required surface:** {@link getProducts}.\n *\n * **Optional surfaces (capability-gated):**\n *\n * - {@link refineProducts} — only invoked when\n * {@link ProposalCapabilities.refine} is true.\n * - {@link finalizeProposal} — only invoked when\n * {@link ProposalCapabilities.finalize} is true. Wired by the\n * framework's lifecycle helpers; intercepts `refine[i].action: 'finalize'`\n * entries before the underlying `getProducts` / `refineProducts` runs.\n *\n * Throw `AdcpError` for buyer-fixable rejection (`BUDGET_TOO_LOW`,\n * `POLICY_VIOLATION`, `UNSUPPORTED_FEATURE`); the framework projects to\n * the wire structured-error envelope.\n *\n * Adopter typing tip: parameterize on your concrete `Recipe` subtype to\n * get end-to-end recipe typing through `ctx.recipes` in the bound\n * `DecisioningPlatform`'s methods:\n *\n * ```ts\n * type MyRecipe = GAMRecipe | KevelRecipe;\n * const manager: ProposalManager<MyRecipe, MyTenantMeta> = { ... };\n * ```\n *\n * @public\n */\nexport interface ProposalManager<TRecipe extends Recipe = Recipe, TCtxMeta = unknown> {\n /**\n * What this ProposalManager can do — sales specialism + capability flags.\n */\n capabilities: ProposalCapabilities;\n\n /**\n * Initial product discovery from a buyer brief.\n *\n * Each returned `Product` SHOULD carry an `implementation_config`\n * matching the bound `DecisioningPlatform`'s recipe schema (see\n * {@link Recipe}). The framework treats `implementation_config` as\n * opaque on the wire; recipe typing is enforced through the\n * `TRecipe` type parameter on the adopter side.\n *\n * For non-guaranteed flows: typically a static catalogue, possibly\n * filtered by buyer brief / signals.\n *\n * For guaranteed flows: typically a brief-driven assembly consulting\n * rate cards + availability. Adopters return draft proposals; the\n * buyer drives the finalize transition via subsequent refine calls\n * with `action: 'finalize'`.\n */\n getProducts(req: GetProductsRequest, ctx: Ctx<TCtxMeta>): MaybePromise<ProposalGetProductsPayload>;\n\n /**\n * Refine-mode iteration on a previous `getProducts` response.\n *\n * Per the spec, refine is a `buying_mode` value on `get_products` —\n * the wire envelope is the same. The framework routes refine requests\n * to this method when:\n *\n * 1. The wired ProposalManager declares `capabilities.refine` = true,\n * 2. The request has `buying_mode === 'refine'`, AND\n * 3. The manager implements this method.\n *\n * Otherwise refine requests fall through to {@link getProducts}.\n *\n * Adopters implementing `refineProducts` without `finalize` support\n * should treat `action: 'finalize'` entries as `UNSUPPORTED_FEATURE`\n * and return a structured error. Adopters with `finalize` support\n * see those entries intercepted by the framework before this method\n * is called.\n */\n refineProducts?(req: GetProductsRequest, ctx: Ctx<TCtxMeta>): MaybePromise<ProposalGetProductsPayload>;\n\n /**\n * Commit a draft proposal to firm pricing + inventory hold.\n *\n * Wired by the framework's lifecycle helpers when:\n *\n * 1. `capabilities.finalize === true`,\n * 2. The buyer's request has `buying_mode === 'refine'` with a\n * `refine[i]` entry of `{ scope: 'proposal', action: 'finalize',\n * proposal_id }`, AND\n * 3. The proposal_id resolves to a DRAFT entry in the\n * {@link ProposalStore}.\n *\n * Return a {@link FinalizeProposalSuccess} for inline commit (the\n * spec-default route), or a `TaskHandoff<FinalizeProposalSuccess>` to\n * promote to a HITL background task. The HITL commit hook is wired\n * in v1.6+; v1.5 inline-only.\n */\n finalizeProposal?(\n req: FinalizeProposalRequest<TRecipe>,\n ctx: Ctx<TCtxMeta>\n ): MaybePromise<FinalizeProposalSuccess<TRecipe> | TaskHandoff<FinalizeProposalSuccess<TRecipe>>>;\n}\n"],"mappings":"AA+IO,SAAS,6BAA6B,MAAkC;AAC7E,QAAM,QAA4C,CAAC,oBAAoB,sBAAsB;AAC7F,MAAI,CAAC,MAAM,SAAS,KAAK,eAAe,GAAG;AACzC,UAAM,IAAI;AAAA,MACR,uDAAuD,KAAK,UAAU,KAAK,CAAC,SACnE,KAAK,UAAU,KAAK,eAAe,CAAC;AAAA,IAE/C;AAAA,EACF;AACA,MAAI,KAAK,yBAAyB,QAAQ,KAAK,wBAAwB,GAAG;AACxE,UAAM,IAAI;AAAA,MACR,gEAAgE,KAAK,qBAAqB;AAAA,IAE5F;AAAA,EACF;AACF;","names":[]}
@@ -1,9 +1,3 @@
1
- import { fileURLToPath as __adcpFileURLToPath } from 'node:url';
2
- import { dirname as __adcpDirname } from 'node:path';
3
- import { createRequire as __adcpCreateRequire } from 'node:module';
4
- const __filename = __adcpFileURLToPath(import.meta.url);
5
- const __dirname = __adcpDirname(__filename);
6
- const require = __adcpCreateRequire(import.meta.url);
7
1
  import { PermissionDeniedError } from "./errors-typed.mjs";
8
2
  function requireAccountMatch(predicate, options = {}) {
9
3
  const onDeny = options.onDeny ?? "null";
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/lib/server/decisioning/resolve-presets.ts"],"sourcesContent":["/**\n * `composeMethod` presets for `accounts.resolve`. Standardize the security\n * pattern multi-tenant adopters reach for: \"the inner resolver found the\n * account, but is the calling principal authorized for it?\"\n *\n * Hooks here run as `after` on a `composeMethod`-wrapped `accounts.resolve`.\n * When `inner` returns `null` they propagate `null` (no predicate runs);\n * otherwise they call the predicate, and on deny return `null` (default —\n * indistinguishable from \"not found\", guards against principal enumeration)\n * or throw {@link PermissionDeniedError} (typed wire error; use only when\n * the principal already knows the account exists).\n *\n * Closes adcp-client#1339.\n *\n * @public\n */\n\nimport type { AccountReference } from '../../types/tools.generated';\nimport type { Account, ResolveContext } from './account';\nimport type { ComposeHooks } from './compose';\nimport { PermissionDeniedError } from './errors-typed';\n\n/**\n * Hook shape for `composeMethod` over `accounts.resolve`. Exported for\n * adopters writing their own helpers atop these presets.\n *\n * @public\n */\nexport type ResolveAccountHooks<TCtxMeta = Record<string, unknown>> = ComposeHooks<\n AccountReference | undefined,\n ResolveContext | undefined,\n Account<TCtxMeta> | null\n>;\n\n/**\n * Common options for resolve-time guards.\n *\n * @public\n */\nexport interface ResolveGuardOptions {\n /**\n * Behavior when the predicate denies.\n * - `'null'` (default) — return `null`. Buyer sees `ACCOUNT_NOT_FOUND`,\n * same as a genuinely-unknown account. Avoids principal enumeration.\n * - `'throw'` — throw {@link PermissionDeniedError}. Surfaces a typed\n * error to the buyer; use only when the principal is already known\n * to be allowed to know the account exists.\n */\n onDeny?: 'null' | 'throw';\n\n /**\n * Action label attached to {@link PermissionDeniedError} when\n * `onDeny: 'throw'`. Defaults to `'accounts.resolve'`.\n */\n action?: string;\n}\n\n/**\n * General-purpose post-resolve guard. After the wrapped `accounts.resolve`\n * runs, calls `predicate(account, ctx)`; on `false` denies per `onDeny`.\n *\n * Building block for the specialized presets below; reach for it directly\n * when your authorization rule needs custom logic.\n *\n * @example\n * ```ts\n * import { composeMethod, requireAccountMatch } from '@adcp/sdk/server';\n *\n * accounts: {\n * resolve: composeMethod(\n * baseResolve,\n * requireAccountMatch((account, ctx) =>\n * account.account_scope === 'brand' && ctx?.agent?.id === account.brand?.id\n * )\n * ),\n * }\n * ```\n *\n * @public\n */\nexport function requireAccountMatch<TCtxMeta = Record<string, unknown>>(\n predicate: (account: Account<TCtxMeta>, ctx: ResolveContext | undefined) => boolean | Promise<boolean>,\n options: ResolveGuardOptions = {}\n): ResolveAccountHooks<TCtxMeta> {\n const onDeny = options.onDeny ?? 'null';\n const action = options.action ?? 'accounts.resolve';\n return {\n after: async (result, _params, ctx) => {\n if (result === null) return null;\n const ok = await predicate(result, ctx);\n if (ok) return result;\n if (onDeny === 'throw') {\n throw new PermissionDeniedError(action);\n }\n return null;\n },\n };\n}\n\n/**\n * Gate resolved accounts on `account.advertiser` ∈ roster. Canonical\n * multi-tenant pattern: each calling principal is configured with a list\n * of advertisers it may transact for; the inner resolver finds the\n * account by reference, this preset rejects when the resolved\n * advertiser isn't in the roster.\n *\n * `getRoster` receives the `ResolveContext` and returns the principal's\n * allowed advertisers (any iterable of strings — array, Set, async lookup).\n * Accounts whose `advertiser` is undefined are denied.\n *\n * Equivalent to {@link requireAccountMatch} with an advertiser-extraction\n * predicate; sugar for the canonical shape.\n *\n * @example\n * ```ts\n * import { composeMethod, requireAdvertiserMatch } from '@adcp/sdk/server';\n *\n * accounts: {\n * resolve: composeMethod(\n * baseResolve,\n * requireAdvertiserMatch(async (ctx) => tenantRoster.for(ctx?.agent))\n * ),\n * }\n * ```\n *\n * @public\n */\nexport function requireAdvertiserMatch<TCtxMeta = Record<string, unknown>>(\n getRoster: (ctx: ResolveContext | undefined) => Iterable<string> | Promise<Iterable<string>>,\n options: ResolveGuardOptions = {}\n): ResolveAccountHooks<TCtxMeta> {\n return requireAccountMatch<TCtxMeta>(async (account, ctx) => {\n const advertiser = account.advertiser;\n if (advertiser === undefined) return false;\n const roster = await getRoster(ctx);\n for (const allowed of roster) {\n if (allowed === advertiser) return true;\n }\n return false;\n }, options);\n}\n\n/**\n * Gate resolved accounts on org scope: account-side org extractor + ctx-side\n * org extractor + equality. Use when \"is this principal in the same org as\n * this account?\" is the authorization rule.\n *\n * Both extractors must return a defined string for the check to pass; either\n * returning `undefined` denies. Caller is responsible for whatever\n * normalization (case-folding, trim, alias resolution) is appropriate for\n * the org identifier shape — the preset compares with strict equality.\n *\n * @example\n * ```ts\n * import { composeMethod, requireOrgScope } from '@adcp/sdk/server';\n *\n * accounts: {\n * resolve: composeMethod(\n * baseResolve,\n * requireOrgScope(\n * (account) => account.ctx_metadata.orgId,\n * (ctx) => ctx?.authInfo?.extra?.orgId as string | undefined\n * )\n * ),\n * }\n * ```\n *\n * @public\n */\nexport function requireOrgScope<TCtxMeta = Record<string, unknown>>(\n getAccountOrg: (account: Account<TCtxMeta>) => string | undefined,\n getCtxOrg: (ctx: ResolveContext | undefined) => string | undefined,\n options: ResolveGuardOptions = {}\n): ResolveAccountHooks<TCtxMeta> {\n return requireAccountMatch<TCtxMeta>((account, ctx) => {\n const accountOrg = getAccountOrg(account);\n if (accountOrg === undefined) return false;\n const ctxOrg = getCtxOrg(ctx);\n if (ctxOrg === undefined) return false;\n return accountOrg === ctxOrg;\n }, options);\n}\n"],"mappings":";;;;;;AAoBA,SAAS,6BAA6B;AA4D/B,SAAS,oBACd,WACA,UAA+B,CAAC,GACD;AAC/B,QAAM,SAAS,QAAQ,UAAU;AACjC,QAAM,SAAS,QAAQ,UAAU;AACjC,SAAO;AAAA,IACL,OAAO,OAAO,QAAQ,SAAS,QAAQ;AACrC,UAAI,WAAW,KAAM,QAAO;AAC5B,YAAM,KAAK,MAAM,UAAU,QAAQ,GAAG;AACtC,UAAI,GAAI,QAAO;AACf,UAAI,WAAW,SAAS;AACtB,cAAM,IAAI,sBAAsB,MAAM;AAAA,MACxC;AACA,aAAO;AAAA,IACT;AAAA,EACF;AACF;AA8BO,SAAS,uBACd,WACA,UAA+B,CAAC,GACD;AAC/B,SAAO,oBAA8B,OAAO,SAAS,QAAQ;AAC3D,UAAM,aAAa,QAAQ;AAC3B,QAAI,eAAe,OAAW,QAAO;AACrC,UAAM,SAAS,MAAM,UAAU,GAAG;AAClC,eAAW,WAAW,QAAQ;AAC5B,UAAI,YAAY,WAAY,QAAO;AAAA,IACrC;AACA,WAAO;AAAA,EACT,GAAG,OAAO;AACZ;AA6BO,SAAS,gBACd,eACA,WACA,UAA+B,CAAC,GACD;AAC/B,SAAO,oBAA8B,CAAC,SAAS,QAAQ;AACrD,UAAM,aAAa,cAAc,OAAO;AACxC,QAAI,eAAe,OAAW,QAAO;AACrC,UAAM,SAAS,UAAU,GAAG;AAC5B,QAAI,WAAW,OAAW,QAAO;AACjC,WAAO,eAAe;AAAA,EACxB,GAAG,OAAO;AACZ;","names":[]}
1
+ {"version":3,"sources":["../../../../src/lib/server/decisioning/resolve-presets.ts"],"sourcesContent":["/**\n * `composeMethod` presets for `accounts.resolve`. Standardize the security\n * pattern multi-tenant adopters reach for: \"the inner resolver found the\n * account, but is the calling principal authorized for it?\"\n *\n * Hooks here run as `after` on a `composeMethod`-wrapped `accounts.resolve`.\n * When `inner` returns `null` they propagate `null` (no predicate runs);\n * otherwise they call the predicate, and on deny return `null` (default —\n * indistinguishable from \"not found\", guards against principal enumeration)\n * or throw {@link PermissionDeniedError} (typed wire error; use only when\n * the principal already knows the account exists).\n *\n * Closes adcp-client#1339.\n *\n * @public\n */\n\nimport type { AccountReference } from '../../types/tools.generated';\nimport type { Account, ResolveContext } from './account';\nimport type { ComposeHooks } from './compose';\nimport { PermissionDeniedError } from './errors-typed';\n\n/**\n * Hook shape for `composeMethod` over `accounts.resolve`. Exported for\n * adopters writing their own helpers atop these presets.\n *\n * @public\n */\nexport type ResolveAccountHooks<TCtxMeta = Record<string, unknown>> = ComposeHooks<\n AccountReference | undefined,\n ResolveContext | undefined,\n Account<TCtxMeta> | null\n>;\n\n/**\n * Common options for resolve-time guards.\n *\n * @public\n */\nexport interface ResolveGuardOptions {\n /**\n * Behavior when the predicate denies.\n * - `'null'` (default) — return `null`. Buyer sees `ACCOUNT_NOT_FOUND`,\n * same as a genuinely-unknown account. Avoids principal enumeration.\n * - `'throw'` — throw {@link PermissionDeniedError}. Surfaces a typed\n * error to the buyer; use only when the principal is already known\n * to be allowed to know the account exists.\n */\n onDeny?: 'null' | 'throw';\n\n /**\n * Action label attached to {@link PermissionDeniedError} when\n * `onDeny: 'throw'`. Defaults to `'accounts.resolve'`.\n */\n action?: string;\n}\n\n/**\n * General-purpose post-resolve guard. After the wrapped `accounts.resolve`\n * runs, calls `predicate(account, ctx)`; on `false` denies per `onDeny`.\n *\n * Building block for the specialized presets below; reach for it directly\n * when your authorization rule needs custom logic.\n *\n * @example\n * ```ts\n * import { composeMethod, requireAccountMatch } from '@adcp/sdk/server';\n *\n * accounts: {\n * resolve: composeMethod(\n * baseResolve,\n * requireAccountMatch((account, ctx) =>\n * account.account_scope === 'brand' && ctx?.agent?.id === account.brand?.id\n * )\n * ),\n * }\n * ```\n *\n * @public\n */\nexport function requireAccountMatch<TCtxMeta = Record<string, unknown>>(\n predicate: (account: Account<TCtxMeta>, ctx: ResolveContext | undefined) => boolean | Promise<boolean>,\n options: ResolveGuardOptions = {}\n): ResolveAccountHooks<TCtxMeta> {\n const onDeny = options.onDeny ?? 'null';\n const action = options.action ?? 'accounts.resolve';\n return {\n after: async (result, _params, ctx) => {\n if (result === null) return null;\n const ok = await predicate(result, ctx);\n if (ok) return result;\n if (onDeny === 'throw') {\n throw new PermissionDeniedError(action);\n }\n return null;\n },\n };\n}\n\n/**\n * Gate resolved accounts on `account.advertiser` ∈ roster. Canonical\n * multi-tenant pattern: each calling principal is configured with a list\n * of advertisers it may transact for; the inner resolver finds the\n * account by reference, this preset rejects when the resolved\n * advertiser isn't in the roster.\n *\n * `getRoster` receives the `ResolveContext` and returns the principal's\n * allowed advertisers (any iterable of strings — array, Set, async lookup).\n * Accounts whose `advertiser` is undefined are denied.\n *\n * Equivalent to {@link requireAccountMatch} with an advertiser-extraction\n * predicate; sugar for the canonical shape.\n *\n * @example\n * ```ts\n * import { composeMethod, requireAdvertiserMatch } from '@adcp/sdk/server';\n *\n * accounts: {\n * resolve: composeMethod(\n * baseResolve,\n * requireAdvertiserMatch(async (ctx) => tenantRoster.for(ctx?.agent))\n * ),\n * }\n * ```\n *\n * @public\n */\nexport function requireAdvertiserMatch<TCtxMeta = Record<string, unknown>>(\n getRoster: (ctx: ResolveContext | undefined) => Iterable<string> | Promise<Iterable<string>>,\n options: ResolveGuardOptions = {}\n): ResolveAccountHooks<TCtxMeta> {\n return requireAccountMatch<TCtxMeta>(async (account, ctx) => {\n const advertiser = account.advertiser;\n if (advertiser === undefined) return false;\n const roster = await getRoster(ctx);\n for (const allowed of roster) {\n if (allowed === advertiser) return true;\n }\n return false;\n }, options);\n}\n\n/**\n * Gate resolved accounts on org scope: account-side org extractor + ctx-side\n * org extractor + equality. Use when \"is this principal in the same org as\n * this account?\" is the authorization rule.\n *\n * Both extractors must return a defined string for the check to pass; either\n * returning `undefined` denies. Caller is responsible for whatever\n * normalization (case-folding, trim, alias resolution) is appropriate for\n * the org identifier shape — the preset compares with strict equality.\n *\n * @example\n * ```ts\n * import { composeMethod, requireOrgScope } from '@adcp/sdk/server';\n *\n * accounts: {\n * resolve: composeMethod(\n * baseResolve,\n * requireOrgScope(\n * (account) => account.ctx_metadata.orgId,\n * (ctx) => ctx?.authInfo?.extra?.orgId as string | undefined\n * )\n * ),\n * }\n * ```\n *\n * @public\n */\nexport function requireOrgScope<TCtxMeta = Record<string, unknown>>(\n getAccountOrg: (account: Account<TCtxMeta>) => string | undefined,\n getCtxOrg: (ctx: ResolveContext | undefined) => string | undefined,\n options: ResolveGuardOptions = {}\n): ResolveAccountHooks<TCtxMeta> {\n return requireAccountMatch<TCtxMeta>((account, ctx) => {\n const accountOrg = getAccountOrg(account);\n if (accountOrg === undefined) return false;\n const ctxOrg = getCtxOrg(ctx);\n if (ctxOrg === undefined) return false;\n return accountOrg === ctxOrg;\n }, options);\n}\n"],"mappings":"AAoBA,SAAS,6BAA6B;AA4D/B,SAAS,oBACd,WACA,UAA+B,CAAC,GACD;AAC/B,QAAM,SAAS,QAAQ,UAAU;AACjC,QAAM,SAAS,QAAQ,UAAU;AACjC,SAAO;AAAA,IACL,OAAO,OAAO,QAAQ,SAAS,QAAQ;AACrC,UAAI,WAAW,KAAM,QAAO;AAC5B,YAAM,KAAK,MAAM,UAAU,QAAQ,GAAG;AACtC,UAAI,GAAI,QAAO;AACf,UAAI,WAAW,SAAS;AACtB,cAAM,IAAI,sBAAsB,MAAM;AAAA,MACxC;AACA,aAAO;AAAA,IACT;AAAA,EACF;AACF;AA8BO,SAAS,uBACd,WACA,UAA+B,CAAC,GACD;AAC/B,SAAO,oBAA8B,OAAO,SAAS,QAAQ;AAC3D,UAAM,aAAa,QAAQ;AAC3B,QAAI,eAAe,OAAW,QAAO;AACrC,UAAM,SAAS,MAAM,UAAU,GAAG;AAClC,eAAW,WAAW,QAAQ;AAC5B,UAAI,YAAY,WAAY,QAAO;AAAA,IACrC;AACA,WAAO;AAAA,EACT,GAAG,OAAO;AACZ;AA6BO,SAAS,gBACd,eACA,WACA,UAA+B,CAAC,GACD;AAC/B,SAAO,oBAA8B,CAAC,SAAS,QAAQ;AACrD,UAAM,aAAa,cAAc,OAAO;AACxC,QAAI,eAAe,OAAW,QAAO;AACrC,UAAM,SAAS,UAAU,GAAG;AAC5B,QAAI,WAAW,OAAW,QAAO;AACjC,WAAO,eAAe;AAAA,EACxB,GAAG,OAAO;AACZ;","names":[]}
@@ -1,9 +1,3 @@
1
- import { fileURLToPath as __adcpFileURLToPath } from 'node:url';
2
- import { dirname as __adcpDirname } from 'node:path';
3
- import { createRequire as __adcpCreateRequire } from 'node:module';
4
- const __filename = __adcpFileURLToPath(import.meta.url);
5
- const __dirname = __adcpDirname(__filename);
6
- const require = __adcpCreateRequire(import.meta.url);
7
1
  const TOOL_ENTITY_FIELDS = {
8
2
  acquire_rights: [
9
3
  { field: "pricing_option_id", xEntity: "vendor_pricing_option" },
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/lib/server/decisioning/runtime/entity-hydration.generated.ts"],"sourcesContent":["// Generated entity-hydration field map — do NOT edit by hand\n//\n// Source: `schemas/cache/3.1.2/manifest.json` + per-tool request\n// schemas. Every top-level `x-entity`-tagged string field on a request\n// schema lands here. The runtime hydrator (`from-platform.ts` →\n// `hydrateForTool`) walks this map plus the hand-curated\n// `ENTITY_TO_RESOURCE_KIND` table to drive auto-hydration without\n// re-walking schemas at startup.\n//\n// Renaming-firewall: if the spec renames `media_buy_id` → `mediabuy_id`,\n// the `x-entity` tag travels with it; the next codegen run picks up\n// the new field name automatically.\n//\n// Regenerate with: npm run generate-entity-hydration\n\nexport interface EntityHydrationField {\n /** Top-level property on the wire request object. */\n readonly field: string;\n /** Spec `x-entity` annotation — maps to `ResourceKind` at runtime. */\n readonly xEntity: string;\n}\n\nexport const TOOL_ENTITY_FIELDS: Readonly<Record<string, ReadonlyArray<EntityHydrationField>>> = {\n acquire_rights: [\n { field: \"pricing_option_id\", xEntity: \"vendor_pricing_option\" },\n { field: \"rights_id\", xEntity: \"rights_grant\" },\n ],\n activate_signal: [\n { field: \"pricing_option_id\", xEntity: \"vendor_pricing_option\" },\n { field: \"signal_agent_segment_id\", xEntity: \"signal_activation_id\" },\n ],\n build_creative: [\n { field: \"creative_id\", xEntity: \"creative\" },\n { field: \"media_buy_id\", xEntity: \"media_buy\" },\n { field: \"package_id\", xEntity: \"package\" },\n { field: \"refine_from_build_variant_id\", xEntity: \"build_variant\" },\n { field: \"transformer_id\", xEntity: \"transformer\" },\n ],\n check_governance: [\n { field: \"plan_id\", xEntity: \"governance_plan\" },\n ],\n create_media_buy: [\n { field: \"plan_id\", xEntity: \"governance_plan\" },\n ],\n delete_collection_list: [\n { field: \"list_id\", xEntity: \"collection_list\" },\n ],\n delete_property_list: [\n { field: \"list_id\", xEntity: \"property_list\" },\n ],\n get_brand_identity: [\n { field: \"brand_id\", xEntity: \"advertiser_brand\" },\n ],\n get_collection_list: [\n { field: \"list_id\", xEntity: \"collection_list\" },\n ],\n get_property_list: [\n { field: \"list_id\", xEntity: \"property_list\" },\n ],\n get_rights: [\n { field: \"brand_id\", xEntity: \"rights_holder_brand\" },\n ],\n get_task_status: [\n { field: \"task_id\", xEntity: \"task\" },\n ],\n log_event: [\n { field: \"event_source_id\", xEntity: \"event_source\" },\n ],\n preview_creative: [\n { field: \"creative_id\", xEntity: \"creative\" },\n ],\n provide_performance_feedback: [\n { field: \"creative_id\", xEntity: \"creative\" },\n { field: \"media_buy_id\", xEntity: \"media_buy\" },\n { field: \"package_id\", xEntity: \"package\" },\n ],\n report_plan_outcome: [\n { field: \"check_id\", xEntity: \"governance_check\" },\n { field: \"plan_id\", xEntity: \"governance_plan\" },\n ],\n si_get_offering: [\n { field: \"offering_id\", xEntity: \"offering\" },\n ],\n si_initiate_session: [\n { field: \"media_buy_id\", xEntity: \"media_buy\" },\n { field: \"offering_id\", xEntity: \"offering\" },\n ],\n si_send_message: [\n { field: \"session_id\", xEntity: \"si_session\" },\n ],\n si_terminate_session: [\n { field: \"session_id\", xEntity: \"si_session\" },\n ],\n update_collection_list: [\n { field: \"list_id\", xEntity: \"collection_list\" },\n ],\n update_media_buy: [\n { field: \"media_buy_id\", xEntity: \"media_buy\" },\n ],\n update_property_list: [\n { field: \"list_id\", xEntity: \"property_list\" },\n ],\n update_rights: [\n { field: \"pricing_option_id\", xEntity: \"vendor_pricing_option\" },\n { field: \"rights_id\", xEntity: \"rights_grant\" },\n ],\n validate_property_delivery: [\n { field: \"list_id\", xEntity: \"property_list\" },\n ],\n};\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../../../src/lib/server/decisioning/runtime/entity-hydration.generated.ts"],"sourcesContent":["// Generated entity-hydration field map — do NOT edit by hand\n//\n// Source: `schemas/cache/3.1.2/manifest.json` + per-tool request\n// schemas. Every top-level `x-entity`-tagged string field on a request\n// schema lands here. The runtime hydrator (`from-platform.ts` →\n// `hydrateForTool`) walks this map plus the hand-curated\n// `ENTITY_TO_RESOURCE_KIND` table to drive auto-hydration without\n// re-walking schemas at startup.\n//\n// Renaming-firewall: if the spec renames `media_buy_id` → `mediabuy_id`,\n// the `x-entity` tag travels with it; the next codegen run picks up\n// the new field name automatically.\n//\n// Regenerate with: npm run generate-entity-hydration\n\nexport interface EntityHydrationField {\n /** Top-level property on the wire request object. */\n readonly field: string;\n /** Spec `x-entity` annotation — maps to `ResourceKind` at runtime. */\n readonly xEntity: string;\n}\n\nexport const TOOL_ENTITY_FIELDS: Readonly<Record<string, ReadonlyArray<EntityHydrationField>>> = {\n acquire_rights: [\n { field: \"pricing_option_id\", xEntity: \"vendor_pricing_option\" },\n { field: \"rights_id\", xEntity: \"rights_grant\" },\n ],\n activate_signal: [\n { field: \"pricing_option_id\", xEntity: \"vendor_pricing_option\" },\n { field: \"signal_agent_segment_id\", xEntity: \"signal_activation_id\" },\n ],\n build_creative: [\n { field: \"creative_id\", xEntity: \"creative\" },\n { field: \"media_buy_id\", xEntity: \"media_buy\" },\n { field: \"package_id\", xEntity: \"package\" },\n { field: \"refine_from_build_variant_id\", xEntity: \"build_variant\" },\n { field: \"transformer_id\", xEntity: \"transformer\" },\n ],\n check_governance: [\n { field: \"plan_id\", xEntity: \"governance_plan\" },\n ],\n create_media_buy: [\n { field: \"plan_id\", xEntity: \"governance_plan\" },\n ],\n delete_collection_list: [\n { field: \"list_id\", xEntity: \"collection_list\" },\n ],\n delete_property_list: [\n { field: \"list_id\", xEntity: \"property_list\" },\n ],\n get_brand_identity: [\n { field: \"brand_id\", xEntity: \"advertiser_brand\" },\n ],\n get_collection_list: [\n { field: \"list_id\", xEntity: \"collection_list\" },\n ],\n get_property_list: [\n { field: \"list_id\", xEntity: \"property_list\" },\n ],\n get_rights: [\n { field: \"brand_id\", xEntity: \"rights_holder_brand\" },\n ],\n get_task_status: [\n { field: \"task_id\", xEntity: \"task\" },\n ],\n log_event: [\n { field: \"event_source_id\", xEntity: \"event_source\" },\n ],\n preview_creative: [\n { field: \"creative_id\", xEntity: \"creative\" },\n ],\n provide_performance_feedback: [\n { field: \"creative_id\", xEntity: \"creative\" },\n { field: \"media_buy_id\", xEntity: \"media_buy\" },\n { field: \"package_id\", xEntity: \"package\" },\n ],\n report_plan_outcome: [\n { field: \"check_id\", xEntity: \"governance_check\" },\n { field: \"plan_id\", xEntity: \"governance_plan\" },\n ],\n si_get_offering: [\n { field: \"offering_id\", xEntity: \"offering\" },\n ],\n si_initiate_session: [\n { field: \"media_buy_id\", xEntity: \"media_buy\" },\n { field: \"offering_id\", xEntity: \"offering\" },\n ],\n si_send_message: [\n { field: \"session_id\", xEntity: \"si_session\" },\n ],\n si_terminate_session: [\n { field: \"session_id\", xEntity: \"si_session\" },\n ],\n update_collection_list: [\n { field: \"list_id\", xEntity: \"collection_list\" },\n ],\n update_media_buy: [\n { field: \"media_buy_id\", xEntity: \"media_buy\" },\n ],\n update_property_list: [\n { field: \"list_id\", xEntity: \"property_list\" },\n ],\n update_rights: [\n { field: \"pricing_option_id\", xEntity: \"vendor_pricing_option\" },\n { field: \"rights_id\", xEntity: \"rights_grant\" },\n ],\n validate_property_delivery: [\n { field: \"list_id\", xEntity: \"property_list\" },\n ],\n};\n"],"mappings":"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","names":[]}
@@ -1,9 +1,3 @@
1
- import { fileURLToPath as __adcpFileURLToPath } from 'node:url';
2
- import { dirname as __adcpDirname } from 'node:path';
3
- import { createRequire as __adcpCreateRequire } from 'node:module';
4
- const __filename = __adcpFileURLToPath(import.meta.url);
5
- const __dirname = __adcpDirname(__filename);
6
- const require = __adcpCreateRequire(import.meta.url);
7
1
  import { randomUUID } from "node:crypto";
8
2
  import { ErrorCode, McpError } from "@modelcontextprotocol/sdk/types.js";
9
3
  import {