@adcp/sdk 13.0.2 → 13.0.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 (44) hide show
  1. package/bin/adcp.js +37 -2
  2. package/dist/lib/schemas-data/v2.5/_provenance.json +1 -1
  3. package/dist/lib/server/decisioning/capabilities.d.mts +5 -5
  4. package/dist/lib/server/decisioning/capabilities.d.ts +5 -5
  5. package/dist/lib/server/decisioning/capabilities.js.map +1 -1
  6. package/dist/lib/server/decisioning/capabilities.mjs.map +1 -1
  7. package/dist/lib/testing/client.d.ts.map +1 -1
  8. package/dist/lib/testing/client.js +6 -2
  9. package/dist/lib/testing/client.js.map +1 -1
  10. package/dist/lib/testing/client.mjs +6 -2
  11. package/dist/lib/testing/client.mjs.map +1 -1
  12. package/dist/lib/testing/storyboard/runner.d.ts.map +1 -1
  13. package/dist/lib/testing/storyboard/runner.js +18 -4
  14. package/dist/lib/testing/storyboard/runner.js.map +1 -1
  15. package/dist/lib/testing/storyboard/runner.mjs +18 -4
  16. package/dist/lib/testing/storyboard/runner.mjs.map +1 -1
  17. package/dist/lib/testing/storyboard/types.d.mts +83 -29
  18. package/dist/lib/testing/storyboard/types.d.ts +83 -29
  19. package/dist/lib/testing/storyboard/types.d.ts.map +1 -1
  20. package/dist/lib/testing/storyboard/types.js.map +1 -1
  21. package/dist/lib/testing/storyboard/types.mjs.map +1 -1
  22. package/dist/lib/testing/storyboard/validations.d.mts +3 -1
  23. package/dist/lib/testing/storyboard/validations.d.ts +3 -1
  24. package/dist/lib/testing/storyboard/validations.d.ts.map +1 -1
  25. package/dist/lib/testing/storyboard/validations.js +86 -23
  26. package/dist/lib/testing/storyboard/validations.js.map +1 -1
  27. package/dist/lib/testing/storyboard/validations.mjs +86 -24
  28. package/dist/lib/testing/storyboard/validations.mjs.map +1 -1
  29. package/dist/lib/testing/types.d.mts +11 -0
  30. package/dist/lib/testing/types.d.ts +11 -0
  31. package/dist/lib/testing/types.d.ts.map +1 -1
  32. package/dist/lib/testing/types.js.map +1 -1
  33. package/dist/lib/validation/schema-loader.d.ts.map +1 -1
  34. package/dist/lib/validation/schema-loader.js +9 -0
  35. package/dist/lib/validation/schema-loader.js.map +1 -1
  36. package/dist/lib/validation/schema-loader.mjs +8 -0
  37. package/dist/lib/validation/schema-loader.mjs.map +1 -1
  38. package/dist/lib/version.d.mts +3 -3
  39. package/dist/lib/version.d.ts +3 -3
  40. package/dist/lib/version.js +3 -3
  41. package/dist/lib/version.js.map +1 -1
  42. package/dist/lib/version.mjs +3 -3
  43. package/dist/lib/version.mjs.map +1 -1
  44. package/package.json +1 -1
