first commit
This commit is contained in:
107
core/mcp/codemode.go
Normal file
107
core/mcp/codemode.go
Normal file
@@ -0,0 +1,107 @@
|
||||
//go:build !tinygo && !wasm
|
||||
|
||||
package mcp
|
||||
|
||||
import (
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"github.com/maximhq/bifrost/core/schemas"
|
||||
)
|
||||
|
||||
// CodeMode tool type constants
|
||||
const (
|
||||
ToolTypeListToolFiles string = "listToolFiles"
|
||||
ToolTypeReadToolFile string = "readToolFile"
|
||||
ToolTypeGetToolDocs string = "getToolDocs"
|
||||
ToolTypeExecuteToolCode string = "executeToolCode"
|
||||
)
|
||||
|
||||
// CodeModeLogPrefix is the log prefix for code mode operations
|
||||
const CodeModeLogPrefix = "[CODE MODE]"
|
||||
|
||||
// CodeMode defines the interface for code execution environments.
|
||||
// Implementations can provide different interpreters (Starlark, Lua, JavaScript, etc.)
|
||||
// while maintaining the same tool interface for the ToolsManager.
|
||||
type CodeMode interface {
|
||||
// GetTools returns the code mode meta-tools (listToolFiles, readToolFile, getToolDocs, executeToolCode)
|
||||
// These tools are added to the available tools when a code mode client is connected.
|
||||
GetTools() []schemas.ChatTool
|
||||
|
||||
// ExecuteTool handles a code mode tool call by name.
|
||||
// Returns the response message and any error that occurred.
|
||||
ExecuteTool(ctx *schemas.BifrostContext, toolCall schemas.ChatAssistantMessageToolCall) (*schemas.ChatMessage, error)
|
||||
|
||||
// IsCodeModeTool returns true if the given tool name is a code mode tool.
|
||||
IsCodeModeTool(toolName string) bool
|
||||
|
||||
// GetBindingLevel returns the current code mode binding level (server or tool).
|
||||
GetBindingLevel() schemas.CodeModeBindingLevel
|
||||
|
||||
// UpdateConfig updates the code mode configuration atomically.
|
||||
UpdateConfig(config *CodeModeConfig)
|
||||
|
||||
// SetDependencies sets the dependencies required for code execution.
|
||||
// This is called by MCPManager after construction to inject the dependencies
|
||||
// (ClientManager, plugin pipeline, etc.) that weren't available at CodeMode creation time.
|
||||
SetDependencies(deps *CodeModeDependencies)
|
||||
}
|
||||
|
||||
// CodeModeConfig holds the configuration for a CodeMode implementation.
|
||||
type CodeModeConfig struct {
|
||||
// BindingLevel controls how tools are exposed in the VFS: "server" or "tool"
|
||||
BindingLevel schemas.CodeModeBindingLevel
|
||||
|
||||
// ToolExecutionTimeout is the maximum time allowed for tool execution
|
||||
ToolExecutionTimeout time.Duration
|
||||
}
|
||||
|
||||
// CodeModeDependencies holds the dependencies required by CodeMode implementations.
|
||||
type CodeModeDependencies struct {
|
||||
// ClientManager provides access to MCP clients and their tools
|
||||
ClientManager ClientManager
|
||||
|
||||
// PluginPipelineProvider returns a plugin pipeline for running MCP hooks
|
||||
PluginPipelineProvider func() PluginPipeline
|
||||
|
||||
// ReleasePluginPipeline releases a plugin pipeline back to the pool
|
||||
ReleasePluginPipeline func(pipeline PluginPipeline)
|
||||
|
||||
// FetchNewRequestIDFunc generates unique request IDs for nested tool calls
|
||||
FetchNewRequestIDFunc func(ctx *schemas.BifrostContext) string
|
||||
|
||||
// LogMutex protects concurrent access to logs during code execution
|
||||
LogMutex *sync.Mutex
|
||||
|
||||
// OAuth2Provider handles per-user OAuth token lookup and flow initiation
|
||||
OAuth2Provider schemas.OAuth2Provider
|
||||
}
|
||||
|
||||
// DefaultCodeModeConfig returns the default configuration for CodeMode.
|
||||
func DefaultCodeModeConfig() *CodeModeConfig {
|
||||
return &CodeModeConfig{
|
||||
BindingLevel: schemas.CodeModeBindingLevelServer,
|
||||
ToolExecutionTimeout: schemas.DefaultToolExecutionTimeout,
|
||||
}
|
||||
}
|
||||
|
||||
// codeModeToolNames is a set of all code mode tool names for fast lookup
|
||||
var codeModeToolNames = map[string]bool{
|
||||
ToolTypeListToolFiles: true,
|
||||
ToolTypeReadToolFile: true,
|
||||
ToolTypeGetToolDocs: true,
|
||||
ToolTypeExecuteToolCode: true,
|
||||
}
|
||||
|
||||
// IsCodeModeTool returns true if the given tool name is a code mode tool.
|
||||
// This is a package-level helper function.
|
||||
func IsCodeModeTool(toolName string) bool {
|
||||
return codeModeToolNames[toolName]
|
||||
}
|
||||
|
||||
// toolCallInfo represents a tool call extracted from code.
|
||||
// Used for validating tool calls before auto-execution in agent mode.
|
||||
type toolCallInfo struct {
|
||||
serverName string
|
||||
toolName string
|
||||
}
|
||||
Reference in New Issue
Block a user