@chrischall/mcp-utils 2.15.0 → 3.0.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 (76) hide show
  1. package/README.md +493 -26
  2. package/dist/auth/index.d.ts +25 -1
  3. package/dist/auth/index.d.ts.map +1 -1
  4. package/dist/auth/index.js +105 -14
  5. package/dist/auth/index.js.map +1 -1
  6. package/dist/config/index.d.ts +13 -0
  7. package/dist/config/index.d.ts.map +1 -1
  8. package/dist/config/index.js +3 -2
  9. package/dist/config/index.js.map +1 -1
  10. package/dist/dates/index.d.ts +45 -5
  11. package/dist/dates/index.d.ts.map +1 -1
  12. package/dist/dates/index.js +64 -6
  13. package/dist/dates/index.js.map +1 -1
  14. package/dist/errors/index.d.ts +121 -7
  15. package/dist/errors/index.d.ts.map +1 -1
  16. package/dist/errors/index.js +154 -9
  17. package/dist/errors/index.js.map +1 -1
  18. package/dist/fs/output.d.ts +25 -8
  19. package/dist/fs/output.d.ts.map +1 -1
  20. package/dist/fs/output.js +27 -5
  21. package/dist/fs/output.js.map +1 -1
  22. package/dist/graphql/client.d.ts +8 -1
  23. package/dist/graphql/client.d.ts.map +1 -1
  24. package/dist/graphql/client.js +11 -3
  25. package/dist/graphql/client.js.map +1 -1
  26. package/dist/healthcheck/index.d.ts +11 -9
  27. package/dist/healthcheck/index.d.ts.map +1 -1
  28. package/dist/healthcheck/index.js +39 -23
  29. package/dist/healthcheck/index.js.map +1 -1
  30. package/dist/http/body-limit.d.ts +37 -0
  31. package/dist/http/body-limit.d.ts.map +1 -0
  32. package/dist/http/body-limit.js +86 -0
  33. package/dist/http/body-limit.js.map +1 -0
  34. package/dist/http/fetch-bounded.d.ts +91 -0
  35. package/dist/http/fetch-bounded.d.ts.map +1 -0
  36. package/dist/http/fetch-bounded.js +138 -0
  37. package/dist/http/fetch-bounded.js.map +1 -0
  38. package/dist/http/index.d.ts +231 -6
  39. package/dist/http/index.d.ts.map +1 -1
  40. package/dist/http/index.js +432 -56
  41. package/dist/http/index.js.map +1 -1
  42. package/dist/http/response-cache.d.ts +36 -3
  43. package/dist/http/response-cache.d.ts.map +1 -1
  44. package/dist/http/response-cache.js +84 -8
  45. package/dist/http/response-cache.js.map +1 -1
  46. package/dist/http/throttle.d.ts +37 -4
  47. package/dist/http/throttle.d.ts.map +1 -1
  48. package/dist/http/throttle.js +65 -6
  49. package/dist/http/throttle.js.map +1 -1
  50. package/dist/http/url-safety.d.ts +142 -0
  51. package/dist/http/url-safety.d.ts.map +1 -0
  52. package/dist/http/url-safety.js +211 -0
  53. package/dist/http/url-safety.js.map +1 -0
  54. package/dist/netguard/index.d.ts +196 -0
  55. package/dist/netguard/index.d.ts.map +1 -0
  56. package/dist/netguard/index.js +365 -0
  57. package/dist/netguard/index.js.map +1 -0
  58. package/dist/server/confirm-env.d.ts +17 -8
  59. package/dist/server/confirm-env.d.ts.map +1 -1
  60. package/dist/server/confirm-env.js +22 -13
  61. package/dist/server/confirm-env.js.map +1 -1
  62. package/dist/server/confirm-write.js +1 -1
  63. package/dist/server/confirm-write.js.map +1 -1
  64. package/dist/server/index.d.ts +6 -2
  65. package/dist/server/index.d.ts.map +1 -1
  66. package/dist/server/index.js +24 -9
  67. package/dist/server/index.js.map +1 -1
  68. package/dist/session/index.d.ts +6 -0
  69. package/dist/session/index.d.ts.map +1 -1
  70. package/dist/session/index.js +12 -1
  71. package/dist/session/index.js.map +1 -1
  72. package/dist/zod/index.d.ts +6 -0
  73. package/dist/zod/index.d.ts.map +1 -1
  74. package/dist/zod/index.js +8 -1
  75. package/dist/zod/index.js.map +1 -1
  76. package/package.json +11 -2
@@ -12,19 +12,74 @@
12
12
  export declare const DEFAULT_BOT_WALL_RETRY_AFTER_S = 30;
13
13
  /** Default truncation budget for upstream error bodies surfaced to clients. */
14
14
  export declare const DEFAULT_ERROR_MESSAGE_MAX = 500;
15
+ /**
16
+ * What kind of failure an {@link McpToolError} is, in the vocabulary of the
17
+ * credential healthcheck's arms (`@chrischall/mcp-utils/healthcheck`'s
18
+ * `CredentialHealthcheckArm`, minus `'ok'`):
19
+ *
20
+ * - `'no_credential'` — nothing to authenticate with;
21
+ * - `'credential_rejected'` — the far side refused the credential (401/403,
22
+ * a rejected grant, a GraphQL `UNAUTHENTICATED`);
23
+ * - `'edge_blocked'` — a CDN/WAF refused the request before the API saw it;
24
+ * - `'session_expired'` — credentials are fine, but no session is live;
25
+ * - `'verification_pending'` — a second factor is outstanding;
26
+ * - `'timeout'` — the far side did not answer in time;
27
+ * - `'http'` — the far side answered with an error status that is not an
28
+ * auth rejection (see `status` for which);
29
+ * - `'transport'` — the far side could not be reached at all;
30
+ * - `'too_large'` — the far side answered, but with a body larger than the
31
+ * caller's byte cap (`ResponseTooLargeError`);
32
+ * - `'unknown'` — none of the above is known.
33
+ *
34
+ * Fleet audit 2026-09, cluster 8: without this, repos classified failures by
35
+ * regex over the message text (`/401|403|forbidden/`, `/auth|sign/` matching
36
+ * "assign"). Branch on `err.kind` / `err.status` (or {@link errorKindOf} /
37
+ * {@link errorStatusOf}) instead.
38
+ */
39
+ export type McpToolErrorKind = 'no_credential' | 'credential_rejected' | 'edge_blocked' | 'session_expired' | 'verification_pending' | 'timeout' | 'http' | 'transport' | 'too_large' | 'unknown';
40
+ /** Every {@link McpToolErrorKind}, for validating a `kind` read off an unknown error. */
41
+ export declare const MCP_TOOL_ERROR_KINDS: ReadonlySet<McpToolErrorKind>;
42
+ /** Constructor options for {@link McpToolError}. Every field is optional. */
43
+ export interface McpToolErrorOptions {
44
+ /** Actionable remediation text. */
45
+ hint?: string;
46
+ /** The underlying error, chained as `cause`. */
47
+ cause?: unknown;
48
+ /** The upstream HTTP status this failure came from, when there was one. */
49
+ status?: number;
50
+ /** What kind of failure this is. See {@link McpToolErrorKind}. */
51
+ kind?: McpToolErrorKind;
52
+ }
15
53
  /**
16
54
  * Base class for every tool-facing error. Carries an optional `hint` —
17
55
  * actionable remediation text ("set ZOLA_REFRESH_TOKEN", "sign in at compass.com")
18
- * the tool surface can present separately from the message.
56
+ * the tool surface can present separately from the message — and, when the
57
+ * thrower knows them, the upstream HTTP `status` and a {@link McpToolErrorKind}
58
+ * `kind`, so callers classify a failure by structure rather than by matching
59
+ * its text. The library's own throwers (http, graphql, auth/session) set them.
19
60
  */
