From 0ac2d186e84f77d73d924e2c0ce975a17c3a8078 Mon Sep 17 00:00:00 2001 From: Paul Buetow Date: Sun, 28 Sep 2025 00:20:05 +0300 Subject: Improve multi-provider completion streaming and CLI selector flags --- internal/lsp/server.go | 36 ++++++++++++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) (limited to 'internal/lsp/server.go') diff --git a/internal/lsp/server.go b/internal/lsp/server.go index 1fbb0cc..f8b328b 100644 --- a/internal/lsp/server.go +++ b/internal/lsp/server.go @@ -40,8 +40,9 @@ type Server struct { llmRespBytesTotal int64 startTime time.Time // Small LRU cache for recent code completion outputs (keyed by context) - compCache map[string]string - compCacheOrder []string // most-recent at end; cap ~10 + compCache map[string]string + compCacheOrder []string // most-recent at end; cap ~10 + pendingCompletions map[string][]CompletionItem // Outgoing JSON-RPC id counter for server-initiated requests nextID int64 lastLLMCall time.Time @@ -112,6 +113,7 @@ func NewServer(r io.Reader, w io.Writer, logger *log.Logger, opts ServerOptions) s := &Server{in: bufio.NewReader(r), out: w, logger: logger, docs: make(map[string]*document), logContext: opts.LogContext, configStore: opts.ConfigStore} s.startTime = time.Now() s.compCache = make(map[string]string) + s.pendingCompletions = make(map[string][]CompletionItem) s.applyOptions(opts) // Initialize dispatch table s.handlers = map[string]func(Request){ @@ -315,6 +317,36 @@ func (s *Server) currentConfig() appconfig.App { return s.cfg } +func (s *Server) storePendingCompletion(key string, items []CompletionItem) { + if len(items) == 0 { + return + } + cpy := make([]CompletionItem, len(items)) + copy(cpy, items) + s.mu.Lock() + if s.pendingCompletions == nil { + s.pendingCompletions = make(map[string][]CompletionItem) + } + s.pendingCompletions[key] = cpy + s.mu.Unlock() +} + +func (s *Server) takePendingCompletion(key string) []CompletionItem { + s.mu.Lock() + defer s.mu.Unlock() + if len(s.pendingCompletions) == 0 { + return nil + } + items, ok := s.pendingCompletions[key] + if !ok { + return nil + } + delete(s.pendingCompletions, key) + cpy := make([]CompletionItem, len(items)) + copy(cpy, items) + return cpy +} + func (s *Server) maxTokens() int { cfg := s.currentConfig() if cfg.MaxTokens <= 0 { -- cgit v1.2.3