@adcp/sdk 15.9.1 → 16.0.0-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (321) hide show
  1. package/bin/adcp-identity.js +74 -0
  2. package/bin/adcp.js +2 -0
  3. package/dist/lib/adapters/keyed-account-backend.d.mts +37 -0
  4. package/dist/lib/adapters/keyed-account-backend.d.ts +37 -0
  5. package/dist/lib/adapters/keyed-account-backend.js +121 -0
  6. package/dist/lib/adapters/keyed-account-backend.mjs +94 -0
  7. package/dist/lib/adapters/keyed-account-store.d.mts +28 -0
  8. package/dist/lib/adapters/keyed-account-store.d.ts +28 -0
  9. package/dist/lib/adapters/keyed-account-store.js +227 -0
  10. package/dist/lib/adapters/keyed-account-store.mjs +203 -0
  11. package/dist/lib/core/SingleAgentClient.d.mts +25 -2
  12. package/dist/lib/core/SingleAgentClient.d.ts +25 -2
  13. package/dist/lib/core/SingleAgentClient.js +280 -62
  14. package/dist/lib/core/SingleAgentClient.mjs +282 -57
  15. package/dist/lib/core/TaskExecutor.d.mts +6 -0
  16. package/dist/lib/core/TaskExecutor.d.ts +6 -0
  17. package/dist/lib/core/TaskExecutor.js +66 -5
  18. package/dist/lib/core/TaskExecutor.mjs +71 -5
  19. package/dist/lib/core/postgres-webhook-registration-store.js +32 -5
  20. package/dist/lib/core/postgres-webhook-registration-store.mjs +32 -5
  21. package/dist/lib/core/redis-webhook-registration-store.js +23 -1
  22. package/dist/lib/core/redis-webhook-registration-store.mjs +23 -1
  23. package/dist/lib/core/webhook-registration.d.mts +7 -1
  24. package/dist/lib/core/webhook-registration.d.ts +7 -1
  25. package/dist/lib/core/webhook-registration.js +24 -2
  26. package/dist/lib/core/webhook-registration.mjs +23 -2
  27. package/dist/lib/identity-3.3/generated-compat.d.mts +34 -0
  28. package/dist/lib/identity-3.3/generated-compat.d.ts +34 -0
  29. package/dist/lib/identity-3.3/generated-compat.js +16 -0
  30. package/dist/lib/identity-3.3/generated-compat.mjs +0 -0
  31. package/dist/lib/identity-3.3/index.d.mts +10 -0
  32. package/dist/lib/identity-3.3/index.d.ts +10 -0
  33. package/dist/lib/identity-3.3/index.js +79 -0
  34. package/dist/lib/identity-3.3/index.mjs +50 -0
  35. package/dist/lib/identity-3.3/lifecycle.d.mts +125 -0
  36. package/dist/lib/identity-3.3/lifecycle.d.ts +125 -0
  37. package/dist/lib/identity-3.3/lifecycle.js +294 -0
  38. package/dist/lib/identity-3.3/lifecycle.mjs +272 -0
  39. package/dist/lib/identity-3.3/revocation.d.mts +86 -0
  40. package/dist/lib/identity-3.3/revocation.d.ts +86 -0
  41. package/dist/lib/identity-3.3/revocation.js +308 -0
  42. package/dist/lib/identity-3.3/revocation.mjs +286 -0
  43. package/dist/lib/identity-3.3/schemas.draft.d.mts +2472 -0
  44. package/dist/lib/identity-3.3/schemas.draft.d.ts +2472 -0
  45. package/dist/lib/identity-3.3/schemas.draft.js +1448 -0
  46. package/dist/lib/identity-3.3/schemas.draft.mjs +1428 -0
  47. package/dist/lib/identity-3.3/server.d.mts +46 -0
  48. package/dist/lib/identity-3.3/server.d.ts +46 -0
  49. package/dist/lib/identity-3.3/server.js +279 -0
  50. package/dist/lib/identity-3.3/server.mjs +260 -0
  51. package/dist/lib/identity-3.3/store.d.mts +24 -0
  52. package/dist/lib/identity-3.3/store.d.ts +24 -0
  53. package/dist/lib/identity-3.3/store.js +191 -0
  54. package/dist/lib/identity-3.3/store.mjs +169 -0
  55. package/dist/lib/identity-3.3/trust.d.mts +155 -0
  56. package/dist/lib/identity-3.3/trust.d.ts +155 -0
  57. package/dist/lib/identity-3.3/trust.js +383 -0
  58. package/dist/lib/identity-3.3/trust.mjs +342 -0
  59. package/dist/lib/identity-3.3/types.d.mts +155 -0
  60. package/dist/lib/identity-3.3/types.d.ts +155 -0
  61. package/dist/lib/identity-3.3/types.js +16 -0
  62. package/dist/lib/identity-3.3/types.mjs +0 -0
  63. package/dist/lib/identity-3.3/validation.d.mts +2 -0
  64. package/dist/lib/identity-3.3/validation.d.ts +2 -0
  65. package/dist/lib/identity-3.3/validation.js +125 -0
  66. package/dist/lib/identity-3.3/validation.mjs +91 -0
  67. package/dist/lib/index.d.mts +1 -1
  68. package/dist/lib/index.d.ts +1 -1
  69. package/dist/lib/index.js +2 -0
  70. package/dist/lib/index.mjs +2 -0
  71. package/dist/lib/protocols/index.d.mts +1 -1
  72. package/dist/lib/protocols/index.d.ts +1 -1
  73. package/dist/lib/protocols/index.js +2 -2
  74. package/dist/lib/protocols/index.mjs +2 -2
  75. package/dist/lib/reporting/azure/index.d.mts +5 -0
  76. package/dist/lib/reporting/azure/index.d.ts +5 -0
  77. package/dist/lib/reporting/azure/index.js +26 -7
  78. package/dist/lib/reporting/azure/index.mjs +26 -7
  79. package/dist/lib/reporting/bigquery/index.d.mts +39 -5
  80. package/dist/lib/reporting/bigquery/index.d.ts +39 -5
  81. package/dist/lib/reporting/bigquery/index.js +26 -20
  82. package/dist/lib/reporting/bigquery/index.mjs +26 -20
  83. package/dist/lib/reporting/gcs/adapter.d.mts +8 -1
  84. package/dist/lib/reporting/gcs/adapter.d.ts +8 -1
  85. package/dist/lib/reporting/gcs/errors.d.mts +6 -0
  86. package/dist/lib/reporting/gcs/errors.d.ts +6 -0
  87. package/dist/lib/reporting/gcs/fence.d.mts +5 -0
  88. package/dist/lib/reporting/gcs/fence.d.ts +5 -0
  89. package/dist/lib/reporting/gcs/index.d.mts +9 -0
  90. package/dist/lib/reporting/gcs/index.d.ts +9 -0
  91. package/dist/lib/reporting/gcs/reader.d.mts +27 -3
  92. package/dist/lib/reporting/gcs/reader.d.ts +27 -3
  93. package/dist/lib/reporting/gcs/row-provider.d.mts +7 -0
  94. package/dist/lib/reporting/gcs/row-provider.d.ts +7 -0
  95. package/dist/lib/reporting/gcs/row-provider.js +34 -14
  96. package/dist/lib/reporting/gcs/row-provider.mjs +34 -14
  97. package/dist/lib/reporting/ledger/change-feed.d.mts +22 -1
  98. package/dist/lib/reporting/ledger/change-feed.d.ts +22 -1
  99. package/dist/lib/reporting/ledger/index.d.mts +11 -0
  100. package/dist/lib/reporting/ledger/index.d.ts +11 -0
  101. package/dist/lib/reporting/ledger/managed-postgres.d.mts +8 -0
  102. package/dist/lib/reporting/ledger/managed-postgres.d.ts +8 -0
  103. package/dist/lib/reporting/ledger/managed-router.d.mts +27 -2
  104. package/dist/lib/reporting/ledger/managed-router.d.ts +27 -2
  105. package/dist/lib/reporting/ledger/managed.d.mts +86 -6
  106. package/dist/lib/reporting/ledger/managed.d.ts +86 -6
  107. package/dist/lib/reporting/ledger/notification-activity.d.mts +65 -3
  108. package/dist/lib/reporting/ledger/notification-activity.d.ts +65 -3
  109. package/dist/lib/reporting/ledger/object-writes.d.mts +64 -5
  110. package/dist/lib/reporting/ledger/object-writes.d.ts +64 -5
  111. package/dist/lib/reporting/ledger/postgres.d.mts +43 -9
  112. package/dist/lib/reporting/ledger/postgres.d.ts +43 -9
  113. package/dist/lib/reporting/ledger/postgres.js +43 -27
  114. package/dist/lib/reporting/ledger/postgres.mjs +43 -27
  115. package/dist/lib/reporting/ledger/row-encoding.d.mts +92 -6
  116. package/dist/lib/reporting/ledger/row-encoding.d.ts +92 -6
  117. package/dist/lib/reporting/ledger/row-encoding.js +8 -4
  118. package/dist/lib/reporting/ledger/row-encoding.mjs +6 -3
  119. package/dist/lib/reporting/ledger/row-storage-errors.d.mts +11 -1
  120. package/dist/lib/reporting/ledger/row-storage-errors.d.ts +11 -1
  121. package/dist/lib/reporting/ledger/row-storage-migration.d.mts +19 -1
  122. package/dist/lib/reporting/ledger/row-storage-migration.d.ts +19 -1
  123. package/dist/lib/reporting/ledger/row-storage-migration.js +133 -18
  124. package/dist/lib/reporting/ledger/row-storage-migration.mjs +133 -18
  125. package/dist/lib/reporting/ledger/row-storage-object.d.mts +103 -12
  126. package/dist/lib/reporting/ledger/row-storage-object.d.ts +103 -12
  127. package/dist/lib/reporting/ledger/row-storage-object.js +106 -31
  128. package/dist/lib/reporting/ledger/row-storage-object.mjs +104 -31
  129. package/dist/lib/reporting/ledger/row-storage.d.mts +87 -20
  130. package/dist/lib/reporting/ledger/row-storage.d.ts +87 -20
  131. package/dist/lib/reporting/ledger/row-storage.js +126 -66
  132. package/dist/lib/reporting/ledger/row-storage.mjs +129 -67
  133. package/dist/lib/reporting/ledger/schedule.d.mts +13 -0
  134. package/dist/lib/reporting/ledger/schedule.d.ts +13 -0
  135. package/dist/lib/reporting/ledger/schedule.js +24 -0
  136. package/dist/lib/reporting/ledger/schedule.mjs +23 -0
  137. package/dist/lib/reporting/ledger/types.d.mts +23 -1
  138. package/dist/lib/reporting/ledger/types.d.ts +23 -1
  139. package/dist/lib/reporting/s3/index.d.mts +5 -0
  140. package/dist/lib/reporting/s3/index.d.ts +5 -0
  141. package/dist/lib/reporting/s3/index.js +37 -14
  142. package/dist/lib/reporting/s3/index.mjs +37 -14
  143. package/dist/lib/reporting/service/index.d.mts +10 -0
  144. package/dist/lib/reporting/service/index.d.ts +10 -0
  145. package/dist/lib/reporting/service/maintenance.d.mts +28 -2
  146. package/dist/lib/reporting/service/maintenance.d.ts +28 -2
  147. package/dist/lib/schemas-data/v2.5/_provenance.json +1 -1
  148. package/dist/lib/server/account-sync-contract.d.mts +14 -0
  149. package/dist/lib/server/account-sync-contract.d.ts +14 -0
  150. package/dist/lib/server/account-sync-contract.js +225 -0
  151. package/dist/lib/server/account-sync-contract.mjs +197 -0
  152. package/dist/lib/server/adcp-server.js +5 -0
  153. package/dist/lib/server/adcp-server.mjs +10 -0
  154. package/dist/lib/server/auth-signature.d.mts +15 -0
  155. package/dist/lib/server/auth-signature.d.ts +15 -0
  156. package/dist/lib/server/auth-signature.js +72 -2
  157. package/dist/lib/server/auth-signature.mjs +81 -2
  158. package/dist/lib/server/auth.d.mts +6 -0
  159. package/dist/lib/server/auth.d.ts +6 -0
  160. package/dist/lib/server/auth.js +6 -0
  161. package/dist/lib/server/auth.mjs +6 -0
  162. package/dist/lib/server/create-adcp-server.d.mts +19 -5
  163. package/dist/lib/server/create-adcp-server.d.ts +19 -5
  164. package/dist/lib/server/create-adcp-server.js +259 -19
  165. package/dist/lib/server/create-adcp-server.mjs +266 -10
  166. package/dist/lib/server/decisioning/account.d.mts +24 -1
  167. package/dist/lib/server/decisioning/account.d.ts +24 -1
  168. package/dist/lib/server/decisioning/index.d.mts +1 -1
  169. package/dist/lib/server/decisioning/index.d.ts +1 -1
  170. package/dist/lib/server/decisioning/runtime/from-platform.d.mts +0 -50
  171. package/dist/lib/server/decisioning/runtime/from-platform.d.ts +0 -50
  172. package/dist/lib/server/decisioning/runtime/from-platform.js +61 -11
  173. package/dist/lib/server/decisioning/runtime/from-platform.mjs +65 -12
  174. package/dist/lib/server/index.d.mts +2 -0
  175. package/dist/lib/server/index.d.ts +2 -0
  176. package/dist/lib/server/index.js +12 -0
  177. package/dist/lib/server/index.mjs +12 -0
  178. package/dist/lib/server/notification-subscriptions/runtime.js +9 -1
  179. package/dist/lib/server/notification-subscriptions/runtime.mjs +9 -1
  180. package/dist/lib/server/notification-subscriptions/types.d.mts +5 -0
  181. package/dist/lib/server/notification-subscriptions/types.d.ts +5 -0
  182. package/dist/lib/server/principal/types.d.mts +1 -1
  183. package/dist/lib/server/principal/types.d.ts +1 -1
  184. package/dist/lib/server/serve.js +5 -0
  185. package/dist/lib/server/serve.mjs +5 -0
  186. package/dist/lib/server/webhook-delivery/recovery.d.mts +1 -0
  187. package/dist/lib/server/webhook-delivery/recovery.d.ts +1 -0
  188. package/dist/lib/server/webhook-delivery/recovery.js +4 -0
  189. package/dist/lib/server/webhook-delivery/recovery.mjs +4 -0
  190. package/dist/lib/server/webhook-emitter.d.mts +10 -0
  191. package/dist/lib/server/webhook-emitter.d.ts +10 -0
  192. package/dist/lib/server/webhook-emitter.js +22 -0
  193. package/dist/lib/server/webhook-emitter.mjs +22 -0
  194. package/dist/lib/signing/agent-context.d.mts +0 -5
  195. package/dist/lib/signing/agent-context.d.ts +0 -5
  196. package/dist/lib/signing/agent-context.js +9 -1
  197. package/dist/lib/signing/agent-context.mjs +9 -1
  198. package/dist/lib/signing/agent-fetch.js +27 -2
  199. package/dist/lib/signing/agent-fetch.mjs +32 -2
  200. package/dist/lib/signing/agent-resolver/canonicalize.d.mts +10 -15
  201. package/dist/lib/signing/agent-resolver/canonicalize.d.ts +10 -15
  202. package/dist/lib/signing/agent-resolver/canonicalize.js +17 -5
  203. package/dist/lib/signing/agent-resolver/canonicalize.mjs +16 -5
  204. package/dist/lib/signing/agent-resolver/index.d.mts +1 -0
  205. package/dist/lib/signing/agent-resolver/index.d.ts +1 -0
  206. package/dist/lib/signing/agent-resolver/index.js +5 -0
  207. package/dist/lib/signing/agent-resolver/index.mjs +3 -0
  208. package/dist/lib/signing/agent-resolver/resolved-agent-jwks.d.mts +3 -2
  209. package/dist/lib/signing/agent-resolver/resolved-agent-jwks.d.ts +3 -2
  210. package/dist/lib/signing/agent-resolver/resolved-agent-jwks.js +30 -3
  211. package/dist/lib/signing/agent-resolver/resolved-agent-jwks.mjs +30 -3
  212. package/dist/lib/signing/agent-resolver/strict-json.d.mts +2 -2
  213. package/dist/lib/signing/agent-resolver/strict-json.d.ts +2 -2
  214. package/dist/lib/signing/agent-resolver/strict-json.js +5 -3
  215. package/dist/lib/signing/agent-resolver/strict-json.mjs +5 -3
  216. package/dist/lib/signing/brand-jwks.d.mts +2 -2
  217. package/dist/lib/signing/brand-jwks.d.ts +2 -2
  218. package/dist/lib/signing/brand-jwks.js +4 -4
  219. package/dist/lib/signing/brand-jwks.mjs +4 -4
  220. package/dist/lib/signing/client.d.mts +1 -0
  221. package/dist/lib/signing/client.d.ts +1 -0
  222. package/dist/lib/signing/client.js +5 -0
  223. package/dist/lib/signing/client.mjs +3 -0
  224. package/dist/lib/signing/crypto.js +8 -0
  225. package/dist/lib/signing/crypto.mjs +9 -1
  226. package/dist/lib/signing/fetch-async.js +1 -1
  227. package/dist/lib/signing/fetch-async.mjs +1 -1
  228. package/dist/lib/signing/fetch.js +1 -1
  229. package/dist/lib/signing/fetch.mjs +1 -1
  230. package/dist/lib/signing/jwks-https.d.mts +1 -1
  231. package/dist/lib/signing/jwks-https.d.ts +1 -1
  232. package/dist/lib/signing/jwks-https.js +1 -1
  233. package/dist/lib/signing/jwks-https.mjs +1 -1
  234. package/dist/lib/signing/jwks.d.mts +11 -3
  235. package/dist/lib/signing/jwks.d.ts +11 -3
  236. package/dist/lib/signing/jwks.js +1 -1
  237. package/dist/lib/signing/jwks.mjs +1 -1
  238. package/dist/lib/signing/middleware.js +9 -0
  239. package/dist/lib/signing/middleware.mjs +14 -0
  240. package/dist/lib/signing/parser.d.mts +9 -6
  241. package/dist/lib/signing/parser.d.ts +9 -6
  242. package/dist/lib/signing/parser.js +82 -64
  243. package/dist/lib/signing/parser.mjs +83 -65
  244. package/dist/lib/signing/revocation.d.mts +4 -1
  245. package/dist/lib/signing/revocation.d.ts +4 -1
  246. package/dist/lib/signing/revocation.js +36 -3
  247. package/dist/lib/signing/revocation.mjs +34 -2
  248. package/dist/lib/signing/server.d.mts +1 -1
  249. package/dist/lib/signing/server.d.ts +1 -1
  250. package/dist/lib/signing/server.js +4 -0
  251. package/dist/lib/signing/server.mjs +4 -0
  252. package/dist/lib/signing/types.d.mts +3 -0
  253. package/dist/lib/signing/types.d.ts +3 -0
  254. package/dist/lib/signing/verifier.js +1 -1
  255. package/dist/lib/signing/verifier.mjs +1 -1
  256. package/dist/lib/signing/web-bot-auth.d.mts +191 -0
  257. package/dist/lib/signing/web-bot-auth.d.ts +191 -0
  258. package/dist/lib/signing/web-bot-auth.js +837 -0
  259. package/dist/lib/signing/web-bot-auth.mjs +796 -0
  260. package/dist/lib/signing/webhook-verifier.js +1 -1
  261. package/dist/lib/signing/webhook-verifier.mjs +1 -1
  262. package/dist/lib/testing/client.d.mts +1 -4
  263. package/dist/lib/testing/client.d.ts +1 -4
  264. package/dist/lib/testing/client.js +141 -20
  265. package/dist/lib/testing/client.mjs +137 -19
  266. package/dist/lib/testing/compliance/comply.js +29 -10
  267. package/dist/lib/testing/compliance/comply.mjs +37 -11
  268. package/dist/lib/testing/storyboard/account-sync-contract.d.mts +3 -0
  269. package/dist/lib/testing/storyboard/account-sync-contract.d.ts +3 -0
  270. package/dist/lib/testing/storyboard/account-sync-contract.js +79 -0
  271. package/dist/lib/testing/storyboard/account-sync-contract.mjs +55 -0
  272. package/dist/lib/testing/storyboard/default-invariants.js +2 -0
  273. package/dist/lib/testing/storyboard/default-invariants.mjs +2 -0
  274. package/dist/lib/testing/storyboard/runner.js +23 -8
  275. package/dist/lib/testing/storyboard/runner.mjs +24 -8
  276. package/dist/lib/testing/storyboard/validations.d.mts +1 -1
  277. package/dist/lib/testing/storyboard/validations.d.ts +1 -1
  278. package/dist/lib/types/adcp.d.mts +4 -0
  279. package/dist/lib/types/adcp.d.ts +4 -0
  280. package/dist/lib/types/schemas.generated.d.ts +6 -6
  281. package/dist/lib/utils/capabilities.d.mts +1 -0
  282. package/dist/lib/utils/capabilities.d.ts +1 -0
  283. package/dist/lib/utils/capabilities.js +5 -0
  284. package/dist/lib/utils/capabilities.mjs +5 -0
  285. package/dist/lib/v2/projection/catalog-snapshot.js +3 -1
  286. package/dist/lib/v2/projection/catalog-snapshot.mjs +3 -1
  287. package/dist/lib/v2/projection/creative-delivery.d.mts +34 -10
  288. package/dist/lib/v2/projection/creative-delivery.d.ts +34 -10
  289. package/dist/lib/v2/projection/creative-delivery.js +26 -10
  290. package/dist/lib/v2/projection/creative-delivery.mjs +26 -10
  291. package/dist/lib/v2/projection/index.d.mts +1 -1
  292. package/dist/lib/v2/projection/index.d.ts +1 -1
  293. package/dist/lib/v2/projection/index.js +2 -0
  294. package/dist/lib/v2/projection/index.mjs +2 -0
  295. package/dist/lib/v2/projection/legacy-routes.d.mts +34 -2
  296. package/dist/lib/v2/projection/legacy-routes.d.ts +34 -2
  297. package/dist/lib/v2/projection/legacy-routes.js +35 -2
  298. package/dist/lib/v2/projection/legacy-routes.mjs +32 -2
  299. package/dist/lib/validation/schema-loader.d.mts +2 -0
  300. package/dist/lib/validation/schema-loader.d.ts +2 -0
  301. package/dist/lib/validation/schema-loader.js +43 -4
  302. package/dist/lib/validation/schema-loader.mjs +39 -3
  303. package/dist/lib/version.d.mts +3 -3
  304. package/dist/lib/version.d.ts +3 -3
  305. package/dist/lib/version.js +3 -3
  306. package/dist/lib/version.mjs +3 -3
  307. package/docs/TYPE-SUMMARY.md +2 -2
  308. package/docs/guides/DISCOVERY-CACHE-AND-SESSION-REUSE.md +4 -0
  309. package/docs/guides/REPORTING-LEDGER-CUTOVER.md +1 -1
  310. package/docs/guides/REPORTING-LEDGER.md +99 -29
  311. package/docs/guides/REPORTING-OPERATIONS.md +29 -13
  312. package/docs/guides/REPORTING-STABILITY.md +76 -0
  313. package/docs/guides/account-resolution.md +101 -0
  314. package/docs/llms.txt +3 -2
  315. package/docs/migration-12-to-13.md +15 -0
  316. package/docs/migration-14.x-rc-worksheet.md +4 -4
  317. package/docs/migration-agent-identity-3.3.md +494 -0
  318. package/docs/migration-agent-resolution-3.3.md +5 -0
  319. package/docs/migration-reporting-row-storage-alignment.md +137 -0
  320. package/examples/storyboards/account-sync-contract.yaml +57 -0
  321. package/package.json +17 -1
