@modelprofile.com/flexharness 6.1.0 → 7.0.1

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.
Files changed (169) hide show
  1. package/dist_ts/00_commitinfo_data.js +1 -1
  2. package/dist_ts_chat/classes.chatsession.d.ts +37 -0
  3. package/dist_ts_chat/classes.chatsession.js +102 -0
  4. package/dist_ts_chat/index.d.ts +2 -0
  5. package/dist_ts_chat/index.js +2 -0
  6. package/dist_ts_chat/interfaces.d.ts +72 -0
  7. package/dist_ts_chat/interfaces.js +2 -0
  8. package/dist_ts_chat/plugins.d.ts +4 -0
  9. package/dist_ts_chat/plugins.js +4 -0
  10. package/dist_ts_chat_cli/components.chatapp.d.ts +10 -0
  11. package/dist_ts_chat_cli/components.chatapp.js +75 -0
  12. package/dist_ts_chat_cli/components.inputarea.d.ts +7 -0
  13. package/dist_ts_chat_cli/components.inputarea.js +18 -0
  14. package/dist_ts_chat_cli/components.message.d.ts +12 -0
  15. package/dist_ts_chat_cli/components.message.js +21 -0
  16. package/dist_ts_chat_cli/components.messagelist.d.ts +9 -0
  17. package/dist_ts_chat_cli/components.messagelist.js +19 -0
  18. package/dist_ts_chat_cli/components.statusbar.d.ts +9 -0
  19. package/dist_ts_chat_cli/components.statusbar.js +15 -0
  20. package/dist_ts_chat_cli/index.d.ts +2 -0
  21. package/dist_ts_chat_cli/index.js +2 -0
  22. package/dist_ts_chat_cli/plugins.d.ts +12 -0
  23. package/dist_ts_chat_cli/plugins.js +14 -0
  24. package/dist_ts_chat_cli/startchat.d.ts +18 -0
  25. package/dist_ts_chat_cli/startchat.js +17 -0
  26. package/dist_ts_chat_web/flexchat-input.d.ts +21 -0
  27. package/dist_ts_chat_web/flexchat-input.js +172 -0
  28. package/dist_ts_chat_web/flexchat-message.d.ts +26 -0
  29. package/dist_ts_chat_web/flexchat-message.js +174 -0
  30. package/dist_ts_chat_web/flexchat-window.d.ts +34 -0
  31. package/dist_ts_chat_web/flexchat-window.js +394 -0
  32. package/dist_ts_chat_web/index.d.ts +3 -0
  33. package/dist_ts_chat_web/index.js +4 -0
  34. package/dist_ts_chat_web/plugins.d.ts +6 -0
  35. package/dist_ts_chat_web/plugins.js +4 -0
  36. package/dist_ts_compaction/index.d.ts +2 -0
  37. package/dist_ts_compaction/index.js +2 -0
  38. package/dist_ts_compaction/plugins.d.ts +4 -0
  39. package/dist_ts_compaction/plugins.js +3 -0
  40. package/dist_ts_compaction/smartagent.compaction.d.ts +14 -0
  41. package/dist_ts_compaction/smartagent.compaction.js +49 -0
  42. package/dist_ts_document/index.d.ts +19 -0
  43. package/dist_ts_document/index.js +55 -0
  44. package/dist_ts_document/plugins.d.ts +3 -0
  45. package/dist_ts_document/plugins.js +4 -0
  46. package/dist_ts_kvm/classes.browserkvm.d.ts +22 -0
  47. package/dist_ts_kvm/classes.browserkvm.js +271 -0
  48. package/dist_ts_kvm/classes.kvmterminal.d.ts +8 -0
  49. package/dist_ts_kvm/classes.kvmterminal.js +88 -0
  50. package/dist_ts_kvm/commandwrappers.d.ts +14 -0
  51. package/dist_ts_kvm/commandwrappers.js +58 -0
  52. package/dist_ts_kvm/index.d.ts +6 -0
  53. package/dist_ts_kvm/index.js +7 -0
  54. package/dist_ts_kvm/interfaces.d.ts +106 -0
  55. package/dist_ts_kvm/interfaces.js +2 -0
  56. package/dist_ts_kvm/ocr.d.ts +14 -0
  57. package/dist_ts_kvm/ocr.js +23 -0
  58. package/dist_ts_kvm/plugins.d.ts +6 -0
  59. package/dist_ts_kvm/plugins.js +10 -0
  60. package/dist_ts_kvm/tools.d.ts +15 -0
  61. package/dist_ts_kvm/tools.js +40 -0
  62. package/dist_ts_mcp/index.d.ts +86 -0
  63. package/dist_ts_mcp/index.js +284 -0
  64. package/dist_ts_mcp/requestcontext.d.ts +11 -0
  65. package/dist_ts_mcp/requestcontext.js +42 -0
  66. package/dist_ts_media/index.d.ts +8 -0
  67. package/dist_ts_media/index.js +21 -0
  68. package/dist_ts_media/plugins.d.ts +2 -0
  69. package/dist_ts_media/plugins.js +3 -0
  70. package/dist_ts_ocr/classes.imageocr.d.ts +19 -0
  71. package/dist_ts_ocr/classes.imageocr.js +27 -0
  72. package/dist_ts_ocr/index.d.ts +2 -0
  73. package/dist_ts_ocr/index.js +3 -0
  74. package/dist_ts_ocr/ocr.mistral.d.ts +75 -0
  75. package/dist_ts_ocr/ocr.mistral.js +77 -0
  76. package/dist_ts_tools/index.d.ts +17 -0
  77. package/dist_ts_tools/index.js +10 -0
  78. package/dist_ts_tools/plugins.d.ts +7 -0
  79. package/dist_ts_tools/plugins.js +6 -0
  80. package/dist_ts_tools/tool.browser.d.ts +11 -0
  81. package/dist_ts_tools/tool.browser.js +128 -0
  82. package/dist_ts_tools/tool.context.d.ts +4 -0
  83. package/dist_ts_tools/tool.context.js +23 -0
  84. package/dist_ts_tools/tool.filesystem.d.ts +11 -0
  85. package/dist_ts_tools/tool.filesystem.js +106 -0
  86. package/dist_ts_tools/tool.http.d.ts +2 -0
  87. package/dist_ts_tools/tool.http.js +65 -0
  88. package/dist_ts_tools/tool.json.d.ts +2 -0
  89. package/dist_ts_tools/tool.json.js +47 -0
  90. package/dist_ts_tools/tool.shell.d.ts +15 -0
  91. package/dist_ts_tools/tool.shell.js +329 -0
  92. package/dist_ts_tools/utils.truncation.d.ts +10 -0
  93. package/dist_ts_tools/utils.truncation.js +26 -0
  94. package/dist_ts_tools_node/index.d.ts +5 -0
  95. package/dist_ts_tools_node/index.js +4 -0
  96. package/dist_ts_tools_node/plugins.d.ts +13 -0
  97. package/dist_ts_tools_node/plugins.js +13 -0
  98. package/dist_ts_tools_node/tool.context.d.ts +31 -0
  99. package/dist_ts_tools_node/tool.context.js +837 -0
  100. package/dist_ts_tools_node/tool.persistence.d.ts +15 -0
  101. package/dist_ts_tools_node/tool.persistence.js +129 -0
  102. package/dist_ts_tools_node/tools.local.d.ts +11 -0
  103. package/dist_ts_tools_node/tools.local.js +15 -0
  104. package/package.json +112 -4
  105. package/readme.md +122 -66
  106. package/ts/00_commitinfo_data.ts +1 -1
  107. package/ts/readme.md +122 -66
  108. package/ts_chat/classes.chatsession.ts +116 -0
  109. package/ts_chat/index.ts +8 -0
  110. package/ts_chat/interfaces.ts +64 -0
  111. package/ts_chat/plugins.ts +7 -0
  112. package/ts_chat/readme.md +49 -0
  113. package/ts_chat_cli/components.chatapp.ts +103 -0
  114. package/ts_chat_cli/components.inputarea.ts +29 -0
  115. package/ts_chat_cli/components.message.ts +48 -0
  116. package/ts_chat_cli/components.messagelist.ts +45 -0
  117. package/ts_chat_cli/components.statusbar.ts +31 -0
  118. package/ts_chat_cli/index.ts +2 -0
  119. package/ts_chat_cli/plugins.ts +21 -0
  120. package/ts_chat_cli/readme.md +40 -0
  121. package/ts_chat_cli/startchat.ts +34 -0
  122. package/ts_chat_web/flexchat-input.ts +184 -0
  123. package/ts_chat_web/flexchat-message.ts +185 -0
  124. package/ts_chat_web/flexchat-window.ts +416 -0
  125. package/ts_chat_web/index.ts +3 -0
  126. package/ts_chat_web/plugins.ts +9 -0
  127. package/ts_chat_web/readme.md +46 -0
  128. package/ts_compaction/index.ts +2 -0
  129. package/ts_compaction/plugins.ts +6 -0
  130. package/ts_compaction/readme.md +37 -0
  131. package/ts_compaction/smartagent.compaction.ts +59 -0
  132. package/ts_document/index.ts +82 -0
  133. package/ts_document/plugins.ts +3 -0
  134. package/ts_document/readme.md +49 -0
  135. package/ts_kvm/classes.browserkvm.ts +335 -0
  136. package/ts_kvm/classes.kvmterminal.ts +103 -0
  137. package/ts_kvm/commandwrappers.ts +83 -0
  138. package/ts_kvm/index.ts +6 -0
  139. package/ts_kvm/interfaces.ts +152 -0
  140. package/ts_kvm/ocr.ts +41 -0
  141. package/ts_kvm/plugins.ts +13 -0
  142. package/ts_kvm/readme.md +482 -0
  143. package/ts_kvm/tools.ts +58 -0
  144. package/ts_mcp/index.ts +470 -0
  145. package/ts_mcp/readme.md +37 -0
  146. package/ts_mcp/requestcontext.ts +66 -0
  147. package/ts_media/index.ts +29 -0
  148. package/ts_media/plugins.ts +2 -0
  149. package/ts_media/readme.md +37 -0
  150. package/ts_ocr/classes.imageocr.ts +53 -0
  151. package/ts_ocr/index.ts +2 -0
  152. package/ts_ocr/ocr.mistral.ts +192 -0
  153. package/ts_ocr/readme.md +48 -0
  154. package/ts_tools/index.ts +49 -0
  155. package/ts_tools/plugins.ts +7 -0
  156. package/ts_tools/readme.md +37 -0
  157. package/ts_tools/tool.browser.ts +159 -0
  158. package/ts_tools/tool.context.ts +23 -0
  159. package/ts_tools/tool.filesystem.ts +144 -0
  160. package/ts_tools/tool.http.ts +78 -0
  161. package/ts_tools/tool.json.ts +53 -0
  162. package/ts_tools/tool.shell.ts +418 -0
  163. package/ts_tools/utils.truncation.ts +39 -0
  164. package/ts_tools_node/index.ts +5 -0
  165. package/ts_tools_node/plugins.ts +16 -0
  166. package/ts_tools_node/readme.md +37 -0
  167. package/ts_tools_node/tool.context.ts +991 -0
  168. package/ts_tools_node/tool.persistence.ts +146 -0
  169. package/ts_tools_node/tools.local.ts +26 -0
