@adcp/sdk 14.0.0-beta.23 → 14.0.0-beta.25

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.
@@ -567,7 +567,7 @@ export interface paths {
567
567
  * Operator lookup
568
568
  * @description Given a domain, returns the agents this entity operates and which publishers trust them.
569
569
  *
570
- * **Response shape is auth-aware.** Anonymous callers see only `public` agents. Authenticated callers on an AAO membership tier with API access also see `members_only` agents. Profile owners (callers whose org owns the queried domain) additionally see `private` agents. This is the primary mechanism by which AAO membership unlocks deeper registry visibility.
570
+ * **Response shape is auth-aware.** Anonymous callers see only `public` agents. Authenticated callers on an AAO membership tier with API access also see `members_only` agents. Profile owners (callers whose org owns the queried domain) additionally see `private` agents. This is the primary mechanism by which AAO membership unlocks deeper registry visibility. `agent_visibility_summary` always reports public and members-only registration counts, independent of caller authorization and `scope`, so `agents: []` is not ambiguous with no discoverable registrations. Private registrations are excluded so their existence remains visible only to the profile owner.
571
571
  *
572
572
  * **`scope` bucket filter.** Callers can opt INTO a single visibility bucket (or the full union) regardless of what their auth would otherwise unlock — useful for picker UIs that want exactly one slice (e.g. anonymous-equivalent, members-only catalog, owner's private drafts). `scope` only narrows; it never escalates (e.g. `scope=member` on an explorer or anonymous caller silently returns public only).
573
573
  *
@@ -1750,6 +1750,26 @@ export interface paths {
1750
1750
  patch?: never;
1751
1751
  trace?: never;
1752
1752
  };
1753
+ "/api/registry/agents/{encodedUrl}/refreshes/{operationId}": {
1754
+ parameters: {
1755
+ query?: never;
1756
+ header?: never;
1757
+ path?: never;
1758
+ cookie?: never;
1759
+ };
1760
+ /**
1761
+ * Get agent refresh status
1762
+ * @description Returns the durable lifecycle and, after success, the same snapshot result as the synchronous refresh response. The selected owner organization or a current registry administrator may read the operation. Poll no more frequently than the Retry-After value.
1763
+ */
1764
+ get: operations["getAgentRefreshOperation"];
1765
+ put?: never;
1766
+ post?: never;
1767
+ delete?: never;
1768
+ options?: never;
1769
+ head?: never;
1770
+ patch?: never;
1771
+ trace?: never;
1772
+ };
1753
1773
  "/api/registry/agents/{encodedUrl}/auth-status": {
1754
1774
  parameters: {
1755
1775
  query?: never;
@@ -2673,6 +2693,12 @@ export interface components {
2673
2693
  /** @description True when the profile owner carries the Founding Member badge (joined before the founding-cohort cutoff). Surfaced when the profile owner has set their member card to public (`is_public=true`). Absent for private profiles. Founding Member is orthogonal to tier — founding orgs typically display both (e.g. Scope3 shows `Partner` + `Founding Member`). */
2674
2694
  is_founding_member?: boolean;
2675
2695
  } | null;
2696
+ agent_visibility_summary: {
2697
+ /** @description Number of registered public agents, regardless of the caller's scope filter. */
2698
+ public: number;
2699
+ /** @description Number of registered members-only agents, regardless of caller authorization or scope. Private registrations are excluded so their existence remains visible only to the profile owner. */
2700
+ members_only: number;
2701
+ };
2676
2702
  agents: {
2677
2703
  url: string;
2678
2704
  name: string;
@@ -6168,6 +6194,8 @@ export interface operations {
6168
6194
  /** @description Rate limit exceeded */
6169
6195
  429: {
6170
6196
  headers: {
6197
+ /** @description Seconds to wait before retrying */
6198
+ "Retry-After": string;
6171
6199
  [name: string]: unknown;
6172
6200
  };
6173
6201
  content: {
@@ -9647,7 +9675,10 @@ export interface operations {
9647
9675
  refreshAgent: {
9648
9676
  parameters: {
9649
9677
  query?: never;
9650
- header?: never;
9678
+ header?: {
9679
+ /** @description Return the durable refresh operation immediately instead of waiting up to 90 seconds for a legacy synchronous result. */
9680
+ Prefer?: "respond-async";
9681
+ };
9651
9682
  path: {
9652
9683
  /** @description URL-encoded agent URL */
9653
9684
  encodedUrl: string;
@@ -9663,7 +9694,7 @@ export interface operations {
9663
9694
  };
9664
9695
  };
9665
9696
  responses: {
9666
- /** @description Snapshot refreshed */
9697
+ /** @description Snapshot refreshed inside the bounded 90-second compatibility window */
9667
9698
  200: {
9668
9699
  headers: {
9669
9700
  [name: string]: unknown;
@@ -9680,6 +9711,16 @@ export interface operations {
9680
9711
  oauth_required: boolean;
9681
9712
  checked_at: string;
9682
9713
  error?: string;
9714
+ /**
9715
+ * Format: uuid
9716
+ * @description Present when this response recovered a recently completed operation.
9717
+ */
9718
+ refresh_operation_id?: string;
9719
+ /** @description Stable test-session identity, present on recovered responses. */
9720
+ test_session_id?: string;
9721
+ /** @description Durable operation URL, present on recovered responses. */
9722
+ status_url?: string;
9723
+ coalesced?: boolean;
9683
9724
  /** @description Compliance re-run summary. The capability/health portion of the response is independent of this block — a failed compliance run still returns the rest of the snapshot. */
9684
9725
  compliance: {
9685
9726
  /** @description True if the full storyboard suite ran and agent_storyboard_status was updated. False when ownership couldn't be resolved, the agent reported auth_required, or the compliance call itself failed. */
@@ -9706,12 +9747,40 @@ export interface operations {
9706
9747
  observations_count?: number;
9707
9748
  /** @description Number of run-summary notices emitted by this run. */
9708
9749
  notices_count?: number;
9750
+ /** @description True when the verifier resolved saved credentials for the compliance run. */
9751
+ auth_available: boolean;
9709
9752
  /** @description Reason compliance didn't run when `ran` is false. */
9710
9753
  error?: string;
9711
9754
  };
9712
9755
  };
9713
9756
  };
9714
9757
  };
9758
+ /** @description Refresh accepted and observable through the durable status resource */
9759
+ 202: {
9760
+ headers: {
9761
+ /** @description Relative URL of the durable refresh operation */
9762
+ Location: string;
9763
+ /** @description Recommended polling interval in seconds */
9764
+ "Retry-After": string;
9765
+ /** @description Present as respond-async when requested */
9766
+ "Preference-Applied"?: string;
9767
+ [name: string]: unknown;
9768
+ };
9769
+ content: {
9770
+ "application/json": {
9771
+ /** Format: uuid */
9772
+ refresh_operation_id: string;
9773
+ test_session_id: string;
9774
+ /** @enum {string} */
9775
+ status: "queued" | "running";
9776
+ /** @description True when the same credential context already had an active refresh. */
9777
+ coalesced: boolean;
9778
+ status_url: string;
9779
+ /** Format: date-time */
9780
+ requested_at: string;
9781
+ };
9782
+ };
9783
+ };
9715
9784
  /** @description Invalid agent URL */
9716
9785
  400: {
9717
9786
  headers: {
@@ -9739,7 +9808,7 @@ export interface operations {
9739
9808
  "application/json": components["schemas"]["Error"];
9740
9809
  };
9741
9810
  };
9742
- /** @description Monitoring paused for this agent */
9811
+ /** @description Monitoring paused, or another credential context is already refreshing this agent */
9743
9812
  409: {
9744
9813
  headers: {
9745
9814
  [name: string]: unknown;
@@ -9761,6 +9830,15 @@ export interface operations {
9761
9830
  };
9762
9831
  };
9763
9832
  };
9833
+ /** @description Refresh failed after durable execution */
9834
+ 500: {
9835
+ headers: {
9836
+ [name: string]: unknown;
9837
+ };
9838
+ content: {
9839
+ "application/json": components["schemas"]["Error"];
9840
+ };
9841
+ };
9764
9842
  /** @description Probe failed (timeout, DNS, OAuth wall, etc.) */
9765
9843
  502: {
9766
9844
  headers: {
@@ -9770,6 +9848,115 @@ export interface operations {
9770
9848
  "application/json": components["schemas"]["Error"];
9771
9849
  };
9772
9850
  };
9851
+ /** @description Durable refresh queue unavailable or at capacity */
9852
+ 503: {
9853
+ headers: {
9854
+ [name: string]: unknown;
9855
+ };
9856
+ content: {
9857
+ "application/json": components["schemas"]["Error"];
9858
+ };
9859
+ };
9860
+ };
9861
+ };
9862
+ getAgentRefreshOperation: {
9863
+ parameters: {
9864
+ query?: never;
9865
+ header?: never;
9866
+ path: {
9867
+ /** @description URL-encoded agent URL */
9868
+ encodedUrl: string;
9869
+ operationId: string;
9870
+ };
9871
+ cookie?: never;
9872
+ };
9873
+ requestBody?: never;
9874
+ responses: {
9875
+ /** @description Durable refresh lifecycle */
9876
+ 200: {
9877
+ headers: {
9878
+ /** @description Present while queued or running */
9879
+ "Retry-After"?: string;
9880
+ [name: string]: unknown;
9881
+ };
9882
+ content: {
9883
+ "application/json": {
9884
+ /** Format: uuid */
9885
+ refresh_operation_id: string;
9886
+ test_session_id: string;
9887
+ /** Format: uri */
9888
+ agent_url: string;
9889
+ /** @enum {string} */
9890
+ status: "queued" | "running" | "succeeded" | "failed";
9891
+ attempts: number;
9892
+ /** Format: date-time */
9893
+ requested_at: string;
9894
+ /** Format: date-time */
9895
+ started_at: string | null;
9896
+ /** Format: date-time */
9897
+ completed_at: string | null;
9898
+ result: {
9899
+ [key: string]: unknown;
9900
+ } | null;
9901
+ error: {
9902
+ code: string;
9903
+ message: string;
9904
+ } | null;
9905
+ };
9906
+ };
9907
+ };
9908
+ /** @description Invalid agent URL or operation ID */
9909
+ 400: {
9910
+ headers: {
9911
+ [name: string]: unknown;
9912
+ };
9913
+ content: {
9914
+ "application/json": components["schemas"]["Error"];
9915
+ };
9916
+ };
9917
+ /** @description Authentication required */
9918
+ 401: {
9919
+ headers: {
9920
+ [name: string]: unknown;
9921
+ };
9922
+ content: {
9923
+ "application/json": components["schemas"]["Error"];
9924
+ };
9925
+ };
9926
+ /** @description Operation not found or not authorized */
9927
+ 404: {
9928
+ headers: {
9929
+ [name: string]: unknown;
9930
+ };
9931
+ content: {
9932
+ "application/json": components["schemas"]["Error"];
9933
+ };
9934
+ };
9935
+ /** @description Refresh status polling rate limit exceeded */
9936
+ 429: {
9937
+ headers: {
9938
+ /** @description Seconds to wait before retrying */
9939
+ "Retry-After": string;
9940
+ [name: string]: unknown;
9941
+ };
9942
+ content: {
9943
+ "application/json": {
9944
+ error: string;
9945
+ message?: string;
9946
+ retry_after?: number;
9947
+ retryAfter?: number;
9948
+ };
9949
+ };
9950
+ };
9951
+ /** @description Refresh status temporarily unavailable */
9952
+ 503: {
9953
+ headers: {
9954
+ [name: string]: unknown;
9955
+ };
9956
+ content: {
9957
+ "application/json": components["schemas"]["Error"];
9958
+ };
9959
+ };
9773
9960
  };
9774
9961
  };
9775
9962
  getAgentAuthStatus: {
@@ -567,7 +567,7 @@ export interface paths {
567
567
  * Operator lookup
568
568
  * @description Given a domain, returns the agents this entity operates and which publishers trust them.
569
569
  *
570
- * **Response shape is auth-aware.** Anonymous callers see only `public` agents. Authenticated callers on an AAO membership tier with API access also see `members_only` agents. Profile owners (callers whose org owns the queried domain) additionally see `private` agents. This is the primary mechanism by which AAO membership unlocks deeper registry visibility.
570
+ * **Response shape is auth-aware.** Anonymous callers see only `public` agents. Authenticated callers on an AAO membership tier with API access also see `members_only` agents. Profile owners (callers whose org owns the queried domain) additionally see `private` agents. This is the primary mechanism by which AAO membership unlocks deeper registry visibility. `agent_visibility_summary` always reports public and members-only registration counts, independent of caller authorization and `scope`, so `agents: []` is not ambiguous with no discoverable registrations. Private registrations are excluded so their existence remains visible only to the profile owner.
571
571
  *
572
572
  * **`scope` bucket filter.** Callers can opt INTO a single visibility bucket (or the full union) regardless of what their auth would otherwise unlock — useful for picker UIs that want exactly one slice (e.g. anonymous-equivalent, members-only catalog, owner's private drafts). `scope` only narrows; it never escalates (e.g. `scope=member` on an explorer or anonymous caller silently returns public only).
573
573
  *
@@ -1750,6 +1750,26 @@ export interface paths {
1750
1750
  patch?: never;
1751
1751
  trace?: never;
1752
1752
  };
1753
+ "/api/registry/agents/{encodedUrl}/refreshes/{operationId}": {
1754
+ parameters: {
1755
+ query?: never;
1756
+ header?: never;
1757
+ path?: never;
1758
+ cookie?: never;
1759
+ };
1760
+ /**
1761
+ * Get agent refresh status
1762
+ * @description Returns the durable lifecycle and, after success, the same snapshot result as the synchronous refresh response. The selected owner organization or a current registry administrator may read the operation. Poll no more frequently than the Retry-After value.
1763
+ */
1764
+ get: operations["getAgentRefreshOperation"];
1765
+ put?: never;
1766
+ post?: never;
1767
+ delete?: never;
1768
+ options?: never;
1769
+ head?: never;
1770
+ patch?: never;
1771
+ trace?: never;
1772
+ };
1753
1773
  "/api/registry/agents/{encodedUrl}/auth-status": {
1754
1774
  parameters: {
1755
1775
  query?: never;
@@ -2673,6 +2693,12 @@ export interface components {
2673
2693
  /** @description True when the profile owner carries the Founding Member badge (joined before the founding-cohort cutoff). Surfaced when the profile owner has set their member card to public (`is_public=true`). Absent for private profiles. Founding Member is orthogonal to tier — founding orgs typically display both (e.g. Scope3 shows `Partner` + `Founding Member`). */
2674
2694
  is_founding_member?: boolean;
2675
2695
  } | null;
2696
+ agent_visibility_summary: {
2697
+ /** @description Number of registered public agents, regardless of the caller's scope filter. */
2698
+ public: number;
2699
+ /** @description Number of registered members-only agents, regardless of caller authorization or scope. Private registrations are excluded so their existence remains visible only to the profile owner. */
2700
+ members_only: number;
2701
+ };
2676
2702
  agents: {
2677
2703
  url: string;
2678
2704
  name: string;
@@ -6168,6 +6194,8 @@ export interface operations {
6168
6194
  /** @description Rate limit exceeded */
6169
6195
  429: {
6170
6196
  headers: {
6197
+ /** @description Seconds to wait before retrying */
6198
+ "Retry-After": string;
6171
6199
  [name: string]: unknown;
6172
6200
  };
6173
6201
  content: {
@@ -9647,7 +9675,10 @@ export interface operations {
9647
9675
  refreshAgent: {
9648
9676
  parameters: {
9649
9677
  query?: never;
9650
- header?: never;
9678
+ header?: {
9679
+ /** @description Return the durable refresh operation immediately instead of waiting up to 90 seconds for a legacy synchronous result. */
9680
+ Prefer?: "respond-async";
9681
+ };
9651
9682
  path: {
9652
9683
  /** @description URL-encoded agent URL */
9653
9684
  encodedUrl: string;
@@ -9663,7 +9694,7 @@ export interface operations {
9663
9694
  };
9664
9695
  };
9665
9696
  responses: {
9666
- /** @description Snapshot refreshed */
9697
+ /** @description Snapshot refreshed inside the bounded 90-second compatibility window */
9667
9698
  200: {
9668
9699
  headers: {
9669
9700
  [name: string]: unknown;
@@ -9680,6 +9711,16 @@ export interface operations {
9680
9711
  oauth_required: boolean;
9681
9712
  checked_at: string;
9682
9713
  error?: string;
9714
+ /**
9715
+ * Format: uuid
9716
+ * @description Present when this response recovered a recently completed operation.
9717
+ */
9718
+ refresh_operation_id?: string;
9719
+ /** @description Stable test-session identity, present on recovered responses. */
9720
+ test_session_id?: string;
9721
+ /** @description Durable operation URL, present on recovered responses. */
9722
+ status_url?: string;
9723
+ coalesced?: boolean;
9683
9724
  /** @description Compliance re-run summary. The capability/health portion of the response is independent of this block — a failed compliance run still returns the rest of the snapshot. */
9684
9725
  compliance: {
9685
9726
  /** @description True if the full storyboard suite ran and agent_storyboard_status was updated. False when ownership couldn't be resolved, the agent reported auth_required, or the compliance call itself failed. */
@@ -9706,12 +9747,40 @@ export interface operations {
9706
9747
  observations_count?: number;
9707
9748
  /** @description Number of run-summary notices emitted by this run. */
9708
9749
  notices_count?: number;
9750
+ /** @description True when the verifier resolved saved credentials for the compliance run. */
9751
+ auth_available: boolean;
9709
9752
  /** @description Reason compliance didn't run when `ran` is false. */
9710
9753
  error?: string;
9711
9754
  };
9712
9755
  };
9713
9756
  };
9714
9757
  };
9758
+ /** @description Refresh accepted and observable through the durable status resource */
9759
+ 202: {
9760
+ headers: {
9761
+ /** @description Relative URL of the durable refresh operation */
9762
+ Location: string;
9763
+ /** @description Recommended polling interval in seconds */
9764
+ "Retry-After": string;
9765
+ /** @description Present as respond-async when requested */
9766
+ "Preference-Applied"?: string;
9767
+ [name: string]: unknown;
9768
+ };
9769
+ content: {
9770
+ "application/json": {
9771
+ /** Format: uuid */
9772
+ refresh_operation_id: string;
9773
+ test_session_id: string;
9774
+ /** @enum {string} */
9775
+ status: "queued" | "running";
9776
+ /** @description True when the same credential context already had an active refresh. */
9777
+ coalesced: boolean;
9778
+ status_url: string;
9779
+ /** Format: date-time */
9780
+ requested_at: string;
9781
+ };
9782
+ };
9783
+ };
9715
9784
  /** @description Invalid agent URL */
9716
9785
  400: {
9717
9786
  headers: {
@@ -9739,7 +9808,7 @@ export interface operations {
9739
9808
  "application/json": components["schemas"]["Error"];
9740
9809
  };
9741
9810
  };
9742
- /** @description Monitoring paused for this agent */
9811
+ /** @description Monitoring paused, or another credential context is already refreshing this agent */
9743
9812
  409: {
9744
9813
  headers: {
9745
9814
  [name: string]: unknown;
@@ -9761,6 +9830,15 @@ export interface operations {
9761
9830
  };
9762
9831
  };
9763
9832
  };
9833
+ /** @description Refresh failed after durable execution */
9834
+ 500: {
9835
+ headers: {
9836
+ [name: string]: unknown;
9837
+ };
9838
+ content: {
9839
+ "application/json": components["schemas"]["Error"];
9840
+ };
9841
+ };
9764
9842
  /** @description Probe failed (timeout, DNS, OAuth wall, etc.) */
9765
9843
  502: {
9766
9844
  headers: {
@@ -9770,6 +9848,115 @@ export interface operations {
9770
9848
  "application/json": components["schemas"]["Error"];
9771
9849
  };
9772
9850
  };
9851
+ /** @description Durable refresh queue unavailable or at capacity */
9852
+ 503: {
9853
+ headers: {
9854
+ [name: string]: unknown;
9855
+ };
9856
+ content: {
9857
+ "application/json": components["schemas"]["Error"];
9858
+ };
9859
+ };
9860
+ };
9861
+ };
9862
+ getAgentRefreshOperation: {
9863
+ parameters: {
9864
+ query?: never;
9865
+ header?: never;
9866
+ path: {
9867
+ /** @description URL-encoded agent URL */
9868
+ encodedUrl: string;
9869
+ operationId: string;
9870
+ };
9871
+ cookie?: never;
9872
+ };
9873
+ requestBody?: never;
9874
+ responses: {
9875
+ /** @description Durable refresh lifecycle */
9876
+ 200: {
9877
+ headers: {
9878
+ /** @description Present while queued or running */
9879
+ "Retry-After"?: string;
9880
+ [name: string]: unknown;
9881
+ };
9882
+ content: {
9883
+ "application/json": {
9884
+ /** Format: uuid */
9885
+ refresh_operation_id: string;
9886
+ test_session_id: string;
9887
+ /** Format: uri */
9888
+ agent_url: string;
9889
+ /** @enum {string} */
9890
+ status: "queued" | "running" | "succeeded" | "failed";
9891
+ attempts: number;
9892
+ /** Format: date-time */
9893
+ requested_at: string;
9894
+ /** Format: date-time */
9895
+ started_at: string | null;
9896
+ /** Format: date-time */
9897
+ completed_at: string | null;
9898
+ result: {
9899
+ [key: string]: unknown;
9900
+ } | null;
9901
+ error: {
9902
+ code: string;
9903
+ message: string;
9904
+ } | null;
9905
+ };
9906
+ };
9907
+ };
9908
+ /** @description Invalid agent URL or operation ID */
9909
+ 400: {
9910
+ headers: {
9911
+ [name: string]: unknown;
9912
+ };
9913
+ content: {
9914
+ "application/json": components["schemas"]["Error"];
9915
+ };
9916
+ };
9917
+ /** @description Authentication required */
9918
+ 401: {
9919
+ headers: {
9920
+ [name: string]: unknown;
9921
+ };
9922
+ content: {
9923
+ "application/json": components["schemas"]["Error"];
9924
+ };
9925
+ };
9926
+ /** @description Operation not found or not authorized */
9927
+ 404: {
9928
+ headers: {
9929
+ [name: string]: unknown;
9930
+ };
9931
+ content: {
9932
+ "application/json": components["schemas"]["Error"];
9933
+ };
9934
+ };
9935
+ /** @description Refresh status polling rate limit exceeded */
9936
+ 429: {
9937
+ headers: {
9938
+ /** @description Seconds to wait before retrying */
9939
+ "Retry-After": string;
9940
+ [name: string]: unknown;
9941
+ };
9942
+ content: {
9943
+ "application/json": {
9944
+ error: string;
9945
+ message?: string;
9946
+ retry_after?: number;
9947
+ retryAfter?: number;
9948
+ };
9949
+ };
9950
+ };
9951
+ /** @description Refresh status temporarily unavailable */
9952
+ 503: {
9953
+ headers: {
9954
+ [name: string]: unknown;
9955
+ };
9956
+ content: {
9957
+ "application/json": components["schemas"]["Error"];
9958
+ };
9959
+ };
9773
9960
  };
9774
9961
  };
9775
9962
  getAgentAuthStatus: {
@@ -4,5 +4,5 @@
4
4
  "source_sha": "4e553ad955f83b49c7d221ab5c3ff78237ad02e3",
5
5
  "source_tarball_sha256": "580656d6466ef9f0d1119985e6726c2efea718dc671e2ad30957fcb2fd54af0f",
6
6
  "upstream_adcp_version": "2.5.3",
7
- "synced_at": "2026-08-30T13:02:45.461Z"
7
+ "synced_at": "2026-08-31T13:03:46.895Z"
8
8
  }
@@ -1953,6 +1953,14 @@ function createAdcpServer(config) {
1953
1953
  let warnedAboutOptionalReplayWithoutIdempotency = false;
1954
1954
  const applyResponseEnhancer = (response) => {
1955
1955
  responseEnhancer?.(response);
1956
+ const structuredContent = response.structuredContent;
1957
+ if (structuredContent !== void 0) {
1958
+ const serialized = JSON.stringify(structuredContent);
1959
+ const hasSerializedFallback = response.content.some((block) => block.type === "text" && block.text === serialized);
1960
+ if (!hasSerializedFallback) {
1961
+ response.content.push({ type: "text", text: serialized });
1962
+ }
1963
+ }
1956
1964
  return response;
1957
1965
  };
1958
1966
  const requestServedRelease = (params) => {
@@ -2023,6 +2023,14 @@ function createAdcpServer(config) {
2023
2023
  let warnedAboutOptionalReplayWithoutIdempotency = false;
2024
2024
  const applyResponseEnhancer = (response) => {
2025
2025
  responseEnhancer?.(response);
2026
+ const structuredContent = response.structuredContent;
2027
+ if (structuredContent !== void 0) {
2028
+ const serialized = JSON.stringify(structuredContent);
2029
+ const hasSerializedFallback = response.content.some((block) => block.type === "text" && block.text === serialized);
2030
+ if (!hasSerializedFallback) {
2031
+ response.content.push({ type: "text", text: serialized });
2032
+ }
2033
+ }
2026
2034
  return response;
2027
2035
  };
2028
2036
  const requestServedRelease = (params) => {
@@ -197,7 +197,7 @@ export interface UpstreamTrafficQueryResult {
197
197
  */
198
198
  export declare function runValidations(validations: StoryboardValidation[], context: ValidationContext): ValidationResult[];
199
199
  /** Capability semver emitted in run summaries and used for advisory expiry. */
200
- export declare const RUNNER_CAPABILITY_VERSION = "14.0.0-beta.23";
200
+ export declare const RUNNER_CAPABILITY_VERSION = "14.0.0-beta.25";
201
201
  /** True when a failed validation contributes to the owning step's grade. */
202
202
  export declare function validationFailsStep(result: ValidationResult): boolean;
203
203
  /**
@@ -197,7 +197,7 @@ export interface UpstreamTrafficQueryResult {
197
197
  */
198
198
  export declare function runValidations(validations: StoryboardValidation[], context: ValidationContext): ValidationResult[];
199
199
  /** Capability semver emitted in run summaries and used for advisory expiry. */
200
- export declare const RUNNER_CAPABILITY_VERSION = "14.0.0-beta.23";
200
+ export declare const RUNNER_CAPABILITY_VERSION = "14.0.0-beta.25";
201
201
  /** True when a failed validation contributes to the owning step's grade. */
202
202
  export declare function validationFailsStep(result: ValidationResult): boolean;
203
203
  /**
@@ -4043,12 +4043,12 @@ const PriceGuidanceSchema = import_zod.z.object({
4043
4043
  const VCPMPricingOptionSchema = import_zod.z.object({
4044
4044
  pricing_option_id: import_zod.z.string(),
4045
4045
  pricing_model: import_zod.z.literal("vcpm"),
4046
- currency: import_zod.z.string(),
4047
- fixed_price: import_zod.z.number().optional(),
4048
- floor_price: import_zod.z.number().optional(),
4046
+ currency: import_zod.z.string().regex(new RegExp("^[A-Z]{3}$")),
4047
+ fixed_price: import_zod.z.number().gte(0).optional(),
4048
+ floor_price: import_zod.z.number().gte(0).optional(),
4049
4049
  max_bid: import_zod.z.boolean().optional(),
4050
4050
  price_guidance: PriceGuidanceSchema.optional(),
4051
- min_spend_per_package: import_zod.z.number().optional(),
4051
+ min_spend_per_package: import_zod.z.number().gte(0).optional(),
4052
4052
  price_breakdown: PriceBreakdownSchema.optional(),
4053
4053
  eligible_adjustments: import_zod.z.array(PriceAdjustmentKindSchema).optional()
4054
4054
  }).passthrough();
@@ -4085,8 +4085,8 @@ const CPVPricingOptionSchema = import_zod.z.object({
4085
4085
  max_bid: import_zod.z.boolean().optional(),
4086
4086
  price_guidance: PriceGuidanceSchema.optional(),
4087
4087
  parameters: import_zod.z.object({
4088
- view_threshold: import_zod.z.union([import_zod.z.number(), import_zod.z.object({
4089
- duration_seconds: import_zod.z.number()
4088
+ view_threshold: import_zod.z.union([import_zod.z.number().gte(0).lte(1), import_zod.z.object({
4089
+ duration_seconds: import_zod.z.number().int().gte(1)
4090
4090
  }).passthrough()])
4091
4091
  }).passthrough(),
4092
4092
  min_spend_per_package: import_zod.z.number().gte(0).optional(),
@@ -4111,13 +4111,13 @@ const CPPPricingOptionSchema = import_zod.z.object({
4111
4111
  }).passthrough();
4112
4112
  const DoohParametersSchema = import_zod.z.object({
4113
4113
  type: import_zod.z.literal("dooh"),
4114
- sov_percentage: import_zod.z.number().optional(),
4115
- loop_duration_seconds: import_zod.z.number().optional(),
4116
- min_plays_per_hour: import_zod.z.number().optional(),
4114
+ sov_percentage: import_zod.z.number().gte(0).lte(100).optional(),
4115
+ loop_duration_seconds: import_zod.z.number().int().gte(1).optional(),
4116
+ min_plays_per_hour: import_zod.z.number().int().gte(1).optional(),
4117
4117
  venue_package: import_zod.z.string().optional(),
4118
- duration_hours: import_zod.z.number().optional(),
4118
+ duration_hours: import_zod.z.number().gte(0).optional(),
4119
4119
  daypart: import_zod.z.string().optional(),
4120
- estimated_impressions: import_zod.z.number().optional()
4120
+ estimated_impressions: import_zod.z.number().int().gte(0).optional()
4121
4121
  }).passthrough();
4122
4122
  const TimeBasedPricingOptionSchema = import_zod.z.object({
4123
4123
  pricing_option_id: import_zod.z.string(),
@@ -2761,12 +2761,12 @@ const PriceGuidanceSchema = z.object({
2761
2761
  const VCPMPricingOptionSchema = z.object({
2762
2762
  pricing_option_id: z.string(),
2763
2763
  pricing_model: z.literal("vcpm"),
2764
- currency: z.string(),
2765
- fixed_price: z.number().optional(),
2766
- floor_price: z.number().optional(),
2764
+ currency: z.string().regex(new RegExp("^[A-Z]{3}$")),
2765
+ fixed_price: z.number().gte(0).optional(),
2766
+ floor_price: z.number().gte(0).optional(),
2767
2767
  max_bid: z.boolean().optional(),
2768
2768
  price_guidance: PriceGuidanceSchema.optional(),
2769
- min_spend_per_package: z.number().optional(),
2769
+ min_spend_per_package: z.number().gte(0).optional(),
2770
2770
  price_breakdown: PriceBreakdownSchema.optional(),
2771
2771
  eligible_adjustments: z.array(PriceAdjustmentKindSchema).optional()
2772
2772
  }).passthrough();
@@ -2803,8 +2803,8 @@ const CPVPricingOptionSchema = z.object({
2803
2803
  max_bid: z.boolean().optional(),
2804
2804
  price_guidance: PriceGuidanceSchema.optional(),
2805
2805
  parameters: z.object({
2806
- view_threshold: z.union([z.number(), z.object({
2807
- duration_seconds: z.number()
2806
+ view_threshold: z.union([z.number().gte(0).lte(1), z.object({
2807
+ duration_seconds: z.number().int().gte(1)
2808
2808
  }).passthrough()])
2809
2809
  }).passthrough(),
2810
2810
  min_spend_per_package: z.number().gte(0).optional(),
@@ -2829,13 +2829,13 @@ const CPPPricingOptionSchema = z.object({
2829
2829
  }).passthrough();
2830
2830
  const DoohParametersSchema = z.object({
2831
2831
  type: z.literal("dooh"),
2832
- sov_percentage: z.number().optional(),
2833
- loop_duration_seconds: z.number().optional(),
2834
- min_plays_per_hour: z.number().optional(),
2832
+ sov_percentage: z.number().gte(0).lte(100).optional(),
2833
+ loop_duration_seconds: z.number().int().gte(1).optional(),
2834
+ min_plays_per_hour: z.number().int().gte(1).optional(),
2835
2835
  venue_package: z.string().optional(),
2836
- duration_hours: z.number().optional(),
2836
+ duration_hours: z.number().gte(0).optional(),
2837
2837
  daypart: z.string().optional(),
2838
- estimated_impressions: z.number().optional()
2838
+ estimated_impressions: z.number().int().gte(0).optional()
2839
2839
  }).passthrough();
2840
2840
  const TimeBasedPricingOptionSchema = z.object({
2841
2841
  pricing_option_id: z.string(),
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * AdCP SDK library version
3
3
  */
4
- export declare const LIBRARY_VERSION = "14.0.0-beta.23";
4
+ export declare const LIBRARY_VERSION = "14.0.0-beta.25";
5
5
  /**
6
6
  * AdCP specification version this library is built for
7
7
  */
@@ -33,10 +33,10 @@ export type AdcpVersion = (typeof COMPATIBLE_ADCP_VERSIONS)[number];
33
33
  * Full version information
34
34
  */
35
35
  export declare const VERSION_INFO: {
36
- readonly library: "14.0.0-beta.23";
36
+ readonly library: "14.0.0-beta.25";
37
37
  readonly adcp: "3.2.0-beta.9";
38
38
  readonly compatibleVersions: readonly ["v2.5", "v2.6", "v3", "3.0.0-beta.1", "3.0-beta.1", "3.0-beta", "3.0.0-beta.3", "3.0-beta.3", "3.0.0", "3.0", "3.0.1", "3.0.2", "3.0.3", "3.0.4", "3.0.5", "3.0.6", "3.0.7", "3.0.8", "3.0.9", "3.0.10", "3.0.11", "3.0.12", "3.0.13", "3.0.14", "3.0.15", "3.0.16", "3.0.17", "3.0.18", "3.0.19", "3.0.20", "3.0.21", "3.0.22", "3.0.23", "3.0.24", "3.0.25", "3.1.0", "3.1", "3.1.1", "3.1.2", "3.1.3", "3.1.4", "3.1.5", "3.1.6", "3.1.7", "3.1.8", "3.1.9", "3.1.10", "3.1.11", "3.1.12", "3.1.13", "3.1.14", "3.1.15", "3.1.16", "3.1.17", "3.1.18", "3.2.0-beta.9", "3.2-beta.9"];
39
- readonly generatedAt: "2026-08-30T12:48:08.618Z";
39
+ readonly generatedAt: "2026-08-31T12:49:37.711Z";
40
40
  };
41
41
  /**
42
42
  * Get the AdCP specification version this library is built for
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * AdCP SDK library version
3
3
  */
4
- export declare const LIBRARY_VERSION = "14.0.0-beta.23";
4
+ export declare const LIBRARY_VERSION = "14.0.0-beta.25";
5
5
  /**
6
6
  * AdCP specification version this library is built for
7
7
  */
@@ -33,10 +33,10 @@ export type AdcpVersion = (typeof COMPATIBLE_ADCP_VERSIONS)[number];
33
33
  * Full version information
34
34
  */
35
35
  export declare const VERSION_INFO: {
36
- readonly library: "14.0.0-beta.23";
36
+ readonly library: "14.0.0-beta.25";
37
37
  readonly adcp: "3.2.0-beta.9";
38
38
  readonly compatibleVersions: readonly ["v2.5", "v2.6", "v3", "3.0.0-beta.1", "3.0-beta.1", "3.0-beta", "3.0.0-beta.3", "3.0-beta.3", "3.0.0", "3.0", "3.0.1", "3.0.2", "3.0.3", "3.0.4", "3.0.5", "3.0.6", "3.0.7", "3.0.8", "3.0.9", "3.0.10", "3.0.11", "3.0.12", "3.0.13", "3.0.14", "3.0.15", "3.0.16", "3.0.17", "3.0.18", "3.0.19", "3.0.20", "3.0.21", "3.0.22", "3.0.23", "3.0.24", "3.0.25", "3.1.0", "3.1", "3.1.1", "3.1.2", "3.1.3", "3.1.4", "3.1.5", "3.1.6", "3.1.7", "3.1.8", "3.1.9", "3.1.10", "3.1.11", "3.1.12", "3.1.13", "3.1.14", "3.1.15", "3.1.16", "3.1.17", "3.1.18", "3.2.0-beta.9", "3.2-beta.9"];
39
- readonly generatedAt: "2026-08-30T12:48:08.618Z";
39
+ readonly generatedAt: "2026-08-31T12:49:37.711Z";
40
40
  };
41
41
  /**
42
42
  * Get the AdCP specification version this library is built for
@@ -31,7 +31,7 @@ __export(version_exports, {
31
31
  toReleasePrecisionVersion: () => toReleasePrecisionVersion
32
32
  });
33
33
  module.exports = __toCommonJS(version_exports);
34
- const LIBRARY_VERSION = "14.0.0-beta.23";
34
+ const LIBRARY_VERSION = "14.0.0-beta.25";
35
35
  const ADCP_VERSION = "3.2.0-beta.9";
36
36
  const ADCP_MAJOR_VERSION = 3;
37
37
  const COMPATIBLE_ADCP_VERSIONS = [
@@ -94,10 +94,10 @@ const COMPATIBLE_ADCP_VERSIONS = [
94
94
  "3.2-beta.9"
95
95
  ];
96
96
  const VERSION_INFO = {
97
- library: "14.0.0-beta.23",
97
+ library: "14.0.0-beta.25",
98
98
  adcp: "3.2.0-beta.9",
99
99
  compatibleVersions: COMPATIBLE_ADCP_VERSIONS,
100
- generatedAt: "2026-08-30T12:48:08.618Z"
100
+ generatedAt: "2026-08-31T12:49:37.711Z"
101
101
  };
102
102
  function getAdcpVersion() {
103
103
  return ADCP_VERSION;
@@ -1,4 +1,4 @@
1
- const LIBRARY_VERSION = "14.0.0-beta.23";
1
+ const LIBRARY_VERSION = "14.0.0-beta.25";
2
2
  const ADCP_VERSION = "3.2.0-beta.9";
3
3
  const ADCP_MAJOR_VERSION = 3;
4
4
  const COMPATIBLE_ADCP_VERSIONS = [
@@ -61,10 +61,10 @@ const COMPATIBLE_ADCP_VERSIONS = [
61
61
  "3.2-beta.9"
62
62
  ];
63
63
  const VERSION_INFO = {
64
- library: "14.0.0-beta.23",
64
+ library: "14.0.0-beta.25",
65
65
  adcp: "3.2.0-beta.9",
66
66
  compatibleVersions: COMPATIBLE_ADCP_VERSIONS,
67
- generatedAt: "2026-08-30T12:48:08.618Z"
67
+ generatedAt: "2026-08-31T12:49:37.711Z"
68
68
  };
69
69
  function getAdcpVersion() {
70
70
  return ADCP_VERSION;
package/docs/llms.txt CHANGED
@@ -1,7 +1,7 @@
1
1
  # Ad Context Protocol (AdCP)
2
2
 
3
- > Generated at: 2026-08-30
4
- > Library: @adcp/sdk v14.0.0-beta.23
3
+ > Generated at: 2026-08-31
4
+ > Library: @adcp/sdk v14.0.0-beta.25
5
5
  > AdCP major version: 3
6
6
  > Canonical URL: https://adcontextprotocol.github.io/adcp-client/llms.txt
7
7
  > Note: the `Library` stamp reflects the package.json version at doc-generation time. The narrative below describes the surface that lands on the next-published minor — including any 6.7 helpers documented here ahead of the release tag.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adcp/sdk",
3
- "version": "14.0.0-beta.23",
3
+ "version": "14.0.0-beta.25",
4
4
  "description": "AdCP SDK — client, server, and compliance harnesses for the AdContext Protocol (MCP + A2A)",
5
5
  "workspaces": [
6
6
  ".",