Class: Cline::Session

Inherits:
Object
  • Object
show all
Extended by:
Forwardable
Includes:
Cline::Serializable::Dir
Defined in:
lib/cline/session.rb

Overview

A session defined in a directory

Instance Attribute Summary

Attributes included from Cline::Serializable::Dir

#create, #dir

Internal collapse

Methods included from Cline::Serializable::Dir

included, #initialize_from_dir, #subpath

Instance Method Summary collapse

Constructor Details

#initialize(cline_models:) ⇒ Session

Constructor

Parameters:

  • cline_models (Models)

    The Cline models used to interpret the tasks' messages



83
84
85
# File 'lib/cline/session.rb', line 83

def initialize(cline_models:)
  @cline_models = cline_models
end

Instance Method Details

#==(other) ⇒ Boolean

Equality check

Parameters:

  • other (Object)

    The other to check equality with

Returns:

  • (Boolean)

    True if objects are equal



35
36
37
38
39
# File 'lib/cline/session.rb', line 35

def ==(other)
  other.is_a?(Session) &&
    other.data == data &&
    other.messages == messages
end

#data(create: self.create) ⇒ SessionData?

Get the session's data

Parameters:

  • create (Boolean) (defaults to: self.create)

    Should the data be created if it does not exist?

Returns:

  • (SessionData, nil)

    The session's data, or nil if none



19
20
21
# File 'lib/cline/session.rb', line 19

def data(create: self.create)
  @data ||= SessionData.from_cline_data(dir, create:)
end

#messages(create: self.create) ⇒ SessionMessages?

Get the session's messages

Parameters:

  • create (Boolean) (defaults to: self.create)

    Should the messages be created if they don't exist?

Returns:



27
28
29
# File 'lib/cline/session.rb', line 27

def messages(create: self.create)
  @messages ||= SessionMessages.from_cline_data(dir, cline_models: @cline_models, create:)
end

#monitor_messages(on_message:, monitoring_interval_secs: 1) { ... } ⇒ FileMonitor?

Monitor messages with a callback called when new or updated messages arrive

Parameters:

  • on_message (#call)

    Block called each time there is a new or updated message.

    • Param message [SessionMessage] Message that has happened
    • Param last [Boolean] Is this the last message fetched from the list of messages?
    • Param previous_version [SessionMessage or nil] Previous version of this message if it got updated, or nil if it is a new one
  • monitoring_interval_secs (Float) (defaults to: 1)

    The monitoring interval in seconds

Yields:

  • Optional code called while monitoring is in place. If used then monitoring is stopped at the end of the block's execution.

Returns:

  • (FileMonitor, nil)

    If no block has been given, return the monitor that needs to be stopped by the caller when monitoring should end.



52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# File 'lib/cline/session.rb', line 52

def monitor_messages(on_message:, monitoring_interval_secs: 1, &)
  # Keep messages per timestamp to detect updates
  messages = {}
  SessionMessages.monitor_cline_data_changes(
    dir,
    cline_models: @cline_models,
    on_change: proc do |new_messages|
      # Update the messages we have
      @messages = new_messages
      if new_messages&.messages && !new_messages.messages.empty?
        # Check for updates in all messages
        last_idx = new_messages.messages.size - 1
        new_messages.messages.each.with_index do |message, idx|
          ts = message.ts
          if message != messages[ts]
            on_message.call(message, idx == last_idx, messages[ts])
            messages[ts] = message
          end
        end
      end
    end,
    monitoring_interval_secs:,
    &
  )
end