Module: ClaudeMemory::ActivityLog

Defined in:
lib/claude_memory/activity_log.rb

Overview

Records activity events for debugging and observability. Events are stored in the activity_events table and surfaced via the dashboard and ‘memory.activity` MCP tool.

Class Method Summary collapse

Class Method Details

.recent(store, limit: 50, event_type: nil, since: nil) ⇒ Array<Hash>

Query recent activity events.

Parameters:

  • store (Store::SQLiteStore)

    database to read from

  • limit (Integer) (defaults to: 50)

    max events to return

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

    filter by type

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

    ISO 8601 lower bound

Returns:

  • (Array<Hash>)

    event records with parsed details



47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/claude_memory/activity_log.rb', line 47

def recent(store, limit: 50, event_type: nil, since: nil)
  dataset = store.activity_events.order(Sequel.desc(:occurred_at)).limit(limit)
  dataset = dataset.where(event_type: event_type) if event_type
  dataset = dataset.where { occurred_at >= since } if since

  dataset.all.map do |row|
    row[:details] = row[:detail_json] ? JSON.parse(row[:detail_json], symbolize_names: true) : nil
    row.delete(:detail_json)
    row
  end
rescue => e
  ClaudeMemory.logger.warn("activity_log", message: "Failed to query events", error: e.message)
  []
end

.record(store, event_type:, status:, session_id: nil, duration_ms: nil, details: nil) ⇒ Object

Record an activity event in the given store.

Parameters:

  • store (Store::SQLiteStore)

    database to write to

  • event_type (String)

    e.g. “hook_ingest”, “hook_context”, “recall”

  • status (String)

    “success”, “skipped”, or “error”

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

    Claude session ID

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

    operation duration in milliseconds

  • details (Hash, nil) (defaults to: nil)

    event-specific metadata



20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/claude_memory/activity_log.rb', line 20

def record(store, event_type:, status:, session_id: nil, duration_ms: nil, details: nil)
  store.activity_events.insert(
    event_type: event_type,
    session_id: session_id,
    status: status,
    duration_ms: duration_ms,
    detail_json: details&.to_json,
    occurred_at: Time.now.utc.iso8601
  )
rescue => e
  ClaudeMemory.logger.warn("activity_log",
    message: "Failed to record event",
    event_type: event_type,
    status: status,
    error_class: e.class.name,
    error: e.message,
    backtrace: e.backtrace&.first(3))
  nil
end

.summary(store, since: nil) ⇒ Hash

Summarize activity counts grouped by event_type.

Parameters:

  • store (Store::SQLiteStore)
  • since (String, nil) (defaults to: nil)

    ISO 8601 lower bound

Returns:

  • (Hash)

    e.g. => {success: 5, error: 1, …}



67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
# File 'lib/claude_memory/activity_log.rb', line 67

def summary(store, since: nil)
  dataset = store.activity_events
  dataset = dataset.where { occurred_at >= since } if since

  rows = dataset
    .group_and_count(:event_type, :status)
    .all

  result = {}
  rows.each do |row|
    result[row[:event_type]] ||= {}
    result[row[:event_type]][row[:status].to_sym] = row[:count]
  end
  result
rescue => e
  ClaudeMemory.logger.warn("activity_log", message: "Failed to summarize events", error: e.message)
  {}
end