This Week in gptme (W25 2026)
84 PRs merged across gptme and gptme-contrib this week: subagent clarification, fork-any-message in the webui, append-only session logs, and a tree-of-thoughts eval harness.
Here’s what landed in gptme and gptme-contrib this week (2026-06-15 – 2026-06-21): 32 new features, 41 bug fixes across 84 merged PRs.
Highlights
- gptme#2902 (webui) add ‘Try the offline demo’ CTA to disconnected state
- gptme#2923 (webui) fork conversations from any message
- gptme#2952 (server) add API version constants, contract_revision, and X-API-Version header
- gptme#2954 (server) add /api/v2/version endpoint
- gptme#2899 (tools) as_function_subtoolspecs() — invoke tool functions without IPython
New Features
- gptme#2892 (subagent) configurable max_concurrent cap with semaphore gating
- gptme#2896 (util) add –output-format json to gptme-util llm generate
- gptme#2897 (snapshot) add –dry-run / -n flag to /snapshot prune
- gptme#2898 (computer) add wait_for_change action for context-efficient UI loops
- gptme#2899 (tools) as_function_subtoolspecs() — invoke tool functions without IPython
- gptme#2900 (scripts) add treeofthoughts.py — eval-guided tree search for agents (#495)
- gptme#2901 (webui/tts) add ttsAuthToken setting for cloud-authenticated TTS
- gptme#2902 (webui) add ‘Try the offline demo’ CTA to disconnected state
- gptme#2903 (webui/stt) add sttAuthToken setting for cloud-authenticated STT
- gptme#2904 (computer) add window_focus action for reliable new-window targeting
- gptme#2906 (subagent) clarification mechanism — subagents can pause and ask parent for more info
- gptme#2907 (profiles) add structured-first backend selection to computer-use profile
- gptme#2908 (doctor) add computer use prerequisite checks + run-docker-computer target
- gptme#2919 (ci) run webui e2e tests against both stable and dev gptme
- gptme#2920 (shell) suggest subagent when cd enters workspace with gptme.toml (#554)
- gptme#2921 (subagent) progress tool — intermediate parent notifications during long tasks (#554)
- gptme#2923 (webui) fork conversations from any message
- gptme#2925 (llm) add built-in offline mock provider
- gptme#2932 (cli) add
gptme-util snapshot listsubcommand - gptme#2933 (cli) add gptme-resume subcommand for lossy session rehydration
- gptme#2947 (webui) chat UI polish — role-aligned message footer + Chat-button sidebar toggle
- gptme#2950 (subagent) add redact_secrets option for context isolation
- gptme#2952 (server) add API version constants, contract_revision, and X-API-Version header
- gptme#2954 (server) add /api/v2/version endpoint
- gptme#2956 (logmanager) append-only event log for session durability (Phase 1)
- gptme#2961 (subagent) add subagent_list() tool for observability
- gptme-contrib#1123 (match-lessons) suppress archived lessons + prevent contrib re-injection
- gptme-contrib#1125 (gptmail) add named local mailboxes to agent CLI
- gptme-contrib#1127 (gptmail) add fleet pending recipient view
- gptme-contrib#1130 (subscription) add live token-probe script with refresh-aware stale-slot detection
- gptme-contrib#1133 (gptodo) auto-set waiting_since when transitioning to waiting state
- gptme-contrib#1145 (pm-dispatch) wire PmModelBandit into LaneDispatcher for model routing
Bug Fixes
- gptme#2905 (webui/demo) skip provider health + user settings fetches in demo mode
- gptme#2915 (server) handle OSError in workspace API endpoints (ENAMETOOLONG crash)
- gptme#2917 (webui) tolerate legacy non-paginated conversations response (#2916)
- gptme#2922 (webui) skip hosted loopback probe for first-time users
- gptme#2924 (webui) avoid sidebar log scans
- gptme#2931 (server) accept –tools none to disable all tools
- gptme#2935 (webui) extract ConversationItem to module level
- gptme#2936 (test) use json.dumps for valid JSON in kimi_k2 test
- gptme#2941 (cli) validate model provider early, before context_cmd runs
- gptme#2942 (server) preserve ‘files’ field in PUT /api/v2/conversations/:id messages
- gptme#2943 (server) enforce workspace containment at config PUT/PATCH boundary
- gptme#2945 (webui) code-block rendering improvements + emoji additions + star move
- gptme#2946 (tools) normalize bare callables in ToolSpec.functions (server won’t start with plugins)
- gptme#2951 (cli) make tokens count –file - read from stdin
- gptme#2953 (server) prevent external-sessions endpoint from hanging on large session catalogs
- gptme#2957 (tests) mock thread creation in test_subagent_status_returns_dict
- gptme#2959 (config) tolerate PermissionError in ChatConfig.from_logdir workspace mkdir
- gptme-contrib#1116 (gptmail) add pyyaml to declared dependencies
- gptme-contrib#1117 (gptmail) add reply-once idempotency guard to agent reply
- gptme-contrib#1119 (gptmail) reply-once for pull-based recipients (no duplicate replies)
- gptme-contrib#1121 (gptmail) fix frontmatter split on dashes and add pull-only delivery type
- gptme-contrib#1122 (greptile) lifetime total-trigger ceiling to stop infinite re-trigger spam
- gptme-contrib#1126 (tooloutput-trimmer) run summarizer first (priority 199 → 202)
- gptme-contrib#1129 (gptmail) tighten fleet pending recipient filtering
- gptme-contrib#1134 (gptme-usage) mark Agent SDK credit change as paused
- gptme-contrib#1135 (lessons) restore hook skill routing metadata
- gptme-contrib#1136 (pm-bandit) add fcntl locking to record_outcome to prevent lost updates
- gptme-contrib#1137 (match-lessons) default harness to ‘gptme’ when no env vars set
- gptme-contrib#1138 (match-lessons) skip node_modules and tool dirs during lesson scan
- gptme-contrib#1139 (gptmail) stamp read: true on pull-fetched msgs with no read: key
- gptme-contrib#1140 (gptmail) agent read command now marks message read
- gptme-contrib#1141 (pm) per-check slot key for concurrent master-CI failures
- gptme-contrib#1142 (evolution) mkdir parents before saving history/refinements with slashed lesson IDs
- gptme-contrib#1143 (lessons) remove 8 dead keywords from 4 active lessons
- gptme-contrib#1144 (lessons) remove 20 dead keywords from 5 active lessons
- gptme-contrib#1146 (lessons) remove 9 dead keywords from 9 active lessons
- gptme-contrib#1147 (tests) remove spurious @patch decorator leaking MagicMock/ to workspace root
- gptme-contrib#1148 (lessons) replace dead keywords with more specific trigger phrases
- gptme-contrib#1149 (perplexity) use current sonar model; extract citations
- gptme-contrib#1152 (check-claude-usage) support CC v2.1.183 section-header TUI format
- gptme-contrib#1155 (gptme-runloops) resolve 10 mypy type errors in pm_dispatch
Performance
- gptme#2934 (server) partial cache update on message POST to avoid O(N) rescan
Refactors
- gptme-contrib#1150 (lessons-extras) extract NON_LESSON_FILES constant
Documentation
- gptme#2955 (config) add model selection guide and provider-key reference
Tests
- gptme#2937 (server) perf gate for GET /api/v2/conversations with 100 conversations
- gptme-contrib#1132 (gptme-usage) add coverage for resolve_cc_version and is_post_agent_sdk_credit_change
CI & Infrastructure
- gptme#2909 (deps) bump actions/upload-artifact from 4 to 7
- gptme#2927 (deps) bump the python-minor-patch group with 31 updates
- gptme#2928 (deps-dev) bump pytest-cov from 6.0.0 to 7.1.0
- gptme#2929 (deps) bump flask-cors from 5.0.0 to 6.0.5
- gptme#2930 (deps-dev) bump pylint from 3.3.2 to 4.0.6
Other Changes
- gptme-contrib#1124 [codex] add reusable autonomous session gate
| *84 PRs merged across 2 repos. See the full changelogs: gptme | gptme-contrib* |