@adcp/sdk 17.0.0-beta.1 → 17.0.0-beta.3

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 (282) hide show
  1. package/dist/lib/adapters/keyed-account-store.js +1 -1
  2. package/dist/lib/adapters/keyed-account-store.mjs +1 -1
  3. package/dist/lib/adapters/version/3.0/brand-fields.d.mts +7 -1
  4. package/dist/lib/adapters/version/3.0/brand-fields.d.ts +7 -1
  5. package/dist/lib/adapters/version/3.0/brand-fields.js +139 -3
  6. package/dist/lib/adapters/version/3.0/brand-fields.mjs +136 -2
  7. package/dist/lib/adapters/version/3.0/index.js +6 -0
  8. package/dist/lib/adapters/version/3.0/index.mjs +7 -1
  9. package/dist/lib/adapters/version/index.d.mts +9 -0
  10. package/dist/lib/adapters/version/index.d.ts +9 -0
  11. package/dist/lib/adapters/version/index.js +20 -6
  12. package/dist/lib/adapters/version/index.mjs +15 -2
  13. package/dist/lib/adapters/version/types.d.mts +5 -0
  14. package/dist/lib/adapters/version/types.d.ts +5 -0
  15. package/dist/lib/canonical-references/index.js +2 -0
  16. package/dist/lib/canonical-references/index.mjs +2 -0
  17. package/dist/lib/client/account-changes.d.mts +3 -1
  18. package/dist/lib/client/account-changes.d.ts +3 -1
  19. package/dist/lib/client/account-changes.js +22 -2
  20. package/dist/lib/client/account-changes.mjs +22 -2
  21. package/dist/lib/conformance/oracle.js +3 -2
  22. package/dist/lib/conformance/oracle.mjs +3 -2
  23. package/dist/lib/core/AgentClient.d.mts +165 -1
  24. package/dist/lib/core/AgentClient.d.ts +165 -1
  25. package/dist/lib/core/AgentClient.js +446 -8
  26. package/dist/lib/core/AgentClient.mjs +446 -8
  27. package/dist/lib/core/ConversationTypes.d.mts +8 -0
  28. package/dist/lib/core/ConversationTypes.d.ts +8 -0
  29. package/dist/lib/core/ProtocolResponseParser.d.mts +1 -1
  30. package/dist/lib/core/ProtocolResponseParser.d.ts +1 -1
  31. package/dist/lib/core/ProtocolResponseParser.js +28 -18
  32. package/dist/lib/core/ProtocolResponseParser.mjs +11 -1
  33. package/dist/lib/core/SingleAgentClient.d.mts +115 -2
  34. package/dist/lib/core/SingleAgentClient.d.ts +115 -2
  35. package/dist/lib/core/SingleAgentClient.js +547 -67
  36. package/dist/lib/core/SingleAgentClient.mjs +534 -54
  37. package/dist/lib/core/TaskExecutor.d.mts +7 -0
  38. package/dist/lib/core/TaskExecutor.d.ts +7 -0
  39. package/dist/lib/core/TaskExecutor.js +18 -5
  40. package/dist/lib/core/TaskExecutor.mjs +18 -5
  41. package/dist/lib/core/task-status.d.mts +2 -0
  42. package/dist/lib/core/task-status.d.ts +2 -0
  43. package/dist/lib/core/task-status.js +11 -2
  44. package/dist/lib/core/task-status.mjs +9 -1
  45. package/dist/lib/identity-3.3/trust.d.mts +1 -4
  46. package/dist/lib/identity-3.3/trust.d.ts +1 -4
  47. package/dist/lib/identity-3.3/trust.js +43 -23
  48. package/dist/lib/identity-3.3/trust.mjs +43 -23
  49. package/dist/lib/identity-3.3/validation.js +5 -3
  50. package/dist/lib/identity-3.3/validation.mjs +6 -4
  51. package/dist/lib/index.d.mts +6 -52
  52. package/dist/lib/index.d.ts +6 -52
  53. package/dist/lib/index.js +11 -0
  54. package/dist/lib/index.mjs +7 -0
  55. package/dist/lib/media-buy/compatibility.js +6 -1
  56. package/dist/lib/media-buy/compatibility.mjs +6 -1
  57. package/dist/lib/protocols/mcp-scope.d.mts +3 -0
  58. package/dist/lib/protocols/mcp-scope.d.ts +3 -0
  59. package/dist/lib/protocols/mcp-scope.js +8 -3
  60. package/dist/lib/protocols/mcp-scope.mjs +8 -3
  61. package/dist/lib/reporting/inspection.js +1 -0
  62. package/dist/lib/reporting/inspection.mjs +1 -0
  63. package/dist/lib/reporting/ledger/coverage.d.mts +5 -0
  64. package/dist/lib/reporting/ledger/coverage.d.ts +5 -0
  65. package/dist/lib/reporting/ledger/coverage.js +37 -3
  66. package/dist/lib/reporting/ledger/coverage.mjs +36 -3
  67. package/dist/lib/reporting/ledger/handler.js +7 -4
  68. package/dist/lib/reporting/ledger/handler.mjs +7 -4
  69. package/dist/lib/reporting/ledger/producer.js +215 -69
  70. package/dist/lib/reporting/ledger/producer.mjs +217 -70
  71. package/dist/lib/reporting/ledger/schedule.d.mts +2 -2
  72. package/dist/lib/reporting/ledger/schedule.d.ts +2 -2
  73. package/dist/lib/reporting/ledger/schedule.js +8 -5
  74. package/dist/lib/reporting/ledger/schedule.mjs +8 -5
  75. package/dist/lib/reporting/ledger/status-ingest.d.mts +1 -1
  76. package/dist/lib/reporting/ledger/status-ingest.d.ts +1 -1
  77. package/dist/lib/reporting/ledger/status-ingest.js +4 -3
  78. package/dist/lib/reporting/ledger/status-ingest.mjs +4 -3
  79. package/dist/lib/reporting/ledger/types.d.mts +36 -1
  80. package/dist/lib/reporting/ledger/types.d.ts +36 -1
  81. package/dist/lib/reporting/service/index.d.mts +14 -1
  82. package/dist/lib/reporting/service/index.d.ts +14 -1
  83. package/dist/lib/reporting/service/index.js +24 -12
  84. package/dist/lib/reporting/service/index.mjs +24 -12
  85. package/dist/lib/schemas/browser.d.mts +2 -0
  86. package/dist/lib/schemas/browser.d.ts +2 -0
  87. package/dist/lib/schemas/browser.js +3 -0
  88. package/dist/lib/schemas/browser.mjs +2 -0
  89. package/dist/lib/schemas/index.d.mts +5 -3
  90. package/dist/lib/schemas/index.d.ts +5 -3
  91. package/dist/lib/schemas/index.js +5 -0
  92. package/dist/lib/schemas/index.mjs +4 -0
  93. package/dist/lib/server/a2a-adapter.js +2 -1
  94. package/dist/lib/server/a2a-adapter.mjs +2 -1
  95. package/dist/lib/server/account-response-identity.d.mts +17 -0
  96. package/dist/lib/server/account-response-identity.d.ts +17 -0
  97. package/dist/lib/server/account-response-identity.js +52 -0
  98. package/dist/lib/server/account-response-identity.mjs +28 -0
  99. package/dist/lib/server/account-sync-contract.js +2 -2
  100. package/dist/lib/server/account-sync-contract.mjs +2 -2
  101. package/dist/lib/server/auth-signature.d.mts +2 -2
  102. package/dist/lib/server/auth-signature.d.ts +2 -2
  103. package/dist/lib/server/auth-signature.js +3 -0
  104. package/dist/lib/server/auth-signature.mjs +3 -0
  105. package/dist/lib/server/create-adcp-server.d.mts +2 -2
  106. package/dist/lib/server/create-adcp-server.d.ts +2 -2
  107. package/dist/lib/server/create-adcp-server.js +58 -23
  108. package/dist/lib/server/create-adcp-server.mjs +61 -15
  109. package/dist/lib/server/decisioning/account.d.mts +36 -10
  110. package/dist/lib/server/decisioning/account.d.ts +36 -10
  111. package/dist/lib/server/decisioning/account.js +33 -14
  112. package/dist/lib/server/decisioning/account.mjs +33 -14
  113. package/dist/lib/server/decisioning/runtime/from-platform.d.mts +5 -5
  114. package/dist/lib/server/decisioning/runtime/from-platform.d.ts +5 -5
  115. package/dist/lib/server/decisioning/runtime/from-platform.js +4 -4
  116. package/dist/lib/server/decisioning/runtime/from-platform.mjs +4 -4
  117. package/dist/lib/server/media-buy-store.d.mts +26 -12
  118. package/dist/lib/server/media-buy-store.d.ts +26 -12
  119. package/dist/lib/server/media-buy-store.js +69 -21
  120. package/dist/lib/server/media-buy-store.mjs +69 -21
  121. package/dist/lib/server/notification-subscriptions/runtime.d.mts +1 -1
  122. package/dist/lib/server/notification-subscriptions/runtime.d.ts +1 -1
  123. package/dist/lib/server/notification-subscriptions/runtime.js +4 -0
  124. package/dist/lib/server/notification-subscriptions/runtime.mjs +4 -0
  125. package/dist/lib/server/responses.js +9 -1
  126. package/dist/lib/server/responses.mjs +9 -1
  127. package/dist/lib/server/serve.js +3 -1
  128. package/dist/lib/server/serve.mjs +3 -1
  129. package/dist/lib/server/signed-request-transport.d.mts +1 -0
  130. package/dist/lib/server/signed-request-transport.d.ts +1 -0
  131. package/dist/lib/server/signed-request-transport.js +46 -0
  132. package/dist/lib/server/signed-request-transport.mjs +20 -0
  133. package/dist/lib/server/test-controller.d.mts +1 -0
  134. package/dist/lib/server/test-controller.d.ts +1 -0
  135. package/dist/lib/server/test-controller.js +5 -1
  136. package/dist/lib/server/test-controller.mjs +5 -1
  137. package/dist/lib/signing/agent-fetch.d.mts +1 -1
  138. package/dist/lib/signing/agent-fetch.d.ts +1 -1
  139. package/dist/lib/signing/agent-fetch.js +3 -3
  140. package/dist/lib/signing/agent-fetch.mjs +3 -3
  141. package/dist/lib/testing/index.d.mts +1 -0
  142. package/dist/lib/testing/index.d.ts +1 -0
  143. package/dist/lib/testing/index.js +3 -0
  144. package/dist/lib/testing/index.mjs +2 -0
  145. package/dist/lib/testing/storyboard/canonical-format-satisfaction.js +61 -29
  146. package/dist/lib/testing/storyboard/canonical-format-satisfaction.mjs +61 -29
  147. package/dist/lib/testing/storyboard/compliance.d.mts +2 -5
  148. package/dist/lib/testing/storyboard/compliance.d.ts +2 -5
  149. package/dist/lib/testing/storyboard/compliance.js +62 -13
  150. package/dist/lib/testing/storyboard/compliance.mjs +63 -14
  151. package/dist/lib/testing/storyboard/index.d.mts +1 -0
  152. package/dist/lib/testing/storyboard/index.d.ts +1 -0
  153. package/dist/lib/testing/storyboard/index.js +3 -0
  154. package/dist/lib/testing/storyboard/index.mjs +2 -0
  155. package/dist/lib/testing/storyboard/loader.js +7 -0
  156. package/dist/lib/testing/storyboard/loader.mjs +7 -0
  157. package/dist/lib/testing/storyboard/request-builder.js +9 -6
  158. package/dist/lib/testing/storyboard/request-builder.mjs +9 -6
  159. package/dist/lib/testing/storyboard/request-signing/vector-loader.d.mts +2 -0
  160. package/dist/lib/testing/storyboard/request-signing/vector-loader.d.ts +2 -0
  161. package/dist/lib/testing/storyboard/request-signing/vector-loader.js +11 -0
  162. package/dist/lib/testing/storyboard/request-signing/vector-loader.mjs +10 -0
  163. package/dist/lib/testing/storyboard/runner.js +59 -6
  164. package/dist/lib/testing/storyboard/runner.mjs +59 -6
  165. package/dist/lib/testing/storyboard/types.d.mts +18 -0
  166. package/dist/lib/testing/storyboard/types.d.ts +18 -0
  167. package/dist/lib/testing/storyboard/validations.d.mts +1 -1
  168. package/dist/lib/testing/storyboard/validations.d.ts +1 -1
  169. package/dist/lib/testing/storyboard/web-bot-auth.d.mts +10 -0
  170. package/dist/lib/testing/storyboard/web-bot-auth.d.ts +10 -0
  171. package/dist/lib/testing/storyboard/web-bot-auth.js +80 -0
  172. package/dist/lib/testing/storyboard/web-bot-auth.mjs +56 -0
  173. package/dist/lib/types/accept-proposal.d.ts +20 -28
  174. package/dist/lib/types/asset-instances.d.mts +1 -1
  175. package/dist/lib/types/asset-instances.d.ts +1 -1
  176. package/dist/lib/types/buy-products.d.ts +20 -28
  177. package/dist/lib/types/check-governance.d.ts +20 -28
  178. package/dist/lib/types/comply-test-controller.d.ts +20 -28
  179. package/dist/lib/types/control-media-buy.d.ts +20 -28
  180. package/dist/lib/types/core.generated.d.mts +273 -184
  181. package/dist/lib/types/core.generated.d.ts +273 -184
  182. package/dist/lib/types/create-media-buy.d.ts +20 -28
  183. package/dist/lib/types/get-media-buys.d.ts +20 -28
  184. package/dist/lib/types/get-products.d.ts +20 -28
  185. package/dist/lib/types/index.d.mts +6 -1
  186. package/dist/lib/types/index.d.ts +6 -1
  187. package/dist/lib/types/index.js +6 -1
  188. package/dist/lib/types/index.mjs +4 -1
  189. package/dist/lib/types/inline-enums.generated.d.mts +30 -4
  190. package/dist/lib/types/inline-enums.generated.d.ts +30 -4
  191. package/dist/lib/types/inline-enums.generated.js +41 -2
  192. package/dist/lib/types/inline-enums.generated.mjs +28 -2
  193. package/dist/lib/types/list-products.d.ts +20 -28
  194. package/dist/lib/types/list-proposals.d.ts +20 -28
  195. package/dist/lib/types/media-buy-delivery-report.d.mts +6 -0
  196. package/dist/lib/types/media-buy-delivery-report.d.ts +6 -0
  197. package/dist/lib/types/media-buy-delivery-report.js +16 -0
  198. package/dist/lib/types/media-buy-delivery-report.mjs +0 -0
  199. package/dist/lib/types/refine-proposals.d.ts +20 -28
  200. package/dist/lib/types/request-proposals.d.ts +20 -28
  201. package/dist/lib/types/schemas.generated.d.ts +63113 -127273
  202. package/dist/lib/types/schemas.generated.js +759 -770
  203. package/dist/lib/types/schemas.generated.mjs +759 -770
  204. package/dist/lib/types/targeting-keys.generated.d.mts +4 -0
  205. package/dist/lib/types/targeting-keys.generated.d.ts +4 -0
  206. package/dist/lib/types/targeting-keys.generated.js +109 -0
  207. package/dist/lib/types/targeting-keys.generated.mjs +84 -0
  208. package/dist/lib/types/tools.generated.d.mts +2 -68
  209. package/dist/lib/types/tools.generated.d.ts +2 -68
  210. package/dist/lib/types/update-media-buy.d.ts +20 -28
  211. package/dist/lib/utils/adcp-version-config.js +5 -2
  212. package/dist/lib/utils/adcp-version-config.mjs +5 -2
  213. package/dist/lib/utils/response-unwrapper.js +6 -1
  214. package/dist/lib/utils/response-unwrapper.mjs +6 -1
  215. package/dist/lib/v2/format-schema/resolver.js +1 -1
  216. package/dist/lib/v2/format-schema/resolver.mjs +1 -1
  217. package/dist/lib/v2/projection/creative-delivery.js +104 -29
  218. package/dist/lib/v2/projection/creative-delivery.mjs +108 -29
  219. package/dist/lib/v2/projection/index.d.mts +1 -0
  220. package/dist/lib/v2/projection/index.d.ts +1 -0
  221. package/dist/lib/v2/projection/index.js +3 -0
  222. package/dist/lib/v2/projection/index.mjs +2 -0
  223. package/dist/lib/v2/projection/legacy-metadata.d.mts +19 -0
  224. package/dist/lib/v2/projection/legacy-metadata.d.ts +19 -0
  225. package/dist/lib/v2/projection/legacy-metadata.js +91 -0
  226. package/dist/lib/v2/projection/legacy-metadata.mjs +86 -0
  227. package/dist/lib/v2/projection/v1-to-v2.d.mts +1 -1
  228. package/dist/lib/v2/projection/v1-to-v2.d.ts +1 -1
  229. package/dist/lib/v2/projection/v1-to-v2.js +12 -9
  230. package/dist/lib/v2/projection/v1-to-v2.mjs +12 -9
  231. package/dist/lib/validation/budget-allocation.d.mts +3 -3
  232. package/dist/lib/validation/budget-allocation.d.ts +3 -3
  233. package/dist/lib/validation/compact-schema.d.mts +27 -0
  234. package/dist/lib/validation/compact-schema.d.ts +27 -0
  235. package/dist/lib/validation/compact-schema.js +276 -0
  236. package/dist/lib/validation/compact-schema.mjs +250 -0
  237. package/dist/lib/validation/media-buy-delivery-report.d.mts +8 -0
  238. package/dist/lib/validation/media-buy-delivery-report.d.ts +8 -0
  239. package/dist/lib/validation/media-buy-delivery-report.js +31 -0
  240. package/dist/lib/validation/media-buy-delivery-report.mjs +7 -0
  241. package/dist/lib/validation/nonempty-array.d.mts +15 -0
  242. package/dist/lib/validation/nonempty-array.d.ts +15 -0
  243. package/dist/lib/validation/nonempty-array.js +41 -0
  244. package/dist/lib/validation/nonempty-array.mjs +7 -0
  245. package/dist/lib/validation/schema-diagnostic-origins.d.mts +21 -0
  246. package/dist/lib/validation/schema-diagnostic-origins.d.ts +21 -0
  247. package/dist/lib/validation/schema-diagnostic-origins.js +193 -0
  248. package/dist/lib/validation/schema-diagnostic-origins.mjs +169 -0
  249. package/dist/lib/validation/schema-loader.js +86 -16
  250. package/dist/lib/validation/schema-loader.mjs +82 -16
  251. package/dist/lib/validation/schema-validator.d.mts +10 -19
  252. package/dist/lib/validation/schema-validator.d.ts +10 -19
  253. package/dist/lib/validation/schema-validator.js +135 -42
  254. package/dist/lib/validation/schema-validator.mjs +139 -43
  255. package/dist/lib/validation/sync-creatives.d.mts +22 -22
  256. package/dist/lib/validation/sync-creatives.d.ts +22 -22
  257. package/dist/lib/version.d.mts +3 -3
  258. package/dist/lib/version.d.ts +3 -3
  259. package/dist/lib/version.js +3 -3
  260. package/dist/lib/version.mjs +3 -3
  261. package/dist/lib/webhooks/index.d.mts +3 -0
  262. package/dist/lib/webhooks/index.d.ts +3 -0
  263. package/dist/lib/webhooks/index.js +3 -0
  264. package/dist/lib/webhooks/index.mjs +2 -0
  265. package/dist/lib/webhooks/media-buy-delivery.d.mts +43 -0
  266. package/dist/lib/webhooks/media-buy-delivery.d.ts +43 -0
  267. package/dist/lib/webhooks/media-buy-delivery.js +119 -0
  268. package/dist/lib/webhooks/media-buy-delivery.mjs +94 -0
  269. package/docs/TYPE-SUMMARY.md +2 -2
  270. package/docs/guides/DELIVERY-WEBHOOK-PARSING.md +142 -0
  271. package/docs/guides/DISCOVERY-CACHE-AND-SESSION-REUSE.md +15 -0
  272. package/docs/guides/REPORTING-LEDGER.md +93 -0
  273. package/docs/guides/REPORTING-STABILITY.md +1 -1
  274. package/docs/guides/TYPED-CLIENT-TOOLS.md +49 -0
  275. package/docs/llms.txt +2 -2
  276. package/docs/migration-14.x-rc-worksheet.md +4 -4
  277. package/docs/migration-16-to-17.md +218 -14
  278. package/docs/migration-6.6-to-6.7.md +14 -0
  279. package/docs/migration-account-change-feed.md +15 -0
  280. package/docs/migration-agent-identity-3.3.md +106 -4
  281. package/docs/recipes/verifying-inbound-webhooks.md +18 -2
  282. package/package.json +16 -3
