21 KiB
21 KiB
Changelog
All notable changes to YAMS (Yet Another Memory System) will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
Archived Changelogs
- v0.7.x archive: docs/changelogs/v0.7.md
- v0.6.x archive: docs/changelogs/v0.6.md
- v0.5.x archive: docs/changelogs/v0.5.md
- v0.4.x archive: docs/changelogs/v0.4.md
- v0.3.x archive: docs/changelogs/v0.3.md
- v0.2.x archive: docs/changelogs/v0.2.md
- v0.1.x archive: docs/changelogs/v0.1.md
[v0.7.10] - Unreleased
Added
- Graph command
--list-typesflag (yams-66h): Node type discovery for knowledge graph- New
--list-typesflag shows all distinct node types with counts - Table output with TYPE and COUNT columns, ordered by count descending
- JSON output with
nodeTypesarray containingtypeandcountfields - Added
getNodeTypeCounts()method toKnowledgeGraphStoreinterface - Extended
GraphQueryRequestIPC protocol withlistTypesmode - Usage hint when no nodes found: suggests
yams add <path> - Location:
src/cli/commands/graph_command.cpp,include/yams/metadata/knowledge_graph_store.h
- New
- P4 language support for symbol extraction: Network data plane language (P4_16)
- Node types:
headerTypeDeclaration,structTypeDeclaration,controlDeclaration,parserDeclaration,actionDeclaration,tableDeclaration - Query patterns for actions, functions, headers, structs, controls, parsers, tables, typedefs
- Aliases:
p4,p4_16,p4lang - Grammar auto-download from
prona-p4-learning-platform/tree-sitter-p4
- Node types:
- Vector diagnostics in DaemonMetrics: Moved
collect_vector_diagto background polling- Added
vectorEmbeddingsAvailable,vectorScoringEnabled,searchEngineBuildReasontoMetricsSnapshot - Status requests now read from cached snapshot (non-blocking)
- Resolves status command hangs when vector services are slow
- Added
- Entity extraction metrics in status output: Added entity queue/inflight counters
- New metrics:
entityQueued,entityDropped,entityConsumed,entityInFlight - Exposed via
yams statusandyams status -voutput - JSON output includes
entity_queued,entity_consumed,entity_dropped,entity_inflight - Location:
include/yams/daemon/components/DaemonMetrics.h,src/cli/commands/status_command.cpp
- New metrics:
- Gitignore support for directory ingestion: Skip files matching
.gitignorepatterns- New
--no-gitignoreflag foryams addcommand to disable gitignore filtering - Default behavior respects
.gitignorepatterns in the root directory - Supports standard gitignore patterns: wildcards, directory patterns, anchored paths
- Location:
src/cli/commands/add_command.cpp,src/app/services/indexing_service.cpp
- New
Changed
- Constexpr language configuration for symbol extraction: Centralized compile-time configuration
- 17 languages with constexpr node types and query patterns: C, C++, Python, Rust, Go, Java, JavaScript, TypeScript, C#, PHP, Kotlin, Perl, R, SQL, Solidity, Dart, P4
LanguageConfigstruct withclass_types,field_types,function_types,import_types,identifier_types- Query patterns:
function_queries,class_queries,import_queries,call_queries - Language alias support (e.g., "cpp" → "c++", "cxx", "cc")
getLanguageConfig()constexpr lookup function- Location:
plugins/symbol_extractor_treesitter/symbol_extractor.cpp
- Field extraction: New
extractFields()method extracts class member variables- Uses node type traversal with language-specific field types
- Creates
fieldkind symbols with proper byte ranges
- Member containment relations: New
extractMemberRelations()method- Creates
containsedges from classes to their methods/fields - Uses byte range containment to determine class membership
- Improves knowledge graph structure for code navigation
- Creates
- PostIngestQueue per-stage metrics: Exposed extraction/KG/symbol stage inflight counts
- New getters:
extractionInFlight(),kgInFlight(),symbolInFlight(),totalInFlight() - Static constexpr limits:
maxExtractionConcurrent(),maxKgConcurrent(),maxSymbolConcurrent() - Exposed via daemon status:
extraction_inflight,kg_inflight,symbol_inflight yams statusshows POST line when there's active workyams status -vshows per-stage breakdownyams daemon status -dshows full Post-Ingest Pipeline section- JSON output includes
stagesobject with per-stage counts - Location:
include/yams/daemon/components/PostIngestQueue.h,src/cli/commands/status_command.cpp,src/cli/commands/daemon_command.cpp
- New getters:
- PostIngestQueue dynamic concurrency scaling (PBI-05a): Auto-scale based on queue depth
- New TuneAdvisor tunables:
postExtractionConcurrent(),postKgConcurrent(),postSymbolConcurrent(),postEntityConcurrent() - Dynamic limits replace static constexpr values in PostIngestQueue pollers
- TuningManager scales concurrency based on queue depth thresholds:
>1000 queued: extraction=hwThreads/2, kg=hwThreads/2>500 queued: extraction=hwThreads/4, kg=32>100 queued: extraction=hwThreads/8+4, kg=16>10 queued: extraction=8idle: extraction=4 (default)
- Status output shows limits:
stages: extract=4/4, kg(q=0/i=0/8), symbol=0/4 - JSON includes
extraction_limit,kg_limit,symbol_limit,entity_limit - Location:
include/yams/daemon/components/TuneAdvisor.h,src/daemon/components/TuningManager.cpp,src/daemon/components/DaemonMetrics.cpp
- New TuneAdvisor tunables:
- Knowledge Graph cleanup on document deletion: Deleting documents now cascades to KG
deleteNodesForDocumentHash(): Removesdoc:<hash>nodes and symbol nodes with matching document_hash- Integrated into document deletion flow for automatic cleanup
- Location:
include/yams/metadata/knowledge_graph_store.h,src/app/services/document_service.cpp
- Stale edge cleanup on re-indexing: Symbol extraction now cleans up old relationships
deleteEdgesForSourceFile(): Removes edges whereproperties.source_filematches path- Called automatically before re-extraction to prevent stale relationship accumulation
- Location:
src/daemon/components/EntityGraphService.cpp
- Optimized isolated node query:
yams graph --isolatednow uses single SQL queryfindIsolatedNodes(): EfficientNOT EXISTSsubquery instead of N+1 pattern- New IPC fields:
isolatedMode,isolatedRelationinGraphQueryRequest - Significant performance improvement for large graphs
- Location:
src/cli/commands/graph_command.cpp,src/daemon/components/dispatcher/request_dispatcher_graph.cpp
- Daemon log command: Added
yams daemon log - ExternalPluginHost: New plugin host for Python/process-based plugins (RFC-EPH-001)
- Implements
IPluginHostinterface for external plugins running as separate processes - JSON-RPC 2.0 communication over stdio using existing
PluginProcessandJsonRpcClient - Supported plugin types: Python (
.py), Node.js (.js), any executable with JSON-RPC support - Process lifecycle management: spawn, monitor, health checks, graceful shutdown
- Automatic crash recovery with configurable restart policy (max retries, backoff)
- Trust-based security model with persistent trust file
- RPC gateway for calling arbitrary plugin methods (
callRpc) - Plugin statistics tracking (uptime, restart count, health status)
- State change callbacks for monitoring plugin lifecycle events
- Location:
include/yams/daemon/resource/external_plugin_host.h,src/daemon/resource/external_plugin_host.cpp
- Implements
- Auto-init mode: New
yams init --autoflag for containerized/headless environments- Enables vector database with default model (
all-MiniLM-L6-v2) - Enables plugins directory setup
- Generates authentication keys
- Skips S3 configuration (uses local storage)
- Non-interactive: no prompts, uses sensible defaults
- Enables vector database with default model (
- Tree-sitter grammar download:
yams initnow offers to download tree-sitter grammars- Interactive menu: recommended (C, C++, Python, JS, TS, Rust, Go), all, or custom selection
- Auto-downloads and builds grammars from official GitHub repos
- Supports 14 languages: C, C++, Python, JavaScript, TypeScript, Rust, Go, Java, C#, PHP, Kotlin, Dart, SQL, Solidity
- Cross-platform: MSVC, MinGW, GCC, Clang compilation support
- Grammar prompt also available when YAMS is already initialized
- Grammars installed to XDG_DATA_HOME/yams/grammars (Unix) or %LOCALAPPDATA%\yams\grammars (Windows)
- New embedding model option: Added
multi-qa-MiniLM-L6-cos-v1as second model choice- Trained on 215M question-answer pairs for semantic search optimization
- Same dimensions (384) as default model for compatibility
- Replaces
all-mpnet-base-v2(768 dim) in model selection
- Git-based version detection: Build system now auto-detects version from git tags
- Uses most recent semver tag (
v*) as effective version - Falls back to project version only if no tags exist
- Command-line override (
-Dyams-version=X.Y.Z) takes highest priority
- Uses most recent semver tag (
- Commit hash in version output:
yams --versionnow shows short commit hash- Format:
0.7.9 (commit: c16939f) built:2025-11-29T17:30:15Z - Helps identify exact build for bug reports and debugging
- Format:
- Init command tests: New test suite for init command model download functionality
- Tests for valid HuggingFace URLs, model dimensions, naming conventions
- CLI flag acceptance tests (
--auto,--non-interactive,--force)
- Content-type-aware search profiles: New
CorpusProfileenum and auto-detectionCODE: Boosts symbol/path search for source code repositories (60%+ code files)PROSE: Boosts FTS5/vector search for text-heavy corpora (60%+ docs)DOCS: Balanced weights for mixed code/documentationMIXED: Default balanced weights for heterogeneous corporaSearchEngineConfig::detectProfile(): Auto-detects from file extension distributionSearchEngineConfig::forProfile(): Returns preset weights for a profile
- Session-isolated memory: Documents can now be isolated to working sessions
- New CLI commands:
yams session create,open,close,status,merge,discard - Documents added during an active session are tagged with
session_idmetadata - Session documents are invisible to global searches (use
--globalto bypass) merge: Removes session tag to promote documents to global indexdiscard: Permanently deletes all session documents- Supports multiple concurrent sessions with automatic isolation
- Database migration adds session tracking to metadata repository
- New CLI commands:
- Windows Job Object for plugin processes: External plugin child process cleanup
- Plugin processes are now assigned to Windows Job Objects
- All child processes are automatically terminated when plugin unloads
- Prevents orphaned processes from holding file locks (e.g., PID files)
- Uses
JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSEfor reliable cleanup - Location:
src/extraction/plugin_process.cpp
- Plugin health command: New
yams plugin health [name]subcommand for plugin diagnostics- Shows plugin status, interfaces, models loaded, and error state
- Displays model provider FSM state (Idle, Loading, Ready, Degraded, Failed)
- Lists all loaded models when provider is ready
- JSON output support with
--jsonflag - Location:
src/cli/commands/plugin_command.cpp
- Plugin info improvements: Enhanced
yams plugin infooutput- Now uses
StatusResponse.providersfor accurate plugin status - Shows plugin type (native/external), interfaces, and path
- Properly handles both ABI and external plugin hosts
- Now uses
Changed
- Embedding model list: Both recommended models now have 384 dimensions
all-MiniLM-L6-v2: Lightweight general-purpose semantic search (default)multi-qa-MiniLM-L6-cos-v1: Optimized for question-answer semantic search
- ServiceManager Decomposition: Extracted focused components from monolithic ServiceManager
- New
ConfigResolver: Static config/env resolution utilities (248 lines) - New
VectorSystemManager: Vector DB and index lifecycle (397 lines) - New
DatabaseManager: Metadata DB, connection pool, KG store lifecycle (254 lines) - New
PluginManager: Plugin host, loader, and interface adoption (515 lines) - ServiceManager accessors now delegate to extracted managers
- New
- Configurable Vector DB Capacity: Vector index
max_elementsnow configurable- Environment variable:
YAMS_VECTOR_MAX_ELEMENTS - Config file:
[vector_database] max_elements - Default: 100,000 (range: 1,000 - 10,000,000)
- Environment variable:
- FTS5 index hygiene (migration v18): Removed unused
content_typecolumn from FTS5 indexcontent_typewas indexed but never queried via FTS MATCH- Content type filtering uses JOIN on
documents.mime_typeinstead - Reduces FTS5 index size and improves indexing performance
- Automatic migration rebuilds index on first database open
- Daemon socket logging noise reduction: Request/mux/enqueue/drain logs now emit at debug level
- Default info-level daemon logs no longer show per-request socket traffic
- Enable debug logging to inspect connection-level request handling details
- SearchEngine Consolidation: Unified search architecture by removing legacy HybridSearchEngine
- SearchEngine is now the sole search engine, consolidating multi-component search (FTS5, PathTree, Symbol, KG, Vector, Tag, Metadata)
- Removed ~2000 lines of legacy code:
hybrid_search_engine.cpp,hybrid_search_factory.cpp, and associated headers - Parallel Execution: SearchEngine now uses
std::asyncto execute all 7 component queries simultaneously- Configurable via
SearchEngineConfig::enableParallelExecution(default: true) - Per-component timeout via
SearchEngineConfig::componentTimeout(default: 100ms) - Graceful degradation: timed-out components are skipped, others continue
- Configurable via
- Updated Interfaces:
AppContext.searchEnginereplacesAppContext.hybridEngineacross CLI, daemon, and services - SearchEngineBuilder: Simplified to create
SearchEnginedirectly (removedMetadataKeywordAdapterand KG scorer wiring) - Removed unused benchmark executables:
engine_comparison_bench,hybrid_search_bench - Location:
src/search/,include/yams/search/,src/app/services/,src/cli/
- HotzoneManager Persistence: Added save/load functionality for hotzone state
HotzoneManager::save(path): Serializes hotzone entries to JSON with atomic write (temp + rename)HotzoneManager::load(path): Restores persisted hotzone state on startup- Stores version, half-life config, and timestamped entry scores
- Location:
src/search/hotzone_manager.cpp,include/yams/search/hotzone_manager.h
- CheckpointManager Component: New daemon component for periodic state persistence
- Manages vector index and hotzone checkpoint scheduling
- Configurable interval, threshold-based vector index saves, optional hotzone persistence
- Async timer-based loop with graceful shutdown support
- Post-ingest pipeline parallelization: PostIngestQueue and EntityGraphService now use WorkCoordinator
- Removed serial strand-based processing bottleneck in PostIngestQueue
- EntityGraphService now posts extraction jobs to shared WorkCoordinator thread pool
- Removed unused PoolManager "post_ingest" pool and associated TuningManager tuning logic
- Documents process in parallel across all worker threads with work stealing
- Graph BFS traversal optimization: Reduced N+1 query patterns in graph traversal
- New
getEdgesBidirectional()API: returns incoming + outgoing edges in single query (UNION) - New
getNodesByIds()API: batch node retrieval for hydration - Edge cache in BFS: edges fetched during neighbor collection reused for connecting edges
- Reduces per-node queries from 4 (2×getEdgesFrom + 2×getEdgesTo) to 1
- Location:
src/app/services/graph_query_service.cpp,src/metadata/knowledge_graph_store_sqlite.cpp
- New
- Graph command cleanup: Removed unused
--reverseflag- Bidirectional traversal is now the default behavior
- Flag was redundant since BFS optimization returns all connected edges
- Location:
src/cli/commands/graph_command.cpp
Fixed
- JavaScript/TypeScript symbol extraction: Audited and fixed against Tree-sitter grammars
- JavaScript: Added
function_expression,generator_function,generator_function_declaration,namespace_import,export_statement,export_specifier - TypeScript: Added
abstract_class_declaration,abstract_method_signature,function_expression,generator_function,import_alias - Added queries for function expressions, generators, abstract methods, export statements
- JavaScript: Added
- Graph
--namequery now shows symbol relationships: Fixedyams graph --name <file>showing "Graph data unavailable"- Now resolves filename to file node key and uses KG query path
- Shows connected symbols, includes, and document nodes
- Falls back to document-based lookup if file node not found
- Location:
src/cli/commands/graph_command.cpp
- KG queue metric now shows pending count: Fixed
kg(q=N)showing cumulative total instead of pending items- Now calculates:
pending = queued - consumed - inflight - Affects
yams status -vandyams daemon status -ddisplays - Location:
src/cli/commands/status_command.cpp,src/cli/commands/daemon_command.cpp
- Now calculates:
- Symbol extraction extension mapping: Fixed extension lookup not matching due to leading dot mismatch
- Database stores extensions with dots (
.cpp), map keys without (cpp) - PostIngestQueue now strips leading dot before lookup
- Location:
src/daemon/components/PostIngestQueue.cpp
- Database stores extensions with dots (
- Graph query bidirectional traversal: Fixed graph queries showing 0 connections for blob nodes
- BFS traversal now follows both incoming and outgoing edges by default
- Blob nodes (which only have incoming
has_versionedges from path nodes) now return connected nodes - Refactored dispatcher to delegate to GraphQueryService (single responsibility)
- Repair tracking (migration v21): Added repair status tracking to prevent duplicate work
- New
repair_statuscolumn (pending, processing, completed, failed, skipped) repair_attempted_attimestamp andrepair_attemptscounter- RepairCoordinator filters by status to avoid re-queuing processed documents
- New
- Plugin interface parsing: Fixed object-format interfaces not parsing correctly
- Plugin host sharing: Fixed model provider adoption failure after component extraction
- VectorIndexManager initialization: Fixed "VectorIndexManager not provided" search engine build failure
- Model download mapping: Added
multi-qa-MiniLM-L6-cos-v1to HuggingFace repo mapping - Version display: Fixed
yams --versionshowing fallback values - Socket crash on shutdown: Fixed
EXC_BAD_ACCESSin kqueue_reactor during program exit - Windows daemon status metrics: CPU and memory now report accurate values
--nameflag foryams add: Fixed custom document naming for single-file adds- External plugin extractors: Fixed content extractors from external plugins not being used
- Trust file persistence: Fixed plugin trust file being deleted on daemon restart
- Trust file comment parsing: Fixed daemon crash when loading trust file with comments
- Plugin trust initialization order: Fixed plugins not loading despite being trusted
- Post-ingestion pipeline reliability: Improved async processing consistency
- Graph IPC serialization: Added missing ProtoBinding specializations for GraphQueryRequest/Response
- Status command document count: Fixed
yams statusshowingdocs=0after daemon restart- Short status now uses
documents_total(from metadata DB, initialized on startup) - Previously used
storage_documents(CAS object count, which was 0 on fresh start) - Detailed status was unaffected as it already used the correct field
- Location:
src/cli/commands/status_command.cpp
- Short status now uses
CLI Improvements
- PowerShell completion: Added
yams completion powershellfor PowerShell auto-complete - Consistent
--jsonoutput: Extended JSON output support across commands - Actionable error hints: Centralized error hint system with pattern-based hints
- Daemon error messages: Enhanced daemon start/stop failure messages with recovery hints
Removed
- HybridSearchEngine: Legacy search engine removed in favor of unified SearchEngine
- Deleted:
src/search/hybrid_search_engine.cpp(~1844 lines) - Deleted:
src/search/hybrid_search_factory.cpp(~168 lines) - Deleted:
include/yams/search/hybrid_search_engine.h - Deleted:
include/yams/search/hybrid_search_factory.h
- Deleted:
- HybridSearchEngine Tests: Removed obsolete test files
tests/unit/search/hybrid_search_engine_test.cpptests/unit/search/hybrid_grouping_smoke_test.cpptests/unit/search/learned_fusion_smoke_test.cpptests/unit/search/hierarchical_search_test.cpptests/unit/metadata/search_metadata_interface_test.cpp
- Legacy Adapters: Removed
MetadataKeywordAdapter(was bridge for HybridSearchEngine) - CLI Adapter Rename:
HybridSearchResultAdapter→SearchResultItemAdapterin result_renderer.h