mirror of
https://github.com/cexll/myclaude.git
synced 2026-02-05 02:30:26 +08:00
* fix(gemini): filter noisy stderr output from gemini backend - Add filteringWriter to filter [STARTUP], Warning, Session cleanup etc. - Apply filter only for gemini backend stderr output - Add unit tests for filtering logic * fix: use defer for stderrFilter.Flush to cover all return paths Address review feedback: ensure filter is flushed on failure paths
67 lines
1.3 KiB
Go
67 lines
1.3 KiB
Go
package main
|
|
|
|
import (
|
|
"bytes"
|
|
"io"
|
|
"strings"
|
|
)
|
|
|
|
// geminiNoisePatterns contains stderr patterns to filter for gemini backend
|
|
var geminiNoisePatterns = []string{
|
|
"[STARTUP]",
|
|
"Session cleanup disabled",
|
|
"Warning:",
|
|
"(node:",
|
|
"(Use `node --trace-warnings",
|
|
"Loaded cached credentials",
|
|
"Loading extension:",
|
|
"YOLO mode is enabled",
|
|
}
|
|
|
|
// filteringWriter wraps an io.Writer and filters out lines matching patterns
|
|
type filteringWriter struct {
|
|
w io.Writer
|
|
patterns []string
|
|
buf bytes.Buffer
|
|
}
|
|
|
|
func newFilteringWriter(w io.Writer, patterns []string) *filteringWriter {
|
|
return &filteringWriter{w: w, patterns: patterns}
|
|
}
|
|
|
|
func (f *filteringWriter) Write(p []byte) (n int, err error) {
|
|
f.buf.Write(p)
|
|
for {
|
|
line, err := f.buf.ReadString('\n')
|
|
if err != nil {
|
|
// incomplete line, put it back
|
|
f.buf.WriteString(line)
|
|
break
|
|
}
|
|
if !f.shouldFilter(line) {
|
|
f.w.Write([]byte(line))
|
|
}
|
|
}
|
|
return len(p), nil
|
|
}
|
|
|
|
func (f *filteringWriter) shouldFilter(line string) bool {
|
|
for _, pattern := range f.patterns {
|
|
if strings.Contains(line, pattern) {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
// Flush writes any remaining buffered content
|
|
func (f *filteringWriter) Flush() {
|
|
if f.buf.Len() > 0 {
|
|
remaining := f.buf.String()
|
|
if !f.shouldFilter(remaining) {
|
|
f.w.Write([]byte(remaining))
|
|
}
|
|
f.buf.Reset()
|
|
}
|
|
}
|