@dexto/core 1.5.6 → 1.5.8
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/agent/DextoAgent.cjs +189 -30
- package/dist/agent/DextoAgent.d.ts +44 -9
- package/dist/agent/DextoAgent.d.ts.map +1 -1
- package/dist/agent/DextoAgent.js +190 -31
- package/dist/agent/schemas.cjs +5 -0
- package/dist/agent/schemas.d.ts +456 -66
- package/dist/agent/schemas.d.ts.map +1 -1
- package/dist/agent/schemas.js +5 -0
- package/dist/context/manager.cjs +1 -1
- package/dist/context/manager.js +1 -1
- package/dist/context/utils.cjs +90 -17
- package/dist/context/utils.d.ts.map +1 -1
- package/dist/context/utils.js +90 -17
- package/dist/errors/types.cjs +2 -1
- package/dist/errors/types.d.ts +2 -1
- package/dist/errors/types.d.ts.map +1 -1
- package/dist/errors/types.js +2 -1
- package/dist/events/index.cjs +4 -1
- package/dist/events/index.d.ts +37 -2
- package/dist/events/index.d.ts.map +1 -1
- package/dist/events/index.js +4 -1
- package/dist/image/types.d.ts +15 -0
- package/dist/image/types.d.ts.map +1 -1
- package/dist/index.browser.d.ts +1 -1
- package/dist/index.browser.d.ts.map +1 -1
- package/dist/llm/curation-config.cjs +82 -0
- package/dist/llm/curation-config.d.ts +13 -0
- package/dist/llm/curation-config.d.ts.map +1 -0
- package/dist/llm/curation-config.js +59 -0
- package/dist/llm/curation.cjs +57 -0
- package/dist/llm/curation.d.ts +16 -0
- package/dist/llm/curation.d.ts.map +1 -0
- package/dist/llm/curation.js +34 -0
- package/dist/llm/error-codes.cjs +1 -0
- package/dist/llm/error-codes.d.ts +1 -0
- package/dist/llm/error-codes.d.ts.map +1 -1
- package/dist/llm/error-codes.js +1 -0
- package/dist/llm/errors.cjs +16 -1
- package/dist/llm/errors.d.ts +15 -8
- package/dist/llm/errors.d.ts.map +1 -1
- package/dist/llm/errors.js +16 -1
- package/dist/llm/executor/provider-options.cjs +1 -1
- package/dist/llm/executor/provider-options.js +1 -1
- package/dist/llm/executor/turn-executor.cjs +35 -2
- package/dist/llm/executor/turn-executor.d.ts.map +1 -1
- package/dist/llm/executor/turn-executor.js +35 -2
- package/dist/llm/index.cjs +14 -3
- package/dist/llm/index.d.ts +3 -1
- package/dist/llm/index.d.ts.map +1 -1
- package/dist/llm/index.js +13 -2
- package/dist/llm/registry/auto-update.cjs +263 -0
- package/dist/llm/registry/auto-update.d.ts +27 -0
- package/dist/llm/registry/auto-update.d.ts.map +1 -0
- package/dist/llm/registry/auto-update.js +227 -0
- package/dist/llm/registry/index.cjs +806 -0
- package/dist/llm/{registry.d.ts → registry/index.d.ts} +67 -13
- package/dist/llm/registry/index.d.ts.map +1 -0
- package/dist/llm/registry/index.js +756 -0
- package/dist/llm/registry/models.generated.cjs +4861 -0
- package/dist/llm/registry/models.generated.d.ts +431 -0
- package/dist/llm/registry/models.generated.d.ts.map +1 -0
- package/dist/llm/registry/models.generated.js +4838 -0
- package/dist/llm/registry/models.manual.cjs +44 -0
- package/dist/llm/registry/models.manual.d.ts +22 -0
- package/dist/llm/registry/models.manual.d.ts.map +1 -0
- package/dist/llm/registry/models.manual.js +21 -0
- package/dist/llm/registry/sync.cjs +354 -0
- package/dist/llm/registry/sync.d.ts +41 -0
- package/dist/llm/registry/sync.d.ts.map +1 -0
- package/dist/llm/registry/sync.js +328 -0
- package/dist/llm/resolver.cjs +29 -7
- package/dist/llm/resolver.d.ts +1 -1
- package/dist/llm/resolver.d.ts.map +1 -1
- package/dist/llm/resolver.js +31 -8
- package/dist/llm/schemas.cjs +13 -1
- package/dist/llm/schemas.d.ts +59 -59
- package/dist/llm/schemas.d.ts.map +1 -1
- package/dist/llm/schemas.js +14 -1
- package/dist/llm/services/factory.cjs +43 -27
- package/dist/llm/services/factory.d.ts +20 -1
- package/dist/llm/services/factory.d.ts.map +1 -1
- package/dist/llm/services/factory.js +44 -28
- package/dist/llm/services/test-utils.integration.cjs +5 -1
- package/dist/llm/services/test-utils.integration.d.ts.map +1 -1
- package/dist/llm/services/test-utils.integration.js +5 -1
- package/dist/llm/services/vercel.cjs +4 -1
- package/dist/llm/services/vercel.d.ts +1 -0
- package/dist/llm/services/vercel.d.ts.map +1 -1
- package/dist/llm/services/vercel.js +4 -1
- package/dist/llm/types.cjs +5 -2
- package/dist/llm/types.d.ts +1 -1
- package/dist/llm/types.d.ts.map +1 -1
- package/dist/llm/types.js +5 -2
- package/dist/llm/validation.cjs +1 -1
- package/dist/llm/validation.js +1 -1
- package/dist/logger/v2/dexto-logger.cjs +4 -0
- package/dist/logger/v2/dexto-logger.d.ts +3 -0
- package/dist/logger/v2/dexto-logger.d.ts.map +1 -1
- package/dist/logger/v2/dexto-logger.js +4 -0
- package/dist/logger/v2/types.d.ts +2 -0
- package/dist/logger/v2/types.d.ts.map +1 -1
- package/dist/mcp/error-codes.cjs +1 -0
- package/dist/mcp/error-codes.d.ts +1 -0
- package/dist/mcp/error-codes.d.ts.map +1 -1
- package/dist/mcp/error-codes.js +1 -0
- package/dist/mcp/errors.cjs +13 -0
- package/dist/mcp/errors.d.ts +7 -0
- package/dist/mcp/errors.d.ts.map +1 -1
- package/dist/mcp/errors.js +13 -0
- package/dist/mcp/manager.cjs +46 -4
- package/dist/mcp/manager.d.ts +10 -2
- package/dist/mcp/manager.d.ts.map +1 -1
- package/dist/mcp/manager.js +46 -4
- package/dist/mcp/mcp-client.cjs +89 -5
- package/dist/mcp/mcp-client.d.ts +5 -1
- package/dist/mcp/mcp-client.d.ts.map +1 -1
- package/dist/mcp/mcp-client.js +89 -5
- package/dist/mcp/schemas.cjs +6 -1
- package/dist/mcp/schemas.d.ts +1 -1
- package/dist/mcp/schemas.d.ts.map +1 -1
- package/dist/mcp/schemas.js +6 -1
- package/dist/mcp/types.d.ts +5 -0
- package/dist/mcp/types.d.ts.map +1 -1
- package/dist/prompts/index.d.ts +1 -1
- package/dist/prompts/index.d.ts.map +1 -1
- package/dist/prompts/prompt-manager.cjs +90 -4
- package/dist/prompts/prompt-manager.d.ts +16 -6
- package/dist/prompts/prompt-manager.d.ts.map +1 -1
- package/dist/prompts/prompt-manager.js +90 -4
- package/dist/prompts/providers/config-prompt-provider.cjs +104 -10
- package/dist/prompts/providers/config-prompt-provider.d.ts.map +1 -1
- package/dist/prompts/providers/config-prompt-provider.js +105 -11
- package/dist/prompts/providers/custom-prompt-provider.cjs +1 -0
- package/dist/prompts/providers/custom-prompt-provider.d.ts.map +1 -1
- package/dist/prompts/providers/custom-prompt-provider.js +1 -0
- package/dist/prompts/providers/mcp-prompt-provider.cjs +1 -0
- package/dist/prompts/providers/mcp-prompt-provider.d.ts.map +1 -1
- package/dist/prompts/providers/mcp-prompt-provider.js +1 -0
- package/dist/prompts/schemas.cjs +28 -2
- package/dist/prompts/schemas.d.ts +130 -0
- package/dist/prompts/schemas.d.ts.map +1 -1
- package/dist/prompts/schemas.js +28 -2
- package/dist/prompts/types.d.ts +55 -3
- package/dist/prompts/types.d.ts.map +1 -1
- package/dist/resources/handlers/filesystem-handler.cjs +25 -0
- package/dist/resources/handlers/filesystem-handler.d.ts +1 -0
- package/dist/resources/handlers/filesystem-handler.d.ts.map +1 -1
- package/dist/resources/handlers/filesystem-handler.js +25 -0
- package/dist/session/chat-session.cjs +1 -1
- package/dist/session/chat-session.d.ts +1 -1
- package/dist/session/chat-session.d.ts.map +1 -1
- package/dist/session/chat-session.js +1 -1
- package/dist/session/index.d.ts +1 -1
- package/dist/session/index.d.ts.map +1 -1
- package/dist/session/message-queue.cjs +29 -5
- package/dist/session/message-queue.d.ts +3 -1
- package/dist/session/message-queue.d.ts.map +1 -1
- package/dist/session/message-queue.js +29 -5
- package/dist/session/session-manager.cjs +84 -3
- package/dist/session/session-manager.d.ts +12 -0
- package/dist/session/session-manager.d.ts.map +1 -1
- package/dist/session/session-manager.js +74 -3
- package/dist/session/types.d.ts +1 -0
- package/dist/session/types.d.ts.map +1 -1
- package/dist/systemPrompt/contributors.cjs +42 -0
- package/dist/systemPrompt/contributors.d.ts +13 -0
- package/dist/systemPrompt/contributors.d.ts.map +1 -1
- package/dist/systemPrompt/contributors.js +41 -0
- package/dist/tools/errors.cjs +7 -3
- package/dist/tools/errors.d.ts +5 -1
- package/dist/tools/errors.d.ts.map +1 -1
- package/dist/tools/errors.js +7 -3
- package/dist/tools/internal-tools/constants.cjs +2 -1
- package/dist/tools/internal-tools/constants.d.ts +1 -1
- package/dist/tools/internal-tools/constants.d.ts.map +1 -1
- package/dist/tools/internal-tools/constants.js +2 -1
- package/dist/tools/internal-tools/implementations/invoke-skill-tool.cjs +140 -0
- package/dist/tools/internal-tools/implementations/invoke-skill-tool.d.ts +24 -0
- package/dist/tools/internal-tools/implementations/invoke-skill-tool.d.ts.map +1 -0
- package/dist/tools/internal-tools/implementations/invoke-skill-tool.js +117 -0
- package/dist/tools/internal-tools/provider.cjs +15 -0
- package/dist/tools/internal-tools/provider.d.ts +15 -1
- package/dist/tools/internal-tools/provider.d.ts.map +1 -1
- package/dist/tools/internal-tools/provider.js +15 -0
- package/dist/tools/internal-tools/registry.cjs +6 -0
- package/dist/tools/internal-tools/registry.d.ts +35 -1
- package/dist/tools/internal-tools/registry.d.ts.map +1 -1
- package/dist/tools/internal-tools/registry.js +6 -0
- package/dist/tools/schemas.d.ts +1 -1
- package/dist/tools/schemas.d.ts.map +1 -1
- package/dist/tools/tool-call-metadata.cjs +75 -0
- package/dist/tools/tool-call-metadata.d.ts +16 -0
- package/dist/tools/tool-call-metadata.d.ts.map +1 -0
- package/dist/tools/tool-call-metadata.js +51 -0
- package/dist/tools/tool-manager.cjs +481 -103
- package/dist/tools/tool-manager.d.ts +131 -9
- package/dist/tools/tool-manager.d.ts.map +1 -1
- package/dist/tools/tool-manager.js +482 -104
- package/dist/utils/api-key-resolver.cjs +5 -2
- package/dist/utils/api-key-resolver.d.ts.map +1 -1
- package/dist/utils/api-key-resolver.js +5 -2
- package/dist/utils/env.cjs +49 -0
- package/dist/utils/env.d.ts +4 -0
- package/dist/utils/env.d.ts.map +1 -0
- package/dist/utils/env.js +24 -0
- package/dist/utils/index.cjs +3 -1
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -0
- package/dist/utils/service-initializer.cjs +25 -7
- package/dist/utils/service-initializer.d.ts +24 -1
- package/dist/utils/service-initializer.d.ts.map +1 -1
- package/dist/utils/service-initializer.js +25 -7
- package/package.json +6 -2
- package/dist/llm/registry.cjs +0 -1631
- package/dist/llm/registry.d.ts.map +0 -1
- package/dist/llm/registry.js +0 -1586
package/dist/mcp/manager.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { ValidatedServerConfigs, ValidatedMcpServerConfig } from './schemas.js';
|
|
2
2
|
import type { IDextoLogger } from '../logger/v2/types.js';
|
|
3
3
|
import { GetPromptResult, ReadResourceResult } from '@modelcontextprotocol/sdk/types.js';
|
|
4
|
-
import { IMCPClient, MCPResolvedResource } from './types.js';
|
|
4
|
+
import { IMCPClient, MCPResolvedResource, McpAuthProviderFactory } from './types.js';
|
|
5
5
|
import { ToolSet } from '../tools/types.js';
|
|
6
6
|
import type { PromptDefinition } from '../prompts/types.js';
|
|
7
7
|
import type { JSONSchema7 } from 'json-schema';
|
|
@@ -25,9 +25,11 @@ export declare class MCPManager {
|
|
|
25
25
|
private resourceCache;
|
|
26
26
|
private sanitizedNameToServerMap;
|
|
27
27
|
private approvalManager;
|
|
28
|
+
private authProviderFactory;
|
|
28
29
|
private logger;
|
|
29
30
|
private static readonly SERVER_DELIMITER;
|
|
30
31
|
constructor(logger: IDextoLogger);
|
|
32
|
+
setAuthProviderFactory(factory: McpAuthProviderFactory | null): void;
|
|
31
33
|
/**
|
|
32
34
|
* Set the approval manager for handling elicitation requests from MCP servers
|
|
33
35
|
*
|
|
@@ -204,8 +206,14 @@ export declare class MCPManager {
|
|
|
204
206
|
* @returns Map of server names to error messages
|
|
205
207
|
*/
|
|
206
208
|
getFailedConnections(): {
|
|
207
|
-
[key: string]:
|
|
209
|
+
[key: string]: {
|
|
210
|
+
message: string;
|
|
211
|
+
code?: string;
|
|
212
|
+
};
|
|
208
213
|
};
|
|
214
|
+
getFailedConnectionError(name: string): string | undefined;
|
|
215
|
+
getFailedConnectionErrorCode(name: string): string | undefined;
|
|
216
|
+
getAuthProvider(name: string): import("./types.js").McpAuthProvider | null | undefined;
|
|
209
217
|
/**
|
|
210
218
|
* Refresh all client caches by re-fetching capabilities from servers
|
|
211
219
|
* Useful when you want to force a full refresh of tools, prompts, and resources
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/mcp/manager.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC;AAChF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE1D,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAU,MAAM,oCAAoC,CAAC;AACjG,OAAO,
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/mcp/manager.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp/manager.js
CHANGED
|
@@ -16,6 +16,7 @@ class MCPManager {
|
|
|
16
16
|
sanitizedNameToServerMap = /* @__PURE__ */ new Map();
|
|
17
17
|
approvalManager = null;
|
|
18
18
|
// Will be set by service initializer
|
|
19
|
+
authProviderFactory = null;
|
|
19
20
|
logger;
|
|
20
21
|
// Use a distinctive delimiter that won't appear in normal server/tool names
|
|
21
22
|
// Using double hyphen as it's allowed in LLM tool name patterns (^[a-zA-Z0-9_-]+$)
|
|
@@ -23,6 +24,14 @@ class MCPManager {
|
|
|
23
24
|
constructor(logger) {
|
|
24
25
|
this.logger = logger.createChild(DextoLogComponent.MCP);
|
|
25
26
|
}
|
|
27
|
+
setAuthProviderFactory(factory) {
|
|
28
|
+
this.authProviderFactory = factory;
|
|
29
|
+
for (const [_name, client] of this.clients.entries()) {
|
|
30
|
+
if (client instanceof MCPClient) {
|
|
31
|
+
client.setAuthProviderFactory(factory);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
26
35
|
/**
|
|
27
36
|
* Set the approval manager for handling elicitation requests from MCP servers
|
|
28
37
|
*
|
|
@@ -498,8 +507,16 @@ class MCPManager {
|
|
|
498
507
|
const connectPromise = this.connectServer(name, config).then(() => {
|
|
499
508
|
successfulConnections.push(name);
|
|
500
509
|
}).catch((error) => {
|
|
510
|
+
if (!this.connectionErrors[name]) {
|
|
511
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
512
|
+
const errorCode = error && typeof error === "object" && "code" in error ? String(error.code) : void 0;
|
|
513
|
+
this.connectionErrors[name] = {
|
|
514
|
+
message: errorMessage,
|
|
515
|
+
...errorCode ? { code: errorCode } : {}
|
|
516
|
+
};
|
|
517
|
+
}
|
|
501
518
|
this.logger.debug(
|
|
502
|
-
`Handled connection error for '${name}' during initialization: ${error.message}`
|
|
519
|
+
`Handled connection error for '${name}' during initialization: ${error instanceof Error ? error.message : String(error)}`
|
|
503
520
|
);
|
|
504
521
|
});
|
|
505
522
|
connectionPromises.push(connectPromise);
|
|
@@ -509,7 +526,9 @@ class MCPManager {
|
|
|
509
526
|
(name) => !successfulConnections.includes(name)
|
|
510
527
|
);
|
|
511
528
|
if (failedStrictServers.length > 0) {
|
|
512
|
-
const strictErrors = failedStrictServers.map(
|
|
529
|
+
const strictErrors = failedStrictServers.map(
|
|
530
|
+
(name) => `${name}: ${this.connectionErrors[name]?.message ?? "Unknown error"}`
|
|
531
|
+
).join("; ");
|
|
513
532
|
throw MCPError.connectionFailed("strict servers", strictErrors);
|
|
514
533
|
}
|
|
515
534
|
}
|
|
@@ -526,6 +545,7 @@ class MCPManager {
|
|
|
526
545
|
return;
|
|
527
546
|
}
|
|
528
547
|
const client = new MCPClient(this.logger);
|
|
548
|
+
client.setAuthProviderFactory(this.authProviderFactory);
|
|
529
549
|
try {
|
|
530
550
|
this.logger.info(`Attempting to connect to new server '${name}'...`);
|
|
531
551
|
await client.connect(config, name);
|
|
@@ -538,7 +558,11 @@ class MCPManager {
|
|
|
538
558
|
this.logger.info(`Successfully connected and cached new server '${name}'`);
|
|
539
559
|
} catch (error) {
|
|
540
560
|
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
541
|
-
|
|
561
|
+
const errorCode = error && typeof error === "object" && "code" in error ? String(error.code) : void 0;
|
|
562
|
+
this.connectionErrors[name] = {
|
|
563
|
+
message: errorMsg,
|
|
564
|
+
...errorCode ? { code: errorCode } : {}
|
|
565
|
+
};
|
|
542
566
|
this.logger.error(`Failed to connect to new server '${name}': ${errorMsg}`);
|
|
543
567
|
this.clients.delete(name);
|
|
544
568
|
throw MCPError.connectionFailed(name, errorMsg);
|
|
@@ -558,6 +582,19 @@ class MCPManager {
|
|
|
558
582
|
getFailedConnections() {
|
|
559
583
|
return this.connectionErrors;
|
|
560
584
|
}
|
|
585
|
+
getFailedConnectionError(name) {
|
|
586
|
+
return this.connectionErrors[name]?.message;
|
|
587
|
+
}
|
|
588
|
+
getFailedConnectionErrorCode(name) {
|
|
589
|
+
return this.connectionErrors[name]?.code;
|
|
590
|
+
}
|
|
591
|
+
getAuthProvider(name) {
|
|
592
|
+
const client = this.clients.get(name);
|
|
593
|
+
if (client instanceof MCPClient) {
|
|
594
|
+
return client.getCurrentAuthProvider();
|
|
595
|
+
}
|
|
596
|
+
return null;
|
|
597
|
+
}
|
|
561
598
|
/**
|
|
562
599
|
* Refresh all client caches by re-fetching capabilities from servers
|
|
563
600
|
* Useful when you want to force a full refresh of tools, prompts, and resources
|
|
@@ -633,6 +670,7 @@ class MCPManager {
|
|
|
633
670
|
delete this.connectionErrors[name];
|
|
634
671
|
try {
|
|
635
672
|
const newClient = new MCPClient(this.logger);
|
|
673
|
+
newClient.setAuthProviderFactory(this.authProviderFactory);
|
|
636
674
|
await newClient.connect(config, name);
|
|
637
675
|
if (this.approvalManager) {
|
|
638
676
|
newClient.setApprovalManager(this.approvalManager);
|
|
@@ -643,7 +681,11 @@ class MCPManager {
|
|
|
643
681
|
eventBus.emit("mcp:server-restarted", { serverName: name });
|
|
644
682
|
} catch (error) {
|
|
645
683
|
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
646
|
-
|
|
684
|
+
const errorCode = error && typeof error === "object" && "code" in error ? String(error.code) : void 0;
|
|
685
|
+
this.connectionErrors[name] = {
|
|
686
|
+
message: errorMsg,
|
|
687
|
+
...errorCode ? { code: errorCode } : {}
|
|
688
|
+
};
|
|
647
689
|
this.logger.error(`Failed to restart server '${name}': ${errorMsg}`);
|
|
648
690
|
throw MCPError.connectionFailed(name, errorMsg);
|
|
649
691
|
}
|
package/dist/mcp/mcp-client.cjs
CHANGED
|
@@ -25,6 +25,7 @@ var import_client = require("@modelcontextprotocol/sdk/client/index.js");
|
|
|
25
25
|
var import_stdio = require("@modelcontextprotocol/sdk/client/stdio.js");
|
|
26
26
|
var import_sse = require("@modelcontextprotocol/sdk/client/sse.js");
|
|
27
27
|
var import_streamableHttp = require("@modelcontextprotocol/sdk/client/streamableHttp.js");
|
|
28
|
+
var import_auth = require("@modelcontextprotocol/sdk/client/auth.js");
|
|
28
29
|
var import_events = require("events");
|
|
29
30
|
var import_zod = require("zod");
|
|
30
31
|
var import_types = require("../logger/v2/types.js");
|
|
@@ -50,10 +51,18 @@ class MCPClient extends import_events.EventEmitter {
|
|
|
50
51
|
approvalManager = null;
|
|
51
52
|
// Will be set by MCPManager
|
|
52
53
|
logger;
|
|
54
|
+
authProviderFactory = null;
|
|
55
|
+
currentAuthProvider = null;
|
|
53
56
|
constructor(logger) {
|
|
54
57
|
super();
|
|
55
58
|
this.logger = logger.createChild(import_types.DextoLogComponent.MCP);
|
|
56
59
|
}
|
|
60
|
+
setAuthProviderFactory(factory) {
|
|
61
|
+
this.authProviderFactory = factory;
|
|
62
|
+
}
|
|
63
|
+
getCurrentAuthProvider() {
|
|
64
|
+
return this.currentAuthProvider;
|
|
65
|
+
}
|
|
57
66
|
async connect(config, serverName) {
|
|
58
67
|
this.timeout = config.timeout ?? 3e4;
|
|
59
68
|
if (config.type === "stdio") {
|
|
@@ -138,13 +147,26 @@ class MCPClient extends import_events.EventEmitter {
|
|
|
138
147
|
}
|
|
139
148
|
async connectViaSSE(url, headers = {}, serverName) {
|
|
140
149
|
this.logger.debug(`Connecting to SSE MCP server at url: ${url}`);
|
|
141
|
-
|
|
150
|
+
const authConfig = {
|
|
151
|
+
type: "sse",
|
|
152
|
+
enabled: true,
|
|
153
|
+
url,
|
|
154
|
+
headers,
|
|
155
|
+
timeout: 3e4,
|
|
156
|
+
connectionMode: "lenient"
|
|
157
|
+
};
|
|
158
|
+
this.currentAuthProvider = this.authProviderFactory ? this.authProviderFactory(serverName, authConfig) : null;
|
|
159
|
+
const sseOptions = {
|
|
142
160
|
// For regular HTTP requests
|
|
143
161
|
requestInit: {
|
|
144
162
|
headers
|
|
145
163
|
}
|
|
146
|
-
|
|
147
|
-
|
|
164
|
+
};
|
|
165
|
+
if (this.currentAuthProvider) {
|
|
166
|
+
sseOptions.authProvider = this.currentAuthProvider;
|
|
167
|
+
}
|
|
168
|
+
const buildSseTransport = () => new import_sse.SSEClientTransport(new URL(url), sseOptions);
|
|
169
|
+
this.transport = buildSseTransport();
|
|
148
170
|
this.logger.debug("[connectViaSSE] SSE transport initialized");
|
|
149
171
|
this.client = new import_client.Client(
|
|
150
172
|
{
|
|
@@ -169,6 +191,30 @@ class MCPClient extends import_events.EventEmitter {
|
|
|
169
191
|
this.setupElicitationHandler();
|
|
170
192
|
return this.client;
|
|
171
193
|
} catch (error) {
|
|
194
|
+
if (error instanceof import_auth.UnauthorizedError) {
|
|
195
|
+
if (!this.currentAuthProvider) {
|
|
196
|
+
throw import_errors.MCPError.authenticationRequired(
|
|
197
|
+
serverName,
|
|
198
|
+
"No OAuth provider available"
|
|
199
|
+
);
|
|
200
|
+
}
|
|
201
|
+
const authCode = await this.currentAuthProvider.waitForAuthorizationCode?.();
|
|
202
|
+
if (!authCode) {
|
|
203
|
+
throw import_errors.MCPError.authenticationRequired(
|
|
204
|
+
serverName,
|
|
205
|
+
"OAuth flow was not completed"
|
|
206
|
+
);
|
|
207
|
+
}
|
|
208
|
+
this.logger.info("Completing MCP OAuth flow...");
|
|
209
|
+
await this.transport.finishAuth(authCode);
|
|
210
|
+
this.transport = buildSseTransport();
|
|
211
|
+
await this.client.connect(this.transport);
|
|
212
|
+
this.isConnected = true;
|
|
213
|
+
this.logger.info(`\u2705 ${serverName} SSE SERVER SPAWNED`);
|
|
214
|
+
this.setupNotificationHandlers();
|
|
215
|
+
this.setupElicitationHandler();
|
|
216
|
+
return this.client;
|
|
217
|
+
}
|
|
172
218
|
this.logger.error(
|
|
173
219
|
`Failed to connect to SSE MCP server ${url}: ${JSON.stringify(error.message, null, 2)}`
|
|
174
220
|
);
|
|
@@ -184,9 +230,23 @@ class MCPClient extends import_events.EventEmitter {
|
|
|
184
230
|
Accept: "application/json, text/event-stream"
|
|
185
231
|
};
|
|
186
232
|
const mergedHeaders = { ...defaultHeaders, ...headers };
|
|
187
|
-
|
|
233
|
+
const authConfig = {
|
|
234
|
+
type: "http",
|
|
235
|
+
enabled: true,
|
|
236
|
+
url,
|
|
237
|
+
headers,
|
|
238
|
+
timeout: 3e4,
|
|
239
|
+
connectionMode: "lenient"
|
|
240
|
+
};
|
|
241
|
+
this.currentAuthProvider = this.authProviderFactory ? this.authProviderFactory(serverAlias ?? url, authConfig) : null;
|
|
242
|
+
const httpOptions = {
|
|
188
243
|
requestInit: { headers: mergedHeaders }
|
|
189
|
-
}
|
|
244
|
+
};
|
|
245
|
+
if (this.currentAuthProvider) {
|
|
246
|
+
httpOptions.authProvider = this.currentAuthProvider;
|
|
247
|
+
}
|
|
248
|
+
const buildHttpTransport = () => new import_streamableHttp.StreamableHTTPClientTransport(new URL(url), httpOptions);
|
|
249
|
+
this.transport = buildHttpTransport();
|
|
190
250
|
this.client = new import_client.Client(
|
|
191
251
|
{ name: "Dexto-http-mcp-client", version: "1.0.0" },
|
|
192
252
|
{
|
|
@@ -205,6 +265,30 @@ class MCPClient extends import_events.EventEmitter {
|
|
|
205
265
|
this.setupElicitationHandler();
|
|
206
266
|
return this.client;
|
|
207
267
|
} catch (error) {
|
|
268
|
+
if (error instanceof import_auth.UnauthorizedError) {
|
|
269
|
+
if (!this.currentAuthProvider) {
|
|
270
|
+
throw import_errors.MCPError.authenticationRequired(
|
|
271
|
+
serverAlias ?? url,
|
|
272
|
+
"No OAuth provider available"
|
|
273
|
+
);
|
|
274
|
+
}
|
|
275
|
+
const authCode = await this.currentAuthProvider.waitForAuthorizationCode?.();
|
|
276
|
+
if (!authCode) {
|
|
277
|
+
throw import_errors.MCPError.authenticationRequired(
|
|
278
|
+
serverAlias ?? url,
|
|
279
|
+
"OAuth flow was not completed"
|
|
280
|
+
);
|
|
281
|
+
}
|
|
282
|
+
this.logger.info("Completing MCP OAuth flow...");
|
|
283
|
+
await this.transport.finishAuth(authCode);
|
|
284
|
+
this.transport = buildHttpTransport();
|
|
285
|
+
await this.client.connect(this.transport);
|
|
286
|
+
this.isConnected = true;
|
|
287
|
+
this.logger.info(`\u2705 HTTP SERVER ${serverAlias ?? url} CONNECTED`);
|
|
288
|
+
this.setupNotificationHandlers();
|
|
289
|
+
this.setupElicitationHandler();
|
|
290
|
+
return this.client;
|
|
291
|
+
}
|
|
208
292
|
this.logger.error(
|
|
209
293
|
`Failed to connect to HTTP MCP server ${url}: ${JSON.stringify(error.message, null, 2)}`
|
|
210
294
|
);
|
package/dist/mcp/mcp-client.d.ts
CHANGED
|
@@ -4,7 +4,7 @@ import type { IDextoLogger } from '../logger/v2/types.js';
|
|
|
4
4
|
import type { ApprovalManager } from '../approval/manager.js';
|
|
5
5
|
import type { ValidatedMcpServerConfig } from './schemas.js';
|
|
6
6
|
import { ToolSet } from '../tools/types.js';
|
|
7
|
-
import { IMCPClient, MCPResourceSummary } from './types.js';
|
|
7
|
+
import { IMCPClient, MCPResourceSummary, McpAuthProviderFactory } from './types.js';
|
|
8
8
|
import type { GetPromptResult, ReadResourceResult, Prompt } from '@modelcontextprotocol/sdk/types.js';
|
|
9
9
|
/**
|
|
10
10
|
* Wrapper on top of Client class provided in model context protocol SDK, to add additional metadata about the server
|
|
@@ -23,7 +23,11 @@ export declare class MCPClient extends EventEmitter implements IMCPClient {
|
|
|
23
23
|
private timeout;
|
|
24
24
|
private approvalManager;
|
|
25
25
|
private logger;
|
|
26
|
+
private authProviderFactory;
|
|
27
|
+
private currentAuthProvider;
|
|
26
28
|
constructor(logger: IDextoLogger);
|
|
29
|
+
setAuthProviderFactory(factory: McpAuthProviderFactory | null): void;
|
|
30
|
+
getCurrentAuthProvider(): ReturnType<McpAuthProviderFactory> | null;
|
|
27
31
|
connect(config: ValidatedMcpServerConfig, serverName: string): Promise<Client>;
|
|
28
32
|
/**
|
|
29
33
|
* Connect to an MCP server via stdio
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-client.d.ts","sourceRoot":"","sources":["../../src/mcp/mcp-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;
|
|
1
|
+
{"version":3,"file":"mcp-client.d.ts","sourceRoot":"","sources":["../../src/mcp/mcp-client.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp/mcp-client.js
CHANGED
|
@@ -3,6 +3,7 @@ import { Client } from "@modelcontextprotocol/sdk/client/index.js";
|
|
|
3
3
|
import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";
|
|
4
4
|
import { SSEClientTransport } from "@modelcontextprotocol/sdk/client/sse.js";
|
|
5
5
|
import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
|
|
6
|
+
import { UnauthorizedError } from "@modelcontextprotocol/sdk/client/auth.js";
|
|
6
7
|
import { EventEmitter } from "events";
|
|
7
8
|
import { z } from "zod";
|
|
8
9
|
import { DextoLogComponent } from "../logger/v2/types.js";
|
|
@@ -32,10 +33,18 @@ class MCPClient extends EventEmitter {
|
|
|
32
33
|
approvalManager = null;
|
|
33
34
|
// Will be set by MCPManager
|
|
34
35
|
logger;
|
|
36
|
+
authProviderFactory = null;
|
|
37
|
+
currentAuthProvider = null;
|
|
35
38
|
constructor(logger) {
|
|
36
39
|
super();
|
|
37
40
|
this.logger = logger.createChild(DextoLogComponent.MCP);
|
|
38
41
|
}
|
|
42
|
+
setAuthProviderFactory(factory) {
|
|
43
|
+
this.authProviderFactory = factory;
|
|
44
|
+
}
|
|
45
|
+
getCurrentAuthProvider() {
|
|
46
|
+
return this.currentAuthProvider;
|
|
47
|
+
}
|
|
39
48
|
async connect(config, serverName) {
|
|
40
49
|
this.timeout = config.timeout ?? 3e4;
|
|
41
50
|
if (config.type === "stdio") {
|
|
@@ -120,13 +129,26 @@ class MCPClient extends EventEmitter {
|
|
|
120
129
|
}
|
|
121
130
|
async connectViaSSE(url, headers = {}, serverName) {
|
|
122
131
|
this.logger.debug(`Connecting to SSE MCP server at url: ${url}`);
|
|
123
|
-
|
|
132
|
+
const authConfig = {
|
|
133
|
+
type: "sse",
|
|
134
|
+
enabled: true,
|
|
135
|
+
url,
|
|
136
|
+
headers,
|
|
137
|
+
timeout: 3e4,
|
|
138
|
+
connectionMode: "lenient"
|
|
139
|
+
};
|
|
140
|
+
this.currentAuthProvider = this.authProviderFactory ? this.authProviderFactory(serverName, authConfig) : null;
|
|
141
|
+
const sseOptions = {
|
|
124
142
|
// For regular HTTP requests
|
|
125
143
|
requestInit: {
|
|
126
144
|
headers
|
|
127
145
|
}
|
|
128
|
-
|
|
129
|
-
|
|
146
|
+
};
|
|
147
|
+
if (this.currentAuthProvider) {
|
|
148
|
+
sseOptions.authProvider = this.currentAuthProvider;
|
|
149
|
+
}
|
|
150
|
+
const buildSseTransport = () => new SSEClientTransport(new URL(url), sseOptions);
|
|
151
|
+
this.transport = buildSseTransport();
|
|
130
152
|
this.logger.debug("[connectViaSSE] SSE transport initialized");
|
|
131
153
|
this.client = new Client(
|
|
132
154
|
{
|
|
@@ -151,6 +173,30 @@ class MCPClient extends EventEmitter {
|
|
|
151
173
|
this.setupElicitationHandler();
|
|
152
174
|
return this.client;
|
|
153
175
|
} catch (error) {
|
|
176
|
+
if (error instanceof UnauthorizedError) {
|
|
177
|
+
if (!this.currentAuthProvider) {
|
|
178
|
+
throw MCPError.authenticationRequired(
|
|
179
|
+
serverName,
|
|
180
|
+
"No OAuth provider available"
|
|
181
|
+
);
|
|
182
|
+
}
|
|
183
|
+
const authCode = await this.currentAuthProvider.waitForAuthorizationCode?.();
|
|
184
|
+
if (!authCode) {
|
|
185
|
+
throw MCPError.authenticationRequired(
|
|
186
|
+
serverName,
|
|
187
|
+
"OAuth flow was not completed"
|
|
188
|
+
);
|
|
189
|
+
}
|
|
190
|
+
this.logger.info("Completing MCP OAuth flow...");
|
|
191
|
+
await this.transport.finishAuth(authCode);
|
|
192
|
+
this.transport = buildSseTransport();
|
|
193
|
+
await this.client.connect(this.transport);
|
|
194
|
+
this.isConnected = true;
|
|
195
|
+
this.logger.info(`\u2705 ${serverName} SSE SERVER SPAWNED`);
|
|
196
|
+
this.setupNotificationHandlers();
|
|
197
|
+
this.setupElicitationHandler();
|
|
198
|
+
return this.client;
|
|
199
|
+
}
|
|
154
200
|
this.logger.error(
|
|
155
201
|
`Failed to connect to SSE MCP server ${url}: ${JSON.stringify(error.message, null, 2)}`
|
|
156
202
|
);
|
|
@@ -166,9 +212,23 @@ class MCPClient extends EventEmitter {
|
|
|
166
212
|
Accept: "application/json, text/event-stream"
|
|
167
213
|
};
|
|
168
214
|
const mergedHeaders = { ...defaultHeaders, ...headers };
|
|
169
|
-
|
|
215
|
+
const authConfig = {
|
|
216
|
+
type: "http",
|
|
217
|
+
enabled: true,
|
|
218
|
+
url,
|
|
219
|
+
headers,
|
|
220
|
+
timeout: 3e4,
|
|
221
|
+
connectionMode: "lenient"
|
|
222
|
+
};
|
|
223
|
+
this.currentAuthProvider = this.authProviderFactory ? this.authProviderFactory(serverAlias ?? url, authConfig) : null;
|
|
224
|
+
const httpOptions = {
|
|
170
225
|
requestInit: { headers: mergedHeaders }
|
|
171
|
-
}
|
|
226
|
+
};
|
|
227
|
+
if (this.currentAuthProvider) {
|
|
228
|
+
httpOptions.authProvider = this.currentAuthProvider;
|
|
229
|
+
}
|
|
230
|
+
const buildHttpTransport = () => new StreamableHTTPClientTransport(new URL(url), httpOptions);
|
|
231
|
+
this.transport = buildHttpTransport();
|
|
172
232
|
this.client = new Client(
|
|
173
233
|
{ name: "Dexto-http-mcp-client", version: "1.0.0" },
|
|
174
234
|
{
|
|
@@ -187,6 +247,30 @@ class MCPClient extends EventEmitter {
|
|
|
187
247
|
this.setupElicitationHandler();
|
|
188
248
|
return this.client;
|
|
189
249
|
} catch (error) {
|
|
250
|
+
if (error instanceof UnauthorizedError) {
|
|
251
|
+
if (!this.currentAuthProvider) {
|
|
252
|
+
throw MCPError.authenticationRequired(
|
|
253
|
+
serverAlias ?? url,
|
|
254
|
+
"No OAuth provider available"
|
|
255
|
+
);
|
|
256
|
+
}
|
|
257
|
+
const authCode = await this.currentAuthProvider.waitForAuthorizationCode?.();
|
|
258
|
+
if (!authCode) {
|
|
259
|
+
throw MCPError.authenticationRequired(
|
|
260
|
+
serverAlias ?? url,
|
|
261
|
+
"OAuth flow was not completed"
|
|
262
|
+
);
|
|
263
|
+
}
|
|
264
|
+
this.logger.info("Completing MCP OAuth flow...");
|
|
265
|
+
await this.transport.finishAuth(authCode);
|
|
266
|
+
this.transport = buildHttpTransport();
|
|
267
|
+
await this.client.connect(this.transport);
|
|
268
|
+
this.isConnected = true;
|
|
269
|
+
this.logger.info(`\u2705 HTTP SERVER ${serverAlias ?? url} CONNECTED`);
|
|
270
|
+
this.setupNotificationHandlers();
|
|
271
|
+
this.setupElicitationHandler();
|
|
272
|
+
return this.client;
|
|
273
|
+
}
|
|
190
274
|
this.logger.error(
|
|
191
275
|
`Failed to connect to HTTP MCP server ${url}: ${JSON.stringify(error.message, null, 2)}`
|
|
192
276
|
);
|
package/dist/mcp/schemas.cjs
CHANGED
|
@@ -35,7 +35,12 @@ var import_result = require("../utils/result.cjs");
|
|
|
35
35
|
var import_zod = require("zod");
|
|
36
36
|
const MCP_SERVER_TYPES = ["stdio", "sse", "http"];
|
|
37
37
|
const MCP_CONNECTION_MODES = ["strict", "lenient"];
|
|
38
|
-
const MCP_CONNECTION_STATUSES = [
|
|
38
|
+
const MCP_CONNECTION_STATUSES = [
|
|
39
|
+
"connected",
|
|
40
|
+
"disconnected",
|
|
41
|
+
"error",
|
|
42
|
+
"auth-required"
|
|
43
|
+
];
|
|
39
44
|
const DEFAULT_MCP_CONNECTION_MODE = "lenient";
|
|
40
45
|
const StdioServerConfigSchema = import_zod.z.object({
|
|
41
46
|
type: import_zod.z.literal("stdio"),
|
package/dist/mcp/schemas.d.ts
CHANGED
|
@@ -3,7 +3,7 @@ export declare const MCP_SERVER_TYPES: readonly ["stdio", "sse", "http"];
|
|
|
3
3
|
export type McpServerType = (typeof MCP_SERVER_TYPES)[number];
|
|
4
4
|
export declare const MCP_CONNECTION_MODES: readonly ["strict", "lenient"];
|
|
5
5
|
export type McpConnectionMode = (typeof MCP_CONNECTION_MODES)[number];
|
|
6
|
-
export declare const MCP_CONNECTION_STATUSES: readonly ["connected", "disconnected", "error"];
|
|
6
|
+
export declare const MCP_CONNECTION_STATUSES: readonly ["connected", "disconnected", "error", "auth-required"];
|
|
7
7
|
export type McpConnectionStatus = (typeof MCP_CONNECTION_STATUSES)[number];
|
|
8
8
|
/**
|
|
9
9
|
* MCP server info with computed connection status.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../src/mcp/schemas.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,gBAAgB,mCAAoC,CAAC;AAClE,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE9D,eAAO,MAAM,oBAAoB,gCAAiC,CAAC;AACnE,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,oBAAoB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEtE,eAAO,MAAM,uBAAuB,
|
|
1
|
+
{"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../src/mcp/schemas.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,gBAAgB,mCAAoC,CAAC;AAClE,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE9D,eAAO,MAAM,oBAAoB,gCAAiC,CAAC;AACnE,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,oBAAoB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEtE,eAAO,MAAM,uBAAuB,kEAK1B,CAAC;AACX,MAAM,MAAM,mBAAmB,GAAG,CAAC,OAAO,uBAAuB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE3E;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,aAAa,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,mBAAmB,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,eAAO,MAAM,2BAA2B,EAAE,iBAA6B,CAAC;AAIxE,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;EAgCvB,CAAC;AAEd,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AACxE,MAAM,MAAM,0BAA0B,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAGlF,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;EAYrB,CAAC;AAEd,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AACpE,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAG9E,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;EAYtB,CAAC;AAEd,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AACtE,MAAM,MAAM,yBAAyB,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAGhF,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+BASM,CAAC;AAEzC,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AACpE,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAE9E,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2DAGM,CAAC;AAEvC,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAChE,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,mBAAmB,CAAC,CAAC"}
|
package/dist/mcp/schemas.js
CHANGED
|
@@ -5,7 +5,12 @@ import { EnvExpandedString, RequiredEnvURL } from "../utils/result.js";
|
|
|
5
5
|
import { z } from "zod";
|
|
6
6
|
const MCP_SERVER_TYPES = ["stdio", "sse", "http"];
|
|
7
7
|
const MCP_CONNECTION_MODES = ["strict", "lenient"];
|
|
8
|
-
const MCP_CONNECTION_STATUSES = [
|
|
8
|
+
const MCP_CONNECTION_STATUSES = [
|
|
9
|
+
"connected",
|
|
10
|
+
"disconnected",
|
|
11
|
+
"error",
|
|
12
|
+
"auth-required"
|
|
13
|
+
];
|
|
9
14
|
const DEFAULT_MCP_CONNECTION_MODE = "lenient";
|
|
10
15
|
const StdioServerConfigSchema = z.object({
|
|
11
16
|
type: z.literal("stdio"),
|
package/dist/mcp/types.d.ts
CHANGED
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
import { ValidatedMcpServerConfig } from './schemas.js';
|
|
2
2
|
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
3
|
+
import type { OAuthClientProvider } from '@modelcontextprotocol/sdk/client/auth.js';
|
|
3
4
|
import type { ToolProvider } from '../tools/types.js';
|
|
4
5
|
import { GetPromptResult, ReadResourceResult, Prompt } from '@modelcontextprotocol/sdk/types.js';
|
|
5
6
|
import { EventEmitter } from 'events';
|
|
7
|
+
export interface McpAuthProvider extends OAuthClientProvider {
|
|
8
|
+
waitForAuthorizationCode?: () => Promise<string>;
|
|
9
|
+
}
|
|
10
|
+
export type McpAuthProviderFactory = (serverName: string, config: ValidatedMcpServerConfig) => McpAuthProvider | null | undefined;
|
|
6
11
|
export interface MCPResourceSummary {
|
|
7
12
|
uri: string;
|
|
8
13
|
name?: string;
|
package/dist/mcp/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/mcp/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,EAAE,MAAM,oCAAoC,CAAC;AACjG,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,MAAM,WAAW,kBAAkB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,mBAAmB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,kBAAkB,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,UAAW,SAAQ,YAAY,EAAE,YAAY;IAE1D,OAAO,CAAC,MAAM,EAAE,wBAAwB,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC/E,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAG5B,WAAW,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACjC,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IAGlF,aAAa,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAC;IAC/C,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAGvD,kBAAkB,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;CACzC"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/mcp/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0CAA0C,CAAC;AACpF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,EAAE,MAAM,oCAAoC,CAAC;AACjG,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,MAAM,WAAW,eAAgB,SAAQ,mBAAmB;IACxD,wBAAwB,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;CACpD;AAED,MAAM,MAAM,sBAAsB,GAAG,CACjC,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,wBAAwB,KAC/B,eAAe,GAAG,IAAI,GAAG,SAAS,CAAC;AAExC,MAAM,WAAW,kBAAkB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,mBAAmB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,kBAAkB,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,UAAW,SAAQ,YAAY,EAAE,YAAY;IAE1D,OAAO,CAAC,MAAM,EAAE,wBAAwB,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC/E,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAG5B,WAAW,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACjC,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IAGlF,aAAa,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAC;IAC/C,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAGvD,kBAAkB,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;CACzC"}
|
package/dist/prompts/index.d.ts
CHANGED
|
@@ -5,7 +5,7 @@ export type { CreateCustomPromptInput } from './providers/custom-prompt-provider
|
|
|
5
5
|
export { PromptError } from './errors.js';
|
|
6
6
|
export { PromptsSchema, InlinePromptSchema, FilePromptSchema } from './schemas.js';
|
|
7
7
|
export type { ValidatedPromptsConfig, ValidatedInlinePrompt, ValidatedFilePrompt, ValidatedPrompt, PromptsConfig, } from './schemas.js';
|
|
8
|
-
export type { PromptInfo, PromptSet, PromptProvider, PromptArgument, PromptDefinition, } from './types.js';
|
|
8
|
+
export type { PromptInfo, PromptSet, PromptProvider, PromptArgument, PromptDefinition, ResolvedPromptResult, } from './types.js';
|
|
9
9
|
export { flattenPromptResult, normalizePromptArgs, appendContext } from './utils.js';
|
|
10
10
|
export type { FlattenedPromptResult } from './utils.js';
|
|
11
11
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AACvE,OAAO,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAC7E,YAAY,EAAE,uBAAuB,EAAE,MAAM,uCAAuC,CAAC;AACrF,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACnF,YAAY,EACR,sBAAsB,EACtB,qBAAqB,EACrB,mBAAmB,EACnB,eAAe,EACf,aAAa,GAChB,MAAM,cAAc,CAAC;AACtB,YAAY,EACR,UAAU,EACV,SAAS,EACT,cAAc,EACd,cAAc,EACd,gBAAgB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AACvE,OAAO,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAC7E,YAAY,EAAE,uBAAuB,EAAE,MAAM,uCAAuC,CAAC;AACrF,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACnF,YAAY,EACR,sBAAsB,EACtB,qBAAqB,EACrB,mBAAmB,EACnB,eAAe,EACf,aAAa,GAChB,MAAM,cAAc,CAAC;AACtB,YAAY,EACR,UAAU,EACV,SAAS,EACT,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,oBAAoB,GACvB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACrF,YAAY,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC"}
|