diff --git a/CHANGELOG.md b/CHANGELOG.md index 47039e9e..818004b2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,8 @@ GitHub Releases page; `0.8.0` is the new starting line. ## Unreleased +## 0.61.0 (2026-07-22) + - Fixed reasoning summaries exposing Markdown delimiters and duplicate terminal rows after refocus, and redesigned agent progress (single `Agent` calls and parallel `RunAgents` fan-outs) as a compact, payload-free agent activity tree. - Retain a non-streaming OpenAI Responses reasoning item's encrypted content when it carries no summary, matching the streaming path so the reasoning boundary stays replayable. - Reduce the shell prompt session to a compatibility faΓ§ade over deep `prompting/` modules (config, keybindings, completion menus, narrow shell-facing methods), with Unicode cell-width coverage and documented module ownership in the architecture guide. diff --git a/README.md b/README.md index bba6870e..83c476fc 100644 --- a/README.md +++ b/README.md @@ -50,13 +50,13 @@ It speaks the [**Agent Client Protocol (ACP)**](https://github.com/agentclientpr --- -## πŸ†• What's New in 0.60.0 +## πŸ†• What's New in 0.61.0 -- **Leaner leaf subagent prompts.** All 12 built-in subagent roles now render a dedicated `system_leaf.md` prompt from shared Jinja partials instead of the full root system prompt, dropping root-only orchestration prose from every spawn (implementer prompt: ~7,270 β†’ ~4,240 words) while keeping the root render byte-identical. -- **Typed, fail-closed coding-artifact handoff.** The `` contract is now rendered and extracted from a single `CodingArtifact` schema β€” exactly one end-of-message block, duplicate/undeclared keys rejected, and malformed artifacts surfaced distinctly to the judge instead of passing through as valid. -- **Auto-updates never interrupt a running session.** Updates are downloaded and staged with a verified manifest and applied before the next session (or at clean exit) instead of force-closing the active session mid-run; `auto_update` becomes a policy enum (`off`, `notify`, `download`, `apply_on_exit`) with legacy booleans still accepted, and the post-update smoke check verifies the upgraded binary and version. +- **A faster, steadier interactive prompt.** Slash commands and file mentions now share one completion engine, workspace indexing runs asynchronously, prompt resources are isolated per session, and awaited lifecycle cleanup prevents stale background work. The prompt also stays within the terminal height and avoids queued-input ghost borders. +- **More provider login options with safer persistence.** Pythinker adds OAuth login for xAI Grok, GitHub Copilot, DigitalOcean Gradient AI, and Snowflake Cortex, backed by a provider-neutral models.dev catalog with curated fallbacks. Credential changes are saved atomically and rolled back if persistence fails. +- **Cleaner reasoning and agent activity.** Reasoning summaries no longer expose Markdown delimiters or duplicate terminal rows after refocus, while individual agents and parallel `RunAgents` calls render as a compact, payload-free activity tree with correctly nested subagent work. -Upgrade with `pythinker update`, `pip install --upgrade pythinker-code==0.60.0`, or use the native installer for your platform from the [Releases page](https://github.com/Pythoughts-labs/pythinker-code/releases/latest). +Upgrade with `pythinker update`, `pip install --upgrade pythinker-code==0.61.0`, or use the native installer for your platform from the [Releases page](https://github.com/Pythoughts-labs/pythinker-code/releases/latest). --- @@ -162,7 +162,7 @@ matches your OS β€” no Python, Node, or `uv` prerequisite. | Platform | Recommended install | Artifact source | |---|---|---| -| **πŸͺŸ Windows** | `irm https://pythinker.com/install.ps1 \| iex` | `PythinkerSetup-0.60.0.exe` from [Releases](https://github.com/Pythoughts-labs/pythinker-code/releases/latest) | +| **πŸͺŸ Windows** | `irm https://pythinker.com/install.ps1 \| iex` | `PythinkerSetup-0.61.0.exe` from [Releases](https://github.com/Pythoughts-labs/pythinker-code/releases/latest) | | **macOS / Linux** | `curl -fsSL https://pythinker.com/install.sh \| bash` | native tarball from [Releases](https://github.com/Pythoughts-labs/pythinker-code/releases/latest) | | **macOS β€” Homebrew** | `brew install Pythoughts-labs/pythinker/pythinker-code` | auto-published Homebrew tap | | **🐳 Docker** | `docker run --rm -it ghcr.io/pythoughts-labs/pythinker-code` | GHCR multi-arch image | @@ -190,7 +190,7 @@ pythinker # start the interactive TUI ### πŸͺŸ Windows β€” native installer -`PythinkerSetup-0.60.0.exe` is an Inno Setup wizard. Release builds are signed +`PythinkerSetup-0.61.0.exe` is an Inno Setup wizard. Release builds are signed when Authenticode secrets are configured in CI; otherwise the installer ships unsigned. Installs per-user into `%LOCALAPPDATA%\Programs\Pythinker`, registers `pythinker` on your user PATH (`HKCU\Environment`), broadcasts @@ -202,13 +202,13 @@ irm https://pythinker.com/install.ps1 | iex # Or manually download the installer + checksum from the Releases page, # verify with Get-FileHash, then run: -.\PythinkerSetup-0.60.0.exe +.\PythinkerSetup-0.61.0.exe # Open a fresh PowerShell pythinker --version ``` -**Per-machine install** (IT-managed boxes): `.\PythinkerSetup-0.60.0.exe /ALLUSERS` +**Per-machine install** (IT-managed boxes): `.\PythinkerSetup-0.61.0.exe /ALLUSERS` installs to `%ProgramFiles%\Pythinker` and writes PATH to HKLM (requires admin). **Upgrade:** `pythinker update` from inside the running app β€” it downloads @@ -266,26 +266,26 @@ attached to every GitHub Release. ```sh # Debian / Ubuntu (x86_64) -sudo dpkg -i pythinker-code_0.60.0_amd64.deb +sudo dpkg -i pythinker-code_0.61.0_amd64.deb sudo apt-get install -f # only if dpkg reports missing deps # Debian / Ubuntu (ARM64) -sudo dpkg -i pythinker-code_0.60.0_arm64.deb +sudo dpkg -i pythinker-code_0.61.0_arm64.deb # Fedora / RHEL / openSUSE (x86_64) -curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.60.0/pythinker-code-0.60.0.x86_64.rpm -curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.60.0/pythinker-code-0.60.0.x86_64.rpm.sha256 -sha256sum -c pythinker-code-0.60.0.x86_64.rpm.sha256 +curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.61.0/pythinker-code-0.61.0.x86_64.rpm +curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.61.0/pythinker-code-0.61.0.x86_64.rpm.sha256 +sha256sum -c pythinker-code-0.61.0.x86_64.rpm.sha256 # Fedora / RHEL: -sudo dnf install ./pythinker-code-0.60.0.x86_64.rpm +sudo dnf install ./pythinker-code-0.61.0.x86_64.rpm # openSUSE: -sudo zypper install ./pythinker-code-0.60.0.x86_64.rpm +sudo zypper install ./pythinker-code-0.61.0.x86_64.rpm # Fedora / RHEL (aarch64) -curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.60.0/pythinker-code-0.60.0.aarch64.rpm -curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.60.0/pythinker-code-0.60.0.aarch64.rpm.sha256 -sha256sum -c pythinker-code-0.60.0.aarch64.rpm.sha256 -sudo dnf install ./pythinker-code-0.60.0.aarch64.rpm +curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.61.0/pythinker-code-0.61.0.aarch64.rpm +curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.61.0/pythinker-code-0.61.0.aarch64.rpm.sha256 +sha256sum -c pythinker-code-0.61.0.aarch64.rpm.sha256 +sudo dnf install ./pythinker-code-0.61.0.aarch64.rpm ``` Both packages drop a small `/usr/bin/pythinker` launcher that execs the real @@ -294,8 +294,8 @@ binary under `/usr/lib/pythinker/`, so your `$PATH` stays tidy. **Verify before install:** ```sh -sha256sum -c pythinker-code_0.60.0_amd64.deb.sha256 # Debian/Ubuntu -sha256sum -c pythinker-code-0.60.0.x86_64.rpm.sha256 # Fedora/RHEL +sha256sum -c pythinker-code_0.61.0_amd64.deb.sha256 # Debian/Ubuntu +sha256sum -c pythinker-code-0.61.0.x86_64.rpm.sha256 # Fedora/RHEL ``` **Upgrade:** download the new `.deb`/`.rpm` from Releases and `dpkg -i` / diff --git a/docs/en/guides/getting-started.md b/docs/en/guides/getting-started.md index 5e330769..c00d6c38 100644 --- a/docs/en/guides/getting-started.md +++ b/docs/en/guides/getting-started.md @@ -44,7 +44,7 @@ On Windows, run the PowerShell bootstrap. It downloads the native installer, ver irm https://pythinker.com/install.ps1 | iex ``` -You can also download `PythinkerSetup-0.60.0.exe` manually from the [latest release](https://github.com/Pythoughts-labs/pythinker-code/releases/latest). +You can also download `PythinkerSetup-0.61.0.exe` manually from the [latest release](https://github.com/Pythoughts-labs/pythinker-code/releases/latest). Verify the installation: diff --git a/docs/en/release-notes/breaking-changes.md b/docs/en/release-notes/breaking-changes.md index 58cb1359..a7ad270e 100644 --- a/docs/en/release-notes/breaking-changes.md +++ b/docs/en/release-notes/breaking-changes.md @@ -4,6 +4,13 @@ This page documents breaking changes in Pythinker Code releases and provides mig ## Unreleased +## 0.61.0 (2026-07-22) + +Shell-mode `!` commands now run through the configured shell (` -c`, or PowerShell +`-command` on Windows) instead of the platform's implicit `/bin/sh` or `cmd.exe`. Windows users +with commands written specifically for `cmd.exe` may need to rewrite them for their configured +PowerShell or explicitly invoke `cmd.exe /c ...`. + ## 0.60.0 (2026-07-18) No breaking changes. This release is compatible with 0.59.0 user configuration, native installs, and session data. diff --git a/docs/en/release-notes/changelog.md b/docs/en/release-notes/changelog.md index d77bed49..47b9df12 100644 --- a/docs/en/release-notes/changelog.md +++ b/docs/en/release-notes/changelog.md @@ -17,6 +17,22 @@ GitHub Releases page; `0.8.0` is the new starting line. ## Unreleased +## 0.61.0 (2026-07-22) + +- Fixed reasoning summaries exposing Markdown delimiters and duplicate terminal rows after refocus, and redesigned agent progress (single `Agent` calls and parallel `RunAgents` fan-outs) as a compact, payload-free agent activity tree. +- Retain a non-streaming OpenAI Responses reasoning item's encrypted content when it carries no summary, matching the streaming path so the reasoning boundary stays replayable. +- Reduce the shell prompt session to a compatibility faΓ§ade over deep `prompting/` modules (config, keybindings, completion menus, narrow shell-facing methods), with Unicode cell-width coverage and documented module ownership in the architecture guide. +- Render image/audio/video and unknown content parts as payload-free labels in the live view, roll nested subagent activity (up to 16 levels) under the correct root tool card, and stop provider-remapped tool results from starting replay user turns. +- **Behavior change:** `!` shell commands now run through the detected configured shell (` -c`, PowerShell `-command` on Windows) instead of the implicit `/bin/sh`/`cmd.exe`, with separate 1 MiB stdout/stderr caps and cancellation cleanup; existing `cmd.exe`-syntax commands on Windows may need updating. +- Distinguish background auto-trigger grace expiry from user input activity with typed prompt events, and bound streamed tool-argument label scans to 1 KiB growth boundaries. +- Scope prompt Git status, toasts, history, and clipboard to each shell session with a new `/prompt-history status|clear` command, bounded locked history storage, and cross-session isolation. +- Unify the shell footer behind one per-frame view model shared by the legacy and card renderers, and key theme style-resolver caching by terminal capabilities. +- Fix a rare queued-follow-up "ghost card": echoing a drained queued command now commits through the scrollback handoff (which hides the input card before the terminal teardown erases the prompt), so the input-card border can no longer fossilize into scrollback above the echoed command under heavy load. +- Freeze the public shell prompt compatibility contract with constructor and rendering coverage. +- Unify slash and file-mention completion behind one canonical completion context, adding quoted `@"path with spaces"` file mentions. +- Index workspace file mentions asynchronously with a cwd-aware, generation-owned snapshot index so completion never blocks on disk or Git scans. +- Harden prompt completion: Escape now dismisses the slash-argument menu (not just draft commands), file-mention highlighting no longer swallows trailing prose punctuation, scoped `@dir/name` completions rank basename-prefix matches first, workspace Git scans drain stdout/stderr concurrently to avoid a pipe deadlock, and a mid-session working-directory removal no longer crashes the prompt turn. +- Keep the interactive prompt scene within the terminal height with a priority-ordered row allocator, and shut prompt background tasks/processes down with an awaited lifecycle. - Add xAI Grok OAuth login (browser loopback and device-code). - Add GitHub Copilot device-code OAuth login for individual github.com accounts. - Add DigitalOcean Gradient AI browser OAuth login with dynamically discovered Inference Routers; router-discovery failures (unauthorized, outage, malformed, empty) are now reported distinctly instead of silently yielding no models. @@ -26,6 +42,7 @@ GitHub Releases page; `0.8.0` is the new starting line. - Fix queued follow-up input showing a bordered ghost; pressing Enter during an active turn now shows one intentional queued row. - Harden provider OAuth credential handling: scope token refresh to the active/selected provider, serialize persistence under a lock with atomic config replacement, roll back replaced credentials when a save fails, fail closed on credential migration, and validate OAuth token and implicit-state responses. - Fix an intermittent doubled/"ghost" copy of the running-prompt block (agent tree, spinner, and tip) on long streaming turns: after a scrollback handoff the suppressed live body now waits for the terminal's re-requested absolute cursor position to settle before it re-expands, so it repaints against a correct cursor model instead of the mis-anchored frame left behind by `run_in_terminal`. +- Fix the "update available" footer notice being suppressed on shell-mode frames (and a stale agent-mode notice replaying after a mode switch): the shell prompt render now refreshes the per-frame update-notice snapshot like the agent path, and the snapshot is cleared with the frame. ## 0.60.0 (2026-07-18) diff --git a/packages/linux-installer/README.md b/packages/linux-installer/README.md index e9045be2..6bdf1d38 100644 --- a/packages/linux-installer/README.md +++ b/packages/linux-installer/README.md @@ -8,19 +8,19 @@ End-user install from the current GitHub Release: ```sh # Debian / Ubuntu -curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.60.0/pythinker-code_0.60.0_amd64.deb -curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.60.0/pythinker-code_0.60.0_amd64.deb.sha256 -sha256sum -c pythinker-code_0.60.0_amd64.deb.sha256 -sudo dpkg -i pythinker-code_0.60.0_amd64.deb +curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.61.0/pythinker-code_0.61.0_amd64.deb +curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.61.0/pythinker-code_0.61.0_amd64.deb.sha256 +sha256sum -c pythinker-code_0.61.0_amd64.deb.sha256 +sudo dpkg -i pythinker-code_0.61.0_amd64.deb sudo apt-get install -f # only needed if dependencies fail to resolve # Fedora / RHEL / openSUSE -curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.60.0/pythinker-code-0.60.0.x86_64.rpm -curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.60.0/pythinker-code-0.60.0.x86_64.rpm.sha256 -sha256sum -c pythinker-code-0.60.0.x86_64.rpm.sha256 -sudo dnf install ./pythinker-code-0.60.0.x86_64.rpm +curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.61.0/pythinker-code-0.61.0.x86_64.rpm +curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.61.0/pythinker-code-0.61.0.x86_64.rpm.sha256 +sha256sum -c pythinker-code-0.61.0.x86_64.rpm.sha256 +sudo dnf install ./pythinker-code-0.61.0.x86_64.rpm # or, on openSUSE: -sudo zypper install ./pythinker-code-0.60.0.x86_64.rpm +sudo zypper install ./pythinker-code-0.61.0.x86_64.rpm ``` The package drops a single executable at `/usr/bin/pythinker` and a license @@ -41,8 +41,8 @@ bash packages/linux-installer/build.sh 0.60.0 Outputs to `dist/`: -- `pythinker-code_0.60.0_amd64.deb` -- `pythinker-code-0.60.0.x86_64.rpm` +- `pythinker-code_0.61.0_amd64.deb` +- `pythinker-code-0.61.0.x86_64.rpm` The portable tarball used by `scripts/install-native.sh` is published by the existing `release-pythinker-cli.yml` workflow under the cargo-dist diff --git a/pyproject.toml b/pyproject.toml index 113f0a34..5977d527 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "pythinker-code" -version = "0.60.0" +version = "0.61.0" description = "Pythinker β€” an agentic CLI developed by Pythoughts-labs." readme = "README.md" requires-python = ">=3.12" diff --git a/uv.lock b/uv.lock index fbdbc802..11c32d6c 100644 --- a/uv.lock +++ b/uv.lock @@ -2527,7 +2527,7 @@ wheels = [ [[package]] name = "pythinker-code" -version = "0.60.0" +version = "0.61.0" source = { editable = "." } dependencies = [ { name = "agent-client-protocol" },