These are the release notes for gptme version v0.37.0.
Contributors
Thanks to everyone who contributed to this release:
@austinchennn, @ErikBjare, @lkuko, @simpleqt, @TimeToBuildBob
Changelog
Changes since 984b0d3:
π¦ gptme
β¨ Features (30)
- feat(hooks): enforce secret-path reads on the pre-execution deny seam (#4920) (
43e90c914) - feat(hooks): let TOOL_EXECUTE_PRE deny a tool call (#4918) (
15b75c4a7) - feat(hooks): hooks run matches keyworded memories; hooks install is the single documented path (#4911) (
31202a231) - feat: discover local peers and wake conversations for peer messages (#4912) (
5375685ed) - feat(subagent): report cache-aware usage breakdown on subagent results (#4903) (
5e1e6378d) - feat(tui): show child progress and independent unread outcomes (#4893) (
936c6770f) - feat(hooks): warn before externally enforced session deadlines (#4892) (
864c03c11) - feat(tui): show child agents and monitors with work overview screen (#4557) (#4834) (
b96423106) - feat(models): add Gemini 4 Hydrogen (#4881) (
84c33356d) - feat(shell): promoted foreground jobs adopt their capture into the job spool (#4663 step 3) (#4880) (
e08a56792) - feat(tui): auto-name conversations and show the name in statusline and terminal title (#4879) (
1ad8fe94c) - feat(memory): let memory match trigger lessons (--lessons, --lesson-dir) (#4870) (
62cce2de5) - feat(subagent): retained-worktree slice β explicit GC path for isolated agents (#4859) (
8d60c0b3b) - feat(mcp): add SSE transport support for FastMCP SSE servers (#4864) (
8c6cb65c6) - feat(models): refresh MiniMax Flash choices and plugin requests (#4452) (
8a557055b) - feat(hooks): route anomaly watchdog block mode through the policy-block helper (#4828) (
d6dd67eaf) - feat(watch,subagent): owner-scoped work snapshots and explicit watch expiry (#4835) (
3d1838a90) - feat(subagent): cross-restart writer lease via flock on subagent-writer.lock (#4853) (
66219ecfb) - feat(complete): emit structured session-end metadata block (#4830) (
707db06da) - feat(mcp): show which config layer supplied a server in mcp info (#4849) (
e92764fc5) - feat(config): add [shell] spool_quota_mb to ProjectConfig (#4857) (
d91ed80b7) - feat(doctor): probe proxy reachability and OAuth token expiry (#4833) (
007c2db1a) - feat(subagent): report the latest committed checkpoint on subprocess deadline expiry (#4851) (
397c67740) - feat(subagent): add yield operation that checkpoints and ends an attempt as blocked_external (#4844) (
9416527f1) - feat(doctor): detect and repair startup config corruption in gptme-doctor (#4813) (
d75f9743b) - feat: report CLI and TUI agent lifecycle through OSC 7501 (#4771) (
1faa02a23) - feat(complete): policy-block budget β stop nudging at N blocks, end session at 2N (#3960) (
4bd871604) - feat(tauri): write crash-log.jsonl on unexpected sidecar exit (#4821) (
0121ddf68) - feat(memory): opt-in per-session dedup for memory match (--dedup-session) (#4779) (
0e65d18df) - feat(lessons): auto-include keyworded memories alongside lessons (#4780) (
e426a749f)
π Fixes (84)
Click to expand
- fix(tui): render child transcripts as literal text (#4916) (
a22cbe636) - fix(tui): place Work indicator below the prompt input, above the statusline (#4909) (
8273e2fd0) - fix(tui): keep status, unread and agent id visible in narrow Work overview rows (#4921) (
160636c41) - fix(llm): mark Claude Sonnet 4.5 and retired Claude 4 models as deprecated (#4931) (
d25d8fa04) - fix(mcp): report HTTP 401/OAuth challenge instead of transport-cancelled (#4927) (
21d2fceae) - fix(deps): upgrade tornado to 6.6.1 for CVE-2026-126347 (#4924) (
9d2bf906a) - fix(mcp): report TLS verification failure for self-signed HTTPS MCP servers (#4923) (
d03ae2d22) - fix(mcp): bound oversized MCP tool results and spool the full text (#4925) (
52010d300) - fix(subagent): honor context_window=0 in subprocess mode (#4919) (
06c15047e) - fix(subagent): fence stale cancel op before allow_cancelled continuation (#4905) (
7677d6415) - fix(subagent): deliver subprocess progress via file channel, not child-local queue (#4913) (
39483fdc2) - fix(tui): move work-pane shortcut from Ctrl+W to Ctrl+T (#4908) (
267830aaf) - fix(subagent): recover final report across harness completion nudge (#4906) (
6d5039193) - fix(tui): render each Work overview child as one non-wrapping line (#4907) (
5805d6663) - fix(subagent): accept every terminal status when loading a persisted outcome (#4902) (
8e0f99366) - fix(codeblock): make from_markdown round-trip lossless (#4867) (
88c25cb7c) - fix(mcp): close CLI probe clients on success and failure (#4887) (
a8ad8c11e) - fix: hash copied attachment bytes before publishing snapshot (#4885) (
a3fe81fb7) - fix(llm): keep mid-conversation system messages out of Responses instructions (#4883) (
8167ffa67) - fix(deps): require patched Soup Sieve for selector DoS (#4888) (
a4044d171) - fix(version): ignore enclosing repository dirt for installed packages (#4875) (
62c790319) - fix(subagent): retained-workspace release holds the writer lease and never silently discards uncommitted work (#4872) (
51b2d2f88) - fix(lessons): match skill names on word boundaries, not substrings (#4871) (
43f77cf61) - fix(output): bound spool writes, quota, receipts, and byte cursors (#4856) (
8ecd70df0) - fix(models): refresh stale OpenRouter Anthropic model IDs to Claude 5 (#4861) (
9e0f15781) - fix(uri): recognize RFC 2397 data: URIs (#4865) (
29f8a8ad5) - fix(subagent): superseded attempt's monitor must not cache its result for the resumed one (#4858) (
3df9ed93a) - fix(tests): end the mock MiniMax SSE stream with a terminal finish_reason (#4860) (
9b70d947b) - fix(agents-md): a startup-loaded agent workspace is not foreign (#4465) (
f610623d8) - fix(shell): enforce 32 MiB per-job spool quota; reader keeps draining on quota exceeded (#4855) (
36e11aa98) - fix(mcp): honor /mcp load config overrides for unknown servers (#4786) (
66135c639) - fix(shell): redact exact live secret values from tool output in any shape (#4854) (
4195114b7) - fix(shell): redact credentials printed mid-line in tool output (#4799) (
7487c0b0e) - fix(gh): keep failed logs native and bound passthrough responses (#4827) (
4c4e8184b) - fix(codeblock): close non-exec blocks followed only by prose or distant blocks (#4839) (
4683923da) - fix(output): spool direct background jobs before RAM eviction (#4826) (
8dfa1681b) - fix(subagent): refuse continuation of a cancelled attempt unless allow_cancelled=True (#4852) (
01234f6fe) - fix(subagent): tell the parent a timed-out child can be continued (#4841) (
6d50c058d) - fix(plugins): scan third-party entry points before importing them (#4847) (
941a5ada6) - fix: register nvidia in PROVIDER_API_KEYS so NVIDIA_API_KEY is auto-detected (#4774) (
fcaf960a8) - fix(ci): give the Tauri apt install a cache-aware deadline (#4850) (
79b80a6b3) - fix(ci): check model freshness against public OpenRouter catalog (#4837) (
eca020a99) - fix(export): encode complete chat data for HTML script context (#4832) (
747c6ef4b) - fix(subagent): report wall-clock deadline expiry as timeout, not failure (#4836) (
e0ef7b904) - fix(subagent): persist terminal attempt outcomes across parent restart (#4843) (
4f4e3e0e6) - fix(subagent): preserve non-empty non-git isolation workspace (#4838) (
8138f833e) - fix(doctor): warn when an MCP HTTP server rejects the credential (#4829) (
2681583e8) - fix(doctor): state what the config and stdio-MCP rows actually checked (#4831) (
6f6da87f8) - fix(tests): isolate CC fallback in memory tool tests (#4825) (
a1b8a218b) - fix(config): inherit user mcp toggles in partial project layers (#4776) (
9b06053e9) - fix(memory): match legacy index pointers whose titles contain links (#4781) (
f9884feb1) - fix(chat): bounded non-interactive drain for running subagents (#4777) (
f5b285ea2) - fix(output): harden tool-output writer (private, no-clobber, symlink-safe) (#4782) (
87161aea2) - fix(gh): pass through to the gh CLI when a native read command has unsupported flags (#4783) (
2f03c8db6) - fix(gh): keep the failure block when a CI log exceeds the token budget (#4788) (
09885f4c0) - fix(convert): bound DOCX conversion by expanded body size (#4773) (
7c3e1a57d) - fix(auth): validate malformed cached gptme.ai token instead of crashing (#4808) (
1fada9ef3) - fix(codeblock): non-exec-lang block followed by later block now yields all blocks (#4820) (
783608d5f) - fix(config): normalize provider arrays before appending tables (#4807) (
e931a7f8b) - fix(mcp): redact URL credentials in conversational list/info (#4810) (
d3b174a1d) - fix(context): skip malformed rows in the context-savings summary (#4823) (
9376c8524) - fix(parser): reject non-ASCII digits and bound overflow in int() parse paths (#4800) (
71a062c5e) - fix(mcp): report the real cause when an HTTP connect fails (#4805) (
e14aab5b8) - fix(config): auto-repair providers = [...] inline-table corruption at load (#4809) (
ea7f9bd98) - fix(memory): expose explicit layered write scopes (#4769) (
24edffda8) - fix(complete): tell the model when a reply's fences all failed to parse (#4818) (
f44fa0aef) - fix(read): isolate path-resolution errors so later batch paths still read (#4790) (
4b232b76b) - fix(auth): print device-flow complete URI on first-run gptme.ai connect (#4785) (
986eb987b) - fix(auth): publish private cloud tokens without truncating existing login (#4791) (
a8419fcd9) - fix(reduce): fail locally when only a compaction view is a usable input (#4772) (
9d9bd297e) - fix(mcp): preserve explicit server environment without mutating config (#4794) (
c7e5c4948) - fix(todo): keep literal boundary quotes in add/update text (#4792) (
538566174) - fix(commands): reject non-ASCII digit counts in /undo (#4801) (
7bb097829) - fix(llm): close reasoning block before content/tool calls in mixed transition deltas (#4804) (
96515db92) - fix: preserve user input after oversized tool output pruning (#4753) (
7a656435f) - fix(commands): consume slash-only input instead of crashing on unpacking (#4743) (
0b5e0a8c3) - fix: publish attachment snapshots after successful copies (#4661) (
7d27e3b16) - fix(cli): wake idle parent on subagent completion (#4761) (
8532295f6) - fix(hooks): preserve unrelated commands in mixed entries (#4767) (
690cab924) - fix(setup): persist provider updates over local overrides (#4764) (
123cb9f5a) - fix(shell): treat special tokens in output as plain text when truncating (#4730) (
4eee00458) - fix: label /context retained log separately from provider input (#4759) (
fba43ec70) - fix(anthropic): defer notices until tool results are emitted (#4765) (
60bdbf665) - fix(release): pin CI and publication to selected source ref (#4760) (
3950aebc8)
π¨ Misc (12)
Click to expand
- chore: bump version to 0.37.0 (
v0.37.0) - test: reset message output format around each test (#4914) (
97350257d) - test(time-awareness): isolate tests from host session-deadline env (#4894) (
49e276589) - perf(lessons): cut Claude Code lesson hook latency ~4x (0.52s β 0.14s) (#4877) (
5afa4d773) - test(tui): verify work inspection ownership and bounded expiry wakes (#4891) (
2b21a1c2d) - docs(explain): list current /compact modes (summarize|trim) (#4842) (
acdb964d2) - test: isolate GPTME_LOGS_HOME per test (stop subagent-test-* leaking into live logs dir) (#4846) (
85c70ee4f) - perf(subagent): filter logdirs by name before stat in id lookup (#4845) (
3767da026) - test(config): pin inline-array and empty-array provider roundtrip contract (#4812) (
649ac0f5f) - test(config): add provider config writeβload roundtrip tests (#4811) (
e555ceb2c) - docs(memory): reconcile lessons vs keyworded memories; keyword hygiene; hook dedup caveat (#4778) (
bfb95863e) - docs(providers): correct stale PyPI caveat in airgapped tokenizer note (#4787) (
cf5a8e4fb)
(excluded 3 less relevant commits)
Full Changelog: 984b0d3...v0.37.0