@chrischall/mcp-utils 0.5.3 → 0.7.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.
- package/README.md +31 -5
- package/dist/auth/index.d.ts +15 -1
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +48 -1
- package/dist/auth/index.js.map +1 -1
- package/dist/dates/index.d.ts +19 -0
- package/dist/dates/index.d.ts.map +1 -0
- package/dist/dates/index.js +43 -0
- package/dist/dates/index.js.map +1 -0
- package/dist/errors/index.d.ts +12 -0
- package/dist/errors/index.d.ts.map +1 -1
- package/dist/errors/index.js +45 -3
- package/dist/errors/index.js.map +1 -1
- package/dist/http/index.d.ts +86 -5
- package/dist/http/index.d.ts.map +1 -1
- package/dist/http/index.js +155 -25
- package/dist/http/index.js.map +1 -1
- package/dist/http/throttle.d.ts +28 -0
- package/dist/http/throttle.d.ts.map +1 -0
- package/dist/http/throttle.js +39 -0
- package/dist/http/throttle.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/response/index.d.ts +13 -1
- package/dist/response/index.d.ts.map +1 -1
- package/dist/response/index.js +31 -2
- package/dist/response/index.js.map +1 -1
- package/dist/session/index.d.ts +14 -0
- package/dist/session/index.d.ts.map +1 -1
- package/dist/session/index.js +65 -8
- package/dist/session/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -65,22 +65,29 @@ the server instance without connecting a transport.
|
|
|
65
65
|
### `response` — tool-result formatting
|
|
66
66
|
|
|
67
67
|
`textResult` / `jsonResult` (alias), `rawTextResult`, `imageResult`,
|
|
68
|
-
`errorResult`, `flattenJsonApi`.
|
|
68
|
+
`errorResult`, `flattenJsonApi`, `deepMapStringField`.
|
|
69
69
|
|
|
70
70
|
```ts
|
|
71
|
-
import { textResult, errorResult, flattenJsonApi } from '@chrischall/mcp-utils';
|
|
71
|
+
import { textResult, errorResult, flattenJsonApi, deepMapStringField } from '@chrischall/mcp-utils';
|
|
72
72
|
|
|
73
73
|
return textResult({ items }); // pretty-printed JSON
|
|
74
74
|
return errorResult('not found'); // { isError: true }
|
|
75
75
|
return textResult(flattenJsonApi(payload)); // collapse JSON:API envelopes
|
|
76
|
+
|
|
77
|
+
// Rewrite a string field throughout a response (e.g. normalize a date format):
|
|
78
|
+
deepMapStringField(payload, 'eventDate', dmyToIso);
|
|
76
79
|
```
|
|
77
80
|
|
|
78
81
|
### `errors` — helpful errors
|
|
79
82
|
|
|
80
83
|
`McpToolError` and its subclasses (`SessionNotAuthenticatedError`,
|
|
81
84
|
`BotWallError`, `RateLimitError`, `UnreachableError`, `ModeMismatchError`),
|
|
82
|
-
plus `createHelpfulError`, `wrapToolError`, `truncateErrorMessage`,
|
|
83
|
-
`messageOf`.
|
|
85
|
+
plus `createHelpfulError`, `wrapToolError`, `truncateErrorMessage`,
|
|
86
|
+
`redactSecrets`, and `messageOf`. `redactSecrets` scrubs `Bearer`/`Basic` auth
|
|
87
|
+
headers, `Cookie`/`Set-Cookie` values (cookie names stay visible), JWTs,
|
|
88
|
+
well-known API-key shapes (`sk-…`, `ghp_…`, `xox?-…`, `AIza…`, `AKIA…`,
|
|
89
|
+
`whsec_…`), and secret-bearing URL query params; `truncateErrorMessage` applies
|
|
90
|
+
it before truncating, and `errorResult` applies it (without truncating). This core module has **no runtime dependencies** — the fetchproxy
|
|
84
91
|
typed-error hierarchy (`Fetchproxy*Error`), the raw `classifyBridgeError` /
|
|
85
92
|
`classifyRowError` re-exports, and the `bridgeErrorInfo` envelope helper live in
|
|
86
93
|
the [`/fetchproxy`](#fetchproxy) subpath instead, so
|
|
@@ -140,7 +147,7 @@ constant memory instead of a 20 MB Buffer.
|
|
|
140
147
|
`createApiClient` plus building blocks: `buildQueryString`, `buildOptionalBody`,
|
|
141
148
|
`formatApiError`, `parseLinkHeader`, `parseCookieJar`, JWT helpers
|
|
142
149
|
(`decodeJwtExp`, `decodeJwtSessionId`, `validateJwtExpiry`), and the
|
|
143
|
-
`UnauthorizedError` / `RateLimitedError` classes.
|
|
150
|
+
`UnauthorizedError` / `RateLimitedError` / `RequestTimeoutError` classes.
|
|
144
151
|
|
|
145
152
|
```ts
|
|
146
153
|
import { createApiClient } from '@chrischall/mcp-utils';
|
|
@@ -150,11 +157,30 @@ const api = createApiClient({
|
|
|
150
157
|
getToken: () => store.currentToken(), // resolved per-request; sync or async
|
|
151
158
|
serviceName: 'Example',
|
|
152
159
|
retry: { count: 1, delayMs: 2000 }, // fleet-wide "retry once after 2s" default
|
|
160
|
+
timeout: 15_000, // abort a hung request, throw RequestTimeoutError
|
|
153
161
|
});
|
|
154
162
|
|
|
155
163
|
const data = await api.get('/v1/things', { query: { page: 2 } });
|
|
156
164
|
```
|
|
157
165
|
|
|
166
|
+
`timeout` (ms) bounds each attempt with an `AbortController`; on expiry it throws
|
|
167
|
+
`RequestTimeoutError` instead of hanging the tool call. A 429 retry gets a fresh
|
|
168
|
+
timeout. Omit it to keep the previous unbounded behavior.
|
|
169
|
+
|
|
170
|
+
### `dates` — date-format converters
|
|
171
|
+
|
|
172
|
+
`isoToDmy`, `dmyToIso`, `isoToCompactTimestamp`. For upstreams that don't speak
|
|
173
|
+
ISO 8601, so a server can keep its surface ISO (`yyyy-MM-dd`) and translate at
|
|
174
|
+
the API boundary. Pair with `deepMapStringField` to normalize a date field
|
|
175
|
+
across a whole response.
|
|
176
|
+
|
|
177
|
+
```ts
|
|
178
|
+
import { dmyToIso, isoToDmy, deepMapStringField } from '@chrischall/mcp-utils';
|
|
179
|
+
|
|
180
|
+
const apiDate = isoToDmy('2025-08-28'); // '28-08-2025' (request)
|
|
181
|
+
deepMapStringField(payload, 'eventDate', dmyToIso); // '28-08-2025' → '2025-08-28' (response)
|
|
182
|
+
```
|
|
183
|
+
|
|
158
184
|
### `zod` — schema atoms
|
|
159
185
|
|
|
160
186
|
Reusable schemas (`PositiveInt`, `NonNegInt`, `NonEmptyString`, `IsoDate`,
|
package/dist/auth/index.d.ts
CHANGED
|
@@ -24,6 +24,18 @@
|
|
|
24
24
|
* (placeholder / `'null'` / `'undefined'` suppression); thrown errors never
|
|
25
25
|
* echo the offending secret value and run upstream bodies through
|
|
26
26
|
* {@link truncateErrorMessage} (redaction + truncation) before surfacing.
|
|
27
|
+
*
|
|
28
|
+
* fetchproxy bridge-down hints are preserved: when the injected bootstrap
|
|
29
|
+
* rejects with a `FetchproxyBridgeDownError` (duck-typed — this core module
|
|
30
|
+
* stays zero-runtime-dep and never imports `@fetchproxy/server` or the
|
|
31
|
+
* `/fetchproxy` subpath), {@link createAuthResolver} surfaces the error's
|
|
32
|
+
* actionable `.hint` verbatim ("make sure a signed-in tab is open… reload
|
|
33
|
+
* the extension…") instead of the generic truncated wrap. This absorbs the
|
|
34
|
+
* `classifyBridgeError(e) === 'bridge_down'` branch the fleet copies of this
|
|
35
|
+
* skeleton hand-rolled, and unblocks the zola / infinitecampus / ofw /
|
|
36
|
+
* creditkarma migrations onto this resolver in a later wave.
|
|
37
|
+
* ({@link resolveAuthPattern} never had the gap — it propagates a configured
|
|
38
|
+
* path's errors unwrapped, so an injected fetchproxy path's hint survives.)
|
|
27
39
|
*/
|
|
28
40
|
import { type EnvSource } from '../config/index.js';
|
|
29
41
|
/** A `@fetchproxy/bootstrap` session blob: declared cookies / storage, by key. */
|
|
@@ -117,7 +129,9 @@ export interface AuthPattern {
|
|
|
117
129
|
* fetchproxy**. Runs the first *provided* resolver in that order (a missing
|
|
118
130
|
* resolver = an unconfigured path). A resolver that throws propagates — a
|
|
119
131
|
* partial-config error (the user's mistake) must surface, not silently fall
|
|
120
|
-
* through.
|
|
132
|
+
* through. Errors propagate *unwrapped*, so an injected fetchproxy path's
|
|
133
|
+
* bridge-down `.hint` survives intact. Throws an actionable error when no
|
|
134
|
+
* path is configured at all.
|
|
121
135
|
*/
|
|
122
136
|
export declare function resolveAuthPattern(pattern: AuthPattern): Promise<PatternResult>;
|
|
123
137
|
/** Options for {@link sessionLoginFlow}. */
|
package/dist/auth/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"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"}
|
package/dist/auth/index.js
CHANGED
|
@@ -24,10 +24,43 @@
|
|
|
24
24
|
* (placeholder / `'null'` / `'undefined'` suppression); thrown errors never
|
|
25
25
|
* echo the offending secret value and run upstream bodies through
|
|
26
26
|
* {@link truncateErrorMessage} (redaction + truncation) before surfacing.
|
|
27
|
+
*
|
|
28
|
+
* fetchproxy bridge-down hints are preserved: when the injected bootstrap
|
|
29
|
+
* rejects with a `FetchproxyBridgeDownError` (duck-typed — this core module
|
|
30
|
+
* stays zero-runtime-dep and never imports `@fetchproxy/server` or the
|
|
31
|
+
* `/fetchproxy` subpath), {@link createAuthResolver} surfaces the error's
|
|
32
|
+
* actionable `.hint` verbatim ("make sure a signed-in tab is open… reload
|
|
33
|
+
* the extension…") instead of the generic truncated wrap. This absorbs the
|
|
34
|
+
* `classifyBridgeError(e) === 'bridge_down'` branch the fleet copies of this
|
|
35
|
+
* skeleton hand-rolled, and unblocks the zola / infinitecampus / ofw /
|
|
36
|
+
* creditkarma migrations onto this resolver in a later wave.
|
|
37
|
+
* ({@link resolveAuthPattern} never had the gap — it propagates a configured
|
|
38
|
+
* path's errors unwrapped, so an injected fetchproxy path's hint survives.)
|
|
27
39
|
*/
|
|
28
40
|
import { readEnvVar, parseBoolEnv } from '../config/index.js';
|
|
29
41
|
import { truncateErrorMessage, SessionNotAuthenticatedError, createHelpfulError, } from '../errors/index.js';
|
|
30
42
|
import { parseCookieJar } from '../http/index.js';
|
|
43
|
+
/**
|
|
44
|
+
* Duck-typed `bridge_down` detection — mirrors `classifyBridgeError(e) ===
|
|
45
|
+
* 'bridge_down'` from the `/fetchproxy` subpath WITHOUT importing
|
|
46
|
+
* `@fetchproxy/server` (this core module must stay zero-runtime-dep).
|
|
47
|
+
* `classifyBridgeError`'s `'bridge_down'` arm is exactly
|
|
48
|
+
* `err instanceof FetchproxyBridgeDownError`, and that class's constructor
|
|
49
|
+
* unconditionally sets `name = 'FetchproxyBridgeDownError'` and a non-empty
|
|
50
|
+
* string `hint` — so the (name, string-hint) pair is a faithful stand-in for
|
|
51
|
+
* the `instanceof`, and unlike `instanceof` it stays correct when the dep
|
|
52
|
+
* tree carries a duplicated copy of `@fetchproxy/server`.
|
|
53
|
+
*
|
|
54
|
+
* Returns the actionable `.hint` when `err` is bridge-down, else `undefined`.
|
|
55
|
+
*/
|
|
56
|
+
function bridgeDownHintOf(err) {
|
|
57
|
+
if (err instanceof Error && err.name === 'FetchproxyBridgeDownError') {
|
|
58
|
+
const hint = err.hint;
|
|
59
|
+
if (typeof hint === 'string' && hint.length > 0)
|
|
60
|
+
return hint;
|
|
61
|
+
}
|
|
62
|
+
return undefined;
|
|
63
|
+
}
|
|
31
64
|
/**
|
|
32
65
|
* Build the canonical **three-path** auth resolver:
|
|
33
66
|
*
|
|
@@ -60,6 +93,18 @@ export function createAuthResolver(opts) {
|
|
|
60
93
|
session = await bootstrap(bootstrapOptions);
|
|
61
94
|
}
|
|
62
95
|
catch (e) {
|
|
96
|
+
// Bridge-down gets first-class treatment. A `FetchproxyBridgeDownError`
|
|
97
|
+
// only escapes bootstrap() after the server's one-shot lazy-revive
|
|
98
|
+
// retry also failed — the extension's service worker is genuinely down
|
|
99
|
+
// and the user needs to wake it. Its `.hint` is the actionable copy
|
|
100
|
+
// the fleet (zola / IC / ofw / honeybook) hand-rolled this branch to
|
|
101
|
+
// preserve; surface it verbatim (library-authored, not an untrusted
|
|
102
|
+
// upstream body — so no truncation that could clip the guidance).
|
|
103
|
+
const bridgeHint = bridgeDownHintOf(e);
|
|
104
|
+
if (bridgeHint !== undefined) {
|
|
105
|
+
throw createHelpfulError(`Auth: no ${envVar} set, and the fetchproxy bridge is down ` +
|
|
106
|
+
`(extension service worker unreachable). ${bridgeHint}`, { hint: bridgeHint });
|
|
107
|
+
}
|
|
63
108
|
// Surface the fallback failure but point back at the env-var escape
|
|
64
109
|
// hatch. Redact + truncate the underlying message.
|
|
65
110
|
throw createHelpfulError(`Auth: no ${envVar} set, and fetchproxy fallback failed: ${truncateErrorMessage(messageOf(e))}`, { hint: `Set ${envVar}, or sign in in your browser and retry.` });
|
|
@@ -82,7 +127,9 @@ export function createAuthResolver(opts) {
|
|
|
82
127
|
* fetchproxy**. Runs the first *provided* resolver in that order (a missing
|
|
83
128
|
* resolver = an unconfigured path). A resolver that throws propagates — a
|
|
84
129
|
* partial-config error (the user's mistake) must surface, not silently fall
|
|
85
|
-
* through.
|
|
130
|
+
* through. Errors propagate *unwrapped*, so an injected fetchproxy path's
|
|
131
|
+
* bridge-down `.hint` survives intact. Throws an actionable error when no
|
|
132
|
+
* path is configured at all.
|
|
86
133
|
*/
|
|
87
134
|
export async function resolveAuthPattern(pattern) {
|
|
88
135
|
const ordered = [
|
package/dist/auth/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Date-format converters for upstreams that don't speak ISO 8601, so an MCP can
|
|
3
|
+
* keep its surface ISO (`yyyy-MM-dd`) and translate at the API boundary.
|
|
4
|
+
*
|
|
5
|
+
* Pair with {@link deepMapStringField} (from the `response` module) to rewrite a
|
|
6
|
+
* date field throughout a response, e.g.
|
|
7
|
+
* `deepMapStringField(data, 'eventDate', dmyToIso)`.
|
|
8
|
+
*/
|
|
9
|
+
/** ISO `yyyy-MM-dd` → `dd-MM-yyyy`. Non-ISO input is trimmed and passed through. */
|
|
10
|
+
export declare function isoToDmy(date: string): string;
|
|
11
|
+
/** `dd-MM-yyyy` → ISO `yyyy-MM-dd`. Non-matching input is trimmed and passed through. */
|
|
12
|
+
export declare function dmyToIso(date: string): string;
|
|
13
|
+
/**
|
|
14
|
+
* ISO `yyyy-MM-dd` (or `yyyy-MM-ddTHH:mm[:ss]`) → a compact `yyyyMMddHHmmss`
|
|
15
|
+
* stamp. A bare date gets `000000`; an already-14-digit value passes through;
|
|
16
|
+
* anything else is trimmed and passed through.
|
|
17
|
+
*/
|
|
18
|
+
export declare function isoToCompactTimestamp(value: string): string;
|
|
19
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/dates/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAYH,oFAAoF;AACpF,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAG7C;AAED,yFAAyF;AACzF,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAG7C;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAO3D"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Date-format converters for upstreams that don't speak ISO 8601, so an MCP can
|
|
3
|
+
* keep its surface ISO (`yyyy-MM-dd`) and translate at the API boundary.
|
|
4
|
+
*
|
|
5
|
+
* Pair with {@link deepMapStringField} (from the `response` module) to rewrite a
|
|
6
|
+
* date field throughout a response, e.g.
|
|
7
|
+
* `deepMapStringField(data, 'eventDate', dmyToIso)`.
|
|
8
|
+
*/
|
|
9
|
+
// These are pure *lexical* reformats — no Date/Intl on purpose. `new Date('2025-08-28')`
|
|
10
|
+
// parses as UTC midnight, so reading it back with local getters shifts the day in any
|
|
11
|
+
// behind-UTC zone (the classic date-only off-by-one), and Intl can't emit dd-MM-yyyy /
|
|
12
|
+
// yyyyMMddHHmmss anyway. Reformatting the digits is timezone-safe and dependency-free.
|
|
13
|
+
// Inputs that don't match a known shape (incl. timezone-aware ones) pass through; we don't
|
|
14
|
+
// validate the calendar — the upstream API is the source of truth for that.
|
|
15
|
+
const ISO_DATE = /^(\d{4})-(\d{2})-(\d{2})$/;
|
|
16
|
+
const DMY_DATE = /^(\d{2})-(\d{2})-(\d{4})$/;
|
|
17
|
+
const ISO_DATETIME = /^(\d{4})-(\d{2})-(\d{2})[T ](\d{2}):(\d{2})(?::(\d{2}))?$/;
|
|
18
|
+
/** ISO `yyyy-MM-dd` → `dd-MM-yyyy`. Non-ISO input is trimmed and passed through. */
|
|
19
|
+
export function isoToDmy(date) {
|
|
20
|
+
const m = ISO_DATE.exec(date.trim());
|
|
21
|
+
return m ? `${m[3]}-${m[2]}-${m[1]}` : date.trim();
|
|
22
|
+
}
|
|
23
|
+
/** `dd-MM-yyyy` → ISO `yyyy-MM-dd`. Non-matching input is trimmed and passed through. */
|
|
24
|
+
export function dmyToIso(date) {
|
|
25
|
+
const m = DMY_DATE.exec(date.trim());
|
|
26
|
+
return m ? `${m[3]}-${m[2]}-${m[1]}` : date.trim();
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* ISO `yyyy-MM-dd` (or `yyyy-MM-ddTHH:mm[:ss]`) → a compact `yyyyMMddHHmmss`
|
|
30
|
+
* stamp. A bare date gets `000000`; an already-14-digit value passes through;
|
|
31
|
+
* anything else is trimmed and passed through.
|
|
32
|
+
*/
|
|
33
|
+
export function isoToCompactTimestamp(value) {
|
|
34
|
+
const v = value.trim();
|
|
35
|
+
const d = ISO_DATE.exec(v);
|
|
36
|
+
if (d)
|
|
37
|
+
return `${d[1]}${d[2]}${d[3]}000000`;
|
|
38
|
+
const dt = ISO_DATETIME.exec(v);
|
|
39
|
+
if (dt)
|
|
40
|
+
return `${dt[1]}${dt[2]}${dt[3]}${dt[4]}${dt[5]}${dt[6] ?? '00'}`;
|
|
41
|
+
return v;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/dates/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,yFAAyF;AACzF,sFAAsF;AACtF,uFAAuF;AACvF,uFAAuF;AACvF,2FAA2F;AAC3F,4EAA4E;AAC5E,MAAM,QAAQ,GAAG,2BAA2B,CAAC;AAC7C,MAAM,QAAQ,GAAG,2BAA2B,CAAC;AAC7C,MAAM,YAAY,GAAG,2DAA2D,CAAC;AAEjF,oFAAoF;AACpF,MAAM,UAAU,QAAQ,CAAC,IAAY;IACnC,MAAM,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IACrC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;AACrD,CAAC;AAED,yFAAyF;AACzF,MAAM,UAAU,QAAQ,CAAC,IAAY;IACnC,MAAM,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IACrC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;AACrD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,KAAa;IACjD,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IACvB,MAAM,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC3B,IAAI,CAAC;QAAE,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IAC5C,MAAM,EAAE,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAChC,IAAI,EAAE;QAAE,OAAO,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;IAC1E,OAAO,CAAC,CAAC;AACX,CAAC"}
|
package/dist/errors/index.d.ts
CHANGED
|
@@ -69,6 +69,18 @@ export declare class ModeMismatchError extends McpToolError {
|
|
|
69
69
|
export declare function createHelpfulError(message: string, opts?: {
|
|
70
70
|
hint?: string;
|
|
71
71
|
}): McpToolError;
|
|
72
|
+
/**
|
|
73
|
+
* Redact secrets that commonly leak into upstream error bodies before the text
|
|
74
|
+
* is surfaced to a client: `Bearer <token>` / `Authorization: Basic <…>` headers,
|
|
75
|
+
* `Cookie:` / `Set-Cookie:` header values (cookie names stay visible), standalone
|
|
76
|
+
* JWTs, well-known API-key shapes (OpenAI/Anthropic `sk-…`, GitHub `ghp_…`,
|
|
77
|
+
* Slack `xox?-…`, Google `AIza…`, AWS `AKIA…`, `whsec_…`), and secret-bearing
|
|
78
|
+
* URL query params (`access_token`, `api_key`, `token`, `key`, `sig`, …).
|
|
79
|
+
*
|
|
80
|
+
* Exported so fleet repos can redact custom strings (log lines, debug payloads)
|
|
81
|
+
* without taking on {@link truncateErrorMessage}'s length cap.
|
|
82
|
+
*/
|
|
83
|
+
export declare function redactSecrets(text: string): string;
|
|
72
84
|
/**
|
|
73
85
|
* Redact secrets, then cap an (upstream) error string at `max` characters,
|
|
74
86
|
* appending a `… [truncated]` marker when clipped.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/errors/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAQH,qFAAqF;AACrF,eAAO,MAAM,8BAA8B,KAAK,CAAC;AAEjD,+EAA+E;AAC/E,eAAO,MAAM,yBAAyB,MAAM,CAAC;AAE7C;;;;GAIG;AACH,qBAAa,YAAa,SAAQ,KAAK;IACrC,qDAAqD;IACrD,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;gBAEX,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;CAOvE;AAED;;;GAGG;AACH,qBAAa,4BAA6B,SAAQ,YAAY;gBAChD,OAAO,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM;CAUlD;AAED;;;;;GAKG;AACH,qBAAa,YAAa,SAAQ,YAAY;IAC5C,wEAAwE;IACxE,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;gBAEvB,IAAI,EAAE,MAAM,EAAE,iBAAiB,GAAE,MAAuC;CASrF;AAED,uEAAuE;AACvE,qBAAa,cAAe,SAAQ,YAAY;IAC9C,8DAA8D;IAC9D,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;gBAExB,OAAO,EAAE,MAAM,EAAE,iBAAiB,CAAC,EAAE,MAAM;CAOxD;AAED,kFAAkF;AAClF,qBAAa,gBAAiB,SAAQ,YAAY;IAChD,mDAAmD;IACnD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;gBAEb,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;CAQ7C;AAED;;;GAGG;AACH,qBAAa,iBAAkB,SAAQ,YAAY;IAE/C,QAAQ,CAAC,WAAW,EAAE,MAAM;IAC5B,QAAQ,CAAC,YAAY,EAAE,MAAM;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM;gBAFf,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM;CAS3B;AAED,mEAAmE;AACnE,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,YAAY,CAE1F;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/errors/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAQH,qFAAqF;AACrF,eAAO,MAAM,8BAA8B,KAAK,CAAC;AAEjD,+EAA+E;AAC/E,eAAO,MAAM,yBAAyB,MAAM,CAAC;AAE7C;;;;GAIG;AACH,qBAAa,YAAa,SAAQ,KAAK;IACrC,qDAAqD;IACrD,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;gBAEX,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;CAOvE;AAED;;;GAGG;AACH,qBAAa,4BAA6B,SAAQ,YAAY;gBAChD,OAAO,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM;CAUlD;AAED;;;;;GAKG;AACH,qBAAa,YAAa,SAAQ,YAAY;IAC5C,wEAAwE;IACxE,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;gBAEvB,IAAI,EAAE,MAAM,EAAE,iBAAiB,GAAE,MAAuC;CASrF;AAED,uEAAuE;AACvE,qBAAa,cAAe,SAAQ,YAAY;IAC9C,8DAA8D;IAC9D,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;gBAExB,OAAO,EAAE,MAAM,EAAE,iBAAiB,CAAC,EAAE,MAAM;CAOxD;AAED,kFAAkF;AAClF,qBAAa,gBAAiB,SAAQ,YAAY;IAChD,mDAAmD;IACnD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;gBAEb,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;CAQ7C;AAED;;;GAGG;AACH,qBAAa,iBAAkB,SAAQ,YAAY;IAE/C,QAAQ,CAAC,WAAW,EAAE,MAAM;IAC5B,QAAQ,CAAC,YAAY,EAAE,MAAM;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM;gBAFf,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM;CAS3B;AAED,mEAAmE;AACnE,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,YAAY,CAE1F;AAuCD;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAYlD;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,GAAE,MAAkC,GAAG,MAAM,CAKlG;AAED,sDAAsD;AACtD,wBAAgB,SAAS,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAG9C;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,GAAG,YAAY,CAM1E"}
|
package/dist/errors/index.js
CHANGED
|
@@ -113,12 +113,54 @@ export function createHelpfulError(message, opts) {
|
|
|
113
113
|
const BEARER_RE = /(bearer\s+)[A-Za-z0-9._~+/=-]{8,}/gi;
|
|
114
114
|
// A JWT-shaped triple (header.payload.signature), each segment base64url-ish.
|
|
115
115
|
const JWT_RE = /\b[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{8,}\b/g;
|
|
116
|
+
// `Authorization: Basic <base64 credentials>` — anchored on the full header name
|
|
117
|
+
// so prose like "basic principles" never matches.
|
|
118
|
+
const BASIC_AUTH_RE = /(authorization\s*:\s*basic\s+)[A-Za-z0-9+/=_-]{6,}/gi;
|
|
119
|
+
// `Set-Cookie: name=value; Path=/; …` — redact the cookie VALUE only; the name
|
|
120
|
+
// and the (non-secret) attributes stay visible for debuggability.
|
|
121
|
+
const SET_COOKIE_RE = /(\bset-cookie\s*:\s*)([^=;,\s]+)=[^;,\s]*/gi;
|
|
122
|
+
// `Cookie: a=1; b=2` — redact every pair's value, keep the names. The lookbehind
|
|
123
|
+
// keeps this from re-matching the `Cookie` inside `Set-Cookie:`.
|
|
124
|
+
const COOKIE_HEADER_RE = /((?<!set-)\bcookie\s*:\s*)((?:[^=;,\s]+=[^;,\s]*)(?:;\s*[^=;,\s]+=[^;,\s]*)*)/gi;
|
|
125
|
+
// Well-known API-key shapes as standalone tokens, each anchored to its documented
|
|
126
|
+
// prefix + length/charset so ordinary prose (short hex ids, version strings,
|
|
127
|
+
// UUIDs) never matches. Charsets containing `-` (a non-word character) can end
|
|
128
|
+
// on it, where a trailing `\b` has nothing to anchor on — those patterns carry
|
|
129
|
+
// a negative lookahead over their own charset instead.
|
|
130
|
+
const API_KEY_RE = new RegExp([
|
|
131
|
+
'sk-[A-Za-z0-9_-]{20,}(?![A-Za-z0-9_-])', // OpenAI / Anthropic (incl. sk-ant-…)
|
|
132
|
+
'gh[pousr]_[A-Za-z0-9]{36,}\\b', // GitHub ghp_/gho_/ghu_/ghs_/ghr_
|
|
133
|
+
'xox[baprs]-[A-Za-z0-9-]{10,}(?![A-Za-z0-9-])', // Slack
|
|
134
|
+
'AIza[0-9A-Za-z_-]{35}(?![0-9A-Za-z_-])', // Google API key (39 chars total)
|
|
135
|
+
'AKIA[0-9A-Z]{16}\\b', // AWS access key id (20 chars total)
|
|
136
|
+
'whsec_[A-Za-z0-9]{16,}\\b', // webhook signing secret (Stripe-style)
|
|
137
|
+
]
|
|
138
|
+
.map((p) => `\\b${p}`)
|
|
139
|
+
.join('|'), 'g');
|
|
140
|
+
// Secret-bearing query params — the value after `=` up to `&`/`#`/quote/space/end.
|
|
141
|
+
// Anchored on `?`/`&` so plain prose like `key=primary` (no URL context) never
|
|
142
|
+
// matches; that constraint is what makes short names like `key`/`sig` safe.
|
|
143
|
+
const QUERY_SECRET_RE = /([?&](?:access_token|refresh_token|client_secret|api_?key|signature|token|key|sig)=)[^&#\s"'<>`]+/gi;
|
|
116
144
|
/**
|
|
117
145
|
* Redact secrets that commonly leak into upstream error bodies before the text
|
|
118
|
-
* is surfaced to a client: `Bearer <token>`
|
|
146
|
+
* is surfaced to a client: `Bearer <token>` / `Authorization: Basic <…>` headers,
|
|
147
|
+
* `Cookie:` / `Set-Cookie:` header values (cookie names stay visible), standalone
|
|
148
|
+
* JWTs, well-known API-key shapes (OpenAI/Anthropic `sk-…`, GitHub `ghp_…`,
|
|
149
|
+
* Slack `xox?-…`, Google `AIza…`, AWS `AKIA…`, `whsec_…`), and secret-bearing
|
|
150
|
+
* URL query params (`access_token`, `api_key`, `token`, `key`, `sig`, …).
|
|
151
|
+
*
|
|
152
|
+
* Exported so fleet repos can redact custom strings (log lines, debug payloads)
|
|
153
|
+
* without taking on {@link truncateErrorMessage}'s length cap.
|
|
119
154
|
*/
|
|
120
|
-
function redactSecrets(text) {
|
|
121
|
-
return text
|
|
155
|
+
export function redactSecrets(text) {
|
|
156
|
+
return text
|
|
157
|
+
.replace(BEARER_RE, '$1[REDACTED]')
|
|
158
|
+
.replace(BASIC_AUTH_RE, '$1[REDACTED]')
|
|
159
|
+
.replace(SET_COOKIE_RE, '$1$2=[REDACTED]')
|
|
160
|
+
.replace(COOKIE_HEADER_RE, (_m, prefix, pairs) => `${prefix}${pairs.replace(/=[^;,\s]*/g, '=[REDACTED]')}`)
|
|
161
|
+
.replace(API_KEY_RE, '[REDACTED]')
|
|
162
|
+
.replace(QUERY_SECRET_RE, '$1[REDACTED]')
|
|
163
|
+
.replace(JWT_RE, '[REDACTED]');
|
|
122
164
|
}
|
|
123
165
|
/**
|
|
124
166
|
* Redact secrets, then cap an (upstream) error string at `max` characters,
|
package/dist/errors/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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;AAE7C;;;;GAIG;AACH,MAAM,OAAO,YAAa,SAAQ,KAAK;IACrC,qDAAqD;IAC5C,IAAI,CAAU;IAEvB,YAAY,OAAe,EAAE,IAAyC;QACpE,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,8DAA8D;QAC9D,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACpD,CAAC;CACF;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,CAChB,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;IAEnC,YAAY,IAAY,EAAE,oBAA4B,8BAA8B;QAClF,MAAM,IAAI,GAAG,uCAAuC,iBAAiB,wGAAwG,CAAC;QAC9K,KAAK,CACH,uCAAuC,IAAI,4DAA4D,IAAI,EAAE,EAC7G,EAAE,IAAI,EAAE,CACT,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;QAC3B,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;IAC7C,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,CAAC,CAAC;QACnE,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,mDAAmD;IAC1C,MAAM,CAAU;IAEzB,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;SACtE,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;QAC/B,IAAI,MAAM,KAAK,SAAS;YAAE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACjD,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,OAAO,iBAAkB,SAAQ,YAAY;IAEtC;IACA;IACA;IAHX,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;QARO,gBAAW,GAAX,WAAW,CAAQ;QACnB,iBAAY,GAAZ,YAAY,CAAQ;QACpB,YAAO,GAAP,OAAO,CAAQ;QAOxB,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,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,MAAM,SAAS,GAAG,qCAAqC,CAAC;AACxD,8EAA8E;AAC9E,MAAM,MAAM,GAAG,gEAAgE,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/errors/index.ts"],"names":[],"mappings":"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"}
|
package/dist/http/index.d.ts
CHANGED
|
@@ -16,12 +16,20 @@
|
|
|
16
16
|
* - {@link createApiClient} never embeds the token in a thrown message; a 401
|
|
17
17
|
* yields a fixed "unauthorized" string, not the credential.
|
|
18
18
|
*/
|
|
19
|
-
|
|
19
|
+
export * from './throttle.js';
|
|
20
|
+
/** Retry policy for transient responses (HTTP 429 by default). */
|
|
20
21
|
export interface RetryPolicy {
|
|
21
22
|
/** Number of retries after the initial attempt. The fleet default is 1. */
|
|
22
23
|
count: number;
|
|
23
24
|
/** Delay before each retry, in milliseconds. The fleet default is 2000. */
|
|
24
25
|
delayMs: number;
|
|
26
|
+
/**
|
|
27
|
+
* Statuses that trigger a retry. Defaults to `[429]` — the historical
|
|
28
|
+
* fleet-wide behavior. Add transient 5xx codes (e.g. `[429, 500, 502, 503,
|
|
29
|
+
* 504]`) for upstreams that flake; an exhausted non-429 retried status
|
|
30
|
+
* surfaces through the normal non-2xx path (an {@link ApiError}).
|
|
31
|
+
*/
|
|
32
|
+
statuses?: number[];
|
|
25
33
|
}
|
|
26
34
|
/** Options for {@link createApiClient}. */
|
|
27
35
|
/**
|
|
@@ -46,6 +54,16 @@ export interface ApiClientOptions {
|
|
|
46
54
|
* Optional when {@link ApiClientOptions.tokenManager} is provided.
|
|
47
55
|
*/
|
|
48
56
|
getToken?: () => string | undefined | Promise<string | undefined>;
|
|
57
|
+
/**
|
|
58
|
+
* Send the token in this named request header instead of
|
|
59
|
+
* `Authorization: Bearer <token>`. The raw token is sent verbatim — no
|
|
60
|
+
* `Bearer ` prefix (e.g. `tokenHeader: 'x-goog-api-key'` /
|
|
61
|
+
* `'x-auth-token'` / `'x-api-key'`). Unset keeps the default
|
|
62
|
+
* `Authorization: Bearer` behavior. Applies to both
|
|
63
|
+
* {@link ApiClientOptions.getToken} and
|
|
64
|
+
* {@link ApiClientOptions.tokenManager} tokens.
|
|
65
|
+
*/
|
|
66
|
+
tokenHeader?: string;
|
|
49
67
|
/**
|
|
50
68
|
* A reactive token source (e.g. `TokenManager`). When set, every request is
|
|
51
69
|
* routed through {@link ReactiveTokenSource.withAuth} — proactive refresh +
|
|
@@ -81,6 +99,13 @@ export interface ApiClientOptions {
|
|
|
81
99
|
fetchImpl?: typeof fetch;
|
|
82
100
|
/** Injectable sleep (for tests). Defaults to `setTimeout`. */
|
|
83
101
|
sleep?: (ms: number) => Promise<void>;
|
|
102
|
+
/**
|
|
103
|
+
* Per-attempt request timeout in milliseconds. When set (> 0), each fetch is
|
|
104
|
+
* bounded by an {@link AbortController}; on expiry it throws a
|
|
105
|
+
* {@link RequestTimeoutError} instead of hanging until the host kills the
|
|
106
|
+
* tool call. A 429 retry gets a fresh timeout. Omit/0 to disable (default).
|
|
107
|
+
*/
|
|
108
|
+
timeout?: number;
|
|
84
109
|
}
|
|
85
110
|
/** A request body and/or extra headers for a single call. */
|
|
86
111
|
export interface RequestOptions {
|
|
@@ -118,6 +143,24 @@ export declare class RateLimitedError extends Error {
|
|
|
118
143
|
readonly status = 429;
|
|
119
144
|
constructor(service: string);
|
|
120
145
|
}
|
|
146
|
+
/** Thrown when a request exceeds {@link ApiClientOptions.timeout}. */
|
|
147
|
+
export declare class RequestTimeoutError extends Error {
|
|
148
|
+
readonly timeoutMs: number;
|
|
149
|
+
constructor(service: string, timeoutMs: number);
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Thrown by {@link ApiClient.fetchJson} / {@link ApiClient.fetchHtml} for a
|
|
153
|
+
* non-2xx response that isn't a 401/429 (those map to
|
|
154
|
+
* {@link UnauthorizedError} / {@link RateLimitedError}). The message is exactly
|
|
155
|
+
* the redacted, truncated {@link formatApiError} string the client has always
|
|
156
|
+
* thrown — this class only adds the `status` so callers can branch
|
|
157
|
+
* (`err instanceof ApiError && err.status === 404`) instead of regexing the
|
|
158
|
+
* message.
|
|
159
|
+
*/
|
|
160
|
+
export declare class ApiError extends Error {
|
|
161
|
+
readonly status: number;
|
|
162
|
+
constructor(status: number, message: string);
|
|
163
|
+
}
|
|
121
164
|
/**
|
|
122
165
|
* Build a bearer-auth fetch client with one-shot 429 retry, 401 mapping, 204 /
|
|
123
166
|
* empty-body handling, and redacted error formatting.
|
|
@@ -186,15 +229,19 @@ export interface ParsedLinkHeader {
|
|
|
186
229
|
* Consolidates canvas's pagination Link parser.
|
|
187
230
|
*/
|
|
188
231
|
export declare function parseLinkHeader(header: string | null | undefined): ParsedLinkHeader;
|
|
189
|
-
/**
|
|
190
|
-
|
|
232
|
+
/**
|
|
233
|
+
* A parsed Set-Cookie jar: deduplicated name→value plus a ready `Cookie`
|
|
234
|
+
* header. (Renamed from `CookieJar` to free that name for the stateful
|
|
235
|
+
* {@link CookieJar} class; no fleet consumer imported the type.)
|
|
236
|
+
*/
|
|
237
|
+
export interface ParsedCookieJar {
|
|
191
238
|
/** Surviving cookies, name → value (last value wins, deletions removed). */
|
|
192
239
|
cookies: Record<string, string>;
|
|
193
240
|
/** Pre-joined `name=value; name2=value2` string for the `Cookie` request header. */
|
|
194
241
|
cookieHeader: string;
|
|
195
242
|
}
|
|
196
243
|
/**
|
|
197
|
-
* Parse `Set-Cookie` headers into a deduplicated {@link
|
|
244
|
+
* Parse `Set-Cookie` headers into a deduplicated {@link ParsedCookieJar}.
|
|
198
245
|
*
|
|
199
246
|
* Login responses commonly send deletion markers (`Max-Age=0` or an epoch
|
|
200
247
|
* `Expires`) alongside real cookies; forwarding both the delete and set form of
|
|
@@ -209,7 +256,41 @@ export interface CookieJar {
|
|
|
209
256
|
*
|
|
210
257
|
* Consolidates the IC/signupgenius cookie-jar logic.
|
|
211
258
|
*/
|
|
212
|
-
export declare function parseCookieJar(setCookieHeaders: string[] | string | null | undefined):
|
|
259
|
+
export declare function parseCookieJar(setCookieHeaders: string[] | string | null | undefined): ParsedCookieJar;
|
|
260
|
+
/**
|
|
261
|
+
* Anything {@link CookieJar.absorb} can read `Set-Cookie`s from: the array from
|
|
262
|
+
* `Headers.getSetCookie()`, a single (possibly comma-joined) header string, or
|
|
263
|
+
* a `Headers`-like object (prefers `getSetCookie()`, falls back to splitting
|
|
264
|
+
* `get('set-cookie')` safely around `Expires` commas).
|
|
265
|
+
*/
|
|
266
|
+
export type SetCookieSource = string[] | string | null | undefined | {
|
|
267
|
+
getSetCookie?: () => string[];
|
|
268
|
+
get(name: string): string | null;
|
|
269
|
+
};
|
|
270
|
+
/**
|
|
271
|
+
* Stateful cookie jar for multi-step session logins (login page → CSRF prime →
|
|
272
|
+
* credential POST → API calls), built on the {@link parseCookieJar} semantics.
|
|
273
|
+
*
|
|
274
|
+
* Consolidates the five drifted hand-rolled jars across
|
|
275
|
+
* artsonia/canvas-parent/evite/signupgenius/skylight:
|
|
276
|
+
* - `absorb` merges each response's `Set-Cookie`s into the jar — later values
|
|
277
|
+
* override earlier ones by name, and deletion markers (`Max-Age <= 0` or a
|
|
278
|
+
* pre-2000 `Expires`, both comma- and dash-format epochs) **remove** the
|
|
279
|
+
* name from the jar,
|
|
280
|
+
* - empty-value non-deletion cookies are ignored (an existing value survives),
|
|
281
|
+
* - `header()` renders the `Cookie` request-header value in insertion order.
|
|
282
|
+
*/
|
|
283
|
+
export declare class CookieJar {
|
|
284
|
+
private readonly jar;
|
|
285
|
+
/** Merge `Set-Cookie`s into the jar (later wins; deletion markers remove). */
|
|
286
|
+
absorb(setCookies: SetCookieSource): void;
|
|
287
|
+
/** The current value of a cookie, or `undefined` when absent/deleted. */
|
|
288
|
+
get(name: string): string | undefined;
|
|
289
|
+
/** Render the `Cookie` request-header value: `name=value; name2=value2`. */
|
|
290
|
+
header(): string;
|
|
291
|
+
/** Number of cookies currently in the jar. */
|
|
292
|
+
get size(): number;
|
|
293
|
+
}
|
|
213
294
|
/**
|
|
214
295
|
* Decode a JWT's `exp` claim (seconds since epoch). Throws when the structure is
|
|
215
296
|
* invalid or `exp` is missing/non-numeric — the strict variant zola uses for the
|
package/dist/http/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/http/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/http/index.ts"],"names":[],"mappings":"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"}
|