fix(llmfs): clean up sessions on disconnect to prevent memory leak Each spawned subagent creates an LLM session via /n/llm/new, but sessions were never automatically freed: BaseFile.Close() was a no-op, and connection drop handling only removed the client from the map without touching sessions. Repeated spawn calls caused sessions to accumulate indefinitely, consuming memory for full conversation histories. Changes: - Add refs int32 (atomic) to Session struct - Add IncRef(id) / DecRef(id) to SessionManager; DecRef calls Close when refs reach zero, freeing the session and all its conversation history - Add sessionRefFile / sessionRefDir wrappers (session_ref.go) that call IncRef on Open and DecRef on Close (once.Do guards against double-decrement) - SessionsDir.Lookup wraps the returned SessionDir in sessionRefDir, so child file lookups via sessionRefDir.Lookup also yield sessionRefFile objects - Fix handleConn disconnect path to call file.Close() on all unclosed fids before removing the client, ensuring sessions are freed on network drop Typical flow: subagent exits → NEWFD closes all FDs → 9P connection drops → handleConn deferred cleanup calls Close on remaining fids → sessionRefFile.Close → sm.DecRef → refs=0 → sm.Close(id) → session deleted from map. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>