Class: Girb::SessionPersistence

Inherits:
Object
  • Object
show all
Defined in:
lib/girb/session_persistence.rb

Overview

デバッグセッションの会話履歴を永続化するクラス明示的にGirb.debug_sessionを設定した場合のみ保存される

Constant Summary collapse

SESSIONS_DIR =
".girb/sessions"

Class Attribute Summary collapse

Class Method Summary collapse

Class Attribute Details

.current_session_idObject

Returns the value of attribute current_session_id.



13
14
15
# File 'lib/girb/session_persistence.rb', line 13

def current_session_id
  @current_session_id
end

Class Method Details

.clear_sessionObject

現在のセッションをクリア(ファイルも削除)



93
94
95
96
97
98
99
100
# File 'lib/girb/session_persistence.rb', line 93

def clear_session
  if @current_session_id
    delete_session(@current_session_id)
    @current_session_id = nil
  end
  ConversationHistory.reset!
  puts "[girb] Session cleared"
end

.delete_session(session_id) ⇒ Object

セッションを削除



120
121
122
123
124
125
126
127
128
129
130
# File 'lib/girb/session_persistence.rb', line 120

def delete_session(session_id)
  file_path = session_file_path(session_id)
  if File.exist?(file_path)
    File.delete(file_path)
    puts "[girb] Session deleted: #{session_id}"
    true
  else
    puts "[girb] Session not found: #{session_id}"
    false
  end
end

.enabled?Boolean

セッションが有効か(明示的にIDが指定されているか)

Returns:

  • (Boolean)


16
17
18
# File 'lib/girb/session_persistence.rb', line 16

def enabled?
  !!Girb.debug_session
end

.list_sessionsObject

セッション一覧を取得



103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
# File 'lib/girb/session_persistence.rb', line 103

def list_sessions
  dir = sessions_dir
  return [] unless Dir.exist?(dir)

  Dir.glob(File.join(dir, "*.json")).map do |file|
    data = JSON.parse(File.read(file), symbolize_names: true)
    {
      id: data[:session_id],
      saved_at: data[:saved_at],
      message_count: data[:messages]&.size || 0
    }
  rescue
    nil
  end.compact
end

.load_session(file_path) ⇒ Object

セッションを読み込み



79
80
81
82
83
84
85
86
87
88
89
90
# File 'lib/girb/session_persistence.rb', line 79

def load_session(file_path)
  data = JSON.parse(File.read(file_path), symbolize_names: true)

  ConversationHistory.reset!
  deserialize_messages(data[:messages])

  message_count = data[:messages]&.size || 0
  puts "[girb] Loaded #{message_count} messages from previous session"
rescue => e
  puts "[girb] Failed to load session: #{e.message}"
  ConversationHistory.reset!
end

.save_sessionObject

セッションを保存



61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# File 'lib/girb/session_persistence.rb', line 61

def save_session
  return unless enabled? && @current_session_id

  file_path = session_file_path(@current_session_id)
  FileUtils.mkdir_p(File.dirname(file_path))

  data = {
    session_id: @current_session_id,
    saved_at: Time.now.to_s,
    messages: serialize_messages
  }

  File.write(file_path, JSON.pretty_generate(data))
rescue => e
  puts "[girb] Failed to save session: #{e.message}"
end

.session_file_path(session_id) ⇒ Object

セッションファイルのパスを取得



37
38
39
# File 'lib/girb/session_persistence.rb', line 37

def session_file_path(session_id)
  File.join(sessions_dir, "#{session_id}.json")
end

.sessions_dirObject

セッションディレクトリを取得(プロジェクトルートから)



21
22
23
24
25
26
27
28
29
30
31
32
33
34
# File 'lib/girb/session_persistence.rb', line 21

def sessions_dir
  # カレントディレクトリから.girbディレクトリを探す
  dir = Dir.pwd
  while dir != "/"
    girb_dir = File.join(dir, ".girb")
    if Dir.exist?(girb_dir)
      return File.join(girb_dir, "sessions")
    end
    dir = File.dirname(dir)
  end

  # 見つからなければカレントディレクトリに作成
  File.join(Dir.pwd, SESSIONS_DIR)
end

.start_sessionObject

セッションを開始(既存があれば読み込み)Girb.debug_sessionが設定されている場合のみ有効



43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'lib/girb/session_persistence.rb', line 43

def start_session
  return unless enabled?

  @current_session_id = Girb.debug_session

  file_path = session_file_path(@current_session_id)
  if File.exist?(file_path)
    load_session(file_path)
    puts "[girb] Resumed session: #{@current_session_id}"
  else
    ConversationHistory.reset!
    puts "[girb] New session: #{@current_session_id}"
  end

  @current_session_id
end