some fixes
This commit is contained in:
@@ -27,36 +27,18 @@ Be concise and specific. Focus on what's visible in the frames."""
|
|||||||
|
|
||||||
def _build_prompt(message: str, context: SessionContext) -> str:
|
def _build_prompt(message: str, context: SessionContext) -> str:
|
||||||
lines = []
|
lines = []
|
||||||
|
|
||||||
# Session summary
|
# Session summary
|
||||||
m, s = divmod(int(context.duration), 60)
|
m, s = divmod(int(context.duration), 60)
|
||||||
lines.append(f"Recording duration: {m:02d}:{s:02d}")
|
lines.append(f"Recording duration: {m:02d}:{s:02d}")
|
||||||
lines.append(f"Total frames captured: {len(context.frames)}")
|
lines.append(f"Total frames captured: {len(context.frames)}")
|
||||||
|
|
||||||
# All available frames (let Claude decide which to look at)
|
|
||||||
if context.frames:
|
|
||||||
lines.append("\nAvailable frames:")
|
|
||||||
for f in context.frames:
|
|
||||||
fm, fs = divmod(int(f.timestamp), 60)
|
|
||||||
lines.append(f" {f.id} at {fm:02d}:{fs:02d} — {f.path}")
|
|
||||||
|
|
||||||
# Explicitly mentioned frames
|
|
||||||
if context.mentioned_frames:
|
if context.mentioned_frames:
|
||||||
lines.append("\nFrames referenced in this message:")
|
lines.append("\nFrames:")
|
||||||
for f in context.mentioned_frames:
|
for f in context.mentioned_frames:
|
||||||
fm, fs = divmod(int(f.timestamp), 60)
|
fm, fs = divmod(int(f.timestamp), 60)
|
||||||
lines.append(f" {f.id} at {fm:02d}:{fs:02d} — {f.path}")
|
lines.append(f" {f.id} at {fm:02d}:{fs:02d} — {f.path}")
|
||||||
|
|
||||||
# Transcript
|
|
||||||
if context.transcript_segments:
|
|
||||||
lines.append(f"\nTranscript ({len(context.transcript_segments)} segments):")
|
|
||||||
for t in context.transcript_segments:
|
|
||||||
tm1, ts1 = divmod(int(t.start), 60)
|
|
||||||
tm2, ts2 = divmod(int(t.end), 60)
|
|
||||||
lines.append(f" {t.id} [{tm1:02d}:{ts1:02d}-{tm2:02d}:{ts2:02d}] {t.text}")
|
|
||||||
|
|
||||||
if context.mentioned_transcripts:
|
if context.mentioned_transcripts:
|
||||||
lines.append("\nTranscript segments referenced in this message:")
|
lines.append("\nTranscript:")
|
||||||
for t in context.mentioned_transcripts:
|
for t in context.mentioned_transcripts:
|
||||||
tm1, ts1 = divmod(int(t.start), 60)
|
tm1, ts1 = divmod(int(t.start), 60)
|
||||||
tm2, ts2 = divmod(int(t.end), 60)
|
tm2, ts2 = divmod(int(t.end), 60)
|
||||||
|
|||||||
@@ -99,9 +99,9 @@ class OpenAICompatProvider(AgentProvider):
|
|||||||
f"Recording duration: {m:02d}:{s:02d}",
|
f"Recording duration: {m:02d}:{s:02d}",
|
||||||
f"Total frames: {len(context.frames)}",
|
f"Total frames: {len(context.frames)}",
|
||||||
]
|
]
|
||||||
if context.transcript_segments:
|
if context.mentioned_transcripts:
|
||||||
ctx_lines.append(f"\nTranscript ({len(context.transcript_segments)} segments):")
|
ctx_lines.append("\nTranscript:")
|
||||||
for t in context.transcript_segments:
|
for t in context.mentioned_transcripts:
|
||||||
tm1, ts1 = divmod(int(t.start), 60)
|
tm1, ts1 = divmod(int(t.start), 60)
|
||||||
tm2, ts2 = divmod(int(t.end), 60)
|
tm2, ts2 = divmod(int(t.end), 60)
|
||||||
ctx_lines.append(f" {t.id} [{tm1:02d}:{ts1:02d}-{tm2:02d}:{ts2:02d}] {t.text}")
|
ctx_lines.append(f" {t.id} [{tm1:02d}:{ts1:02d}-{tm2:02d}:{ts2:02d}] {t.text}")
|
||||||
|
|||||||
@@ -41,15 +41,18 @@ class KeyboardManager:
|
|||||||
def __init__(self):
|
def __init__(self):
|
||||||
self._bindings: dict[int, Callable] = {}
|
self._bindings: dict[int, Callable] = {}
|
||||||
self._passthrough: Callable[[], bool] | None = None
|
self._passthrough: Callable[[], bool] | None = None
|
||||||
|
self._passthrough_except: set[int] = set()
|
||||||
self._window = None
|
self._window = None
|
||||||
|
|
||||||
def bind(self, keyval: int, handler: Callable):
|
def bind(self, keyval: int, handler: Callable):
|
||||||
"""Register a handler for a key. Handler receives shift=bool."""
|
"""Register a handler for a key. Handler receives shift=bool."""
|
||||||
self._bindings[keyval] = handler
|
self._bindings[keyval] = handler
|
||||||
|
|
||||||
def set_passthrough(self, check: Callable[[], bool]):
|
def set_passthrough(self, check: Callable[[], bool], except_keys: set[int] | None = None):
|
||||||
"""When check() returns True, keys pass through to focused widget."""
|
"""When check() returns True, keys pass through to focused widget.
|
||||||
|
Keys in except_keys are still handled even during passthrough."""
|
||||||
self._passthrough = check
|
self._passthrough = check
|
||||||
|
self._passthrough_except = except_keys or set()
|
||||||
|
|
||||||
def attach(self, window):
|
def attach(self, window):
|
||||||
"""Attach to a GTK4 window."""
|
"""Attach to a GTK4 window."""
|
||||||
@@ -76,7 +79,7 @@ class KeyboardManager:
|
|||||||
self._window.set_focus(None)
|
self._window.set_focus(None)
|
||||||
|
|
||||||
def _on_key_pressed(self, controller, keyval, keycode, state):
|
def _on_key_pressed(self, controller, keyval, keycode, state):
|
||||||
if self._passthrough and self._passthrough():
|
if self._passthrough and self._passthrough() and keyval not in self._passthrough_except:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
handler = self._bindings.get(keyval)
|
handler = self._bindings.get(keyval)
|
||||||
|
|||||||
@@ -563,14 +563,14 @@ class ChtWindow(Adw.ApplicationWindow):
|
|||||||
|
|
||||||
def _setup_keyboard(self):
|
def _setup_keyboard(self):
|
||||||
kb = KeyboardManager()
|
kb = KeyboardManager()
|
||||||
kb.set_passthrough(lambda: self.get_focus() is self._input_entry)
|
kb.set_passthrough(lambda: self.get_focus() is self._input_entry, except_keys={KEY_ESCAPE})
|
||||||
kb.bind(KEY_LEFT, lambda **_: self._frames_panel.select_adjacent(-1))
|
kb.bind(KEY_LEFT, lambda **_: self._frames_panel.select_adjacent(-1))
|
||||||
kb.bind(KEY_RIGHT, lambda **_: self._frames_panel.select_adjacent(1))
|
kb.bind(KEY_RIGHT, lambda **_: self._frames_panel.select_adjacent(1))
|
||||||
kb.bind(KEY_UP, lambda shift=False, **_: self._transcript_panel.select_adjacent(-1, extend=shift))
|
kb.bind(KEY_UP, lambda shift=False, **_: self._transcript_panel.select_adjacent(-1, extend=shift))
|
||||||
kb.bind(KEY_DOWN, lambda shift=False, **_: self._transcript_panel.select_adjacent(1, extend=shift))
|
kb.bind(KEY_DOWN, lambda shift=False, **_: self._transcript_panel.select_adjacent(1, extend=shift))
|
||||||
kb.bind(KEY_RETURN, lambda **_: self._send_message(self._build_selection_message("answer")) if self._build_selection_message("answer") else None)
|
kb.bind(KEY_RETURN, lambda **_: self._send_message(self._build_selection_message("answer")) if self._build_selection_message("answer") else None)
|
||||||
kb.bind(KEY_KP_ENTER, lambda **_: self._send_message(self._build_selection_message("answer")) if self._build_selection_message("answer") else None)
|
kb.bind(KEY_KP_ENTER, lambda **_: self._send_message(self._build_selection_message("answer")) if self._build_selection_message("answer") else None)
|
||||||
kb.bind(KEY_ESCAPE, lambda **_: (self._frames_panel.clear_selection(), self._transcript_panel.clear_selection()))
|
kb.bind(KEY_ESCAPE, lambda **_: (self.set_focus(None), self._frames_panel.clear_selection(), self._transcript_panel.clear_selection()))
|
||||||
kb.bind(KEY_DELETE, lambda **_: self._on_clear_agent_output(None))
|
kb.bind(KEY_DELETE, lambda **_: self._on_clear_agent_output(None))
|
||||||
kb.attach(self)
|
kb.attach(self)
|
||||||
|
|
||||||
@@ -596,6 +596,8 @@ class ChtWindow(Adw.ApplicationWindow):
|
|||||||
if text is None:
|
if text is None:
|
||||||
text = self._input_entry.get_text().strip()
|
text = self._input_entry.get_text().strip()
|
||||||
self._input_entry.set_text("")
|
self._input_entry.set_text("")
|
||||||
|
if not text:
|
||||||
|
text = self._build_selection_message("answer")
|
||||||
if not text:
|
if not text:
|
||||||
return
|
return
|
||||||
if not self._stream_mgr:
|
if not self._stream_mgr:
|
||||||
|
|||||||
Reference in New Issue
Block a user