mmt-mcp 1.48.4 → 1.49.0-pre

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/server.cjs CHANGED
@@ -12210,7 +12210,11 @@ function currentValueForToken(spec) {
12210
12210
  return void 0;
12211
12211
  }
12212
12212
  if (alias) {
12213
- const duration = unsignedDurationMs(match[2]);
12213
+ const raw = String(match[2] || "").trim();
12214
+ if (/^[+-]/.test(raw)) {
12215
+ return void 0;
12216
+ }
12217
+ const duration = parseRelativeAmountMs(raw);
12214
12218
  if (duration === void 0) {
12215
12219
  return void 0;
12216
12220
  }
@@ -12234,7 +12238,7 @@ var ACCESSOR_SEGMENT_RE = "(?:\\.[A-Za-z_][A-Za-z0-9_]*|\\[(?:-?\\d+(?::-?\\d*)?
12234
12238
  var ACCESSOR_PATH_RE = `${ACCESSOR_SEGMENT_RE}*`;
12235
12239
  var RANDOM_TOKEN_ARGUMENTS_RE = "\\(\\s*[^(),\\s]+(?:\\s*,\\s*[^(),\\s]+)?\\s*\\)";
12236
12240
  var RANDOM_TOKEN_SPEC_RE = `${TOKEN_NAME_RE}(?:${RANDOM_TOKEN_ARGUMENTS_RE})?`;
12237
- var CURRENT_TOKEN_ARGUMENTS_RE = "\\([+-](?:\\d+(?:\\.\\d+)?(?:ms|s|m|h|d|w))+\\)";
12241
+ var CURRENT_TOKEN_ARGUMENTS_RE = "\\([^()]*\\)";
12238
12242
  var CURRENT_TOKEN_SPEC_RE = `${TOKEN_NAME_RE}(?:${CURRENT_TOKEN_ARGUMENTS_RE})?`;
12239
12243
  var RUNTIME_ARGS_LOOSE_RE = "(?:\\([^)]*\\))?";
12240
12244
  var RUNTIME_SPEC_RE = `${TOKEN_NAME_RE}${RUNTIME_ARGS_LOOSE_RE}`;
@@ -12874,7 +12878,7 @@ function isNonEmptyList(value) {
12874
12878
  var TOKEN_NAME_RE2 = "[A-Za-z_][A-Za-z0-9_\\-]*";
12875
12879
  var RANDOM_TOKEN_ARGUMENTS_RE2 = "\\(\\s*[^(),\\s]+(?:\\s*,\\s*[^(),\\s]+)?\\s*\\)";
12876
12880
  var RANDOM_TOKEN_SPEC_RE2 = `${TOKEN_NAME_RE2}(?:${RANDOM_TOKEN_ARGUMENTS_RE2})?`;
12877
- var CURRENT_TOKEN_ARGUMENTS_RE2 = "\\([+-](?:\\d+(?:\\.\\d+)?(?:ms|s|m|h|d|w))+\\)";
12881
+ var CURRENT_TOKEN_ARGUMENTS_RE2 = "\\([^()]*\\)";
12878
12882
  var CURRENT_TOKEN_SPEC_RE2 = `${TOKEN_NAME_RE2}(?:${CURRENT_TOKEN_ARGUMENTS_RE2})?`;
12879
12883
  var ACCESSOR_SEGMENT_RE2 = "(?:\\.[A-Za-z_][A-Za-z0-9_]*|\\[(?:-?\\d+(?::-?\\d*)?|:-?\\d*|[A-Za-z_][A-Za-z0-9_]*)\\])";
12880
12884
  var ACCESSOR_PATH_RE2 = `${ACCESSOR_SEGMENT_RE2}*`;
@@ -13146,6 +13150,10 @@ function toTemplateValueJs(value, options) {
13146
13150
  if (isLiteralTokenValue(s)) {
13147
13151
  return JSON.stringify(unwrapLiteralToken(s));
13148
13152
  }
13153
+ const trimmed = s.trim();
13154
+ if (/^\$\{[\s\S]*\}$/.test(trimmed)) {
13155
+ return trimmed.slice(2, -1).trim() || "undefined";
13156
+ }
13149
13157
  const fullEnvAngle = new RegExp(`^<<\\s*e:(${TOKEN_NAME_RE2})(${ACCESSOR_PATH_RE2})\\s*>>$`);
13150
13158
  const fullEnvCurly = new RegExp(`^\\{\\{\\s*e:(${TOKEN_NAME_RE2})(${ACCESSOR_PATH_RE2})\\s*\\}\\}$`, "i");
13151
13159
  const fullEnvPlain = new RegExp(`^e:(${TOKEN_NAME_RE2})(${ACCESSOR_PATH_RE2})$`);
@@ -13816,7 +13824,7 @@ var PARSE_DURATION_JS_FN = `(function __parseDurationMs(v) {
13816
13824
  }
13817
13825
  return Math.round(total);
13818
13826
  })`;
13819
- function durationToJsMsExpr(value) {
13827
+ function durationToJsMsExpr(value, tokenOptions) {
13820
13828
  if (typeof value === "number") {
13821
13829
  return String(Math.round(value));
13822
13830
  }
@@ -13828,7 +13836,8 @@ function durationToJsMsExpr(value) {
13828
13836
  if (/^\d+(?:\.\d+)?$/.test(trimmed)) {
13829
13837
  return String(Math.round(Number(trimmed)));
13830
13838
  }
13831
- return `${PARSE_DURATION_JS_FN}(${JSON.stringify(value)})`;
13839
+ const resolved = toTemplateValueJs(trimmed, tokenOptions);
13840
+ return `${PARSE_DURATION_JS_FN}(${resolved})`;
13832
13841
  }
13833
13842
  function toLowerUnderscore(input) {
13834
13843
  if (input === void 0 || input === null) {
@@ -20027,7 +20036,7 @@ var toConditionJsExpr = (value, knownInputNames) => {
20027
20036
  return "undefined";
20028
20037
  }
20029
20038
  if (/^\$\{[\s\S]+\}$/.test(trimmed)) {
20030
- return trimmed.slice(2, -1).trim() || "undefined";
20039
+ return normalizeRuntimeActualExpression(trimmed.slice(2, -1).trim()) || "undefined";
20031
20040
  }
20032
20041
  try {
20033
20042
  const parsed = YAML5.parse(trimmed);
@@ -20311,14 +20320,46 @@ var repeatToJSfunc = async (loop, useExternalReport, importTitleMap, hoistedIds,
20311
20320
  ${indentLines(loopBody)}
20312
20321
  }`;
20313
20322
  }
20314
- return `for (let i = 0; i < ${loopCondition}; i++) {
20323
+ if (loopCondition.toLowerCase() === "inf") {
20324
+ return `for (;;) {
20325
+ ${indentLines(loopBody)}
20326
+ }`;
20327
+ }
20328
+ if (typeof loop.repeat === "number" || /^\d+$/.test(loopCondition)) {
20329
+ return `for (let i = 0; i < ${loopCondition}; i++) {
20315
20330
  ${indentLines(loopBody)}
20331
+ }`;
20332
+ }
20333
+ const rawExpr = toTemplateValueJs(
20334
+ loopCondition,
20335
+ jsTokenOptions(knownInputNames)
20336
+ );
20337
+ const indentedBody = indentLines(loopBody);
20338
+ return `{
20339
+ const __repeatRaw = ${rawExpr};
20340
+ const __repeatStr = String(__repeatRaw ?? '').trim();
20341
+ const __repeatLower = __repeatStr.toLowerCase();
20342
+ if (__repeatLower === 'inf') {
20343
+ for (;;) {
20344
+ ${indentedBody}
20345
+ }
20346
+ } else if (/^((?:\\d+(?:\\.\\d+)?)(?:ns|ms|s|m|h))+$/i.test(__repeatLower)) {
20347
+ const __repeatMs = ${PARSE_DURATION_JS_FN}(__repeatStr);
20348
+ for (const __repeatStart = Date.now(); Date.now() < __repeatStart + __repeatMs; ) {
20349
+ ${indentedBody}
20350
+ }
20351
+ } else {
20352
+ const __repeatN = Number(__repeatRaw);
20353
+ for (let i = 0; i < __repeatN; i++) {
20354
+ ${indentedBody}
20355
+ }
20356
+ }
20316
20357
  }`;
20317
20358
  };
20318
20359
  var DELAY_ABORT_CHECK_MS = 2e3;
20319
- function delayToJSfunc(d) {
20360
+ function delayToJSfunc(d, knownInputNames) {
20320
20361
  return `{
20321
- let __delayLeft = ${durationToJsMsExpr(d)};
20362
+ let __delayLeft = ${durationToJsMsExpr(d, jsTokenOptions(knownInputNames))};
20322
20363
  while (__delayLeft > 0) {
20323
20364
  await checkAbort_();
20324
20365
  const __wait = Math.min(__delayLeft, ${DELAY_ABORT_CHECK_MS});
@@ -20383,8 +20424,9 @@ var checkToJSfunc = (check, useExternalReport, knownInputNames) => comparisonToJ
20383
20424
  var assertToJSfunc = (assert, useExternalReport, knownInputNames) => comparisonToJSfunc("assert", assert, useExternalReport, knownInputNames);
20384
20425
  var judgeValueToJs = (value, knownInputNames) => {
20385
20426
  if (typeof value === "string") {
20386
- if (/^\$\{[\s\S]+\}$/.test(value.trim())) {
20387
- return value.trim().slice(2, -1).trim() || "undefined";
20427
+ const trimmed = value.trim();
20428
+ if (/^\$\{[\s\S]+\}$/.test(trimmed)) {
20429
+ return normalizeRuntimeActualExpression(trimmed.slice(2, -1).trim()) || "undefined";
20388
20430
  }
20389
20431
  return toTemplateValueJs(value, jsTokenOptions(knownInputNames));
20390
20432
  }
@@ -20450,7 +20492,14 @@ var isExplicitMultiCheckArray = (value) => {
20450
20492
  };
20451
20493
  var expectValueToJs = (value, knownInputNames) => {
20452
20494
  const normalized = normalizeOmitToNull(value);
20453
- return typeof normalized === "string" ? toTemplateValueJs(normalized, jsTokenOptions(knownInputNames)) : JSON.stringify(normalized);
20495
+ if (typeof normalized === "string") {
20496
+ const trimmed = normalized.trim();
20497
+ if (/^\$\{[\s\S]+\}$/.test(trimmed)) {
20498
+ return normalizeRuntimeActualExpression(trimmed.slice(2, -1).trim()) || "undefined";
20499
+ }
20500
+ return toTemplateValueJs(normalized, jsTokenOptions(knownInputNames));
20501
+ }
20502
+ return JSON.stringify(normalized);
20454
20503
  };
20455
20504
  var comparisonFromPartsToJSfunc = (actualExpr, operator, expected, knownInputNames) => {
20456
20505
  if (isOmitSentinel(expected) || expected === null) {
@@ -20793,17 +20842,17 @@ try {
20793
20842
  );
20794
20843
  return result;
20795
20844
  };
20796
- var varToJSfunc = (decl, step, rewriteOutputKeys = false) => {
20845
+ var varToJSfunc = (decl, step, rewriteOutputKeys = false, knownInputNames) => {
20797
20846
  return Object.entries(step).map(([varName, value]) => {
20798
20847
  const lhs = rewriteOutputKeys ? rewriteOutputSetKey(varName) ?? varName : varName;
20799
20848
  if (typeof value === "string") {
20800
- return `${decl}${lhs} = \`${value}\`;`;
20849
+ return `${decl}${lhs} = ${toTemplateValueJs(value, jsTokenOptions(knownInputNames))};`;
20801
20850
  } else {
20802
20851
  return `${decl}${lhs} = ${value};`;
20803
20852
  }
20804
20853
  }).join("\n");
20805
20854
  };
20806
- var setenvToJSfunc = (setenv, enabled) => {
20855
+ var setenvToJSfunc = (setenv, enabled, knownInputNames) => {
20807
20856
  if (!enabled) {
20808
20857
  return "";
20809
20858
  }
@@ -20812,7 +20861,10 @@ var setenvToJSfunc = (setenv, enabled) => {
20812
20861
  return "";
20813
20862
  }
20814
20863
  const objEntries = entries.map(([envKey, outputKeyOrValue]) => {
20815
- const valueExpr = typeof outputKeyOrValue === "string" ? toTemplateWithVars(outputKeyOrValue) : JSON.stringify(outputKeyOrValue);
20864
+ const valueExpr = typeof outputKeyOrValue === "string" ? toTemplateValueJs(
20865
+ outputKeyOrValue,
20866
+ jsTokenOptions(knownInputNames)
20867
+ ) : JSON.stringify(outputKeyOrValue);
20816
20868
  return `${JSON.stringify(envKey)}: ${valueExpr}`;
20817
20869
  });
20818
20870
  return `setenv_({ ${objEntries.join(", ")} });`;
@@ -20894,7 +20946,7 @@ var flowStepsToJsfunc = async (flow, root, useExternalReport = !root, importTitl
20894
20946
  );
20895
20947
  break;
20896
20948
  case "delay":
20897
- stepJs = delayToJSfunc(step.delay);
20949
+ stepJs = delayToJSfunc(step.delay, knownInputNames);
20898
20950
  break;
20899
20951
  case "for":
20900
20952
  stepJs = await forToJSfunc(
@@ -20918,19 +20970,43 @@ var flowStepsToJsfunc = async (flow, root, useExternalReport = !root, importTitl
20918
20970
  }
20919
20971
  break;
20920
20972
  case "set":
20921
- stepJs = varToJSfunc("", step.set, true);
20973
+ stepJs = varToJSfunc(
20974
+ "",
20975
+ step.set,
20976
+ true,
20977
+ knownInputNames
20978
+ );
20922
20979
  break;
20923
20980
  case "var":
20924
- stepJs = varToJSfunc("var ", step.var);
20981
+ stepJs = varToJSfunc(
20982
+ "var ",
20983
+ step.var,
20984
+ false,
20985
+ knownInputNames
20986
+ );
20925
20987
  break;
20926
20988
  case "const":
20927
- stepJs = varToJSfunc("const ", step.const);
20989
+ stepJs = varToJSfunc(
20990
+ "const ",
20991
+ step.const,
20992
+ false,
20993
+ knownInputNames
20994
+ );
20928
20995
  break;
20929
20996
  case "let":
20930
- stepJs = varToJSfunc("let ", step.let);
20997
+ stepJs = varToJSfunc(
20998
+ "let ",
20999
+ step.let,
21000
+ false,
21001
+ knownInputNames
21002
+ );
20931
21003
  break;
20932
21004
  case "setenv":
20933
- stepJs = setenvToJSfunc(step.setenv, emitSetenv);
21005
+ stepJs = setenvToJSfunc(
21006
+ step.setenv,
21007
+ emitSetenv,
21008
+ knownInputNames
21009
+ );
20934
21010
  break;
20935
21011
  default:
20936
21012
  stepJs = "";
package/dist/server.js CHANGED
@@ -12210,7 +12210,11 @@ function currentValueForToken(spec) {
12210
12210
  return void 0;
12211
12211
  }
12212
12212
  if (alias) {
12213
- const duration = unsignedDurationMs(match[2]);
12213
+ const raw = String(match[2] || "").trim();
12214
+ if (/^[+-]/.test(raw)) {
12215
+ return void 0;
12216
+ }
12217
+ const duration = parseRelativeAmountMs(raw);
12214
12218
  if (duration === void 0) {
12215
12219
  return void 0;
12216
12220
  }
@@ -12234,7 +12238,7 @@ var ACCESSOR_SEGMENT_RE = "(?:\\.[A-Za-z_][A-Za-z0-9_]*|\\[(?:-?\\d+(?::-?\\d*)?
12234
12238
  var ACCESSOR_PATH_RE = `${ACCESSOR_SEGMENT_RE}*`;
12235
12239
  var RANDOM_TOKEN_ARGUMENTS_RE = "\\(\\s*[^(),\\s]+(?:\\s*,\\s*[^(),\\s]+)?\\s*\\)";
12236
12240
  var RANDOM_TOKEN_SPEC_RE = `${TOKEN_NAME_RE}(?:${RANDOM_TOKEN_ARGUMENTS_RE})?`;
12237
- var CURRENT_TOKEN_ARGUMENTS_RE = "\\([+-](?:\\d+(?:\\.\\d+)?(?:ms|s|m|h|d|w))+\\)";
12241
+ var CURRENT_TOKEN_ARGUMENTS_RE = "\\([^()]*\\)";
12238
12242
  var CURRENT_TOKEN_SPEC_RE = `${TOKEN_NAME_RE}(?:${CURRENT_TOKEN_ARGUMENTS_RE})?`;
12239
12243
  var RUNTIME_ARGS_LOOSE_RE = "(?:\\([^)]*\\))?";
12240
12244
  var RUNTIME_SPEC_RE = `${TOKEN_NAME_RE}${RUNTIME_ARGS_LOOSE_RE}`;
@@ -12874,7 +12878,7 @@ function isNonEmptyList(value) {
12874
12878
  var TOKEN_NAME_RE2 = "[A-Za-z_][A-Za-z0-9_\\-]*";
12875
12879
  var RANDOM_TOKEN_ARGUMENTS_RE2 = "\\(\\s*[^(),\\s]+(?:\\s*,\\s*[^(),\\s]+)?\\s*\\)";
12876
12880
  var RANDOM_TOKEN_SPEC_RE2 = `${TOKEN_NAME_RE2}(?:${RANDOM_TOKEN_ARGUMENTS_RE2})?`;
12877
- var CURRENT_TOKEN_ARGUMENTS_RE2 = "\\([+-](?:\\d+(?:\\.\\d+)?(?:ms|s|m|h|d|w))+\\)";
12881
+ var CURRENT_TOKEN_ARGUMENTS_RE2 = "\\([^()]*\\)";
12878
12882
  var CURRENT_TOKEN_SPEC_RE2 = `${TOKEN_NAME_RE2}(?:${CURRENT_TOKEN_ARGUMENTS_RE2})?`;
12879
12883
  var ACCESSOR_SEGMENT_RE2 = "(?:\\.[A-Za-z_][A-Za-z0-9_]*|\\[(?:-?\\d+(?::-?\\d*)?|:-?\\d*|[A-Za-z_][A-Za-z0-9_]*)\\])";
12880
12884
  var ACCESSOR_PATH_RE2 = `${ACCESSOR_SEGMENT_RE2}*`;
@@ -13146,6 +13150,10 @@ function toTemplateValueJs(value, options) {
13146
13150
  if (isLiteralTokenValue(s)) {
13147
13151
  return JSON.stringify(unwrapLiteralToken(s));
13148
13152
  }
13153
+ const trimmed = s.trim();
13154
+ if (/^\$\{[\s\S]*\}$/.test(trimmed)) {
13155
+ return trimmed.slice(2, -1).trim() || "undefined";
13156
+ }
13149
13157
  const fullEnvAngle = new RegExp(`^<<\\s*e:(${TOKEN_NAME_RE2})(${ACCESSOR_PATH_RE2})\\s*>>$`);
13150
13158
  const fullEnvCurly = new RegExp(`^\\{\\{\\s*e:(${TOKEN_NAME_RE2})(${ACCESSOR_PATH_RE2})\\s*\\}\\}$`, "i");
13151
13159
  const fullEnvPlain = new RegExp(`^e:(${TOKEN_NAME_RE2})(${ACCESSOR_PATH_RE2})$`);
@@ -13816,7 +13824,7 @@ var PARSE_DURATION_JS_FN = `(function __parseDurationMs(v) {
13816
13824
  }
13817
13825
  return Math.round(total);
13818
13826
  })`;
13819
- function durationToJsMsExpr(value) {
13827
+ function durationToJsMsExpr(value, tokenOptions) {
13820
13828
  if (typeof value === "number") {
13821
13829
  return String(Math.round(value));
13822
13830
  }
@@ -13828,7 +13836,8 @@ function durationToJsMsExpr(value) {
13828
13836
  if (/^\d+(?:\.\d+)?$/.test(trimmed)) {
13829
13837
  return String(Math.round(Number(trimmed)));
13830
13838
  }
13831
- return `${PARSE_DURATION_JS_FN}(${JSON.stringify(value)})`;
13839
+ const resolved = toTemplateValueJs(trimmed, tokenOptions);
13840
+ return `${PARSE_DURATION_JS_FN}(${resolved})`;
13832
13841
  }
13833
13842
  function toLowerUnderscore(input) {
13834
13843
  if (input === void 0 || input === null) {
@@ -20027,7 +20036,7 @@ var toConditionJsExpr = (value, knownInputNames) => {
20027
20036
  return "undefined";
20028
20037
  }
20029
20038
  if (/^\$\{[\s\S]+\}$/.test(trimmed)) {
20030
- return trimmed.slice(2, -1).trim() || "undefined";
20039
+ return normalizeRuntimeActualExpression(trimmed.slice(2, -1).trim()) || "undefined";
20031
20040
  }
20032
20041
  try {
20033
20042
  const parsed = YAML5.parse(trimmed);
@@ -20311,14 +20320,46 @@ var repeatToJSfunc = async (loop, useExternalReport, importTitleMap, hoistedIds,
20311
20320
  ${indentLines(loopBody)}
20312
20321
  }`;
20313
20322
  }
20314
- return `for (let i = 0; i < ${loopCondition}; i++) {
20323
+ if (loopCondition.toLowerCase() === "inf") {
20324
+ return `for (;;) {
20325
+ ${indentLines(loopBody)}
20326
+ }`;
20327
+ }
20328
+ if (typeof loop.repeat === "number" || /^\d+$/.test(loopCondition)) {
20329
+ return `for (let i = 0; i < ${loopCondition}; i++) {
20315
20330
  ${indentLines(loopBody)}
20331
+ }`;
20332
+ }
20333
+ const rawExpr = toTemplateValueJs(
20334
+ loopCondition,
20335
+ jsTokenOptions(knownInputNames)
20336
+ );
20337
+ const indentedBody = indentLines(loopBody);
20338
+ return `{
20339
+ const __repeatRaw = ${rawExpr};
20340
+ const __repeatStr = String(__repeatRaw ?? '').trim();
20341
+ const __repeatLower = __repeatStr.toLowerCase();
20342
+ if (__repeatLower === 'inf') {
20343
+ for (;;) {
20344
+ ${indentedBody}
20345
+ }
20346
+ } else if (/^((?:\\d+(?:\\.\\d+)?)(?:ns|ms|s|m|h))+$/i.test(__repeatLower)) {
20347
+ const __repeatMs = ${PARSE_DURATION_JS_FN}(__repeatStr);
20348
+ for (const __repeatStart = Date.now(); Date.now() < __repeatStart + __repeatMs; ) {
20349
+ ${indentedBody}
20350
+ }
20351
+ } else {
20352
+ const __repeatN = Number(__repeatRaw);
20353
+ for (let i = 0; i < __repeatN; i++) {
20354
+ ${indentedBody}
20355
+ }
20356
+ }
20316
20357
  }`;
20317
20358
  };
20318
20359
  var DELAY_ABORT_CHECK_MS = 2e3;
20319
- function delayToJSfunc(d) {
20360
+ function delayToJSfunc(d, knownInputNames) {
20320
20361
  return `{
20321
- let __delayLeft = ${durationToJsMsExpr(d)};
20362
+ let __delayLeft = ${durationToJsMsExpr(d, jsTokenOptions(knownInputNames))};
20322
20363
  while (__delayLeft > 0) {
20323
20364
  await checkAbort_();
20324
20365
  const __wait = Math.min(__delayLeft, ${DELAY_ABORT_CHECK_MS});
@@ -20383,8 +20424,9 @@ var checkToJSfunc = (check, useExternalReport, knownInputNames) => comparisonToJ
20383
20424
  var assertToJSfunc = (assert, useExternalReport, knownInputNames) => comparisonToJSfunc("assert", assert, useExternalReport, knownInputNames);
20384
20425
  var judgeValueToJs = (value, knownInputNames) => {
20385
20426
  if (typeof value === "string") {
20386
- if (/^\$\{[\s\S]+\}$/.test(value.trim())) {
20387
- return value.trim().slice(2, -1).trim() || "undefined";
20427
+ const trimmed = value.trim();
20428
+ if (/^\$\{[\s\S]+\}$/.test(trimmed)) {
20429
+ return normalizeRuntimeActualExpression(trimmed.slice(2, -1).trim()) || "undefined";
20388
20430
  }
20389
20431
  return toTemplateValueJs(value, jsTokenOptions(knownInputNames));
20390
20432
  }
@@ -20450,7 +20492,14 @@ var isExplicitMultiCheckArray = (value) => {
20450
20492
  };
20451
20493
  var expectValueToJs = (value, knownInputNames) => {
20452
20494
  const normalized = normalizeOmitToNull(value);
20453
- return typeof normalized === "string" ? toTemplateValueJs(normalized, jsTokenOptions(knownInputNames)) : JSON.stringify(normalized);
20495
+ if (typeof normalized === "string") {
20496
+ const trimmed = normalized.trim();
20497
+ if (/^\$\{[\s\S]+\}$/.test(trimmed)) {
20498
+ return normalizeRuntimeActualExpression(trimmed.slice(2, -1).trim()) || "undefined";
20499
+ }
20500
+ return toTemplateValueJs(normalized, jsTokenOptions(knownInputNames));
20501
+ }
20502
+ return JSON.stringify(normalized);
20454
20503
  };
20455
20504
  var comparisonFromPartsToJSfunc = (actualExpr, operator, expected, knownInputNames) => {
20456
20505
  if (isOmitSentinel(expected) || expected === null) {
@@ -20793,17 +20842,17 @@ try {
20793
20842
  );
20794
20843
  return result;
20795
20844
  };
20796
- var varToJSfunc = (decl, step, rewriteOutputKeys = false) => {
20845
+ var varToJSfunc = (decl, step, rewriteOutputKeys = false, knownInputNames) => {
20797
20846
  return Object.entries(step).map(([varName, value]) => {
20798
20847
  const lhs = rewriteOutputKeys ? rewriteOutputSetKey(varName) ?? varName : varName;
20799
20848
  if (typeof value === "string") {
20800
- return `${decl}${lhs} = \`${value}\`;`;
20849
+ return `${decl}${lhs} = ${toTemplateValueJs(value, jsTokenOptions(knownInputNames))};`;
20801
20850
  } else {
20802
20851
  return `${decl}${lhs} = ${value};`;
20803
20852
  }
20804
20853
  }).join("\n");
20805
20854
  };
20806
- var setenvToJSfunc = (setenv, enabled) => {
20855
+ var setenvToJSfunc = (setenv, enabled, knownInputNames) => {
20807
20856
  if (!enabled) {
20808
20857
  return "";
20809
20858
  }
@@ -20812,7 +20861,10 @@ var setenvToJSfunc = (setenv, enabled) => {
20812
20861
  return "";
20813
20862
  }
20814
20863
  const objEntries = entries.map(([envKey, outputKeyOrValue]) => {
20815
- const valueExpr = typeof outputKeyOrValue === "string" ? toTemplateWithVars(outputKeyOrValue) : JSON.stringify(outputKeyOrValue);
20864
+ const valueExpr = typeof outputKeyOrValue === "string" ? toTemplateValueJs(
20865
+ outputKeyOrValue,
20866
+ jsTokenOptions(knownInputNames)
20867
+ ) : JSON.stringify(outputKeyOrValue);
20816
20868
  return `${JSON.stringify(envKey)}: ${valueExpr}`;
20817
20869
  });
20818
20870
  return `setenv_({ ${objEntries.join(", ")} });`;
@@ -20894,7 +20946,7 @@ var flowStepsToJsfunc = async (flow, root, useExternalReport = !root, importTitl
20894
20946
  );
20895
20947
  break;
20896
20948
  case "delay":
20897
- stepJs = delayToJSfunc(step.delay);
20949
+ stepJs = delayToJSfunc(step.delay, knownInputNames);
20898
20950
  break;
20899
20951
  case "for":
20900
20952
  stepJs = await forToJSfunc(
@@ -20918,19 +20970,43 @@ var flowStepsToJsfunc = async (flow, root, useExternalReport = !root, importTitl
20918
20970
  }
20919
20971
  break;
20920
20972
  case "set":
20921
- stepJs = varToJSfunc("", step.set, true);
20973
+ stepJs = varToJSfunc(
20974
+ "",
20975
+ step.set,
20976
+ true,
20977
+ knownInputNames
20978
+ );
20922
20979
  break;
20923
20980
  case "var":
20924
- stepJs = varToJSfunc("var ", step.var);
20981
+ stepJs = varToJSfunc(
20982
+ "var ",
20983
+ step.var,
20984
+ false,
20985
+ knownInputNames
20986
+ );
20925
20987
  break;
20926
20988
  case "const":
20927
- stepJs = varToJSfunc("const ", step.const);
20989
+ stepJs = varToJSfunc(
20990
+ "const ",
20991
+ step.const,
20992
+ false,
20993
+ knownInputNames
20994
+ );
20928
20995
  break;
20929
20996
  case "let":
20930
- stepJs = varToJSfunc("let ", step.let);
20997
+ stepJs = varToJSfunc(
20998
+ "let ",
20999
+ step.let,
21000
+ false,
21001
+ knownInputNames
21002
+ );
20931
21003
  break;
20932
21004
  case "setenv":
20933
- stepJs = setenvToJSfunc(step.setenv, emitSetenv);
21005
+ stepJs = setenvToJSfunc(
21006
+ step.setenv,
21007
+ emitSetenv,
21008
+ knownInputNames
21009
+ );
20934
21010
  break;
20935
21011
  default:
20936
21012
  stepJs = "";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mmt-mcp",
3
- "version": "1.48.4",
3
+ "version": "1.49.0-pre",
4
4
  "description": "Multimeter MCP server for Cursor, Copilot, and Claude. Scaffold, validate, format, and run YAML .mmt API tests. Do not invent .mmt syntax.",
5
5
  "mcpName": "io.github.mshobeyri/multimeter",
6
6
  "type": "module",