claude_swarm 1.0.9 → 1.0.11
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/{CHANGELOG.md → CHANGELOG.claude-swarm.md} +10 -0
- data/CLAUDE.md +346 -191
- data/decisions/2025-11-22-001-global-agent-registry.md +172 -0
- data/docs/v2/CHANGELOG.swarm_cli.md +20 -0
- data/docs/v2/CHANGELOG.swarm_memory.md +146 -1
- data/docs/v2/CHANGELOG.swarm_sdk.md +433 -10
- data/docs/v2/README.md +20 -5
- data/docs/v2/guides/complete-tutorial.md +95 -9
- data/docs/v2/guides/getting-started.md +10 -8
- data/docs/v2/guides/memory-adapters.md +41 -0
- data/docs/v2/guides/migrating-to-2.x.md +746 -0
- data/docs/v2/guides/plugins.md +52 -5
- data/docs/v2/guides/rails-integration.md +6 -0
- data/docs/v2/guides/snapshots.md +14 -14
- data/docs/v2/guides/swarm-memory.md +2 -13
- data/docs/v2/reference/architecture-flow.md +3 -3
- data/docs/v2/reference/cli.md +0 -1
- data/docs/v2/reference/configuration_reference.md +300 -0
- data/docs/v2/reference/event_payload_structures.md +27 -5
- data/docs/v2/reference/ruby-dsl.md +614 -18
- data/docs/v2/reference/swarm_memory_technical_details.md +7 -29
- data/docs/v2/reference/yaml.md +172 -54
- data/examples/snapshot_demo.rb +2 -2
- data/lib/claude_swarm/mcp_generator.rb +8 -21
- data/lib/claude_swarm/orchestrator.rb +8 -1
- data/lib/claude_swarm/version.rb +1 -1
- data/lib/swarm_cli/commands/run.rb +2 -2
- data/lib/swarm_cli/config_loader.rb +11 -11
- data/lib/swarm_cli/formatters/human_formatter.rb +0 -33
- data/lib/swarm_cli/interactive_repl.rb +2 -2
- data/lib/swarm_cli/ui/icons.rb +0 -23
- data/lib/swarm_cli/version.rb +1 -1
- data/lib/swarm_memory/adapters/filesystem_adapter.rb +11 -34
- data/lib/swarm_memory/core/semantic_index.rb +10 -2
- data/lib/swarm_memory/core/storage.rb +7 -2
- data/lib/swarm_memory/dsl/memory_config.rb +37 -0
- data/lib/swarm_memory/integration/sdk_plugin.rb +201 -28
- data/lib/swarm_memory/optimization/defragmenter.rb +1 -1
- data/lib/swarm_memory/prompts/memory_researcher.md.erb +0 -1
- data/lib/swarm_memory/tools/load_skill.rb +0 -1
- data/lib/swarm_memory/tools/memory_edit.rb +2 -1
- data/lib/swarm_memory/tools/memory_read.rb +1 -1
- data/lib/swarm_memory/version.rb +1 -1
- data/lib/swarm_memory.rb +8 -6
- data/lib/swarm_sdk/agent/builder.rb +58 -0
- data/lib/swarm_sdk/agent/chat.rb +527 -1061
- data/lib/swarm_sdk/agent/{chat → chat_helpers}/context_tracker.rb +13 -88
- data/lib/swarm_sdk/agent/chat_helpers/event_emitter.rb +204 -0
- data/lib/swarm_sdk/agent/{chat → chat_helpers}/hook_integration.rb +108 -46
- data/lib/swarm_sdk/agent/chat_helpers/instrumentation.rb +78 -0
- data/lib/swarm_sdk/agent/chat_helpers/llm_configuration.rb +267 -0
- data/lib/swarm_sdk/agent/{chat → chat_helpers}/logging_helpers.rb +3 -3
- data/lib/swarm_sdk/agent/chat_helpers/serialization.rb +83 -0
- data/lib/swarm_sdk/agent/{chat → chat_helpers}/system_reminder_injector.rb +11 -13
- data/lib/swarm_sdk/agent/chat_helpers/system_reminders.rb +79 -0
- data/lib/swarm_sdk/agent/chat_helpers/token_tracking.rb +146 -0
- data/lib/swarm_sdk/agent/context.rb +1 -2
- data/lib/swarm_sdk/agent/definition.rb +66 -154
- data/lib/swarm_sdk/agent/llm_instrumentation_middleware.rb +4 -2
- data/lib/swarm_sdk/agent/system_prompt_builder.rb +161 -0
- data/lib/swarm_sdk/agent_registry.rb +146 -0
- data/lib/swarm_sdk/builders/base_builder.rb +488 -0
- data/lib/swarm_sdk/concerns/cleanupable.rb +39 -0
- data/lib/swarm_sdk/concerns/snapshotable.rb +67 -0
- data/lib/swarm_sdk/concerns/validatable.rb +55 -0
- data/lib/swarm_sdk/config.rb +302 -0
- data/lib/swarm_sdk/configuration/parser.rb +373 -0
- data/lib/swarm_sdk/configuration/translator.rb +255 -0
- data/lib/swarm_sdk/configuration.rb +77 -546
- data/lib/swarm_sdk/context_compactor/token_counter.rb +2 -6
- data/lib/swarm_sdk/context_compactor.rb +6 -11
- data/lib/swarm_sdk/context_management/builder.rb +128 -0
- data/lib/swarm_sdk/context_management/context.rb +328 -0
- data/lib/swarm_sdk/custom_tool_registry.rb +226 -0
- data/lib/swarm_sdk/defaults.rb +196 -0
- data/lib/swarm_sdk/events_to_messages.rb +18 -0
- data/lib/swarm_sdk/hooks/adapter.rb +3 -3
- data/lib/swarm_sdk/hooks/shell_executor.rb +4 -2
- data/lib/swarm_sdk/log_collector.rb +179 -29
- data/lib/swarm_sdk/log_stream.rb +29 -0
- data/lib/swarm_sdk/models.json +4333 -1
- data/lib/swarm_sdk/models.rb +43 -2
- data/lib/swarm_sdk/node_context.rb +1 -1
- data/lib/swarm_sdk/observer/builder.rb +81 -0
- data/lib/swarm_sdk/observer/config.rb +45 -0
- data/lib/swarm_sdk/observer/manager.rb +236 -0
- data/lib/swarm_sdk/patterns/agent_observer.rb +160 -0
- data/lib/swarm_sdk/plugin.rb +95 -5
- data/lib/swarm_sdk/result.rb +52 -0
- data/lib/swarm_sdk/snapshot.rb +6 -6
- data/lib/swarm_sdk/snapshot_from_events.rb +13 -2
- data/lib/swarm_sdk/state_restorer.rb +136 -151
- data/lib/swarm_sdk/state_snapshot.rb +65 -100
- data/lib/swarm_sdk/swarm/agent_initializer.rb +181 -137
- data/lib/swarm_sdk/swarm/builder.rb +44 -578
- data/lib/swarm_sdk/swarm/executor.rb +213 -0
- data/lib/swarm_sdk/swarm/hook_triggers.rb +151 -0
- data/lib/swarm_sdk/swarm/logging_callbacks.rb +341 -0
- data/lib/swarm_sdk/swarm/mcp_configurator.rb +7 -4
- data/lib/swarm_sdk/swarm/tool_configurator.rb +58 -140
- data/lib/swarm_sdk/swarm.rb +203 -683
- data/lib/swarm_sdk/tools/bash.rb +14 -8
- data/lib/swarm_sdk/tools/delegate.rb +61 -43
- data/lib/swarm_sdk/tools/edit.rb +8 -13
- data/lib/swarm_sdk/tools/glob.rb +12 -4
- data/lib/swarm_sdk/tools/grep.rb +7 -0
- data/lib/swarm_sdk/tools/multi_edit.rb +15 -11
- data/lib/swarm_sdk/tools/path_resolver.rb +51 -2
- data/lib/swarm_sdk/tools/read.rb +16 -18
- data/lib/swarm_sdk/tools/registry.rb +122 -10
- data/lib/swarm_sdk/tools/stores/scratchpad_storage.rb +9 -5
- data/lib/swarm_sdk/tools/stores/storage.rb +0 -6
- data/lib/swarm_sdk/tools/todo_write.rb +7 -0
- data/lib/swarm_sdk/tools/web_fetch.rb +20 -17
- data/lib/swarm_sdk/tools/write.rb +8 -13
- data/lib/swarm_sdk/version.rb +1 -1
- data/lib/swarm_sdk/{node → workflow}/agent_config.rb +1 -1
- data/lib/swarm_sdk/workflow/builder.rb +192 -0
- data/lib/swarm_sdk/workflow/executor.rb +497 -0
- data/lib/swarm_sdk/{node/builder.rb → workflow/node_builder.rb} +7 -5
- data/lib/swarm_sdk/{node → workflow}/transformer_executor.rb +5 -3
- data/lib/swarm_sdk/{node_orchestrator.rb → workflow.rb} +152 -456
- data/lib/swarm_sdk.rb +294 -108
- data/rubocop/cop/security/no_reflection_methods.rb +1 -1
- data/swarm_cli.gemspec +1 -1
- data/swarm_memory.gemspec +8 -3
- data/swarm_sdk.gemspec +6 -4
- data/team_full.yml +124 -320
- metadata +42 -14
- data/lib/swarm_memory/chat_extension.rb +0 -34
- data/lib/swarm_memory/tools/memory_multi_edit.rb +0 -281
- data/lib/swarm_sdk/providers/openai_with_responses.rb +0 -589
- /data/lib/swarm_memory/{errors.rb → error.rb} +0 -0
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
# Decision: Global Agent Registry for SwarmSDK
|
|
2
|
+
|
|
3
|
+
**Date:** 2025-11-22
|
|
4
|
+
**Status:** Implemented
|
|
5
|
+
|
|
6
|
+
## Context
|
|
7
|
+
|
|
8
|
+
Users wanted the ability to declare agents in separate files and reference them by name in swarm definitions. This promotes:
|
|
9
|
+
- Code reuse across multiple swarms
|
|
10
|
+
- Separation of concerns (agent definitions vs swarm composition)
|
|
11
|
+
- Cleaner organization for large projects
|
|
12
|
+
|
|
13
|
+
## Decision
|
|
14
|
+
|
|
15
|
+
Implement a global `AgentRegistry` that stores agent configuration blocks and allows referencing them in `SwarmSDK.build` and `SwarmSDK.workflow` definitions.
|
|
16
|
+
|
|
17
|
+
### API Design
|
|
18
|
+
|
|
19
|
+
```ruby
|
|
20
|
+
# Register agent in separate file (e.g., agents/backend.rb)
|
|
21
|
+
SwarmSDK.agent :backend do
|
|
22
|
+
model "claude-sonnet-4"
|
|
23
|
+
description "Backend developer"
|
|
24
|
+
system_prompt "You build APIs"
|
|
25
|
+
tools :Read, :Edit, :Bash
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# Reference in swarm definition
|
|
29
|
+
SwarmSDK.build do
|
|
30
|
+
name "Dev Team"
|
|
31
|
+
lead :backend
|
|
32
|
+
|
|
33
|
+
agent :backend # Lookup from registry
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# Extend with overrides
|
|
37
|
+
SwarmSDK.build do
|
|
38
|
+
name "Extended Team"
|
|
39
|
+
lead :backend
|
|
40
|
+
|
|
41
|
+
agent :backend do
|
|
42
|
+
tools :CustomTool # Adds to registry tools
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### Key Design Decisions
|
|
48
|
+
|
|
49
|
+
1. **Proc Storage (not Lambda)**
|
|
50
|
+
- Procs work naturally with `instance_eval` DSL semantics
|
|
51
|
+
- Flexible arity handling suits DSL blocks
|
|
52
|
+
- Blocks passed to methods are already Procs
|
|
53
|
+
|
|
54
|
+
2. **Class with Class Methods (not Singleton)**
|
|
55
|
+
- Simpler than full Singleton pattern
|
|
56
|
+
- Easier to test with `AgentRegistry.clear`
|
|
57
|
+
- Class methods feel natural for global registry
|
|
58
|
+
|
|
59
|
+
3. **Duplicate Registration Error**
|
|
60
|
+
- Raises `ArgumentError` if registering same name twice
|
|
61
|
+
- Prevents accidental overwrites across files
|
|
62
|
+
- User must call `SwarmSDK.clear_agent_registry!` to reset
|
|
63
|
+
|
|
64
|
+
4. **Registry Takes Precedence**
|
|
65
|
+
- When `agent :name do ... end` is called and agent is registered:
|
|
66
|
+
- Registry config is applied first
|
|
67
|
+
- Block becomes overrides (additive)
|
|
68
|
+
- Promotes DRY principle - registry is source of truth
|
|
69
|
+
|
|
70
|
+
5. **No Thread Safety**
|
|
71
|
+
- SwarmSDK uses fiber-based concurrency (Async gem)
|
|
72
|
+
- Single-threaded execution means no race conditions
|
|
73
|
+
- Documented limitation for multi-threaded environments
|
|
74
|
+
|
|
75
|
+
6. **Delegation is Swarm-Specific (Best Practice)**
|
|
76
|
+
- Don't set `delegates_to` in registry agent definitions
|
|
77
|
+
- Delegation targets depend on which agents exist in each swarm
|
|
78
|
+
- Set `delegates_to` as an override when referencing the agent in a swarm
|
|
79
|
+
- This makes agents truly reusable across different swarm compositions
|
|
80
|
+
|
|
81
|
+
## Implementation
|
|
82
|
+
|
|
83
|
+
### New Files
|
|
84
|
+
- `lib/swarm_sdk/agent_registry.rb` - AgentRegistry class
|
|
85
|
+
|
|
86
|
+
### Modified Files
|
|
87
|
+
- `lib/swarm_sdk.rb` - Added `SwarmSDK.agent` and `SwarmSDK.clear_agent_registry!`
|
|
88
|
+
- `lib/swarm_sdk/builders/base_builder.rb` - Added registry lookup to `#agent` method
|
|
89
|
+
|
|
90
|
+
### Test Coverage
|
|
91
|
+
- 26 tests covering:
|
|
92
|
+
- Registry class methods (register, get, registered?, names, clear)
|
|
93
|
+
- Module methods (agent, clear_agent_registry!)
|
|
94
|
+
- Registry lookup in Swarm and Workflow builders
|
|
95
|
+
- Registry + overrides behavior
|
|
96
|
+
- Multiple swarms sharing registry
|
|
97
|
+
- Error handling
|
|
98
|
+
- Edge cases
|
|
99
|
+
|
|
100
|
+
## Alternatives Considered
|
|
101
|
+
|
|
102
|
+
1. **Explicit Syntax (`agent :name, from: :registry`)**
|
|
103
|
+
- Rejected: Too verbose for common use case
|
|
104
|
+
- Current behavior is intuitive (no args = lookup)
|
|
105
|
+
|
|
106
|
+
2. **Warning on Shadow**
|
|
107
|
+
- Rejected: Too noisy, users might ignore
|
|
108
|
+
- Error-free operation preferred
|
|
109
|
+
|
|
110
|
+
3. **Thread-Safe Implementation**
|
|
111
|
+
- Rejected: Unnecessary complexity for fiber-based model
|
|
112
|
+
- The definitions should be eager loaded in the app that is using the SDK
|
|
113
|
+
- Documented limitation acceptable
|
|
114
|
+
|
|
115
|
+
## Enhancement: Workflow Node Registry Fallback
|
|
116
|
+
|
|
117
|
+
Added automatic agent resolution in workflow nodes. When `agent(:name)` is called inside a node:
|
|
118
|
+
|
|
119
|
+
1. First checks if agent is defined at workflow level
|
|
120
|
+
2. If not found, checks the global AgentRegistry
|
|
121
|
+
3. If still not found, raises ConfigurationError
|
|
122
|
+
|
|
123
|
+
This allows powerful patterns like:
|
|
124
|
+
|
|
125
|
+
```ruby
|
|
126
|
+
# agents/shared.rb
|
|
127
|
+
SwarmSDK.agent :shared_analyzer do
|
|
128
|
+
model "claude-sonnet-4"
|
|
129
|
+
description "Shared analyzer"
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
# workflow.rb
|
|
133
|
+
SwarmSDK.workflow do
|
|
134
|
+
name "Pipeline"
|
|
135
|
+
start_node :analyze
|
|
136
|
+
|
|
137
|
+
# No need to define shared_analyzer here!
|
|
138
|
+
|
|
139
|
+
node :analyze do
|
|
140
|
+
agent(:shared_analyzer) # Auto-resolved from registry
|
|
141
|
+
end
|
|
142
|
+
end
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
The fallback also resolves delegation targets:
|
|
146
|
+
|
|
147
|
+
```ruby
|
|
148
|
+
node :process do
|
|
149
|
+
agent(:main_agent).delegates_to(:helper_agent)
|
|
150
|
+
# Both resolved from registry
|
|
151
|
+
end
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
### Implementation
|
|
155
|
+
- Modified `Workflow::Builder#build_workflow` to call `resolve_missing_agents_from_registry`
|
|
156
|
+
- Added `collect_referenced_agents` to gather all agents from nodes (including delegates_to)
|
|
157
|
+
- Resolution happens at build time before agent definitions are built
|
|
158
|
+
|
|
159
|
+
## Consequences
|
|
160
|
+
|
|
161
|
+
### Positive
|
|
162
|
+
- Clean separation of agent definitions from swarm composition
|
|
163
|
+
- Easy code reuse across swarms
|
|
164
|
+
- Intuitive API that matches existing DSL patterns
|
|
165
|
+
- Works with both Swarm and Workflow builders
|
|
166
|
+
- Workflow nodes automatically resolve agents from registry
|
|
167
|
+
- Delegation targets also auto-resolve from registry
|
|
168
|
+
|
|
169
|
+
### Negative
|
|
170
|
+
- Global state (mitigated by clear method for testing)
|
|
171
|
+
- Not thread-safe (documented limitation)
|
|
172
|
+
- Must require agent files before building swarms
|
|
@@ -5,6 +5,26 @@ All notable changes to SwarmCLI will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [2.1.7]
|
|
9
|
+
|
|
10
|
+
### Dependencies
|
|
11
|
+
|
|
12
|
+
- Updated `swarm_sdk` to `~> 2.5.1`
|
|
13
|
+
|
|
14
|
+
## [2.1.6]
|
|
15
|
+
- Bump SDK and memory gem versions
|
|
16
|
+
|
|
17
|
+
## [2.1.5]
|
|
18
|
+
- Bump SDK gem version
|
|
19
|
+
|
|
20
|
+
## [2.1.4]
|
|
21
|
+
|
|
22
|
+
### Changed
|
|
23
|
+
|
|
24
|
+
- `ConfigLoader` now accepts both `SwarmSDK::Swarm` and `SwarmSDK::Workflow` instances from Ruby DSL files
|
|
25
|
+
- Updated error messages to reference `Workflow` instead of `NodeOrchestrator`
|
|
26
|
+
- Both swarms and workflows work seamlessly with CLI commands
|
|
27
|
+
|
|
8
28
|
## [2.1.3]
|
|
9
29
|
|
|
10
30
|
### Fixed
|
|
@@ -5,7 +5,152 @@ All notable changes to SwarmMemory will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
-
## [
|
|
8
|
+
## [2.2.3]
|
|
9
|
+
|
|
10
|
+
### Fixed
|
|
11
|
+
|
|
12
|
+
- **Hybrid search weight configuration**: Fixed bug where `semantic_weight` and `keyword_weight` from config weren't being passed to SemanticIndex
|
|
13
|
+
- **Issue**: SDK plugin extracted weights from config but didn't pass them to Storage/SemanticIndex
|
|
14
|
+
- **Fix**: Storage now accepts and passes weight parameters through to SemanticIndex
|
|
15
|
+
- **Impact**: Per-agent weight configuration now works correctly (was only used for logging before)
|
|
16
|
+
- **Files**: `lib/swarm_memory/core/storage.rb:23-35`, `lib/swarm_memory/integration/sdk_plugin.rb:130-150`
|
|
17
|
+
|
|
18
|
+
- **YAML config with string keys**: Fixed bug where Hash configs with string keys would fail adapter initialization
|
|
19
|
+
- **Issue**: Adapters expect symbol keyword arguments, but YAML configs have string keys
|
|
20
|
+
- **Fix**: Symbolize adapter option keys in create_storage for Hash configs
|
|
21
|
+
- **Impact**: YAML configurations now work correctly with all adapters
|
|
22
|
+
- **Files**: `lib/swarm_memory/integration/sdk_plugin.rb:113-118`
|
|
23
|
+
|
|
24
|
+
### Added
|
|
25
|
+
|
|
26
|
+
- **DSL methods for weights**: Added `semantic_weight()` and `keyword_weight()` methods to MemoryConfig
|
|
27
|
+
- **Before**: `option(:semantic_weight, 0.8)`
|
|
28
|
+
- **After**: `semantic_weight(0.8)` (cleaner syntax, consistent with `directory()` and `mode()`)
|
|
29
|
+
- **Backward compatible**: `option()` method still works
|
|
30
|
+
- **Files**: `lib/swarm_memory/dsl/memory_config.rb:87-122`
|
|
31
|
+
|
|
32
|
+
### Changed
|
|
33
|
+
|
|
34
|
+
- **Automatic semantic fallback**: Hybrid search now falls back to pure semantic scoring when keyword_score is 0
|
|
35
|
+
- **Before**: semantic=0.92, keyword=0.0 → final=0.46 (penalized by 50/50 weights)
|
|
36
|
+
- **After**: semantic=0.92, keyword=0.0 → final=0.92 (no penalty when no tag matches)
|
|
37
|
+
- **Rationale**: Prevents excellent semantic matches from being penalized when there's no keyword/tag overlap
|
|
38
|
+
- **Impact**: Improved recall for queries with no tag matches
|
|
39
|
+
- **Files**: `lib/swarm_memory/core/semantic_index.rb:195-201`
|
|
40
|
+
|
|
41
|
+
## [2.2.2]
|
|
42
|
+
|
|
43
|
+
### Dependencies
|
|
44
|
+
|
|
45
|
+
- Updated `swarm_sdk` to `~> 2.5.1`
|
|
46
|
+
|
|
47
|
+
## [2.2.1]
|
|
48
|
+
|
|
49
|
+
### Fixed
|
|
50
|
+
|
|
51
|
+
- **MemoryEdit metadata preservation**: MemoryEdit now preserves all metadata when updating entry content
|
|
52
|
+
- **Issue**: MemoryEdit was only preserving title, losing tags, confidence, domain, and other metadata
|
|
53
|
+
- **Fix**: Pass `metadata: entry.metadata` to storage.write to preserve all existing metadata
|
|
54
|
+
- **Impact**: Prevents metadata loss when editing memory entries
|
|
55
|
+
- **Files**: `lib/swarm_memory/tools/memory_edit.rb:169`
|
|
56
|
+
|
|
57
|
+
## [2.2.0]
|
|
58
|
+
|
|
59
|
+
### Added
|
|
60
|
+
|
|
61
|
+
- **Per-Adapter Threshold Configuration**: Semantic search thresholds can now be configured per-adapter in YAML
|
|
62
|
+
- **Fallback chain**: `adapter_config → ENV var → hardcoded_default` (config wins over ENV)
|
|
63
|
+
- **Supported threshold keys**:
|
|
64
|
+
- `discovery_threshold` (default: 0.35) - Main similarity threshold for normal queries
|
|
65
|
+
- `discovery_threshold_short` (default: 0.25) - Threshold for queries with <10 words
|
|
66
|
+
- `adaptive_word_cutoff` (default: 10) - Word count to switch between thresholds
|
|
67
|
+
- `semantic_weight` (default: 0.5) - Hybrid search semantic weight
|
|
68
|
+
- `keyword_weight` (default: 0.5) - Hybrid search keyword weight
|
|
69
|
+
- **Use cases**: Per-agent threshold tuning, adapter-specific optimization (pgvector vs FAISS), multi-tenant customization
|
|
70
|
+
- **Backward compatible**: ENV vars still work as deployment-level override
|
|
71
|
+
- **Zero config required**: Sensible defaults work out of the box
|
|
72
|
+
- **Example**:
|
|
73
|
+
```yaml
|
|
74
|
+
memory:
|
|
75
|
+
adapter: multi_bank_postgres
|
|
76
|
+
agent_id: researcher
|
|
77
|
+
discovery_threshold: 0.5
|
|
78
|
+
discovery_threshold_short: 0.3
|
|
79
|
+
semantic_weight: 0.6
|
|
80
|
+
```
|
|
81
|
+
- **Files**: `lib/swarm_memory/integration/sdk_plugin.rb`
|
|
82
|
+
- **Tests**: 4 new tests validating threshold extraction and fallback behavior
|
|
83
|
+
|
|
84
|
+
- **Custom Adapter Support**: SwarmMemory now fully supports custom storage adapters
|
|
85
|
+
- **Custom adapter options pass-through**: All YAML config keys (except `directory`, `adapter`, `mode`) are now passed to adapter constructor
|
|
86
|
+
- **Example configuration**:
|
|
87
|
+
```yaml
|
|
88
|
+
memory:
|
|
89
|
+
adapter: multi_bank_postgres
|
|
90
|
+
agent_id: business_consultant
|
|
91
|
+
default_bank: working
|
|
92
|
+
banks:
|
|
93
|
+
working: { max_size: 10485760 }
|
|
94
|
+
long_term: { max_size: 52428800 }
|
|
95
|
+
bank_access:
|
|
96
|
+
archive: read_only
|
|
97
|
+
```
|
|
98
|
+
- **Enables**: PostgreSQL, MySQL, Redis, S3, and any custom storage backend
|
|
99
|
+
- **Files**: `lib/swarm_memory/integration/sdk_plugin.rb:290-310`
|
|
100
|
+
- **Tests**: 2 new tests for custom adapter option pass-through
|
|
101
|
+
|
|
102
|
+
### Changed
|
|
103
|
+
|
|
104
|
+
- **BREAKING: `storage_enabled?` renamed to `memory_configured?`** in SDKPlugin
|
|
105
|
+
- **Improved logic**: Filesystem adapter requires `directory`, custom adapters can use any configuration keys
|
|
106
|
+
- **Better validation**: Custom adapters are recognized as valid even without `directory` key
|
|
107
|
+
- **Adapter validation**: Each adapter validates its own requirements during initialization
|
|
108
|
+
- **No backward compatibility**: `storage_enabled?` method removed entirely (breaking change)
|
|
109
|
+
- **Migration**: Update any code calling `plugin.storage_enabled?()` to use `plugin.memory_configured?()`
|
|
110
|
+
- **Files**: `lib/swarm_memory/integration/sdk_plugin.rb:202-235`
|
|
111
|
+
- **Tests**: 3 new tests for custom adapter recognition
|
|
112
|
+
|
|
113
|
+
### Removed
|
|
114
|
+
|
|
115
|
+
- **MemoryMultiEdit tool**: Removed in favor of simpler MemoryEdit tool
|
|
116
|
+
- **Rationale**: Memory entries are small (typically < 100 lines), making batch edits unnecessary
|
|
117
|
+
- **Alternative**: Use multiple `MemoryEdit` calls for sequential edits
|
|
118
|
+
- **Simplification**: Reduces API complexity and LLM error surface (JSON parameter was error-prone)
|
|
119
|
+
- **Files removed**: `lib/swarm_memory/tools/memory_multi_edit.rb`
|
|
120
|
+
- **Tool count**: Memory tools reduced from 8 to 7 (MemoryWrite, MemoryRead, MemoryEdit, MemoryDelete, MemoryGlob, MemoryGrep, MemoryDefrag)
|
|
121
|
+
|
|
122
|
+
### Benefits
|
|
123
|
+
|
|
124
|
+
- ✅ **Eliminates need for monkey patches** when building custom adapters
|
|
125
|
+
- ✅ **Makes SwarmMemory fully extensible** for any storage backend
|
|
126
|
+
- ✅ **Per-agent threshold tuning** for optimal semantic search accuracy
|
|
127
|
+
- ✅ **Multi-tenant customization** with per-adapter configuration
|
|
128
|
+
- ✅ **Clearer semantics** (memory vs storage terminology)
|
|
129
|
+
- ✅ **Better error messages** (adapters validate themselves)
|
|
130
|
+
|
|
131
|
+
## [2.1.7]
|
|
132
|
+
|
|
133
|
+
### Dependencies
|
|
134
|
+
|
|
135
|
+
- Updated `ruby_llm_swarm` to `~> 1.9.5`
|
|
136
|
+
|
|
137
|
+
## [2.1.6]
|
|
138
|
+
- Fix files included in the gem
|
|
139
|
+
|
|
140
|
+
## [2.1.5]
|
|
141
|
+
|
|
142
|
+
### Fixed
|
|
143
|
+
- **Fixed Zeitwerk naming convention**: Renamed `lib/swarm_memory/errors.rb` to `lib/swarm_memory/error.rb` to match the `SwarmMemory::Error` constant it defines
|
|
144
|
+
- Fixes `Zeitwerk::Loader.eager_load_all` failures with "uninitialized constant SwarmMemory::Errors" errors
|
|
145
|
+
- Properly follows Zeitwerk file naming conventions where `error.rb` defines `Error` class
|
|
146
|
+
|
|
147
|
+
## [2.1.4]
|
|
148
|
+
|
|
149
|
+
### Changed
|
|
150
|
+
|
|
151
|
+
- Updated documentation to reference `Workflow` instead of `NodeOrchestrator`
|
|
152
|
+
- Memory configuration preserved when agents are cloned in `Workflow` (formerly `NodeOrchestrator`)
|
|
153
|
+
- No functional changes - fully compatible with SwarmSDK refactoring
|
|
9
154
|
|
|
10
155
|
## [2.1.3] - 2025-11-06
|
|
11
156
|
|