Class: Aidp::Interfaces::ActivityMonitor

Inherits:
Object
  • Object
show all
Includes:
ActivityMonitorInterface
Defined in:
lib/aidp/interfaces/activity_monitor_interface.rb

Overview

ActivityMonitor is the standard implementation that tracks activity state.

Examples:

Basic usage

monitor = ActivityMonitor.new
monitor.start(step_name: "processing", stuck_timeout: 60)
monitor.record_activity("Started processing")
# ... do work ...
monitor.complete
puts monitor.summary

Constant Summary collapse

DEFAULT_STUCK_TIMEOUT =
30

Constants included from ActivityMonitorInterface

Aidp::Interfaces::ActivityMonitorInterface::STATES

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(logger: nil) ⇒ ActivityMonitor

Returns a new instance of ActivityMonitor.



154
155
156
157
158
159
160
161
162
163
# File 'lib/aidp/interfaces/activity_monitor_interface.rb', line 154

def initialize(logger: nil)
  @logger = logger
  @state = :idle
  @start_time = nil
  @last_activity_time = nil
  @stuck_timeout = DEFAULT_STUCK_TIMEOUT
  @step_name = nil
  @on_state_change = nil
  @output_count = 0
end

Instance Attribute Details

#stateObject (readonly)

Returns the value of attribute state.



150
151
152
# File 'lib/aidp/interfaces/activity_monitor_interface.rb', line 150

def state
  @state
end

Instance Method Details

#completeObject



182
183
184
185
# File 'lib/aidp/interfaces/activity_monitor_interface.rb', line 182

def complete
  update_state(:completed)
  log_debug("completed", elapsed_time: elapsed_time, output_count: @output_count)
end

#elapsed_timeObject



205
206
207
208
# File 'lib/aidp/interfaces/activity_monitor_interface.rb', line 205

def elapsed_time
  return 0.0 unless @start_time
  Time.now - @start_time
end

#fail(error_message = nil) ⇒ Object



187
188
189
190
# File 'lib/aidp/interfaces/activity_monitor_interface.rb', line 187

def fail(error_message = nil)
  update_state(:failed, error_message)
  log_debug("failed", error_message: error_message, elapsed_time: elapsed_time)
end

#record_activity(message = nil) ⇒ Object



176
177
178
179
180
# File 'lib/aidp/interfaces/activity_monitor_interface.rb', line 176

def record_activity(message = nil)
  @output_count += 1
  @last_activity_time = Time.now
  update_state(:working, message)
end

#start(step_name:, stuck_timeout: DEFAULT_STUCK_TIMEOUT, on_state_change: nil) ⇒ Object



165
166
167
168
169
170
171
172
173
174
# File 'lib/aidp/interfaces/activity_monitor_interface.rb', line 165

def start(step_name:, stuck_timeout: DEFAULT_STUCK_TIMEOUT, on_state_change: nil)
  @step_name = step_name
  @stuck_timeout = stuck_timeout
  @on_state_change = on_state_change
  @start_time = Time.now
  @last_activity_time = @start_time
  @output_count = 0
  update_state(:working)
  log_debug("started", step_name: step_name, stuck_timeout: stuck_timeout)
end

#stuck?Boolean

Returns:

  • (Boolean)


192
193
194
195
196
197
198
199
200
201
202
203
# File 'lib/aidp/interfaces/activity_monitor_interface.rb', line 192

def stuck?
  return false unless @state == :working
  return false if @last_activity_time.nil?

  seconds_since_activity = Time.now - @last_activity_time
  if seconds_since_activity > @stuck_timeout
    update_state(:stuck, "No activity for #{seconds_since_activity.round}s")
    true
  else
    false
  end
end

#summaryObject



210
211
212
213
214
215
216
217
218
219
# File 'lib/aidp/interfaces/activity_monitor_interface.rb', line 210

def summary
  {
    step_name: @step_name,
    state: @state,
    start_time: @start_time&.iso8601,
    elapsed_time: elapsed_time.round(2),
    stuck_detected: @state == :stuck,
    output_count: @output_count
  }
end