@kya-os/mcp-i-cloudflare 1.6.19 → 1.6.21-canary.clientinfo.20251126130107
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/__tests__/e2e/test-config.d.ts +37 -0
- package/dist/__tests__/e2e/test-config.d.ts.map +1 -0
- package/dist/__tests__/e2e/test-config.js +62 -0
- package/dist/__tests__/e2e/test-config.js.map +1 -0
- package/dist/adapter.d.ts.map +1 -1
- package/dist/adapter.js +20 -86
- package/dist/adapter.js.map +1 -1
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +100 -24
- package/dist/agent.js.map +1 -1
- package/dist/runtime/oauth-handler.d.ts.map +1 -1
- package/dist/runtime/oauth-handler.js.map +1 -1
- package/dist/services/kta-client-lookup.d.ts +5 -3
- package/dist/services/kta-client-lookup.d.ts.map +1 -1
- package/dist/services/kta-client-lookup.js +13 -34
- package/dist/services/kta-client-lookup.js.map +1 -1
- package/dist/utils/client-info.d.ts +69 -0
- package/dist/utils/client-info.d.ts.map +1 -0
- package/dist/utils/client-info.js +178 -0
- package/dist/utils/client-info.js.map +1 -0
- package/dist/utils/error-formatter.d.ts +103 -0
- package/dist/utils/error-formatter.d.ts.map +1 -0
- package/dist/utils/error-formatter.js +245 -0
- package/dist/utils/error-formatter.js.map +1 -0
- package/dist/utils/initialize-context.d.ts +91 -0
- package/dist/utils/initialize-context.d.ts.map +1 -0
- package/dist/utils/initialize-context.js +169 -0
- package/dist/utils/initialize-context.js.map +1 -0
- package/dist/utils/known-clients.d.ts +14 -6
- package/dist/utils/known-clients.d.ts.map +1 -1
- package/dist/utils/known-clients.js +30 -11
- package/dist/utils/known-clients.js.map +1 -1
- package/dist/utils/oauth-identity.d.ts +58 -0
- package/dist/utils/oauth-identity.d.ts.map +1 -0
- package/dist/utils/oauth-identity.js +215 -0
- package/dist/utils/oauth-identity.js.map +1 -0
- package/package.json +2 -2
|
@@ -71,9 +71,9 @@ export async function lookupClientDidFromKTA(clientName, ktaApiUrl = "https://kn
|
|
|
71
71
|
* Resolve client identity from MCP client info
|
|
72
72
|
*
|
|
73
73
|
* Priority:
|
|
74
|
-
* 1. Use
|
|
75
|
-
* 2. Look up DID from KTA API (if API URL provided)
|
|
76
|
-
* 3. Generate ephemeral DID for unknown clients
|
|
74
|
+
* 1. Use did:web DID from known clients registry (all known clients have one)
|
|
75
|
+
* 2. Look up DID from KTA API for unknown clients (if API URL provided)
|
|
76
|
+
* 3. Generate ephemeral DID for truly unknown clients
|
|
77
77
|
*
|
|
78
78
|
* @param clientInfo - Client info from MCP initialize message
|
|
79
79
|
* @param ktaApiUrl - Optional KTA API URL for lookups
|
|
@@ -84,37 +84,14 @@ export async function resolveClientIdentity(clientInfo, ktaApiUrl) {
|
|
|
84
84
|
// Check known clients registry first
|
|
85
85
|
const knownClient = findKnownClient(clientName);
|
|
86
86
|
if (knownClient) {
|
|
87
|
-
// Known client found
|
|
88
|
-
|
|
89
|
-
// Has pre-registered DID
|
|
90
|
-
return {
|
|
91
|
-
did: knownClient.ktaDid,
|
|
92
|
-
source: "knowthat.ai",
|
|
93
|
-
knownClientId: knownClient.id,
|
|
94
|
-
displayName: knownClient.displayName,
|
|
95
|
-
vendor: knownClient.vendor,
|
|
96
|
-
isKnown: true,
|
|
97
|
-
};
|
|
98
|
-
}
|
|
99
|
-
// Known client but no pre-registered DID - try KTA lookup
|
|
100
|
-
if (ktaApiUrl) {
|
|
101
|
-
const ktaDid = await lookupClientDidFromKTA(clientName, ktaApiUrl);
|
|
102
|
-
if (ktaDid) {
|
|
103
|
-
return {
|
|
104
|
-
did: ktaDid,
|
|
105
|
-
source: "kta-lookup",
|
|
106
|
-
knownClientId: knownClient.id,
|
|
107
|
-
displayName: knownClient.displayName,
|
|
108
|
-
vendor: knownClient.vendor,
|
|
109
|
-
isKnown: true,
|
|
110
|
-
};
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
// Generate ephemeral DID for known client without registration
|
|
114
|
-
const ephemeralDid = await generateEphemeralDid(clientName);
|
|
87
|
+
// Known client found - all known clients have did:web DIDs
|
|
88
|
+
// Use appropriate source based on registration status
|
|
115
89
|
return {
|
|
116
|
-
did:
|
|
117
|
-
source
|
|
90
|
+
did: knownClient.ktaDid,
|
|
91
|
+
// If registered on KTA, source is "knowthat.ai"
|
|
92
|
+
// If known but not registered, source is "generated" (pending registration)
|
|
93
|
+
source: knownClient.ktaRegistered ? "knowthat.ai" : "generated",
|
|
94
|
+
registered: knownClient.ktaRegistered,
|
|
118
95
|
knownClientId: knownClient.id,
|
|
119
96
|
displayName: knownClient.displayName,
|
|
120
97
|
vendor: knownClient.vendor,
|
|
@@ -128,17 +105,19 @@ export async function resolveClientIdentity(clientInfo, ktaApiUrl) {
|
|
|
128
105
|
return {
|
|
129
106
|
did: ktaDid,
|
|
130
107
|
source: "kta-lookup",
|
|
108
|
+
registered: true, // Found on KTA API means registered
|
|
131
109
|
displayName: clientName,
|
|
132
110
|
vendor: clientInfo?.vendor,
|
|
133
111
|
isKnown: false,
|
|
134
112
|
};
|
|
135
113
|
}
|
|
136
114
|
}
|
|
137
|
-
// Generate ephemeral DID for unknown client
|
|
115
|
+
// Generate ephemeral DID for truly unknown client
|
|
138
116
|
const ephemeralDid = await generateEphemeralDid(clientName);
|
|
139
117
|
return {
|
|
140
118
|
did: ephemeralDid,
|
|
141
119
|
source: "generated",
|
|
120
|
+
registered: false, // Unknown clients are not registered
|
|
142
121
|
displayName: clientName,
|
|
143
122
|
vendor: clientInfo?.vendor,
|
|
144
123
|
isKnown: false,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kta-client-lookup.js","sourceRoot":"","sources":["../../src/services/kta-client-lookup.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,eAAe,GAEhB,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"kta-client-lookup.js","sourceRoot":"","sources":["../../src/services/kta-client-lookup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Client Info Utilities
|
|
3
|
+
*
|
|
4
|
+
* Handles MCP client information extraction, normalization, and handshake payload preparation.
|
|
5
|
+
* This consolidates logic for working with client metadata across initialize and handshake.
|
|
6
|
+
*/
|
|
7
|
+
import type { HandshakeRequest, MCPClientCapabilities } from "@kya-os/contracts/handshake";
|
|
8
|
+
import type { MCPClientInfo as SessionClientInfo } from "../types/client";
|
|
9
|
+
/**
|
|
10
|
+
* Initialize context with client information
|
|
11
|
+
*/
|
|
12
|
+
export interface InitializeContext {
|
|
13
|
+
timestamp: number;
|
|
14
|
+
protocolVersion?: string;
|
|
15
|
+
capabilities?: MCPClientCapabilities;
|
|
16
|
+
clientInfo?: Partial<SessionClientInfo>;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Normalize client info from various formats
|
|
20
|
+
*
|
|
21
|
+
* @param value Client info from request (could be from initialize or handshake)
|
|
22
|
+
* @returns Normalized client info or undefined if invalid
|
|
23
|
+
*/
|
|
24
|
+
export declare function normalizeClientInfo(value: unknown): Partial<SessionClientInfo> | undefined;
|
|
25
|
+
/**
|
|
26
|
+
* Extract MCP client information from handshake request and initialize context
|
|
27
|
+
*
|
|
28
|
+
* @param request Handshake request
|
|
29
|
+
* @param initializeContext Optional context from previous initialize call
|
|
30
|
+
* @returns Extracted and normalized client info or undefined
|
|
31
|
+
*/
|
|
32
|
+
export declare function extractMCPClient(request: HandshakeRequest, initializeContext?: InitializeContext): SessionClientInfo | undefined;
|
|
33
|
+
/**
|
|
34
|
+
* Prepare handshake payload with client information from initialize context
|
|
35
|
+
*
|
|
36
|
+
* @param params Original handshake request parameters
|
|
37
|
+
* @param initializeContext Optional context from previous initialize call
|
|
38
|
+
* @returns Enhanced handshake request with client info
|
|
39
|
+
*/
|
|
40
|
+
export declare function prepareHandshakePayload(params: HandshakeRequest, initializeContext?: InitializeContext): HandshakeRequest;
|
|
41
|
+
/**
|
|
42
|
+
* Clone capabilities object (deep copy)
|
|
43
|
+
*
|
|
44
|
+
* @param capabilities Capabilities to clone
|
|
45
|
+
* @returns Cloned capabilities or undefined
|
|
46
|
+
*/
|
|
47
|
+
export declare function cloneCapabilities(capabilities: unknown): MCPClientCapabilities | undefined;
|
|
48
|
+
/**
|
|
49
|
+
* Type guard for record objects
|
|
50
|
+
*
|
|
51
|
+
* @param value Value to check
|
|
52
|
+
* @returns true if value is a record object
|
|
53
|
+
*/
|
|
54
|
+
export declare function isRecord(value: unknown): value is Record<string, unknown>;
|
|
55
|
+
/**
|
|
56
|
+
* Extract client ID from client info if available
|
|
57
|
+
*
|
|
58
|
+
* @param clientInfo Client info object
|
|
59
|
+
* @returns Client ID or undefined
|
|
60
|
+
*/
|
|
61
|
+
export declare function extractClientId(clientInfo: unknown): string | undefined;
|
|
62
|
+
/**
|
|
63
|
+
* Merge client info from multiple sources
|
|
64
|
+
*
|
|
65
|
+
* @param sources Array of potential client info sources (later sources override earlier)
|
|
66
|
+
* @returns Merged client info
|
|
67
|
+
*/
|
|
68
|
+
export declare function mergeClientInfo(...sources: (Partial<SessionClientInfo> | undefined)[]): Partial<SessionClientInfo>;
|
|
69
|
+
//# sourceMappingURL=client-info.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-info.d.ts","sourceRoot":"","sources":["../../src/utils/client-info.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAC3F,OAAO,KAAK,EAAE,aAAa,IAAI,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAE1E;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,qBAAqB,CAAC;IACrC,UAAU,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;CACzC;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,iBAAiB,CAAC,GAAG,SAAS,CAuCxC;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,gBAAgB,EACzB,iBAAiB,CAAC,EAAE,iBAAiB,GACpC,iBAAiB,GAAG,SAAS,CAkD/B;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,gBAAgB,EACxB,iBAAiB,CAAC,EAAE,iBAAiB,GACpC,gBAAgB,CA8BlB;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,YAAY,EAAE,OAAO,GACpB,qBAAqB,GAAG,SAAS,CAMnC;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEzE;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAWvE;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,GAAG,OAAO,EAAE,CAAC,OAAO,CAAC,iBAAiB,CAAC,GAAG,SAAS,CAAC,EAAE,GACrD,OAAO,CAAC,iBAAiB,CAAC,CAU5B"}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Client Info Utilities
|
|
3
|
+
*
|
|
4
|
+
* Handles MCP client information extraction, normalization, and handshake payload preparation.
|
|
5
|
+
* This consolidates logic for working with client metadata across initialize and handshake.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Normalize client info from various formats
|
|
9
|
+
*
|
|
10
|
+
* @param value Client info from request (could be from initialize or handshake)
|
|
11
|
+
* @returns Normalized client info or undefined if invalid
|
|
12
|
+
*/
|
|
13
|
+
export function normalizeClientInfo(value) {
|
|
14
|
+
if (!isRecord(value)) {
|
|
15
|
+
return undefined;
|
|
16
|
+
}
|
|
17
|
+
const normalized = {};
|
|
18
|
+
const record = value;
|
|
19
|
+
const name = record.name;
|
|
20
|
+
if (typeof name === "string" && name.trim().length > 0) {
|
|
21
|
+
normalized.name = name.trim();
|
|
22
|
+
}
|
|
23
|
+
const title = record.title;
|
|
24
|
+
if (typeof title === "string" && title.trim().length > 0) {
|
|
25
|
+
normalized.title = title.trim();
|
|
26
|
+
}
|
|
27
|
+
const version = record.version;
|
|
28
|
+
if (typeof version === "string" && version.trim().length > 0) {
|
|
29
|
+
normalized.version = version.trim();
|
|
30
|
+
}
|
|
31
|
+
const platform = record.platform;
|
|
32
|
+
if (typeof platform === "string" && platform.trim().length > 0) {
|
|
33
|
+
normalized.platform = platform.trim();
|
|
34
|
+
}
|
|
35
|
+
const vendor = record.vendor;
|
|
36
|
+
if (typeof vendor === "string" && vendor.trim().length > 0) {
|
|
37
|
+
normalized.vendor = vendor.trim();
|
|
38
|
+
}
|
|
39
|
+
const persistentId = record.persistentId;
|
|
40
|
+
if (typeof persistentId === "string" && persistentId.trim().length > 0) {
|
|
41
|
+
normalized.persistentId = persistentId.trim();
|
|
42
|
+
}
|
|
43
|
+
return Object.keys(normalized).length > 0 ? normalized : undefined;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Extract MCP client information from handshake request and initialize context
|
|
47
|
+
*
|
|
48
|
+
* @param request Handshake request
|
|
49
|
+
* @param initializeContext Optional context from previous initialize call
|
|
50
|
+
* @returns Extracted and normalized client info or undefined
|
|
51
|
+
*/
|
|
52
|
+
export function extractMCPClient(request, initializeContext) {
|
|
53
|
+
const fromHandshake = normalizeClientInfo(request.clientInfo);
|
|
54
|
+
const merged = {
|
|
55
|
+
...(initializeContext?.clientInfo ?? {}),
|
|
56
|
+
...(fromHandshake ?? {}),
|
|
57
|
+
};
|
|
58
|
+
const handshakeClientId = isRecord(request.clientInfo) &&
|
|
59
|
+
typeof request.clientInfo.clientId === "string" &&
|
|
60
|
+
request.clientInfo.clientId.trim().length > 0
|
|
61
|
+
? request.clientInfo.clientId.trim()
|
|
62
|
+
: undefined;
|
|
63
|
+
const hasClientMetadata = Object.keys(merged).length > 0 ||
|
|
64
|
+
handshakeClientId ||
|
|
65
|
+
typeof request.clientProtocolVersion === "string" ||
|
|
66
|
+
isRecord(request.clientCapabilities);
|
|
67
|
+
if (!hasClientMetadata) {
|
|
68
|
+
return undefined;
|
|
69
|
+
}
|
|
70
|
+
const nameValue = merged.name;
|
|
71
|
+
const name = typeof nameValue === "string" && nameValue.trim().length > 0
|
|
72
|
+
? nameValue.trim()
|
|
73
|
+
: "unknown";
|
|
74
|
+
const clientId = handshakeClientId || crypto.randomUUID();
|
|
75
|
+
const capabilities = isRecord(request.clientCapabilities)
|
|
76
|
+
? request.clientCapabilities
|
|
77
|
+
: initializeContext?.capabilities;
|
|
78
|
+
return {
|
|
79
|
+
name,
|
|
80
|
+
title: merged.title,
|
|
81
|
+
version: merged.version,
|
|
82
|
+
platform: merged.platform,
|
|
83
|
+
vendor: merged.vendor,
|
|
84
|
+
persistentId: merged.persistentId,
|
|
85
|
+
protocolVersion: request.clientProtocolVersion ??
|
|
86
|
+
initializeContext?.protocolVersion ??
|
|
87
|
+
merged.protocolVersion,
|
|
88
|
+
capabilities,
|
|
89
|
+
clientId,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Prepare handshake payload with client information from initialize context
|
|
94
|
+
*
|
|
95
|
+
* @param params Original handshake request parameters
|
|
96
|
+
* @param initializeContext Optional context from previous initialize call
|
|
97
|
+
* @returns Enhanced handshake request with client info
|
|
98
|
+
*/
|
|
99
|
+
export function prepareHandshakePayload(params, initializeContext) {
|
|
100
|
+
const payload = {
|
|
101
|
+
...params,
|
|
102
|
+
};
|
|
103
|
+
if (!payload.clientProtocolVersion && initializeContext?.protocolVersion) {
|
|
104
|
+
payload.clientProtocolVersion = initializeContext.protocolVersion;
|
|
105
|
+
}
|
|
106
|
+
if (!payload.clientCapabilities && initializeContext?.capabilities) {
|
|
107
|
+
payload.clientCapabilities = initializeContext.capabilities;
|
|
108
|
+
}
|
|
109
|
+
if (!payload.clientInfo && initializeContext?.clientInfo?.name) {
|
|
110
|
+
const source = initializeContext.clientInfo;
|
|
111
|
+
const name = source.name;
|
|
112
|
+
if (!name) {
|
|
113
|
+
return payload;
|
|
114
|
+
}
|
|
115
|
+
payload.clientInfo = {
|
|
116
|
+
name,
|
|
117
|
+
...(source.title ? { title: source.title } : {}),
|
|
118
|
+
...(source.version ? { version: source.version } : {}),
|
|
119
|
+
...(source.platform ? { platform: source.platform } : {}),
|
|
120
|
+
...(source.vendor ? { vendor: source.vendor } : {}),
|
|
121
|
+
...(source.persistentId ? { persistentId: source.persistentId } : {}),
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
return payload;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Clone capabilities object (deep copy)
|
|
128
|
+
*
|
|
129
|
+
* @param capabilities Capabilities to clone
|
|
130
|
+
* @returns Cloned capabilities or undefined
|
|
131
|
+
*/
|
|
132
|
+
export function cloneCapabilities(capabilities) {
|
|
133
|
+
if (!isRecord(capabilities)) {
|
|
134
|
+
return undefined;
|
|
135
|
+
}
|
|
136
|
+
return JSON.parse(JSON.stringify(capabilities));
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Type guard for record objects
|
|
140
|
+
*
|
|
141
|
+
* @param value Value to check
|
|
142
|
+
* @returns true if value is a record object
|
|
143
|
+
*/
|
|
144
|
+
export function isRecord(value) {
|
|
145
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Extract client ID from client info if available
|
|
149
|
+
*
|
|
150
|
+
* @param clientInfo Client info object
|
|
151
|
+
* @returns Client ID or undefined
|
|
152
|
+
*/
|
|
153
|
+
export function extractClientId(clientInfo) {
|
|
154
|
+
if (!isRecord(clientInfo)) {
|
|
155
|
+
return undefined;
|
|
156
|
+
}
|
|
157
|
+
const clientId = clientInfo.clientId;
|
|
158
|
+
if (typeof clientId === "string" && clientId.trim().length > 0) {
|
|
159
|
+
return clientId.trim();
|
|
160
|
+
}
|
|
161
|
+
return undefined;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Merge client info from multiple sources
|
|
165
|
+
*
|
|
166
|
+
* @param sources Array of potential client info sources (later sources override earlier)
|
|
167
|
+
* @returns Merged client info
|
|
168
|
+
*/
|
|
169
|
+
export function mergeClientInfo(...sources) {
|
|
170
|
+
const merged = {};
|
|
171
|
+
for (const source of sources) {
|
|
172
|
+
if (source) {
|
|
173
|
+
Object.assign(merged, source);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
return merged;
|
|
177
|
+
}
|
|
178
|
+
//# sourceMappingURL=client-info.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-info.js","sourceRoot":"","sources":["../../src/utils/client-info.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Error Formatter Utility
|
|
3
|
+
*
|
|
4
|
+
* Provides consistent JSON-RPC error response formatting for all error types.
|
|
5
|
+
* Handles special cases like DelegationRequiredError and OAuthRequiredError.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* JSON-RPC error response structure
|
|
9
|
+
*/
|
|
10
|
+
export interface JsonRpcErrorResponse {
|
|
11
|
+
jsonrpc: string;
|
|
12
|
+
id: unknown;
|
|
13
|
+
error: {
|
|
14
|
+
code: number;
|
|
15
|
+
message: string;
|
|
16
|
+
data?: any;
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Error codes for different error types
|
|
21
|
+
*/
|
|
22
|
+
export declare const ERROR_CODES: {
|
|
23
|
+
readonly PARSE_ERROR: -32700;
|
|
24
|
+
readonly INVALID_REQUEST: -32600;
|
|
25
|
+
readonly METHOD_NOT_FOUND: -32601;
|
|
26
|
+
readonly INVALID_PARAMS: -32602;
|
|
27
|
+
readonly INTERNAL_ERROR: -32603;
|
|
28
|
+
readonly DELEGATION_REQUIRED: -32001;
|
|
29
|
+
readonly OAUTH_REQUIRED: -32002;
|
|
30
|
+
readonly AUTHORIZATION_REQUIRED: -32003;
|
|
31
|
+
readonly SESSION_EXPIRED: -32004;
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* Format a generic error into JSON-RPC response
|
|
35
|
+
*
|
|
36
|
+
* @param error The error to format
|
|
37
|
+
* @param id Request ID from JSON-RPC request
|
|
38
|
+
* @returns Formatted JSON-RPC error response
|
|
39
|
+
*/
|
|
40
|
+
export declare function formatJsonRpcError(error: unknown, id: unknown): JsonRpcErrorResponse;
|
|
41
|
+
/**
|
|
42
|
+
* Format DelegationRequiredError into JSON-RPC response
|
|
43
|
+
*
|
|
44
|
+
* @param error Delegation required error
|
|
45
|
+
* @param id Request ID
|
|
46
|
+
* @returns Formatted error response with consent URL
|
|
47
|
+
*/
|
|
48
|
+
export declare function formatDelegationError(error: any, id: unknown): JsonRpcErrorResponse;
|
|
49
|
+
/**
|
|
50
|
+
* Format OAuthRequiredError into JSON-RPC response
|
|
51
|
+
*
|
|
52
|
+
* @param error OAuth required error
|
|
53
|
+
* @param id Request ID
|
|
54
|
+
* @returns Formatted error response with OAuth URL
|
|
55
|
+
*/
|
|
56
|
+
export declare function formatOAuthError(error: any, id: unknown): JsonRpcErrorResponse;
|
|
57
|
+
/**
|
|
58
|
+
* Check if error is a DelegationRequiredError
|
|
59
|
+
*
|
|
60
|
+
* @param error Error to check
|
|
61
|
+
* @returns true if it's a delegation required error
|
|
62
|
+
*/
|
|
63
|
+
export declare function isDelegationRequiredError(error: unknown): boolean;
|
|
64
|
+
/**
|
|
65
|
+
* Check if error is an OAuthRequiredError
|
|
66
|
+
*
|
|
67
|
+
* @param error Error to check
|
|
68
|
+
* @returns true if it's an OAuth required error
|
|
69
|
+
*/
|
|
70
|
+
export declare function isOAuthRequiredError(error: unknown): boolean;
|
|
71
|
+
/**
|
|
72
|
+
* Format method not found error
|
|
73
|
+
*
|
|
74
|
+
* @param method The method that was not found
|
|
75
|
+
* @param id Request ID
|
|
76
|
+
* @returns Formatted error response
|
|
77
|
+
*/
|
|
78
|
+
export declare function formatMethodNotFoundError(method: string, id: unknown): JsonRpcErrorResponse;
|
|
79
|
+
/**
|
|
80
|
+
* Format tool not found error
|
|
81
|
+
*
|
|
82
|
+
* @param toolName The tool that was not found
|
|
83
|
+
* @param id Request ID
|
|
84
|
+
* @returns Formatted error response
|
|
85
|
+
*/
|
|
86
|
+
export declare function formatToolNotFoundError(toolName: string, id: unknown): JsonRpcErrorResponse;
|
|
87
|
+
/**
|
|
88
|
+
* Format session expired error
|
|
89
|
+
*
|
|
90
|
+
* @param sessionId The expired session ID
|
|
91
|
+
* @param id Request ID
|
|
92
|
+
* @returns Formatted error response
|
|
93
|
+
*/
|
|
94
|
+
export declare function formatSessionExpiredError(sessionId: string, id: unknown): JsonRpcErrorResponse;
|
|
95
|
+
/**
|
|
96
|
+
* Create a success response wrapper
|
|
97
|
+
*
|
|
98
|
+
* @param result The result to wrap
|
|
99
|
+
* @param id Request ID
|
|
100
|
+
* @returns JSON-RPC success response
|
|
101
|
+
*/
|
|
102
|
+
export declare function formatSuccessResponse(result: any, id: unknown): any;
|
|
103
|
+
//# sourceMappingURL=error-formatter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-formatter.d.ts","sourceRoot":"","sources":["../../src/utils/error-formatter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,OAAO,CAAC;IACZ,KAAK,EAAE;QACL,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,GAAG,CAAC;KACZ,CAAC;CACH;AAED;;GAEG;AACH,eAAO,MAAM,WAAW;;;;;;;;;;CAad,CAAC;AAEX;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,GAAG,oBAAoB,CAoDpF;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,EAAE,OAAO,GAAG,oBAAoB,CA4BnF;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,EAAE,OAAO,GAAG,oBAAoB,CA8B9E;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAWjE;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAW5D;AAED;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,GAAG,oBAAoB,CAS3F;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,GAAG,oBAAoB,CAS3F;AAED;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,GAAG,oBAAoB,CAY9F;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,OAAO,GAAG,GAAG,CAMnE"}
|