mmt-mcp 1.48.4 → 1.49.1-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}*`;
@@ -13141,11 +13145,25 @@ function embedDynamicTokensAsJsInterpolations(value, options) {
13141
13145
  }
13142
13146
  return value;
13143
13147
  }
13148
+ function unwrapWholeValueDollarRef(value) {
13149
+ const trimmed = String(value ?? "").trim();
13150
+ if (!trimmed.startsWith("${") || !trimmed.endsWith("}")) {
13151
+ return void 0;
13152
+ }
13153
+ if (trimmed.indexOf("${", 2) !== -1) {
13154
+ return void 0;
13155
+ }
13156
+ return trimmed.slice(2, -1).trim();
13157
+ }
13144
13158
  function toTemplateValueJs(value, options) {
13145
13159
  const s = String(value ?? "");
13146
13160
  if (isLiteralTokenValue(s)) {
13147
13161
  return JSON.stringify(unwrapLiteralToken(s));
13148
13162
  }
13163
+ const wholeRef = unwrapWholeValueDollarRef(s);
13164
+ if (wholeRef !== void 0) {
13165
+ return wholeRef || "undefined";
13166
+ }
13149
13167
  const fullEnvAngle = new RegExp(`^<<\\s*e:(${TOKEN_NAME_RE2})(${ACCESSOR_PATH_RE2})\\s*>>$`);
13150
13168
  const fullEnvCurly = new RegExp(`^\\{\\{\\s*e:(${TOKEN_NAME_RE2})(${ACCESSOR_PATH_RE2})\\s*\\}\\}$`, "i");
13151
13169
  const fullEnvPlain = new RegExp(`^e:(${TOKEN_NAME_RE2})(${ACCESSOR_PATH_RE2})$`);
@@ -13816,7 +13834,7 @@ var PARSE_DURATION_JS_FN = `(function __parseDurationMs(v) {
13816
13834
  }
13817
13835
  return Math.round(total);
13818
13836
  })`;
13819
- function durationToJsMsExpr(value) {
13837
+ function durationToJsMsExpr(value, tokenOptions) {
13820
13838
  if (typeof value === "number") {
13821
13839
  return String(Math.round(value));
13822
13840
  }
@@ -13828,7 +13846,8 @@ function durationToJsMsExpr(value) {
13828
13846
  if (/^\d+(?:\.\d+)?$/.test(trimmed)) {
13829
13847
  return String(Math.round(Number(trimmed)));
13830
13848
  }
13831
- return `${PARSE_DURATION_JS_FN}(${JSON.stringify(value)})`;
13849
+ const resolved = toTemplateValueJs(trimmed, tokenOptions);
13850
+ return `${PARSE_DURATION_JS_FN}(${resolved})`;
13832
13851
  }
13833
13852
  function toLowerUnderscore(input) {
13834
13853
  if (input === void 0 || input === null) {
@@ -20026,8 +20045,9 @@ var toConditionJsExpr = (value, knownInputNames) => {
20026
20045
  if (!trimmed) {
20027
20046
  return "undefined";
20028
20047
  }
20029
- if (/^\$\{[\s\S]+\}$/.test(trimmed)) {
20030
- return trimmed.slice(2, -1).trim() || "undefined";
20048
+ const wholeRef = unwrapWholeValueDollarRef(trimmed);
20049
+ if (wholeRef !== void 0) {
20050
+ return normalizeRuntimeActualExpression(wholeRef) || "undefined";
20031
20051
  }
20032
20052
  try {
20033
20053
  const parsed = YAML5.parse(trimmed);
@@ -20311,14 +20331,46 @@ var repeatToJSfunc = async (loop, useExternalReport, importTitleMap, hoistedIds,
20311
20331
  ${indentLines(loopBody)}
20312
20332
  }`;
20313
20333
  }
