Compare commits

...

3 Commits

Author SHA1 Message Date
Alex Newman 822cf796e1 Bump version to 7.0.9
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-10 16:29:00 -05:00
7Sageer 53314d9c38 Fix: Return complete MCP response object instead of content array in SearchRoutes (#223)
All search route handlers were returning only result.content (array) instead
of the complete result object containing {content, isError}. This caused the
MCP server to receive an invalid response format, resulting in all search
tools hanging indefinitely.

Changes:
- Updated 14 route handlers to return full result object
- Ensures MCP protocol compatibility by providing expected response structure

Fixes search functionality for all claude-mem search tools including:
- Unified search, timeline, decisions, changes
- Observations, sessions, prompts search
- Concept, file, type filtering
- Recent context and timeline queries
2025-12-10 16:28:06 -05:00
Alex Newman 3a1ed0d299 Update CHANGELOG.md for v7.0.8 2025-12-10 14:26:45 -05:00
6 changed files with 32 additions and 18 deletions
+1 -1
View File
@@ -10,7 +10,7 @@
"plugins": [
{
"name": "claude-mem",
"version": "7.0.8",
"version": "7.0.9",
"source": "./plugin",
"description": "Persistent memory system for Claude Code - context compression across sessions"
}
+14
View File
@@ -4,6 +4,20 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
## [7.0.8] - 2025-12-10
## Bug Fixes
- **Critical**: Filter out meta-observations for session-memory files to prevent recursive timeline pollution
- Memory agent was creating observations about editing Agent SDK's session-memory/summary.md files
- This created a recursive loop where investigating timeline pollution caused more pollution
- Filter now skips Edit/Write/Read/NotebookEdit operations on any file path containing 'session-memory'
- Eliminates 91+ meta-observations that were polluting the timeline
## Technical Details
Added filtering logic in SessionRoutes.ts to detect and skip file operations on session-memory files before observations are queued to the SDK agent. This prevents the memory agent from observing its own observation metadata files.
## [7.0.7] - 2025-12-10
## What's Changed
+1 -1
View File
@@ -6,7 +6,7 @@
Claude-mem is a Claude Code plugin providing persistent memory across sessions. It captures tool usage, compresses observations using the Claude Agent SDK, and injects relevant context into future sessions.
**Current Version**: 7.0.8
**Current Version**: 7.0.9
## Architecture
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "claude-mem",
"version": "7.0.8",
"version": "7.0.9",
"description": "Memory compression system for Claude Code - persist context across sessions",
"keywords": [
"claude",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "claude-mem",
"version": "7.0.8",
"version": "7.0.9",
"description": "Persistent memory system for Claude Code - seamlessly preserve context across sessions",
"author": {
"name": "Alex Newman"
+14 -14
View File
@@ -49,7 +49,7 @@ export class SearchRoutes extends BaseRouteHandler {
*/
private handleUnifiedSearch = this.wrapHandler(async (req: Request, res: Response): Promise<void> => {
const result = await this.searchManager.search(req.query);
res.json(result.content);
res.json(result);
});
/**
@@ -58,7 +58,7 @@ export class SearchRoutes extends BaseRouteHandler {
*/
private handleUnifiedTimeline = this.wrapHandler(async (req: Request, res: Response): Promise<void> => {
const result = await this.searchManager.timeline(req.query);
res.json(result.content);
res.json(result);
});
/**
@@ -67,7 +67,7 @@ export class SearchRoutes extends BaseRouteHandler {
*/
private handleDecisions = this.wrapHandler(async (req: Request, res: Response): Promise<void> => {
const result = await this.searchManager.decisions(req.query);
res.json(result.content);
res.json(result);
});
/**
@@ -76,7 +76,7 @@ export class SearchRoutes extends BaseRouteHandler {
*/
private handleChanges = this.wrapHandler(async (req: Request, res: Response): Promise<void> => {
const result = await this.searchManager.changes(req.query);
res.json(result.content);
res.json(result);
});
/**
@@ -85,7 +85,7 @@ export class SearchRoutes extends BaseRouteHandler {
*/
private handleHowItWorks = this.wrapHandler(async (req: Request, res: Response): Promise<void> => {
const result = await this.searchManager.howItWorks(req.query);
res.json(result.content);
res.json(result);
});
/**
@@ -94,7 +94,7 @@ export class SearchRoutes extends BaseRouteHandler {
*/
private handleSearchObservations = this.wrapHandler(async (req: Request, res: Response): Promise<void> => {
const result = await this.searchManager.searchObservations(req.query);
res.json(result.content);
res.json(result);
});
/**
@@ -103,7 +103,7 @@ export class SearchRoutes extends BaseRouteHandler {
*/
private handleSearchSessions = this.wrapHandler(async (req: Request, res: Response): Promise<void> => {
const result = await this.searchManager.searchSessions(req.query);
res.json(result.content);
res.json(result);
});
/**
@@ -112,7 +112,7 @@ export class SearchRoutes extends BaseRouteHandler {
*/
private handleSearchPrompts = this.wrapHandler(async (req: Request, res: Response): Promise<void> => {
const result = await this.searchManager.searchUserPrompts(req.query);
res.json(result.content);
res.json(result);
});
/**
@@ -121,7 +121,7 @@ export class SearchRoutes extends BaseRouteHandler {
*/
private handleSearchByConcept = this.wrapHandler(async (req: Request, res: Response): Promise<void> => {
const result = await this.searchManager.findByConcept(req.query);
res.json(result.content);
res.json(result);
});
/**
@@ -130,7 +130,7 @@ export class SearchRoutes extends BaseRouteHandler {
*/
private handleSearchByFile = this.wrapHandler(async (req: Request, res: Response): Promise<void> => {
const result = await this.searchManager.findByFile(req.query);
res.json(result.content);
res.json(result);
});
/**
@@ -139,7 +139,7 @@ export class SearchRoutes extends BaseRouteHandler {
*/
private handleSearchByType = this.wrapHandler(async (req: Request, res: Response): Promise<void> => {
const result = await this.searchManager.findByType(req.query);
res.json(result.content);
res.json(result);
});
/**
@@ -148,7 +148,7 @@ export class SearchRoutes extends BaseRouteHandler {
*/
private handleGetRecentContext = this.wrapHandler(async (req: Request, res: Response): Promise<void> => {
const result = await this.searchManager.getRecentContext(req.query);
res.json(result.content);
res.json(result);
});
/**
@@ -157,7 +157,7 @@ export class SearchRoutes extends BaseRouteHandler {
*/
private handleGetContextTimeline = this.wrapHandler(async (req: Request, res: Response): Promise<void> => {
const result = await this.searchManager.getContextTimeline(req.query);
res.json(result.content);
res.json(result);
});
/**
@@ -234,7 +234,7 @@ export class SearchRoutes extends BaseRouteHandler {
*/
private handleGetTimelineByQuery = this.wrapHandler(async (req: Request, res: Response): Promise<void> => {
const result = await this.searchManager.getTimelineByQuery(req.query);
res.json(result.content);
res.json(result);
});
/**