Class: Silas::Session
- Inherits:
-
ApplicationRecord
- Object
- ActiveRecord::Base
- ApplicationRecord
- Silas::Session
- Defined in:
- app/models/silas/session.rb
Constant Summary collapse
- STATUSES =
%w[active archived].freeze
Instance Method Summary collapse
- #active_turn ⇒ Object
-
#continue(input:) ⇒ Object
Enqueue the next turn.
- #pending_approvals ⇒ Object
Instance Method Details
#active_turn ⇒ Object
11 12 13 14 15 |
# File 'app/models/silas/session.rb', line 11 def active_turn # Fresh relation query, never the cached association — callers mix reads # with turn creation in the same objects. turns.where(status: Turn::ACTIVE_STATUSES).order(:index).first end |
#continue(input:) ⇒ Object
Enqueue the next turn. One active turn per session — the partial unique index is the backstop; this is the friendly front door.
23 24 25 26 27 28 29 30 31 32 33 34 |
# File 'app/models/silas/session.rb', line 23 def continue(input:) if active_turn raise TurnInProgressError, "session #{id} already has an active turn (##{active_turn.index})" end next_index = (turns.maximum(:index) || -1) + 1 turn = turns.create!(index: next_index, input: input) AgentLoopJob.perform_later(turn.id) turn rescue ActiveRecord::RecordNotUnique raise TurnInProgressError, "session #{id} already has an active turn" end |
#pending_approvals ⇒ Object
17 18 19 |
# File 'app/models/silas/session.rb', line 17 def pending_approvals ToolInvocation.joins(:turn).where(silas_turns: { session_id: id }, approval_state: "required") end |