internal/approvalgate/routed_asker.go
Rama main · réplica de lectura del repositorio original.
package approvalgate
import (
"context"
acp "github.com/coder/acp-go-sdk"
"github.com/yeomyeonggeori/blueclaw/internal/mcpserver"
)
type ConversationAsker interface {
PermissionAsker
HarnessPermissionAsker
Serves(platform string, conversationID string) bool
}
type routedPermissionAsker struct {
primary ConversationAsker
otherwise PermissionAsker
}
func AskerRoutedBy(primary ConversationAsker, otherwise PermissionAsker) PermissionAsker {
if otherwise == nil {
return primary
}
return routedPermissionAsker{primary: primary, otherwise: otherwise}
}
func (asker routedPermissionAsker) AskPermission(ctx context.Context, approvalRequest mcpserver.ApprovalRequest, question PermissionQuestion) (ApprovalAnswer, AskStatus) {
if asker.primary.Serves(approvalRequest.Platform, approvalRequest.ConversationID) {
return asker.primary.AskPermission(ctx, approvalRequest, question)
}
return asker.otherwise.AskPermission(ctx, approvalRequest, question)
}
func (asker routedPermissionAsker) AskHarnessPermission(ctx context.Context, approvalRequest mcpserver.ApprovalRequest, question HarnessPermissionQuestion) (acp.RequestPermissionOutcome, AskStatus) {
if asker.primary.Serves(approvalRequest.Platform, approvalRequest.ConversationID) {
return asker.primary.AskHarnessPermission(ctx, approvalRequest, question)
}
harnessAsker, canAskHarnessPermission := asker.otherwise.(HarnessPermissionAsker)
if !canAskHarnessPermission {
return acp.RequestPermissionOutcome{}, AskUnreachable
}
return harnessAsker.AskHarnessPermission(ctx, approvalRequest, question)
}