c5e68a17c8
* Refactor code structure for improved readability and maintainability * Add test results for search API and related functionalities - Created test result files for various search-related functionalities, including: - test-11-search-server-changes.json - test-12-context-hook-changes.json - test-13-worker-service-changes.json - test-14-patterns.json - test-15-gotchas.json - test-16-discoveries.json - test-17-all-bugfixes.json - test-18-all-features.json - test-19-all-decisions.json - test-20-session-search.json - test-21-prompt-search.json - test-22-decisions-endpoint.json - test-23-changes-endpoint.json - test-24-how-it-works-endpoint.json - test-25-contextualize-endpoint.json - test-26-timeline-around-observation.json - test-27-multi-param-combo.json - test-28-file-type-combo.json - Each test result file captures specific search failures or outcomes, including issues with undefined properties and successful execution of search queries. - Enhanced documentation of search architecture and testing strategies, ensuring compliance with established guidelines and improving overall search functionality. * feat: Enhance unified search API with catch-all parameters and backward compatibility - Implemented a unified search API at /api/search that accepts catch-all parameters for filtering by type, observation type, concepts, and files. - Maintained backward compatibility by keeping granular endpoints functional while routing through the same infrastructure. - Completed comprehensive testing of search capabilities with real-world query scenarios. fix: Address missing debug output in search API query tests - Flushed PM2 logs and executed search queries to verify functionality. - Diagnosed absence of "Raw Chroma" debug messages in worker logs, indicating potential issues with logging or query processing. refactor: Improve build and deployment pipeline for claude-mem plugin - Successfully built and synced all hooks and services to the marketplace directory. - Ensured all dependencies are installed and up-to-date in the deployment location. feat: Implement hybrid search filters with 90-day recency window - Enhanced search server to apply a 90-day recency filter to Chroma results before categorizing by document type. fix: Correct parameter handling in searchUserPrompts method - Added support for filter-only queries and improved dual-path logic for clarity. refactor: Rename FTS5 method to clarify fallback status - Renamed escapeFTS5 to escapeFTS5_fallback_when_chroma_unavailable to indicate its temporary usage. feat: Introduce contextualize tool for comprehensive project overview - Added a new tool to fetch recent observations, sessions, and user prompts, providing a quick project overview. feat: Add semantic shortcut tools for common search patterns - Implemented 'decisions', 'changes', and 'how_it_works' tools for convenient access to frequently searched observation categories. feat: Unified timeline tool supports anchor and query modes - Combined get_context_timeline and get_timeline_by_query into a single interface for timeline exploration. feat: Unified search tool added to MCP server - New tool queries all memory types simultaneously, providing combined chronological results for improved search efficiency. * Refactor search functionality to clarify FTS5 fallback usage - Updated `worker-service.cjs` to replace FTS5 fallback function with a more descriptive name and improved error handling. - Enhanced documentation in `SKILL.md` to specify the unified API endpoint and clarify the behavior of the search engine, including the conditions under which FTS5 is used. - Modified `search-server.ts` to provide clearer logging and descriptions regarding the fallback to FTS5 when UVX/Python is unavailable. - Renamed and updated the `SessionSearch.ts` methods to reflect the conditions for using FTS5, emphasizing the lack of semantic understanding in fallback scenarios. * feat: Add ID-based fetch endpoints and simplify mem-search skill **Problem:** - Search returns IDs but no way to fetch by ID - Skill documentation was bloated with too many options - Claude wasn't using IDs because we didn't tell it how **Solution:** 1. Added three new HTTP endpoints: - GET /api/observation/:id - GET /api/session/:id - GET /api/prompt/:id 2. Completely rewrote SKILL.md: - Stripped complexity down to essentials - Clear 3-step prescriptive workflow: Search → Review IDs → Fetch by ID - Emphasized ID usage: "The IDs are there for a reason - USE THEM" - Removed confusing multi-endpoint documentation - Kept only unified search with filters **Impact:** - Token efficiency: Claude can now fetch full details only for relevant IDs - Clarity: One clear workflow instead of 10+ options to choose from - Usability: IDs are no longer wasted context - they're actionable 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * chore: Move internal docs to private directory Moved POSTMORTEM and planning docs to ./private to exclude from PR reviews. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * refactor: Remove experimental contextualize endpoint - Removed contextualize MCP tool from search-server (saves ~4KB) - Disabled FTS5 fallback paths in SessionSearch (now vector-first) - Cleaned up CLAUDE.md documentation - Removed contextualize-rewrite-plan.md doc Rationale: - Contextualize is better suited as a skill (LLM-powered) than an endpoint - Search API already provides vector search with configurable limits - Created issue #132 to track future contextualize skill implementation Changes: - src/servers/search-server.ts: Removed contextualize tool definition - src/services/sqlite/SessionSearch.ts: Disabled FTS5 fallback, added deprecation warnings - CLAUDE.md: Cleaned up outdated skill documentation - docs/: Removed contextualize plan document 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * refactor: Complete FTS5 cleanup - remove all deprecated search code This completes the FTS5 cleanup work by removing all commented-out FTS5 search code while preserving database tables for backward compatibility. Changes: - Removed 200+ lines of commented FTS5 search code from SessionSearch.ts - Removed deprecated degraded_search_query__when_uvx_unavailable method - Updated all method documentation to clarify vector-first architecture - Updated class documentation to reflect filter-only query support - Updated CLAUDE.md to remove FTS5 search references - Clarified that FTS5 tables exist for backward compatibility only - Updated "Why SQLite FTS5" section to "Why Vector-First Search" Database impact: NONE - FTS5 tables remain intact for existing installations Search architecture: - ChromaDB: All text-based vector search queries - SQLite: Filter-only queries (date ranges, metadata, no query text) - FTS5 tables: Maintained but unused (backward compatibility) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * refactor: Remove all FTS5 fallback execution code from search-server Completes the FTS5 cleanup by removing all fallback execution paths that attempted to use FTS5 when ChromaDB was unavailable. Changes: - Removed all FTS5 fallback code execution paths - When ChromaDB fails or is unavailable, return empty results with helpful error messages - Updated all deprecated tool descriptions (search_observations, search_sessions, search_user_prompts) - Changed error messages to indicate FTS5 fallback has been removed - Added installation instructions for UVX/Python when vector search is unavailable - Updated comments from "hybrid search" to "vector-first search" - Removed ~100 lines of dead FTS5 fallback code Database impact: NONE - FTS5 tables remain intact (backward compatibility) Search behavior when ChromaDB unavailable: - Text queries: Return empty results with error explaining ChromaDB is required - Filter-only queries (no text): Continue to work via direct SQLite 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * fix: Address PR 133 review feedback Critical fixes: - Remove contextualize endpoint from worker-service (route + handler) - Fix build script logging to show correct .cjs extension (was .mjs) Documentation improvements: - Add comprehensive FTS5 retention rationale documentation - Include v7.0.0 removal TODO for future cleanup Testing: - Build succeeds with correct output logging - Worker restarts successfully (30th restart) - Contextualize endpoint properly removed (404 response) - Search endpoint verified working This addresses all critical review feedback from PR 133. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Claude <noreply@anthropic.com>
1 line
10 KiB
JSON
1 line
10 KiB
JSON
[{"type":"text","text":"## Deep sequential analysis to find root cause of undefined replace() error in search functionality instead of applying null check workaround\n*Source: claude-mem://session/56378ffe-eab5-4ec5-a7c4-ae6af977bb8f*\n\n**Completed:** Completed 12-step sequential thinking analysis identifying the bug location, understanding the architectural issue, and designing a three-part solution: (1) make query parameter optional in Zod schema, (2) add conditional SQL paths in searchObservations/searchSessions/searchUserPrompts that branch on query presence - use FTS5 JOIN when query exists, use direct table SELECT when query undefined, (3) preserve composability allowing text search and filters to work independently or together.\n\n**Learned:** Root cause is architectural assumption conflating FTS5 text search with structured filtering. Current implementation always requires FTS5 MATCH clause even for filter-only queries (type, concepts, files). FTS5 fundamentally cannot MATCH against undefined/empty query. SessionSearch class is for full-text search; SessionStore is for structured queries. The buildFilterClause method already constructs WHERE conditions independently of FTS5, enabling separate query paths. TypeScript type annotations provide no runtime protection against undefined values.\n\n**Investigated:** Traced error through multiple layers: search-server.ts unified endpoint → queryChroma function → SessionSearch.searchObservations → escapeFTS5 method. Examined Zod schema validation, parameter extraction, FTS5 full-text search architecture, and SessionStore vs SessionSearch separation of concerns. Located exact error at line 151 of SessionSearch.ts where text.replace() is called without undefined check.\n\n**Next Steps:** Ready to implement the three-part fix across src/servers/search-server.ts (schema change) and src/services/sqlite/SessionSearch.ts (conditional query logic in three search methods). Implementation will enable filter-only queries like \"show all bugfixes\" or \"show all changes to search-server.ts\" without requiring FTS5 text search.\n\n**Notes:** This represents proper root cause fixing versus superficial workarounds. The solution maintains architectural integrity by separating concerns between text search (FTS5) and structured filtering (direct SQL), making them independently functional and composable. This unlocks precision context retrieval patterns that were previously impossible due to the forced FTS5 requirement.\n\n---\nDate: 11/17/2025\n\n---\n\n## Review commit against architecture guidelines: MCP as DRY search source, HTTP API routes through MCP, MCP not deprecated\n*Source: claude-mem://session/b1a1c481-6560-41bf-a0d3-23e448584f08*\n\n**Completed:** Build and deployment pipeline executed successfully for claude-mem version 6.0.9. All components compiled including worker-service.cjs (1337.16 KB), search-server.mjs (332.02 KB), seven hooks (context, new, save, summary, cleanup, user-message), and React viewer UI bundle. All 11,751 files synced to marketplace location (~/.claude/plugins/marketplaces/thedotmack/), dependencies refreshed via npm install, and worker service restarted to activate new code.\n\n**Learned:** The search architecture follows a clear layered pattern: MCP contains the single source of truth for search logic, HTTP API endpoints act as a thin routing layer that delegates to MCP, and this prevents code duplication. The system maintains 6 public-facing endpoints (/api/search, /api/timeline, /api/decisions, /api/changes, /api/how-it-works, /api/contextualize) with granular endpoints preserved for backward compatibility. The unified /api/search endpoint accepts catch-all parameters (type, obs_type, concepts, files) that replace the need for specialized endpoints.\n\n**Investigated:** A commit review was requested to verify compliance with established search architecture principles. The architecture mandates that MCP (Model Context Protocol) serves as the canonical, DRY search implementation with HTTP API routing through it.\n\n**Next Steps:** Awaiting confirmation that the commit passes architecture review or identification of any violations of the MCP-as-DRY-source principle where HTTP API might be duplicating search logic instead of routing through MCP.\n\n**Notes:** The unified search API design demonstrates strong architectural discipline by consolidating multiple specialized endpoints into a single parameterized endpoint while maintaining backward compatibility. The build output shows healthy file sizes with the worker service as the largest component at ~1.3 MB, which is reasonable for a service handling search, MCP integration, and worker orchestration.\n\n---\nDate: 11/17/2025\n\n---\n\n## Clarifying whether semantic shortcuts should return simple search results or contextual timelines\n*Source: claude-mem://session/b1a1c481-6560-41bf-a0d3-23e448584f08*\n\n**Completed:** The primary Claude identified the architectural decision point and presented two clear options to the user with concrete examples showing the difference between search-based responses (returning flat lists) versus timeline-based responses (returning anchor observations with contextual timelines).\n\n**Learned:** Semantic shortcuts like `/api/decisions`, `/api/changes`, and `/api/how-it-works` currently function as search shortcuts that filter observations by concept tags. The user's question suggested they might expect timeline functionality, prompting architectural clarification about whether these endpoints should evolve from simple filtered lists into richer timeline-based responses that provide chronological context around concept evolution.\n\n**Investigated:** The primary Claude session explored two architectural options for semantic shortcuts: Option A keeps them as simple search endpoints returning lists of observations filtered by concept type, while Option B transforms them into timeline-generating endpoints that return anchor observations with surrounding temporal context.\n\n**Next Steps:** Awaiting user decision on whether to keep semantic shortcuts as simple search endpoints (Option A) or enhance them to return timeline context (Option B), which will determine the implementation approach for the semantic shortcut API architecture.\n\n**Notes:** This represents a key architectural fork in the memory system design: balancing simplicity of search shortcuts against the richer context provided by timelines. The decision will impact how users interact with concept-filtered observations and whether they get isolated results or chronological narratives.\n\n---\nDate: 11/17/2025\n\n---\n\n## Clarify exposed search endpoints and investigate unified search parameters\n*Source: claude-mem://session/b1a1c481-6560-41bf-a0d3-23e448584f08*\n\n**Completed:** Identified the gap between current unified search capabilities and the catch-all parameters needed to fully replace granular search endpoints. Clarified that the 6 desired public-facing endpoints are: /api/search, /api/timeline, /api/decisions, /api/changes, /api/how-it-works, and /api/contextualize.\n\n**Learned:** The unified /api/search tool currently supports query, format, project, dateRange, limit, offset, and orderBy parameters, but lacks catch-all filtering parameters like type (document type filter), concept (observation concept tags), file (file path filter), and obs_type (observation type filter). The search implementation uses hybrid ChromaDB semantic search with SQLite FTS5 fallback, searches across all document types simultaneously, filters to a 90-day recency window, and defaults to 'index' format for token efficiency. The user wants only 6 specific search endpoints exposed publicly despite the potential for broader parameter combinations.\n\n**Investigated:** The unified search tool definition in src/servers/search-server.ts was examined to understand its current parameter structure and hybrid search implementation. The search tool's inputSchema was reviewed to identify which filtering parameters are currently available.\n\n**Next Steps:** The session is awaiting user decision on whether to add the missing catch-all parameters (type, concept, file, obs_type) to the unified search MCP tool to enable full replacement of granular endpoints while maintaining backward compatibility.\n\n**Notes:** The discovery revealed that while the unified search has sophisticated hybrid semantic search capabilities, it still needs additional filtering parameters to fully consolidate all search functionality into the 6 intended public endpoints. The granular endpoints would remain for backward compatibility but not be documented for end users.\n\n---\nDate: 11/17/2025\n\n---\n\n## Clarifying whether granular search endpoints are deprecated given the unified search endpoint has parameters\n*Source: claude-mem://session/b1a1c481-6560-41bf-a0d3-23e448584f08*\n\n**Completed:** No code changes have been made. The discussion clarified that the granular endpoints are not actually deprecated in the current implementation because they provide type-specific filtering that the unified endpoint lacks.\n\n**Learned:** The unified search endpoint accepts parameters like query, format, project, dateRange, limit, offset, and orderBy, but does NOT have a type filter parameter. It returns mixed results from all document types (observations, sessions, prompts). The granular endpoints (/api/search/observations, /api/search/sessions, /api/search/prompts) serve a complementary purpose by returning only specific document types. The search uses hybrid ChromaDB semantic search with SQLite FTS5 fallback, and implements an index/full format pattern to optimize token usage.\n\n**Investigated:** The search-server.ts file was examined to understand the unified search tool implementation and its parameters, specifically looking at whether the search parameters make the granular type-specific endpoints redundant\n\n**Next Steps:** Awaiting user decision on whether to add a type parameter to the unified search endpoint, which would make it truly replace the granular endpoints and allow them to be deprecated as backward-compatible legacy endpoints\n\n**Notes:** This represents a potential architecture decision point: whether to consolidate all search functionality into a single parameterized endpoint (DRY principle) versus maintaining separate endpoints for different document types (explicit API design). The current hybrid approach exists because the type filter was never added to the unified search.\n\n---\nDate: 11/17/2025"}] |