@@ -0,0 +1,15 @@
1
+ import { KvmTerminal } from './classes.kvmterminal.js';
2
+ export interface IKvmTool<TInput = unknown, TOutput = unknown> {
3
+ name: string;
4
+ description: string;
5
+ parameters: unknown;
6
+ execute: (input: TInput) => Promise<TOutput>;
7
+ }
8
+ export interface IKvmToolOptions {
9
+ terminal: KvmTerminal;
10
+ }
11
+ export interface IKvmTerminalRunCommandInput {
12
+ command: string;
13
+ }
14
+ export type TKvmTerminalObserveInput = Record<string, never>;
15
+ export declare const createKvmTools: (options: IKvmToolOptions) => IKvmTool[];
@@ -0,0 +1,40 @@
1
+ import { KvmTerminal } from './classes.kvmterminal.js';
2
+ export const createKvmTools = (options) => {
3
+ return [
4
+ {
5
+ name: 'kvm_terminal_run_command',
6
+ description: 'Run a command through the visual KVM terminal transport and return OCR-parsed output.',
7
+ parameters: {
8
+ type: 'object',
9
+ properties: {
10
+ command: {
11
+ type: 'string',
12
+ description: 'The terminal command to run.',
13
+ },
14
+ },
15
+ required: ['command'],
16
+ additionalProperties: false,
17
+ },
18
+ execute: async (input) => {
19
+ const typedInput = input;
20
+ if (!typedInput || typeof typedInput.command !== 'string') {
21
+ throw new Error('kvm_terminal_run_command requires a string command.');
22
+ }
23
+ return options.terminal.runCommand(typedInput.command);
24
+ },
25
+ },
26
+ {
27
+ name: 'kvm_terminal_observe',
28
+ description: 'Observe the current visual KVM terminal text through the configured OCR engine.',
29
+ parameters: {
30
+ type: 'object',
31
+ properties: {},
32
+ additionalProperties: false,
33
+ },
34
+ execute: async () => {
35
+ return options.terminal.observeText();
36
+ },
37
+ },
38
+ ];
39
+ };
40
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90c19rdm0vdG9vbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBb0J2RCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsQ0FBQyxPQUF3QixFQUFjLEVBQUU7SUFDckUsT0FBTztRQUNMO1lBQ0UsSUFBSSxFQUFFLDBCQUEwQjtZQUNoQyxXQUFXLEVBQUUsdUZBQXVGO1lBQ3BHLFVBQVUsRUFBRTtnQkFDVixJQUFJLEVBQUUsUUFBUTtnQkFDZCxVQUFVLEVBQUU7b0JBQ1YsT0FBTyxFQUFFO3dCQUNQLElBQUksRUFBRSxRQUFRO3dCQUNkLFdBQVcsRUFBRSw4QkFBOEI7cUJBQzVDO2lCQUNGO2dCQUNELFFBQVEsRUFBRSxDQUFDLFNBQVMsQ0FBQztnQkFDckIsb0JBQW9CLEVBQUUsS0FBSzthQUM1QjtZQUNELE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBYyxFQUFzQyxFQUFFO2dCQUNwRSxNQUFNLFVBQVUsR0FBRyxLQUE2QyxDQUFDO2dCQUNqRSxJQUFJLENBQUMsVUFBVSxJQUFJLE9BQU8sVUFBVSxDQUFDLE9BQU8sS0FBSyxRQUFRLEVBQUUsQ0FBQztvQkFDMUQsTUFBTSxJQUFJLEtBQUssQ0FBQyxxREFBcUQsQ0FBQyxDQUFDO2dCQUN6RSxDQUFDO2dCQUNELE9BQU8sT0FBTyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3pELENBQUM7U0FDRjtRQUNEO1lBQ0UsSUFBSSxFQUFFLHNCQUFzQjtZQUM1QixXQUFXLEVBQUUsaUZBQWlGO1lBQzlGLFVBQVUsRUFBRTtnQkFDVixJQUFJLEVBQUUsUUFBUTtnQkFDZCxVQUFVLEVBQUUsRUFBRTtnQkFDZCxvQkFBb0IsRUFBRSxLQUFLO2FBQzVCO1lBQ0QsT0FBTyxFQUFFLEtBQUssSUFBcUIsRUFBRTtnQkFDbkMsT0FBTyxPQUFPLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3hDLENBQUM7U0FDRjtLQUNGLENBQUM7QUFDSixDQUFDLENBQUMifQ==
@@ -0,0 +1,86 @@
1
+ import { Client, type ClientOptions } from '@modelcontextprotocol/sdk/client/index.js';
2
+ import { type StdioServerParameters } from '@modelcontextprotocol/sdk/client/stdio.js';
3
+ import { type StreamableHTTPClientTransportOptions } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
4
+ import type { RequestOptions } from '@modelcontextprotocol/sdk/shared/protocol.js';
5
+ import type { Transport } from '@modelcontextprotocol/sdk/shared/transport.js';
6
+ import type { ToolSet } from 'ai';
7
+ export type TMcpListToolsResult = Awaited<ReturnType<Client['listTools']>>;
8
+ export type TMcpToolMetadata = TMcpListToolsResult['tools'][number];
9
+ export type TMcpCallToolResult = Awaited<ReturnType<Client['callTool']>>;
10
+ export interface IMcpClientLike {
11
+ listTools(params?: {
12
+ cursor?: string;
13
+ }, options?: RequestOptions): Promise<TMcpListToolsResult>;
14
+ callTool(params: {
15
+ name: string;
16
+ arguments?: Record<string, unknown>;
17
+ }, resultSchema?: unknown, options?: RequestOptions): Promise<TMcpCallToolResult>;
18
+ close?(): Promise<void>;
19
+ }
20
+ export interface IMcpServerClientOptions {
21
+ clientName?: string;
22
+ clientVersion?: string;
23
+ clientOptions?: ClientOptions;
24
+ requestOptions?: RequestOptions;
25
+ }
26
+ export interface IMcpStdioServerConfig extends StdioServerParameters, IMcpServerClientOptions {
27
+ type: 'stdio';
28
+ }
29
+ export interface IMcpStreamableHttpServerConfig extends IMcpServerClientOptions {
30
+ type: 'streamableHttp' | 'http';
31
+ url: string | URL;
32
+ transportOptions?: StreamableHTTPClientTransportOptions;
33
+ }
34
+ export interface IMcpTransportServerConfig extends IMcpServerClientOptions {
35
+ type: 'transport';
36
+ transport: Transport;
37
+ }
38
+ export interface IMcpClientServerConfig {
39
+ type: 'client';
40
+ client: IMcpClientLike;
41
+ }
42
+ export type TMcpServerConfig = IMcpStdioServerConfig | IMcpStreamableHttpServerConfig | IMcpTransportServerConfig | IMcpClientServerConfig;
43
+ export interface IMcpToolFormatContext {
44
+ serverName: string;
45
+ toolName: string;
46
+ exposedToolName: string;
47
+ }
48
+ export interface IMcpAuthorizeToolCallContext extends IMcpToolFormatContext {
49
+ arguments: Record<string, unknown>;
50
+ tool: TMcpToolMetadata;
51
+ toolCallId: string;
52
+ abortSignal?: AbortSignal;
53
+ }
54
+ export interface ICreateMcpToolsOptions {
55
+ servers: Record<string, TMcpServerConfig>;
56
+ clientName?: string;
57
+ clientVersion?: string;
58
+ clientOptions?: ClientOptions;
59
+ requestOptions?: RequestOptions;
60
+ listToolsRequestOptions?: RequestOptions;
61
+ callToolRequestOptions?: RequestOptions;
62
+ /** Maximum MCP listTools pages per server. Default: 100. */
63
+ maxListToolsPages?: number;
64
+ prefixToolNames?: boolean;
65
+ formatResult?: (result: TMcpCallToolResult, context: IMcpToolFormatContext) => unknown;
66
+ /** Resolve to allow the MCP tool call, or throw to deny it. Omission allows all calls. */
67
+ authorizeToolCall?: (context: IMcpAuthorizeToolCallContext) => PromiseLike<void> | void;
68
+ }
69
+ export interface IMcpConnectedServer {
70
+ name: string;
71
+ client: IMcpClientLike;
72
+ tools: TMcpToolMetadata[];
73
+ }
74
+ export interface IMcpToolNameMapping {
75
+ serverName: string;
76
+ toolName: string;
77
+ }
78
+ export interface ICreateMcpToolsResult {
79
+ tools: ToolSet;
80
+ servers: IMcpConnectedServer[];
81
+ toolNameMap: Record<string, IMcpToolNameMapping>;
82
+ close: () => Promise<void>;
83
+ }
84
+ export declare const createMcpTools: (options: ICreateMcpToolsOptions) => Promise<ICreateMcpToolsResult>;
85
+ export declare const sanitizeMcpToolName: (name: string, fallback?: string) => string;
86
+ export declare const formatMcpToolResult: (result: TMcpCallToolResult) => unknown;
@@ -0,0 +1,284 @@
1
+ import { Client } from '@modelcontextprotocol/sdk/client/index.js';
2
+ import { StdioClientTransport, } from '@modelcontextprotocol/sdk/client/stdio.js';
3
+ import { StreamableHTTPClientTransport, } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
4
+ import { jsonSchema, tool } from 'ai';
5
+ import { connectMcpClientWithRequestOptions, withMcpRequestOptions, } from './requestcontext.js';
6
+ const DEFAULT_MAX_LIST_TOOLS_PAGES = 100;
7
+ export const createMcpTools = async (options) => {
8
+ const serverEntries = Object.entries(options.servers);
9
+ if (serverEntries.length === 0) {
10
+ throw new Error('createMcpTools requires at least one MCP server.');
11
+ }
12
+ const maxListToolsPages = normalizeMaxListToolsPages(options.maxListToolsPages);
13
+ const connectedServers = [];
14
+ try {
15
+ for (const [serverName, config] of serverEntries) {
16
+ const client = await connectMcpServer(serverName, config, options);
17
+ const connectedServer = { name: serverName, client, tools: [] };
18
+ connectedServers.push(connectedServer);
19
+ connectedServer.tools = await listAllMcpTools(client, options.listToolsRequestOptions ?? getServerRequestOptions(config) ?? options.requestOptions, maxListToolsPages);
20
+ }
21
+ const exposedTools = {};
22
+ const toolNameMap = {};
23
+ const usedToolNames = new Set(['invalid']);
24
+ const formatResult = options.formatResult ?? formatMcpToolResult;
25
+ const shouldPrefixToolNames = options.prefixToolNames ?? connectedServers.length > 1;
26
+ for (const server of connectedServers) {
27
+ for (const mcpTool of server.tools) {
28
+ const baseToolName = createExposedToolName(server.name, mcpTool.name, shouldPrefixToolNames);
29
+ const exposedToolName = createUniqueToolName(baseToolName, usedToolNames);
30
+ usedToolNames.add(exposedToolName);
31
+ toolNameMap[exposedToolName] = {
32
+ serverName: server.name,
33
+ toolName: mcpTool.name,
34
+ };
35
+ exposedTools[exposedToolName] = tool({
36
+ description: mcpTool.description ?? `MCP tool ${mcpTool.name} from ${server.name}`,
37
+ inputSchema: jsonSchema(mcpTool.inputSchema),
38
+ execute: async (input, invocationOptions) => {
39
+ const normalizedArguments = normalizeMcpArguments(input);
40
+ await options.authorizeToolCall?.({
41
+ serverName: server.name,
42
+ toolName: mcpTool.name,
43
+ exposedToolName,
44
+ arguments: normalizedArguments,
45
+ tool: mcpTool,
46
+ toolCallId: invocationOptions?.toolCallId ?? '',
47
+ abortSignal: invocationOptions?.abortSignal,
48
+ });
49
+ const configuredCallToolOptions = {
50
+ ...options.requestOptions,
51
+ ...options.callToolRequestOptions,
52
+ };
53
+ const result = await withMcpRequestOptions(configuredCallToolOptions, invocationOptions?.abortSignal, (requestOptions) => server.client.callTool({
54
+ name: mcpTool.name,
55
+ arguments: normalizedArguments,
56
+ }, undefined, requestOptions));
57
+ const formattedResult = formatResult(result, {
58
+ serverName: server.name,
59
+ toolName: mcpTool.name,
60
+ exposedToolName,
61
+ });
62
+ if (result.isError === true) {
63
+ throw new Error(formatMcpError(formattedResult));
64
+ }
65
+ return formattedResult;
66
+ },
67
+ });
68
+ }
69
+ }
70
+ return {
71
+ tools: exposedTools,
72
+ servers: connectedServers,
73
+ toolNameMap,
74
+ close: async () => closeMcpClients(connectedServers),
75
+ };
76
+ }
77
+ catch (error) {
78
+ return rethrowAfterCleanup(error, () => closeMcpClients(connectedServers), 'Failed to create MCP tools and clean up connected clients.');
79
+ }
80
+ };
81
+ export const sanitizeMcpToolName = (name, fallback = 'mcp_tool') => {
82
+ const sanitized = name
83
+ .trim()
84
+ .replace(/[^a-zA-Z0-9_-]+/g, '_')
85
+ .replace(/^_+|_+$/g, '');
86
+ const safeName = sanitized || fallback;
87
+ return /^[a-zA-Z_]/.test(safeName) ? safeName : `_${safeName}`;
88
+ };
89
+ export const formatMcpToolResult = (result) => {
90
+ const resultRecord = result;
91
+ if (Object.prototype.hasOwnProperty.call(resultRecord, 'toolResult')) {
92
+ return resultRecord.toolResult;
93
+ }
94
+ const content = Array.isArray(resultRecord.content)
95
+ ? resultRecord.content.map(formatMcpContentPart).filter(Boolean).join('\n\n')
96
+ : '';
97
+ const formattedContent = resultRecord.isError && content
98
+ ? `MCP tool returned an error:\n${content}`
99
+ : content;
100
+ const structuredContent = resultRecord.structuredContent;
101
+ if (structuredContent !== undefined && formattedContent) {
102
+ return `${formattedContent}\n\nStructured content:\n${stringifyJson(structuredContent)}`;
103
+ }
104
+ if (structuredContent !== undefined) {
105
+ return structuredContent;
106
+ }
107
+ if (formattedContent) {
108
+ return formattedContent;
109
+ }
110
+ return stringifyJson(result);
111
+ };
112
+ const connectMcpServer = async (serverName, config, options) => {
113
+ if (config.type === 'client') {
114
+ return config.client;
115
+ }
116
+ const client = new Client({
117
+ name: config.clientName ?? options.clientName ?? 'smartagent-mcp',
118
+ version: config.clientVersion ?? options.clientVersion ?? '1.0.0',
119
+ }, config.clientOptions ?? options.clientOptions ?? { capabilities: {} });
120
+ const transport = createMcpTransport(config);
121
+ try {
122
+ await connectMcpClientWithRequestOptions(client, transport, config.requestOptions ?? options.requestOptions);
123
+ }
124
+ catch (error) {
125
+ await rethrowAfterCleanup(error, async () => {
126
+ try {
127
+ await client.close();
128
+ }
129
+ catch (clientCloseError) {
130
+ try {
131
+ await transport.close();
132
+ }
133
+ catch (transportCloseError) {
134
+ throw new AggregateError([clientCloseError, transportCloseError], `Failed to close MCP client and transport for "${serverName}".`);
135
+ }
136
+ throw clientCloseError;
137
+ }
138
+ }, `Failed to connect MCP server "${serverName}" and clean up its client.`);
139
+ }
140
+ return client;
141
+ };
142
+ const createMcpTransport = (config) => {
143
+ if (config.type === 'stdio') {
144
+ const { type, clientName, clientVersion, clientOptions, requestOptions, ...serverParameters } = config;
145
+ return new StdioClientTransport(serverParameters);
146
+ }
147
+ if (config.type === 'streamableHttp' || config.type === 'http') {
148
+ return new StreamableHTTPClientTransport(new URL(config.url), config.transportOptions);
149
+ }
150
+ if (config.type === 'transport') {
151
+ return config.transport;
152
+ }
153
+ throw new Error('Unsupported MCP server transport.');
154
+ };
155
+ const getServerRequestOptions = (config) => {
156
+ return config.type === 'client' ? undefined : config.requestOptions;
157
+ };
158
+ const listAllMcpTools = async (client, requestOptions, maxPages = DEFAULT_MAX_LIST_TOOLS_PAGES) => {
159
+ const tools = [];
160
+ const seenCursors = new Set();
161
+ let cursor;
162
+ for (let page = 1; page <= maxPages; page++) {
163
+ const result = await withMcpRequestOptions(requestOptions, undefined, (isolatedRequestOptions) => client.listTools(cursor ? { cursor } : undefined, isolatedRequestOptions));
164
+ tools.push(...result.tools);
165
+ const nextCursor = result.nextCursor;
166
+ if (!nextCursor) {
167
+ return tools;
168
+ }
169
+ if (seenCursors.has(nextCursor)) {
170
+ throw new Error(`MCP listTools returned repeated cursor "${nextCursor}".`);
171
+ }
172
+ seenCursors.add(nextCursor);
173
+ cursor = nextCursor;
174
+ }
175
+ throw new Error(`MCP listTools exceeded the maximum of ${maxPages} pages.`);
176
+ };
177
+ const normalizeMaxListToolsPages = (maxPages = DEFAULT_MAX_LIST_TOOLS_PAGES) => {
178
+ if (!Number.isSafeInteger(maxPages) || maxPages <= 0) {
179
+ throw new Error('maxListToolsPages must be a positive integer.');
180
+ }
181
+ return maxPages;
182
+ };
183
+ const createExposedToolName = (serverName, toolName, prefixToolName) => {
184
+ const safeToolName = sanitizeMcpToolName(toolName);
185
+ if (!prefixToolName) {
186
+ return safeToolName;
187
+ }
188
+ return `${sanitizeMcpToolName(serverName, 'mcp')}__${safeToolName}`;
189
+ };
190
+ const createUniqueToolName = (baseToolName, usedToolNames) => {
191
+ if (!usedToolNames.has(baseToolName)) {
192
+ return baseToolName;
193
+ }
194
+ let suffix = 2;
195
+ while (usedToolNames.has(`${baseToolName}_${suffix}`)) {
196
+ suffix++;
197
+ }
198
+ return `${baseToolName}_${suffix}`;
199
+ };
200
+ const normalizeMcpArguments = (input) => {
201
+ if (!input || typeof input !== 'object' || Array.isArray(input)) {
202
+ return {};
203
+ }
204
+ return input;
205
+ };
206
+ const formatMcpError = (formattedResult) => {
207
+ if (typeof formattedResult === 'string' && formattedResult) {
208
+ return formattedResult;
209
+ }
210
+ const formatted = stringifyJson(formattedResult);
211
+ return formatted || 'MCP tool returned an error.';
212
+ };
213
+ const formatMcpContentPart = (part) => {
214
+ if (!part || typeof part !== 'object') {
215
+ return stringifyJson(part);
216
+ }
217
+ const partRecord = part;
218
+ const type = partRecord.type;
219
+ if (type === 'text') {
220
+ return typeof partRecord.text === 'string' ? partRecord.text : '';
221
+ }
222
+ if (type === 'image' || type === 'audio') {
223
+ const data = typeof partRecord.data === 'string' ? partRecord.data : '';
224
+ const mimeType = typeof partRecord.mimeType === 'string' ? partRecord.mimeType : 'application/octet-stream';
225
+ return `[${type}: ${mimeType}; base64 length ${data.length}]`;
226
+ }
227
+ if (type === 'resource') {
228
+ return formatMcpResourcePart(partRecord.resource);
229
+ }
230
+ if (type === 'resource_link') {
231
+ const name = typeof partRecord.name === 'string' ? partRecord.name : 'resource';
232
+ const uri = typeof partRecord.uri === 'string' ? partRecord.uri : '';
233
+ return `Resource link ${name}${uri ? `: ${uri}` : ''}`;
234
+ }
235
+ return stringifyJson(part);
236
+ };
237
+ const formatMcpResourcePart = (resource) => {
238
+ if (!resource || typeof resource !== 'object') {
239
+ return stringifyJson(resource);
240
+ }
241
+ const resourceRecord = resource;
242
+ const uri = typeof resourceRecord.uri === 'string' ? resourceRecord.uri : 'resource';
243
+ if (typeof resourceRecord.text === 'string') {
244
+ return `Resource ${uri}:\n${resourceRecord.text}`;
245
+ }
246
+ if (typeof resourceRecord.blob === 'string') {
247
+ const mimeType = typeof resourceRecord.mimeType === 'string' ? resourceRecord.mimeType : 'application/octet-stream';
248
+ return `[resource ${uri}: ${mimeType}; base64 length ${resourceRecord.blob.length}]`;
249
+ }
250
+ return stringifyJson(resource);
251
+ };
252
+ const stringifyJson = (value) => {
253
+ if (typeof value === 'string') {
254
+ return value;
255
+ }
256
+ try {
257
+ return JSON.stringify(value, undefined, 2);
258
+ }
259
+ catch {
260
+ return String(value);
261
+ }
262
+ };
263
+ const closeMcpClients = async (servers) => {
264
+ const results = await Promise.allSettled(servers.map((server) => server.client.close?.()));
265
+ const errors = results
266
+ .filter((result) => result.status === 'rejected')
267
+ .map((result) => result.reason);
268
+ if (errors.length > 0) {
269
+ throw new AggregateError(errors, 'Failed to close one or more MCP clients.');
270
+ }
271
+ };
272
+ const rethrowAfterCleanup = async (originalError, cleanup, message) => {
273
+ try {
274
+ await cleanup();
275
+ }
276
+ catch (cleanupError) {
277
+ const cleanupErrors = cleanupError instanceof AggregateError
278
+ ? cleanupError.errors
279
+ : [cleanupError];
280
+ throw new AggregateError([originalError, ...cleanupErrors], message);
281
+ }
282
+ throw originalError;
283
+ };
284
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90c19tY3AvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBc0IsTUFBTSwyQ0FBMkMsQ0FBQztBQUN2RixPQUFPLEVBQ0wsb0JBQW9CLEdBRXJCLE1BQU0sMkNBQTJDLENBQUM7QUFDbkQsT0FBTyxFQUNMLDZCQUE2QixHQUU5QixNQUFNLG9EQUFvRCxDQUFDO0FBRzVELE9BQU8sRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBR3RDLE9BQU8sRUFDTCxrQ0FBa0MsRUFDbEMscUJBQXFCLEdBQ3RCLE1BQU0scUJBQXFCLENBQUM7QUFFN0IsTUFBTSw0QkFBNEIsR0FBRyxHQUFHLENBQUM7QUFnR3pDLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxLQUFLLEVBQ2pDLE9BQStCLEVBQ0MsRUFBRTtJQUNsQyxNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN0RCxJQUFJLGFBQWEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDL0IsTUFBTSxJQUFJLEtBQUssQ0FBQyxrREFBa0QsQ0FBQyxDQUFDO0lBQ3RFLENBQUM7SUFDRCxNQUFNLGlCQUFpQixHQUFHLDBCQUEwQixDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBRWhGLE1BQU0sZ0JBQWdCLEdBQTBCLEVBQUUsQ0FBQztJQUNuRCxJQUFJLENBQUM7UUFDSCxLQUFLLE1BQU0sQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLElBQUksYUFBYSxFQUFFLENBQUM7WUFDakQsTUFBTSxNQUFNLEdBQUcsTUFBTSxnQkFBZ0IsQ0FBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ25FLE1BQU0sZUFBZSxHQUF3QixFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQztZQUNyRixnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDdkMsZUFBZSxDQUFDLEtBQUssR0FBRyxNQUFNLGVBQWUsQ0FDM0MsTUFBTSxFQUNOLE9BQU8sQ0FBQyx1QkFBdUIsSUFBSSx1QkFBdUIsQ0FBQyxNQUFNLENBQUMsSUFBSSxPQUFPLENBQUMsY0FBYyxFQUM1RixpQkFBaUIsQ0FDbEIsQ0FBQztRQUNKLENBQUM7UUFFRCxNQUFNLFlBQVksR0FBWSxFQUFFLENBQUM7UUFDakMsTUFBTSxXQUFXLEdBQXdDLEVBQUUsQ0FBQztRQUM1RCxNQUFNLGFBQWEsR0FBRyxJQUFJLEdBQUcsQ0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFDbkQsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLFlBQVksSUFBSSxtQkFBbUIsQ0FBQztRQUNqRSxNQUFNLHFCQUFxQixHQUFHLE9BQU8sQ0FBQyxlQUFlLElBQUksZ0JBQWdCLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUVyRixLQUFLLE1BQU0sTUFBTSxJQUFJLGdCQUFnQixFQUFFLENBQUM7WUFDdEMsS0FBSyxNQUFNLE9BQU8sSUFBSSxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ25DLE1BQU0sWUFBWSxHQUFHLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUksRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO2dCQUM3RixNQUFNLGVBQWUsR0FBRyxvQkFBb0IsQ0FBQyxZQUFZLEVBQUUsYUFBYSxDQUFDLENBQUM7Z0JBQzFFLGFBQWEsQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUM7Z0JBQ25DLFdBQVcsQ0FBQyxlQUFlLENBQUMsR0FBRztvQkFDN0IsVUFBVSxFQUFFLE1BQU0sQ0FBQyxJQUFJO29CQUN2QixRQUFRLEVBQUUsT0FBTyxDQUFDLElBQUk7aUJBQ3ZCLENBQUM7Z0JBRUYsWUFBWSxDQUFDLGVBQWUsQ0FBQyxHQUFHLElBQUksQ0FBQztvQkFDbkMsV0FBVyxFQUFFLE9BQU8sQ0FBQyxXQUFXLElBQUksWUFBWSxPQUFPLENBQUMsSUFBSSxTQUFTLE1BQU0sQ0FBQyxJQUFJLEVBQUU7b0JBQ2xGLFdBQVcsRUFBRSxVQUFVLENBQUMsT0FBTyxDQUFDLFdBQW9CLENBQUM7b0JBQ3JELE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBYyxFQUFFLGlCQUFpRCxFQUFFLEVBQUU7d0JBQ25GLE1BQU0sbUJBQW1CLEdBQUcscUJBQXFCLENBQUMsS0FBSyxDQUFDLENBQUM7d0JBQ3pELE1BQU0sT0FBTyxDQUFDLGlCQUFpQixFQUFFLENBQUM7NEJBQ2hDLFVBQVUsRUFBRSxNQUFNLENBQUMsSUFBSTs0QkFDdkIsUUFBUSxFQUFFLE9BQU8sQ0FBQyxJQUFJOzRCQUN0QixlQUFlOzRCQUNmLFNBQVMsRUFBRSxtQkFBbUI7NEJBQzlCLElBQUksRUFBRSxPQUFPOzRCQUNiLFVBQVUsRUFBRSxpQkFBaUIsRUFBRSxVQUFVLElBQUksRUFBRTs0QkFDL0MsV0FBVyxFQUFFLGlCQUFpQixFQUFFLFdBQVc7eUJBQzVDLENBQUMsQ0FBQzt3QkFDSCxNQUFNLHlCQUF5QixHQUFtQjs0QkFDaEQsR0FBRyxPQUFPLENBQUMsY0FBYzs0QkFDekIsR0FBRyxPQUFPLENBQUMsc0JBQXNCO3lCQUNsQyxDQUFDO3dCQUNGLE1BQU0sTUFBTSxHQUFHLE1BQU0scUJBQXFCLENBQ3hDLHlCQUF5QixFQUN6QixpQkFBaUIsRUFBRSxXQUFXLEVBQzlCLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FDeEM7NEJBQ0UsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJOzRCQUNsQixTQUFTLEVBQUUsbUJBQW1CO3lCQUMvQixFQUNELFNBQVMsRUFDVCxjQUFjLENBQ2YsQ0FDRixDQUFDO3dCQUNGLE1BQU0sZUFBZSxHQUFHLFlBQVksQ0FBQyxNQUFNLEVBQUU7NEJBQzNDLFVBQVUsRUFBRSxNQUFNLENBQUMsSUFBSTs0QkFDdkIsUUFBUSxFQUFFLE9BQU8sQ0FBQyxJQUFJOzRCQUN0QixlQUFlO3lCQUNoQixDQUFDLENBQUM7d0JBQ0gsSUFBSyxNQUFrQyxDQUFDLE9BQU8sS0FBSyxJQUFJLEVBQUUsQ0FBQzs0QkFDekQsTUFBTSxJQUFJLEtBQUssQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQzt3QkFDbkQsQ0FBQzt3QkFDRCxPQUFPLGVBQWUsQ0FBQztvQkFDekIsQ0FBQztpQkFDRixDQUFDLENBQUM7WUFDTCxDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU87WUFDTCxLQUFLLEVBQUUsWUFBWTtZQUNuQixPQUFPLEVBQUUsZ0JBQWdCO1lBQ3pCLFdBQVc7WUFDWCxLQUFLLEVBQUUsS0FBSyxJQUFJLEVBQUUsQ0FBQyxlQUFlLENBQUMsZ0JBQWdCLENBQUM7U0FDckQsQ0FBQztJQUNKLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsT0FBTyxtQkFBbUIsQ0FDeEIsS0FBSyxFQUNMLEdBQUcsRUFBRSxDQUFDLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUN2Qyw0REFBNEQsQ0FDN0QsQ0FBQztJQUNKLENBQUM7QUFDSCxDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxDQUFDLElBQVksRUFBRSxRQUFRLEdBQUcsVUFBVSxFQUFVLEVBQUU7SUFDakYsTUFBTSxTQUFTLEdBQUcsSUFBSTtTQUNuQixJQUFJLEVBQUU7U0FDTixPQUFPLENBQUMsa0JBQWtCLEVBQUUsR0FBRyxDQUFDO1NBQ2hDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDM0IsTUFBTSxRQUFRLEdBQUcsU0FBUyxJQUFJLFFBQVEsQ0FBQztJQUN2QyxPQUFPLFlBQVksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxRQUFRLEVBQUUsQ0FBQztBQUNqRSxDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxDQUFDLE1BQTBCLEVBQVcsRUFBRTtJQUN6RSxNQUFNLFlBQVksR0FBRyxNQUFpQyxDQUFDO0lBQ3ZELElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxZQUFZLENBQUMsRUFBRSxDQUFDO1FBQ3JFLE9BQU8sWUFBWSxDQUFDLFVBQVUsQ0FBQztJQUNqQyxDQUFDO0lBRUQsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDO1FBQ2pELENBQUMsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQzdFLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDUCxNQUFNLGdCQUFnQixHQUFHLFlBQVksQ0FBQyxPQUFPLElBQUksT0FBTztRQUN0RCxDQUFDLENBQUMsZ0NBQWdDLE9BQU8sRUFBRTtRQUMzQyxDQUFDLENBQUMsT0FBTyxDQUFDO0lBQ1osTUFBTSxpQkFBaUIsR0FBRyxZQUFZLENBQUMsaUJBQWlCLENBQUM7SUFFekQsSUFBSSxpQkFBaUIsS0FBSyxTQUFTLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztRQUN4RCxPQUFPLEdBQUcsZ0JBQWdCLDRCQUE0QixhQUFhLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDO0lBQzNGLENBQUM7SUFDRCxJQUFJLGlCQUFpQixLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ3BDLE9BQU8saUJBQWlCLENBQUM7SUFDM0IsQ0FBQztJQUNELElBQUksZ0JBQWdCLEVBQUUsQ0FBQztRQUNyQixPQUFPLGdCQUFnQixDQUFDO0lBQzFCLENBQUM7SUFDRCxPQUFPLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUMvQixDQUFDLENBQUM7QUFFRixNQUFNLGdCQUFnQixHQUFHLEtBQUssRUFDNUIsVUFBa0IsRUFDbEIsTUFBd0IsRUFDeEIsT0FBK0IsRUFDTixFQUFFO0lBQzNCLElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUM3QixPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDdkIsQ0FBQztJQUVELE1BQU0sTUFBTSxHQUFHLElBQUksTUFBTSxDQUN2QjtRQUNFLElBQUksRUFBRSxNQUFNLENBQUMsVUFBVSxJQUFJLE9BQU8sQ0FBQyxVQUFVLElBQUksZ0JBQWdCO1FBQ2pFLE9BQU8sRUFBRSxNQUFNLENBQUMsYUFBYSxJQUFJLE9BQU8sQ0FBQyxhQUFhLElBQUksT0FBTztLQUNsRSxFQUNELE1BQU0sQ0FBQyxhQUFhLElBQUksT0FBTyxDQUFDLGFBQWEsSUFBSSxFQUFFLFlBQVksRUFBRSxFQUFFLEVBQUUsQ0FDdEUsQ0FBQztJQUNGLE1BQU0sU0FBUyxHQUFHLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzdDLElBQUksQ0FBQztRQUNILE1BQU0sa0NBQWtDLENBQ3RDLE1BQU0sRUFDTixTQUFTLEVBQ1QsTUFBTSxDQUFDLGNBQWMsSUFBSSxPQUFPLENBQUMsY0FBYyxDQUNoRCxDQUFDO0lBQ0osQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixNQUFNLG1CQUFtQixDQUN2QixLQUFLLEVBQ0wsS0FBSyxJQUFJLEVBQUU7WUFDVCxJQUFJLENBQUM7Z0JBQ0gsTUFBTSxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDdkIsQ0FBQztZQUFDLE9BQU8sZ0JBQWdCLEVBQUUsQ0FBQztnQkFDMUIsSUFBSSxDQUFDO29CQUNILE1BQU0sU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUMxQixDQUFDO2dCQUFDLE9BQU8sbUJBQW1CLEVBQUUsQ0FBQztvQkFDN0IsTUFBTSxJQUFJLGNBQWMsQ0FDdEIsQ0FBQyxnQkFBZ0IsRUFBRSxtQkFBbUIsQ0FBQyxFQUN2QyxpREFBaUQsVUFBVSxJQUFJLENBQ2hFLENBQUM7Z0JBQ0osQ0FBQztnQkFDRCxNQUFNLGdCQUFnQixDQUFDO1lBQ3pCLENBQUM7UUFDSCxDQUFDLEVBQ0QsaUNBQWlDLFVBQVUsNEJBQTRCLENBQ3hFLENBQUM7SUFDSixDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyxDQUFDO0FBRUYsTUFBTSxrQkFBa0IsR0FBRyxDQUN6QixNQUF5RCxFQUM5QyxFQUFFO0lBQ2IsSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLE9BQU8sRUFBRSxDQUFDO1FBQzVCLE1BQU0sRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsY0FBYyxFQUFFLEdBQUcsZ0JBQWdCLEVBQUUsR0FBRyxNQUFNLENBQUM7UUFDdkcsT0FBTyxJQUFJLG9CQUFvQixDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVELElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxnQkFBZ0IsSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLE1BQU0sRUFBRSxDQUFDO1FBQy9ELE9BQU8sSUFBSSw2QkFBNkIsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDekYsQ0FBQztJQUVELElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxXQUFXLEVBQUUsQ0FBQztRQUNoQyxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUM7SUFDMUIsQ0FBQztJQUVELE1BQU0sSUFBSSxLQUFLLENBQUMsbUNBQW1DLENBQUMsQ0FBQztBQUN2RCxDQUFDLENBQUM7QUFFRixNQUFNLHVCQUF1QixHQUFHLENBQUMsTUFBd0IsRUFBOEIsRUFBRTtJQUN2RixPQUFPLE1BQU0sQ0FBQyxJQUFJLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUM7QUFDdEUsQ0FBQyxDQUFDO0FBRUYsTUFBTSxlQUFlLEdBQUcsS0FBSyxFQUMzQixNQUFzQixFQUN0QixjQUErQixFQUMvQixRQUFRLEdBQUcsNEJBQTRCLEVBQ1YsRUFBRTtJQUMvQixNQUFNLEtBQUssR0FBdUIsRUFBRSxDQUFDO0lBQ3JDLE1BQU0sV0FBVyxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7SUFDdEMsSUFBSSxNQUEwQixDQUFDO0lBQy9CLEtBQUssSUFBSSxJQUFJLEdBQUcsQ0FBQyxFQUFFLElBQUksSUFBSSxRQUFRLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQztRQUM1QyxNQUFNLE1BQU0sR0FBRyxNQUFNLHFCQUFxQixDQUN4QyxjQUFjLEVBQ2QsU0FBUyxFQUNULENBQUMsc0JBQXNCLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQzFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUMvQixzQkFBc0IsQ0FDdkIsQ0FDRixDQUFDO1FBQ0YsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1QixNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDO1FBQ3JDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNoQixPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFDRCxJQUFJLFdBQVcsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUNoQyxNQUFNLElBQUksS0FBSyxDQUFDLDJDQUEyQyxVQUFVLElBQUksQ0FBQyxDQUFDO1FBQzdFLENBQUM7UUFDRCxXQUFXLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzVCLE1BQU0sR0FBRyxVQUFVLENBQUM7SUFDdEIsQ0FBQztJQUNELE1BQU0sSUFBSSxLQUFLLENBQUMseUNBQXlDLFFBQVEsU0FBUyxDQUFDLENBQUM7QUFDOUUsQ0FBQyxDQUFDO0FBRUYsTUFBTSwwQkFBMEIsR0FBRyxDQUFDLFFBQVEsR0FBRyw0QkFBNEIsRUFBVSxFQUFFO0lBQ3JGLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxJQUFJLFFBQVEsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUNyRCxNQUFNLElBQUksS0FBSyxDQUFDLCtDQUErQyxDQUFDLENBQUM7SUFDbkUsQ0FBQztJQUNELE9BQU8sUUFBUSxDQUFDO0FBQ2xCLENBQUMsQ0FBQztBQUVGLE1BQU0scUJBQXFCLEdBQUcsQ0FDNUIsVUFBa0IsRUFDbEIsUUFBZ0IsRUFDaEIsY0FBdUIsRUFDZixFQUFFO0lBQ1YsTUFBTSxZQUFZLEdBQUcsbUJBQW1CLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDbkQsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3BCLE9BQU8sWUFBWSxDQUFDO0lBQ3RCLENBQUM7SUFDRCxPQUFPLEdBQUcsbUJBQW1CLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxLQUFLLFlBQVksRUFBRSxDQUFDO0FBQ3RFLENBQUMsQ0FBQztBQUVGLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxZQUFvQixFQUFFLGFBQTBCLEVBQVUsRUFBRTtJQUN4RixJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO1FBQ3JDLE9BQU8sWUFBWSxDQUFDO0lBQ3RCLENBQUM7SUFDRCxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDZixPQUFPLGFBQWEsQ0FBQyxHQUFHLENBQUMsR0FBRyxZQUFZLElBQUksTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQ3RELE1BQU0sRUFBRSxDQUFDO0lBQ1gsQ0FBQztJQUNELE9BQU8sR0FBRyxZQUFZLElBQUksTUFBTSxFQUFFLENBQUM7QUFDckMsQ0FBQyxDQUFDO0FBRUYsTUFBTSxxQkFBcUIsR0FBRyxDQUFDLEtBQWMsRUFBMkIsRUFBRTtJQUN4RSxJQUFJLENBQUMsS0FBSyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDaEUsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBQ0QsT0FBTyxLQUFnQyxDQUFDO0FBQzFDLENBQUMsQ0FBQztBQUVGLE1BQU0sY0FBYyxHQUFHLENBQUMsZUFBd0IsRUFBVSxFQUFFO0lBQzFELElBQUksT0FBTyxlQUFlLEtBQUssUUFBUSxJQUFJLGVBQWUsRUFBRSxDQUFDO1FBQzNELE9BQU8sZUFBZSxDQUFDO0lBQ3pCLENBQUM7SUFDRCxNQUFNLFNBQVMsR0FBRyxhQUFhLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDakQsT0FBTyxTQUFTLElBQUksNkJBQTZCLENBQUM7QUFDcEQsQ0FBQyxDQUFDO0FBRUYsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLElBQWEsRUFBVSxFQUFFO0lBQ3JELElBQUksQ0FBQyxJQUFJLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDdEMsT0FBTyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUNELE1BQU0sVUFBVSxHQUFHLElBQStCLENBQUM7SUFDbkQsTUFBTSxJQUFJLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQztJQUM3QixJQUFJLElBQUksS0FBSyxNQUFNLEVBQUUsQ0FBQztRQUNwQixPQUFPLE9BQU8sVUFBVSxDQUFDLElBQUksS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNwRSxDQUFDO0lBQ0QsSUFBSSxJQUFJLEtBQUssT0FBTyxJQUFJLElBQUksS0FBSyxPQUFPLEVBQUUsQ0FBQztRQUN6QyxNQUFNLElBQUksR0FBRyxPQUFPLFVBQVUsQ0FBQyxJQUFJLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDeEUsTUFBTSxRQUFRLEdBQUcsT0FBTyxVQUFVLENBQUMsUUFBUSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsMEJBQTBCLENBQUM7UUFDNUcsT0FBTyxJQUFJLElBQUksS0FBSyxRQUFRLG1CQUFtQixJQUFJLENBQUMsTUFBTSxHQUFHLENBQUM7SUFDaEUsQ0FBQztJQUNELElBQUksSUFBSSxLQUFLLFVBQVUsRUFBRSxDQUFDO1FBQ3hCLE9BQU8scUJBQXFCLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFDRCxJQUFJLElBQUksS0FBSyxlQUFlLEVBQUUsQ0FBQztRQUM3QixNQUFNLElBQUksR0FBRyxPQUFPLFVBQVUsQ0FBQyxJQUFJLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUM7UUFDaEYsTUFBTSxHQUFHLEdBQUcsT0FBTyxVQUFVLENBQUMsR0FBRyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3JFLE9BQU8saUJBQWlCLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDO0lBQ3pELENBQUM7SUFDRCxPQUFPLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUM3QixDQUFDLENBQUM7QUFFRixNQUFNLHFCQUFxQixHQUFHLENBQUMsUUFBaUIsRUFBVSxFQUFFO0lBQzFELElBQUksQ0FBQyxRQUFRLElBQUksT0FBTyxRQUFRLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDOUMsT0FBTyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUNELE1BQU0sY0FBYyxHQUFHLFFBQW1DLENBQUM7SUFDM0QsTUFBTSxHQUFHLEdBQUcsT0FBTyxjQUFjLENBQUMsR0FBRyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDO0lBQ3JGLElBQUksT0FBTyxjQUFjLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzVDLE9BQU8sWUFBWSxHQUFHLE1BQU0sY0FBYyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3BELENBQUM7SUFDRCxJQUFJLE9BQU8sY0FBYyxDQUFDLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUM1QyxNQUFNLFFBQVEsR0FBRyxPQUFPLGNBQWMsQ0FBQyxRQUFRLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQywwQkFBMEIsQ0FBQztRQUNwSCxPQUFPLGFBQWEsR0FBRyxLQUFLLFFBQVEsbUJBQW1CLGNBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUM7SUFDdkYsQ0FBQztJQUNELE9BQU8sYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ2pDLENBQUMsQ0FBQztBQUVGLE1BQU0sYUFBYSxHQUFHLENBQUMsS0FBYyxFQUFVLEVBQUU7SUFDL0MsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUM5QixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFDRCxJQUFJLENBQUM7UUFDSCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdkIsQ0FBQztBQUNILENBQUMsQ0FBQztBQUVGLE1BQU0sZUFBZSxHQUFHLEtBQUssRUFBRSxPQUE4QixFQUFpQixFQUFFO0lBQzlFLE1BQU0sT0FBTyxHQUFHLE1BQU0sT0FBTyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzNGLE1BQU0sTUFBTSxHQUFHLE9BQU87U0FDbkIsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFtQyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sS0FBSyxVQUFVLENBQUM7U0FDakYsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDbEMsSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3RCLE1BQU0sSUFBSSxjQUFjLENBQUMsTUFBTSxFQUFFLDBDQUEwQyxDQUFDLENBQUM7SUFDL0UsQ0FBQztBQUNILENBQUMsQ0FBQztBQUVGLE1BQU0sbUJBQW1CLEdBQUcsS0FBSyxFQUMvQixhQUFzQixFQUN0QixPQUE0QixFQUM1QixPQUFlLEVBQ0MsRUFBRTtJQUNsQixJQUFJLENBQUM7UUFDSCxNQUFNLE9BQU8sRUFBRSxDQUFDO0lBQ2xCLENBQUM7SUFBQyxPQUFPLFlBQVksRUFBRSxDQUFDO1FBQ3RCLE1BQU0sYUFBYSxHQUFHLFlBQVksWUFBWSxjQUFjO1lBQzFELENBQUMsQ0FBQyxZQUFZLENBQUMsTUFBTTtZQUNyQixDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNuQixNQUFNLElBQUksY0FBYyxDQUFDLENBQUMsYUFBYSxFQUFFLEdBQUcsYUFBYSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDdkUsQ0FBQztJQUNELE1BQU0sYUFBYSxDQUFDO0FBQ3RCLENBQUMsQ0FBQyJ9
@@ -0,0 +1,11 @@
1
+ import type { RequestOptions } from '@modelcontextprotocol/sdk/shared/protocol.js';
2
+ import type { Transport } from '@modelcontextprotocol/sdk/shared/transport.js';
3
+ export interface IMcpRequestContext {
4
+ requestOptions?: RequestOptions;
5
+ cleanup: () => void;
6
+ }
7
+ export declare const createMcpRequestContext: (configuredOptions?: RequestOptions, preferredAbortSignal?: AbortSignal) => IMcpRequestContext;
8
+ export declare const withMcpRequestOptions: <T>(configuredOptions: RequestOptions | undefined, preferredAbortSignal: AbortSignal | undefined, request: (requestOptions?: RequestOptions) => Promise<T>) => Promise<T>;
9
+ export declare const connectMcpClientWithRequestOptions: (client: {
10
+ connect: (transport: Transport, requestOptions?: RequestOptions) => Promise<void>;
11
+ }, transport: Transport, configuredOptions?: RequestOptions) => Promise<void>;
@@ -0,0 +1,42 @@
1
+ export const createMcpRequestContext = (configuredOptions, preferredAbortSignal) => {
2
+ const requestOptions = { ...configuredOptions };
3
+ const sourceSignal = preferredAbortSignal ?? requestOptions.signal;
4
+ if (!sourceSignal) {
5
+ return {
6
+ requestOptions: Object.keys(requestOptions).length > 0 ? requestOptions : undefined,
7
+ cleanup: () => undefined,
8
+ };
9
+ }
10
+ const relayController = new AbortController();
11
+ const forwardAbort = () => relayController.abort(sourceSignal.reason);
12
+ let listenerWasAdded = false;
13
+ if (sourceSignal.aborted) {
14
+ forwardAbort();
15
+ }
16
+ else {
17
+ sourceSignal.addEventListener('abort', forwardAbort, { once: true });
18
+ listenerWasAdded = true;
19
+ }
20
+ return {
21
+ requestOptions: {
22
+ ...requestOptions,
23
+ signal: relayController.signal,
24
+ },
25
+ cleanup: () => {
26
+ if (listenerWasAdded) {
27
+ sourceSignal.removeEventListener('abort', forwardAbort);
28
+ }
29
+ },
30
+ };
31
+ };
32
+ export const withMcpRequestOptions = async (configuredOptions, preferredAbortSignal, request) => {
33
+ const context = createMcpRequestContext(configuredOptions, preferredAbortSignal);
34
+ try {
35
+ return await request(context.requestOptions);
36
+ }
37
+ finally {
38
+ context.cleanup();
39
+ }
40
+ };
41
+ export const connectMcpClientWithRequestOptions = async (client, transport, configuredOptions) => withMcpRequestOptions(configuredOptions, undefined, (requestOptions) => client.connect(transport, requestOptions));
42
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWVzdGNvbnRleHQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90c19tY3AvcmVxdWVzdGNvbnRleHQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBUUEsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsQ0FDckMsaUJBQWtDLEVBQ2xDLG9CQUFrQyxFQUNkLEVBQUU7SUFDdEIsTUFBTSxjQUFjLEdBQW1CLEVBQUUsR0FBRyxpQkFBaUIsRUFBRSxDQUFDO0lBQ2hFLE1BQU0sWUFBWSxHQUFHLG9CQUFvQixJQUFJLGNBQWMsQ0FBQyxNQUFNLENBQUM7SUFDbkUsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ2xCLE9BQU87WUFDTCxjQUFjLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLFNBQVM7WUFDbkYsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLFNBQVM7U0FDekIsQ0FBQztJQUNKLENBQUM7SUFFRCxNQUFNLGVBQWUsR0FBRyxJQUFJLGVBQWUsRUFBRSxDQUFDO0lBQzlDLE1BQU0sWUFBWSxHQUFHLEdBQUcsRUFBRSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3RFLElBQUksZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO0lBQzdCLElBQUksWUFBWSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3pCLFlBQVksRUFBRSxDQUFDO0lBQ2pCLENBQUM7U0FBTSxDQUFDO1FBQ04sWUFBWSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxZQUFZLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNyRSxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7SUFDMUIsQ0FBQztJQUVELE9BQU87UUFDTCxjQUFjLEVBQUU7WUFDZCxHQUFHLGNBQWM7WUFDakIsTUFBTSxFQUFFLGVBQWUsQ0FBQyxNQUFNO1NBQy9CO1FBQ0QsT0FBTyxFQUFFLEdBQUcsRUFBRTtZQUNaLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztnQkFDckIsWUFBWSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQztZQUMxRCxDQUFDO1FBQ0gsQ0FBQztLQUNGLENBQUM7QUFDSixDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxLQUFLLEVBQ3hDLGlCQUE2QyxFQUM3QyxvQkFBNkMsRUFDN0MsT0FBd0QsRUFDNUMsRUFBRTtJQUNkLE1BQU0sT0FBTyxHQUFHLHVCQUF1QixDQUFDLGlCQUFpQixFQUFFLG9CQUFvQixDQUFDLENBQUM7SUFDakYsSUFBSSxDQUFDO1FBQ0gsT0FBTyxNQUFNLE9BQU8sQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDL0MsQ0FBQztZQUFTLENBQUM7UUFDVCxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDcEIsQ0FBQztBQUNILENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLGtDQUFrQyxHQUFHLEtBQUssRUFDckQsTUFBNkYsRUFDN0YsU0FBb0IsRUFDcEIsaUJBQWtDLEVBQ25CLEVBQUUsQ0FBQyxxQkFBcUIsQ0FDdkMsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsY0FBYyxDQUFDLENBQzlELENBQUMifQ==
@@ -0,0 +1,8 @@
1
+ import type { TSmartAiLanguageModel } from '@modelprofile.com/flexharness-models';
2
+ export interface IVisionOptions {
3
+ model: TSmartAiLanguageModel;
4
+ image: Buffer | Uint8Array;
5
+ prompt: string;
6
+ mediaType?: 'image/jpeg' | 'image/png' | 'image/webp' | 'image/gif';
7
+ }
8
+ export declare function analyzeImage(options: IVisionOptions): Promise<string>;
@@ -0,0 +1,21 @@
1
+ import * as plugins from './plugins.js';
2
+ export async function analyzeImage(options) {
3
+ const result = await plugins.generateText({
4
+ model: options.model,
5
+ messages: [
6
+ {
7
+ role: 'user',
8
+ content: [
9
+ { type: 'text', text: options.prompt },
10
+ {
11
+ type: 'file',
12
+ data: options.image,
13
+ mediaType: options.mediaType ?? 'image/jpeg',
14
+ },
15
+ ],
16
+ },
17
+ ],
18
+ });
19
+ return result.text;
20
+ }
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90c19tZWRpYS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQVV4QyxNQUFNLENBQUMsS0FBSyxVQUFVLFlBQVksQ0FBQyxPQUF1QjtJQUN4RCxNQUFNLE1BQU0sR0FBRyxNQUFNLE9BQU8sQ0FBQyxZQUFZLENBQUM7UUFDeEMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLO1FBQ3BCLFFBQVEsRUFBRTtZQUNSO2dCQUNFLElBQUksRUFBRSxNQUFNO2dCQUNaLE9BQU8sRUFBRTtvQkFDUCxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxNQUFNLEVBQUU7b0JBQ3RDO3dCQUNFLElBQUksRUFBRSxNQUFNO3dCQUNaLElBQUksRUFBRSxPQUFPLENBQUMsS0FBSzt3QkFDbkIsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTLElBQUksWUFBWTtxQkFDN0M7aUJBQ0Y7YUFDRjtTQUNGO0tBQ0YsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDO0FBQ3JCLENBQUMifQ==
@@ -0,0 +1,2 @@
1
+ import { generateText } from 'ai';
2
+ export { generateText };
@@ -0,0 +1,3 @@
1
+ import { generateText } from 'ai';
2
+ export { generateText };
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzX21lZGlhL3BsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLElBQUksQ0FBQztBQUNsQyxPQUFPLEVBQUUsWUFBWSxFQUFFLENBQUMifQ==
@@ -0,0 +1,19 @@
1
+ import { type ISmartAiMistralOcrOptions, type ISmartAiMistralOcrRecognizeOptions, type ISmartAiOcrEngine, type ISmartAiOcrImageInput, type ISmartAiOcrResult, type TSmartAiOcrImageMimeType } from './ocr.mistral.js';
2
+ export interface IImageOcrOptions {
3
+ engine?: ISmartAiOcrEngine;
4
+ mistralOptions?: ISmartAiMistralOcrOptions;
5
+ }
6
+ export interface IImageOcrRecognitionOptions extends IImageOcrOptions {
7
+ recognizeOptions?: ISmartAiMistralOcrRecognizeOptions;
8
+ }
9
+ export interface IImageOcrBytesOptions extends IImageOcrRecognitionOptions {
10
+ mimeType: TSmartAiOcrImageMimeType;
11
+ }
12
+ /** Image recognition without a local OCR executable or PDF dependency. */
13
+ export declare class ImageOcr {
14
+ private readonly options;
15
+ constructor(options?: IImageOcrOptions);
16
+ recognizeImage(input: ISmartAiOcrImageInput, options?: IImageOcrRecognitionOptions): Promise<ISmartAiOcrResult>;
17
+ /** Accepts Uint8Array, including Node Buffer, without importing Node builtins. */
18
+ recognizeImageBytes(bytes: Uint8Array, options: IImageOcrBytesOptions): Promise<ISmartAiOcrResult>;
19
+ }
@@ -0,0 +1,27 @@
1
+ import { createMistralOcrEngine, } from './ocr.mistral.js';
2
+ /** Image recognition without a local OCR executable or PDF dependency. */
3
+ export class ImageOcr {
4
+ options;
5
+ constructor(options = {}) {
6
+ this.options = options;
7
+ }
8
+ async recognizeImage(input, options = {}) {
9
+ const engine = options.engine ?? this.options.engine ?? createMistralOcrEngine({
10
+ ...this.options.mistralOptions,
11
+ ...options.mistralOptions,
12
+ });
13
+ return engine.recognizeImage(input, options.recognizeOptions);
14
+ }
15
+ /** Accepts Uint8Array, including Node Buffer, without importing Node builtins. */
16
+ async recognizeImageBytes(bytes, options) {
17
+ const chunks = [];
18
+ for (let offset = 0; offset < bytes.length; offset += 8192) {
19
+ chunks.push(String.fromCharCode(...bytes.subarray(offset, offset + 8192)));
20
+ }
21
+ return this.recognizeImage({
22
+ dataBase64: btoa(chunks.join('')),
23
+ mimeType: options.mimeType,
24
+ }, options);
25
+ }
26
+ }
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5pbWFnZW9jci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzX29jci9jbGFzc2VzLmltYWdlb2NyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxzQkFBc0IsR0FPdkIsTUFBTSxrQkFBa0IsQ0FBQztBQWUxQiwwRUFBMEU7QUFDMUUsTUFBTSxPQUFPLFFBQVE7SUFDVTtJQUE3QixZQUE2QixVQUE0QixFQUFFO1FBQTlCLFlBQU8sR0FBUCxPQUFPLENBQXVCO0lBQUcsQ0FBQztJQUV4RCxLQUFLLENBQUMsY0FBYyxDQUN6QixLQUE0QixFQUM1QixVQUF1QyxFQUFFO1FBRXpDLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLElBQUksc0JBQXNCLENBQUM7WUFDN0UsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWM7WUFDOUIsR0FBRyxPQUFPLENBQUMsY0FBYztTQUMxQixDQUFDLENBQUM7UUFDSCxPQUFPLE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFFRCxrRkFBa0Y7SUFDM0UsS0FBSyxDQUFDLG1CQUFtQixDQUM5QixLQUFpQixFQUNqQixPQUE4QjtRQUU5QixNQUFNLE1BQU0sR0FBYSxFQUFFLENBQUM7UUFDNUIsS0FBSyxJQUFJLE1BQU0sR0FBRyxDQUFDLEVBQUUsTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsTUFBTSxJQUFJLElBQUksRUFBRSxDQUFDO1lBQzNELE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLE1BQU0sR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0UsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQztZQUN6QixVQUFVLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDakMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRO1NBQzNCLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDZCxDQUFDO0NBQ0YifQ==
@@ -0,0 +1,2 @@
1
+ export * from './ocr.mistral.js';
2
+ export * from './classes.imageocr.js';
@@ -0,0 +1,3 @@
1
+ export * from './ocr.mistral.js';
2
+ export * from './classes.imageocr.js';
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90c19vY3IvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxrQkFBa0IsQ0FBQztBQUNqQyxjQUFjLHVCQUF1QixDQUFDIn0=