Module: AiCli::Helpers::Context

Defined in:
lib/aicli/helpers/context.rb

Constant Summary collapse

MAX_MESSAGES =

Keep the last N user/assistant messages across sessions.

40
CONTEXT_FILENAME =
'context'

Class Method Summary collapse

Class Method Details

.apply_to_chat(chat) ⇒ Object



55
56
57
58
59
# File 'lib/aicli/helpers/context.rb', line 55

def apply_to_chat(chat)
  load_messages.each do |message|
    chat.add_message(role: message['role'].to_sym, content: message['content'])
  end
end

.load_messagesObject



20
21
22
23
24
25
26
27
28
29
30
31
32
# File 'lib/aicli/helpers/context.rb', line 20

def load_messages
  Config.ensure_home!
  return [] unless File.file?(path)

  data = JSON.parse(File.read(path))
  Array(data['messages'])
    .select { |m| m.is_a?(Hash) && %w[user assistant].include?(m['role'].to_s) }
    .map { |m| { 'role' => m['role'].to_s, 'content' => m['content'].to_s } }
    .reject { |m| m['content'].strip.empty? }
    .last(MAX_MESSAGES)
rescue StandardError
  []
end

.pathObject



16
17
18
# File 'lib/aicli/helpers/context.rb', line 16

def path
  File.join(Config.home_dir, CONTEXT_FILENAME)
end

.save_from_chat(chat) ⇒ Object



51
52
53
# File 'lib/aicli/helpers/context.rb', line 51

def save_from_chat(chat)
  save_messages(chat.messages)
end

.save_messages(messages) ⇒ Object



34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# File 'lib/aicli/helpers/context.rb', line 34

def save_messages(messages)
  Config.ensure_home!
  normalized = Array(messages)
               .map { |m| normalize_message(m) }
               .compact
               .last(MAX_MESSAGES)

  payload = {
    'version' => 1,
    'updated_at' => Time.now.utc.iso8601,
    'messages' => normalized
  }
  File.write(path, "#{JSON.pretty_generate(payload)}\n")
rescue StandardError
  # Ignore persistence failures; chat should still work.
end

.seed_prompt_history(prompt) ⇒ Object



65
66
67
68
69
70
71
72
73
# File 'lib/aicli/helpers/context.rb', line 65

def seed_prompt_history(prompt)
  return unless prompt.respond_to?(:reader)

  user_prompts.each do |line|
    prompt.reader.add_to_history(line)
  end
rescue StandardError
  nil
end

.user_promptsObject



61
62
63
# File 'lib/aicli/helpers/context.rb', line 61

def user_prompts
  load_messages.select { |m| m['role'] == 'user' }.map { |m| m['content'] }
end