diff --git a/LICENSE.md b/LICENSE.md index 1a963dc7..ce1a351d 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -6,7 +6,7 @@ FSL-1.1-MIT ## Notice -Copyright 2025 Thorsten Sommer +Copyright 2026 Thorsten Sommer ## Terms and Conditions diff --git a/README.md b/README.md index 2b2e8719..30536bcd 100644 --- a/README.md +++ b/README.md @@ -79,6 +79,7 @@ Since March 2025: We have started developing the plugin system. There will be la +- v26.1.1: Added the option to attach files, including images, to chat templates; added support for source code file attachments in chats and document analysis; added a preview feature for recording your own voice for transcription; fixed various bugs in provider dialogs and profile selection. - v0.10.0: Added support for newer models like Mistral 3 & GPT 5.2, OpenRouter as LLM and embedding provider, the possibility to use file attachments in chats, and support for images as input. - v0.9.51: Added support for [Perplexity](https://www.perplexity.ai/); citations added so that LLMs can provide source references (e.g., some OpenAI models, Perplexity); added support for OpenAI's Responses API so that all text LLMs from OpenAI now work in MindWork AI Studio, including Deep Research models; web searches are now possible (some OpenAI models, Perplexity). - v0.9.50: Added support for self-hosted LLMs using [vLLM](https://blog.vllm.ai/2023/06/20/vllm.html). @@ -90,8 +91,6 @@ Since March 2025: We have started developing the plugin system. There will be la - v0.9.31: Added Helmholtz & GWDG as LLM providers. This is a huge improvement for many researchers out there who can use these providers for free. We added DeepSeek as a provider as well. - v0.9.29: Added agents to support the RAG process (selecting the best data sources & validating retrieved data as part of the augmentation process) - v0.9.26+: Added RAG for external data sources using our [ERI interface](https://mindworkai.org/#eri---external-retrieval-interface) as a preview feature. -- v0.9.25: Added [xAI](https://x.ai/) as a new provider. xAI provides their Grok models for generating content. -- v0.9.23: Added support for OpenAI `o` models (`o1`, `o1-mini`, `o3`, etc.); added also an [ERI](https://github.com/MindWorkAI/ERI) server coding assistant as a preview feature behind the RAG feature flag. Your own ERI server can be used to gain access to, e.g., your enterprise data from within AI Studio. diff --git a/app/Build/Commands/PrepareAction.cs b/app/Build/Commands/PrepareAction.cs index 2f2ffcb2..5b383492 100644 --- a/app/Build/Commands/PrepareAction.cs +++ b/app/Build/Commands/PrepareAction.cs @@ -3,8 +3,10 @@ namespace Build.Commands; public enum PrepareAction { NONE, - - PATCH, - MINOR, - MAJOR, + + BUILD, + MONTH, + YEAR, + + SET, } \ No newline at end of file diff --git a/app/Build/Commands/UpdateMetadataCommands.cs b/app/Build/Commands/UpdateMetadataCommands.cs index 2ecf135f..5ad74591 100644 --- a/app/Build/Commands/UpdateMetadataCommands.cs +++ b/app/Build/Commands/UpdateMetadataCommands.cs @@ -13,13 +13,32 @@ namespace Build.Commands; public sealed partial class UpdateMetadataCommands { [Command("release", Description = "Prepare & build the next release")] - public async Task Release(PrepareAction action) + public async Task Release( + [Option("action", ['a'], Description = "The release action: patch, minor, or major")] PrepareAction action = PrepareAction.NONE, + [Option("version", ['v'], Description = "Set a specific version directly, e.g., 26.1.2")] string? version = null) { if(!Environment.IsWorkingDirectoryValid()) return; - + + // Validate parameters: either action or version must be specified, but not both: + if (action == PrepareAction.NONE && string.IsNullOrWhiteSpace(version)) + { + Console.WriteLine("- Error: You must specify either --action (-a) or --version (-v)."); + return; + } + + if (action != PrepareAction.NONE && !string.IsNullOrWhiteSpace(version)) + { + Console.WriteLine("- Error: You cannot specify both --action and --version. Please use only one."); + return; + } + + // If version is specified, use SET action: + if (!string.IsNullOrWhiteSpace(version)) + action = PrepareAction.SET; + // Prepare the metadata for the next release: - await this.PerformPrepare(action, true); + await this.PerformPrepare(action, true, version); // Build once to allow the Rust compiler to read the changed metadata // and to update all .NET artifacts: @@ -53,11 +72,30 @@ public sealed partial class UpdateMetadataCommands } [Command("prepare", Description = "Prepare the metadata for the next release")] - public async Task Prepare(PrepareAction action) + public async Task Prepare( + [Option("action", ['a'], Description = "The release action: patch, minor, or major")] PrepareAction action = PrepareAction.NONE, + [Option("version", ['v'], Description = "Set a specific version directly, e.g., 26.1.2")] string? version = null) { if(!Environment.IsWorkingDirectoryValid()) return; + // Validate parameters: either action or version must be specified, but not both: + if (action == PrepareAction.NONE && string.IsNullOrWhiteSpace(version)) + { + Console.WriteLine("- Error: You must specify either --action (-a) or --version (-v)."); + return; + } + + if (action != PrepareAction.NONE && !string.IsNullOrWhiteSpace(version)) + { + Console.WriteLine("- Error: You cannot specify both --action and --version. Please use only one."); + return; + } + + // If version is specified, use SET action: + if (!string.IsNullOrWhiteSpace(version)) + action = PrepareAction.SET; + Console.WriteLine("=============================="); Console.Write("- Are you trying to prepare a new release? (y/n) "); var userAnswer = Console.ReadLine(); @@ -66,18 +104,18 @@ public sealed partial class UpdateMetadataCommands Console.WriteLine("- Please use the 'release' command instead"); return; } - - await this.PerformPrepare(action, false); + + await this.PerformPrepare(action, false, version); } - private async Task PerformPrepare(PrepareAction action, bool internalCall) + private async Task PerformPrepare(PrepareAction action, bool internalCall, string? version = null) { if(internalCall) Console.WriteLine("=============================="); - + Console.WriteLine("- Prepare the metadata for the next release ..."); - - var appVersion = await this.UpdateAppVersion(action); + + var appVersion = await this.UpdateAppVersion(action, version); if (!string.IsNullOrWhiteSpace(appVersion.VersionText)) { var buildNumber = await this.IncreaseBuildNumber(); @@ -239,17 +277,6 @@ public sealed partial class UpdateMetadataCommands var pathChangelogs = Path.Combine(Environment.GetAIStudioDirectory(), "wwwroot", "changelog"); var nextBuildNumber = currentBuildNumber + 1; - // - // We assume that most of the time, there will be patch releases: - // - var nextMajor = currentAppVersion.Major; - var nextMinor = currentAppVersion.Minor; - var nextPatch = currentAppVersion.Patch + 1; - - var nextAppVersion = $"{nextMajor}.{nextMinor}.{nextPatch}"; - var nextChangelogFilename = $"v{nextAppVersion}.md"; - var nextChangelogFilePath = Path.Combine(pathChangelogs, nextChangelogFilename); - // // Regarding the next build time: We assume that the next release will take place in one week from now. // Thus, we check how many days this month has left. In the end, we want to predict the year and month @@ -259,6 +286,19 @@ public sealed partial class UpdateMetadataCommands var nextBuildYear = (DateTime.Today + TimeSpan.FromDays(7)).Year; var nextBuildTimeString = $"{nextBuildYear}-{nextBuildMonth:00}-xx xx:xx UTC"; + // + // We assume that most of the time, there will be patch releases: + // + // skipping the first 2 digits for major version + var nextBuildYearShort = nextBuildYear - 2000; + var nextMajor = nextBuildYearShort; + var nextMinor = nextBuildMonth; + var nextPatch = currentAppVersion.Major != nextBuildYearShort || currentAppVersion.Minor != nextBuildMonth ? 1 : currentAppVersion.Patch + 1; + + var nextAppVersion = $"{nextMajor}.{nextMinor}.{nextPatch}"; + var nextChangelogFilename = $"v{nextAppVersion}.md"; + var nextChangelogFilePath = Path.Combine(pathChangelogs, nextChangelogFilename); + var changelogHeader = $""" # v{nextAppVersion}, build {nextBuildNumber} ({nextBuildTimeString}) @@ -355,49 +395,69 @@ public sealed partial class UpdateMetadataCommands await File.WriteAllLinesAsync(pathMetadata, lines, Environment.UTF8_NO_BOM); } - private async Task UpdateAppVersion(PrepareAction action) + private async Task UpdateAppVersion(PrepareAction action, string? version = null) { const int APP_VERSION_INDEX = 0; - + if (action == PrepareAction.NONE) { Console.WriteLine("- No action specified. Skipping app version update."); return new(string.Empty, 0, 0, 0); } - + var pathMetadata = Environment.GetMetadataPath(); var lines = await File.ReadAllLinesAsync(pathMetadata, Encoding.UTF8); var currentAppVersionLine = lines[APP_VERSION_INDEX].Trim(); - var currentAppVersion = AppVersionRegex().Match(currentAppVersionLine); - var currentPatch = int.Parse(currentAppVersion.Groups["patch"].Value); - var currentMinor = int.Parse(currentAppVersion.Groups["minor"].Value); - var currentMajor = int.Parse(currentAppVersion.Groups["major"].Value); - - switch (action) + + int newMajor, newMinor, newPatch; + if (action == PrepareAction.SET && !string.IsNullOrWhiteSpace(version)) { - case PrepareAction.PATCH: - currentPatch++; - break; - - case PrepareAction.MINOR: - currentPatch = 0; - currentMinor++; - break; - - case PrepareAction.MAJOR: - currentPatch = 0; - currentMinor = 0; - currentMajor++; - break; + // Parse the provided version string: + var versionMatch = AppVersionRegex().Match(version); + if (!versionMatch.Success) + { + Console.WriteLine($"- Error: Invalid version format '{version}'. Expected format: major.minor.patch (e.g., 26.1.2)"); + return new(string.Empty, 0, 0, 0); + } + + newMajor = int.Parse(versionMatch.Groups["major"].Value); + newMinor = int.Parse(versionMatch.Groups["minor"].Value); + newPatch = int.Parse(versionMatch.Groups["patch"].Value); } - - var updatedAppVersion = $"{currentMajor}.{currentMinor}.{currentPatch}"; + else + { + // Parse current version and increment based on action: + var currentAppVersion = AppVersionRegex().Match(currentAppVersionLine); + newPatch = int.Parse(currentAppVersion.Groups["patch"].Value); + newMinor = int.Parse(currentAppVersion.Groups["minor"].Value); + newMajor = int.Parse(currentAppVersion.Groups["major"].Value); + + switch (action) + { + case PrepareAction.BUILD: + newPatch++; + break; + + case PrepareAction.MONTH: + newPatch = 1; + newMinor++; + break; + + case PrepareAction.YEAR: + newPatch = 1; + newMinor = 1; + newMajor++; + break; + } + } + + var updatedAppVersion = $"{newMajor}.{newMinor}.{newPatch}"; Console.WriteLine($"- Updating app version from '{currentAppVersionLine}' to '{updatedAppVersion}'."); - + lines[APP_VERSION_INDEX] = updatedAppVersion; await File.WriteAllLinesAsync(pathMetadata, lines, Environment.UTF8_NO_BOM); - - return new(updatedAppVersion, currentMajor, currentMinor, currentPatch); + + return new(updatedAppVersion, newMajor, newMinor, newPatch); } private async Task UpdateLicenceYear(string licenceFilePath) diff --git a/app/MindWork AI Studio/Components/Changelog.Logs.cs b/app/MindWork AI Studio/Components/Changelog.Logs.cs index 1d18d95b..785c789d 100644 --- a/app/MindWork AI Studio/Components/Changelog.Logs.cs +++ b/app/MindWork AI Studio/Components/Changelog.Logs.cs @@ -13,6 +13,7 @@ public partial class Changelog public static readonly Log[] LOGS = [ + new (231, "v26.1.1, build 231 (2026-01-11 15:53 UTC)", "v26.1.1.md"), new (230, "v0.10.0, build 230 (2025-12-31 14:04 UTC)", "v0.10.0.md"), new (229, "v0.9.54, build 229 (2025-11-24 18:28 UTC)", "v0.9.54.md"), new (228, "v0.9.53, build 228 (2025-11-14 13:14 UTC)", "v0.9.53.md"), diff --git a/app/MindWork AI Studio/MindWork AI Studio.csproj b/app/MindWork AI Studio/MindWork AI Studio.csproj index 3959573e..b8d8fc2a 100644 --- a/app/MindWork AI Studio/MindWork AI Studio.csproj +++ b/app/MindWork AI Studio/MindWork AI Studio.csproj @@ -52,7 +52,7 @@ - + diff --git a/app/MindWork AI Studio/Pages/Information.razor.cs b/app/MindWork AI Studio/Pages/Information.razor.cs index 7f0a56f9..09510d27 100644 --- a/app/MindWork AI Studio/Pages/Information.razor.cs +++ b/app/MindWork AI Studio/Pages/Information.razor.cs @@ -190,7 +190,7 @@ public partial class Information : MSGComponentBase ## Notice - Copyright 2025 Thorsten Sommer + Copyright 2026 Thorsten Sommer ## Terms and Conditions diff --git a/app/MindWork AI Studio/packages.lock.json b/app/MindWork AI Studio/packages.lock.json index b25b5e55..6a315a34 100644 --- a/app/MindWork AI Studio/packages.lock.json +++ b/app/MindWork AI Studio/packages.lock.json @@ -64,11 +64,11 @@ }, "ReverseMarkdown": { "type": "Direct", - "requested": "[4.7.1, )", - "resolved": "4.7.1", - "contentHash": "Tz8yJXg8J1O9xJn6fXzjeEcLTYjfwbauCGwK4f/dpxOOpo3iniXIggmRlJ7F91yHJPB0Gm4lk1/qV0Jxip4a8A==", + "requested": "[5.0.0, )", + "resolved": "5.0.0", + "contentHash": "Zw7ODMO/P8b4ua9qFdsmZPkPmYGCcSfwhKo8+81PCS0e6P21c9sOlYwVJ3MCEWZAGW+CXJBdF3FKtXKWZWzFTg==", "dependencies": { - "HtmlAgilityPack": "1.12.1" + "HtmlAgilityPack": "1.12.4" } }, "BuildBundlerMinifier": { diff --git a/app/MindWork AI Studio/wwwroot/changelog/v26.1.1.md b/app/MindWork AI Studio/wwwroot/changelog/v26.1.1.md index c1a84f1f..5f2604dd 100644 --- a/app/MindWork AI Studio/wwwroot/changelog/v26.1.1.md +++ b/app/MindWork AI Studio/wwwroot/changelog/v26.1.1.md @@ -1,4 +1,4 @@ -# v26.1.1, build 231 (2026-01-xx xx:xx UTC) +# v26.1.1, build 231 (2026-01-11 15:53 UTC) - Added the option to attach files, including images, to chat templates. You can also define templates with file attachments through a configuration plugin. These file attachments aren’t copied—they’re re-read every time. That means the AI will pick up any updates you make to those files. - Added the option to use source code files in chats and document analysis. This supports software development workflows. - Added a preview feature that lets you record your own voice for transcription. The feature remains in development and appears only when the preview feature is enabled. @@ -8,4 +8,5 @@ - Improved the app versioning. Starting in 2026, each version number includes the year, followed by the month. The last digit shows the release number for that month. For example, version `26.1.1` is the first release in January 2026. - Fixed a bug in the profile selection where the "Use no profile" entry could not be localized, causing English text to appear in languages such as German. This behavior has now been fixed. - Fixed a bug in the provider dialogs (LLMs, embeddings, and transcriptions) when editing a provider. In cases where an error had to be displayed, a non-localized message in English was used. -- Fixed a very rare bug in the provider dialogs (LLMs, embeddings, and transcriptions) where a validation error appeared if the API key could not be read from the operating system, but the error did not clear after the user changed the API key. \ No newline at end of file +- Fixed a very rare bug in the provider dialogs (LLMs, embeddings, and transcriptions) where a validation error appeared if the API key could not be read from the operating system, but the error did not clear after the user changed the API key. +- Upgraded dependencies. \ No newline at end of file diff --git a/app/MindWork AI Studio/wwwroot/changelog/v26.1.2.md b/app/MindWork AI Studio/wwwroot/changelog/v26.1.2.md new file mode 100644 index 00000000..4e5fd360 --- /dev/null +++ b/app/MindWork AI Studio/wwwroot/changelog/v26.1.2.md @@ -0,0 +1 @@ +# v26.1.2, build 232 (2026-01-xx xx:xx UTC) diff --git a/metadata.txt b/metadata.txt index 906a4a3c..73d10f27 100644 --- a/metadata.txt +++ b/metadata.txt @@ -1,11 +1,11 @@ -0.10.0 -2025-12-31 14:04:01 UTC -230 +26.1.1 +2026-01-11 15:53:55 UTC +231 9.0.112 (commit 49aa03442a) 9.0.11 (commit fa7cdded37) 1.92.0 (commit ded5c06cf) 8.15.0 1.8.1 -783782bad99, release +4cf44e91d2c, release osx-arm64 137.0.7215.0 \ No newline at end of file diff --git a/runtime/Cargo.lock b/runtime/Cargo.lock index 0b836ff8..7da20043 100644 --- a/runtime/Cargo.lock +++ b/runtime/Cargo.lock @@ -2741,7 +2741,7 @@ checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] name = "mindwork-ai-studio" -version = "0.10.0" +version = "26.1.1" dependencies = [ "aes", "arboard", diff --git a/runtime/Cargo.toml b/runtime/Cargo.toml index 5a1e7c87..251ee1ce 100644 --- a/runtime/Cargo.toml +++ b/runtime/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mindwork-ai-studio" -version = "0.10.0" +version = "26.1.1" edition = "2021" description = "MindWork AI Studio" authors = ["Thorsten Sommer"] diff --git a/runtime/tauri.conf.json b/runtime/tauri.conf.json index 91579b01..8823cac4 100644 --- a/runtime/tauri.conf.json +++ b/runtime/tauri.conf.json @@ -6,7 +6,7 @@ }, "package": { "productName": "MindWork AI Studio", - "version": "0.10.0" + "version": "26.1.1" }, "tauri": { "allowlist": {