@@ -95,6 +95,7 @@ interface WebhookManager {
95
95
  registerWebhook(agent: AgentConfig, taskId: string, webhookUrl: string): Promise<void>;
96
96
  processWebhook(token: string, body: any): Promise<void>;
97
97
  }
98
+ type AdcpTaskStatusTool = 'get_task_status' | 'tasks_get' | 'tasks/get';
98
99
  /**
99
100
  * Core task execution engine that handles the conversation loop with agents
100
101
  */
@@ -210,6 +211,11 @@ export declare class TaskExecutor {
210
211
  * dispatches. Per-call options can override individual fields.
211
212
  */
212
213
  transport?: import('../protocols/index.mjs').TransportOptions;
214
+ /** Resolve the advertised AdCP work-status tool using the client's scoped discovery evidence. */
215
+ resolveTaskStatusTool?: (agent: AgentConfig, options: {
216
+ transport?: import('../protocols/index.mjs').TransportOptions;
217
+ signal?: AbortSignal;
218
+ }) => Promise<AdcpTaskStatusTool>;
213
219
  });
214
220
  /**
215
221
  * Access the governance middleware for direct outcome reporting (async tasks).
@@ -328,6 +334,7 @@ export declare class TaskExecutor {
328
334
  * Task tracking methods (PR #78)
329
335
  */
