@adcp/sdk 7.1.0 → 7.3.0

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 (85) hide show
  1. package/bin/adcp-config.js +10 -1
  2. package/bin/adcp.js +376 -22
  3. package/dist/lib/auth/oauth/authorization-required.d.ts +17 -0
  4. package/dist/lib/auth/oauth/authorization-required.d.ts.map +1 -1
  5. package/dist/lib/auth/oauth/authorization-required.js +20 -0
  6. package/dist/lib/auth/oauth/authorization-required.js.map +1 -1
  7. package/dist/lib/auth/oauth/index.d.ts +1 -1
  8. package/dist/lib/auth/oauth/index.d.ts.map +1 -1
  9. package/dist/lib/auth/oauth/index.js +2 -1
  10. package/dist/lib/auth/oauth/index.js.map +1 -1
  11. package/dist/lib/core/AgentClient.d.ts.map +1 -1
  12. package/dist/lib/core/SingleAgentClient.d.ts.map +1 -1
  13. package/dist/lib/core/SingleAgentClient.js +13 -2
  14. package/dist/lib/core/SingleAgentClient.js.map +1 -1
  15. package/dist/lib/discovery/property-crawler.d.ts +13 -1
  16. package/dist/lib/discovery/property-crawler.d.ts.map +1 -1
  17. package/dist/lib/discovery/property-crawler.js +40 -14
  18. package/dist/lib/discovery/property-crawler.js.map +1 -1
  19. package/dist/lib/discovery/resolve-agent-properties.d.ts +103 -0
  20. package/dist/lib/discovery/resolve-agent-properties.d.ts.map +1 -0
  21. package/dist/lib/discovery/resolve-agent-properties.js +182 -0
  22. package/dist/lib/discovery/resolve-agent-properties.js.map +1 -0
  23. package/dist/lib/discovery/types.d.ts +41 -2
  24. package/dist/lib/discovery/types.d.ts.map +1 -1
  25. package/dist/lib/discovery/types.js +2 -1
  26. package/dist/lib/discovery/types.js.map +1 -1
  27. package/dist/lib/discovery/validate-adagents.d.ts +114 -0
  28. package/dist/lib/discovery/validate-adagents.d.ts.map +1 -0
  29. package/dist/lib/discovery/validate-adagents.js +417 -0
  30. package/dist/lib/discovery/validate-adagents.js.map +1 -0
  31. package/dist/lib/errors/index.d.ts +42 -5
  32. package/dist/lib/errors/index.d.ts.map +1 -1
  33. package/dist/lib/errors/index.js +64 -9
  34. package/dist/lib/errors/index.js.map +1 -1
  35. package/dist/lib/index.d.ts +3 -1
  36. package/dist/lib/index.d.ts.map +1 -1
  37. package/dist/lib/index.js +17 -10
  38. package/dist/lib/index.js.map +1 -1
  39. package/dist/lib/protocols/a2a.d.ts.map +1 -1
  40. package/dist/lib/protocols/a2a.js +70 -11
  41. package/dist/lib/protocols/a2a.js.map +1 -1
  42. package/dist/lib/protocols/mcp.d.ts.map +1 -1
  43. package/dist/lib/protocols/mcp.js +61 -5
  44. package/dist/lib/protocols/mcp.js.map +1 -1
  45. package/dist/lib/schemas-data/v2.5/_provenance.json +1 -1
  46. package/dist/lib/server/idempotency/store.d.ts +6 -5
  47. package/dist/lib/server/idempotency/store.d.ts.map +1 -1
  48. package/dist/lib/server/idempotency/store.js +11 -14
  49. package/dist/lib/server/idempotency/store.js.map +1 -1
  50. package/dist/lib/signing/fetch-async.d.ts.map +1 -1
  51. package/dist/lib/signing/fetch-async.js +5 -0
  52. package/dist/lib/signing/fetch-async.js.map +1 -1
  53. package/dist/lib/signing/fetch.d.ts.map +1 -1
  54. package/dist/lib/signing/fetch.js +11 -0
  55. package/dist/lib/signing/fetch.js.map +1 -1
  56. package/dist/lib/testing/client.d.ts +8 -0
  57. package/dist/lib/testing/client.d.ts.map +1 -1
  58. package/dist/lib/testing/client.js +73 -2
  59. package/dist/lib/testing/client.js.map +1 -1
  60. package/dist/lib/testing/compliance/comply.d.ts +27 -3
  61. package/dist/lib/testing/compliance/comply.d.ts.map +1 -1
  62. package/dist/lib/testing/compliance/comply.js +21 -31
  63. package/dist/lib/testing/compliance/comply.js.map +1 -1
  64. package/dist/lib/testing/compliance/index.d.ts +1 -1
  65. package/dist/lib/testing/compliance/index.d.ts.map +1 -1
  66. package/dist/lib/testing/compliance/index.js +2 -1
  67. package/dist/lib/testing/compliance/index.js.map +1 -1
  68. package/dist/lib/testing/scenarios/error-compliance.d.ts.map +1 -1
  69. package/dist/lib/testing/scenarios/error-compliance.js +11 -1
  70. package/dist/lib/testing/scenarios/error-compliance.js.map +1 -1
  71. package/dist/lib/testing/storyboard/parallel-dispatch.d.ts.map +1 -1
  72. package/dist/lib/testing/storyboard/parallel-dispatch.js +6 -4
  73. package/dist/lib/testing/storyboard/parallel-dispatch.js.map +1 -1
  74. package/dist/lib/testing/storyboard/validations.d.ts.map +1 -1
  75. package/dist/lib/testing/storyboard/validations.js +18 -7
  76. package/dist/lib/testing/storyboard/validations.js.map +1 -1
  77. package/dist/lib/types/index.d.ts +2 -0
  78. package/dist/lib/types/index.d.ts.map +1 -1
  79. package/dist/lib/types/index.js +4 -0
  80. package/dist/lib/types/index.js.map +1 -1
  81. package/dist/lib/version.d.ts +3 -3
  82. package/dist/lib/version.js +3 -3
  83. package/docs/llms.txt +10 -2
  84. package/package.json +2 -1
  85. package/skills/call-adcp-agent/SKILL.md +1 -1
