@plurnk/plurnk-mcp 1.6.1 → 1.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/.env.defaults +6 -4
- package/README.md +110 -45
- package/SPEC.md +274 -30
- package/dist/McpExecutor.d.ts +25 -4
- package/dist/McpExecutor.d.ts.map +1 -1
- package/dist/McpExecutor.js +105 -31
- package/dist/McpExecutor.js.map +1 -1
- package/dist/McpResources.d.ts +2 -2
- package/dist/McpResources.d.ts.map +1 -1
- package/dist/McpResources.js +114 -24
- package/dist/McpResources.js.map +1 -1
- package/dist/Module.d.ts +30 -5
- package/dist/Module.d.ts.map +1 -1
- package/dist/Module.js +649 -35
- package/dist/Module.js.map +1 -1
- package/dist/ToolPresentation.d.ts +5 -0
- package/dist/ToolPresentation.d.ts.map +1 -0
- package/dist/ToolPresentation.js +134 -0
- package/dist/ToolPresentation.js.map +1 -0
- package/dist/client.d.ts +25 -7
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +478 -85
- package/dist/client.js.map +1 -1
- package/dist/config.d.ts +7 -13
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +114 -45
- package/dist/config.js.map +1 -1
- package/dist/extensionChannel.d.ts +25 -0
- package/dist/extensionChannel.d.ts.map +1 -0
- package/dist/extensionChannel.js +195 -0
- package/dist/extensionChannel.js.map +1 -0
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/inputRequired.d.ts +36 -0
- package/dist/inputRequired.d.ts.map +1 -0
- package/dist/inputRequired.js +171 -0
- package/dist/inputRequired.js.map +1 -0
- package/dist/oauth.d.ts +28 -0
- package/dist/oauth.d.ts.map +1 -0
- package/dist/oauth.js +149 -0
- package/dist/oauth.js.map +1 -0
- package/dist/protocol.d.ts +7 -0
- package/dist/protocol.d.ts.map +1 -0
- package/dist/protocol.js +7 -0
- package/dist/protocol.js.map +1 -0
- package/dist/protocolHeaders.d.ts +4 -0
- package/dist/protocolHeaders.d.ts.map +1 -0
- package/dist/protocolHeaders.js +87 -0
- package/dist/protocolHeaders.js.map +1 -0
- package/dist/subscriptions.d.ts +15 -0
- package/dist/subscriptions.d.ts.map +1 -0
- package/dist/subscriptions.js +188 -0
- package/dist/subscriptions.js.map +1 -0
- package/dist/tasks.d.ts +19 -0
- package/dist/tasks.d.ts.map +1 -0
- package/dist/tasks.js +334 -0
- package/dist/tasks.js.map +1 -0
- package/package.json +10 -6
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EACH,kBAAkB,EAClB,uBAAuB,EACvB,oBAAoB,EACpB,wBAAwB,EACxB,sBAAsB,EACtB,8BAA8B,GACjC,MAAM,eAAe,CAAC;AACvB,OAAO,EACH,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,WAAW,EACX,kBAAkB,GACrB,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { type CallToolRequest, type CallToolResult, type GetPromptRequest, type GetPromptResult, type InputRequiredResult, type InputResponse, type Progress, type ReadResourceRequest, type ReadResourceResult } from "@modelcontextprotocol/client";
|
|
2
|
+
import type { ClientInteractionRequest, ClientInteractionResolution } from "@plurnk/plurnk-contracts";
|
|
3
|
+
export type ClientInteractionHandler = (request: ClientInteractionRequest) => Promise<ClientInteractionResolution>;
|
|
4
|
+
type InputRequiredMethod = "tools/call" | "resources/read" | "prompts/get" | "tasks/update";
|
|
5
|
+
type CoreInputRequiredParams = CallToolRequest["params"] | ReadResourceRequest["params"] | GetPromptRequest["params"];
|
|
6
|
+
type InputRequiredCompleteResult = CallToolResult | ReadResourceResult | GetPromptResult;
|
|
7
|
+
interface InputRequiredLegOptions {
|
|
8
|
+
readonly signal?: AbortSignal;
|
|
9
|
+
readonly timeout: number;
|
|
10
|
+
readonly maxTotalTimeout: number;
|
|
11
|
+
readonly allowInputRequired: true;
|
|
12
|
+
readonly onprogress?: (progress: Progress) => void;
|
|
13
|
+
}
|
|
14
|
+
type InputRequiredLeg<T, P extends object> = (params: P, options: InputRequiredLegOptions, retry: boolean) => Promise<T | InputRequiredResult>;
|
|
15
|
+
interface InputRequiredRequestOptions<T, P extends object> {
|
|
16
|
+
readonly server: string;
|
|
17
|
+
readonly operation: InputRequiredMethod;
|
|
18
|
+
readonly originalParams: P;
|
|
19
|
+
readonly signal?: AbortSignal;
|
|
20
|
+
readonly onProgress?: (progress: Progress) => void;
|
|
21
|
+
readonly interact?: ClientInteractionHandler;
|
|
22
|
+
readonly timeout: number;
|
|
23
|
+
readonly requestLeg: InputRequiredLeg<T, P>;
|
|
24
|
+
}
|
|
25
|
+
interface ResolveInputRequestsOptions {
|
|
26
|
+
readonly server: string;
|
|
27
|
+
readonly operation: InputRequiredMethod;
|
|
28
|
+
readonly inputRequests: Readonly<Record<string, unknown>>;
|
|
29
|
+
readonly interact?: ClientInteractionHandler;
|
|
30
|
+
readonly arguments?: Readonly<Record<string, unknown>>;
|
|
31
|
+
}
|
|
32
|
+
export declare const INPUT_REQUIRED_MAX_ROUNDS = 10;
|
|
33
|
+
export declare const resolveInputRequests: ({ server, operation, inputRequests, interact, arguments: args, }: ResolveInputRequestsOptions) => Promise<Record<string, InputResponse>>;
|
|
34
|
+
export declare const runInputRequiredRequest: <T = InputRequiredCompleteResult, P extends object = CoreInputRequiredParams>({ server, operation, originalParams, signal, onProgress, interact, timeout, requestLeg, }: InputRequiredRequestOptions<T, P>) => Promise<T>;
|
|
35
|
+
export {};
|
|
36
|
+
//# sourceMappingURL=inputRequired.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inputRequired.d.ts","sourceRoot":"","sources":["../src/inputRequired.ts"],"names":[],"mappings":"AAAA,OAAO,EAMH,KAAK,eAAe,EACpB,KAAK,cAAc,EAGnB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,mBAAmB,EACxB,KAAK,aAAa,EAElB,KAAK,QAAQ,EACb,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EAC1B,MAAM,8BAA8B,CAAC;AACtC,OAAO,KAAK,EACR,wBAAwB,EACxB,2BAA2B,EAC9B,MAAM,0BAA0B,CAAC;AAGlC,MAAM,MAAM,wBAAwB,GAAG,CACnC,OAAO,EAAE,wBAAwB,KAChC,OAAO,CAAC,2BAA2B,CAAC,CAAC;AAE1C,KAAK,mBAAmB,GAAG,YAAY,GAAG,gBAAgB,GAAG,aAAa,GAAG,cAAc,CAAC;AAC5F,KAAK,uBAAuB,GAAG,eAAe,CAAC,QAAQ,CAAC,GAClD,mBAAmB,CAAC,QAAQ,CAAC,GAC7B,gBAAgB,CAAC,QAAQ,CAAC,CAAC;AACjC,KAAK,2BAA2B,GAAG,cAAc,GAAG,kBAAkB,GAAG,eAAe,CAAC;AAEzF,UAAU,uBAAuB;IAC7B,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,kBAAkB,EAAE,IAAI,CAAC;IAClC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,IAAI,CAAC;CACtD;AAED,KAAK,gBAAgB,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,IAAI,CACzC,MAAM,EAAE,CAAC,EACT,OAAO,EAAE,uBAAuB,EAChC,KAAK,EAAE,OAAO,KACb,OAAO,CAAC,CAAC,GAAG,mBAAmB,CAAC,CAAC;AAEtC,UAAU,2BAA2B,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM;IACrD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,mBAAmB,CAAC;IACxC,QAAQ,CAAC,cAAc,EAAE,CAAC,CAAC;IAC3B,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,IAAI,CAAC;IACnD,QAAQ,CAAC,QAAQ,CAAC,EAAE,wBAAwB,CAAC;IAC7C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;CAC/C;AAED,UAAU,2BAA2B;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,mBAAmB,CAAC;IACxC,QAAQ,CAAC,aAAa,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC1D,QAAQ,CAAC,QAAQ,CAAC,EAAE,wBAAwB,CAAC;IAC7C,QAAQ,CAAC,SAAS,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CAC1D;AAED,eAAO,MAAM,yBAAyB,KAAK,CAAC;AA8F5C,eAAO,MAAM,oBAAoB,qEAM9B,2BAA2B,KAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAUrE,CAAC;AAyCF,eAAO,MAAM,uBAAuB,GAChC,CAAC,GAAG,2BAA2B,EAC/B,CAAC,SAAS,MAAM,GAAG,uBAAuB,6FAU3C,2BAA2B,CAAC,CAAC,EAAE,CAAC,CAAC,KAAG,OAAO,CAAC,CAAC,CAyE/C,CAAC"}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import { fromJsonSchema, isInputRequiredResult, SdkError, SdkErrorCode, specTypeSchemas, } from "@modelcontextprotocol/client";
|
|
2
|
+
import { setTimeout as delay } from "node:timers/promises";
|
|
3
|
+
export const INPUT_REQUIRED_MAX_ROUNDS = 10;
|
|
4
|
+
const REQUEST_STATE_ONLY_PACING_MS = 250;
|
|
5
|
+
const INPUT_REQUIRED_TOOL = "mcp_input_required";
|
|
6
|
+
const formatValidationIssues = (issues) => issues.map((issue) => issue.path?.length
|
|
7
|
+
? `${issue.path.map(String).join(".")}: ${issue.message}`
|
|
8
|
+
: issue.message).join(", ");
|
|
9
|
+
const elicitationResponseSchema = (request) => {
|
|
10
|
+
const params = request.params;
|
|
11
|
+
if (params.mode === "url") {
|
|
12
|
+
return {
|
|
13
|
+
type: "object",
|
|
14
|
+
required: ["action"],
|
|
15
|
+
additionalProperties: false,
|
|
16
|
+
properties: {
|
|
17
|
+
action: { enum: ["accept", "decline", "cancel"] },
|
|
18
|
+
},
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
return {
|
|
22
|
+
oneOf: [
|
|
23
|
+
{
|
|
24
|
+
type: "object",
|
|
25
|
+
required: ["action", "content"],
|
|
26
|
+
additionalProperties: false,
|
|
27
|
+
properties: {
|
|
28
|
+
action: { const: "accept" },
|
|
29
|
+
content: params.requestedSchema,
|
|
30
|
+
},
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
type: "object",
|
|
34
|
+
required: ["action"],
|
|
35
|
+
additionalProperties: false,
|
|
36
|
+
properties: {
|
|
37
|
+
action: { enum: ["decline", "cancel"] },
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
],
|
|
41
|
+
};
|
|
42
|
+
};
|
|
43
|
+
const supportedElicitations = (server, operation, inputRequests) => Object.entries(inputRequests).map(([key, candidate]) => {
|
|
44
|
+
const request = candidate;
|
|
45
|
+
if (request.method !== "elicitation/create") {
|
|
46
|
+
throw new Error(`MCP server '${server}' requested unsupported embedded input method '${String(request.method)}' during '${operation}'; Plurnk advertises only elicitation form and URL modes.`);
|
|
47
|
+
}
|
|
48
|
+
const parsed = specTypeSchemas.ElicitRequest["~standard"].validate(candidate);
|
|
49
|
+
if (parsed.issues !== undefined) {
|
|
50
|
+
throw new Error(`MCP server '${server}' supplied invalid elicitation '${key}' during '${operation}': ${formatValidationIssues(parsed.issues)}.`);
|
|
51
|
+
}
|
|
52
|
+
return [key, parsed.value];
|
|
53
|
+
});
|
|
54
|
+
const interactionRequest = (server, operation, entries, args = {}) => {
|
|
55
|
+
const properties = Object.fromEntries(entries.map(([key, request]) => [
|
|
56
|
+
key,
|
|
57
|
+
elicitationResponseSchema(request),
|
|
58
|
+
]));
|
|
59
|
+
return {
|
|
60
|
+
toolName: INPUT_REQUIRED_TOOL,
|
|
61
|
+
arguments: {
|
|
62
|
+
server,
|
|
63
|
+
operation,
|
|
64
|
+
...args,
|
|
65
|
+
requests: Object.fromEntries(entries),
|
|
66
|
+
},
|
|
67
|
+
message: entries.length === 1
|
|
68
|
+
? entries[0][1].params.message
|
|
69
|
+
: `MCP server '${server}' requires ${entries.length} responses to continue '${operation}'.`,
|
|
70
|
+
responseSchema: {
|
|
71
|
+
type: "object",
|
|
72
|
+
required: entries.map(([key]) => key),
|
|
73
|
+
additionalProperties: false,
|
|
74
|
+
properties,
|
|
75
|
+
},
|
|
76
|
+
};
|
|
77
|
+
};
|
|
78
|
+
export const resolveInputRequests = async ({ server, operation, inputRequests, interact, arguments: args, }) => {
|
|
79
|
+
const entries = supportedElicitations(server, operation, inputRequests);
|
|
80
|
+
if (entries.length === 0)
|
|
81
|
+
return {};
|
|
82
|
+
if (interact === undefined) {
|
|
83
|
+
throw new Error(`MCP server '${server}' requires client input during '${operation}', but this operation has no client interaction owner.`);
|
|
84
|
+
}
|
|
85
|
+
const request = interactionRequest(server, operation, entries, args);
|
|
86
|
+
return resolvedInputResponses(request, await interact(request));
|
|
87
|
+
};
|
|
88
|
+
const cancelledInputResponses = (entries) => Object.fromEntries(entries.map(([key]) => [
|
|
89
|
+
key,
|
|
90
|
+
{ action: "cancel" },
|
|
91
|
+
]));
|
|
92
|
+
const resolvedInputResponses = async (request, resolution) => {
|
|
93
|
+
if (resolution.status === "cancelled") {
|
|
94
|
+
const entries = Object.entries(request.arguments.requests);
|
|
95
|
+
return cancelledInputResponses(entries);
|
|
96
|
+
}
|
|
97
|
+
const validator = fromJsonSchema(request.responseSchema);
|
|
98
|
+
const validation = await validator["~standard"].validate(resolution.payload);
|
|
99
|
+
if (validation.issues !== undefined) {
|
|
100
|
+
throw new Error(`MCP client interaction response is invalid: ${formatValidationIssues(validation.issues)}.`);
|
|
101
|
+
}
|
|
102
|
+
const responses = {};
|
|
103
|
+
for (const [key, value] of Object.entries(validation.value)) {
|
|
104
|
+
const parsed = specTypeSchemas.ElicitResult["~standard"].validate(value);
|
|
105
|
+
if (parsed.issues !== undefined) {
|
|
106
|
+
throw new Error(`MCP client interaction response '${key}' is invalid: ${formatValidationIssues(parsed.issues)}.`);
|
|
107
|
+
}
|
|
108
|
+
responses[key] = parsed.value;
|
|
109
|
+
}
|
|
110
|
+
return responses;
|
|
111
|
+
};
|
|
112
|
+
export const runInputRequiredRequest = async ({ server, operation, originalParams, signal, onProgress, interact, timeout, requestLeg, }) => {
|
|
113
|
+
const startedAt = Date.now();
|
|
114
|
+
const options = {
|
|
115
|
+
signal,
|
|
116
|
+
timeout,
|
|
117
|
+
maxTotalTimeout: timeout,
|
|
118
|
+
allowInputRequired: true,
|
|
119
|
+
...(onProgress === undefined ? {} : { onprogress: onProgress }),
|
|
120
|
+
};
|
|
121
|
+
let result = await requestLeg(originalParams, options, false);
|
|
122
|
+
let round = 0;
|
|
123
|
+
while (isInputRequiredResult(result)) {
|
|
124
|
+
round += 1;
|
|
125
|
+
if (round > INPUT_REQUIRED_MAX_ROUNDS) {
|
|
126
|
+
throw new SdkError(SdkErrorCode.InputRequiredRoundsExceeded, `Multi-round-trip request '${operation}' still required input after ${INPUT_REQUIRED_MAX_ROUNDS} rounds.`, {
|
|
127
|
+
rounds: INPUT_REQUIRED_MAX_ROUNDS,
|
|
128
|
+
lastResult: result,
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
onProgress?.({
|
|
132
|
+
progress: round,
|
|
133
|
+
message: `Fulfilling input required by '${operation}' (round ${round})`,
|
|
134
|
+
});
|
|
135
|
+
let inputResponses;
|
|
136
|
+
const inputRequests = result.inputRequests ?? {};
|
|
137
|
+
if (Object.keys(inputRequests).length === 0) {
|
|
138
|
+
await delay(REQUEST_STATE_ONLY_PACING_MS, undefined, signal === undefined ? {} : { signal });
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
inputResponses = await resolveInputRequests({
|
|
142
|
+
server,
|
|
143
|
+
operation,
|
|
144
|
+
inputRequests,
|
|
145
|
+
interact,
|
|
146
|
+
});
|
|
147
|
+
signal?.throwIfAborted();
|
|
148
|
+
}
|
|
149
|
+
const elapsed = Date.now() - startedAt;
|
|
150
|
+
const remaining = timeout - elapsed;
|
|
151
|
+
if (remaining <= 0) {
|
|
152
|
+
throw new SdkError(SdkErrorCode.RequestTimeout, `MCP '${operation}' exceeded its ${timeout}ms operation timeout.`, { maxTotalTimeout: timeout, totalElapsed: elapsed });
|
|
153
|
+
}
|
|
154
|
+
const retryParams = {
|
|
155
|
+
...originalParams,
|
|
156
|
+
...(inputResponses === undefined || Object.keys(inputResponses).length === 0
|
|
157
|
+
? {}
|
|
158
|
+
: { inputResponses }),
|
|
159
|
+
...(result.requestState === undefined
|
|
160
|
+
? {}
|
|
161
|
+
: { requestState: result.requestState }),
|
|
162
|
+
};
|
|
163
|
+
result = await requestLeg(retryParams, {
|
|
164
|
+
...options,
|
|
165
|
+
timeout: Math.min(timeout, remaining),
|
|
166
|
+
maxTotalTimeout: remaining,
|
|
167
|
+
}, true);
|
|
168
|
+
}
|
|
169
|
+
return result;
|
|
170
|
+
};
|
|
171
|
+
//# sourceMappingURL=inputRequired.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inputRequired.js","sourceRoot":"","sources":["../src/inputRequired.ts"],"names":[],"mappings":"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"}
|
package/dist/oauth.d.ts
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { OAuthClientInformationContext, OAuthClientMetadata, OAuthClientProvider, OAuthDiscoveryState, StoredOAuthClientInformation, StoredOAuthTokens } from "@modelcontextprotocol/client";
|
|
2
|
+
export default class InteractiveOAuthProvider implements OAuthClientProvider {
|
|
3
|
+
#private;
|
|
4
|
+
readonly redirectUrl: string;
|
|
5
|
+
readonly clientMetadataUrl: string | undefined;
|
|
6
|
+
constructor({ redirectUrl, clientMetadataUrl, clientId, clientSecret, scope, }: {
|
|
7
|
+
redirectUrl: string;
|
|
8
|
+
clientMetadataUrl?: string;
|
|
9
|
+
clientId?: string;
|
|
10
|
+
clientSecret?: string;
|
|
11
|
+
scope?: string;
|
|
12
|
+
});
|
|
13
|
+
get clientMetadata(): OAuthClientMetadata;
|
|
14
|
+
state(): string;
|
|
15
|
+
clientInformation(context?: OAuthClientInformationContext): StoredOAuthClientInformation | undefined;
|
|
16
|
+
saveClientInformation(clientInformation: StoredOAuthClientInformation, context?: OAuthClientInformationContext): void;
|
|
17
|
+
tokens(context?: OAuthClientInformationContext): StoredOAuthTokens | undefined;
|
|
18
|
+
saveTokens(tokens: StoredOAuthTokens, context?: OAuthClientInformationContext): void;
|
|
19
|
+
redirectToAuthorization(authorizationUrl: URL): void;
|
|
20
|
+
takeAuthorizationUrl(): URL | undefined;
|
|
21
|
+
assertCallbackState(callback: URL): void;
|
|
22
|
+
saveCodeVerifier(codeVerifier: string): void;
|
|
23
|
+
codeVerifier(): string;
|
|
24
|
+
saveDiscoveryState(state: OAuthDiscoveryState): void;
|
|
25
|
+
discoveryState(): OAuthDiscoveryState | undefined;
|
|
26
|
+
invalidateCredentials(scope: "all" | "client" | "tokens" | "verifier" | "discovery"): void;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=oauth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth.d.ts","sourceRoot":"","sources":["../src/oauth.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACR,6BAA6B,EAC7B,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACnB,4BAA4B,EAC5B,iBAAiB,EACpB,MAAM,8BAA8B,CAAC;AAGtC,MAAM,CAAC,OAAO,OAAO,wBAAyB,YAAW,mBAAmB;;IACxE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,iBAAiB,EAAE,MAAM,GAAG,SAAS,CAAC;IAe/C,YAAY,EACR,WAAW,EACX,iBAAiB,EACjB,QAAQ,EACR,YAAY,EACZ,KAAK,GACR,EAAE;QACC,WAAW,EAAE,MAAM,CAAC;QACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,KAAK,CAAC,EAAE,MAAM,CAAC;KAClB,EAOA;IAED,IAAI,cAAc,IAAI,mBAAmB,CASxC;IAED,KAAK,IAAI,MAAM,CAGd;IAED,iBAAiB,CACb,OAAO,CAAC,EAAE,6BAA6B,GACxC,4BAA4B,GAAG,SAAS,CA0B1C;IAED,qBAAqB,CACjB,iBAAiB,EAAE,4BAA4B,EAC/C,OAAO,CAAC,EAAE,6BAA6B,GACxC,IAAI,CAON;IAED,MAAM,CAAC,OAAO,CAAC,EAAE,6BAA6B,GAAG,iBAAiB,GAAG,SAAS,CAO7E;IAED,UAAU,CAAC,MAAM,EAAE,iBAAiB,EAAE,OAAO,CAAC,EAAE,6BAA6B,GAAG,IAAI,CAWnF;IAED,uBAAuB,CAAC,gBAAgB,EAAE,GAAG,GAAG,IAAI,CAGnD;IAED,oBAAoB,IAAI,GAAG,GAAG,SAAS,CAItC;IAED,mBAAmB,CAAC,QAAQ,EAAE,GAAG,GAAG,IAAI,CAIvC;IAED,gBAAgB,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAE3C;IAED,YAAY,IAAI,MAAM,CAKrB;IAED,kBAAkB,CAAC,KAAK,EAAE,mBAAmB,GAAG,IAAI,CAQnD;IAED,cAAc,IAAI,mBAAmB,GAAG,SAAS,CAMhD;IAED,qBAAqB,CAAC,KAAK,EAAE,KAAK,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,WAAW,GAAG,IAAI,CAczF;CACJ"}
|
package/dist/oauth.js
ADDED
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import packageJson from "../package.json" with { type: "json" };
|
|
3
|
+
export default class InteractiveOAuthProvider {
|
|
4
|
+
redirectUrl;
|
|
5
|
+
clientMetadataUrl;
|
|
6
|
+
#scope;
|
|
7
|
+
#configuredClientInformation;
|
|
8
|
+
#clientInformation = new Map();
|
|
9
|
+
#tokens = new Map();
|
|
10
|
+
#configuredIssuer;
|
|
11
|
+
#activeIssuer;
|
|
12
|
+
#currentTokens;
|
|
13
|
+
#presentedToken = false;
|
|
14
|
+
#awaitingAuthorizationCallback = false;
|
|
15
|
+
#state;
|
|
16
|
+
#authorizationUrl;
|
|
17
|
+
#codeVerifier;
|
|
18
|
+
#discoveryState;
|
|
19
|
+
constructor({ redirectUrl, clientMetadataUrl, clientId, clientSecret, scope, }) {
|
|
20
|
+
this.redirectUrl = redirectUrl;
|
|
21
|
+
this.clientMetadataUrl = clientMetadataUrl;
|
|
22
|
+
this.#scope = scope;
|
|
23
|
+
this.#configuredClientInformation = clientId === undefined
|
|
24
|
+
? undefined
|
|
25
|
+
: { client_id: clientId, ...(clientSecret === undefined ? {} : { client_secret: clientSecret }) };
|
|
26
|
+
}
|
|
27
|
+
get clientMetadata() {
|
|
28
|
+
return {
|
|
29
|
+
client_name: packageJson.name,
|
|
30
|
+
redirect_uris: [this.redirectUrl],
|
|
31
|
+
grant_types: ["authorization_code", "refresh_token"],
|
|
32
|
+
response_types: ["code"],
|
|
33
|
+
token_endpoint_auth_method: "none",
|
|
34
|
+
...(this.#scope === undefined ? {} : { scope: this.#scope }),
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
state() {
|
|
38
|
+
this.#state = randomUUID();
|
|
39
|
+
return this.#state;
|
|
40
|
+
}
|
|
41
|
+
clientInformation(context) {
|
|
42
|
+
const issuer = context?.issuer ?? this.#activeIssuer;
|
|
43
|
+
if (issuer === undefined)
|
|
44
|
+
return undefined;
|
|
45
|
+
this.#activeIssuer = issuer;
|
|
46
|
+
const stored = this.#clientInformation.get(issuer);
|
|
47
|
+
if (stored !== undefined)
|
|
48
|
+
return stored;
|
|
49
|
+
if (this.#configuredClientInformation === undefined
|
|
50
|
+
|| (this.#configuredIssuer !== undefined && this.#configuredIssuer !== issuer)) {
|
|
51
|
+
const metadata = this.#discoveryState?.authorizationServerMetadata;
|
|
52
|
+
const cimdAvailable = this.clientMetadataUrl !== undefined
|
|
53
|
+
&& metadata?.client_id_metadata_document_supported === true;
|
|
54
|
+
if (!cimdAvailable && metadata?.registration_endpoint === undefined) {
|
|
55
|
+
throw new Error(`MCP authorization server '${issuer}' exposes no usable client registration: `
|
|
56
|
+
+ "configure pre-registration or advertised CIMD; its metadata does not advertise "
|
|
57
|
+
+ "a Dynamic Client Registration endpoint.");
|
|
58
|
+
}
|
|
59
|
+
return undefined;
|
|
60
|
+
}
|
|
61
|
+
this.#configuredIssuer = issuer;
|
|
62
|
+
const configured = { ...this.#configuredClientInformation, issuer };
|
|
63
|
+
this.#clientInformation.set(issuer, configured);
|
|
64
|
+
return configured;
|
|
65
|
+
}
|
|
66
|
+
saveClientInformation(clientInformation, context) {
|
|
67
|
+
const issuer = context?.issuer ?? clientInformation.issuer;
|
|
68
|
+
if (issuer === undefined) {
|
|
69
|
+
throw new Error("MCP OAuth client information is missing its authorization-server issuer.");
|
|
70
|
+
}
|
|
71
|
+
this.#activeIssuer = issuer;
|
|
72
|
+
this.#clientInformation.set(issuer, { ...clientInformation, issuer });
|
|
73
|
+
}
|
|
74
|
+
tokens(context) {
|
|
75
|
+
if (context === undefined) {
|
|
76
|
+
this.#presentedToken = this.#currentTokens !== undefined;
|
|
77
|
+
return this.#currentTokens;
|
|
78
|
+
}
|
|
79
|
+
this.#activeIssuer = context.issuer;
|
|
80
|
+
return this.#tokens.get(context.issuer);
|
|
81
|
+
}
|
|
82
|
+
saveTokens(tokens, context) {
|
|
83
|
+
const issuer = context?.issuer ?? tokens.issuer;
|
|
84
|
+
if (issuer === undefined) {
|
|
85
|
+
throw new Error("MCP OAuth tokens are missing their authorization-server issuer.");
|
|
86
|
+
}
|
|
87
|
+
const stored = { ...tokens, issuer };
|
|
88
|
+
this.#activeIssuer = issuer;
|
|
89
|
+
this.#currentTokens = stored;
|
|
90
|
+
this.#presentedToken = false;
|
|
91
|
+
this.#awaitingAuthorizationCallback = false;
|
|
92
|
+
this.#tokens.set(issuer, stored);
|
|
93
|
+
}
|
|
94
|
+
redirectToAuthorization(authorizationUrl) {
|
|
95
|
+
this.#awaitingAuthorizationCallback = true;
|
|
96
|
+
this.#authorizationUrl = authorizationUrl;
|
|
97
|
+
}
|
|
98
|
+
takeAuthorizationUrl() {
|
|
99
|
+
const authorizationUrl = this.#authorizationUrl;
|
|
100
|
+
this.#authorizationUrl = undefined;
|
|
101
|
+
return authorizationUrl;
|
|
102
|
+
}
|
|
103
|
+
assertCallbackState(callback) {
|
|
104
|
+
if (this.#state === undefined || callback.searchParams.get("state") !== this.#state) {
|
|
105
|
+
throw new Error("OAuth callback state does not match the pending authorization request.");
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
saveCodeVerifier(codeVerifier) {
|
|
109
|
+
this.#codeVerifier = codeVerifier;
|
|
110
|
+
}
|
|
111
|
+
codeVerifier() {
|
|
112
|
+
if (this.#codeVerifier === undefined) {
|
|
113
|
+
throw new Error("OAuth authorization has no pending PKCE verifier.");
|
|
114
|
+
}
|
|
115
|
+
return this.#codeVerifier;
|
|
116
|
+
}
|
|
117
|
+
saveDiscoveryState(state) {
|
|
118
|
+
if (state.authorizationServerMetadata === undefined) {
|
|
119
|
+
throw new Error("MCP OAuth requires validated authorization-server metadata; "
|
|
120
|
+
+ "legacy endpoint inference is not supported.");
|
|
121
|
+
}
|
|
122
|
+
this.#discoveryState = state;
|
|
123
|
+
}
|
|
124
|
+
discoveryState() {
|
|
125
|
+
if (!this.#awaitingAuthorizationCallback && this.#presentedToken) {
|
|
126
|
+
this.#presentedToken = false;
|
|
127
|
+
this.#discoveryState = undefined;
|
|
128
|
+
}
|
|
129
|
+
return this.#discoveryState;
|
|
130
|
+
}
|
|
131
|
+
invalidateCredentials(scope) {
|
|
132
|
+
if ((scope === "all" || scope === "client") && this.#activeIssuer !== undefined) {
|
|
133
|
+
this.#clientInformation.delete(this.#activeIssuer);
|
|
134
|
+
}
|
|
135
|
+
if (scope === "all" || scope === "tokens") {
|
|
136
|
+
if (this.#activeIssuer !== undefined)
|
|
137
|
+
this.#tokens.delete(this.#activeIssuer);
|
|
138
|
+
this.#currentTokens = undefined;
|
|
139
|
+
this.#presentedToken = false;
|
|
140
|
+
}
|
|
141
|
+
if (scope === "all" || scope === "verifier") {
|
|
142
|
+
this.#codeVerifier = undefined;
|
|
143
|
+
this.#awaitingAuthorizationCallback = false;
|
|
144
|
+
}
|
|
145
|
+
if (scope === "all" || scope === "discovery")
|
|
146
|
+
this.#discoveryState = undefined;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=oauth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth.js","sourceRoot":"","sources":["../src/oauth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare const MCP_PROTOCOL_VERSION = "2026-07-28";
|
|
2
|
+
export declare const MCP_SPECIFICATION_COMMIT = "5f5440bb26a62e2cf3440b92da5a667efa03b267";
|
|
3
|
+
export declare const MCP_TASKS_EXTENSION_ID = "io.modelcontextprotocol/tasks";
|
|
4
|
+
export declare const MCP_TASKS_SPECIFICATION_COMMIT = "2c1425d9a288b9b1f489430fe1e00bb392b47e48";
|
|
5
|
+
export declare const MCP_CLIENT_VERSION = "2.0.0";
|
|
6
|
+
export declare const MCP_CONFORMANCE_VERSION = "0.2.0-alpha.11";
|
|
7
|
+
//# sourceMappingURL=protocol.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,oBAAoB,eAAe,CAAC;AACjD,eAAO,MAAM,wBAAwB,6CAA6C,CAAC;AACnF,eAAO,MAAM,sBAAsB,kCAAkC,CAAC;AACtE,eAAO,MAAM,8BAA8B,6CAA6C,CAAC;AACzF,eAAO,MAAM,kBAAkB,UAAU,CAAC;AAC1C,eAAO,MAAM,uBAAuB,mBAAmB,CAAC"}
|
package/dist/protocol.js
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export const MCP_PROTOCOL_VERSION = "2026-07-28";
|
|
2
|
+
export const MCP_SPECIFICATION_COMMIT = "5f5440bb26a62e2cf3440b92da5a667efa03b267";
|
|
3
|
+
export const MCP_TASKS_EXTENSION_ID = "io.modelcontextprotocol/tasks";
|
|
4
|
+
export const MCP_TASKS_SPECIFICATION_COMMIT = "2c1425d9a288b9b1f489430fe1e00bb392b47e48";
|
|
5
|
+
export const MCP_CLIENT_VERSION = "2.0.0";
|
|
6
|
+
export const MCP_CONFORMANCE_VERSION = "0.2.0-alpha.11";
|
|
7
|
+
//# sourceMappingURL=protocol.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,oBAAoB,GAAG,YAAY,CAAC;AACjD,MAAM,CAAC,MAAM,wBAAwB,GAAG,0CAA0C,CAAC;AACnF,MAAM,CAAC,MAAM,sBAAsB,GAAG,+BAA+B,CAAC;AACtE,MAAM,CAAC,MAAM,8BAA8B,GAAG,0CAA0C,CAAC;AACzF,MAAM,CAAC,MAAM,kBAAkB,GAAG,OAAO,CAAC;AAC1C,MAAM,CAAC,MAAM,uBAAuB,GAAG,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { Tool } from "@modelcontextprotocol/client";
|
|
2
|
+
export declare const mcpRoutingHeaderValue: (value: string) => string;
|
|
3
|
+
export declare const mcpParamHeaders: (tool: Tool, args: Record<string, unknown>) => Readonly<Record<string, string>>;
|
|
4
|
+
//# sourceMappingURL=protocolHeaders.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocolHeaders.d.ts","sourceRoot":"","sources":["../src/protocolHeaders.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,8BAA8B,CAAC;AAoBzD,eAAO,MAAM,qBAAqB,UAAW,MAAM,KAAG,MAE3C,CAAC;AA8DZ,eAAO,MAAM,eAAe,SAClB,IAAI,QACJ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC9B,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CASjC,CAAC"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
const BASE64_PREFIX = "=?base64?";
|
|
2
|
+
const BASE64_SUFFIX = "?=";
|
|
3
|
+
const RFC9110_TOKEN = /^[!#$%&'*+\-.^_`|~0-9A-Za-z]+$/;
|
|
4
|
+
const HEADER_TYPES = new Set(["string", "integer", "number", "boolean"]);
|
|
5
|
+
const requiresEncoding = (value) => {
|
|
6
|
+
if (value.length === 0 || value !== value.trim())
|
|
7
|
+
return true;
|
|
8
|
+
if (value.startsWith(BASE64_PREFIX) && value.endsWith(BASE64_SUFFIX))
|
|
9
|
+
return true;
|
|
10
|
+
for (let index = 0; index < value.length; index += 1) {
|
|
11
|
+
const codePoint = value.codePointAt(index);
|
|
12
|
+
if (codePoint === 9 || (codePoint !== undefined && codePoint >= 32 && codePoint <= 126)) {
|
|
13
|
+
continue;
|
|
14
|
+
}
|
|
15
|
+
return true;
|
|
16
|
+
}
|
|
17
|
+
return false;
|
|
18
|
+
};
|
|
19
|
+
export const mcpRoutingHeaderValue = (value) => requiresEncoding(value)
|
|
20
|
+
? `${BASE64_PREFIX}${Buffer.from(value, "utf8").toString("base64")}${BASE64_SUFFIX}`
|
|
21
|
+
: value;
|
|
22
|
+
const headerDeclarations = (tool) => {
|
|
23
|
+
const declarations = [];
|
|
24
|
+
const seen = new Set();
|
|
25
|
+
const visit = (schema, path) => {
|
|
26
|
+
if (schema === null || typeof schema !== "object" || Array.isArray(schema))
|
|
27
|
+
return;
|
|
28
|
+
const node = schema;
|
|
29
|
+
const header = node["x-mcp-header"];
|
|
30
|
+
if (header !== undefined) {
|
|
31
|
+
if (path.length === 0
|
|
32
|
+
|| typeof header !== "string"
|
|
33
|
+
|| !RFC9110_TOKEN.test(header)
|
|
34
|
+
|| typeof node.type !== "string"
|
|
35
|
+
|| !HEADER_TYPES.has(node.type)) {
|
|
36
|
+
throw new Error(`MCP tool '${tool.name}' has an invalid x-mcp-header declaration.`);
|
|
37
|
+
}
|
|
38
|
+
const folded = header.toLowerCase();
|
|
39
|
+
if (seen.has(folded)) {
|
|
40
|
+
throw new Error(`MCP tool '${tool.name}' repeats x-mcp-header '${header}'.`);
|
|
41
|
+
}
|
|
42
|
+
seen.add(folded);
|
|
43
|
+
declarations.push({ name: header, path, type: node.type });
|
|
44
|
+
}
|
|
45
|
+
const properties = node.properties;
|
|
46
|
+
if (properties === null || typeof properties !== "object" || Array.isArray(properties))
|
|
47
|
+
return;
|
|
48
|
+
for (const [name, child] of Object.entries(properties)) {
|
|
49
|
+
visit(child, [...path, name]);
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
visit(tool.inputSchema, []);
|
|
53
|
+
return declarations;
|
|
54
|
+
};
|
|
55
|
+
const valueAt = (root, path) => {
|
|
56
|
+
let value = root;
|
|
57
|
+
for (const segment of path) {
|
|
58
|
+
if (value === null || typeof value !== "object" || Array.isArray(value))
|
|
59
|
+
return undefined;
|
|
60
|
+
value = value[segment];
|
|
61
|
+
}
|
|
62
|
+
return value;
|
|
63
|
+
};
|
|
64
|
+
const primitiveHeaderValue = (value, type) => {
|
|
65
|
+
if (type === "string")
|
|
66
|
+
return typeof value === "string" ? value : undefined;
|
|
67
|
+
if (type === "boolean")
|
|
68
|
+
return typeof value === "boolean" ? String(value) : undefined;
|
|
69
|
+
if (typeof value !== "number" || !Number.isFinite(value))
|
|
70
|
+
return undefined;
|
|
71
|
+
if (Number.isInteger(value) && !Number.isSafeInteger(value))
|
|
72
|
+
return undefined;
|
|
73
|
+
if (type === "integer" && (!Number.isSafeInteger(value) || !Number.isInteger(value))) {
|
|
74
|
+
return undefined;
|
|
75
|
+
}
|
|
76
|
+
return String(value);
|
|
77
|
+
};
|
|
78
|
+
export const mcpParamHeaders = (tool, args) => Object.fromEntries(headerDeclarations(tool).flatMap((declaration) => {
|
|
79
|
+
const value = valueAt(args, declaration.path);
|
|
80
|
+
if (value === undefined || value === null)
|
|
81
|
+
return [];
|
|
82
|
+
const primitive = primitiveHeaderValue(value, declaration.type);
|
|
83
|
+
return primitive === undefined
|
|
84
|
+
? []
|
|
85
|
+
: [[`Mcp-Param-${declaration.name}`, mcpRoutingHeaderValue(primitive)]];
|
|
86
|
+
}));
|
|
87
|
+
//# sourceMappingURL=protocolHeaders.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocolHeaders.js","sourceRoot":"","sources":["../src/protocolHeaders.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type Client } from "@modelcontextprotocol/client";
|
|
2
|
+
export interface SubscriptionOptions {
|
|
3
|
+
readonly timeout: number;
|
|
4
|
+
readonly tasks?: boolean;
|
|
5
|
+
readonly onError?: (error: Error) => void;
|
|
6
|
+
}
|
|
7
|
+
/** Owns the one current modern subscription filter for a server connection. */
|
|
8
|
+
export default class Subscriptions {
|
|
9
|
+
#private;
|
|
10
|
+
constructor(client: Client, options: SubscriptionOptions);
|
|
11
|
+
selectTask(taskId: string): Promise<() => Promise<void>>;
|
|
12
|
+
selectResource(uri: string): Promise<void>;
|
|
13
|
+
retire(): Promise<void>;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=subscriptions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subscriptions.d.ts","sourceRoot":"","sources":["../src/subscriptions.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,KAAK,MAAM,EAGd,MAAM,8BAA8B,CAAC;AAKtC,MAAM,WAAW,mBAAmB;IAChC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAC7C;AAuCD,+EAA+E;AAC/E,MAAM,CAAC,OAAO,OAAO,aAAa;;IAY9B,YAAY,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,mBAAmB,EASvD;IAEK,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,CAuB7D;IAWK,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAO/C;IAyFD,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAOtB;CACJ"}
|