Class: MCPClient::Task
- Inherits:
-
Object
- Object
- MCPClient::Task
- Defined in:
- lib/mcp_client/task.rb
Overview
Represents an MCP Task for long-running operations with progress tracking Tasks follow the MCP 2025-11-25 specification for structured task management
Task states: pending, running, completed, failed, cancelled
Constant Summary collapse
- VALID_STATES =
Valid task states
%w[pending running completed failed cancelled].freeze
Instance Attribute Summary collapse
-
#id ⇒ Object
readonly
Returns the value of attribute id.
-
#message ⇒ Object
readonly
Returns the value of attribute message.
-
#progress ⇒ Object
readonly
Returns the value of attribute progress.
-
#progress_token ⇒ Object
readonly
Returns the value of attribute progress_token.
-
#result ⇒ Object
readonly
Returns the value of attribute result.
-
#server ⇒ Object
readonly
Returns the value of attribute server.
-
#state ⇒ Object
readonly
Returns the value of attribute state.
-
#total ⇒ Object
readonly
Returns the value of attribute total.
Class Method Summary collapse
-
.from_json(json, server: nil) ⇒ Task
Create a Task from a JSON hash.
Instance Method Summary collapse
-
#==(other) ⇒ Object
(also: #eql?)
Check equality.
-
#active? ⇒ Boolean
Check if task is still active (pending or running).
- #hash ⇒ Object
-
#initialize(id:, state: 'pending', progress_token: nil, progress: nil, total: nil, message: nil, result: nil, server: nil) ⇒ Task
constructor
Create a new Task.
- #inspect ⇒ Object
-
#progress_percentage ⇒ Float?
Calculate progress percentage.
-
#terminal? ⇒ Boolean
Check if task is in a terminal state.
-
#to_h ⇒ Hash
Convert to JSON-serializable hash.
-
#to_json ⇒ String
Convert to JSON string.
-
#to_s ⇒ Object
String representation.
Constructor Details
#initialize(id:, state: 'pending', progress_token: nil, progress: nil, total: nil, message: nil, result: nil, server: nil) ⇒ Task
Create a new Task
23 24 25 26 27 28 29 30 31 32 33 34 |
# File 'lib/mcp_client/task.rb', line 23 def initialize(id:, state: 'pending', progress_token: nil, progress: nil, total: nil, message: nil, result: nil, server: nil) validate_state!(state) @id = id @state = state @progress_token = progress_token @progress = progress @total = total @message = @result = result @server = server end |
Instance Attribute Details
#id ⇒ Object (readonly)
Returns the value of attribute id.
12 13 14 |
# File 'lib/mcp_client/task.rb', line 12 def id @id end |
#message ⇒ Object (readonly)
Returns the value of attribute message.
12 13 14 |
# File 'lib/mcp_client/task.rb', line 12 def @message end |
#progress ⇒ Object (readonly)
Returns the value of attribute progress.
12 13 14 |
# File 'lib/mcp_client/task.rb', line 12 def progress @progress end |
#progress_token ⇒ Object (readonly)
Returns the value of attribute progress_token.
12 13 14 |
# File 'lib/mcp_client/task.rb', line 12 def progress_token @progress_token end |
#result ⇒ Object (readonly)
Returns the value of attribute result.
12 13 14 |
# File 'lib/mcp_client/task.rb', line 12 def result @result end |
#server ⇒ Object (readonly)
Returns the value of attribute server.
12 13 14 |
# File 'lib/mcp_client/task.rb', line 12 def server @server end |
#state ⇒ Object (readonly)
Returns the value of attribute state.
12 13 14 |
# File 'lib/mcp_client/task.rb', line 12 def state @state end |
#total ⇒ Object (readonly)
Returns the value of attribute total.
12 13 14 |
# File 'lib/mcp_client/task.rb', line 12 def total @total end |
Class Method Details
.from_json(json, server: nil) ⇒ Task
Create a Task from a JSON hash
40 41 42 43 44 45 46 47 48 49 50 51 |
# File 'lib/mcp_client/task.rb', line 40 def self.from_json(json, server: nil) new( id: json['id'] || json[:id], state: json['state'] || json[:state] || 'pending', progress_token: json['progressToken'] || json[:progressToken] || json[:progress_token], progress: json['progress'] || json[:progress], total: json['total'] || json[:total], message: json['message'] || json[:message], result: json.key?('result') ? json['result'] : json[:result], server: server ) end |
Instance Method Details
#==(other) ⇒ Object Also known as: eql?
Check equality
92 93 94 95 96 |
# File 'lib/mcp_client/task.rb', line 92 def ==(other) return false unless other.is_a?(Task) id == other.id && state == other.state end |
#active? ⇒ Boolean
Check if task is still active (pending or running)
79 80 81 |
# File 'lib/mcp_client/task.rb', line 79 def active? %w[pending running].include?(@state) end |
#hash ⇒ Object
100 101 102 |
# File 'lib/mcp_client/task.rb', line 100 def hash [id, state].hash end |
#inspect ⇒ Object
112 113 114 |
# File 'lib/mcp_client/task.rb', line 112 def inspect "#<MCPClient::Task id=#{@id.inspect} state=#{@state.inspect}>" end |
#progress_percentage ⇒ Float?
Calculate progress percentage
85 86 87 88 89 |
# File 'lib/mcp_client/task.rb', line 85 def progress_percentage return nil unless @progress && @total&.positive? (@progress.to_f / @total * 100).round(2) end |
#terminal? ⇒ Boolean
Check if task is in a terminal state
73 74 75 |
# File 'lib/mcp_client/task.rb', line 73 def terminal? %w[completed failed cancelled].include?(@state) end |
#to_h ⇒ Hash
Convert to JSON-serializable hash
55 56 57 58 59 60 61 62 63 |
# File 'lib/mcp_client/task.rb', line 55 def to_h result = { 'id' => @id, 'state' => @state } result['progressToken'] = @progress_token if @progress_token result['progress'] = @progress if @progress result['total'] = @total if @total result['message'] = @message if @message result['result'] = @result unless @result.nil? result end |
#to_json ⇒ String
Convert to JSON string
67 68 69 |
# File 'lib/mcp_client/task.rb', line 67 def to_json(*) to_h.to_json(*) end |
#to_s ⇒ Object
String representation
105 106 107 108 109 110 |
# File 'lib/mcp_client/task.rb', line 105 def to_s parts = ["Task[#{@id}]: #{@state}"] parts << "(#{@progress}/#{@total})" if @progress && @total parts << "- #{@message}" if @message parts.join(' ') end |