@adcp/sdk 5.25.0 → 6.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (298) hide show
  1. package/README.md +45 -7
  2. package/dist/lib/compliance-fixtures/index.d.ts +1 -1
  3. package/dist/lib/compliance-fixtures/index.js +1 -1
  4. package/dist/lib/conformance/runners.d.ts.map +1 -1
  5. package/dist/lib/conformance/runners.js +13 -1
  6. package/dist/lib/conformance/runners.js.map +1 -1
  7. package/dist/lib/core/AgentClient.d.ts.map +1 -1
  8. package/dist/lib/core/SingleAgentClient.d.ts.map +1 -1
  9. package/dist/lib/core/SingleAgentClient.js +15 -0
  10. package/dist/lib/core/SingleAgentClient.js.map +1 -1
  11. package/dist/lib/core/TaskExecutor.d.ts +7 -0
  12. package/dist/lib/core/TaskExecutor.d.ts.map +1 -1
  13. package/dist/lib/core/TaskExecutor.js +9 -2
  14. package/dist/lib/core/TaskExecutor.js.map +1 -1
  15. package/dist/lib/index.d.ts +1 -1
  16. package/dist/lib/index.d.ts.map +1 -1
  17. package/dist/lib/index.js +7 -8
  18. package/dist/lib/index.js.map +1 -1
  19. package/dist/lib/protocols/index.d.ts +3 -1
  20. package/dist/lib/protocols/index.d.ts.map +1 -1
  21. package/dist/lib/protocols/index.js +23 -14
  22. package/dist/lib/protocols/index.js.map +1 -1
  23. package/dist/lib/schemas/index.d.ts +1 -1
  24. package/dist/lib/schemas/index.js +1 -1
  25. package/dist/lib/server/create-adcp-server.d.ts +142 -11
  26. package/dist/lib/server/create-adcp-server.d.ts.map +1 -1
  27. package/dist/lib/server/create-adcp-server.js +211 -2
  28. package/dist/lib/server/create-adcp-server.js.map +1 -1
  29. package/dist/lib/server/ctx-metadata/backends/memory.d.ts +27 -0
  30. package/dist/lib/server/ctx-metadata/backends/memory.d.ts.map +1 -0
  31. package/dist/lib/server/ctx-metadata/backends/memory.js +72 -0
  32. package/dist/lib/server/ctx-metadata/backends/memory.js.map +1 -0
  33. package/dist/lib/server/ctx-metadata/backends/pg.d.ts +62 -0
  34. package/dist/lib/server/ctx-metadata/backends/pg.d.ts.map +1 -0
  35. package/dist/lib/server/ctx-metadata/backends/pg.js +145 -0
  36. package/dist/lib/server/ctx-metadata/backends/pg.js.map +1 -0
  37. package/dist/lib/server/ctx-metadata/index.d.ts +15 -0
  38. package/dist/lib/server/ctx-metadata/index.d.ts.map +1 -0
  39. package/dist/lib/server/ctx-metadata/index.js +28 -0
  40. package/dist/lib/server/ctx-metadata/index.js.map +1 -0
  41. package/dist/lib/server/ctx-metadata/store.d.ts +177 -0
  42. package/dist/lib/server/ctx-metadata/store.d.ts.map +1 -0
  43. package/dist/lib/server/ctx-metadata/store.js +327 -0
  44. package/dist/lib/server/ctx-metadata/store.js.map +1 -0
  45. package/dist/lib/server/ctx-metadata/wire-shape.d.ts +55 -0
  46. package/dist/lib/server/ctx-metadata/wire-shape.d.ts.map +1 -0
  47. package/dist/lib/server/ctx-metadata/wire-shape.js +121 -0
  48. package/dist/lib/server/ctx-metadata/wire-shape.js.map +1 -0
  49. package/dist/lib/server/decisioning/account.d.ts +309 -0
  50. package/dist/lib/server/decisioning/account.d.ts.map +1 -0
  51. package/dist/lib/server/decisioning/account.js +102 -0
  52. package/dist/lib/server/decisioning/account.js.map +1 -0
  53. package/dist/lib/server/decisioning/admin-router.d.ts +75 -0
  54. package/dist/lib/server/decisioning/admin-router.d.ts.map +1 -0
  55. package/dist/lib/server/decisioning/admin-router.js +120 -0
  56. package/dist/lib/server/decisioning/admin-router.js.map +1 -0
  57. package/dist/lib/server/decisioning/assembly-helpers.d.ts +204 -0
  58. package/dist/lib/server/decisioning/assembly-helpers.d.ts.map +1 -0
  59. package/dist/lib/server/decisioning/assembly-helpers.js +173 -0
  60. package/dist/lib/server/decisioning/assembly-helpers.js.map +1 -0
  61. package/dist/lib/server/decisioning/async-outcome.d.ts +154 -0
  62. package/dist/lib/server/decisioning/async-outcome.d.ts.map +1 -0
  63. package/dist/lib/server/decisioning/async-outcome.js +239 -0
  64. package/dist/lib/server/decisioning/async-outcome.js.map +1 -0
  65. package/dist/lib/server/decisioning/capabilities.d.ts +251 -0
  66. package/dist/lib/server/decisioning/capabilities.d.ts.map +1 -0
  67. package/dist/lib/server/decisioning/capabilities.js +16 -0
  68. package/dist/lib/server/decisioning/capabilities.js.map +1 -0
  69. package/dist/lib/server/decisioning/context.d.ts +212 -0
  70. package/dist/lib/server/decisioning/context.d.ts.map +1 -0
  71. package/dist/lib/server/decisioning/context.js +26 -0
  72. package/dist/lib/server/decisioning/context.js.map +1 -0
  73. package/dist/lib/server/decisioning/errors-typed.d.ts +104 -0
  74. package/dist/lib/server/decisioning/errors-typed.d.ts.map +1 -0
  75. package/dist/lib/server/decisioning/errors-typed.js +304 -0
  76. package/dist/lib/server/decisioning/errors-typed.js.map +1 -0
  77. package/dist/lib/server/decisioning/helpers.d.ts +131 -0
  78. package/dist/lib/server/decisioning/helpers.d.ts.map +1 -0
  79. package/dist/lib/server/decisioning/helpers.js +134 -0
  80. package/dist/lib/server/decisioning/helpers.js.map +1 -0
  81. package/dist/lib/server/decisioning/index.d.ts +46 -0
  82. package/dist/lib/server/decisioning/index.d.ts.map +1 -0
  83. package/dist/lib/server/decisioning/index.js +120 -0
  84. package/dist/lib/server/decisioning/index.js.map +1 -0
  85. package/dist/lib/server/decisioning/list-helpers.d.ts +53 -0
  86. package/dist/lib/server/decisioning/list-helpers.d.ts.map +1 -0
  87. package/dist/lib/server/decisioning/list-helpers.js +96 -0
  88. package/dist/lib/server/decisioning/list-helpers.js.map +1 -0
  89. package/dist/lib/server/decisioning/manifest-helpers.d.ts +56 -0
  90. package/dist/lib/server/decisioning/manifest-helpers.d.ts.map +1 -0
  91. package/dist/lib/server/decisioning/manifest-helpers.js +78 -0
  92. package/dist/lib/server/decisioning/manifest-helpers.js.map +1 -0
  93. package/dist/lib/server/decisioning/pagination.d.ts +21 -0
  94. package/dist/lib/server/decisioning/pagination.d.ts.map +1 -0
  95. package/dist/lib/server/decisioning/pagination.js +12 -0
  96. package/dist/lib/server/decisioning/pagination.js.map +1 -0
  97. package/dist/lib/server/decisioning/platform.d.ts +188 -0
  98. package/dist/lib/server/decisioning/platform.d.ts.map +1 -0
  99. package/dist/lib/server/decisioning/platform.js +19 -0
  100. package/dist/lib/server/decisioning/platform.js.map +1 -0
  101. package/dist/lib/server/decisioning/runtime/from-platform.d.ts +510 -0
  102. package/dist/lib/server/decisioning/runtime/from-platform.d.ts.map +1 -0
  103. package/dist/lib/server/decisioning/runtime/from-platform.js +2196 -0
  104. package/dist/lib/server/decisioning/runtime/from-platform.js.map +1 -0
  105. package/dist/lib/server/decisioning/runtime/postgres-task-registry.d.ts +114 -0
  106. package/dist/lib/server/decisioning/runtime/postgres-task-registry.d.ts.map +1 -0
  107. package/dist/lib/server/decisioning/runtime/postgres-task-registry.js +247 -0
  108. package/dist/lib/server/decisioning/runtime/postgres-task-registry.js.map +1 -0
  109. package/dist/lib/server/decisioning/runtime/protocol-for-tool.d.ts +32 -0
  110. package/dist/lib/server/decisioning/runtime/protocol-for-tool.d.ts.map +1 -0
  111. package/dist/lib/server/decisioning/runtime/protocol-for-tool.js +127 -0
  112. package/dist/lib/server/decisioning/runtime/protocol-for-tool.js.map +1 -0
  113. package/dist/lib/server/decisioning/runtime/task-registry.d.ts +105 -0
  114. package/dist/lib/server/decisioning/runtime/task-registry.d.ts.map +1 -0
  115. package/dist/lib/server/decisioning/runtime/task-registry.js +96 -0
  116. package/dist/lib/server/decisioning/runtime/task-registry.js.map +1 -0
  117. package/dist/lib/server/decisioning/runtime/to-context.d.ts +54 -0
  118. package/dist/lib/server/decisioning/runtime/to-context.d.ts.map +1 -0
  119. package/dist/lib/server/decisioning/runtime/to-context.js +166 -0
  120. package/dist/lib/server/decisioning/runtime/to-context.js.map +1 -0
  121. package/dist/lib/server/decisioning/runtime/validate-platform.d.ts +20 -0
  122. package/dist/lib/server/decisioning/runtime/validate-platform.d.ts.map +1 -0
  123. package/dist/lib/server/decisioning/runtime/validate-platform.js +93 -0
  124. package/dist/lib/server/decisioning/runtime/validate-platform.js.map +1 -0
  125. package/dist/lib/server/decisioning/specialisms/audiences.d.ts +72 -0
  126. package/dist/lib/server/decisioning/specialisms/audiences.d.ts.map +1 -0
  127. package/dist/lib/server/decisioning/specialisms/audiences.js +15 -0
  128. package/dist/lib/server/decisioning/specialisms/audiences.js.map +1 -0
  129. package/dist/lib/server/decisioning/specialisms/brand-rights.d.ts +92 -0
  130. package/dist/lib/server/decisioning/specialisms/brand-rights.d.ts.map +1 -0
  131. package/dist/lib/server/decisioning/specialisms/brand-rights.js +28 -0
  132. package/dist/lib/server/decisioning/specialisms/brand-rights.js.map +1 -0
  133. package/dist/lib/server/decisioning/specialisms/campaign-governance.d.ts +67 -0
  134. package/dist/lib/server/decisioning/specialisms/campaign-governance.d.ts.map +1 -0
  135. package/dist/lib/server/decisioning/specialisms/campaign-governance.js +31 -0
  136. package/dist/lib/server/decisioning/specialisms/campaign-governance.js.map +1 -0
  137. package/dist/lib/server/decisioning/specialisms/content-standards.d.ts +78 -0
  138. package/dist/lib/server/decisioning/specialisms/content-standards.d.ts.map +1 -0
  139. package/dist/lib/server/decisioning/specialisms/content-standards.js +35 -0
  140. package/dist/lib/server/decisioning/specialisms/content-standards.js.map +1 -0
  141. package/dist/lib/server/decisioning/specialisms/creative-ad-server.d.ts +81 -0
  142. package/dist/lib/server/decisioning/specialisms/creative-ad-server.d.ts.map +1 -0
  143. package/dist/lib/server/decisioning/specialisms/creative-ad-server.js +28 -0
  144. package/dist/lib/server/decisioning/specialisms/creative-ad-server.js.map +1 -0
  145. package/dist/lib/server/decisioning/specialisms/creative.d.ts +144 -0
  146. package/dist/lib/server/decisioning/specialisms/creative.d.ts.map +1 -0
  147. package/dist/lib/server/decisioning/specialisms/creative.js +19 -0
  148. package/dist/lib/server/decisioning/specialisms/creative.js.map +1 -0
  149. package/dist/lib/server/decisioning/specialisms/lists.d.ts +61 -0
  150. package/dist/lib/server/decisioning/specialisms/lists.d.ts.map +1 -0
  151. package/dist/lib/server/decisioning/specialisms/lists.js +30 -0
  152. package/dist/lib/server/decisioning/specialisms/lists.js.map +1 -0
  153. package/dist/lib/server/decisioning/specialisms/sales.d.ts +163 -0
  154. package/dist/lib/server/decisioning/specialisms/sales.d.ts.map +1 -0
  155. package/dist/lib/server/decisioning/specialisms/sales.js +64 -0
  156. package/dist/lib/server/decisioning/specialisms/sales.js.map +1 -0
  157. package/dist/lib/server/decisioning/specialisms/signals.d.ts +64 -0
  158. package/dist/lib/server/decisioning/specialisms/signals.d.ts.map +1 -0
  159. package/dist/lib/server/decisioning/specialisms/signals.js +28 -0
  160. package/dist/lib/server/decisioning/specialisms/signals.js.map +1 -0
  161. package/dist/lib/server/decisioning/start-time.d.ts +76 -0
  162. package/dist/lib/server/decisioning/start-time.d.ts.map +1 -0
  163. package/dist/lib/server/decisioning/start-time.js +81 -0
  164. package/dist/lib/server/decisioning/start-time.js.map +1 -0
  165. package/dist/lib/server/decisioning/status-changes.d.ts +165 -0
  166. package/dist/lib/server/decisioning/status-changes.d.ts.map +1 -0
  167. package/dist/lib/server/decisioning/status-changes.js +131 -0
  168. package/dist/lib/server/decisioning/status-changes.js.map +1 -0
  169. package/dist/lib/server/decisioning/status-mappers.d.ts +46 -0
  170. package/dist/lib/server/decisioning/status-mappers.d.ts.map +1 -0
  171. package/dist/lib/server/decisioning/status-mappers.js +46 -0
  172. package/dist/lib/server/decisioning/status-mappers.js.map +1 -0
  173. package/dist/lib/server/decisioning/tenant-registry.d.ts +289 -0
  174. package/dist/lib/server/decisioning/tenant-registry.d.ts.map +1 -0
  175. package/dist/lib/server/decisioning/tenant-registry.js +503 -0
  176. package/dist/lib/server/decisioning/tenant-registry.js.map +1 -0
  177. package/dist/lib/server/express-adapter.d.ts +1 -1
  178. package/dist/lib/server/express-adapter.js +1 -1
  179. package/dist/lib/server/governance.d.ts +1 -1
  180. package/dist/lib/server/governance.js +1 -1
  181. package/dist/lib/server/idempotency/store.d.ts +1 -1
  182. package/dist/lib/server/idempotency/store.js +1 -1
  183. package/dist/lib/server/index.d.ts +9 -2
  184. package/dist/lib/server/index.d.ts.map +1 -1
  185. package/dist/lib/server/index.js +79 -4
  186. package/dist/lib/server/index.js.map +1 -1
  187. package/dist/lib/server/legacy/v5/index.d.ts +38 -0
  188. package/dist/lib/server/legacy/v5/index.d.ts.map +1 -0
  189. package/dist/lib/server/legacy/v5/index.js +60 -0
  190. package/dist/lib/server/legacy/v5/index.js.map +1 -0
  191. package/dist/lib/server/normalize-errors.d.ts +88 -0
  192. package/dist/lib/server/normalize-errors.d.ts.map +1 -0
  193. package/dist/lib/server/normalize-errors.js +146 -0
  194. package/dist/lib/server/normalize-errors.js.map +1 -0
  195. package/dist/lib/server/pick-safe-details.d.ts +90 -0
  196. package/dist/lib/server/pick-safe-details.d.ts.map +1 -0
  197. package/dist/lib/server/pick-safe-details.js +148 -0
  198. package/dist/lib/server/pick-safe-details.js.map +1 -0
  199. package/dist/lib/server/postgres-state-store.d.ts +1 -1
  200. package/dist/lib/server/postgres-state-store.js +1 -1
  201. package/dist/lib/server/responses.d.ts +38 -0
  202. package/dist/lib/server/responses.d.ts.map +1 -1
  203. package/dist/lib/server/responses.js +38 -0
  204. package/dist/lib/server/responses.js.map +1 -1
  205. package/dist/lib/server/state-store.d.ts +1 -1
  206. package/dist/lib/server/state-store.js +1 -1
  207. package/dist/lib/server/test-controller.d.ts +10 -3
  208. package/dist/lib/server/test-controller.d.ts.map +1 -1
  209. package/dist/lib/server/test-controller.js +10 -3
  210. package/dist/lib/server/test-controller.js.map +1 -1
  211. package/dist/lib/testing/comply-controller.d.ts +47 -1
  212. package/dist/lib/testing/comply-controller.d.ts.map +1 -1
  213. package/dist/lib/testing/comply-controller.js +11 -4
  214. package/dist/lib/testing/comply-controller.js.map +1 -1
  215. package/dist/lib/testing/index.d.ts +1 -1
  216. package/dist/lib/testing/index.d.ts.map +1 -1
  217. package/dist/lib/testing/index.js.map +1 -1
  218. package/dist/lib/testing/personas/index.d.ts +143 -0
  219. package/dist/lib/testing/personas/index.d.ts.map +1 -0
  220. package/dist/lib/testing/personas/index.js +190 -0
  221. package/dist/lib/testing/personas/index.js.map +1 -0
  222. package/dist/lib/testing/storyboard/index.d.ts +1 -1
  223. package/dist/lib/testing/storyboard/index.d.ts.map +1 -1
  224. package/dist/lib/testing/storyboard/index.js +3 -2
  225. package/dist/lib/testing/storyboard/index.js.map +1 -1
  226. package/dist/lib/testing/storyboard/runner.d.ts +13 -0
  227. package/dist/lib/testing/storyboard/runner.d.ts.map +1 -1
  228. package/dist/lib/testing/storyboard/runner.js +179 -7
  229. package/dist/lib/testing/storyboard/runner.js.map +1 -1
  230. package/dist/lib/types/adcp.d.ts.map +1 -1
  231. package/dist/lib/types/adcp.js +1 -0
  232. package/dist/lib/types/adcp.js.map +1 -1
  233. package/dist/lib/types/asset-instances.d.ts +1 -0
  234. package/dist/lib/types/asset-instances.d.ts.map +1 -1
  235. package/dist/lib/types/core.generated.d.ts +203 -98
  236. package/dist/lib/types/core.generated.d.ts.map +1 -1
  237. package/dist/lib/types/core.generated.js +1 -1
  238. package/dist/lib/types/index.d.ts +1 -0
  239. package/dist/lib/types/index.d.ts.map +1 -1
  240. package/dist/lib/types/index.js.map +1 -1
  241. package/dist/lib/types/schemas.generated.d.ts +599 -159
  242. package/dist/lib/types/schemas.generated.d.ts.map +1 -1
  243. package/dist/lib/types/schemas.generated.js +175 -94
  244. package/dist/lib/types/schemas.generated.js.map +1 -1
  245. package/dist/lib/types/tools.generated.d.ts +315 -46
  246. package/dist/lib/types/tools.generated.d.ts.map +1 -1
  247. package/dist/lib/utils/capabilities.d.ts +1 -1
  248. package/dist/lib/utils/capabilities.d.ts.map +1 -1
  249. package/dist/lib/utils/capabilities.js +6 -0
  250. package/dist/lib/utils/capabilities.js.map +1 -1
  251. package/dist/lib/validation/schema-validator.d.ts +13 -0
  252. package/dist/lib/validation/schema-validator.d.ts.map +1 -1
  253. package/dist/lib/validation/schema-validator.js +240 -3
  254. package/dist/lib/validation/schema-validator.js.map +1 -1
  255. package/dist/lib/version.d.ts +3 -3
  256. package/dist/lib/version.d.ts.map +1 -1
  257. package/dist/lib/version.js +3 -3
  258. package/dist/lib/version.js.map +1 -1
  259. package/docs/guides/BUILD-AN-AGENT.md +30 -5
  260. package/docs/llms.txt +28 -17
  261. package/examples/README.md +3 -1
  262. package/examples/decisioning-platform-broadcast-tv.ts +300 -0
  263. package/examples/decisioning-platform-identity-graph.ts +214 -0
  264. package/examples/decisioning-platform-mock-seller.ts +332 -0
  265. package/examples/decisioning-platform-multi-tenant.ts +128 -0
  266. package/examples/decisioning-platform-programmatic.ts +254 -0
  267. package/examples/signals-agent.ts +1 -1
  268. package/package.json +13 -2
  269. package/skills/build-brand-rights-agent/SKILL.md +10 -3
  270. package/skills/build-creative-agent/SKILL.md +94 -64
  271. package/skills/build-decisioning-creative-template/SKILL.md +554 -0
  272. package/skills/build-decisioning-platform/SKILL.md +304 -0
  273. package/skills/build-decisioning-platform/advanced/BRAND-RIGHTS.md +25 -0
  274. package/skills/build-decisioning-platform/advanced/COMPLIANCE.md +23 -0
  275. package/skills/build-decisioning-platform/advanced/GOVERNANCE.md +24 -0
  276. package/skills/build-decisioning-platform/advanced/HITL.md +34 -0
  277. package/skills/build-decisioning-platform/advanced/IDEMPOTENCY.md +52 -0
  278. package/skills/build-decisioning-platform/advanced/MULTI-TENANT.md +47 -0
  279. package/skills/build-decisioning-platform/advanced/OAUTH.md +22 -0
  280. package/skills/build-decisioning-platform/advanced/REFERENCE.md +991 -0
  281. package/skills/build-decisioning-platform/advanced/SANDBOX.md +24 -0
  282. package/skills/build-decisioning-platform/advanced/STATE-MACHINE.md +52 -0
  283. package/skills/build-decisioning-signal-marketplace/SKILL.md +269 -0
  284. package/skills/build-generative-seller-agent/SKILL.md +89 -53
  285. package/skills/build-governance-agent/SKILL.md +76 -45
  286. package/skills/build-retail-media-agent/SKILL.md +87 -62
  287. package/skills/build-seller-agent/SKILL.md +384 -255
  288. package/skills/build-seller-agent/deployment.md +5 -3
  289. package/skills/build-seller-agent/specialisms/audience-sync.md +0 -2
  290. package/skills/build-seller-agent/specialisms/sales-broadcast-tv.md +0 -2
  291. package/skills/build-seller-agent/specialisms/sales-guaranteed.md +0 -2
  292. package/skills/build-seller-agent/specialisms/sales-non-guaranteed.md +0 -2
  293. package/skills/build-seller-agent/specialisms/sales-proposal-mode.md +0 -2
  294. package/skills/build-seller-agent/specialisms/sales-social.md +0 -2
  295. package/skills/build-seller-agent/specialisms/signed-requests.md +0 -2
  296. package/skills/build-si-agent/SKILL.md +40 -32
  297. package/skills/build-signals-agent/SKILL.md +139 -92
  298. package/skills/call-adcp-agent.previous/SKILL.md +5 -0
