swarm_sdk 2.5.5 → 2.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -377,7 +377,9 @@ module SwarmSDK
377
377
  end
378
378
 
379
379
  # Validate delegation targets exist
380
- config[:delegates_to].each do |delegate|
380
+ # Extract agent names from delegation config (supports both array and hash formats)
381
+ delegate_names = extract_delegate_agent_names(config[:delegates_to])
382
+ delegate_names.each do |delegate|
381
383
  unless @agent_definitions.key?(delegate)
382
384
  raise ConfigurationError,
383
385
  "Node '#{node_name}' agent '#{agent_name}' delegates to undefined agent '#{delegate}'"
@@ -550,5 +552,38 @@ module SwarmSDK
550
552
  "Invalid scratchpad mode: #{value.inspect}. Use :enabled, :per_node, or :disabled"
551
553
  end
552
554
  end
555
+
556
+ # Extract agent names from delegation configuration
557
+ #
558
+ # Handles multiple formats:
559
+ # - Array of symbols: [:frontend, :backend]
560
+ # - Hash: {frontend: "Custom", backend: nil}
561
+ # - Array of hashes: [{agent: :frontend, tool_name: "Custom"}]
562
+ #
563
+ # @param delegation_config [Array, Hash, nil] Delegation configuration
564
+ # @return [Array<Symbol>] Array of agent name symbols
565
+ def extract_delegate_agent_names(delegation_config)
566
+ return [] if delegation_config.nil?
567
+ return [] if delegation_config.respond_to?(:empty?) && delegation_config.empty?
568
+
569
+ case delegation_config
570
+ when Array
571
+ delegation_config.map do |item|
572
+ case item
573
+ when Symbol, String
574
+ item.to_sym
575
+ when Hash
576
+ # Extract agent name from normalized format
577
+ agent_name = item[:agent] || item["agent"]
578
+ agent_name&.to_sym
579
+ end
580
+ end.compact # Remove nils from malformed hashes
581
+ when Hash
582
+ # Hash format: keys are agent names
583
+ delegation_config.keys.map(&:to_sym)
584
+ else
585
+ []
586
+ end
587
+ end
553
588
  end
554
589
  end
data/lib/swarm_sdk.rb CHANGED
@@ -13,6 +13,7 @@ require "set"
13
13
  require "yaml"
14
14
 
15
15
  require "async"
16
+ require "async/barrier"
16
17
  require "async/semaphore"
17
18
  require "ruby_llm"
18
19
  require "ruby_llm/mcp"
@@ -61,6 +62,15 @@ module SwarmSDK
61
62
  class LLMError < Error; end
62
63
  class StateError < Error; end
63
64
 
65
+ # Base class for SwarmSDK timeout errors
66
+ class TimeoutError < Error; end
67
+
68
+ # Raised when swarm execution exceeds execution_timeout
69
+ class ExecutionTimeoutError < TimeoutError; end
70
+
71
+ # Raised when agent turn exceeds turn_timeout
72
+ class TurnTimeoutError < TimeoutError; end
73
+
64
74
  class << self
65
75
  # Get the global configuration instance
66
76
  #
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: swarm_sdk
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.5.5
4
+ version: 2.6.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Paulo Arruda