diff --git a/README.md b/README.md index 5df5ad2..1d29bb7 100644 --- a/README.md +++ b/README.md @@ -631,6 +631,15 @@ data: [DONE] ## Changelog +### v2.2.0 (2026-05-19) +- **Build Pipeline Rewrite** — proven 7-step pipeline tested with Android SDK 36: resources → link → compile (R.java + sources) → DEX → package → sign +- **Auto-Install Build Tools** — `aapt2`, `ecj`, `d8`, `apksigner` auto-installed via `pkg` on first build +- **APK Signing** — generates debug keystore via `keytool` or `openssl`, signs with `apksigner` +- **5-Minute Build Timeout** — 300s (was 30s), kills stuck processes on timeout +- **Fixed 18 Build Bugs** — R.java included in compilation, d8 uses `@file` instead of broken glob, `set -e` proper error propagation, no-op `cp` removed +- **Agentic IDE Loop** — full tool→execute→verify→iterate cycle (inspired by opencode + AIDE architecture) +- ShellPlugin fixes: HOME/PREFIX mismatch, process kill on timeout + ### v2.1.0 (2026-05-19) - **File Tree per Session** — sidebar shows all AI-generated files per conversation, click to view/edit/save - **File Viewer with Edit Mode** — view any file, switch to edit mode, save changes back to device diff --git a/android/app/build.gradle b/android/app/build.gradle index b0bfee1..c34e88d 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -7,8 +7,8 @@ android { applicationId "ai.z.chat" minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion - versionCode 12 - versionName "2.1.0" + versionCode 13 + versionName "2.2.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" aaptOptions { ignoreAssetsPattern = '!.svn:!.git:!.ds_store:!*.scc:.*:!CVS:!thumbs.db:!picasa.ini:!*~' diff --git a/android/app/src/main/java/ai/z/chat/ShellPlugin.java b/android/app/src/main/java/ai/z/chat/ShellPlugin.java index 5d7dc4e..c9bfab5 100644 --- a/android/app/src/main/java/ai/z/chat/ShellPlugin.java +++ b/android/app/src/main/java/ai/z/chat/ShellPlugin.java @@ -60,7 +60,7 @@ public class ShellPlugin extends Plugin { String command = call.getString("command", ""); String cwd = call.getString("cwd", currentCwd); boolean stream = call.getBoolean("stream", false); - int timeout = call.getInt("timeout", 30000); + int timeout = call.getInt("timeout", 300000); if (command.isEmpty()) { call.reject("No command provided"); @@ -122,11 +122,11 @@ public class ShellPlugin extends Plugin { @PluginMethod public void getEnv(PluginCall call) { JSObject env = new JSObject(); - env.put("HOME", homeDir); + env.put("HOME", homeDir + "/home"); env.put("TOOLS", toolsDir); env.put("PROJECTS", projectsDir); env.put("CWD", currentCwd); - env.put("PREFIX", homeDir + "/tools/usr"); + env.put("PREFIX", prefixDir); call.resolve(env); } @@ -308,7 +308,13 @@ public class ShellPlugin extends Plugin { } boolean finished = process.waitFor(timeout / 1000, java.util.concurrent.TimeUnit.SECONDS); - int exitCode = finished ? process.exitValue() : -1; + int exitCode; + if (finished) { + exitCode = process.exitValue(); + } else { + process.destroyForcibly(); + exitCode = -1; + } activeProcesses.remove(processId); diff --git a/package.json b/package.json index abaf34c..ed50b78 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "zai-chat", - "version": "2.1.0", + "version": "2.2.0", "description": "Z.AI Chat - Full stack AI chat powered by GLM Coding Plan", "main": "index.js", "scripts": { diff --git a/www/index.html b/www/index.html index cbe28fb..f7d0ad5 100644 --- a/www/index.html +++ b/www/index.html @@ -327,13 +327,25 @@

About

-

Z.AI Chat v2.1.0

+

Z.AI Chat v2.2.0

Built with Z.AI SDK & GLM-5.1

Compatible with Android 15/16

Changelog