@@ -0,0 +1,289 @@
1
+ /**
2
+ * TenantRegistry — multi-tenant deployment helper for the v6.0 decisioning
3
+ * runtime.
4
+ *
5
+ * Holds a map of `agentUrl → TenantConfig` and tracks per-tenant health.
6
+ * Composes with the existing `serve()` host-routing surface: the registry
7
+ * returns an `AdcpServer` factory that dispatches based on `ctx.host`.
8
+ *
9
+ * **Three health states**, never startup-fatal:
10
+ *
11
+ * - `healthy` — JWKS validated, accepting traffic normally.
12
+ * - `unverified` — validation hasn't completed (server starting, or
13
+ * JWKS unreachable transiently). Tenant accepts traffic with a
14
+ * warning header; framework periodically re-validates.
15
+ * - `disabled` — validation failed deterministically (signing key not
16
+ * in published JWKS, brand.json malformed). Tenant returns
17
+ * `SERVICE_UNAVAILABLE` until an admin recheck succeeds.
18
+ *
19
+ * One bad tenant doesn't take down others — health is per-tenant, the
20
+ * other tenants keep serving.
21
+ *
22
+ * Status: Preview / 6.0.
23
+ *
24
+ * @public
25
+ */
26
+ import type { DecisioningPlatform, RequiredPlatformsFor, RequiredCapabilitiesFor } from './platform';
27
+ import type { DecisioningAdcpServer, CreateAdcpServerFromPlatformOptions } from './runtime/from-platform';
28
+ export interface TenantSigningKey {
29
+ /** Stable key identifier — appears in the `Signature-Input` header. */
30
+ keyId: string;
31
+ /**
32
+ * JWK form of the public key. MUST appear in the JWKS at
33
+ * `{agentUrl}/.well-known/brand.json` for the tenant to validate.
34
+ */
35
+ publicJwk: JsonWebKey;
36
+ /** Private JWK used to sign outbound responses (RFC 9421). */
37
+ privateJwk: JsonWebKey;
38
+ }
39
+ export interface TenantConfig<P extends DecisioningPlatform = DecisioningPlatform> {
40
+ /**
41
+ * Public URL the tenant accepts traffic on (e.g.,
42
+ * `https://acme-tv.example.com`). Used for host-route matching and —
43
+ * unless `jwksUrl` overrides — as the JWKS fetch base (the default
44
+ * validator computes `{host}/.well-known/brand.json` from this URL).
45
+ *
46
+ * For deployments that accept traffic on multiple URLs simultaneously
47
+ * (DNS cutover, vanity domains, internal + public hostname), use
48
+ * {@link agentUrls} instead — `agentUrl` is the single-URL convenience
49
+ * form. When both are set, `agentUrls` wins and `agentUrl` is ignored.
50
+ */
51
+ agentUrl?: string;
52
+ /**
53
+ * Multiple public URLs this tenant accepts traffic on. Use for cutover
54
+ * windows where `old.example.com/mcp` and `new.example.com/mcp` must
55
+ * both resolve to the same tenant for a window before DNS or buyer
56
+ * caches catch up. The first URL is the **canonical** one — JWKS
57
+ * validation uses it (and any `jwksUrl` override applies to all URLs).
58
+ * Additional URLs are aliases; they share the same brand and signing
59
+ * key.
60
+ *
61
+ * Adopters with two truly distinct brands serving from one platform
62
+ * should register separate tenants — each brand has its own JWKS and
63
+ * signing identity. `agentUrls` is for the single-brand-multiple-URLs
64
+ * case.
65
+ *
66
+ * MUST contain at least one URL when set. Exactly one of `agentUrl` or
67
+ * `agentUrls` must be provided; supplying both is a register() error.
68
+ */
69
+ agentUrls?: string[];
70
+ /**
71
+ * Override the JWKS fetch URL for this tenant. Use this when the
72
+ * tenant's brand.json doesn't sit at the host root — i.e., a single
73
+ * host serves multiple agents under path prefixes
74
+ * (`https://shared.example.com/api/agent-a`,
75
+ * `https://shared.example.com/api/agent-b`) and each prefix has its
76
+ * own brand identity. Without this override, the default validator
77
+ * resolves `/.well-known/brand.json` against the host root, which
78
+ * collapses both agents onto the same brand.
79
+ *
80
+ * Spec convention is host-root, so the override is only needed for
81
+ * sub-routed multi-tenant deployments. Custom validators that take a
82
+ * different shape entirely (e.g., reading from a vault) read this
83
+ * field via the `jwksUrl` argument on `JwksValidator.validate`.
84
+ */
85
+ jwksUrl?: string;
86
+ /** Signing keypair for RFC 9421 response signing. */
87
+ signingKey: TenantSigningKey;
88
+ /** The DecisioningPlatform impl for this tenant. */
89
+ platform: P & RequiredPlatformsFor<P['capabilities']['specialisms'][number]> & RequiredCapabilitiesFor<P['capabilities']['specialisms'][number]>;
90
+ /** Display label for admin / logs. Optional. */
91
+ label?: string;
92
+ /** Per-tenant `createAdcpServerFromPlatform` options override. */
93
+ serverOptions?: Partial<CreateAdcpServerFromPlatformOptions>;
94
+ }
95
+ /**
96
+ * Tenant health lifecycle:
97
+ * - `'pending'` — first JWKS validation hasn't succeeded yet. Brand-new
98
+ * tenants land here. `resolveByHost` REFUSES TRAFFIC for `pending`
99
+ * tenants — host transport should respond 503 + Retry-After. This
100
+ * closes the register-then-serve race window where a tenant
101
+ * registered with a wrong signing key would have served signed
102
+ * responses no buyer can verify until the first refresh detected
103
+ * the mismatch (60+ seconds).
104
+ * - `'healthy'` — JWKS validation has succeeded at least once.
105
+ * Periodic rechecks confirm.
106
+ * - `'unverified'` — was previously `healthy`; latest recheck failed
107
+ * transiently (network error, 5xx, etc.). `resolveByHost` still
108
+ * returns the tenant — graceful degradation for known-good tenants
109
+ * when brand.json is briefly unreachable. Distinct from `'pending'`
110
+ * where we've never validated.
111
+ * - `'disabled'` — permanent validation failure (key not in published
112
+ * JWKS, brand.json malformed, etc.). `resolveByHost` returns null;
113
+ * operator must fix and call `recheck()` to revive.
114
+ */
115
+ export type TenantHealth = 'pending' | 'healthy' | 'unverified' | 'disabled';
116
+ export interface TenantStatus {
117
+ tenantId: string;
118
+ /**
119
+ * Canonical URL — the first entry in the tenant's `agentUrls` (or the
120
+ * single `agentUrl` value). JWKS validates against this URL; ops
121
+ * dashboards page on this field for the primary identity.
122
+ */
123
+ agentUrl: string;
124
+ /**
125
+ * Full URL list when the tenant was registered with `agentUrls[]`.
126
+ * Single-URL tenants get a one-element array. Ops dashboards iterate
127
+ * this field to show every URL serving the tenant; required so admins
128
+ * can detect stale aliases or accidental host overlap with another
129
+ * tenant (#1097 follow-up — collision check below errors at register
130
+ * time, but the operator still wants visibility into what's live).
131
+ */
132
+ agentUrls: readonly string[];
133
+ health: TenantHealth;
134
+ /** Reason for unverified/disabled state. */
135
+ reason?: string;
136
+ /** ISO timestamp of the last health check. */
137
+ lastCheckedAt: string;
138
+ }
139
+ export interface JwksValidationResult {
140
+ ok: boolean;
141
+ /** Recovery classification when `ok === false`. */
142
+ recovery?: 'transient' | 'permanent';
143
+ reason?: string;
144
+ }
145
+ export interface JwksValidator {
146
+ /**
147
+ * Validate that the tenant's signing key appears in the published JWKS.
148
+ *
149
+ * - `agentUrl` is the tenant's public URL (used for host-relative URL
150
+ * computation by the default validator).
151
+ * - `jwksUrl` is the explicit JWKS fetch URL when the tenant's
152
+ * `TenantConfig.jwksUrl` was set; absent for the spec-default
153
+ * host-root resolution.
154
+ * - `signingKey` is what to look for in the published JWKS.
155
+ */
156
+ validate(opts: {
157
+ agentUrl: string;
158
+ jwksUrl?: string;
159
+ signingKey: TenantSigningKey;
160
+ }): Promise<JwksValidationResult>;
161
+ }
162
+ export interface TenantRegistryOptions {
163
+ /**
164
+ * JWKS validator. Defaults to a fetch-based validator that hits
165
+ * `{agentUrl}/.well-known/brand.json`. Tests can pass a fake.
166
+ */
167
+ jwksValidator?: JwksValidator;
168
+ /**
169
+ * Per-tenant `createAdcpServerFromPlatform` options applied to every
170
+ * tenant unless overridden by `TenantConfig.serverOptions`.
171
+ */
172
+ defaultServerOptions: CreateAdcpServerFromPlatformOptions;
173
+ /**
174
+ * Auto-validate tenants when they're registered. Defaults to `true`.
175
+ *
176
+ * Disable ONLY for tests that drive validation manually via `recheck` —
177
+ * with this off, every `register()` leaves the tenant in `'pending'`
178
+ * health and `resolveByRequest` silently refuses traffic until the
179
+ * caller recheck()s each tenant. Production deployments should leave
180
+ * this at the default; the framework emits a one-shot console.warn at
181
+ * registry construction when `autoValidate: false` is set, to surface
182
+ * the "all traffic blocked" consequence.
183
+ */
184
+ autoValidate?: boolean;
185
+ }
186
+ export interface TenantRegistry {
187
+ /**
188
+ * Register a tenant. Tenant lands in `'pending'` health initially —
189
+ * `resolveByHost` refuses traffic until the first JWKS validation
190
+ * succeeds. Pass `{ awaitFirstValidation: true }` to block on the
191
+ * synchronous validation outcome (returns the resulting status; throws
192
+ * if registration is incompatible). Without the flag, register fires
193
+ * validation in the background and returns immediately; the caller
194
+ * polls `getStatus(tenantId).health === 'healthy'` if needed.
195
+ *
196
+ * **Admin-API security.** This method is the privileged surface — any
197
+ * caller invoking `register` can introduce a tenant that will sign
198
+ * outbound webhooks. Hosts wiring an HTTP/RPC endpoint in front of
199
+ * `register` MUST gate it with operator-level auth (mTLS, signed
200
+ * admin tokens, network ACL). The framework doesn't ship admin-HTTP
201
+ * scaffolding because the right auth shape varies by deployment;
202
+ * adopters who want a vetted shape can layer Express middleware
203
+ * around their `registry.register(...)` route handler.
204
+ */
205
+ register<P extends DecisioningPlatform>(tenantId: string, config: TenantConfig<P>, opts?: {
206
+ awaitFirstValidation?: boolean;
207
+ }): Promise<TenantStatus> | void;
208
+ unregister(tenantId: string): void;
209
+ /**
210
+ * Resolve a tenant by host alone (the lowercased authority of the
211
+ * request). Convenience wrapper around `resolveByRequest(host, '/')` —
212
+ * works for the canonical subdomain-routing pattern (e.g.,
213
+ * `sales.training.example.com`) where each tenant has its own host.
214
+ *
215
+ * For path-based routing (`training.example.com/sales`,
216
+ * `training.example.com/creative` on a single host), use
217
+ * `resolveByRequest(host, pathname)` instead.
218
+ *
219
+ * Returns null if no tenant matches, the tenant is `pending` (first
220
+ * validation hasn't succeeded), or the tenant is `disabled`.
221
+ * `unverified` tenants resolve normally — graceful degradation for
222
+ * known-good tenants whose latest recheck failed transiently.
223
+ */
224
+ resolveByHost(host: string): {
225
+ tenantId: string;
226
+ config: TenantConfig;
227
+ server: DecisioningAdcpServer;
228
+ } | null;
229
+ /**
230
+ * Resolve a tenant by host AND request path. The framework matches
231
+ * tenants whose `agentUrl` host equals the request host AND whose
232
+ * `agentUrl` path is a prefix of the request `pathname`. When multiple
233
+ * tenants share a host, the LONGEST matching path prefix wins (so
234
+ * `/sales-broadcast` is preferred over `/sales` for a request to
235
+ * `/sales-broadcast/mcp`).
236
+ *
237
+ * Use this for path-routed multi-tenant deployments where adopters
238
+ * don't want per-tenant subdomain DNS / TLS overhead. Each tenant's
239
+ * `agentUrl` carries the path: `https://training.example.com/sales`.
240
+ * Subdomain-routed tenants (`https://sales.training.example.com`)
241
+ * keep working — their path prefix is `/`, which matches any pathname.
242
+ *
243
+ * Returns null on no match, `pending`, or `disabled`. `unverified`
244
+ * tenants resolve normally (graceful degradation).
245
+ */
246
+ resolveByRequest(host: string, pathname: string): {
247
+ tenantId: string;
248
+ config: TenantConfig;
249
+ server: DecisioningAdcpServer;
250
+ } | null;
251
+ /**
252
+ * Direct tenant lookup by `tenantId`. Use this when your route layer
253
+ * has already resolved the tenant from session / path / header and
254
+ * needs the registry's `{ config, server }` entry without re-running
255
+ * URL parsing. Same `pending` / `disabled` health gate as the
256
+ * `resolveByXxx` helpers — returns `null` when the tenant isn't
257
+ * accepting traffic so callers don't have to re-check status.
258
+ *
259
+ * Adopters who decouple tenant lookup from URL routing (e.g., bind
260
+ * tenantId at their own Express middleware before calling into the
261
+ * registry) should prefer this over `resolveByRequest(host, '/<id>/mcp')`
262
+ * tricks.
263
+ */
264
+ get(tenantId: string): {
265
+ tenantId: string;
266
+ config: TenantConfig;
267
+ server: DecisioningAdcpServer;
268
+ } | null;
269
+ getStatus(tenantId: string): TenantStatus | null;
270
+ list(): readonly TenantStatus[];
271
+ /**
272
+ * Trigger a JWKS recheck for the tenant. Admin UI calls this after
273
+ * fixing a brand.json mismatch.
274
+ */
275
+ recheck(tenantId: string): Promise<TenantStatus>;
276
+ }
277
+ /**
278
+ * Default JWKS validator. Fetches `{agentUrl}/.well-known/brand.json` and
279
+ * checks that `signingKey.publicJwk` appears in the JWKS keys array.
280
+ *
281
+ * Uses the global `fetch`. Network errors classify as `transient`;
282
+ * 4xx / parse-error / key-not-in-JWKS classify as `permanent`.
283
+ */
284
+ export declare function createDefaultJwksValidator(opts?: {
285
+ fetchImpl?: typeof fetch;
286
+ timeoutMs?: number;
287
+ }): JwksValidator;
288
+ export declare function createTenantRegistry(opts: TenantRegistryOptions): TenantRegistry;
289
+ //# sourceMappingURL=tenant-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tenant-registry.d.ts","sourceRoot":"","sources":["../../../../src/lib/server/decisioning/tenant-registry.ts"],"names":[],"mappings":"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"}