Diagnostic files copying (#7209)

Co-authored-by: Douwe Osinga <douwe@squareup.com>
This commit is contained in:
Douwe Osinga 2026-02-13 14:50:42 +01:00 committed by GitHub
parent ad3bea3685
commit f09ad21eba
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -288,6 +288,8 @@ class FileViewer(Vertical):
def __init__(self):
super().__init__()
self.current_session = None
self.current_filename = None
self.current_part = None
def compose(self) -> ComposeResult:
"""Create child widgets."""
@ -305,6 +307,8 @@ class FileViewer(Vertical):
part: For JSONL files, either "request" or "responses"
"""
self.current_session = session
self.current_filename = filename
self.current_part = part
content = session.read_file(filename)
if content is None:
@ -419,6 +423,7 @@ class SessionViewer(Vertical):
BINDINGS = [
Binding("ctrl+f,cmd+f", "search", "Search", show=True),
Binding("c", "copy_file", "Copy file", show=True),
]
def __init__(self, session: DiagnosticsSession):
@ -513,6 +518,47 @@ class SessionViewer(Vertical):
viewer = self.query_one(FileViewer)
viewer.action_search()
def action_copy_file(self):
"""Copy the current file content to clipboard."""
viewer = self.query_one(FileViewer)
if not viewer.current_session or not viewer.current_filename:
self.app.notify("No file selected")
return
content = viewer.current_session.read_file(viewer.current_filename)
if content is None:
self.app.notify("Could not read file")
return
# For JSONL files with a part, extract just that part and pretty-format
if viewer.current_filename.endswith('.jsonl') and viewer.current_part:
lines = [line.strip() for line in content.strip().split('\n') if line.strip()]
if viewer.current_part == "request" and lines:
try:
data = json.loads(lines[0])
content = json.dumps(data, indent=2)
except json.JSONDecodeError:
content = lines[0]
elif viewer.current_part == "responses" and len(lines) > 1:
try:
responses = [json.loads(line) for line in lines[1:]]
if len(responses) == 1:
content = json.dumps(responses[0], indent=2)
else:
content = json.dumps(responses, indent=2)
except json.JSONDecodeError:
content = '\n'.join(lines[1:])
# Pretty-format regular JSON files too
elif viewer.current_filename.endswith('.json'):
try:
data = json.loads(content)
content = json.dumps(data, indent=2)
except json.JSONDecodeError:
pass
pyperclip.copy(content)
self.app.notify("Copied to clipboard")
def on_key(self, event):
"""Handle left/right navigation between panels."""
if event.key == "left":