From a8ca6f36617b4f9ca455733b4292a887e92589fe Mon Sep 17 00:00:00 2001 From: extio-de Date: Mon, 8 Jun 2026 09:55:30 +0200 Subject: [PATCH] Fix arguments containing spaces --- lm-launcher.jar | Bin 2188874 -> 2188854 bytes src/de/extio/lm_launcher/App.java | 55 +++++++++++++++++++----------- 2 files changed, 35 insertions(+), 20 deletions(-) diff --git a/lm-launcher.jar b/lm-launcher.jar index 2a41f1797889b518f9139fe43efb3bd25f8ab627..f5144be624942af6930a3f405689e22e41f504cd 100644 GIT binary patch delta 7973 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 F{{SKse3k$J delta 8071 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 Be7*nx diff --git a/src/de/extio/lm_launcher/App.java b/src/de/extio/lm_launcher/App.java index 58cce0f..1c46e4c 100644 --- a/src/de/extio/lm_launcher/App.java +++ b/src/de/extio/lm_launcher/App.java @@ -6,7 +6,6 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.Map.Entry; import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -30,14 +29,14 @@ record App(Path path, Path interpreter, @Deprecated List arguments, List "MIN_P", Model::minPDisplay, "REASONING_STOP", m -> "... thinking budget exceeded, let's answer now.\n"); - String argumentsToString(boolean showAll) { + String argumentsToString(final boolean showAll) { return this.argumentsToStringByArgs(this.appArguments.stream(), showAll); } - String argumentsToString(final List argumentOverrides, boolean showAll) { + String argumentsToString(final List argumentOverrides, final boolean showAll) { return this.argumentsToStringByArgs(this.appArguments .stream() - .map(arg -> argumentOverrides.stream().filter(a -> a.argument().equals(arg.argument())).findFirst().orElse(arg)), + .map(arg -> argumentOverrides.stream().filter(a -> a.argument().equals(arg.argument())).findFirst().orElse(arg)), showAll); } @@ -45,7 +44,7 @@ record App(Path path, Path interpreter, @Deprecated List arguments, List if (modelPath == null || modelPath.isBlank()) { return copyArguments(this.appArguments); } - final AppModelSettings savedSettings = this.findModelSettings(modelPath); + final var savedSettings = this.findModelSettings(modelPath); if (savedSettings == null) { return copyArguments(this.appArguments); } @@ -56,8 +55,8 @@ record App(Path path, Path interpreter, @Deprecated List arguments, List if (modelPath == null || modelPath.isBlank()) { return; } - final AppModelSettings updatedSettings = new AppModelSettings(modelPath, copyArguments(selectedArguments)); - for (int i = 0; i < this.modelSettings.size(); i++) { + final var updatedSettings = new AppModelSettings(modelPath, copyArguments(selectedArguments)); + for (var i = 0; i < this.modelSettings.size(); i++) { if (this.modelSettings.get(i).modelPath().equals(modelPath)) { this.modelSettings.set(i, updatedSettings); return; @@ -66,7 +65,7 @@ record App(Path path, Path interpreter, @Deprecated List arguments, List this.modelSettings.add(updatedSettings); } - private String argumentsToStringByArgs(final Stream args, boolean showAll) { + private String argumentsToStringByArgs(final Stream args, final boolean showAll) { return args .filter(arg -> showAll || (arg.optional() ? arg.default_() : true)) .map(AppArgument::argument) @@ -82,7 +81,7 @@ record App(Path path, Path interpreter, @Deprecated List arguments, List for (final AppArgument baseArgument : this.appArguments) { final int occurrenceIndex = occurrences.getOrDefault(baseArgument.argument(), 0); occurrences.put(baseArgument.argument(), occurrenceIndex + 1); - final AppArgument savedArgument = nthArgument(savedArguments, baseArgument.argument(), occurrenceIndex); + final var savedArgument = nthArgument(savedArguments, baseArgument.argument(), occurrenceIndex); mergedArguments.add(savedArgument == null ? new AppArgument(baseArgument.argument(), baseArgument.optional(), baseArgument.default_()) : new AppArgument(baseArgument.argument(), baseArgument.optional(), baseArgument.optional() ? savedArgument.default_() : baseArgument.default_())); @@ -98,7 +97,7 @@ record App(Path path, Path interpreter, @Deprecated List arguments, List } private static AppArgument nthArgument(final List arguments, final String argument, final int occurrenceIndex) { - int matchIndex = 0; + var matchIndex = 0; for (final AppArgument candidate : arguments) { if (!candidate.argument().equals(argument)) { continue; @@ -118,25 +117,41 @@ record App(Path path, Path interpreter, @Deprecated List arguments, List } void run(final Model model, final List argumentOverrides) throws IOException, IllegalArgumentException { - String interpreterStr = ""; + final List cmdParts = new ArrayList<>(); + if (this.interpreter() != null) { - interpreterStr = this.interpreter().toString().concat(" "); + cmdParts.add(this.interpreter().toString()); } - String consoleCmdStr = Data.props.getProperty("console") - .replace("CMD", interpreterStr + this.path().toString() + " " + this.argumentsToString(argumentOverrides, false)); + cmdParts.add(this.path().toString()); - if (PLACEHOLDERS.keySet().stream().anyMatch(consoleCmdStr::contains)) { - if (model == null) { - throw new IllegalArgumentException("Select a model first"); + for (final AppArgument arg_ : this.appArguments) { + final var arg = argumentOverrides.stream().filter(a -> a.argument().equals(arg_.argument())).findFirst().orElseGet(() -> arg_); + if (!arg.optional() || arg.default_()) { + var argReplaced = arg.argument(); + if (PLACEHOLDERS.keySet().contains(arg.argument())) { + if (model == null) { + throw new IllegalArgumentException("Select a model first"); + } + argReplaced = PLACEHOLDERS.get(arg.argument()).apply(model); + } + + cmdParts.add(argReplaced); } - for (final Entry> placeholder : PLACEHOLDERS.entrySet()) { - consoleCmdStr = consoleCmdStr.replace(placeholder.getKey(), placeholder.getValue().apply(model)); + } + + final List arguments = new ArrayList<>(); + for (final var arg : Data.props.getProperty("console").split("\\s+")) { + if ("CMD".equals(arg)) { + arguments.addAll(cmdParts); + } + else { + arguments.add(arg); } } Runtime.getRuntime().exec( - consoleCmdStr.split("\\s+"), + arguments.toArray(new String[0]), null, this.path().toAbsolutePath().getParent().toFile()); }