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.
Files changed (182) hide show
  1. checksums.yaml +4 -4
  2. data/lib/swarm_memory/version.rb +1 -1
  3. metadata +5 -184
  4. data/lib/claude_swarm/base_executor.rb +0 -133
  5. data/lib/claude_swarm/claude_code_executor.rb +0 -349
  6. data/lib/claude_swarm/claude_mcp_server.rb +0 -78
  7. data/lib/claude_swarm/cli.rb +0 -697
  8. data/lib/claude_swarm/commands/ps.rb +0 -215
  9. data/lib/claude_swarm/commands/show.rb +0 -139
  10. data/lib/claude_swarm/configuration.rb +0 -373
  11. data/lib/claude_swarm/hooks/session_start_hook.rb +0 -42
  12. data/lib/claude_swarm/json_handler.rb +0 -91
  13. data/lib/claude_swarm/mcp_generator.rb +0 -230
  14. data/lib/claude_swarm/openai/chat_completion.rb +0 -256
  15. data/lib/claude_swarm/openai/executor.rb +0 -256
  16. data/lib/claude_swarm/openai/responses.rb +0 -319
  17. data/lib/claude_swarm/orchestrator.rb +0 -878
  18. data/lib/claude_swarm/process_tracker.rb +0 -78
  19. data/lib/claude_swarm/session_cost_calculator.rb +0 -209
  20. data/lib/claude_swarm/session_path.rb +0 -42
  21. data/lib/claude_swarm/settings_generator.rb +0 -77
  22. data/lib/claude_swarm/system_utils.rb +0 -46
  23. data/lib/claude_swarm/templates/generation_prompt.md.erb +0 -230
  24. data/lib/claude_swarm/tools/reset_session_tool.rb +0 -24
  25. data/lib/claude_swarm/tools/session_info_tool.rb +0 -24
  26. data/lib/claude_swarm/tools/task_tool.rb +0 -63
  27. data/lib/claude_swarm/version.rb +0 -5
  28. data/lib/claude_swarm/worktree_manager.rb +0 -475
  29. data/lib/claude_swarm/yaml_loader.rb +0 -22
  30. data/lib/claude_swarm.rb +0 -67
  31. data/lib/swarm_cli/cli.rb +0 -201
  32. data/lib/swarm_cli/command_registry.rb +0 -61
  33. data/lib/swarm_cli/commands/mcp_serve.rb +0 -130
  34. data/lib/swarm_cli/commands/mcp_tools.rb +0 -148
  35. data/lib/swarm_cli/commands/migrate.rb +0 -55
  36. data/lib/swarm_cli/commands/run.rb +0 -173
  37. data/lib/swarm_cli/config_loader.rb +0 -98
  38. data/lib/swarm_cli/formatters/human_formatter.rb +0 -781
  39. data/lib/swarm_cli/formatters/json_formatter.rb +0 -51
  40. data/lib/swarm_cli/interactive_repl.rb +0 -924
  41. data/lib/swarm_cli/mcp_serve_options.rb +0 -44
  42. data/lib/swarm_cli/mcp_tools_options.rb +0 -59
  43. data/lib/swarm_cli/migrate_options.rb +0 -54
  44. data/lib/swarm_cli/migrator.rb +0 -132
  45. data/lib/swarm_cli/options.rb +0 -151
  46. data/lib/swarm_cli/ui/components/agent_badge.rb +0 -33
  47. data/lib/swarm_cli/ui/components/content_block.rb +0 -120
  48. data/lib/swarm_cli/ui/components/divider.rb +0 -57
  49. data/lib/swarm_cli/ui/components/panel.rb +0 -62
  50. data/lib/swarm_cli/ui/components/usage_stats.rb +0 -70
  51. data/lib/swarm_cli/ui/formatters/cost.rb +0 -49
  52. data/lib/swarm_cli/ui/formatters/number.rb +0 -58
  53. data/lib/swarm_cli/ui/formatters/text.rb +0 -77
  54. data/lib/swarm_cli/ui/formatters/time.rb +0 -73
  55. data/lib/swarm_cli/ui/icons.rb +0 -36
  56. data/lib/swarm_cli/ui/renderers/event_renderer.rb +0 -188
  57. data/lib/swarm_cli/ui/state/agent_color_cache.rb +0 -45
  58. data/lib/swarm_cli/ui/state/depth_tracker.rb +0 -40
  59. data/lib/swarm_cli/ui/state/spinner_manager.rb +0 -170
  60. data/lib/swarm_cli/ui/state/usage_tracker.rb +0 -62
  61. data/lib/swarm_cli/version.rb +0 -5
  62. data/lib/swarm_cli.rb +0 -46
  63. data/lib/swarm_sdk/agent/RETRY_LOGIC.md +0 -127
  64. data/lib/swarm_sdk/agent/builder.rb +0 -552
  65. data/lib/swarm_sdk/agent/chat.rb +0 -774
  66. data/lib/swarm_sdk/agent/chat_helpers/context_tracker.rb +0 -268
  67. data/lib/swarm_sdk/agent/chat_helpers/event_emitter.rb +0 -204
  68. data/lib/swarm_sdk/agent/chat_helpers/hook_integration.rb +0 -480
  69. data/lib/swarm_sdk/agent/chat_helpers/instrumentation.rb +0 -78
  70. data/lib/swarm_sdk/agent/chat_helpers/llm_configuration.rb +0 -233
  71. data/lib/swarm_sdk/agent/chat_helpers/logging_helpers.rb +0 -116
  72. data/lib/swarm_sdk/agent/chat_helpers/serialization.rb +0 -83
  73. data/lib/swarm_sdk/agent/chat_helpers/system_reminder_injector.rb +0 -136
  74. data/lib/swarm_sdk/agent/chat_helpers/system_reminders.rb +0 -79
  75. data/lib/swarm_sdk/agent/chat_helpers/token_tracking.rb +0 -98
  76. data/lib/swarm_sdk/agent/context.rb +0 -116
  77. data/lib/swarm_sdk/agent/context_manager.rb +0 -315
  78. data/lib/swarm_sdk/agent/definition.rb +0 -477
  79. data/lib/swarm_sdk/agent/llm_instrumentation_middleware.rb +0 -182
  80. data/lib/swarm_sdk/agent/system_prompt_builder.rb +0 -161
  81. data/lib/swarm_sdk/builders/base_builder.rb +0 -409
  82. data/lib/swarm_sdk/claude_code_agent_adapter.rb +0 -205
  83. data/lib/swarm_sdk/concerns/cleanupable.rb +0 -39
  84. data/lib/swarm_sdk/concerns/snapshotable.rb +0 -67
  85. data/lib/swarm_sdk/concerns/validatable.rb +0 -55
  86. data/lib/swarm_sdk/configuration/parser.rb +0 -353
  87. data/lib/swarm_sdk/configuration/translator.rb +0 -255
  88. data/lib/swarm_sdk/configuration.rb +0 -135
  89. data/lib/swarm_sdk/context_compactor/metrics.rb +0 -147
  90. data/lib/swarm_sdk/context_compactor/token_counter.rb +0 -106
  91. data/lib/swarm_sdk/context_compactor.rb +0 -335
  92. data/lib/swarm_sdk/context_management/builder.rb +0 -128
  93. data/lib/swarm_sdk/context_management/context.rb +0 -328
  94. data/lib/swarm_sdk/defaults.rb +0 -196
  95. data/lib/swarm_sdk/events_to_messages.rb +0 -199
  96. data/lib/swarm_sdk/hooks/adapter.rb +0 -359
  97. data/lib/swarm_sdk/hooks/context.rb +0 -197
  98. data/lib/swarm_sdk/hooks/definition.rb +0 -80
  99. data/lib/swarm_sdk/hooks/error.rb +0 -29
  100. data/lib/swarm_sdk/hooks/executor.rb +0 -146
  101. data/lib/swarm_sdk/hooks/registry.rb +0 -147
  102. data/lib/swarm_sdk/hooks/result.rb +0 -150
  103. data/lib/swarm_sdk/hooks/shell_executor.rb +0 -255
  104. data/lib/swarm_sdk/hooks/tool_call.rb +0 -35
  105. data/lib/swarm_sdk/hooks/tool_result.rb +0 -62
  106. data/lib/swarm_sdk/log_collector.rb +0 -227
  107. data/lib/swarm_sdk/log_stream.rb +0 -127
  108. data/lib/swarm_sdk/markdown_parser.rb +0 -75
  109. data/lib/swarm_sdk/model_aliases.json +0 -8
  110. data/lib/swarm_sdk/models.json +0 -1
  111. data/lib/swarm_sdk/models.rb +0 -120
  112. data/lib/swarm_sdk/node_context.rb +0 -245
  113. data/lib/swarm_sdk/observer/builder.rb +0 -81
  114. data/lib/swarm_sdk/observer/config.rb +0 -45
  115. data/lib/swarm_sdk/observer/manager.rb +0 -236
  116. data/lib/swarm_sdk/patterns/agent_observer.rb +0 -160
  117. data/lib/swarm_sdk/permissions/config.rb +0 -239
  118. data/lib/swarm_sdk/permissions/error_formatter.rb +0 -121
  119. data/lib/swarm_sdk/permissions/path_matcher.rb +0 -35
  120. data/lib/swarm_sdk/permissions/validator.rb +0 -173
  121. data/lib/swarm_sdk/permissions_builder.rb +0 -122
  122. data/lib/swarm_sdk/plugin.rb +0 -309
  123. data/lib/swarm_sdk/plugin_registry.rb +0 -101
  124. data/lib/swarm_sdk/proc_helpers.rb +0 -53
  125. data/lib/swarm_sdk/prompts/base_system_prompt.md.erb +0 -117
  126. data/lib/swarm_sdk/restore_result.rb +0 -65
  127. data/lib/swarm_sdk/result.rb +0 -123
  128. data/lib/swarm_sdk/snapshot.rb +0 -156
  129. data/lib/swarm_sdk/snapshot_from_events.rb +0 -397
  130. data/lib/swarm_sdk/state_restorer.rb +0 -476
  131. data/lib/swarm_sdk/state_snapshot.rb +0 -334
  132. data/lib/swarm_sdk/swarm/agent_initializer.rb +0 -683
  133. data/lib/swarm_sdk/swarm/all_agents_builder.rb +0 -167
  134. data/lib/swarm_sdk/swarm/builder.rb +0 -249
  135. data/lib/swarm_sdk/swarm/executor.rb +0 -213
  136. data/lib/swarm_sdk/swarm/hook_triggers.rb +0 -150
  137. data/lib/swarm_sdk/swarm/logging_callbacks.rb +0 -340
  138. data/lib/swarm_sdk/swarm/mcp_configurator.rb +0 -154
  139. data/lib/swarm_sdk/swarm/swarm_registry_builder.rb +0 -67
  140. data/lib/swarm_sdk/swarm/tool_configurator.rb +0 -358
  141. data/lib/swarm_sdk/swarm.rb +0 -717
  142. data/lib/swarm_sdk/swarm_loader.rb +0 -145
  143. data/lib/swarm_sdk/swarm_registry.rb +0 -136
  144. data/lib/swarm_sdk/tools/bash.rb +0 -282
  145. data/lib/swarm_sdk/tools/clock.rb +0 -44
  146. data/lib/swarm_sdk/tools/delegate.rb +0 -267
  147. data/lib/swarm_sdk/tools/document_converters/base_converter.rb +0 -83
  148. data/lib/swarm_sdk/tools/document_converters/docx_converter.rb +0 -99
  149. data/lib/swarm_sdk/tools/document_converters/html_converter.rb +0 -101
  150. data/lib/swarm_sdk/tools/document_converters/pdf_converter.rb +0 -78
  151. data/lib/swarm_sdk/tools/document_converters/xlsx_converter.rb +0 -194
  152. data/lib/swarm_sdk/tools/edit.rb +0 -145
  153. data/lib/swarm_sdk/tools/glob.rb +0 -166
  154. data/lib/swarm_sdk/tools/grep.rb +0 -235
  155. data/lib/swarm_sdk/tools/image_extractors/docx_image_extractor.rb +0 -43
  156. data/lib/swarm_sdk/tools/image_extractors/pdf_image_extractor.rb +0 -163
  157. data/lib/swarm_sdk/tools/image_formats/tiff_builder.rb +0 -65
  158. data/lib/swarm_sdk/tools/multi_edit.rb +0 -236
  159. data/lib/swarm_sdk/tools/path_resolver.rb +0 -92
  160. data/lib/swarm_sdk/tools/read.rb +0 -261
  161. data/lib/swarm_sdk/tools/registry.rb +0 -205
  162. data/lib/swarm_sdk/tools/scratchpad/scratchpad_list.rb +0 -117
  163. data/lib/swarm_sdk/tools/scratchpad/scratchpad_read.rb +0 -97
  164. data/lib/swarm_sdk/tools/scratchpad/scratchpad_write.rb +0 -108
  165. data/lib/swarm_sdk/tools/stores/read_tracker.rb +0 -96
  166. data/lib/swarm_sdk/tools/stores/scratchpad_storage.rb +0 -272
  167. data/lib/swarm_sdk/tools/stores/storage.rb +0 -142
  168. data/lib/swarm_sdk/tools/stores/todo_manager.rb +0 -65
  169. data/lib/swarm_sdk/tools/think.rb +0 -98
  170. data/lib/swarm_sdk/tools/todo_write.rb +0 -235
  171. data/lib/swarm_sdk/tools/web_fetch.rb +0 -262
  172. data/lib/swarm_sdk/tools/write.rb +0 -112
  173. data/lib/swarm_sdk/utils.rb +0 -68
  174. data/lib/swarm_sdk/validation_result.rb +0 -33
  175. data/lib/swarm_sdk/version.rb +0 -5
  176. data/lib/swarm_sdk/workflow/agent_config.rb +0 -79
  177. data/lib/swarm_sdk/workflow/builder.rb +0 -143
  178. data/lib/swarm_sdk/workflow/executor.rb +0 -497
  179. data/lib/swarm_sdk/workflow/node_builder.rb +0 -555
  180. data/lib/swarm_sdk/workflow/transformer_executor.rb +0 -249
  181. data/lib/swarm_sdk/workflow.rb +0 -554
  182. data/lib/swarm_sdk.rb +0 -524
