forked from kent/consciousness
salience: client-side pad expansion, drop AppendImage
Mirrors the vLLM-side rewrite. AppendImage is gone; images now ride along on Generate via a parallel `images` list. - Productionize `qwen3_image_token_count` (was test-only). Image leaf computes its IMAGE_PAD count eagerly at construction from height/width; `token_count` is no longer "0 until the server tells us." - WireChunk shrinks to a single `Tokens(Vec<u32>)` variant — vision blocks live inline in the token stream. - `wire_chunks` now returns `(Vec<WireChunk>, Vec<WireImage>)`. `WireImage` carries `pad_start` / `pad_end` (absolute positions in the full walk) alongside bytes + mime. - `assemble_prompt` returns `(chunks, images, match_upto)`. - `stream_session_mm` / `run_session_generate` take the parallel images list, filter to those past `match_upto`, and pass them in `GenerateRequest.images` as `pb::ImageAttachment` entries. - Drop `SessionHandle::append_image`, `ContextState::commit_image_token_counts`, `StreamToken::ImageAppended`, the WireChunk::Image branch in `learn.rs`, and the now-empty `prompt_to_chunks` helper. - Add 'v' toggle on the conscious-screen tree to render token-id vectors in place of text content (debug-aid: lets us see what the server actually has when output is suspicious). - Comment out the subconscious-trigger spawn loop — Kent had this disabled before; it had crept back into running. Co-Authored-By: Proof of Concept <poc@bcachefs.org>
This commit is contained in:
parent
4feebb7bc4
commit
fe232cf292
12 changed files with 468 additions and 306 deletions
|
|
@ -8,11 +8,18 @@ use ratatui::{
|
|||
};
|
||||
use crate::agent::context::{AstNode, Ast, NodeBody};
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
#[derive(Debug, Clone, Default)]
|
||||
pub struct SectionView {
|
||||
pub name: String,
|
||||
pub tokens: usize,
|
||||
pub content: String,
|
||||
/// Token-id stream for this subtree, displayed in place of
|
||||
/// `content` when the tree's show-tokens mode is on. Populated
|
||||
/// from `leaf.token_ids()` / `node.token_ids()` for views built
|
||||
/// from the AST; empty for views that don't have a corresponding
|
||||
/// AST node (subconscious entries, etc.), in which case the
|
||||
/// token view falls back to the text content.
|
||||
pub token_ids: Vec<u32>,
|
||||
pub children: Vec<SectionView>,
|
||||
/// Extra status text shown after the token count.
|
||||
pub status: String,
|
||||
|
|
@ -32,6 +39,7 @@ fn node_to_view(node: &AstNode) -> SectionView {
|
|||
name,
|
||||
tokens: node.tokens(),
|
||||
content: leaf.body().text().to_string(),
|
||||
token_ids: leaf.token_ids().to_vec(),
|
||||
children: Vec::new(),
|
||||
status,
|
||||
}
|
||||
|
|
@ -44,6 +52,7 @@ fn node_to_view(node: &AstNode) -> SectionView {
|
|||
name: node.label(),
|
||||
tokens: node.tokens(),
|
||||
content: String::new(),
|
||||
token_ids: node.token_ids(),
|
||||
children: child_views,
|
||||
status: String::new(),
|
||||
}
|
||||
|
|
@ -54,10 +63,12 @@ fn node_to_view(node: &AstNode) -> SectionView {
|
|||
pub fn section_to_view(name: &str, nodes: &[AstNode]) -> SectionView {
|
||||
let children: Vec<SectionView> = nodes.iter().map(|n| node_to_view(n)).collect();
|
||||
let total_tokens: usize = nodes.iter().map(|n| n.tokens()).sum();
|
||||
let token_ids: Vec<u32> = nodes.iter().flat_map(|n| n.token_ids()).collect();
|
||||
SectionView {
|
||||
name: name.to_string(),
|
||||
tokens: total_tokens,
|
||||
content: String::new(),
|
||||
token_ids,
|
||||
children,
|
||||
status: String::new(),
|
||||
}
|
||||
|
|
@ -104,7 +115,7 @@ pub fn format_ts_age(ts: i64) -> String {
|
|||
/// Key legend for SectionTree panes.
|
||||
pub fn tree_legend() -> Line<'static> {
|
||||
Line::styled(
|
||||
" ↑↓:nav →/Enter:expand ←:collapse e:expand all c:collapse all PgUp/Dn Home/End ",
|
||||
" ↑↓:nav →/Enter:expand ←:collapse e:expand c:collapse v:toggle tokens/text PgUp/Dn ",
|
||||
Style::default().fg(Color::DarkGray),
|
||||
)
|
||||
}
|
||||
|
|
@ -185,11 +196,19 @@ pub struct SectionTree {
|
|||
pub selected: Option<usize>,
|
||||
pub expanded: std::collections::HashSet<usize>,
|
||||
pub scroll: super::scroll_pane::ScrollPaneState,
|
||||
/// When true, render `token_ids` as space-separated IDs in place
|
||||
/// of `content` in expanded panels. Toggled with 'v'.
|
||||
pub show_tokens: bool,
|
||||
}
|
||||
|
||||
impl SectionTree {
|
||||
pub fn new() -> Self {
|
||||
Self { selected: None, expanded: std::collections::HashSet::new(), scroll: super::scroll_pane::ScrollPaneState::new() }
|
||||
Self {
|
||||
selected: None,
|
||||
expanded: std::collections::HashSet::new(),
|
||||
scroll: super::scroll_pane::ScrollPaneState::new(),
|
||||
show_tokens: false,
|
||||
}
|
||||
}
|
||||
|
||||
fn total_nodes(&self, sections: &[SectionView]) -> usize {
|
||||
|
|
@ -264,6 +283,9 @@ impl SectionTree {
|
|||
KeyCode::Char('c') => {
|
||||
self.expanded.clear();
|
||||
}
|
||||
KeyCode::Char('v') => {
|
||||
self.show_tokens = !self.show_tokens;
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
self.scroll_to_selected(height);
|
||||
|
|
@ -326,7 +348,12 @@ impl SectionTree {
|
|||
}
|
||||
} else if has_content {
|
||||
let content_indent = format!("{} │ ", " ".repeat(depth + 1));
|
||||
let content_lines: Vec<&str> = section.content.lines().collect();
|
||||
let body = if self.show_tokens && !section.token_ids.is_empty() {
|
||||
format_token_ids_wrapped(§ion.token_ids)
|
||||
} else {
|
||||
section.content.clone()
|
||||
};
|
||||
let content_lines: Vec<&str> = body.lines().collect();
|
||||
let show = content_lines.len().min(50);
|
||||
for line in &content_lines[..show] {
|
||||
lines.push(Line::styled(
|
||||
|
|
@ -344,3 +371,16 @@ impl SectionTree {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Format token IDs for the content panel: space-separated, wrapped
|
||||
/// at 12 ids per line so they fit comfortably in a pane.
|
||||
fn format_token_ids_wrapped(ids: &[u32]) -> String {
|
||||
let mut out = String::new();
|
||||
for (i, id) in ids.iter().enumerate() {
|
||||
if i > 0 {
|
||||
if i % 12 == 0 { out.push('\n'); } else { out.push(' '); }
|
||||
}
|
||||
out.push_str(&id.to_string());
|
||||
}
|
||||
out
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue