Releases: topcheer/ggcode
v1.3.69
ggcode v1.3.69
Highlights
- Safer Python installer downloads: Restores Python's default TLS certificate and hostname verification for release downloads.
- Release package alignment: Bumps npm, PyPI, and mobile wrapper versions for the v1.3.69 release.
Fixes and improvements
- Restored verified HTTPS behavior in the Python release installer by removing the custom insecure SSL context from download requests.
- Added Python tests to ensure installer download calls use the default secure urllib behavior.
- Bumped npm, Python, and mobile version metadata for the release.
Upgrade notes
- Python wrapper installs now rely on the system/Python CA trust store. Environments using TLS interception or custom certificate authorities must configure their trust store correctly.
- No configuration migration is required.
Compare
- Full diff: v1.3.68...v1.3.69
v1.3.68
ggcode v1.3.68
Highlights
- Safer tool orchestration guidance: Clarifies one-shot sub-agent behavior, tracked swarm tasks, teammate result collection, and when to use
send_messageversusswarm_task_create. - Persistent cron jobs: Recurring cron jobs are now persisted per workspace and restored on startup, while one-shot reminders remain in-memory only.
- Desktop model and provider polish: Improves Wails desktop provider/model selection, reasoning-effort controls, status handling, layout behavior, and toast notifications.
- Safer configuration tooling: Strengthens
configtool guidance around provider-affecting changes and avoids echoing secrets in tool results.
Fixes and improvements
- Added workspace-bound cron persistence and clarified cron tool persistence semantics.
- Hardened command-job polling, command output handling, grep/search behavior, web fetch/search descriptions, git tool descriptions, worktree guidance, and plan-mode tool messaging.
- Improved swarm/sub-agent/tool descriptions and tests so agents avoid duplicate task claiming, repeated completion, and unreliable sub-agent follow-up messages.
- Added safer
configtool wording for vendor/endpoint/model/API key changes, including probe-before-commit behavior and secret redaction in tool output. - Updated desktop Wails settings/provider flows, session/status reset behavior, sidebar/top drag bar UI behavior, and generated Wails bindings.
- Added Review 55 documentation summarizing current application review findings and priority follow-up areas.
- Expanded tests across provider, config, cron, command jobs, grep, web tools, task tools, swarm/team tools, TUI paste/layout flows, and desktop-adjacent behavior.
Upgrade notes
- Only recurring cron jobs are persisted across restarts. One-shot reminders created with
recurring=falseare still in-memory and will be lost if the process exits before they fire. - If changing provider configuration through the
configtool, inspect current settings and available models first; failed provider probes leave the current working configuration unchanged.
Compare
- Full diff: v1.3.67...v1.3.68
v1.3.67
ggcode v1.3.67
Highlights
-
Fix IM/mobile ask_user answers always returning
answered_count: 0: When anask_userquestion was answered via IM or mobile tunnel,saveActiveQuestionInput()was overwriting the remote freeform answer with the empty TUI text input value, causing all remote answers to be lost. -
Fix AllowFreeform single/multi questions accepting freeform-only as answered: Questions with
AllowFreeform=truethat received only a freeform answer (no choice selected) were incorrectly marked asPartialinstead ofAnswered.
Bug Fixes
internal/tui/ask_user.go:saveActiveQuestionInput()now only overwritesanswers[i].freeformwhen the TUI input field has a non-empty value, preserving remote (IM/tunnel) answers.internal/im/ask_user_parse.go:BuildAskUserAnswernow returnsAnswered(notPartial) whenAllowFreeform=trueand a freeform value is provided without any selection.
v1.3.66
v1.3.66
New Features
Desktop: turn metrics digest (shared with TUI)
Desktop now emits a one-line turn summary (TTFT, duration, think time, tool
count, slowest tool) as a system message after each agent turn — matching the
TUI behavior exactly.
- Core formatting logic moved to
internal/metrics/digest.go— shared by
both TUI and Desktop viametrics.FormatTurnDigest(). - Digests are persisted to session history and survive page reload / session
restore viapendingDigests+SaveAgentSessionSnapshotWithExtra(). - Metric events are stored in
session.Metricsso TUI sidebar statistics
are available when opening a desktop-created session. metricCollector.Flush()is called before digest generation to ensure
complete data on short turns.- All shared state access is mutex-protected to prevent data races between
the collector goroutine and the main goroutine.
Bug Fixes
Mobile: workspace URL lost on first scan
activateWorkspaceUrl was changed to defer workspace record creation until
registerLiveSession receives session_info, but the relay URL was not passed
between these two steps. New workspaces were created with an empty URL.
Mobile: session list now shows workspace project name
Added workspacePath field to CachedSessionRecord (persisted in SQLite).
Session list items now display the project directory name (e.g. "my-app")
extracted from the desktop workspace path.
Tests
- Added
TestFormatDurationandTestFormatTurnDigestcovering English,
Chinese, unknown language fallback, missing slowest tool, and no-failure
cases.
v1.3.65
v1.3.65
Bug Fixes
Tunnel: session_info lost when relay history is complete
When the relay already had a complete event history for a session, the host
would skip sending any events during the client reconnect handshake. However,
relay replay ciphertext uses the old encryption key from the previous session,
which the new client cannot decrypt. This caused session_info (including
workspace path, model name, and provider) to never reach the mobile client.
The trusted replay path now re-sends session_info and active_session using
the current encryption key before marking replay as done.
Mobile: workspace URL lost on first scan
activateWorkspaceUrl was changed to defer workspace record creation until
registerLiveSession receives session_info, but the relay URL was not passed
between these two steps. New workspaces were created with an empty URL, making
urlForWorkspace return null and preventing connectWorkspace from connecting.
A _pendingWorkspaceUrl field now bridges the URL from scan time to workspace
creation time.
Mobile: session list now shows workspace project name
Added workspacePath field to CachedSessionRecord (persisted in SQLite).
Session list items now display the project directory name (e.g. "my-app")
extracted from the desktop workspace path, instead of just provider/model info.
Docs
- Replaced all TestFlight beta links with the App Store link:
https://apps.apple.com/app/ggcode-mobile/id6770855612
v1.3.64
v1.3.64
Bug Fixes
Desktop: message routing across surfaces (desktop/mobile/IM)
Fixed message display and routing issues in the Wails desktop app when multiple chat surfaces (desktop, mobile, IM) are active simultaneously.
- Desktop no longer echoes its own messages as "IM user messages" — desktop-originated messages skip the
user_messageevent since the frontend already adds them viahandleSend. - IM inbound messages now appear on desktop — messages from IM adapters (QQ/Telegram/Discord/Slack/DingTalk/Feishu) are correctly forwarded to the desktop frontend with
source: "im". - Mobile inbound messages labeled correctly — messages received from mobile via tunnel show as
source: "mobile"instead of incorrectly labeled as "im". - User messages echo to IM channels cross-surface — when a user sends a message from desktop or mobile, the message text is echoed to all bound IM adapters (
EmitUserText). IM-originated messages are echoed to all other IM adapters excluding the source adapter (EmitUserTextExcept) to prevent self-echo. - Tunnel push condition corrected — only desktop-originated messages push outbound through the tunnel to mobile; IM and mobile messages are inbound channels and should not re-enter the tunnel.
Internal changes:
- Replaced
skipMobilePush boolwith explicitsource string("desktop","mobile","im") insendMessageDatafor clearer routing semantics. - Added
ChatBridge.SendNonUIMessage(userMsg, source, excludeAdapter)for non-desktop-originated messages. - Updated
InteractiveTextBridge.Submitsignature to carryadapterNamethrough for proper echo exclusion.
v1.3.63
v1.3.63
Homebrew formula/cask fixes.
Fixes
Homebrew
- Fix cask
appname:GGCode Desktop.app→GGCode-Desktop.app(match DMG contents) - Fix
ggcode-desktopformula failing to load on macOS: add macOS platform URLs (darwin amd64/arm64 bare binaries) - macOS desktop build now also outputs bare binaries for Homebrew formula consumption
Install Methods
brew install ggcode # CLI binary (formula)
brew install ggcode-desktop # Linux desktop (formula) / macOS .app (cask)
brew install ggcode-desktop --cask # macOS .app (cask)Upgrade Notes
No special upgrade steps required.
Compare
v1.3.62
v1.3.62
TUI multi-agent stream message throttling.
Fixes
TUI Multi-Agent Message Throttling
- Sub-agent stream text/reasoning now batched at 80ms intervals (~12.5Hz) instead of per-token messages
- Swarm teammate stream text/reasoning similarly batched at 80ms
- With 3 sub-agents + 4 teammates concurrent, message rate reduced from ~1400/s to ~90/s
- Eliminates TUI lag during multi-agent concurrency
Other
- Remove
safego.Gowrapper fromsendProgramMsgs(program.Sendis inherently thread-safe; goroutine only added scheduling overhead)
Upgrade Notes
No special upgrade steps required.
Compare
v1.3.61
v1.3.61
Wails desktop overhaul: event-driven rendering, IM management fixes, Debug Console, and TUI tool result display fix.
Highlights
Wails Desktop Event-Driven Rendering
- Replaced 250ms full-poll
GetSessionHistorywith event-driven incremental rendering - ChatView state preserved across page switches (display:none instead of unmount)
- IM/Mobile user messages pushed to frontend (
user_messageevent with source badge) - Non-UI user messages show "via IM" / "via Mobile" badge
IM Management API Fixes
- All IM operations (enable/disable/mute/unmute/save/delete/bind/unbind) now call runtime start/stop
- Mute/Unmute is runtime state, read from
Manager.IsMuted()instead of persisted store - Session bound before starting adapter, fixing
HandlePairingInboundreturningErrNoSessionBound - Desktop Discord/QQ/Telegram adapter pairing and message flow fully functional
Debug Console
- New runtime log viewer, no
GGCODE_DEBUGenv var needed - LogStream independent from file logging, supports category filtering and search
- IM/Relay/Tunnel/Broker categories have distinct color coding
Fixes and Improvements
Desktop (Wails)
- Fix ChatView content disappearing on page switch
- Fix ChatView unable to scroll (flex container height constraint)
- Fix streaming tool call showing static dot instead of spinner
- Fix
run_donenot closing tool call streaming - Fix reasoning message rendering
- Fix sub-agent/swarm queue panel rendering
- Add model selector dropdown
- Add file browser (syntax highlighting, Markdown, image preview)
- Add Share dialog (QR code)
- Add permission mode selector
- Add MCP/IM live status panel
TUI
- Fix tool result error message line count (missing word-wrap caused content overflow)
Config
- Remove verbose config load/save logs from Debug Console (only errors remain)
Tunnel
- Unified TunnelHost managing all three surfaces (TUI/Daemon/Wails) tunnel event push
- Remove legacy tunnel dead code
Config Tool
- Add provider hot-reload (vendor/endpoint/model/api_key change triggers auto-refresh)
- Add model list and discovery
- Add UI refresh callback
Upgrade Notes
No special upgrade steps required.
Compare
v1.3.60
v1.3.60
CI fixes and IM mutual exclusion logic.
CI Fixes
macOS DMG Build Fix
- Fixed
.appbeing deleted before notarize staple, causing DMG build failure - Cleanup step moved after all DMG operations complete
IM Mutual Exclusion
Desktop Instance Auto-Muting
- Desktop registers itself on startup via
RegisterInstance() - Auto-mutes IM adapters when TUI or other instances detected running
- Unregisters on exit via
Unregister() - Fully consistent with TUI behavior