Class: RubynCode::Context::Compactor

Inherits:
Object
  • Object
show all
Defined in:
lib/rubyn_code/context/compactor.rb

Overview

Facade that coordinates the three compaction strategies: micro (every turn), auto (when threshold is exceeded), and manual (user-triggered via /compact).

Constant Summary collapse

CHARS_PER_TOKEN =
4

Instance Method Summary collapse

Constructor Details

#initialize(llm_client:, threshold: 50_000, transcript_dir: nil) ⇒ Compactor

Returns a new instance of Compactor.

Parameters:

  • llm_client (#chat, nil)

    LLM client for summarization-based compaction

  • threshold (Integer) (defaults to: 50_000)

    estimated token count that triggers auto-compaction

  • transcript_dir (String, nil) (defaults to: nil)

    directory to persist transcripts before compaction



15
16
17
18
19
# File 'lib/rubyn_code/context/compactor.rb', line 15

def initialize(llm_client:, threshold: 50_000, transcript_dir: nil)
  @llm_client = llm_client
  @threshold = threshold
  @transcript_dir = transcript_dir
end

Instance Method Details

#auto_compact!(messages) ⇒ Array<Hash>

Runs LLM-driven auto-compaction, replacing the full conversation with a continuity summary. Returns a new messages array.

Parameters:

  • messages (Array<Hash>)

    conversation messages

Returns:

  • (Array<Hash>)

    compacted messages (single summary message)

Raises:



36
37
38
39
40
41
42
43
44
# File 'lib/rubyn_code/context/compactor.rb', line 36

def auto_compact!(messages)
  ensure_llm_client!

  AutoCompact.call(
    messages,
    llm_client: @llm_client,
    transcript_dir: @transcript_dir
  )
end

#manual_compact!(messages, focus: nil) ⇒ Array<Hash>

Runs LLM-driven manual compaction, optionally guided by a focus prompt. Returns a new messages array.

Parameters:

  • messages (Array<Hash>)

    conversation messages

  • focus (String, nil) (defaults to: nil)

    optional user-supplied focus to guide summarization

Returns:

  • (Array<Hash>)

    compacted messages (single summary message)

Raises:



53
54
55
56
57
58
59
60
61
62
# File 'lib/rubyn_code/context/compactor.rb', line 53

def manual_compact!(messages, focus: nil)
  ensure_llm_client!

  ManualCompact.call(
    messages,
    llm_client: @llm_client,
    transcript_dir: @transcript_dir,
    focus: focus
  )
end

#micro_compact!(messages) ⇒ Integer

Runs zero-cost micro-compaction on old tool results. Mutates messages in place and returns the count of compacted results.

Parameters:

  • messages (Array<Hash>)

    conversation messages

Returns:

  • (Integer)

    number of tool results compacted



26
27
28
# File 'lib/rubyn_code/context/compactor.rb', line 26

def micro_compact!(messages)
  MicroCompact.call(messages)
end

#should_auto_compact?(messages) ⇒ Boolean

Checks whether the estimated token count for the messages exceeds the configured threshold.

Parameters:

  • messages (Array<Hash>)

    conversation messages

Returns:

  • (Boolean)


69
70
71
# File 'lib/rubyn_code/context/compactor.rb', line 69

def should_auto_compact?(messages)
  estimated_tokens(messages) > @threshold
end