Class: Aidp::Harness::OutputFilter

Inherits:
Object
  • Object
show all
Defined in:
lib/aidp/harness/output_filter.rb

Overview

Filters test and linter output to reduce token consumption Uses framework-specific strategies to extract relevant information

Constant Summary collapse

MODES =

Output modes

{
  full: :full,                   # No filtering (default for first run)
  failures_only: :failures_only, # Only failure information
  minimal: :minimal              # Minimal failure info + summary
}.freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(config = {}) ⇒ OutputFilter

Returns a new instance of OutputFilter.

Parameters:

  • config (Hash) (defaults to: {})

    Configuration options

Options Hash (config):

  • :mode (Symbol)

    Output mode (:full, :failures_only, :minimal)

  • :include_context (Boolean)

    Include surrounding lines

  • :context_lines (Integer)

    Number of context lines

  • :max_lines (Integer)

    Maximum output lines



20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# File 'lib/aidp/harness/output_filter.rb', line 20

def initialize(config = {})
  @mode = config[:mode] || :full
  @include_context = config.fetch(:include_context, true)
  @context_lines = config.fetch(:context_lines, 3)
  @max_lines = config.fetch(:max_lines, 500)

  validate_mode!

  Aidp.log_debug("output_filter", "initialized",
    mode: @mode,
    include_context: @include_context,
    max_lines: @max_lines)
rescue NameError
  # Logging infrastructure not available in some tests
end

Instance Attribute Details

#context_linesObject (readonly)

Accessors for strategy use



83
84
85
# File 'lib/aidp/harness/output_filter.rb', line 83

def context_lines
  @context_lines
end

#include_contextObject (readonly)

Accessors for strategy use



83
84
85
# File 'lib/aidp/harness/output_filter.rb', line 83

def include_context
  @include_context
end

#max_linesObject (readonly)

Accessors for strategy use



83
84
85
# File 'lib/aidp/harness/output_filter.rb', line 83

def max_lines
  @max_lines
end

#modeObject (readonly)

Accessors for strategy use



83
84
85
# File 'lib/aidp/harness/output_filter.rb', line 83

def mode
  @mode
end

Instance Method Details

#filter(output, framework: :unknown) ⇒ String

Filter output based on framework and mode

Parameters:

  • output (String)

    Raw output

  • framework (Symbol) (defaults to: :unknown)

    Framework identifier

Returns:

  • (String)

    Filtered output



40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
# File 'lib/aidp/harness/output_filter.rb', line 40

def filter(output, framework: :unknown)
  return output if @mode == :full
  return "" if output.nil? || output.empty?

  Aidp.log_debug("output_filter", "filtering_start",
    framework: framework,
    input_lines: output.lines.count)

  strategy = strategy_for_framework(framework)
  filtered = strategy.filter(output, self)

  truncated = truncate_if_needed(filtered)

  Aidp.log_debug("output_filter", "filtering_complete",
    output_lines: truncated.lines.count,
    reduction: reduction_stats(output, truncated))

  truncated
rescue NameError
  # Logging infrastructure not available
  return output if @mode == :full
  return "" if output.nil? || output.empty?

  strategy = strategy_for_framework(framework)
  filtered = strategy.filter(output, self)
  truncate_if_needed(filtered)
rescue => e
  # External failure - graceful degradation
  begin
    Aidp.log_error("output_filter", "filtering_failed",
      framework: framework,
      mode: @mode,
      error: e.message,
      error_class: e.class.name)
  rescue NameError
    # Logging not available
  end

  # Return original output as fallback
  output
end