Repository navigation
v1.3.84
v1.3.84
New Features
LAN Chat — Role-Based Identity
Each LAN Chat participant now has a role alongside their nickname, making it easy for agents to identify who does what on the network.
Setting your identity:
/nick alice@frontend → nick: alice_frontend, role: frontend, agent: alice_frontend_agent
/nick bob@devops → nick: bob_devops, role: devops, agent: bob_devops_agent
/nick charlie → nick: charlie_developer, role: developer (default), agent: charlie_developer_agent
The nick_role composition minimizes name collisions across teams. On conflict, the resolver appends a number: alice_frontend2, alice_frontend3, etc.
Agent-visible role discovery:
- The
lanchattoollistaction now returnsrolefor each participant - Tool description explicitly mentions roles for task routing
- Presence exchange and nick-change broadcasts carry role information
Persistence:
- Nick and role are stored per-session:
~/.ggcode/lanchat/sessions/<sid>/lanchat-nickandlanchat-role - Global nick file (
~/.ggcode/lanchat/lanchat-nick) is no longer read or written — each session is fully independent
IM Adapter — Atomic Exclusive Binding
When multiple ggcode instances in different workspaces bind the same IM adapter (e.g., same Telegram bot token), the binding operation is now atomic. The new BindExclusive method collapses the previous 3-step read-delete-write sequence into a single locked operation, eliminating cross-process TOCTOU races.
Bug Fixes
- mcp: Handle
resourcefield in OAuth protected resource metadata as either string or array (RFC 9728 compliance) - ios: Auto-cleanup stale review submission items to prevent "concurrency limit reached" errors
- ios: Ensure
usesIdfais set on App Store version submission (fixes "not in valid state" rejection) - ios: Reuse
READY_FOR_REVIEWreview submissions instead of creating new ones (avoids concurrency limit)
Internal Changes
- Removed global nick concept from LAN Chat — all nick persistence is per-session only
globalNickDir()helper removedSetNick()replaced bySetNickRole(nick, role)BindingStoreinterface gainsBindExclusive(binding)methodBindAdapterToWorkspacenow callsBindExclusivein a single step