@vybestack/llxprt-code-auth 0.11.0 → 0.12.0-nightly.260910.2aac6841e
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/dist/src/index.d.ts +3 -2
- package/dist/src/index.js +2 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/mcp-auth-provider-type.d.ts +18 -0
- package/dist/src/mcp-auth-provider-type.js +20 -0
- package/dist/src/mcp-auth-provider-type.js.map +1 -0
- package/dist/src/oauth-ui-events.d.ts +23 -1
- package/dist/src/proxy/proxy-payload-schemas.d.ts +130 -0
- package/dist/src/proxy/proxy-payload-schemas.js +68 -0
- package/dist/src/proxy/proxy-payload-schemas.js.map +1 -0
- package/dist/src/proxy/proxy-provider-key-storage.js +5 -3
- package/dist/src/proxy/proxy-provider-key-storage.js.map +1 -1
- package/dist/src/proxy/proxy-socket-client.d.ts +2 -7
- package/dist/src/proxy/proxy-socket-client.js +13 -23
- package/dist/src/proxy/proxy-socket-client.js.map +1 -1
- package/dist/src/proxy/proxy-token-store.js +13 -13
- package/dist/src/proxy/proxy-token-store.js.map +1 -1
- package/dist/src/token-sanitization.d.ts +42 -1
- package/dist/src/token-sanitization.js +10 -2
- package/dist/src/token-sanitization.js.map +1 -1
- package/package.json +6 -1
- package/src/index.ts +16 -1
- package/src/mcp-auth-provider-type.ts +19 -0
- package/src/oauth-ui-events.ts +37 -2
- package/src/proxy/proxy-payload-schemas.ts +86 -0
- package/src/proxy/proxy-provider-key-storage.ts +18 -3
- package/src/proxy/proxy-socket-client.ts +20 -34
- package/src/proxy/proxy-token-store.ts +33 -14
- package/src/token-sanitization.ts +14 -5
package/dist/src/index.d.ts
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
* SPDX-License-Identifier: Apache-2.0
|
|
10
10
|
*/
|
|
11
11
|
export type * from './interfaces/index.js';
|
|
12
|
-
export type { OAuthUIEvent, OAuthUIEventType, OAuthUICallback, } from './oauth-ui-events.js';
|
|
12
|
+
export type { OAuthUIEvent, OAuthUIEventType, OAuthUICallback, OAuthInteractiveAuthOutcomeKind, } from './oauth-ui-events.js';
|
|
13
13
|
export { OAuthUIBridge, oauthUIBridge, OAUTH_UI_MAX_PENDING, } from './oauth-ui-bridge.js';
|
|
14
14
|
export type { OAuthToken, CodexOAuthToken, AuthStatus, BucketStats, DeviceCodeResponse, } from './types.js';
|
|
15
15
|
export { OAuthTokenSchema, CodexOAuthTokenSchema, AuthStatusSchema, BucketStatsSchema, DeviceCodeResponseSchema, } from './types.js';
|
|
@@ -19,7 +19,7 @@ export { OAuthError, OAuthErrorFactory, OAuthErrorCategory, OAuthErrorType, Retr
|
|
|
19
19
|
export type { RetryConfig } from './oauth-errors.js';
|
|
20
20
|
export { mergeRefreshedToken } from './token-merge.js';
|
|
21
21
|
export type { OAuthTokenWithExtras } from './token-merge.js';
|
|
22
|
-
export { sanitizeTokenForProxy } from './token-sanitization.js';
|
|
22
|
+
export { SanitizedOAuthTokenSchema, sanitizeTokenForProxy, } from './token-sanitization.js';
|
|
23
23
|
export type { SanitizedOAuthToken } from './token-sanitization.js';
|
|
24
24
|
export { AuthPrecedenceResolver } from './auth-precedence-resolver.js';
|
|
25
25
|
export type { ResolveAuthOptions } from './auth-precedence-resolver.js';
|
|
@@ -33,5 +33,6 @@ export { encodeFrame, FrameDecoder, FrameError, MAX_FRAME_SIZE, V1_MAX_FRAME_SIZ
|
|
|
33
33
|
export type { FrameDecoderOptions } from './proxy/framing.js';
|
|
34
34
|
export { ProxySocketClient, REQUEST_TIMEOUT_MS, IDLE_TIMEOUT_MS, PROTOCOL_VERSION, } from './proxy/proxy-socket-client.js';
|
|
35
35
|
export type { ProxyResponse, RequestOptions, } from './proxy/proxy-socket-client.js';
|
|
36
|
+
export { ProxyResponseSchema, OAuthTokenDataSchema, ProvidersDataSchema, BucketsDataSchema, BucketStatsDataSchema, ApiKeyDataSchema, ApiKeysDataSchema, HasApiKeyDataSchema, } from './proxy/proxy-payload-schemas.js';
|
|
36
37
|
export { ProxyTokenStore } from './proxy/proxy-token-store.js';
|
|
37
38
|
export { ProxyProviderKeyStorage } from './proxy/proxy-provider-key-storage.js';
|
package/dist/src/index.js
CHANGED
|
@@ -11,7 +11,7 @@ export { KeyringTokenStore } from './keyring-token-store.js';
|
|
|
11
11
|
export { OAuthError, OAuthErrorFactory, OAuthErrorCategory, OAuthErrorType, RetryHandler, GracefulErrorHandler, } from './oauth-errors.js';
|
|
12
12
|
// ─── Token Utilities ─────────────────────────────────────────────────────────
|
|
13
13
|
export { mergeRefreshedToken } from './token-merge.js';
|
|
14
|
-
export { sanitizeTokenForProxy } from './token-sanitization.js';
|
|
14
|
+
export { SanitizedOAuthTokenSchema, sanitizeTokenForProxy, } from './token-sanitization.js';
|
|
15
15
|
// ─── Precedence / Auth Resolution ────────────────────────────────────────────
|
|
16
16
|
export { AuthPrecedenceResolver } from './auth-precedence-resolver.js';
|
|
17
17
|
export { CredentialResolutionError } from './credential-resolution-error.js';
|
|
@@ -22,6 +22,7 @@ export { CodexDeviceFlow, CODEX_CONFIG } from './flows/codex-device-flow.js';
|
|
|
22
22
|
// ─── Proxy Infrastructure ────────────────────────────────────────────────────
|
|
23
23
|
export { encodeFrame, FrameDecoder, FrameError, MAX_FRAME_SIZE, V1_MAX_FRAME_SIZE, PARTIAL_FRAME_TIMEOUT_MS, } from './proxy/framing.js';
|
|
24
24
|
export { ProxySocketClient, REQUEST_TIMEOUT_MS, IDLE_TIMEOUT_MS, PROTOCOL_VERSION, } from './proxy/proxy-socket-client.js';
|
|
25
|
+
export { ProxyResponseSchema, OAuthTokenDataSchema, ProvidersDataSchema, BucketsDataSchema, BucketStatsDataSchema, ApiKeyDataSchema, ApiKeysDataSchema, HasApiKeyDataSchema, } from './proxy/proxy-payload-schemas.js';
|
|
25
26
|
export { ProxyTokenStore } from './proxy/proxy-token-store.js';
|
|
26
27
|
export { ProxyProviderKeyStorage } from './proxy/proxy-provider-key-storage.js';
|
|
27
28
|
//# sourceMappingURL=index.js.map
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAoBH,OAAO,EACL,aAAa,EACb,aAAa,EACb,oBAAoB,GACrB,MAAM,sBAAsB,CAAC;AAW9B,OAAO,EACL,gBAAgB,EAChB,qBAAqB,EACrB,gBAAgB,EAChB,iBAAiB,EACjB,wBAAwB,GACzB,MAAM,YAAY,CAAC;AAapB,gFAAgF;AAChF,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE7D,gFAAgF;AAChF,OAAO,EACL,UAAU,EACV,iBAAiB,EACjB,kBAAkB,EAClB,cAAc,EACd,YAAY,EACZ,oBAAoB,GACrB,MAAM,mBAAmB,CAAC;AAG3B,gFAAgF;AAChF,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAGvD,OAAO,EACL,yBAAyB,EACzB,qBAAqB,GACtB,MAAM,yBAAyB,CAAC;AAGjC,gFAAgF;AAChF,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAEvE,OAAO,EAAE,yBAAyB,EAAE,MAAM,kCAAkC,CAAC;AAS7E,OAAO,EACL,qBAAqB,EACrB,gBAAgB,EAChB,aAAa,EACb,kBAAkB,EAClB,cAAc,EACd,eAAe,EACf,mBAAmB,EACnB,6BAA6B,EAC7B,yBAAyB,EACzB,uBAAuB,EACvB,eAAe,EACf,8BAA8B,EAC9B,mBAAmB,GACpB,MAAM,iBAAiB,CAAC;AAYzB,gFAAgF;AAChF,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAE7E,gFAAgF;AAChF,OAAO,EACL,WAAW,EACX,YAAY,EACZ,UAAU,EACV,cAAc,EACd,iBAAiB,EACjB,wBAAwB,GACzB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,eAAe,EACf,gBAAgB,GACjB,MAAM,gCAAgC,CAAC;AAMxC,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACnB,iBAAiB,EACjB,qBAAqB,EACrB,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,kCAAkC,CAAC;AAE1C,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,uBAAuB,EAAE,MAAM,uCAAuC,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Vybestack LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* How an MCP server authenticates (#3305).
|
|
8
|
+
*
|
|
9
|
+
* Lives here rather than in `core` so that `@vybestack/llxprt-code-mcp` can
|
|
10
|
+
* reach it without depending on `core`, which value-imports `mcp` and would
|
|
11
|
+
* therefore form a runtime cycle. This package is a dependency-graph leaf, so
|
|
12
|
+
* both `core` and `mcp` can depend on it.
|
|
13
|
+
*/
|
|
14
|
+
export declare enum AuthProviderType {
|
|
15
|
+
DYNAMIC_DISCOVERY = "dynamic_discovery",
|
|
16
|
+
GOOGLE_CREDENTIALS = "google_credentials",
|
|
17
|
+
SERVICE_ACCOUNT_IMPERSONATION = "service_account_impersonation"
|
|
18
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Vybestack LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* How an MCP server authenticates (#3305).
|
|
8
|
+
*
|
|
9
|
+
* Lives here rather than in `core` so that `@vybestack/llxprt-code-mcp` can
|
|
10
|
+
* reach it without depending on `core`, which value-imports `mcp` and would
|
|
11
|
+
* therefore form a runtime cycle. This package is a dependency-graph leaf, so
|
|
12
|
+
* both `core` and `mcp` can depend on it.
|
|
13
|
+
*/
|
|
14
|
+
export var AuthProviderType;
|
|
15
|
+
(function (AuthProviderType) {
|
|
16
|
+
AuthProviderType["DYNAMIC_DISCOVERY"] = "dynamic_discovery";
|
|
17
|
+
AuthProviderType["GOOGLE_CREDENTIALS"] = "google_credentials";
|
|
18
|
+
AuthProviderType["SERVICE_ACCOUNT_IMPERSONATION"] = "service_account_impersonation";
|
|
19
|
+
})(AuthProviderType || (AuthProviderType = {}));
|
|
20
|
+
//# sourceMappingURL=mcp-auth-provider-type.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-auth-provider-type.js","sourceRoot":"","sources":["../../src/mcp-auth-provider-type.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;;;;GAOG;AACH,MAAM,CAAN,IAAY,gBAIX;AAJD,WAAY,gBAAgB;IAC1B,2DAAuC,CAAA;IACvC,6DAAyC,CAAA;IACzC,mFAA+D,CAAA;AACjE,CAAC,EAJW,gBAAgB,KAAhB,gBAAgB,QAI3B"}
|
|
@@ -15,8 +15,13 @@
|
|
|
15
15
|
* OAuth providers emit these event kinds; this seam lets the providers live
|
|
16
16
|
* in `@vybestack/llxprt-code-auth` without importing UI types.
|
|
17
17
|
*/
|
|
18
|
+
/**
|
|
19
|
+
* @plan PLAN-20260827-ISSUE2562.P05
|
|
20
|
+
* @requirement REQ-2562-4
|
|
21
|
+
*/
|
|
18
22
|
/** The set of OAuth UI event discriminator values. */
|
|
19
|
-
export type OAuthUIEventType = 'info' | 'warning' | 'error' | 'oauth_url';
|
|
23
|
+
export type OAuthUIEventType = 'info' | 'warning' | 'error' | 'oauth_url' | 'oauth_waiting' | 'oauth_settled';
|
|
24
|
+
export type OAuthInteractiveAuthOutcomeKind = 'succeeded' | 'cancelled' | 'failed' | 'timed_out';
|
|
20
25
|
/**
|
|
21
26
|
* Discriminated union of all OAuth UI events.
|
|
22
27
|
*
|
|
@@ -24,6 +29,8 @@ export type OAuthUIEventType = 'info' | 'warning' | 'error' | 'oauth_url';
|
|
|
24
29
|
* - `warning`: a non-fatal warning message (e.g. a recoverable fallback).
|
|
25
30
|
* - `error`: a non-fatal error message.
|
|
26
31
|
* - `oauth_url`: an authorization URL the user must visit.
|
|
32
|
+
* - `oauth_waiting`: a host-owned interactive authentication session is waiting.
|
|
33
|
+
* - `oauth_settled`: a host-owned interactive authentication session settled.
|
|
27
34
|
*/
|
|
28
35
|
export type OAuthUIEvent = {
|
|
29
36
|
readonly type: 'info';
|
|
@@ -40,6 +47,21 @@ export type OAuthUIEvent = {
|
|
|
40
47
|
readonly type: 'oauth_url';
|
|
41
48
|
readonly text: string;
|
|
42
49
|
readonly url: string;
|
|
50
|
+
} | {
|
|
51
|
+
readonly type: 'oauth_waiting';
|
|
52
|
+
readonly provider: string;
|
|
53
|
+
readonly bucket?: string;
|
|
54
|
+
readonly requesterRuntimeKind: string;
|
|
55
|
+
readonly correlationId: string;
|
|
56
|
+
readonly waiterCount: number;
|
|
57
|
+
} | {
|
|
58
|
+
readonly type: 'oauth_settled';
|
|
59
|
+
readonly provider: string;
|
|
60
|
+
readonly bucket?: string;
|
|
61
|
+
readonly requesterRuntimeKind: string;
|
|
62
|
+
readonly correlationId: string;
|
|
63
|
+
readonly waiterCount: number;
|
|
64
|
+
readonly kind: OAuthInteractiveAuthOutcomeKind;
|
|
43
65
|
};
|
|
44
66
|
/**
|
|
45
67
|
* Callback invoked when an {@link OAuthUIEvent} is emitted to a handler.
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Vybestack LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Narrowly scoped schemas that validate credential-proxy payloads at the
|
|
8
|
+
* IPC trust boundary (issue #2197). Successful response envelopes and
|
|
9
|
+
* operation-specific data are parsed with these before use.
|
|
10
|
+
*/
|
|
11
|
+
import { z } from 'zod';
|
|
12
|
+
/**
|
|
13
|
+
* Stable error message for a successful response whose data does not match its
|
|
14
|
+
* operation schema. Used at every client payload boundary.
|
|
15
|
+
*/
|
|
16
|
+
export declare const PROXY_PAYLOAD_ERROR = "PROXY_PAYLOAD_ERROR";
|
|
17
|
+
export declare function proxyPayloadError(message: string): Error;
|
|
18
|
+
/**
|
|
19
|
+
* Response envelope schema. `ok` must be boolean; `data` must be a
|
|
20
|
+
* non-null, non-array object when present; `error`, `code`, and
|
|
21
|
+
* `retryAfter` must have their protocol types when present. Unknown envelope
|
|
22
|
+
* fields, including the request `id`, are preserved so the same schema validates
|
|
23
|
+
* handshake and correlated frames.
|
|
24
|
+
*/
|
|
25
|
+
export declare const ProxyResponseSchema: z.ZodObject<{
|
|
26
|
+
ok: z.ZodBoolean;
|
|
27
|
+
data: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
28
|
+
error: z.ZodOptional<z.ZodString>;
|
|
29
|
+
code: z.ZodOptional<z.ZodString>;
|
|
30
|
+
retryAfter: z.ZodOptional<z.ZodNumber>;
|
|
31
|
+
}, "passthrough", z.ZodTypeAny, z.objectOutputType<{
|
|
32
|
+
ok: z.ZodBoolean;
|
|
33
|
+
data: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
34
|
+
error: z.ZodOptional<z.ZodString>;
|
|
35
|
+
code: z.ZodOptional<z.ZodString>;
|
|
36
|
+
retryAfter: z.ZodOptional<z.ZodNumber>;
|
|
37
|
+
}, z.ZodTypeAny, "passthrough">, z.objectInputType<{
|
|
38
|
+
ok: z.ZodBoolean;
|
|
39
|
+
data: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
40
|
+
error: z.ZodOptional<z.ZodString>;
|
|
41
|
+
code: z.ZodOptional<z.ZodString>;
|
|
42
|
+
retryAfter: z.ZodOptional<z.ZodNumber>;
|
|
43
|
+
}, z.ZodTypeAny, "passthrough">>;
|
|
44
|
+
export type ProxyResponse = z.infer<typeof ProxyResponseSchema>;
|
|
45
|
+
/** Success payload for get_token. Validates and preserves the full OAuth token. */
|
|
46
|
+
export declare const OAuthTokenDataSchema: z.ZodObject<{
|
|
47
|
+
access_token: z.ZodString;
|
|
48
|
+
refresh_token: z.ZodOptional<z.ZodString>;
|
|
49
|
+
expiry: z.ZodNumber;
|
|
50
|
+
scope: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
51
|
+
token_type: z.ZodEnum<["Bearer", "bearer"]>;
|
|
52
|
+
resource_url: z.ZodOptional<z.ZodString>;
|
|
53
|
+
}, "passthrough", z.ZodTypeAny, z.objectOutputType<{
|
|
54
|
+
access_token: z.ZodString;
|
|
55
|
+
refresh_token: z.ZodOptional<z.ZodString>;
|
|
56
|
+
expiry: z.ZodNumber;
|
|
57
|
+
scope: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
58
|
+
token_type: z.ZodEnum<["Bearer", "bearer"]>;
|
|
59
|
+
resource_url: z.ZodOptional<z.ZodString>;
|
|
60
|
+
}, z.ZodTypeAny, "passthrough">, z.objectInputType<{
|
|
61
|
+
access_token: z.ZodString;
|
|
62
|
+
refresh_token: z.ZodOptional<z.ZodString>;
|
|
63
|
+
expiry: z.ZodNumber;
|
|
64
|
+
scope: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
65
|
+
token_type: z.ZodEnum<["Bearer", "bearer"]>;
|
|
66
|
+
resource_url: z.ZodOptional<z.ZodString>;
|
|
67
|
+
}, z.ZodTypeAny, "passthrough">>;
|
|
68
|
+
/** Success payload for list_providers. */
|
|
69
|
+
export declare const ProvidersDataSchema: z.ZodObject<{
|
|
70
|
+
providers: z.ZodArray<z.ZodString, "many">;
|
|
71
|
+
}, "strip", z.ZodTypeAny, {
|
|
72
|
+
providers: string[];
|
|
73
|
+
}, {
|
|
74
|
+
providers: string[];
|
|
75
|
+
}>;
|
|
76
|
+
/** Success payload for list_buckets. */
|
|
77
|
+
export declare const BucketsDataSchema: z.ZodObject<{
|
|
78
|
+
buckets: z.ZodArray<z.ZodString, "many">;
|
|
79
|
+
}, "strip", z.ZodTypeAny, {
|
|
80
|
+
buckets: string[];
|
|
81
|
+
}, {
|
|
82
|
+
buckets: string[];
|
|
83
|
+
}>;
|
|
84
|
+
/** Success payload for get_bucket_stats. */
|
|
85
|
+
export declare const BucketStatsDataSchema: z.ZodObject<{
|
|
86
|
+
bucket: z.ZodString;
|
|
87
|
+
requestCount: z.ZodNumber;
|
|
88
|
+
percentage: z.ZodNumber;
|
|
89
|
+
lastUsed: z.ZodOptional<z.ZodNumber>;
|
|
90
|
+
}, "passthrough", z.ZodTypeAny, z.objectOutputType<{
|
|
91
|
+
bucket: z.ZodString;
|
|
92
|
+
requestCount: z.ZodNumber;
|
|
93
|
+
percentage: z.ZodNumber;
|
|
94
|
+
lastUsed: z.ZodOptional<z.ZodNumber>;
|
|
95
|
+
}, z.ZodTypeAny, "passthrough">, z.objectInputType<{
|
|
96
|
+
bucket: z.ZodString;
|
|
97
|
+
requestCount: z.ZodNumber;
|
|
98
|
+
percentage: z.ZodNumber;
|
|
99
|
+
lastUsed: z.ZodOptional<z.ZodNumber>;
|
|
100
|
+
}, z.ZodTypeAny, "passthrough">>;
|
|
101
|
+
/** Success payload for get_api_key. */
|
|
102
|
+
export declare const ApiKeyDataSchema: z.ZodObject<{
|
|
103
|
+
key: z.ZodString;
|
|
104
|
+
}, "strip", z.ZodTypeAny, {
|
|
105
|
+
key: string;
|
|
106
|
+
}, {
|
|
107
|
+
key: string;
|
|
108
|
+
}>;
|
|
109
|
+
/** Success payload for list_api_keys. */
|
|
110
|
+
export declare const ApiKeysDataSchema: z.ZodObject<{
|
|
111
|
+
keys: z.ZodArray<z.ZodString, "many">;
|
|
112
|
+
}, "strip", z.ZodTypeAny, {
|
|
113
|
+
keys: string[];
|
|
114
|
+
}, {
|
|
115
|
+
keys: string[];
|
|
116
|
+
}>;
|
|
117
|
+
/** Success payload for has_api_key. */
|
|
118
|
+
export declare const HasApiKeyDataSchema: z.ZodObject<{
|
|
119
|
+
exists: z.ZodBoolean;
|
|
120
|
+
}, "strip", z.ZodTypeAny, {
|
|
121
|
+
exists: boolean;
|
|
122
|
+
}, {
|
|
123
|
+
exists: boolean;
|
|
124
|
+
}>;
|
|
125
|
+
/**
|
|
126
|
+
* Parses an operation-specific successful payload with the given schema. When
|
|
127
|
+
* the data is missing, malformed, or wrong-typed, throws the stable proxy
|
|
128
|
+
* payload validation error.
|
|
129
|
+
*/
|
|
130
|
+
export declare function parseSuccessPayload<T>(schema: z.ZodType<T, z.ZodTypeDef, unknown>, data: Record<string, unknown> | undefined, operation: string): T;
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Vybestack LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Narrowly scoped schemas that validate credential-proxy payloads at the
|
|
8
|
+
* IPC trust boundary (issue #2197). Successful response envelopes and
|
|
9
|
+
* operation-specific data are parsed with these before use.
|
|
10
|
+
*/
|
|
11
|
+
import { z } from 'zod';
|
|
12
|
+
import { OAuthTokenSchema, BucketStatsSchema } from '../types.js';
|
|
13
|
+
/**
|
|
14
|
+
* Stable error message for a successful response whose data does not match its
|
|
15
|
+
* operation schema. Used at every client payload boundary.
|
|
16
|
+
*/
|
|
17
|
+
export const PROXY_PAYLOAD_ERROR = 'PROXY_PAYLOAD_ERROR';
|
|
18
|
+
export function proxyPayloadError(message) {
|
|
19
|
+
return new Error(`${PROXY_PAYLOAD_ERROR}: ${message}`);
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Response envelope schema. `ok` must be boolean; `data` must be a
|
|
23
|
+
* non-null, non-array object when present; `error`, `code`, and
|
|
24
|
+
* `retryAfter` must have their protocol types when present. Unknown envelope
|
|
25
|
+
* fields, including the request `id`, are preserved so the same schema validates
|
|
26
|
+
* handshake and correlated frames.
|
|
27
|
+
*/
|
|
28
|
+
export const ProxyResponseSchema = z
|
|
29
|
+
.object({
|
|
30
|
+
ok: z.boolean(),
|
|
31
|
+
data: z.record(z.string(), z.unknown()).optional(),
|
|
32
|
+
error: z.string().optional(),
|
|
33
|
+
code: z.string().optional(),
|
|
34
|
+
retryAfter: z.number().optional(),
|
|
35
|
+
})
|
|
36
|
+
.passthrough();
|
|
37
|
+
/** Success payload for get_token. Validates and preserves the full OAuth token. */
|
|
38
|
+
export const OAuthTokenDataSchema = OAuthTokenSchema.passthrough();
|
|
39
|
+
/** Success payload for list_providers. */
|
|
40
|
+
export const ProvidersDataSchema = z.object({
|
|
41
|
+
providers: z.array(z.string()),
|
|
42
|
+
});
|
|
43
|
+
/** Success payload for list_buckets. */
|
|
44
|
+
export const BucketsDataSchema = z.object({ buckets: z.array(z.string()) });
|
|
45
|
+
/** Success payload for get_bucket_stats. */
|
|
46
|
+
export const BucketStatsDataSchema = BucketStatsSchema.passthrough();
|
|
47
|
+
/** Success payload for get_api_key. */
|
|
48
|
+
export const ApiKeyDataSchema = z.object({ key: z.string() });
|
|
49
|
+
/** Success payload for list_api_keys. */
|
|
50
|
+
export const ApiKeysDataSchema = z.object({ keys: z.array(z.string()) });
|
|
51
|
+
/** Success payload for has_api_key. */
|
|
52
|
+
export const HasApiKeyDataSchema = z.object({ exists: z.boolean() });
|
|
53
|
+
/**
|
|
54
|
+
* Parses an operation-specific successful payload with the given schema. When
|
|
55
|
+
* the data is missing, malformed, or wrong-typed, throws the stable proxy
|
|
56
|
+
* payload validation error.
|
|
57
|
+
*/
|
|
58
|
+
export function parseSuccessPayload(schema, data, operation) {
|
|
59
|
+
if (data === undefined) {
|
|
60
|
+
throw proxyPayloadError(`${operation}: missing data`);
|
|
61
|
+
}
|
|
62
|
+
const parsed = schema.safeParse(data);
|
|
63
|
+
if (!parsed.success) {
|
|
64
|
+
throw proxyPayloadError(`${operation}: malformed payload`);
|
|
65
|
+
}
|
|
66
|
+
return parsed.data;
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=proxy-payload-schemas.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proxy-payload-schemas.js","sourceRoot":"","sources":["../../../src/proxy/proxy-payload-schemas.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;GAIG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAElE;;;GAGG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,qBAAqB,CAAC;AAEzD,MAAM,UAAU,iBAAiB,CAAC,OAAe;IAC/C,OAAO,IAAI,KAAK,CAAC,GAAG,mBAAmB,KAAK,OAAO,EAAE,CAAC,CAAC;AACzD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC;KACjC,MAAM,CAAC;IACN,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE;IACf,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE;IAClD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC5B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAClC,CAAC;KACD,WAAW,EAAE,CAAC;AAIjB,mFAAmF;AACnF,MAAM,CAAC,MAAM,oBAAoB,GAAG,gBAAgB,CAAC,WAAW,EAAE,CAAC;AAEnE,0CAA0C;AAC1C,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;CAC/B,CAAC,CAAC;AAEH,wCAAwC;AACxC,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;AAE5E,4CAA4C;AAC5C,MAAM,CAAC,MAAM,qBAAqB,GAAG,iBAAiB,CAAC,WAAW,EAAE,CAAC;AAErE,uCAAuC;AACvC,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AAE9D,yCAAyC;AACzC,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;AAEzE,uCAAuC;AACvC,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;AAErE;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CACjC,MAA2C,EAC3C,IAAyC,EACzC,SAAiB;IAEjB,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,MAAM,iBAAiB,CAAC,GAAG,SAAS,gBAAgB,CAAC,CAAC;IACxD,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACtC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,iBAAiB,CAAC,GAAG,SAAS,qBAAqB,CAAC,CAAC;IAC7D,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC"}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
* Copyright 2025 Vybestack LLC
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
|
+
import { ApiKeyDataSchema, ApiKeysDataSchema, HasApiKeyDataSchema, parseSuccessPayload, } from './proxy-payload-schemas.js';
|
|
6
7
|
export class ProxyProviderKeyStorage {
|
|
7
8
|
client;
|
|
8
9
|
constructor(client) {
|
|
@@ -15,21 +16,22 @@ export class ProxyProviderKeyStorage {
|
|
|
15
16
|
return null;
|
|
16
17
|
throw new Error(response.error ?? 'proxy error');
|
|
17
18
|
}
|
|
18
|
-
return response.data
|
|
19
|
+
return parseSuccessPayload(ApiKeyDataSchema, response.data, 'get_api_key')
|
|
20
|
+
.key;
|
|
19
21
|
}
|
|
20
22
|
async listKeys() {
|
|
21
23
|
const response = await this.client.request('list_api_keys', {});
|
|
22
24
|
if (!response.ok) {
|
|
23
25
|
throw new Error(response.error ?? 'proxy error');
|
|
24
26
|
}
|
|
25
|
-
return response.data.keys;
|
|
27
|
+
return parseSuccessPayload(ApiKeysDataSchema, response.data, 'list_api_keys').keys;
|
|
26
28
|
}
|
|
27
29
|
async hasKey(name) {
|
|
28
30
|
const response = await this.client.request('has_api_key', { name });
|
|
29
31
|
if (!response.ok) {
|
|
30
32
|
throw new Error(response.error ?? 'proxy error');
|
|
31
33
|
}
|
|
32
|
-
return response.data.exists;
|
|
34
|
+
return parseSuccessPayload(HasApiKeyDataSchema, response.data, 'has_api_key').exists;
|
|
33
35
|
}
|
|
34
36
|
async saveKey(_name, _apiKey) {
|
|
35
37
|
throw new Error('API key management is not available in sandbox mode');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proxy-provider-key-storage.js","sourceRoot":"","sources":["../../../src/proxy/proxy-provider-key-storage.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"proxy-provider-key-storage.js","sourceRoot":"","sources":["../../../src/proxy/proxy-provider-key-storage.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAYH,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,4BAA4B,CAAC;AAEpC,MAAM,OAAO,uBAAuB;IACjB,MAAM,CAAoB;IAE3C,YAAY,MAAyB;QACnC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,IAAY;QACvB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QACpE,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,IAAI,QAAQ,CAAC,IAAI,KAAK,WAAW;gBAAE,OAAO,IAAI,CAAC;YAC/C,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,IAAI,aAAa,CAAC,CAAC;QACnD,CAAC;QACD,OAAO,mBAAmB,CAAC,gBAAgB,EAAE,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;aACvE,GAAG,CAAC;IACT,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;QAChE,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,IAAI,aAAa,CAAC,CAAC;QACnD,CAAC;QACD,OAAO,mBAAmB,CACxB,iBAAiB,EACjB,QAAQ,CAAC,IAAI,EACb,eAAe,CAChB,CAAC,IAAI,CAAC;IACT,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,IAAY;QACvB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QACpE,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,IAAI,aAAa,CAAC,CAAC;QACnD,CAAC;QACD,OAAO,mBAAmB,CACxB,mBAAmB,EACnB,QAAQ,CAAC,IAAI,EACb,aAAa,CACd,CAAC,MAAM,CAAC;IACX,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,KAAa,EAAE,OAAe;QAC1C,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;IACzE,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,KAAa;QAC3B,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;IACzE,CAAC;CACF"}
|
|
@@ -3,16 +3,11 @@
|
|
|
3
3
|
* Copyright 2025 Vybestack LLC
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
|
+
import { type ProxyResponse } from './proxy-payload-schemas.js';
|
|
7
|
+
export type { ProxyResponse } from './proxy-payload-schemas.js';
|
|
6
8
|
export declare const REQUEST_TIMEOUT_MS = 30000;
|
|
7
9
|
export declare const IDLE_TIMEOUT_MS = 300000;
|
|
8
10
|
export declare const PROTOCOL_VERSION = 2;
|
|
9
|
-
export type ProxyResponse = {
|
|
10
|
-
ok: boolean;
|
|
11
|
-
data?: Record<string, unknown>;
|
|
12
|
-
error?: string;
|
|
13
|
-
code?: string;
|
|
14
|
-
retryAfter?: number;
|
|
15
|
-
};
|
|
16
11
|
/**
|
|
17
12
|
* Per-request options controlling timeout and cancellation.
|
|
18
13
|
*
|
|
@@ -13,27 +13,15 @@
|
|
|
13
13
|
import * as net from 'node:net';
|
|
14
14
|
import * as crypto from 'node:crypto';
|
|
15
15
|
import { encodeFrame, FrameDecoder } from './framing.js';
|
|
16
|
+
import { ProxyResponseSchema, } from './proxy-payload-schemas.js';
|
|
16
17
|
export const REQUEST_TIMEOUT_MS = 30000;
|
|
17
18
|
export const IDLE_TIMEOUT_MS = 300000;
|
|
18
19
|
export const PROTOCOL_VERSION = 2;
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
return false;
|
|
25
|
-
if (frame.code !== undefined && typeof frame.code !== 'string')
|
|
26
|
-
return false;
|
|
27
|
-
if (frame.error !== undefined && typeof frame.error !== 'string')
|
|
28
|
-
return false;
|
|
29
|
-
if (frame.retryAfter !== undefined && typeof frame.retryAfter !== 'number')
|
|
30
|
-
return false;
|
|
31
|
-
if (frame.data !== undefined &&
|
|
32
|
-
(typeof frame.data !== 'object' ||
|
|
33
|
-
frame.data === null ||
|
|
34
|
-
Array.isArray(frame.data)))
|
|
35
|
-
return false;
|
|
36
|
-
return true;
|
|
20
|
+
function parseResponseFrame(frame) {
|
|
21
|
+
const parsed = ProxyResponseSchema.safeParse(frame);
|
|
22
|
+
if (!parsed.success)
|
|
23
|
+
return null;
|
|
24
|
+
return parsed.data;
|
|
37
25
|
}
|
|
38
26
|
const PROXY_CONNECT_FAILURE_PATTERN = /connect (?:ECONNREFUSED|ENOENT|EACCES|EHOSTUNREACH|ENETUNREACH|ETIMEDOUT|EPERM|ENOTDIR)/i;
|
|
39
27
|
export class ProxyRequestError extends Error {
|
|
@@ -412,8 +400,9 @@ export class ProxySocketClient {
|
|
|
412
400
|
return;
|
|
413
401
|
}
|
|
414
402
|
this.handshakeResolver = null;
|
|
415
|
-
|
|
416
|
-
|
|
403
|
+
const parsedFrame = parseResponseFrame(frame);
|
|
404
|
+
if (parsedFrame !== null) {
|
|
405
|
+
resolver.resolve(parsedFrame);
|
|
417
406
|
}
|
|
418
407
|
else {
|
|
419
408
|
// Reject first, then clean up. destroy() will not double-reject
|
|
@@ -433,7 +422,7 @@ export class ProxySocketClient {
|
|
|
433
422
|
*/
|
|
434
423
|
resolvePendingRequest(frame) {
|
|
435
424
|
const id = frame.id;
|
|
436
|
-
if (
|
|
425
|
+
if (typeof id !== 'string' || id === '') {
|
|
437
426
|
return;
|
|
438
427
|
}
|
|
439
428
|
const pending = this.pendingRequests.get(id);
|
|
@@ -441,8 +430,9 @@ export class ProxySocketClient {
|
|
|
441
430
|
clearTimeout(pending.timer);
|
|
442
431
|
this.pendingRequests.delete(id);
|
|
443
432
|
this.releaseAbortCleanup(id);
|
|
444
|
-
|
|
445
|
-
|
|
433
|
+
const parsedFrame = parseResponseFrame(frame);
|
|
434
|
+
if (parsedFrame !== null) {
|
|
435
|
+
pending.resolve(parsedFrame);
|
|
446
436
|
}
|
|
447
437
|
else {
|
|
448
438
|
pending.reject(new Error(`Malformed response for request ${id}`));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proxy-socket-client.js","sourceRoot":"","sources":["../../../src/proxy/proxy-socket-client.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"proxy-socket-client.js","sourceRoot":"","sources":["../../../src/proxy/proxy-socket-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
* Copyright 2025 Vybestack LLC
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
|
+
import { OAuthTokenDataSchema, parseSuccessPayload, ProvidersDataSchema, BucketsDataSchema, BucketStatsDataSchema, } from './proxy-payload-schemas.js';
|
|
6
7
|
import { ProxySocketClient } from './proxy-socket-client.js';
|
|
7
8
|
export class ProxyTokenStore {
|
|
8
9
|
client;
|
|
@@ -18,7 +19,7 @@ export class ProxyTokenStore {
|
|
|
18
19
|
return null;
|
|
19
20
|
if (!response.ok)
|
|
20
21
|
throw new Error(response.error ?? 'proxy error');
|
|
21
|
-
return response.data;
|
|
22
|
+
return parseSuccessPayload(OAuthTokenDataSchema, response.data, 'get_token');
|
|
22
23
|
}
|
|
23
24
|
async saveToken(provider, token, bucket) {
|
|
24
25
|
const response = await this.client.request('save_token', {
|
|
@@ -39,15 +40,20 @@ export class ProxyTokenStore {
|
|
|
39
40
|
}
|
|
40
41
|
async listProviders() {
|
|
41
42
|
const response = await this.client.request('list_providers', {});
|
|
42
|
-
if (!response.ok)
|
|
43
|
+
if (!response.ok) {
|
|
43
44
|
throw new Error(response.error ?? 'proxy error');
|
|
44
|
-
|
|
45
|
+
}
|
|
46
|
+
return parseSuccessPayload(ProvidersDataSchema, response.data, 'list_providers').providers;
|
|
45
47
|
}
|
|
46
48
|
async listBuckets(provider) {
|
|
47
|
-
const response = await this.client.request('list_buckets', {
|
|
48
|
-
|
|
49
|
+
const response = await this.client.request('list_buckets', {
|
|
50
|
+
provider,
|
|
51
|
+
});
|
|
52
|
+
if (!response.ok) {
|
|
49
53
|
throw new Error(response.error ?? 'proxy error');
|
|
50
|
-
|
|
54
|
+
}
|
|
55
|
+
return parseSuccessPayload(BucketsDataSchema, response.data, 'list_buckets')
|
|
56
|
+
.buckets;
|
|
51
57
|
}
|
|
52
58
|
async getBucketStats(provider, bucket) {
|
|
53
59
|
const response = await this.client.request('get_bucket_stats', {
|
|
@@ -58,13 +64,7 @@ export class ProxyTokenStore {
|
|
|
58
64
|
return null;
|
|
59
65
|
if (!response.ok)
|
|
60
66
|
throw new Error(response.error ?? 'proxy error');
|
|
61
|
-
|
|
62
|
-
return {
|
|
63
|
-
bucket,
|
|
64
|
-
requestCount: typeof data.requestCount === 'number' ? data.requestCount : 0,
|
|
65
|
-
percentage: typeof data.percentage === 'number' ? data.percentage : 0,
|
|
66
|
-
lastUsed: data.lastUsed,
|
|
67
|
-
};
|
|
67
|
+
return parseSuccessPayload(BucketStatsDataSchema, response.data, 'get_bucket_stats');
|
|
68
68
|
}
|
|
69
69
|
async acquireRefreshLock(_provider, _options) {
|
|
70
70
|
return true;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proxy-token-store.js","sourceRoot":"","sources":["../../../src/proxy/proxy-token-store.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAaH,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE7D,MAAM,OAAO,eAAe;IACT,MAAM,CAAoB;IAE3C,YAAY,UAAkB,EAAE,eAAwB;QACtD,IAAI,CAAC,MAAM,GAAG,IAAI,iBAAiB,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;IACnE,CAAC;IAED,KAAK,CAAC,QAAQ,CACZ,QAAgB,EAChB,MAAe;QAEf,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE;YACtD,QAAQ;YACR,MAAM;SACP,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,QAAQ,CAAC,IAAI,KAAK,WAAW;YAAE,OAAO,IAAI,CAAC;QAC/D,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,IAAI,aAAa,CAAC,CAAC;QACnE,OAAO,QAAQ,CAAC,
|
|
1
|
+
{"version":3,"file":"proxy-token-store.js","sourceRoot":"","sources":["../../../src/proxy/proxy-token-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,6 +11,47 @@
|
|
|
11
11
|
* @requirement R10.1, R10.2, R10.3
|
|
12
12
|
* @pseudocode analysis/pseudocode/002-token-sanitization-merge.md
|
|
13
13
|
*/
|
|
14
|
+
import type { z } from 'zod';
|
|
14
15
|
import { type OAuthToken } from './types.js';
|
|
15
|
-
|
|
16
|
+
/**
|
|
17
|
+
* Sanitized OAuth token schema: validates the supported OAuth fields while
|
|
18
|
+
* preserving provider-specific extension fields before the refresh_token is stripped.
|
|
19
|
+
*/
|
|
20
|
+
export declare const SanitizedOAuthTokenSchema: z.ZodEffects<z.ZodObject<{
|
|
21
|
+
access_token: z.ZodString;
|
|
22
|
+
refresh_token: z.ZodOptional<z.ZodString>;
|
|
23
|
+
expiry: z.ZodNumber;
|
|
24
|
+
scope: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
25
|
+
token_type: z.ZodEnum<["Bearer", "bearer"]>;
|
|
26
|
+
resource_url: z.ZodOptional<z.ZodString>;
|
|
27
|
+
}, "passthrough", z.ZodTypeAny, z.objectOutputType<{
|
|
28
|
+
access_token: z.ZodString;
|
|
29
|
+
refresh_token: z.ZodOptional<z.ZodString>;
|
|
30
|
+
expiry: z.ZodNumber;
|
|
31
|
+
scope: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
32
|
+
token_type: z.ZodEnum<["Bearer", "bearer"]>;
|
|
33
|
+
resource_url: z.ZodOptional<z.ZodString>;
|
|
34
|
+
}, z.ZodTypeAny, "passthrough">, z.objectInputType<{
|
|
35
|
+
access_token: z.ZodString;
|
|
36
|
+
refresh_token: z.ZodOptional<z.ZodString>;
|
|
37
|
+
expiry: z.ZodNumber;
|
|
38
|
+
scope: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
39
|
+
token_type: z.ZodEnum<["Bearer", "bearer"]>;
|
|
40
|
+
resource_url: z.ZodOptional<z.ZodString>;
|
|
41
|
+
}, z.ZodTypeAny, "passthrough">>, {
|
|
42
|
+
[k: string]: unknown;
|
|
43
|
+
access_token: string;
|
|
44
|
+
expiry: number;
|
|
45
|
+
token_type: "Bearer" | "bearer";
|
|
46
|
+
scope?: string | null | undefined;
|
|
47
|
+
resource_url?: string | undefined;
|
|
48
|
+
}, z.objectInputType<{
|
|
49
|
+
access_token: z.ZodString;
|
|
50
|
+
refresh_token: z.ZodOptional<z.ZodString>;
|
|
51
|
+
expiry: z.ZodNumber;
|
|
52
|
+
scope: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
53
|
+
token_type: z.ZodEnum<["Bearer", "bearer"]>;
|
|
54
|
+
resource_url: z.ZodOptional<z.ZodString>;
|
|
55
|
+
}, z.ZodTypeAny, "passthrough">>;
|
|
56
|
+
export type SanitizedOAuthToken = z.infer<typeof SanitizedOAuthTokenSchema>;
|
|
16
57
|
export declare function sanitizeTokenForProxy(token: OAuthToken): SanitizedOAuthToken;
|
|
@@ -3,8 +3,16 @@
|
|
|
3
3
|
* Copyright 2025 Vybestack LLC
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
|
+
import { OAuthTokenSchema } from './types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Sanitized OAuth token schema: validates the supported OAuth fields while
|
|
9
|
+
* preserving provider-specific extension fields before the refresh_token is stripped.
|
|
10
|
+
*/
|
|
11
|
+
export const SanitizedOAuthTokenSchema = OAuthTokenSchema.passthrough().transform((token) => {
|
|
12
|
+
const { refresh_token: _refresh_token, ...rest } = token;
|
|
13
|
+
return rest;
|
|
14
|
+
});
|
|
6
15
|
export function sanitizeTokenForProxy(token) {
|
|
7
|
-
|
|
8
|
-
return sanitized;
|
|
16
|
+
return SanitizedOAuthTokenSchema.parse(token);
|
|
9
17
|
}
|
|
10
18
|
//# sourceMappingURL=token-sanitization.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token-sanitization.js","sourceRoot":"","sources":["../../src/token-sanitization.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"token-sanitization.js","sourceRoot":"","sources":["../../src/token-sanitization.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAYH,OAAO,EAAE,gBAAgB,EAAmB,MAAM,YAAY,CAAC;AAE/D;;;GAGG;AACH,MAAM,CAAC,MAAM,yBAAyB,GACpC,gBAAgB,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE;IACjD,MAAM,EAAE,aAAa,EAAE,cAAc,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC;IACzD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC,CAAC;AAIL,MAAM,UAAU,qBAAqB,CAAC,KAAiB;IACrD,OAAO,yBAAyB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AAChD,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vybestack/llxprt-code-auth",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.12.0-nightly.260910.2aac6841e",
|
|
4
4
|
"description": "LLxprt Code Auth — authentication and authorization domain",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"repository": {
|
|
@@ -65,6 +65,11 @@
|
|
|
65
65
|
"types": "./dist/src/proxy/proxy-token-store.d.ts",
|
|
66
66
|
"bun": "./src/proxy/proxy-token-store.ts",
|
|
67
67
|
"import": "./dist/src/proxy/proxy-token-store.js"
|
|
68
|
+
},
|
|
69
|
+
"./mcp-auth-provider-type.js": {
|
|
70
|
+
"types": "./dist/src/mcp-auth-provider-type.d.ts",
|
|
71
|
+
"bun": "./src/mcp-auth-provider-type.ts",
|
|
72
|
+
"import": "./dist/src/mcp-auth-provider-type.js"
|
|
68
73
|
}
|
|
69
74
|
},
|
|
70
75
|
"scripts": {
|
package/src/index.ts
CHANGED
|
@@ -20,6 +20,7 @@ export type {
|
|
|
20
20
|
OAuthUIEvent,
|
|
21
21
|
OAuthUIEventType,
|
|
22
22
|
OAuthUICallback,
|
|
23
|
+
OAuthInteractiveAuthOutcomeKind,
|
|
23
24
|
} from './oauth-ui-events.js';
|
|
24
25
|
export {
|
|
25
26
|
OAuthUIBridge,
|
|
@@ -73,7 +74,10 @@ export type { RetryConfig } from './oauth-errors.js';
|
|
|
73
74
|
export { mergeRefreshedToken } from './token-merge.js';
|
|
74
75
|
export type { OAuthTokenWithExtras } from './token-merge.js';
|
|
75
76
|
|
|
76
|
-
export {
|
|
77
|
+
export {
|
|
78
|
+
SanitizedOAuthTokenSchema,
|
|
79
|
+
sanitizeTokenForProxy,
|
|
80
|
+
} from './token-sanitization.js';
|
|
77
81
|
export type { SanitizedOAuthToken } from './token-sanitization.js';
|
|
78
82
|
|
|
79
83
|
// ─── Precedence / Auth Resolution ────────────────────────────────────────────
|
|
@@ -140,5 +144,16 @@ export type {
|
|
|
140
144
|
RequestOptions,
|
|
141
145
|
} from './proxy/proxy-socket-client.js';
|
|
142
146
|
|
|
147
|
+
export {
|
|
148
|
+
ProxyResponseSchema,
|
|
149
|
+
OAuthTokenDataSchema,
|
|
150
|
+
ProvidersDataSchema,
|
|
151
|
+
BucketsDataSchema,
|
|
152
|
+
BucketStatsDataSchema,
|
|
153
|
+
ApiKeyDataSchema,
|
|
154
|
+
ApiKeysDataSchema,
|
|
155
|
+
HasApiKeyDataSchema,
|
|
156
|
+
} from './proxy/proxy-payload-schemas.js';
|
|
157
|
+
|
|
143
158
|
export { ProxyTokenStore } from './proxy/proxy-token-store.js';
|
|
144
159
|
export { ProxyProviderKeyStorage } from './proxy/proxy-provider-key-storage.js';
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Vybestack LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* How an MCP server authenticates (#3305).
|
|
9
|
+
*
|
|
10
|
+
* Lives here rather than in `core` so that `@vybestack/llxprt-code-mcp` can
|
|
11
|
+
* reach it without depending on `core`, which value-imports `mcp` and would
|
|
12
|
+
* therefore form a runtime cycle. This package is a dependency-graph leaf, so
|
|
13
|
+
* both `core` and `mcp` can depend on it.
|
|
14
|
+
*/
|
|
15
|
+
export enum AuthProviderType {
|
|
16
|
+
DYNAMIC_DISCOVERY = 'dynamic_discovery',
|
|
17
|
+
GOOGLE_CREDENTIALS = 'google_credentials',
|
|
18
|
+
SERVICE_ACCOUNT_IMPERSONATION = 'service_account_impersonation',
|
|
19
|
+
}
|
package/src/oauth-ui-events.ts
CHANGED
|
@@ -17,8 +17,24 @@
|
|
|
17
17
|
* in `@vybestack/llxprt-code-auth` without importing UI types.
|
|
18
18
|
*/
|
|
19
19
|
|
|
20
|
+
/**
|
|
21
|
+
* @plan PLAN-20260827-ISSUE2562.P05
|
|
22
|
+
* @requirement REQ-2562-4
|
|
23
|
+
*/
|
|
20
24
|
/** The set of OAuth UI event discriminator values. */
|
|
21
|
-
export type OAuthUIEventType =
|
|
25
|
+
export type OAuthUIEventType =
|
|
26
|
+
| 'info'
|
|
27
|
+
| 'warning'
|
|
28
|
+
| 'error'
|
|
29
|
+
| 'oauth_url'
|
|
30
|
+
| 'oauth_waiting'
|
|
31
|
+
| 'oauth_settled';
|
|
32
|
+
|
|
33
|
+
export type OAuthInteractiveAuthOutcomeKind =
|
|
34
|
+
| 'succeeded'
|
|
35
|
+
| 'cancelled'
|
|
36
|
+
| 'failed'
|
|
37
|
+
| 'timed_out';
|
|
22
38
|
|
|
23
39
|
/**
|
|
24
40
|
* Discriminated union of all OAuth UI events.
|
|
@@ -27,6 +43,8 @@ export type OAuthUIEventType = 'info' | 'warning' | 'error' | 'oauth_url';
|
|
|
27
43
|
* - `warning`: a non-fatal warning message (e.g. a recoverable fallback).
|
|
28
44
|
* - `error`: a non-fatal error message.
|
|
29
45
|
* - `oauth_url`: an authorization URL the user must visit.
|
|
46
|
+
* - `oauth_waiting`: a host-owned interactive authentication session is waiting.
|
|
47
|
+
* - `oauth_settled`: a host-owned interactive authentication session settled.
|
|
30
48
|
*/
|
|
31
49
|
export type OAuthUIEvent =
|
|
32
50
|
| {
|
|
@@ -37,7 +55,24 @@ export type OAuthUIEvent =
|
|
|
37
55
|
}
|
|
38
56
|
| { readonly type: 'warning'; readonly text: string }
|
|
39
57
|
| { readonly type: 'error'; readonly text: string }
|
|
40
|
-
| { readonly type: 'oauth_url'; readonly text: string; readonly url: string }
|
|
58
|
+
| { readonly type: 'oauth_url'; readonly text: string; readonly url: string }
|
|
59
|
+
| {
|
|
60
|
+
readonly type: 'oauth_waiting';
|
|
61
|
+
readonly provider: string;
|
|
62
|
+
readonly bucket?: string;
|
|
63
|
+
readonly requesterRuntimeKind: string;
|
|
64
|
+
readonly correlationId: string;
|
|
65
|
+
readonly waiterCount: number;
|
|
66
|
+
}
|
|
67
|
+
| {
|
|
68
|
+
readonly type: 'oauth_settled';
|
|
69
|
+
readonly provider: string;
|
|
70
|
+
readonly bucket?: string;
|
|
71
|
+
readonly requesterRuntimeKind: string;
|
|
72
|
+
readonly correlationId: string;
|
|
73
|
+
readonly waiterCount: number;
|
|
74
|
+
readonly kind: OAuthInteractiveAuthOutcomeKind;
|
|
75
|
+
};
|
|
41
76
|
|
|
42
77
|
/**
|
|
43
78
|
* Callback invoked when an {@link OAuthUIEvent} is emitted to a handler.
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Vybestack LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Narrowly scoped schemas that validate credential-proxy payloads at the
|
|
9
|
+
* IPC trust boundary (issue #2197). Successful response envelopes and
|
|
10
|
+
* operation-specific data are parsed with these before use.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import { z } from 'zod';
|
|
14
|
+
import { OAuthTokenSchema, BucketStatsSchema } from '../types.js';
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Stable error message for a successful response whose data does not match its
|
|
18
|
+
* operation schema. Used at every client payload boundary.
|
|
19
|
+
*/
|
|
20
|
+
export const PROXY_PAYLOAD_ERROR = 'PROXY_PAYLOAD_ERROR';
|
|
21
|
+
|
|
22
|
+
export function proxyPayloadError(message: string): Error {
|
|
23
|
+
return new Error(`${PROXY_PAYLOAD_ERROR}: ${message}`);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Response envelope schema. `ok` must be boolean; `data` must be a
|
|
28
|
+
* non-null, non-array object when present; `error`, `code`, and
|
|
29
|
+
* `retryAfter` must have their protocol types when present. Unknown envelope
|
|
30
|
+
* fields, including the request `id`, are preserved so the same schema validates
|
|
31
|
+
* handshake and correlated frames.
|
|
32
|
+
*/
|
|
33
|
+
export const ProxyResponseSchema = z
|
|
34
|
+
.object({
|
|
35
|
+
ok: z.boolean(),
|
|
36
|
+
data: z.record(z.string(), z.unknown()).optional(),
|
|
37
|
+
error: z.string().optional(),
|
|
38
|
+
code: z.string().optional(),
|
|
39
|
+
retryAfter: z.number().optional(),
|
|
40
|
+
})
|
|
41
|
+
.passthrough();
|
|
42
|
+
|
|
43
|
+
export type ProxyResponse = z.infer<typeof ProxyResponseSchema>;
|
|
44
|
+
|
|
45
|
+
/** Success payload for get_token. Validates and preserves the full OAuth token. */
|
|
46
|
+
export const OAuthTokenDataSchema = OAuthTokenSchema.passthrough();
|
|
47
|
+
|
|
48
|
+
/** Success payload for list_providers. */
|
|
49
|
+
export const ProvidersDataSchema = z.object({
|
|
50
|
+
providers: z.array(z.string()),
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
/** Success payload for list_buckets. */
|
|
54
|
+
export const BucketsDataSchema = z.object({ buckets: z.array(z.string()) });
|
|
55
|
+
|
|
56
|
+
/** Success payload for get_bucket_stats. */
|
|
57
|
+
export const BucketStatsDataSchema = BucketStatsSchema.passthrough();
|
|
58
|
+
|
|
59
|
+
/** Success payload for get_api_key. */
|
|
60
|
+
export const ApiKeyDataSchema = z.object({ key: z.string() });
|
|
61
|
+
|
|
62
|
+
/** Success payload for list_api_keys. */
|
|
63
|
+
export const ApiKeysDataSchema = z.object({ keys: z.array(z.string()) });
|
|
64
|
+
|
|
65
|
+
/** Success payload for has_api_key. */
|
|
66
|
+
export const HasApiKeyDataSchema = z.object({ exists: z.boolean() });
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Parses an operation-specific successful payload with the given schema. When
|
|
70
|
+
* the data is missing, malformed, or wrong-typed, throws the stable proxy
|
|
71
|
+
* payload validation error.
|
|
72
|
+
*/
|
|
73
|
+
export function parseSuccessPayload<T>(
|
|
74
|
+
schema: z.ZodType<T, z.ZodTypeDef, unknown>,
|
|
75
|
+
data: Record<string, unknown> | undefined,
|
|
76
|
+
operation: string,
|
|
77
|
+
): T {
|
|
78
|
+
if (data === undefined) {
|
|
79
|
+
throw proxyPayloadError(`${operation}: missing data`);
|
|
80
|
+
}
|
|
81
|
+
const parsed = schema.safeParse(data);
|
|
82
|
+
if (!parsed.success) {
|
|
83
|
+
throw proxyPayloadError(`${operation}: malformed payload`);
|
|
84
|
+
}
|
|
85
|
+
return parsed.data;
|
|
86
|
+
}
|
|
@@ -14,6 +14,12 @@
|
|
|
14
14
|
*/
|
|
15
15
|
|
|
16
16
|
import type { ProxySocketClient } from './proxy-socket-client.js';
|
|
17
|
+
import {
|
|
18
|
+
ApiKeyDataSchema,
|
|
19
|
+
ApiKeysDataSchema,
|
|
20
|
+
HasApiKeyDataSchema,
|
|
21
|
+
parseSuccessPayload,
|
|
22
|
+
} from './proxy-payload-schemas.js';
|
|
17
23
|
|
|
18
24
|
export class ProxyProviderKeyStorage {
|
|
19
25
|
private readonly client: ProxySocketClient;
|
|
@@ -28,7 +34,8 @@ export class ProxyProviderKeyStorage {
|
|
|
28
34
|
if (response.code === 'NOT_FOUND') return null;
|
|
29
35
|
throw new Error(response.error ?? 'proxy error');
|
|
30
36
|
}
|
|
31
|
-
return response.data
|
|
37
|
+
return parseSuccessPayload(ApiKeyDataSchema, response.data, 'get_api_key')
|
|
38
|
+
.key;
|
|
32
39
|
}
|
|
33
40
|
|
|
34
41
|
async listKeys(): Promise<string[]> {
|
|
@@ -36,7 +43,11 @@ export class ProxyProviderKeyStorage {
|
|
|
36
43
|
if (!response.ok) {
|
|
37
44
|
throw new Error(response.error ?? 'proxy error');
|
|
38
45
|
}
|
|
39
|
-
return
|
|
46
|
+
return parseSuccessPayload(
|
|
47
|
+
ApiKeysDataSchema,
|
|
48
|
+
response.data,
|
|
49
|
+
'list_api_keys',
|
|
50
|
+
).keys;
|
|
40
51
|
}
|
|
41
52
|
|
|
42
53
|
async hasKey(name: string): Promise<boolean> {
|
|
@@ -44,7 +55,11 @@ export class ProxyProviderKeyStorage {
|
|
|
44
55
|
if (!response.ok) {
|
|
45
56
|
throw new Error(response.error ?? 'proxy error');
|
|
46
57
|
}
|
|
47
|
-
return
|
|
58
|
+
return parseSuccessPayload(
|
|
59
|
+
HasApiKeyDataSchema,
|
|
60
|
+
response.data,
|
|
61
|
+
'has_api_key',
|
|
62
|
+
).exists;
|
|
48
63
|
}
|
|
49
64
|
|
|
50
65
|
async saveKey(_name: string, _apiKey: string): Promise<void> {
|
|
@@ -15,19 +15,17 @@
|
|
|
15
15
|
import * as net from 'node:net';
|
|
16
16
|
import * as crypto from 'node:crypto';
|
|
17
17
|
import { encodeFrame, FrameDecoder } from './framing.js';
|
|
18
|
+
import {
|
|
19
|
+
ProxyResponseSchema,
|
|
20
|
+
type ProxyResponse,
|
|
21
|
+
} from './proxy-payload-schemas.js';
|
|
22
|
+
|
|
23
|
+
export type { ProxyResponse } from './proxy-payload-schemas.js';
|
|
18
24
|
|
|
19
25
|
export const REQUEST_TIMEOUT_MS = 30000;
|
|
20
26
|
export const IDLE_TIMEOUT_MS = 300000;
|
|
21
27
|
export const PROTOCOL_VERSION = 2;
|
|
22
28
|
|
|
23
|
-
export type ProxyResponse = {
|
|
24
|
-
ok: boolean;
|
|
25
|
-
data?: Record<string, unknown>;
|
|
26
|
-
error?: string;
|
|
27
|
-
code?: string;
|
|
28
|
-
retryAfter?: number;
|
|
29
|
-
};
|
|
30
|
-
|
|
31
29
|
/**
|
|
32
30
|
* Per-request options controlling timeout and cancellation.
|
|
33
31
|
*
|
|
@@ -42,26 +40,12 @@ export interface RequestOptions {
|
|
|
42
40
|
signal?: AbortSignal;
|
|
43
41
|
}
|
|
44
42
|
|
|
45
|
-
|
|
46
|
-
* against adversarial or malformed server responses with unexpected types
|
|
47
|
-
* for `ok`, `code`, or `error`. */
|
|
48
|
-
function isProxyResponseFrame(
|
|
43
|
+
function parseResponseFrame(
|
|
49
44
|
frame: Record<string, unknown>,
|
|
50
|
-
):
|
|
51
|
-
|
|
52
|
-
if (
|
|
53
|
-
|
|
54
|
-
return false;
|
|
55
|
-
if (frame.retryAfter !== undefined && typeof frame.retryAfter !== 'number')
|
|
56
|
-
return false;
|
|
57
|
-
if (
|
|
58
|
-
frame.data !== undefined &&
|
|
59
|
-
(typeof frame.data !== 'object' ||
|
|
60
|
-
frame.data === null ||
|
|
61
|
-
Array.isArray(frame.data))
|
|
62
|
-
)
|
|
63
|
-
return false;
|
|
64
|
-
return true;
|
|
45
|
+
): ProxyResponse | null {
|
|
46
|
+
const parsed = ProxyResponseSchema.safeParse(frame);
|
|
47
|
+
if (!parsed.success) return null;
|
|
48
|
+
return parsed.data;
|
|
65
49
|
}
|
|
66
50
|
|
|
67
51
|
const PROXY_CONNECT_FAILURE_PATTERN =
|
|
@@ -452,7 +436,7 @@ export class ProxySocketClient {
|
|
|
452
436
|
);
|
|
453
437
|
}
|
|
454
438
|
// Record the negotiated version from the server's handshake_ack.
|
|
455
|
-
const serverVersion = response.data?.version
|
|
439
|
+
const serverVersion = response.data?.version;
|
|
456
440
|
this._negotiatedVersion =
|
|
457
441
|
typeof serverVersion === 'number' ? serverVersion : 1;
|
|
458
442
|
this.handshakeComplete = true;
|
|
@@ -489,8 +473,9 @@ export class ProxySocketClient {
|
|
|
489
473
|
return;
|
|
490
474
|
}
|
|
491
475
|
this.handshakeResolver = null;
|
|
492
|
-
|
|
493
|
-
|
|
476
|
+
const parsedFrame = parseResponseFrame(frame);
|
|
477
|
+
if (parsedFrame !== null) {
|
|
478
|
+
resolver.resolve(parsedFrame);
|
|
494
479
|
} else {
|
|
495
480
|
// Reject first, then clean up. destroy() will not double-reject
|
|
496
481
|
// because handshakeResolver was already nulled above.
|
|
@@ -509,8 +494,8 @@ export class ProxySocketClient {
|
|
|
509
494
|
* @pseudocode 002-frame-and-cancel.md lines 30-32
|
|
510
495
|
*/
|
|
511
496
|
private resolvePendingRequest(frame: Record<string, unknown>): void {
|
|
512
|
-
const id = frame.id
|
|
513
|
-
if (
|
|
497
|
+
const id = frame.id;
|
|
498
|
+
if (typeof id !== 'string' || id === '') {
|
|
514
499
|
return;
|
|
515
500
|
}
|
|
516
501
|
const pending = this.pendingRequests.get(id);
|
|
@@ -518,8 +503,9 @@ export class ProxySocketClient {
|
|
|
518
503
|
clearTimeout(pending.timer);
|
|
519
504
|
this.pendingRequests.delete(id);
|
|
520
505
|
this.releaseAbortCleanup(id);
|
|
521
|
-
|
|
522
|
-
|
|
506
|
+
const parsedFrame = parseResponseFrame(frame);
|
|
507
|
+
if (parsedFrame !== null) {
|
|
508
|
+
pending.resolve(parsedFrame);
|
|
523
509
|
} else {
|
|
524
510
|
pending.reject(new Error(`Malformed response for request ${id}`));
|
|
525
511
|
this.destroy('Malformed response from proxy — connection reset');
|
|
@@ -15,6 +15,13 @@
|
|
|
15
15
|
|
|
16
16
|
import { type OAuthToken, type BucketStats } from '../types.js';
|
|
17
17
|
import { type TokenStore } from '../token-store.js';
|
|
18
|
+
import {
|
|
19
|
+
OAuthTokenDataSchema,
|
|
20
|
+
parseSuccessPayload,
|
|
21
|
+
ProvidersDataSchema,
|
|
22
|
+
BucketsDataSchema,
|
|
23
|
+
BucketStatsDataSchema,
|
|
24
|
+
} from './proxy-payload-schemas.js';
|
|
18
25
|
import { ProxySocketClient } from './proxy-socket-client.js';
|
|
19
26
|
|
|
20
27
|
export class ProxyTokenStore implements TokenStore {
|
|
@@ -34,7 +41,11 @@ export class ProxyTokenStore implements TokenStore {
|
|
|
34
41
|
});
|
|
35
42
|
if (!response.ok && response.code === 'NOT_FOUND') return null;
|
|
36
43
|
if (!response.ok) throw new Error(response.error ?? 'proxy error');
|
|
37
|
-
return
|
|
44
|
+
return parseSuccessPayload(
|
|
45
|
+
OAuthTokenDataSchema,
|
|
46
|
+
response.data,
|
|
47
|
+
'get_token',
|
|
48
|
+
);
|
|
38
49
|
}
|
|
39
50
|
|
|
40
51
|
async saveToken(
|
|
@@ -60,14 +71,25 @@ export class ProxyTokenStore implements TokenStore {
|
|
|
60
71
|
|
|
61
72
|
async listProviders(): Promise<string[]> {
|
|
62
73
|
const response = await this.client.request('list_providers', {});
|
|
63
|
-
if (!response.ok)
|
|
64
|
-
|
|
74
|
+
if (!response.ok) {
|
|
75
|
+
throw new Error(response.error ?? 'proxy error');
|
|
76
|
+
}
|
|
77
|
+
return parseSuccessPayload(
|
|
78
|
+
ProvidersDataSchema,
|
|
79
|
+
response.data,
|
|
80
|
+
'list_providers',
|
|
81
|
+
).providers;
|
|
65
82
|
}
|
|
66
83
|
|
|
67
84
|
async listBuckets(provider: string): Promise<string[]> {
|
|
68
|
-
const response = await this.client.request('list_buckets', {
|
|
69
|
-
|
|
70
|
-
|
|
85
|
+
const response = await this.client.request('list_buckets', {
|
|
86
|
+
provider,
|
|
87
|
+
});
|
|
88
|
+
if (!response.ok) {
|
|
89
|
+
throw new Error(response.error ?? 'proxy error');
|
|
90
|
+
}
|
|
91
|
+
return parseSuccessPayload(BucketsDataSchema, response.data, 'list_buckets')
|
|
92
|
+
.buckets;
|
|
71
93
|
}
|
|
72
94
|
|
|
73
95
|
async getBucketStats(
|
|
@@ -80,14 +102,11 @@ export class ProxyTokenStore implements TokenStore {
|
|
|
80
102
|
});
|
|
81
103
|
if (!response.ok && response.code === 'NOT_FOUND') return null;
|
|
82
104
|
if (!response.ok) throw new Error(response.error ?? 'proxy error');
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
percentage: typeof data.percentage === 'number' ? data.percentage : 0,
|
|
89
|
-
lastUsed: data.lastUsed as number | undefined,
|
|
90
|
-
};
|
|
105
|
+
return parseSuccessPayload(
|
|
106
|
+
BucketStatsDataSchema,
|
|
107
|
+
response.data,
|
|
108
|
+
'get_bucket_stats',
|
|
109
|
+
);
|
|
91
110
|
}
|
|
92
111
|
|
|
93
112
|
async acquireRefreshLock(
|
|
@@ -13,12 +13,21 @@
|
|
|
13
13
|
* @pseudocode analysis/pseudocode/002-token-sanitization-merge.md
|
|
14
14
|
*/
|
|
15
15
|
|
|
16
|
-
import {
|
|
16
|
+
import type { z } from 'zod';
|
|
17
|
+
import { OAuthTokenSchema, type OAuthToken } from './types.js';
|
|
17
18
|
|
|
18
|
-
|
|
19
|
-
|
|
19
|
+
/**
|
|
20
|
+
* Sanitized OAuth token schema: validates the supported OAuth fields while
|
|
21
|
+
* preserving provider-specific extension fields before the refresh_token is stripped.
|
|
22
|
+
*/
|
|
23
|
+
export const SanitizedOAuthTokenSchema =
|
|
24
|
+
OAuthTokenSchema.passthrough().transform((token) => {
|
|
25
|
+
const { refresh_token: _refresh_token, ...rest } = token;
|
|
26
|
+
return rest;
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
export type SanitizedOAuthToken = z.infer<typeof SanitizedOAuthTokenSchema>;
|
|
20
30
|
|
|
21
31
|
export function sanitizeTokenForProxy(token: OAuthToken): SanitizedOAuthToken {
|
|
22
|
-
|
|
23
|
-
return sanitized;
|
|
32
|
+
return SanitizedOAuthTokenSchema.parse(token);
|
|
24
33
|
}
|