@@ -1,334 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module SwarmSDK
4
- # Creates snapshots of swarm/workflow conversation state
5
- #
6
- # Unified implementation that works for both Swarm and Workflow.
7
- # Captures conversation history, context state, scratchpad contents, and
8
- # read tracking information.
9
- #
10
- # The snapshot is a plain Ruby hash that can be serialized to JSON or any
11
- # other format. Configuration (agent definitions, tools, prompts) stays in
12
- # your YAML/DSL and is not included in snapshots.
13
- #
14
- # @example Snapshot a swarm
15
- # swarm = SwarmSDK.build { ... }
16
- # swarm.execute("Build authentication")
17
- # snapshot = swarm.snapshot
18
- # snapshot.write_to_file("session.json")
19
- #
20
- # @example Snapshot a workflow
21
- # workflow = SwarmSDK.workflow { ... }
22
- # workflow.execute("Build feature")
23
- # snapshot = workflow.snapshot
24
- # snapshot.write_to_file("workflow_session.json")
25
- class StateSnapshot
26
- # Initialize snapshot creator
27
- #
28
- # @param orchestration [Swarm, Workflow] Swarm or workflow to snapshot
29
- def initialize(orchestration)
30
- @orchestration = orchestration
31
- end
32
-
33
- # Create snapshot of current state
34
- #
35
- # Returns a Snapshot object that encapsulates the snapshot data with
36
- # convenient methods for serialization and file I/O.
37
- #
38
- # @return [Snapshot] Snapshot object
39
- def snapshot
40
- data = {
41
- version: "2.1.0", # Bumped for plugin state abstraction
42
- type: type_name,
43
- snapshot_at: Time.now.utc.iso8601,
44
- swarm_sdk_version: SwarmSDK::VERSION,
45
- metadata: snapshot_metadata,
46
- agents: snapshot_agents,
47
- delegation_instances: snapshot_delegation_instances,
48
- scratchpad: snapshot_scratchpad,
49
- read_tracking: snapshot_read_tracking,
50
- plugin_states: snapshot_plugin_states,
51
- }
52
-
53
- # Wrap in Snapshot object
54
- SwarmSDK::Snapshot.new(data)
55
- end
56
-
57
- private
58
-
59
- # Get type name for snapshot
60
- #
61
- # @return [String] "swarm" or "workflow"
62
- def type_name
63
- @orchestration.class.name.split("::").last.downcase
64
- end
65
-
66
- # Snapshot common metadata
67
- #
68
- # @return [Hash] Metadata
69
- def snapshot_metadata
70
- {
71
- id: @orchestration.swarm_id,
72
- parent_id: @orchestration.parent_swarm_id,
73
- name: @orchestration.name,
74
- # Swarm-specific: first_message_sent (Workflow returns false)
75
- first_message_sent: @orchestration.first_message_sent?,
76
- }
77
- end
78
-
79
- # Snapshot all agent conversations and context state
80
- #
81
- # Uses interface method: primary_agents (no type checking!)
82
- #
83
- # @return [Hash] { agent_name => { conversation:, context_state:, system_prompt: } }
84
- def snapshot_agents
85
- result = {}
86
-
87
- # Use interface method - works for both Swarm and Workflow!
88
- @orchestration.primary_agents.each do |agent_name, agent_chat|
89
- agent_definition = @orchestration.agent_definitions[agent_name]
90
- system_prompt = agent_definition&.system_prompt
91
-
92
- result[agent_name.to_s] = {
93
- conversation: snapshot_conversation(agent_chat),
94
- context_state: snapshot_context_state(agent_chat),
95
- system_prompt: system_prompt,
96
- }
97
- end
98
-
99
- result
100
- end
101
-
102
- # Snapshot conversation messages for an agent
103
- #
104
- # @param agent_chat [Agent::Chat] Agent chat instance
105
- # @return [Array<Hash>] Serialized messages
106
- def snapshot_conversation(agent_chat)
107
- agent_chat.messages.map { |msg| serialize_message(msg) }
108
- end
109
-
110
- # Serialize a single message
111
- #
112
- # @param msg [RubyLLM::Message] Message to serialize
113
- # @return [Hash] Serialized message
114
- def serialize_message(msg)
115
- hash = { role: msg.role }
116
-
117
- # Handle content - check msg.content directly
118
- hash[:content] = if msg.content.is_a?(RubyLLM::Content)
119
- msg.content.to_h
120
- else
121
- msg.content
122
- end
123
-
124
- # Handle tool calls
125
- if msg.tool_calls && !msg.tool_calls.empty?
126
- hash[:tool_calls] = msg.tool_calls.values.map do |tc|
127
- {
128
- id: tc.id,
129
- name: tc.name,
130
- arguments: tc.arguments,
131
- }
132
- end
133
- end
134
-
135
- # Handle other fields
136
- hash[:tool_call_id] = msg.tool_call_id if msg.tool_call_id
137
- hash[:input_tokens] = msg.input_tokens if msg.input_tokens
138
- hash[:output_tokens] = msg.output_tokens if msg.output_tokens
139
- hash[:model_id] = msg.model_id if msg.model_id
140
-
141
- hash
142
- end
143
-
144
- # Snapshot context state for an agent
145
- #
146
- # @param agent_chat [Agent::Chat] Agent chat instance
147
- # @return [Hash] Context state
148
- def snapshot_context_state(agent_chat)
149
- context_manager = agent_chat.context_manager
150
- agent_context = agent_chat.agent_context
151
-
152
- {
153
- warning_thresholds_hit: agent_context.warning_thresholds_hit.to_a,
154
- compression_applied: context_manager.compression_applied,
155
- last_todowrite_message_index: agent_chat.last_todowrite_message_index,
156
- active_skill_path: agent_chat.active_skill_path,
157
- }
158
- end
159
-
160
- # Snapshot delegation instance conversations
161
- #
162
- # Uses interface method: delegation_instances_hash (no type checking!)
163
- #
164
- # @return [Hash] { "delegate@delegator" => { conversation:, context_state:, system_prompt: } }
165
- def snapshot_delegation_instances
166
- result = {}
167
-
168
- # Use interface method - works for both Swarm and Workflow!
169
- @orchestration.delegation_instances_hash.each do |instance_name, delegation_chat|
170
- # Extract base agent name from instance name
171
- base_name = instance_name.to_s.split("@").first.to_sym
172
-
173
- # Get system prompt from base agent definition
174
- agent_definition = @orchestration.agent_definitions[base_name]
175
- system_prompt = agent_definition&.system_prompt
176
-
177
- result[instance_name] = {
178
- conversation: snapshot_conversation(delegation_chat),
179
- context_state: snapshot_context_state(delegation_chat),
180
- system_prompt: system_prompt,
181
- }
182
- end
183
-
184
- result
185
- end
186
-
187
- # Snapshot scratchpad contents
188
- #
189
- # Detects type and calls appropriate method.
190
- #
191
- # @return [Hash] Scratchpad snapshot data
192
- def snapshot_scratchpad
193
- if @orchestration.is_a?(Workflow)
194
- snapshot_workflow_scratchpad
195
- else
196
- snapshot_swarm_scratchpad
197
- end
198
- end
199
-
200
- # Snapshot scratchpad for Workflow
201
- #
202
- # @return [Hash] Structured scratchpad data with mode metadata
203
- def snapshot_workflow_scratchpad
204
- all_scratchpads = @orchestration.all_scratchpads
205
- return {} unless all_scratchpads&.any?
206
-
207
- if @orchestration.shared_scratchpad?
208
- # Enabled mode: single shared scratchpad
209
- shared_scratchpad = all_scratchpads[:shared]
210
- return {} unless shared_scratchpad
211
-
212
- entries = serialize_scratchpad_entries(shared_scratchpad.all_entries)
213
- return {} if entries.empty?
214
-
215
- {
216
- shared: true,
217
- data: entries,
218
- }
219
- else
220
- # Per-node mode: separate scratchpads per node
221
- node_data = {}
222
- all_scratchpads.each do |node_name, scratchpad|
223
- next unless scratchpad
224
-
225
- entries = serialize_scratchpad_entries(scratchpad.all_entries)
226
- node_data[node_name.to_s] = entries unless entries.empty?
227
- end
228
-
229
- return {} if node_data.empty?
230
-
231
- {
232
- shared: false,
233
- data: node_data,
234
- }
235
- end
236
- end
237
-
238
- # Snapshot scratchpad for Swarm
239
- #
240
- # @return [Hash] Flat scratchpad entries
241
- def snapshot_swarm_scratchpad
242
- scratchpad = @orchestration.scratchpad_storage
243
- return {} unless scratchpad
244
-
245
- entries_hash = scratchpad.all_entries
246
- return {} unless entries_hash&.any?
247
-
248
- serialize_scratchpad_entries(entries_hash)
249
- end
250
-
251
- # Serialize scratchpad entries to snapshot format
252
- #
253
- # @param entries_hash [Hash] { path => Entry }
254
- # @return [Hash] { path => { content:, title:, updated_at:, size: } }
255
- def serialize_scratchpad_entries(entries_hash)
256
- return {} unless entries_hash
257
-
258
- result = {}
259
- entries_hash.each do |path, entry|
260
- result[path] = {
261
- content: entry.content,
262
- title: entry.title,
263
- updated_at: entry.updated_at.iso8601,
264
- size: entry.size,
265
- }
266
- end
267
- result
268
- end
269
-
270
- # Snapshot read tracking state
271
- #
272
- # @return [Hash] { agent_name => { file_path => digest } }
273
- def snapshot_read_tracking
274
- result = {}
275
-
276
- # Get all agents (primary + delegations)
277
- agent_names = all_agent_names
278
-
279
- agent_names.each do |agent_name|
280
- files_with_digests = Tools::Stores::ReadTracker.get_read_files(agent_name)
281
- next if files_with_digests.empty?
282
-
283
- result[agent_name.to_s] = files_with_digests
284
- end
285
-
286
- result
287
- end
288
-
289
- # Snapshot plugin-specific state for all plugins
290
- #
291
- # Iterates over all registered plugins and collects their agent-specific state.
292
- # This decouples the SDK from plugin-specific implementations.
293
- #
294
- # @return [Hash] { plugin_name => { agent_name => plugin_state } }
295
- def snapshot_plugin_states
296
- result = {}
297
-
298
- # Get all agents (primary + delegations)
299
- agent_names = all_agent_names
300
-
301
- # Iterate over all registered plugins
302
- PluginRegistry.all.each do |plugin|
303
- plugin_state = {}
304
-
305
- agent_names.each do |agent_name|
306
- agent_state = plugin.snapshot_agent_state(agent_name)
307
- next if agent_state.empty?
308
-
309
- plugin_state[agent_name.to_s] = agent_state
310
- end
311
-
312
- # Only include plugin if it has state for at least one agent
313
- result[plugin.name.to_s] = plugin_state unless plugin_state.empty?
314
- end
315
-
316
- result
317
- end
318
-
319
- # All agent names (primary + delegations)
320
- #
321
- # Uses interface methods - no type checking!
322
- #
323
- # @return [Array<Symbol>] All agent names
324
- def all_agent_names
325
- # Get primary agent names
326
- agents_hash = @orchestration.agent_definitions.keys
327
-
328
- # Add delegation instance names
329
- delegations_hash = @orchestration.delegation_instances_hash.keys
330
-
331
- agents_hash + delegations_hash.map(&:to_sym)
332
- end
333
- end
334
- end