11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
|
# File 'lib/aicli/commands/chat.rb', line 11
def run
config = Helpers::Config.get
chat = Helpers::Completion.start_chat(config)
restored = Helpers::Context.load_messages
Helpers::Context.apply_to_chat(chat) if restored.any?
prompt = Helpers::Theme.prompt(interrupt: :error)
Helpers::Context.seed_prompt_history(prompt)
puts ''
puts "#{Helpers::Theme.status(config)} #{Helpers::Theme.dim('Ctrl+d to quit')}"
catch(:chat_quit) do
prompt.on(:keyctrl_d) { throw :chat_quit }
loop do
begin
user_prompt = prompt.ask(Helpers::Theme.accent("#{Helpers::I18n.t('You')}:")) do |q|
q.required true
q.validate(/.+/, Helpers::I18n.t('Please enter a prompt.'))
end
rescue TTY::Reader::InputInterrupt
print "\r\e[2K"
next
end
throw :chat_quit if user_prompt.nil? || user_prompt.strip.downcase == 'exit'
spinner = TTY::Spinner.new("[:spinner] #{Helpers::I18n.t('THINKING...')}", format: :dots)
spinner.auto_spin
started = false
response = Helpers::Completion.stream_chat_message(
chat,
user_prompt,
writer: lambda { |chunk|
unless started
spinner.success(Helpers::Theme.pastel.green('ai:'))
puts ''
started = true
end
print chunk
}
)
unless started
spinner.success(Helpers::Theme.pastel.green('ai:'))
puts ''
end
puts "\n\n"
Helpers::Context.save_from_chat(chat)
offer_to_run_commands(response)
end
end
Helpers::Context.save_from_chat(chat)
puts ''
puts Helpers::I18n.t('Goodbye!')
end
|