@traqr/memory 0.2.33 → 0.2.34

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -95,31 +95,6 @@ export interface MemorySearchResult extends Memory {
95
95
  similarity: number;
96
96
  relevanceScore: number;
97
97
  }
98
- export interface BM25SearchResult {
99
- id: string;
100
- content: string;
101
- summary?: string;
102
- bm25Score: number;
103
- domain?: string;
104
- category?: string;
105
- memoryType?: string;
106
- }
107
- export interface TemporalSearchResult {
108
- id: string;
109
- content: string;
110
- summary?: string;
111
- similarity: number;
112
- temporalProximity: number;
113
- validAt: Date;
114
- }
115
- export interface GraphSearchResult {
116
- id: string;
117
- content: string;
118
- summary?: string;
119
- graphScore: number;
120
- edgeType: string;
121
- depth: number;
122
- }
123
98
  export interface SearchOptions {
124
99
  domainId?: string;
125
100
  category?: MemoryCategory;
@@ -216,24 +191,6 @@ export interface VectorDBProvider {
216
191
  getDomain(name: string): Promise<MemoryDomain | null>;
217
192
  getDefaultDomain(): Promise<MemoryDomain>;
218
193
  ping(): Promise<boolean>;
219
- bm25Search(queryText: string, options?: {
220
- projectId?: string;
221
- domain?: string;
222
- category?: string;
223
- limit?: number;
224
- minScore?: number;
225
- }): Promise<BM25SearchResult[]>;
226
- temporalSearch(query: string, dateStart: Date, dateEnd: Date, options?: {
227
- projectId?: string;
228
- similarityThreshold?: number;
229
- limit?: number;
230
- precomputedEmbedding?: string;
231
- }): Promise<TemporalSearchResult[]>;
232
- graphSearch(seedIds: string[], options?: {
233
- edgeTypes?: string[];
234
- maxDepth?: number;
235
- limit?: number;
236
- }): Promise<GraphSearchResult[]>;
237
194
  invalidate(id: string): Promise<void>;
238
195
  supersede(id: string): Promise<void>;
239
196
  bumpReturned(ids: string[]): Promise<void>;
@@ -249,10 +206,6 @@ export interface VectorDBProvider {
249
206
  }): Promise<any>;
250
207
  incrementEntityMentions(entityId: string): Promise<void>;
251
208
  linkMemoryToEntity(memoryId: string, entityId: string, role?: string): Promise<void>;
252
- findEntitiesByNames(names: string[]): Promise<{
253
- id: string;
254
- name: string;
255
- }[]>;
256
209
  findOrphanedEntities(): Promise<string[]>;
257
210
  archiveEntities(ids: string[]): Promise<number>;
258
211
  browse(options?: {
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/vectordb/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAiCH,+DAA+D;AAC/D,MAAM,CAAC,MAAM,mBAAmB,GAAyC;IACvE,MAAM,EAAE,CAAC;IACT,QAAQ,EAAE,CAAC;IACX,YAAY,EAAE,CAAC;IACf,UAAU,EAAE,CAAC;CACd,CAAA;AAED,6CAA6C;AAC7C,MAAM,CAAC,MAAM,+BAA+B,GAAoD;IAC9F,WAAW,EAAE,UAAU,EAAM,8CAA8C;IAC3E,QAAQ,EAAE,cAAc,EAAK,qDAAqD;IAClF,UAAU,EAAE,YAAY,EAAK,+CAA+C;IAC5E,KAAK,EAAE,YAAY,EAAU,yCAAyC;CACvE,CAAA;AAED,uEAAuE;AACvE,sEAAsE;AACtE,yEAAyE;AACzE,4EAA4E;AAC5E,yEAAyE;AACzE,8CAA8C;AAC9C,6EAA6E;AAC7E,4DAA4D;AAC5D,MAAM,UAAU,4BAA4B,CAC1C,cAAgD,EAChD,WAA+B,EAC/B,iBAAwC;IAExC,MAAM,OAAO,GACX,iBAAiB;QACjB,CAAC,WAAW,CAAC,CAAC,CAAC,+BAA+B,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;IAC1E,IAAI,CAAC,OAAO;QAAE,OAAO,KAAK,CAAA;IAC1B,MAAM,IAAI,GAAG,mBAAmB,CAAC,CAAC,cAAc,IAAI,QAAQ,CAAyB,CAAC,CAAA;IACtF,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,IAAI,CAAA,CAAC,uCAAuC;IAC3E,OAAO,IAAI,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAA;AAC5C,CAAC;AAqTD,8BAA8B;AAC9B,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,YAAY,EAAE,GAAG;IACjB,kBAAkB,EAAE,GAAG;IACvB,WAAW,EAAE,GAAG;IAChB,mBAAmB,EAAE,IAAI;IACzB,cAAc,EAAE,GAAG;IACnB,MAAM,EAAE,GAAG;IACX,EAAE,EAAE,GAAG;CACC,CAAA;AAEV,yEAAyE;AACzE,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,qBAAqB,EAAE,GAAG,EAAG,kCAAkC;IAC/D,YAAY,EAAE,GAAG,EAAY,wCAAwC;IACrE,cAAc,EAAE,GAAG,EAAU,uBAAuB;IACpD,eAAe,EAAE,IAAI,EAAQ,6BAA6B;IAC1D,iBAAiB,EAAE,GAAG;IACtB,KAAK,EAAE,GAAG;IACV,kBAAkB,EAAE,EAAE,EAAO,4CAA4C;CACjE,CAAA"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/vectordb/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAiCH,+DAA+D;AAC/D,MAAM,CAAC,MAAM,mBAAmB,GAAyC;IACvE,MAAM,EAAE,CAAC;IACT,QAAQ,EAAE,CAAC;IACX,YAAY,EAAE,CAAC;IACf,UAAU,EAAE,CAAC;CACd,CAAA;AAED,6CAA6C;AAC7C,MAAM,CAAC,MAAM,+BAA+B,GAAoD;IAC9F,WAAW,EAAE,UAAU,EAAM,8CAA8C;IAC3E,QAAQ,EAAE,cAAc,EAAK,qDAAqD;IAClF,UAAU,EAAE,YAAY,EAAK,+CAA+C;IAC5E,KAAK,EAAE,YAAY,EAAU,yCAAyC;CACvE,CAAA;AAED,uEAAuE;AACvE,sEAAsE;AACtE,yEAAyE;AACzE,4EAA4E;AAC5E,yEAAyE;AACzE,8CAA8C;AAC9C,6EAA6E;AAC7E,4DAA4D;AAC5D,MAAM,UAAU,4BAA4B,CAC1C,cAAgD,EAChD,WAA+B,EAC/B,iBAAwC;IAExC,MAAM,OAAO,GACX,iBAAiB;QACjB,CAAC,WAAW,CAAC,CAAC,CAAC,+BAA+B,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;IAC1E,IAAI,CAAC,OAAO;QAAE,OAAO,KAAK,CAAA;IAC1B,MAAM,IAAI,GAAG,mBAAmB,CAAC,CAAC,cAAc,IAAI,QAAQ,CAAyB,CAAC,CAAA;IACtF,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,IAAI,CAAA,CAAC,uCAAuC;IAC3E,OAAO,IAAI,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAA;AAC5C,CAAC;AA0QD,8BAA8B;AAC9B,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,YAAY,EAAE,GAAG;IACjB,kBAAkB,EAAE,GAAG;IACvB,WAAW,EAAE,GAAG;IAChB,mBAAmB,EAAE,IAAI;IACzB,cAAc,EAAE,GAAG;IACnB,MAAM,EAAE,GAAG;IACX,EAAE,EAAE,GAAG;CACC,CAAA;AAEV,yEAAyE;AACzE,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,qBAAqB,EAAE,GAAG,EAAG,kCAAkC;IAC/D,YAAY,EAAE,GAAG,EAAY,wCAAwC;IACrE,cAAc,EAAE,GAAG,EAAU,uBAAuB;IACpD,eAAe,EAAE,IAAI,EAAQ,6BAA6B;IAC1D,iBAAiB,EAAE,GAAG;IACtB,KAAK,EAAE,GAAG;IACV,kBAAkB,EAAE,EAAE,EAAO,4CAA4C;CACjE,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@traqr/memory",
3
- "version": "0.2.33",
3
+ "version": "0.2.34",
4
4
  "description": "Persistent memory for AI agents. Multi-strategy retrieval (semantic + BM25 + RRF), 3-zone cosine triage, type-aware lifecycle, entity canonicalization. Postgres + pgvector.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
package/setup.sql CHANGED
@@ -302,12 +302,12 @@ CREATE INDEX IF NOT EXISTS idx_traqr_memories_temporal
302
302
  WHERE is_archived = FALSE AND is_forgotten = FALSE;
303
303
 
304
304
  -- traqr_memories: v2 BM25 tsvector GIN indexes — REMOVED in TD-894 Path B
305
- -- (migration 021). bm25_search is dead in prod (search_path='' + unqualified
306
- -- ref 42P01) and no longer auto-runs (retrieval.ts is semantic-only), so these
307
- -- GIN indexes backed nothing live and cost ~15 MB RAM + per-write maintenance.
308
- -- The search_vector_en/simple COLUMNS stay (cheap, still populated); only the
309
- -- indexes are gone. Re-add only if BM25 fusion is repaired to a selective,
310
- -- index-usable query shape (see migration 021 rollback).
305
+ -- (migration 021); the bm25_search/temporal_search/graph_search FUNCTIONS were
306
+ -- then removed from this schema in TD-906 Slice C (they were dead in prod:
307
+ -- search_path='' + unqualified refs 42P01 on every call, and retrieval.ts is
308
+ -- semantic-only). The search_vector_en/simple COLUMNS stay (cheap, still
309
+ -- populated) as the raw material if a repaired, selective BM25 ever returns
310
+ -- (see migration 021 rollback for the index definitions).
311
311
 
312
312
  -- traqr_memory_history
313
313
  CREATE INDEX IF NOT EXISTS idx_traqr_memory_history_memory
@@ -742,176 +742,6 @@ BEGIN
742
742
  END;
743
743
  $$;
744
744
 
745
- -- 6e. bm25_search — keyword search over dual tsvectors
746
- -- NOTE: ts_rank_cd returns REAL; cast to ::FLOAT. VARCHAR columns need ::TEXT.
747
- CREATE OR REPLACE FUNCTION bm25_search(
748
- p_query_text TEXT,
749
- p_project_id UUID DEFAULT NULL,
750
- p_domain TEXT DEFAULT NULL,
751
- p_category TEXT DEFAULT NULL,
752
- p_limit INTEGER DEFAULT 20,
753
- p_min_score FLOAT DEFAULT 0.01
754
- )
755
- RETURNS TABLE (
756
- id UUID,
757
- content TEXT,
758
- summary TEXT,
759
- bm25_score FLOAT,
760
- domain TEXT,
761
- category TEXT,
762
- memory_type TEXT
763
- )
764
- LANGUAGE plpgsql
765
- SET search_path = public
766
- AS $$
767
- DECLARE
768
- tsquery_en tsquery;
769
- tsquery_simple tsquery;
770
- or_query TEXT;
771
- BEGIN
772
- -- Split query words into OR terms for better recall.
773
- -- "engagement ring proposal" -> "engagement | ring | proposal"
774
- -- ts_rank_cd naturally ranks docs with MORE matching terms higher.
775
- or_query := regexp_replace(trim(p_query_text), '\s+', ' | ', 'g');
776
- tsquery_en := to_tsquery('english', or_query);
777
- tsquery_simple := to_tsquery('simple', or_query);
778
-
779
- RETURN QUERY
780
- SELECT
781
- m.id,
782
- m.content,
783
- m.summary::TEXT,
784
- GREATEST(
785
- ts_rank_cd(m.search_vector_en, tsquery_en),
786
- ts_rank_cd(m.search_vector_simple, tsquery_simple)
787
- )::FLOAT AS bm25_score,
788
- m.domain::TEXT,
789
- m.category::TEXT,
790
- m.memory_type::TEXT
791
- FROM traqr_memories m
792
- WHERE (m.search_vector_en @@ tsquery_en
793
- OR m.search_vector_simple @@ tsquery_simple)
794
- AND m.is_archived = FALSE
795
- AND m.is_forgotten = FALSE
796
- AND (m.invalid_at IS NULL OR m.invalid_at > NOW())
797
- AND (p_project_id IS NULL OR m.project_id = p_project_id)
798
- AND (p_domain IS NULL OR m.domain = p_domain)
799
- AND (p_category IS NULL OR m.category = p_category)
800
- ORDER BY bm25_score DESC
801
- LIMIT p_limit;
802
- END;
803
- $$;
804
-
805
- -- 6f. temporal_search — valid_at range + embedding similarity
806
- -- search_path = public: references traqr_memories table
807
- CREATE OR REPLACE FUNCTION temporal_search(
808
- p_query_embedding vector(1536),
809
- p_date_start TIMESTAMPTZ,
810
- p_date_end TIMESTAMPTZ,
811
- p_project_id UUID DEFAULT NULL,
812
- p_similarity_threshold FLOAT DEFAULT 0.3,
813
- p_limit INTEGER DEFAULT 20
814
- )
815
- RETURNS TABLE (
816
- id UUID,
817
- content TEXT,
818
- summary TEXT,
819
- similarity FLOAT,
820
- temporal_proximity FLOAT,
821
- valid_at TIMESTAMPTZ
822
- )
823
- LANGUAGE plpgsql
824
- SET search_path = public
825
- AS $$
826
- DECLARE
827
- date_mid TIMESTAMPTZ;
828
- total_days FLOAT;
829
- BEGIN
830
- date_mid := p_date_start + (p_date_end - p_date_start) / 2;
831
- total_days := GREATEST(EXTRACT(EPOCH FROM (p_date_end - p_date_start)) / 86400.0, 1.0);
832
-
833
- RETURN QUERY
834
- SELECT
835
- m.id,
836
- m.content,
837
- m.summary,
838
- 1 - (m.embedding <=> p_query_embedding) AS similarity,
839
- GREATEST(0.0, 1.0 - (
840
- ABS(EXTRACT(EPOCH FROM (m.valid_at - date_mid)) / 86400.0) / (total_days / 2.0)
841
- )) AS temporal_proximity,
842
- m.valid_at
843
- FROM traqr_memories m
844
- WHERE m.valid_at BETWEEN p_date_start AND p_date_end
845
- AND m.is_archived = FALSE
846
- AND m.is_forgotten = FALSE
847
- AND (p_project_id IS NULL OR m.project_id = p_project_id)
848
- AND 1 - (m.embedding <=> p_query_embedding) >= p_similarity_threshold
849
- ORDER BY similarity DESC
850
- LIMIT p_limit;
851
- END;
852
- $$;
853
-
854
- -- 6g. graph_search — link expansion CTE traversing memory_relationships
855
- -- search_path = public: references traqr_memories + memory_relationships
856
- CREATE OR REPLACE FUNCTION graph_search(
857
- p_seed_ids UUID[],
858
- p_edge_types TEXT[] DEFAULT ARRAY['updates', 'extends', 'derives', 'related'],
859
- p_max_depth INTEGER DEFAULT 2,
860
- p_limit INTEGER DEFAULT 20
861
- )
862
- RETURNS TABLE (
863
- id UUID,
864
- content TEXT,
865
- summary TEXT,
866
- graph_score FLOAT,
867
- edge_type TEXT,
868
- depth INTEGER
869
- )
870
- LANGUAGE plpgsql
871
- SET search_path = public
872
- AS $$
873
- BEGIN
874
- RETURN QUERY
875
- WITH RECURSIVE graph_walk AS (
876
- -- Seed: direct neighbors of seed memories
877
- SELECT
878
- mr.target_memory_id AS memory_id,
879
- mr.edge_type,
880
- mr.confidence AS score,
881
- 1 AS depth
882
- FROM memory_relationships mr
883
- WHERE mr.source_memory_id = ANY(p_seed_ids)
884
- AND mr.edge_type = ANY(p_edge_types)
885
-
886
- UNION ALL
887
-
888
- -- Expand: neighbors of neighbors (0.7 decay per hop)
889
- SELECT
890
- mr.target_memory_id,
891
- mr.edge_type,
892
- gw.score * mr.confidence * 0.7 AS score,
893
- gw.depth + 1
894
- FROM graph_walk gw
895
- JOIN memory_relationships mr ON mr.source_memory_id = gw.memory_id
896
- WHERE gw.depth < p_max_depth
897
- AND mr.edge_type = ANY(p_edge_types)
898
- )
899
- SELECT
900
- m.id,
901
- m.content,
902
- m.summary,
903
- MAX(gw.score) AS graph_score,
904
- (ARRAY_AGG(gw.edge_type ORDER BY gw.score DESC))[1] AS edge_type,
905
- MIN(gw.depth) AS depth
906
- FROM graph_walk gw
907
- JOIN traqr_memories m ON m.id = gw.memory_id
908
- WHERE m.is_archived = FALSE AND m.is_forgotten = FALSE
909
- GROUP BY m.id, m.content, m.summary
910
- ORDER BY graph_score DESC
911
- LIMIT p_limit;
912
- END;
913
- $$;
914
-
915
745
  -- 6h. search_entities — embedding-based entity lookup
916
746
  CREATE OR REPLACE FUNCTION search_entities(
917
747
  p_user_id UUID,
@@ -1075,5 +905,3 @@ ON CONFLICT DO NOTHING;
1075
905
  -- WHERE table_name = 'traqr_memories' ORDER BY ordinal_position;
1076
906
  --
1077
907
  -- SELECT indexname FROM pg_indexes WHERE tablename = 'traqr_memories';
1078
- --
1079
- -- SELECT * FROM bm25_search('test query', NULL, NULL, NULL, 5, 0.01);