swarm_memory 2.1.5 → 2.1.6
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_memory/version.rb +1 -1
- metadata +5 -184
- data/lib/claude_swarm/base_executor.rb +0 -133
- data/lib/claude_swarm/claude_code_executor.rb +0 -349
- data/lib/claude_swarm/claude_mcp_server.rb +0 -78
- data/lib/claude_swarm/cli.rb +0 -697
- data/lib/claude_swarm/commands/ps.rb +0 -215
- data/lib/claude_swarm/commands/show.rb +0 -139
- data/lib/claude_swarm/configuration.rb +0 -373
- data/lib/claude_swarm/hooks/session_start_hook.rb +0 -42
- data/lib/claude_swarm/json_handler.rb +0 -91
- data/lib/claude_swarm/mcp_generator.rb +0 -230
- data/lib/claude_swarm/openai/chat_completion.rb +0 -256
- data/lib/claude_swarm/openai/executor.rb +0 -256
- data/lib/claude_swarm/openai/responses.rb +0 -319
- data/lib/claude_swarm/orchestrator.rb +0 -878
- data/lib/claude_swarm/process_tracker.rb +0 -78
- data/lib/claude_swarm/session_cost_calculator.rb +0 -209
- data/lib/claude_swarm/session_path.rb +0 -42
- data/lib/claude_swarm/settings_generator.rb +0 -77
- data/lib/claude_swarm/system_utils.rb +0 -46
- data/lib/claude_swarm/templates/generation_prompt.md.erb +0 -230
- data/lib/claude_swarm/tools/reset_session_tool.rb +0 -24
- data/lib/claude_swarm/tools/session_info_tool.rb +0 -24
- data/lib/claude_swarm/tools/task_tool.rb +0 -63
- data/lib/claude_swarm/version.rb +0 -5
- data/lib/claude_swarm/worktree_manager.rb +0 -475
- data/lib/claude_swarm/yaml_loader.rb +0 -22
- data/lib/claude_swarm.rb +0 -67
- data/lib/swarm_cli/cli.rb +0 -201
- data/lib/swarm_cli/command_registry.rb +0 -61
- data/lib/swarm_cli/commands/mcp_serve.rb +0 -130
- data/lib/swarm_cli/commands/mcp_tools.rb +0 -148
- data/lib/swarm_cli/commands/migrate.rb +0 -55
- data/lib/swarm_cli/commands/run.rb +0 -173
- data/lib/swarm_cli/config_loader.rb +0 -98
- data/lib/swarm_cli/formatters/human_formatter.rb +0 -781
- data/lib/swarm_cli/formatters/json_formatter.rb +0 -51
- data/lib/swarm_cli/interactive_repl.rb +0 -924
- data/lib/swarm_cli/mcp_serve_options.rb +0 -44
- data/lib/swarm_cli/mcp_tools_options.rb +0 -59
- data/lib/swarm_cli/migrate_options.rb +0 -54
- data/lib/swarm_cli/migrator.rb +0 -132
- data/lib/swarm_cli/options.rb +0 -151
- data/lib/swarm_cli/ui/components/agent_badge.rb +0 -33
- data/lib/swarm_cli/ui/components/content_block.rb +0 -120
- data/lib/swarm_cli/ui/components/divider.rb +0 -57
- data/lib/swarm_cli/ui/components/panel.rb +0 -62
- data/lib/swarm_cli/ui/components/usage_stats.rb +0 -70
- data/lib/swarm_cli/ui/formatters/cost.rb +0 -49
- data/lib/swarm_cli/ui/formatters/number.rb +0 -58
- data/lib/swarm_cli/ui/formatters/text.rb +0 -77
- data/lib/swarm_cli/ui/formatters/time.rb +0 -73
- data/lib/swarm_cli/ui/icons.rb +0 -36
- data/lib/swarm_cli/ui/renderers/event_renderer.rb +0 -188
- data/lib/swarm_cli/ui/state/agent_color_cache.rb +0 -45
- data/lib/swarm_cli/ui/state/depth_tracker.rb +0 -40
- data/lib/swarm_cli/ui/state/spinner_manager.rb +0 -170
- data/lib/swarm_cli/ui/state/usage_tracker.rb +0 -62
- data/lib/swarm_cli/version.rb +0 -5
- data/lib/swarm_cli.rb +0 -46
- data/lib/swarm_sdk/agent/RETRY_LOGIC.md +0 -127
- data/lib/swarm_sdk/agent/builder.rb +0 -552
- data/lib/swarm_sdk/agent/chat.rb +0 -774
- data/lib/swarm_sdk/agent/chat_helpers/context_tracker.rb +0 -268
- 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 -78
- data/lib/swarm_sdk/agent/chat_helpers/llm_configuration.rb +0 -233
- 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 -136
- data/lib/swarm_sdk/agent/chat_helpers/system_reminders.rb +0 -79
- data/lib/swarm_sdk/agent/chat_helpers/token_tracking.rb +0 -98
- data/lib/swarm_sdk/agent/context.rb +0 -116
- data/lib/swarm_sdk/agent/context_manager.rb +0 -315
- data/lib/swarm_sdk/agent/definition.rb +0 -477
- data/lib/swarm_sdk/agent/llm_instrumentation_middleware.rb +0 -182
- data/lib/swarm_sdk/agent/system_prompt_builder.rb +0 -161
- data/lib/swarm_sdk/builders/base_builder.rb +0 -409
- 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/configuration/parser.rb +0 -353
- data/lib/swarm_sdk/configuration/translator.rb +0 -255
- data/lib/swarm_sdk/configuration.rb +0 -135
- data/lib/swarm_sdk/context_compactor/metrics.rb +0 -147
- data/lib/swarm_sdk/context_compactor/token_counter.rb +0 -106
- 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/defaults.rb +0 -196
- 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 -255
- 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 -1
- data/lib/swarm_sdk/models.rb +0 -120
- 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 -123
- 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 -683
- data/lib/swarm_sdk/swarm/all_agents_builder.rb +0 -167
- data/lib/swarm_sdk/swarm/builder.rb +0 -249
- data/lib/swarm_sdk/swarm/executor.rb +0 -213
- data/lib/swarm_sdk/swarm/hook_triggers.rb +0 -150
- data/lib/swarm_sdk/swarm/logging_callbacks.rb +0 -340
- data/lib/swarm_sdk/swarm/mcp_configurator.rb +0 -154
- data/lib/swarm_sdk/swarm/swarm_registry_builder.rb +0 -67
- data/lib/swarm_sdk/swarm/tool_configurator.rb +0 -358
- data/lib/swarm_sdk/swarm.rb +0 -717
- data/lib/swarm_sdk/swarm_loader.rb +0 -145
- data/lib/swarm_sdk/swarm_registry.rb +0 -136
- data/lib/swarm_sdk/tools/bash.rb +0 -282
- data/lib/swarm_sdk/tools/clock.rb +0 -44
- data/lib/swarm_sdk/tools/delegate.rb +0 -267
- 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 -163
- data/lib/swarm_sdk/tools/image_formats/tiff_builder.rb +0 -65
- 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 -272
- 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 -98
- data/lib/swarm_sdk/tools/todo_write.rb +0 -235
- data/lib/swarm_sdk/tools/web_fetch.rb +0 -262
- data/lib/swarm_sdk/tools/write.rb +0 -112
- 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 -79
- data/lib/swarm_sdk/workflow/builder.rb +0 -143
- data/lib/swarm_sdk/workflow/executor.rb +0 -497
- data/lib/swarm_sdk/workflow/node_builder.rb +0 -555
- data/lib/swarm_sdk/workflow/transformer_executor.rb +0 -249
- data/lib/swarm_sdk/workflow.rb +0 -554
- data/lib/swarm_sdk.rb +0 -524
|
@@ -1,205 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module SwarmSDK
|
|
4
|
-
# Adapter for converting Claude Code agent markdown files to SwarmSDK format
|
|
5
|
-
#
|
|
6
|
-
# Claude Code agent files use a different syntax and conventions than SwarmSDK:
|
|
7
|
-
# - Tools are comma-separated strings instead of arrays
|
|
8
|
-
# - Model shortcuts like 'sonnet', 'opus', 'haiku' instead of full model IDs
|
|
9
|
-
# - Tool permissions like 'Write(src/**)' instead of SwarmSDK's permission system
|
|
10
|
-
# - Required 'name' field in frontmatter
|
|
11
|
-
#
|
|
12
|
-
# This adapter:
|
|
13
|
-
# - Detects Claude Code format by checking frontmatter markers
|
|
14
|
-
# - Converts tools from comma-separated strings to arrays
|
|
15
|
-
# - Maps model shortcuts to canonical model IDs
|
|
16
|
-
# - Strips unsupported tool permission syntax with warnings
|
|
17
|
-
# - Sets coding_agent: true by default
|
|
18
|
-
# - Warns about unsupported fields
|
|
19
|
-
#
|
|
20
|
-
# @example Parse a Claude Code agent file
|
|
21
|
-
# content = File.read('.claude/agents/reviewer.md')
|
|
22
|
-
# config = ClaudeCodeAgentAdapter.parse(content, :reviewer)
|
|
23
|
-
# agent = Agent::Definition.new(:reviewer, config)
|
|
24
|
-
#
|
|
25
|
-
class ClaudeCodeAgentAdapter
|
|
26
|
-
# Fields supported in Claude Code agent frontmatter
|
|
27
|
-
SUPPORTED_FIELDS = ["name", "description", "tools", "model"].freeze
|
|
28
|
-
|
|
29
|
-
# SwarmSDK documentation URL for reference
|
|
30
|
-
SWARM_SDK_DOCS_URL = "https://github.com/parruda/claude-swarm/blob/main/docs/v2/README.md"
|
|
31
|
-
|
|
32
|
-
# Pattern to detect tool permission syntax like Write(src/**)
|
|
33
|
-
TOOL_PERMISSION_PATTERN = /^([A-Za-z_]+)\([^)]+\)$/
|
|
34
|
-
|
|
35
|
-
class << self
|
|
36
|
-
# Detect if content appears to be in Claude Code agent format
|
|
37
|
-
#
|
|
38
|
-
# Detection is based on tools field type:
|
|
39
|
-
# - Claude Code: tools is a comma-separated string (e.g., "Read, Write, Bash")
|
|
40
|
-
# - SwarmSDK: tools is an array (e.g., [Read, Write, Bash])
|
|
41
|
-
#
|
|
42
|
-
# Note: The 'name' field alone is not sufficient since SwarmSDK also supports it
|
|
43
|
-
#
|
|
44
|
-
# @param content [String] Markdown content with YAML frontmatter
|
|
45
|
-
# @return [Boolean] true if content appears to be Claude Code format
|
|
46
|
-
def claude_code_format?(content)
|
|
47
|
-
return false unless content =~ /\A---\s*\n(.*?)\n---\s*\n/m
|
|
48
|
-
|
|
49
|
-
frontmatter_yaml = Regexp.last_match(1)
|
|
50
|
-
frontmatter = YAML.safe_load(frontmatter_yaml, permitted_classes: [Symbol], aliases: true)
|
|
51
|
-
|
|
52
|
-
return false unless frontmatter.is_a?(Hash)
|
|
53
|
-
|
|
54
|
-
# Only detect as Claude Code if tools field is a comma-separated string
|
|
55
|
-
# This is the most reliable indicator since SwarmSDK always uses arrays
|
|
56
|
-
frontmatter.key?("tools") && frontmatter["tools"].is_a?(String)
|
|
57
|
-
rescue Psych::SyntaxError
|
|
58
|
-
false
|
|
59
|
-
end
|
|
60
|
-
|
|
61
|
-
# Parse Claude Code agent markdown and convert to SwarmSDK format
|
|
62
|
-
#
|
|
63
|
-
# @param content [String] Markdown content with YAML frontmatter
|
|
64
|
-
# @param agent_name [Symbol, String] Name of the agent
|
|
65
|
-
# @param inherit_model [String, nil] Model to use when frontmatter has 'inherit'
|
|
66
|
-
# @return [Hash] Configuration hash suitable for Agent::Definition.new
|
|
67
|
-
# @raise [ConfigurationError] if content format is invalid
|
|
68
|
-
def parse(content, agent_name, inherit_model: nil)
|
|
69
|
-
new(inherit_model: inherit_model).parse(content, agent_name)
|
|
70
|
-
end
|
|
71
|
-
end
|
|
72
|
-
|
|
73
|
-
# Initialize adapter with optional context
|
|
74
|
-
#
|
|
75
|
-
# @param inherit_model [String, nil] Model to use when frontmatter has 'inherit'
|
|
76
|
-
def initialize(inherit_model: nil)
|
|
77
|
-
@inherit_model = inherit_model
|
|
78
|
-
@warnings = []
|
|
79
|
-
end
|
|
80
|
-
|
|
81
|
-
# Parse Claude Code agent content
|
|
82
|
-
#
|
|
83
|
-
# @param content [String] Markdown content with YAML frontmatter
|
|
84
|
-
# @param agent_name [Symbol, String] Name of the agent
|
|
85
|
-
# @return [Hash] Configuration hash for Agent::Definition
|
|
86
|
-
# @raise [ConfigurationError] if format is invalid
|
|
87
|
-
def parse(content, agent_name)
|
|
88
|
-
unless content =~ /\A---\s*\n(.*?)\n---\s*\n(.*)\z/m
|
|
89
|
-
raise ConfigurationError, "Invalid Claude Code agent format. Expected YAML frontmatter followed by prompt content."
|
|
90
|
-
end
|
|
91
|
-
|
|
92
|
-
frontmatter_yaml = Regexp.last_match(1)
|
|
93
|
-
prompt_content = Regexp.last_match(2).strip
|
|
94
|
-
|
|
95
|
-
frontmatter = YAML.safe_load(frontmatter_yaml, permitted_classes: [Symbol], aliases: true)
|
|
96
|
-
|
|
97
|
-
unless frontmatter.is_a?(Hash)
|
|
98
|
-
raise ConfigurationError, "Invalid frontmatter format in Claude Code agent file"
|
|
99
|
-
end
|
|
100
|
-
|
|
101
|
-
config = build_config(frontmatter, prompt_content, agent_name)
|
|
102
|
-
emit_warnings(agent_name)
|
|
103
|
-
config
|
|
104
|
-
end
|
|
105
|
-
|
|
106
|
-
private
|
|
107
|
-
|
|
108
|
-
# Build SwarmSDK configuration from Claude Code frontmatter
|
|
109
|
-
def build_config(frontmatter, prompt_content, agent_name)
|
|
110
|
-
warn_unknown_fields(frontmatter)
|
|
111
|
-
|
|
112
|
-
config = {
|
|
113
|
-
description: frontmatter["description"],
|
|
114
|
-
system_prompt: prompt_content,
|
|
115
|
-
coding_agent: true, # Default for Claude Code agents
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
# Parse tools if present
|
|
119
|
-
if frontmatter["tools"]
|
|
120
|
-
config[:tools] = parse_tools(frontmatter["tools"])
|
|
121
|
-
end
|
|
122
|
-
|
|
123
|
-
# Parse model if present
|
|
124
|
-
if frontmatter["model"]
|
|
125
|
-
config[:model] = resolve_model(frontmatter["model"])
|
|
126
|
-
end
|
|
127
|
-
|
|
128
|
-
config
|
|
129
|
-
end
|
|
130
|
-
|
|
131
|
-
# Parse tools field - handles both comma-separated string and array
|
|
132
|
-
#
|
|
133
|
-
# @param tools_field [String, Array] Tools from frontmatter
|
|
134
|
-
# @return [Array<String>] Array of tool names
|
|
135
|
-
def parse_tools(tools_field)
|
|
136
|
-
tools_array = if tools_field.is_a?(String)
|
|
137
|
-
tools_field.split(",").map(&:strip)
|
|
138
|
-
else
|
|
139
|
-
Array(tools_field).map(&:to_s)
|
|
140
|
-
end
|
|
141
|
-
|
|
142
|
-
# Clean tool permissions and collect warnings
|
|
143
|
-
tools_array.map { |tool| clean_tool_permissions(tool) }.compact
|
|
144
|
-
end
|
|
145
|
-
|
|
146
|
-
# Strip tool permission syntax and warn if detected
|
|
147
|
-
#
|
|
148
|
-
# @param tool_string [String] Tool name, possibly with permissions like 'Write(src/**)'
|
|
149
|
-
# @return [String, nil] Clean tool name, or nil if invalid
|
|
150
|
-
def clean_tool_permissions(tool_string)
|
|
151
|
-
if tool_string =~ TOOL_PERMISSION_PATTERN
|
|
152
|
-
tool_name = Regexp.last_match(1)
|
|
153
|
-
@warnings << "Tool permission syntax '#{tool_string}' detected in agent file. SwarmSDK supports permissions but uses different syntax. Using '#{tool_name}' without restrictions for now. See SwarmSDK documentation for permission configuration: #{SWARM_SDK_DOCS_URL}"
|
|
154
|
-
tool_name
|
|
155
|
-
else
|
|
156
|
-
tool_string
|
|
157
|
-
end
|
|
158
|
-
end
|
|
159
|
-
|
|
160
|
-
# Resolve model shortcuts to canonical model IDs
|
|
161
|
-
#
|
|
162
|
-
# Uses SwarmSDK::Models.resolve_alias to map shortcuts like 'sonnet'
|
|
163
|
-
# to the latest model IDs from model_aliases.json.
|
|
164
|
-
#
|
|
165
|
-
# @param model_field [String] Model from frontmatter
|
|
166
|
-
# @return [String, Symbol] Canonical model ID or :inherit symbol
|
|
167
|
-
def resolve_model(model_field)
|
|
168
|
-
model_str = model_field.to_s.strip
|
|
169
|
-
|
|
170
|
-
# Handle 'inherit' keyword
|
|
171
|
-
return :inherit if model_str == "inherit"
|
|
172
|
-
|
|
173
|
-
# Resolve using SwarmSDK model aliases
|
|
174
|
-
# This maps 'sonnet' → 'claude-sonnet-4-5-20250929', etc.
|
|
175
|
-
SwarmSDK::Models.resolve_alias(model_str)
|
|
176
|
-
end
|
|
177
|
-
|
|
178
|
-
# Warn about unknown frontmatter fields
|
|
179
|
-
def warn_unknown_fields(frontmatter)
|
|
180
|
-
unknown_fields = frontmatter.keys - SUPPORTED_FIELDS
|
|
181
|
-
|
|
182
|
-
unknown_fields.each do |field|
|
|
183
|
-
@warnings << case field
|
|
184
|
-
when "hooks"
|
|
185
|
-
"Hooks configuration detected in agent frontmatter. SwarmSDK handles hooks at the swarm level. See: #{SWARM_SDK_DOCS_URL}"
|
|
186
|
-
else
|
|
187
|
-
"Unknown field '#{field}' in Claude Code agent file. Ignoring. Supported fields: #{SUPPORTED_FIELDS.join(", ")}"
|
|
188
|
-
end
|
|
189
|
-
end
|
|
190
|
-
end
|
|
191
|
-
|
|
192
|
-
# Emit all collected warnings via LogCollector
|
|
193
|
-
def emit_warnings(agent_name)
|
|
194
|
-
return if @warnings.empty?
|
|
195
|
-
|
|
196
|
-
@warnings.each do |warning|
|
|
197
|
-
LogCollector.emit(
|
|
198
|
-
type: "claude_code_conversion_warning",
|
|
199
|
-
agent: agent_name,
|
|
200
|
-
message: warning,
|
|
201
|
-
)
|
|
202
|
-
end
|
|
203
|
-
end
|
|
204
|
-
end
|
|
205
|
-
end
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module SwarmSDK
|
|
4
|
-
module Concerns
|
|
5
|
-
# Shared cleanup functionality for Swarm and Workflow
|
|
6
|
-
#
|
|
7
|
-
# Both classes must have:
|
|
8
|
-
# - mcp_clients: Hash of MCP client arrays
|
|
9
|
-
# - delegation_instances_hash: Hash of delegation instances (via Snapshotable)
|
|
10
|
-
#
|
|
11
|
-
module Cleanupable
|
|
12
|
-
# Cleanup all MCP clients
|
|
13
|
-
#
|
|
14
|
-
# Stops all MCP client connections gracefully.
|
|
15
|
-
# Should be called when the swarm/workflow is no longer needed.
|
|
16
|
-
#
|
|
17
|
-
# @return [void]
|
|
18
|
-
def cleanup
|
|
19
|
-
# Check if there's anything to clean up
|
|
20
|
-
return if @mcp_clients.empty? && (!delegation_instances_hash || delegation_instances_hash.empty?)
|
|
21
|
-
|
|
22
|
-
# Stop MCP clients for all agents
|
|
23
|
-
@mcp_clients.each do |agent_name, clients|
|
|
24
|
-
clients.each do |client|
|
|
25
|
-
client.stop
|
|
26
|
-
RubyLLM.logger.debug("SwarmSDK: Stopped MCP client '#{client.name}' for agent #{agent_name}")
|
|
27
|
-
rescue StandardError => e
|
|
28
|
-
RubyLLM.logger.debug("SwarmSDK: Error stopping MCP client '#{client.name}': #{e.message}")
|
|
29
|
-
end
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
@mcp_clients.clear
|
|
33
|
-
|
|
34
|
-
# Clear delegation instances
|
|
35
|
-
delegation_instances_hash&.clear
|
|
36
|
-
end
|
|
37
|
-
end
|
|
38
|
-
end
|
|
39
|
-
end
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module SwarmSDK
|
|
4
|
-
module Concerns
|
|
5
|
-
# Shared snapshot and restore functionality for Swarm and Workflow
|
|
6
|
-
#
|
|
7
|
-
# Both classes must implement:
|
|
8
|
-
# - primary_agents: Returns hash of primary agent instances
|
|
9
|
-
# - delegation_instances_hash: Returns hash of delegation instances
|
|
10
|
-
# - agent_definitions: Returns hash of agent definitions
|
|
11
|
-
# - swarm_id: Returns the swarm/workflow ID
|
|
12
|
-
# - parent_swarm_id: Returns the parent ID (or nil)
|
|
13
|
-
# - name: Returns the swarm/workflow name
|
|
14
|
-
#
|
|
15
|
-
module Snapshotable
|
|
16
|
-
# Create snapshot of current conversation state
|
|
17
|
-
#
|
|
18
|
-
# Returns a Snapshot object containing:
|
|
19
|
-
# - All agent conversations (@messages arrays)
|
|
20
|
-
# - Agent context state (warnings, compression, TodoWrite tracking, skills)
|
|
21
|
-
# - Delegation instance conversations
|
|
22
|
-
# - Scratchpad contents (volatile shared storage)
|
|
23
|
-
# - Read tracking state (which files each agent has read with digests)
|
|
24
|
-
# - Memory read tracking state (which memory entries each agent has read with digests)
|
|
25
|
-
#
|
|
26
|
-
# @return [Snapshot] Snapshot object with convenient serialization methods
|
|
27
|
-
def snapshot
|
|
28
|
-
StateSnapshot.new(self).snapshot
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
# Restore conversation state from snapshot
|
|
32
|
-
#
|
|
33
|
-
# Accepts a Snapshot object, hash, or JSON string. Validates compatibility
|
|
34
|
-
# between snapshot and current configuration, restores agent conversations,
|
|
35
|
-
# context state, scratchpad, and read tracking.
|
|
36
|
-
#
|
|
37
|
-
# The swarm/workflow must be created with the SAME configuration (agent definitions,
|
|
38
|
-
# tools, prompts) as when the snapshot was created. Only conversation state
|
|
39
|
-
# is restored from the snapshot.
|
|
40
|
-
#
|
|
41
|
-
# @param snapshot [Snapshot, Hash, String] Snapshot object, hash, or JSON string
|
|
42
|
-
# @param preserve_system_prompts [Boolean] Use historical system prompts instead of current config (default: false)
|
|
43
|
-
# @return [RestoreResult] Result with warnings about skipped agents
|
|
44
|
-
def restore(snapshot, preserve_system_prompts: false)
|
|
45
|
-
StateRestorer.new(self, snapshot, preserve_system_prompts: preserve_system_prompts).restore
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
# Interface method: Get primary agent instances
|
|
49
|
-
#
|
|
50
|
-
# Must be implemented by including class.
|
|
51
|
-
#
|
|
52
|
-
# @return [Hash<Symbol, Agent::Chat>] Primary agent instances
|
|
53
|
-
def primary_agents
|
|
54
|
-
raise NotImplementedError, "#{self.class} must implement #primary_agents"
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
# Interface method: Get delegation instance hash
|
|
58
|
-
#
|
|
59
|
-
# Must be implemented by including class.
|
|
60
|
-
#
|
|
61
|
-
# @return [Hash<String, Agent::Chat>] Delegation instances with keys like "delegate@delegator"
|
|
62
|
-
def delegation_instances_hash
|
|
63
|
-
raise NotImplementedError, "#{self.class} must implement #delegation_instances_hash"
|
|
64
|
-
end
|
|
65
|
-
end
|
|
66
|
-
end
|
|
67
|
-
end
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module SwarmSDK
|
|
4
|
-
module Concerns
|
|
5
|
-
# Shared validation functionality for Swarm and Workflow
|
|
6
|
-
#
|
|
7
|
-
# Both classes must have:
|
|
8
|
-
# - agent_definitions: Hash of Agent::Definition objects
|
|
9
|
-
# - swarm_id: Swarm/workflow identifier
|
|
10
|
-
# - parent_swarm_id: Parent identifier (or nil)
|
|
11
|
-
#
|
|
12
|
-
module Validatable
|
|
13
|
-
# Validate swarm/workflow configuration and return warnings
|
|
14
|
-
#
|
|
15
|
-
# This performs lightweight validation checks without creating agents.
|
|
16
|
-
# Useful for displaying configuration warnings before execution.
|
|
17
|
-
#
|
|
18
|
-
# @return [Array<Hash>] Array of warning hashes from all agent definitions
|
|
19
|
-
def validate
|
|
20
|
-
@agent_definitions.flat_map { |_name, definition| definition.validate }
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
# Emit validation warnings as log events
|
|
24
|
-
#
|
|
25
|
-
# This validates all agent definitions and emits any warnings as
|
|
26
|
-
# model_lookup_warning events through LogStream. Useful for emitting
|
|
27
|
-
# warnings before execution starts (e.g., in REPL after welcome screen).
|
|
28
|
-
#
|
|
29
|
-
# Requires LogStream.emitter to be set.
|
|
30
|
-
#
|
|
31
|
-
# @return [Array<Hash>] The validation warnings that were emitted
|
|
32
|
-
def emit_validation_warnings
|
|
33
|
-
warnings = validate
|
|
34
|
-
|
|
35
|
-
warnings.each do |warning|
|
|
36
|
-
case warning[:type]
|
|
37
|
-
when :model_not_found
|
|
38
|
-
LogStream.emit(
|
|
39
|
-
type: "model_lookup_warning",
|
|
40
|
-
agent: warning[:agent],
|
|
41
|
-
swarm_id: @swarm_id,
|
|
42
|
-
parent_swarm_id: @parent_swarm_id,
|
|
43
|
-
model: warning[:model],
|
|
44
|
-
error_message: warning[:error_message],
|
|
45
|
-
suggestions: warning[:suggestions],
|
|
46
|
-
timestamp: Time.now.utc.iso8601,
|
|
47
|
-
)
|
|
48
|
-
end
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
warnings
|
|
52
|
-
end
|
|
53
|
-
end
|
|
54
|
-
end
|
|
55
|
-
end
|