330
336
  listTasks(agent: AgentConfig, transport?: import('../protocols/index.mjs').TransportOptions): Promise<TaskInfo[]>;
337
+ private resolveTaskStatusTool;
331
338
  private getTaskStatusWithRawResponse;
332
339
  getTaskStatus(agent: AgentConfig, taskId: string, transport?: import('../protocols/index.mjs').TransportOptions, signal?: AbortSignal, wireOptions?: {
333
340
  wireAdcpVersion?: string;
@@ -95,6 +95,7 @@ interface WebhookManager {
95
95
  registerWebhook(agent: AgentConfig, taskId: string, webhookUrl: string): Promise<void>;
96
96
  processWebhook(token: string, body: any): Promise<void>;
97
97
  }
98
+ type AdcpTaskStatusTool = 'get_task_status' | 'tasks_get' | 'tasks/get';
98
99
  /**
99
100
  * Core task execution engine that handles the conversation loop with agents
100
101
  */
@@ -210,6 +211,11 @@ export declare class TaskExecutor {
210
211
  * dispatches. Per-call options can override individual fields.
211
212
  */
212
213
  transport?: import('../protocols').TransportOptions;
214
+ /** Resolve the advertised AdCP work-status tool using the client's scoped discovery evidence. */
215
+ resolveTaskStatusTool?: (agent: AgentConfig, options: {
216
+ transport?: import('../protocols').TransportOptions;
217
+ signal?: AbortSignal;
218
+ }) => Promise<AdcpTaskStatusTool>;
213
219
  });
214
220
  /**
215
221
  * Access the governance middleware for direct outcome reporting (async tasks).
@@ -328,6 +334,7 @@ export declare class TaskExecutor {
328
334
  * Task tracking methods (PR #78)
329
335
  */
330
336
  listTasks(agent: AgentConfig, transport?: import('../protocols').TransportOptions): Promise<TaskInfo[]>;
337
+ private resolveTaskStatusTool;
331
338
  private getTaskStatusWithRawResponse;
332
339
  getTaskStatus(agent: AgentConfig, taskId: string, transport?: import('../protocols').TransportOptions, signal?: AbortSignal, wireOptions?: {
333
340
  wireAdcpVersion?: string;
@@ -733,6 +733,8 @@ class TaskExecutor {
733
733
  status: args.status
734
734
  };
735
735
  const taskState = this.activeTasks.get(args.taskId);
736
+ const wireAdcpVersion = taskState?.wireAdcpVersion ?? this.config.wireAdcpVersion;
737
+ if (wireAdcpVersion !== void 0) meta.wireAdcpVersion = wireAdcpVersion;
736
738
  if (taskState?.serverVersion !== void 0) meta.serverVersion = taskState.serverVersion;
737
739
  if (taskState?.serverVersionSynthetic !== void 0) {
738
740
  meta.serverVersionSynthetic = taskState.serverVersionSynthetic;
@@ -826,6 +828,7 @@ class TaskExecutor {
826
828
  }
827
829
  const taskState = {
828
830
  taskId,
831
+ wireAdcpVersion: wireAdcpVersion ?? options.negotiatedAdcpVersion ?? options.selectedAdcpVersion,
829
832
  taskName,
830
833
  params,
831
834
  status: "pending",
@@ -1096,7 +1099,7 @@ class TaskExecutor {
1096
1099
  () => import_protocols.ProtocolClient.callTool(agent, taskName, dispatchParams, callOptions)
1097
1100
  );
1098
1101
  (0, import_abort.throwIfAborted)(postDispatchOptions.signal);
1099
- const respStatus = this.responseParser.getStatus(response);
1102
+ const respStatus = this.responseParser.getStatus(response, taskName);
1100
1103
  taskState.serverTaskId = this.responseParser.getTaskId(response);
1101
1104
  await this.config.onActivity?.({
1102
1105
  type: "protocol_response",
@@ -1279,7 +1282,7 @@ class TaskExecutor {
1279
1282
  };
1280
1283
  }
1281
1284
  async handleAsyncResponse(agent, taskId, taskName, params, response, messages, inputHandler, options = {}, debugLogs = [], startTime = Date.now(), deferTerminalTaskStatus = false, persistPausedContinuation = true, serverVersion = "v3", deferredClientContext, requireDeferredSettlementResumeAuthorization = false, refinementServedVersion) {
1282
- const status = this.responseParser.getStatus(response);
1285
+ const status = this.responseParser.getStatus(response, taskName);
1283
1286
  const serverTaskId = this.responseParser.getTaskId(response);
1284
1287
  const task = this.activeTasks.get(taskId);
1285
1288
  if (task && serverTaskId) task.serverTaskId = serverTaskId;
@@ -2531,8 +2534,15 @@ class TaskExecutor {
2531
2534
  }
2532
2535
  });
2533
2536
  }
2534
- async getTaskStatusWithRawResponse(agent, taskId, transport, signal, expectedTaskType, serverVersion, wireAdcpVersion, versionEnvelope, operationId) {
2535
- const toolName = agent.protocol === "mcp" ? "tasks_get" : "tasks/get";
2537
+ async resolveTaskStatusTool(agent, transport, signal) {
2538
+ if (this.config.resolveTaskStatusTool) {
2539
+ return this.config.resolveTaskStatusTool(agent, { transport: transport ?? this.config.transport, signal });
2540
+ }
2541
+ return agent.protocol === "mcp" ? "tasks_get" : "tasks/get";
2542
+ }
2543
+ async getTaskStatusWithRawResponse(agent, taskId, transport, signal, expectedTaskType, serverVersion, wireAdcpVersion, versionEnvelope, operationId, pollingTool) {
2544
+ const toolName = pollingTool ?? await this.resolveTaskStatusTool(agent, transport, signal);
2545
+ (0, import_abort.throwIfAborted)(signal);
2536
2546
  const response = await import_protocols.ProtocolClient.callTool(
2537
2547
  agent,
2538
2548
  toolName,
@@ -2591,6 +2601,7 @@ class TaskExecutor {
2591
2601
  }
2592
2602
  const pollStartTime = Date.now();
2593
2603
  const correlationId = metadataTaskId ?? taskId;
2604
+ let pollingTool;
2594
2605
  const withServerTaskId = (metadata) => ({
2595
2606
  ...metadata,
2596
2607
  serverTaskId: taskId
@@ -2631,6 +2642,7 @@ class TaskExecutor {
2631
2642
  let status;
2632
2643
  let rawResponse;
2633
2644
  try {
2645
+ pollingTool ??= await this.resolveTaskStatusTool(agent, transportSnapshot, signal);
2634
2646
  const pollResult = await this.getTaskStatusWithRawResponse(
2635
2647
  agent,
2636
2648
  taskId,
@@ -2640,7 +2652,8 @@ class TaskExecutor {
2640
2652
  serverVersion,
2641
2653
  wireAdcpVersion,
2642
2654
  versionEnvelope,
2643
- metadataTaskId
2655
+ metadataTaskId,
2656
+ pollingTool
2644
2657
  );
2645
2658
  status = pollResult.task;
2646
2659
  rawResponse = pollResult.rawResponse;
@@ -719,6 +719,8 @@ class TaskExecutor {
719
719
  status: args.status
720
720
  };
721
721
  const taskState = this.activeTasks.get(args.taskId);
722
+ const wireAdcpVersion = taskState?.wireAdcpVersion ?? this.config.wireAdcpVersion;
723
+ if (wireAdcpVersion !== void 0) meta.wireAdcpVersion = wireAdcpVersion;
722
724
  if (taskState?.serverVersion !== void 0) meta.serverVersion = taskState.serverVersion;
723
725
  if (taskState?.serverVersionSynthetic !== void 0) {
724
726
  meta.serverVersionSynthetic = taskState.serverVersionSynthetic;
@@ -812,6 +814,7 @@ class TaskExecutor {
812
814
  }
813
815
  const taskState = {
814
816
  taskId,
817
+ wireAdcpVersion: wireAdcpVersion ?? options.negotiatedAdcpVersion ?? options.selectedAdcpVersion,
815
818
  taskName,
816
819
  params,
817
820
  status: "pending",
@@ -1082,7 +1085,7 @@ class TaskExecutor {
1082
1085
  () => ProtocolClient.callTool(agent, taskName, dispatchParams, callOptions)
1083
1086
  );
1084
1087
  throwIfAborted(postDispatchOptions.signal);
1085
- const respStatus = this.responseParser.getStatus(response);
1088
+ const respStatus = this.responseParser.getStatus(response, taskName);
1086
1089
  taskState.serverTaskId = this.responseParser.getTaskId(response);
1087
1090
  await this.config.onActivity?.({
1088
1091
  type: "protocol_response",
@@ -1265,7 +1268,7 @@ class TaskExecutor {
1265
1268
  };
1266
1269
  }
1267
1270
  async handleAsyncResponse(agent, taskId, taskName, params, response, messages, inputHandler, options = {}, debugLogs = [], startTime = Date.now(), deferTerminalTaskStatus = false, persistPausedContinuation = true, serverVersion = "v3", deferredClientContext, requireDeferredSettlementResumeAuthorization = false, refinementServedVersion) {
1268
- const status = this.responseParser.getStatus(response);
1271
+ const status = this.responseParser.getStatus(response, taskName);
1269
1272
  const serverTaskId = this.responseParser.getTaskId(response);
1270
1273
  const task = this.activeTasks.get(taskId);
1271
1274
  if (task && serverTaskId) task.serverTaskId = serverTaskId;
@@ -2517,8 +2520,15 @@ class TaskExecutor {
2517
2520
  }
2518
2521
  });
2519
2522
  }
2520
- async getTaskStatusWithRawResponse(agent, taskId, transport, signal, expectedTaskType, serverVersion, wireAdcpVersion, versionEnvelope, operationId) {
2521
- const toolName = agent.protocol === "mcp" ? "tasks_get" : "tasks/get";
2523
+ async resolveTaskStatusTool(agent, transport, signal) {
2524
+ if (this.config.resolveTaskStatusTool) {
2525
+ return this.config.resolveTaskStatusTool(agent, { transport: transport ?? this.config.transport, signal });
2526
+ }
2527
+ return agent.protocol === "mcp" ? "tasks_get" : "tasks/get";
2528
+ }
2529
+ async getTaskStatusWithRawResponse(agent, taskId, transport, signal, expectedTaskType, serverVersion, wireAdcpVersion, versionEnvelope, operationId, pollingTool) {
2530
+ const toolName = pollingTool ?? await this.resolveTaskStatusTool(agent, transport, signal);
2531
+ throwIfAborted(signal);
2522
2532
  const response = await ProtocolClient.callTool(
2523
2533
  agent,
2524
2534
  toolName,
@@ -2577,6 +2587,7 @@ class TaskExecutor {
2577
2587
  }
2578
2588
  const pollStartTime = Date.now();
2579
2589
  const correlationId = metadataTaskId ?? taskId;
2590
+ let pollingTool;
2580
2591
  const withServerTaskId = (metadata) => ({
2581
2592
  ...metadata,
2582
2593
  serverTaskId: taskId
@@ -2617,6 +2628,7 @@ class TaskExecutor {
2617
2628
  let status;
2618
2629
  let rawResponse;
2619
2630
  try {
2631
+ pollingTool ??= await this.resolveTaskStatusTool(agent, transportSnapshot, signal);
2620
2632
  const pollResult = await this.getTaskStatusWithRawResponse(
2621
2633
  agent,
2622
2634
  taskId,
@@ -2626,7 +2638,8 @@ class TaskExecutor {
2626
2638
  serverVersion,
2627
2639
  wireAdcpVersion,
2628
2640
  versionEnvelope,
2629
- metadataTaskId
2641
+ metadataTaskId,
2642
+ pollingTool
2630
2643
  );
2631
2644
  status = pollResult.task;
2632
2645
  rawResponse = pollResult.rawResponse;
@@ -31,3 +31,5 @@ export declare function extractAdcpTaskStatusFromPayload(payload: unknown): ADCP
31
31
  * back to the transport-layer status.
32
32
  */
33
33
  export declare function extractAdcpStatusFromA2aTaskResult(result: unknown): ADCPStatus | undefined;
34
+ /** A status query describes another task; its status/error are data, not the query's lifecycle. */
35
+ export declare function isTaskStatusResponse(value: unknown, toolName?: string): boolean;
@@ -31,3 +31,5 @@ export declare function extractAdcpTaskStatusFromPayload(payload: unknown): ADCP
31
31
  * back to the transport-layer status.
32
32
  */
33
33
  export declare function extractAdcpStatusFromA2aTaskResult(result: unknown): ADCPStatus | undefined;
34
+ /** A status query describes another task; its status/error are data, not the query's lifecycle. */
35
+ export declare function isTaskStatusResponse(value: unknown, toolName?: string): boolean;
@@ -22,7 +22,8 @@ __export(task_status_exports, {
22
22
  TASK_ENVELOPE_FIELDS: () => TASK_ENVELOPE_FIELDS,
23
23
  extractAdcpStatusFromA2aTaskResult: () => extractAdcpStatusFromA2aTaskResult,
24
24
  extractAdcpTaskStatusFromPayload: () => extractAdcpTaskStatusFromPayload,
25
- isAdcpStatus: () => isAdcpStatus
25
+ isAdcpStatus: () => isAdcpStatus,
26
+ isTaskStatusResponse: () => isTaskStatusResponse
26
27
  });
27
28
  module.exports = __toCommonJS(task_status_exports);
28
29
  var import_a2a_artifacts = require('../utils/a2a-artifacts.js');
@@ -80,11 +81,19 @@ function extractAdcpStatusFromA2aTaskResult(result) {
80
81
  const extracted = (0, import_a2a_artifacts.getLatestA2ADataPartFromTask)(result);
81
82
  return extractAdcpTaskStatusFromPayload(extracted?.data);
82
83
  }
84
+ function isTaskStatusResponse(value, toolName) {
85
+ if (toolName !== "get_task_status" || !value || typeof value !== "object" || Array.isArray(value)) return false;
86
+ const record = value;
87
+ return ["task_id", "task_type", "protocol", "status", "created_at", "updated_at"].every(
88
+ (field) => typeof record[field] === "string"
89
+ ) && record.adcp_error === void 0 && record.errors === void 0;
90
+ }
83
91
  // Annotate the CommonJS export names for ESM import in node:
84
92
  0 && (module.exports = {
85
93
  ADCP_STATUS,
86
94
  TASK_ENVELOPE_FIELDS,
87
95
  extractAdcpStatusFromA2aTaskResult,
88
96
  extractAdcpTaskStatusFromPayload,
89
- isAdcpStatus
97
+ isAdcpStatus,
98
+ isTaskStatusResponse
90
99
  });
@@ -53,10 +53,18 @@ function extractAdcpStatusFromA2aTaskResult(result) {
53
53
  const extracted = getLatestA2ADataPartFromTask(result);
54
54
  return extractAdcpTaskStatusFromPayload(extracted?.data);
55
55
  }
56
+ function isTaskStatusResponse(value, toolName) {
57
+ if (toolName !== "get_task_status" || !value || typeof value !== "object" || Array.isArray(value)) return false;
58
+ const record = value;
59
+ return ["task_id", "task_type", "protocol", "status", "created_at", "updated_at"].every(
60
+ (field) => typeof record[field] === "string"
61
+ ) && record.adcp_error === void 0 && record.errors === void 0;
62
+ }
56
63
  export {
57
64
  ADCP_STATUS,
58
65
  TASK_ENVELOPE_FIELDS,
59
66
  extractAdcpStatusFromA2aTaskResult,
60
67
  extractAdcpTaskStatusFromPayload,
61
- isAdcpStatus
68
+ isAdcpStatus,
69
+ isTaskStatusResponse
62
70
  };
@@ -149,10 +149,7 @@ export interface DemandGrantAuthorization {
149
149
  export interface DemandGrantOptions {
150
150
  evaluator: TrustEvaluator;
151
151
  now?: () => number;
152
- /**
153
- * Only evaluated for uncovered claims, never fetch failures, and never for a scope an
154
- * `exclusive_grants: true` record names in any grant.
155
- */
152
+ /** Only evaluated for uncovered claims against a record without `exclusive_grants: true`; never fetch failures. */
156
153
  sellerAuthorization?: (claim: DemandGrantClaim) => Promise<boolean>;
157
154
  /** Only for authoritative absence; never after a 200 or an exclusive record. */
158
155
  legacyAuthorization?: (claim: DemandGrantClaim) => Promise<boolean>;
@@ -149,10 +149,7 @@ export interface DemandGrantAuthorization {
149
149
  export interface DemandGrantOptions {
150
150
  evaluator: TrustEvaluator;
151
151
  now?: () => number;
152
- /**
153
- * Only evaluated for uncovered claims, never fetch failures, and never for a scope an
154
- * `exclusive_grants: true` record names in any grant.
155
- */
152
+ /** Only evaluated for uncovered claims against a record without `exclusive_grants: true`; never fetch failures. */
156
153
  sellerAuthorization?: (claim: DemandGrantClaim) => Promise<boolean>;
157
154
  /** Only for authoritative absence; never after a 200 or an exclusive record. */
158
155
  legacyAuthorization?: (claim: DemandGrantClaim) => Promise<boolean>;
@@ -47,7 +47,7 @@ var import_etld = require('../signing/agent-resolver/etld.js');
47
47
  var import_strict_json = require('../signing/agent-resolver/strict-json.js');
48
48
  var import_tldts = require("tldts");
49
49
  var import_schemas = __toESM(require('./schemas.draft.js'));
50
- const ajv = new import_ajv.default({ strict: false, allErrors: false });
50
+ const ajv = new import_ajv.default({ inlineRefs: false, strict: false, allErrors: false });
51
51
  (0, import_ajv_formats.default)(ajv);
52
52
  for (const schema of import_schemas.default) ajv.addSchema(schema);
53
53
  function validateIdentity33Schema(id, value) {
@@ -100,6 +100,13 @@ function failure(cause) {
100
100
  if (cause !== void 0) Object.defineProperty(error, "cause", { value: cause });
101
101
  throw error;
102
102
  }
103
+ function claimRegistrableDomain(domain) {
104
+ try {
105
+ return (0, import_etld.eTldPlusOne)(domain);
106
+ } catch (cause) {
107
+ return failure(cause);
108
+ }
109
+ }
103
110
  function validateTrustRecord(value) {
104
111
  if (!validateIdentity33Schema("trust/v1/trust", value)) failure();
105
112
  const record = value;
@@ -335,13 +342,16 @@ function authorityGroup(operator) {
335
342
  const provider = (0, import_tldts.parse)(operator).domain;
336
343
  return `private:${provider ?? operator}`;
337
344
  }
345
+ const INTERMEDIARY_FETCH_CONCURRENCY = 8;
338
346
  function grantsScope(grant, scope) {
339
347
  return grant.scopes.some(
340
348
  (granted) => granted === "*" || granted === scope || granted === "adcp:all" && scope.startsWith("adcp:")
341
349
  );
342
350
  }
343
351
  function grantMatches(grant, target, claim, now) {
344
- if (registrableGrantee(grant.grantee) !== target) return false;
352
+ return registrableGrantee(grant.grantee) === target && grantCovers(grant, claim, now);
353
+ }
354
+ function grantCovers(grant, claim, now) {
345
355
  if (!grantsScope(grant, claim.scope)) return false;
346
356
  if (grant.agents && !grant.agents.some((agent) => grantAgentOrigin(agent.url) === (0, import_canonicalize.canonicalAgentOrigin)(claim.signerOrigin)))
347
357
  return false;
@@ -358,7 +368,7 @@ async function authorizeDemandGrant(claim, options) {
358
368
  const now = (options.now ?? (() => Date.now() / 1e3))();
359
369
  const signer = await options.evaluator.match(claim.signerOrigin, "adcp:buying", claim.brand.countries);
360
370
  if (signer.agent.countries && !claim.brand.countries?.length) failure();
361
- const brand = (0, import_etld.eTldPlusOne)(claim.brand.domain), account = (0, import_etld.eTldPlusOne)(claim.accountOperator), operator = signer.operator;
371
+ const brand = claimRegistrableDomain(claim.brand.domain), account = claimRegistrableDomain(claim.accountOperator), operator = signer.operator;
362
372
  const result = (source, chain, grants = []) => ({
363
373
  source,
364
374
  chain,
@@ -367,7 +377,6 @@ async function authorizeDemandGrant(claim, options) {
367
377
  ...grants.some((g) => g.valid_until) ? { expiresAt: Math.min(...grants.map((g) => g.valid_until ? Date.parse(g.valid_until) / 1e3 : Infinity)) } : {}
368
378
  });
369
379
  if (brand === operator && account === operator) return result("implicit", [brand]);
370
- if (brand === operator && account !== operator) throw new IdentityAuthorizationError("grant_absent");
371
380
  let house;
372
381
  try {
373
382
  house = await options.resolveBrandHouse?.(claim.brand);
@@ -376,34 +385,45 @@ async function authorizeDemandGrant(claim, options) {
376
385
  throw cause;
377
386
  unavailable(cause);
378
387
  }
379
- const authoritativeBrand = house ? (0, import_etld.eTldPlusOne)(house.domain) : brand;
380
- if (authoritativeBrand === operator && account === operator) return result("implicit", [brand, operator]);
388
+ const authoritativeBrand = house ? claimRegistrableDomain(house.domain) : brand;
389
+ const self = /* @__PURE__ */ new Set([brand, authoritativeBrand]);
390
+ if (self.has(account) && self.has(operator)) return result("implicit", [.../* @__PURE__ */ new Set([brand, account, operator])]);
381
391
  const grantClaim = house ? { ...claim, brand: { ...claim.brand, brand_id: house.brand_id } } : claim;
382
392
  const record = await options.evaluator.get(authoritativeBrand);
383
393
  if (record.status === "absent") {
384
394
  if (await options.legacyAuthorization?.(claim)) return result("legacy", [brand, account, operator]);
385
395
  throw new IdentityAuthorizationError("grant_absent");
386
396
  }
387
- const first = (record.record.grants ?? []).filter((g) => grantMatches(g, account, grantClaim, now));
388
- if (account === operator && first.length) return result("trust", [brand, operator], [first[0]]);
389
- const selfOperated = account === brand || account === authoritativeBrand;
390
- if (selfOperated && account !== operator) {
391
- const direct = (record.record.grants ?? []).find((g) => grantMatches(g, operator, grantClaim, now));
392
- if (direct) return result("trust", [brand, operator], [direct]);
397
+ const firsts = [];
398
+ for (const grant of record.record.grants ?? []) {
399
+ const grantee = registrableGrantee(grant.grantee);
400
+ if (grantee === void 0 || !grantCovers(grant, grantClaim, now)) continue;
401
+ if (!self.has(account) && account !== grantee) continue;
402
+ if (grantee === operator) return result("trust", [brand, operator], [grant]);
403
+ firsts.push({ grant, grantee });
404
+ }
405
+ const grantees = [...new Set(firsts.map((f) => f.grantee))];
406
+ const records = /* @__PURE__ */ new Map();
407
+ for (let i = 0; i < grantees.length; i += INTERMEDIARY_FETCH_CONCURRENCY) {
408
+ const batch = grantees.slice(i, i + INTERMEDIARY_FETCH_CONCURRENCY);
409
+ const settled = await Promise.allSettled(batch.map((grantee) => options.evaluator.get(grantee)));
410
+ settled.forEach(
411
+ (outcome, j) => records.set(batch[j], outcome.status === "fulfilled" ? outcome.value : { failed: outcome.reason })
412
+ );
393
413
  }
394
- if (account !== operator && account !== brand && first.length) {
395
- const intermediary = await options.evaluator.get(account);
396
- if (intermediary.status === "present") {
397
- const second = (intermediary.record.grants ?? []).find((g) => grantMatches(g, operator, grantClaim, now));
398
- if (second) return result("trust", [brand, account, operator], [first[0], second]);
414
+ let outage;
415
+ for (const { grant: first, grantee } of firsts) {
416
+ const intermediary = records.get(grantee);
417
+ if ("failed" in intermediary) {
418
+ outage ??= intermediary.failed;
419
+ continue;
399
420
  }
421
+ if (intermediary.status !== "present") continue;
422
+ const second = (intermediary.record.grants ?? []).find((g) => grantMatches(g, operator, grantClaim, now));
423
+ if (second) return result("trust", [brand, grantee, operator], [first, second]);
400
424
  }
401
- const covered = (record.record.grants ?? []).some((g) => {
402
- const grantee = registrableGrantee(g.grantee);
403
- return grantee !== void 0 && (grantee === account || selfOperated && grantee === operator) && grantsScope(g, claim.scope);
404
- });
405
- const exclusive = record.record.exclusive_grants === true && (record.record.grants ?? []).some((g) => grantsScope(g, claim.scope));
406
- if (!covered && !exclusive && await options.sellerAuthorization?.(claim))
425
+ if (outage !== void 0) throw outage;
426
+ if (record.record.exclusive_grants !== true && await options.sellerAuthorization?.(claim))
407
427
  return result("seller", [brand, account, operator]);
408
428
  throw new IdentityAuthorizationError("grant_absent");
409
429
  }
@@ -6,7 +6,7 @@ import { eTldPlusOne } from "../signing/agent-resolver/etld.mjs";
6
6
  import { parseStrictJson } from "../signing/agent-resolver/strict-json.mjs";
7
7
  import { parse as parseDomain } from "tldts";
8
8
  import schemas from "./schemas.draft.mjs";
9
- const ajv = new Ajv({ strict: false, allErrors: false });
9
+ const ajv = new Ajv({ inlineRefs: false, strict: false, allErrors: false });
10
10
  addFormats(ajv);
11
11
  for (const schema of schemas) ajv.addSchema(schema);
12
12
  function validateIdentity33Schema(id, value) {
@@ -59,6 +59,13 @@ function failure(cause) {
59
59
  if (cause !== void 0) Object.defineProperty(error, "cause", { value: cause });
60
60
  throw error;
61
61
  }
62
+ function claimRegistrableDomain(domain) {
63
+ try {
64
+ return eTldPlusOne(domain);
65
+ } catch (cause) {
66
+ return failure(cause);
67
+ }
68
+ }
62
69
  function validateTrustRecord(value) {
63
70
  if (!validateIdentity33Schema("trust/v1/trust", value)) failure();
64
71
  const record = value;
@@ -294,13 +301,16 @@ function authorityGroup(operator) {
294
301
  const provider = parseDomain(operator).domain;
295
302
  return `private:${provider ?? operator}`;
296
303
  }
304
+ const INTERMEDIARY_FETCH_CONCURRENCY = 8;
297
305
  function grantsScope(grant, scope) {
298
306
  return grant.scopes.some(
299
307
  (granted) => granted === "*" || granted === scope || granted === "adcp:all" && scope.startsWith("adcp:")
300
308
  );
301
309
  }
302
310
  function grantMatches(grant, target, claim, now) {
303
- if (registrableGrantee(grant.grantee) !== target) return false;
311
+ return registrableGrantee(grant.grantee) === target && grantCovers(grant, claim, now);
312
+ }
313
+ function grantCovers(grant, claim, now) {
304
314
  if (!grantsScope(grant, claim.scope)) return false;
305
315
  if (grant.agents && !grant.agents.some((agent) => grantAgentOrigin(agent.url) === canonicalAgentOrigin(claim.signerOrigin)))
306
316
  return false;
@@ -317,7 +327,7 @@ async function authorizeDemandGrant(claim, options) {
317
327
  const now = (options.now ?? (() => Date.now() / 1e3))();
318
328
  const signer = await options.evaluator.match(claim.signerOrigin, "adcp:buying", claim.brand.countries);
319
329
  if (signer.agent.countries && !claim.brand.countries?.length) failure();
320
- const brand = eTldPlusOne(claim.brand.domain), account = eTldPlusOne(claim.accountOperator), operator = signer.operator;
330
+ const brand = claimRegistrableDomain(claim.brand.domain), account = claimRegistrableDomain(claim.accountOperator), operator = signer.operator;
321
331
  const result = (source, chain, grants = []) => ({
322
332
  source,
323
333
  chain,
@@ -326,7 +336,6 @@ async function authorizeDemandGrant(claim, options) {
326
336
  ...grants.some((g) => g.valid_until) ? { expiresAt: Math.min(...grants.map((g) => g.valid_until ? Date.parse(g.valid_until) / 1e3 : Infinity)) } : {}
327
337
  });
328
338
  if (brand === operator && account === operator) return result("implicit", [brand]);
329
- if (brand === operator && account !== operator) throw new IdentityAuthorizationError("grant_absent");
330
339
  let house;
331
340
  try {
332
341
  house = await options.resolveBrandHouse?.(claim.brand);
@@ -335,34 +344,45 @@ async function authorizeDemandGrant(claim, options) {
335
344
  throw cause;
336
345
  unavailable(cause);
337
346
  }
338
- const authoritativeBrand = house ? eTldPlusOne(house.domain) : brand;
339
- if (authoritativeBrand === operator && account === operator) return result("implicit", [brand, operator]);
347
+ const authoritativeBrand = house ? claimRegistrableDomain(house.domain) : brand;
348
+ const self = /* @__PURE__ */ new Set([brand, authoritativeBrand]);
349
+ if (self.has(account) && self.has(operator)) return result("implicit", [.../* @__PURE__ */ new Set([brand, account, operator])]);
340
350
  const grantClaim = house ? { ...claim, brand: { ...claim.brand, brand_id: house.brand_id } } : claim;
341
351
  const record = await options.evaluator.get(authoritativeBrand);
342
352
  if (record.status === "absent") {
343
353
  if (await options.legacyAuthorization?.(claim)) return result("legacy", [brand, account, operator]);
344
354
  throw new IdentityAuthorizationError("grant_absent");
345
355
  }
346
- const first = (record.record.grants ?? []).filter((g) => grantMatches(g, account, grantClaim, now));
347
- if (account === operator && first.length) return result("trust", [brand, operator], [first[0]]);
348
- const selfOperated = account === brand || account === authoritativeBrand;
349
- if (selfOperated && account !== operator) {
350
- const direct = (record.record.grants ?? []).find((g) => grantMatches(g, operator, grantClaim, now));
351
- if (direct) return result("trust", [brand, operator], [direct]);
356
+ const firsts = [];
357
+ for (const grant of record.record.grants ?? []) {
358
+ const grantee = registrableGrantee(grant.grantee);
359
+ if (grantee === void 0 || !grantCovers(grant, grantClaim, now)) continue;
360
+ if (!self.has(account) && account !== grantee) continue;
361
+ if (grantee === operator) return result("trust", [brand, operator], [grant]);
362
+ firsts.push({ grant, grantee });
363
+ }
364
+ const grantees = [...new Set(firsts.map((f) => f.grantee))];
365
+ const records = /* @__PURE__ */ new Map();
366
+ for (let i = 0; i < grantees.length; i += INTERMEDIARY_FETCH_CONCURRENCY) {
367
+ const batch = grantees.slice(i, i + INTERMEDIARY_FETCH_CONCURRENCY);
368
+ const settled = await Promise.allSettled(batch.map((grantee) => options.evaluator.get(grantee)));
369
+ settled.forEach(
370
+ (outcome, j) => records.set(batch[j], outcome.status === "fulfilled" ? outcome.value : { failed: outcome.reason })
371
+ );
352
372
  }
353
- if (account !== operator && account !== brand && first.length) {
354
- const intermediary = await options.evaluator.get(account);
355
- if (intermediary.status === "present") {
356
- const second = (intermediary.record.grants ?? []).find((g) => grantMatches(g, operator, grantClaim, now));
357
- if (second) return result("trust", [brand, account, operator], [first[0], second]);
373
+ let outage;
374
+ for (const { grant: first, grantee } of firsts) {
375
+ const intermediary = records.get(grantee);
376
+ if ("failed" in intermediary) {
377
+ outage ??= intermediary.failed;
378
+ continue;
358
379
  }
380
+ if (intermediary.status !== "present") continue;
381
+ const second = (intermediary.record.grants ?? []).find((g) => grantMatches(g, operator, grantClaim, now));
382
+ if (second) return result("trust", [brand, grantee, operator], [first, second]);
359
383
  }
360
- const covered = (record.record.grants ?? []).some((g) => {
361
- const grantee = registrableGrantee(g.grantee);
362
- return grantee !== void 0 && (grantee === account || selfOperated && grantee === operator) && grantsScope(g, claim.scope);
363
- });
364
- const exclusive = record.record.exclusive_grants === true && (record.record.grants ?? []).some((g) => grantsScope(g, claim.scope));
365
- if (!covered && !exclusive && await options.sellerAuthorization?.(claim))
384
+ if (outage !== void 0) throw outage;
385
+ if (record.record.exclusive_grants !== true && await options.sellerAuthorization?.(claim))
366
386
  return result("seller", [brand, account, operator]);
367
387
  throw new IdentityAuthorizationError("grant_absent");
368
388
  }
@@ -34,6 +34,7 @@ module.exports = __toCommonJS(validation_exports);
34
34
  var import_ajv = __toESM(require("ajv"));
35
35
  var import_ajv_formats = __toESM(require("ajv-formats"));
36
36
  var import_schema_loader = require('../validation/schema-loader.js');
37
+ var import_compact_schema = require('../validation/compact-schema.js');
37
38
  var import_schemas = __toESM(require('./schemas.draft.js'));
38
39
  const validators = /* @__PURE__ */ new WeakMap();
39
40
  function validateIdentity33Payload(tool, direction, payload, version) {
@@ -79,14 +80,15 @@ function validateIdentity33Payload(tool, direction, payload, version) {
79
80
  for (const [k, value] of Object.entries(object)) if (k !== "$id") walk2(value, k);
80
81
  };
81
82
  var walk = walk2;
82
- const schema = structuredClone(stable.schema);
83
+ const document = (0, import_schema_loader.getToolSchemaDocument)(tool, direction === "request" ? "request" : "sync", version)?.schema ?? stable.schema;
84
+ const schema = structuredClone(direction === "response" ? (0, import_schema_loader.relaxResponseRoot)(document) : document);
83
85
  const relationship = import_schemas.default.find((s) => s.$id === "/schemas/core/principal-relationship.json");
84
86
  const onboarding = import_schemas.default.find((s) => s.$id === "/schemas/core/agent-onboarding.json");
85
87
  walk2(schema);
86
- const ajv = new import_ajv.default({ strict: false, allErrors: true });
88
+ const ajv = new import_ajv.default({ inlineRefs: false, strict: false, allErrors: true });
87
89
  (0, import_ajv_formats.default)(ajv);
88
90
  for (const draft of import_schemas.default) ajv.addSchema({ ...draft, $id: "https://adcontextprotocol.org" + draft.$id });
89
- validator = ajv.compile(schema);
91
+ validator = ajv.compile((0, import_compact_schema.compactSchemaForValidation)(schema));
90
92
  cache.set(key, validator);
91
93
  }
92
94
  let valid = validator(payload) === true;
@@ -1,6 +1,7 @@
1
1
  import Ajv from "ajv";
2
2
  import addFormats from "ajv-formats";
3
- import { getValidator } from "../validation/schema-loader.mjs";
3
+ import { getValidator, getToolSchemaDocument, relaxResponseRoot } from "../validation/schema-loader.mjs";
4
+ import { compactSchemaForValidation } from "../validation/compact-schema.mjs";
4
5
  import schemas from "./schemas.draft.mjs";
5
6
  const validators = /* @__PURE__ */ new WeakMap();
6
7
  function validateIdentity33Payload(tool, direction, payload, version) {
@@ -46,14 +47,15 @@ function validateIdentity33Payload(tool, direction, payload, version) {
46
47
  for (const [k, value] of Object.entries(object)) if (k !== "$id") walk2(value, k);
47
48
  };
48
49
  var walk = walk2;
49
- const schema = structuredClone(stable.schema);
50
+ const document = getToolSchemaDocument(tool, direction === "request" ? "request" : "sync", version)?.schema ?? stable.schema;
51
+ const schema = structuredClone(direction === "response" ? relaxResponseRoot(document) : document);
50
52
  const relationship = schemas.find((s) => s.$id === "/schemas/core/principal-relationship.json");
51
53
  const onboarding = schemas.find((s) => s.$id === "/schemas/core/agent-onboarding.json");
52
54
  walk2(schema);
53
- const ajv = new Ajv({ strict: false, allErrors: true });
55
+ const ajv = new Ajv({ inlineRefs: false, strict: false, allErrors: true });
54
56
  addFormats(ajv);
55
57
  for (const draft of schemas) ajv.addSchema({ ...draft, $id: "https://adcontextprotocol.org" + draft.$id });
56
- validator = ajv.compile(schema);
58
+ validator = ajv.compile(compactSchemaForValidation(schema));
57
59
  cache.set(key, validator);
58
60
  }
59
61
  let valid = validator(payload) === true;