20
61
  export declare class McpToolError extends Error {
21
62
  /** Actionable remediation text, when one applies. */
22
63
  readonly hint?: string;
23
- constructor(message: string, opts?: {
24
- hint?: string;
25
- cause?: unknown;
26
- });
64
+ /** The upstream HTTP status this failure came from, when known. */
65
+ readonly status?: number;
66
+ /** What kind of failure this is, when the thrower knows. */
67
+ readonly kind?: McpToolErrorKind;
68
+ constructor(message: string, opts?: McpToolErrorOptions);
27
69
  }
70
+ /**
71
+ * The HTTP status a thrown error carries: a numeric `status` (or `statusCode`)
72
+ * on the error or, failing that, on a short `cause` chain — so a hint-adding
73
+ * wrapper around an `ApiError` still answers 401. The outermost link that has
74
+ * one wins. `undefined` when none does. Duck-typed: any error class qualifies.
75
+ */
76
+ export declare function errorStatusOf(err: unknown): number | undefined;
77
+ /**
78
+ * The {@link McpToolErrorKind} a thrown error declares, on itself or a short
79
+ * `cause` chain (outermost wins). A `kind` outside the vocabulary — another
80
+ * library's own `kind` field — is ignored, not returned. Duck-typed.
81
+ */
82
+ export declare function errorKindOf(err: unknown): McpToolErrorKind | undefined;
28
83
  /**
29
84
  * The user's browser session isn't signed in to the upstream service. Distinct
30
85
  * from a transient bot-wall — this is a stable "go authenticate" condition.
@@ -55,8 +110,10 @@ export declare class RateLimitError extends McpToolError {
55
110
  }
56
111
  /** Upstream is unreachable (5xx / transport failure) — not the caller's fault. */
57
112
  export declare class UnreachableError extends McpToolError {
58
- /** Upstream HTTP status, when one was observed. */
59
- readonly status?: number;
113
+ /**
114
+ * @param status The upstream HTTP status, when one was observed. It becomes
115
+ * `status`, and the `kind` is `'http'` with one and `'transport'` without.
116
+ */
60
117
  constructor(service: string, status?: number);
61
118
  }
62
119
  /**
@@ -69,6 +126,59 @@ export declare class ModeMismatchError extends McpToolError {
69
126
  readonly feature: string;
70
127
  constructor(currentMode: string, requiredMode: string, feature: string);
71
128
  }
129
+ /**
130
+ * What an upstream body turned out to be, as {@link UpstreamFormatError}
131
+ * reports it: `'non-json'` when it did not parse at all, `'empty'` for an empty
132
+ * (or whitespace-only) body or a 204, otherwise the JSON kind it parsed to.
133
+ */
134
+ export type UpstreamBodyKind = 'non-json' | 'empty' | 'null' | 'array' | 'object' | 'string' | 'number' | 'boolean';
135
+ /** The JSON shape a caller can require of an upstream body. */
136
+ export type ExpectedJsonShape = 'object' | 'array';
137
+ /** Constructor input for {@link UpstreamFormatError}. Every field but `received` is optional. */
138
+ export interface UpstreamFormatErrorDetails {
139
+ /** What the body turned out to be. */
140
+ received: UpstreamBodyKind;
141
+ /** The shape the caller required, when it required one. */
142
+ expected?: ExpectedJsonShape;
143
+ /** The upstream's display name. Defaults to "The upstream service". */
144
+ service?: string;
145
+ /** The request method, named in the message alongside `path`. */
146
+ method?: string;
147
+ /** The request path, named in the message alongside `method`. */
148
+ path?: string;
149
+ /** The response status. */
150
+ status?: number;
151
+ /** The response `Content-Type`. */
152
+ contentType?: string;
153
+ /** The parse failure, chained as `cause` (never put in the message). */
154
+ cause?: unknown;
155
+ }
156
+ /**
157
+ * An upstream answered with a body that is not the JSON the caller needs: an
158
+ * HTML sign-in page or interstitial served with a 200, an empty body, or a
159
+ * `null`/scalar/wrong-container where an object or array was required.
160
+ *
161
+ * Consolidates the fleet's raw `SyntaxError: Unexpected token '<'` and
162
+ * `TypeError: Cannot read properties of null` failures (alltrails, etix, resy,
163
+ * skylight, tripadvisor, accessoticketing, angi, ofw): those reach the model as
164
+ * parser noise carrying a fragment of the upstream page. This one names the
165
+ * service, request, status and content type instead, and never the body —
166
+ * the parser's own error is kept as `cause`. The message is redacted, so a
167
+ * credential in the path's query cannot leak through it.
168
+ *
169
+ * Thrown by `createApiClient`'s `fetchJson` and by `parseJsonBody` (both in
170
+ * `http`), which check for a CDN/WAF challenge first and throw
171
+ * `EdgeBlockedError` for that instead.
172
+ */
173
+ export declare class UpstreamFormatError extends McpToolError {
174
+ /** What the body turned out to be. */
175
+ readonly received: UpstreamBodyKind;
176
+ /** The shape the caller required, when it required one. */
177
+ readonly expected?: ExpectedJsonShape;
178
+ /** The response `Content-Type`, when known. (`status` is the base class's.) */
179
+ readonly contentType?: string;
180
+ constructor(details: UpstreamFormatErrorDetails);
181
+ }
72
182
  /** Factory for an {@link McpToolError} with a remediation hint. */
