| 1 | # Changelog |
| 2 | |
| 3 | All notable changes to the Go line (Reasonix 1.0+) are recorded here. The legacy |
| 4 | `0.x` TypeScript history lives on the [`v1`](https://github.com/esengine/DeepSeek-Reasonix/tree/v1) |
| 5 | branch. |
| 6 | |
| 7 | ## Unreleased |
| 8 | |
| 9 | ### Added |
| 10 | |
| 11 | - **Live file observations:** structured file tools now protect mutations with |
| 12 | a host-owned current-version observation. Any successful text window is |
| 13 | sufficient, successful writes refresh the version, and external changes |
| 14 | produce `FS_STALE_VERSION` without blocking unrelated tools. |
| 15 | |
| 16 | - **MCP 2026-07-28 protocol:** multi-round-trip form/URL elicitation across |
| 17 | Desktop, CLI TUI, and serve; headless entries stay on the core surface and |
| 18 | cancel unanswered requests instead of guessing. |
| 19 | - **MCP Apps 2026-01-26 (Desktop):** inline app surfaces in tool cards behind |
| 20 | a per-server double-iframe sandbox, app-tool visibility metadata, bounded |
| 21 | aggregate local presentations, tab-bound AppBridge routing and teardown, |
| 22 | immutable digest-bound resource snapshots, and confirmed external links; |
| 23 | local rich results, instance-gated app tool calls, and the four-layer |
| 24 | capability matrix in MCP status. |
| 25 | - **Profile-scoped MCP schema caches:** capability-declaring hosts keep their |
| 26 | own `v3` cache files so catalogs negotiated under different client |
| 27 | capabilities never cross-read. |
| 28 | |
| 29 | ### Changed |
| 30 | |
| 31 | - **Persistent bash PTY:** ordinary foreground `bash` calls in a session now |
| 32 | share one PTY, so `cd`, exported variables, and shell functions survive |
| 33 | across calls. Output stays byte-identical to one-shot execution, stdin stays |
| 34 | detached, and a timeout or cancel reports partial output and says the shell |
| 35 | was reset. Background jobs, commands that background a child, per-call |
| 36 | write-root escalations, host terminals, and PowerShell hosts stay one-shot. |
| 37 | The bash tool schema and description are unchanged. |
| 38 | |
| 39 | - **CLI YOLO shortcuts:** the CLI displays the unrestricted preset as YOLO; |
| 40 | `Ctrl+Y` toggles the canonical `danger-full-access` permission, while |
| 41 | `Shift+Tab` cycles Read only → Workspace write → YOLO → Plan. |
| 42 | |
| 43 | - **Harness-style scheduling and recovery:** calls take effect in execution |
| 44 | order, including same-batch read/edit sequences. Bounded reads create no |
| 45 | completion debt. Unknown external effects are durable advisory facts and no |
| 46 | longer block tools or trigger replay. Proof/settlement tools, Auto Guard, |
| 47 | recovery actions, and repeat-call rejection are retired; identical calls get |
| 48 | non-blocking reminders at counts 3, 5, and 8. |
| 49 | |
| 50 | - **Fact-driven execution:** Ordinary requests always enter the executor. |
| 51 | There is no automatic simple / light / full task mode and no per-turn |
| 52 | `TaskPolicy` classification. The planner runs only for an explicit Plan, |
| 53 | an approval boundary, or Goal start. The host builds verification |
| 54 | obligations from concrete tool effects and receipts. Plan, Goal, |
| 55 | permission, and sandbox stay independent. Tool schemas and the executor |
| 56 | system prefix stay byte-stable. Historical `<execution-policy>` tags remain |
| 57 | readable on old sessions and are stripped from new provider context. |
| 58 | Old `--preset`/`--profile` compatibility no-ops are unchanged. |
| 59 | |
| 60 | - **Remote connect wizard host picker:** Step 1's host field now opens the |
| 61 | saved SSH connections through an explicit chevron dropdown on the input's |
| 62 | right edge instead of the old focus-triggered popup. The dropdown lists |
| 63 | every saved connection unfiltered, appends non-standard ports to each row, |
| 64 | leads with a "saved SSH connections" caption, and closes on pick, arrow |
| 65 | toggle, Escape (before the Escape that exits the wizard), or an outside |
| 66 | pointer press. The arrow is hidden while no hosts are saved and disabled |
| 67 | while a connection is busy. |
| 68 | |
| 69 | ### Fixed |
| 70 | |
| 71 | - **Read evidence recovery:** partial reads no longer freeze independent work |
| 72 | or ordinary final answers. Explicit full reads retain bounded completion |
| 73 | checks. Rejected edits track operation/version requirements so successful |
| 74 | retries, fresh versions and confirmed deletion retire obsolete blocks. |
| 75 | - **File and shell boundaries:** guard raced creates/overwrites and move-source |
| 76 | changes, recognize `git --no-pager` inspections, and retain structured recovery |
| 77 | diagnostics without changing provider tool schemas. |
| 78 | |
| 79 | - **Relay image input:** ID-only or invalid model metadata now stays unknown. |
| 80 | Both Desktop model editors expose per-model Auto / On / Off overrides, with |
| 81 | official protocol limits retained. A separate V2 discovery cache rejects stale |
| 82 | results; saved settings and runtime image serialization share one resolver and |
| 83 | apply at Controller rebuild boundaries. Legacy configuration remains readable. |
| 84 | - **中转站图片输入:** 缺失或无效的模型能力显示“图片能力未识别”,两个编辑入口 |
| 85 | 均可逐模型选择“自动 / 开启 / 关闭”。独立 V2 缓存隔离旧错误声明并防止陈旧结果 |
| 86 | 覆盖;保存设置与实际图片请求统一解析,在 Controller 重建边界生效,兼容旧配置。 |
| 87 | |
| 88 | - **Deterministic natural-turn completion:** removed the extra completion |
| 89 | validator model request. Clean model stops now finish from provider/tool state; |
| 90 | true zero-content responses retry the frozen request at the Agent step |
| 91 | boundary, while explicit host-owned readiness and safety gates remain active. |
| 92 | Legacy completion-validator configuration and `completion_uncertain` event |
| 93 | values remain readable for compatibility but are no longer produced by the |
| 94 | validator path. |
| 95 | |
| 96 | - **serve Host-header allowlist:** `reasonix serve` now rejects requests whose |
| 97 | `Host` is neither loopback nor the actual listen address (HTTP 421), closing |
| 98 | the DNS-rebinding bypass of the JSON content-type CSRF guard — a rebind page |
| 99 | becomes same-origin with the loopback listener and could previously drive |
| 100 | `/bypass`, `/submit`, and read `/history`. `behind_proxy` deployments and |
| 101 | wildcard/non-loopback binds are exempt. The non-loopback plaintext-HTTP |
| 102 | startup warning now also fires — loudest — for the unauthenticated `auth = |
| 103 | none` case that used to stay silent. |
| 104 | |
| 105 | - **Preview read confinement:** `write_file` / `edit_file` / `multi_edit` |
| 106 | previews now apply the same `confinePreview` boundary as `delete_range` / |
| 107 | `delete_symbol`. A model-supplied absolute path outside the workspace roots |
| 108 | previously read the file (rendering its contents into the approval card and |
| 109 | session log) even though Execute would refuse the write. |
| 110 | |
| 111 | - **Clean-filter hardening on internal diffs:** gitcmd diff invocations now |
| 112 | neutralize every `filter.<driver>` defined in the repository's local |
| 113 | `.git/config` (`clean=` emptied, `required` forced off), so viewing a changed |
| 114 | file's diff can no longer execute a repository-configured clean filter via |
| 115 | `.gitattributes`. Emptied filters are identity pass-throughs: the diff still |
| 116 | renders the real working-tree change. |
| 117 | |
| 118 | - **install_source proxy SSRF parity:** the install_source SSRF dial guard now |
| 119 | also validates the request destination (IP literals) at the RoundTripper |
| 120 | boundary, so a configured HTTP/HTTPS proxy can no longer forward a blocked |
| 121 | target (cloud metadata, RFC1918, link-local, CGNAT) that the dial-time check |
| 122 | never sees — matching web_fetch's proxy-path behavior. |
| 123 | |
| 124 | - **awk approval classification:** the bash indirect-execution classifier now |
| 125 | treats `awk`/`gawk`/`mawk`/`nawk` with an inline program (anything not read |
| 126 | via `-f`/`--file`) like `python -c`: it always requires human approval and |
| 127 | can never be covered by a remembered reusable prefix rule. `awk |
| 128 | 'BEGIN{system("…")}'` previously fell through to the reusable class. |
| 129 | |
| 130 | - **cargo check/doc read-only correction:** the legacy read-only command table |
| 131 | no longer lists `cargo check` / `cargo doc` as permission readers — cargo |
| 132 | executes the crate's `build.rs` for both. The effect classifier already |
| 133 | billed them as code-executing writers; the stale table entry (and its test) |
| 134 | now agree. Only `cargo search` remains read-only. |
| 135 | |
| 136 | - **Compact MCP discovery:** `use_capability(action=list)` now returns one |
| 137 | compact summary per configured MCP server instead of expanding every cached |
| 138 | tool description, including tools from disabled servers. Inspecting one |
| 139 | enabled `mcp-server:<name>` still returns its live or cached directory |
| 140 | without starting it, while direct known-ID calls, routing, authorization, |
| 141 | and the fixed provider-visible tool schema remain unchanged. |
| 142 | |
| 143 | - **Project MCP session reliability:** The MCP client now uses the official Go |
| 144 | SDK for stdio, legacy SSE, and Streamable HTTP while retaining Reasonix's |
| 145 | existing configuration, OAuth, process isolation, and schema-cache contracts. |
| 146 | Streamable HTTP opens its long-lived GET/SSE listener immediately after |
| 147 | initialization, so JetBrains project-level `.mcp.json` servers no longer lose |
| 148 | their pending session before the first tool call. Lost sessions converge on |
| 149 | one bounded rebuild and one replay, read-only surfaces consume every cursor |
| 150 | page, prompts/resources share the tool session, and shutdown terminates HTTP |
| 151 | sessions and local processes. MCP calls also accept a single JSON-object |
| 152 | string in `use_capability.arguments`, while rejecting arrays, scalars, invalid |
| 153 | JSON, and nested encoded strings. `/mcp` and Desktop expose redacted protocol, |
| 154 | listening, reconnect, and error-category diagnostics without session IDs. |
| 155 | |
| 156 | - **v1.24.2 session snapshot & recovery root fix:** Keep PR #7982's WAL/CAS/lease |
| 157 | safety foundation, but replace process-level "I hold a lease" ownership with a |
| 158 | generation-bound `SessionWriteAuthority`. Same-revision tool-preview/load |
| 159 | reshapes no longer false-diverge; recovery files are bounded to one path per |
| 160 | writer/lineage; empty checkpoints heal from their own WAL; projection lineage |
| 161 | rebinds across upgrade/model switch and inherits across recovery forks without |
| 162 | changing provider-visible prompt bytes. Catalog upgrades to disposable |
| 163 | `session-catalog/v3.sqlite` with recovery lineage roles |
| 164 | (`normal|covered_copy|adopted|diverged`); covered idle copies move to the |
| 165 | recoverable `.trash` using a 15-minute idle threshold applied on two early |
| 166 | sweeps (at startup and ~20 minutes later), then a 24-hour threshold on the |
| 167 | 6-hour background ticker; independent diverged branches stay and are listed |
| 168 | for user choice. v1/v2 catalogs are |
| 169 | left byte-unchanged for coexistence/downgrade. |
| 170 | **v1.24.1** only hid/reclaimed already-created covered copies and fixed Windows |
| 171 | flash-window startup; **v1.24.2** stops the misclassification source and repairs |
| 172 | existing user directories without rewriting authoritative JSONL/WAL/sidecar data. |
| 173 | |
| 174 | - Goal now runs continuously by default: the former 16-round per-Run boundary, |
| 175 | 10/20/40 cross-Run quotas, default wall-clock budget, and numeric |
| 176 | no-progress/Todo-stall pauses no longer stop valid work. Progress guards still |
| 177 | detect repeated host outcomes and zero-evidence work, but redirect the model |
| 178 | to re-plan instead of producing `goal_run_budget` or `goal_stuck`. Explicit |
| 179 | `[agent].goal_token_budget`, `--max-steps`, positive time/cost budgets, manual |
| 180 | pause/stop, genuine user/external blockers, and evaluator fail-closed behavior |
| 181 | remain available. The Goal token budget defaults to `0` (off); resuming its |
| 182 | `budget_spend` pause grants a fresh slice without clearing cumulative usage. |
| 183 | Goal status reports turns, provider requests, tokens, the optional configured |
| 184 | token threshold, and cumulative active work time. Bot `max_steps` also |
| 185 | defaults to `0` (continuous), while positive user configuration is enforced. |
| 186 | |
| 187 | - Removed numeric Goal pauses in existing sidecars automatically normalize to |
| 188 | `running` without sending a model request. Active Goal sidecars write |
| 189 | `turnsLimit: -1` as a downgrade-safe unlimited sentinel while public runtime |
| 190 | APIs retain deprecated limit fields as `0`. The migration preserves unknown |
| 191 | fields, todos, checkpoints, usage, evidence, and historical metadata. |
| 192 | |
| 193 | - Goal is now the sole long-task runtime. Historical AutoResearch sidecars |
| 194 | migrate transactionally into Goals with research compatibility metadata. Invalid archives block |
| 195 | fail closed and remain read-only, retaining the task id and compatibility mode |
| 196 | for a restart or `/goal resume` retry; successful Goal-only sidecars omit the |
| 197 | old task id and write an explicit downgrade fence so previous readers cannot |
| 198 | reactivate the removed runtime. |
| 199 | |
| 200 | - Context-dependent workflow tools now share one host-side execution boundary. |
| 201 | Goal, Plan sign-off, and background-job calls cannot reach permissions, |
| 202 | hooks, leases, or Execute outside their owning context; mixed batches execute |
| 203 | valid calls once and stop safely after one repair. Child agents also isolate |
| 204 | inherited Goal, Jobs, and live memory queues, while persisted tool identity |
| 205 | records the effective child schema projection. |
| 206 | |
| 207 | - **Issue #7575:** Linux Bash under bubblewrap no longer mounts a fresh empty |
| 208 | `--tmpfs /tmp` on every call. Consecutive commands in the same logical session |
| 209 | now share a private temporary directory (bound at `/tmp` on Linux, exported via |
| 210 | `TMPDIR`/`TMP`/`TEMP` on all platforms) without exposing the host public |
| 211 | temporary root. `/new`, `/clear`, resume of another session, and branch |
| 212 | switches rotate the directory; model/settings hot rebuilds keep it. Sub-agent |
| 213 | runs get independent directories. Temporary files are not durable across process |
| 214 | restarts. |
| 215 | |
| 216 | ### Added |
| 217 | |
| 218 | - Added `[ui].show_turn_usage` so CLI/TUI users can hide per-request token and |
| 219 | cost receipts from transcript scrollback without disabling usage accounting. |
| 220 | |
| 221 | ## [1.20.0] — 2026-08-05 |
| 222 | |
| 223 | Extension kernel, Task Monitor, and safer Goal completion. |
| 224 | |
| 225 | Compact decision surfaces, local decision receipts, unified extension kernel, |
| 226 | native Task Monitor, bounded sub-agent progress, Goal fail-closed completion, |
| 227 | MiMo and DashScope Responses fixes, SSH remote access simplification, and |
| 228 | multiple Desktop stability improvements. |
| 229 | |
| 230 | ### Highlights |
| 231 | |
| 232 | - **Unified Extension Kernel and Extension Protocol v1**: Immutable runtime |
| 233 | snapshots, fail-atomic reload, Plugin Manifest v1 (prompts, themes, full-trust |
| 234 | code runtimes), stable JSON-RPC sidecar protocol, interceptor dispatch, |
| 235 | streaming provider adapter, structured UI, and Go SDK. |
| 236 | - **Native Task Monitor**: Monitor agent tasks natively in CLI and Desktop with |
| 237 | lifecycle semantics and session-scoped summary view. |
| 238 | - **Bounded Sub-agent Progress Forwarding**: Forward structured progress for |
| 239 | `task`, `parallel_tasks`, and `fleet` without flooding the parent stream. |
| 240 | Renders nested lifecycle cards in Desktop and stable per-child transcript |
| 241 | slots in CLI. |
| 242 | - **Goal Completion Fail-Closed**: Replace free-form Goal footer markers with a |
| 243 | stable `update_goal` tool and epoch-scoped per-turn reports. Centralized |
| 244 | completion logic with bounded evaluator, progress-aware budgets, and |
| 245 | pause/resume controls. |
| 246 | - **Ablation Subsystem Switches**: Switch subsystems off behind one shared |
| 247 | vocabulary for controlled experiments. Includes planner, subagent, retrieval, |
| 248 | evidence, and compaction. |
| 249 | - **Benchmark Cost per Solved Task**: Report cost per solved task, tokens per |
| 250 | solved, median wall time, and failure-class breakdown in e2e reports. |
| 251 | - **Compact Decision Surfaces and Local Receipts**: Compact footer decision-card |
| 252 | layout with bounded scroll, dense action rows, and overflow disclosure. |
| 253 | Record bounded Ask, approval, and recovery decisions as local transcript |
| 254 | receipts. |
| 255 | - **Simplified SSH Remote Access**: Remove Remote Workbench protocol and |
| 256 | stacks; reuse CLI/Serve remote model. Desktop opens per-host native web child |
| 257 | windows via SSH. Keyless remote Serve setup with loopback-only page. |
| 258 | - **Model Usage Charts with Primer Palette**: Replace monochrome accent ramp |
| 259 | with GitHub Primer data-viz two-set categorical palette. Fix donut overflow |
| 260 | on hover and keyboard accessibility. |
| 261 | - **Cross-platform Extension and Task Monitor Reliability**: Make |
| 262 | content-reference eviction deterministic, reject Unix and Windows absolute |
| 263 | plugin paths consistently, stabilize parallel-task cancellation, and restore |
| 264 | reliable Windows validation for Task Monitor and remote provider setup. |
| 265 | - **MiMo and DashScope Responses Wire Alignment**: Fix multi-turn tool loops, |
| 266 | reasoning round-trip, JSON output for MiMo; fix DashScope second-turn 400 |
| 267 | error, all-zero usage suppression, and vendor-aware cache TTL. |
| 268 | - **Desktop Stability Fixes**: Recover stuck updates and legacy WebKit, contain |
| 269 | macOS alias repair startup crashes, keep composer overflow stacks readable, |
| 270 | and harden account verification and community flows. |
| 271 | - **Remote Web Recovery After SSH Drops**: Add integration regression test for |
| 272 | SSH drop, forward recovery, and window reload. Document transient outage |
| 273 | behavior. |
| 274 | - **CI: Auto-minimize Activity-Farming Spam Comments**: Detect and minimize |
| 275 | template spam comments from non-contributor accounts based on structural |
| 276 | signals. |
| 277 | |
| 278 | ### Added |
| 279 | |
| 280 | - Added Extension Protocol v1 and the unified extension kernel: installed or |
| 281 | linked sidecars can contribute tools, skills, commands, hooks, MCP servers, |
| 282 | providers, interceptors, and structured UI surfaces through a versioned |
| 283 | NDJSON contract and the public Go SDK. CLI, Desktop, ACP, and Serve support |
| 284 | fail-atomic runtime reloads; Serve also renders extension surfaces and lists |
| 285 | extension-hosted providers without exposing credentials. |
| 286 | - Added the structured Goal completion protocol: the always-registered |
| 287 | `update_goal` tool (continue/complete/blocked with reason and next_action) |
| 288 | replaces the `[goal:*]` footer markers. The Goal FSM is now the exclusive |
| 289 | cross-turn decision point and validates every complete claim against Delivery |
| 290 | readiness; when the model submits no report, an independent bounded evaluator |
| 291 | (recovery_model → guardian_model → main model, no tools/history, usage |
| 292 | attributed to `goal-evaluator`) judges the turn once, and any evaluator |
| 293 | failure pauses the goal instead of continuing silently. |
| 294 | - Added Goal budget classes with safe pauses: simple 10 turns / 200k tokens, |
| 295 | write 20 turns / 400k tokens, AutoResearch 40 turns / 800k tokens, and a |
| 296 | 4-turn no-host-verifiable-progress gate. Pauses keep all Goal state; `/goal |
| 297 | resume` continues and adds one slice of the current class when the pause was |
| 298 | budget-related. `/goal status` shows the full turn/token/no-progress runtime, |
| 299 | and `/goal pause` manually suspends a running Goal. |
| 300 | - Added the `goalRuntime` nested view to the desktop Meta, the remote protocol |
| 301 | (`session/goal/pause` operation, `goalRuntime` DTO on session meta), and the |
| 302 | ACP status payload; the desktop Composer goal menu shows the runtime summary |
| 303 | with distinct pause/end/resume actions. |
| 304 | |
| 305 | ### Changed |
| 306 | |
| 307 | - Delivery no longer retries final-answer readiness with hidden model messages: |
| 308 | a plain Delivery run ends on the first unsatisfied final answer and surfaces |
| 309 | the recovery card, while a Goal + Delivery run has the Goal FSM absorb the |
| 310 | failure and continue under budget with the missing requirements as the next |
| 311 | turn's prompt. Historical `[goal:*]` footers are stripped from old transcripts |
| 312 | for display only and never participate in state decisions. |
| 313 | - Added a **Remote SSH** module (VS Code Remote-SSH style): a user-global |
| 314 | `[remote]` host config, `reasonix remote` CLI (add/list/remove/import/test/ |
| 315 | connect/status/forward/serve/fs) and `/remote` slash command, an SSH transport |
| 316 | with trust-on-first-use host-key verification, keepalive + exponential-backoff |
| 317 | reconnect, `-L`/`-R` port forwarding, and SFTP file access. `connect` |
| 318 | bootstraps a persistent `reasonix serve` on the remote host and tunnels its |
| 319 | loopback port so the full agent runs remotely. The desktop app adds a |
| 320 | **Settings -> Remote SSH** host manager, a remote file browser/editor, a |
| 321 | port-forwarding panel, and a status-bar connection chip. Linux/macOS remotes. |
| 322 | - Added `reasonix serve --port-file/--token-file/--pid-file` so a supervised |
| 323 | headless serve can bind an ephemeral port and read its auth token from a file |
| 324 | (keeping it out of `ps`). |
| 325 | - Added an authenticated, loopback-only Provider setup page for `reasonix |
| 326 | serve`. A Serve whose selected Provider is missing its API key now remains |
| 327 | reachable, stores the submitted key in that host's Reasonix credential file, |
| 328 | and rebuilds the active controller in place without restarting Serve. |
| 329 | - Added Claude Code-style searchable CLI pickers for models, providers, and |
| 330 | sessions, with arrow, Vim, and `Ctrl+P` / `Ctrl+N` navigation. |
| 331 | - Added `-p` / `--print`, `text`, `json`, and `stream-json` output modes for |
| 332 | one-shot use and automation. |
| 333 | - Added session-scoped `--allowed-tools`, repeatable `--add-dir`, Claude-compatible |
| 334 | permission modes, flexible `--resume [QUERY]`, and the `--copy` resume escape |
| 335 | hatch. |
| 336 | - Added `/status` details for the active model, effort, cache, Git state, |
| 337 | background jobs, work profile, and provider balance where available. |
| 338 | - Remote SSH workspaces now open as a standalone remote web window again. |
| 339 | Opening a workspace from the status bar or the Remote Server tab starts or |
| 340 | reuses the remote `reasonix serve`, tunnels its loopback port, and opens the |
| 341 | Serve web client in a dedicated per-host window. The remote web page uses |
| 342 | the provider configuration and API keys on the **remote** host; the desktop |
| 343 | no longer exposes its local providers to remote hosts. If the selected remote |
| 344 | Provider is missing its API key, the window opens a setup page that saves the |
| 345 | key only on that host and then opens the normal Serve UI. The Remote Workbench |
| 346 | protocol, its Provider Broker, and the same-window remote projection were |
| 347 | removed. Legacy mirror and provider-trust files are not deleted |
| 348 | automatically; Settings -> Remote SSH shows a cleanup card when they exist. |
| 349 | The hidden `remote attach-workspace`, `remote runtime-workbench`, and |
| 350 | `remote workbench-build-id` commands now fail with a pointer to |
| 351 | `reasonix remote connect <host> --open`. |
| 352 | - Automatic Plan Mode has been retired. Plan Mode is now always entered through |
| 353 | an explicit user choice, and the one-time config v5 upgrade removes legacy |
| 354 | `agent.auto_plan` and `agent.auto_plan_classifier` values so upgraded users |
| 355 | receive the same behavior as new users. |
| 356 | - `Shift+Tab` now cycles CLI safe modes from Ask to Auto to Plan, while YOLO |
| 357 | remains an independent `Ctrl+Y` toggle. |
| 358 | - Model, provider, resume, and approval menus now use consistent row selection; |
| 359 | slash completion, help, aliases, and dispatch share one command registry. |
| 360 | - The full-screen CLI composer now uses theme-accented borders and a slim bar |
| 361 | cursor by default, grows within the available terminal height, scrolls long |
| 362 | drafts independently, and preserves selections across explicit image paste. |
| 363 | - The persistent CLI footer now uses a responsive, theme-aware layout for |
| 364 | interaction state, model, effort, localized work mode, Git identity, cache, |
| 365 | context, compaction headroom, jobs, and balance. Narrow terminals move or |
| 366 | compact complete groups instead of clipping labels. |
| 367 | - CLI clipboard actions now separate terminal-native text paste from explicit |
| 368 | image paste: `Ctrl+V` on macOS/Linux, `Alt+V` on Windows, or `/paste-image`. |
| 369 | Local transcript copy verifies the native clipboard write, while SSH uses a |
| 370 | clearly labelled OSC 52 fallback. |
| 371 | - Runtime rebuilds after model, effort, or work-mode changes now preserve the |
| 372 | conversation, session permission overrides, additional directories, and |
| 373 | session lease ownership. |
| 374 | - Agent execution now monitors host-observed Todo progress automatically. A |
| 375 | stalled current item receives a recovery nudge after 8 tool-call rounds with |
| 376 | no new completion, unique read, command, or mutation, and pauses with saved |
| 377 | work after 16. Exact repeats do not renew the progress lease; real work does. |
| 378 | Two-level task lists keep the single in_progress contract: the active |
| 379 | sub-step is the only current item while its phase stays pending, and the |
| 380 | phase becomes in_progress to sign off only after all of its sub-steps are |
| 381 | completed. A level-1 sub-step with no phase header above it is rejected. |
| 382 | Executor and planner rounds now use automatic progress management. Retired |
| 383 | `[agent].max_steps` and `planner_max_steps` keys remain parseable for upgrades, |
| 384 | but are ignored and removed by a one-time migration so stale hidden limits |
| 385 | cannot truncate new behavior. One-off CLI and unattended bot limits remain. |
| 386 | |
| 387 | ### Fixed |
| 388 | |
| 389 | - Fixed long parallel sub-agent research being silently lost when combined |
| 390 | `parallel_tasks` or `fleet` answers exceeded the single-tool output limit. |
| 391 | Persisted sessions now keep each child transcript independently, return a |
| 392 | bounded fair preview plus stable reference for every result, and page full |
| 393 | answers through the conversation-scoped `read_subagent_result` tool. |
| 394 | - Fixed Remote Workbench failing with only `initialize: workbench-desktop: |
| 395 | connection closed` on fresh or cross-platform SSH hosts. Desktop now proves |
| 396 | the exact Host CLI Build ID, provisions the matching verified release without |
| 397 | requiring remote npm, runs the managed binary explicitly, and preserves a |
| 398 | safe structured bootstrap error when the remote command exits early. |
| 399 | - Hardened Bash permission reuse for dynamic and indirect execution. Parameter/arithmetic expansions, |
| 400 | assignments, redirects, heredocs, and globs can only be remembered as exact |
| 401 | `Bash=<literal>` rules, while still using Auto's normal fallback. Nested or |
| 402 | indirect execution now requires a human in interactive Ask/Auto and fails |
| 403 | closed in headless Ask/Auto/DontAsk. Broad Bash rules, Guardian/hook allows, |
| 404 | and the approved-plan window can no longer silently authorize that stricter |
| 405 | class; YOLO remains the explicit full-access bypass and sandbox enforcement |
| 406 | is unchanged. |
| 407 | - Fixed Desktop sessions incorrectly locking themselves during Goal + Delivery |
| 408 | mode changes, controller rebuilds, duplicate-tab restore, and background |
| 409 | reattachment. Desktop now keeps one process-local runtime owner per canonical |
| 410 | session, fences stale controller events by runtime epoch, blocks sends until |
| 411 | that runtime is ready, and scopes single-instance ownership to |
| 412 | `REASONIX_HOME` instead of the executable path. Switching saved sessions is |
| 413 | now transactional: a target build, restore, or lease failure leaves the |
| 414 | current controller, lease, path, mode profile, and runtime epoch untouched. |
| 415 | - Stabilized the desktop rich composer caret after skill and plugin invocation |
| 416 | tags. DOM→model and model→DOM selection mapping now treat invocation chips as |
| 417 | zero-length atoms while still counting user text that lands inside the NBSP |
| 418 | caret anchor (common on Windows WebView2), restore both selection ends, and |
| 419 | recover the insertion point from a `beforeinput` snapshot when the browser |
| 420 | temporarily loses selection — so mid-text edits no longer jump to the end. |
| 421 | - Isolated the Windows desktop WebView2 shell from stale system proxies, so an |
| 422 | exited proxy client cannot leave the embedded UI hidden during startup. If |
| 423 | WebView2 still does not reach DOM-ready within 15 seconds, Reasonix now shows |
| 424 | the native window with a recovery prompt instead of appearing not to launch. |
| 425 | Remote Markdown images are fetched by the backend with Reasonix's proxy |
| 426 | configuration instead of bypassing that proxy through the isolated WebView. |
| 427 | - Restored captured-mouse right-click text paste, made composer drag selection |
| 428 | copy through the verified native clipboard path, and kept non-Git footer |
| 429 | telemetry left-aligned without reserving an empty data band. |
| 430 | - Restored stateful MCP behavior after the v1.17.13 regression: user-added |
| 431 | servers work without extra trust settings (including delivery-mode on-demand |
| 432 | calls), repository-provided servers use one exact launch confirmation, and |
| 433 | stdio tools reuse one persistent process so browser sessions survive across |
| 434 | calls without repeated startup latency. The former trust/reverify/catalog |
| 435 | management UI and CLI are removed. |
| 436 | - Localized persistent-footer labels and displayed work-mode values in English, |
| 437 | Simplified Chinese, and Traditional Chinese, while keeping command arguments |
| 438 | stable. |
| 439 | - Restored the `0.53` content boundary: model output, tool output, session |
| 440 | transcripts, recovery branches, and background-job artifacts retain their |
| 441 | original text instead of being rewritten by heuristic secret redaction. |
| 442 | Credential masking remains in key-entry summaries and explicit diagnostic or |
| 443 | session-cleanup paths. Transcript-bearing session/job sidecars are kept |
| 444 | private (`0600`, with private job directories), and the retired |
| 445 | `redact_tool_output` setting is removed with a one-time upgrade notice. |
| 446 | |
| 447 | ### Notes |
| 448 | |
| 449 | - Full bilingual release notes: |
| 450 | <https://reasonix.io/changelog/v1.20.0/> · |
| 451 | [GitHub release](https://github.com/esengine/DeepSeek-Reasonix/releases/tag/desktop-v1.20.0). |
| 452 | - The detailed entries below accumulated on `main-v2` after 1.0.0 and shipped |
| 453 | across 1.1.0–1.20.0; per-version attribution lives in the per-version release |
| 454 | notes linked above. |
| 455 | |
| 456 | ## 1.1.0 – 1.19.7 |
| 457 | |
| 458 | Per-version entries for the intermediate releases are published in the |
| 459 | [bilingual release notes](https://reasonix.io/changelog/) and on the |
| 460 | [GitHub releases page](https://github.com/esengine/DeepSeek-Reasonix/releases). |
| 461 | |
| 462 | ## [1.0.0] — 2026-06-03 |
| 463 | |
| 464 | First stable release — a **ground-up rewrite in Go**. Not an upgrade of the `0.x` |
| 465 | TypeScript line; a new codebase that becomes the default (`main-v2`). |
| 466 | |
| 467 | ### Highlights |
| 468 | |
| 469 | - **Go kernel**: a single static binary (CGO-free), cross-compiled for |
| 470 | darwin/linux/windows on amd64 + arm64. Distributed via npm (the package wraps |
| 471 | the native binary), Homebrew (`esengine/reasonix` tap), and release archives; |
| 472 | no Node runtime needed to run it. |
| 473 | - **Agent core**: the loop, built-in tools (read/write/edit/multi_edit/glob/grep/ |
| 474 | ls/bash/web_fetch/todo_write), permission gate, sandboxed bash, and the |
| 475 | DeepSeek prefix-cache–oriented design. |
| 476 | - **Subagents**: `task` plus explore/research/review/security_review skill agents. |
| 477 | - **Skills & hooks**: Claude-Code-style skills (`internal/skill`) and hooks |
| 478 | (`internal/hook`), symlink-aware and slash-integrated. |
| 479 | - **MCP client**: connect external servers over stdio / Streamable HTTP; reads |
| 480 | `[[plugins]]` and a Claude-Code `.mcp.json`. |
| 481 | - **Code intelligence via CodeGraph**: a tree-sitter symbol/call graph |
| 482 | (`codegraph_*` tools) replaces embedding semantic search — no embedding service |
| 483 | or API cost. Fetched into a local cache on first use (or `reasonix codegraph |
| 484 | install`) and indexed in the background, so installs and startup stay fast. |
| 485 | - **Plan mode** with evidence-backed step sign-off (`complete_step`). |
| 486 | - **Memory**: `REASONIX.md` hierarchy + auto-memory, folded into the cache-stable |
| 487 | prefix. |
| 488 | - **ACP** (`reasonix acp`) and an HTTP/SSE server frontend; desktop app (Wails). |
| 489 | |
| 490 | ### Fixed |
| 491 | |
| 492 | - **File encoding support restored** — GBK/GB18030 (and other non-UTF-8) files |
| 493 | can now be read, edited, and grepped correctly. The v2 rewrite had dropped |
| 494 | v1's encoding detection; files in CJK Windows charsets were silently misread |
| 495 | or rejected as binary. The read/edit/write round-trip now preserves the |
| 496 | original file encoding. (#2637) |
| 497 | |
| 498 | ### Notes |
| 499 | |
| 500 | - Versions: the legacy TypeScript line stays in `0.x`; the Go line starts at |
| 501 | `1.0.0`. See [docs/MIGRATING.md](docs/MIGRATING.md). |
| 502 | - Release archives ship a bare binary; CodeGraph is fetched on first use. Windows |
| 503 | support for the fetched runtime is unverified — install `codegraph` on PATH if |
| 504 | the auto-fetch doesn't resolve there. |
| 505 | |
| 506 | [1.20.0]: https://github.com/esengine/DeepSeek-Reasonix/releases/tag/desktop-v1.20.0 |
| 507 | [1.0.0]: https://github.com/esengine/DeepSeek-Reasonix/releases/tag/v1.0.0 |
| 508 |