@adcp/sdk 17.0.0-beta.1 → 17.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 (239) 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/types.d.mts +5 -0
  10. package/dist/lib/adapters/version/types.d.ts +5 -0
  11. package/dist/lib/canonical-references/index.js +2 -0
  12. package/dist/lib/canonical-references/index.mjs +2 -0
  13. package/dist/lib/client/account-changes.d.mts +3 -1
  14. package/dist/lib/client/account-changes.d.ts +3 -1
  15. package/dist/lib/client/account-changes.js +22 -2
  16. package/dist/lib/client/account-changes.mjs +22 -2
  17. package/dist/lib/conformance/oracle.js +3 -2
  18. package/dist/lib/conformance/oracle.mjs +3 -2
  19. package/dist/lib/core/AgentClient.d.mts +165 -1
  20. package/dist/lib/core/AgentClient.d.ts +165 -1
  21. package/dist/lib/core/AgentClient.js +446 -8
  22. package/dist/lib/core/AgentClient.mjs +446 -8
  23. package/dist/lib/core/ConversationTypes.d.mts +8 -0
  24. package/dist/lib/core/ConversationTypes.d.ts +8 -0
  25. package/dist/lib/core/ProtocolResponseParser.d.mts +1 -1
  26. package/dist/lib/core/ProtocolResponseParser.d.ts +1 -1
  27. package/dist/lib/core/ProtocolResponseParser.js +28 -18
  28. package/dist/lib/core/ProtocolResponseParser.mjs +11 -1
  29. package/dist/lib/core/SingleAgentClient.d.mts +115 -2
  30. package/dist/lib/core/SingleAgentClient.d.ts +115 -2
  31. package/dist/lib/core/SingleAgentClient.js +547 -67
  32. package/dist/lib/core/SingleAgentClient.mjs +534 -54
  33. package/dist/lib/core/TaskExecutor.d.mts +7 -0
  34. package/dist/lib/core/TaskExecutor.d.ts +7 -0
  35. package/dist/lib/core/TaskExecutor.js +18 -5
  36. package/dist/lib/core/TaskExecutor.mjs +18 -5
  37. package/dist/lib/core/task-status.d.mts +2 -0
  38. package/dist/lib/core/task-status.d.ts +2 -0
  39. package/dist/lib/core/task-status.js +11 -2
  40. package/dist/lib/core/task-status.mjs +9 -1
  41. package/dist/lib/identity-3.3/trust.d.mts +1 -4
  42. package/dist/lib/identity-3.3/trust.d.ts +1 -4
  43. package/dist/lib/identity-3.3/trust.js +34 -21
  44. package/dist/lib/identity-3.3/trust.mjs +34 -21
  45. package/dist/lib/identity-3.3/validation.js +5 -3
  46. package/dist/lib/identity-3.3/validation.mjs +6 -4
  47. package/dist/lib/index.d.mts +6 -52
  48. package/dist/lib/index.d.ts +6 -52
  49. package/dist/lib/index.js +11 -0
  50. package/dist/lib/index.mjs +7 -0
  51. package/dist/lib/media-buy/compatibility.js +6 -1
  52. package/dist/lib/media-buy/compatibility.mjs +6 -1
  53. package/dist/lib/protocols/mcp-scope.d.mts +3 -0
  54. package/dist/lib/protocols/mcp-scope.d.ts +3 -0
  55. package/dist/lib/protocols/mcp-scope.js +8 -3
  56. package/dist/lib/protocols/mcp-scope.mjs +8 -3
  57. package/dist/lib/reporting/inspection.js +1 -0
  58. package/dist/lib/reporting/inspection.mjs +1 -0
  59. package/dist/lib/reporting/ledger/coverage.d.mts +5 -0
  60. package/dist/lib/reporting/ledger/coverage.d.ts +5 -0
  61. package/dist/lib/reporting/ledger/coverage.js +37 -3
  62. package/dist/lib/reporting/ledger/coverage.mjs +36 -3
  63. package/dist/lib/reporting/ledger/handler.js +7 -4
  64. package/dist/lib/reporting/ledger/handler.mjs +7 -4
  65. package/dist/lib/reporting/ledger/producer.js +215 -69
  66. package/dist/lib/reporting/ledger/producer.mjs +217 -70
  67. package/dist/lib/reporting/ledger/schedule.d.mts +2 -2
  68. package/dist/lib/reporting/ledger/schedule.d.ts +2 -2
  69. package/dist/lib/reporting/ledger/schedule.js +8 -5
  70. package/dist/lib/reporting/ledger/schedule.mjs +8 -5
  71. package/dist/lib/reporting/ledger/status-ingest.d.mts +1 -1
  72. package/dist/lib/reporting/ledger/status-ingest.d.ts +1 -1
  73. package/dist/lib/reporting/ledger/status-ingest.js +4 -3
  74. package/dist/lib/reporting/ledger/status-ingest.mjs +4 -3
  75. package/dist/lib/reporting/ledger/types.d.mts +36 -1
  76. package/dist/lib/reporting/ledger/types.d.ts +36 -1
  77. package/dist/lib/reporting/service/index.d.mts +14 -1
  78. package/dist/lib/reporting/service/index.d.ts +14 -1
  79. package/dist/lib/reporting/service/index.js +24 -12
  80. package/dist/lib/reporting/service/index.mjs +24 -12
  81. package/dist/lib/schemas/browser.d.mts +2 -0
  82. package/dist/lib/schemas/browser.d.ts +2 -0
  83. package/dist/lib/schemas/browser.js +3 -0
  84. package/dist/lib/schemas/browser.mjs +2 -0
  85. package/dist/lib/schemas/index.d.mts +5 -3
  86. package/dist/lib/schemas/index.d.ts +5 -3
  87. package/dist/lib/schemas/index.js +5 -0
  88. package/dist/lib/schemas/index.mjs +4 -0
  89. package/dist/lib/server/account-response-identity.d.mts +17 -0
  90. package/dist/lib/server/account-response-identity.d.ts +17 -0
  91. package/dist/lib/server/account-response-identity.js +52 -0
  92. package/dist/lib/server/account-response-identity.mjs +28 -0
  93. package/dist/lib/server/account-sync-contract.js +2 -2
  94. package/dist/lib/server/account-sync-contract.mjs +2 -2
  95. package/dist/lib/server/create-adcp-server.js +33 -20
  96. package/dist/lib/server/create-adcp-server.mjs +36 -12
  97. package/dist/lib/server/decisioning/account.d.mts +36 -10
  98. package/dist/lib/server/decisioning/account.d.ts +36 -10
  99. package/dist/lib/server/decisioning/account.js +33 -14
  100. package/dist/lib/server/decisioning/account.mjs +33 -14
  101. package/dist/lib/server/decisioning/runtime/from-platform.d.mts +5 -5
  102. package/dist/lib/server/decisioning/runtime/from-platform.d.ts +5 -5
  103. package/dist/lib/server/decisioning/runtime/from-platform.js +4 -4
  104. package/dist/lib/server/decisioning/runtime/from-platform.mjs +4 -4
  105. package/dist/lib/server/media-buy-store.d.mts +26 -12
  106. package/dist/lib/server/media-buy-store.d.ts +26 -12
  107. package/dist/lib/server/media-buy-store.js +69 -21
  108. package/dist/lib/server/media-buy-store.mjs +69 -21
  109. package/dist/lib/server/notification-subscriptions/runtime.d.mts +1 -1
  110. package/dist/lib/server/notification-subscriptions/runtime.d.ts +1 -1
  111. package/dist/lib/server/notification-subscriptions/runtime.js +4 -0
  112. package/dist/lib/server/notification-subscriptions/runtime.mjs +4 -0
  113. package/dist/lib/server/responses.js +9 -1
  114. package/dist/lib/server/responses.mjs +9 -1
  115. package/dist/lib/signing/agent-fetch.d.mts +1 -1
  116. package/dist/lib/signing/agent-fetch.d.ts +1 -1
  117. package/dist/lib/signing/agent-fetch.js +3 -3
  118. package/dist/lib/signing/agent-fetch.mjs +3 -3
  119. package/dist/lib/testing/storyboard/canonical-format-satisfaction.js +60 -14
  120. package/dist/lib/testing/storyboard/canonical-format-satisfaction.mjs +60 -14
  121. package/dist/lib/testing/storyboard/compliance.d.mts +2 -5
  122. package/dist/lib/testing/storyboard/compliance.d.ts +2 -5
  123. package/dist/lib/testing/storyboard/compliance.js +62 -13
  124. package/dist/lib/testing/storyboard/compliance.mjs +63 -14
  125. package/dist/lib/testing/storyboard/request-signing/vector-loader.d.mts +2 -0
  126. package/dist/lib/testing/storyboard/request-signing/vector-loader.d.ts +2 -0
  127. package/dist/lib/testing/storyboard/request-signing/vector-loader.js +11 -0
  128. package/dist/lib/testing/storyboard/request-signing/vector-loader.mjs +10 -0
  129. package/dist/lib/testing/storyboard/validations.d.mts +1 -1
  130. package/dist/lib/testing/storyboard/validations.d.ts +1 -1
  131. package/dist/lib/types/accept-proposal.d.ts +20 -28
  132. package/dist/lib/types/asset-instances.d.mts +1 -1
  133. package/dist/lib/types/asset-instances.d.ts +1 -1
  134. package/dist/lib/types/buy-products.d.ts +20 -28
  135. package/dist/lib/types/check-governance.d.ts +20 -28
  136. package/dist/lib/types/comply-test-controller.d.ts +20 -28
  137. package/dist/lib/types/control-media-buy.d.ts +20 -28
  138. package/dist/lib/types/core.generated.d.mts +273 -184
  139. package/dist/lib/types/core.generated.d.ts +273 -184
  140. package/dist/lib/types/create-media-buy.d.ts +20 -28
  141. package/dist/lib/types/get-media-buys.d.ts +20 -28
  142. package/dist/lib/types/get-products.d.ts +20 -28
  143. package/dist/lib/types/index.d.mts +6 -1
  144. package/dist/lib/types/index.d.ts +6 -1
  145. package/dist/lib/types/index.js +6 -1
  146. package/dist/lib/types/index.mjs +4 -1
  147. package/dist/lib/types/inline-enums.generated.d.mts +30 -4
  148. package/dist/lib/types/inline-enums.generated.d.ts +30 -4
  149. package/dist/lib/types/inline-enums.generated.js +41 -2
  150. package/dist/lib/types/inline-enums.generated.mjs +28 -2
  151. package/dist/lib/types/list-products.d.ts +20 -28
  152. package/dist/lib/types/list-proposals.d.ts +20 -28
  153. package/dist/lib/types/media-buy-delivery-report.d.mts +6 -0
  154. package/dist/lib/types/media-buy-delivery-report.d.ts +6 -0
  155. package/dist/lib/types/media-buy-delivery-report.js +16 -0
  156. package/dist/lib/types/media-buy-delivery-report.mjs +0 -0
  157. package/dist/lib/types/refine-proposals.d.ts +20 -28
  158. package/dist/lib/types/request-proposals.d.ts +20 -28
  159. package/dist/lib/types/schemas.generated.d.ts +63113 -127273
  160. package/dist/lib/types/schemas.generated.js +759 -770
  161. package/dist/lib/types/schemas.generated.mjs +759 -770
  162. package/dist/lib/types/targeting-keys.generated.d.mts +4 -0
  163. package/dist/lib/types/targeting-keys.generated.d.ts +4 -0
  164. package/dist/lib/types/targeting-keys.generated.js +109 -0
  165. package/dist/lib/types/targeting-keys.generated.mjs +84 -0
  166. package/dist/lib/types/tools.generated.d.mts +2 -68
  167. package/dist/lib/types/tools.generated.d.ts +2 -68
  168. package/dist/lib/types/update-media-buy.d.ts +20 -28
  169. package/dist/lib/utils/adcp-version-config.js +5 -2
  170. package/dist/lib/utils/adcp-version-config.mjs +5 -2
  171. package/dist/lib/utils/response-unwrapper.js +6 -1
  172. package/dist/lib/utils/response-unwrapper.mjs +6 -1
  173. package/dist/lib/v2/format-schema/resolver.js +1 -1
  174. package/dist/lib/v2/format-schema/resolver.mjs +1 -1
  175. package/dist/lib/v2/projection/creative-delivery.js +104 -29
  176. package/dist/lib/v2/projection/creative-delivery.mjs +108 -29
  177. package/dist/lib/v2/projection/index.d.mts +1 -0
  178. package/dist/lib/v2/projection/index.d.ts +1 -0
  179. package/dist/lib/v2/projection/index.js +3 -0
  180. package/dist/lib/v2/projection/index.mjs +2 -0
  181. package/dist/lib/v2/projection/legacy-metadata.d.mts +19 -0
  182. package/dist/lib/v2/projection/legacy-metadata.d.ts +19 -0
  183. package/dist/lib/v2/projection/legacy-metadata.js +91 -0
  184. package/dist/lib/v2/projection/legacy-metadata.mjs +86 -0
  185. package/dist/lib/v2/projection/v1-to-v2.d.mts +1 -1
  186. package/dist/lib/v2/projection/v1-to-v2.d.ts +1 -1
  187. package/dist/lib/v2/projection/v1-to-v2.js +12 -9
  188. package/dist/lib/v2/projection/v1-to-v2.mjs +12 -9
  189. package/dist/lib/validation/budget-allocation.d.mts +3 -3
  190. package/dist/lib/validation/budget-allocation.d.ts +3 -3
  191. package/dist/lib/validation/compact-schema.d.mts +27 -0
  192. package/dist/lib/validation/compact-schema.d.ts +27 -0
  193. package/dist/lib/validation/compact-schema.js +276 -0
  194. package/dist/lib/validation/compact-schema.mjs +250 -0
  195. package/dist/lib/validation/media-buy-delivery-report.d.mts +8 -0
  196. package/dist/lib/validation/media-buy-delivery-report.d.ts +8 -0
  197. package/dist/lib/validation/media-buy-delivery-report.js +31 -0
  198. package/dist/lib/validation/media-buy-delivery-report.mjs +7 -0
  199. package/dist/lib/validation/nonempty-array.d.mts +15 -0
  200. package/dist/lib/validation/nonempty-array.d.ts +15 -0
  201. package/dist/lib/validation/nonempty-array.js +41 -0
  202. package/dist/lib/validation/nonempty-array.mjs +7 -0
  203. package/dist/lib/validation/schema-diagnostic-origins.d.mts +21 -0
  204. package/dist/lib/validation/schema-diagnostic-origins.d.ts +21 -0
  205. package/dist/lib/validation/schema-diagnostic-origins.js +193 -0
  206. package/dist/lib/validation/schema-diagnostic-origins.mjs +169 -0
  207. package/dist/lib/validation/schema-loader.js +86 -16
  208. package/dist/lib/validation/schema-loader.mjs +82 -16
  209. package/dist/lib/validation/schema-validator.d.mts +10 -19
  210. package/dist/lib/validation/schema-validator.d.ts +10 -19
  211. package/dist/lib/validation/schema-validator.js +135 -42
  212. package/dist/lib/validation/schema-validator.mjs +139 -43
  213. package/dist/lib/validation/sync-creatives.d.mts +22 -22
  214. package/dist/lib/validation/sync-creatives.d.ts +22 -22
  215. package/dist/lib/version.d.mts +3 -3
  216. package/dist/lib/version.d.ts +3 -3
  217. package/dist/lib/version.js +3 -3
  218. package/dist/lib/version.mjs +3 -3
  219. package/dist/lib/webhooks/index.d.mts +3 -0
  220. package/dist/lib/webhooks/index.d.ts +3 -0
  221. package/dist/lib/webhooks/index.js +3 -0
  222. package/dist/lib/webhooks/index.mjs +2 -0
  223. package/dist/lib/webhooks/media-buy-delivery.d.mts +43 -0
  224. package/dist/lib/webhooks/media-buy-delivery.d.ts +43 -0
  225. package/dist/lib/webhooks/media-buy-delivery.js +119 -0
  226. package/dist/lib/webhooks/media-buy-delivery.mjs +94 -0
  227. package/docs/TYPE-SUMMARY.md +2 -2
  228. package/docs/guides/DELIVERY-WEBHOOK-PARSING.md +142 -0
  229. package/docs/guides/DISCOVERY-CACHE-AND-SESSION-REUSE.md +15 -0
  230. package/docs/guides/REPORTING-LEDGER.md +93 -0
  231. package/docs/guides/REPORTING-STABILITY.md +1 -1
  232. package/docs/guides/TYPED-CLIENT-TOOLS.md +49 -0
  233. package/docs/llms.txt +2 -2
  234. package/docs/migration-14.x-rc-worksheet.md +4 -4
  235. package/docs/migration-16-to-17.md +191 -14
  236. package/docs/migration-6.6-to-6.7.md +14 -0
  237. package/docs/migration-account-change-feed.md +15 -0
  238. package/docs/recipes/verifying-inbound-webhooks.md +18 -2
  239. package/package.json +2 -2
