test(llm9p): add tests for per-session compact and usage files - session_compact_test.go (llm): Tests for Session.EstimatedContextTokens, SessionManager.Compact (not found, too short, replaces messages, resets tokens), SessionManager.ContextLimit and EstimatedContextTokens. - session_compact.go (llmfs): Fix Stat().Length for SessionCompactFile (was 0 from BaseFile default; now returns fixed read-msg length). - session_compact_test.go (llmfs): Tests for SessionCompactFile (read, read EOF, write no-op short history, write compacts, stat), for SessionUsageFile (format, EOF, read-only write, stat, dynamic content), and SessionDir.Children/Lookup wiring for compact and usage. 52 tests total, all pass. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
feat(llm9p): per-session compact and usage files for context window management Add automatic context window compaction support to the per-session 9P API: - session.go: Add Session.EstimatedContextTokens() (4 chars/token heuristic over current messages — more accurate than cumulative totalTokens for threshold decisions). Add SessionManager.Compact(ctx, id) which summarises the conversation via AskWithRequest then replaces session.messages with a compact 2-message exchange. Add SessionManager.EstimatedContextTokens(id) and SessionManager.ContextLimit() (200K for all Claude models). - session_compact.go: New /n/llm/N/compact file. Write any content to trigger Compact() for that session. Follows the SessionModelFile pattern. - session_usage.go: New /n/llm/N/usage file. Read returns "estimated_tokens/200000\n". Follows the SessionModelFile pattern. - session_dir.go: Wire compact and usage into Children() and Lookup(). Also land two pre-existing uncommitted fixes: - cli_client.go: Accept result messages with empty Result field - protocol.go: Increase MaxMessageSize 8192→65536 for large system prompts Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>