swarm_sdk 2.7.13 → 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 +43 -22
- data/lib/swarm_sdk/ruby_llm_patches/init.rb +6 -0
- data/lib/swarm_sdk/ruby_llm_patches/mcp_ssl_patch.rb +144 -0
- data/lib/swarm_sdk/ruby_llm_patches/tool_concurrency_patch.rb +3 -4
- 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 +84 -148
- data/lib/swarm_sdk/agent/RETRY_LOGIC.md +0 -175
- data/lib/swarm_sdk/agent/builder.rb +0 -680
- data/lib/swarm_sdk/agent/chat.rb +0 -1432
- 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 -581
- data/lib/swarm_sdk/agent/llm_instrumentation_middleware.rb +0 -226
- data/lib/swarm_sdk/agent/system_prompt_builder.rb +0 -161
- 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 -553
- data/lib/swarm_sdk/claude_code_agent_adapter.rb +0 -205
- data/lib/swarm_sdk/concerns/cleanupable.rb +0 -39
- 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 -367
- data/lib/swarm_sdk/configuration/parser.rb +0 -397
- data/lib/swarm_sdk/configuration/translator.rb +0 -283
- 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 -236
- 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 -117
- data/lib/swarm_sdk/restore_result.rb +0 -65
- data/lib/swarm_sdk/result.rb +0 -212
- 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 -195
- data/lib/swarm_sdk/swarm/builder.rb +0 -256
- data/lib/swarm_sdk/swarm/executor.rb +0 -290
- data/lib/swarm_sdk/swarm/hook_triggers.rb +0 -151
- data/lib/swarm_sdk/swarm/lazy_delegate_chat.rb +0 -372
- data/lib/swarm_sdk/swarm/logging_callbacks.rb +0 -360
- data/lib/swarm_sdk/swarm/mcp_configurator.rb +0 -270
- 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 -843
- 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 -718
|
@@ -1,372 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module SwarmSDK
|
|
4
|
-
class Swarm
|
|
5
|
-
# Lazy loader for delegation agent chats
|
|
6
|
-
#
|
|
7
|
-
# Instead of creating delegation instances eagerly at swarm initialization,
|
|
8
|
-
# this class defers creation until the first delegation call. This improves
|
|
9
|
-
# initialization performance for swarms where not all agents are used.
|
|
10
|
-
#
|
|
11
|
-
# Thread-safe via Mutex - safe for concurrent access.
|
|
12
|
-
#
|
|
13
|
-
# @example
|
|
14
|
-
# lazy_chat = LazyDelegateChat.new(
|
|
15
|
-
# instance_name: "backend@frontend",
|
|
16
|
-
# base_name: :backend,
|
|
17
|
-
# agent_definition: backend_def,
|
|
18
|
-
# swarm: swarm
|
|
19
|
-
# )
|
|
20
|
-
#
|
|
21
|
-
# # Later, when delegation is first called:
|
|
22
|
-
# chat = lazy_chat.chat # Creates agent on first access
|
|
23
|
-
# chat.ask("Do something")
|
|
24
|
-
class LazyDelegateChat
|
|
25
|
-
attr_reader :instance_name, :base_name, :agent_definition
|
|
26
|
-
|
|
27
|
-
# Initialize a lazy delegate chat wrapper
|
|
28
|
-
#
|
|
29
|
-
# @param instance_name [String] Unique instance name ("base@delegator")
|
|
30
|
-
# @param base_name [Symbol] Base agent name (for definition lookup)
|
|
31
|
-
# @param agent_definition [Agent::Definition] Agent definition
|
|
32
|
-
# @param swarm [Swarm] Parent swarm reference
|
|
33
|
-
def initialize(instance_name:, base_name:, agent_definition:, swarm:)
|
|
34
|
-
@instance_name = instance_name
|
|
35
|
-
@base_name = base_name
|
|
36
|
-
@agent_definition = agent_definition
|
|
37
|
-
@swarm = swarm
|
|
38
|
-
@chat = nil
|
|
39
|
-
@mutex = Mutex.new
|
|
40
|
-
@initialized = false
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
# Get or create the agent chat instance
|
|
44
|
-
#
|
|
45
|
-
# On first call, creates the agent chat and runs initialization.
|
|
46
|
-
# Subsequent calls return the cached instance.
|
|
47
|
-
#
|
|
48
|
-
# @return [Agent::Chat] The initialized chat instance
|
|
49
|
-
def chat
|
|
50
|
-
return @chat if @initialized
|
|
51
|
-
|
|
52
|
-
@mutex.synchronize do
|
|
53
|
-
return @chat if @initialized
|
|
54
|
-
|
|
55
|
-
@chat = initialize_chat
|
|
56
|
-
@initialized = true
|
|
57
|
-
@chat
|
|
58
|
-
end
|
|
59
|
-
end
|
|
60
|
-
|
|
61
|
-
# Check if the agent has been initialized
|
|
62
|
-
#
|
|
63
|
-
# @return [Boolean] True if chat has been created
|
|
64
|
-
def initialized?
|
|
65
|
-
@mutex.synchronize { @initialized }
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
private
|
|
69
|
-
|
|
70
|
-
# Create and initialize the agent chat
|
|
71
|
-
#
|
|
72
|
-
# This mirrors the initialization done in AgentInitializer passes 1-6
|
|
73
|
-
# but for a single lazy delegate.
|
|
74
|
-
#
|
|
75
|
-
# @return [Agent::Chat] Fully initialized chat instance
|
|
76
|
-
def initialize_chat
|
|
77
|
-
emit_lazy_init_start
|
|
78
|
-
|
|
79
|
-
# Create tool configurator
|
|
80
|
-
tool_configurator = ToolConfigurator.new(
|
|
81
|
-
@swarm,
|
|
82
|
-
@swarm.scratchpad_storage,
|
|
83
|
-
@swarm.plugin_storages,
|
|
84
|
-
)
|
|
85
|
-
|
|
86
|
-
# Create the agent chat (mirrors AgentInitializer#create_agent_chat_for_delegation)
|
|
87
|
-
chat = create_delegation_chat(tool_configurator)
|
|
88
|
-
|
|
89
|
-
# Store in delegation_instances (so other code can find it)
|
|
90
|
-
@swarm.delegation_instances[@instance_name] = chat
|
|
91
|
-
|
|
92
|
-
# Wire delegation tools for this instance (nested delegation support)
|
|
93
|
-
wire_delegation_tools(chat, tool_configurator)
|
|
94
|
-
|
|
95
|
-
# Setup context
|
|
96
|
-
setup_context(chat)
|
|
97
|
-
|
|
98
|
-
# Configure hooks
|
|
99
|
-
configure_hooks(chat)
|
|
100
|
-
|
|
101
|
-
# Apply YAML hooks if present
|
|
102
|
-
apply_yaml_hooks(chat)
|
|
103
|
-
|
|
104
|
-
# Activate tools
|
|
105
|
-
chat.activate_tools_for_prompt
|
|
106
|
-
|
|
107
|
-
# Notify plugins
|
|
108
|
-
notify_plugins(chat, tool_configurator)
|
|
109
|
-
|
|
110
|
-
emit_lazy_init_complete
|
|
111
|
-
|
|
112
|
-
chat
|
|
113
|
-
end
|
|
114
|
-
|
|
115
|
-
# Create the delegation chat instance
|
|
116
|
-
#
|
|
117
|
-
# @param tool_configurator [ToolConfigurator] Tool configuration helper
|
|
118
|
-
# @return [Agent::Chat] Newly created chat instance
|
|
119
|
-
def create_delegation_chat(tool_configurator)
|
|
120
|
-
chat = Agent::Chat.new(
|
|
121
|
-
definition: @agent_definition.to_h,
|
|
122
|
-
agent_name: @instance_name.to_sym,
|
|
123
|
-
global_semaphore: @swarm.global_semaphore,
|
|
124
|
-
)
|
|
125
|
-
|
|
126
|
-
# Set provider agent name for logging
|
|
127
|
-
chat.provider.agent_name = @instance_name if chat.provider.respond_to?(:agent_name=)
|
|
128
|
-
|
|
129
|
-
# Register all tools (built-in, permissions, etc.)
|
|
130
|
-
tool_configurator.register_all_tools(
|
|
131
|
-
chat: chat,
|
|
132
|
-
agent_name: @instance_name.to_sym,
|
|
133
|
-
agent_definition: @agent_definition,
|
|
134
|
-
)
|
|
135
|
-
|
|
136
|
-
# Register MCP servers if configured
|
|
137
|
-
if @agent_definition.mcp_servers.any?
|
|
138
|
-
mcp_configurator = McpConfigurator.new(@swarm)
|
|
139
|
-
mcp_configurator.register_mcp_servers(
|
|
140
|
-
chat,
|
|
141
|
-
@agent_definition.mcp_servers,
|
|
142
|
-
agent_name: @instance_name,
|
|
143
|
-
)
|
|
144
|
-
end
|
|
145
|
-
|
|
146
|
-
# Setup tool activation dependencies
|
|
147
|
-
chat.setup_tool_activation(
|
|
148
|
-
tool_configurator: tool_configurator,
|
|
149
|
-
agent_definition: @agent_definition,
|
|
150
|
-
)
|
|
151
|
-
|
|
152
|
-
chat
|
|
153
|
-
end
|
|
154
|
-
|
|
155
|
-
# Wire delegation tools for this instance (nested delegation support)
|
|
156
|
-
#
|
|
157
|
-
# If this agent delegates to other agents, create those tools.
|
|
158
|
-
# The delegate targets may themselves be lazy.
|
|
159
|
-
#
|
|
160
|
-
# @param chat [Agent::Chat] The chat instance
|
|
161
|
-
# @param tool_configurator [ToolConfigurator] Tool configuration helper
|
|
162
|
-
# @return [void]
|
|
163
|
-
def wire_delegation_tools(chat, tool_configurator)
|
|
164
|
-
@agent_definition.delegation_configs.each do |delegation_config|
|
|
165
|
-
delegate_name_sym = delegation_config[:agent]
|
|
166
|
-
delegate_name_str = delegate_name_sym.to_s
|
|
167
|
-
custom_tool_name = delegation_config[:tool_name]
|
|
168
|
-
preserve_context = delegation_config.fetch(:preserve_context, true)
|
|
169
|
-
|
|
170
|
-
# Check if target is a registered swarm
|
|
171
|
-
if @swarm.swarm_registry&.registered?(delegate_name_str)
|
|
172
|
-
wire_swarm_delegation(chat, delegate_name_str, custom_tool_name, preserve_context)
|
|
173
|
-
elsif @swarm.agent_definitions.key?(delegate_name_sym)
|
|
174
|
-
wire_agent_delegation(chat, delegate_name_sym, custom_tool_name, tool_configurator, preserve_context)
|
|
175
|
-
else
|
|
176
|
-
raise ConfigurationError,
|
|
177
|
-
"Agent '#{@instance_name}' delegates to unknown target '#{delegate_name_str}'"
|
|
178
|
-
end
|
|
179
|
-
end
|
|
180
|
-
end
|
|
181
|
-
|
|
182
|
-
# Wire delegation to an external swarm
|
|
183
|
-
#
|
|
184
|
-
# @param chat [Agent::Chat] The delegating chat
|
|
185
|
-
# @param swarm_name [String] Name of the registered swarm
|
|
186
|
-
# @param custom_tool_name [String, nil] Optional custom tool name
|
|
187
|
-
# @param preserve_context [Boolean] Whether to preserve context
|
|
188
|
-
# @return [void]
|
|
189
|
-
def wire_swarm_delegation(chat, swarm_name, custom_tool_name, preserve_context)
|
|
190
|
-
tool = Tools::Delegate.new(
|
|
191
|
-
delegate_name: swarm_name,
|
|
192
|
-
delegate_description: "External swarm: #{swarm_name}",
|
|
193
|
-
delegate_chat: nil,
|
|
194
|
-
agent_name: @instance_name,
|
|
195
|
-
swarm: @swarm,
|
|
196
|
-
delegating_chat: chat,
|
|
197
|
-
custom_tool_name: custom_tool_name,
|
|
198
|
-
preserve_context: preserve_context,
|
|
199
|
-
)
|
|
200
|
-
|
|
201
|
-
chat.tool_registry.register(
|
|
202
|
-
tool,
|
|
203
|
-
source: :delegation,
|
|
204
|
-
metadata: { delegate_name: swarm_name, delegation_type: :swarm, preserve_context: preserve_context },
|
|
205
|
-
)
|
|
206
|
-
end
|
|
207
|
-
|
|
208
|
-
# Wire delegation to a local agent
|
|
209
|
-
#
|
|
210
|
-
# For lazy-loaded agents, creates a LazyDelegateChat wrapper.
|
|
211
|
-
# For shared agents, uses the primary instance.
|
|
212
|
-
#
|
|
213
|
-
# @param chat [Agent::Chat] The delegating chat
|
|
214
|
-
# @param delegate_name_sym [Symbol] Name of the delegate agent
|
|
215
|
-
# @param custom_tool_name [String, nil] Optional custom tool name
|
|
216
|
-
# @param tool_configurator [ToolConfigurator] Tool configuration helper
|
|
217
|
-
# @param preserve_context [Boolean] Whether to preserve context
|
|
218
|
-
# @return [void]
|
|
219
|
-
def wire_agent_delegation(chat, delegate_name_sym, custom_tool_name, tool_configurator, preserve_context)
|
|
220
|
-
delegate_definition = @swarm.agent_definitions[delegate_name_sym]
|
|
221
|
-
|
|
222
|
-
# Determine which chat instance to use
|
|
223
|
-
target_chat = if delegate_definition.shared_across_delegations
|
|
224
|
-
# Shared mode: use primary agent
|
|
225
|
-
@swarm.agents[delegate_name_sym]
|
|
226
|
-
else
|
|
227
|
-
# Isolated mode: create nested lazy loader or get existing instance
|
|
228
|
-
nested_instance_name = "#{delegate_name_sym}@#{@instance_name}"
|
|
229
|
-
|
|
230
|
-
# Check if already exists (might have been created by another path)
|
|
231
|
-
existing = @swarm.delegation_instances[nested_instance_name]
|
|
232
|
-
if existing
|
|
233
|
-
existing
|
|
234
|
-
else
|
|
235
|
-
# Create lazy loader for nested delegation
|
|
236
|
-
LazyDelegateChat.new(
|
|
237
|
-
instance_name: nested_instance_name,
|
|
238
|
-
base_name: delegate_name_sym,
|
|
239
|
-
agent_definition: delegate_definition,
|
|
240
|
-
swarm: @swarm,
|
|
241
|
-
)
|
|
242
|
-
end
|
|
243
|
-
end
|
|
244
|
-
|
|
245
|
-
# Create delegation tool pointing to chosen instance
|
|
246
|
-
tool = Tools::Delegate.new(
|
|
247
|
-
delegate_name: delegate_name_sym.to_s,
|
|
248
|
-
delegate_description: delegate_definition.description,
|
|
249
|
-
delegate_chat: target_chat,
|
|
250
|
-
agent_name: @instance_name,
|
|
251
|
-
swarm: @swarm,
|
|
252
|
-
delegating_chat: chat,
|
|
253
|
-
custom_tool_name: custom_tool_name,
|
|
254
|
-
preserve_context: preserve_context,
|
|
255
|
-
)
|
|
256
|
-
|
|
257
|
-
chat.tool_registry.register(
|
|
258
|
-
tool,
|
|
259
|
-
source: :delegation,
|
|
260
|
-
metadata: {
|
|
261
|
-
delegate_name: delegate_name_sym,
|
|
262
|
-
delegation_mode: delegate_definition.shared_across_delegations ? :shared : :isolated,
|
|
263
|
-
preserve_context: preserve_context,
|
|
264
|
-
},
|
|
265
|
-
)
|
|
266
|
-
end
|
|
267
|
-
|
|
268
|
-
# Setup agent context
|
|
269
|
-
#
|
|
270
|
-
# @param chat [Agent::Chat] The chat instance
|
|
271
|
-
# @return [void]
|
|
272
|
-
def setup_context(chat)
|
|
273
|
-
delegate_tool_names = @agent_definition.delegation_configs.map do |delegation_config|
|
|
274
|
-
delegation_config[:tool_name] || Tools::Delegate.tool_name_for(delegation_config[:agent])
|
|
275
|
-
end
|
|
276
|
-
|
|
277
|
-
context = Agent::Context.new(
|
|
278
|
-
name: @instance_name.to_sym,
|
|
279
|
-
swarm_id: @swarm.swarm_id,
|
|
280
|
-
parent_swarm_id: @swarm.parent_swarm_id,
|
|
281
|
-
delegation_tools: delegate_tool_names,
|
|
282
|
-
metadata: { is_delegation_instance: true },
|
|
283
|
-
)
|
|
284
|
-
|
|
285
|
-
chat.setup_context(context) if chat.respond_to?(:setup_context)
|
|
286
|
-
|
|
287
|
-
# Configure logging if enabled
|
|
288
|
-
return unless LogStream.emitter
|
|
289
|
-
|
|
290
|
-
chat.setup_logging if chat.respond_to?(:setup_logging)
|
|
291
|
-
end
|
|
292
|
-
|
|
293
|
-
# Configure hooks for the agent
|
|
294
|
-
#
|
|
295
|
-
# @param chat [Agent::Chat] The chat instance
|
|
296
|
-
# @return [void]
|
|
297
|
-
def configure_hooks(chat)
|
|
298
|
-
return unless chat.respond_to?(:setup_hooks)
|
|
299
|
-
|
|
300
|
-
chat.setup_hooks(
|
|
301
|
-
registry: @swarm.hook_registry,
|
|
302
|
-
agent_definition: @agent_definition,
|
|
303
|
-
swarm: @swarm,
|
|
304
|
-
)
|
|
305
|
-
end
|
|
306
|
-
|
|
307
|
-
# Apply YAML hooks if present
|
|
308
|
-
#
|
|
309
|
-
# @param chat [Agent::Chat] The chat instance
|
|
310
|
-
# @return [void]
|
|
311
|
-
def apply_yaml_hooks(chat)
|
|
312
|
-
return unless @swarm.config_for_hooks
|
|
313
|
-
|
|
314
|
-
agent_config = @swarm.config_for_hooks.agents[@base_name]
|
|
315
|
-
return unless agent_config
|
|
316
|
-
|
|
317
|
-
hooks = agent_config.is_a?(Hash) ? agent_config[:hooks] : agent_config.hooks
|
|
318
|
-
return unless hooks&.any?
|
|
319
|
-
|
|
320
|
-
Hooks::Adapter.apply_agent_hooks(chat, @instance_name.to_sym, hooks, @swarm.name)
|
|
321
|
-
end
|
|
322
|
-
|
|
323
|
-
# Notify plugins that agent was initialized
|
|
324
|
-
#
|
|
325
|
-
# @param chat [Agent::Chat] The chat instance
|
|
326
|
-
# @param tool_configurator [ToolConfigurator] Tool configuration helper
|
|
327
|
-
# @return [void]
|
|
328
|
-
def notify_plugins(chat, tool_configurator)
|
|
329
|
-
PluginRegistry.all.each do |plugin|
|
|
330
|
-
plugin_storages = @swarm.plugin_storages[plugin.name] || {}
|
|
331
|
-
storage = plugin_storages[@base_name]
|
|
332
|
-
|
|
333
|
-
context = {
|
|
334
|
-
storage: storage,
|
|
335
|
-
agent_definition: @agent_definition,
|
|
336
|
-
tool_configurator: tool_configurator,
|
|
337
|
-
}
|
|
338
|
-
|
|
339
|
-
plugin.on_agent_initialized(
|
|
340
|
-
agent_name: @instance_name.to_sym,
|
|
341
|
-
agent: chat,
|
|
342
|
-
context: context,
|
|
343
|
-
)
|
|
344
|
-
end
|
|
345
|
-
end
|
|
346
|
-
|
|
347
|
-
# Emit lazy initialization start event
|
|
348
|
-
#
|
|
349
|
-
# @return [void]
|
|
350
|
-
def emit_lazy_init_start
|
|
351
|
-
LogStream.emit(
|
|
352
|
-
type: "agent_lazy_initialization_start",
|
|
353
|
-
instance_name: @instance_name,
|
|
354
|
-
base_name: @base_name,
|
|
355
|
-
timestamp: Time.now.utc.iso8601,
|
|
356
|
-
)
|
|
357
|
-
end
|
|
358
|
-
|
|
359
|
-
# Emit lazy initialization complete event
|
|
360
|
-
#
|
|
361
|
-
# @return [void]
|
|
362
|
-
def emit_lazy_init_complete
|
|
363
|
-
LogStream.emit(
|
|
364
|
-
type: "agent_lazy_initialization_complete",
|
|
365
|
-
instance_name: @instance_name,
|
|
366
|
-
base_name: @base_name,
|
|
367
|
-
timestamp: Time.now.utc.iso8601,
|
|
368
|
-
)
|
|
369
|
-
end
|
|
370
|
-
end
|
|
371
|
-
end
|
|
372
|
-
end
|