@@ -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) {
@@ -335,13 +335,16 @@ function authorityGroup(operator) {
335
335
  const provider = (0, import_tldts.parse)(operator).domain;
336
336
  return `private:${provider ?? operator}`;
337
337
  }
338
+ const INTERMEDIARY_FETCH_CONCURRENCY = 8;
338
339
  function grantsScope(grant, scope) {
339
340
  return grant.scopes.some(
340
341
  (granted) => granted === "*" || granted === scope || granted === "adcp:all" && scope.startsWith("adcp:")
341
342
  );
342
343
  }
343
344
  function grantMatches(grant, target, claim, now) {
344
- if (registrableGrantee(grant.grantee) !== target) return false;
345
+ return registrableGrantee(grant.grantee) === target && grantCovers(grant, claim, now);
346
+ }
347
+ function grantCovers(grant, claim, now) {
345
348
  if (!grantsScope(grant, claim.scope)) return false;
346
349
  if (grant.agents && !grant.agents.some((agent) => grantAgentOrigin(agent.url) === (0, import_canonicalize.canonicalAgentOrigin)(claim.signerOrigin)))
347
350
  return false;
@@ -367,7 +370,6 @@ async function authorizeDemandGrant(claim, options) {
367
370
  ...grants.some((g) => g.valid_until) ? { expiresAt: Math.min(...grants.map((g) => g.valid_until ? Date.parse(g.valid_until) / 1e3 : Infinity)) } : {}
368
371
  });
369
372
  if (brand === operator && account === operator) return result("implicit", [brand]);
370
- if (brand === operator && account !== operator) throw new IdentityAuthorizationError("grant_absent");
371
373
  let house;
372
374
  try {
373
375
  house = await options.resolveBrandHouse?.(claim.brand);
@@ -377,33 +379,44 @@ async function authorizeDemandGrant(claim, options) {
377
379
  unavailable(cause);
378
380
  }
379
381
  const authoritativeBrand = house ? (0, import_etld.eTldPlusOne)(house.domain) : brand;
380
- if (authoritativeBrand === operator && account === operator) return result("implicit", [brand, operator]);
382
+ const self = /* @__PURE__ */ new Set([brand, authoritativeBrand]);
383
+ if (self.has(account) && self.has(operator)) return result("implicit", [.../* @__PURE__ */ new Set([brand, account, operator])]);
381
384
  const grantClaim = house ? { ...claim, brand: { ...claim.brand, brand_id: house.brand_id } } : claim;
382
385
  const record = await options.evaluator.get(authoritativeBrand);
383
386
  if (record.status === "absent") {
384
387
  if (await options.legacyAuthorization?.(claim)) return result("legacy", [brand, account, operator]);
385
388
  throw new IdentityAuthorizationError("grant_absent");
386
389
  }
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]);
390
+ const firsts = [];
391
+ for (const grant of record.record.grants ?? []) {
392
+ const grantee = registrableGrantee(grant.grantee);
393
+ if (grantee === void 0 || !grantCovers(grant, grantClaim, now)) continue;
394
+ if (!self.has(account) && account !== grantee) continue;
395
+ if (grantee === operator) return result("trust", [brand, operator], [grant]);
396
+ firsts.push({ grant, grantee });
397
+ }
398
+ const grantees = [...new Set(firsts.map((f) => f.grantee))];
399
+ const records = /* @__PURE__ */ new Map();
400
+ for (let i = 0; i < grantees.length; i += INTERMEDIARY_FETCH_CONCURRENCY) {
401
+ const batch = grantees.slice(i, i + INTERMEDIARY_FETCH_CONCURRENCY);
402
+ const settled = await Promise.allSettled(batch.map((grantee) => options.evaluator.get(grantee)));
403
+ settled.forEach(
404
+ (outcome, j) => records.set(batch[j], outcome.status === "fulfilled" ? outcome.value : { failed: outcome.reason })
405
+ );
393
406
  }
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]);
407
+ let outage;
408
+ for (const { grant: first, grantee } of firsts) {
409
+ const intermediary = records.get(grantee);
410
+ if ("failed" in intermediary) {
411
+ outage ??= intermediary.failed;
412
+ continue;
399
413
  }
414
+ if (intermediary.status !== "present") continue;
415
+ const second = (intermediary.record.grants ?? []).find((g) => grantMatches(g, operator, grantClaim, now));
416
+ if (second) return result("trust", [brand, grantee, operator], [first, second]);
400
417
  }
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))
418
+ if (outage !== void 0) throw outage;
419
+ if (record.record.exclusive_grants !== true && await options.sellerAuthorization?.(claim))
407
420
  return result("seller", [brand, account, operator]);
