diff --git a/Cargo.lock b/Cargo.lock index 443d133a3e..119a4815a5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1266,7 +1266,7 @@ dependencies = [ [[package]] name = "gjc-sdk" -version = "0.11.8" +version = "0.11.10" dependencies = [ "futures-util", "hmac", @@ -2364,7 +2364,7 @@ dependencies = [ [[package]] name = "pi-ast" -version = "0.11.8" +version = "0.11.10" dependencies = [ "anyhow", "ast-grep-core", @@ -2432,7 +2432,7 @@ dependencies = [ [[package]] name = "pi-iso" -version = "0.11.8" +version = "0.11.10" dependencies = [ "async-trait", "libc", @@ -2444,7 +2444,7 @@ dependencies = [ [[package]] name = "pi-natives" -version = "0.11.8" +version = "0.11.10" dependencies = [ "anyhow", "arboard", @@ -2492,7 +2492,7 @@ dependencies = [ [[package]] name = "pi-shell" -version = "0.11.8" +version = "0.11.10" dependencies = [ "anyhow", "brush-builtins", diff --git a/Cargo.toml b/Cargo.toml index d48e7f8c38..7c76188625 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,7 +4,7 @@ exclude = ["crates/brush-core-vendored", "crates/brush-builtins-vendored", "crat resolver = "3" [workspace.package] -version = "0.11.8" +version = "0.11.10" edition = "2024" license = "MIT" authors = ["Yeachan-Heo"] diff --git a/bun.lock b/bun.lock index 7e3b84e124..1f92d05053 100644 --- a/bun.lock +++ b/bun.lock @@ -14,7 +14,7 @@ }, "packages/agent": { "name": "@gajae-code/agent-core", - "version": "0.11.8", + "version": "0.11.10", "dependencies": { "@gajae-code/ai": "catalog:", "@gajae-code/natives": "catalog:", @@ -29,7 +29,7 @@ }, "packages/ai": { "name": "@gajae-code/ai", - "version": "0.11.8", + "version": "0.11.10", "bin": { "pi-ai": "./src/cli.ts", }, @@ -47,14 +47,14 @@ }, "packages/bridge-client": { "name": "@gajae-code/bridge-client", - "version": "0.11.8", + "version": "0.11.10", "devDependencies": { "@types/bun": "catalog:", }, }, "packages/coding-agent": { "name": "@gajae-code/coding-agent", - "version": "0.11.8", + "version": "0.11.10", "bin": { "gjc": "bin/gjc.js", }, @@ -95,7 +95,7 @@ }, "packages/gajae-code": { "name": "gajae-code", - "version": "0.11.8", + "version": "0.11.10", "bin": { "gjc": "bin/gjc.js", }, @@ -105,7 +105,7 @@ }, "packages/natives": { "name": "@gajae-code/natives", - "version": "0.11.8", + "version": "0.11.10", "devDependencies": { "@napi-rs/cli": "catalog:", "@types/bun": "catalog:", @@ -121,23 +121,23 @@ }, "packages/natives-darwin-arm64": { "name": "@gajae-code/natives-darwin-arm64", - "version": "0.11.8", + "version": "0.11.10", }, "packages/natives-darwin-x64": { "name": "@gajae-code/natives-darwin-x64", - "version": "0.11.8", + "version": "0.11.10", }, "packages/natives-linux-arm64": { "name": "@gajae-code/natives-linux-arm64", - "version": "0.11.8", + "version": "0.11.10", }, "packages/natives-linux-x64": { "name": "@gajae-code/natives-linux-x64", - "version": "0.11.8", + "version": "0.11.10", }, "packages/natives-win32-x64": { "name": "@gajae-code/natives-win32-x64", - "version": "0.11.8", + "version": "0.11.10", }, "packages/orchestration-token-benchmark": { "name": "@gajae-code/orchestration-token-benchmark", @@ -148,7 +148,7 @@ }, "packages/stats": { "name": "@gajae-code/stats", - "version": "0.11.8", + "version": "0.11.10", "bin": { "gjc-stats": "./src/index.ts", }, @@ -173,7 +173,7 @@ }, "packages/tui": { "name": "@gajae-code/tui", - "version": "0.11.8", + "version": "0.11.10", "dependencies": { "@gajae-code/natives": "catalog:", "@gajae-code/utils": "catalog:", @@ -214,7 +214,7 @@ }, "packages/utils": { "name": "@gajae-code/utils", - "version": "0.11.8", + "version": "0.11.10", "dependencies": { "@gajae-code/natives": "catalog:", "beautiful-mermaid": "catalog:", @@ -237,19 +237,19 @@ "@biomejs/biome": "2.5.2", "@bufbuild/protobuf": "^2.12.0", "@bufbuild/protoc-gen-es": "^2.12.0", - "@gajae-code/agent-core": "0.11.8", - "@gajae-code/ai": "0.11.8", - "@gajae-code/bridge-client": "0.11.8", - "@gajae-code/coding-agent": "0.11.8", - "@gajae-code/natives": "0.11.8", - "@gajae-code/natives-darwin-arm64": "0.11.8", - "@gajae-code/natives-darwin-x64": "0.11.8", - "@gajae-code/natives-linux-arm64": "0.11.8", - "@gajae-code/natives-linux-x64": "0.11.8", - "@gajae-code/natives-win32-x64": "0.11.8", - "@gajae-code/stats": "0.11.8", - "@gajae-code/tui": "0.11.8", - "@gajae-code/utils": "0.11.8", + "@gajae-code/agent-core": "0.11.10", + "@gajae-code/ai": "0.11.10", + "@gajae-code/bridge-client": "0.11.10", + "@gajae-code/coding-agent": "0.11.10", + "@gajae-code/natives": "0.11.10", + "@gajae-code/natives-darwin-arm64": "0.11.10", + "@gajae-code/natives-darwin-x64": "0.11.10", + "@gajae-code/natives-linux-arm64": "0.11.10", + "@gajae-code/natives-linux-x64": "0.11.10", + "@gajae-code/natives-win32-x64": "0.11.10", + "@gajae-code/stats": "0.11.10", + "@gajae-code/tui": "0.11.10", + "@gajae-code/utils": "0.11.10", "@mozilla/readability": "^0.6.0", "@napi-rs/cli": "3.6.2", "@opentelemetry/api": "^1.9.0", @@ -344,7 +344,7 @@ "@borewit/text-codec": ["@borewit/text-codec@0.2.2", "", {}, "sha512-DDaRehssg1aNrH4+2hnj1B7vnUGEjU6OIlyRdkMd0aUdIUvKXrJfXsy8LVtXAy7DRvYVluWbMspsRhz2lcW0mQ=="], - "@bufbuild/protobuf": ["@bufbuild/protobuf@2.12.1", "", {}, "sha512-BvAMfS6LrgZiryOAZ4pBYucu4wG/Ei/9o9DZ9akbREnMLbPJiom2i8b9C8IsKErQoiKqVhrerzt3kOT/RrzLHg=="], + "@bufbuild/protobuf": ["@bufbuild/protobuf@2.13.0", "", {}, "sha512-acq7c49vxfm1ggJ95P70TX7ABDM0vxr1SYD3BB0o0jnBLB4OAqeHyKuN+cD3w80gXEDQ2zxHpR6CUeA+O/aU9g=="], "@colors/colors": ["@colors/colors@1.6.0", "", {}, "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA=="], @@ -566,15 +566,15 @@ "@opentelemetry/api": ["@opentelemetry/api@1.9.1", "", {}, "sha512-gLyJlPHPZYdAk1JENA9LeHejZe1Ti77/pTeFm/nMXmQH/HFZlcS/O2XJB+L8fkbrNSqhdtlvjBVjxwUYanNH5Q=="], - "@opentelemetry/context-async-hooks": ["@opentelemetry/context-async-hooks@2.9.0", "", { "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-OQ0vzvbZBiUhjqLnUaoNfYmP8553Crr3aggB4y0ZUi815mZ7idpdJXQmoKdeBKJelYttoBlLSSHubmyw3wvX4w=="], + "@opentelemetry/context-async-hooks": ["@opentelemetry/context-async-hooks@2.10.0", "", { "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-bvyMcgLEkozzSzpEEEo1OMoeQ97bxj6Qs2uN3mPrSdDvObMI1myffD/BPqcLlzZO9//d1SqQA/WPw7Cz2AiqhA=="], - "@opentelemetry/core": ["@opentelemetry/core@2.9.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-m2nckMT80NnmjTYSPjJQObBJ+8dgkoajEOUbznL8AHZ3T3yHRk2P7gI1PhEBc1+lOnrYE9UWrWHqJDsmqjmNbw=="], + "@opentelemetry/core": ["@opentelemetry/core@2.10.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-/wNZ8twnEQQA4HoHu22+vcsdru6pWPWxW+7w+FlxT6Id7PE/WIbZmVKkte+PF72e0F2dnImFeHD2syyE1Mw6MQ=="], - "@opentelemetry/resources": ["@opentelemetry/resources@2.9.0", "", { "dependencies": { "@opentelemetry/core": "2.9.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-jyA5MBLQ+Dkl3+JsZkUoUvL7yHvU64kLsvpXKarWm6347Sl1t1bXFTFykUePNpT5WH5pm9a2Qtt03iIYQhZ1Fg=="], + "@opentelemetry/resources": ["@opentelemetry/resources@2.10.0", "", { "dependencies": { "@opentelemetry/core": "2.10.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-q6MMm2zhggzsHVNbabYwut+a6nbuQQe3URUoxaojM/8K1IBfwwPzvxIjNi2/lI1TFe+fMHMW9MWhrtDLEXEnkA=="], - "@opentelemetry/sdk-trace": ["@opentelemetry/sdk-trace@2.9.0", "", { "dependencies": { "@opentelemetry/core": "2.9.0", "@opentelemetry/resources": "2.9.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-sGA19HvtrrSKYsseHphluH6j3p6Xa3fqc7c7y8f/7mYWejc1lyDFcpSdD1kYa50HCLUeEo4zA5bW0pniaPszuw=="], + "@opentelemetry/sdk-trace": ["@opentelemetry/sdk-trace@2.10.0", "", { "dependencies": { "@opentelemetry/core": "2.10.0", "@opentelemetry/resources": "2.10.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-MfQGq3GRmTh5fM/y+OjaO0vj6+luCB1XO2gfXCalKCfgKw0eHL++sm75DNweC6ohlp+aFvACqeE0fYayqdRaoQ=="], - "@opentelemetry/sdk-trace-base": ["@opentelemetry/sdk-trace-base@2.9.0", "", { "dependencies": { "@opentelemetry/core": "2.9.0", "@opentelemetry/resources": "2.9.0", "@opentelemetry/sdk-trace": "2.9.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-cp9zmTl62R8PJrpvFcmc8N2JQU/xfa0S+61q511Nji+QxCfZ8Ifvg7H27G8cANe4crg4RTrWsVvanHiXjSp6ag=="], + "@opentelemetry/sdk-trace-base": ["@opentelemetry/sdk-trace-base@2.10.0", "", { "dependencies": { "@opentelemetry/core": "2.10.0", "@opentelemetry/resources": "2.10.0", "@opentelemetry/sdk-trace": "2.10.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-GuYQQT7QD2EeO8lcZLRQzcbOyhqAzL+6WWTKTU9mSUBYBazkEDl+VrQcXQhbB08OWM9anD1aHleVadzulpOaUQ=="], "@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.43.0", "", {}, "sha512-eSYWTm620tTk45EKSedaUL8MFYI8hW164hIXsgIHyxu3VobUB3fFCu5t0hQby6OoWRPsG1KkKUG2M5UadiLiVg=="], @@ -682,7 +682,7 @@ "bare-stream": ["bare-stream@2.13.3", "", { "dependencies": { "b4a": "^1.8.1", "streamx": "^2.25.0", "teex": "^1.0.1" }, "peerDependencies": { "bare-abort-controller": "*", "bare-buffer": "*", "bare-events": "*" }, "optionalPeers": ["bare-abort-controller", "bare-buffer", "bare-events"] }, "sha512-Kc+brLqvEqGkjyfiwJmImAOqLZL7OsoLKuavx+hJjgVV3nLTOjloJyPMFxjUPerGGHrNH0fLU06jjykMLWrERQ=="], - "bare-url": ["bare-url@2.4.5", "", { "dependencies": { "bare-path": "^3.0.0" } }, "sha512-K+y9xF1tN+CdPu4qWwr0QiK1Al07eFPGYK5M2pDXcmHdMdgC/tT/bpmMe1hrmRHaidKLkXrC+cRNYf3XVDUhSQ=="], + "bare-url": ["bare-url@2.4.6", "", { "dependencies": { "bare-path": "^3.0.0" } }, "sha512-iQxPClE07hETVpbRoX7JXX3v/ZQViCxe/SYCxylRLzdEx1xJAufPptfiOqR8tqiCtmbtMDANKWszzjLu1PMAZQ=="], "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="], @@ -996,9 +996,9 @@ "picomatch": ["picomatch@4.0.5", "", {}, "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A=="], - "postcss": ["postcss@8.5.19", "", { "dependencies": { "nanoid": "^3.3.12", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-Mz8SaolMd8nB+G13WkORcxQKHZ/NE4xXevtkJHVuG+guo9/wYKlIMTKAqGdEmYOXR2ijPjTYNHssizdaVSUNdQ=="], + "postcss": ["postcss@8.5.21", "", { "dependencies": { "nanoid": "^3.3.16", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-v4sDNP3fdNiWMfabO7OwOQdOX8TiQSztKyT1Wj0w+j7LDallJThJRBBBmzVGyYj0crMh7jlV4zepPkiNu9UwDQ=="], - "prettier": ["prettier@3.9.5", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-/FVl766LpUfB5vXgCYOYa0MeV/441Ia99AeICQIQFTY/Nw0roZwULcXpku5i1/m5kt/baz+s4Zogspd839HSMg=="], + "prettier": ["prettier@3.9.6", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-OpN0zzVdiaiAhxpuuj5efpIS4sY9j7bY6uR5mnj5yPzGkdkjNKSJeUThPb60Jw29QuAZgA4o+/iB49kFiaBX6g=="], "process-nextick-args": ["process-nextick-args@2.0.1", "", {}, "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="], diff --git a/crates/pi-natives/src/lib.rs b/crates/pi-natives/src/lib.rs index 21b6bc69f8..dae9ea547c 100644 --- a/crates/pi-natives/src/lib.rs +++ b/crates/pi-natives/src/lib.rs @@ -75,7 +75,7 @@ use napi_derive::napi; /// MUST stay in sync with `VERSION_SENTINEL_EXPORT` in /// `packages/natives/native/index.js` (which derives the name from /// `package.json#version`). -#[napi(js_name = "__piNativesV0_11_8")] +#[napi(js_name = "__piNativesV0_11_10")] pub const fn pi_natives_version_sentinel() {} /// Publish-result wire-contract sentinel. diff --git a/package.json b/package.json index 35cac3181c..e4b4aae49e 100644 --- a/package.json +++ b/package.json @@ -19,19 +19,19 @@ "@bufbuild/protoc-gen-es": "^2.12.0", "@mozilla/readability": "^0.6.0", "@napi-rs/cli": "3.6.2", - "@gajae-code/stats": "0.11.8", - "@gajae-code/agent-core": "0.11.8", - "@gajae-code/ai": "0.11.8", - "@gajae-code/bridge-client": "0.11.8", - "@gajae-code/coding-agent": "0.11.8", - "@gajae-code/natives": "0.11.8", - "@gajae-code/natives-darwin-arm64": "0.11.8", - "@gajae-code/natives-darwin-x64": "0.11.8", - "@gajae-code/natives-linux-arm64": "0.11.8", - "@gajae-code/natives-linux-x64": "0.11.8", - "@gajae-code/natives-win32-x64": "0.11.8", - "@gajae-code/tui": "0.11.8", - "@gajae-code/utils": "0.11.8", + "@gajae-code/stats": "0.11.10", + "@gajae-code/agent-core": "0.11.10", + "@gajae-code/ai": "0.11.10", + "@gajae-code/bridge-client": "0.11.10", + "@gajae-code/coding-agent": "0.11.10", + "@gajae-code/natives": "0.11.10", + "@gajae-code/natives-darwin-arm64": "0.11.10", + "@gajae-code/natives-darwin-x64": "0.11.10", + "@gajae-code/natives-linux-arm64": "0.11.10", + "@gajae-code/natives-linux-x64": "0.11.10", + "@gajae-code/natives-win32-x64": "0.11.10", + "@gajae-code/tui": "0.11.10", + "@gajae-code/utils": "0.11.10", "@opentelemetry/api": "^1.9.0", "@opentelemetry/context-async-hooks": "^2.0.0", "@opentelemetry/sdk-trace-base": "^2.0.0", diff --git a/packages/agent/CHANGELOG.md b/packages/agent/CHANGELOG.md index 920e7e6d3e..ab6b9e09da 100644 --- a/packages/agent/CHANGELOG.md +++ b/packages/agent/CHANGELOG.md @@ -2,6 +2,8 @@ ## [Unreleased] +## [0.11.10] - 2026-07-25 + ## [0.11.8] - 2026-07-23 ### Fixed diff --git a/packages/agent/package.json b/packages/agent/package.json index 548c10f798..603616b0bb 100644 --- a/packages/agent/package.json +++ b/packages/agent/package.json @@ -1,7 +1,7 @@ { "type": "module", "name": "@gajae-code/agent-core", - "version": "0.11.8", + "version": "0.11.10", "description": "General-purpose agent with transport abstraction, state management, and attachment support", "homepage": "https://gajae-code.com", "author": "Yeachan-Heo and Gajae Code Contributors", diff --git a/packages/ai/CHANGELOG.md b/packages/ai/CHANGELOG.md index c44a77d7e8..b7db9d9f27 100644 --- a/packages/ai/CHANGELOG.md +++ b/packages/ai/CHANGELOG.md @@ -1,6 +1,10 @@ # Changelog ## [Unreleased] + +## [0.11.10] - 2026-07-25 + +## [0.11.9] - 2026-07-24 ### Fixed - Credential selection and aggregate usage callers now stop awaiting immediately when their own signal aborts without cancelling shared usage fetches, and ranking deadlines no longer re-await the same stalled usage request during credential resolution. diff --git a/packages/ai/package.json b/packages/ai/package.json index 898bfe9ee8..9e8b4b6b07 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,7 +1,7 @@ { "type": "module", "name": "@gajae-code/ai", - "version": "0.11.8", + "version": "0.11.10", "description": "Unified LLM API with automatic model discovery and provider configuration", "homepage": "https://gajae-code.com", "author": "Yeachan-Heo and Gajae Code Contributors", diff --git a/packages/bridge-client/CHANGELOG.md b/packages/bridge-client/CHANGELOG.md index 46bde76018..6575ab0a98 100644 --- a/packages/bridge-client/CHANGELOG.md +++ b/packages/bridge-client/CHANGELOG.md @@ -2,7 +2,7 @@ ## [Unreleased] -## [0.11.8] - 2026-07-23 +## [0.11.10] - 2026-07-25 ## [0.11.0] - 2026-07-15 diff --git a/packages/bridge-client/package.json b/packages/bridge-client/package.json index 098917d48d..a5d45f65e2 100644 --- a/packages/bridge-client/package.json +++ b/packages/bridge-client/package.json @@ -1,7 +1,7 @@ { "type": "module", "name": "@gajae-code/bridge-client", - "version": "0.11.8", + "version": "0.11.10", "description": "Transport-only v3 SDK WebSocket client", "homepage": "https://gajae-code.com", "author": "Yeachan-Heo and Gajae Code Contributors", diff --git a/packages/coding-agent/CHANGELOG.md b/packages/coding-agent/CHANGELOG.md index 09f98270e3..3a6663d998 100644 --- a/packages/coding-agent/CHANGELOG.md +++ b/packages/coding-agent/CHANGELOG.md @@ -1,14 +1,22 @@ # Changelog ## [Unreleased] + +## [0.11.10] - 2026-07-25 ### Changed - The built-in `claude-opus`, `opus-codex`, and `fable-opus-codex` presets now use `anthropic/claude-opus-5` instead of `anthropic/claude-opus-4-8`, with effort suffixes preserved; `packages/ai/src/models.json` was regenerated so `anthropic/claude-opus-5` resolves; non-opus roles (`anthropic/claude-sonnet-5` executor/planner overrides, codex and fable roles) are unchanged. +## [0.11.9] - 2026-07-24 + ### Fixed +- Aligned the startup GJC Forge splash border with the composer trailing gutter, including the one-row constrained fallback. - Restricted role-agent `bash` now accepts literal mid-word tildes, so git revision syntax such as `git diff HEAD~1` no longer has to be quoted. Bash performs tilde expansion only at the start of a word, so word-initial forms (`~`, `~/path`, `~user`) remain blocked. - Restricted role-agent `bash` now rejects unquoted tildes at every bash expansion position inside assignment words, including the compound `name+=value` form, so `A=~`, `A+=~`, `foo=~root/bar`, `A=x:~`, `A+=x:~`, and repeated colon segments such as `a=x:~:y:~` fail closed. Tildes bash does not expand — mid-word git revisions (`HEAD~1`), non-assignment words (`--opt=~`, `1abc=~`, `a++=~`, `a+b=~`), and quoted forms — remain allowed (#3117). +- Read-only role agents (`architect`, `planner`, `critic`) now receive the `irc` coordination tool and a read-only git prefix set (`status`, `log`, `show`, `diff`, `blame`, `rev-parse`, `ls-files`) in restricted bash; mutating git and arbitrary shell stay blocked. `irc` also stays in the initial active tool set for subagents whenever the parent runtime reports IRC availability, instead of costing a discovery round-trip (#3109). +- The restricted-bash workflow guard now allows `/dev/null` redirects (so `cmd 2>/dev/null` is no longer treated as a repository write during planning phases) while keeping `/dev/stdout`, `/dev/stderr`, and `/dev/fd/` blocked, failing closed on `exec` redirections, and recognizing `>|`, `>&path`, `<>`, path-qualified writers, and every `dd of=` operand. Hook-seeded deep-interview state is now gated on `isNativeDeepInterviewV1` and seeded as a native v1 envelope, so typed operations no longer fail with `DI_STATE_SCHEMA_INVALID` and run the interview manually (#3127). +- The vendored `insane-search` engine no longer treats a `429` as terminal: rate-limited probe and grid candidates back off (linear escalation honoring `Retry-After`, hard-capped at 30s) and continue through grid diversity and browser fallback. The backoff base from `INSANE_RATE_LIMIT_BACKOFF_S` is validated and clamped, so non-numeric, `NaN`, infinite, negative, or huge values can no longer raise, hang, or defeat a per-attempt deadline, and sleeps stay short enough to honor cancellation (#3131). - ACP sessions now apply execution permission decisions to eval calls and to tools invoked from JavaScript or Python eval contexts, while non-ACP session behavior remains unchanged. - Interactive prompt cancellation now reaches API-key preflight through `ModelRegistry`, allowing aborted submissions to clear immediately even while a shared credential-usage request continues in the background. - Alibaba Token Plan canonical first-event timeouts now surface without session retry/fallback replay and are not internally retried by auto-compaction, preventing repeated provider usage (#3026). diff --git a/packages/coding-agent/package.json b/packages/coding-agent/package.json index cb0a5a68e3..aeb1ce7933 100644 --- a/packages/coding-agent/package.json +++ b/packages/coding-agent/package.json @@ -1,7 +1,7 @@ { "type": "module", "name": "@gajae-code/coding-agent", - "version": "0.11.8", + "version": "0.11.10", "description": "Gajae Code CLI with read, bash, edit, write tools and session management", "homepage": "https://gajae-code.com", "author": "Yeachan-Heo and Gajae Code Contributors", diff --git a/packages/coding-agent/src/modes/components/welcome.ts b/packages/coding-agent/src/modes/components/welcome.ts index c4c854f840..8a3dce4ff7 100644 --- a/packages/coding-agent/src/modes/components/welcome.ts +++ b/packages/coding-agent/src/modes/components/welcome.ts @@ -20,6 +20,7 @@ export interface WelcomeComponentOptions { getViewportRows?: () => number | undefined; getReservedBottomRows?: (termWidth: number) => number; changelogMarkdown?: string; + rightGutterWidth?: number; collapseChangelog?: boolean; buildLabel?: string; keyDisplayContext?: KeyDisplayContext; @@ -110,7 +111,8 @@ export class WelcomeComponent implements Component { } render(termWidth: number): string[] { - const boxWidth = Math.max(0, termWidth); + const rightGutterWidth = this.#rightGutterWidth(termWidth); + const boxWidth = Math.max(0, termWidth - rightGutterWidth); if (boxWidth < 4) { return []; } @@ -245,7 +247,7 @@ export class WelcomeComponent implements Component { lines.push(tl + titleStyled + theme.fg("dim", hChar.repeat(afterTitle)) + tr); } if (outputRows === 1) { - return lines; + return this.#withRightGutter(lines, rightGutterWidth); } if (showRightColumn) { @@ -273,7 +275,7 @@ export class WelcomeComponent implements Component { lines.push(bl + h.repeat(leftCol) + br); } - return lines; + return this.#withRightGutter(lines, rightGutterWidth); } /** Center text within a given width */ @@ -295,6 +297,19 @@ export class WelcomeComponent implements Component { } return str + padding(width - visLen); } + #rightGutterWidth(termWidth: number): number { + const configured = this.options.rightGutterWidth ?? 0; + if (!Number.isFinite(configured) || configured <= 0) return 0; + const gutterWidth = Math.floor(configured); + return Math.min(gutterWidth, Math.max(0, termWidth - 4)); + } + + #withRightGutter(lines: string[], rightGutterWidth: number): string[] { + if (rightGutterWidth <= 0) return lines; + const gutter = padding(rightGutterWidth); + return lines.map(line => line + gutter); + } + #targetRows(termWidth: number): number | undefined { const viewportRows = this.options.getViewportRows?.(); if (typeof viewportRows !== "number" || !Number.isFinite(viewportRows) || viewportRows <= 0) { diff --git a/packages/coding-agent/src/modes/interactive-mode.ts b/packages/coding-agent/src/modes/interactive-mode.ts index 2dc38a1cce..815565eb19 100644 --- a/packages/coding-agent/src/modes/interactive-mode.ts +++ b/packages/coding-agent/src/modes/interactive-mode.ts @@ -123,6 +123,7 @@ export function getDefaultComposerPlaceholder(context: KeyDisplayContext = { pla export const DEFAULT_COMPOSER_PLACEHOLDER = getDefaultComposerPlaceholder(); const WELCOME_RESERVED_CONTAINER_CHILD_LIMIT = 8; +const COMPOSER_RIGHT_GUTTER_WIDTH = 1; const IRC_SIDEBAR_TOGGLE_SHADOWING_ACTIONS: readonly AppKeybinding[] = [ "app.plan.toggle", @@ -169,7 +170,7 @@ function configureDefaultComposerChrome(editor: CustomEditor): void { editor.setInputPrefix(getDefaultInputPrefix()); editor.setPlaceholder(getDefaultComposerPlaceholder()); editor.setPaddingX(1); - editor.setRightGutterWidth(1); + editor.setRightGutterWidth(COMPOSER_RIGHT_GUTTER_WIDTH); editor.setTopBorder(undefined); } @@ -660,6 +661,7 @@ export class InteractiveMode implements InteractiveModeContext { getViewportRows: () => this.ui.terminal.rows, getReservedBottomRows: getWelcomeReservedBottomRows, changelogMarkdown: this.#changelogMarkdown, + rightGutterWidth: COMPOSER_RIGHT_GUTTER_WIDTH, collapseChangelog: settings.get("collapseChangelog"), keyDisplayContext: this.#keyDisplayContext, }, diff --git a/packages/coding-agent/src/sdk/bus/index.ts b/packages/coding-agent/src/sdk/bus/index.ts index e2be713bf4..b7d9432bcc 100644 --- a/packages/coding-agent/src/sdk/bus/index.ts +++ b/packages/coding-agent/src/sdk/bus/index.ts @@ -5173,9 +5173,21 @@ export function createNotificationsExtension( const id = sessionId(ctx); const rt = runtimes.get(id); if (rt) terminalizeInFlightTools(rt, id, "unknown"); + // Startup is only genuinely in flight when a `sessionStartPromises` entry + // exists. Once startup has settled, the host is broker-visible and its + // post-start `reconcileCurrentSession` may already have minted a + // replacement notification-root token whose unregister is still awaiting + // its file lock and atomic registry write. Returning before that settles + // leaves a stale `sessions[id]` row that the retained older token is + // correctly fenced from removing, so shutdown must join it. + const startupWasPending = sessionStartPromises.has(id); const controllerStop = typeof ctx.sessionManager.getCwd === "function" ? controller.stopCurrentSession(ctx) : Promise.resolve(false); - void controllerStop.catch(error => logger.warn(`notifications: controller shutdown failed: ${String(error)}`)); + const settledControllerStop = controllerStop.catch(error => { + logger.warn(`notifications: controller shutdown failed: ${String(error)}`); + return false; + }); + if (startupWasPending) void settledControllerStop; try { await stopSession(id); } catch (error) { @@ -5186,5 +5198,10 @@ export function createNotificationsExtension( // error severity (matching the postmortem cleanup precedent). logger.error(`notifications: SDK notification runtime cleanup failed: ${String(error)}`); } + // Keep shutdown nonblocking only while native startup is genuinely + // pending (the `/notify on` path); otherwise await the controller queue so + // completed-start reconciliation and its replacement-token cleanup are + // joined before lifecycle shutdown returns. + if (!startupWasPending) await settledControllerStop; }); } diff --git a/packages/coding-agent/test/runtime/process-lifecycle.redteam.test.ts b/packages/coding-agent/test/runtime/process-lifecycle.redteam.test.ts index 9ad747bfc5..3f133ed55a 100644 --- a/packages/coding-agent/test/runtime/process-lifecycle.redteam.test.ts +++ b/packages/coding-agent/test/runtime/process-lifecycle.redteam.test.ts @@ -102,8 +102,10 @@ describe("process-lifecycle adversarial owned-process invariants", () => { const before = liveOwnedProcessCount(); const tmp = `/tmp/gjc-process-lifecycle-${process.pid}-${Date.now()}`; const owner = spawnOwnedProcess( - ["sh", "-c", `trap 'echo term >> ${tmp}; exit 0' TERM; echo up > ${tmp}; while :; do sleep 1; done`], - { name: "redteam-concurrent-dispose", gracefulMs: 500 }, + // `sh` runs a TERM trap only after the current foreground command returns, so the + // polling interval must stay well under `gracefulMs` or SIGKILL beats the handler. + ["sh", "-c", `trap 'echo term >> ${tmp}; exit 0' TERM; echo up > ${tmp}; while :; do sleep 0.05; done`], + { name: "redteam-concurrent-dispose", gracefulMs: 2_000 }, ); try { await waitForAsync(() => fileContains(tmp, "up"), 2_000, "child readiness marker"); @@ -118,6 +120,14 @@ describe("process-lifecycle adversarial owned-process invariants", () => { const exit = await owner.awaitExit({ timeoutMs: 2_000 }); expect(exit.exited).toBe(true); await waitFor(() => liveOwnedProcessCount() === before, 2_000, "live count baseline after concurrent dispose"); + // The child's TERM trap appends the marker asynchronously, so awaitExit can + // return before that write lands under shard load. Poll for the single + // terminating signal instead of sampling the file once. + await waitForAsync( + async () => (await Bun.file(tmp).text()).split("\n").filter(line => line === "term").length === 1, + 2_000, + "single term marker after concurrent dispose", + ); const marker = await Bun.file(tmp).text(); expect(marker.split("\n").filter(line => line === "term")).toHaveLength(1); } finally { diff --git a/packages/coding-agent/test/sdk-host-wiring.test.ts b/packages/coding-agent/test/sdk-host-wiring.test.ts index 0fbe0e6132..2c1724cd56 100644 --- a/packages/coding-agent/test/sdk-host-wiring.test.ts +++ b/packages/coding-agent/test/sdk-host-wiring.test.ts @@ -671,10 +671,36 @@ test("session_start swallows startup plus owner-release failure without surfacin const cwd = fs.mkdtempSync(path.join(os.tmpdir(), "gjc-sdk-startup-cleanup-double-failure-")); dirs.push(cwd); const sessionId = `startup-cleanup-double-failure-${Date.now()}`; - const serverStart = spyOn(NotificationServer.prototype, "start").mockRejectedValueOnce( - new Error("server start failed"), - ); - const hostStop = spyOn(SessionSdkHost.prototype, "stop").mockRejectedValueOnce(new Error("host stop failed")); + // `mockRejectedValueOnce` on a shared prototype is a one-shot global: a peer + // test scheduled concurrently in the same shard can consume the single + // rejection, after which this test's own `start`/`stop` resolve, startup + // never sets `suppressExtensionError`, and the error surfaces. Scope the + // rejection to this test's first call instead so shard composition cannot + // steal it. + let serverStartRejected = false; + const serverStartImpl = NotificationServer.prototype.start; + const serverStart = spyOn(NotificationServer.prototype, "start").mockImplementation(async function ( + this: NotificationServer, + ...args: Parameters + ) { + if (!serverStartRejected) { + serverStartRejected = true; + throw new Error("server start failed"); + } + return await serverStartImpl.apply(this, args); + }); + let hostStopRejected = false; + const hostStopImpl = SessionSdkHost.prototype.stop; + const hostStop = spyOn(SessionSdkHost.prototype, "stop").mockImplementation(async function ( + this: SessionSdkHost, + ...args: Parameters + ) { + if (!hostStopRejected) { + hostStopRejected = true; + throw new Error("host stop failed"); + } + return await hostStopImpl.apply(this, args); + }); const errorSpy = spyOn(logger, "error").mockImplementation(() => {}); let restored = false; try { @@ -3535,18 +3561,22 @@ test("session teardown drains admitted direct gate resolution before detaching i dirs.push(cwd); const sessionId = `direct-resolution-drain-${Date.now()}`; const emitter = new BrokerWorkflowGateEmitter(sessionId, new FileGateStore(path.join(cwd, "gates.json"))); - const resolution = Promise.withResolvers<{ status: "accepted" }>(); - const sessionClosedBarrier = Promise.withResolvers(); - const sessionClosedReached = Promise.withResolvers(); + const resolution = Promise.withResolvers(); + const preDrainBarrier = Promise.withResolvers(); + const sessionClosedDrained = Promise.withResolvers(); + const terminalized = Promise.withResolvers(); const events: string[] = []; + let controllerAttached = false; let resolutionStarted = false; const originalRegisterController = emitter.registerGateTerminalController!.bind(emitter); const originalResolveGate = emitter.resolveGate!.bind(emitter); const originalPushFrameAndWait = NotificationServer.prototype.pushFrameAndWait; const registerController = spyOn(emitter, "registerGateTerminalController").mockImplementation(controller => { const detach = originalRegisterController(controller); + controllerAttached = true; return () => { events.push("controller-detached"); + controllerAttached = false; detach(); }; }); @@ -3555,6 +3585,7 @@ test("session teardown drains admitted direct gate resolution before detaching i await resolution.promise; const resolved = await originalResolveGate(response); events.push("gate-terminalized"); + terminalized.resolve(); return resolved; }); const pushFrameAndWait = spyOn(NotificationServer.prototype, "pushFrameAndWait").mockImplementation(async function ( @@ -3562,16 +3593,18 @@ test("session teardown drains admitted direct gate resolution before detaching i frame, timeout, ) { + const delivered = await originalPushFrameAndWait.call(this, frame, timeout); if ((JSON.parse(frame) as { type?: unknown }).type === "session_closed") { - sessionClosedReached.resolve(); - await sessionClosedBarrier.promise; + sessionClosedDrained.resolve(); + await preDrainBarrier.promise; } - return await originalPushFrameAndWait.call(this, frame, timeout); + return delivered; }); process.env.GJC_NOTIFICATIONS = "1"; const sessionContext = context(cwd, sessionId, "main", {}, emitter); const handlers = start(sessionContext); const endpointFile = path.join(cwd, ".gjc", "state", "sdk", `${sessionId}.json`); + let shutdown: Promise | undefined; try { await waitFor(() => fs.existsSync(endpointFile), "SDK endpoint"); const endpoint = JSON.parse(fs.readFileSync(endpointFile, "utf8")) as { url: string; token: string }; @@ -3585,7 +3618,11 @@ test("session teardown drains admitted direct gate resolution before detaching i emitter.onGateEmitted!(gate => { gateId = gate.gate_id; }); - void emitter.emitGate({ stage: "ralplan", kind: "approval", schema: { type: "string" } }).catch(() => {}); + const gateContinuation = emitter.emitGate({ + stage: "ralplan", + kind: "approval", + schema: { type: "string" }, + }); await waitFor(() => gateId !== "", "workflow gate"); socket.send( JSON.stringify({ @@ -3602,14 +3639,22 @@ test("session teardown drains admitted direct gate resolution before detaching i }), ); await waitFor(() => resolutionStarted, "direct gate resolution"); - const shutdown = handlers.get("session_shutdown")!({ type: "session_shutdown" }, sessionContext); - await sessionClosedReached.promise; - expect(events).toEqual([]); - sessionClosedBarrier.resolve(); - resolution.resolve({ status: "accepted" }); + shutdown = Promise.resolve(handlers.get("session_shutdown")!({ type: "session_shutdown" }, sessionContext)); + await sessionClosedDrained.promise; + expect(controllerAttached).toBe(true); + preDrainBarrier.resolve(); + await new Promise(resolve => setImmediate(resolve)); + expect(controllerAttached).toBe(true); + resolution.resolve(); + expect(await gateContinuation).toBe("approve"); + await terminalized.promise; + expect(controllerAttached).toBe(true); await shutdown; expect(events).toEqual(["gate-terminalized", "controller-detached"]); } finally { + preDrainBarrier.resolve(); + resolution.resolve(); + await shutdown?.catch(() => {}); pushFrameAndWait.mockRestore(); resolveGate.mockRestore(); registerController.mockRestore(); diff --git a/packages/coding-agent/test/welcome-viewport.test.ts b/packages/coding-agent/test/welcome-viewport.test.ts index 5d8c5427db..a2197d20ce 100644 --- a/packages/coding-agent/test/welcome-viewport.test.ts +++ b/packages/coding-agent/test/welcome-viewport.test.ts @@ -76,6 +76,30 @@ describe("WelcomeComponent viewport sizing", () => { } }); + it("reserves the composer gutter for full and one-row welcome layouts", () => { + const full = new WelcomeComponent("1.2.3", "test-model", "test-provider", [], [], "ascii", { + rightGutterWidth: 1, + }); + const fullLines = full.render(100).map(stripRenderControls); + expect(fullLines.length).toBeGreaterThan(0); + for (const line of fullLines) { + expect(visibleWidth(line)).toBe(100); + expect(line.endsWith(" ")).toBe(true); + expect(visibleWidth(line.trimEnd())).toBe(99); + } + + const oneRow = new WelcomeComponent("1.2.3", "test-model", "test-provider", [], [], "ascii", { + rightGutterWidth: 1, + getViewportRows: () => 1, + getReservedBottomRows: () => 0, + }); + const [line] = oneRow.render(100).map(stripRenderControls); + expect(line).toBeDefined(); + expect(visibleWidth(line!)).toBe(100); + expect(line!.endsWith(" ")).toBe(true); + expect(visibleWidth(line!.trimEnd())).toBe(99); + }); + it("renders the build label from metadata instead of defaulting to dev", () => { const welcome = new WelcomeComponent("1.2.3", "test-model", "test-provider", [], [], "ascii", { buildLabel: "release build", diff --git a/packages/gajae-code/CHANGELOG.md b/packages/gajae-code/CHANGELOG.md index 7a79906129..9087417667 100644 --- a/packages/gajae-code/CHANGELOG.md +++ b/packages/gajae-code/CHANGELOG.md @@ -2,7 +2,7 @@ ## [Unreleased] -## [0.11.8] - 2026-07-23 +## [0.11.10] - 2026-07-25 ## [0.7.5] - 2026-06-27 diff --git a/packages/gajae-code/package.json b/packages/gajae-code/package.json index fbea5cd4d5..5c5cf6804d 100644 --- a/packages/gajae-code/package.json +++ b/packages/gajae-code/package.json @@ -1,7 +1,7 @@ { "type": "module", "name": "gajae-code", - "version": "0.11.8", + "version": "0.11.10", "description": "One-line npm install wrapper for the Gajae-Code gjc CLI", "homepage": "https://gajae-code.com", "author": "Yeachan-Heo and Gajae Code Contributors", diff --git a/packages/natives-darwin-arm64/package.json b/packages/natives-darwin-arm64/package.json index c6c85c5bcb..e9a3eb1b72 100644 --- a/packages/natives-darwin-arm64/package.json +++ b/packages/natives-darwin-arm64/package.json @@ -1,6 +1,6 @@ { "name": "@gajae-code/natives-darwin-arm64", - "version": "0.11.8", + "version": "0.11.10", "description": "Darwin arm64 native addon for @gajae-code/natives", "type": "module", "homepage": "https://gajae-code.com", diff --git a/packages/natives-darwin-x64/package.json b/packages/natives-darwin-x64/package.json index 5a30e3166a..808fa3ec83 100644 --- a/packages/natives-darwin-x64/package.json +++ b/packages/natives-darwin-x64/package.json @@ -1,6 +1,6 @@ { "name": "@gajae-code/natives-darwin-x64", - "version": "0.11.8", + "version": "0.11.10", "description": "Darwin x64 native addon for @gajae-code/natives", "type": "module", "homepage": "https://gajae-code.com", diff --git a/packages/natives-linux-arm64/package.json b/packages/natives-linux-arm64/package.json index 740e5ae40d..9159e9e065 100644 --- a/packages/natives-linux-arm64/package.json +++ b/packages/natives-linux-arm64/package.json @@ -1,6 +1,6 @@ { "name": "@gajae-code/natives-linux-arm64", - "version": "0.11.8", + "version": "0.11.10", "description": "Linux arm64 native addon for @gajae-code/natives", "type": "module", "homepage": "https://gajae-code.com", diff --git a/packages/natives-linux-x64/package.json b/packages/natives-linux-x64/package.json index ef0d4bf7fb..159508c5ac 100644 --- a/packages/natives-linux-x64/package.json +++ b/packages/natives-linux-x64/package.json @@ -1,6 +1,6 @@ { "name": "@gajae-code/natives-linux-x64", - "version": "0.11.8", + "version": "0.11.10", "description": "Linux x64 native addons for @gajae-code/natives", "type": "module", "homepage": "https://gajae-code.com", diff --git a/packages/natives-win32-x64/package.json b/packages/natives-win32-x64/package.json index 0b2e98e994..24b2987736 100644 --- a/packages/natives-win32-x64/package.json +++ b/packages/natives-win32-x64/package.json @@ -1,6 +1,6 @@ { "name": "@gajae-code/natives-win32-x64", - "version": "0.11.8", + "version": "0.11.10", "description": "Windows x64 native addon for @gajae-code/natives", "type": "module", "homepage": "https://gajae-code.com", diff --git a/packages/natives/CHANGELOG.md b/packages/natives/CHANGELOG.md index 7705544ca6..5802b8ce67 100644 --- a/packages/natives/CHANGELOG.md +++ b/packages/natives/CHANGELOG.md @@ -2,6 +2,8 @@ ## [Unreleased] +## [0.11.10] - 2026-07-25 + ## [0.11.8] - 2026-07-23 ### Fixed diff --git a/packages/natives/native/index.d.ts b/packages/natives/native/index.d.ts index 01d876a4ce..95193e12ca 100644 --- a/packages/natives/native/index.d.ts +++ b/packages/natives/native/index.d.ts @@ -1,12 +1,5 @@ /* auto-generated by NAPI-RS */ /* eslint-disable */ -/** - * macOS computer-use controller. - * - * This declaration and the named JS export are available on every platform so - * consumers can import them portably; the native controller itself is built - * only on macOS. - */ export declare class ComputerController { constructor() screenshot(): ComputerScreenshot @@ -491,7 +484,7 @@ export declare function __piNativesPublishOutcomeV1(): void * `packages/natives/native/index.js` (which derives the name from * `package.json#version`). */ -export declare function __piNativesV0_11_8(): void +export declare function __piNativesV0_11_10(): void /** * Apply conservative pre-execution rewrites to a bash command. diff --git a/packages/natives/native/index.js b/packages/natives/native/index.js index cfa6b7db9a..b99324172b 100644 --- a/packages/natives/native/index.js +++ b/packages/natives/native/index.js @@ -30,7 +30,7 @@ export const Shell = nativeBindings.Shell; // functions export const __piNativesPublishOutcomeV1 = nativeBindings.__piNativesPublishOutcomeV1; -export const __piNativesV0_11_8 = nativeBindings.__piNativesV0_11_8; +export const __piNativesV0_11_10 = nativeBindings.__piNativesV0_11_10; export const applyBashFixups = nativeBindings.applyBashFixups; export const applyOwnerOnlyFdSecurity = nativeBindings.applyOwnerOnlyFdSecurity; export const applyOwnerOnlyPathSecurity = nativeBindings.applyOwnerOnlyPathSecurity; diff --git a/packages/natives/package.json b/packages/natives/package.json index 493d1d558e..cee8c7b1dd 100644 --- a/packages/natives/package.json +++ b/packages/natives/package.json @@ -1,6 +1,6 @@ { "name": "@gajae-code/natives", - "version": "0.11.8", + "version": "0.11.10", "description": "Native Rust bindings for grep, clipboard, image processing, syntax highlighting, PTY, and shell operations via N-API", "type": "module", "homepage": "https://gajae-code.com", diff --git a/packages/stats/CHANGELOG.md b/packages/stats/CHANGELOG.md index c4d17ed54d..f93179f52c 100644 --- a/packages/stats/CHANGELOG.md +++ b/packages/stats/CHANGELOG.md @@ -2,6 +2,8 @@ ## [Unreleased] +## [0.11.10] - 2026-07-25 + ## [0.11.8] - 2026-07-23 ### Fixed diff --git a/packages/stats/package.json b/packages/stats/package.json index 227eda1e9f..fb7106c0b3 100644 --- a/packages/stats/package.json +++ b/packages/stats/package.json @@ -1,7 +1,7 @@ { "type": "module", "name": "@gajae-code/stats", - "version": "0.11.8", + "version": "0.11.10", "description": "Local observability dashboard for pi AI usage statistics", "homepage": "https://gajae-code.com", "author": "Yeachan-Heo", diff --git a/packages/tui/CHANGELOG.md b/packages/tui/CHANGELOG.md index bc846699ea..e5cb768496 100644 --- a/packages/tui/CHANGELOG.md +++ b/packages/tui/CHANGELOG.md @@ -2,7 +2,7 @@ ## [Unreleased] -## [0.11.8] - 2026-07-23 +## [0.11.10] - 2026-07-25 ## [0.11.7] - 2026-07-22 ### Fixed diff --git a/packages/tui/package.json b/packages/tui/package.json index 5b1a36b4cf..115f219aa0 100644 --- a/packages/tui/package.json +++ b/packages/tui/package.json @@ -1,7 +1,7 @@ { "type": "module", "name": "@gajae-code/tui", - "version": "0.11.8", + "version": "0.11.10", "description": "Terminal User Interface library with differential rendering for efficient text-based applications", "homepage": "https://gajae-code.com", "author": "Yeachan-Heo and Gajae Code Contributors", diff --git a/packages/utils/CHANGELOG.md b/packages/utils/CHANGELOG.md index 06ef831cdd..dc3ef0ce2a 100644 --- a/packages/utils/CHANGELOG.md +++ b/packages/utils/CHANGELOG.md @@ -2,12 +2,14 @@ ## [Unreleased] +## [0.11.10] - 2026-07-25 + +## [0.11.9] - 2026-07-24 + ### Fixed - Fatal crashes (`uncaughtException` / `unhandledRejection`) are now also persisted to a dedicated, append-only crash log (`~/.gjc/agent/gjc-crash.log`) before any stderr output, and the fatal handler prints the crash-log path. The daily logger file is gzip-archived independently by every gjc process at date rollover; that shared-archive race can truncate a day's log to an empty `.gz` and destroy the `logger.error` crash record, leaving crashes undiagnosable. The rotation-immune crash log is capped at 512 KB, bounds every individual record (UTF-8-safe truncation with a marker), scrubs credential material (bearer/auth headers, key=value credential fields, and well-known vendor token shapes) before persisting, and enforces owner-only file permissions. -## [0.11.8] - 2026-07-23 - ## [0.11.7] - 2026-07-22 ### Added - SSE readers now accept optional per-event and cumulative UTF-8 byte budgets without changing existing defaults. diff --git a/packages/utils/package.json b/packages/utils/package.json index 03aa3d13d1..d940741d84 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -1,7 +1,7 @@ { "type": "module", "name": "@gajae-code/utils", - "version": "0.11.8", + "version": "0.11.10", "description": "Shared utilities for pi packages", "homepage": "https://gajae-code.com", "author": "Yeachan-Heo", diff --git a/plugins/.claude-plugin/marketplace.json b/plugins/.claude-plugin/marketplace.json index 1488aa7984..b59026f153 100644 --- a/plugins/.claude-plugin/marketplace.json +++ b/plugins/.claude-plugin/marketplace.json @@ -5,14 +5,14 @@ }, "metadata": { "description": "GJC delegation plugin", - "version": "0.11.8" + "version": "0.11.10" }, "plugins": [ { "name": "gajae-code", "source": "./gajae-code", "description": "Delegate GJC planning/execution/team workflows via coordinator MCP.", - "version": "0.11.8", + "version": "0.11.10", "author": { "name": "Gajae Code" }, diff --git a/plugins/gajae-code/.claude-plugin/plugin.json b/plugins/gajae-code/.claude-plugin/plugin.json index 975eb305e0..b5dbf15206 100644 --- a/plugins/gajae-code/.claude-plugin/plugin.json +++ b/plugins/gajae-code/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "name": "gajae-code", "description": "Delegate planning, execution, and team workflows to GJC through the coordinator MCP server.", - "version": "0.11.8", + "version": "0.11.10", "commands": "./commands", "skills": "./skills", "mcpServers": "./.mcp.json" diff --git a/plugins/gajae-code/.codex-plugin/plugin.json b/plugins/gajae-code/.codex-plugin/plugin.json index fdcf2f2ac9..a199450814 100644 --- a/plugins/gajae-code/.codex-plugin/plugin.json +++ b/plugins/gajae-code/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "gajae-code", - "version": "0.11.8", + "version": "0.11.10", "description": "Delegate Codex tasks to GJC workflows through coordinator MCP.", "skills": "./skills/", "mcpServers": "./.codex.mcp.json"