@truefoundry/trueforge-core 0.0.0 → 0.1.0-rc.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/dist/agent-session/ITurnResourceResolver.d.ts +69 -0
- package/dist/agent-session/ITurnResourceResolver.d.ts.map +1 -0
- package/dist/agent-session/ITurnResourceResolver.js +19 -0
- package/dist/agent-session/ITurnResourceResolver.js.map +1 -0
- package/dist/agent-session/ITurnResourceResolver.mjs +1 -0
- package/dist/agent-session/ITurnResourceResolver.mjs.map +1 -0
- package/dist/agent-session/SessionHandle.d.ts +81 -0
- package/dist/agent-session/SessionHandle.d.ts.map +1 -0
- package/dist/agent-session/SessionHandle.js +392 -0
- package/dist/agent-session/SessionHandle.js.map +1 -0
- package/dist/agent-session/SessionHandle.mjs +371 -0
- package/dist/agent-session/SessionHandle.mjs.map +1 -0
- package/dist/agent-session/Sessions.d.ts +25 -0
- package/dist/agent-session/Sessions.d.ts.map +1 -0
- package/dist/agent-session/Sessions.js +71 -0
- package/dist/agent-session/Sessions.js.map +1 -0
- package/dist/agent-session/Sessions.mjs +46 -0
- package/dist/agent-session/Sessions.mjs.map +1 -0
- package/dist/agent-session/TurnHandle.d.ts +88 -0
- package/dist/agent-session/TurnHandle.d.ts.map +1 -0
- package/dist/agent-session/TurnHandle.js +490 -0
- package/dist/agent-session/TurnHandle.js.map +1 -0
- package/dist/agent-session/TurnHandle.mjs +469 -0
- package/dist/agent-session/TurnHandle.mjs.map +1 -0
- package/dist/agent-session/TurnResourceResolver.d.ts +154 -0
- package/dist/agent-session/TurnResourceResolver.d.ts.map +1 -0
- package/dist/agent-session/TurnResourceResolver.js +178 -0
- package/dist/agent-session/TurnResourceResolver.js.map +1 -0
- package/dist/agent-session/TurnResourceResolver.mjs +153 -0
- package/dist/agent-session/TurnResourceResolver.mjs.map +1 -0
- package/dist/agent-session/builtinsFromSpec.d.ts +19 -0
- package/dist/agent-session/builtinsFromSpec.d.ts.map +1 -0
- package/dist/agent-session/builtinsFromSpec.js +73 -0
- package/dist/agent-session/builtinsFromSpec.js.map +1 -0
- package/dist/agent-session/builtinsFromSpec.mjs +48 -0
- package/dist/agent-session/builtinsFromSpec.mjs.map +1 -0
- package/dist/agent-session/index.d.ts +29 -0
- package/dist/agent-session/index.d.ts.map +1 -0
- package/dist/agent-session/index.js +117 -0
- package/dist/agent-session/index.js.map +1 -0
- package/dist/agent-session/index.mjs +84 -0
- package/dist/agent-session/index.mjs.map +1 -0
- package/dist/agent-session/models/SessionRecord.d.ts +34 -0
- package/dist/agent-session/models/SessionRecord.d.ts.map +1 -0
- package/dist/agent-session/models/SessionRecord.js +19 -0
- package/dist/agent-session/models/SessionRecord.js.map +1 -0
- package/dist/agent-session/models/SessionRecord.mjs +1 -0
- package/dist/agent-session/models/SessionRecord.mjs.map +1 -0
- package/dist/agent-session/models/TurnRecord.d.ts +37 -0
- package/dist/agent-session/models/TurnRecord.d.ts.map +1 -0
- package/dist/agent-session/models/TurnRecord.js +31 -0
- package/dist/agent-session/models/TurnRecord.js.map +1 -0
- package/dist/agent-session/models/TurnRecord.mjs +6 -0
- package/dist/agent-session/models/TurnRecord.mjs.map +1 -0
- package/dist/agent-session/schemas/agentSpec.d.ts +142 -0
- package/dist/agent-session/schemas/agentSpec.d.ts.map +1 -0
- package/dist/agent-session/schemas/agentSpec.js +170 -0
- package/dist/agent-session/schemas/agentSpec.js.map +1 -0
- package/dist/agent-session/schemas/agentSpec.mjs +154 -0
- package/dist/agent-session/schemas/agentSpec.mjs.map +1 -0
- package/dist/agent-session/schemas/events.d.ts +1037 -0
- package/dist/agent-session/schemas/events.d.ts.map +1 -0
- package/dist/agent-session/schemas/events.js +80 -0
- package/dist/agent-session/schemas/events.js.map +1 -0
- package/dist/agent-session/schemas/events.mjs +69 -0
- package/dist/agent-session/schemas/events.mjs.map +1 -0
- package/dist/agent-session/schemas/pagination.d.ts +9 -0
- package/dist/agent-session/schemas/pagination.d.ts.map +1 -0
- package/dist/agent-session/schemas/pagination.js +36 -0
- package/dist/agent-session/schemas/pagination.js.map +1 -0
- package/dist/agent-session/schemas/pagination.mjs +11 -0
- package/dist/agent-session/schemas/pagination.mjs.map +1 -0
- package/dist/agent-session/schemas/session.d.ts +319 -0
- package/dist/agent-session/schemas/session.d.ts.map +1 -0
- package/dist/agent-session/schemas/session.js +58 -0
- package/dist/agent-session/schemas/session.js.map +1 -0
- package/dist/agent-session/schemas/session.mjs +30 -0
- package/dist/agent-session/schemas/session.mjs.map +1 -0
- package/dist/agent-session/schemas/turn.d.ts +494 -0
- package/dist/agent-session/schemas/turn.d.ts.map +1 -0
- package/dist/agent-session/schemas/turn.js +131 -0
- package/dist/agent-session/schemas/turn.js.map +1 -0
- package/dist/agent-session/schemas/turn.mjs +102 -0
- package/dist/agent-session/schemas/turn.mjs.map +1 -0
- package/dist/agent-session/store/ISessionStore.d.ts +310 -0
- package/dist/agent-session/store/ISessionStore.d.ts.map +1 -0
- package/dist/agent-session/store/ISessionStore.js +19 -0
- package/dist/agent-session/store/ISessionStore.js.map +1 -0
- package/dist/agent-session/store/ISessionStore.mjs +1 -0
- package/dist/agent-session/store/ISessionStore.mjs.map +1 -0
- package/dist/agent-session/store/InMemorySessionStore.d.ts +55 -0
- package/dist/agent-session/store/InMemorySessionStore.d.ts.map +1 -0
- package/dist/agent-session/store/InMemorySessionStore.js +475 -0
- package/dist/agent-session/store/InMemorySessionStore.js.map +1 -0
- package/dist/agent-session/store/InMemorySessionStore.mjs +461 -0
- package/dist/agent-session/store/InMemorySessionStore.mjs.map +1 -0
- package/dist/agent-session/store/OffsetPageToken.d.ts +13 -0
- package/dist/agent-session/store/OffsetPageToken.d.ts.map +1 -0
- package/dist/agent-session/store/OffsetPageToken.js +60 -0
- package/dist/agent-session/store/OffsetPageToken.js.map +1 -0
- package/dist/agent-session/store/OffsetPageToken.mjs +32 -0
- package/dist/agent-session/store/OffsetPageToken.mjs.map +1 -0
- package/dist/agent-session/store/PageToken.d.ts +4 -0
- package/dist/agent-session/store/PageToken.d.ts.map +1 -0
- package/dist/agent-session/store/PageToken.js +45 -0
- package/dist/agent-session/store/PageToken.js.map +1 -0
- package/dist/agent-session/store/PageToken.mjs +19 -0
- package/dist/agent-session/store/PageToken.mjs.map +1 -0
- package/dist/agent-session/store/SessionEventPageToken.d.ts +14 -0
- package/dist/agent-session/store/SessionEventPageToken.d.ts.map +1 -0
- package/dist/agent-session/store/SessionEventPageToken.js +70 -0
- package/dist/agent-session/store/SessionEventPageToken.js.map +1 -0
- package/dist/agent-session/store/SessionEventPageToken.mjs +42 -0
- package/dist/agent-session/store/SessionEventPageToken.mjs.map +1 -0
- package/dist/agent-session/store/SessionListPageToken.d.ts +24 -0
- package/dist/agent-session/store/SessionListPageToken.d.ts.map +1 -0
- package/dist/agent-session/store/SessionListPageToken.js +66 -0
- package/dist/agent-session/store/SessionListPageToken.js.map +1 -0
- package/dist/agent-session/store/SessionListPageToken.mjs +38 -0
- package/dist/agent-session/store/SessionListPageToken.mjs.map +1 -0
- package/dist/agent-session/store/SessionStoreErrors.d.ts +43 -0
- package/dist/agent-session/store/SessionStoreErrors.d.ts.map +1 -0
- package/dist/agent-session/store/SessionStoreErrors.js +126 -0
- package/dist/agent-session/store/SessionStoreErrors.js.map +1 -0
- package/dist/agent-session/store/SessionStoreErrors.mjs +92 -0
- package/dist/agent-session/store/SessionStoreErrors.mjs.map +1 -0
- package/dist/agent-session/store/assertCreateTurnThreadDelta.d.ts +18 -0
- package/dist/agent-session/store/assertCreateTurnThreadDelta.d.ts.map +1 -0
- package/dist/agent-session/store/assertCreateTurnThreadDelta.js +67 -0
- package/dist/agent-session/store/assertCreateTurnThreadDelta.js.map +1 -0
- package/dist/agent-session/store/assertCreateTurnThreadDelta.mjs +42 -0
- package/dist/agent-session/store/assertCreateTurnThreadDelta.mjs.map +1 -0
- package/dist/core/InstructionBuilder.d.ts +71 -0
- package/dist/core/InstructionBuilder.d.ts.map +1 -0
- package/dist/core/InstructionBuilder.js +95 -0
- package/dist/core/InstructionBuilder.js.map +1 -0
- package/dist/core/InstructionBuilder.mjs +69 -0
- package/dist/core/InstructionBuilder.mjs.map +1 -0
- package/dist/core/capabilities/AgentCapability.d.ts +32 -0
- package/dist/core/capabilities/AgentCapability.d.ts.map +1 -0
- package/dist/core/capabilities/AgentCapability.js +19 -0
- package/dist/core/capabilities/AgentCapability.js.map +1 -0
- package/dist/core/capabilities/AgentCapability.mjs +1 -0
- package/dist/core/capabilities/AgentCapability.mjs.map +1 -0
- package/dist/core/capabilities/AgentContextProcessor.d.ts +30 -0
- package/dist/core/capabilities/AgentContextProcessor.d.ts.map +1 -0
- package/dist/core/capabilities/AgentContextProcessor.js +19 -0
- package/dist/core/capabilities/AgentContextProcessor.js.map +1 -0
- package/dist/core/capabilities/AgentContextProcessor.mjs +1 -0
- package/dist/core/capabilities/AgentContextProcessor.mjs.map +1 -0
- package/dist/core/capabilities/ToolResponseProcessor.d.ts +12 -0
- package/dist/core/capabilities/ToolResponseProcessor.d.ts.map +1 -0
- package/dist/core/capabilities/ToolResponseProcessor.js +19 -0
- package/dist/core/capabilities/ToolResponseProcessor.js.map +1 -0
- package/dist/core/capabilities/ToolResponseProcessor.mjs +1 -0
- package/dist/core/capabilities/ToolResponseProcessor.mjs.map +1 -0
- package/dist/core/capabilities/builtins/AskUserQuestion.d.ts +11 -0
- package/dist/core/capabilities/builtins/AskUserQuestion.d.ts.map +1 -0
- package/dist/core/capabilities/builtins/AskUserQuestion.js +90 -0
- package/dist/core/capabilities/builtins/AskUserQuestion.js.map +1 -0
- package/dist/core/capabilities/builtins/AskUserQuestion.mjs +64 -0
- package/dist/core/capabilities/builtins/AskUserQuestion.mjs.map +1 -0
- package/dist/core/capabilities/builtins/ContextCompaction.d.ts +23 -0
- package/dist/core/capabilities/builtins/ContextCompaction.d.ts.map +1 -0
- package/dist/core/capabilities/builtins/ContextCompaction.js +235 -0
- package/dist/core/capabilities/builtins/ContextCompaction.js.map +1 -0
- package/dist/core/capabilities/builtins/ContextCompaction.mjs +208 -0
- package/dist/core/capabilities/builtins/ContextCompaction.mjs.map +1 -0
- package/dist/core/capabilities/builtins/CurrentDateTime.d.ts +17 -0
- package/dist/core/capabilities/builtins/CurrentDateTime.d.ts.map +1 -0
- package/dist/core/capabilities/builtins/CurrentDateTime.js +75 -0
- package/dist/core/capabilities/builtins/CurrentDateTime.js.map +1 -0
- package/dist/core/capabilities/builtins/CurrentDateTime.mjs +47 -0
- package/dist/core/capabilities/builtins/CurrentDateTime.mjs.map +1 -0
- package/dist/core/capabilities/builtins/DynamicSubAgents.d.ts +39 -0
- package/dist/core/capabilities/builtins/DynamicSubAgents.d.ts.map +1 -0
- package/dist/core/capabilities/builtins/DynamicSubAgents.js +176 -0
- package/dist/core/capabilities/builtins/DynamicSubAgents.js.map +1 -0
- package/dist/core/capabilities/builtins/DynamicSubAgents.mjs +134 -0
- package/dist/core/capabilities/builtins/DynamicSubAgents.mjs.map +1 -0
- package/dist/core/capabilities/builtins/LargeToolResponse.d.ts +40 -0
- package/dist/core/capabilities/builtins/LargeToolResponse.d.ts.map +1 -0
- package/dist/core/capabilities/builtins/LargeToolResponse.js +225 -0
- package/dist/core/capabilities/builtins/LargeToolResponse.js.map +1 -0
- package/dist/core/capabilities/builtins/LargeToolResponse.mjs +186 -0
- package/dist/core/capabilities/builtins/LargeToolResponse.mjs.map +1 -0
- package/dist/core/capabilities/builtins/OpenUI.d.ts +31 -0
- package/dist/core/capabilities/builtins/OpenUI.d.ts.map +1 -0
- package/dist/core/capabilities/builtins/OpenUI.js +376 -0
- package/dist/core/capabilities/builtins/OpenUI.js.map +1 -0
- package/dist/core/capabilities/builtins/OpenUI.mjs +326 -0
- package/dist/core/capabilities/builtins/OpenUI.mjs.map +1 -0
- package/dist/core/errors.d.ts +33 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +88 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/errors.mjs +57 -0
- package/dist/core/errors.mjs.map +1 -0
- package/dist/core/events/PassthroughEvents.d.ts +30 -0
- package/dist/core/events/PassthroughEvents.d.ts.map +1 -0
- package/dist/core/events/PassthroughEvents.js +19 -0
- package/dist/core/events/PassthroughEvents.js.map +1 -0
- package/dist/core/events/PassthroughEvents.mjs +1 -0
- package/dist/core/events/PassthroughEvents.mjs.map +1 -0
- package/dist/core/events/schema.d.ts +1103 -0
- package/dist/core/events/schema.d.ts.map +1 -0
- package/dist/core/events/schema.js +337 -0
- package/dist/core/events/schema.js.map +1 -0
- package/dist/core/events/schema.mjs +283 -0
- package/dist/core/events/schema.mjs.map +1 -0
- package/dist/core/index.d.ts +60 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +209 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/index.mjs +144 -0
- package/dist/core/index.mjs.map +1 -0
- package/dist/core/llm/ILLM.d.ts +15 -0
- package/dist/core/llm/ILLM.d.ts.map +1 -0
- package/dist/core/llm/ILLM.js +19 -0
- package/dist/core/llm/ILLM.js.map +1 -0
- package/dist/core/llm/ILLM.mjs +1 -0
- package/dist/core/llm/ILLM.mjs.map +1 -0
- package/dist/core/llm/LLMTypes.d.ts +369 -0
- package/dist/core/llm/LLMTypes.d.ts.map +1 -0
- package/dist/core/llm/LLMTypes.js +170 -0
- package/dist/core/llm/LLMTypes.js.map +1 -0
- package/dist/core/llm/LLMTypes.mjs +133 -0
- package/dist/core/llm/LLMTypes.mjs.map +1 -0
- package/dist/core/llm/VercelAILLM.d.ts +228 -0
- package/dist/core/llm/VercelAILLM.d.ts.map +1 -0
- package/dist/core/llm/VercelAILLM.js +1042 -0
- package/dist/core/llm/VercelAILLM.js.map +1 -0
- package/dist/core/llm/VercelAILLM.mjs +999 -0
- package/dist/core/llm/VercelAILLM.mjs.map +1 -0
- package/dist/core/llm/openaiSchemas.d.ts +190 -0
- package/dist/core/llm/openaiSchemas.d.ts.map +1 -0
- package/dist/core/llm/openaiSchemas.js +144 -0
- package/dist/core/llm/openaiSchemas.js.map +1 -0
- package/dist/core/llm/openaiSchemas.mjs +107 -0
- package/dist/core/llm/openaiSchemas.mjs.map +1 -0
- package/dist/core/llm/responseFormat.d.ts +25 -0
- package/dist/core/llm/responseFormat.d.ts.map +1 -0
- package/dist/core/llm/responseFormat.js +58 -0
- package/dist/core/llm/responseFormat.js.map +1 -0
- package/dist/core/llm/responseFormat.mjs +32 -0
- package/dist/core/llm/responseFormat.mjs.map +1 -0
- package/dist/core/llm/toOpenAIChatMessage.d.ts +11 -0
- package/dist/core/llm/toOpenAIChatMessage.d.ts.map +1 -0
- package/dist/core/llm/toOpenAIChatMessage.js +95 -0
- package/dist/core/llm/toOpenAIChatMessage.js.map +1 -0
- package/dist/core/llm/toOpenAIChatMessage.mjs +70 -0
- package/dist/core/llm/toOpenAIChatMessage.mjs.map +1 -0
- package/dist/core/llm/usage.d.ts +4 -0
- package/dist/core/llm/usage.d.ts.map +1 -0
- package/dist/core/llm/usage.js +52 -0
- package/dist/core/llm/usage.js.map +1 -0
- package/dist/core/llm/usage.mjs +26 -0
- package/dist/core/llm/usage.mjs.map +1 -0
- package/dist/core/mcp/ClientSideTool.d.ts +10 -0
- package/dist/core/mcp/ClientSideTool.d.ts.map +1 -0
- package/dist/core/mcp/ClientSideTool.js +56 -0
- package/dist/core/mcp/ClientSideTool.js.map +1 -0
- package/dist/core/mcp/ClientSideTool.mjs +31 -0
- package/dist/core/mcp/ClientSideTool.mjs.map +1 -0
- package/dist/core/mcp/IMCPServer.d.ts +78 -0
- package/dist/core/mcp/IMCPServer.d.ts.map +1 -0
- package/dist/core/mcp/IMCPServer.js +63 -0
- package/dist/core/mcp/IMCPServer.js.map +1 -0
- package/dist/core/mcp/IMCPServer.mjs +33 -0
- package/dist/core/mcp/IMCPServer.mjs.map +1 -0
- package/dist/core/mcp/LocalToolMCP.d.ts +39 -0
- package/dist/core/mcp/LocalToolMCP.d.ts.map +1 -0
- package/dist/core/mcp/LocalToolMCP.js +121 -0
- package/dist/core/mcp/LocalToolMCP.js.map +1 -0
- package/dist/core/mcp/LocalToolMCP.mjs +98 -0
- package/dist/core/mcp/LocalToolMCP.mjs.map +1 -0
- package/dist/core/mcp/RemoteMCP.d.ts +67 -0
- package/dist/core/mcp/RemoteMCP.d.ts.map +1 -0
- package/dist/core/mcp/RemoteMCP.js +244 -0
- package/dist/core/mcp/RemoteMCP.js.map +1 -0
- package/dist/core/mcp/RemoteMCP.mjs +222 -0
- package/dist/core/mcp/RemoteMCP.mjs.map +1 -0
- package/dist/core/mcp/ToolSelectorPolicy.d.ts +52 -0
- package/dist/core/mcp/ToolSelectorPolicy.d.ts.map +1 -0
- package/dist/core/mcp/ToolSelectorPolicy.js +108 -0
- package/dist/core/mcp/ToolSelectorPolicy.js.map +1 -0
- package/dist/core/mcp/ToolSelectorPolicy.mjs +90 -0
- package/dist/core/mcp/ToolSelectorPolicy.mjs.map +1 -0
- package/dist/core/mcp/ToolSet.d.ts +31 -0
- package/dist/core/mcp/ToolSet.d.ts.map +1 -0
- package/dist/core/mcp/ToolSet.js +119 -0
- package/dist/core/mcp/ToolSet.js.map +1 -0
- package/dist/core/mcp/ToolSet.mjs +98 -0
- package/dist/core/mcp/ToolSet.mjs.map +1 -0
- package/dist/core/mcp/convertMCPServers.d.ts +22 -0
- package/dist/core/mcp/convertMCPServers.d.ts.map +1 -0
- package/dist/core/mcp/convertMCPServers.js +89 -0
- package/dist/core/mcp/convertMCPServers.js.map +1 -0
- package/dist/core/mcp/convertMCPServers.mjs +64 -0
- package/dist/core/mcp/convertMCPServers.mjs.map +1 -0
- package/dist/core/mcp/executeToolCalls.d.ts +31 -0
- package/dist/core/mcp/executeToolCalls.d.ts.map +1 -0
- package/dist/core/mcp/executeToolCalls.js +168 -0
- package/dist/core/mcp/executeToolCalls.js.map +1 -0
- package/dist/core/mcp/executeToolCalls.mjs +149 -0
- package/dist/core/mcp/executeToolCalls.mjs.map +1 -0
- package/dist/core/mcp/pagination.d.ts +11 -0
- package/dist/core/mcp/pagination.d.ts.map +1 -0
- package/dist/core/mcp/pagination.js +49 -0
- package/dist/core/mcp/pagination.js.map +1 -0
- package/dist/core/mcp/pagination.mjs +24 -0
- package/dist/core/mcp/pagination.mjs.map +1 -0
- package/dist/core/mcp/remoteMcpClient.d.ts +36 -0
- package/dist/core/mcp/remoteMcpClient.d.ts.map +1 -0
- package/dist/core/mcp/remoteMcpClient.js +138 -0
- package/dist/core/mcp/remoteMcpClient.js.map +1 -0
- package/dist/core/mcp/remoteMcpClient.mjs +112 -0
- package/dist/core/mcp/remoteMcpClient.mjs.map +1 -0
- package/dist/core/mcp/toolNames.d.ts +6 -0
- package/dist/core/mcp/toolNames.d.ts.map +1 -0
- package/dist/core/mcp/toolNames.js +59 -0
- package/dist/core/mcp/toolNames.js.map +1 -0
- package/dist/core/mcp/toolNames.mjs +33 -0
- package/dist/core/mcp/toolNames.mjs.map +1 -0
- package/dist/core/mcp/toolSelectors.d.ts +28 -0
- package/dist/core/mcp/toolSelectors.d.ts.map +1 -0
- package/dist/core/mcp/toolSelectors.js +113 -0
- package/dist/core/mcp/toolSelectors.js.map +1 -0
- package/dist/core/mcp/toolSelectors.mjs +78 -0
- package/dist/core/mcp/toolSelectors.mjs.map +1 -0
- package/dist/core/runtime/AgentDefinition.d.ts +23 -0
- package/dist/core/runtime/AgentDefinition.d.ts.map +1 -0
- package/dist/core/runtime/AgentDefinition.js +19 -0
- package/dist/core/runtime/AgentDefinition.js.map +1 -0
- package/dist/core/runtime/AgentDefinition.mjs +1 -0
- package/dist/core/runtime/AgentDefinition.mjs.map +1 -0
- package/dist/core/runtime/AgentThread.d.ts +64 -0
- package/dist/core/runtime/AgentThread.d.ts.map +1 -0
- package/dist/core/runtime/AgentThread.js +1065 -0
- package/dist/core/runtime/AgentThread.js.map +1 -0
- package/dist/core/runtime/AgentThread.mjs +1062 -0
- package/dist/core/runtime/AgentThread.mjs.map +1 -0
- package/dist/core/runtime/AgentThread.types.d.ts +123 -0
- package/dist/core/runtime/AgentThread.types.d.ts.map +1 -0
- package/dist/core/runtime/AgentThread.types.js +46 -0
- package/dist/core/runtime/AgentThread.types.js.map +1 -0
- package/dist/core/runtime/AgentThread.types.mjs +20 -0
- package/dist/core/runtime/AgentThread.types.mjs.map +1 -0
- package/dist/core/runtime/AgentThreadOrchestrator.d.ts +35 -0
- package/dist/core/runtime/AgentThreadOrchestrator.d.ts.map +1 -0
- package/dist/core/runtime/AgentThreadOrchestrator.js +433 -0
- package/dist/core/runtime/AgentThreadOrchestrator.js.map +1 -0
- package/dist/core/runtime/AgentThreadOrchestrator.mjs +418 -0
- package/dist/core/runtime/AgentThreadOrchestrator.mjs.map +1 -0
- package/dist/core/runtime/CreateDynamicSubAgentThread.d.ts +11 -0
- package/dist/core/runtime/CreateDynamicSubAgentThread.d.ts.map +1 -0
- package/dist/core/runtime/CreateDynamicSubAgentThread.js +19 -0
- package/dist/core/runtime/CreateDynamicSubAgentThread.js.map +1 -0
- package/dist/core/runtime/CreateDynamicSubAgentThread.mjs +1 -0
- package/dist/core/runtime/CreateDynamicSubAgentThread.mjs.map +1 -0
- package/dist/core/runtime/DeferredTool.d.ts +34 -0
- package/dist/core/runtime/DeferredTool.d.ts.map +1 -0
- package/dist/core/runtime/DeferredTool.js +321 -0
- package/dist/core/runtime/DeferredTool.js.map +1 -0
- package/dist/core/runtime/DeferredTool.mjs +287 -0
- package/dist/core/runtime/DeferredTool.mjs.map +1 -0
- package/dist/core/runtime/OpenToolCallCloser.d.ts +21 -0
- package/dist/core/runtime/OpenToolCallCloser.d.ts.map +1 -0
- package/dist/core/runtime/OpenToolCallCloser.js +92 -0
- package/dist/core/runtime/OpenToolCallCloser.js.map +1 -0
- package/dist/core/runtime/OpenToolCallCloser.mjs +66 -0
- package/dist/core/runtime/OpenToolCallCloser.mjs.map +1 -0
- package/dist/core/runtime/UserInputMessage.d.ts +16 -0
- package/dist/core/runtime/UserInputMessage.d.ts.map +1 -0
- package/dist/core/runtime/UserInputMessage.js +183 -0
- package/dist/core/runtime/UserInputMessage.js.map +1 -0
- package/dist/core/runtime/UserInputMessage.mjs +157 -0
- package/dist/core/runtime/UserInputMessage.mjs.map +1 -0
- package/dist/core/runtime/contextUsage.d.ts +17 -0
- package/dist/core/runtime/contextUsage.d.ts.map +1 -0
- package/dist/core/runtime/contextUsage.js +56 -0
- package/dist/core/runtime/contextUsage.js.map +1 -0
- package/dist/core/runtime/contextUsage.mjs +28 -0
- package/dist/core/runtime/contextUsage.mjs.map +1 -0
- package/dist/core/runtime/contextUtils.d.ts +30 -0
- package/dist/core/runtime/contextUtils.d.ts.map +1 -0
- package/dist/core/runtime/contextUtils.js +198 -0
- package/dist/core/runtime/contextUtils.js.map +1 -0
- package/dist/core/runtime/contextUtils.mjs +148 -0
- package/dist/core/runtime/contextUtils.mjs.map +1 -0
- package/dist/core/runtime/metrics.d.ts +22 -0
- package/dist/core/runtime/metrics.d.ts.map +1 -0
- package/dist/core/runtime/metrics.js +89 -0
- package/dist/core/runtime/metrics.js.map +1 -0
- package/dist/core/runtime/metrics.mjs +61 -0
- package/dist/core/runtime/metrics.mjs.map +1 -0
- package/dist/core/sandbox/Sandbox.d.ts +121 -0
- package/dist/core/sandbox/Sandbox.d.ts.map +1 -0
- package/dist/core/sandbox/Sandbox.js +572 -0
- package/dist/core/sandbox/Sandbox.js.map +1 -0
- package/dist/core/sandbox/Sandbox.mjs +536 -0
- package/dist/core/sandbox/Sandbox.mjs.map +1 -0
- package/dist/core/sandbox/SandboxErrors.d.ts +30 -0
- package/dist/core/sandbox/SandboxErrors.d.ts.map +1 -0
- package/dist/core/sandbox/SandboxErrors.js +102 -0
- package/dist/core/sandbox/SandboxErrors.js.map +1 -0
- package/dist/core/sandbox/SandboxErrors.mjs +71 -0
- package/dist/core/sandbox/SandboxErrors.mjs.map +1 -0
- package/dist/core/sandbox/SandboxNatsBridge.d.ts +33 -0
- package/dist/core/sandbox/SandboxNatsBridge.d.ts.map +1 -0
- package/dist/core/sandbox/SandboxNatsBridge.js +222 -0
- package/dist/core/sandbox/SandboxNatsBridge.js.map +1 -0
- package/dist/core/sandbox/SandboxNatsBridge.mjs +201 -0
- package/dist/core/sandbox/SandboxNatsBridge.mjs.map +1 -0
- package/dist/core/sandbox/constants.d.ts +10 -0
- package/dist/core/sandbox/constants.d.ts.map +1 -0
- package/dist/core/sandbox/constants.js +37 -0
- package/dist/core/sandbox/constants.js.map +1 -0
- package/dist/core/sandbox/constants.mjs +10 -0
- package/dist/core/sandbox/constants.mjs.map +1 -0
- package/dist/core/sandbox/provider/DaytonaProvider.d.ts +80 -0
- package/dist/core/sandbox/provider/DaytonaProvider.d.ts.map +1 -0
- package/dist/core/sandbox/provider/DaytonaProvider.js +346 -0
- package/dist/core/sandbox/provider/DaytonaProvider.js.map +1 -0
- package/dist/core/sandbox/provider/DaytonaProvider.mjs +326 -0
- package/dist/core/sandbox/provider/DaytonaProvider.mjs.map +1 -0
- package/dist/core/sandbox/provider/Provider.d.ts +83 -0
- package/dist/core/sandbox/provider/Provider.d.ts.map +1 -0
- package/dist/core/sandbox/provider/Provider.js +43 -0
- package/dist/core/sandbox/provider/Provider.js.map +1 -0
- package/dist/core/sandbox/provider/Provider.mjs +17 -0
- package/dist/core/sandbox/provider/Provider.mjs.map +1 -0
- package/dist/core/sandbox/provider/TFYSandboxProvider.d.ts +41 -0
- package/dist/core/sandbox/provider/TFYSandboxProvider.d.ts.map +1 -0
- package/dist/core/sandbox/provider/TFYSandboxProvider.js +180 -0
- package/dist/core/sandbox/provider/TFYSandboxProvider.js.map +1 -0
- package/dist/core/sandbox/provider/TFYSandboxProvider.mjs +147 -0
- package/dist/core/sandbox/provider/TFYSandboxProvider.mjs.map +1 -0
- package/dist/core/sandbox/sandboxImage.d.ts +6 -0
- package/dist/core/sandbox/sandboxImage.d.ts.map +1 -0
- package/dist/core/sandbox/sandboxImage.js +31 -0
- package/dist/core/sandbox/sandboxImage.js.map +1 -0
- package/dist/core/sandbox/sandboxImage.mjs +6 -0
- package/dist/core/sandbox/sandboxImage.mjs.map +1 -0
- package/dist/core/sandbox/sandboxScripts.gen.d.ts +5 -0
- package/dist/core/sandbox/sandboxScripts.gen.d.ts.map +1 -0
- package/dist/core/sandbox/sandboxScripts.gen.js +343 -0
- package/dist/core/sandbox/sandboxScripts.gen.js.map +1 -0
- package/dist/core/sandbox/sandboxScripts.gen.mjs +318 -0
- package/dist/core/sandbox/sandboxScripts.gen.mjs.map +1 -0
- package/dist/core/sandbox/skills/ISkillMounter.d.ts +7 -0
- package/dist/core/sandbox/skills/ISkillMounter.d.ts.map +1 -0
- package/dist/core/sandbox/skills/ISkillMounter.js +19 -0
- package/dist/core/sandbox/skills/ISkillMounter.js.map +1 -0
- package/dist/core/sandbox/skills/ISkillMounter.mjs +1 -0
- package/dist/core/sandbox/skills/ISkillMounter.mjs.map +1 -0
- package/dist/core/sandbox/skills/SkillMounter.d.ts +17 -0
- package/dist/core/sandbox/skills/SkillMounter.d.ts.map +1 -0
- package/dist/core/sandbox/skills/SkillMounter.js +73 -0
- package/dist/core/sandbox/skills/SkillMounter.js.map +1 -0
- package/dist/core/sandbox/skills/SkillMounter.mjs +48 -0
- package/dist/core/sandbox/skills/SkillMounter.mjs.map +1 -0
- package/dist/core/sandbox/skills/constants.d.ts +10 -0
- package/dist/core/sandbox/skills/constants.d.ts.map +1 -0
- package/dist/core/sandbox/skills/constants.js +56 -0
- package/dist/core/sandbox/skills/constants.js.map +1 -0
- package/dist/core/sandbox/skills/constants.mjs +28 -0
- package/dist/core/sandbox/skills/constants.mjs.map +1 -0
- package/dist/core/sandbox/skills/index.d.ts +5 -0
- package/dist/core/sandbox/skills/index.d.ts.map +1 -0
- package/dist/core/sandbox/skills/index.js +40 -0
- package/dist/core/sandbox/skills/index.js.map +1 -0
- package/dist/core/sandbox/skills/index.mjs +11 -0
- package/dist/core/sandbox/skills/index.mjs.map +1 -0
- package/dist/core/tracing/AgentTracing.d.ts +38 -0
- package/dist/core/tracing/AgentTracing.d.ts.map +1 -0
- package/dist/core/tracing/AgentTracing.js +19 -0
- package/dist/core/tracing/AgentTracing.js.map +1 -0
- package/dist/core/tracing/AgentTracing.mjs +1 -0
- package/dist/core/tracing/AgentTracing.mjs.map +1 -0
- package/dist/core/tracing/NoopAgentTracing.d.ts +3 -0
- package/dist/core/tracing/NoopAgentTracing.d.ts.map +1 -0
- package/dist/core/tracing/NoopAgentTracing.js +79 -0
- package/dist/core/tracing/NoopAgentTracing.js.map +1 -0
- package/dist/core/tracing/NoopAgentTracing.mjs +54 -0
- package/dist/core/tracing/NoopAgentTracing.mjs.map +1 -0
- package/dist/core/util/abort.d.ts +2 -0
- package/dist/core/util/abort.d.ts.map +1 -0
- package/dist/core/util/abort.js +38 -0
- package/dist/core/util/abort.js.map +1 -0
- package/dist/core/util/abort.mjs +13 -0
- package/dist/core/util/abort.mjs.map +1 -0
- package/dist/core/util/errorLogFields.d.ts +6 -0
- package/dist/core/util/errorLogFields.d.ts.map +1 -0
- package/dist/core/util/errorLogFields.js +36 -0
- package/dist/core/util/errorLogFields.js.map +1 -0
- package/dist/core/util/errorLogFields.mjs +11 -0
- package/dist/core/util/errorLogFields.mjs.map +1 -0
- package/dist/core/util/promiseUtils.d.ts +7 -0
- package/dist/core/util/promiseUtils.d.ts.map +1 -0
- package/dist/core/util/promiseUtils.js +82 -0
- package/dist/core/util/promiseUtils.js.map +1 -0
- package/dist/core/util/promiseUtils.mjs +55 -0
- package/dist/core/util/promiseUtils.mjs.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +44 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +8 -0
- package/dist/index.mjs.map +1 -0
- package/dist/package.json +3 -0
- package/dist/request-reply/client.d.ts +21 -0
- package/dist/request-reply/client.d.ts.map +1 -0
- package/dist/request-reply/client.js +92 -0
- package/dist/request-reply/client.js.map +1 -0
- package/dist/request-reply/client.mjs +67 -0
- package/dist/request-reply/client.mjs.map +1 -0
- package/dist/request-reply/errors.d.ts +23 -0
- package/dist/request-reply/errors.d.ts.map +1 -0
- package/dist/request-reply/errors.js +66 -0
- package/dist/request-reply/errors.js.map +1 -0
- package/dist/request-reply/errors.mjs +39 -0
- package/dist/request-reply/errors.mjs.map +1 -0
- package/dist/request-reply/executor.d.ts +70 -0
- package/dist/request-reply/executor.d.ts.map +1 -0
- package/dist/request-reply/executor.js +267 -0
- package/dist/request-reply/executor.js.map +1 -0
- package/dist/request-reply/executor.mjs +232 -0
- package/dist/request-reply/executor.mjs.map +1 -0
- package/dist/request-reply/index.d.ts +16 -0
- package/dist/request-reply/index.d.ts.map +1 -0
- package/dist/request-reply/index.js +47 -0
- package/dist/request-reply/index.js.map +1 -0
- package/dist/request-reply/index.mjs +16 -0
- package/dist/request-reply/index.mjs.map +1 -0
- package/dist/request-reply/router.d.ts +20 -0
- package/dist/request-reply/router.d.ts.map +1 -0
- package/dist/request-reply/router.js +55 -0
- package/dist/request-reply/router.js.map +1 -0
- package/dist/request-reply/router.mjs +30 -0
- package/dist/request-reply/router.mjs.map +1 -0
- package/dist/request-reply/types.d.ts +25 -0
- package/dist/request-reply/types.d.ts.map +1 -0
- package/dist/request-reply/types.js +54 -0
- package/dist/request-reply/types.js.map +1 -0
- package/dist/request-reply/types.mjs +28 -0
- package/dist/request-reply/types.mjs.map +1 -0
- package/dist/request-reply/utils.d.ts +9 -0
- package/dist/request-reply/utils.d.ts.map +1 -0
- package/dist/request-reply/utils.js +51 -0
- package/dist/request-reply/utils.js.map +1 -0
- package/dist/request-reply/utils.mjs +22 -0
- package/dist/request-reply/utils.mjs.map +1 -0
- package/package.json +127 -6
- package/README.md +0 -4
- package/index.js +0 -1
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/core/mcp/ToolSelectorPolicy.ts
|
|
21
|
+
var ToolSelectorPolicy_exports = {};
|
|
22
|
+
__export(ToolSelectorPolicy_exports, {
|
|
23
|
+
ToolSelectorPolicy: () => ToolSelectorPolicy
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(ToolSelectorPolicy_exports);
|
|
26
|
+
var import_toolSelectors = require("./toolSelectors.js");
|
|
27
|
+
var ToolSelectorPolicy = class {
|
|
28
|
+
preload;
|
|
29
|
+
hasPreloadedTools;
|
|
30
|
+
enableTools;
|
|
31
|
+
disableTools;
|
|
32
|
+
preloadTools;
|
|
33
|
+
requireApprovalForTools;
|
|
34
|
+
// Tool names that survived enable/disable filtering on the most recent filterAndAnnotate() call.
|
|
35
|
+
// Used by the sandbox allow-list and as the fast path for callTool gating.
|
|
36
|
+
resolvedAllowedToolNames;
|
|
37
|
+
constructor(params) {
|
|
38
|
+
this.enableTools = params.selectors.enableTools;
|
|
39
|
+
this.disableTools = params.selectors.disableTools;
|
|
40
|
+
this.preloadTools = params.selectors.preloadTools;
|
|
41
|
+
this.requireApprovalForTools = params.selectors.requireApprovalForTools ?? import_toolSelectors.DEFAULT_REQUIRE_APPROVAL_FOR_TOOLS;
|
|
42
|
+
this.preload = params.preload;
|
|
43
|
+
this.hasPreloadedTools = params.preload || this.preloadTools.length > 0;
|
|
44
|
+
}
|
|
45
|
+
/** Literal enable_tools names that are not present on the server (caller throws if non-empty). */
|
|
46
|
+
missingEnableLiterals(tools) {
|
|
47
|
+
const availableNames = new Set(tools.map((t) => t.name));
|
|
48
|
+
return (0, import_toolSelectors.literalToolNames)(this.enableTools).filter((name) => !availableNames.has(name));
|
|
49
|
+
}
|
|
50
|
+
/** Filter by enable/disable, record the resolved allow-list, and annotate per-tool preload. */
|
|
51
|
+
filterAndAnnotate(tools) {
|
|
52
|
+
const filtered = tools.filter(
|
|
53
|
+
(tool) => (0, import_toolSelectors.isToolAllowed)({
|
|
54
|
+
toolName: tool.name,
|
|
55
|
+
annotations: tool.annotations,
|
|
56
|
+
enableSelectors: this.enableTools,
|
|
57
|
+
disableSelectors: this.disableTools
|
|
58
|
+
})
|
|
59
|
+
);
|
|
60
|
+
this.resolvedAllowedToolNames = filtered.map((t) => t.name);
|
|
61
|
+
return filtered.map((tool) => ({ ...tool, preload: this.isToolPreloaded(tool.name, tool.annotations) }));
|
|
62
|
+
}
|
|
63
|
+
isToolPreloaded(toolName, annotations) {
|
|
64
|
+
if (this.preload) return true;
|
|
65
|
+
return (0, import_toolSelectors.toolMatchesAnySelector)(toolName, annotations, this.preloadTools);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Whether a tool may be called. Uses the resolved allow-list once listTools() has run; before that
|
|
69
|
+
* falls back to matching against the raw selectors, resolving annotations lazily only when needed.
|
|
70
|
+
*/
|
|
71
|
+
async isAllowed(toolName, resolveAnnotations) {
|
|
72
|
+
if (this.resolvedAllowedToolNames) {
|
|
73
|
+
return this.resolvedAllowedToolNames.includes(toolName);
|
|
74
|
+
}
|
|
75
|
+
return (0, import_toolSelectors.isToolAllowed)({
|
|
76
|
+
toolName,
|
|
77
|
+
annotations: await resolveAnnotations(),
|
|
78
|
+
enableSelectors: this.enableTools,
|
|
79
|
+
disableSelectors: this.disableTools
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Best-effort allow-list for the sandbox. After a listTools() call returns the concrete names;
|
|
84
|
+
* before that, `@all` with no disables means "unrestricted" (undefined), else the literal names.
|
|
85
|
+
*/
|
|
86
|
+
allowedNamesForSandbox() {
|
|
87
|
+
if (this.resolvedAllowedToolNames) {
|
|
88
|
+
return this.resolvedAllowedToolNames;
|
|
89
|
+
}
|
|
90
|
+
if ((0, import_toolSelectors.selectorsIncludeAll)(this.enableTools) && this.disableTools.length === 0) {
|
|
91
|
+
return void 0;
|
|
92
|
+
}
|
|
93
|
+
return (0, import_toolSelectors.literalToolNames)(this.enableTools);
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Whether the tool requires human approval. Honors `requireApprovalForTools` exactly: omit /
|
|
97
|
+
* undefined defaults to write+destructive (constructor); an explicit list — including empty —
|
|
98
|
+
* is exact.
|
|
99
|
+
*/
|
|
100
|
+
requiresApproval(toolName, annotations) {
|
|
101
|
+
return (0, import_toolSelectors.toolRequiresApproval)(toolName, annotations, this.requireApprovalForTools);
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
105
|
+
0 && (module.exports = {
|
|
106
|
+
ToolSelectorPolicy
|
|
107
|
+
});
|
|
108
|
+
//# sourceMappingURL=ToolSelectorPolicy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/core/mcp/ToolSelectorPolicy.ts"],"sourcesContent":["import type { ToolAnnotations } from '@modelcontextprotocol/sdk/types.js';\nimport type { AgentToolSchema } from './IMCPServer';\nimport {\n DEFAULT_REQUIRE_APPROVAL_FOR_TOOLS,\n isToolAllowed,\n literalToolNames,\n selectorsIncludeAll,\n toolMatchesAnySelector,\n toolRequiresApproval,\n} from './toolSelectors';\n\n/**\n * Per-server tool selectors. Enable/disable/preload tags: `@all`, `@read-only`.\n * Approval tags: `@all`, `@write`, `@destructive`.\n */\nexport interface ToolSelectorConfig {\n enableTools: string[];\n disableTools: string[];\n preloadTools: string[];\n requireApprovalForTools?: string[] | undefined;\n}\n\n/**\n * Encapsulates enable/disable/preload/approval selector policy for a single MCP server. Pure: it\n * never throws or does IO — callers decide how to surface a disallowed/missing tool so each can\n * raise its own error type.\n */\nexport class ToolSelectorPolicy {\n readonly preload: boolean;\n readonly hasPreloadedTools: boolean;\n\n private readonly enableTools: string[];\n private readonly disableTools: string[];\n private readonly preloadTools: string[];\n private readonly requireApprovalForTools: string[];\n // Tool names that survived enable/disable filtering on the most recent filterAndAnnotate() call.\n // Used by the sandbox allow-list and as the fast path for callTool gating.\n private resolvedAllowedToolNames: string[] | undefined;\n\n constructor(params: { selectors: ToolSelectorConfig; preload: boolean }) {\n this.enableTools = params.selectors.enableTools;\n this.disableTools = params.selectors.disableTools;\n this.preloadTools = params.selectors.preloadTools;\n this.requireApprovalForTools = params.selectors.requireApprovalForTools ?? DEFAULT_REQUIRE_APPROVAL_FOR_TOOLS;\n this.preload = params.preload;\n this.hasPreloadedTools = params.preload || this.preloadTools.length > 0;\n }\n\n /** Literal enable_tools names that are not present on the server (caller throws if non-empty). */\n missingEnableLiterals(tools: AgentToolSchema[]): string[] {\n const availableNames = new Set(tools.map(t => t.name));\n return literalToolNames(this.enableTools).filter(name => !availableNames.has(name));\n }\n\n /** Filter by enable/disable, record the resolved allow-list, and annotate per-tool preload. */\n filterAndAnnotate(tools: AgentToolSchema[]): AgentToolSchema[] {\n const filtered = tools.filter(tool =>\n isToolAllowed({\n toolName: tool.name,\n annotations: tool.annotations,\n enableSelectors: this.enableTools,\n disableSelectors: this.disableTools,\n }),\n );\n this.resolvedAllowedToolNames = filtered.map(t => t.name);\n return filtered.map(tool => ({ ...tool, preload: this.isToolPreloaded(tool.name, tool.annotations) }));\n }\n\n private isToolPreloaded(toolName: string, annotations: ToolAnnotations | undefined): boolean {\n // Fully-preloaded server: every allowed tool is loaded into context.\n if (this.preload) return true;\n // Otherwise only the tools matching `preload_tools` stay eager.\n return toolMatchesAnySelector(toolName, annotations, this.preloadTools);\n }\n\n /**\n * Whether a tool may be called. Uses the resolved allow-list once listTools() has run; before that\n * falls back to matching against the raw selectors, resolving annotations lazily only when needed.\n */\n async isAllowed(toolName: string, resolveAnnotations: () => Promise<ToolAnnotations | undefined>): Promise<boolean> {\n if (this.resolvedAllowedToolNames) {\n return this.resolvedAllowedToolNames.includes(toolName);\n }\n return isToolAllowed({\n toolName,\n annotations: await resolveAnnotations(),\n enableSelectors: this.enableTools,\n disableSelectors: this.disableTools,\n });\n }\n\n /**\n * Best-effort allow-list for the sandbox. After a listTools() call returns the concrete names;\n * before that, `@all` with no disables means \"unrestricted\" (undefined), else the literal names.\n */\n allowedNamesForSandbox(): string[] | undefined {\n if (this.resolvedAllowedToolNames) {\n return this.resolvedAllowedToolNames;\n }\n if (selectorsIncludeAll(this.enableTools) && this.disableTools.length === 0) {\n return undefined;\n }\n return literalToolNames(this.enableTools);\n }\n\n /**\n * Whether the tool requires human approval. Honors `requireApprovalForTools` exactly: omit /\n * undefined defaults to write+destructive (constructor); an explicit list — including empty —\n * is exact.\n */\n requiresApproval(toolName: string, annotations: ToolAnnotations | undefined): boolean {\n return toolRequiresApproval(toolName, annotations, this.requireApprovalForTools);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,2BAOO;AAkBA,IAAM,qBAAN,MAAyB;AAAA,EACrB;AAAA,EACA;AAAA,EAEQ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA;AAAA,EAGT;AAAA,EAER,YAAY,QAA6D;AACvE,SAAK,cAAc,OAAO,UAAU;AACpC,SAAK,eAAe,OAAO,UAAU;AACrC,SAAK,eAAe,OAAO,UAAU;AACrC,SAAK,0BAA0B,OAAO,UAAU,2BAA2B;AAC3E,SAAK,UAAU,OAAO;AACtB,SAAK,oBAAoB,OAAO,WAAW,KAAK,aAAa,SAAS;AAAA,EACxE;AAAA;AAAA,EAGA,sBAAsB,OAAoC;AACxD,UAAM,iBAAiB,IAAI,IAAI,MAAM,IAAI,OAAK,EAAE,IAAI,CAAC;AACrD,eAAO,uCAAiB,KAAK,WAAW,EAAE,OAAO,UAAQ,CAAC,eAAe,IAAI,IAAI,CAAC;AAAA,EACpF;AAAA;AAAA,EAGA,kBAAkB,OAA6C;AAC7D,UAAM,WAAW,MAAM;AAAA,MAAO,cAC5B,oCAAc;AAAA,QACZ,UAAU,KAAK;AAAA,QACf,aAAa,KAAK;AAAA,QAClB,iBAAiB,KAAK;AAAA,QACtB,kBAAkB,KAAK;AAAA,MACzB,CAAC;AAAA,IACH;AACA,SAAK,2BAA2B,SAAS,IAAI,OAAK,EAAE,IAAI;AACxD,WAAO,SAAS,IAAI,WAAS,EAAE,GAAG,MAAM,SAAS,KAAK,gBAAgB,KAAK,MAAM,KAAK,WAAW,EAAE,EAAE;AAAA,EACvG;AAAA,EAEQ,gBAAgB,UAAkB,aAAmD;AAE3F,QAAI,KAAK,QAAS,QAAO;AAEzB,eAAO,6CAAuB,UAAU,aAAa,KAAK,YAAY;AAAA,EACxE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,UAAU,UAAkB,oBAAkF;AAClH,QAAI,KAAK,0BAA0B;AACjC,aAAO,KAAK,yBAAyB,SAAS,QAAQ;AAAA,IACxD;AACA,eAAO,oCAAc;AAAA,MACnB;AAAA,MACA,aAAa,MAAM,mBAAmB;AAAA,MACtC,iBAAiB,KAAK;AAAA,MACtB,kBAAkB,KAAK;AAAA,IACzB,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,yBAA+C;AAC7C,QAAI,KAAK,0BAA0B;AACjC,aAAO,KAAK;AAAA,IACd;AACA,YAAI,0CAAoB,KAAK,WAAW,KAAK,KAAK,aAAa,WAAW,GAAG;AAC3E,aAAO;AAAA,IACT;AACA,eAAO,uCAAiB,KAAK,WAAW;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,iBAAiB,UAAkB,aAAmD;AACpF,eAAO,2CAAqB,UAAU,aAAa,KAAK,uBAAuB;AAAA,EACjF;AACF;","names":[]}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
// src/core/mcp/ToolSelectorPolicy.ts
|
|
2
|
+
import {
|
|
3
|
+
DEFAULT_REQUIRE_APPROVAL_FOR_TOOLS,
|
|
4
|
+
isToolAllowed,
|
|
5
|
+
literalToolNames,
|
|
6
|
+
selectorsIncludeAll,
|
|
7
|
+
toolMatchesAnySelector,
|
|
8
|
+
toolRequiresApproval
|
|
9
|
+
} from "./toolSelectors.mjs";
|
|
10
|
+
var ToolSelectorPolicy = class {
|
|
11
|
+
preload;
|
|
12
|
+
hasPreloadedTools;
|
|
13
|
+
enableTools;
|
|
14
|
+
disableTools;
|
|
15
|
+
preloadTools;
|
|
16
|
+
requireApprovalForTools;
|
|
17
|
+
// Tool names that survived enable/disable filtering on the most recent filterAndAnnotate() call.
|
|
18
|
+
// Used by the sandbox allow-list and as the fast path for callTool gating.
|
|
19
|
+
resolvedAllowedToolNames;
|
|
20
|
+
constructor(params) {
|
|
21
|
+
this.enableTools = params.selectors.enableTools;
|
|
22
|
+
this.disableTools = params.selectors.disableTools;
|
|
23
|
+
this.preloadTools = params.selectors.preloadTools;
|
|
24
|
+
this.requireApprovalForTools = params.selectors.requireApprovalForTools ?? DEFAULT_REQUIRE_APPROVAL_FOR_TOOLS;
|
|
25
|
+
this.preload = params.preload;
|
|
26
|
+
this.hasPreloadedTools = params.preload || this.preloadTools.length > 0;
|
|
27
|
+
}
|
|
28
|
+
/** Literal enable_tools names that are not present on the server (caller throws if non-empty). */
|
|
29
|
+
missingEnableLiterals(tools) {
|
|
30
|
+
const availableNames = new Set(tools.map((t) => t.name));
|
|
31
|
+
return literalToolNames(this.enableTools).filter((name) => !availableNames.has(name));
|
|
32
|
+
}
|
|
33
|
+
/** Filter by enable/disable, record the resolved allow-list, and annotate per-tool preload. */
|
|
34
|
+
filterAndAnnotate(tools) {
|
|
35
|
+
const filtered = tools.filter(
|
|
36
|
+
(tool) => isToolAllowed({
|
|
37
|
+
toolName: tool.name,
|
|
38
|
+
annotations: tool.annotations,
|
|
39
|
+
enableSelectors: this.enableTools,
|
|
40
|
+
disableSelectors: this.disableTools
|
|
41
|
+
})
|
|
42
|
+
);
|
|
43
|
+
this.resolvedAllowedToolNames = filtered.map((t) => t.name);
|
|
44
|
+
return filtered.map((tool) => ({ ...tool, preload: this.isToolPreloaded(tool.name, tool.annotations) }));
|
|
45
|
+
}
|
|
46
|
+
isToolPreloaded(toolName, annotations) {
|
|
47
|
+
if (this.preload) return true;
|
|
48
|
+
return toolMatchesAnySelector(toolName, annotations, this.preloadTools);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Whether a tool may be called. Uses the resolved allow-list once listTools() has run; before that
|
|
52
|
+
* falls back to matching against the raw selectors, resolving annotations lazily only when needed.
|
|
53
|
+
*/
|
|
54
|
+
async isAllowed(toolName, resolveAnnotations) {
|
|
55
|
+
if (this.resolvedAllowedToolNames) {
|
|
56
|
+
return this.resolvedAllowedToolNames.includes(toolName);
|
|
57
|
+
}
|
|
58
|
+
return isToolAllowed({
|
|
59
|
+
toolName,
|
|
60
|
+
annotations: await resolveAnnotations(),
|
|
61
|
+
enableSelectors: this.enableTools,
|
|
62
|
+
disableSelectors: this.disableTools
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Best-effort allow-list for the sandbox. After a listTools() call returns the concrete names;
|
|
67
|
+
* before that, `@all` with no disables means "unrestricted" (undefined), else the literal names.
|
|
68
|
+
*/
|
|
69
|
+
allowedNamesForSandbox() {
|
|
70
|
+
if (this.resolvedAllowedToolNames) {
|
|
71
|
+
return this.resolvedAllowedToolNames;
|
|
72
|
+
}
|
|
73
|
+
if (selectorsIncludeAll(this.enableTools) && this.disableTools.length === 0) {
|
|
74
|
+
return void 0;
|
|
75
|
+
}
|
|
76
|
+
return literalToolNames(this.enableTools);
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Whether the tool requires human approval. Honors `requireApprovalForTools` exactly: omit /
|
|
80
|
+
* undefined defaults to write+destructive (constructor); an explicit list — including empty —
|
|
81
|
+
* is exact.
|
|
82
|
+
*/
|
|
83
|
+
requiresApproval(toolName, annotations) {
|
|
84
|
+
return toolRequiresApproval(toolName, annotations, this.requireApprovalForTools);
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
export {
|
|
88
|
+
ToolSelectorPolicy
|
|
89
|
+
};
|
|
90
|
+
//# sourceMappingURL=ToolSelectorPolicy.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/core/mcp/ToolSelectorPolicy.ts"],"sourcesContent":["import type { ToolAnnotations } from '@modelcontextprotocol/sdk/types.js';\nimport type { AgentToolSchema } from './IMCPServer';\nimport {\n DEFAULT_REQUIRE_APPROVAL_FOR_TOOLS,\n isToolAllowed,\n literalToolNames,\n selectorsIncludeAll,\n toolMatchesAnySelector,\n toolRequiresApproval,\n} from './toolSelectors';\n\n/**\n * Per-server tool selectors. Enable/disable/preload tags: `@all`, `@read-only`.\n * Approval tags: `@all`, `@write`, `@destructive`.\n */\nexport interface ToolSelectorConfig {\n enableTools: string[];\n disableTools: string[];\n preloadTools: string[];\n requireApprovalForTools?: string[] | undefined;\n}\n\n/**\n * Encapsulates enable/disable/preload/approval selector policy for a single MCP server. Pure: it\n * never throws or does IO — callers decide how to surface a disallowed/missing tool so each can\n * raise its own error type.\n */\nexport class ToolSelectorPolicy {\n readonly preload: boolean;\n readonly hasPreloadedTools: boolean;\n\n private readonly enableTools: string[];\n private readonly disableTools: string[];\n private readonly preloadTools: string[];\n private readonly requireApprovalForTools: string[];\n // Tool names that survived enable/disable filtering on the most recent filterAndAnnotate() call.\n // Used by the sandbox allow-list and as the fast path for callTool gating.\n private resolvedAllowedToolNames: string[] | undefined;\n\n constructor(params: { selectors: ToolSelectorConfig; preload: boolean }) {\n this.enableTools = params.selectors.enableTools;\n this.disableTools = params.selectors.disableTools;\n this.preloadTools = params.selectors.preloadTools;\n this.requireApprovalForTools = params.selectors.requireApprovalForTools ?? DEFAULT_REQUIRE_APPROVAL_FOR_TOOLS;\n this.preload = params.preload;\n this.hasPreloadedTools = params.preload || this.preloadTools.length > 0;\n }\n\n /** Literal enable_tools names that are not present on the server (caller throws if non-empty). */\n missingEnableLiterals(tools: AgentToolSchema[]): string[] {\n const availableNames = new Set(tools.map(t => t.name));\n return literalToolNames(this.enableTools).filter(name => !availableNames.has(name));\n }\n\n /** Filter by enable/disable, record the resolved allow-list, and annotate per-tool preload. */\n filterAndAnnotate(tools: AgentToolSchema[]): AgentToolSchema[] {\n const filtered = tools.filter(tool =>\n isToolAllowed({\n toolName: tool.name,\n annotations: tool.annotations,\n enableSelectors: this.enableTools,\n disableSelectors: this.disableTools,\n }),\n );\n this.resolvedAllowedToolNames = filtered.map(t => t.name);\n return filtered.map(tool => ({ ...tool, preload: this.isToolPreloaded(tool.name, tool.annotations) }));\n }\n\n private isToolPreloaded(toolName: string, annotations: ToolAnnotations | undefined): boolean {\n // Fully-preloaded server: every allowed tool is loaded into context.\n if (this.preload) return true;\n // Otherwise only the tools matching `preload_tools` stay eager.\n return toolMatchesAnySelector(toolName, annotations, this.preloadTools);\n }\n\n /**\n * Whether a tool may be called. Uses the resolved allow-list once listTools() has run; before that\n * falls back to matching against the raw selectors, resolving annotations lazily only when needed.\n */\n async isAllowed(toolName: string, resolveAnnotations: () => Promise<ToolAnnotations | undefined>): Promise<boolean> {\n if (this.resolvedAllowedToolNames) {\n return this.resolvedAllowedToolNames.includes(toolName);\n }\n return isToolAllowed({\n toolName,\n annotations: await resolveAnnotations(),\n enableSelectors: this.enableTools,\n disableSelectors: this.disableTools,\n });\n }\n\n /**\n * Best-effort allow-list for the sandbox. After a listTools() call returns the concrete names;\n * before that, `@all` with no disables means \"unrestricted\" (undefined), else the literal names.\n */\n allowedNamesForSandbox(): string[] | undefined {\n if (this.resolvedAllowedToolNames) {\n return this.resolvedAllowedToolNames;\n }\n if (selectorsIncludeAll(this.enableTools) && this.disableTools.length === 0) {\n return undefined;\n }\n return literalToolNames(this.enableTools);\n }\n\n /**\n * Whether the tool requires human approval. Honors `requireApprovalForTools` exactly: omit /\n * undefined defaults to write+destructive (constructor); an explicit list — including empty —\n * is exact.\n */\n requiresApproval(toolName: string, annotations: ToolAnnotations | undefined): boolean {\n return toolRequiresApproval(toolName, annotations, this.requireApprovalForTools);\n }\n}\n"],"mappings":";AAEA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAkBA,IAAM,qBAAN,MAAyB;AAAA,EACrB;AAAA,EACA;AAAA,EAEQ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA;AAAA,EAGT;AAAA,EAER,YAAY,QAA6D;AACvE,SAAK,cAAc,OAAO,UAAU;AACpC,SAAK,eAAe,OAAO,UAAU;AACrC,SAAK,eAAe,OAAO,UAAU;AACrC,SAAK,0BAA0B,OAAO,UAAU,2BAA2B;AAC3E,SAAK,UAAU,OAAO;AACtB,SAAK,oBAAoB,OAAO,WAAW,KAAK,aAAa,SAAS;AAAA,EACxE;AAAA;AAAA,EAGA,sBAAsB,OAAoC;AACxD,UAAM,iBAAiB,IAAI,IAAI,MAAM,IAAI,OAAK,EAAE,IAAI,CAAC;AACrD,WAAO,iBAAiB,KAAK,WAAW,EAAE,OAAO,UAAQ,CAAC,eAAe,IAAI,IAAI,CAAC;AAAA,EACpF;AAAA;AAAA,EAGA,kBAAkB,OAA6C;AAC7D,UAAM,WAAW,MAAM;AAAA,MAAO,UAC5B,cAAc;AAAA,QACZ,UAAU,KAAK;AAAA,QACf,aAAa,KAAK;AAAA,QAClB,iBAAiB,KAAK;AAAA,QACtB,kBAAkB,KAAK;AAAA,MACzB,CAAC;AAAA,IACH;AACA,SAAK,2BAA2B,SAAS,IAAI,OAAK,EAAE,IAAI;AACxD,WAAO,SAAS,IAAI,WAAS,EAAE,GAAG,MAAM,SAAS,KAAK,gBAAgB,KAAK,MAAM,KAAK,WAAW,EAAE,EAAE;AAAA,EACvG;AAAA,EAEQ,gBAAgB,UAAkB,aAAmD;AAE3F,QAAI,KAAK,QAAS,QAAO;AAEzB,WAAO,uBAAuB,UAAU,aAAa,KAAK,YAAY;AAAA,EACxE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,UAAU,UAAkB,oBAAkF;AAClH,QAAI,KAAK,0BAA0B;AACjC,aAAO,KAAK,yBAAyB,SAAS,QAAQ;AAAA,IACxD;AACA,WAAO,cAAc;AAAA,MACnB;AAAA,MACA,aAAa,MAAM,mBAAmB;AAAA,MACtC,iBAAiB,KAAK;AAAA,MACtB,kBAAkB,KAAK;AAAA,IACzB,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,yBAA+C;AAC7C,QAAI,KAAK,0BAA0B;AACjC,aAAO,KAAK;AAAA,IACd;AACA,QAAI,oBAAoB,KAAK,WAAW,KAAK,KAAK,aAAa,WAAW,GAAG;AAC3E,aAAO;AAAA,IACT;AACA,WAAO,iBAAiB,KAAK,WAAW;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,iBAAiB,UAAkB,aAAmD;AACpF,WAAO,qBAAqB,UAAU,aAAa,KAAK,uBAAuB;AAAA,EACjF;AACF;","names":[]}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { CallToolRequest } from '@modelcontextprotocol/sdk/types.js';
|
|
2
|
+
import type { ApprovalDecision } from '../events/schema';
|
|
3
|
+
import type { InternalToolCallInfo } from '../llm/LLMTypes';
|
|
4
|
+
import { type CallToolResponse, type IToolSet, type ListToolsResponse, type ToolSource } from './IMCPServer';
|
|
5
|
+
import { type ToolSelectorConfig } from './ToolSelectorPolicy';
|
|
6
|
+
/**
|
|
7
|
+
* Per-agent {@link IToolSet} view over a shared, policy-free {@link ToolSource}, applying the
|
|
8
|
+
* enable/disable/preload/approval selectors. Many can wrap one source without policy bleed.
|
|
9
|
+
*/
|
|
10
|
+
export declare class ToolSet implements IToolSet {
|
|
11
|
+
readonly name: string;
|
|
12
|
+
readonly id: string;
|
|
13
|
+
readonly description?: string | undefined;
|
|
14
|
+
readonly preload: boolean;
|
|
15
|
+
readonly hasPreloadedTools: boolean;
|
|
16
|
+
private readonly source;
|
|
17
|
+
private readonly policy;
|
|
18
|
+
constructor(params: {
|
|
19
|
+
source: ToolSource;
|
|
20
|
+
selectors: ToolSelectorConfig;
|
|
21
|
+
preload: boolean;
|
|
22
|
+
});
|
|
23
|
+
getAllowedToolNamesForSandbox(): string[] | undefined;
|
|
24
|
+
listTools(): Promise<ListToolsResponse>;
|
|
25
|
+
callTool(params: CallToolRequest['params'], decision?: ApprovalDecision): Promise<CallToolResponse>;
|
|
26
|
+
toolCallInfo(params: CallToolRequest['params'], resolveUnderlyingTool?: boolean): Promise<InternalToolCallInfo>;
|
|
27
|
+
private assertToolAllowed;
|
|
28
|
+
private buildToolCallInfo;
|
|
29
|
+
private resolveAnnotations;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=ToolSet.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ToolSet.d.ts","sourceRoot":"","sources":["../../../src/core/mcp/ToolSet.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAmB,MAAM,oCAAoC,CAAC;AAE3F,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EAKL,KAAK,gBAAgB,EACrB,KAAK,QAAQ,EACb,KAAK,iBAAiB,EACtB,KAAK,UAAU,EAChB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAsB,KAAK,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAEnF;;;GAGG;AACH,qBAAa,OAAQ,YAAW,QAAQ;IACtC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1C,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,iBAAiB,EAAE,OAAO,CAAC;IAEpC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAa;IACpC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;IAE5C,YAAY,MAAM,EAAE;QAAE,MAAM,EAAE,UAAU,CAAC;QAAC,SAAS,EAAE,kBAAkB,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,EAW1F;IAED,6BAA6B,IAAI,MAAM,EAAE,GAAG,SAAS,CAEpD;IAEK,SAAS,IAAI,OAAO,CAAC,iBAAiB,CAAC,CAiB5C;IAEK,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA6BxG;IAEK,YAAY,CAChB,MAAM,EAAE,eAAe,CAAC,QAAQ,CAAC,EACjC,qBAAqB,CAAC,EAAE,OAAO,GAC9B,OAAO,CAAC,oBAAoB,CAAC,CAG/B;YAEa,iBAAiB;YAOjB,iBAAiB;YAWjB,kBAAkB;CAKjC"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/core/mcp/ToolSet.ts
|
|
21
|
+
var ToolSet_exports = {};
|
|
22
|
+
__export(ToolSet_exports, {
|
|
23
|
+
ToolSet: () => ToolSet
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(ToolSet_exports);
|
|
26
|
+
var import_errors = require("../errors.js");
|
|
27
|
+
var import_IMCPServer = require("./IMCPServer.js");
|
|
28
|
+
var import_ToolSelectorPolicy = require("./ToolSelectorPolicy.js");
|
|
29
|
+
var ToolSet = class {
|
|
30
|
+
name;
|
|
31
|
+
id;
|
|
32
|
+
description;
|
|
33
|
+
preload;
|
|
34
|
+
hasPreloadedTools;
|
|
35
|
+
source;
|
|
36
|
+
policy;
|
|
37
|
+
constructor(params) {
|
|
38
|
+
this.source = params.source;
|
|
39
|
+
this.name = params.source.name;
|
|
40
|
+
this.id = params.source.id;
|
|
41
|
+
this.description = params.source.description;
|
|
42
|
+
this.policy = new import_ToolSelectorPolicy.ToolSelectorPolicy({
|
|
43
|
+
selectors: params.selectors,
|
|
44
|
+
preload: params.preload
|
|
45
|
+
});
|
|
46
|
+
this.preload = this.policy.preload;
|
|
47
|
+
this.hasPreloadedTools = this.policy.hasPreloadedTools;
|
|
48
|
+
}
|
|
49
|
+
getAllowedToolNamesForSandbox() {
|
|
50
|
+
return this.policy.allowedNamesForSandbox();
|
|
51
|
+
}
|
|
52
|
+
async listTools() {
|
|
53
|
+
const response = await this.source.listTools();
|
|
54
|
+
if ((0, import_IMCPServer.isAuthRequired)(response)) return response;
|
|
55
|
+
const tools = response.result.tools;
|
|
56
|
+
const missingTools = this.policy.missingEnableLiterals(tools);
|
|
57
|
+
if (missingTools.length > 0) {
|
|
58
|
+
throw new import_errors.McpConnectionError(
|
|
59
|
+
`Requested tools not found in MCP server ${this.name}: ${missingTools.join(", ")}`,
|
|
60
|
+
422
|
|
61
|
+
);
|
|
62
|
+
}
|
|
63
|
+
return {
|
|
64
|
+
result: { tools: this.policy.filterAndAnnotate(tools) },
|
|
65
|
+
wasInitialized: response.wasInitialized
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
async callTool(params, decision) {
|
|
69
|
+
const listed = await this.source.listTools();
|
|
70
|
+
if ((0, import_IMCPServer.isAuthRequired)(listed)) return listed;
|
|
71
|
+
const annotations = findAnnotations(listed.result.tools, params.name);
|
|
72
|
+
await this.assertToolAllowed(params.name, annotations);
|
|
73
|
+
const tool_info = await this.buildToolCallInfo(params, annotations);
|
|
74
|
+
if (!decision && tool_info.is_approval_required) {
|
|
75
|
+
return { approvalRequired: { tool_info } };
|
|
76
|
+
}
|
|
77
|
+
if (decision?.status === "deny") {
|
|
78
|
+
const reason = decision.reason ?? "no reason provided";
|
|
79
|
+
return (0, import_IMCPServer.toolResultResponse)({
|
|
80
|
+
text: JSON.stringify({ error: `User denied tool call: ${reason}` }),
|
|
81
|
+
isError: true
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
const response = await this.source.callTool(params, decision);
|
|
85
|
+
if (listed.wasInitialized && (0, import_IMCPServer.isCallToolResponseResult)(response) && !response.wasInitialized) {
|
|
86
|
+
return { ...response, wasInitialized: listed.wasInitialized };
|
|
87
|
+
}
|
|
88
|
+
return response;
|
|
89
|
+
}
|
|
90
|
+
async toolCallInfo(params, resolveUnderlyingTool) {
|
|
91
|
+
const annotations = await this.resolveAnnotations(params.name);
|
|
92
|
+
return this.buildToolCallInfo(params, annotations, resolveUnderlyingTool);
|
|
93
|
+
}
|
|
94
|
+
async assertToolAllowed(toolName, annotations) {
|
|
95
|
+
const allowed = await this.policy.isAllowed(toolName, () => Promise.resolve(annotations));
|
|
96
|
+
if (!allowed) {
|
|
97
|
+
throw new import_errors.McpConnectionError(`Tool '${toolName}' is not allowed on MCP server ${this.name}`, 403);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
async buildToolCallInfo(params, annotations, resolveUnderlyingTool) {
|
|
101
|
+
return {
|
|
102
|
+
...await this.source.toolCallInfo(params, resolveUnderlyingTool),
|
|
103
|
+
is_approval_required: this.policy.requiresApproval(params.name, annotations)
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
async resolveAnnotations(toolName) {
|
|
107
|
+
const listed = await this.source.listTools();
|
|
108
|
+
if ((0, import_IMCPServer.isAuthRequired)(listed)) return void 0;
|
|
109
|
+
return findAnnotations(listed.result.tools, toolName);
|
|
110
|
+
}
|
|
111
|
+
};
|
|
112
|
+
function findAnnotations(tools, toolName) {
|
|
113
|
+
return tools.find((t) => t.name === toolName)?.annotations;
|
|
114
|
+
}
|
|
115
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
116
|
+
0 && (module.exports = {
|
|
117
|
+
ToolSet
|
|
118
|
+
});
|
|
119
|
+
//# sourceMappingURL=ToolSet.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/core/mcp/ToolSet.ts"],"sourcesContent":["import type { CallToolRequest, ToolAnnotations } from '@modelcontextprotocol/sdk/types.js';\nimport { McpConnectionError } from '../errors';\nimport type { ApprovalDecision } from '../events/schema';\nimport type { InternalToolCallInfo } from '../llm/LLMTypes';\nimport {\n isAuthRequired,\n isCallToolResponseResult,\n toolResultResponse,\n type AgentToolSchema,\n type CallToolResponse,\n type IToolSet,\n type ListToolsResponse,\n type ToolSource,\n} from './IMCPServer';\nimport { ToolSelectorPolicy, type ToolSelectorConfig } from './ToolSelectorPolicy';\n\n/**\n * Per-agent {@link IToolSet} view over a shared, policy-free {@link ToolSource}, applying the\n * enable/disable/preload/approval selectors. Many can wrap one source without policy bleed.\n */\nexport class ToolSet implements IToolSet {\n readonly name: string;\n readonly id: string;\n readonly description?: string | undefined;\n readonly preload: boolean;\n readonly hasPreloadedTools: boolean;\n\n private readonly source: ToolSource;\n private readonly policy: ToolSelectorPolicy;\n\n constructor(params: { source: ToolSource; selectors: ToolSelectorConfig; preload: boolean }) {\n this.source = params.source;\n this.name = params.source.name;\n this.id = params.source.id;\n this.description = params.source.description;\n this.policy = new ToolSelectorPolicy({\n selectors: params.selectors,\n preload: params.preload,\n });\n this.preload = this.policy.preload;\n this.hasPreloadedTools = this.policy.hasPreloadedTools;\n }\n\n getAllowedToolNamesForSandbox(): string[] | undefined {\n return this.policy.allowedNamesForSandbox();\n }\n\n async listTools(): Promise<ListToolsResponse> {\n const response = await this.source.listTools();\n if (isAuthRequired(response)) return response;\n\n const tools = response.result.tools;\n const missingTools = this.policy.missingEnableLiterals(tools);\n if (missingTools.length > 0) {\n throw new McpConnectionError(\n `Requested tools not found in MCP server ${this.name}: ${missingTools.join(', ')}`,\n 422,\n );\n }\n\n return {\n result: { tools: this.policy.filterAndAnnotate(tools) },\n wasInitialized: response.wasInitialized,\n };\n }\n\n async callTool(params: CallToolRequest['params'], decision?: ApprovalDecision): Promise<CallToolResponse> {\n // Prime the source and surface auth-required before the annotation-based allow/approval checks\n // (which would otherwise see missing annotations and wrongly 403).\n const listed = await this.source.listTools();\n if (isAuthRequired(listed)) return listed;\n const annotations = findAnnotations(listed.result.tools, params.name);\n\n await this.assertToolAllowed(params.name, annotations);\n\n const tool_info = await this.buildToolCallInfo(params, annotations);\n if (!decision && tool_info.is_approval_required) {\n return { approvalRequired: { tool_info } };\n }\n\n if (decision?.status === 'deny') {\n const reason = decision.reason ?? 'no reason provided';\n return toolResultResponse({\n text: JSON.stringify({ error: `User denied tool call: ${reason}` }),\n isError: true,\n });\n }\n\n const response = await this.source.callTool(params, decision);\n // The priming listTools() may have captured the first-connect init; carry it forward since the\n // subsequent callTool sees an already-open connection and reports none.\n if (listed.wasInitialized && isCallToolResponseResult(response) && !response.wasInitialized) {\n return { ...response, wasInitialized: listed.wasInitialized };\n }\n return response;\n }\n\n async toolCallInfo(\n params: CallToolRequest['params'],\n resolveUnderlyingTool?: boolean,\n ): Promise<InternalToolCallInfo> {\n const annotations = await this.resolveAnnotations(params.name);\n return this.buildToolCallInfo(params, annotations, resolveUnderlyingTool);\n }\n\n private async assertToolAllowed(toolName: string, annotations: ToolAnnotations | undefined): Promise<void> {\n const allowed = await this.policy.isAllowed(toolName, () => Promise.resolve(annotations));\n if (!allowed) {\n throw new McpConnectionError(`Tool '${toolName}' is not allowed on MCP server ${this.name}`, 403);\n }\n }\n\n private async buildToolCallInfo(\n params: CallToolRequest['params'],\n annotations: ToolAnnotations | undefined,\n resolveUnderlyingTool?: boolean,\n ): Promise<InternalToolCallInfo> {\n return {\n ...(await this.source.toolCallInfo(params, resolveUnderlyingTool)),\n is_approval_required: this.policy.requiresApproval(params.name, annotations),\n };\n }\n\n private async resolveAnnotations(toolName: string): Promise<ToolAnnotations | undefined> {\n const listed = await this.source.listTools();\n if (isAuthRequired(listed)) return undefined;\n return findAnnotations(listed.result.tools, toolName);\n }\n}\n\nfunction findAnnotations(tools: AgentToolSchema[], toolName: string): ToolAnnotations | undefined {\n return tools.find(t => t.name === toolName)?.annotations;\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
// src/core/mcp/ToolSet.ts
|
|
2
|
+
import { McpConnectionError } from "../errors.mjs";
|
|
3
|
+
import {
|
|
4
|
+
isAuthRequired,
|
|
5
|
+
isCallToolResponseResult,
|
|
6
|
+
toolResultResponse
|
|
7
|
+
} from "./IMCPServer.mjs";
|
|
8
|
+
import { ToolSelectorPolicy } from "./ToolSelectorPolicy.mjs";
|
|
9
|
+
var ToolSet = class {
|
|
10
|
+
name;
|
|
11
|
+
id;
|
|
12
|
+
description;
|
|
13
|
+
preload;
|
|
14
|
+
hasPreloadedTools;
|
|
15
|
+
source;
|
|
16
|
+
policy;
|
|
17
|
+
constructor(params) {
|
|
18
|
+
this.source = params.source;
|
|
19
|
+
this.name = params.source.name;
|
|
20
|
+
this.id = params.source.id;
|
|
21
|
+
this.description = params.source.description;
|
|
22
|
+
this.policy = new ToolSelectorPolicy({
|
|
23
|
+
selectors: params.selectors,
|
|
24
|
+
preload: params.preload
|
|
25
|
+
});
|
|
26
|
+
this.preload = this.policy.preload;
|
|
27
|
+
this.hasPreloadedTools = this.policy.hasPreloadedTools;
|
|
28
|
+
}
|
|
29
|
+
getAllowedToolNamesForSandbox() {
|
|
30
|
+
return this.policy.allowedNamesForSandbox();
|
|
31
|
+
}
|
|
32
|
+
async listTools() {
|
|
33
|
+
const response = await this.source.listTools();
|
|
34
|
+
if (isAuthRequired(response)) return response;
|
|
35
|
+
const tools = response.result.tools;
|
|
36
|
+
const missingTools = this.policy.missingEnableLiterals(tools);
|
|
37
|
+
if (missingTools.length > 0) {
|
|
38
|
+
throw new McpConnectionError(
|
|
39
|
+
`Requested tools not found in MCP server ${this.name}: ${missingTools.join(", ")}`,
|
|
40
|
+
422
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
return {
|
|
44
|
+
result: { tools: this.policy.filterAndAnnotate(tools) },
|
|
45
|
+
wasInitialized: response.wasInitialized
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
async callTool(params, decision) {
|
|
49
|
+
const listed = await this.source.listTools();
|
|
50
|
+
if (isAuthRequired(listed)) return listed;
|
|
51
|
+
const annotations = findAnnotations(listed.result.tools, params.name);
|
|
52
|
+
await this.assertToolAllowed(params.name, annotations);
|
|
53
|
+
const tool_info = await this.buildToolCallInfo(params, annotations);
|
|
54
|
+
if (!decision && tool_info.is_approval_required) {
|
|
55
|
+
return { approvalRequired: { tool_info } };
|
|
56
|
+
}
|
|
57
|
+
if (decision?.status === "deny") {
|
|
58
|
+
const reason = decision.reason ?? "no reason provided";
|
|
59
|
+
return toolResultResponse({
|
|
60
|
+
text: JSON.stringify({ error: `User denied tool call: ${reason}` }),
|
|
61
|
+
isError: true
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
const response = await this.source.callTool(params, decision);
|
|
65
|
+
if (listed.wasInitialized && isCallToolResponseResult(response) && !response.wasInitialized) {
|
|
66
|
+
return { ...response, wasInitialized: listed.wasInitialized };
|
|
67
|
+
}
|
|
68
|
+
return response;
|
|
69
|
+
}
|
|
70
|
+
async toolCallInfo(params, resolveUnderlyingTool) {
|
|
71
|
+
const annotations = await this.resolveAnnotations(params.name);
|
|
72
|
+
return this.buildToolCallInfo(params, annotations, resolveUnderlyingTool);
|
|
73
|
+
}
|
|
74
|
+
async assertToolAllowed(toolName, annotations) {
|
|
75
|
+
const allowed = await this.policy.isAllowed(toolName, () => Promise.resolve(annotations));
|
|
76
|
+
if (!allowed) {
|
|
77
|
+
throw new McpConnectionError(`Tool '${toolName}' is not allowed on MCP server ${this.name}`, 403);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
async buildToolCallInfo(params, annotations, resolveUnderlyingTool) {
|
|
81
|
+
return {
|
|
82
|
+
...await this.source.toolCallInfo(params, resolveUnderlyingTool),
|
|
83
|
+
is_approval_required: this.policy.requiresApproval(params.name, annotations)
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
async resolveAnnotations(toolName) {
|
|
87
|
+
const listed = await this.source.listTools();
|
|
88
|
+
if (isAuthRequired(listed)) return void 0;
|
|
89
|
+
return findAnnotations(listed.result.tools, toolName);
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
function findAnnotations(tools, toolName) {
|
|
93
|
+
return tools.find((t) => t.name === toolName)?.annotations;
|
|
94
|
+
}
|
|
95
|
+
export {
|
|
96
|
+
ToolSet
|
|
97
|
+
};
|
|
98
|
+
//# sourceMappingURL=ToolSet.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/core/mcp/ToolSet.ts"],"sourcesContent":["import type { CallToolRequest, ToolAnnotations } from '@modelcontextprotocol/sdk/types.js';\nimport { McpConnectionError } from '../errors';\nimport type { ApprovalDecision } from '../events/schema';\nimport type { InternalToolCallInfo } from '../llm/LLMTypes';\nimport {\n isAuthRequired,\n isCallToolResponseResult,\n toolResultResponse,\n type AgentToolSchema,\n type CallToolResponse,\n type IToolSet,\n type ListToolsResponse,\n type ToolSource,\n} from './IMCPServer';\nimport { ToolSelectorPolicy, type ToolSelectorConfig } from './ToolSelectorPolicy';\n\n/**\n * Per-agent {@link IToolSet} view over a shared, policy-free {@link ToolSource}, applying the\n * enable/disable/preload/approval selectors. Many can wrap one source without policy bleed.\n */\nexport class ToolSet implements IToolSet {\n readonly name: string;\n readonly id: string;\n readonly description?: string | undefined;\n readonly preload: boolean;\n readonly hasPreloadedTools: boolean;\n\n private readonly source: ToolSource;\n private readonly policy: ToolSelectorPolicy;\n\n constructor(params: { source: ToolSource; selectors: ToolSelectorConfig; preload: boolean }) {\n this.source = params.source;\n this.name = params.source.name;\n this.id = params.source.id;\n this.description = params.source.description;\n this.policy = new ToolSelectorPolicy({\n selectors: params.selectors,\n preload: params.preload,\n });\n this.preload = this.policy.preload;\n this.hasPreloadedTools = this.policy.hasPreloadedTools;\n }\n\n getAllowedToolNamesForSandbox(): string[] | undefined {\n return this.policy.allowedNamesForSandbox();\n }\n\n async listTools(): Promise<ListToolsResponse> {\n const response = await this.source.listTools();\n if (isAuthRequired(response)) return response;\n\n const tools = response.result.tools;\n const missingTools = this.policy.missingEnableLiterals(tools);\n if (missingTools.length > 0) {\n throw new McpConnectionError(\n `Requested tools not found in MCP server ${this.name}: ${missingTools.join(', ')}`,\n 422,\n );\n }\n\n return {\n result: { tools: this.policy.filterAndAnnotate(tools) },\n wasInitialized: response.wasInitialized,\n };\n }\n\n async callTool(params: CallToolRequest['params'], decision?: ApprovalDecision): Promise<CallToolResponse> {\n // Prime the source and surface auth-required before the annotation-based allow/approval checks\n // (which would otherwise see missing annotations and wrongly 403).\n const listed = await this.source.listTools();\n if (isAuthRequired(listed)) return listed;\n const annotations = findAnnotations(listed.result.tools, params.name);\n\n await this.assertToolAllowed(params.name, annotations);\n\n const tool_info = await this.buildToolCallInfo(params, annotations);\n if (!decision && tool_info.is_approval_required) {\n return { approvalRequired: { tool_info } };\n }\n\n if (decision?.status === 'deny') {\n const reason = decision.reason ?? 'no reason provided';\n return toolResultResponse({\n text: JSON.stringify({ error: `User denied tool call: ${reason}` }),\n isError: true,\n });\n }\n\n const response = await this.source.callTool(params, decision);\n // The priming listTools() may have captured the first-connect init; carry it forward since the\n // subsequent callTool sees an already-open connection and reports none.\n if (listed.wasInitialized && isCallToolResponseResult(response) && !response.wasInitialized) {\n return { ...response, wasInitialized: listed.wasInitialized };\n }\n return response;\n }\n\n async toolCallInfo(\n params: CallToolRequest['params'],\n resolveUnderlyingTool?: boolean,\n ): Promise<InternalToolCallInfo> {\n const annotations = await this.resolveAnnotations(params.name);\n return this.buildToolCallInfo(params, annotations, resolveUnderlyingTool);\n }\n\n private async assertToolAllowed(toolName: string, annotations: ToolAnnotations | undefined): Promise<void> {\n const allowed = await this.policy.isAllowed(toolName, () => Promise.resolve(annotations));\n if (!allowed) {\n throw new McpConnectionError(`Tool '${toolName}' is not allowed on MCP server ${this.name}`, 403);\n }\n }\n\n private async buildToolCallInfo(\n params: CallToolRequest['params'],\n annotations: ToolAnnotations | undefined,\n resolveUnderlyingTool?: boolean,\n ): Promise<InternalToolCallInfo> {\n return {\n ...(await this.source.toolCallInfo(params, resolveUnderlyingTool)),\n is_approval_required: this.policy.requiresApproval(params.name, annotations),\n };\n }\n\n private async resolveAnnotations(toolName: string): Promise<ToolAnnotations | undefined> {\n const listed = await this.source.listTools();\n if (isAuthRequired(listed)) return undefined;\n return findAnnotations(listed.result.tools, toolName);\n }\n}\n\nfunction findAnnotations(tools: AgentToolSchema[], toolName: string): ToolAnnotations | undefined {\n return tools.find(t => t.name === toolName)?.annotations;\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { ChatCompletionTool } from 'openai/resources/chat';
|
|
2
|
+
import type { MCPServerInitInfo } from '../events/schema';
|
|
3
|
+
import type { MCPAuthRequired } from '../mcp/IMCPServer';
|
|
4
|
+
import { type IToolSet } from './IMCPServer';
|
|
5
|
+
export interface MappedMCPTool {
|
|
6
|
+
toolSet: IToolSet;
|
|
7
|
+
originalToolName: string;
|
|
8
|
+
}
|
|
9
|
+
export interface ConvertToolsResult {
|
|
10
|
+
tools: ChatCompletionTool[];
|
|
11
|
+
toolMapping: Map<string, MappedMCPTool>;
|
|
12
|
+
}
|
|
13
|
+
export interface ConvertMCPServersToToolsResult {
|
|
14
|
+
convertedTools: ConvertToolsResult;
|
|
15
|
+
initializationInfo: MCPServerInitInfo[];
|
|
16
|
+
authRequirementInfo: MCPAuthRequired[];
|
|
17
|
+
}
|
|
18
|
+
export declare function convertMCPServersToTools(params: {
|
|
19
|
+
tfyManagedServers: IToolSet[];
|
|
20
|
+
userServers: IToolSet[];
|
|
21
|
+
}): Promise<ConvertMCPServersToToolsResult>;
|
|
22
|
+
//# sourceMappingURL=convertMCPServers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"convertMCPServers.d.ts","sourceRoot":"","sources":["../../../src/core/mcp/convertMCPServers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,KAAK,QAAQ,EAAkB,MAAM,cAAc,CAAC;AAG7D,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,QAAQ,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,kBAAkB,EAAE,CAAC;IAC5B,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;CACzC;AAED,MAAM,WAAW,8BAA8B;IAC7C,cAAc,EAAE,kBAAkB,CAAC;IACnC,kBAAkB,EAAE,iBAAiB,EAAE,CAAC;IACxC,mBAAmB,EAAE,eAAe,EAAE,CAAC;CACxC;AAED,wBAAsB,wBAAwB,CAAC,MAAM,EAAE;IACrD,iBAAiB,EAAE,QAAQ,EAAE,CAAC;IAC9B,WAAW,EAAE,QAAQ,EAAE,CAAC;CACzB,GAAG,OAAO,CAAC,8BAA8B,CAAC,CAiE1C"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/core/mcp/convertMCPServers.ts
|
|
21
|
+
var convertMCPServers_exports = {};
|
|
22
|
+
__export(convertMCPServers_exports, {
|
|
23
|
+
convertMCPServersToTools: () => convertMCPServersToTools
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(convertMCPServers_exports);
|
|
26
|
+
var import_IMCPServer = require("./IMCPServer.js");
|
|
27
|
+
var import_toolNames = require("./toolNames.js");
|
|
28
|
+
async function convertMCPServersToTools(params) {
|
|
29
|
+
const { tfyManagedServers, userServers } = params;
|
|
30
|
+
const tools = [];
|
|
31
|
+
const toolMapping = /* @__PURE__ */ new Map();
|
|
32
|
+
const initializationInfo = [];
|
|
33
|
+
const authRequirementInfo = [];
|
|
34
|
+
const registeredNames = /* @__PURE__ */ new Set();
|
|
35
|
+
const filteredUserServers = userServers.filter((s) => s.preload || s.hasPreloadedTools);
|
|
36
|
+
const sortedTfyServers = [...tfyManagedServers].sort((a, b) => a.name > b.name ? 1 : -1);
|
|
37
|
+
const sortedUserServers = [...filteredUserServers].sort((a, b) => a.name > b.name ? 1 : -1);
|
|
38
|
+
const allServers = [...sortedTfyServers, ...sortedUserServers];
|
|
39
|
+
const listResults = await Promise.all(
|
|
40
|
+
allServers.map(async (server) => ({ serverName: server.name, response: await server.listTools() }))
|
|
41
|
+
);
|
|
42
|
+
for (let i = 0; i < allServers.length; i++) {
|
|
43
|
+
const listResult = listResults[i];
|
|
44
|
+
if (!listResult) continue;
|
|
45
|
+
const { serverName, response: listResponse } = listResult;
|
|
46
|
+
if ((0, import_IMCPServer.isAuthRequired)(listResponse)) {
|
|
47
|
+
authRequirementInfo.push(listResponse.authRequired);
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
const { result: mcpTools, wasInitialized } = listResponse;
|
|
51
|
+
if (wasInitialized) {
|
|
52
|
+
initializationInfo.push(wasInitialized);
|
|
53
|
+
}
|
|
54
|
+
const toolSet = allServers[i];
|
|
55
|
+
if (toolSet === void 0) {
|
|
56
|
+
throw new Error(`Unreachable: missing tool set at index ${String(i)}`);
|
|
57
|
+
}
|
|
58
|
+
const sortedTools = [...mcpTools.tools].sort((a, b) => a.name > b.name ? 1 : -1);
|
|
59
|
+
for (const mcpTool of sortedTools) {
|
|
60
|
+
if (!mcpTool.preload) continue;
|
|
61
|
+
const { name: toolName } = (0, import_toolNames.getUniqueSanitizedToolName)(mcpTool.name, registeredNames);
|
|
62
|
+
registeredNames.add(toolName);
|
|
63
|
+
const description = `mcp server: ${serverName}
|
|
64
|
+
${mcpTool.description ?? ""}`;
|
|
65
|
+
tools.push({
|
|
66
|
+
type: "function",
|
|
67
|
+
function: {
|
|
68
|
+
name: toolName,
|
|
69
|
+
description,
|
|
70
|
+
parameters: {
|
|
71
|
+
type: "object",
|
|
72
|
+
properties: mcpTool.inputSchema.properties ?? {},
|
|
73
|
+
required: mcpTool.inputSchema.required ?? []
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
toolMapping.set(toolName, {
|
|
78
|
+
toolSet,
|
|
79
|
+
originalToolName: mcpTool.name
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return { convertedTools: { tools, toolMapping }, initializationInfo, authRequirementInfo };
|
|
84
|
+
}
|
|
85
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
86
|
+
0 && (module.exports = {
|
|
87
|
+
convertMCPServersToTools
|
|
88
|
+
});
|
|
89
|
+
//# sourceMappingURL=convertMCPServers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/core/mcp/convertMCPServers.ts"],"sourcesContent":["import type { ChatCompletionTool } from 'openai/resources/chat';\nimport type { MCPServerInitInfo } from '../events/schema';\nimport type { MCPAuthRequired } from '../mcp/IMCPServer';\nimport { type IToolSet, isAuthRequired } from './IMCPServer';\nimport { getUniqueSanitizedToolName } from './toolNames';\n\nexport interface MappedMCPTool {\n toolSet: IToolSet;\n originalToolName: string;\n}\n\nexport interface ConvertToolsResult {\n tools: ChatCompletionTool[];\n toolMapping: Map<string, MappedMCPTool>;\n}\n\nexport interface ConvertMCPServersToToolsResult {\n convertedTools: ConvertToolsResult;\n initializationInfo: MCPServerInitInfo[];\n authRequirementInfo: MCPAuthRequired[];\n}\n\nexport async function convertMCPServersToTools(params: {\n tfyManagedServers: IToolSet[];\n userServers: IToolSet[];\n}): Promise<ConvertMCPServersToToolsResult> {\n const { tfyManagedServers, userServers } = params;\n const tools: ChatCompletionTool[] = [];\n const toolMapping = new Map<string, MappedMCPTool>();\n const initializationInfo: MCPServerInitInfo[] = [];\n const authRequirementInfo: MCPAuthRequired[] = [];\n const registeredNames = new Set<string>();\n\n // Skip non-preloaded servers that have no preloaded tools, to avoid unnecessary listTools() calls and OAuth triggers.\n // Non-preloaded servers with some preloaded tools are kept so those tools can be registered.\n const filteredUserServers = userServers.filter(s => s.preload || s.hasPreloadedTools);\n\n // TFY-managed servers first so they claim their original tool names before user servers.\n const sortedTfyServers = [...tfyManagedServers].sort((a, b) => (a.name > b.name ? 1 : -1));\n const sortedUserServers = [...filteredUserServers].sort((a, b) => (a.name > b.name ? 1 : -1));\n const allServers = [...sortedTfyServers, ...sortedUserServers];\n\n const listResults = await Promise.all(\n allServers.map(async server => ({ serverName: server.name, response: await server.listTools() })),\n );\n\n for (let i = 0; i < allServers.length; i++) {\n const listResult = listResults[i];\n if (!listResult) continue;\n const { serverName, response: listResponse } = listResult;\n if (isAuthRequired(listResponse)) {\n authRequirementInfo.push(listResponse.authRequired);\n continue;\n }\n const { result: mcpTools, wasInitialized } = listResponse;\n if (wasInitialized) {\n initializationInfo.push(wasInitialized);\n }\n\n const toolSet = allServers[i];\n if (toolSet === undefined) {\n throw new Error(`Unreachable: missing tool set at index ${String(i)}`);\n }\n const sortedTools = [...mcpTools.tools].sort((a, b) => (a.name > b.name ? 1 : -1));\n for (const mcpTool of sortedTools) {\n if (!mcpTool.preload) continue;\n const { name: toolName } = getUniqueSanitizedToolName(mcpTool.name, registeredNames);\n registeredNames.add(toolName);\n const description = `mcp server: ${serverName}\\n${mcpTool.description ?? ''}`;\n tools.push({\n type: 'function',\n function: {\n name: toolName,\n description: description,\n parameters: {\n type: 'object',\n properties: mcpTool.inputSchema.properties ?? {},\n required: mcpTool.inputSchema.required ?? [],\n },\n },\n });\n\n toolMapping.set(toolName, {\n toolSet,\n originalToolName: mcpTool.name,\n });\n }\n }\n\n return { convertedTools: { tools, toolMapping }, initializationInfo, authRequirementInfo };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,wBAA8C;AAC9C,uBAA2C;AAkB3C,eAAsB,yBAAyB,QAGH;AAC1C,QAAM,EAAE,mBAAmB,YAAY,IAAI;AAC3C,QAAM,QAA8B,CAAC;AACrC,QAAM,cAAc,oBAAI,IAA2B;AACnD,QAAM,qBAA0C,CAAC;AACjD,QAAM,sBAAyC,CAAC;AAChD,QAAM,kBAAkB,oBAAI,IAAY;AAIxC,QAAM,sBAAsB,YAAY,OAAO,OAAK,EAAE,WAAW,EAAE,iBAAiB;AAGpF,QAAM,mBAAmB,CAAC,GAAG,iBAAiB,EAAE,KAAK,CAAC,GAAG,MAAO,EAAE,OAAO,EAAE,OAAO,IAAI,EAAG;AACzF,QAAM,oBAAoB,CAAC,GAAG,mBAAmB,EAAE,KAAK,CAAC,GAAG,MAAO,EAAE,OAAO,EAAE,OAAO,IAAI,EAAG;AAC5F,QAAM,aAAa,CAAC,GAAG,kBAAkB,GAAG,iBAAiB;AAE7D,QAAM,cAAc,MAAM,QAAQ;AAAA,IAChC,WAAW,IAAI,OAAM,YAAW,EAAE,YAAY,OAAO,MAAM,UAAU,MAAM,OAAO,UAAU,EAAE,EAAE;AAAA,EAClG;AAEA,WAAS,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK;AAC1C,UAAM,aAAa,YAAY,CAAC;AAChC,QAAI,CAAC,WAAY;AACjB,UAAM,EAAE,YAAY,UAAU,aAAa,IAAI;AAC/C,YAAI,kCAAe,YAAY,GAAG;AAChC,0BAAoB,KAAK,aAAa,YAAY;AAClD;AAAA,IACF;AACA,UAAM,EAAE,QAAQ,UAAU,eAAe,IAAI;AAC7C,QAAI,gBAAgB;AAClB,yBAAmB,KAAK,cAAc;AAAA,IACxC;AAEA,UAAM,UAAU,WAAW,CAAC;AAC5B,QAAI,YAAY,QAAW;AACzB,YAAM,IAAI,MAAM,0CAA0C,OAAO,CAAC,CAAC,EAAE;AAAA,IACvE;AACA,UAAM,cAAc,CAAC,GAAG,SAAS,KAAK,EAAE,KAAK,CAAC,GAAG,MAAO,EAAE,OAAO,EAAE,OAAO,IAAI,EAAG;AACjF,eAAW,WAAW,aAAa;AACjC,UAAI,CAAC,QAAQ,QAAS;AACtB,YAAM,EAAE,MAAM,SAAS,QAAI,6CAA2B,QAAQ,MAAM,eAAe;AACnF,sBAAgB,IAAI,QAAQ;AAC5B,YAAM,cAAc,eAAe,UAAU;AAAA,EAAK,QAAQ,eAAe,EAAE;AAC3E,YAAM,KAAK;AAAA,QACT,MAAM;AAAA,QACN,UAAU;AAAA,UACR,MAAM;AAAA,UACN;AAAA,UACA,YAAY;AAAA,YACV,MAAM;AAAA,YACN,YAAY,QAAQ,YAAY,cAAc,CAAC;AAAA,YAC/C,UAAU,QAAQ,YAAY,YAAY,CAAC;AAAA,UAC7C;AAAA,QACF;AAAA,MACF,CAAC;AAED,kBAAY,IAAI,UAAU;AAAA,QACxB;AAAA,QACA,kBAAkB,QAAQ;AAAA,MAC5B,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO,EAAE,gBAAgB,EAAE,OAAO,YAAY,GAAG,oBAAoB,oBAAoB;AAC3F;","names":[]}
|