408
421
  throw new IdentityAuthorizationError("grant_absent");
409
422
  }
@@ -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) {
@@ -294,13 +294,16 @@ function authorityGroup(operator) {
294
294
  const provider = parseDomain(operator).domain;
295
295
  return `private:${provider ?? operator}`;
296
296
  }
297
+ const INTERMEDIARY_FETCH_CONCURRENCY = 8;
297
298
  function grantsScope(grant, scope) {
298
299
  return grant.scopes.some(
299
300
  (granted) => granted === "*" || granted === scope || granted === "adcp:all" && scope.startsWith("adcp:")
300
301
  );
301
302
  }
302
303
  function grantMatches(grant, target, claim, now) {
303
- if (registrableGrantee(grant.grantee) !== target) return false;
304
+ return registrableGrantee(grant.grantee) === target && grantCovers(grant, claim, now);
305
+ }
306
+ function grantCovers(grant, claim, now) {
304
307
  if (!grantsScope(grant, claim.scope)) return false;
305
308
  if (grant.agents && !grant.agents.some((agent) => grantAgentOrigin(agent.url) === canonicalAgentOrigin(claim.signerOrigin)))
306
309
  return false;
@@ -326,7 +329,6 @@ async function authorizeDemandGrant(claim, options) {
326
329
  ...grants.some((g) => g.valid_until) ? { expiresAt: Math.min(...grants.map((g) => g.valid_until ? Date.parse(g.valid_until) / 1e3 : Infinity)) } : {}
327
330
  });
328
331
  if (brand === operator && account === operator) return result("implicit", [brand]);
329
- if (brand === operator && account !== operator) throw new IdentityAuthorizationError("grant_absent");
330
332
  let house;
331
333
  try {
332
334
  house = await options.resolveBrandHouse?.(claim.brand);
@@ -336,33 +338,44 @@ async function authorizeDemandGrant(claim, options) {
336
338
  unavailable(cause);
337
339
  }
338
340
  const authoritativeBrand = house ? eTldPlusOne(house.domain) : brand;
339
- if (authoritativeBrand === operator && account === operator) return result("implicit", [brand, operator]);
341
+ const self = /* @__PURE__ */ new Set([brand, authoritativeBrand]);
342
+ if (self.has(account) && self.has(operator)) return result("implicit", [.../* @__PURE__ */ new Set([brand, account, operator])]);
340
343
  const grantClaim = house ? { ...claim, brand: { ...claim.brand, brand_id: house.brand_id } } : claim;
341
344
  const record = await options.evaluator.get(authoritativeBrand);
342
345
  if (record.status === "absent") {
343
346
  if (await options.legacyAuthorization?.(claim)) return result("legacy", [brand, account, operator]);
344
347
  throw new IdentityAuthorizationError("grant_absent");
345
348
  }
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]);
349
+ const firsts = [];
350
+ for (const grant of record.record.grants ?? []) {
351
+ const grantee = registrableGrantee(grant.grantee);
352
+ if (grantee === void 0 || !grantCovers(grant, grantClaim, now)) continue;
353
+ if (!self.has(account) && account !== grantee) continue;
354
+ if (grantee === operator) return result("trust", [brand, operator], [grant]);
355
+ firsts.push({ grant, grantee });
356
+ }
357
+ const grantees = [...new Set(firsts.map((f) => f.grantee))];
358
+ const records = /* @__PURE__ */ new Map();
359
+ for (let i = 0; i < grantees.length; i += INTERMEDIARY_FETCH_CONCURRENCY) {
360
+ const batch = grantees.slice(i, i + INTERMEDIARY_FETCH_CONCURRENCY);
361
+ const settled = await Promise.allSettled(batch.map((grantee) => options.evaluator.get(grantee)));
362
+ settled.forEach(
363
+ (outcome, j) => records.set(batch[j], outcome.status === "fulfilled" ? outcome.value : { failed: outcome.reason })
364
+ );
352
365
  }
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]);
366
+ let outage;
367
+ for (const { grant: first, grantee } of firsts) {
368
+ const intermediary = records.get(grantee);
369
+ if ("failed" in intermediary) {
370
+ outage ??= intermediary.failed;
371
+ continue;
358
372
  }
373
+ if (intermediary.status !== "present") continue;
374
+ const second = (intermediary.record.grants ?? []).find((g) => grantMatches(g, operator, grantClaim, now));
375
+ if (second) return result("trust", [brand, grantee, operator], [first, second]);
359
376
  }
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))
377
+ if (outage !== void 0) throw outage;
378
+ if (record.record.exclusive_grants !== true && await options.sellerAuthorization?.(claim))
366
379
  return result("seller", [brand, account, operator]);
367
380
  throw new IdentityAuthorizationError("grant_absent");
368
381
  }
@@ -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;