Class: Girb::SessionHistory
- Inherits:
-
Object
- Object
- Girb::SessionHistory
- Defined in:
- lib/girb/session_history.rb
Overview
IRBセッション中の全入力を行番号付きで管理し、メソッド定義を追跡するクラス
Defined Under Namespace
Instance Attribute Summary collapse
-
#entries ⇒ Object
readonly
Returns the value of attribute entries.
-
#method_definitions ⇒ Object
readonly
Returns the value of attribute method_definitions.
Class Method Summary collapse
- .ai_conversations ⇒ Object
- .all_with_line_numbers ⇒ Object
- .entries ⇒ Object
- .find_by_line(line_no) ⇒ Object
- .find_by_line_range(start_line, end_line) ⇒ Object
- .find_method(name) ⇒ Object
- .get_ai_detail(line_no) ⇒ Object
- .instance ⇒ Object
- .method_definitions ⇒ Object
- .method_index ⇒ Object
-
.record(line_no, code, is_ai_question: false) ⇒ Object
委譲メソッド.
- .record_ai_response(line_no, response, reasoning = nil) ⇒ Object
- .reset! ⇒ Object
Instance Method Summary collapse
-
#ai_conversations ⇒ Object
AI会話の一覧(質問と回答のみ、思考の過程は含まない).
-
#all_with_line_numbers ⇒ Object
全履歴を行番号付きで取得.
-
#find_by_line(line_no) ⇒ Object
特定の行番号のエントリを取得.
-
#find_by_line_range(start_line, end_line) ⇒ Object
行範囲のエントリを取得.
-
#find_method(name) ⇒ Object
メソッド名でメソッド定義を検索.
-
#get_ai_detail(line_no) ⇒ Object
特定の行のAI詳細情報を取得.
-
#initialize ⇒ SessionHistory
constructor
A new instance of SessionHistory.
-
#method_index ⇒ Object
メソッド定義のインデックス(メソッド名: 行範囲).
-
#record(line_no, code, is_ai_question: false) ⇒ Object
IRBからの入力を記録.
-
#record_ai_response(line_no, response, reasoning = nil) ⇒ Object
AI質問への回答と思考の過程を記録.
- #truncate(str, max_length) ⇒ Object
Constructor Details
#initialize ⇒ SessionHistory
Returns a new instance of SessionHistory.
67 68 69 70 71 |
# File 'lib/girb/session_history.rb', line 67 def initialize @entries = [] @method_definitions = [] @pending_method = nil end |
Instance Attribute Details
#entries ⇒ Object (readonly)
Returns the value of attribute entries.
65 66 67 |
# File 'lib/girb/session_history.rb', line 65 def entries @entries end |
#method_definitions ⇒ Object (readonly)
Returns the value of attribute method_definitions.
65 66 67 |
# File 'lib/girb/session_history.rb', line 65 def method_definitions @method_definitions end |
Class Method Details
.ai_conversations ⇒ Object
60 61 62 |
# File 'lib/girb/session_history.rb', line 60 def ai_conversations instance.ai_conversations end |
.all_with_line_numbers ⇒ Object
44 45 46 |
# File 'lib/girb/session_history.rb', line 44 def all_with_line_numbers instance.all_with_line_numbers end |
.entries ⇒ Object
24 25 26 |
# File 'lib/girb/session_history.rb', line 24 def entries instance.entries end |
.find_by_line(line_no) ⇒ Object
32 33 34 |
# File 'lib/girb/session_history.rb', line 32 def find_by_line(line_no) instance.find_by_line(line_no) end |
.find_by_line_range(start_line, end_line) ⇒ Object
36 37 38 |
# File 'lib/girb/session_history.rb', line 36 def find_by_line_range(start_line, end_line) instance.find_by_line_range(start_line, end_line) end |
.find_method(name) ⇒ Object
40 41 42 |
# File 'lib/girb/session_history.rb', line 40 def find_method(name) instance.find_method(name) end |
.get_ai_detail(line_no) ⇒ Object
56 57 58 |
# File 'lib/girb/session_history.rb', line 56 def get_ai_detail(line_no) instance.get_ai_detail(line_no) end |
.instance ⇒ Object
11 12 13 |
# File 'lib/girb/session_history.rb', line 11 def instance @instance ||= new end |
.method_definitions ⇒ Object
28 29 30 |
# File 'lib/girb/session_history.rb', line 28 def method_definitions instance.method_definitions end |
.method_index ⇒ Object
48 49 50 |
# File 'lib/girb/session_history.rb', line 48 def method_index instance.method_index end |
.record(line_no, code, is_ai_question: false) ⇒ Object
委譲メソッド
20 21 22 |
# File 'lib/girb/session_history.rb', line 20 def record(line_no, code, is_ai_question: false) instance.record(line_no, code, is_ai_question: is_ai_question) end |
.record_ai_response(line_no, response, reasoning = nil) ⇒ Object
52 53 54 |
# File 'lib/girb/session_history.rb', line 52 def record_ai_response(line_no, response, reasoning = nil) instance.record_ai_response(line_no, response, reasoning) end |
.reset! ⇒ Object
15 16 17 |
# File 'lib/girb/session_history.rb', line 15 def reset! @instance = new end |
Instance Method Details
#ai_conversations ⇒ Object
AI会話の一覧(質問と回答のみ、思考の過程は含まない)
179 180 181 182 183 184 185 186 187 |
# File 'lib/girb/session_history.rb', line 179 def ai_conversations @entries.select { |e| e.is_ai_question && e.ai_response }.map do |e| { line_no: e.line_no, question: e.code, response: e.ai_response } end end |
#all_with_line_numbers ⇒ Object
全履歴を行番号付きで取得
125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 |
# File 'lib/girb/session_history.rb', line 125 def all_with_line_numbers @entries.map do |e| if e.is_ai_question # AI会話は質問と回答をまとめて表示 response_preview = if e.ai_response truncate(e.ai_response, 100) else "(awaiting response)" end "#{e.line_no}: [USER] #{e.code} => [AI] #{response_preview}" else "#{e.line_no}: #{e.code}" end end end |
#find_by_line(line_no) ⇒ Object
特定の行番号のエントリを取得
109 110 111 |
# File 'lib/girb/session_history.rb', line 109 def find_by_line(line_no) @entries.find { |e| e.line_no == line_no } end |
#find_by_line_range(start_line, end_line) ⇒ Object
行範囲のエントリを取得
114 115 116 |
# File 'lib/girb/session_history.rb', line 114 def find_by_line_range(start_line, end_line) @entries.select { |e| e.line_no >= start_line && e.line_no <= end_line } end |
#find_method(name) ⇒ Object
メソッド名でメソッド定義を検索
119 120 121 122 |
# File 'lib/girb/session_history.rb', line 119 def find_method(name) name = name.to_s @method_definitions.find { |m| m.name == name } end |
#get_ai_detail(line_no) ⇒ Object
特定の行のAI詳細情報を取得
166 167 168 169 170 171 172 173 174 175 176 |
# File 'lib/girb/session_history.rb', line 166 def get_ai_detail(line_no) entry = find_by_line(line_no) return nil unless entry&.ai_response { line_no: entry.line_no, question: entry.code, response: entry.ai_response, reasoning: entry.ai_reasoning } end |
#method_index ⇒ Object
メソッド定義のインデックス(メソッド名: 行範囲)
146 147 148 149 150 151 152 153 154 |
# File 'lib/girb/session_history.rb', line 146 def method_index @method_definitions.map do |m| if m.start_line == m.end_line "#{m.name}: #{m.start_line}行目" else "#{m.name}: #{m.start_line}-#{m.end_line}行目" end end end |
#record(line_no, code, is_ai_question: false) ⇒ Object
IRBからの入力を記録
74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 |
# File 'lib/girb/session_history.rb', line 74 def record(line_no, code, is_ai_question: false) code = code.to_s.chomp entry = Entry.new(line_no: line_no, code: code, method_definition: nil, is_ai_question: is_ai_question) # メソッド定義の開始を検出 if code.match?(/^\s*def\s+\w+/) @pending_method = { start_line: line_no, code_lines: [code] } elsif @pending_method @pending_method[:code_lines] << code # メソッド定義の終了を検出(簡易的なend検出) if code.strip == "end" || code.match?(/^\s*end\s*$/) method_name = extract_method_name(@pending_method[:code_lines].first) full_code = @pending_method[:code_lines].join("\n") method_def = MethodDef.new( name: method_name, start_line: @pending_method[:start_line], end_line: line_no, code: full_code ) @method_definitions << method_def entry.method_definition = method_def @pending_method = nil end end @entries << entry end |
#record_ai_response(line_no, response, reasoning = nil) ⇒ Object
AI質問への回答と思考の過程を記録
157 158 159 160 161 162 163 |
# File 'lib/girb/session_history.rb', line 157 def record_ai_response(line_no, response, reasoning = nil) entry = find_by_line(line_no) return unless entry entry.ai_response = response entry.ai_reasoning = reasoning end |
#truncate(str, max_length) ⇒ Object
141 142 143 |
# File 'lib/girb/session_history.rb', line 141 def truncate(str, max_length) str.length > max_length ? str[0, max_length] + "..." : str end |