mlld
Version:
mlld: a modular prompt scripting language
786 lines (783 loc) • 31.2 kB
JavaScript
import { prepareValueForShadow } from './chunk-3BKXIDNI.mjs';
import { interpolate, AutoUnwrapManager, extractSection } from './chunk-FYMHT7UG.mjs';
import { InterpolationContext } from './chunk-RZIZRJBS.mjs';
import { logger } from './chunk-XGMRAGIT.mjs';
import { MlldInterpreterError } from './chunk-YMCO2JI3.mjs';
import { isTemplateExecutable, isCommandExecutable, isCodeExecutable, isCommandRefExecutable, isSectionExecutable, isResolverExecutable } from './chunk-6BOVVHHZ.mjs';
import { isExecutableVariable } from './chunk-V5L6FBQT.mjs';
import { createObjectVariable, createArrayVariable, createPrimitiveVariable, createSimpleTextVariable } from './chunk-TU56GBG3.mjs';
import { isLoadContentResultArray, isLoadContentResult } from './chunk-444AWGDO.mjs';
import { __name, __publicField } from './chunk-OMKLS24H.mjs';
// interpreter/eval/with-clause.ts
async function applyWithClause(input, withClause, env) {
let result = input;
if (withClause.pipeline && withClause.pipeline.length > 0) {
const format = withClause.format;
const { executePipeline } = await import('./pipeline-HBV22AHW.mjs');
result = await executePipeline(result, withClause.pipeline, env, void 0, format);
}
if (withClause.trust) {
validateTrust(result, withClause.trust);
}
if (withClause.needs) {
await checkDependencies(withClause.needs, env);
}
return {
value: result,
env,
stdout: result,
stderr: "",
exitCode: 0
};
}
__name(applyWithClause, "applyWithClause");
function validateTrust(result, trustLevel) {
if (trustLevel === "never") {
throw new MlldInterpreterError('Trust level "never" not yet implemented');
}
}
__name(validateTrust, "validateTrust");
async function checkDependencies(needs, env) {
if (needs.file) {
const exists = await env.fileSystem.exists(needs.file);
if (!exists) {
throw new MlldInterpreterError(`Required file not found: ${needs.file}`);
}
}
}
__name(checkDependencies, "checkDependencies");
// interpreter/eval/exec-invocation.ts
var _a;
var SimpleMetadataShelf = (_a = class {
constructor() {
__publicField(this, "shelf", /* @__PURE__ */ new Map());
}
storeMetadata(value) {
if (isLoadContentResultArray(value)) {
for (const item of value) {
if (isLoadContentResult(item)) {
this.shelf.set(item.content, item);
}
}
} else if (isLoadContentResult(value)) {
this.shelf.set(value.content, value);
}
}
restoreMetadata(value) {
if (!Array.isArray(value)) return value;
const restored = [];
let hasRestorable = false;
for (const item of value) {
if (typeof item === "string" && this.shelf.has(item)) {
restored.push(this.shelf.get(item));
hasRestorable = true;
} else {
restored.push(item);
}
}
return hasRestorable ? restored : value;
}
clear() {
this.shelf.clear();
}
}, __name(_a, "SimpleMetadataShelf"), _a);
var metadataShelf = new SimpleMetadataShelf();
async function evaluateExecInvocation(node, env) {
if (process.env.DEBUG_WHEN || process.env.DEBUG_EXEC) {
logger.debug("evaluateExecInvocation called with:", {
commandRef: node.commandRef
});
}
let commandName;
let args = [];
if (!node.commandRef && node.name) {
commandName = node.name;
args = node.arguments || [];
} else if (node.commandRef) {
if (node.commandRef.name) {
commandName = node.commandRef.name;
args = node.commandRef.args || [];
} else if (typeof node.commandRef.identifier === "string") {
commandName = node.commandRef.identifier;
args = node.commandRef.args || [];
} else if (Array.isArray(node.commandRef.identifier) && node.commandRef.identifier.length > 0) {
const identifierNode = node.commandRef.identifier[0];
if (identifierNode.type === "VariableReference" && identifierNode.identifier) {
commandName = identifierNode.identifier;
} else if (identifierNode.type === "Text" && identifierNode.content) {
commandName = identifierNode.content;
} else {
throw new Error("Unable to extract command name from identifier array");
}
args = node.commandRef.args || [];
} else {
throw new Error("CommandReference missing both name and identifier");
}
} else {
throw new Error("ExecInvocation node missing both commandRef and name");
}
if (!commandName) {
throw new MlldInterpreterError("ExecInvocation has no command identifier");
}
let variable;
const commandRefWithObject = node.commandRef;
if (node.commandRef && commandRefWithObject.objectReference) {
const objectRef = commandRefWithObject.objectReference;
const objectVar = env.getVariable(objectRef.identifier);
if (!objectVar) {
throw new MlldInterpreterError(`Object not found: ${objectRef.identifier}`);
}
const { extractVariableValue } = await import('./variable-resolution-SVHB4DCD.mjs');
const objectValue = await extractVariableValue(objectVar, env);
if (process.env.DEBUG_EXEC) {
logger.debug("Object reference in exec invocation", {
objectRef: objectRef.identifier,
objectVarType: objectVar.type,
objectVarValue: typeof objectVar.value,
objectVarIsComplex: objectVar.isComplex,
objectValueType: typeof objectValue,
isString: typeof objectValue === "string",
objectKeys: typeof objectValue === "object" && objectValue !== null ? Object.keys(objectValue) : "not-object",
objectValue: typeof objectValue === "object" && objectValue !== null ? JSON.stringify(objectValue, null, 2).substring(0, 500) : objectValue
});
}
if (objectRef.fields && objectRef.fields.length > 0) {
let currentValue = objectValue;
for (const field of objectRef.fields) {
if (process.env.DEBUG_EXEC) {
logger.debug("Accessing field", {
fieldType: field.type,
fieldValue: field.value,
currentValueType: typeof currentValue,
currentValueKeys: typeof currentValue === "object" && currentValue !== null ? Object.keys(currentValue) : "not-object"
});
}
if (typeof currentValue === "object" && currentValue !== null) {
currentValue = currentValue[field.value];
if (process.env.DEBUG_EXEC) {
logger.debug("Field access result", {
fieldValue: field.value,
resultType: typeof currentValue,
resultKeys: typeof currentValue === "object" && currentValue !== null ? Object.keys(currentValue) : "not-object"
});
}
} else {
throw new MlldInterpreterError(`Cannot access field ${field.value} on non-object`);
}
}
if (typeof currentValue === "object" && currentValue !== null) {
const fieldValue = currentValue[commandName];
variable = fieldValue;
}
} else {
if (typeof objectValue === "object" && objectValue !== null) {
let fieldValue;
if (objectValue.type === "object" && objectValue.properties) {
fieldValue = objectValue.properties[commandName];
} else {
fieldValue = objectValue[commandName];
}
variable = fieldValue;
}
}
if (!variable) {
throw new MlldInterpreterError(`Method not found: ${commandName} on ${objectRef.identifier}`);
}
if (typeof variable === "object" && variable !== null && "__executable" in variable && variable.__executable) {
let metadata = variable.metadata || {};
if (metadata.capturedShadowEnvs && typeof metadata.capturedShadowEnvs === "object") {
const needsDeserialization = Object.entries(metadata.capturedShadowEnvs).some(([lang, env2]) => env2 && !(env2 instanceof Map));
if (needsDeserialization) {
metadata = {
...metadata,
capturedShadowEnvs: deserializeShadowEnvs(metadata.capturedShadowEnvs)
};
}
}
if (process.env.DEBUG_MODULE_EXPORT || process.env.DEBUG_EXEC) {
console.error("[DEBUG] Converting __executable object to ExecutableVariable:", {
commandName,
hasMetadata: !!metadata,
hasCapturedEnvs: !!metadata.capturedShadowEnvs,
metadata
});
}
const { createExecutableVariable } = await import('./VariableFactories-BQT4D3YO.mjs');
variable = createExecutableVariable(commandName, "command", "", variable.paramNames || [], void 0, {
directive: "exe",
syntax: "braces",
hasInterpolation: false,
isMultiLine: false
}, {
executableDef: variable.executableDef,
...metadata
});
}
} else {
variable = env.getVariable(commandName);
if (!variable) {
throw new MlldInterpreterError(`Command not found: ${commandName}`);
}
}
if (!isExecutableVariable(variable)) {
throw new MlldInterpreterError(`Variable ${commandName} is not executable (type: ${variable.type})`);
}
if (variable.metadata?.isBuiltinTransformer && variable.metadata?.transformerImplementation) {
if (commandName === "typeof" || commandName === "TYPEOF") {
if (args.length > 0) {
const arg = args[0];
if (arg && typeof arg === "object" && "type" in arg && arg.type === "VariableReference") {
const varRef = arg;
const varName = varRef.identifier;
const varObj = env.getVariable(varName);
if (varObj) {
let typeInfo = varObj.type;
if (varObj.type === "simple-text" && "subtype" in varObj) {
const subtype = varObj.subtype;
if (subtype && subtype !== "simple" && subtype !== "interpolated-text") {
typeInfo = subtype;
}
} else if (varObj.type === "primitive" && "primitiveType" in varObj) {
typeInfo = `primitive (${varObj.primitiveType})`;
} else if (varObj.type === "object") {
const objValue = varObj.value;
if (objValue && typeof objValue === "object") {
const keys = Object.keys(objValue);
typeInfo = `object (${keys.length} properties)`;
}
} else if (varObj.type === "array") {
const arrValue = varObj.value;
if (Array.isArray(arrValue)) {
typeInfo = `array (${arrValue.length} items)`;
}
} else if (varObj.type === "executable") {
const execDef = varObj.metadata?.executableDef;
if (execDef && "type" in execDef) {
typeInfo = `executable (${execDef.type})`;
}
}
if (varObj.source?.directive) {
typeInfo += ` [from /${varObj.source.directive}]`;
}
const result3 = await variable.metadata.transformerImplementation(`__MLLD_VARIABLE_OBJECT__:${typeInfo}`);
if (node.withClause) {
return applyWithClause(String(result3), node.withClause, env);
}
return {
value: String(result3),
env,
stdout: String(result3),
stderr: "",
exitCode: 0
};
}
}
}
}
let inputValue = "";
if (args.length > 0) {
const arg = args[0];
if (typeof arg === "string") {
inputValue = arg;
} else if (arg && typeof arg === "object") {
inputValue = await interpolate([
arg
], env);
} else {
inputValue = String(arg);
}
}
const result2 = await variable.metadata.transformerImplementation(inputValue);
if (node.withClause) {
return applyWithClause(String(result2), node.withClause, env);
}
return {
value: String(result2),
env,
stdout: String(result2),
stderr: "",
exitCode: 0
};
}
const definition = variable.metadata?.executableDef;
if (!definition) {
throw new MlldInterpreterError(`Executable ${commandName} has no definition in metadata`);
}
const execEnv = env.createChild();
const params = definition.paramNames || [];
const evaluatedArgStrings = [];
const evaluatedArgs = [];
for (const arg of args) {
let argValue;
let argValueAny;
if (typeof arg === "string" || typeof arg === "number" || typeof arg === "boolean") {
argValue = String(arg);
argValueAny = arg;
} else if (arg && typeof arg === "object" && "type" in arg) {
switch (arg.type) {
case "object":
const { evaluateDataValue } = await import('./data-value-evaluator-UFIUOP64.mjs');
argValueAny = await evaluateDataValue(arg, env);
argValue = JSON.stringify(argValueAny);
break;
case "array":
const { evaluateDataValue: evalArray } = await import('./data-value-evaluator-UFIUOP64.mjs');
argValueAny = await evalArray(arg, env);
argValue = JSON.stringify(argValueAny);
break;
case "VariableReference":
const varRef = arg;
const varName = varRef.identifier;
const variable2 = env.getVariable(varName);
if (variable2) {
let value = variable2.value;
if (varRef.fields && varRef.fields.length > 0) {
for (const field of varRef.fields) {
if (value && typeof value === "object" && (field.type === "field" || field.type === "numericField")) {
value = value[field.value];
} else if (Array.isArray(value) && (field.type === "index" || field.type === "arrayIndex")) {
const index = parseInt(field.value, 10);
value = isNaN(index) ? void 0 : value[index];
} else {
value = void 0;
break;
}
}
}
argValueAny = value;
if (value === void 0) {
argValue = "undefined";
} else if (typeof value === "object" && value !== null) {
try {
argValue = JSON.stringify(value);
} catch (e) {
argValue = String(value);
}
} else {
argValue = String(value);
}
} else {
argValue = await interpolate([
arg
], env, InterpolationContext.Default);
argValueAny = argValue;
}
break;
case "ExecInvocation":
case "Text":
default:
argValue = await interpolate([
arg
], env, InterpolationContext.Default);
try {
argValueAny = JSON.parse(argValue);
} catch {
argValueAny = argValue;
}
break;
}
} else {
argValue = String(arg);
argValueAny = arg;
}
evaluatedArgStrings.push(argValue);
evaluatedArgs.push(argValueAny);
}
const originalVariables = [];
for (let i = 0; i < args.length; i++) {
const arg = args[i];
if (arg && typeof arg === "object" && "type" in arg && arg.type === "VariableReference") {
const varRef = arg;
const varName = varRef.identifier;
const variable2 = env.getVariable(varName);
if (variable2 && !varRef.fields) {
originalVariables[i] = variable2;
if (process.env.MLLD_DEBUG === "true") {
const subtype = variable2.type === "primitive" && "primitiveType" in variable2 ? variable2.primitiveType : variable2.subtype;
logger.debug(`Preserving original Variable for arg ${i}:`, {
varName,
variableType: variable2.type,
variableSubtype: subtype,
isPrimitive: typeof variable2.value !== "object" || variable2.value === null
});
}
}
}
}
for (let i = 0; i < params.length; i++) {
const paramName = params[i];
const argValue = evaluatedArgs[i];
const argStringValue = evaluatedArgStrings[i];
if (argValue !== void 0) {
let paramVar;
const originalVar = originalVariables[i];
if (originalVar) {
paramVar = {
...originalVar,
name: paramName,
metadata: {
...originalVar.metadata,
isSystem: true,
isParameter: true
}
};
if (process.env.MLLD_DEBUG === "true") {
const subtype = paramVar.type === "primitive" && "primitiveType" in paramVar ? paramVar.primitiveType : paramVar.subtype;
logger.debug(`Using original Variable for param ${paramName}:`, {
type: paramVar.type,
subtype,
hasMetadata: !!paramVar.metadata
});
}
} else if (typeof argValue === "object" && argValue !== null && !Array.isArray(argValue)) {
paramVar = createObjectVariable(paramName, argValue, true, {
directive: "var",
syntax: "object",
hasInterpolation: false,
isMultiLine: false
}, {
isSystem: true,
isParameter: true
});
} else if (Array.isArray(argValue)) {
paramVar = createArrayVariable(paramName, argValue, true, {
directive: "var",
syntax: "array",
hasInterpolation: false,
isMultiLine: false
}, {
isSystem: true,
isParameter: true
});
} else {
if (typeof argValue === "number" || typeof argValue === "boolean" || argValue === null) {
paramVar = createPrimitiveVariable(paramName, argValue, {
directive: "var",
syntax: "literal",
hasInterpolation: false,
isMultiLine: false
}, {
isSystem: true,
isParameter: true
});
} else {
paramVar = createSimpleTextVariable(paramName, argStringValue, {
directive: "var",
syntax: "quoted",
hasInterpolation: false,
isMultiLine: false
}, {
isSystem: true,
isParameter: true
});
}
}
execEnv.setParameterVariable(paramName, paramVar);
}
}
let result;
if (isTemplateExecutable(definition)) {
result = await interpolate(definition.template, execEnv);
} else if (isCommandExecutable(definition)) {
const command = await interpolate(definition.commandTemplate, execEnv, InterpolationContext.ShellCommand);
if (process.env.DEBUG_WHEN || process.env.DEBUG_EXEC) {
logger.debug("Executing command", {
command,
commandTemplate: definition.commandTemplate
});
}
const envVars = {};
for (let i = 0; i < params.length; i++) {
const paramName = params[i];
const paramVar = execEnv.getVariable(paramName);
if (paramVar && typeof paramVar.value === "object" && paramVar.value !== null) {
try {
envVars[paramName] = JSON.stringify(paramVar.value);
} catch (e) {
envVars[paramName] = evaluatedArgStrings[i];
}
} else {
envVars[paramName] = evaluatedArgStrings[i];
}
}
const commandOutput = await execEnv.executeCommand(command, {
env: envVars
});
if (typeof commandOutput === "string" && commandOutput.trim()) {
const trimmed = commandOutput.trim();
if (trimmed.startsWith("{") && trimmed.endsWith("}") || trimmed.startsWith("[") && trimmed.endsWith("]")) {
try {
result = JSON.parse(trimmed);
} catch {
result = commandOutput;
}
} else {
result = commandOutput;
}
} else {
result = commandOutput;
}
} else if (isCodeExecutable(definition)) {
if (definition.language === "mlld-when") {
const whenExprNode = definition.codeTemplate[0];
if (!whenExprNode || whenExprNode.type !== "WhenExpression") {
throw new MlldInterpreterError("mlld-when executable missing WhenExpression node");
}
const { evaluateWhenExpression } = await import('./when-expression-O2PEVPZS.mjs');
const whenResult = await evaluateWhenExpression(whenExprNode, execEnv);
result = whenResult.value;
} else if (definition.language === "mlld-for") {
const forExprNode = definition.codeTemplate[0];
if (!forExprNode || forExprNode.type !== "ForExpression") {
throw new MlldInterpreterError("mlld-for executable missing ForExpression node");
}
const { evaluateForExpression } = await import('./for-CP5DH4KK.mjs');
result = await evaluateForExpression(forExprNode, execEnv);
} else {
let code;
if (definition.language === "bash" || definition.language === "sh") {
if (Array.isArray(definition.codeTemplate)) {
code = definition.codeTemplate.map((node2) => {
if (typeof node2 === "string") return node2;
if (node2 && typeof node2 === "object" && "content" in node2) return node2.content || "";
return "";
}).join("");
} else if (typeof definition.codeTemplate === "string") {
code = definition.codeTemplate;
} else {
code = "";
}
} else {
code = await interpolate(definition.codeTemplate, execEnv);
}
const { ASTEvaluator } = await import('./ast-evaluator-WZNEUUA2.mjs');
const codeParams = {};
const variableMetadata = {};
for (let i = 0; i < params.length; i++) {
const paramName = params[i];
const paramVar = execEnv.getVariable(paramName);
if (process.env.MLLD_DEBUG === "true") {
logger.debug("Checking parameter:", {
paramName,
hasParamVar: !!paramVar,
paramVarType: paramVar?.type,
isPipelineInput: paramVar?.type === "pipeline-input"
});
}
if (paramVar && paramVar.type === "pipeline-input") {
codeParams[paramName] = paramVar.value;
} else if (paramVar) {
if (definition.language === "bash" || definition.language === "sh") {
codeParams[paramName] = prepareValueForShadow(paramVar);
} else {
if (paramVar.isComplex && paramVar.value && typeof paramVar.value === "object" && "type" in paramVar.value) {
const { extractVariableValue: extractVal } = await import('./variable-resolution-SVHB4DCD.mjs');
const resolvedValue = await extractVal(paramVar, execEnv);
const resolvedVar = {
...paramVar,
value: resolvedValue,
isComplex: false
};
codeParams[paramName] = prepareValueForShadow(resolvedVar);
} else {
metadataShelf.storeMetadata(paramVar.value);
const unwrappedValue = AutoUnwrapManager.unwrap(paramVar.value);
if (unwrappedValue !== paramVar.value) {
const unwrappedVar = {
...paramVar,
value: unwrappedValue,
// Update type based on unwrapped value
type: Array.isArray(unwrappedValue) ? "array" : "text"
};
codeParams[paramName] = prepareValueForShadow(unwrappedVar);
} else {
codeParams[paramName] = prepareValueForShadow(paramVar);
}
}
}
if (definition.language !== "bash" && definition.language !== "sh" && (paramVar.value === null || typeof paramVar.value !== "object")) {
const subtype = paramVar.type === "primitive" && "primitiveType" in paramVar ? paramVar.primitiveType : paramVar.subtype;
variableMetadata[paramName] = {
type: paramVar.type,
subtype,
metadata: paramVar.metadata,
isVariable: true
};
}
if (process.env.DEBUG_EXEC || process.env.MLLD_DEBUG === "true") {
const subtype = paramVar.type === "primitive" && "primitiveType" in paramVar ? paramVar.primitiveType : paramVar.subtype;
logger.debug(`Variable passing for ${paramName}:`, {
variableType: paramVar.type,
variableSubtype: subtype,
hasMetadata: !!paramVar.metadata,
isPrimitive: paramVar.value === null || typeof paramVar.value !== "object",
language: definition.language
});
}
} else {
const argValue = evaluatedArgs[i];
codeParams[paramName] = await ASTEvaluator.evaluateToRuntime(argValue, execEnv);
if (process.env.DEBUG_EXEC) {
logger.debug(`Code parameter ${paramName}:`, {
argValue,
type: typeof argValue,
isNumber: typeof argValue === "number",
evaluatedArgs_i: evaluatedArgs[i],
evaluatedArgStrings_i: evaluatedArgStrings[i]
});
}
}
}
const capturedEnvs = variable.metadata?.capturedShadowEnvs;
if (capturedEnvs && (definition.language === "js" || definition.language === "javascript" || definition.language === "node" || definition.language === "nodejs")) {
codeParams.__capturedShadowEnvs = capturedEnvs;
if (process.env.DEBUG_MODULE_EXPORT || process.env.DEBUG_EXEC) {
console.error("[DEBUG] exec-invocation passing shadow envs:", {
commandName,
hasCapturedEnvs: !!capturedEnvs,
capturedEnvs,
language: definition.language
});
}
}
const codeResult = await execEnv.executeCode(code, definition.language || "javascript", codeParams, Object.keys(variableMetadata).length > 0 ? variableMetadata : void 0);
let processedResult;
if (typeof codeResult === "string" && (codeResult.startsWith('"') || codeResult.startsWith("{") || codeResult.startsWith("[") || codeResult === "null" || codeResult === "true" || codeResult === "false" || /^-?\d+(\.\d+)?$/.test(codeResult))) {
try {
const parsed = JSON.parse(codeResult);
processedResult = parsed;
} catch {
processedResult = codeResult;
}
} else {
processedResult = codeResult;
}
result = metadataShelf.restoreMetadata(processedResult);
metadataShelf.clear();
}
} else if (isCommandRefExecutable(definition)) {
const refName = definition.commandRef;
if (!refName) {
throw new MlldInterpreterError(`Command reference ${commandName} has no target command`);
}
const refCommand = env.getVariable(refName);
if (!refCommand) {
throw new MlldInterpreterError(`Referenced command not found: ${refName}`);
}
const refInvocation = {
commandRef: {
identifier: refName,
args: evaluatedArgs.map((arg) => ({
type: "Text",
content: arg
}))
}
};
const refResult = await evaluateExecInvocation(refInvocation, env);
result = refResult.value;
} else if (isSectionExecutable(definition)) {
const filePath = await interpolate(definition.pathTemplate, execEnv);
const sectionName = await interpolate(definition.sectionTemplate, execEnv);
const fileContent = await execEnv.readFile(filePath);
const llmxmlInstance = env.getLlmxml();
let sectionContent;
try {
const titleWithoutHash = sectionName.replace(/^#+\s*/, "");
sectionContent = await llmxmlInstance.getSection(fileContent, titleWithoutHash, {
includeNested: true
});
} catch (error) {
sectionContent = extractSection(fileContent, sectionName);
}
if (definition.renameTemplate) {
const newTitle = await interpolate(definition.renameTemplate, execEnv);
const lines = sectionContent.split("\n");
if (lines.length > 0 && lines[0].match(/^#+\s/)) {
const newTitleTrimmed = newTitle.trim();
const newHeadingMatch = newTitleTrimmed.match(/^(#+)(\s+(.*))?$/);
if (newHeadingMatch) {
if (!newHeadingMatch[3]) {
const originalText = lines[0].replace(/^#+\s*/, "");
lines[0] = `${newHeadingMatch[1]} ${originalText}`;
} else {
lines[0] = newTitleTrimmed;
}
} else {
const originalLevel = lines[0].match(/^#+/)?.[0] || "#";
lines[0] = `${originalLevel} ${newTitleTrimmed}`;
}
sectionContent = lines.join("\n");
}
}
result = sectionContent;
} else if (isResolverExecutable(definition)) {
let resolverPath = definition.resolverPath;
for (let i = 0; i < params.length; i++) {
const paramName = params[i];
const argValue = evaluatedArgs[i];
if (argValue !== void 0) {
resolverPath = resolverPath.replace(new RegExp(`@${paramName}\\b`, "g"), argValue);
}
}
let payload = void 0;
if (definition.payloadTemplate) {
const payloadStr = await interpolate(definition.payloadTemplate, execEnv);
try {
payload = JSON.parse(payloadStr);
} catch {
payload = payloadStr;
}
}
const resolverManager = env.getResolverManager();
if (!resolverManager) {
throw new MlldInterpreterError("Resolver manager not available");
}
const resolverResult = await resolverManager.resolve(resolverPath, {
context: "exec-invocation",
basePath: env.getBasePath(),
payload
});
if (resolverResult && typeof resolverResult === "object" && "content" in resolverResult) {
result = resolverResult.content;
} else if (typeof resolverResult === "string") {
result = resolverResult;
} else if (resolverResult && typeof resolverResult === "object") {
result = JSON.stringify(resolverResult, null, 2);
} else {
result = String(resolverResult);
}
} else {
throw new MlldInterpreterError(`Unknown executable type: ${definition.type}`);
}
if (node.withClause) {
const stringResult = typeof result === "string" ? result : JSON.stringify(result);
return applyWithClause(stringResult, node.withClause, env);
}
return {
value: result,
env,
// For stdout, convert the parsed value back to string for backward compatibility
// but preserve the actual value in the value field for truthiness checks
stdout: typeof result === "string" ? result : typeof result === "object" && result !== null ? JSON.stringify(result) : String(result),
stderr: "",
exitCode: 0
};
}
__name(evaluateExecInvocation, "evaluateExecInvocation");
function deserializeShadowEnvs(envs) {
const result = {};
for (const [lang, shadowObj] of Object.entries(envs)) {
if (shadowObj && typeof shadowObj === "object") {
const map = /* @__PURE__ */ new Map();
for (const [name, func] of Object.entries(shadowObj)) {
map.set(name, func);
}
result[lang] = map;
}
}
return result;
}
__name(deserializeShadowEnvs, "deserializeShadowEnvs");
export { evaluateExecInvocation };
//# sourceMappingURL=exec-invocation-BKHC2VUW.mjs.map
//# sourceMappingURL=exec-invocation-BKHC2VUW.mjs.map