From ada126d9b787eb731a9d88a48d4e9170eb90e86f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Braulio=20Gonz=C3=A1lez=20Valido?= Date: Thu, 21 May 2026 15:15:44 +0100 Subject: [PATCH] test(ai-builder): Validate user-proxy tool outputs against api-types schemas (no-changelog) (#30905) Co-authored-by: Claude Opus 4.7 (1M context) --- .../evaluations/utils/user-proxy/tools.ts | 22 ++++++++++++++----- 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/packages/@n8n/instance-ai/evaluations/utils/user-proxy/tools.ts b/packages/@n8n/instance-ai/evaluations/utils/user-proxy/tools.ts index ae819f095de..1340c9b7f06 100644 --- a/packages/@n8n/instance-ai/evaluations/utils/user-proxy/tools.ts +++ b/packages/@n8n/instance-ai/evaluations/utils/user-proxy/tools.ts @@ -1,5 +1,6 @@ // Decision schema (structured-output target) + encoders to InstanceAiConfirmRequest. +import { domainAccessActionSchema, instanceGatewayResourceDecisionSchema } from '@n8n/api-types'; import type { InstanceAiConfirmRequest } from '@n8n/api-types'; import { z } from 'zod'; @@ -99,13 +100,22 @@ export function encodeConfirmationDecision( ...(decision.userInput ? { userInput: decision.userInput } : {}), }; - case 'respond_to_domain_access': - return decision.response === 'deny' - ? { kind: 'domainAccessDeny' } - : { kind: 'domainAccessApprove', domainAccessAction: decision.response }; + case 'respond_to_domain_access': { + if (decision.response === 'deny') return { kind: 'domainAccessDeny' }; + const parsed = domainAccessActionSchema.safeParse(decision.response); + return { + kind: 'domainAccessApprove', + domainAccessAction: parsed.success ? parsed.data : 'allow_once', + }; + } - case 'pick_resource_decision': - return { kind: 'resourceDecision', resourceDecision: decision.decision }; + case 'pick_resource_decision': { + const parsed = instanceGatewayResourceDecisionSchema.safeParse(decision.decision); + return { + kind: 'resourceDecision', + resourceDecision: parsed.success ? parsed.data : 'allowOnce', + }; + } case 'send_follow_up_message': case 'declare_done':