diff --git a/.gitignore b/.gitignore
index e6f079d5..cf684ab8 100644
--- a/.gitignore
+++ b/.gitignore
@@ -70,3 +70,4 @@ result.json
textual.log
.VSCodeCounter/
textual.log
+textual.log
diff --git a/README.md b/README.md
index e88f35d5..9235b316 100644
--- a/README.md
+++ b/README.md
@@ -64,7 +64,7 @@
Some modules are full scripts and can be run from command line. These are written here:
`zodiac` - Experimental generative system
-`astra` - Experimental generative system
+`astra` - Live diagnostic console
`nnll-hash` - Hash the layer metadata from models within a directory and write out to console.
`nnll-parse` - Process metadata headers from a model file or directory of models and write out to individual JSON files.
`nnll-find` - Search a local directory of model layer files (HuggingFace🤗 index.json, JSON from `nnll-parse`)
diff --git a/nnll_10/package/__init__.py b/nnll_10/package/__init__.py
index 0a1dcf9b..b766124d 100644
--- a/nnll_10/package/__init__.py
+++ b/nnll_10/package/__init__.py
@@ -31,3 +31,9 @@ def main():
assembled_path = os.path.join("log", f".nnll{datetime.now().strftime('%Y%m%d')}_trace.json")
tracer.stop()
tracer.save(output_file=assembled_path) # also takes output_file as an optional argument
+
+
+if __name__ == "__main__":
+ # import asyncio
+ main()
+ # asyncio.run(main())
diff --git a/nnll_10/package/carousel.py b/nnll_10/package/carousel.py
index 4ba1775f..0662ef6a 100644
--- a/nnll_10/package/carousel.py
+++ b/nnll_10/package/carousel.py
@@ -7,47 +7,59 @@
from textual.screen import Screen
from textual.reactive import reactive
-from nnll_01 import debug_monitor
+from nnll_01 import debug_monitor, info_message as nfo # debug_message as dbug,
class Carousel(DataTable):
"""Revolving text-line component based on default DataTable widget class"""
nx_graph: dict
- content_cell: reactive[int] = reactive(0.0)
+ content_cell: reactive[int] = reactive(0)
up = "[@click='scroll_button(1)']â–²[/]"
dwn = "[@click='scroll_button']â–¼[/]"
+ current_cell = "text"
+ current_row = 0
+ y_coord = 1
+ scroll_counter = 5
def on_mount(self) -> None:
self.show_header = False
self.cursor_type = "cell"
@debug_monitor
- def emulate_scroll_down(self, interval: float = 0.05) -> str:
+ def emulate_scroll_down(self, interval: int = 1) -> str:
"""Trigger datatable cursor movement using fractional sensitivity
:param ceiling: Total entry count of the table *column*
:return: The datata in the table *row*
"""
- if self.content_cell < len(self.columns) - 1:
- self.content_cell += interval
- coordinate = abs(int(round(self.content_cell)))
- self.move_cursor(row=coordinate, column=1)
- current_content = self.get_cell_at((coordinate, 1))
- return current_content
+
+ if (self.row_count - 1) >= (self.current_row + interval):
+ if self.y_coord < self.scroll_counter:
+ self.y_coord += interval
+ else:
+ self.y_coord = interval
+ self.current_row += interval
+ self.move_cursor(row=self.current_row, column=1)
+ self.current_cell = self.get_cell_at((self.current_row, 1))
+ return self.current_cell
@debug_monitor
- def emulate_scroll_up(self, interval: float = 0.05) -> str:
+ def emulate_scroll_up(self, interval: int = 1) -> str:
"""Trigger datatable cursor movement using fractional sensitivity
:param ceiling: Total entry count of the table *column*
:return: The datata in the table *row*
"""
- if self.content_cell > 0:
- self.content_cell -= interval
- coordinate = abs(int(round(self.content_cell)))
- self.move_cursor(row=coordinate, column=1)
- current_content = self.get_cell_at((coordinate, 1))
- return current_content
+
+ if 0 <= self.current_row - interval:
+ if self.y_coord >= 1:
+ self.y_coord -= interval
+ else:
+ self.y_coord = self.scroll_counter
+ self.current_row -= interval
+ self.move_cursor(row=self.current_row, column=1)
+ self.current_cell = self.get_cell_at((self.current_row, 1))
+ return self.current_cell
@debug_monitor
def action_scroll_button(self, up: bool = False) -> None:
@@ -55,10 +67,12 @@ def action_scroll_button(self, up: bool = False) -> None:
:param up: Scroll direction, defaults to False
"""
if up:
- content = self.emulate_scroll_up(interval=0.6)
+ self.current_cell = self.emulate_scroll_up(interval=self.y_coord + 1)
if self.id == "input_tag":
- self.query_ancestor(Screen).foldr["ps"].current = self.query_ancestor(Screen).input_map[content]
+ self.query_ancestor(Screen).foldr["ps"].current = self.query_ancestor(Screen).input_map[self.current_cell]
+ self.query_ancestor(Screen).ready_tx(io_only=True)
else:
- content = self.emulate_scroll_down(interval=0.6)
+ self.current_cell = self.emulate_scroll_down(interval=self.scroll_counter - self.y_coord - 1)
if self.id == "input_tag":
- self.query_ancestor(Screen).foldr["ps"].current = self.query_ancestor(Screen).input_map[content]
+ self.query_ancestor(Screen).foldr["ps"].current = self.query_ancestor(Screen).input_map[self.current_cell]
+ self.query_ancestor(Screen).ready_tx(io_only=True)
diff --git a/nnll_10/package/combo.tcss b/nnll_10/package/combo.tcss
index 584faaa5..e29a2976 100644
--- a/nnll_10/package/combo.tcss
+++ b/nnll_10/package/combo.tcss
@@ -1,6 +1,9 @@
# # # #
# # # #
+
+
+
$min-height: 3;
# #dedede;
# #000000;
@@ -12,32 +15,32 @@ $min-height: 3;
# rgb(28, 26, 26)
# rgb(31, 0, 65)
# surfaces
-$negative-space: $background-darken-3;
-$main-background: $background;
-$top-surface: $surface;
-$focus-surface: $foreground;
+$negative-space: $background-darken-3;
+$main-background: $background;
+$top-surface: $surface;
+$focus-surface: $foreground;
# text
-$sunken-text: $background-lighten-3;
-$raised-text: $foreground-darken-3; # $secondary;
-$hover-focus: $foreground;
+$sunken-text: $background-lighten-3;
+$raised-text: $foreground-darken-3; # $secondary;
+$hover-focus: $foreground;
# layout
-$layout-type: grid;
+$layout-type: grid;
$centre-frame-margin: 0 1 0 1;
-$vertical-grid: 1 3;
-$horizontal-grid: 3 1;
-$proportions: 0.7fr 4.5fr 0.7fr;
+$vertical-grid: 1 3;
+$horizontal-grid: 3 1;
+$proportions: 0.7fr 4.5fr 0.7fr;
$vertical-proportions: 0.6fr 5fr 0.55fr;
-$grid-fraction: 1fr;
+$grid-fraction: 1fr;
$invisible-scrollbar: 0 0;
-$margin-size: 0;
+$margin-size: 0;
# alignment
-$title-align: left;
-$border-shape: round;
-$hatch-border: horizontal;
+$title-align: left;
+$border-shape: round;
+$hatch-border: horizontal;
$hatch-align: left;
# color
@@ -45,7 +48,10 @@ $message-panel-subtitle: $raised-text;
$selection-background: $focus-surface;
-
+#seam {
+ align: left top;
+ content-align-horizontal: left;
+}
#footer {
background: $main-background;
}
@@ -74,7 +80,86 @@ $selection-background: $focus-surface;
}
+#selectah {
+ color: $sunken-text;
+ border: vkey $focus-surface;
+ margin-top: -1;
+ margin-left: 60;
+ width: 100%;
+ height: 3;
+ align: right top;
+ content-align: right top;
+ color: $background-lighten-3;
+ scrollbar-size: $invisible-scrollbar;
+ Static#label {
+ width: 1fr;
+ height: auto;
+ color: $sunken-text;
+ background: transparent;
+ &:focus {
+ color: $foreground-darken-1;
+ }
+ &:hover {
+ color: $foreground-darken-1;
+ }
+ }
+ &.-has-value Static#label {
+ color: $background-lighten-3;
+ }
+ &:blur {
+ color: $sunken-text;
+ border: vkey $negative-space 7%;
+ }
+ &:focus {
+ border: vkey $focus-surface;
+ }
+ &:hover {
+ color: $sunken-text;
+ border: vkey $focus-surface;
+ }
+ SelectCurrent {
+ color: $sunken-text;
+ scrollbar-size: 0 0;
+ background:$negative-space 7%;
+ border: round $focus-surface;
+ &:blur {
+ color: $sunken-text;
+ border:none;
+ }
+ &:hover {
+ color: $sunken-text;
+ border:none;
+ }
+ &:focus {
+ color: $sunken-text;
+ border:none;
+ }
+ }
+ SelectOverlay {
+ color: $sunken-text;
+ overlay: screen;
+ scrollbar-size: 0 0;
+ background:$negative-space 7%;
+ border: round $focus-surface;
+ &:hover {
+ color: $sunken-text;
+ overflow: hidden;
+ border: round $focus-surface;
+ scrollbar-size: $invisible-scrollbar;
+ }
+ &.active {
+ color: $sunken-text;
+ scrollbar-size: 0 0;
+ background: $negative-space 7%;
+ border: round $focus-surface;
+ overflow: hidden;
+ }
+ &.blur {
+ border: round $focus-surface;
+ }
+ }
+}
#top-frame, #bottom-frame, #left-frame, #right-frame {
background: $negative-space;
}
@@ -117,6 +202,9 @@ SidebarLeft, SidebarRight {
}
#response_panel {
+ width: 100%;
+ margin: 0 0;
+ height: 100%;
border: round $main-background;
hatch: $hatch-align $main-background;
&:focus-within {
@@ -130,6 +218,12 @@ SidebarLeft, SidebarRight {
#display_bar {
color: $panel-lighten-1;
+ margin: 0 0;
+ padding: 0 0;
+ height: 1;
+ width: 50%;
+ layer: above;
+ content-align: left top;
scrollbar-size: $invisible-scrollbar;
background: $negative-space 7%;
&:blur {
diff --git a/nnll_10/package/main_screen.py b/nnll_10/package/main_screen.py
index 59fbde41..5521b91a 100644
--- a/nnll_10/package/main_screen.py
+++ b/nnll_10/package/main_screen.py
@@ -3,8 +3,9 @@
"""Auto-Orienting Split screen"""
+import os
from collections import defaultdict
-from typing import Any, Callable
+from typing import Callable # , Any
from textual import events, on, work
from textual.app import ComposeResult
from textual.binding import Binding
@@ -14,11 +15,13 @@
from textual.screen import Screen
# from textual.widget import Widget
-from textual.widgets import Static, ContentSwitcher
+from textual.widgets import Static, ContentSwitcher, Select # , DataTable
-from nnll_01 import debug_monitor, info_message as nfo, debug_message as dbug
+from nnll_01 import debug_monitor # , debug_message as dbug # info_message as nfo,
from nnll_10.package.message_panel import MessagePanel
from nnll_10 import IntentProcessor
+from nnll_10.package.input_tag import InputTag
+from nnll_10.package.output_tag import OutputTag
class Fold(Screen[bool]):
@@ -49,25 +52,32 @@ def compose(self) -> ComposeResult:
from textual.containers import Horizontal
from textual.widgets import Footer
from nnll_10.package.display_bar import DisplayBar
- from nnll_10.package.input_tag import InputTag
- from nnll_10.package.output_tag import OutputTag
+
from nnll_10.package.response_panel import ResponsePanel
from nnll_10.package.voice_panel import VoicePanel
self.intent_processor = IntentProcessor()
self.intent_processor.calculate_intent_graph()
-
+ self.ready_tx(io_only=True, mode_in="text", mode_out="text")
yield Footer(id="footer")
with Horizontal(id="app-grid", classes="app-grid-horizontal"):
yield ResponsiveLeftTop(id="left-frame")
- with Container(id="centre-frame"):
- with Container(id="responsive_input"):
+ with Container(id="centre-frame"): # 3:1:3 ratio
+ with Container(id="responsive_input"): # 3:
with ContentSwitcher(id="panel_swap", initial="message_panel"):
yield MessagePanel("""""", id="message_panel", max_checkpoints=100)
yield VoicePanel(id="voice_panel")
yield InputTag(id="input_tag", classes="input_tag")
- yield DisplayBar(id="display_bar")
- with Container(id="responsive_display"):
+ with Container(id="seam"):
+ yield Select(
+ id="selectah",
+ classes="selectah_tag",
+ allow_blank=False,
+ prompt="Models For Task",
+ options=[(os.path.basename(x), x) for x in self.intent_processor.model_names],
+ )
+ yield DisplayBar(id="display_bar") # 1:
+ with Container(id="responsive_display"): #
yield ResponsePanel("\n", id="response_panel", language="markdown")
yield OutputTag(id="output_tag", classes="output_tag")
yield ResponsiveRightBottom(id="right-frame")
@@ -83,7 +93,7 @@ async def on_mount(self):
self.foldr["rd"] = self.query_one("#responsive_display")
self.foldr["rp"] = self.query_one("#response_panel")
self.foldr["vp"] = self.query_one("#voice_panel")
- self.ready_tx()
+ self.foldr["sl"] = self.query_one("#selectah")
# id_name = self.input_tag.highlight_link_id
@work(exit_on_error=False)
@@ -136,6 +146,8 @@ def _on_mouse_scroll_down(self, event: events.MouseScrollUp) -> None:
event.prevent_default()
mode_name = self.foldr["it"].emulate_scroll_down()
self.foldr["ps"].current = self.input_map.get(mode_name)
+ self.ready_tx(io_only=True)
+ self.query_one("#selectah").set_options([(os.path.basename(x), x) for x in self.intent_processor.model_names])
@debug_monitor
def _on_mouse_scroll_up(self, event: events.MouseScrollUp) -> None:
@@ -150,8 +162,10 @@ def _on_mouse_scroll_up(self, event: events.MouseScrollUp) -> None:
event.prevent_default()
mode_name = self.foldr["it"].emulate_scroll_up()
self.foldr["ps"].current = self.input_map.get(mode_name)
+ self.ready_tx(io_only=True)
+ self.query_one("#selectah").set_options([(os.path.basename(x), x) for x in self.intent_processor.model_names])
- @work(exclusive=True)
+ # @work(exclusive=True)
@on(MessagePanel.Changed, "#message_panel")
async def tx_text_to_tokenizer(self) -> None:
"""Transmit info to token calculation"""
@@ -166,17 +180,16 @@ async def tx_audio_to_tokenizer(self) -> None:
self.foldr["db"].calculate_audio(duration)
# @work(exclusive=True)
- def ready_tx(self, mode_io_only: bool = False, mode_in: str = None, mode_out: str = None) -> None:
+ def ready_tx(self, io_only: bool = False, mode_in: str = None, mode_out: str = None) -> None:
"""Retrieve graph"""
if not mode_in:
- mode_in = self.foldr["ot"].get_cell_at((int(round(self.foldr["it"].content_cell)), 1))
+ mode_in = self.foldr["it"].get_cell_at((self.foldr["it"].current_row, 1))
if not mode_out:
- mode_out = self.foldr["ot"].get_cell_at((int(round(self.foldr["ot"].content_cell)), 1))
- mode_io = {"mode_in": mode_in, "mode_out": mode_out}
- if mode_io_only:
- return mode_io
- self.intent_processor.derive_coordinates_path(**mode_io)
+ mode_out = self.foldr["ot"].get_cell_at((self.foldr["ot"].current_row, 1))
+ self.intent_processor.derive_coordinates_path(mode_in=mode_in, mode_out=mode_out)
self.intent_processor.define_model_waypoints()
+ if io_only:
+ return
message = {
"text": self.foldr["mp"].text,
"audio": self.foldr["vp"].audio,
diff --git a/nnll_11/__init__.py b/nnll_11/__init__.py
index 077f6872..a2519cb9 100644
--- a/nnll_11/__init__.py
+++ b/nnll_11/__init__.py
@@ -21,13 +21,6 @@
# # ChainOfThought("question -> answer")
-class LLMInput(BaseModel):
- """Simple input query fields for chat models including previous contexts"""
-
- context: str = Field(description="The context for the question")
- query: str = Field(description="The message to respond to")
-
-
# class LLMOutput(BaseModel):
# """Simple output fields for chat models
# Incl. confidence metric"""
@@ -36,6 +29,24 @@ class LLMInput(BaseModel):
# # confidence: float = Field(ge=0.0, le=1.0, description="The confidence score for the reply (absolute certainty is impossible).") # Alternatively : ""Mean numeric value of conflicting predicates and cognitive dissonance for prediction per word."
+# dspy.Image.from_file
+# dspy.Image.from_PIL
+
+
+class PictureSignature(dspy.Signature):
+ """Output the dog breed of the dog in the image."""
+
+ image_1: dspy.Image = dspy.InputField(desc="An image of a dog")
+ answer: str = dspy.OutputField(desc="The dog breed of the dog in the image")
+
+
+class LLMInput(BaseModel):
+ """Simple input query fields for chat models including previous contexts"""
+
+ context: str = Field(description="The context for the question")
+ query: str = Field(description="The message to respond to")
+
+
class BasicQAHistory(dspy.Signature):
"""Reply with short responses within 60-90 word/10k character code limits"""
@@ -78,7 +89,7 @@ def __init__(self, memory_size: int = 5, signature: dspy.Signature = BasicQAHist
super().__init__()
self.memory = []
self.memory_size = memory_size
- generator = dspy.asyncify(dspy.Predict(signature))
+ generator = dspy.asyncify(dspy.Predict(signature)) # this should only be used in the case of text
self.completion = dspy.streamify(generator)
@debug_monitor
@@ -115,3 +126,12 @@ async def forward(self, message: str, model: str, library: LibType, max_workers=
yield chunk["choices"][0]["delta"]["content"]
except (GeneratorExit, RuntimeError, AttributeError) as error_log:
dbug(error_log) # consider threading user selection between cursor jumps
+
+
+# class DPicture(dspy.Module):
+# def __init__(self) -> None:
+# super().__init__()
+# self.predictor = dspy.ChainOfThought(PictureSignature)
+
+# def __call__(self, **kwargs):
+# return self.predictor(**kwargs)
diff --git a/pyproject.toml b/pyproject.toml
index aa5c48f1..3607c302 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -30,7 +30,7 @@ dependencies = ["structlog>=25.2.0", "viztracer>=1.0.3"]
[project.optional-dependencies]
nnll-02 = ["huggingface-hub>=0.29.3", "litellm>=1.65.0"]
nnll-03 = ["aiofiles>=24.1.0", "aiohttp>=3.9.5, <=3.11.13", "tqdm>=4.67.1"]
-nnll-04 = ["gguf>=0.14.0", "llama-cpp-python>=0.3.8", "safetensors>=0.5.3"]
+nnll-04 = ["gguf>=0.14.0", "safetensors>=0.5.3"]
nnll-05 = ["networkx>=3.4.2"]
nnll-06 = ["litellm>=1.65.0", "ollama>=0.4.7", "tiktoken>=0.9.0"]
nnll-08 = ["numpy>=2.2.3", "torch>=2.6.0"]
diff --git a/textual.log b/textual.log
index b8903f24..be7d9507 100644
--- a/textual.log
+++ b/textual.log
@@ -304873,3 +304873,4444 @@ Unmount() >>> ScrollBar(name='vertical', window_virtual_size=100, window_size=0,
Unmount() >>> ToastRack(id='textual-toastrack') method=
Unmount() >>> Screen(id='_default') method=
Unmount() >>> Combo(title='Combo', classes={'-dark-mode'}, pseudo_classes={'dark', 'blur'}) method=None
+Connected to devtools ( ws://127.0.0.1:8081 )
+---
+loop=<_UnixSelectorEventLoop running=True closed=False debug=False>
+features=frozenset({'debug', 'devtools'})
+Writing logs to '/Users/unauthorized/Documents/GitHub/darkshapes/nnll/textual.log'
+STARTED FileMonitor({PosixPath('/Users/unauthorized/Documents/GitHub/darkshapes/nnll/nnll_10/package/combo.tcss')})
+Load() >>> Combo(title='Combo', classes={'-dark-mode'}, pseudo_classes={'focus', 'dark'}) method=None
+driver=
+Compose() >>> Combo(title='Combo', classes={'-dark-mode'}, pseudo_classes={'focus', 'dark'}) method=
+Resize(size=Size(width=159, height=48)) >>> Combo(title='Combo', classes={'-dark-mode'}, pseudo_classes={'focus', 'dark'}) method=
+Mount() >>> Combo(title='Combo', classes={'-dark-mode'}, pseudo_classes={'focus', 'dark'}) method=
+Fold() is current (PUSHED)
+Compose() >>> Screen(id='_default') method=
+Compose() >>> Fold() method=
+Compose() >>> ToastRack(id='textual-toastrack') method=
+Mount() >>> ToastRack(id='textual-toastrack') method=
+Compose() >>> Tooltip(id='textual-tooltip') method=
+Mount() >>> Tooltip(id='textual-tooltip') method=
+Compose() >>> ToastRack(id='textual-toastrack') method=
+Mount() >>> ToastRack(id='textual-toastrack') method=
+Compose() >>> Tooltip(id='textual-tooltip') method=
+Mount() >>> Tooltip(id='textual-tooltip') method=
+Compose() >>> Footer(id='footer') method=
+Mount() >>> Footer(id='footer') method=
+Mount() >>> Footer(id='footer') method=
+Compose() >>> Horizontal(id='app-grid') method=
+Compose() >>> FooterKey() method=
+Mount() >>> FooterKey() method=
+Callback(callback=functools.partial()) >>> FooterKey() method=
+Compose() >>> FooterKey() method=
+Mount() >>> FooterKey() method=
+Callback(callback=functools.partial()) >>> FooterKey() method=
+Compose() >>> FooterKey() method=
+Mount() >>> FooterKey() method=
+Callback(callback=functools.partial()) >>> FooterKey() method=
+Compose() >>> FooterKey() method=
+Mount() >>> FooterKey() method=
+Callback(callback=functools.partial()) >>> FooterKey() method=
+Compose() >>> FooterKey() method=
+Mount() >>> FooterKey() method=
+Callback(callback=functools.partial()) >>> FooterKey() method=
+Compose() >>> FooterKey() method=
+Mount() >>> FooterKey() method=
+Callback(callback=functools.partial()) >>> FooterKey() method=
+Compose() >>> FooterKey() method=
+Mount() >>> FooterKey() method=
+Compose() >>> ResponsiveLeftTop(id='left-frame') method=
+Compose() >>> Container(id='centre-frame') method=
+Compose() >>> ResponsiveRightBottom(id='right-frame') method=
+Compose() >>> Static() method=
+Mount() >>> Static() method=
+Compose() >>> Container(id='responsive_input') method=
+Compose() >>> Container(id='seam') method=
+Compose() >>> Container(id='responsive_display') method=
+Compose() >>> Static() method=
+Mount() >>> Static() method=
+Compose() >>> Static() method=
+Mount() >>> Static() method=
+Compose() >>> ContentSwitcher(id='panel_swap') method=
+Compose() >>> InputTag(id='input_tag') method=
+Mount() >>> InputTag(id='input_tag') method=
+Mount() >>> InputTag(id='input_tag') method=
+Mount() >>> InputTag(id='input_tag') method=
+Mount() >>> InputTag(id='input_tag') method=
+CellHighlighted(value="[@click='scroll_button(1)']â–²[/]", coordinate=Coordinate(row=0, column=0), cell_key=CellKey(row_key=, column_key=)) >>> InputTag(id='input_tag') method=None
+Compose() >>> Select(id='selectah') method=
+Compose() >>> DisplayBar(id='display_bar') method=
+Mount() >>> DisplayBar(id='display_bar') method=
+Mount() >>> DisplayBar(id='display_bar') method=
+Mount() >>> DisplayBar(id='display_bar') method=
+CellHighlighted(value=' 0chr / ', coordinate=Coordinate(row=0, column=0), cell_key=CellKey(row_key=, column_key=)) >>> DisplayBar(id='display_bar') method=None
+Compose() >>> ResponsePanel(id='response_panel') method=
+Mount() >>> ResponsePanel(id='response_panel') method=
+Mount() >>> ResponsePanel(id='response_panel') method=
+Mount() >>> ResponsePanel(id='response_panel') method=
+Mount() >>> ResponsePanel(id='response_panel') method=
+Compose() >>> OutputTag(id='output_tag') method=
+Mount() >>> OutputTag(id='output_tag') method=
+Mount() >>> OutputTag(id='output_tag') method=
+Mount() >>> OutputTag(id='output_tag') method=
+Mount() >>> OutputTag(id='output_tag') method=
+CellHighlighted(value="[@click='scroll_button(1)']â–²[/]", coordinate=Coordinate(row=0, column=0), cell_key=CellKey(row_key=, column_key=)) >>> OutputTag(id='output_tag') method=None
+Compose() >>> MessagePanel(id='message_panel') method=
+Mount() >>> MessagePanel(id='message_panel') method=
+Mount() >>> MessagePanel(id='message_panel') method=
+Mount() >>> MessagePanel(id='message_panel') method=
+Mount() >>> MessagePanel(id='message_panel') method=
+Compose() >>> VoicePanel(id='voice_panel') method=
+Mount() >>> VoicePanel(id='voice_panel') method=
+Mount() >>> VoicePanel(id='voice_panel') method=
+Mount() >>> VoicePanel(id='voice_panel') method=
+Compose() >>> SelectCurrent() method=
+Compose() >>> SelectOverlay() method=
+Mount() >>> SelectOverlay() method=
+Mount() >>> SelectOverlay() method=
+Mount() >>> SelectOverlay() method=
+Mount() >>> SelectOverlay() method=
+Mount() >>> Screen(id='_default') method=
+Mount() >>> Screen(id='_default') method=
+ScreenResume() >>> Screen(id='_default') method=
+Callback(callback=functools.partial(.update_styles at 0x111181ee0>, [])) >>> Screen(id='_default') method=
+ScreenSuspend() >>> Screen(id='_default') method=
+Callback(callback=functools.partial(.update_styles at 0x1110b3240>, [ToastRack(id='textual-toastrack'), Tooltip(id='textual-tooltip')])) >>> Screen(id='_default') method=
+Update(ToastRack(id='textual-toastrack')) >>> Screen(id='_default') method=
+Layout() >>> Screen(id='_default') method=
+Update(Tooltip(id='textual-tooltip')) >>> Screen(id='_default') method=
+Resize(size=Size(width=159, height=48)) >>> Screen(id='_default') method=
+Show() >>> Screen(id='_default') method=
+Callback(callback=functools.partial(>, Screen(id='_default'))) >>> Screen(id='_default') method=
+Compose() >>> Static(id='label') method=
+Mount() >>> Static(id='label') method=
+Compose() >>> Static() method=
+Mount() >>> Static() method=
+Compose() >>> Static() method=
+Mount() >>> Static() method=
+Compose() >>> ScrollBar(name='vertical', window_virtual_size=100, window_size=0, position=0, thickness=2) method=
+Mount() >>> ScrollBar(name='vertical', window_virtual_size=100, window_size=0, position=0, thickness=2) method=
+Callback(callback=functools.partial(.update_styles at 0x1171307c0>, [FooterKey(), FooterKey(), FooterKey(), FooterKey(), FooterKey(), FooterKey(), FooterKey()])) >>> Footer(id='footer') method=
+Update(Tooltip(id='textual-tooltip')) >>> Screen(id='_default') method=
+Layout() >>> Screen(id='_default') method=
+Update(ToastRack(id='textual-toastrack')) >>> Screen(id='_default') method=
+Layout() >>> Screen(id='_default') method=
+Update(ScrollBar(name='vertical', window_virtual_size=100, window_size=0, position=0, thickness=2)) >>> Screen(id='_default') method=
+Mount() >>> ResponsiveLeftTop(id='left-frame') method=
+Callback(callback=functools.partial(.update_styles at 0x1111825c0>, [Static()])) >>> ResponsiveLeftTop(id='left-frame') method=
+Mount() >>> ResponsiveRightBottom(id='right-frame') method=
+Callback(callback=functools.partial(.update_styles at 0x117133b00>, [Static(), Static()])) >>> ResponsiveRightBottom(id='right-frame') method=
+Mount() >>> Container(id='responsive_display') method=
+Callback(callback=functools.partial(.update_styles at 0x117192160>, [ResponsePanel(id='response_panel'), OutputTag(id='output_tag')])) >>> Container(id='responsive_display') method=
+CellHighlighted(value="[@click='scroll_button(1)']â–²[/]", coordinate=Coordinate(row=0, column=0), cell_key=CellKey(row_key=, column_key=)) >>> Container(id='responsive_display') method=None
+Mount() >>> ContentSwitcher(id='panel_swap') method=
+Mount() >>> ContentSwitcher(id='panel_swap') method=
+Callback(callback=functools.partial(.update_styles at 0x1171932e0>, [MessagePanel(id='message_panel'), VoicePanel(id='voice_panel')])) >>> ContentSwitcher(id='panel_swap') method=
+Mount() >>> SelectCurrent() method=
+Callback(callback=functools.partial(.update_styles at 0x1171e6ac0>, [Static(id='label'), Static(), Static()])) >>> SelectCurrent() method=
+Mount() >>> Container(id='responsive_input') method=
+Callback(callback=functools.partial(.update_styles at 0x117133ec0>, [ContentSwitcher(id='panel_swap'), InputTag(id='input_tag')])) >>> Container(id='responsive_input') method=
+CellHighlighted(value="[@click='scroll_button(1)']â–²[/]", coordinate=Coordinate(row=0, column=0), cell_key=CellKey(row_key=, column_key=)) >>> Container(id='responsive_input') method=None
+Mount() >>> Select(id='selectah') method=
+Mount() >>> Select(id='selectah') method=
+Callback(callback=functools.partial(.update_styles at 0x111180f40>, [SelectCurrent(), SelectOverlay()])) >>> Select(id='selectah') method=
+Changed(Select(id='selectah'), 'ollama_chat/hf.co/DevQuasar/xwen-team.Xwen-0.5B-Chat-GGUF:f16') >>> Select(id='selectah') method=None
+OptionHighlighted(option_list=SelectOverlay(), option=Option('xwen-team.Xwen-0.5B-Chat-GGUF:f16'), option_id=None, option_index=0) >>> SelectOverlay() method=
+Mount() >>> Container(id='seam') method=
+Callback(callback=functools.partial(.update_styles at 0x117190cc0>, [Select(id='selectah'), DisplayBar(id='display_bar')])) >>> Container(id='seam') method=
+CellHighlighted(value=' 0chr / ', coordinate=Coordinate(row=0, column=0), cell_key=CellKey(row_key=, column_key=)) >>> Container(id='seam') method=None
+Changed(Select(id='selectah'), 'ollama_chat/hf.co/DevQuasar/xwen-team.Xwen-0.5B-Chat-GGUF:f16') >>> Container(id='seam') method=None
+Mount() >>> Container(id='centre-frame') method=
+Callback(callback=functools.partial(.update_styles at 0x117131ee0>, [Container(id='responsive_input'), Container(id='seam'), Container(id='responsive_display')])) >>> Container(id='centre-frame') method=
+CellHighlighted(value="[@click='scroll_button(1)']â–²[/]", coordinate=Coordinate(row=0, column=0), cell_key=CellKey(row_key=, column_key=)) >>> Container(id='centre-frame') method=None
+CellHighlighted(value="[@click='scroll_button(1)']â–²[/]", coordinate=Coordinate(row=0, column=0), cell_key=CellKey(row_key=, column_key=)) >>> Container(id='centre-frame') method=None
+CellHighlighted(value=' 0chr / ', coordinate=Coordinate(row=0, column=0), cell_key=CellKey(row_key=, column_key=)) >>> Container(id='centre-frame') method=None
+Changed(Select(id='selectah'), 'ollama_chat/hf.co/DevQuasar/xwen-team.Xwen-0.5B-Chat-GGUF:f16') >>> Container(id='centre-frame') method=None
+Mount() >>> Horizontal(id='app-grid') method=
+Callback(callback=functools.partial(.update_styles at 0x1171319e0>, [ResponsiveLeftTop(id='left-frame'), Container(id='centre-frame'), ResponsiveRightBottom(id='right-frame')])) >>> Horizontal(id='app-grid') method=
+CellHighlighted(value="[@click='scroll_button(1)']â–²[/]", coordinate=Coordinate(row=0, column=0), cell_key=CellKey(row_key=, column_key=)) >>> Horizontal(id='app-grid') method=None
+CellHighlighted(value="[@click='scroll_button(1)']â–²[/]", coordinate=Coordinate(row=0, column=0), cell_key=CellKey(row_key=, column_key=)) >>> Horizontal(id='app-grid') method=None
+CellHighlighted(value=' 0chr / ', coordinate=Coordinate(row=0, column=0), cell_key=CellKey(row_key=, column_key=)) >>> Horizontal(id='app-grid') method=None
+Changed(Select(id='selectah'), 'ollama_chat/hf.co/DevQuasar/xwen-team.Xwen-0.5B-Chat-GGUF:f16') >>> Horizontal(id='app-grid') method=None
+Mount() >>> Fold() method=
+Mount() >>> Fold() method=
+Mount() >>> Fold() method=
+ScreenResume() >>> Fold() method=
+MessagePanel(id='message_panel') was focused
+Callback(callback=functools.partial(.update_styles at 0x1144bbb00>, [ToastRack(id='textual-toastrack'), Tooltip(id='textual-tooltip'), Footer(id='footer'), Horizontal(id='app-grid')])) >>> Fold() method=
+Update(ToastRack(id='textual-toastrack')) >>> Fold() method=
+Layout() >>> Fold() method=
+Update(Tooltip(id='textual-tooltip')) >>> Fold() method=
+Update(FooterKey()) >>> Fold() method=
+Update(FooterKey()) >>> Fold() method=
+Update(FooterKey()) >>> Fold() method=
+Update(FooterKey()) >>> Fold() method=
+Update(FooterKey()) >>> Fold() method=
+Update(FooterKey()) >>> Fold() method=
+Update(FooterKey()) >>> Fold() method=
+Update(Static()) >>> Fold() method=
+Update(Static()) >>> Fold() method=
+Update(Static()) >>> Fold() method=
+Update(Footer(id='footer')) >>> Fold() method=
+Layout() >>> Fold() method=
+Update(InputTag(id='input_tag')) >>> Fold() method=
+Layout() >>> Fold() method=
+Update(DisplayBar(id='display_bar')) >>> Fold() method=
+Layout() >>> Fold() method=
+Update(ResponsePanel(id='response_panel')) >>> Fold() method=
+Layout() >>> Fold() method=
+Update(OutputTag(id='output_tag')) >>> Fold() method=
+Layout() >>> Fold() method=
+Update(MessagePanel(id='message_panel')) >>> Fold() method=
+Layout() >>> Fold() method=
+Update(VoicePanel(id='voice_panel')) >>> Fold() method=
+Update(SelectOverlay()) >>> Fold() method=
+Update(Static(id='label')) >>> Fold() method=
+Update(Static()) >>> Fold() method=
+Update(Static()) >>> Fold() method=
+Update(Footer(id='footer')) >>> Fold() method=
+Layout() >>> Fold() method=
+Update(ResponsiveLeftTop(id='left-frame')) >>> Fold() method=
+Layout() >>> Fold() method=
+Update(ResponsiveRightBottom(id='right-frame')) >>> Fold() method=
+Layout() >>> Fold() method=
+Update(Container(id='responsive_display')) >>> Fold() method=
+Layout() >>> Fold() method=
+Update(ContentSwitcher(id='panel_swap')) >>> Fold() method=
+Layout() >>> Fold() method=
+Update(MessagePanel(id='message_panel')) >>> Fold() method=
+Layout() >>> Fold() method=
+Update(VoicePanel(id='voice_panel')) >>> Fold() method=
+Layout() >>> Fold() method=
+Update(SelectCurrent()) >>> Fold() method=
+Layout() >>> Fold() method=
+Update(Container(id='responsive_input')) >>> Fold() method=
+Layout() >>> Fold() method=
+Update(Select(id='selectah')) >>> Fold() method=
+Layout() >>> Fold() method=
+Update(SelectOverlay()) >>> Fold() method=
+Update(Static(id='label')) >>> Fold() method=
+Layout() >>> Fold() method=
+Update(Container(id='seam')) >>> Fold() method=
+Layout() >>> Fold() method=
+Update(Container(id='centre-frame')) >>> Fold() method=
+Layout() >>> Fold() method=
+CellHighlighted(value="[@click='scroll_button(1)']â–²[/]", coordinate=Coordinate(row=0, column=0), cell_key=CellKey(row_key=, column_key=)) >>> Fold() method=None
+CellHighlighted(value="[@click='scroll_button(1)']â–²[/]", coordinate=Coordinate(row=0, column=0), cell_key=CellKey(row_key=, column_key=)) >>> Fold() method=None
+CellHighlighted(value=' 0chr / ', coordinate=Coordinate(row=0, column=0), cell_key=CellKey(row_key=, column_key=)) >>> Fold() method=None
+Update(Horizontal(id='app-grid')) >>> Fold() method=
+Layout() >>> Fold() method=
+Changed(Select(id='selectah'), 'ollama_chat/hf.co/DevQuasar/xwen-team.Xwen-0.5B-Chat-GGUF:f16') >>> Fold() method=None
+StateChanged(, ) >>> Fold() method=None
+StateChanged(