@traqr/memory 0.1.3 → 0.1.4

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.
@@ -2,12 +2,16 @@
2
2
  * VectorDB Provider Factory
3
3
  *
4
4
  * Abstraction layer for vector database operations.
5
- * Currently supports Supabase pgvector.
5
+ * Supports Supabase (PostgREST) and raw Postgres (pg wire protocol).
6
+ * Auto-detects from DATABASE_URL vs SUPABASE_URL.
6
7
  */
7
8
  import type { VectorDBProvider, ProviderConfig } from './types.js';
8
9
  export * from './types.js';
9
10
  /**
10
- * Get the configured vector database provider
11
+ * Get the configured vector database provider.
12
+ * Auto-detects from config or env vars:
13
+ * DATABASE_URL → PostgresVectorProvider
14
+ * SUPABASE_URL → SupabaseVectorProvider
11
15
  */
12
16
  export declare function getVectorDB(config?: ProviderConfig): VectorDBProvider;
13
17
  /**
@@ -2,30 +2,46 @@
2
2
  * VectorDB Provider Factory
3
3
  *
4
4
  * Abstraction layer for vector database operations.
5
- * Currently supports Supabase pgvector.
5
+ * Supports Supabase (PostgREST) and raw Postgres (pg wire protocol).
6
+ * Auto-detects from DATABASE_URL vs SUPABASE_URL.
6
7
  */
7
8
  import { SupabaseVectorProvider } from './supabase.js';
9
+ import { PostgresVectorProvider, resetPostgresPool } from './postgres.js';
10
+ import { getMemoryConfig } from '../lib/client.js';
8
11
  // Re-export types for convenience
9
12
  export * from './types.js';
10
13
  // Singleton instance
11
14
  let providerInstance = null;
12
15
  /**
13
- * Get the configured vector database provider
16
+ * Get the configured vector database provider.
17
+ * Auto-detects from config or env vars:
18
+ * DATABASE_URL → PostgresVectorProvider
19
+ * SUPABASE_URL → SupabaseVectorProvider
14
20
  */
