Fixed changelog encoding & prepared re-release v26.4.1 (#745)
Some checks are pending
Build and Release / Build app (${{ matrix.dotnet_runtime }}) (-x86_64-apple-darwin, osx-x64, macos-latest, x86_64-apple-darwin, dmg,updater, dmg) (push) Blocked by required conditions
Build and Release / Build app (${{ matrix.dotnet_runtime }}) (-x86_64-pc-windows-msvc.exe, win-x64, windows-latest, x86_64-pc-windows-msvc, nsis,updater, nsis) (push) Blocked by required conditions
Build and Release / Build app (${{ matrix.dotnet_runtime }}) (-x86_64-unknown-linux-gnu, linux-x64, ubuntu-22.04, x86_64-unknown-linux-gnu, appimage,deb,updater, appimage,deb) (push) Blocked by required conditions
Build and Release / Prepare & create release (push) Blocked by required conditions
Build and Release / Determine run mode (push) Waiting to run
Build and Release / Read metadata (push) Blocked by required conditions
Build and Release / Build app (${{ matrix.dotnet_runtime }}) (-aarch64-apple-darwin, osx-arm64, macos-latest, aarch64-apple-darwin, dmg,updater, dmg) (push) Blocked by required conditions
Build and Release / Build app (${{ matrix.dotnet_runtime }}) (-aarch64-pc-windows-msvc.exe, win-arm64, windows-latest, aarch64-pc-windows-msvc, nsis,updater, nsis) (push) Blocked by required conditions
Build and Release / Build app (${{ matrix.dotnet_runtime }}) (-aarch64-unknown-linux-gnu, linux-arm64, ubuntu-22.04-arm, aarch64-unknown-linux-gnu, appimage,deb,updater, appimage,deb) (push) Blocked by required conditions
Build and Release / Publish release (push) Blocked by required conditions

This commit is contained in:
Thorsten Sommer 2026-04-17 19:30:13 +02:00 committed by GitHub
parent 7cead79245
commit 519abe4fc2
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
9 changed files with 80 additions and 22 deletions

View File

@ -976,25 +976,36 @@ jobs:
FORMATTED_BUILD_TIME: ${{ needs.read_metadata.outputs.formatted_build_time }}
CHANGELOG: ${{ needs.read_metadata.outputs.changelog }}
run: |
run: |
# Read the platforms JSON, which was created in the previous step:
platforms=$(cat $GITHUB_WORKSPACE/.updates/platforms.json)
# Replace newlines in changelog with \n
changelog=$(echo "$CHANGELOG" | awk '{printf "%s\\n", $0}')
# Escape double quotes in changelog:
changelog=$(echo "$changelog" | sed 's/"/\\"/g')
# Create the latest.json file:
cat <<EOOOF > $GITHUB_WORKSPACE/release/assets/latest.json
{
"version": "$FORMATTED_VERSION",
"notes": "$changelog",
"pub_date": "$FORMATTED_BUILD_TIME",
"platforms": $platforms
}
EOOOF
# Create the latest.json file via jq so the changelog is escaped as valid JSON.
jq -n \
--arg version "$FORMATTED_VERSION" \
--arg notes "$CHANGELOG" \
--arg pub_date "$FORMATTED_BUILD_TIME" \
--argjson platforms "$platforms" \
'{
version: $version,
notes: $notes,
pub_date: $pub_date,
platforms: $platforms
}' > $GITHUB_WORKSPACE/release/assets/latest.json
- name: Validate latest.json
env:
CHANGELOG: ${{ needs.read_metadata.outputs.changelog }}
run: |
# Ensure the generated file is valid JSON and the changelog round-trips unchanged.
jq -e . $GITHUB_WORKSPACE/release/assets/latest.json > /dev/null
generated_notes=$(jq -r '.notes' $GITHUB_WORKSPACE/release/assets/latest.json)
if [[ "$generated_notes" != "$CHANGELOG" ]]; then
echo "The generated notes field does not match the changelog input."
exit 1
fi
- name: Show all release assets
run: ls -Rlhat $GITHUB_WORKSPACE/release/assets

View File

@ -7513,6 +7513,9 @@ UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::RUSTSERVICE::T4007657575"] = "Failed
-- No update found.
UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::UPDATESERVICE::T1015418291"] = "No update found."
-- Failed to check for updates. Please try again later.
UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::UPDATESERVICE::T1064148123"] = "Failed to check for updates. Please try again later."
-- Failed to install update automatically. Please try again manually.
UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::UPDATESERVICE::T3709709946"] = "Failed to install update automatically. Please try again manually."

View File

@ -13,7 +13,7 @@ public partial class Changelog
public static readonly Log[] LOGS =
[
new (235, "v26.4.1, build 235 (2026-04-17 09:48 UTC)", "v26.4.1.md"),
new (235, "v26.4.1, build 235 (2026-04-17 17:25 UTC)", "v26.4.1.md"),
new (234, "v26.2.2, build 234 (2026-02-22 14:16 UTC)", "v26.2.2.md"),
new (233, "v26.2.1, build 233 (2026-02-01 19:16 UTC)", "v26.2.1.md"),
new (232, "v26.1.2, build 232 (2026-01-25 14:05 UTC)", "v26.1.2.md"),

View File

@ -7515,6 +7515,9 @@ UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::RUSTSERVICE::T4007657575"] = "Abrufe
-- No update found.
UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::UPDATESERVICE::T1015418291"] = "Kein Update gefunden."
-- Failed to check for updates. Please try again later.
UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::UPDATESERVICE::T1064148123"] = "Die Suche nach Updates ist fehlgeschlagen. Bitte versuchen Sie es später erneut."
-- Failed to install update automatically. Please try again manually.
UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::UPDATESERVICE::T3709709946"] = "Fehler bei der automatischen Installation des Updates. Bitte versuchen Sie es manuell erneut."

View File

@ -7515,6 +7515,9 @@ UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::RUSTSERVICE::T4007657575"] = "Failed
-- No update found.
UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::UPDATESERVICE::T1015418291"] = "No update found."
-- Failed to check for updates. Please try again later.
UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::UPDATESERVICE::T1064148123"] = "Failed to check for updates. Please try again later."
-- Failed to install update automatically. Please try again manually.
UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::UPDATESERVICE::T3709709946"] = "Failed to install update automatically. Please try again manually."

View File

@ -10,6 +10,22 @@ public sealed partial class RustService
{
var cts = new CancellationTokenSource(TimeSpan.FromSeconds(45));
var response = await this.http.GetFromJsonAsync<UpdateResponse>("/updates/check", this.jsonRustSerializerOptions, cts.Token);
if (response == default)
{
this.logger!.LogError("Failed to check for an update: the Rust endpoint returned an empty response.");
return new UpdateResponse
{
Error = true,
UpdateIsAvailable = false,
NewVersion = string.Empty,
Changelog = string.Empty
};
}
if (response.Error)
this.logger!.LogWarning("The Rust updater reported an error while checking for updates.");
this.logger!.LogInformation($"Checked for an update: update available='{response.UpdateIsAvailable}'; error='{response.Error}'; next version='{response.NewVersion}'; changelog len='{response.Changelog.Length}'");
return response;
}
@ -20,6 +36,8 @@ public sealed partial class RustService
{
Error = true,
UpdateIsAvailable = false,
NewVersion = string.Empty,
Changelog = string.Empty
};
}
}

View File

@ -16,14 +16,16 @@ public sealed class UpdateService : BackgroundService, IMessageBusReceiver
private readonly SettingsManager settingsManager;
private readonly MessageBus messageBus;
private readonly RustService rust;
private readonly ILogger<UpdateService> logger;
private TimeSpan updateInterval;
public UpdateService(MessageBus messageBus, SettingsManager settingsManager, RustService rust)
public UpdateService(MessageBus messageBus, SettingsManager settingsManager, RustService rust, ILogger<UpdateService> logger)
{
this.settingsManager = settingsManager;
this.messageBus = messageBus;
this.rust = rust;
this.logger = logger;
this.messageBus.RegisterComponent(this);
this.ApplyFilters([], [ Event.USER_SEARCH_FOR_UPDATE ]);
@ -113,6 +115,23 @@ public sealed class UpdateService : BackgroundService, IMessageBusReceiver
return;
var response = await this.rust.CheckForUpdate();
if (response.Error)
{
this.logger.LogWarning("Update check failed. The updater did not return a usable result.");
if (notifyUserWhenNoUpdate)
{
SNACKBAR!.Add(TB("Failed to check for updates. Please try again later."), Severity.Error, config =>
{
config.Icon = Icons.Material.Filled.Error;
config.IconSize = Size.Large;
config.IconColor = Color.Error;
});
}
return;
}
if (response.UpdateIsAvailable)
{
// ReSharper disable RedundantAssignment

View File

@ -1,4 +1,4 @@
# v26.4.1, build 235 (2026-04-17 09:48 UTC)
# v26.4.1, build 235 (2026-04-17 17:25 UTC)
- Added support for the latest AI models, e.g., Qwen 3.5 & 3.6-family, Mistral Large 3 & Small 4, OpenAI GPT 5.4, Claude Opus 4.7 etc.
- Added assistant plugins, making it possible to extend AI Studio with custom assistants. Many thanks to Nils Kruthof `nilskruthoff` for this contribution.
- Added a slide planner assistant, which helps you turn longer texts or documents into clear, structured presentation slides. Many thanks to Sabrina `Sabrina-devops` for her wonderful work on this assistant.
@ -29,6 +29,7 @@
- Improved the translation assistant by updating the system and user prompts.
- Improved how results from assistants are transferred into chats, so follow-up conversations now show clearer context while keeping the chat easier to understand.
- Improved OpenAI-compatible providers by refactoring their streaming request handling to be more consistent and reliable.
- Improved the app update check so malformed update metadata is handled more reliably and users now receive a clear error message instead of a misleading "No update found" response.
- Fixed an issue where assistants hidden via configuration plugins still appear in "Send to ..." menus. Thanks, Gunnar, for reporting this issue.
- Fixed an issue with chat templates that could stop working because the stored validation result for attached files was reused. AI Studio now checks attached files again when you use a chat template.
- Fixed an issue with voice recording where AI Studio could log errors and keep the feature available even though required parts failed to initialize. Voice recording is now disabled automatically for the current session in that case.

View File

@ -1,12 +1,12 @@
26.4.1
2026-04-17 09:48:42 UTC
2026-04-17 17:25:44 UTC
235
9.0.116 (commit fb4af7e1b3)
9.0.15 (commit 4250c8399a)
1.93.1 (commit 01f6ddf75)
8.15.0
1.8.3
0c87a491ace, release
c6ed7e3c0ce, release
osx-arm64
144.0.7543.0
1.17.1