@@ -0,0 +1,114 @@
1
+ /**
2
+ * `adagents.json` discovery + validation with the ads.txt `MANAGERDOMAIN`
3
+ * one-hop fallback (adcp#4175 / adcontextprotocol/adcp PR #4173, adcp-client#1717).
4
+ *
5
+ * Discovery order:
6
+ * 1. `https://{publisher}/.well-known/adagents.json` (direct)
7
+ * - if the file carries `authoritative_location`, follow one redirect
8
+ * and report `discovery_method = 'authoritative_location'`
9
+ * 2. On HTTP 404 only — fetch `https://{publisher}/ads.txt`, parse the
10
+ * `MANAGERDOMAIN=` directive, and attempt
11
+ * `https://{managerdomain}/.well-known/adagents.json`.
12
+ * Reports `discovery_method = 'ads_txt_managerdomain'` and
13
+ * `manager_domain`.
14
+ *
15
+ * Per the #4173 resolution of the RFC's open questions:
16
+ * - Only the IAB directive form `MANAGERDOMAIN=example.com` counts;
17
+ * the comment form `# managerdomain=example.com` is rejected.
18
+ * - Duplicate `MANAGERDOMAIN` lines: last-wins (rather than the RFC's
19
+ * fail-closed default — IAB-aligned).
20
+ *
21
+ * Other safety rules from the RFC carry through:
22
+ * - Fallback fires only on 404 (not 5xx / timeout / invalid JSON).
23
+ * - Exactly one hop. The manager-domain file is fetched once, never
24
+ * recursed into.
25
+ * - `publisher → publisher` cycle is rejected.
26
+ * - `#noagents` trailing comment on a `MANAGERDOMAIN` line excludes
27
+ * that entry from fallback discovery.
28
+ * - Manager-domain failure is terminal — never a silent pass.
29
+ */
30
+ import { type LogLevel } from '../utils/logger';
31
+ import type { AdAgentsJson } from './types';
32
+ /** How the validator located the authoritative `adagents.json` for a publisher. */
33
+ export type DiscoveryMethod = 'direct' | 'authoritative_location' | 'ads_txt_managerdomain';
34
+ export interface AdAgentsValidationResult {
35
+ /** Whether a valid `adagents.json` was discovered for this publisher. */
36
+ valid: boolean;
37
+ /** The publisher domain the caller asked us to validate. */
38
+ publisher_domain: string;
39
+ /**
40
+ * Which discovery path was used. Defaults to `'direct'`: a failure on
41
+ * the publisher's own `.well-known/adagents.json` reports `'direct'`
42
+ * even when no file was retrieved. `'authoritative_location'` and
43
+ * `'ads_txt_managerdomain'` only appear once the validator has
44
+ * committed to that path (followed the pointer / parsed a directive).
45
+ */
46
+ discovery_method: DiscoveryMethod;
47
+ /**
48
+ * The manager domain consulted when `discovery_method ===
49
+ * 'ads_txt_managerdomain'`. Populated even on manager-domain failure
50
+ * so callers can surface "we tried <manager>" in error reports.
51
+ *
52
+ * Note for chained validators: re-invoking `validateAdAgents` against
53
+ * `manager_domain` to walk N hops re-enters the discovery flow from
54
+ * scratch. This validator's one-hop guarantee is per-call, not
55
+ * per-chain — callers stringing multiple invocations together are
56
+ * responsible for their own loop guard.
57
+ */
58
+ manager_domain?: string;
59
+ /** URL the `adagents.json` was ultimately loaded from. Omitted when nothing loaded. */
60
+ resolved_url?: string;
61
+ /**
62
+ * Parsed authoritative file. Omitted on failure.
63
+ *
64
+ * **Counterparty-controlled.** This JSON came verbatim from the
65
+ * publisher (or their declared manager domain). Treat as untrusted
66
+ * input: do NOT splice into LLM system prompts, log-aggregator
67
+ * indices, or any context that interprets text as instructions
68
+ * without first stripping or sanitizing. Field names like
69
+ * `authorized_for` (free-text) and `properties[].name` are obvious
70
+ * vectors; less-obvious ones include arbitrary `$schema` URLs and
71
+ * structured `tags`.
72
+ */
73
+ adagents?: AdAgentsJson;
74
+ /** One or more reasons validation failed. Empty when `valid === true`. */
75
+ errors: string[];
76
+ }
77
+ export interface ValidateAdAgentsOptions {
78
+ /** Per-request timeout in ms (default 10_000). */
79
+ timeoutMs?: number;
80
+ /** Optional User-Agent suffix (validated via `validateUserAgent`). */
81
+ userAgent?: string;
82
+ /** Logger level (default `'warn'`). */
83
+ logLevel?: LogLevel;
84
+ /**
85
+ * Build the URL for a `domain` + well-known `path` pair. Defaults to
86
+ * `https://{domain}{path}`. Provide a custom builder to point the
87
+ * validator at a loopback test server (`http://...`), an internal
88
+ * mirror, or a CDN-rewriting host.
89
+ */
90
+ urlForDomain?: (domain: string, path: string) => string;
91
+ }
92
+ /**
93
+ * Validate `adagents.json` for a publisher domain. Implements the
94
+ * ads.txt `MANAGERDOMAIN` one-hop fallback specified in adcp#4175.
95
+ */
96
+ export declare function validateAdAgents(publisherDomain: string, options?: ValidateAdAgentsOptions): Promise<AdAgentsValidationResult>;
97
+ /**
98
+ * Parse a MANAGERDOMAIN directive out of an ads.txt body. Returns the
99
+ * lowercased host token (last-wins on duplicates) or `undefined` when
100
+ * no eligible directive is present.
101
+ *
102
+ * Eligibility rules (per adcp-client#1717 / adcp#4175 + #4173 resolution):
103
+ * - Directive form `MANAGERDOMAIN=<host>` only. Case-insensitive on
104
+ * the key; the value preserves no case. Comment-only lines like
105
+ * `# managerdomain=...` are rejected.
106
+ * - Value must be a host token (no scheme, no path, no whitespace).
107
+ * - Trailing inline comment containing `noagents` (case-insensitive)
108
+ * opts that entry out of fallback discovery.
109
+ * - Duplicate eligible entries: the last one wins.
110
+ *
111
+ * Exported for direct unit testing.
112
+ */
113
+ export declare function parseManagerDomain(adsTxt: string): string | undefined;
114
+ //# sourceMappingURL=validate-adagents.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-adagents.d.ts","sourceRoot":"","sources":["../../../src/lib/discovery/validate-adagents.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,OAAO,EAAgB,KAAK,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAK9D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE5C,mFAAmF;AACnF,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,wBAAwB,GAAG,uBAAuB,CAAC;AAE5F,MAAM,WAAW,wBAAwB;IACvC,yEAAyE;IACzE,KAAK,EAAE,OAAO,CAAC;IACf,4DAA4D;IAC5D,gBAAgB,EAAE,MAAM,CAAC;IACzB;;;;;;OAMG;IACH,gBAAgB,EAAE,eAAe,CAAC;IAClC;;;;;;;;;;OAUG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,uFAAuF;IACvF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,0EAA0E;IAC1E,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,uBAAuB;IACtC,kDAAkD;IAClD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sEAAsE;IACtE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uCAAuC;IACvC,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB;;;;;OAKG;IACH,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CACzD;AAYD;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,eAAe,EAAE,MAAM,EACvB,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,wBAAwB,CAAC,CA4MnC;AAaD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CA8BrE"}
@@ -0,0 +1,417 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateAdAgents = validateAdAgents;
4
+ exports.parseManagerDomain = parseManagerDomain;
5
+ /**
6
+ * `adagents.json` discovery + validation with the ads.txt `MANAGERDOMAIN`
7
+ * one-hop fallback (adcp#4175 / adcontextprotocol/adcp PR #4173, adcp-client#1717).
8
+ *
9
+ * Discovery order:
10
+ * 1. `https://{publisher}/.well-known/adagents.json` (direct)
11
+ * - if the file carries `authoritative_location`, follow one redirect
12
+ * and report `discovery_method = 'authoritative_location'`
13
+ * 2. On HTTP 404 only — fetch `https://{publisher}/ads.txt`, parse the
14
+ * `MANAGERDOMAIN=` directive, and attempt
15
+ * `https://{managerdomain}/.well-known/adagents.json`.
16
+ * Reports `discovery_method = 'ads_txt_managerdomain'` and
17
+ * `manager_domain`.
18
+ *
19
+ * Per the #4173 resolution of the RFC's open questions:
20
+ * - Only the IAB directive form `MANAGERDOMAIN=example.com` counts;
21
+ * the comment form `# managerdomain=example.com` is rejected.
22
+ * - Duplicate `MANAGERDOMAIN` lines: last-wins (rather than the RFC's
23
+ * fail-closed default — IAB-aligned).
24
+ *
25
+ * Other safety rules from the RFC carry through:
26
+ * - Fallback fires only on 404 (not 5xx / timeout / invalid JSON).
27
+ * - Exactly one hop. The manager-domain file is fetched once, never
28
+ * recursed into.
29
+ * - `publisher → publisher` cycle is rejected.
30
+ * - `#noagents` trailing comment on a `MANAGERDOMAIN` line excludes
31
+ * that entry from fallback discovery.
32
+ * - Manager-domain failure is terminal — never a silent pass.
33
+ */
34
+ const logger_1 = require("../utils/logger");
35
+ const version_1 = require("../version");
36
+ const validate_user_agent_1 = require("../utils/validate-user-agent");
37
+ const ssrf_fetch_1 = require("../net/ssrf-fetch");
38
+ const probe_policy_1 = require("../utils/probe-policy");
39
+ const DEFAULT_TIMEOUT_MS = 10_000;
40
+ const MAX_ADAGENTS_BYTES = 256 * 1024;
41
+ const MAX_ADS_TXT_BYTES = 256 * 1024;
42
+ const FETCH_HEADERS = {
43
+ Accept: 'application/json, text/plain, */*',
44
+ 'Accept-Language': 'en-US,en;q=0.9',
45
+ 'Accept-Encoding': 'gzip, deflate, br',
46
+ };
47
+ /**
48
+ * Validate `adagents.json` for a publisher domain. Implements the
49
+ * ads.txt `MANAGERDOMAIN` one-hop fallback specified in adcp#4175.
50
+ */
51
+ async function validateAdAgents(publisherDomain, options = {}) {
52
+ if (!publisherDomain || typeof publisherDomain !== 'string') {
53
+ throw new Error('publisherDomain must be a non-empty string');
54
+ }
55
+ if (options.userAgent) {
56
+ (0, validate_user_agent_1.validateUserAgent)(options.userAgent);
57
+ }
58
+ const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
59
+ const logger = (0, logger_1.createLogger)({ level: options.logLevel ?? 'warn' }).child('validateAdAgents');
60
+ const userAgentHeader = `adcp-validate-adagents/${version_1.LIBRARY_VERSION} (+https://adcontextprotocol.org)`;
61
+ const fromHeader = options.userAgent
62
+ ? `adcp-validate-adagents@adcontextprotocol.org (${options.userAgent}; v${version_1.LIBRARY_VERSION})`
63
+ : `adcp-validate-adagents@adcontextprotocol.org (v${version_1.LIBRARY_VERSION})`;
64
+ const publisher = publisherDomain.toLowerCase();
65
+ const buildUrl = options.urlForDomain ?? ((domain, path) => `https://${domain}${path}`);
66
+ const publisherUrl = buildUrl(publisher, '/.well-known/adagents.json');
67
+ // Step 1: try the publisher's canonical location.
68
+ const direct = await fetchJsonOrStatus(publisherUrl, {
69
+ timeoutMs,
70
+ maxBodyBytes: MAX_ADAGENTS_BYTES,
71
+ userAgentHeader,
72
+ fromHeader,
73
+ });
74
+ if (direct.kind === 'ok') {
75
+ const data = coerceAdAgentsObject(direct.data);
76
+ if (!data) {
77
+ return {
78
+ valid: false,
79
+ publisher_domain: publisher,
80
+ discovery_method: 'direct',
81
+ resolved_url: publisherUrl,
82
+ errors: ['adagents.json fetch failed: invalid JSON: response is not a JSON object'],
83
+ };
84
+ }
85
+ // Handle `authoritative_location` indirection: a pointer file with no
86
+ // inline `authorized_agents` should be followed exactly once.
87
+ if (data.authoritative_location && !data.authorized_agents) {
88
+ const target = data.authoritative_location;
89
+ // Production: HTTPS-only. Loopback test runs (gated by
90
+ // ADCP_ALLOW_INTERNAL_PROBES=1) may use `http://` against a
91
+ // 127.0.0.1 server — the same opt-in that lets `ssrfSafeFetch`
92
+ // touch loopback in the first place.
93
+ const allowHttp = (0, probe_policy_1.isInternalProbesAllowed)();
94
+ if (!target.startsWith('https://') && !(allowHttp && target.startsWith('http://'))) {
95
+ return {
96
+ valid: false,
97
+ publisher_domain: publisher,
98
+ discovery_method: 'authoritative_location',
99
+ resolved_url: publisherUrl,
100
+ errors: [`authoritative_location must use https://, got: ${target}`],
101
+ };
102
+ }
103
+ // Normalize before cycle-comparing — string equality misses
104
+ // trivial bounce variants (trailing slash, `?query`, fragment,
105
+ // uppercase scheme). Worst case of missing one of these is a
106
+ // wasted RTT against the publisher's own server, not SSRF
107
+ // (still routed through `ssrfSafeFetch`), but the right check
108
+ // is on origin+pathname.
109
+ if (sameOriginAndPath(target, publisherUrl)) {
110
+ return {
111
+ valid: false,
112
+ publisher_domain: publisher,
113
+ discovery_method: 'authoritative_location',
114
+ resolved_url: publisherUrl,
115
+ errors: ['authoritative_location points back to the publisher (cycle)'],
116
+ };
117
+ }
118
+ const followed = await fetchJsonOrStatus(target, {
119
+ timeoutMs,
120
+ maxBodyBytes: MAX_ADAGENTS_BYTES,
121
+ userAgentHeader,
122
+ fromHeader,
123
+ });
124
+ if (followed.kind !== 'ok') {
125
+ return {
126
+ valid: false,
127
+ publisher_domain: publisher,
128
+ discovery_method: 'authoritative_location',
129
+ resolved_url: target,
130
+ errors: [`authoritative_location fetch failed: ${describeOutcome(followed)}`],
131
+ };
132
+ }
133
+ const followedAdAgents = coerceAdAgentsObject(followed.data);
134
+ if (!followedAdAgents) {
135
+ return {
136
+ valid: false,
137
+ publisher_domain: publisher,
138
+ discovery_method: 'authoritative_location',
139
+ resolved_url: target,
140
+ errors: ['authoritative_location target returned a non-object JSON value'],
141
+ };
142
+ }
143
+ return {
144
+ valid: true,
145
+ publisher_domain: publisher,
146
+ discovery_method: 'authoritative_location',
147
+ resolved_url: target,
148
+ adagents: followedAdAgents,
149
+ errors: [],
150
+ };
151
+ }
152
+ return {
153
+ valid: true,
154
+ publisher_domain: publisher,
155
+ discovery_method: 'direct',
156
+ resolved_url: publisherUrl,
157
+ adagents: data,
158
+ errors: [],
159
+ };
160
+ }
161
+ // Step 2: managerdomain fallback only fires on 404. Other failures
162
+ // (5xx, timeout, malformed JSON, SSRF refusal) are terminal under the
163
+ // RFC's "Only trigger fallback on 404" rule.
164
+ if (direct.kind !== 'not_found') {
165
+ return {
166
+ valid: false,
167
+ publisher_domain: publisher,
168
+ discovery_method: 'direct',
169
+ errors: [`adagents.json fetch failed: ${describeOutcome(direct)}`],
170
+ };
171
+ }
172
+ // Step 3: fetch ads.txt and look for a MANAGERDOMAIN= directive.
173
+ const adsTxtUrl = buildUrl(publisher, '/ads.txt');
174
+ const adsTxt = await fetchTextOrStatus(adsTxtUrl, {
175
+ timeoutMs,
176
+ maxBodyBytes: MAX_ADS_TXT_BYTES,
177
+ userAgentHeader,
178
+ fromHeader,
179
+ });
180
+ if (adsTxt.kind !== 'ok') {
181
+ return {
182
+ valid: false,
183
+ publisher_domain: publisher,
184
+ discovery_method: 'direct',
185
+ errors: [`adagents.json missing (404) and ads.txt unavailable: ${describeOutcome(adsTxt)}`],
186
+ };
187
+ }
188
+ const managerDomain = parseManagerDomain(adsTxt.text);
189
+ if (!managerDomain) {
190
+ return {
191
+ valid: false,
192
+ publisher_domain: publisher,
193
+ discovery_method: 'direct',
194
+ errors: ['adagents.json missing (404) and no eligible MANAGERDOMAIN directive in ads.txt'],
195
+ };
196
+ }
197
+ if (managerDomain === publisher) {
198
+ return {
199
+ valid: false,
200
+ publisher_domain: publisher,
201
+ discovery_method: 'direct',
202
+ errors: [`MANAGERDOMAIN references the publisher domain itself (cycle): ${managerDomain}`],
203
+ };
204
+ }
205
+ // Step 4: fetch the manager domain's adagents.json. One hop only —
206
+ // even if this file has its own `authoritative_location`, we do NOT
207
+ // follow it (the RFC restricts to one hop publisher → managerdomain).
208
+ const managerUrl = buildUrl(managerDomain, '/.well-known/adagents.json');
209
+ const manager = await fetchJsonOrStatus(managerUrl, {
210
+ timeoutMs,
211
+ maxBodyBytes: MAX_ADAGENTS_BYTES,
212
+ userAgentHeader,
213
+ fromHeader,
214
+ });
215
+ if (manager.kind !== 'ok') {
216
+ logger.debug(`Manager domain ${managerDomain} adagents.json fetch failed: ${describeOutcome(manager)}`);
217
+ return {
218
+ valid: false,
219
+ publisher_domain: publisher,
220
+ discovery_method: 'ads_txt_managerdomain',
221
+ manager_domain: managerDomain,
222
+ errors: [`Manager domain adagents.json fetch failed: ${describeOutcome(manager)}`],
223
+ };
224
+ }
225
+ const managerAdAgents = coerceAdAgentsObject(manager.data);
226
+ if (!managerAdAgents) {
227
+ return {
228
+ valid: false,
229
+ publisher_domain: publisher,
230
+ discovery_method: 'ads_txt_managerdomain',
231
+ manager_domain: managerDomain,
232
+ errors: ['Manager domain adagents.json returned a non-object JSON value'],
233
+ };
234
+ }
235
+ return {
236
+ valid: true,
237
+ publisher_domain: publisher,
238
+ discovery_method: 'ads_txt_managerdomain',
239
+ manager_domain: managerDomain,
240
+ resolved_url: managerUrl,
241
+ adagents: managerAdAgents,
242
+ errors: [],
243
+ };
244
+ }
245
+ /**
246
+ * Narrow `JSON.parse` output to a plain object — rejects `null`,
247
+ * arrays, primitives. Empty-body responses decode to `null` and
248
+ * pass the JSON parser; downstream code paths assume an object and
249
+ * would crash on null without this guard (#1720 review).
250
+ */
251
+ function coerceAdAgentsObject(value) {
252
+ if (value === null || typeof value !== 'object' || Array.isArray(value))
253
+ return null;
254
+ return value;
255
+ }
256
+ /**
257
+ * Parse a MANAGERDOMAIN directive out of an ads.txt body. Returns the
258
+ * lowercased host token (last-wins on duplicates) or `undefined` when
259
+ * no eligible directive is present.
260
+ *
261
+ * Eligibility rules (per adcp-client#1717 / adcp#4175 + #4173 resolution):
262
+ * - Directive form `MANAGERDOMAIN=<host>` only. Case-insensitive on
263
+ * the key; the value preserves no case. Comment-only lines like
264
+ * `# managerdomain=...` are rejected.
265
+ * - Value must be a host token (no scheme, no path, no whitespace).
266
+ * - Trailing inline comment containing `noagents` (case-insensitive)
267
+ * opts that entry out of fallback discovery.
268
+ * - Duplicate eligible entries: the last one wins.
269
+ *
270
+ * Exported for direct unit testing.
271
+ */
272
+ function parseManagerDomain(adsTxt) {
273
+ if (!adsTxt)
274
+ return undefined;
275
+ // Strip BOM if present — common on Windows-authored ads.txt files.
276
+ // `charCodeAt` + `slice` is clearer than a regex match against a
277
+ // literal U+FEFF (per #1720 review).
278
+ const body = adsTxt.charCodeAt(0) === 0xfeff ? adsTxt.slice(1) : adsTxt;
279
+ let last;
280
+ for (const rawLine of body.split(/\r?\n/)) {
281
+ // Split off any inline comment so the directive parser only sees
282
+ // the code part, but keep the comment text around for the
283
+ // `#noagents` opt-out check.
284
+ const hashIdx = rawLine.indexOf('#');
285
+ const code = (hashIdx === -1 ? rawLine : rawLine.slice(0, hashIdx)).trim();
286
+ const comment = hashIdx === -1 ? '' : rawLine.slice(hashIdx + 1);
287
+ if (!code)
288
+ continue;
289
+ // Directive form only: KEY=VALUE on its own line, key matched
290
+ // case-insensitively. We parse with `indexOf('=')` rather than a
291
+ // regex because `code` is uncontrolled network input — any regex
292
+ // shape like `^KEY\s*=\s*(...)$` invites polynomial-ReDoS backtracking
293
+ // on pathological whitespace-heavy lines (flagged by CodeQL).
294
+ const eq = code.indexOf('=');
295
+ if (eq === -1)
296
+ continue;
297
+ if (code.slice(0, eq).trim().toLowerCase() !== 'managerdomain')
298
+ continue;
299
+ const value = code.slice(eq + 1).trim();
300
+ if (!value)
301
+ continue;
302
+ if (!isEligibleHostToken(value))
303
+ continue;
304
+ if (/\bnoagents\b/i.test(comment))
305
+ continue;
306
+ last = value.toLowerCase();
307
+ }
308
+ return last;
309
+ }
310
+ /**
311
+ * URL equality for cycle detection. Compares lowercased origin
312
+ * (scheme + host + port) and pathname; ignores trailing slashes,
313
+ * query strings, fragments, and scheme case. Returns false on
314
+ * unparseable URLs (callers treat unparseable as "not a cycle" so
315
+ * `ssrfSafeFetch` can produce a cleaner error downstream).
316
+ */
317
+ function sameOriginAndPath(a, b) {
318
+ try {
319
+ const ua = new URL(a);
320
+ const ub = new URL(b);
321
+ if (ua.origin.toLowerCase() !== ub.origin.toLowerCase())
322
+ return false;
323
+ const pathA = ua.pathname.replace(/\/+$/, '');
324
+ const pathB = ub.pathname.replace(/\/+$/, '');
325
+ return pathA === pathB;
326
+ }
327
+ catch {
328
+ return false;
329
+ }
330
+ }
331
+ function isEligibleHostToken(value) {
332
+ if (!value)
333
+ return false;
334
+ // Reject anything with whitespace, slashes, or query strings.
335
+ if (/[\s/?#]/.test(value))
336
+ return false;
337
+ // Reject anything that looks like a URL (`scheme:` prefix). The single
338
+ // `:` permitted in a host token is the port separator handled below —
339
+ // so look for the colon-before-slash-or-end shape `scheme:...`.
340
+ if (/^[a-z][a-z0-9+.-]*:[^0-9]/i.test(value))
341
+ return false;
342
+ // Split off an optional `:port` suffix. Port must be 1–5 digits.
343
+ const portMatch = value.match(/^(.*?):([0-9]{1,5})$/);
344
+ const host = portMatch?.[1] ?? value;
345
+ // Minimal hostname shape — at least one dot, labels per RFC 1035-ish.
346
+ // Reject `example` (no TLD) and obvious junk like `..` or `-foo.com`.
347
+ if (!/^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)+$/i.test(host))
348
+ return false;
349
+ return true;
350
+ }
351
+ async function fetchJsonOrStatus(url, opts) {
352
+ const raw = await rawFetch(url, opts);
353
+ if (raw.kind !== 'ok-text')
354
+ return raw;
355
+ try {
356
+ return { kind: 'ok', data: JSON.parse(raw.text) };
357
+ }
358
+ catch (err) {
359
+ return { kind: 'parse_error', message: err instanceof Error ? err.message : 'invalid JSON' };
360
+ }
361
+ }
362
+ async function fetchTextOrStatus(url, opts) {
363
+ const raw = await rawFetch(url, opts);
364
+ if (raw.kind === 'ok-text')
365
+ return { kind: 'ok', text: raw.text };
366
+ return raw;
367
+ }
368
+ async function rawFetch(url, opts) {
369
+ try {
370
+ const result = await (0, ssrf_fetch_1.ssrfSafeFetch)(url, {
371
+ timeoutMs: opts.timeoutMs,
372
+ allowPrivateIp: (0, probe_policy_1.isInternalProbesAllowed)(),
373
+ maxBodyBytes: opts.maxBodyBytes,
374
+ headers: {
375
+ ...FETCH_HEADERS,
376
+ 'User-Agent': opts.userAgentHeader,
377
+ From: opts.fromHeader,
378
+ },
379
+ });
380
+ if (result.status === 404)
381
+ return { kind: 'not_found' };
382
+ if (result.status < 200 || result.status >= 300) {
383
+ return { kind: 'http_error', status: result.status };
384
+ }
385
+ // Always decode as text — JSON parsing is the caller's choice. This
386
+ // lets ads.txt and adagents.json share the same fetch primitive.
387
+ const decoded = (0, ssrf_fetch_1.decodeBodyAsJsonOrText)(result.body, 'text/plain');
388
+ const text = typeof decoded === 'string' ? decoded : JSON.stringify(decoded);
389
+ return { kind: 'ok-text', text };
390
+ }
391
+ catch (err) {
392
+ if (err instanceof ssrf_fetch_1.SsrfRefusedError) {
393
+ return { kind: 'ssrf_refused', message: err.message };
394
+ }
395
+ return { kind: 'transport_error', message: err instanceof Error ? err.message : String(err) };
396
+ }
397
+ }
398
+ /**
399
+ * Render a fetch failure into a short, log-safe string. Callers only
400
+ * pass failures here — the `'ok'` branch is excluded at the type level
401
+ * so we don't keep a dead "ok" string lying around (#1720 review).
402
+ */
403
+ function describeOutcome(outcome) {
404
+ switch (outcome.kind) {
405
+ case 'not_found':
406
+ return 'HTTP 404';
407
+ case 'http_error':
408
+ return `HTTP ${outcome.status}`;
409
+ case 'transport_error':
410
+ return outcome.message;
411
+ case 'parse_error':
412
+ return `invalid JSON: ${outcome.message}`;
413
+ case 'ssrf_refused':
414
+ return `[SSRF refused] ${outcome.message}`;
415
+ }
416
+ }
417
+ //# sourceMappingURL=validate-adagents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-adagents.js","sourceRoot":"","sources":["../../../src/lib/discovery/validate-adagents.ts"],"names":[],"mappings":"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"}
@@ -118,12 +118,39 @@ export interface OAuthMetadataInfo {
118
118
  /** Issuer identifier */
119
119
  issuer?: string;
120
120
  }
121
+ /**
122
+ * Subset of the parsed `WWW-Authenticate` challenge surfaced on
123
+ * {@link AuthenticationRequiredError}. Mirrors the public shape of
124
+ * `WWWAuthenticateChallenge` from `@adcp/sdk/auth/oauth` without forcing the
125
+ * errors module to depend on the auth subtree (the dependency would invert
126
+ * the build graph).
127
+ *
128
+ * `scheme` is lowercased per RFC 9110 §11.6.1.
129
+ */
130
+ export interface AuthChallengeInfo {
131
+ scheme: string;
132
+ realm?: string;
133
+ scope?: string;
134
+ error?: string;
135
+ error_description?: string;
136
+ }
121
137
  /**
122
138
  * Error thrown when authentication is required to access an MCP endpoint
123
139
  *
124
140
  * This error is thrown during MCP endpoint discovery when the server returns
125
- * a 401 Unauthorized response. If the server supports OAuth, the error includes
126
- * the OAuth metadata to help clients initiate the authentication flow.
141
+ * a 401 Unauthorized response. The shape of the remediation depends on what
142
+ * the 401 disclosed:
143
+ *
144
+ * - OAuth metadata (RFC 9728 PRM walk succeeded) → `oauthMetadata` set,
145
+ * message points at the authorization endpoint.
146
+ * - A `WWW-Authenticate` challenge with a non-Bearer scheme (e.g. Basic
147
+ * behind an Apigee/Kong/AWS API GW gateway) → `challenge` set, message
148
+ * names the scheme and the SDK / CLI surface that configures it.
149
+ * - Plain 401 with no metadata → fallback "provide auth_token" message.
150
+ *
151
+ * Consumers branching on `error.challenge?.scheme === 'basic'` can route
152
+ * straight to `auth: { type: 'basic', username, password }` instead of
153
+ * retrying Bearer indefinitely.
127
154
  *
128
155
  * @example
129
156
  * ```typescript
@@ -131,12 +158,15 @@ export interface OAuthMetadataInfo {
131
158
  * await client.getProducts({ brief: 'test' });
132
159
  * } catch (error) {
133
160
  * if (error instanceof AuthenticationRequiredError) {
134
- * if (error.oauthMetadata) {
161
+ * if (error.challenge?.scheme === 'basic') {
162
+ * // Gateway-fronted agent — configure HTTP Basic
163
+ * reconnect({ auth: { type: 'basic', username, password } });
164
+ * } else if (error.oauthMetadata) {
135
165
  * // Redirect user to OAuth flow
136
166
  * const authUrl = error.oauthMetadata.authorization_endpoint;
137
167
  * console.log(`Please authenticate at: ${authUrl}`);
138
168
  * } else {
139
- * console.log('Authentication required but OAuth not available');
169
+ * console.log('Authentication required but no scheme metadata available');
140
170
  * }
141
171
  * }
142
172
  * }
@@ -145,8 +175,9 @@ export interface OAuthMetadataInfo {
145
175
  export declare class AuthenticationRequiredError extends ADCPError {
146
176
  readonly agentUrl: string;
147
177
  readonly oauthMetadata?: OAuthMetadataInfo | undefined;
178
+ readonly challenge?: AuthChallengeInfo | undefined;
148
179
  readonly code = "AUTHENTICATION_REQUIRED";
149
- constructor(agentUrl: string, oauthMetadata?: OAuthMetadataInfo | undefined, message?: string);
180
+ constructor(agentUrl: string, oauthMetadata?: OAuthMetadataInfo | undefined, message?: string, challenge?: AuthChallengeInfo | undefined);
150
181
  /**
151
182
  * Check if OAuth authentication is available
152
183
  */
@@ -155,6 +186,12 @@ export declare class AuthenticationRequiredError extends ADCPError {
155
186
  * Get the authorization URL if OAuth is available
156
187
  */
157
188
  get authorizationUrl(): string | undefined;
189
+ /**
190
+ * Lowercased scheme from the `WWW-Authenticate` challenge, when present.
191
+ * `'basic'` is the common non-OAuth case — gateway-fronted agents speaking
192
+ * RFC 7617.
193
+ */
194
+ get suggestedScheme(): string | undefined;
158
195
  }
159
196
  /**
160
197
  * Error thrown when a request reused an `idempotency_key` with a different
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/errors/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/errors/index.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,8BAAsB,SAAU,SAAQ,KAAK;IAKlC,OAAO,CAAC,EAAE,OAAO;IAJ1B,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAG7B,OAAO,EAAE,MAAM,EACR,OAAO,CAAC,EAAE,OAAO,YAAA;CAK3B;AAED;;GAEG;AACH,qBAAa,gBAAiB,SAAQ,SAAS;aAI3B,MAAM,EAAE,MAAM;aACd,OAAO,EAAE,MAAM;IAJjC,QAAQ,CAAC,IAAI,kBAAkB;gBAGb,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM;CAIlC;AAED;;GAEG;AACH,qBAAa,qBAAsB,SAAQ,SAAS;aAIhC,MAAM,EAAE,MAAM;aACd,WAAW,EAAE,MAAM;IAJrC,QAAQ,CAAC,IAAI,wBAAwB;gBAGnB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM;CAItC;AAED;;;GAGG;AACH,qBAAa,iBAAkB,SAAQ,SAAS;aAGlB,KAAK,EAAE,MAAM;IAFzC,QAAQ,CAAC,IAAI,mBAAmB;gBAEJ,KAAK,EAAE,MAAM;CAG1C;AAED;;GAEG;AACH,qBAAa,gBAAiB,SAAQ,SAAS;aAI3B,MAAM,EAAE,MAAM;aACd,MAAM,CAAC,EAAE,MAAM;IAJjC,QAAQ,CAAC,IAAI,kBAAkB;gBAGb,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,MAAM,YAAA;CAIlC;AAED;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,SAAS;aAI7B,OAAO,EAAE,MAAM;aACf,eAAe,EAAE,MAAM,EAAE;IAJ3C,QAAQ,CAAC,IAAI,qBAAqB;gBAGhB,OAAO,EAAE,MAAM,EACf,eAAe,EAAE,MAAM,EAAE;CAI5C;AAED;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,SAAS;aAI/B,OAAO,EAAE,MAAM;aACf,QAAQ,EAAE,MAAM;aAChB,cAAc,CAAC,EAAE,MAAM,EAAE;IAL3C,QAAQ,CAAC,IAAI,sBAAsB;gBAGjB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,cAAc,CAAC,EAAE,MAAM,EAAE,YAAA;CAK5C;AAED;;GAEG;AACH,qBAAa,aAAc,SAAQ,SAAS;aAIxB,QAAQ,EAAE,KAAK,GAAG,KAAK;aAEvB,aAAa,CAAC,EAAE,KAAK;IALvC,QAAQ,CAAC,IAAI,oBAAoB;gBAGf,QAAQ,EAAE,KAAK,GAAG,KAAK,EACvC,OAAO,EAAE,MAAM,EACC,aAAa,CAAC,EAAE,KAAK,YAAA;CAKxC;AAED;;GAEG;AACH,qBAAa,eAAgB,SAAQ,SAAS;aAI1B,KAAK,EAAE,MAAM;aACb,KAAK,EAAE,OAAO;aACd,UAAU,EAAE,MAAM;IALpC,QAAQ,CAAC,IAAI,sBAAsB;gBAGjB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,OAAO,EACd,UAAU,EAAE,MAAM;CAKrC;AAED;;GAEG;AACH,qBAAa,wBAAyB,SAAQ,SAAS;aAInC,MAAM,EAAE,MAAM;aACd,QAAQ,EAAE,MAAM;IAJlC,QAAQ,CAAC,IAAI,2BAA2B;gBAGtB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM;CAInC;AAED;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,SAAS;aAI9B,SAAS,EAAE,MAAM;IAHnC,QAAQ,CAAC,IAAI,qBAAqB;gBAGhB,SAAS,EAAE,MAAM,EACjC,MAAM,EAAE,MAAM;CAIjB;AAED;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,SAAS;aAK7B,WAAW,CAAC,EAAE,MAAM;IAJtC,QAAQ,CAAC,IAAI,yBAAyB;gBAGpC,OAAO,EAAE,MAAM,EACC,WAAW,CAAC,EAAE,MAAM,YAAA;CAKvC;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,wCAAwC;IACxC,sBAAsB,EAAE,MAAM,CAAC;IAC/B,gCAAgC;IAChC,cAAc,EAAE,MAAM,CAAC;IACvB,iEAAiE;IACjE,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,wBAAwB;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,qBAAa,2BAA4B,SAAQ,SAAS;aAItC,QAAQ,EAAE,MAAM;aAChB,aAAa,CAAC,EAAE,iBAAiB;aAEjC,SAAS,CAAC,EAAE,iBAAiB;IAN/C,QAAQ,CAAC,IAAI,6BAA6B;gBAGxB,QAAQ,EAAE,MAAM,EAChB,aAAa,CAAC,EAAE,iBAAiB,YAAA,EACjD,OAAO,CAAC,EAAE,MAAM,EACA,SAAS,CAAC,EAAE,iBAAiB,YAAA;IAU/C;;OAEG;IACH,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED;;OAEG;IACH,IAAI,gBAAgB,IAAI,MAAM,GAAG,SAAS,CAEzC;IAED;;;;OAIG;IACH,IAAI,eAAe,IAAI,MAAM,GAAG,SAAS,CAExC;CACF;AAyCD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBAAa,wBAAyB,SAAQ,SAAS;IACrD,QAAQ,CAAC,IAAI,0BAA0B;IAKvC,QAAQ,CAAC,cAAc,EAAE,MAAM,GAAG,SAAS,CAAC;gBAEhC,cAAc,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,CAAC,EAAE,MAAM;CAajE;AAED;;;;;;;;;;;;GAYG;AACH,qBAAa,uBAAwB,SAAQ,SAAS;IACpD,QAAQ,CAAC,IAAI,yBAAyB;IAItC,QAAQ,CAAC,cAAc,EAAE,MAAM,GAAG,SAAS,CAAC;gBAEhC,cAAc,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,CAAC,EAAE,MAAM;CAajE;AAED;;GAEG;AACH,qBAAa,uBAAwB,SAAQ,SAAS;aAIlC,mBAAmB,EAAE,MAAM,EAAE;aAC7B,gBAAgB,EAAE,MAAM,EAAE;aAC1B,QAAQ,CAAC,EAAE,MAAM;IALnC,QAAQ,CAAC,IAAI,yBAAyB;gBAGpB,mBAAmB,EAAE,MAAM,EAAE,EAC7B,gBAAgB,EAAE,MAAM,EAAE,EAC1B,QAAQ,CAAC,EAAE,MAAM,YAAA;CAOpC;AAED;;;;;;;;;;GAUG;AACH,qBAAa,qBAAsB,SAAQ,SAAS;aAIhC,KAAK,EAAE,MAAM;aACb,SAAS,EAAE,MAAM;aACjB,GAAG,EAAE,MAAM;IAC3B;;;;;OAKG;aACa,mBAAmB,CAAC,EAAE,MAAM;IAZ9C,QAAQ,CAAC,IAAI,wBAAwB;gBAGnB,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM;IAC3B;;;;;OAKG;IACa,mBAAmB,CAAC,EAAE,MAAM,YAAA;CAS/C;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,wBAAwB,GAAG,SAAS,GAAG,aAAa,GAAG,WAAW,CAAC;AAE/E;;;;;;;;GAQG;AACH,qBAAa,uBAAwB,SAAQ,SAAS;aAIlC,QAAQ,EAAE,MAAM;aAChB,MAAM,EAAE,wBAAwB;aAChC,aAAa,EAAE,IAAI,GAAG,IAAI;aAC1B,QAAQ,CAAC,EAAE,MAAM;IANnC,QAAQ,CAAC,IAAI,yBAAyB;gBAGpB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,wBAAwB,EAChC,aAAa,EAAE,IAAI,GAAG,IAAI,EAC1B,QAAQ,CAAC,EAAE,MAAM,YAAA;IASnC,OAAO,CAAC,MAAM,CAAC,OAAO;CAUvB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,UAAU,UAAQ,GAAG,OAAO,CA2BtE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,CACnC,SAAS,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,EAC7C,cAAc,CAAC,EAAE,MAAM,GACtB,SAAS,GAAG,SAAS,CASvB;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,SAAS,CAE9D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,KAAK,IAAI,CAAC,CAEpH;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG;IAChD,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAoBA"}