@@ -0,0 +1,24 @@
1
+ import type { AdcpStateStore } from '../server/state-store';
2
+ import { type MonotonicOriginRevocationStore } from './revocation';
3
+ import type { OriginIdentityStore } from './lifecycle';
4
+ /** CAS-backed stores work with the SDK's PostgresStateStore and custom shared backends. */
5
+ export declare function createIdentity33StateStores(options: {
6
+ store: AdcpStateStore;
7
+ tenantId: string;
8
+ collection?: string;
9
+ /** Separate capacity for bound and unbound origins. Raising limits preserves every existing fact. */
10
+ revocationLimits?: {
11
+ keys?: number;
12
+ origins?: number;
13
+ operatorKeys?: number;
14
+ operatorOrigins?: number;
15
+ originKeys?: number;
16
+ };
17
+ }): {
18
+ identity: OriginIdentityStore;
19
+ authorityHistory: {
20
+ has(operator: string): Promise<boolean>;
21
+ mark(operator: string): Promise<void>;
22
+ };
23
+ revocations: MonotonicOriginRevocationStore;
24
+ };
@@ -0,0 +1,191 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var store_exports = {};
20
+ __export(store_exports, {
21
+ createIdentity33StateStores: () => createIdentity33StateStores
22
+ });
23
+ module.exports = __toCommonJS(store_exports);
24
+ var import_crypto = require("crypto");
25
+ var import_canonicalize = require('../signing/agent-resolver/canonicalize.js');
26
+ var import_etld = require('../signing/agent-resolver/etld.js');
27
+ var import_trust = require('./trust.js');
28
+ var import_revocation = require('./revocation.js');
29
+ function createIdentity33StateStores(options) {
30
+ const { store, tenantId } = options, collection = options.collection ?? "identity33";
31
+ if (!tenantId || tenantId.length > 255 || !store.getWithVersion || !store.putIfMatch)
32
+ throw new TypeError("Identity stores require trusted tenantId and atomic getWithVersion/putIfMatch");
33
+ const revocationLimits = {
34
+ keys: 1e5,
35
+ origins: 1e4,
36
+ operatorKeys: 16384,
37
+ operatorOrigins: 256,
38
+ originKeys: 16384,
39
+ ...options.revocationLimits
40
+ };
41
+ if (Object.values(revocationLimits).some((value) => !Number.isSafeInteger(value) || value < 1))
42
+ throw new TypeError("Revocation limits must be positive safe integers");
43
+ const id = (kind, key) => (0, import_crypto.createHash)("sha256").update(JSON.stringify([tenantId, kind, key])).digest("hex");
44
+ async function update(kind, key, change) {
45
+ const keyId = id(kind, key);
46
+ for (let attempt = 0; attempt < 10; attempt++) {
47
+ const prior = await store.getWithVersion(collection, keyId);
48
+ if (prior && prior.data.tenantId !== tenantId) throw new import_trust.IdentityAuthorizationError();
49
+ const next = await change(prior?.data ?? null);
50
+ if ((await store.putIfMatch(collection, keyId, next, prior?.version ?? null)).ok) return next;
51
+ }
52
+ throw new import_trust.IdentityAuthorizationError();
53
+ }
54
+ function operatorOf(origin) {
55
+ try {
56
+ return (0, import_etld.eTldPlusOne)(origin);
57
+ } catch {
58
+ return void 0;
59
+ }
60
+ }
61
+ async function readLedger(operator) {
62
+ const row = await store.get(collection, id("operator", operator));
63
+ if (row && (row.schemaVersion !== 1 || row.tenantId !== tenantId || row.operator !== operator || !row.bindings || typeof row.bindings !== "object"))
64
+ throw new import_trust.IdentityAuthorizationError();
65
+ return row;
66
+ }
67
+ async function writeBinding(binding, quota) {
68
+ if ((0, import_canonicalize.canonicalAgentOrigin)(binding.origin) !== binding.origin || operatorOf(binding.origin) !== binding.operator || !binding.principalId || !binding.audit?.approvedBy || !binding.audit.reason || !Number.isFinite(Date.parse(binding.audit.approvedAt)))
69
+ throw new import_trust.IdentityAuthorizationError();
70
+ const ledger = await update("operator", binding.operator, (prior) => {
71
+ if (prior && (prior.schemaVersion !== 1 || prior.operator !== binding.operator || !prior.bindings))
72
+ throw new import_trust.IdentityAuthorizationError();
73
+ const value = prior ?? { schemaVersion: 1, tenantId, operator: binding.operator, bindings: {} };
74
+ const existing = value.bindings[binding.origin];
75
+ if (existing) {
76
+ if (quota !== void 0 || JSON.stringify(existing) !== JSON.stringify(binding))
77
+ throw new import_trust.IdentityAuthorizationError();
78
+ return value;
79
+ }
80
+ if (quota !== void 0 && (!binding.openAccess || !Number.isInteger(quota) || quota < 1 || Object.values(value.bindings).filter((b) => b.openAccess).length >= quota))
81
+ throw new import_trust.IdentityAuthorizationError();
82
+ return { ...value, bindings: { ...value.bindings, [binding.origin]: structuredClone(binding) } };
83
+ });
84
+ return structuredClone(ledger.bindings[binding.origin]);
85
+ }
86
+ const identity = {
87
+ async getBinding(origin) {
88
+ origin = (0, import_canonicalize.canonicalAgentOrigin)(origin);
89
+ const operator = operatorOf(origin);
90
+ if (!operator) return void 0;
91
+ const binding = (await readLedger(operator))?.bindings[origin];
92
+ return binding && structuredClone(binding);
93
+ },
94
+ async bind(binding) {
95
+ await writeBinding(binding);
96
+ },
97
+ bindOpen: (binding, quota) => writeBinding(binding, quota),
98
+ async getApplication(origin) {
99
+ const row = await store.get(collection, id("application", (0, import_canonicalize.canonicalAgentOrigin)(origin)));
100
+ if (!row) return void 0;
101
+ if (row.tenantId !== tenantId || row.schemaVersion !== 1 || row.origin !== (0, import_canonicalize.canonicalAgentOrigin)(origin) || !row.application)
102
+ throw new import_trust.IdentityAuthorizationError();
103
+ return structuredClone(row.application);
104
+ },
105
+ async compareAndSetApplication(origin, expectedRevision, application) {
106
+ origin = (0, import_canonicalize.canonicalAgentOrigin)(origin);
107
+ const keyId = id("application", origin);
108
+ const prior = await store.getWithVersion(collection, keyId);
109
+ if (prior && (prior.data.tenantId !== tenantId || prior.data.origin !== origin))
110
+ throw new import_trust.IdentityAuthorizationError();
111
+ const current = prior?.data.application;
112
+ if (current?.revision !== expectedRevision || application.revision !== (expectedRevision ?? 0) + 1) return false;
113
+ return (await store.putIfMatch(
114
+ collection,
115
+ keyId,
116
+ { schemaVersion: 1, tenantId, origin, application: structuredClone(application) },
117
+ prior?.version ?? null
118
+ )).ok;
119
+ }
120
+ };
121
+ const authorityHistory = {
122
+ async has(operator) {
123
+ return (await readLedger((0, import_etld.eTldPlusOne)(operator)))?.authoritativeTrustSeen === true;
124
+ },
125
+ async mark(operator) {
126
+ operator = (0, import_etld.eTldPlusOne)(operator);
127
+ await update("operator", operator, (prior) => ({
128
+ ...prior ?? { schemaVersion: 1, tenantId, operator, bindings: {} },
129
+ authoritativeTrustSeen: true
130
+ }));
131
+ }
132
+ };
133
+ async function reserveRevocationBudget(origin, keys) {
134
+ const operator = (0, import_etld.eTldPlusOne)(origin);
135
+ const binding = await identity.getBinding(origin);
136
+ const hasBinding = !!binding && !binding.openAccess;
137
+ await update("revocation-budget", "tenant", (prior) => {
138
+ const budget = prior ?? { schemaVersion: 1, tenantId, origins: {}, keys: 0 };
139
+ if (budget.schemaVersion !== 1 || !budget.origins || !Number.isSafeInteger(budget.keys) || budget.boundKeys !== void 0 && !Number.isSafeInteger(budget.boundKeys))
140
+ throw new import_trust.IdentityAuthorizationError();
141
+ const previous = budget.origins[origin], desired = Math.max(previous?.keys ?? 0, keys), delta = desired - (previous?.keys ?? 0), bound = previous?.bound === true || hasBinding, boundKeys = (budget.boundKeys ?? 0) + (bound ? desired - (previous?.bound ? previous.keys : 0) : 0), totalKeys = budget.keys + delta;
142
+ const entries = Object.values(budget.origins), pool = entries.filter((entry) => entry.bound === true === bound), owned = pool.filter((entry) => entry.operator === operator), newPoolMember = !previous || previous.bound === true !== bound;
143
+ if (newPoolMember && (pool.length >= revocationLimits.origins || owned.length >= revocationLimits.operatorOrigins) || (bound ? boundKeys : totalKeys - boundKeys) > revocationLimits.keys || owned.reduce((sum, entry) => sum + entry.keys, 0) + (newPoolMember ? desired : delta) > revocationLimits.operatorKeys)
144
+ throw new import_trust.IdentityAuthorizationError();
145
+ return {
146
+ ...budget,
147
+ keys: totalKeys,
148
+ boundKeys,
149
+ origins: { ...budget.origins, [origin]: { operator, keys: desired, bound } }
150
+ };
151
+ });
152
+ }
153
+ const revocations = {
154
+ async get(origin, keyid) {
155
+ origin = (0, import_canonicalize.canonicalAgentOrigin)(origin);
156
+ const row = await store.get(collection, id("revocations", origin));
157
+ if (row && (row.schemaVersion !== 1 || row.tenantId !== tenantId || row.origin !== origin || !row.revoked))
158
+ throw new import_trust.IdentityAuthorizationError();
159
+ const detail = row && Object.hasOwn(row.revoked, keyid) ? row.revoked[keyid] : void 0;
160
+ return detail && { ...detail };
161
+ },
162
+ async merge(origin, snapshot) {
163
+ origin = (0, import_canonicalize.canonicalAgentOrigin)(origin);
164
+ if (!snapshot.revoked_kids.length) return;
165
+ await update("revocations", origin, async (prior) => {
166
+ if (prior && (prior.schemaVersion !== 1 || prior.origin !== origin || !prior.revoked))
167
+ throw new import_trust.IdentityAuthorizationError();
168
+ const revoked = { ...prior?.revoked ?? {} };
169
+ const additions = new Set(snapshot.revoked_kids.filter((kid) => !Object.hasOwn(revoked, kid)));
170
+ if (Object.keys(revoked).length + additions.size > revocationLimits.originKeys)
171
+ throw new import_trust.IdentityAuthorizationError();
172
+ for (const kid of snapshot.revoked_kids) {
173
+ const previous = Object.hasOwn(revoked, kid) ? revoked[kid] : void 0;
174
+ Object.defineProperty(revoked, kid, {
175
+ value: (0, import_revocation.mergeRevocationDetail)(previous, snapshot.revocation_details?.[kid] ?? {}),
176
+ enumerable: true,
177
+ configurable: true,
178
+ writable: true
179
+ });
180
+ }
181
+ await reserveRevocationBudget(origin, Object.keys(revoked).length);
182
+ return { schemaVersion: 1, tenantId, origin, revoked };
183
+ });
184
+ }
185
+ };
186
+ return { identity, authorityHistory, revocations };
187
+ }
188
+ // Annotate the CommonJS export names for ESM import in node:
189
+ 0 && (module.exports = {
190
+ createIdentity33StateStores
191
+ });
@@ -0,0 +1,169 @@
1
+ import { createHash } from "crypto";
2
+ import { canonicalAgentOrigin } from "../signing/agent-resolver/canonicalize.mjs";
3
+ import { eTldPlusOne } from "../signing/agent-resolver/etld.mjs";
4
+ import { IdentityAuthorizationError } from "./trust.mjs";
5
+ import {
6
+ mergeRevocationDetail
7
+ } from "./revocation.mjs";
8
+ function createIdentity33StateStores(options) {
9
+ const { store, tenantId } = options, collection = options.collection ?? "identity33";
10
+ if (!tenantId || tenantId.length > 255 || !store.getWithVersion || !store.putIfMatch)
11
+ throw new TypeError("Identity stores require trusted tenantId and atomic getWithVersion/putIfMatch");
12
+ const revocationLimits = {
13
+ keys: 1e5,
14
+ origins: 1e4,
15
+ operatorKeys: 16384,
16
+ operatorOrigins: 256,
17
+ originKeys: 16384,
18
+ ...options.revocationLimits
19
+ };
20
+ if (Object.values(revocationLimits).some((value) => !Number.isSafeInteger(value) || value < 1))
21
+ throw new TypeError("Revocation limits must be positive safe integers");
22
+ const id = (kind, key) => createHash("sha256").update(JSON.stringify([tenantId, kind, key])).digest("hex");
23
+ async function update(kind, key, change) {
24
+ const keyId = id(kind, key);
25
+ for (let attempt = 0; attempt < 10; attempt++) {
26
+ const prior = await store.getWithVersion(collection, keyId);
27
+ if (prior && prior.data.tenantId !== tenantId) throw new IdentityAuthorizationError();
28
+ const next = await change(prior?.data ?? null);
29
+ if ((await store.putIfMatch(collection, keyId, next, prior?.version ?? null)).ok) return next;
30
+ }
31
+ throw new IdentityAuthorizationError();
32
+ }
33
+ function operatorOf(origin) {
34
+ try {
35
+ return eTldPlusOne(origin);
36
+ } catch {
37
+ return void 0;
38
+ }
39
+ }
40
+ async function readLedger(operator) {
41
+ const row = await store.get(collection, id("operator", operator));
42
+ if (row && (row.schemaVersion !== 1 || row.tenantId !== tenantId || row.operator !== operator || !row.bindings || typeof row.bindings !== "object"))
43
+ throw new IdentityAuthorizationError();
44
+ return row;
45
+ }
46
+ async function writeBinding(binding, quota) {
47
+ if (canonicalAgentOrigin(binding.origin) !== binding.origin || operatorOf(binding.origin) !== binding.operator || !binding.principalId || !binding.audit?.approvedBy || !binding.audit.reason || !Number.isFinite(Date.parse(binding.audit.approvedAt)))
48
+ throw new IdentityAuthorizationError();
49
+ const ledger = await update("operator", binding.operator, (prior) => {
50
+ if (prior && (prior.schemaVersion !== 1 || prior.operator !== binding.operator || !prior.bindings))
51
+ throw new IdentityAuthorizationError();
52
+ const value = prior ?? { schemaVersion: 1, tenantId, operator: binding.operator, bindings: {} };
53
+ const existing = value.bindings[binding.origin];
54
+ if (existing) {
55
+ if (quota !== void 0 || JSON.stringify(existing) !== JSON.stringify(binding))
56
+ throw new IdentityAuthorizationError();
57
+ return value;
58
+ }
59
+ if (quota !== void 0 && (!binding.openAccess || !Number.isInteger(quota) || quota < 1 || Object.values(value.bindings).filter((b) => b.openAccess).length >= quota))
60
+ throw new IdentityAuthorizationError();
61
+ return { ...value, bindings: { ...value.bindings, [binding.origin]: structuredClone(binding) } };
62
+ });
63
+ return structuredClone(ledger.bindings[binding.origin]);
64
+ }
65
+ const identity = {
66
+ async getBinding(origin) {
67
+ origin = canonicalAgentOrigin(origin);
68
+ const operator = operatorOf(origin);
69
+ if (!operator) return void 0;
70
+ const binding = (await readLedger(operator))?.bindings[origin];
71
+ return binding && structuredClone(binding);
72
+ },
73
+ async bind(binding) {
74
+ await writeBinding(binding);
75
+ },
76
+ bindOpen: (binding, quota) => writeBinding(binding, quota),
77
+ async getApplication(origin) {
78
+ const row = await store.get(collection, id("application", canonicalAgentOrigin(origin)));
79
+ if (!row) return void 0;
80
+ if (row.tenantId !== tenantId || row.schemaVersion !== 1 || row.origin !== canonicalAgentOrigin(origin) || !row.application)
81
+ throw new IdentityAuthorizationError();
82
+ return structuredClone(row.application);
83
+ },
84
+ async compareAndSetApplication(origin, expectedRevision, application) {
85
+ origin = canonicalAgentOrigin(origin);
86
+ const keyId = id("application", origin);
87
+ const prior = await store.getWithVersion(collection, keyId);
88
+ if (prior && (prior.data.tenantId !== tenantId || prior.data.origin !== origin))
89
+ throw new IdentityAuthorizationError();
90
+ const current = prior?.data.application;
91
+ if (current?.revision !== expectedRevision || application.revision !== (expectedRevision ?? 0) + 1) return false;
92
+ return (await store.putIfMatch(
93
+ collection,
94
+ keyId,
95
+ { schemaVersion: 1, tenantId, origin, application: structuredClone(application) },
96
+ prior?.version ?? null
97
+ )).ok;
98
+ }
99
+ };
100
+ const authorityHistory = {
101
+ async has(operator) {
102
+ return (await readLedger(eTldPlusOne(operator)))?.authoritativeTrustSeen === true;
103
+ },
104
+ async mark(operator) {
105
+ operator = eTldPlusOne(operator);
106
+ await update("operator", operator, (prior) => ({
107
+ ...prior ?? { schemaVersion: 1, tenantId, operator, bindings: {} },
108
+ authoritativeTrustSeen: true
109
+ }));
110
+ }
111
+ };
112
+ async function reserveRevocationBudget(origin, keys) {
113
+ const operator = eTldPlusOne(origin);
114
+ const binding = await identity.getBinding(origin);
115
+ const hasBinding = !!binding && !binding.openAccess;
116
+ await update("revocation-budget", "tenant", (prior) => {
117
+ const budget = prior ?? { schemaVersion: 1, tenantId, origins: {}, keys: 0 };
118
+ if (budget.schemaVersion !== 1 || !budget.origins || !Number.isSafeInteger(budget.keys) || budget.boundKeys !== void 0 && !Number.isSafeInteger(budget.boundKeys))
119
+ throw new IdentityAuthorizationError();
120
+ const previous = budget.origins[origin], desired = Math.max(previous?.keys ?? 0, keys), delta = desired - (previous?.keys ?? 0), bound = previous?.bound === true || hasBinding, boundKeys = (budget.boundKeys ?? 0) + (bound ? desired - (previous?.bound ? previous.keys : 0) : 0), totalKeys = budget.keys + delta;
121
+ const entries = Object.values(budget.origins), pool = entries.filter((entry) => entry.bound === true === bound), owned = pool.filter((entry) => entry.operator === operator), newPoolMember = !previous || previous.bound === true !== bound;
122
+ if (newPoolMember && (pool.length >= revocationLimits.origins || owned.length >= revocationLimits.operatorOrigins) || (bound ? boundKeys : totalKeys - boundKeys) > revocationLimits.keys || owned.reduce((sum, entry) => sum + entry.keys, 0) + (newPoolMember ? desired : delta) > revocationLimits.operatorKeys)
123
+ throw new IdentityAuthorizationError();
124
+ return {
125
+ ...budget,
126
+ keys: totalKeys,
127
+ boundKeys,
128
+ origins: { ...budget.origins, [origin]: { operator, keys: desired, bound } }
129
+ };
130
+ });
131
+ }
132
+ const revocations = {
133
+ async get(origin, keyid) {
134
+ origin = canonicalAgentOrigin(origin);
135
+ const row = await store.get(collection, id("revocations", origin));
136
+ if (row && (row.schemaVersion !== 1 || row.tenantId !== tenantId || row.origin !== origin || !row.revoked))
137
+ throw new IdentityAuthorizationError();
138
+ const detail = row && Object.hasOwn(row.revoked, keyid) ? row.revoked[keyid] : void 0;
139
+ return detail && { ...detail };
140
+ },
141
+ async merge(origin, snapshot) {
142
+ origin = canonicalAgentOrigin(origin);
143
+ if (!snapshot.revoked_kids.length) return;
144
+ await update("revocations", origin, async (prior) => {
145
+ if (prior && (prior.schemaVersion !== 1 || prior.origin !== origin || !prior.revoked))
146
+ throw new IdentityAuthorizationError();
147
+ const revoked = { ...prior?.revoked ?? {} };
148
+ const additions = new Set(snapshot.revoked_kids.filter((kid) => !Object.hasOwn(revoked, kid)));
149
+ if (Object.keys(revoked).length + additions.size > revocationLimits.originKeys)
150
+ throw new IdentityAuthorizationError();
151
+ for (const kid of snapshot.revoked_kids) {
152
+ const previous = Object.hasOwn(revoked, kid) ? revoked[kid] : void 0;
153
+ Object.defineProperty(revoked, kid, {
154
+ value: mergeRevocationDetail(previous, snapshot.revocation_details?.[kid] ?? {}),
155
+ enumerable: true,
156
+ configurable: true,
157
+ writable: true
158
+ });
159
+ }
160
+ await reserveRevocationBudget(origin, Object.keys(revoked).length);
161
+ return { schemaVersion: 1, tenantId, origin, revoked };
162
+ });
163
+ }
164
+ };
165
+ return { identity, authorityHistory, revocations };
166
+ }
167
+ export {
168
+ createIdentity33StateStores
169
+ };
@@ -0,0 +1,155 @@
1
+ import { type SsrfFetchOptions } from '../net/index.mjs';
2
+ import type { TrustRecord, TrustAgent, AgentGrantDeniedDetails } from './types.mjs';
3
+ export declare function validateIdentity33Schema(id: string, value: unknown): boolean;
4
+ export declare class IdentityAuthorizationError extends Error {
5
+ readonly code = "PERMISSION_DENIED";
6
+ readonly details: AgentGrantDeniedDetails | undefined;
7
+ constructor(reason?: 'authorization_failed' | 'grant_absent');
8
+ }
9
+ /**
10
+ * The trust record could not be read (transport error, outage, capacity,
11
+ * invalid content). A fetch failure is never absence or delisting: spend
12
+ * fails closed with a retryable SERVICE_UNAVAILABLE, other calls continue
13
+ * under an existing binding.
14
+ */
15
+ export declare class TrustRecordUnavailableError extends IdentityAuthorizationError {
16
+ readonly transient: true;
17
+ /**
18
+ * Set by `match()`: the last record read for this operator listed the origin
19
+ * with the role and is still within the seller's outage bound
20
+ * (`maxOutageContinuationSeconds` past its freshness). Only then may non-spend
21
+ * calls continue under a binding.
22
+ */
23
+ lastKnownListed: boolean;
24
+ constructor();
25
+ }
26
+ /**
27
+ * The operator's last record read does not list the origin with the required
28
+ * role (`unlisted`; operators retire agents by publishing an empty `agents[]`),
29
+ * or the operator has never published one (`absent`).
30
+ */
31
+ export declare class TrustMembershipError extends IdentityAuthorizationError {
32
+ readonly membership: 'unlisted' | 'absent';
33
+ constructor(membership?: 'unlisted' | 'absent');
34
+ }
35
+ /** Schema plus semantic checks; publication never includes identity keys. */
36
+ export declare function validateTrustRecord(value: unknown): asserts value is TrustRecord;
37
+ export declare function createTrustRecord(record: TrustRecord): TrustRecord;
38
+ export type TrustFetchResult = {
39
+ status: 'present';
40
+ operator: string;
41
+ record: TrustRecord;
42
+ checkedAt: number;
43
+ freshUntil: number;
44
+ } | {
45
+ status: 'absent';
46
+ operator: string;
47
+ checkedAt: number;
48
+ freshUntil: number;
49
+ };
50
+ export interface TrustEvaluatorOptions {
51
+ /** Matches configured revocation polling: one minute through thirty minutes. */
52
+ pollingIntervalSeconds?: number;
53
+ /**
54
+ * Seller policy: how long past the last listing record's freshness a bound
55
+ * origin's non-spend calls may continue while its operator's record cannot
56
+ * be read. Spend never continues on an outage. Default four polling
57
+ * intervals.
58
+ */
59
+ maxOutageContinuationSeconds?: number;
60
+ now?: () => number;
61
+ fetchOptions?: Pick<SsrfFetchOptions, 'lookup' | 'trustedFetchFn'>;
62
+ maxEntries?: number;
63
+ /**
64
+ * Process-local authority history only: operators remembered per hosting
65
+ * provider, i.e. per ICANN registrable domain of a PSL PRIVATE-section name
66
+ * (every `*.vercel.app`, `*.s3.<region>.amazonaws.com` or
67
+ * `*.<project>.platformsh.site` operator shares one budget). ICANN
68
+ * registrable domains each count once. Default 32.
69
+ */
70
+ maxAuthoritativeOperatorsPerPrivateSuffix?: number;
71
+ /**
72
+ * Process-local authority history only: total slots all PRIVATE-section
73
+ * operators may hold together, so registrants of ICANN domains always keep
74
+ * headroom. Default half of `maxEntries`.
75
+ */
76
+ maxPrivateAuthoritativeOperators?: number;
77
+ maxConcurrentFetches?: number;
78
+ /** Share authoritative-history across restarts/replicas when legacy fallback is enabled. */
79
+ authorityHistory?: {
80
+ has(operator: string): Promise<boolean>;
81
+ mark(operator: string): Promise<void>;
82
+ };
83
+ }
84
+ /** Used by binding/grants/onboarding, never by cryptographic verification. */
85
+ export declare class TrustEvaluator {
86
+ private readonly options;
87
+ private readonly cache;
88
+ private readonly negative;
89
+ private readonly pending;
90
+ private readonly urlRequests;
91
+ /** Keyed by (operator, host): one operator's authoritative_location hops never spend another's budget. */
92
+ private readonly hostRates;
93
+ private readonly authoritativeOperators;
94
+ /** Remembered authoritative operators per budget group (see authorityGroup). */
95
+ private readonly authorityGroups;
96
+ private privateAuthorityOperators;
97
+ readonly pollingIntervalSeconds: number;
98
+ readonly maxOutageContinuationSeconds: number;
99
+ constructor(options?: TrustEvaluatorOptions);
100
+ get(domainOrOrigin: string, force?: boolean): Promise<TrustFetchResult>;
101
+ match(origin: string, role: string, countries?: readonly string[]): Promise<{
102
+ operator: string;
103
+ agent: TrustAgent;
104
+ record: TrustRecord;
105
+ freshUntil: number;
106
+ }>;
107
+ invalidate(domain: string): void;
108
+ /**
109
+ * Record that `operator` served a trust record. With durable history the
110
+ * in-memory set is only a cache and may evict; without it, nothing is
111
+ * evicted and an operator over its group budget or the total is refused.
112
+ */
113
+ private rememberAuthority;
114
+ /**
115
+ * Process-local view only. With durable `authorityHistory` this set is a
116
+ * cache and may have evicted an operator that durable history still records.
117
+ */
118
+ hasAuthoritativeRecord(domain: string): boolean;
119
+ private now;
120
+ private request;
121
+ private fetch;
122
+ }
123
+ export interface DemandGrantClaim {
124
+ /** Only pass identity from an actual verifier. */
125
+ signerOrigin: string;
126
+ brand: {
127
+ domain: string;
128
+ brand_id?: string;
129
+ countries?: readonly string[];
130
+ };
131
+ accountOperator: string;
132
+ scope: string;
133
+ }
134
+ export interface DemandGrantAuthorization {
135
+ source: 'implicit' | 'trust' | 'seller' | 'legacy';
136
+ operator: string;
137
+ expiresAt?: number;
138
+ checkedAt: number;
139
+ chain: string[];
140
+ }
141
+ export interface DemandGrantOptions {
142
+ evaluator: TrustEvaluator;
143
+ now?: () => number;
144
+ /** Only evaluated for nonexclusive uncovered claims, never fetch failures. */
145
+ sellerAuthorization?: (claim: DemandGrantClaim) => Promise<boolean>;
146
+ /** Only for authoritative absence; never after a 200 or an exclusive record. */
147
+ legacyAuthorization?: (claim: DemandGrantClaim) => Promise<boolean>;
148
+ /** Seller-verified brand identity resolution, including the house's child-brand ID. Never accept a buyer-selected authorizer. */
149
+ resolveBrandHouse?: (brand: DemandGrantClaim['brand']) => Promise<{
150
+ domain: string;
151
+ brand_id: string;
152
+ } | undefined>;
153
+ }
154
+ /** Always invoke before sync_accounts side effects and before spend. No account mutation. */
155
+ export declare function authorizeDemandGrant(claim: DemandGrantClaim, options: DemandGrantOptions): Promise<DemandGrantAuthorization>;