@@ -23,6 +23,8 @@ export interface ValidationContext {
23
23
  adcpVersion?: string;
24
24
  /** Server-declared AdCP version to use for response-shape compatibility decisions. */
25
25
  responseAdcpVersion?: string;
26
+ /** Make a strict AJV response-schema rejection fail the validation. */
27
+ strictResponseSchemaValidation?: boolean;
26
28
  taskResult?: TaskResult;
27
29
  httpResult?: HttpProbeResult;
28
30
  agentUrl: string;
@@ -195,7 +197,7 @@ export interface UpstreamTrafficQueryResult {
195
197
  */
196
198
  export declare function runValidations(validations: StoryboardValidation[], context: ValidationContext): ValidationResult[];
197
199
  /** Capability semver emitted in run summaries and used for advisory expiry. */
198
- export declare const RUNNER_CAPABILITY_VERSION = "13.0.2";
200
+ export declare const RUNNER_CAPABILITY_VERSION = "13.0.3";
199
201
  /** True when a failed validation contributes to the owning step's grade. */
200
202
  export declare function validationFailsStep(result: ValidationResult): boolean;
201
203
  /**
@@ -23,6 +23,8 @@ export interface ValidationContext {
23
23
  adcpVersion?: string;
24
24
  /** Server-declared AdCP version to use for response-shape compatibility decisions. */
25
25
  responseAdcpVersion?: string;
26
+ /** Make a strict AJV response-schema rejection fail the validation. */
27
+ strictResponseSchemaValidation?: boolean;
26
28
  taskResult?: TaskResult;
27
29
  httpResult?: HttpProbeResult;
28
30
  agentUrl: string;
@@ -195,7 +197,7 @@ export interface UpstreamTrafficQueryResult {
195
197
  */
196
198
  export declare function runValidations(validations: StoryboardValidation[], context: ValidationContext): ValidationResult[];
197
199
  /** Capability semver emitted in run summaries and used for advisory expiry. */
198
- export declare const RUNNER_CAPABILITY_VERSION = "13.0.2";
200
+ export declare const RUNNER_CAPABILITY_VERSION = "13.0.3";
199
201
  /** True when a failed validation contributes to the owning step's grade. */
200
202
  export declare function validationFailsStep(result: ValidationResult): boolean;
201
203
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"validations.d.ts","sourceRoot":"","sources":["../../../../src/lib/testing/storyboard/validations.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"validations.d.ts","sourceRoot":"","sources":["../../../../src/lib/testing/storyboard/validations.ts"],"names":[],"mappings":"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"}
@@ -22,6 +22,7 @@ __export(validations_exports, {
22
22
  RUNNER_CAPABILITY_VERSION: () => RUNNER_CAPABILITY_VERSION,
23
23
  decorateValidationResult: () => decorateValidationResult,
24
24
  detectShapeDriftHint: () => detectShapeDriftHint,
25
+ isExternalResponseSchemaAuthoritative: () => isExternalResponseSchemaAuthoritative,
25
26
  resolvePath: () => import_path2.resolvePath,
26
27
  runValidations: () => runValidations,
27
28
  validationFailsStep: () => validationFailsStep
@@ -200,10 +201,10 @@ function resolveTarget(ctx) {
200
201
  return { success: false, data: void 0 };
201
202
  }
202
203
  const SCHEMA_URL_BASE = "https://adcontextprotocol.org";
203
- function resolveSchemaIdentity(schemaRef) {
204
+ function resolveSchemaIdentity(schemaRef, adcpVersion = import_version.ADCP_VERSION) {
204
205
  if (!schemaRef) return { schema_id: null, schema_url: null };
205
206
  const trimmed = schemaRef.replace(/^\/+/, "");
206
- const schemaId = `/schemas/${import_version.ADCP_VERSION}/${trimmed}`;
207
+ const schemaId = `/schemas/${adcpVersion}/${trimmed}`;
207
208
  const schemaUrl = `${SCHEMA_URL_BASE}${schemaId}`;
208
209
  return { schema_id: schemaId, schema_url: schemaUrl };
209
210
  }
@@ -256,34 +257,57 @@ function mapZodIssueToSchemaKeyword(issue) {
256
257
  }
257
258
  function validateResponseSchema(validation, ctx, taskResult) {
258
259
  const taskName = ctx.taskName;
259
- const { schema_id, schema_url } = resolveSchemaIdentity(ctx.responseSchemaRef);
260
- const schema = import_response_schemas.TOOL_RESPONSE_SCHEMAS[taskName];
261
- if (!schema) {
262
- return {
263
- check: "response_schema",
264
- passed: false,
265
- description: validation.description,
266
- error: `No schema registered for task "${taskName}"`,
267
- json_pointer: null,
268
- expected: schema_id ?? `response schema for ${taskName}`,
269
- // The runner failed before observing the agent — distinguish that from
270
- // "agent returned null" so implementors don't chase a phantom agent bug.
271
- actual: { reason: "no_schema_registered", task: taskName },
272
- schema_id,
273
- schema_url
274
- };
275
- }
260
+ const schemaIdentityVersion = ctx.adcpVersion ?? ctx.responseAdcpVersion ?? import_version.ADCP_VERSION;
261
+ const { schema_id, schema_url } = resolveSchemaIdentity(ctx.responseSchemaRef, schemaIdentityVersion);
276
262
  const rawData = taskResult.data ?? {};
277
263
  const dataWithoutMessage = Array.isArray(rawData) ? rawData : (() => {
278
264
  const { _message, ...rest } = rawData;
279
265
  return rest;
280
266
  })();
267
+ const schema = import_response_schemas.TOOL_RESPONSE_SCHEMAS[taskName];
281
268
  const dataForValidation = Array.isArray(dataWithoutMessage) ? dataWithoutMessage : (0, import_envelope_status_compat.injectLegacyEnvelopeStatus)(dataWithoutMessage, { toolName: taskName });
282
269
  const responseAdcpVersion = ctx.responseAdcpVersion ?? ctx.adcpVersion;
283
- const parseResult = schema.safeParse(
270
+ const parseResult = schema?.safeParse(
284
271
  (0, import_response_schemas.prepareResponseForSchemaValidation)(taskName, dataForValidation, responseAdcpVersion)
285
272
  );
286
- const strict = computeStrictVerdict(taskName, dataWithoutMessage, ctx.adcpVersion, ctx.responseAdcpVersion);
273
+ const computedStrict = computeStrictVerdict(taskName, dataWithoutMessage, ctx.adcpVersion, ctx.responseAdcpVersion);
274
+ const strict = computedStrict ? { ...computedStrict, lenient_valid: parseResult?.success ?? null } : void 0;
275
+ const externalSchemaIsAuthoritative = isExternalResponseSchemaAuthoritative(ctx);
276
+ if (externalSchemaIsAuthoritative) {
277
+ if (!strict) {
278
+ return noResponseSchemaResult(validation, taskName, schema_id, schema_url);
279
+ }
280
+ if (strict.valid) {
281
+ const base = {
282
+ check: "response_schema",
283
+ passed: true,
284
+ description: validation.description,
285
+ schema_id,
286
+ schema_url,
287
+ strict
288
+ };
289
+ const warning = buildStrictWarning(strict);
290
+ return warning ? { ...base, warning } : base;
291
+ }
292
+ const issues2 = strict.issues ?? [];
293
+ const firstIssue2 = issues2[0];
294
+ return {
295
+ check: "response_schema",
296
+ passed: false,
297
+ description: validation.description,
298
+ error: issues2.length > 0 ? issues2.slice(0, 5).map((issue) => `${issue.instance_path || "/"}: ${issue.message}`).join("; ") : `External JSON Schema rejected the ${taskName} response`,
299
+ json_pointer: firstIssue2?.instance_path || null,
300
+ expected: schema_id ?? `response schema for ${taskName}`,
301
+ actual: issues2,
302
+ schema_id,
303
+ schema_url,
304
+ strict
305
+ };
306
+ }
307
+ if (!schema) {
308
+ return noResponseSchemaResult(validation, taskName, schema_id, schema_url, strict);
309
+ }
310
+ if (!parseResult) return noResponseSchemaResult(validation, taskName, schema_id, schema_url, strict);
287
311
  if (parseResult.success) {
288
312
  const base = {
289
313
  check: "response_schema",
@@ -292,6 +316,19 @@ function validateResponseSchema(validation, ctx, taskResult) {
292
316
  schema_id,
293
317
  schema_url
294
318
  };
319
+ if (strict && !strict.valid && ctx.strictResponseSchemaValidation === true) {
320
+ const issues2 = strict.issues ?? [];
321
+ const firstIssue2 = issues2[0];
322
+ return {
323
+ ...base,
324
+ passed: false,
325
+ error: issues2.length > 0 ? issues2.slice(0, 5).map((issue) => `${issue.instance_path || "/"}: ${issue.message}`).join("; ") : `Strict JSON Schema rejected the ${taskName} response`,
326
+ json_pointer: firstIssue2?.instance_path || null,
327
+ expected: schema_id ?? `response schema for ${taskName}`,
328
+ actual: issues2,
329
+ strict
330
+ };
331
+ }
295
332
  const warning = strict ? buildStrictWarning(strict) : void 0;
296
333
  if (!strict && !warning) return base;
297
334
  if (!strict) return { ...base, warning };
@@ -314,9 +351,34 @@ function validateResponseSchema(validation, ctx, taskResult) {
314
351
  };
315
352
  return strict ? { ...failed, strict } : failed;
316
353
  }
354
+ function isExternalResponseSchemaAuthoritative(ctx) {
355
+ const validationVersion = responseSchemaValidationVersion(ctx.adcpVersion, ctx.responseAdcpVersion);
356
+ return validationVersion !== void 0 && (0, import_schema_loader.isExternalSchemaRootActive)(validationVersion);
357
+ }
358
+ function responseSchemaValidationVersion(adcpVersion, responseAdcpVersion) {
359
+ if (adcpVersion && (0, import_schema_loader.isExternalSchemaRootActive)(adcpVersion)) return adcpVersion;
360
+ return responseAdcpVersion && (0, import_schema_loader.hasSchemaBundle)(responseAdcpVersion) ? responseAdcpVersion : adcpVersion;
361
+ }
362
+ function noResponseSchemaResult(validation, taskName, schema_id, schema_url, strict) {
363
+ const result = {
364
+ check: "response_schema",
365
+ passed: false,
366
+ description: validation.description,
367
+ error: `No schema registered for task "${taskName}"`,
368
+ json_pointer: null,
369
+ expected: schema_id ?? `response schema for ${taskName}`,
370
+ // The runner failed before observing the agent — distinguish that from
371
+ // "agent returned null" so implementors don't chase a phantom agent bug.
372
+ actual: { reason: "no_schema_registered", task: taskName },
373
+ schema_id,
374
+ schema_url
375
+ };
376
+ return strict ? { ...result, strict } : result;
377
+ }
317
378
  function computeStrictVerdict(taskName, payload, adcpVersion, responseAdcpVersion) {
318
- const validationVersion = responseAdcpVersion && (0, import_schema_loader.hasSchemaBundle)(responseAdcpVersion) ? responseAdcpVersion : adcpVersion;
319
- if (responseAdcpVersion && (0, import_adcp_version_config.isPre31AdcpVersion)(responseAdcpVersion) && !(0, import_schema_loader.hasSchemaBundle)(responseAdcpVersion)) {
379
+ const externalVersionSelected = adcpVersion !== void 0 && (0, import_schema_loader.isExternalSchemaRootActive)(adcpVersion);
380
+ const validationVersion = responseSchemaValidationVersion(adcpVersion, responseAdcpVersion);
381
+ if (!externalVersionSelected && responseAdcpVersion && (0, import_adcp_version_config.isPre31AdcpVersion)(responseAdcpVersion) && !(0, import_schema_loader.hasSchemaBundle)(responseAdcpVersion)) {
320
382
  return void 0;
321
383
  }
322
384
  const payloadForValidation = (0, import_response_schemas.prepareResponseForSchemaValidation)(taskName, payload, responseAdcpVersion);
@@ -2562,6 +2624,7 @@ function validateCrossResponseCountDistinct(validation, ctx) {
2562
2624
  RUNNER_CAPABILITY_VERSION,
2563
2625
  decorateValidationResult,
2564
2626
  detectShapeDriftHint,
2627
+ isExternalResponseSchemaAuthoritative,
2565
2628
  resolvePath,
2566
2629
  runValidations,
2567
2630
  validationFailsStep