v0.35.0#
These are the release notes for gptme version v0.35.0.
Contributors#
Thanks to everyone who contributed to this release:
@erikbjare, @harimaruthachalam, @jaideeppyne, @Thibaultjaigu, @TimeToBuildBob, @vanshtaneja23
Changelog#
Changes since v0.34.0:
📦 gptme#
✨ Features (61)#
feat(shell): memory guard kills the agent’s largest command when system memory runs low (#4348) (
6aa340f35)feat(tui): queued prompts steer the running turn at its next step (#4346) (
e4fb3d976)feat(tui,ipython): Ctrl+C stops a running tool in the TUI; ipython cells time out (#4354) (
d8a54a974)feat(tui): show the running tool call, its elapsed time and timeout (#4344) (
804273354)feat(lessons): capture private final-item evidence for precision readouts (#4340) (
ffd45727c)feat(tui): command-driven status line ([tui] statusline) (#4339) (
3160b45f1)feat(context): add max_tokens to ContextSelectorConfig; use it in LLMSelector (#4336) (
c4f1e463d)feat(lessons): record final native context emissions (#4328) (
47673511b)feat(compaction): record ‘chunked’ and ‘native’ methods in compaction.jsonl (#4318) (
7413443fc)feat(compaction): summarize overflowed history in fresh-context chunks (#4309) (
fe24c6c0c)feat(lessons): add optional GPTME_LESSONS_MAX_PER_TURN limit (#4294) (
7835c616f)feat(server): apply model default_tool_format when webui omits tool_format (#4245) (
3e9169958)feat(compaction): capability-gated Anthropic native compaction with signed-block replay (Phase 2) (#4244) (
6fe8ad4e1)feat(lessons): add opt-in shared selector command adapter (#4283) (
6b4338cfc)feat(site): add gptme.org/stats/ page from gptme/stats (#4279) (
381c29320)feat(config): persist –agent-profile and re-apply it on resume (#4040) (
9511db3b7)feat(eval): add constraint-satisfaction eval suite (#4082) (
4a9eb56ad)feat(server): share auto-generated token with local clients via token file (#4061) (
6fdbc7bac)feat(compaction): run checkpoint through normal tool loop (#4223) (
56ae66070)feat(compaction): remind normal tool loop before context budget (#4174) (
021e57777)feat(webui): expose server-owned global MCP settings (#4218) (
945cc4da9)feat(server): structured GET/PUT /api/v2/user/config/mcp for global MCP config (#4095) (
b8c8527c9)feat(util): add
gptme-util soundto play notification sounds from other harnesses (#4205) (70dab56ff)feat(hooks): behavioral anomaly watchdog — scope_escape, write_storm, novel_host (#3953) (
3c8408463)feat(subagent): context_mode=fork, per-call reasoning_effort, usage reporting (#4096) (
101b8a7e4)feat(compaction): Phase 2 — compact_instructions, keep_recent, structured checkpoint (#3812) (#3966) (
e632523b5)feat(watch): refuse sleep-N polling chains in the shell while watch is loaded (#4094) (
b3eacfcab)feat(llm): client-side degeneration guard for OpenRouter streams (#4034) (
9f1697c21)feat(webui): thread sseToken through to ApiClient EventSource ?token= (#4035) (
7f172f7fe)feat(eval): add OpenShellExecutionEnv with kernel-enforced policy isolation (#4027) (
e549e7cf6)feat(llm): attribute OpenRouter serving provider from response body (#4031) (
43b17c69d)feat(llm): record provider-served model in message metadata (#4026) (
852ddc4f8)feat(eval): Phase 0 pruning evaluation script (#3997) (#4021) (
86f3ff7c6)feat(autocompact): shadow/dry-run ledger for Phase-0 evaluation (#4015) (
39a4b894f)feat(site): port the landing prompt scroller to gptme.org (#4018) (
5fca02f3f)feat(plugins): isolate failures and validate plugin contracts (#4010) (
1f093d2cf)feat(watch): arm event sources and get woken when they fire (#3987) (
08347b887)feat(autocompact): relevance-scored pruning of stale tool outputs (Phase 0) (#4013) (
842a2b1ff)feat(compaction): cap long-window context budgets (#3973) (
c41a3802a)feat(doctor): validate plugin tool init() contracts in isolation (#3881) (
3471bf259)feat(identity): read neutral AGENT_SESSION_ID before BOB_SESSION_ID (#3963) (
80ea18e0b)feat(webui): apply configured role colors (#4004) (
a171781af)feat(tauri): LAN access settings panel with QR code — Phase 2 (#3958) (
353898ec3)feat: [agent].color and [user].color for names in the CLI and TUI (#3977) (
7a2cb0e93)feat(restart): switch interface with /restart cli|tui|web (#3990) (
58e81a299)feat(tui): accept prompts on the command line, like the CLI (#3980) (
4e2816b81)feat(tui): –resume [NAME]: pick from a list, or open NAME directly (#3971) (
5a8447560)feat(tui): collapse long pastes into atomic placeholder tokens (#3972) (
77e2a5daf)feat(tools): URL host allowlist for autonomous web access (#3954) (
e14e96743)feat(compaction): Phase 1 — one budget, always-on trigger, no per-call mutation (#3812) (#3895) (
c0a08f821)feat(providers): make api_key_env optional in ProviderPlugin (#3957) (
b41335250)feat(tauri): LAN QR access backend — Phase 1 (#3947) (
9da3f45f4)feat(server): forward temperature and top_p request overrides to provider (#3942) (
00df83152)feat(webui): add provider health dot badge to model picker label (#3917) (
c377ecf71)feat(webui): subscription provider setup (ChatGPT/Grok/OpenRouter PKCE) (#3912) (
fc2951579)feat(models): add GPT-6 Sol and GPT-6 Luna to OpenAI model registry (#3914) (
d22c3f271)feat(subagent): deliver completions to idle server sessions (#3897) (
1a0e76109)feat(shell): promote slow foreground commands (#3898) (
4b15dfc11)feat(compaction): recover once from provider context overflow (#3816) (
0e4ef82bd)feat(doctor): add interactive provider repair (#3891) (
7e382b139)
🐛 Fixes (217)#
Click to expand
fix(compact): keep the last message, default to summarize, no-op trim says so (#4371) (
f1cf26c76)fix(tools): declare undeclared kwargs params; add conformance test (#4366) (
f34595c08)fix(tui): use Markdown widget for prose segments to stop layout jump at finalize (#4364) (
ba1266910)fix(e2e): fix flaky sidebar tests broken by virtualization scroll-to-bottom (#4362) (
b9465faae)fix(tui): show message and tool indicator before tool execution begins (#4347) (
3c06e73c6)fix(tui): compact, readable markdown headers in messages (#4358) (
a539998e1)fix(tui): drop duplicate _generation_thread declaration (#4344 + #4354) (#4361) (
cfab89ad1)fix(tui): handle
<think redacted>tags from Anthropic extended thinking (#4345) (274053684)fix(tui): body mode in _update_hidden_segments when show_thinking=True (#4356) (
bd96a8016)fix(shell): only block pipes that feed an interpreter its program (#4350) (
f0c586178)fix(tui): ignore a statusline result that arrives after the screen is gone (#4357) (
64bf8c817)fix(webui): don’t show model selector skeleton pill on home page (#4349) (
f70bafa8b)fix(webui): move embedded keyboard shortcuts into account menu (#4343) (
d51ee35d3)fix(tui): statusline payload says ‘
<no model set>’ instead of None (#4352) (ddf4d42cd)fix(llm): bound selector input and actual provider requests (#4341) (
b4d3f35e5)fix(tui): stream tool-call blocks as collapsed stubs to prevent layout jumps (#4342) (
785864972)fix(config): accept CSS color names like ‘pink’ for [agent]/[user] color (#4337) (
463aa34f6)fix(tui): render assistant message in place, no preview→final swap (#4334) (
49472c7f2)fix(webui): patch 7 transitive dependabot alerts in package-lock.json (#4333) (
955bb55d1)fix(context): stop attaching bare words that match cwd entries; add TUI path completion (#4329) (
35fff805d)fix(tui): run slash-commands in a worker so slow ones don’t freeze the UI (#4330) (
2ac769218)fix(context): don’t crash on ‘~word’ prose; include_paths never crashes a prompt (#4326) (
1dbdfad6b)fix(context): don’t crash on ‘~word’ prose; include_paths never crashes a prompt (#4326) (
b1de5fe9a)fix(tui): don’t crash on a click that hits a just-removed widget (#4323) (
fb2b9deed)fix(tui): don’t crash when a prompt contains a URL (#4320) (
cb36d2081)fix(docs): fix garbled provider integration table and lint grid table alignment (#4312) (
9162d6ef9)fix(tauri): bump rustls to 0.23.45 and serde_with to 3.21.0 in Cargo.lock (#4308) (
fff2c75a1)fix(release): fail closed on partial API errors in default shell (#4310) (
8bd8a4be1)fix(release): only count push-triggered checks in release preflight (#4305) (
6348d7895)fix(deps): switch Dependabot pip → uv ecosystem for root Python deps (#4295) (
198742898)fix(models): apply OpenRouter pricing.overrides long-context tiers to cost accounting (#4272) (
d694cbc61)fix(mcp): alias qualified tool names for native providers (#4265) (
a8a9feeac)fix(tauri): use platform-correct URL in IPC test helper for tauri 2.12 (#4288) (
b6e4e7278)fix(server): return empty list for /api/v2/external-sessions when provider unconfigured (#4281) (
2062db709)fix(context): fall back to rule-based pre-filter when LLM refinement reply is malformed (#4291) (
ca5da494d)fix(mcp): drop the closed client from the registry before reconnecting in _restart_mcp_client (#4292) (
411276ae6)fix(context): fall back when selector replies are malformed (#4282) (
375c863af)fix(slop): print suppression notice to stderr when –no-fail overrides a FAIL verdict (#4280) (
810112bfa)fix(llm): replay Gemini thought signatures on native tool calls (#4276) (
5dbbacc68)fix(docs): exclude gptme-contrib from linkcheck to prevent recurring 429s (#4275) (
28b9518c5)fix(shell): use incremental UTF-8 decoder in BackgroundJob (#4269) (
3c18c09a8)fix(models): remove retired Qwen3 Max OpenRouter entry (#4268) (
5b0e5fb9d)fix(gh): preserve explicit repository in native run log retrieval (#4271) (
b648113b8)fix(eventlog): recover correctly after a damaged compacted tail (#4249) (
0ddbb90f5)fix(docs): skip crawler-throttled GitHub topic links (#4248) (
b1af28ed8)fix(server): honor TOOL_FORMAT and parse native tool calls in steps (#4243) (
1464b2586)fix(server): reject an exhausted stream with no output instead of persisting an empty assistant turn (#4239) (
15210e96b)fix(compaction): reland #4224-#4226 that merged into a stacked branch (#4236) (
b5dfecf85)fix(test): use column check instead of substring check in test_shell_session_records_its_pgid (#4241) (
f7d38b582)fix(logmanager): handle same-process Windows conversation locks (#3848) (
2714e3345)fix(llm): retry plain APIError from in-stream error events (#4074) (
bd4a8b4d4)fix(subagent): cap thread-mode subagent LLM request timeout by remaining deadline (#4208) (
080097767)fix(openai-responses): drop orphaned tool results with no preceding call (#4207) (
05e4508dc)fix(anthropic): pass an explicit timeout so non-streaming chat() accepts 64k+ max_tokens (#4221) (
6f4e95081)fix(mcp): preserve complete search queries (#4235) (
cad7a5245)fix(llm): reject an exhausted stream with no output instead of persisting an empty assistant turn (#4222) (
d538cbf49)fix(ci): retry apt-get update up to 3 times with timeout (#4231) (
1dffc3aa9)fix(cli): clean errors for non-UTF-8 input files (tokens count, attest verify, capabilities) (#4176) (
35663e34f)fix(compaction): re-compaction carries the previous checkpoint and drops stale intros (#4183) (
3502854c5)fix(cli): keep plugin subcommand args opaque to gptme’s own options (#4220) (
3f5aa436e)fix(mcp): load_mcp_server now registers ToolSpecs and updates cache (#4215) (
f0927eb65)fix(context): skip unreadable files in prompt path inclusion instead of crashing (#4185) (
d2ec08d12)fix(init): report invalid gptme-init targets as clean errors (#4173) (
c4ecb8183)fix(tokens): warn when model has no native tiktoken encoding (#4196) (
a7509a5a0)fix(webui): navigate before clearing store on conversation delete (#4209) (
a0705c188)fix(chats): skip malformed external sessions instead of aborting the search (#4192) (
e790ad183)fix(read): stream line ranges of large files instead of loading them whole (#4191) (
f4f3205dc)fix(context): read only the capped prefix of large files named in a prompt (#4187) (
ada33c3b8)fix(models-info): exit 1 when model resolves to unknown provider (#4210) (
16ada496c)fix(computer): audit-log sees keyword/positional computer() calls via AST (#4203) (
01f7e6b3f)fix(anti-slop): use fractional em-dash excess so short texts aren’t over-penalised (#4195) (
63e651b2a)fix(lessons): coerce non-string frontmatter name to str (#4181) (
16cfbdd82)fix(slop): lower STACCATO_MAX_WORDS 8→7 to fix false positive on technical doc sentences (#4211) (
65c778b6c)fix(init): escape project name when writing gptme.toml (#4175) (
461a603d4)fix(cli): tolerate non-UTF-8 .gitignore and journal files in context commands (#4177) (
6e1600fb3)fix(config): reject non-list prompt.files and other string-list project settings (#4179) (
da489220b)fix(agents): don’t attribute the newest log dir to unnamed gptme processes (#4189) (
59db3b19e)fix(chats): reject blank and normalize multi-line names in chats rename (#4198) (
3858b248e)fix(save): refuse non-regular-file targets instead of hanging on a FIFO (#4190) (
472e98a4d)fix(llm): use NOT_GIVEN timeout in Anthropic non-streaming chat() (#4064) (
4885cb0be)fix(logmanager): skip corrupt conversation lines instead of failing the whole read (#4182) (
14b9387b5)fix(message): don’t append ellipsis to short oneline messages (#4197) (
7454b0f29)fix(hooks): reject malformed Claude Code settings.json instead of crashing (#4178) (
fa1842a4f)fix(ci): disable provenance attestation on Docker push to fix GHCR unknown blob (#4202) (
a6ce80cdb)fix(openai-responses): clamp instructions to 1MB char cap for Responses API (#4206) (
4f2303ce8)fix(openai-subscription): clamp Codex instructions to 1MB char cap (#4166) (
db903ba37)fix(cli): reject unknown –provider in models list instead of listing nothing (#4184) (
d56550f12)fix(preview): send Cache-Control private, no-store on preview responses (#4180) (
c5c520913)fix(llm): accept mixed-case image attachment extensions (#4171) (
536e6c379)fix(telemetry): use Fable 5.1 cached-input pricing (#4126) (
7bf274124)fix(compaction): reject empty summarize checkpoints instead of replacing history (#4172) (
ce5ed9f22)fix(responses): surface explicit SSE generation failures (#4170) (
a990d028e)fix(anthropic): register Claude 5 models and use supported thinking modes (#4125) (
0939c341d)fix(compaction): share bounded overflow recovery across CLI and server (#4123) (
4dab17fb8)fix(cli): warn on stderr when prompts expand path not found (#3943) (
127dc5c91)fix(webui): keep welcome view reachable on short/mobile viewports (#4056) (
36ada30f8)fix(llm): raise on Responses API error/response.failed events, warn on incomplete (#4084) (
c507599ae)fix(server): evict idle client-less sessions unconditionally (#4067) (
968f8b381)fix(models): concise provider errors and parallel fetch in models list (#4062) (
b7eb9f51c)fix(browser): configure executable independently of engine (#4168) (
546e88ab0)fix(subagent): kill the child’s persistent shells when escalating to SIGKILL (#4097) (
801f20062)fix(webui): gate sidebar external-sessions query on server capability (#4148) (
fec0bec44)fix(webui): anchor toasts at the top so they never cover the composer (#4149) (
4ea9068d0)fix(telemetry): account for explicit OpenRouter cache-read prices (#4151) (
2992c9a6f)fix(hooks): make deprecated knowledge injection opt in (#4160) (
f25cb5bf6)fix(vent): preserve launcher session and runtime provenance (#4156) (
944554e39)fix(memory): report the written entry in scoped save JSON (#4155) (
ce208c9f6)fix(subagent): select native child tool format from model metadata (#4154) (
be054fc58)fix(webui): don’t skip cloud sign-in when a local server is already connected (#4153) (
a7702f96f)fix(mcp): load workspace config in diagnostic CLI commands (#4050) (
3615e94d9)fix(startup): defer prompt UI imports until interactive input (#4131) (
f26d7dbe5)fix(webui): show the sent model in the pill while chatConfig loads (#4150) (
ee32da7ec)fix(tools): preserve CRLF line endings in patch and morph (#4081) (
a015ee4c4)fix(webui): redirect after deleting active conversation (#4140) (
649170b0a)fix(eval): stop leaking multiprocessing_logging wrappers onto the root logger (#4132) (
16b93eaf7)fix(context): handle deleted CWD in file_to_display_path (#4142) (
75cc006b6)fix(cli): make skills show prefer exact matches and reject ambiguous ones (#4058) (
4bad9ea0c)fix(changelog): link commits by full SHA; fix 404 links in release notes (#4113) (
eeebc82e2)fix(python): cap unbounded stdout and result output (#4078) (
b89b0f84e)fix(responses): pair orphaned function calls with missing-result errors (#4139) (
02f025ec6)fix(webui): sync rotated Tauri sidecar token on non-default ports (#4065) (
c81db98a1)fix(webui): correct local TTS setup instructions and port (#4124) (
a48546e64)fix(server): honor –tools allowlist for new conversations (#4049) (
ab0fe88be)fix(server): tool/confirm 404 names the tool and the conversation correctly (#4135) (
da71531d9)fix(llm): back off and retry 429/5xx on openai-subscription requests (#4085) (
f0dbbffe3)fix(server): trim session events with clients connected; lock append/trim/read (#4087) (
2420f9e4f)fix(docs): update dead repo links to current locations (#4043) (
5746ec73e)fix(llm): retry Anthropic connection/timeout errors and 408/409 (#4066) (
c11f08778)fix(webui): refresh stale ‘How do I use the web UI?’ demo answer (#4042) (
39e5ddf33)fix(context): read scout_model from project/user config (#4086) (
3eeadc199)fix(cli): print fatal KeyError messages without repr quotes (#4101) (
cbefb1d4f)fix(grok-subscription): bump client version header to 1.0.13 (#4063) (
f8975b005)fix(server): gate internal error details behind debug setting (#4076) (
a5b6f7768)fix(docs): render –cors-origin example as literal and seed theme mode (#4045) (
4c9ffee55)fix(compaction): trigger from anchored provider input usage (#4036) (
927cba1df)fix(llm): keep tool calls and content in non-stream OpenAI chat() regardless of finish_reason (#4079) (
1bcb49ba2)fix(llm): record streamed OpenAI-compat usage once per response (#4044) (
e03270c45)fix(telemetry): move LLM token counts and cost out of metric labels (#4053) (
c8d2a5cfa)fix(site): hide .sig files on downloads page and list Android APK (#4055) (
5bf572162)fix(cli): gptme-auth login tolerates transient network errors (#4077) (
52c322428)fix(cli): drop non-interactive stderr noise (#4060) (
ec991e34c)fix(llm): serialize tools for all OpenAI-compatible providers (#4047) (
4920de63d)fix(webui): shared nav items and 5-slot mobile bottom nav with More sheet (#4059) (
38786ee30)fix(webui): show sign-in notice instead of a 401 iframe for remote instance previews (#4093) (
4da431fcd)fix(deps): update vulnerable Poetry dependencies and unblock Dependabot (#4068) (
9204dcabe)fix(cli): reject unknown options before prompt text (#4051) (
1ccd90a71)fix(shell): preserve UTF-8 sequences across persistent pipe reads (#4073) (
8857f22d4)fix(todo): replay only assistant messages, ignore system-prompt examples (#4054) (
a64460489)fix(subagent): allow graceful cleanup on subprocess timeout (#4075) (
1a5a0cff5)fix(patch): actionable messages for non-UTF-8 files and multi-hunk failures (#4083) (
d586f8587)fix(hooks): don’t swallow TypeError raised inside generator hooks (#4071) (
f4f1e4954)fix(mcp): stop per-tool allowlist warning spam and demote tool repr log (#4057) (
e2f48222b)fix(mcp): accept tool-format kwargs in MCP adapter execute (#4048) (
a032b0d25)fix(webui): hide e2e stress-test fixture and internal issue ref from users (#4046) (
a947fc4aa)fix(compaction): bound summarize request (#3812) (#4037) (
8b4fd8c48)fix(webui): share winning connection probe with superseded callers (#4041) (
c9c0b6aa6)fix(restart): show the token-bearing URL when the browser fails to open (#4039) (
92483d672)fix(webui): don’t render disconnected UI before the connection has failed (#4028) (
fedde8ff6)fix(commands): run SESSION_END hooks before the CLI /restart re-exec (#4038) (
8e394134f)fix(compaction): Phase 1.5b — hysteresis trim target + post-hoc savings gate (#3812) (#4023) (
1f8d73638)fix(server): strip additional identity headers in preview proxy (#4033) (
7ef228ec9)fix(server): leave a conversation’s directory before deleting it (cwd vanishes → all PUTs 500) (#4029) (
c36a5917c)fix(ci): retry flaky Android NDK download in Tauri workflow (#4022) (
2725ba841)fix(compaction): Phase 1.5a — failure latch, pending-tool guard, reasoning policy, UI-only status (#3812) (#3968) (
37cff5c08)fix(models): switch OpenRouter recommended model to deepseek-v4.1-flash (#4006) (
886ad8a32)fix(doctor): treat placeholder API keys as not-configured, not ERROR (#4014) (
39a54936e)fix(ci): stop TUI tmux e2e from hanging the test job for 6h (#4012) (
574db0929)fix(ci): give PR test runs the same timeout/retries as master (#4008) (
b7512b33c)fix(webui): notify when Tauri window loses focus (#4007) (
a1852c5bf)fix(subagent): stop thread-mode subagents from breaking the parent session’s tool calls (#3989) (
fea7c6706)fix(tui): no freeze/lost focus on pane switch, /restart after cwd moved, compact + highlighted sections (#3976) (
2106abdd1)fix(shell): gate workspace hint on subagent tool, say denied commands ran nothing (#3995) (
9a4a80d8a)fix(subagent): load disabled-by-default tools named by a profile allowlist (#3974) (
471f0f44b)fix(server): bound client-controlled session_id in reconnect log line (#3969) (
92dccaeaa)fix(time-awareness): one timezone-aware clock with full date, real session start and resume gaps (#3992) (
deec3974b)fix(hooks): don’t inject another agent’s identity instructions on cd (#3993) (
4d7354bcd)fix(confirm): show tool-format call arguments in confirmation previews (#3979) (
71f0c4883)fix(cli): print the resume command after a fatal error (#3978) (
0fc35b21a)fix(llm): convert OpenAI stream chunk-parsing crash into a clean, classifiable error (#3984) (
f0890168e)fix(shell): make promoted background job output reachable and respect explicit timeouts (#3996) (
b86177e6e)fix(tools): cap tool descriptions on all provider paths, not just OpenAI (#3964) (
a1675a8ae)fix(openrouter): accept every quantization level OpenRouter supports (#3983) (
2dfc15255)fix(openrouter): accept
maxreasoning effort (#3985) (24345a494)fix(tui): normalize CR/CRLF line breaks in collapsed pastes (#3982) (
923cdfe92)fix(subagent): preserve result past system postamble (#3986) (
d1ae87635)fix(tui): inline-mode UX — hide thinking by default, keep scrollback on resize, show queued prompts and confirm keys (#3970) (
c5c9733c8)fix(server,webui): recover event stream after server restart; keep native notification grant out of browser path (#3967) (
f7bb34871)fix(webui): preserve generation settings for initial step (#3913) (
fbc5825ef)fix(autocompact): only record attempt after successful compaction, not before (#3965) (
2cbc587e0)fix(service): parse last systemd Environment model assignment (#3930) (
50c92b4b0)fix(tauri): regenerate icons from SVG for readable small-size rendering (#3928) (
686ce71df)fix(config): don’t crash on malformed [[mcp.servers]] entry (#3927) (
23f548c24)fix(server): honor per-step max token override (#3905) (
b51622915)fix(tauri): preserve OAuth chars in deep-link auth code injection (#3926) (
6a969f9b8)fix(tauri): retry connect on managed sidecar startup delay (#3934) (
69ac31095)fix(review-pr): don’t let a trailing shutdown log mask the real session error (#3910) (
274b01c5d)fix(tests): update browser-lynx test to use stable gptme.org assertion (#3916) (
29ab7b79f)fix(webui): cancel subscription poll and in-flight request on wizard unmount (#3922) (
5b333f06d)fix(webui): bundle Inter font locally instead of CDN import (#3908) (
8ff2dadcc)fix(server): add timeout to subscription OAuth background threads (#3923) (
43817c81f)fix(config): don’t crash on malformed [[providers]] entry (#3915) (
593da3a33)fix(tauri): rename user-facing product to gptme (#3907) (
be343267b)fix(memory): reject unknown list filters (#3904) (
06e7275b8)fix(doctor): resolve effective model source (#3893) (
186123300)fix(cli): import extras lazily so gptme-server and gptme-dspy start without them (#3901) (
557b9757e)fix(cli): honor gitignore anchoring and negation in context tree (#3899) (
31e6025a9)fix(doctor): surface exhausted OpenRouter quota (#3892) (
9547bfed9)fix(llm): render GptmeAuthError as a plain message, not KeyError’s repr (#3889) (
16c6ca5c7)fix(lessons): deduplicate skills by name, not by file path (#3887) (
5c049d1e9)fix(lessons): skip hidden subdirectories during skill/lesson discovery (#3888) (
062ddecf3)fix(anti-slop): fail short dense-slop text instead of skipping it (#3878) (
759fa30a0)fix(server): bundle gptme.hooks and gptme.context in the PyInstaller sidecar (#3883) (
abd0f3537)fix(server): emit step_complete after generating=False to close queue-flush 409 race (#3874) (
879e13e0d)fix(webui): don’t treat the Tauri webview origin as a bundled gptme-server (#3882) (
183bfd75d)fix(patch_many): accumulate repeated paths instead of silently dropping hunks (#3880) (
f65cb9050)fix(release): always write release notes with a trailing newline (#3876) (
da6832bd8)fix: add missing trailing newline to v0.34.0 release notes (#3875) (
2e50bdf6b)
🔨 Misc (65)#
Click to expand
chore: bump version to 0.35.0 (
v0.35.0)test(tui): update thinking-toggle stream test for per-segment stream rows (#4353) (
87b376108)test(tui): cover mid-stream thinking toggles and delayed finalization flush (#4338) (
3e9b6a455)perf(tui): batch stream renders, anchor the chat scroll, keep one tool status line (#4332) (
37c1250ed)docs(voice): install with uv instead of Poetry (#4327) (
0880593fb)docs(building): install with uv instead of Poetry (#4316) (
9ee310ec1)test(webui): make location mocks jsdom-26-safe and move to jest 30 (#4285) (
f2ffcb246)test(logmanager): cover damaged-tail checkpoint and concurrent appends (#4247) (
1ff896c9e)test(shell): cover invalid UTF-8 and per-stream decoder state in background jobs (#4267) (
c1d42b726)chore(webui): delete unused components and deps, gate with knip (#4290) (
987ad1cf0)refactor(webui): drop unused calendar wrapper + react-day-picker, bump date-fns to 4 (#4286) (
44e1ef05f)docs(providers): add DemonRoute as remote cloud gateway example (#4277) (
6cd42c802)test(eventlog): property test for recovery from arbitrary log damage (#4263) (
214d4c328)test(llm): stub init_llm in degeneration reply() test so it runs in isolation (#4242) (
c4a3a2ca6)test(server): isolate v2 API tests from the real logs dir (#4240) (
9a6e5e42c)docs: add philosophy page (mission, principles, non-goals) (#4232) (
6ef2dd14d)docs(mcp): add ContextVar contract to load/unload_mcp_server + copy_context regression test (#4230) (
33e1952ee)test(e2e): wait for clickability before clicking wizard buttons (#4219) (
eb420fc79)docs(anti-slop): document float types and fix stale rounding comment (#4216) (
77d354820)test(browser): add local blockage conformance suite (#4200) (
36a9bc146)docs(citation): add Zenodo concept DOI and badge (#4147) (
651fec3c3)test(knowledge): protect outside stores across CLI subprocesses (#4159) (
67e1c854b)test(cli): add CLI-level regression for KeyError repr-quote stripping (#4105) (
ca1310b03)docs(computer-use): note that macOS needs no Full Disk Access (#4152) (
41a9986b6)docs(models): recommend GPT-6.1 Sol over GPT-5.6 Sol, describe Astra; add gpt-6.1-sol to registry (#4137) (
192393c87)docs(server): document 11 missing /api routes in OpenAPI spec (#4052) (
ac501883e)docs(tts): correct Kokoro first-run download size (#4133) (
69f0b9e60)docs: make provider host advice policy-first (#4130) (
f15f18ed1)docs: refresh model recommendations, data policy, and gptme-tts setup (#4114) (
ba1149f0b)chore(deps): apply non-breaking npm audit fixes and configure npm/cargo Dependabot (#4090) (
4e5bdfc3a)docs(contributing): fix stale telemetry env vars and metrics path (#4072) (
98f0767a7)perf(startup): keep prompt_toolkit out of gptme.message, requests out of gptme.commands (#4088) (
0d64706d4)docs(tools): add reference pages for memory, patch_many, convert (+ opt-in watch, progress, clarify) (#4091) (
c413a4fdf)docs: surface gptodo and gptmail from gptme-contrib for agent workflows (#4098) (
daa4cf883)docs(config): document missing project config keys (#4080) (
9043660ee)docs(evals): mention OpenShell policy-governed sandboxes (#4025) (
5f6cff254)docs(server): say /preview/{port}/ is the cloud preview backend, not a user URL (#4030) (
10133577d)refactor(reduce): delete dead proactive_summarize_log and its cache (#3812) (#4024) (
3efde6e80)test: isolate the web-tool host allowlist across tests (fix flaky browser failures) (#4019) (
4be9a7883)test: keep the autouse init fixture from scanning the host’s lesson dirs (#4017) (
c581aa5a1)test: keep color-warning tests independent of a leaked root log level (#4003) (
94383696b)test(tui): cover initial prompt queue exit path (#3998) (
2bd15c53b)test(browser): serve read_page_text fixture locally instead of example.com (#3991) (
f2061c44d)test: make two order/load-dependent CI tests hermetic (#3988) (
01292e009)docs(readme): mention Requesty alongside OpenRouter (#3994) (
656b94ac2)test(e2e): Playwright tests for InlineToolConfirmation (tool_pending flow) (#3948) (
978d4f9aa)refactor(shell): remove bashlex fallback after tree-sitter soak (#3944) (
0c31b18fa)test(hooks): unregister server_confirm in test_register to stop TOOL_CONFIRM leak (#3962) (
9e3ab7cf5)perf(shell): batch 7 separate export calls in _init() into one (#3952) (
30e7c8407)docs(plugins): add Plugin Registry section — how to get listed via GitHub topics (#3951) (
1597a632f)chore(meta): add PyPI keywords and classifiers (#3955) (
c251d70be)docs(shell): document allowlist, transparent wrappers, and tree-sitter-bash parser (#3946) (
3b6a9bb13)docs(contributing): add setup smoke test (#3902) (
992731311)refactor(server): stop falling back to the legacy web UI (#3938) (
764b4cc0e)refactor(cli): remove –gear, –multi-tool, –injection-hygiene, –manifest-dir (#3940) (
48af60d28)refactor(tools): remove patch_anchored and view_anchored (#3941) (
7784b6d59)docs: select workspace before gptme-agent install (#3933) (
c41b20cd5)docs: correct inaccurate and stale claims across README and docs (#3936) (
886556f74)refactor(cli): remove architect/editor split mode (#3937) (
ad622602e)test(server): gate cold conversation scan on scaling, not milliseconds (#3900) (
2adc55b81)test(models): make warn-once assertion logger-local (#3896) (
4bd2560ef)test(tauri): real first-run E2E with webui + sidecar (#3886) (
c8560b2e8)test(eval): isolate process-global side effects of in-process act_process calls (#3885) (
f40b6dbf9)test(ci): smoke-test frozen gptme-server startup for missing modules (#3884) (
945517f13)test(shell): make SIGTERM regression independent of inherited SIG_IGN (#3877) (
4246b6814)
(excluded 49 less relevant commits)
Full Changelog: https://github.com/gptme/gptme/compare/v0.34.0…v0.35.0