15
21
  export function getVectorDB(config) {
16
22
  if (providerInstance)
17
23
  return providerInstance;
18
- const providerType = config?.type || 'supabase';
19
- switch (providerType) {
20
- case 'supabase':
21
- providerInstance = new SupabaseVectorProvider();
22
- break;
23
- case 'pinecone':
24
- throw new Error('Pinecone provider not yet implemented');
25
- case 'qdrant':
26
- throw new Error('Qdrant provider not yet implemented');
27
- default:
28
- throw new Error(`Unknown provider type: ${providerType}`);
24
+ // Explicit type takes priority
25
+ if (config?.type) {
26
+ switch (config.type) {
27
+ case 'postgres':
28
+ providerInstance = new PostgresVectorProvider();
29
+ break;
30
+ case 'supabase':
31
+ providerInstance = new SupabaseVectorProvider();
32
+ break;
33
+ default:
34
+ throw new Error(`Unknown provider type: ${config.type}`);
35
+ }
36
+ return providerInstance;
37
+ }
38
+ // Auto-detect from stored config / env vars
39
+ const memConfig = getMemoryConfig();
40
+ if (memConfig.databaseUrl) {
41
+ providerInstance = new PostgresVectorProvider();
42
+ }
43
+ else {
44
+ providerInstance = new SupabaseVectorProvider();
29
45
  }
30
46
  return providerInstance;
31
47
  }
@@ -34,6 +50,7 @@ export function getVectorDB(config) {
34
50
  */
35
51
  export function resetVectorDB() {
36
52
  providerInstance = null;
53
+ resetPostgresPool();
37
54
  }
38
55
  export default getVectorDB;
39
56
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/vectordb/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAA;AAGtD,kCAAkC;AAClC,cAAc,YAAY,CAAA;AAE1B,qBAAqB;AACrB,IAAI,gBAAgB,GAA4B,IAAI,CAAA;AAEpD;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,MAAuB;IACjD,IAAI,gBAAgB;QAAE,OAAO,gBAAgB,CAAA;IAE7C,MAAM,YAAY,GAAG,MAAM,EAAE,IAAI,IAAI,UAAU,CAAA;IAE/C,QAAQ,YAAY,EAAE,CAAC;QACrB,KAAK,UAAU;YACb,gBAAgB,GAAG,IAAI,sBAAsB,EAAE,CAAA;YAC/C,MAAK;QACP,KAAK,UAAU;YACb,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAA;QAC1D,KAAK,QAAQ;YACX,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAA;QACxD;YACE,MAAM,IAAI,KAAK,CAAC,0BAA0B,YAAY,EAAE,CAAC,CAAA;IAC7D,CAAC;IAED,OAAO,gBAAgB,CAAA;AACzB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa;IAC3B,gBAAgB,GAAG,IAAI,CAAA;AACzB,CAAC;AAED,eAAe,WAAW,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/vectordb/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAA;AACtD,OAAO,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AACzE,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAGlD,kCAAkC;AAClC,cAAc,YAAY,CAAA;AAE1B,qBAAqB;AACrB,IAAI,gBAAgB,GAA4B,IAAI,CAAA;AAEpD;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,MAAuB;IACjD,IAAI,gBAAgB;QAAE,OAAO,gBAAgB,CAAA;IAE7C,+BAA+B;IAC/B,IAAI,MAAM,EAAE,IAAI,EAAE,CAAC;QACjB,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;YACpB,KAAK,UAAU;gBACb,gBAAgB,GAAG,IAAI,sBAAsB,EAAE,CAAA;gBAC/C,MAAK;YACP,KAAK,UAAU;gBACb,gBAAgB,GAAG,IAAI,sBAAsB,EAAE,CAAA;gBAC/C,MAAK;YACP;gBACE,MAAM,IAAI,KAAK,CAAC,0BAA0B,MAAM,CAAC,IAAI,EAAE,CAAC,CAAA;QAC5D,CAAC;QACD,OAAO,gBAAgB,CAAA;IACzB,CAAC;IAED,4CAA4C;IAC5C,MAAM,SAAS,GAAG,eAAe,EAAE,CAAA;IACnC,IAAI,SAAS,CAAC,WAAW,EAAE,CAAC;QAC1B,gBAAgB,GAAG,IAAI,sBAAsB,EAAE,CAAA;IACjD,CAAC;SAAM,CAAC;QACN,gBAAgB,GAAG,IAAI,sBAAsB,EAAE,CAAA;IACjD,CAAC;IAED,OAAO,gBAAgB,CAAA;AACzB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa;IAC3B,gBAAgB,GAAG,IAAI,CAAA;IACvB,iBAAiB,EAAE,CAAA;AACrB,CAAC;AAED,eAAe,WAAW,CAAA"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Postgres VectorDB Provider
3
+ *
4
+ * Implementation of VectorDBProvider using raw pg wire protocol.
5
+ * Calls the same SQL functions as SupabaseVectorProvider, but via
6
+ * parameterized queries instead of PostgREST RPC.
7
+ *
8
+ * Requires: npm install pg (dynamic import — not a hard dependency)
9
+ */
10
+ import type { VectorDBProvider, Memory, MemoryInput, MemorySearchResult, MemoryUpdate, MemoryExport, MemoryDomain, SearchOptions, BrowseResult, BM25SearchResult, TemporalSearchResult, GraphSearchResult } from './types.js';
11
+ /** Reset pool (for testing or reconfiguration) */
12
+ export declare function resetPostgresPool(): void;
13
+ export declare class PostgresVectorProvider implements VectorDBProvider {
14
+ store(input: MemoryInput, domainId?: string): Promise<Memory>;
15
+ search(queryText: string, options?: SearchOptions & {
16
+ precomputedEmbedding?: string;
17
+ }): Promise<MemorySearchResult[]>;
18
+ getById(id: string): Promise<Memory | null>;
19
+ update(id: string, updates: MemoryUpdate): Promise<Memory>;
20
+ delete(id: string): Promise<void>;
21
+ validate(id: string): Promise<Memory>;
22
+ archive(id: string, reason?: string): Promise<Memory>;
23
+ unarchive(id: string): Promise<Memory>;
24
+ exportAll(domainId?: string): Promise<MemoryExport[]>;
25
+ importBulk(memories: MemoryExport[], domainId: string): Promise<number>;
26
+ createDomain(name: string, description?: string, userId?: string): Promise<MemoryDomain>;
27
+ getDomain(name: string): Promise<MemoryDomain | null>;
28
+ getDefaultDomain(): Promise<MemoryDomain>;
29
+ bm25Search(queryText: string, options?: {
30
+ projectId?: string;
31
+ domain?: string;
32
+ category?: string;
33
+ limit?: number;
34
+ minScore?: number;
35
+ }): Promise<BM25SearchResult[]>;
36
+ temporalSearch(queryText: string, dateStart: Date, dateEnd: Date, options?: {
37
+ projectId?: string;
38
+ similarityThreshold?: number;
39
+ limit?: number;
40
+ precomputedEmbedding?: string;
41
+ }): Promise<TemporalSearchResult[]>;
42
+ graphSearch(seedIds: string[], options?: {
43
+ edgeTypes?: string[];
44
+ maxDepth?: number;
45
+ limit?: number;
46
+ }): Promise<GraphSearchResult[]>;
47
+ invalidate(id: string): Promise<void>;
48
+ supersede(id: string): Promise<void>;
49
+ findEntityByName(name: string, entityType: string): Promise<any | null>;
50
+ findEntityByNameFuzzy(name: string, entityType: string): Promise<any | null>;
51
+ findEntityByEmbedding(embeddingStr: string, entityType: string, threshold?: number): Promise<any | null>;
52
+ createEntity(entity: {
53
+ name: string;
54
+ entityType: string;
55
+ embedding?: string;
56
+ userId?: string;
57
+ }): Promise<any>;
58
+ incrementEntityMentions(entityId: string): Promise<void>;
59
+ linkMemoryToEntity(memoryId: string, entityId: string, role?: string): Promise<void>;
60
+ findEntitiesByNames(names: string[]): Promise<{
61
+ id: string;
62
+ name: string;
63
+ }[]>;
64
+ findOrphanedEntities(): Promise<string[]>;
65
+ archiveEntities(ids: string[]): Promise<number>;
66
+ browse(options?: {
67
+ domain?: string;
68
+ category?: string;
69
+ limit?: number;
70
+ }): Promise<BrowseResult[]>;
71
+ forget(id: string): Promise<void>;
72
+ createRelationship(sourceId: string, targetId: string, edgeType: string, metadata?: Record<string, unknown>): Promise<string | null>;
73
+ countEntityMentions(name: string, userId: string): Promise<number>;
74
+ schemaVersion(): Promise<number | null>;
75
+ ping(): Promise<boolean>;
76
+ }