Ctrl K
ComunidadGuías…

internal/approvalgate/routed_asker.go

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
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)
}