@apify/mcpc 0.1.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/.claude/settings.local.json +36 -0
- package/.eslintrc.json +44 -0
- package/.idea/codeStyles/Project.xml +60 -0
- package/.idea/codeStyles/codeStyleConfig.xml +5 -0
- package/.idea/inspectionProfiles/Project_Default.xml +11 -0
- package/.idea/prettier.xml +6 -0
- package/.idea/vcs.xml +6 -0
- package/.idea/workspace.xml +572 -0
- package/LICENSE +201 -0
- package/PHASE1-SUMMARY.md +269 -0
- package/PUBLISHING.md +111 -0
- package/README.md +1056 -0
- package/TESTING.md +212 -0
- package/TODOs.md +94 -0
- package/bin/mcpc +9 -0
- package/bin/mcpc-bridge +9 -0
- package/dist/bridge/index.d.ts +3 -0
- package/dist/bridge/index.d.ts.map +1 -0
- package/dist/bridge/index.js +587 -0
- package/dist/bridge/index.js.map +1 -0
- package/dist/cli/commands/auth.d.ts +9 -0
- package/dist/cli/commands/auth.d.ts.map +1 -0
- package/dist/cli/commands/auth.js +81 -0
- package/dist/cli/commands/auth.js.map +1 -0
- package/dist/cli/commands/clean.d.ts +11 -0
- package/dist/cli/commands/clean.d.ts.map +1 -0
- package/dist/cli/commands/clean.js +224 -0
- package/dist/cli/commands/clean.js.map +1 -0
- package/dist/cli/commands/index.d.ts +8 -0
- package/dist/cli/commands/index.d.ts.map +1 -0
- package/dist/cli/commands/index.js +8 -0
- package/dist/cli/commands/index.js.map +1 -0
- package/dist/cli/commands/logging.d.ts +3 -0
- package/dist/cli/commands/logging.d.ts.map +1 -0
- package/dist/cli/commands/logging.js +22 -0
- package/dist/cli/commands/logging.js.map +1 -0
- package/dist/cli/commands/prompts.d.ts +6 -0
- package/dist/cli/commands/prompts.d.ts.map +1 -0
- package/dist/cli/commands/prompts.js +27 -0
- package/dist/cli/commands/prompts.js.map +1 -0
- package/dist/cli/commands/resources.d.ts +11 -0
- package/dist/cli/commands/resources.d.ts.map +1 -0
- package/dist/cli/commands/resources.js +70 -0
- package/dist/cli/commands/resources.js.map +1 -0
- package/dist/cli/commands/sessions.d.ts +28 -0
- package/dist/cli/commands/sessions.d.ts.map +1 -0
- package/dist/cli/commands/sessions.js +356 -0
- package/dist/cli/commands/sessions.js.map +1 -0
- package/dist/cli/commands/tools.d.ts +8 -0
- package/dist/cli/commands/tools.d.ts.map +1 -0
- package/dist/cli/commands/tools.js +54 -0
- package/dist/cli/commands/tools.js.map +1 -0
- package/dist/cli/commands/utilities.d.ts +3 -0
- package/dist/cli/commands/utilities.d.ts.map +1 -0
- package/dist/cli/commands/utilities.js +20 -0
- package/dist/cli/commands/utilities.js.map +1 -0
- package/dist/cli/helpers.d.ts +18 -0
- package/dist/cli/helpers.d.ts.map +1 -0
- package/dist/cli/helpers.js +165 -0
- package/dist/cli/helpers.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +326 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/output.d.ts +18 -0
- package/dist/cli/output.d.ts.map +1 -0
- package/dist/cli/output.js +221 -0
- package/dist/cli/output.js.map +1 -0
- package/dist/cli/parser.d.ts +19 -0
- package/dist/cli/parser.d.ts.map +1 -0
- package/dist/cli/parser.js +168 -0
- package/dist/cli/parser.js.map +1 -0
- package/dist/cli/shell-parser.d.ts +5 -0
- package/dist/cli/shell-parser.d.ts.map +1 -0
- package/dist/cli/shell-parser.js +38 -0
- package/dist/cli/shell-parser.js.map +1 -0
- package/dist/cli/shell.d.ts +2 -0
- package/dist/cli/shell.d.ts.map +1 -0
- package/dist/cli/shell.js +277 -0
- package/dist/cli/shell.js.map +1 -0
- package/dist/cli/tool-result.d.ts +2 -0
- package/dist/cli/tool-result.d.ts.map +1 -0
- package/dist/cli/tool-result.js +19 -0
- package/dist/cli/tool-result.js.map +1 -0
- package/dist/core/factory.d.ts +19 -0
- package/dist/core/factory.d.ts.map +1 -0
- package/dist/core/factory.js +55 -0
- package/dist/core/factory.js.map +1 -0
- package/dist/core/index.d.ts +4 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +4 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/mcp-client.d.ts +30 -0
- package/dist/core/mcp-client.d.ts.map +1 -0
- package/dist/core/mcp-client.js +215 -0
- package/dist/core/mcp-client.js.map +1 -0
- package/dist/core/transports.d.ts +12 -0
- package/dist/core/transports.d.ts.map +1 -0
- package/dist/core/transports.js +65 -0
- package/dist/core/transports.js.map +1 -0
- package/dist/lib/auth/auth-profiles.d.ts +7 -0
- package/dist/lib/auth/auth-profiles.d.ts.map +1 -0
- package/dist/lib/auth/auth-profiles.js +105 -0
- package/dist/lib/auth/auth-profiles.js.map +1 -0
- package/dist/lib/auth/keychain.d.ts +22 -0
- package/dist/lib/auth/keychain.d.ts.map +1 -0
- package/dist/lib/auth/keychain.js +92 -0
- package/dist/lib/auth/keychain.js.map +1 -0
- package/dist/lib/auth/oauth-flow.d.ts +7 -0
- package/dist/lib/auth/oauth-flow.d.ts.map +1 -0
- package/dist/lib/auth/oauth-flow.js +236 -0
- package/dist/lib/auth/oauth-flow.js.map +1 -0
- package/dist/lib/auth/oauth-provider.d.ts +24 -0
- package/dist/lib/auth/oauth-provider.d.ts.map +1 -0
- package/dist/lib/auth/oauth-provider.js +144 -0
- package/dist/lib/auth/oauth-provider.js.map +1 -0
- package/dist/lib/auth/oauth-token-manager.d.ts +25 -0
- package/dist/lib/auth/oauth-token-manager.d.ts.map +1 -0
- package/dist/lib/auth/oauth-token-manager.js +70 -0
- package/dist/lib/auth/oauth-token-manager.js.map +1 -0
- package/dist/lib/auth/oauth-utils.d.ts +14 -0
- package/dist/lib/auth/oauth-utils.d.ts.map +1 -0
- package/dist/lib/auth/oauth-utils.js +68 -0
- package/dist/lib/auth/oauth-utils.js.map +1 -0
- package/dist/lib/auth/token-refresh.d.ts +2 -0
- package/dist/lib/auth/token-refresh.d.ts.map +1 -0
- package/dist/lib/auth/token-refresh.js +70 -0
- package/dist/lib/auth/token-refresh.js.map +1 -0
- package/dist/lib/bridge-client.d.ts +23 -0
- package/dist/lib/bridge-client.d.ts.map +1 -0
- package/dist/lib/bridge-client.js +181 -0
- package/dist/lib/bridge-client.js.map +1 -0
- package/dist/lib/bridge-manager.d.ts +17 -0
- package/dist/lib/bridge-manager.d.ts.map +1 -0
- package/dist/lib/bridge-manager.js +240 -0
- package/dist/lib/bridge-manager.js.map +1 -0
- package/dist/lib/config.d.ts +6 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +116 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/errors.d.ts +23 -0
- package/dist/lib/errors.d.ts.map +1 -0
- package/dist/lib/errors.js +81 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/file-lock.d.ts +2 -0
- package/dist/lib/file-lock.d.ts.map +1 -0
- package/dist/lib/file-lock.js +46 -0
- package/dist/lib/file-lock.js.map +1 -0
- package/dist/lib/file-logger.d.ts +19 -0
- package/dist/lib/file-logger.d.ts.map +1 -0
- package/dist/lib/file-logger.js +126 -0
- package/dist/lib/file-logger.js.map +1 -0
- package/dist/lib/index.d.ts +6 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/index.js +6 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/lib/logger.d.ts +24 -0
- package/dist/lib/logger.d.ts.map +1 -0
- package/dist/lib/logger.js +189 -0
- package/dist/lib/logger.js.map +1 -0
- package/dist/lib/session-client.d.ts +28 -0
- package/dist/lib/session-client.d.ts.map +1 -0
- package/dist/lib/session-client.js +104 -0
- package/dist/lib/session-client.js.map +1 -0
- package/dist/lib/sessions.d.ts +9 -0
- package/dist/lib/sessions.d.ts.map +1 -0
- package/dist/lib/sessions.js +116 -0
- package/dist/lib/sessions.js.map +1 -0
- package/dist/lib/types.d.ts +117 -0
- package/dist/lib/types.d.ts.map +1 -0
- package/dist/lib/types.js +2 -0
- package/dist/lib/types.js.map +1 -0
- package/dist/lib/utils.d.ts +29 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/lib/utils.js +173 -0
- package/dist/lib/utils.js.map +1 -0
- package/package.json +71 -0
- package/tsconfig.test.json +11 -0
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
import { Client as SDKClient } from '@modelcontextprotocol/sdk/client/index.js';
|
|
2
|
+
import { createNoOpLogger } from '../lib/logger.js';
|
|
3
|
+
import { ServerError, NetworkError, isAbortError } from '../lib/errors.js';
|
|
4
|
+
export class McpClient {
|
|
5
|
+
client;
|
|
6
|
+
logger;
|
|
7
|
+
negotiatedProtocolVersion;
|
|
8
|
+
constructor(clientInfo, options = {}) {
|
|
9
|
+
this.logger = options.logger || createNoOpLogger();
|
|
10
|
+
this.client = new SDKClient(clientInfo, {
|
|
11
|
+
capabilities: options.capabilities || {},
|
|
12
|
+
...options,
|
|
13
|
+
});
|
|
14
|
+
this.client.onerror = (error) => {
|
|
15
|
+
if (isAbortError(error)) {
|
|
16
|
+
this.logger.debug('Client aborted (expected during close)');
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
this.logger.error('Client error:', error);
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
async connect(transport) {
|
|
23
|
+
try {
|
|
24
|
+
this.logger.debug('Connecting to MCP server...');
|
|
25
|
+
transport.onerror = (error) => {
|
|
26
|
+
if (isAbortError(error)) {
|
|
27
|
+
this.logger.debug('Transport aborted (expected during close)');
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
this.logger.error('Transport error:', error);
|
|
31
|
+
};
|
|
32
|
+
transport.onclose = () => {
|
|
33
|
+
this.logger.debug('Transport closed');
|
|
34
|
+
};
|
|
35
|
+
await this.client.connect(transport);
|
|
36
|
+
const transportWithVersion = transport;
|
|
37
|
+
if (transportWithVersion.protocolVersion) {
|
|
38
|
+
this.negotiatedProtocolVersion = transportWithVersion.protocolVersion;
|
|
39
|
+
this.logger.debug(`Negotiated protocol version: ${this.negotiatedProtocolVersion}`);
|
|
40
|
+
}
|
|
41
|
+
const serverVersion = this.client.getServerVersion();
|
|
42
|
+
const serverCapabilities = this.client.getServerCapabilities();
|
|
43
|
+
this.logger.debug(`Connected to ${serverVersion?.name || 'unknown'} v${serverVersion?.version || 'unknown'}`);
|
|
44
|
+
this.logger.debug('Server capabilities:', serverCapabilities);
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
this.logger.error('Failed to connect:', error);
|
|
48
|
+
throw new NetworkError(`Failed to connect to MCP server: ${error.message}`, { originalError: error });
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
async close() {
|
|
52
|
+
try {
|
|
53
|
+
this.logger.debug('Closing connection...');
|
|
54
|
+
await this.client.close();
|
|
55
|
+
this.logger.debug('Connection closed');
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
this.logger.error('Error closing connection:', error);
|
|
59
|
+
throw new NetworkError(`Failed to close connection: ${error.message}`, { originalError: error });
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
getServerInfo() {
|
|
63
|
+
const info = {};
|
|
64
|
+
const serverVersion = this.client.getServerVersion();
|
|
65
|
+
const capabilities = this.client.getServerCapabilities();
|
|
66
|
+
const instructions = this.client.getInstructions();
|
|
67
|
+
if (serverVersion)
|
|
68
|
+
info.serverVersion = serverVersion;
|
|
69
|
+
if (capabilities)
|
|
70
|
+
info.capabilities = capabilities;
|
|
71
|
+
if (instructions)
|
|
72
|
+
info.instructions = instructions;
|
|
73
|
+
if (this.negotiatedProtocolVersion)
|
|
74
|
+
info.protocolVersion = this.negotiatedProtocolVersion;
|
|
75
|
+
return Promise.resolve(info);
|
|
76
|
+
}
|
|
77
|
+
async ping() {
|
|
78
|
+
try {
|
|
79
|
+
this.logger.debug('Sending ping...');
|
|
80
|
+
await this.client.ping();
|
|
81
|
+
this.logger.debug('Ping successful');
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
this.logger.error('Ping failed:', error);
|
|
85
|
+
throw new NetworkError(`Ping failed: ${error.message}`, { originalError: error });
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
async listTools(cursor) {
|
|
89
|
+
try {
|
|
90
|
+
this.logger.debug('Listing tools...', cursor ? { cursor } : {});
|
|
91
|
+
const result = await this.client.listTools({ cursor });
|
|
92
|
+
this.logger.debug(`Found ${result.tools.length} tools`);
|
|
93
|
+
return result;
|
|
94
|
+
}
|
|
95
|
+
catch (error) {
|
|
96
|
+
this.logger.error('Failed to list tools:', error);
|
|
97
|
+
throw new ServerError(`Failed to list tools: ${error.message}`, { originalError: error });
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
async callTool(name, args) {
|
|
101
|
+
try {
|
|
102
|
+
this.logger.debug(`Calling tool: ${name}`, args);
|
|
103
|
+
const result = (await this.client.callTool({
|
|
104
|
+
name,
|
|
105
|
+
arguments: args || {},
|
|
106
|
+
}));
|
|
107
|
+
this.logger.debug(`Tool ${name} completed`);
|
|
108
|
+
return result;
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
this.logger.error(`Failed to call tool ${name}:`, error);
|
|
112
|
+
throw new ServerError(`Failed to call tool ${name}: ${error.message}`, { originalError: error });
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
async listResources(cursor) {
|
|
116
|
+
try {
|
|
117
|
+
this.logger.debug('Listing resources...', cursor ? { cursor } : {});
|
|
118
|
+
const result = await this.client.listResources({ cursor });
|
|
119
|
+
this.logger.debug(`Found ${result.resources.length} resources`);
|
|
120
|
+
return result;
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
this.logger.error('Failed to list resources:', error);
|
|
124
|
+
throw new ServerError(`Failed to list resources: ${error.message}`, { originalError: error });
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
async listResourceTemplates(cursor) {
|
|
128
|
+
try {
|
|
129
|
+
this.logger.debug('Listing resource templates...', cursor ? { cursor } : {});
|
|
130
|
+
const result = await this.client.listResourceTemplates({ cursor });
|
|
131
|
+
this.logger.debug(`Found ${result.resourceTemplates.length} resource templates`);
|
|
132
|
+
return result;
|
|
133
|
+
}
|
|
134
|
+
catch (error) {
|
|
135
|
+
this.logger.error('Failed to list resource templates:', error);
|
|
136
|
+
throw new ServerError(`Failed to list resource templates: ${error.message}`, { originalError: error });
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
async readResource(uri) {
|
|
140
|
+
try {
|
|
141
|
+
this.logger.debug(`Reading resource: ${uri}`);
|
|
142
|
+
const result = await this.client.readResource({ uri });
|
|
143
|
+
this.logger.debug(`Resource ${uri} read successfully`);
|
|
144
|
+
return result;
|
|
145
|
+
}
|
|
146
|
+
catch (error) {
|
|
147
|
+
this.logger.error(`Failed to read resource ${uri}:`, error);
|
|
148
|
+
throw new ServerError(`Failed to read resource ${uri}: ${error.message}`, { originalError: error });
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
async subscribeResource(uri) {
|
|
152
|
+
try {
|
|
153
|
+
this.logger.debug(`Subscribing to resource: ${uri}`);
|
|
154
|
+
await this.client.subscribeResource({ uri });
|
|
155
|
+
this.logger.debug(`Subscribed to resource ${uri}`);
|
|
156
|
+
}
|
|
157
|
+
catch (error) {
|
|
158
|
+
this.logger.error(`Failed to subscribe to resource ${uri}:`, error);
|
|
159
|
+
throw new ServerError(`Failed to subscribe to resource ${uri}: ${error.message}`, { originalError: error });
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
async unsubscribeResource(uri) {
|
|
163
|
+
try {
|
|
164
|
+
this.logger.debug(`Unsubscribing from resource: ${uri}`);
|
|
165
|
+
await this.client.unsubscribeResource({ uri });
|
|
166
|
+
this.logger.debug(`Unsubscribed from resource ${uri}`);
|
|
167
|
+
}
|
|
168
|
+
catch (error) {
|
|
169
|
+
this.logger.error(`Failed to unsubscribe from resource ${uri}:`, error);
|
|
170
|
+
throw new ServerError(`Failed to unsubscribe from resource ${uri}: ${error.message}`, { originalError: error });
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
async listPrompts(cursor) {
|
|
174
|
+
try {
|
|
175
|
+
this.logger.debug('Listing prompts...', cursor ? { cursor } : {});
|
|
176
|
+
const result = await this.client.listPrompts({ cursor });
|
|
177
|
+
this.logger.debug(`Found ${result.prompts.length} prompts`);
|
|
178
|
+
return result;
|
|
179
|
+
}
|
|
180
|
+
catch (error) {
|
|
181
|
+
this.logger.error('Failed to list prompts:', error);
|
|
182
|
+
throw new ServerError(`Failed to list prompts: ${error.message}`, { originalError: error });
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
async getPrompt(name, args) {
|
|
186
|
+
try {
|
|
187
|
+
this.logger.debug(`Getting prompt: ${name}`, args);
|
|
188
|
+
const result = (await this.client.getPrompt({
|
|
189
|
+
name,
|
|
190
|
+
arguments: args,
|
|
191
|
+
}));
|
|
192
|
+
this.logger.debug(`Prompt ${name} retrieved`);
|
|
193
|
+
return result;
|
|
194
|
+
}
|
|
195
|
+
catch (error) {
|
|
196
|
+
this.logger.error(`Failed to get prompt ${name}:`, error);
|
|
197
|
+
throw new ServerError(`Failed to get prompt ${name}: ${error.message}`, { originalError: error });
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
async setLoggingLevel(level) {
|
|
201
|
+
try {
|
|
202
|
+
this.logger.debug(`Setting log level to: ${level}`);
|
|
203
|
+
await this.client.setLoggingLevel(level);
|
|
204
|
+
this.logger.debug('Log level set successfully');
|
|
205
|
+
}
|
|
206
|
+
catch (error) {
|
|
207
|
+
this.logger.error(`Failed to set log level:`, error);
|
|
208
|
+
throw new ServerError(`Failed to set log level: ${error.message}`, { originalError: error });
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
getSDKClient() {
|
|
212
|
+
return this.client;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
//# sourceMappingURL=mcp-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-client.js","sourceRoot":"","sources":["../../src/core/mcp-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export type { Transport, TransportSendOptions, FetchLike, } from '@modelcontextprotocol/sdk/shared/transport.js';
|
|
2
|
+
export { StdioClientTransport, type StdioServerParameters, getDefaultEnvironment, } from '@modelcontextprotocol/sdk/client/stdio.js';
|
|
3
|
+
export { StreamableHTTPClientTransport, type StreamableHTTPClientTransportOptions, type StreamableHTTPReconnectionOptions, StreamableHTTPError, } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
|
|
4
|
+
export type { OAuthClientProvider } from '@modelcontextprotocol/sdk/client/auth.js';
|
|
5
|
+
import type { Transport } from '@modelcontextprotocol/sdk/shared/transport.js';
|
|
6
|
+
import { type StdioServerParameters } from '@modelcontextprotocol/sdk/client/stdio.js';
|
|
7
|
+
import { type StreamableHTTPClientTransportOptions } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
|
|
8
|
+
import type { TransportConfig } from '../lib/types.js';
|
|
9
|
+
export declare function createStdioTransport(config: StdioServerParameters): Transport;
|
|
10
|
+
export declare function createStreamableHttpTransport(url: string, options?: Omit<StreamableHTTPClientTransportOptions, 'fetch'>): Transport;
|
|
11
|
+
export declare function createTransportFromConfig(config: TransportConfig): Transport;
|
|
12
|
+
//# sourceMappingURL=transports.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transports.d.ts","sourceRoot":"","sources":["../../src/core/transports.ts"],"names":[],"mappings":"AAMA,YAAY,EACV,SAAS,EACT,oBAAoB,EACpB,SAAS,GACV,MAAM,+CAA+C,CAAC;AAEvD,OAAO,EACL,oBAAoB,EACpB,KAAK,qBAAqB,EAC1B,qBAAqB,GACtB,MAAM,2CAA2C,CAAC;AAEnD,OAAO,EACL,6BAA6B,EAC7B,KAAK,oCAAoC,EACzC,KAAK,iCAAiC,EACtC,mBAAmB,GACpB,MAAM,oDAAoD,CAAC;AAG5D,YAAY,EAAE,mBAAmB,EAAE,MAAM,0CAA0C,CAAC;AAEpF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+CAA+C,CAAC;AAC/E,OAAO,EAEL,KAAK,qBAAqB,EAC3B,MAAM,2CAA2C,CAAC;AACnD,OAAO,EAEL,KAAK,oCAAoC,EAC1C,MAAM,oDAAoD,CAAC;AAE5D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAMvD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,qBAAqB,GAAG,SAAS,CAK7E;AAKD,wBAAgB,6BAA6B,CAC3C,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,IAAI,CAAC,oCAAoC,EAAE,OAAO,CAAM,GAChE,SAAS,CAgBX;AAKD,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,eAAe,GAAG,SAAS,CAgD5E"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
export { StdioClientTransport, getDefaultEnvironment, } from '@modelcontextprotocol/sdk/client/stdio.js';
|
|
2
|
+
export { StreamableHTTPClientTransport, StreamableHTTPError, } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
|
|
3
|
+
import { StdioClientTransport, } from '@modelcontextprotocol/sdk/client/stdio.js';
|
|
4
|
+
import { StreamableHTTPClientTransport, } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
|
|
5
|
+
import { createLogger } from '../lib/logger.js';
|
|
6
|
+
import { ClientError } from '../lib/errors.js';
|
|
7
|
+
export function createStdioTransport(config) {
|
|
8
|
+
const logger = createLogger('StdioTransport');
|
|
9
|
+
logger.debug('Creating stdio transport', { command: config.command, args: config.args });
|
|
10
|
+
return new StdioClientTransport(config);
|
|
11
|
+
}
|
|
12
|
+
export function createStreamableHttpTransport(url, options = {}) {
|
|
13
|
+
const logger = createLogger('StreamableHttpTransport');
|
|
14
|
+
logger.debug('Creating Streamable HTTP transport', { url });
|
|
15
|
+
const defaultReconnectionOptions = {
|
|
16
|
+
initialReconnectionDelay: 1000,
|
|
17
|
+
maxReconnectionDelay: 30000,
|
|
18
|
+
reconnectionDelayGrowFactor: 2,
|
|
19
|
+
maxRetries: 10,
|
|
20
|
+
};
|
|
21
|
+
return new StreamableHTTPClientTransport(new URL(url), {
|
|
22
|
+
reconnectionOptions: defaultReconnectionOptions,
|
|
23
|
+
...options,
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
export function createTransportFromConfig(config) {
|
|
27
|
+
switch (config.type) {
|
|
28
|
+
case 'stdio': {
|
|
29
|
+
if (!config.command) {
|
|
30
|
+
throw new ClientError('stdio transport requires a command');
|
|
31
|
+
}
|
|
32
|
+
const stdioConfig = {
|
|
33
|
+
command: config.command,
|
|
34
|
+
};
|
|
35
|
+
if (config.args !== undefined) {
|
|
36
|
+
stdioConfig.args = config.args;
|
|
37
|
+
}
|
|
38
|
+
if (config.env !== undefined) {
|
|
39
|
+
stdioConfig.env = config.env;
|
|
40
|
+
}
|
|
41
|
+
return createStdioTransport(stdioConfig);
|
|
42
|
+
}
|
|
43
|
+
case 'http': {
|
|
44
|
+
if (!config.url) {
|
|
45
|
+
throw new ClientError('http transport requires a URL');
|
|
46
|
+
}
|
|
47
|
+
const options = {};
|
|
48
|
+
if (config.headers !== undefined) {
|
|
49
|
+
options.requestInit = {
|
|
50
|
+
headers: config.headers,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
if (config.timeoutMs !== undefined) {
|
|
54
|
+
options.requestInit = {
|
|
55
|
+
...options.requestInit,
|
|
56
|
+
signal: AbortSignal.timeout(config.timeoutMs),
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
return createStreamableHttpTransport(config.url, options);
|
|
60
|
+
}
|
|
61
|
+
default:
|
|
62
|
+
throw new ClientError(`Unknown transport type: ${config.type}`);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=transports.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transports.js","sourceRoot":"","sources":["../../src/core/transports.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { AuthProfile, AuthProfilesStorage } from '../types.js';
|
|
2
|
+
export declare function loadAuthProfiles(): Promise<AuthProfilesStorage>;
|
|
3
|
+
export declare function listAuthProfiles(): Promise<AuthProfile[]>;
|
|
4
|
+
export declare function getAuthProfile(serverUrl: string, profileName: string): Promise<AuthProfile | undefined>;
|
|
5
|
+
export declare function saveAuthProfile(profile: AuthProfile): Promise<void>;
|
|
6
|
+
export declare function deleteAuthProfile(serverUrl: string, profileName: string): Promise<boolean>;
|
|
7
|
+
//# sourceMappingURL=auth-profiles.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-profiles.d.ts","sourceRoot":"","sources":["../../../src/lib/auth/auth-profiles.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AA6EpE,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,mBAAmB,CAAC,CAGrE;AAKD,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,CAiB/D;AAKD,wBAAsB,cAAc,CAClC,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAGlC;AAKD,wBAAsB,eAAe,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBzE;AAKD,wBAAsB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CA0BhG"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { readFile, writeFile, rename, unlink } from 'fs/promises';
|
|
2
|
+
import { tmpdir } from 'os';
|
|
3
|
+
import { join } from 'path';
|
|
4
|
+
import { getAuthProfilesFilePath, fileExists, ensureDir, getMcpcHome } from '../utils.js';
|
|
5
|
+
import { withFileLock } from '../file-lock.js';
|
|
6
|
+
import { createLogger } from '../logger.js';
|
|
7
|
+
import { ClientError } from '../errors.js';
|
|
8
|
+
import { removeKeychainOAuthClientInfo, removeKeychainOAuthTokenInfo, } from './keychain.js';
|
|
9
|
+
const logger = createLogger('auth-profiles');
|
|
10
|
+
const AUTH_PROFILES_DEFAULT_CONTENT = JSON.stringify({ profiles: {} }, null, 2);
|
|
11
|
+
async function loadAuthProfilesInternal() {
|
|
12
|
+
const filePath = getAuthProfilesFilePath();
|
|
13
|
+
if (!(await fileExists(filePath))) {
|
|
14
|
+
logger.debug('Auth profiles file does not exist, returning empty profiles');
|
|
15
|
+
return { profiles: {} };
|
|
16
|
+
}
|
|
17
|
+
try {
|
|
18
|
+
const content = await readFile(filePath, 'utf-8');
|
|
19
|
+
const storage = JSON.parse(content);
|
|
20
|
+
if (!storage.profiles || typeof storage.profiles !== 'object') {
|
|
21
|
+
logger.warn('Invalid auth profiles file format, returning empty profiles');
|
|
22
|
+
return { profiles: {} };
|
|
23
|
+
}
|
|
24
|
+
return storage;
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
logger.warn(`Failed to load auth profiles: ${error.message}`);
|
|
28
|
+
return { profiles: {} };
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
async function saveAuthProfilesInternal(storage) {
|
|
32
|
+
const filePath = getAuthProfilesFilePath();
|
|
33
|
+
await ensureDir(getMcpcHome());
|
|
34
|
+
const tempFile = join(tmpdir(), `mcpc-auth-profiles-${Date.now()}-${process.pid}.json`);
|
|
35
|
+
try {
|
|
36
|
+
const content = JSON.stringify(storage, null, 2);
|
|
37
|
+
await writeFile(tempFile, content, { encoding: 'utf-8', mode: 0o600 });
|
|
38
|
+
await rename(tempFile, filePath);
|
|
39
|
+
logger.debug('Auth profiles saved successfully');
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
try {
|
|
43
|
+
await unlink(tempFile);
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
}
|
|
47
|
+
throw new ClientError(`Failed to save auth profiles: ${error.message}`);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
export async function loadAuthProfiles() {
|
|
51
|
+
const filePath = getAuthProfilesFilePath();
|
|
52
|
+
return withFileLock(filePath, loadAuthProfilesInternal, AUTH_PROFILES_DEFAULT_CONTENT);
|
|
53
|
+
}
|
|
54
|
+
export async function listAuthProfiles() {
|
|
55
|
+
const storage = await loadAuthProfiles();
|
|
56
|
+
const profiles = [];
|
|
57
|
+
for (const serverUrl in storage.profiles) {
|
|
58
|
+
const serverProfiles = storage.profiles[serverUrl];
|
|
59
|
+
if (serverProfiles) {
|
|
60
|
+
for (const profileName in serverProfiles) {
|
|
61
|
+
const profile = serverProfiles[profileName];
|
|
62
|
+
if (profile) {
|
|
63
|
+
profiles.push(profile);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return profiles;
|
|
69
|
+
}
|
|
70
|
+
export async function getAuthProfile(serverUrl, profileName) {
|
|
71
|
+
const storage = await loadAuthProfiles();
|
|
72
|
+
return storage.profiles[serverUrl]?.[profileName];
|
|
73
|
+
}
|
|
74
|
+
export async function saveAuthProfile(profile) {
|
|
75
|
+
const filePath = getAuthProfilesFilePath();
|
|
76
|
+
return withFileLock(filePath, async () => {
|
|
77
|
+
const storage = await loadAuthProfilesInternal();
|
|
78
|
+
if (!storage.profiles[profile.serverUrl]) {
|
|
79
|
+
storage.profiles[profile.serverUrl] = {};
|
|
80
|
+
}
|
|
81
|
+
storage.profiles[profile.serverUrl][profile.name] = profile;
|
|
82
|
+
await saveAuthProfilesInternal(storage);
|
|
83
|
+
logger.debug(`Saved auth profile: ${profile.name} for ${profile.serverUrl}`);
|
|
84
|
+
}, AUTH_PROFILES_DEFAULT_CONTENT);
|
|
85
|
+
}
|
|
86
|
+
export async function deleteAuthProfile(serverUrl, profileName) {
|
|
87
|
+
const filePath = getAuthProfilesFilePath();
|
|
88
|
+
return withFileLock(filePath, async () => {
|
|
89
|
+
const storage = await loadAuthProfilesInternal();
|
|
90
|
+
const serverProfiles = storage.profiles[serverUrl];
|
|
91
|
+
if (!serverProfiles || !serverProfiles[profileName]) {
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
94
|
+
await removeKeychainOAuthClientInfo(serverUrl, profileName);
|
|
95
|
+
await removeKeychainOAuthTokenInfo(serverUrl, profileName);
|
|
96
|
+
delete serverProfiles[profileName];
|
|
97
|
+
if (Object.keys(serverProfiles).length === 0) {
|
|
98
|
+
delete storage.profiles[serverUrl];
|
|
99
|
+
}
|
|
100
|
+
await saveAuthProfilesInternal(storage);
|
|
101
|
+
logger.debug(`Deleted auth profile: ${profileName} for ${serverUrl}`);
|
|
102
|
+
return true;
|
|
103
|
+
}, AUTH_PROFILES_DEFAULT_CONTENT);
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=auth-profiles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-profiles.js","sourceRoot":"","sources":["../../../src/lib/auth/auth-profiles.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export interface OAuthClientInfo {
|
|
2
|
+
clientId: string;
|
|
3
|
+
clientSecret?: string;
|
|
4
|
+
}
|
|
5
|
+
export interface OAuthTokenInfo {
|
|
6
|
+
accessToken: string;
|
|
7
|
+
refreshToken?: string;
|
|
8
|
+
tokenType: string;
|
|
9
|
+
expiresIn?: number;
|
|
10
|
+
expiresAt?: number;
|
|
11
|
+
scope?: string;
|
|
12
|
+
}
|
|
13
|
+
export declare function storeKeychainOAuthClientInfo(serverUrl: string, profileName: string, client: OAuthClientInfo): Promise<void>;
|
|
14
|
+
export declare function readKeychainOAuthClientInfo(serverUrl: string, profileName: string): Promise<OAuthClientInfo | undefined>;
|
|
15
|
+
export declare function removeKeychainOAuthClientInfo(serverUrl: string, profileName: string): Promise<boolean>;
|
|
16
|
+
export declare function storeKeychainOAuthTokenInfo(serverUrl: string, profileName: string, tokens: OAuthTokenInfo): Promise<void>;
|
|
17
|
+
export declare function readKeychainOAuthTokenInfo(serverUrl: string, profileName: string): Promise<OAuthTokenInfo | undefined>;
|
|
18
|
+
export declare function removeKeychainOAuthTokenInfo(serverUrl: string, profileName: string): Promise<boolean>;
|
|
19
|
+
export declare function storeKeychainSessionHeaders(sessionName: string, headers: Record<string, string>): Promise<void>;
|
|
20
|
+
export declare function readKeychainSessionHeaders(sessionName: string): Promise<Record<string, string> | undefined>;
|
|
21
|
+
export declare function removeKeychainSessionHeaders(sessionName: string): Promise<boolean>;
|
|
22
|
+
//# sourceMappingURL=keychain.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keychain.d.ts","sourceRoot":"","sources":["../../../src/lib/auth/keychain.ts"],"names":[],"mappings":"AAgBA,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAKD,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AA0BD,wBAAsB,4BAA4B,CAChD,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,eAAe,GACtB,OAAO,CAAC,IAAI,CAAC,CAMf;AAKD,wBAAsB,2BAA2B,CAC/C,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC,CAgBtC;AAKD,wBAAsB,6BAA6B,CACjD,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,OAAO,CAAC,CAKlB;AAKD,wBAAsB,2BAA2B,CAC/C,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,cAAc,GACrB,OAAO,CAAC,IAAI,CAAC,CAMf;AAKD,wBAAsB,0BAA0B,CAC9C,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC,CAgBrC;AAKD,wBAAsB,4BAA4B,CAChD,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,OAAO,CAAC,CAKlB;AAMD,wBAAsB,2BAA2B,CAC/C,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC9B,OAAO,CAAC,IAAI,CAAC,CAMf;AAKD,wBAAsB,0BAA0B,CAC9C,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC,CAgB7C;AAKD,wBAAsB,4BAA4B,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAKxF"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import keytar from 'keytar';
|
|
2
|
+
import { createLogger } from '../logger.js';
|
|
3
|
+
const logger = createLogger('keychain');
|
|
4
|
+
const SERVICE_NAME = 'mcpc';
|
|
5
|
+
function buildOAuthClientAccountName(serverUrl, profileName) {
|
|
6
|
+
return `auth-profile:${serverUrl}:${profileName}:client`;
|
|
7
|
+
}
|
|
8
|
+
function buildOAuthTokensAccountName(serverUrl, profileName) {
|
|
9
|
+
return `auth-profile:${serverUrl}:${profileName}:tokens`;
|
|
10
|
+
}
|
|
11
|
+
function buildSessionAccountName(sessionName) {
|
|
12
|
+
return `session:${sessionName}:headers`;
|
|
13
|
+
}
|
|
14
|
+
export async function storeKeychainOAuthClientInfo(serverUrl, profileName, client) {
|
|
15
|
+
const account = buildOAuthClientAccountName(serverUrl, profileName);
|
|
16
|
+
const value = JSON.stringify(client);
|
|
17
|
+
logger.debug(`Storing OAuth client info for ${profileName} @ ${serverUrl}`);
|
|
18
|
+
await keytar.setPassword(SERVICE_NAME, account, value);
|
|
19
|
+
}
|
|
20
|
+
export async function readKeychainOAuthClientInfo(serverUrl, profileName) {
|
|
21
|
+
const account = buildOAuthClientAccountName(serverUrl, profileName);
|
|
22
|
+
logger.debug(`Retrieving OAuth client info for ${profileName} @ ${serverUrl}`);
|
|
23
|
+
const value = await keytar.getPassword(SERVICE_NAME, account);
|
|
24
|
+
if (!value) {
|
|
25
|
+
return undefined;
|
|
26
|
+
}
|
|
27
|
+
try {
|
|
28
|
+
return JSON.parse(value);
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
logger.error(`Failed to parse OAuth client info from keychain: ${error.message}`);
|
|
32
|
+
return undefined;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
export async function removeKeychainOAuthClientInfo(serverUrl, profileName) {
|
|
36
|
+
const account = buildOAuthClientAccountName(serverUrl, profileName);
|
|
37
|
+
logger.debug(`Deleting OAuth client info for ${profileName} @ ${serverUrl}`);
|
|
38
|
+
return keytar.deletePassword(SERVICE_NAME, account);
|
|
39
|
+
}
|
|
40
|
+
export async function storeKeychainOAuthTokenInfo(serverUrl, profileName, tokens) {
|
|
41
|
+
const account = buildOAuthTokensAccountName(serverUrl, profileName);
|
|
42
|
+
const value = JSON.stringify(tokens);
|
|
43
|
+
logger.debug(`Storing OAuth tokens for ${profileName} @ ${serverUrl}`);
|
|
44
|
+
await keytar.setPassword(SERVICE_NAME, account, value);
|
|
45
|
+
}
|
|
46
|
+
export async function readKeychainOAuthTokenInfo(serverUrl, profileName) {
|
|
47
|
+
const account = buildOAuthTokensAccountName(serverUrl, profileName);
|
|
48
|
+
logger.debug(`Retrieving OAuth tokens for ${profileName} @ ${serverUrl}`);
|
|
49
|
+
const value = await keytar.getPassword(SERVICE_NAME, account);
|
|
50
|
+
if (!value) {
|
|
51
|
+
return undefined;
|
|
52
|
+
}
|
|
53
|
+
try {
|
|
54
|
+
return JSON.parse(value);
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
logger.error(`Failed to parse OAuth tokens from keychain: ${error.message}`);
|
|
58
|
+
return undefined;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
export async function removeKeychainOAuthTokenInfo(serverUrl, profileName) {
|
|
62
|
+
const account = buildOAuthTokensAccountName(serverUrl, profileName);
|
|
63
|
+
logger.debug(`Deleting OAuth tokens for ${profileName} @ ${serverUrl}`);
|
|
64
|
+
return keytar.deletePassword(SERVICE_NAME, account);
|
|
65
|
+
}
|
|
66
|
+
export async function storeKeychainSessionHeaders(sessionName, headers) {
|
|
67
|
+
const account = buildSessionAccountName(sessionName);
|
|
68
|
+
const value = JSON.stringify(headers);
|
|
69
|
+
logger.debug(`Storing headers for session ${sessionName}`);
|
|
70
|
+
await keytar.setPassword(SERVICE_NAME, account, value);
|
|
71
|
+
}
|
|
72
|
+
export async function readKeychainSessionHeaders(sessionName) {
|
|
73
|
+
const account = buildSessionAccountName(sessionName);
|
|
74
|
+
logger.debug(`Retrieving headers for session ${sessionName}`);
|
|
75
|
+
const value = await keytar.getPassword(SERVICE_NAME, account);
|
|
76
|
+
if (!value) {
|
|
77
|
+
return undefined;
|
|
78
|
+
}
|
|
79
|
+
try {
|
|
80
|
+
return JSON.parse(value);
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
logger.error(`Failed to parse headers from keychain: ${error.message}`);
|
|
84
|
+
return undefined;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
export async function removeKeychainSessionHeaders(sessionName) {
|
|
88
|
+
const account = buildSessionAccountName(sessionName);
|
|
89
|
+
logger.debug(`Deleting headers for session ${sessionName}`);
|
|
90
|
+
return keytar.deletePassword(SERVICE_NAME, account);
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=keychain.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keychain.js","sourceRoot":"","sources":["../../../src/lib/auth/keychain.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { AuthProfile } from '../types.js';
|
|
2
|
+
export interface OAuthFlowResult {
|
|
3
|
+
profile: AuthProfile;
|
|
4
|
+
success: boolean;
|
|
5
|
+
}
|
|
6
|
+
export declare function performOAuthFlow(serverUrl: string, profileName: string, scope?: string): Promise<OAuthFlowResult>;
|
|
7
|
+
//# sourceMappingURL=oauth-flow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth-flow.d.ts","sourceRoot":"","sources":["../../../src/lib/auth/oauth-flow.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAgD/C,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,WAAW,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;CAClB;AA+JD,wBAAsB,gBAAgB,CACpC,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,eAAe,CAAC,CAsG1B"}
|