Changelog
- 9178199 fix(plan): clear and track approved plan todos (#3142)
- 48a59f1 Fix repeated successful writer loops (#3202)
- a5be387 build(desktop): ship a macOS .dmg for first-time install (#3216)
- 4cc5293 feat(desktop): use wordmark logo in chrome and welcome (#3215)
- d126797 fix(desktop): simplify active topic indicator (#3211)
- b310e76 feat(desktop): add text size setting (#3144)
- 886cab7 fix(desktop): refresh project tree after session changes (#3208)
- 33e64ee feat(desktop): add close-to-tray option (rebase of #3030) (#3209)
- dd53d5d chore: add @esengine as a code owner reviewer
- fea1d66 fix(desktop): let macOS system quit bypass background close (#3203)
- 0c020ba refactor(desktop): remove agent settings tab (#3201)
- c0bda7c feat(config): drive effort capabilities from provider config (#2963) (#3037)
- d640d4c Merge pull request #3205 from esengine/perf/desktop-batch
- 263520b build(desktop): add terser dependency for the production minifier
- 769f3f5 perf(desktop): use useDeferredValue for Transcript items
- f059d71 perf(desktop): use useDeferredValue in Markdown to avoid blocking on long renders
- 28f10a9 perf(desktop): debounce SlashArgs IPC by 120ms
- 8a22932 perf(desktop): 200-entry LRU cache for highlight.js output
- b3ef5c7 perf(desktop): add Vite code splitting and terser minification for smaller bundles
- 18bc93e Merge pull request #3204 from esengine/release/fixes-batch
- d897768 fix(cli): put git identity on a dedicated TUI status row
- c7ebd1c fix(shell): merge login shell PATH for the bash tool
- e73cc73 fix(cli): require a config source before prompting for missing keys
- ac48cc7 fix(control): auto-answer ask prompts in YOLO mode (#3194)
- 420e8a8 Merge pull request #3199 from esengine/feat/3189-auto-plan
- 303da75 test(config): guard auto_plan default stays off
- a4db571 feat: add global auto-plan settings
- ede7251 Merge pull request #3198 from esengine/fix/3188-legacy-sessions
- 5c4d5ef fix(desktop): make legacy-session migration concurrency-safe and scope-aware
- 0a2e13b fix(desktop): surface legacy sessions in Global topics
- c952530 Merge pull request #3186 from esengine/feat/parity-roundup
- 3351bd4 fix(desktop): adapt ! shell binding to the per-project tab model
- 3c269a6 feat(tui): message queue navigation with up/down during streaming
- 2633f4c feat: ! prefix for direct shell execution
- 9471379 feat(control): add /rewind slash command for session rollback
- f02390d Merge pull request #3184 from esengine/release/desktop-bugfix-roundup
- 1ffdd6c fix(desktop): keep completed todo panel visible
- ae8e9c2 fix(desktop): guard null levels and text/reasoning/args in .length calls
- 5485e27 fix(e2ebench): use digit-only cut when parsing the hunk-header new-side start line (#3090)
- 80ce384 fix(desktop): remember the install path across Windows updates (#3060)
- bd49c39 fix(desktop): keep provider API keys global so they survive a project switch (#3174)
- 938ea40 fix(config): migrate legacy API key into the global credentials store, not ~/.env (#3172)
- dd99968 fix(desktop): only show the native menu bar on macOS (#3170)
- b87a878 feat(desktop): project topic tabs and context inspector (#2925)
- 55915d9 docs(migrating): explain latest/next dist-tags and v0.x auto-import (#3168)
- d5df0e5 fix(provider): replay an SSE stream cut before any token (#3161)
- 8e65d02 fix(desktop): link Linux release against WebKitGTK 4.1 (#3155)
- c5f8016 chore: add CODEOWNERS scaffolding for core-path review (#3130)
- 174d344 fix(tui): ESC no longer exits YOLO; Ctrl+C copies selection to clipboard (#3051)
- 9b71197 fix(cli): persist /theme selection to user config so it survives restart (#3043)
- 76c7fd7 fix(serve): keep SSE /events warm with periodic ping so proxies don't drop the idle stream (#3064)
- e6a05ed netclient: remove Client.Timeout from NewHTTPClient, move to context (#3027)
- b7ba277 perf(providers): pool request body buffers to reduce GC pressure (#2958)
- 405ffa9 chore(e2ebench): trim narrative comments to the repo policy (#3097)
- c99605a fix(e2ebench): surface JSON marshal + write errors instead of silently dropping them (#3092)
- 649b1b5 fix(e2ebench): distinguish "suite dir missing" from "suite dir empty" in the error message (#3089)
- c4ff4cb fix(e2ebench): skip symlinks in copyDir so the seed's fixture links don't leak out-of-tree (#3087)
- 163bbe0 fix(e2ebench): track parseCoverProfile skip rate so a broken format is visible (#3086)
- 4f07b28 fix(e2ebench): skip nil-named funcs in changedFuncs to avoid a nil-deref on func literals (#3084)
- b521e4d fix(e2ebench): preserve source file mode in copyFile (#3082)
- c692a1e fix(e2ebench): print the bench name and a usage example on -h/-help (#3080)
- dea6bce fix(e2ebench): truncate on a UTF-8 rune boundary in truncateFor (#3077)
- 2fac27c fix(e2ebench): add a grading-loop context to bound the test/build wall clock (#3076)
- 2e42c19 fix(e2ebench): strip the full module prefix in repoRelFromModulePath, not just the first segment (#3075)
- 2e15724 fix(e2ebench): parse quoted args in --test-cmd so -run "TestFoo" reaches go test (#3072)
- 3438a74 fix(e2ebench): parse method-form test names in parseNewTests (#3071)
- 1b89b65 fix(e2ebench): cap differential test wait + always restore source on panic (#3069)
- 012b519 fix(e2ebench): cap mutation test wait + always restore source on panic (#3068)
- 223c191 fix(e2ebench): cap runTests / goBuildAll wait so a hung child can't pin diff mode (#3067)
- 1b36f57 fix(e2ebench): cap post-cancel wait with WaitDelay so a wedged child can't wedge the bench (#3062)
- 0081d81 feat(agent): structured, economical compaction with soft/force ratios (#3073)
- c11bb5c feat(agent): cache prefix diagnostics for prompt-cache churn (#3057)
- a182c3c ci(e2e-bot): drive the PR head + exercise compaction (#3050)
- 3fecc32 fix(desktop): prevent workspace git console flashes on Windows (#2935)
- bfd7cde perf(serve): add ETag caching to /history and /context (#2957)
- c722007 site: resolve the v1.x version from the release manifest, not a literal (#3017)