swarm_sdk 2.7.14 → 3.0.0.alpha1
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.
- checksums.yaml +4 -4
- data/lib/swarm_sdk/ruby_llm_patches/chat_callbacks_patch.rb +16 -0
- data/lib/swarm_sdk/ruby_llm_patches/init.rb +4 -1
- data/lib/swarm_sdk/v3/agent.rb +1165 -0
- data/lib/swarm_sdk/v3/agent_builder.rb +533 -0
- data/lib/swarm_sdk/v3/agent_definition.rb +330 -0
- data/lib/swarm_sdk/v3/configuration.rb +490 -0
- data/lib/swarm_sdk/v3/debug_log.rb +86 -0
- data/lib/swarm_sdk/v3/event_stream.rb +130 -0
- data/lib/swarm_sdk/v3/hooks/context.rb +112 -0
- data/lib/swarm_sdk/v3/hooks/result.rb +115 -0
- data/lib/swarm_sdk/v3/hooks/runner.rb +128 -0
- data/lib/swarm_sdk/v3/mcp/connector.rb +183 -0
- data/lib/swarm_sdk/v3/mcp/mcp_error.rb +15 -0
- data/lib/swarm_sdk/v3/mcp/server_definition.rb +125 -0
- data/lib/swarm_sdk/v3/mcp/ssl_http_transport.rb +103 -0
- data/lib/swarm_sdk/v3/mcp/stdio_transport.rb +135 -0
- data/lib/swarm_sdk/v3/mcp/tool_proxy.rb +53 -0
- data/lib/swarm_sdk/v3/memory/adapters/base.rb +297 -0
- data/lib/swarm_sdk/v3/memory/adapters/faiss_support.rb +194 -0
- data/lib/swarm_sdk/v3/memory/adapters/filesystem_adapter.rb +212 -0
- data/lib/swarm_sdk/v3/memory/adapters/sqlite_adapter.rb +507 -0
- data/lib/swarm_sdk/v3/memory/adapters/vector_utils.rb +88 -0
- data/lib/swarm_sdk/v3/memory/card.rb +206 -0
- data/lib/swarm_sdk/v3/memory/cluster.rb +146 -0
- data/lib/swarm_sdk/v3/memory/compressor.rb +496 -0
- data/lib/swarm_sdk/v3/memory/consolidator.rb +427 -0
- data/lib/swarm_sdk/v3/memory/context_builder.rb +339 -0
- data/lib/swarm_sdk/v3/memory/edge.rb +105 -0
- data/lib/swarm_sdk/v3/memory/embedder.rb +185 -0
- data/lib/swarm_sdk/v3/memory/exposure_tracker.rb +104 -0
- data/lib/swarm_sdk/v3/memory/ingestion_pipeline.rb +394 -0
- data/lib/swarm_sdk/v3/memory/retriever.rb +289 -0
- data/lib/swarm_sdk/v3/memory/store.rb +489 -0
- data/lib/swarm_sdk/v3/skills/loader.rb +147 -0
- data/lib/swarm_sdk/v3/skills/manifest.rb +45 -0
- data/lib/swarm_sdk/v3/sub_task_agent.rb +248 -0
- data/lib/swarm_sdk/v3/tools/base.rb +80 -0
- data/lib/swarm_sdk/v3/tools/bash.rb +174 -0
- data/lib/swarm_sdk/v3/tools/clock.rb +32 -0
- data/lib/swarm_sdk/v3/tools/edit.rb +111 -0
- data/lib/swarm_sdk/v3/tools/glob.rb +96 -0
- data/lib/swarm_sdk/v3/tools/grep.rb +200 -0
- data/lib/swarm_sdk/v3/tools/message_teammate.rb +15 -0
- data/lib/swarm_sdk/v3/tools/message_user.rb +15 -0
- data/lib/swarm_sdk/v3/tools/read.rb +181 -0
- data/lib/swarm_sdk/v3/tools/read_tracker.rb +40 -0
- data/lib/swarm_sdk/v3/tools/registry.rb +208 -0
- data/lib/swarm_sdk/v3/tools/sub_task.rb +183 -0
- data/lib/swarm_sdk/v3/tools/think.rb +88 -0
- data/lib/swarm_sdk/v3/tools/write.rb +87 -0
- data/lib/swarm_sdk/v3.rb +145 -0
- metadata +83 -148
- data/lib/swarm_sdk/agent/RETRY_LOGIC.md +0 -175
- data/lib/swarm_sdk/agent/builder.rb +0 -705
- data/lib/swarm_sdk/agent/chat.rb +0 -1438
- data/lib/swarm_sdk/agent/chat_helpers/context_tracker.rb +0 -375
- data/lib/swarm_sdk/agent/chat_helpers/event_emitter.rb +0 -204
- data/lib/swarm_sdk/agent/chat_helpers/hook_integration.rb +0 -480
- data/lib/swarm_sdk/agent/chat_helpers/instrumentation.rb +0 -85
- data/lib/swarm_sdk/agent/chat_helpers/llm_configuration.rb +0 -290
- data/lib/swarm_sdk/agent/chat_helpers/logging_helpers.rb +0 -116
- data/lib/swarm_sdk/agent/chat_helpers/serialization.rb +0 -83
- data/lib/swarm_sdk/agent/chat_helpers/system_reminder_injector.rb +0 -134
- data/lib/swarm_sdk/agent/chat_helpers/system_reminders.rb +0 -79
- data/lib/swarm_sdk/agent/chat_helpers/token_tracking.rb +0 -146
- data/lib/swarm_sdk/agent/context.rb +0 -115
- data/lib/swarm_sdk/agent/context_manager.rb +0 -315
- data/lib/swarm_sdk/agent/definition.rb +0 -588
- data/lib/swarm_sdk/agent/llm_instrumentation_middleware.rb +0 -226
- data/lib/swarm_sdk/agent/system_prompt_builder.rb +0 -173
- data/lib/swarm_sdk/agent/tool_registry.rb +0 -189
- data/lib/swarm_sdk/agent_registry.rb +0 -146
- data/lib/swarm_sdk/builders/base_builder.rb +0 -558
- data/lib/swarm_sdk/claude_code_agent_adapter.rb +0 -205
- data/lib/swarm_sdk/concerns/cleanupable.rb +0 -42
- data/lib/swarm_sdk/concerns/snapshotable.rb +0 -67
- data/lib/swarm_sdk/concerns/validatable.rb +0 -55
- data/lib/swarm_sdk/config.rb +0 -368
- data/lib/swarm_sdk/configuration/parser.rb +0 -397
- data/lib/swarm_sdk/configuration/translator.rb +0 -285
- data/lib/swarm_sdk/configuration.rb +0 -165
- data/lib/swarm_sdk/context_compactor/metrics.rb +0 -147
- data/lib/swarm_sdk/context_compactor/token_counter.rb +0 -102
- data/lib/swarm_sdk/context_compactor.rb +0 -335
- data/lib/swarm_sdk/context_management/builder.rb +0 -128
- data/lib/swarm_sdk/context_management/context.rb +0 -328
- data/lib/swarm_sdk/custom_tool_registry.rb +0 -226
- data/lib/swarm_sdk/defaults.rb +0 -251
- data/lib/swarm_sdk/events_to_messages.rb +0 -199
- data/lib/swarm_sdk/hooks/adapter.rb +0 -359
- data/lib/swarm_sdk/hooks/context.rb +0 -197
- data/lib/swarm_sdk/hooks/definition.rb +0 -80
- data/lib/swarm_sdk/hooks/error.rb +0 -29
- data/lib/swarm_sdk/hooks/executor.rb +0 -146
- data/lib/swarm_sdk/hooks/registry.rb +0 -147
- data/lib/swarm_sdk/hooks/result.rb +0 -150
- data/lib/swarm_sdk/hooks/shell_executor.rb +0 -256
- data/lib/swarm_sdk/hooks/tool_call.rb +0 -35
- data/lib/swarm_sdk/hooks/tool_result.rb +0 -62
- data/lib/swarm_sdk/log_collector.rb +0 -227
- data/lib/swarm_sdk/log_stream.rb +0 -127
- data/lib/swarm_sdk/markdown_parser.rb +0 -75
- data/lib/swarm_sdk/model_aliases.json +0 -8
- data/lib/swarm_sdk/models.json +0 -44002
- data/lib/swarm_sdk/models.rb +0 -161
- data/lib/swarm_sdk/node_context.rb +0 -245
- data/lib/swarm_sdk/observer/builder.rb +0 -81
- data/lib/swarm_sdk/observer/config.rb +0 -45
- data/lib/swarm_sdk/observer/manager.rb +0 -248
- data/lib/swarm_sdk/patterns/agent_observer.rb +0 -160
- data/lib/swarm_sdk/permissions/config.rb +0 -239
- data/lib/swarm_sdk/permissions/error_formatter.rb +0 -121
- data/lib/swarm_sdk/permissions/path_matcher.rb +0 -35
- data/lib/swarm_sdk/permissions/validator.rb +0 -173
- data/lib/swarm_sdk/permissions_builder.rb +0 -122
- data/lib/swarm_sdk/plugin.rb +0 -309
- data/lib/swarm_sdk/plugin_registry.rb +0 -101
- data/lib/swarm_sdk/proc_helpers.rb +0 -53
- data/lib/swarm_sdk/prompts/base_system_prompt.md.erb +0 -119
- data/lib/swarm_sdk/restore_result.rb +0 -65
- data/lib/swarm_sdk/result.rb +0 -241
- data/lib/swarm_sdk/snapshot.rb +0 -156
- data/lib/swarm_sdk/snapshot_from_events.rb +0 -397
- data/lib/swarm_sdk/state_restorer.rb +0 -476
- data/lib/swarm_sdk/state_snapshot.rb +0 -334
- data/lib/swarm_sdk/swarm/agent_initializer.rb +0 -648
- data/lib/swarm_sdk/swarm/all_agents_builder.rb +0 -204
- data/lib/swarm_sdk/swarm/builder.rb +0 -256
- data/lib/swarm_sdk/swarm/executor.rb +0 -446
- data/lib/swarm_sdk/swarm/hook_triggers.rb +0 -162
- data/lib/swarm_sdk/swarm/lazy_delegate_chat.rb +0 -372
- data/lib/swarm_sdk/swarm/logging_callbacks.rb +0 -361
- data/lib/swarm_sdk/swarm/mcp_configurator.rb +0 -290
- data/lib/swarm_sdk/swarm/swarm_registry_builder.rb +0 -67
- data/lib/swarm_sdk/swarm/tool_configurator.rb +0 -392
- data/lib/swarm_sdk/swarm.rb +0 -973
- data/lib/swarm_sdk/swarm_loader.rb +0 -145
- data/lib/swarm_sdk/swarm_registry.rb +0 -136
- data/lib/swarm_sdk/tools/base.rb +0 -63
- data/lib/swarm_sdk/tools/bash.rb +0 -280
- data/lib/swarm_sdk/tools/clock.rb +0 -46
- data/lib/swarm_sdk/tools/delegate.rb +0 -389
- data/lib/swarm_sdk/tools/document_converters/base_converter.rb +0 -83
- data/lib/swarm_sdk/tools/document_converters/docx_converter.rb +0 -99
- data/lib/swarm_sdk/tools/document_converters/html_converter.rb +0 -101
- data/lib/swarm_sdk/tools/document_converters/pdf_converter.rb +0 -78
- data/lib/swarm_sdk/tools/document_converters/xlsx_converter.rb +0 -194
- data/lib/swarm_sdk/tools/edit.rb +0 -145
- data/lib/swarm_sdk/tools/glob.rb +0 -166
- data/lib/swarm_sdk/tools/grep.rb +0 -235
- data/lib/swarm_sdk/tools/image_extractors/docx_image_extractor.rb +0 -43
- data/lib/swarm_sdk/tools/image_extractors/pdf_image_extractor.rb +0 -167
- data/lib/swarm_sdk/tools/image_formats/tiff_builder.rb +0 -65
- data/lib/swarm_sdk/tools/mcp_tool_stub.rb +0 -198
- data/lib/swarm_sdk/tools/multi_edit.rb +0 -236
- data/lib/swarm_sdk/tools/path_resolver.rb +0 -92
- data/lib/swarm_sdk/tools/read.rb +0 -261
- data/lib/swarm_sdk/tools/registry.rb +0 -205
- data/lib/swarm_sdk/tools/scratchpad/scratchpad_list.rb +0 -117
- data/lib/swarm_sdk/tools/scratchpad/scratchpad_read.rb +0 -97
- data/lib/swarm_sdk/tools/scratchpad/scratchpad_write.rb +0 -108
- data/lib/swarm_sdk/tools/stores/read_tracker.rb +0 -96
- data/lib/swarm_sdk/tools/stores/scratchpad_storage.rb +0 -273
- data/lib/swarm_sdk/tools/stores/storage.rb +0 -142
- data/lib/swarm_sdk/tools/stores/todo_manager.rb +0 -65
- data/lib/swarm_sdk/tools/think.rb +0 -100
- data/lib/swarm_sdk/tools/todo_write.rb +0 -237
- data/lib/swarm_sdk/tools/web_fetch.rb +0 -264
- data/lib/swarm_sdk/tools/write.rb +0 -112
- data/lib/swarm_sdk/transcript_builder.rb +0 -278
- data/lib/swarm_sdk/utils.rb +0 -68
- data/lib/swarm_sdk/validation_result.rb +0 -33
- data/lib/swarm_sdk/version.rb +0 -5
- data/lib/swarm_sdk/workflow/agent_config.rb +0 -95
- data/lib/swarm_sdk/workflow/builder.rb +0 -227
- data/lib/swarm_sdk/workflow/executor.rb +0 -497
- data/lib/swarm_sdk/workflow/node_builder.rb +0 -593
- data/lib/swarm_sdk/workflow/transformer_executor.rb +0 -250
- data/lib/swarm_sdk/workflow.rb +0 -589
- data/lib/swarm_sdk.rb +0 -721
|
@@ -1,227 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module SwarmSDK
|
|
4
|
-
class Workflow
|
|
5
|
-
# Builder provides DSL for building multi-node workflows
|
|
6
|
-
# This is the top-level builder accessed via SwarmSDK.workflow
|
|
7
|
-
#
|
|
8
|
-
# The DSL enables:
|
|
9
|
-
# - Node-based workflow configuration
|
|
10
|
-
# - Agent delegation per node
|
|
11
|
-
# - Input/output transformers for data flow
|
|
12
|
-
# - Context preservation across nodes
|
|
13
|
-
#
|
|
14
|
-
# @example Multi-stage workflow
|
|
15
|
-
# workflow = SwarmSDK.workflow do
|
|
16
|
-
# name "Build Pipeline"
|
|
17
|
-
# start_node :planning
|
|
18
|
-
#
|
|
19
|
-
# agent :architect do
|
|
20
|
-
# model "gpt-5"
|
|
21
|
-
# prompt "You design systems"
|
|
22
|
-
# end
|
|
23
|
-
#
|
|
24
|
-
# agent :coder do
|
|
25
|
-
# model "gpt-4"
|
|
26
|
-
# prompt "You implement code"
|
|
27
|
-
# end
|
|
28
|
-
#
|
|
29
|
-
# node :planning do
|
|
30
|
-
# agent(:architect)
|
|
31
|
-
# end
|
|
32
|
-
#
|
|
33
|
-
# node :implementation do
|
|
34
|
-
# agent(:coder)
|
|
35
|
-
# depends_on :planning
|
|
36
|
-
# end
|
|
37
|
-
# end
|
|
38
|
-
#
|
|
39
|
-
# workflow.execute("Build auth system")
|
|
40
|
-
class Builder < Builders::BaseBuilder
|
|
41
|
-
# Main entry point for DSL
|
|
42
|
-
#
|
|
43
|
-
# @example
|
|
44
|
-
# workflow = SwarmSDK.workflow do
|
|
45
|
-
# name "Pipeline"
|
|
46
|
-
# start_node :planning
|
|
47
|
-
# node(:planning) { agent(:architect) }
|
|
48
|
-
# end
|
|
49
|
-
class << self
|
|
50
|
-
def build(allow_filesystem_tools: nil, &block)
|
|
51
|
-
builder = new(allow_filesystem_tools: allow_filesystem_tools)
|
|
52
|
-
builder.instance_eval(&block)
|
|
53
|
-
builder.build_swarm
|
|
54
|
-
end
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
def initialize(allow_filesystem_tools: nil)
|
|
58
|
-
super
|
|
59
|
-
@nodes = {}
|
|
60
|
-
@start_node = nil
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
# Define a node (mini-swarm execution stage)
|
|
64
|
-
#
|
|
65
|
-
# Nodes enable multi-stage workflows where different agent teams
|
|
66
|
-
# collaborate in sequence. Each node is an independent swarm execution.
|
|
67
|
-
#
|
|
68
|
-
# @param name [Symbol] Node name
|
|
69
|
-
# @yield Block for node configuration
|
|
70
|
-
# @return [void]
|
|
71
|
-
#
|
|
72
|
-
# @example Solo agent node
|
|
73
|
-
# node :planning do
|
|
74
|
-
# agent(:architect)
|
|
75
|
-
# end
|
|
76
|
-
#
|
|
77
|
-
# @example Multi-agent node with delegation
|
|
78
|
-
# node :implementation do
|
|
79
|
-
# agent(:backend).delegates_to(:tester, :database)
|
|
80
|
-
# agent(:tester).delegates_to(:database)
|
|
81
|
-
# agent(:database)
|
|
82
|
-
# depends_on :planning
|
|
83
|
-
# end
|
|
84
|
-
def node(name, &block)
|
|
85
|
-
builder = Workflow::NodeBuilder.new(name)
|
|
86
|
-
builder.instance_eval(&block)
|
|
87
|
-
@nodes[name] = builder
|
|
88
|
-
end
|
|
89
|
-
|
|
90
|
-
# Set the starting node for workflow execution
|
|
91
|
-
#
|
|
92
|
-
# Required when nodes are defined. Specifies which node to execute first.
|
|
93
|
-
#
|
|
94
|
-
# @param name [Symbol] Name of starting node
|
|
95
|
-
# @return [void]
|
|
96
|
-
#
|
|
97
|
-
# @example
|
|
98
|
-
# start_node :planning
|
|
99
|
-
def start_node(name)
|
|
100
|
-
@start_node = name.to_sym
|
|
101
|
-
end
|
|
102
|
-
|
|
103
|
-
# Build the actual Workflow instance
|
|
104
|
-
def build_swarm # Returns Workflow despite method name
|
|
105
|
-
raise ConfigurationError, "Workflow name not set. Use: name 'My Workflow'" unless @swarm_name
|
|
106
|
-
raise ConfigurationError, "No nodes defined. Use: node :name { ... }" if @nodes.empty?
|
|
107
|
-
raise ConfigurationError, "start_node not set. Use: start_node :name" unless @start_node
|
|
108
|
-
|
|
109
|
-
# Validate filesystem tools BEFORE building
|
|
110
|
-
validate_all_agents_filesystem_tools if @all_agents_config
|
|
111
|
-
validate_agent_filesystem_tools
|
|
112
|
-
|
|
113
|
-
build_workflow
|
|
114
|
-
end
|
|
115
|
-
|
|
116
|
-
private
|
|
117
|
-
|
|
118
|
-
# Build a node-based workflow
|
|
119
|
-
#
|
|
120
|
-
# @return [Workflow] Configured workflow instance
|
|
121
|
-
def build_workflow
|
|
122
|
-
# Resolve any missing agents from global registry before building definitions
|
|
123
|
-
resolve_missing_agents_from_registry
|
|
124
|
-
|
|
125
|
-
# Build agent definitions
|
|
126
|
-
agent_definitions = build_agent_definitions
|
|
127
|
-
|
|
128
|
-
# Create workflow
|
|
129
|
-
workflow = Workflow.new(
|
|
130
|
-
swarm_name: @swarm_name,
|
|
131
|
-
swarm_id: @swarm_id,
|
|
132
|
-
agent_definitions: agent_definitions,
|
|
133
|
-
nodes: @nodes,
|
|
134
|
-
start_node: @start_node,
|
|
135
|
-
scratchpad: @scratchpad,
|
|
136
|
-
allow_filesystem_tools: @allow_filesystem_tools,
|
|
137
|
-
)
|
|
138
|
-
|
|
139
|
-
# Pass swarm registry config to workflow if external swarms registered
|
|
140
|
-
workflow.swarm_registry_config = @swarm_registry_config if @swarm_registry_config.any?
|
|
141
|
-
|
|
142
|
-
workflow
|
|
143
|
-
end
|
|
144
|
-
|
|
145
|
-
# Resolve agents referenced in nodes that aren't defined at workflow level
|
|
146
|
-
#
|
|
147
|
-
# For each agent referenced in a node but not defined with `agent :name do ... end`,
|
|
148
|
-
# checks the global AgentRegistry and loads the agent if found.
|
|
149
|
-
#
|
|
150
|
-
# This allows workflows to reference globally registered agents without
|
|
151
|
-
# explicitly re-declaring them at the workflow level.
|
|
152
|
-
#
|
|
153
|
-
# @return [void]
|
|
154
|
-
# @raise [ConfigurationError] If agent not found in workflow or registry
|
|
155
|
-
def resolve_missing_agents_from_registry
|
|
156
|
-
# Collect all agents referenced in nodes
|
|
157
|
-
referenced_agents = collect_referenced_agents
|
|
158
|
-
|
|
159
|
-
# Find agents that aren't defined at workflow level
|
|
160
|
-
defined_agents = @agents.keys
|
|
161
|
-
missing_agents = referenced_agents - defined_agents
|
|
162
|
-
|
|
163
|
-
# Try to resolve each missing agent from the global registry
|
|
164
|
-
missing_agents.each do |agent_name|
|
|
165
|
-
if AgentRegistry.registered?(agent_name)
|
|
166
|
-
# Load from registry (uses same method as BaseBuilder)
|
|
167
|
-
load_agent_from_registry(agent_name)
|
|
168
|
-
else
|
|
169
|
-
raise ConfigurationError,
|
|
170
|
-
"Agent '#{agent_name}' referenced in node but not found. " \
|
|
171
|
-
"Either define at workflow level with `agent :#{agent_name} do ... end` " \
|
|
172
|
-
"or register globally with `SwarmSDK.agent :#{agent_name} do ... end`"
|
|
173
|
-
end
|
|
174
|
-
end
|
|
175
|
-
end
|
|
176
|
-
|
|
177
|
-
# Collect all agent names referenced across all nodes
|
|
178
|
-
#
|
|
179
|
-
# Includes both directly referenced agents and delegation targets.
|
|
180
|
-
#
|
|
181
|
-
# @return [Array<Symbol>] Unique agent names referenced in nodes
|
|
182
|
-
def collect_referenced_agents
|
|
183
|
-
@nodes.values.flat_map do |node_builder|
|
|
184
|
-
# Collect both direct agents and their delegation targets
|
|
185
|
-
node_builder.agent_configs.flat_map do |config|
|
|
186
|
-
# Extract delegate agent names (handles array and hash formats)
|
|
187
|
-
delegate_names = extract_delegate_agent_names(config[:delegates_to] || [])
|
|
188
|
-
[config[:agent]] + delegate_names
|
|
189
|
-
end
|
|
190
|
-
end.uniq
|
|
191
|
-
end
|
|
192
|
-
|
|
193
|
-
# Extract agent names from delegation configuration
|
|
194
|
-
#
|
|
195
|
-
# Handles multiple formats:
|
|
196
|
-
# - Array of symbols: [:frontend, :backend]
|
|
197
|
-
# - Hash: {frontend: "Custom", backend: nil}
|
|
198
|
-
# - Array of hashes: [{agent: :frontend, tool_name: "Custom"}]
|
|
199
|
-
#
|
|
200
|
-
# @param delegation_config [Array, Hash, nil] Delegation configuration
|
|
201
|
-
# @return [Array<Symbol>] Array of agent name symbols
|
|
202
|
-
def extract_delegate_agent_names(delegation_config)
|
|
203
|
-
return [] if delegation_config.nil?
|
|
204
|
-
return [] if delegation_config.respond_to?(:empty?) && delegation_config.empty?
|
|
205
|
-
|
|
206
|
-
case delegation_config
|
|
207
|
-
when Array
|
|
208
|
-
delegation_config.map do |item|
|
|
209
|
-
case item
|
|
210
|
-
when Symbol, String
|
|
211
|
-
item.to_sym
|
|
212
|
-
when Hash
|
|
213
|
-
# Extract agent name from normalized format
|
|
214
|
-
agent_name = item[:agent] || item["agent"]
|
|
215
|
-
agent_name&.to_sym
|
|
216
|
-
end
|
|
217
|
-
end.compact # Remove nils from malformed hashes
|
|
218
|
-
when Hash
|
|
219
|
-
# Hash format: keys are agent names
|
|
220
|
-
delegation_config.keys.map(&:to_sym)
|
|
221
|
-
else
|
|
222
|
-
[]
|
|
223
|
-
end
|
|
224
|
-
end
|
|
225
|
-
end
|
|
226
|
-
end
|
|
227
|
-
end
|