20314
- return `for (let i = 0; i < ${loopCondition}; i++) {
20334
+ if (loopCondition.toLowerCase() === "inf") {
20335
+ return `for (;;) {
20315
20336
  ${indentLines(loopBody)}
20337
+ }`;
20338
+ }
20339
+ if (typeof loop.repeat === "number" || /^\d+$/.test(loopCondition)) {
20340
+ return `for (let i = 0; i < ${loopCondition}; i++) {
20341
+ ${indentLines(loopBody)}
20342
+ }`;
20343
+ }
20344
+ const rawExpr = toTemplateValueJs(
20345
+ loopCondition,
20346
+ jsTokenOptions(knownInputNames)
20347
+ );
20348
+ const indentedBody = indentLines(loopBody);
20349
+ return `{
20350
+ const __repeatRaw = ${rawExpr};
20351
+ const __repeatStr = String(__repeatRaw ?? '').trim();
20352
+ const __repeatLower = __repeatStr.toLowerCase();
20353
+ if (__repeatLower === 'inf') {
20354
+ for (;;) {
20355
+ ${indentedBody}
20356
+ }
20357
+ } else if (/^((?:\\d+(?:\\.\\d+)?)(?:ns|ms|s|m|h))+$/i.test(__repeatLower)) {
20358
+ const __repeatMs = ${PARSE_DURATION_JS_FN}(__repeatStr);
20359
+ for (const __repeatStart = Date.now(); Date.now() < __repeatStart + __repeatMs; ) {
20360
+ ${indentedBody}
20361
+ }
20362
+ } else {
20363
+ const __repeatN = Number(__repeatRaw);
20364
+ for (let i = 0; i < __repeatN; i++) {
20365
+ ${indentedBody}
20366
+ }
20367
+ }
20316
20368
  }`;
20317
20369
  };
20318
20370
  var DELAY_ABORT_CHECK_MS = 2e3;
20319
- function delayToJSfunc(d) {
20371
+ function delayToJSfunc(d, knownInputNames) {
20320
20372
  return `{
20321
- let __delayLeft = ${durationToJsMsExpr(d)};
20373
+ let __delayLeft = ${durationToJsMsExpr(d, jsTokenOptions(knownInputNames))};
20322
20374
  while (__delayLeft > 0) {
20323
20375
  await checkAbort_();
20324
20376
  const __wait = Math.min(__delayLeft, ${DELAY_ABORT_CHECK_MS});
@@ -20354,7 +20406,8 @@ var comparisonToJSfunc = (type, comparison, useExternalReport, knownInputNames)
20354
20406
  );
20355
20407
  const reportLevel = useExternalReport ? reportCfg.external : reportCfg.internal;
20356
20408
  const actualTrimmed = typeof actual === "string" ? actual.trim() : "";
20357
- const actualRuntimeExpr = actualTrimmed && /^\$\{.+\}$/.test(actualTrimmed) ? normalizeRuntimeActualExpression(actualTrimmed.slice(2, -1)) : void 0;
20409
+ const actualWholeRef = actualTrimmed ? unwrapWholeValueDollarRef(actualTrimmed) : void 0;
20410
+ const actualRuntimeExpr = actualWholeRef !== void 0 ? normalizeRuntimeActualExpression(actualWholeRef) : void 0;
20358
20411
  const conditionStatement = actualRuntimeExpr ? comparisonFromPartsToJSfunc(actualRuntimeExpr, operator, expected, knownInputNames) : conditionalStatementToJSfunc(raw, knownInputNames);
20359
20412
  const finalTitle = typeof title === "string" ? toTemplateWithVars(title) : void 0;
20360
20413
  const finalDetails = typeof details === "string" ? toTemplateWithVars(details) : void 0;
@@ -20383,8 +20436,9 @@ var checkToJSfunc = (check, useExternalReport, knownInputNames) => comparisonToJ
20383
20436
  var assertToJSfunc = (assert, useExternalReport, knownInputNames) => comparisonToJSfunc("assert", assert, useExternalReport, knownInputNames);
20384
20437
  var judgeValueToJs = (value, knownInputNames) => {
20385
20438
  if (typeof value === "string") {
20386
- if (/^\$\{[\s\S]+\}$/.test(value.trim())) {
20387
- return value.trim().slice(2, -1).trim() || "undefined";
20439
+ const wholeRef = unwrapWholeValueDollarRef(value);
20440
+ if (wholeRef !== void 0) {
20441
+ return normalizeRuntimeActualExpression(wholeRef) || "undefined";
20388
20442
  }
20389
20443
  return toTemplateValueJs(value, jsTokenOptions(knownInputNames));
20390
20444
  }
@@ -20450,7 +20504,14 @@ var isExplicitMultiCheckArray = (value) => {
20450
20504
  };
20451
20505
  var expectValueToJs = (value, knownInputNames) => {
20452
20506
  const normalized = normalizeOmitToNull(value);
20453
- return typeof normalized === "string" ? toTemplateValueJs(normalized, jsTokenOptions(knownInputNames)) : JSON.stringify(normalized);
20507
+ if (typeof normalized === "string") {
20508
+ const wholeRef = unwrapWholeValueDollarRef(normalized);
20509
+ if (wholeRef !== void 0) {
20510
+ return normalizeRuntimeActualExpression(wholeRef) || "undefined";
20511
+ }
20512
+ return toTemplateValueJs(normalized, jsTokenOptions(knownInputNames));
20513
+ }
20514
+ return JSON.stringify(normalized);
20454
20515
  };
20455
20516
  var comparisonFromPartsToJSfunc = (actualExpr, operator, expected, knownInputNames) => {
20456
20517
  if (isOmitSentinel(expected) || expected === null) {
@@ -20793,17 +20854,17 @@ try {
20793
20854
  );
20794
20855
  return result;
20795
20856
  };
20796
- var varToJSfunc = (decl, step, rewriteOutputKeys = false) => {
20857
+ var varToJSfunc = (decl, step, rewriteOutputKeys = false, knownInputNames) => {
20797
20858
  return Object.entries(step).map(([varName, value]) => {
20798
20859
  const lhs = rewriteOutputKeys ? rewriteOutputSetKey(varName) ?? varName : varName;
20799
20860
  if (typeof value === "string") {
20800
- return `${decl}${lhs} = \`${value}\`;`;
20861
+ return `${decl}${lhs} = ${toTemplateValueJs(value, jsTokenOptions(knownInputNames))};`;
20801
20862
  } else {
20802
20863
  return `${decl}${lhs} = ${value};`;
20803
20864
  }
20804
20865
  }).join("\n");
20805
20866
  };
20806
- var setenvToJSfunc = (setenv, enabled) => {
20867
+ var setenvToJSfunc = (setenv, enabled, knownInputNames) => {
20807
20868
  if (!enabled) {
20808
20869
  return "";
20809
20870
  }
@@ -20812,7 +20873,10 @@ var setenvToJSfunc = (setenv, enabled) => {
20812
20873
  return "";
20813
20874
  }
20814
20875
  const objEntries = entries.map(([envKey, outputKeyOrValue]) => {
20815
- const valueExpr = typeof outputKeyOrValue === "string" ? toTemplateWithVars(outputKeyOrValue) : JSON.stringify(outputKeyOrValue);
20876
+ const valueExpr = typeof outputKeyOrValue === "string" ? toTemplateValueJs(
20877
+ outputKeyOrValue,
20878
+ jsTokenOptions(knownInputNames)
20879
+ ) : JSON.stringify(outputKeyOrValue);
20816
20880
  return `${JSON.stringify(envKey)}: ${valueExpr}`;
20817
20881
  });
20818
20882
  return `setenv_({ ${objEntries.join(", ")} });`;
@@ -20894,7 +20958,7 @@ var flowStepsToJsfunc = async (flow, root, useExternalReport = !root, importTitl
20894
20958
  );
20895
20959
  break;
20896
20960
  case "delay":
20897
- stepJs = delayToJSfunc(step.delay);
20961
+ stepJs = delayToJSfunc(step.delay, knownInputNames);
20898
20962
  break;
20899
20963
  case "for":
20900
20964
  stepJs = await forToJSfunc(
@@ -20918,19 +20982,43 @@ var flowStepsToJsfunc = async (flow, root, useExternalReport = !root, importTitl
20918
20982
  }
20919
20983
  break;
20920
20984
  case "set":
20921
- stepJs = varToJSfunc("", step.set, true);
20985
+ stepJs = varToJSfunc(
20986
+ "",
20987
+ step.set,
20988
+ true,
20989
+ knownInputNames
20990
+ );
20922
20991
  break;
20923
20992
  case "var":
20924
- stepJs = varToJSfunc("var ", step.var);
20993
+ stepJs = varToJSfunc(
20994
+ "var ",
20995
+ step.var,
20996
+ false,
20997
+ knownInputNames
20998
+ );
20925
20999
  break;
20926
21000
  case "const":
20927
- stepJs = varToJSfunc("const ", step.const);
21001
+ stepJs = varToJSfunc(
21002
+ "const ",
21003
+ step.const,
21004
+ false,
21005
+ knownInputNames
21006
+ );
20928
21007
  break;
20929
21008
  case "let":
20930
- stepJs = varToJSfunc("let ", step.let);
21009
+ stepJs = varToJSfunc(
21010
+ "let ",
21011
+ step.let,
21012
+ false,
21013
+ knownInputNames
21014
+ );
20931
21015
  break;
20932
21016
  case "setenv":
20933
- stepJs = setenvToJSfunc(step.setenv, emitSetenv);
21017
+ stepJs = setenvToJSfunc(
21018
+ step.setenv,
21019
+ emitSetenv,
21020
+ knownInputNames
21021
+ );
20934
21022
  break;
20935
21023
  default:
20936
21024
  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}*`;
@@ -13141,11 +13145,25 @@ function embedDynamicTokensAsJsInterpolations(value, options) {
13141
13145
  }
13142
13146
  return value;
13143
13147
  }
13148
+ function unwrapWholeValueDollarRef(value) {
13149
+ const trimmed = String(value ?? "").trim();
13150
+ if (!trimmed.startsWith("${") || !trimmed.endsWith("}")) {
13151
+ return void 0;
13152
+ }
13153
+ if (trimmed.indexOf("${", 2) !== -1) {
13154
+ return void 0;
13155
+ }
13156
+ return trimmed.slice(2, -1).trim();
13157
+ }
13144
13158
  function toTemplateValueJs(value, options) {
13145
13159
  const s = String(value ?? "");
13146
13160
  if (isLiteralTokenValue(s)) {
13147
13161
  return JSON.stringify(unwrapLiteralToken(s));
13148
13162
  }
13163
+ const wholeRef = unwrapWholeValueDollarRef(s);
13164
+ if (wholeRef !== void 0) {
13165
+ return wholeRef || "undefined";
13166
+ }
13149
13167
  const fullEnvAngle = new RegExp(`^<<\\s*e:(${TOKEN_NAME_RE2})(${ACCESSOR_PATH_RE2})\\s*>>$`);
13150
13168
  const fullEnvCurly = new RegExp(`^\\{\\{\\s*e:(${TOKEN_NAME_RE2})(${ACCESSOR_PATH_RE2})\\s*\\}\\}$`, "i");
13151
13169
  const fullEnvPlain = new RegExp(`^e:(${TOKEN_NAME_RE2})(${ACCESSOR_PATH_RE2})$`);
@@ -13816,7 +13834,7 @@ var PARSE_DURATION_JS_FN = `(function __parseDurationMs(v) {
13816
13834
  }
13817
13835
  return Math.round(total);
13818
13836
  })`;
13819
- function durationToJsMsExpr(value) {
13837
+ function durationToJsMsExpr(value, tokenOptions) {
13820
13838
  if (typeof value === "number") {
13821
13839
  return String(Math.round(value));
13822
13840
  }
@@ -13828,7 +13846,8 @@ function durationToJsMsExpr(value) {
13828
13846
  if (/^\d+(?:\.\d+)?$/.test(trimmed)) {
13829
13847
  return String(Math.round(Number(trimmed)));
13830
13848
  }
13831
- return `${PARSE_DURATION_JS_FN}(${JSON.stringify(value)})`;
13849
+ const resolved = toTemplateValueJs(trimmed, tokenOptions);
13850
+ return `${PARSE_DURATION_JS_FN}(${resolved})`;
13832
13851
  }
13833
13852
  function toLowerUnderscore(input) {
13834
13853
  if (input === void 0 || input === null) {
@@ -20026,8 +20045,9 @@ var toConditionJsExpr = (value, knownInputNames) => {
20026
20045
  if (!trimmed) {
20027
20046
  return "undefined";
20028
20047
  }
20029
- if (/^\$\{[\s\S]+\}$/.test(trimmed)) {
20030
- return trimmed.slice(2, -1).trim() || "undefined";
20048
+ const wholeRef = unwrapWholeValueDollarRef(trimmed);
20049
+ if (wholeRef !== void 0) {
20050
+ return normalizeRuntimeActualExpression(wholeRef) || "undefined";
20031
20051
  }
20032
20052
  try {
20033
20053
  const parsed = YAML5.parse(trimmed);
@@ -20311,14 +20331,46 @@ var repeatToJSfunc = async (loop, useExternalReport, importTitleMap, hoistedIds,
20311
20331
  ${indentLines(loopBody)}
20312
20332
  }`;
20313
20333
  }
20314
- return `for (let i = 0; i < ${loopCondition}; i++) {
20334
+ if (loopCondition.toLowerCase() === "inf") {
20335
+ return `for (;;) {
20315
20336
  ${indentLines(loopBody)}
20337
+ }`;
20338
+ }
20339
+ if (typeof loop.repeat === "number" || /^\d+$/.test(loopCondition)) {
20340
+ return `for (let i = 0; i < ${loopCondition}; i++) {
20341
+ ${indentLines(loopBody)}
20342
+ }`;
20343
+ }
20344
+ const rawExpr = toTemplateValueJs(
20345
+ loopCondition,
20346
+ jsTokenOptions(knownInputNames)
20347
+ );
20348
+ const indentedBody = indentLines(loopBody);
20349
+ return `{
20350
+ const __repeatRaw = ${rawExpr};
20351
+ const __repeatStr = String(__repeatRaw ?? '').trim();
20352
+ const __repeatLower = __repeatStr.toLowerCase();
20353
+ if (__repeatLower === 'inf') {
20354
+ for (;;) {
20355
+ ${indentedBody}
20356
+ }
20357
+ } else if (/^((?:\\d+(?:\\.\\d+)?)(?:ns|ms|s|m|h))+$/i.test(__repeatLower)) {
20358
+ const __repeatMs = ${PARSE_DURATION_JS_FN}(__repeatStr);
20359
+ for (const __repeatStart = Date.now(); Date.now() < __repeatStart + __repeatMs; ) {
20360
+ ${indentedBody}
20361
+ }
20362
+ } else {
20363
+ const __repeatN = Number(__repeatRaw);
20364
+ for (let i = 0; i < __repeatN; i++) {
20365
+ ${indentedBody}
20366
+ }
20367
+ }
20316
20368
  }`;
20317
20369
  };
20318
20370
  var DELAY_ABORT_CHECK_MS = 2e3;
20319
- function delayToJSfunc(d) {
20371
+ function delayToJSfunc(d, knownInputNames) {
20320
20372
  return `{
20321
- let __delayLeft = ${durationToJsMsExpr(d)};
20373
+ let __delayLeft = ${durationToJsMsExpr(d, jsTokenOptions(knownInputNames))};
20322
20374
  while (__delayLeft > 0) {
20323
20375
  await checkAbort_();
20324
20376
  const __wait = Math.min(__delayLeft, ${DELAY_ABORT_CHECK_MS});
@@ -20354,7 +20406,8 @@ var comparisonToJSfunc = (type, comparison, useExternalReport, knownInputNames)
20354
20406
  );
20355
20407
  const reportLevel = useExternalReport ? reportCfg.external : reportCfg.internal;
20356
20408
  const actualTrimmed = typeof actual === "string" ? actual.trim() : "";
20357
- const actualRuntimeExpr = actualTrimmed && /^\$\{.+\}$/.test(actualTrimmed) ? normalizeRuntimeActualExpression(actualTrimmed.slice(2, -1)) : void 0;
20409
+ const actualWholeRef = actualTrimmed ? unwrapWholeValueDollarRef(actualTrimmed) : void 0;
20410
+ const actualRuntimeExpr = actualWholeRef !== void 0 ? normalizeRuntimeActualExpression(actualWholeRef) : void 0;
20358
20411
  const conditionStatement = actualRuntimeExpr ? comparisonFromPartsToJSfunc(actualRuntimeExpr, operator, expected, knownInputNames) : conditionalStatementToJSfunc(raw, knownInputNames);
20359
20412
  const finalTitle = typeof title === "string" ? toTemplateWithVars(title) : void 0;
20360
20413
  const finalDetails = typeof details === "string" ? toTemplateWithVars(details) : void 0;
@@ -20383,8 +20436,9 @@ var checkToJSfunc = (check, useExternalReport, knownInputNames) => comparisonToJ
20383
20436
  var assertToJSfunc = (assert, useExternalReport, knownInputNames) => comparisonToJSfunc("assert", assert, useExternalReport, knownInputNames);
20384
20437
  var judgeValueToJs = (value, knownInputNames) => {
20385
20438
  if (typeof value === "string") {
20386
- if (/^\$\{[\s\S]+\}$/.test(value.trim())) {
20387
- return value.trim().slice(2, -1).trim() || "undefined";
20439
+ const wholeRef = unwrapWholeValueDollarRef(value);
20440
+ if (wholeRef !== void 0) {
20441
+ return normalizeRuntimeActualExpression(wholeRef) || "undefined";
20388
20442
  }
20389
20443
  return toTemplateValueJs(value, jsTokenOptions(knownInputNames));
20390
20444
  }
@@ -20450,7 +20504,14 @@ var isExplicitMultiCheckArray = (value) => {
20450
20504
  };
20451
20505
  var expectValueToJs = (value, knownInputNames) => {
20452
20506
  const normalized = normalizeOmitToNull(value);
20453
- return typeof normalized === "string" ? toTemplateValueJs(normalized, jsTokenOptions(knownInputNames)) : JSON.stringify(normalized);
20507
+ if (typeof normalized === "string") {
20508
+ const wholeRef = unwrapWholeValueDollarRef(normalized);
20509
+ if (wholeRef !== void 0) {
20510
+ return normalizeRuntimeActualExpression(wholeRef) || "undefined";
20511
+ }
20512
+ return toTemplateValueJs(normalized, jsTokenOptions(knownInputNames));
20513
+ }
20514
+ return JSON.stringify(normalized);
20454
20515
  };
20455
20516
  var comparisonFromPartsToJSfunc = (actualExpr, operator, expected, knownInputNames) => {
20456
20517
  if (isOmitSentinel(expected) || expected === null) {
@@ -20793,17 +20854,17 @@ try {
20793
20854
  );
20794
20855
  return result;
20795
20856
  };
20796
- var varToJSfunc = (decl, step, rewriteOutputKeys = false) => {
20857
+ var varToJSfunc = (decl, step, rewriteOutputKeys = false, knownInputNames) => {
20797
20858
  return Object.entries(step).map(([varName, value]) => {
20798
20859
  const lhs = rewriteOutputKeys ? rewriteOutputSetKey(varName) ?? varName : varName;
20799
20860
  if (typeof value === "string") {
20800
- return `${decl}${lhs} = \`${value}\`;`;
20861
+ return `${decl}${lhs} = ${toTemplateValueJs(value, jsTokenOptions(knownInputNames))};`;
20801
20862
  } else {
20802
20863
  return `${decl}${lhs} = ${value};`;
20803
20864
  }
20804
20865
  }).join("\n");
20805
20866
  };
20806
- var setenvToJSfunc = (setenv, enabled) => {
20867
+ var setenvToJSfunc = (setenv, enabled, knownInputNames) => {
20807
20868
  if (!enabled) {
20808
20869
  return "";
20809
20870
  }
@@ -20812,7 +20873,10 @@ var setenvToJSfunc = (setenv, enabled) => {
20812
20873
  return "";
20813
20874
  }
20814
20875
  const objEntries = entries.map(([envKey, outputKeyOrValue]) => {
20815
- const valueExpr = typeof outputKeyOrValue === "string" ? toTemplateWithVars(outputKeyOrValue) : JSON.stringify(outputKeyOrValue);
20876
+ const valueExpr = typeof outputKeyOrValue === "string" ? toTemplateValueJs(
20877
+ outputKeyOrValue,
20878
+ jsTokenOptions(knownInputNames)
20879
+ ) : JSON.stringify(outputKeyOrValue);
20816
20880
  return `${JSON.stringify(envKey)}: ${valueExpr}`;
20817
20881
  });
20818
20882
  return `setenv_({ ${objEntries.join(", ")} });`;
@@ -20894,7 +20958,7 @@ var flowStepsToJsfunc = async (flow, root, useExternalReport = !root, importTitl
20894
20958
  );
20895
20959
  break;
20896
20960
  case "delay":
20897
- stepJs = delayToJSfunc(step.delay);
20961
+ stepJs = delayToJSfunc(step.delay, knownInputNames);
20898
20962
  break;
20899
20963
  case "for":
20900
20964
  stepJs = await forToJSfunc(
@@ -20918,19 +20982,43 @@ var flowStepsToJsfunc = async (flow, root, useExternalReport = !root, importTitl
20918
20982
  }
20919
20983
  break;
20920
20984
  case "set":
20921
- stepJs = varToJSfunc("", step.set, true);
20985
+ stepJs = varToJSfunc(
20986
+ "",
20987
+ step.set,
20988
+ true,
20989
+ knownInputNames
20990
+ );
20922
20991
  break;
20923
20992
  case "var":
20924
- stepJs = varToJSfunc("var ", step.var);
20993
+ stepJs = varToJSfunc(
20994
+ "var ",
20995
+ step.var,
20996
+ false,
20997
+ knownInputNames
20998
+ );
20925
20999
  break;
20926
21000
  case "const":
20927
- stepJs = varToJSfunc("const ", step.const);
21001
+ stepJs = varToJSfunc(
21002
+ "const ",
21003
+ step.const,
21004
+ false,
21005
+ knownInputNames
21006
+ );
20928
21007
  break;
20929
21008
  case "let":
20930
- stepJs = varToJSfunc("let ", step.let);
21009
+ stepJs = varToJSfunc(
21010
+ "let ",
21011
+ step.let,
21012
+ false,
21013
+ knownInputNames
21014
+ );
20931
21015
  break;
20932
21016
  case "setenv":
20933
- stepJs = setenvToJSfunc(step.setenv, emitSetenv);
21017
+ stepJs = setenvToJSfunc(
21018
+ step.setenv,
21019
+ emitSetenv,
21020
+ knownInputNames
21021
+ );
20934
21022
  break;
20935
21023
  default:
20936
21024
  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.1-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",