Class: Mneme::CompressedViewport

Inherits:
Object
  • Object
show all
Defined in:
lib/mneme/compressed_viewport.rb

Overview

Builds a compressed viewport for Mneme’s LLM context. Mneme sees conversation (user/agent messages and think events) but not mechanical execution (tool calls and responses). Tool calls are compressed to aggregate counters like ‘[4 tools called]`.

The viewport is split into three zones separated by delimiters:

  • **Eviction zone** — events about to leave the viewport (upper third)

  • **Middle zone** — events in the middle of the viewport

  • **Recent zone** — the most recent events (lower third)

Zone boundaries are calculated WITH tool call tokens (they affect position), then tool calls are removed and replaced with counters.

Examples:

viewport = Mneme::CompressedViewport.new(session, token_budget: 60_000)
viewport.render  #=> "── EVICTION ZONE ──\nevent 42 User: ..."

Constant Summary collapse

ZONE_DELIMITERS =
{
  eviction: "── EVICTION ZONE (upper third) ──",
  middle: "── MIDDLE ZONE ──",
  recent: "── RECENT ZONE (lower third) ──"
}.freeze

Instance Method Summary collapse

Constructor Details

#initialize(session, token_budget:, from_event_id: nil) ⇒ CompressedViewport

Returns a new instance of CompressedViewport.

Parameters:

  • session (Session)

    the session to build viewport for

  • token_budget (Integer)

    total tokens available for Mneme’s viewport

  • from_event_id (Integer, nil) (defaults to: nil)

    start from this event ID (inclusive); when nil, uses the session’s full viewport



31
32
33
34
35
# File 'lib/mneme/compressed_viewport.rb', line 31

def initialize(session, token_budget:, from_event_id: nil)
  @session = session
  @token_budget = token_budget
  @from_event_id = from_event_id
end

Instance Method Details

#eventsArray<Event>

Returns the raw events selected for this viewport.

Returns:

  • (Array<Event>)

    the raw events selected for this viewport



48
49
50
# File 'lib/mneme/compressed_viewport.rb', line 48

def events
  @events ||= fetch_events
end

#renderString

Renders the compressed viewport as a string ready for Mneme’s LLM context.

Returns:

  • (String)

    compressed viewport with zone delimiters



40
41
42
43
44
45
# File 'lib/mneme/compressed_viewport.rb', line 40

def render
  return "" if events.empty?

  zones = split_into_zones(events)
  render_zones(zones)
end