Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,24 @@
# Changelog

## 2.1.2, 2026-07-18

### Neu

- Native Linux-Titelleiste mit Minimieren, Maximieren und Schließen
- Abgesicherter Titelleisten-Patch für bestehende und neu aufgebaute Laufzeiten

### Geändert

- Der native Aufbau aktiviert die Linux-Systemdekoration nach dem Entpacken der Kimi-Anwendung

### Behoben

- Fehlende Fensterknöpfe unter Linux

### Entfernt

- Keine Änderungen

## 2.1.1, 2026-07-18

### Neu
Expand Down
3 changes: 2 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,14 +25,15 @@ Bei jeder vollständigen Installation wird die aktuell von Moonshot AI angeboten
- Start über das Programmmenü und als systemd-Benutzerdienst
- Sicheres Update-Skript mit Versionsprüfung und atomarem Austausch
- Kimi K3 über die aktuelle Kimi-Work-Modellauswahl
- Native Linux-Fensterknöpfe für Minimieren, Maximieren und Schließen

## Unterstützter Stand

| Komponente | Version |
| --- | --- |
| Kimi Work | 3.1.2 |
| Kimi-Modell | Kimi K3 verfügbar |
| Kimi Work Linux | 2.1.1 |
| Kimi Work Linux | 2.1.2 |
| Electron | 41.7.2 |
| Kimi Node-Laufzeit | 24.15.0 |
| Plattform | Linux x86_64 mit glibc und systemd |
Expand Down
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "kimi-work-linux",
"version": "2.1.1",
"version": "2.1.2",
"private": true,
"description": "Unofficial native Linux runtime for Kimi Work",
"license": "MIT",
Expand Down
77 changes: 77 additions & 0 deletions scripts/native-setup.sh
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,17 @@ OFFICIAL_DOWNLOAD_URL='https://appsupport.moonshot.cn/api/app/pkg/latest/windows
NODE_VERSION='v24.15.0'
NODE_ARCHIVE_NAME="node-${NODE_VERSION}-linux-x64.tar.gz"
NODE_ARCHIVE_SHA='44836872d9aec49f1e6b52a9a922872db9a2b02d235a616a5681b6a85fec8d89'
PATCH_ONLY=false

# Erlaubt eine abgesicherte Aktualisierung der vorhandenen Fenstertitelleiste.
if [[ "${1:-}" == '--patch-linux-titlebar-only' ]]; then
PATCH_ONLY=true
shift
fi
[[ "$#" -eq 0 ]] || {
printf 'Fehler: Unbekanntes Argument: %s\n' "$1" >&2
exit 64
}

# Gibt Fehler vollständig aus und beendet den Aufbau.
fail() {
Expand All @@ -34,6 +45,71 @@ cleanup() {
}
trap cleanup EXIT

# Aktiviert unter Linux die native Titelleiste mit den drei Systemschaltflächen.
patch_linux_titlebar() {
local app_archive="$1"
local patch_dir="${temporary_dir}/linux-titlebar"
local source_dir="${patch_dir}/source"
local main_process_file="${source_dir}/out/main/index.js"
local patched_archive="${patch_dir}/app.asar"

[[ -f "$app_archive" ]] || fail "Das Kimi Anwendungsarchiv fehlt: ${app_archive}"
rm -rf -- "$patch_dir"
mkdir -p "$source_dir"
"${PROJECT_DIR}/node_modules/.bin/asar" extract "$app_archive" "$source_dir"
[[ -f "$main_process_file" ]] || fail 'Der Kimi Hauptprozess für die Titelleistenanpassung fehlt.'

# Ersetzt ausschließlich die zwei in Kimi 3.1.2 geprüften Fensteroptionen.
node - "$main_process_file" <<'NODE'
const fs = require('fs')

const mainProcessFile = process.argv[2]
const source = fs.readFileSync(mainProcessFile, 'utf8')
const original = 'titleBarStyle: process.platform === "darwin" ? "hiddenInset" : "hidden",'
const replacement = 'titleBarStyle: process.platform === "darwin" ? "hiddenInset" : process.platform === "linux" ? "default" : "hidden",'
const count = (text, value) => text.split(value).length - 1
const originalCount = count(source, original)
const replacementCount = count(source, replacement)

if (replacementCount === 2 && originalCount === 0) {
process.stdout.write('Die Linux Titelleiste ist bereits aktiviert.\n')
process.exit(0)
}

if (originalCount !== 2 || replacementCount !== 0) {
process.stderr.write(
`Fehler: Unerwartete Kimi Fensterkonfiguration. Erwartet wurden 2 unveränderte Fundstellen, gefunden wurden ${originalCount}.\n`,
)
process.exit(1)
}

const patched = source.split(original).join(replacement)
if (count(patched, replacement) !== 2 || count(patched, original) !== 0) {
process.stderr.write('Fehler: Die Linux Titelleiste konnte nicht eindeutig aktiviert werden.\n')
process.exit(1)
}

fs.writeFileSync(mainProcessFile, patched)
process.stdout.write('Die native Linux Titelleiste wurde in 2 Kimi Fenstern aktiviert.\n')
NODE

"${PROJECT_DIR}/node_modules/.bin/asar" pack "$source_dir" "$patched_archive"
"${PROJECT_DIR}/node_modules/.bin/asar" list "$patched_archive" \
| grep -qx '/out/main/index.js' \
|| fail 'Das neu gepackte Kimi Archiv enthält keinen Hauptprozess.'
install -m 0644 "$patched_archive" "${app_archive}.tmp"
mv "${app_archive}.tmp" "$app_archive"
}

# Passt auf ausdrücklichen internen Aufruf nur die vorhandene Laufzeit an.
if [[ "$PATCH_ONLY" == true ]]; then
systemctl --user is-active --quiet kimi-work-native.service \
&& fail 'Kimi Work muss vor der Titelleistenanpassung beendet werden.'
patch_linux_titlebar "${APP_DIR}/resources/app.asar"
printf '%s\n' 'Die vorhandene Kimi Linux Laufzeit wurde erfolgreich angepasst.'
exit 0
fi

# Lädt das unveränderte aktuelle Kimi Originalpaket herunter.
mkdir -p "$CACHE_DIR"
installer_path="${CACHE_DIR}/kimi-work-latest.exe"
Expand Down Expand Up @@ -70,6 +146,7 @@ new_app_dir="${temporary_dir}/app"
cp -a "${PROJECT_DIR}/node_modules/electron/dist" "$new_app_dir"
mv "${new_app_dir}/electron" "${new_app_dir}/kimi-desktop"
install -m 0644 "${official_dir}/resources/app.asar" "${new_app_dir}/resources/app.asar"
patch_linux_titlebar "${new_app_dir}/resources/app.asar"
resource_dir="${new_app_dir}/resources/resources"
mkdir -p "${resource_dir}/runtime" "${resource_dir}/skills"

Expand Down
Loading