@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.
- package/dist/index.d.ts +3 -3
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/lib/classification-enforcement.integration.test.d.ts +7 -5
- package/dist/lib/classification-enforcement.integration.test.js +26 -48
- package/dist/lib/classification-enforcement.integration.test.js.map +1 -1
- package/dist/lib/retrieval.d.ts +24 -66
- package/dist/lib/retrieval.js +38 -315
- package/dist/lib/retrieval.js.map +1 -1
- package/dist/lib/retrieval.test.d.ts +8 -6
- package/dist/lib/retrieval.test.js +13 -67
- package/dist/lib/retrieval.test.js.map +1 -1
- package/dist/routes/search.js +4 -3
- package/dist/routes/search.js.map +1 -1
- package/dist/vectordb/postgres.d.ts +1 -23
- package/dist/vectordb/postgres.js +0 -78
- package/dist/vectordb/postgres.js.map +1 -1
- package/dist/vectordb/supabase.d.ts +1 -23
- package/dist/vectordb/supabase.js +0 -101
- package/dist/vectordb/supabase.js.map +1 -1
- package/dist/vectordb/types.d.ts +0 -47
- package/dist/vectordb/types.js.map +1 -1
- package/package.json +1 -1
- package/setup.sql +6 -178
package/dist/vectordb/types.d.ts
CHANGED
|
@@ -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;
|
|
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.
|
|
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)
|
|
306
|
-
--
|
|
307
|
-
--
|
|
308
|
-
-- The search_vector_en/simple COLUMNS stay (cheap, still
|
|
309
|
-
--
|
|
310
|
-
--
|
|
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);
|