73
183
  export declare function createHelpfulError(message: string, opts?: {
74
184
  hint?: string;
@@ -151,6 +261,10 @@ export declare function isTimeoutError(err: unknown): boolean;
151
261
  * preserving any `hint` and chaining the original via `cause`. The message is
152
262
  * run through {@link truncateErrorMessage} (redaction + truncation). Re-wrapping
153
263
  * an already-prefixed error does not double-prefix.
264
+ *
265
+ * The wrapped error's HTTP status and {@link McpToolErrorKind} carry over too
266
+ * (read with {@link errorStatusOf} / {@link errorKindOf}), so wrapping an
267
+ * `ApiError` for its tool-name prefix does not lose the 404 a caller branches on.
154
268
  */
155
269
  export declare function wrapToolError(toolName: string, err: unknown): McpToolError;
156
270
  /** Options for {@link maskSecret}. */
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/errors/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/errors/index.ts"],"names":[],"mappings":"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"}
@@ -17,23 +17,87 @@
17
17
  export const DEFAULT_BOT_WALL_RETRY_AFTER_S = 30;
18
18
  /** Default truncation budget for upstream error bodies surfaced to clients. */
19
19
  export const DEFAULT_ERROR_MESSAGE_MAX = 500;
20
+ /** Every {@link McpToolErrorKind}, for validating a `kind` read off an unknown error. */
21
+ export const MCP_TOOL_ERROR_KINDS = new Set([
22
+ 'no_credential',
23
+ 'credential_rejected',
24
+ 'edge_blocked',
25
+ 'session_expired',
26
+ 'verification_pending',
27
+ 'timeout',
28
+ 'http',
29
+ 'transport',
30
+ 'too_large',
31
+ 'unknown',
32
+ ]);
20
33
  /**
21
34
  * Base class for every tool-facing error. Carries an optional `hint` —
22
35
  * actionable remediation text ("set ZOLA_REFRESH_TOKEN", "sign in at compass.com")
23
- * the tool surface can present separately from the message.
36
+ * the tool surface can present separately from the message — and, when the
37
+ * thrower knows them, the upstream HTTP `status` and a {@link McpToolErrorKind}
38
+ * `kind`, so callers classify a failure by structure rather than by matching
39
+ * its text. The library's own throwers (http, graphql, auth/session) set them.
24
40
  */
25
41
  export class McpToolError extends Error {
26
42
  /** Actionable remediation text, when one applies. */
27
43
  hint;
44
+ /** The upstream HTTP status this failure came from, when known. */
45
+ status;
46
+ /** What kind of failure this is, when the thrower knows. */
47
+ kind;
28
48
  constructor(message, opts) {
29
49
  super(message, opts?.cause !== undefined ? { cause: opts.cause } : undefined);
30
50
  this.name = 'McpToolError';
31
51
  if (opts?.hint !== undefined)
32
52
  this.hint = opts.hint;
53
+ if (opts?.status !== undefined)
54
+ this.status = opts.status;
55
+ if (opts?.kind !== undefined)
56
+ this.kind = opts.kind;
33
57
  // Restore the prototype chain for transpiled `extends Error`.
34
58
  Object.setPrototypeOf(this, new.target.prototype);
35
59
  }
36
60
  }
61
+ /** How many `cause` links {@link errorStatusOf} / {@link errorKindOf} follow (also bounds a cyclic chain). */
62
+ const DECLARATION_CAUSE_DEPTH = 4;
63
+ /** The first value `read` finds on `err` or its short `cause` chain, outside-in. */
64
+ function firstDeclared(err, read) {
65
+ let cur = err;
66
+ for (let depth = 0; depth < DECLARATION_CAUSE_DEPTH && cur !== null && typeof cur === 'object'; depth++) {
67
+ const found = read(cur);
68
+ if (found !== undefined)
69
+ return found;
70
+ cur = cur.cause;
71
+ }
72
+ return undefined;
73
+ }
74
+ /**
75
+ * The HTTP status a thrown error carries: a numeric `status` (or `statusCode`)
76
+ * on the error or, failing that, on a short `cause` chain — so a hint-adding
77
+ * wrapper around an `ApiError` still answers 401. The outermost link that has
78
+ * one wins. `undefined` when none does. Duck-typed: any error class qualifies.
79
+ */
80
+ export function errorStatusOf(err) {
81
+ return firstDeclared(err, (link) => {
82
+ const e = link;
83
+ if (typeof e.status === 'number')
84
+ return e.status;
85
+ return typeof e.statusCode === 'number' ? e.statusCode : undefined;
86
+ });
87
+ }
88
+ /**
89
+ * The {@link McpToolErrorKind} a thrown error declares, on itself or a short
90
+ * `cause` chain (outermost wins). A `kind` outside the vocabulary — another
91
+ * library's own `kind` field — is ignored, not returned. Duck-typed.
92
+ */
93
+ export function errorKindOf(err) {
94
+ return firstDeclared(err, (link) => {
95
+ const k = link.kind;
96
+ return typeof k === 'string' && MCP_TOOL_ERROR_KINDS.has(k)
97
+ ? k
98
+ : undefined;
99
+ });
100
+ }
37
101
  /**
38
102
  * The user's browser session isn't signed in to the upstream service. Distinct
39
103
  * from a transient bot-wall — this is a stable "go authenticate" condition.
@@ -43,7 +107,7 @@ export class SessionNotAuthenticatedError extends McpToolError {
43
107
  const name = service ?? 'the service';
44
108
  const where = signInHost ? `Open ${signInHost} in your browser and sign in, then try again.` : 'Sign in in your browser, then try again.';
45
109
  super(`Not signed in to ${name}. ${where} ` +
46
- 'Saved searches, saved homes, and other account data require a signed-in session.', { hint: where });
110
+ 'Saved searches, saved homes, and other account data require a signed-in session.', { hint: where, kind: 'session_expired' });
47
111
  this.name = 'SessionNotAuthenticatedError';
48
112
  }
49
113
  }
@@ -75,7 +139,7 @@ export class RateLimitError extends McpToolError {
75
139
  retryAfterSeconds;
76
140
  constructor(service, retryAfterSeconds) {
77
141
  const wait = retryAfterSeconds !== undefined ? ` Retry after ${retryAfterSeconds}s.` : ' Back off and retry.';
78
- super(`Rate limited by ${service}.${wait}`, { hint: wait.trim() });
142
+ super(`Rate limited by ${service}.${wait}`, { hint: wait.trim(), status: 429, kind: 'http' });
79
143
  this.name = 'RateLimitError';
80
144
  if (retryAfterSeconds !== undefined)
81
145
  this.retryAfterSeconds = retryAfterSeconds;
@@ -83,16 +147,18 @@ export class RateLimitError extends McpToolError {
83
147
  }
84
148
  /** Upstream is unreachable (5xx / transport failure) — not the caller's fault. */
85
149
  export class UnreachableError extends McpToolError {
86
- /** Upstream HTTP status, when one was observed. */
87
- status;
150
+ /**
151
+ * @param status The upstream HTTP status, when one was observed. It becomes
152
+ * `status`, and the `kind` is `'http'` with one and `'transport'` without.
153
+ */
88
154
  constructor(service, status) {
89
155
  const suffix = status !== undefined ? ` (status ${status})` : '';
90
156
  super(`${service} unreachable${suffix}. The service may be down — try again later.`, {
91
157
  hint: 'The upstream service is temporarily unavailable; retry later.',
158
+ kind: status !== undefined ? 'http' : 'transport',
159
+ ...(status !== undefined ? { status } : {}),
92
160
  });
93
161
  this.name = 'UnreachableError';
94
- if (status !== undefined)
95
- this.status = status;
96
162
  }
97
163
  }
98
164
  /**
@@ -112,6 +178,70 @@ export class ModeMismatchError extends McpToolError {
112
178
  this.name = 'ModeMismatchError';
113
179
  }
114
180
  }
181
+ const UPSTREAM_BODY_PHRASE = {
182
+ 'non-json': 'a non-JSON response',
183
+ empty: 'an empty body',
184
+ null: 'null',
185
+ array: 'an array',
186
+ object: 'an object',
187
+ string: 'a string',
188
+ number: 'a number',
189
+ boolean: 'a boolean',
190
+ };
191
+ /**
192
+ * An upstream answered with a body that is not the JSON the caller needs: an
193
+ * HTML sign-in page or interstitial served with a 200, an empty body, or a
194
+ * `null`/scalar/wrong-container where an object or array was required.
195
+ *
196
+ * Consolidates the fleet's raw `SyntaxError: Unexpected token '<'` and
197
+ * `TypeError: Cannot read properties of null` failures (alltrails, etix, resy,
198
+ * skylight, tripadvisor, accessoticketing, angi, ofw): those reach the model as
199
+ * parser noise carrying a fragment of the upstream page. This one names the
200
+ * service, request, status and content type instead, and never the body —
201
+ * the parser's own error is kept as `cause`. The message is redacted, so a
202
+ * credential in the path's query cannot leak through it.
203
+ *
204
+ * Thrown by `createApiClient`'s `fetchJson` and by `parseJsonBody` (both in
205
+ * `http`), which check for a CDN/WAF challenge first and throw
206
+ * `EdgeBlockedError` for that instead.
207
+ */
208
+ export class UpstreamFormatError extends McpToolError {
209
+ /** What the body turned out to be. */
210
+ received;
211
+ /** The shape the caller required, when it required one. */
212
+ expected;
213
+ /** The response `Content-Type`, when known. (`status` is the base class's.) */
214
+ contentType;
215
+ constructor(details) {
216
+ const service = details.service ?? 'The upstream service';
217
+ const request = details.method !== undefined && details.path !== undefined
218
+ ? `${details.method.toUpperCase()} ${details.path}`
219
+ : undefined;
220
+ const meta = [
221
+ details.status !== undefined ? `HTTP ${details.status}` : undefined,
222
+ details.contentType || undefined,
223
+ ].filter((p) => p !== undefined);
224
+ const what = details.expected !== undefined
225
+ ? `${UPSTREAM_BODY_PHRASE[details.received]} where a JSON ${details.expected} was expected` +
226
+ (request ? ` for ${request}` : '')
227
+ : `${UPSTREAM_BODY_PHRASE[details.received]}` + (request ? ` to ${request}` : '');
228
+ const message = `${service} returned ${what}${meta.length > 0 ? ` (${meta.join(', ')})` : ''}.`;
229
+ const hint = details.received === 'non-json'
230
+ ? 'The service answered with something other than JSON, usually a sign-in page or interstitial, or its API has changed. Check the session, then retry.'
231
+ : 'The service answered with a body of the wrong shape: the resource may be missing or its API may have changed.';
232
+ super(truncateErrorMessage(message), {
233
+ hint,
234
+ cause: details.cause,
235
+ ...(details.status !== undefined ? { status: details.status } : {}),
236
+ });
237
+ this.name = 'UpstreamFormatError';
238
+ this.received = details.received;
239
+ if (details.expected !== undefined)
240
+ this.expected = details.expected;
241
+ if (details.contentType)
242
+ this.contentType = details.contentType;
243
+ }
244
+ }
115
245
  /** Factory for an {@link McpToolError} with a remediation hint. */
116
246
  export function createHelpfulError(message, opts) {
117
247
  return new McpToolError(message, opts);
@@ -188,7 +318,10 @@ const GOOGLE_OAUTH_TOKEN_RE = /(?<![A-Za-z0-9+/])(?:ya29\.|1\/\/)[A-Za-z0-9._-]{
188
318
  // used as params (`?x-api-key=…`), which the colon-anchored HEADER_SECRET_RE
189
319
  // never sees (fleet audit 2026-09-24 PRIV-1). The `x-` branch reuses the
190
320
  // bounded HEADER_NAME_RUN so it stays linear.
191
- const QUERY_SECRET_RE = new RegExp(`([?&](?:(?:access|refresh|id|auth|session|csrf|xsrf)[_-]?token|client[_-]?secret|api[_-]?secret|api[_-]?key|password|passwd|signature|token|key|sig|(?:php|j)?sess(?:ion)?[_-]?id|sid|x[-_]${HEADER_NAME_RUN}?(?:api[-_]?key|token|secret|auth)${HEADER_NAME_RUN})=)[^&#\\s"'<>\`]+`, 'gi');
321
+ // A PKCE `code_verifier` (and Canvas's bare `?verifier=` file capability) is a
322
+ // bearer secret: whoever holds it can complete the exchange or fetch the file
323
+ // (fleet audit library-candidates §16 — canvas-parent #380 quoted one in a 404).
324
+ const QUERY_SECRET_RE = new RegExp(`([?&](?:(?:access|refresh|id|auth|session|csrf|xsrf)[_-]?token|client[_-]?secret|api[_-]?secret|api[_-]?key|password|passwd|signature|token|key|sig|(?:code[_-]?)?verifier|(?:php|j)?sess(?:ion)?[_-]?id|sid|x[-_]${HEADER_NAME_RUN}?(?:api[-_]?key|token|secret|auth)${HEADER_NAME_RUN})=)[^&#\\s"'<>\`]+`, 'gi');
192
325
  // An OAuth authorization code (`?code=…` on a redirect). Only values of 16+
193
326
  // characters: real authorization codes are long opaque strings, while a short
194
327
  // `code=E123` is an error/status code worth keeping for diagnosis.
@@ -240,6 +373,7 @@ const JSON_SECRET_KEYS = [
240
373
  'api[_-]?secret',
241
374
  '(?:x[_-])?api[_-]?key',
242
375
  'private[_-]?key',
376
+ 'code[_-]?verifier', // PKCE; a bare `verifier` key is too generic for JSON
243
377
  `x[_-]${HEADER_NAME_RUN}?(?:api[_-]?key|token|secret|auth)${HEADER_NAME_RUN}`, // bounded like HEADER_SECRET_RE
244
378
  '(?:proxy-)?authorization',
245
379
  'password',
@@ -416,13 +550,24 @@ export function isTimeoutError(err) {
416
550
  * preserving any `hint` and chaining the original via `cause`. The message is
417
551
  * run through {@link truncateErrorMessage} (redaction + truncation). Re-wrapping
418
552
  * an already-prefixed error does not double-prefix.
553
+ *
554
+ * The wrapped error's HTTP status and {@link McpToolErrorKind} carry over too
555
+ * (read with {@link errorStatusOf} / {@link errorKindOf}), so wrapping an
556
+ * `ApiError` for its tool-name prefix does not lose the 404 a caller branches on.
419
557
  */
420
558
  export function wrapToolError(toolName, err) {
421
559
  const inner = messageOf(err);
422
560
  const prefix = `[${toolName}]`;
423
561
  const message = inner.includes(prefix) ? inner : `${prefix} ${inner}`;
424
562
  const hint = err instanceof McpToolError ? err.hint : undefined;
425
- return new McpToolError(truncateErrorMessage(message), { hint, cause: err });
563
+ const status = errorStatusOf(err);
564
+ const kind = errorKindOf(err);
565
+ return new McpToolError(truncateErrorMessage(message), {
566
+ hint,
567
+ cause: err,
568
+ ...(status !== undefined ? { status } : {}),
569
+ ...(kind !== undefined ? { kind } : {}),
570
+ });
426
571
  }
427
572
  /**
428
573
  * Mask a credential for display in a confirmation message: keep the first
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/errors/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/errors/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,wEAAwE;AACxE,qFAAqF;AACrF,iFAAiF;AACjF,gFAAgF;AAChF,yBAAyB;AAEzB,qFAAqF;AACrF,MAAM,CAAC,MAAM,8BAA8B,GAAG,EAAE,CAAC;AAEjD,+EAA+E;AAC/E,MAAM,CAAC,MAAM,yBAAyB,GAAG,GAAG,CAAC;AAsC7C,yFAAyF;AACzF,MAAM,CAAC,MAAM,oBAAoB,GAAkC,IAAI,GAAG,CAAmB;IAC3F,eAAe;IACf,qBAAqB;IACrB,cAAc;IACd,iBAAiB;IACjB,sBAAsB;IACtB,SAAS;IACT,MAAM;IACN,WAAW;IACX,WAAW;IACX,SAAS;CACV,CAAC,CAAC;AAcH;;;;;;;GAOG;AACH,MAAM,OAAO,YAAa,SAAQ,KAAK;IACrC,qDAAqD;IAC5C,IAAI,CAAU;IACvB,mEAAmE;IAC1D,MAAM,CAAU;IACzB,4DAA4D;IACnD,IAAI,CAAoB;IAEjC,YAAY,OAAe,EAAE,IAA0B;QACrD,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAC9E,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;QAC3B,IAAI,IAAI,EAAE,IAAI,KAAK,SAAS;YAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACpD,IAAI,IAAI,EAAE,MAAM,KAAK,SAAS;YAAE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC1D,IAAI,IAAI,EAAE,IAAI,KAAK,SAAS;YAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACpD,8DAA8D;QAC9D,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,MAAM,CAAC,SAAS,CAAC,CAAC;IACpD,CAAC;CACF;AAED,8GAA8G;AAC9G,MAAM,uBAAuB,GAAG,CAAC,CAAC;AAElC,oFAAoF;AACpF,SAAS,aAAa,CAAI,GAAY,EAAE,IAAqC;IAC3E,IAAI,GAAG,GAAY,GAAG,CAAC;IACvB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,uBAAuB,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC;QACxG,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;QACxB,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,KAAK,CAAC;QACtC,GAAG,GAAI,GAA2B,CAAC,KAAK,CAAC;IAC3C,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,GAAY;IACxC,OAAO,aAAa,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE;QACjC,MAAM,CAAC,GAAG,IAAkD,CAAC;QAC7D,IAAI,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ;YAAE,OAAO,CAAC,CAAC,MAAM,CAAC;QAClD,OAAO,OAAO,CAAC,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;IACrE,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,GAAY;IACtC,OAAO,aAAa,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE;QACjC,MAAM,CAAC,GAAI,IAA2B,CAAC,IAAI,CAAC;QAC5C,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,oBAAoB,CAAC,GAAG,CAAC,CAAqB,CAAC;YAC7E,CAAC,CAAE,CAAsB;YACzB,CAAC,CAAC,SAAS,CAAC;IAChB,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,OAAO,4BAA6B,SAAQ,YAAY;IAC5D,YAAY,OAAgB,EAAE,UAAmB;QAC/C,MAAM,IAAI,GAAG,OAAO,IAAI,aAAa,CAAC;QACtC,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,QAAQ,UAAU,+CAA+C,CAAC,CAAC,CAAC,0CAA0C,CAAC;QAC1I,KAAK,CACH,oBAAoB,IAAI,KAAK,KAAK,GAAG;YACnC,kFAAkF,EACpF,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,iBAAiB,EAAE,CACzC,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,8BAA8B,CAAC;IAC7C,CAAC;CACF;AAED;;;;;GAKG;AACH,MAAM,OAAO,YAAa,SAAQ,YAAY;IAC5C,wEAAwE;IAC/D,iBAAiB,CAAS;IACnC,8FAA8F;IACrF,MAAM,CAAU;IAEzB,YACE,IAAY,EACZ,iBAAiB,GAAW,8BAA8B,EAC1D,IAA0B;QAE1B,0EAA0E;QAC1E,MAAM,IAAI,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,MAAM,wBAAwB,CAAC,CAAC,CAAC,0BAA0B,CAAC;QAClG,MAAM,IAAI,GAAG,uCAAuC,iBAAiB,wGAAwG,CAAC;QAC9K,KAAK,CACH,UAAU,IAAI,QAAQ,IAAI,4DAA4D,IAAI,EAAE,EAC5F,EAAE,IAAI,EAAE,CACT,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;QAC3B,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;QAC3C,IAAI,IAAI,EAAE,MAAM,KAAK,SAAS;YAAE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IAC5D,CAAC;CACF;AAED,uEAAuE;AACvE,MAAM,OAAO,cAAe,SAAQ,YAAY;IAC9C,8DAA8D;IACrD,iBAAiB,CAAU;IAEpC,YAAY,OAAe,EAAE,iBAA0B;QACrD,MAAM,IAAI,GACR,iBAAiB,KAAK,SAAS,CAAC,CAAC,CAAC,gBAAgB,iBAAiB,IAAI,CAAC,CAAC,CAAC,sBAAsB,CAAC;QACnG,KAAK,CAAC,mBAAmB,OAAO,IAAI,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QAC9F,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;QAC7B,IAAI,iBAAiB,KAAK,SAAS;YAAE,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;IAClF,CAAC;CACF;AAED,kFAAkF;AAClF,MAAM,OAAO,gBAAiB,SAAQ,YAAY;IAChD;;;OAGG;IACH,YAAY,OAAe,EAAE,MAAe;QAC1C,MAAM,MAAM,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,YAAY,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACjE,KAAK,CAAC,GAAG,OAAO,eAAe,MAAM,8CAA8C,EAAE;YACnF,IAAI,EAAE,+DAA+D;YACrE,IAAI,EAAE,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW;YACjD,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC5C,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;IACjC,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,OAAO,iBAAkB,SAAQ,YAAY;IAEtC,WAAW;IACX,YAAY;IACZ,OAAO;IAHlB,YACW,WAAmB,EACnB,YAAoB,EACpB,OAAe;QAExB,MAAM,IAAI,GAAG,aAAa,YAAY,gBAAgB,OAAO,GAAG,CAAC;QACjE,KAAK,CACH,GAAG,OAAO,aAAa,YAAY,sCAAsC,WAAW,UAAU,IAAI,EAAE,EACpG,EAAE,IAAI,EAAE,CACT,CAAC;2BARO,WAAW;4BACX,YAAY;uBACZ,OAAO;QAOhB,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;CACF;AAgCD,MAAM,oBAAoB,GAAqC;IAC7D,UAAU,EAAE,qBAAqB;IACjC,KAAK,EAAE,eAAe;IACtB,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,UAAU;IACjB,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,UAAU;IAClB,MAAM,EAAE,UAAU;IAClB,OAAO,EAAE,WAAW;CACrB,CAAC;AAEF;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,OAAO,mBAAoB,SAAQ,YAAY;IACnD,sCAAsC;IAC7B,QAAQ,CAAmB;IACpC,2DAA2D;IAClD,QAAQ,CAAqB;IACtC,+EAA+E;IACtE,WAAW,CAAU;IAE9B,YAAY,OAAmC;QAC7C,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,sBAAsB,CAAC;QAC1D,MAAM,OAAO,GACX,OAAO,CAAC,MAAM,KAAK,SAAS,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS;YACxD,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,IAAI,OAAO,CAAC,IAAI,EAAE;YACnD,CAAC,CAAC,SAAS,CAAC;QAChB,MAAM,IAAI,GAAG;YACX,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS;YACnE,OAAO,CAAC,WAAW,IAAI,SAAS;SACjC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC;QAC9C,MAAM,IAAI,GACR,OAAO,CAAC,QAAQ,KAAK,SAAS;YAC5B,CAAC,CAAC,GAAG,oBAAoB,CAAC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,OAAO,CAAC,QAAQ,eAAe;gBACzF,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACpC,CAAC,CAAC,GAAG,oBAAoB,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACtF,MAAM,OAAO,GAAG,GAAG,OAAO,aAAa,IAAI,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC;QAChG,MAAM,IAAI,GACR,OAAO,CAAC,QAAQ,KAAK,UAAU;YAC7B,CAAC,CAAC,qJAAqJ;YACvJ,CAAC,CAAC,+GAA+G,CAAC;QACtH,KAAK,CAAC,oBAAoB,CAAC,OAAO,CAAC,EAAE;YACnC,IAAI;YACJ,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,GAAG,CAAC,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACpE,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;QAClC,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;QACjC,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS;YAAE,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;QACrE,IAAI,OAAO,CAAC,WAAW;YAAE,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;IAClE,CAAC;CACF;AAED,mEAAmE;AACnE,MAAM,UAAU,kBAAkB,CAAC,OAAe,EAAE,IAAwB;IAC1E,OAAO,IAAI,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AACzC,CAAC;AAED,8EAA8E;AAC9E,6EAA6E;AAC7E,wEAAwE;AACxE,6DAA6D;AAC7D,MAAM,eAAe,GAAG,kBAAkB,CAAC;AAE3C,MAAM,SAAS,GAAG,qCAAqC,CAAC;AACxD,8EAA8E;AAC9E,4EAA4E;AAC5E,0EAA0E;AAC1E,4EAA4E;AAC5E,0EAA0E;AAC1E,4EAA4E;AAC5E,mCAAmC;AACnC,MAAM,MAAM,GAAG,+FAA+F,CAAC;AAC/G,iFAAiF;AACjF,kDAAkD;AAClD,MAAM,aAAa,GAAG,sDAAsD,CAAC;AAC7E,+EAA+E;AAC/E,kEAAkE;AAClE,EAAE;AACF,6EAA6E;AAC7E,+EAA+E;AAC/E,6EAA6E;AAC7E,6EAA6E;AAC7E,qDAAqD;AACrD,MAAM,aAAa,GAAG,8CAA8C,CAAC;AACrE,iFAAiF;AACjF,iEAAiE;AACjE,MAAM,gBAAgB,GACpB,mFAAmF,CAAC;AACtF,kFAAkF;AAClF,6EAA6E;AAC7E,+EAA+E;AAC/E,+EAA+E;AAC/E,uDAAuD;AACvD,MAAM,UAAU,GAAG,IAAI,MAAM,CAC3B;IACE,wCAAwC,EAAE,sCAAsC;IAChF,+BAA+B,EAAE,kCAAkC;IACnE,8CAA8C,EAAE,QAAQ;IACxD,wCAAwC,EAAE,kCAAkC;IAC5E,qBAAqB,EAAE,qCAAqC;IAC5D,2BAA2B,EAAE,wCAAwC;CACtE;KACE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC;KACrB,IAAI,CAAC,GAAG,CAAC,EACZ,GAAG,CACJ,CAAC;AACF,8EAA8E;AAC9E,0EAA0E;AAC1E,wEAAwE;AACxE,2EAA2E;AAC3E,gCAAgC;AAChC,EAAE;AACF,4EAA4E;AAC5E,6EAA6E;AAC7E,yEAAyE;AACzE,iEAAiE;AACjE,6EAA6E;AAC7E,2EAA2E;AAC3E,2EAA2E;AAC3E,iDAAiD;AACjD,MAAM,qBAAqB,GAAG,uDAAuD,CAAC;AACtF,mFAAmF;AACnF,+EAA+E;AAC/E,4EAA4E;AAC5E,wEAAwE;AACxE,6DAA6D;AAC7D,kDAAkD;AAClD,EAAE;AACF,oEAAoE;AACpE,4EAA4E;AAC5E,4EAA4E;AAC5E,6EAA6E;AAC7E,yEAAyE;AACzE,8CAA8C;AAC9C,+EAA+E;AAC/E,8EAA8E;AAC9E,iFAAiF;AACjF,MAAM,eAAe,GAAG,IAAI,MAAM,CAChC,qNAAqN,eAAe,qCAAqC,eAAe,oBAAoB,EAC5S,IAAI,CACL,CAAC;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,mEAAmE;AACnE,MAAM,aAAa,GAAG,iDAAiD,CAAC;AACxE,uEAAuE;AACvE,yEAAyE;AACzE,cAAc;AACd,MAAM,gBAAgB,GAAG,2DAA2D,CAAC;AACrF,0EAA0E;AAC1E,wEAAwE;AACxE,sEAAsE;AACtE,iCAAiC;AACjC,EAAE;AACF,0EAA0E;AAC1E,4EAA4E;AAC5E,2EAA2E;AAC3E,+EAA+E;AAC/E,2EAA2E;AAC3E,wCAAwC;AACxC,MAAM,gBAAgB,GAAG,IAAI,MAAM,CACjC,eAAe,eAAe,qCAAqC,eAAe,wCAAwC,EAC1H,IAAI,CACL,CAAC;AACF,+EAA+E;AAC/E,iFAAiF;AACjF,+EAA+E;AAC/E,yEAAyE;AACzE,MAAM,YAAY,GAChB,qEAAqE,CAAC;AACxE,6EAA6E;AAC7E,6EAA6E;AAC7E,6EAA6E;AAC7E,8EAA8E;AAC9E,oDAAoD;AACpD,EAAE;AACF,8EAA8E;AAC9E,4EAA4E;AAC5E,4EAA4E;AAC5E,+EAA+E;AAC/E,8EAA8E;AAC9E,EAAE;AACF,gEAAgE;AAChE,8EAA8E;AAC9E,yEAAyE;AACzE,iBAAiB;AACjB,EAAE;AACF,wEAAwE;AACxE,0EAA0E;AAC1E,kBAAkB;AAClB,MAAM,gBAAgB,GAAG;IACvB,+DAA+D;IAC/D,mBAAmB;IACnB,gBAAgB;IAChB,uBAAuB;IACvB,iBAAiB;IACjB,mBAAmB,EAAE,sDAAsD;IAC3E,QAAQ,eAAe,qCAAqC,eAAe,EAAE,EAAE,gCAAgC;IAC/G,0BAA0B;IAC1B,UAAU;IACV,QAAQ;IACR,QAAQ;IACR,OAAO;CACR,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACZ,MAAM,iBAAiB,GAAG,IAAI,MAAM,CAAC,QAAQ,gBAAgB,qCAAqC,EAAE,IAAI,CAAC,CAAC;AAC1G,MAAM,iBAAiB,GAAG,IAAI,MAAM,CAAC,QAAQ,gBAAgB,qCAAqC,EAAE,IAAI,CAAC,CAAC;AAC1G,8EAA8E;AAC9E,oEAAoE;AACpE,0EAA0E;AAC1E,MAAM,kBAAkB,GAAG,IAAI,MAAM,CAAC,WAAW,gBAAgB,6CAA6C,EAAE,IAAI,CAAC,CAAC;AAEtH,4EAA4E;AAC5E,4EAA4E;AAC5E,8EAA8E;AAC9E,8EAA8E;AAC9E,4EAA4E;AAC5E,2EAA2E;AAC3E,+EAA+E;AAC/E,qCAAqC;AACrC,MAAM,iBAAiB,GACrB,uGAAuG,CAAC;AAC1G,MAAM,iBAAiB,GACrB,uGAAuG,CAAC;AAC1G,MAAM,YAAY,GAAG,sBAAsB,CAAC;AAC5C,MAAM,YAAY,GAAG,sBAAsB,CAAC;AAE5C,SAAS,gBAAgB,CAAC,KAAgB;IACxC,MAAM,QAAQ,GAAG,KAAK,KAAK,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC;IAC7D,OAAO,CAAC,EAAU,EAAE,MAAc,EAAE,GAAW,EAAE,KAAa,EAAU,EAAE;QACxE,MAAM,SAAS,GAAG,GAAG,CAAC,WAAW,EAAE,KAAK,YAAY,CAAC;QACrD,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE,IAAY,EAAE,EAAE;YAC5D,uEAAuE;YACvE,oEAAoE;YACpE,MAAM,GAAG,GAAG,SAAS;gBACnB,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,oBAAoB,EAAE,eAAe,CAAC;gBACrD,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;YAC3C,OAAO,GAAG,KAAK,GAAG,GAAG,GAAG,KAAK,EAAE,CAAC;QAClC,CAAC,CAAC,CAAC;QACH,OAAO,GAAG,MAAM,GAAG,QAAQ,EAAE,CAAC;IAChC,CAAC,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO,IAAI;SACR,OAAO,CAAC,SAAS,EAAE,cAAc,CAAC;SAClC,OAAO,CAAC,aAAa,EAAE,cAAc,CAAC;SACtC,OAAO,CAAC,aAAa,EAAE,iBAAiB,CAAC;SACzC,OAAO,CACN,gBAAgB,EAChB,CAAC,EAAE,EAAE,MAAc,EAAE,KAAa,EAAE,EAAE,CAAC,GAAG,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,YAAY,EAAE,aAAa,CAAC,EAAE,CAChG;SACA,OAAO,CAAC,UAAU,EAAE,YAAY,CAAC;SACjC,OAAO,CAAC,qBAAqB,EAAE,YAAY,CAAC;SAC5C,OAAO,CAAC,gBAAgB,EAAE,cAAc,CAAC;SACzC,OAAO,CAAC,eAAe,EAAE,cAAc,CAAC;SACxC,OAAO,CAAC,aAAa,EAAE,cAAc,CAAC;SACtC,OAAO,CAAC,gBAAgB,EAAE,cAAc,CAAC;SACzC,OAAO,CAAC,YAAY,EAAE,cAAc,CAAC;SACrC,OAAO,CAAC,iBAAiB,EAAE,gBAAgB,CAAC,GAAG,CAAC,CAAC;SACjD,OAAO,CAAC,iBAAiB,EAAE,gBAAgB,CAAC,GAAG,CAAC,CAAC;SACjD,OAAO,CAAC,iBAAiB,EAAE,gBAAgB,CAAC;SAC5C,OAAO,CAAC,iBAAiB,EAAE,gBAAgB,CAAC;SAC5C,OAAO,CAAC,kBAAkB,EAAE,cAAc,CAAC;SAC3C,OAAO,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;AACnC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,EAAE,GAAG,IAAI,CAAC;AAEnD;;;;;;;;;GASG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAY,EAAE,GAAG,GAAW,yBAAyB;IACxF,MAAM,GAAG,GAAG,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACpE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,yBAAyB,EAAE,GAAG,CAAC,CAAC;IACrD,MAAM,QAAQ,GAAG,aAAa,CAAC,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAC3E,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG;QAAE,OAAO,QAAQ,CAAC;IAC5C,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,eAAe,CAAC;AAClD,CAAC;AAED,sDAAsD;AACtD,MAAM,UAAU,SAAS,CAAC,GAAY;IACpC,IAAI,GAAG,YAAY,KAAK;QAAE,OAAO,GAAG,CAAC,OAAO,CAAC;IAC7C,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;AACrB,CAAC;AAED;;;GAGG;AACH,MAAM,mBAAmB,GAAwB,IAAI,GAAG,CAAC;IACvD,WAAW;IACX,yBAAyB;IACzB,yBAAyB;IACzB,sBAAsB;CACvB,CAAC,CAAC;AAEH,0FAA0F;AAC1F,MAAM,mBAAmB,GAAG,CAAC,CAAC;AAE9B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,MAAM,UAAU,cAAc,CAAC,GAAY;IACzC,IAAI,GAAG,GAAY,GAAG,CAAC;IACvB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,mBAAmB,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC;QACpG,MAAM,CAAC,GAAG,GAA8E,CAAC;QACzF,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QACtD,iEAAiE;QACjE,0CAA0C;QAC1C,IAAI,IAAI,KAAK,YAAY,IAAI,CAAC,CAAC,QAAQ,KAAK,KAAK;YAAE,OAAO,KAAK,CAAC;QAChE,IAAI,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,QAAQ,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QACtE,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;QAC/E,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC;IAChB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,aAAa,CAAC,QAAgB,EAAE,GAAY;IAC1D,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;IAC7B,MAAM,MAAM,GAAG,IAAI,QAAQ,GAAG,CAAC;IAC/B,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,KAAK,EAAE,CAAC;IACtE,MAAM,IAAI,GAAG,GAAG,YAAY,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;IAChE,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IAClC,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;IAC9B,OAAO,IAAI,YAAY,CAAC,oBAAoB,CAAC,OAAO,CAAC,EAAE;QACrD,IAAI;QACJ,KAAK,EAAE,GAAG;QACV,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3C,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACxC,CAAC,CAAC;AACL,CAAC;AAUD;;;;;;;;;GASG;AACH,MAAM,UAAU,UAAU,CAAC,KAAa,EAAE,IAAI,GAAsB,EAAE;IACpE,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC;IAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC;IAC5B,IAAI,KAAK,CAAC,MAAM,IAAI,IAAI,GAAG,IAAI;QAAE,OAAO,GAAG,CAAC;IAC5C,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC;AACvE,CAAC"}
@@ -5,26 +5,43 @@
5
5
  *
6
6
  * Consolidates the duplicated trio in gemini (`images.ts#resolveOutputDir` /
7
7
  * `uniquePath` / `writeImage`) and flightaware (`shared.ts#resolveOutputDir` /
8
- * `writePng`): per-call dir → `<SVC>_OUTPUT_DIR` env → cwd, non-overwriting
8
+ * `writePng`): per-call dir → `<SVC>_OUTPUT_DIR` env → `~/Downloads/<name>`
9
+ * (never the cwd — `/` under Claude Desktop, the user's repo under Claude
10
+ * Code), non-overwriting
9
11
  * filenames, extension derived from the MIME type. The fleet convention (see
10
12
  * the mcp-fleet-builder skill) is that every binary-output tool uses this shape.
11
13
  */
12
14
  import { type EnvSource } from '../config/index.js';
15
+ /** Options for {@link resolveOutputDir}. */
16
+ export interface ResolveOutputDirOptions {
17
+ /** Where to read `envVar` from. Defaults to `process.env`. */
18
+ env?: EnvSource;
19
+ /** Confine the per-call directory to these roots (see below). */
20
+ allowedRoots?: readonly string[];
21
+ /**
22
+ * The server's name, e.g. `'splitwise-mcp'`. When neither the per-call dir
23
+ * nor `envVar` is set, the output goes to `~/Downloads/<name>` (created
24
+ * `0700`). Without it, that case throws a config error naming `envVar`. Must
25
+ * be a single path segment.
26
+ */
27
+ name?: string;
28
+ }
13
29
  /**
14
30
  * Resolve the directory a binary-output tool should write into:
15
- * the per-call argument → the named env var → the current working directory.
31
+ * the per-call argument → the named env var → `~/Downloads/<name>` (when
32
+ * `opts.name` is given) → a config error ({@link McpToolError}) naming the env
33
+ * var. It **never** falls back to the current working directory: that is `/`
34
+ * (unwritable) under Claude Desktop/.mcpb and the user's repo under Claude
35
+ * Code (fleet audit 2026-09, cluster 12 — receipts and images landed there).
16
36
  * `~` and relative paths are expanded ({@link expandPath}) and the directory is
17
37
  * created recursively so the subsequent write can't ENOENT.
18
38
  *
19
39
  * `allowedRoots` (opt-in) confines the **per-call** directory — the value a
20
40
  * tool argument supplies — to those roots, checked through symlinks before
21
- * anything is created. The env var and cwd are operator configuration and are
22
- * not constrained.
41
+ * anything is created. The env var and the `name` fallback are operator
42
+ * configuration and are not constrained.
23
43
  */
24
- export declare function resolveOutputDir(perCall: string | undefined, envVar: string, opts?: {
25
- env?: EnvSource;
26
- allowedRoots?: readonly string[];
27
- }): string;
44
+ export declare function resolveOutputDir(perCall: string | undefined, envVar: string, opts?: ResolveOutputDirOptions): string;
28
45
  /**
29
46
  * A non-overwriting path for `base.ext` in `dir`: the bare name when free,
30
47
  * else `base-2.ext`, `base-3.ext`, … (gemini's numbering). `ext` is passed
@@ -1 +1 @@
1
- {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/fs/output.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,OAAO,EAA0B,KAAK,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAI5E;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,MAAM,EAAE,MAAM,EACd,IAAI,GAAE;IAAE,GAAG,CAAC,EAAE,SAAS,CAAC;IAAC,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAAO,GAC/D,MAAM,CAaR;AAED;;;;;;;;;GASG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAQzE;AAkBD,6CAA6C;AAC7C,MAAM,WAAW,wBAAwB;IACvC,iFAAiF;IACjF,GAAG,EAAE,MAAM,CAAC;IACZ,oCAAoC;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,kEAAkE;IAClE,MAAM,EAAE,MAAM,CAAC;IACf,4EAA4E;IAC5E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,8DAA8D;IAC9D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gFAAgF;IAChF,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,wBAAwB,GAAG,MAAM,CAGxE"}
1
+ {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/fs/output.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAMH,OAAO,EAA0B,KAAK,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAK5E,4CAA4C;AAC5C,MAAM,WAAW,uBAAuB;IACtC,8DAA8D;IAC9D,GAAG,CAAC,EAAE,SAAS,CAAC;IAChB,iEAAiE;IACjE,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC;;;;;OAKG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,MAAM,EAAE,MAAM,EACd,IAAI,GAAE,uBAA4B,GACjC,MAAM,CAaR;AAiBD;;;;;;;;;GASG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAQzE;AAkBD,6CAA6C;AAC7C,MAAM,WAAW,wBAAwB;IACvC,iFAAiF;IACjF,GAAG,EAAE,MAAM,CAAC;IACZ,oCAAoC;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,kEAAkE;IAClE,MAAM,EAAE,MAAM,CAAC;IACf,4EAA4E;IAC5E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,8DAA8D;IAC9D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gFAAgF;IAChF,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,wBAAwB,GAAG,MAAM,CAGxE"}
package/dist/fs/output.js CHANGED
@@ -5,30 +5,38 @@
5
5
  *
6
6
  * Consolidates the duplicated trio in gemini (`images.ts#resolveOutputDir` /
7
7
  * `uniquePath` / `writeImage`) and flightaware (`shared.ts#resolveOutputDir` /
8
- * `writePng`): per-call dir → `<SVC>_OUTPUT_DIR` env → cwd, non-overwriting
8
+ * `writePng`): per-call dir → `<SVC>_OUTPUT_DIR` env → `~/Downloads/<name>`
9
+ * (never the cwd — `/` under Claude Desktop, the user's repo under Claude
10
+ * Code), non-overwriting
9
11
  * filenames, extension derived from the MIME type. The fleet convention (see
10
12
  * the mcp-fleet-builder skill) is that every binary-output tool uses this shape.
11
13
  */
12
14
  import { existsSync, mkdirSync } from 'node:fs';
15
+ import { homedir } from 'node:os';
13
16
  import { join } from 'node:path';
14
17
  import { expandPath, readEnvVar } from '../config/index.js';
18
+ import { McpToolError } from '../errors/index.js';
15
19
  import { assertPathWithinRoots } from './confine.js';
16
20
  import { sanitizeBaseName, writeUniqueFileSync } from './write.js';
17
21
  /**
18
22
  * Resolve the directory a binary-output tool should write into:
19
- * the per-call argument → the named env var → the current working directory.
23
+ * the per-call argument → the named env var → `~/Downloads/<name>` (when
24
+ * `opts.name` is given) → a config error ({@link McpToolError}) naming the env
25
+ * var. It **never** falls back to the current working directory: that is `/`
26
+ * (unwritable) under Claude Desktop/.mcpb and the user's repo under Claude
27
+ * Code (fleet audit 2026-09, cluster 12 — receipts and images landed there).
20
28
  * `~` and relative paths are expanded ({@link expandPath}) and the directory is
21
29
  * created recursively so the subsequent write can't ENOENT.
22
30
  *
23
31
  * `allowedRoots` (opt-in) confines the **per-call** directory — the value a
24
32
  * tool argument supplies — to those roots, checked through symlinks before
25
- * anything is created. The env var and cwd are operator configuration and are
26
- * not constrained.
33
+ * anything is created. The env var and the `name` fallback are operator
34
+ * configuration and are not constrained.
27
35
  */
28
36
  export function resolveOutputDir(perCall, envVar, opts = {}) {
29
37
  const raw = perCall ?? readEnvVar(envVar, opts.env ? { env: opts.env } : {});
30
38
  if (!raw)
31
- return process.cwd();
39
+ return defaultOutputDir(envVar, opts.name);
32
40
  const dir = expandPath(raw);
33
41
  if (perCall !== undefined && opts.allowedRoots) {
34
42
  assertPathWithinRoots(dir, opts.allowedRoots);
@@ -40,6 +48,20 @@ export function resolveOutputDir(perCall, envVar, opts = {}) {
40
48
  mkdirSync(dir, { recursive: true });
41
49
  return dir;
42
50
  }
51
+ /** `~/Downloads/<name>` (created 0700), or a config error naming `envVar`. */
52
+ function defaultOutputDir(envVar, name) {
53
+ if (name === undefined) {
54
+ throw new McpToolError(`No output directory is configured: ${envVar} is not set.`, {
55
+ hint: `Set ${envVar} to a writable directory, or pass an output directory with the call.`,
56
+ });
57
+ }
58
+ if (!name || name === '.' || name === '..' || /[/\\]/.test(name)) {
59
+ throw new TypeError(`resolveOutputDir: name must be a single path segment, got ${JSON.stringify(name)}`);
60
+ }
61
+ const dir = join(homedir(), 'Downloads', name);
62
+ mkdirSync(dir, { recursive: true, mode: 0o700 });
63
+ return dir;
64
+ }
43
65
  /**
44
66
  * A non-overwriting path for `base.ext` in `dir`: the bare name when free,
45
67
  * else `base-2.ext`, `base-3.ext`, … (gemini's numbering). `ext` is passed
@@ -1 +1 @@
1
- {"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/fs/output.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/fs/output.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAkB,MAAM,oBAAoB,CAAC;AAC5E,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAiBnE;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,gBAAgB,CAC9B,OAA2B,EAC3B,MAAc,EACd,IAAI,GAA4B,EAAE;IAElC,MAAM,GAAG,GAAG,OAAO,IAAI,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC7E,IAAI,CAAC,GAAG;QAAE,OAAO,gBAAgB,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IACrD,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;IAC5B,IAAI,OAAO,KAAK,SAAS,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;QAC/C,qBAAqB,CAAC,GAAG,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;QAC9C,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACpC,yEAAyE;QACzE,qBAAqB,CAAC,GAAG,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;QAC9C,OAAO,GAAG,CAAC;IACb,CAAC;IACD,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpC,OAAO,GAAG,CAAC;AACb,CAAC;AAED,8EAA8E;AAC9E,SAAS,gBAAgB,CAAC,MAAc,EAAE,IAAwB;IAChE,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,MAAM,IAAI,YAAY,CAAC,sCAAsC,MAAM,cAAc,EAAE;YACjF,IAAI,EAAE,OAAO,MAAM,sEAAsE;SAC1F,CAAC,CAAC;IACL,CAAC;IACD,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACjE,MAAM,IAAI,SAAS,CAAC,6DAA6D,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC3G,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC;IAC/C,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACjD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,UAAU,CAAC,GAAW,EAAE,IAAY,EAAE,GAAW;IAC/D,MAAM,IAAI,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACpC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,IAAI,GAAG,EAAE,CAAC,CAAC;IAC1C,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACrC,KAAK,IAAI,CAAC,GAAG,CAAC,GAAI,CAAC,EAAE,EAAE,CAAC;QACtB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;QACnD,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;YAAE,OAAO,SAAS,CAAC;IAC/C,CAAC;AACH,CAAC;AAED,mEAAmE;AACnE,MAAM,QAAQ,GAA2B;IACvC,WAAW,EAAE,KAAK;IAClB,YAAY,EAAE,KAAK;IACnB,YAAY,EAAE,MAAM;IACpB,WAAW,EAAE,KAAK;IAClB,YAAY,EAAE,MAAM;IACpB,YAAY,EAAE,MAAM;IACpB,iBAAiB,EAAE,KAAK;IACxB,kBAAkB,EAAE,MAAM;IAC1B,iBAAiB,EAAE,KAAK;IACxB,YAAY,EAAE,KAAK;IACnB,WAAW,EAAE,KAAK;IAClB,iBAAiB,EAAE,KAAK;CACzB,CAAC;AAkBF;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAA8B;IAC9D,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC;IAC7F,OAAO,mBAAmB,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1G,CAAC"}