From a3a233776b94b78e5bc82cc94c5e08a365963eb2 Mon Sep 17 00:00:00 2001 From: Forhad Hosain Date: Wed, 26 Nov 2025 15:43:51 +0600 Subject: [PATCH] resolve agent variable before performing type inference --- packages/core/src/Components/APIEndpoint.class.ts | 7 +------ packages/core/src/Components/Component.class.ts | 15 ++++++++++++++- .../core/src/Components/ServerlessCode.class.ts | 5 +---- 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/packages/core/src/Components/APIEndpoint.class.ts b/packages/core/src/Components/APIEndpoint.class.ts index c4b5366c..c24f189b 100644 --- a/packages/core/src/Components/APIEndpoint.class.ts +++ b/packages/core/src/Components/APIEndpoint.class.ts @@ -246,12 +246,7 @@ async function resolveTemplateVariables(data: any, input: any, agent: Agent): Pr if (isKeyTemplateVar(value as string)) { data[key] = await parseKey(value as string, agent.teamId); } else if (isTemplateVar(value as string)) { - // Parse using input values first, then agent variables. - // This correctly resolves cases where input values reference agent variables with the same name. - // Example: agent variables { user_id: "123" }, input { user_id: "{{user_id}}" }. - data[key] = TemplateString(value as string) - .parse(input) - .parse(agent.agentVariables).result; + data[key] = TemplateString(value as string).parse(input).result; } } diff --git a/packages/core/src/Components/Component.class.ts b/packages/core/src/Components/Component.class.ts index f3315328..a6279a7b 100644 --- a/packages/core/src/Components/Component.class.ts +++ b/packages/core/src/Components/Component.class.ts @@ -3,6 +3,7 @@ import { IAgent as Agent } from '@sre/types/Agent.types'; import { Logger } from '@sre/helpers/Log.helper'; import { performTypeInference } from '@sre/helpers/TypeChecker.helper'; import { hookableClass, hookAsync } from '@sre/Core/HookService'; +import { TemplateString } from '@sre/helpers/TemplateString.helper'; export type TComponentSchema = { name: string; @@ -123,7 +124,19 @@ export class Component { if (agent.isKilled()) { throw new Error('Agent killed'); } - const _input = await performTypeInference(input, config?.inputs, agent); + + let _input = {}; + + // #region Resolve agent variables so that: + // - type inference works correctly + // - we don’t need a separate resolution step when the variable name + // matches the component input name + for (let [key, value] of Object.entries(input)) { + _input[key] = TemplateString(value as string).parse(agent.agentVariables).result; + } + // #endregion + + _input = await performTypeInference(_input, config?.inputs, agent); // modify the input object for component's process method for (const [key, value] of Object.entries(_input)) { diff --git a/packages/core/src/Components/ServerlessCode.class.ts b/packages/core/src/Components/ServerlessCode.class.ts index fd63f35c..4d6d2a0b 100644 --- a/packages/core/src/Components/ServerlessCode.class.ts +++ b/packages/core/src/Components/ServerlessCode.class.ts @@ -41,10 +41,7 @@ export class ServerlessCode extends Component { let codeInputs = {}; for (let field of componentInputs) { - // Parse using input values first, then agent variables. - // This correctly resolves cases where input values reference agent variables with the same name. - // Example: agent variables { user_id: "123" }, input { user_id: "{{user_id}}" }. - const inputValue = TemplateString(input[field.name]).parse(input).parse(agent.agentVariables).result; + const inputValue = TemplateString(input[field.name]).parse(input).result; const _type = typeof inputValue;