swarm_sdk 2.7.14 → 3.0.0.alpha2

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 (185) hide show
  1. checksums.yaml +4 -4
  2. data/lib/swarm_sdk/ruby_llm_patches/chat_callbacks_patch.rb +16 -0
  3. data/lib/swarm_sdk/ruby_llm_patches/init.rb +4 -1
  4. data/lib/swarm_sdk/v3/agent.rb +1165 -0
  5. data/lib/swarm_sdk/v3/agent_builder.rb +533 -0
  6. data/lib/swarm_sdk/v3/agent_definition.rb +330 -0
  7. data/lib/swarm_sdk/v3/configuration.rb +490 -0
  8. data/lib/swarm_sdk/v3/debug_log.rb +86 -0
  9. data/lib/swarm_sdk/v3/event_stream.rb +130 -0
  10. data/lib/swarm_sdk/v3/hooks/context.rb +112 -0
  11. data/lib/swarm_sdk/v3/hooks/result.rb +115 -0
  12. data/lib/swarm_sdk/v3/hooks/runner.rb +128 -0
  13. data/lib/swarm_sdk/v3/mcp/connector.rb +183 -0
  14. data/lib/swarm_sdk/v3/mcp/mcp_error.rb +15 -0
  15. data/lib/swarm_sdk/v3/mcp/server_definition.rb +125 -0
  16. data/lib/swarm_sdk/v3/mcp/ssl_http_transport.rb +103 -0
  17. data/lib/swarm_sdk/v3/mcp/stdio_transport.rb +135 -0
  18. data/lib/swarm_sdk/v3/mcp/tool_proxy.rb +53 -0
  19. data/lib/swarm_sdk/v3/memory/adapters/base.rb +297 -0
  20. data/lib/swarm_sdk/v3/memory/adapters/faiss_support.rb +194 -0
  21. data/lib/swarm_sdk/v3/memory/adapters/filesystem_adapter.rb +212 -0
  22. data/lib/swarm_sdk/v3/memory/adapters/sqlite_adapter.rb +507 -0
  23. data/lib/swarm_sdk/v3/memory/adapters/vector_utils.rb +88 -0
  24. data/lib/swarm_sdk/v3/memory/card.rb +206 -0
  25. data/lib/swarm_sdk/v3/memory/cluster.rb +146 -0
  26. data/lib/swarm_sdk/v3/memory/compressor.rb +496 -0
  27. data/lib/swarm_sdk/v3/memory/consolidator.rb +427 -0
  28. data/lib/swarm_sdk/v3/memory/context_builder.rb +339 -0
  29. data/lib/swarm_sdk/v3/memory/edge.rb +105 -0
  30. data/lib/swarm_sdk/v3/memory/embedder.rb +185 -0
  31. data/lib/swarm_sdk/v3/memory/exposure_tracker.rb +104 -0
  32. data/lib/swarm_sdk/v3/memory/ingestion_pipeline.rb +394 -0
  33. data/lib/swarm_sdk/v3/memory/retriever.rb +289 -0
  34. data/lib/swarm_sdk/v3/memory/store.rb +489 -0
  35. data/lib/swarm_sdk/v3/skills/loader.rb +147 -0
  36. data/lib/swarm_sdk/v3/skills/manifest.rb +45 -0
  37. data/lib/swarm_sdk/v3/sub_task_agent.rb +248 -0
  38. data/lib/swarm_sdk/v3/tools/base.rb +80 -0
  39. data/lib/swarm_sdk/v3/tools/bash.rb +174 -0
  40. data/lib/swarm_sdk/v3/tools/clock.rb +32 -0
  41. data/lib/swarm_sdk/v3/tools/document_converters/base.rb +84 -0
  42. data/lib/swarm_sdk/v3/tools/document_converters/docx_converter.rb +120 -0
  43. data/lib/swarm_sdk/v3/tools/document_converters/pdf_converter.rb +111 -0
  44. data/lib/swarm_sdk/v3/tools/document_converters/xlsx_converter.rb +128 -0
  45. data/lib/swarm_sdk/v3/tools/edit.rb +111 -0
  46. data/lib/swarm_sdk/v3/tools/glob.rb +96 -0
  47. data/lib/swarm_sdk/v3/tools/grep.rb +200 -0
  48. data/lib/swarm_sdk/v3/tools/message_teammate.rb +15 -0
  49. data/lib/swarm_sdk/v3/tools/message_user.rb +15 -0
  50. data/lib/swarm_sdk/v3/tools/read.rb +213 -0
  51. data/lib/swarm_sdk/v3/tools/read_tracker.rb +40 -0
  52. data/lib/swarm_sdk/v3/tools/registry.rb +208 -0
  53. data/lib/swarm_sdk/v3/tools/sub_task.rb +183 -0
  54. data/lib/swarm_sdk/v3/tools/think.rb +88 -0
  55. data/lib/swarm_sdk/v3/tools/write.rb +87 -0
  56. data/lib/swarm_sdk/v3.rb +145 -0
  57. metadata +88 -149
  58. data/lib/swarm_sdk/agent/RETRY_LOGIC.md +0 -175
  59. data/lib/swarm_sdk/agent/builder.rb +0 -705
  60. data/lib/swarm_sdk/agent/chat.rb +0 -1438
  61. data/lib/swarm_sdk/agent/chat_helpers/context_tracker.rb +0 -375
  62. data/lib/swarm_sdk/agent/chat_helpers/event_emitter.rb +0 -204
  63. data/lib/swarm_sdk/agent/chat_helpers/hook_integration.rb +0 -480
  64. data/lib/swarm_sdk/agent/chat_helpers/instrumentation.rb +0 -85
  65. data/lib/swarm_sdk/agent/chat_helpers/llm_configuration.rb +0 -290
  66. data/lib/swarm_sdk/agent/chat_helpers/logging_helpers.rb +0 -116
  67. data/lib/swarm_sdk/agent/chat_helpers/serialization.rb +0 -83
  68. data/lib/swarm_sdk/agent/chat_helpers/system_reminder_injector.rb +0 -134
  69. data/lib/swarm_sdk/agent/chat_helpers/system_reminders.rb +0 -79
  70. data/lib/swarm_sdk/agent/chat_helpers/token_tracking.rb +0 -146
  71. data/lib/swarm_sdk/agent/context.rb +0 -115
  72. data/lib/swarm_sdk/agent/context_manager.rb +0 -315
  73. data/lib/swarm_sdk/agent/definition.rb +0 -588
  74. data/lib/swarm_sdk/agent/llm_instrumentation_middleware.rb +0 -226
  75. data/lib/swarm_sdk/agent/system_prompt_builder.rb +0 -173
  76. data/lib/swarm_sdk/agent/tool_registry.rb +0 -189
  77. data/lib/swarm_sdk/agent_registry.rb +0 -146
  78. data/lib/swarm_sdk/builders/base_builder.rb +0 -558
  79. data/lib/swarm_sdk/claude_code_agent_adapter.rb +0 -205
  80. data/lib/swarm_sdk/concerns/cleanupable.rb +0 -42
  81. data/lib/swarm_sdk/concerns/snapshotable.rb +0 -67
  82. data/lib/swarm_sdk/concerns/validatable.rb +0 -55
  83. data/lib/swarm_sdk/config.rb +0 -368
  84. data/lib/swarm_sdk/configuration/parser.rb +0 -397
  85. data/lib/swarm_sdk/configuration/translator.rb +0 -285
  86. data/lib/swarm_sdk/configuration.rb +0 -165
  87. data/lib/swarm_sdk/context_compactor/metrics.rb +0 -147
  88. data/lib/swarm_sdk/context_compactor/token_counter.rb +0 -102
  89. data/lib/swarm_sdk/context_compactor.rb +0 -335
  90. data/lib/swarm_sdk/context_management/builder.rb +0 -128
  91. data/lib/swarm_sdk/context_management/context.rb +0 -328
  92. data/lib/swarm_sdk/custom_tool_registry.rb +0 -226
  93. data/lib/swarm_sdk/defaults.rb +0 -251
  94. data/lib/swarm_sdk/events_to_messages.rb +0 -199
  95. data/lib/swarm_sdk/hooks/adapter.rb +0 -359
  96. data/lib/swarm_sdk/hooks/context.rb +0 -197
  97. data/lib/swarm_sdk/hooks/definition.rb +0 -80
  98. data/lib/swarm_sdk/hooks/error.rb +0 -29
  99. data/lib/swarm_sdk/hooks/executor.rb +0 -146
  100. data/lib/swarm_sdk/hooks/registry.rb +0 -147
  101. data/lib/swarm_sdk/hooks/result.rb +0 -150
  102. data/lib/swarm_sdk/hooks/shell_executor.rb +0 -256
  103. data/lib/swarm_sdk/hooks/tool_call.rb +0 -35
  104. data/lib/swarm_sdk/hooks/tool_result.rb +0 -62
  105. data/lib/swarm_sdk/log_collector.rb +0 -227
  106. data/lib/swarm_sdk/log_stream.rb +0 -127
  107. data/lib/swarm_sdk/markdown_parser.rb +0 -75
  108. data/lib/swarm_sdk/model_aliases.json +0 -8
  109. data/lib/swarm_sdk/models.json +0 -44002
  110. data/lib/swarm_sdk/models.rb +0 -161
  111. data/lib/swarm_sdk/node_context.rb +0 -245
  112. data/lib/swarm_sdk/observer/builder.rb +0 -81
  113. data/lib/swarm_sdk/observer/config.rb +0 -45
  114. data/lib/swarm_sdk/observer/manager.rb +0 -248
  115. data/lib/swarm_sdk/patterns/agent_observer.rb +0 -160
  116. data/lib/swarm_sdk/permissions/config.rb +0 -239
  117. data/lib/swarm_sdk/permissions/error_formatter.rb +0 -121
  118. data/lib/swarm_sdk/permissions/path_matcher.rb +0 -35
  119. data/lib/swarm_sdk/permissions/validator.rb +0 -173
  120. data/lib/swarm_sdk/permissions_builder.rb +0 -122
  121. data/lib/swarm_sdk/plugin.rb +0 -309
  122. data/lib/swarm_sdk/plugin_registry.rb +0 -101
  123. data/lib/swarm_sdk/proc_helpers.rb +0 -53
  124. data/lib/swarm_sdk/prompts/base_system_prompt.md.erb +0 -119
  125. data/lib/swarm_sdk/restore_result.rb +0 -65
  126. data/lib/swarm_sdk/result.rb +0 -241
  127. data/lib/swarm_sdk/snapshot.rb +0 -156
  128. data/lib/swarm_sdk/snapshot_from_events.rb +0 -397
  129. data/lib/swarm_sdk/state_restorer.rb +0 -476
  130. data/lib/swarm_sdk/state_snapshot.rb +0 -334
  131. data/lib/swarm_sdk/swarm/agent_initializer.rb +0 -648
  132. data/lib/swarm_sdk/swarm/all_agents_builder.rb +0 -204
  133. data/lib/swarm_sdk/swarm/builder.rb +0 -256
  134. data/lib/swarm_sdk/swarm/executor.rb +0 -446
  135. data/lib/swarm_sdk/swarm/hook_triggers.rb +0 -162
  136. data/lib/swarm_sdk/swarm/lazy_delegate_chat.rb +0 -372
  137. data/lib/swarm_sdk/swarm/logging_callbacks.rb +0 -361
  138. data/lib/swarm_sdk/swarm/mcp_configurator.rb +0 -290
  139. data/lib/swarm_sdk/swarm/swarm_registry_builder.rb +0 -67
  140. data/lib/swarm_sdk/swarm/tool_configurator.rb +0 -392
  141. data/lib/swarm_sdk/swarm.rb +0 -973
  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/base.rb +0 -63
  145. data/lib/swarm_sdk/tools/bash.rb +0 -280
  146. data/lib/swarm_sdk/tools/clock.rb +0 -46
  147. data/lib/swarm_sdk/tools/delegate.rb +0 -389
  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 -167
  158. data/lib/swarm_sdk/tools/image_formats/tiff_builder.rb +0 -65
  159. data/lib/swarm_sdk/tools/mcp_tool_stub.rb +0 -198
  160. data/lib/swarm_sdk/tools/multi_edit.rb +0 -236
  161. data/lib/swarm_sdk/tools/path_resolver.rb +0 -92
  162. data/lib/swarm_sdk/tools/read.rb +0 -261
  163. data/lib/swarm_sdk/tools/registry.rb +0 -205
  164. data/lib/swarm_sdk/tools/scratchpad/scratchpad_list.rb +0 -117
  165. data/lib/swarm_sdk/tools/scratchpad/scratchpad_read.rb +0 -97
  166. data/lib/swarm_sdk/tools/scratchpad/scratchpad_write.rb +0 -108
  167. data/lib/swarm_sdk/tools/stores/read_tracker.rb +0 -96
  168. data/lib/swarm_sdk/tools/stores/scratchpad_storage.rb +0 -273
  169. data/lib/swarm_sdk/tools/stores/storage.rb +0 -142
  170. data/lib/swarm_sdk/tools/stores/todo_manager.rb +0 -65
  171. data/lib/swarm_sdk/tools/think.rb +0 -100
  172. data/lib/swarm_sdk/tools/todo_write.rb +0 -237
  173. data/lib/swarm_sdk/tools/web_fetch.rb +0 -264
  174. data/lib/swarm_sdk/tools/write.rb +0 -112
  175. data/lib/swarm_sdk/transcript_builder.rb +0 -278
  176. data/lib/swarm_sdk/utils.rb +0 -68
  177. data/lib/swarm_sdk/validation_result.rb +0 -33
  178. data/lib/swarm_sdk/version.rb +0 -5
  179. data/lib/swarm_sdk/workflow/agent_config.rb +0 -95
  180. data/lib/swarm_sdk/workflow/builder.rb +0 -227
  181. data/lib/swarm_sdk/workflow/executor.rb +0 -497
  182. data/lib/swarm_sdk/workflow/node_builder.rb +0 -593
  183. data/lib/swarm_sdk/workflow/transformer_executor.rb +0 -250
  184. data/lib/swarm_sdk/workflow.rb +0 -589
  185. data/lib/swarm_sdk.rb +0 -721
@@ -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