Adds applyMemorySearchDefaults() to the config pipeline, enabling three
platform-level features that together solve the multi-session continuity
problem (the 'twin sessions' problem where webchat and Telegram feel like
separate assistants with no shared memory).
Previously, users had to manually configure memorySearch in openclaw.json
to get these features. New installs now get them automatically.
## What this enables by default
1. **Session memory indexing** (experimental.sessionMemory + sources: sessions)
Every conversation across all channels is automatically indexed. A
memory_search from any channel can find context from any other channel
without the user or agent needing to manually write memory files.
2. **Temporal decay** (halfLifeDays: 30)
Recent memories rank higher automatically. Yesterday's note beats a
6-month-old note on the same topic.
3. **MMR re-ranking** (lambda: 0.7)
Avoids returning near-duplicate memory snippets. The agent gets diverse,
complementary results instead of the same information repeated.
## Design decisions
- Opt-out not opt-in: applied only when memorySearch is undefined.
- Platform layer not agent instructions: lives in code, not prose.
- Conservative values matching existing docs recommendations.
- Same pipeline pattern as applyContextPruningDefaults / applyCompactionDefaults.
## Testing
Added config.memory-search-defaults.test.ts:
- Default install gets all three features enabled
- Explicit memorySearch config is never overwritten
* test: align extension runtime mocks with plugin-sdk
Update stale extension tests to mock the plugin-sdk runtime barrels that production code now imports, and harden the Signal tool-result harness around system-event assertions so the channels lane matches current extension boundaries.
Regeneration-Prompt: |
Verify the failing channels-lane tests against current origin/main in an isolated worktree before changing anything. If the failures reproduce on main, keep the fix test-only unless production behavior is clearly wrong. Recent extension refactors moved Telegram, WhatsApp, and Signal code onto plugin-sdk runtime barrels, so update stale tests that still mock old core module paths to intercept the seams production code now uses. For Signal reaction notifications, avoid brittle assertions that depend on shared queued system-event state when a direct harness spy on enqueue behavior is sufficient. Preserve scope: only touch the failing tests and their local harness, then rerun the reproduced targeted tests plus the full channels lane and repo check gate.
* test: fix extension test drift on main
* fix: lazy-load bundled web search plugin registry
* test: make matrix sweeper failure injection portable
* fix: split heavy matrix runtime-api seams
* fix: simplify bundled web search id lookup
* test: tolerate windows env key casing
Reuse pi-ai's Anthropic client injection seam for streaming, and add
the OpenClaw-side provider discovery, auth, model catalog, and tests
needed to expose anthropic-vertex cleanly.
Signed-off-by: sallyom <somalley@redhat.com>