swarm_memory 2.1.4 → 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.
Files changed (184) hide show
  1. checksums.yaml +4 -4
  2. data/lib/swarm_memory/version.rb +1 -1
  3. data/lib/swarm_memory.rb +7 -2
  4. metadata +6 -185
  5. data/lib/claude_swarm/base_executor.rb +0 -133
  6. data/lib/claude_swarm/claude_code_executor.rb +0 -349
  7. data/lib/claude_swarm/claude_mcp_server.rb +0 -78
  8. data/lib/claude_swarm/cli.rb +0 -697
  9. data/lib/claude_swarm/commands/ps.rb +0 -215
  10. data/lib/claude_swarm/commands/show.rb +0 -139
  11. data/lib/claude_swarm/configuration.rb +0 -373
  12. data/lib/claude_swarm/hooks/session_start_hook.rb +0 -42
  13. data/lib/claude_swarm/json_handler.rb +0 -91
  14. data/lib/claude_swarm/mcp_generator.rb +0 -243
  15. data/lib/claude_swarm/openai/chat_completion.rb +0 -256
  16. data/lib/claude_swarm/openai/executor.rb +0 -256
  17. data/lib/claude_swarm/openai/responses.rb +0 -319
  18. data/lib/claude_swarm/orchestrator.rb +0 -878
  19. data/lib/claude_swarm/process_tracker.rb +0 -78
  20. data/lib/claude_swarm/session_cost_calculator.rb +0 -209
  21. data/lib/claude_swarm/session_path.rb +0 -42
  22. data/lib/claude_swarm/settings_generator.rb +0 -77
  23. data/lib/claude_swarm/system_utils.rb +0 -46
  24. data/lib/claude_swarm/templates/generation_prompt.md.erb +0 -230
  25. data/lib/claude_swarm/tools/reset_session_tool.rb +0 -24
  26. data/lib/claude_swarm/tools/session_info_tool.rb +0 -24
  27. data/lib/claude_swarm/tools/task_tool.rb +0 -63
  28. data/lib/claude_swarm/version.rb +0 -5
  29. data/lib/claude_swarm/worktree_manager.rb +0 -475
  30. data/lib/claude_swarm/yaml_loader.rb +0 -22
  31. data/lib/claude_swarm.rb +0 -67
  32. data/lib/swarm_cli/cli.rb +0 -201
  33. data/lib/swarm_cli/command_registry.rb +0 -61
  34. data/lib/swarm_cli/commands/mcp_serve.rb +0 -130
  35. data/lib/swarm_cli/commands/mcp_tools.rb +0 -148
  36. data/lib/swarm_cli/commands/migrate.rb +0 -55
  37. data/lib/swarm_cli/commands/run.rb +0 -173
  38. data/lib/swarm_cli/config_loader.rb +0 -98
  39. data/lib/swarm_cli/formatters/human_formatter.rb +0 -781
  40. data/lib/swarm_cli/formatters/json_formatter.rb +0 -51
  41. data/lib/swarm_cli/interactive_repl.rb +0 -924
  42. data/lib/swarm_cli/mcp_serve_options.rb +0 -44
  43. data/lib/swarm_cli/mcp_tools_options.rb +0 -59
  44. data/lib/swarm_cli/migrate_options.rb +0 -54
  45. data/lib/swarm_cli/migrator.rb +0 -132
  46. data/lib/swarm_cli/options.rb +0 -151
  47. data/lib/swarm_cli/ui/components/agent_badge.rb +0 -33
  48. data/lib/swarm_cli/ui/components/content_block.rb +0 -120
  49. data/lib/swarm_cli/ui/components/divider.rb +0 -57
  50. data/lib/swarm_cli/ui/components/panel.rb +0 -62
  51. data/lib/swarm_cli/ui/components/usage_stats.rb +0 -70
  52. data/lib/swarm_cli/ui/formatters/cost.rb +0 -49
  53. data/lib/swarm_cli/ui/formatters/number.rb +0 -58
  54. data/lib/swarm_cli/ui/formatters/text.rb +0 -77
  55. data/lib/swarm_cli/ui/formatters/time.rb +0 -73
  56. data/lib/swarm_cli/ui/icons.rb +0 -36
  57. data/lib/swarm_cli/ui/renderers/event_renderer.rb +0 -188
  58. data/lib/swarm_cli/ui/state/agent_color_cache.rb +0 -45
  59. data/lib/swarm_cli/ui/state/depth_tracker.rb +0 -40
  60. data/lib/swarm_cli/ui/state/spinner_manager.rb +0 -170
  61. data/lib/swarm_cli/ui/state/usage_tracker.rb +0 -62
  62. data/lib/swarm_cli/version.rb +0 -5
  63. data/lib/swarm_cli.rb +0 -46
  64. data/lib/swarm_sdk/agent/RETRY_LOGIC.md +0 -127
  65. data/lib/swarm_sdk/agent/builder.rb +0 -552
  66. data/lib/swarm_sdk/agent/chat.rb +0 -774
  67. data/lib/swarm_sdk/agent/chat_helpers/context_tracker.rb +0 -268
  68. data/lib/swarm_sdk/agent/chat_helpers/event_emitter.rb +0 -204
  69. data/lib/swarm_sdk/agent/chat_helpers/hook_integration.rb +0 -480
  70. data/lib/swarm_sdk/agent/chat_helpers/instrumentation.rb +0 -78
  71. data/lib/swarm_sdk/agent/chat_helpers/llm_configuration.rb +0 -233
  72. data/lib/swarm_sdk/agent/chat_helpers/logging_helpers.rb +0 -116
  73. data/lib/swarm_sdk/agent/chat_helpers/serialization.rb +0 -83
  74. data/lib/swarm_sdk/agent/chat_helpers/system_reminder_injector.rb +0 -136
  75. data/lib/swarm_sdk/agent/chat_helpers/system_reminders.rb +0 -79
  76. data/lib/swarm_sdk/agent/chat_helpers/token_tracking.rb +0 -98
  77. data/lib/swarm_sdk/agent/context.rb +0 -116
  78. data/lib/swarm_sdk/agent/context_manager.rb +0 -315
  79. data/lib/swarm_sdk/agent/definition.rb +0 -477
  80. data/lib/swarm_sdk/agent/llm_instrumentation_middleware.rb +0 -182
  81. data/lib/swarm_sdk/agent/system_prompt_builder.rb +0 -161
  82. data/lib/swarm_sdk/builders/base_builder.rb +0 -409
  83. data/lib/swarm_sdk/claude_code_agent_adapter.rb +0 -205
  84. data/lib/swarm_sdk/concerns/cleanupable.rb +0 -39
  85. data/lib/swarm_sdk/concerns/snapshotable.rb +0 -67
  86. data/lib/swarm_sdk/concerns/validatable.rb +0 -55
  87. data/lib/swarm_sdk/configuration/parser.rb +0 -353
  88. data/lib/swarm_sdk/configuration/translator.rb +0 -255
  89. data/lib/swarm_sdk/configuration.rb +0 -135
  90. data/lib/swarm_sdk/context_compactor/metrics.rb +0 -147
  91. data/lib/swarm_sdk/context_compactor/token_counter.rb +0 -106
  92. data/lib/swarm_sdk/context_compactor.rb +0 -335
  93. data/lib/swarm_sdk/context_management/builder.rb +0 -128
  94. data/lib/swarm_sdk/context_management/context.rb +0 -328
  95. data/lib/swarm_sdk/defaults.rb +0 -196
  96. data/lib/swarm_sdk/events_to_messages.rb +0 -199
  97. data/lib/swarm_sdk/hooks/adapter.rb +0 -359
  98. data/lib/swarm_sdk/hooks/context.rb +0 -197
  99. data/lib/swarm_sdk/hooks/definition.rb +0 -80
  100. data/lib/swarm_sdk/hooks/error.rb +0 -29
  101. data/lib/swarm_sdk/hooks/executor.rb +0 -146
  102. data/lib/swarm_sdk/hooks/registry.rb +0 -147
  103. data/lib/swarm_sdk/hooks/result.rb +0 -150
  104. data/lib/swarm_sdk/hooks/shell_executor.rb +0 -255
  105. data/lib/swarm_sdk/hooks/tool_call.rb +0 -35
  106. data/lib/swarm_sdk/hooks/tool_result.rb +0 -62
  107. data/lib/swarm_sdk/log_collector.rb +0 -227
  108. data/lib/swarm_sdk/log_stream.rb +0 -127
  109. data/lib/swarm_sdk/markdown_parser.rb +0 -75
  110. data/lib/swarm_sdk/model_aliases.json +0 -8
  111. data/lib/swarm_sdk/models.json +0 -1
  112. data/lib/swarm_sdk/models.rb +0 -120
  113. data/lib/swarm_sdk/node_context.rb +0 -245
  114. data/lib/swarm_sdk/observer/builder.rb +0 -81
  115. data/lib/swarm_sdk/observer/config.rb +0 -45
  116. data/lib/swarm_sdk/observer/manager.rb +0 -236
  117. data/lib/swarm_sdk/patterns/agent_observer.rb +0 -160
  118. data/lib/swarm_sdk/permissions/config.rb +0 -239
  119. data/lib/swarm_sdk/permissions/error_formatter.rb +0 -121
  120. data/lib/swarm_sdk/permissions/path_matcher.rb +0 -35
  121. data/lib/swarm_sdk/permissions/validator.rb +0 -173
  122. data/lib/swarm_sdk/permissions_builder.rb +0 -122
  123. data/lib/swarm_sdk/plugin.rb +0 -309
  124. data/lib/swarm_sdk/plugin_registry.rb +0 -101
  125. data/lib/swarm_sdk/proc_helpers.rb +0 -53
  126. data/lib/swarm_sdk/prompts/base_system_prompt.md.erb +0 -117
  127. data/lib/swarm_sdk/restore_result.rb +0 -65
  128. data/lib/swarm_sdk/result.rb +0 -123
  129. data/lib/swarm_sdk/snapshot.rb +0 -156
  130. data/lib/swarm_sdk/snapshot_from_events.rb +0 -397
  131. data/lib/swarm_sdk/state_restorer.rb +0 -476
  132. data/lib/swarm_sdk/state_snapshot.rb +0 -334
  133. data/lib/swarm_sdk/swarm/agent_initializer.rb +0 -683
  134. data/lib/swarm_sdk/swarm/all_agents_builder.rb +0 -167
  135. data/lib/swarm_sdk/swarm/builder.rb +0 -249
  136. data/lib/swarm_sdk/swarm/executor.rb +0 -213
  137. data/lib/swarm_sdk/swarm/hook_triggers.rb +0 -150
  138. data/lib/swarm_sdk/swarm/logging_callbacks.rb +0 -340
  139. data/lib/swarm_sdk/swarm/mcp_configurator.rb +0 -154
  140. data/lib/swarm_sdk/swarm/swarm_registry_builder.rb +0 -67
  141. data/lib/swarm_sdk/swarm/tool_configurator.rb +0 -358
  142. data/lib/swarm_sdk/swarm.rb +0 -717
  143. data/lib/swarm_sdk/swarm_loader.rb +0 -145
  144. data/lib/swarm_sdk/swarm_registry.rb +0 -136
  145. data/lib/swarm_sdk/tools/bash.rb +0 -282
  146. data/lib/swarm_sdk/tools/clock.rb +0 -44
  147. data/lib/swarm_sdk/tools/delegate.rb +0 -267
  148. data/lib/swarm_sdk/tools/document_converters/base_converter.rb +0 -83
  149. data/lib/swarm_sdk/tools/document_converters/docx_converter.rb +0 -99
  150. data/lib/swarm_sdk/tools/document_converters/html_converter.rb +0 -101
  151. data/lib/swarm_sdk/tools/document_converters/pdf_converter.rb +0 -78
  152. data/lib/swarm_sdk/tools/document_converters/xlsx_converter.rb +0 -194
  153. data/lib/swarm_sdk/tools/edit.rb +0 -145
  154. data/lib/swarm_sdk/tools/glob.rb +0 -166
  155. data/lib/swarm_sdk/tools/grep.rb +0 -235
  156. data/lib/swarm_sdk/tools/image_extractors/docx_image_extractor.rb +0 -43
  157. data/lib/swarm_sdk/tools/image_extractors/pdf_image_extractor.rb +0 -163
  158. data/lib/swarm_sdk/tools/image_formats/tiff_builder.rb +0 -65
  159. data/lib/swarm_sdk/tools/multi_edit.rb +0 -236
  160. data/lib/swarm_sdk/tools/path_resolver.rb +0 -92
  161. data/lib/swarm_sdk/tools/read.rb +0 -261
  162. data/lib/swarm_sdk/tools/registry.rb +0 -205
  163. data/lib/swarm_sdk/tools/scratchpad/scratchpad_list.rb +0 -117
  164. data/lib/swarm_sdk/tools/scratchpad/scratchpad_read.rb +0 -97
  165. data/lib/swarm_sdk/tools/scratchpad/scratchpad_write.rb +0 -108
  166. data/lib/swarm_sdk/tools/stores/read_tracker.rb +0 -96
  167. data/lib/swarm_sdk/tools/stores/scratchpad_storage.rb +0 -272
  168. data/lib/swarm_sdk/tools/stores/storage.rb +0 -142
  169. data/lib/swarm_sdk/tools/stores/todo_manager.rb +0 -65
  170. data/lib/swarm_sdk/tools/think.rb +0 -98
  171. data/lib/swarm_sdk/tools/todo_write.rb +0 -235
  172. data/lib/swarm_sdk/tools/web_fetch.rb +0 -262
  173. data/lib/swarm_sdk/tools/write.rb +0 -112
  174. data/lib/swarm_sdk/utils.rb +0 -68
  175. data/lib/swarm_sdk/validation_result.rb +0 -33
  176. data/lib/swarm_sdk/version.rb +0 -5
  177. data/lib/swarm_sdk/workflow/agent_config.rb +0 -79
  178. data/lib/swarm_sdk/workflow/builder.rb +0 -143
  179. data/lib/swarm_sdk/workflow/executor.rb +0 -497
  180. data/lib/swarm_sdk/workflow/node_builder.rb +0 -555
  181. data/lib/swarm_sdk/workflow/transformer_executor.rb +0 -249
  182. data/lib/swarm_sdk/workflow.rb +0 -554
  183. data/lib/swarm_sdk.rb +0 -524
  184. /data/lib/swarm_memory/{errors.rb → error.rb} +0 -0
@@ -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