ruv
11eaef851e
feat(memory): #2061 ADR-125 Phase 2 — wire createHybridService to actually use HybridBackend
...
ADR-009 promised `HybridBackend` as the default. Until now,
`createHybridService` silently downgraded to AgentDB-only with a comment
admitting the gap. This commit delivers the wiring:
- `createDatabase` gains `'hybrid'` and `'agentdb'` provider cases.
`'hybrid'` returns a `HybridBackend` (SQLite + AgentDB) and `'agentdb'`
returns an `AgentDBBackend` directly.
- `MemoryService` now exposes a public `backend: IMemoryBackend` field
and a `withBackend(backend)` method. The default backend stays the
legacy `AgentDBAdapter`; `createHybridService` swaps in a real
HybridBackend created via `createDatabase({ provider: 'hybrid' })`.
- All `IMemoryBackend` methods on `MemoryService` now route through
`this.backend` rather than hardcoding `this.adapter`.
- `storeEntry` and `semanticSearch` keep the AgentDBAdapter fast-path
but gain a generic fallback for custom backends.
- `createHybridService` is now async (returns `Promise<MemoryService>`)
because `createDatabase` is async. No external callers existed.
Acceptance criterion #2 from ADR-125 now holds:
`(svc as any).backend instanceof HybridBackend` is `true`.
Tests:
- 2 new cases in `database-provider.test.ts` for `'hybrid'` and `'agentdb'`.
- 2 new cases in `index.test.ts` for `createHybridService`.
378 tests passing (was 374, +4 new).
Refs: ADR-125 Phase 2, ADR-009
Closes: part of #2061
Co-Authored-By: RuFlo <ruv@ruv.net >
2026-05-19 17:20:03 -04:00
Dragan Spiridonov
e50df67226
fix: critical security & performance fixes across 6 packages ( #1558 )
...
* fix: critical security & performance fixes across 6 packages
Addresses 11 vulnerabilities from security audit + 5 additional issues
found during devil's advocate review, plus test suite fixes across
memory, security, and swarm packages.
## Security Fixes (Critical)
- CRIT-01: SQL injection in embeddings search — replaced string
interpolation with parameterized queries (db.prepare/bind)
- CRIT-02: Command injection in 4 files — replaced execSync template
literals with execFileSync + input validation regex:
- ruvector/import.ts (docker container name)
- init.ts (embedding model name, 2 locations)
- agent-browser-adapter.ts (CLI args)
- CRIT-03: Browser eval hardening — 12 dangerous patterns blocked,
configurable 20KB length limit via CLAUDE_FLOW_MAX_EVAL_SCRIPT_LENGTH
## Security Fixes (High)
- HIGH-01: ESLint rules restricting child_process imports (both
import and require) with overrides for safe-executor/daemon/mcp-server
- HIGH-02: Hive-mind truthiness fix (=== true vs !== false)
- HIGH-03: Prototype pollution prevention — safeJsonParse with JSON
reviver stripping __proto__/constructor/prototype in 3 memory backends
- HIGH-04: Plugin sandbox warning on unsandboxed plugin load
- HIGH-05: HNSW hash collision fix — dual-hash (djb2+sdbm) producing
53-bit values with bidirectional map and linear probing
## Security Fixes (DA Review)
- DA-CRIT-1: Local json-security.ts to avoid cross-package imports
- DA-CRIT-2: PostgreSQL schema name validation (validateSchemaName)
added to all 6 ruvector commands via pg-utils.ts
- DA-CRIT-3: PID injection prevention in mcp-server — /proc read +
execFileSync replacing execSync with PID interpolation
- DA-HIGH-3: Timestamp validation (validateTimestamp) in ruvector import
- DA-HIGH-4: 4 additional browser eval bypass patterns (globalThis,
.constructor, Reflect, eval())
- DA-HIGH-5: ESLint no-restricted-modules for require() coverage
## Performance Fixes
- PERF-01: BoundedSet<T> for gossip seenMessages — Map-based LRU
eviction capped at 100K entries, prevents unbounded memory growth
- PERF-02: Bulk operations use Promise.allSettled with batch size 50,
logging partial failures instead of aborting
- PERF-03: CLI lazy loading — reduced sync imports from 37 to 10
core commands, async getCommandsByCategory() for help display
## Test Suite Fixes
- Fixed 11 broken import paths in security tests (../../security/ →
../src/ and ../../helpers/ → ../helpers/)
- Added vitest.config.ts for security package (was inheriting root
config with missing setup.ts reference)
- Added allowedDirectories to SecurityConfig test fixture
- Fixed sanitizePath test expectation (leading slash removal)
- Fixed hardcoded /workspaces/claude-flow path in memory tests
- Fixed semanticRouter controller test (auto-enables with agentdb)
- Fixed database-provider count test (namespace-scoped assertion)
- Fixed swarm latency tests (toBeGreaterThanOrEqual for sub-ms mocks)
- Added TypeScript as dev dependency for build verification
## Verification
- 22 automated security verification tests in
security-verification.test.ts covering all 10 user-facing scenarios
- All 5 packages type-check clean (0 errors)
- memory: 9/9 suites, 353/353 tests pass
- swarm: 4/4 suites, 172/172 tests pass
- security: 13/13 suites, 444/444 tests pass
- CLI help displays all 35 commands correctly with lazy loading
## New Files
- v3/@claude-flow/cli/src/commands/ruvector/pg-utils.ts
- v3/@claude-flow/cli/.eslintrc.json
- v3/@claude-flow/cli/__tests__/security-verification.test.ts
- v3/@claude-flow/memory/src/json-security.ts
- v3/@claude-flow/security/vitest.config.ts
Co-Authored-By: claude-flow <ruv@ruv.net >
* fix: address Sherlock review findings for PR #1558
Finding 2 (MUST FIX): Add formatEmbedding array-element validation
- Validate each embedding value is typeof number && Number.isFinite()
- Prevents SQL injection via crafted JSON arrays with string payloads
- Throws descriptive error with index for debugging
Finding 1: Reclassify CRIT-03 eval blocklist as defense-in-depth
- Add comment clarifying pattern blocklist is best-effort, not a sandbox
- Primary defense is the browser sandbox itself
- Update test description to reflect defense-in-depth classification
Finding 3: Add behavioral tests alongside source-guards
- Add formatEmbedding behavioral test with hostile inputs (NaN, Infinity, strings)
- Add CRIT-02 behavioral test verifying execFileSync array argument pattern
- Categorize existing tests as source-guard vs behavioral in comments
Finding 4: Flag HIGH-02 as behavior change
- Add comment explaining === true vs !== false semantic difference
- Documents that undefined/null no longer treated as "skip permissions"
Finding 6: Export BoundedSet, fix test semantics
- Export BoundedSet from gossip.ts for reuse
- Fix test to use FIFO semantics matching production (not LRU)
- Add FIFO-specific test: re-adding doesn't refresh position
Finding 7: Fix BoundedSet comment math
- Remove speculative throughput time estimate
- Use factual memory calculation: 100K × ~40B IDs ≈ 4MB
Finding 5: No change (false positive — Math.abs in manhattanDistance is correct)
Co-Authored-By: claude-flow <ruv@ruv.net >
---------
Co-authored-by: claude-flow <ruv@ruv.net >
2026-04-08 09:05:59 -04:00