@o-lang/semantic-doc-search 1.0.11 → 1.0.12

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@o-lang/semantic-doc-search",
3
- "version": "1.0.11",
3
+ "version": "1.0.12",
4
4
  "description": "O-lang Semantic Document Search Resolver with hybrid search, embeddings, rerank, and streaming.",
5
5
  "main": "src/index.js",
6
6
  "type": "commonjs",
@@ -11,57 +11,44 @@ class PgVectorAdapter {
11
11
  password: config.DB_PASSWORD || process.env.DB_PASSWORD,
12
12
  database: config.DB_NAME || process.env.DB_NAME || 'olang',
13
13
  });
14
-
15
- // Test connection
16
- this.testConnection();
17
14
  }
18
15
 
19
- async testConnection() {
20
- try {
21
- await this.pool.query('SELECT 1');
22
- console.log('✅ PgVector adapter connected successfully');
23
- } catch (error) {
24
- console.error('❌ PgVector connection failed:', error.message);
25
- throw error;
26
- }
16
+ // Convert JavaScript array to PostgreSQL array format
17
+ // [1.0, 2.0, 3.0] -> {1.0,2.0,3.0}
18
+ arrayToPgArray(arr) {
19
+ return `{${arr.join(',')}}`;
27
20
  }
28
21
 
29
22
  async upsert({ id, vector, content, source, metadata = {} }) {
30
- // Convert vector to proper format for pgvector
31
- const vectorStr = `[${vector.join(',')}]`;
32
-
33
- const query = `
34
- INSERT INTO doc_embeddings (id, embedding, content, source, metadata, updated_at)
35
- VALUES ($1, $2::vector, $3, $4, $5, NOW())
36
- ON CONFLICT (id)
37
- DO UPDATE SET
38
- embedding = $2::vector,
39
- content = $3,
40
- source = $4,
41
- metadata = $5,
42
- updated_at = NOW()`;
23
+ // Convert to PostgreSQL array format (NOT JSON)
24
+ const pgVector = this.arrayToPgArray(vector);
43
25
 
44
- await this.pool.query(query, [id, vectorStr, content, source, JSON.stringify(metadata)]);
26
+ await this.pool.query(
27
+ `INSERT INTO doc_embeddings (id, embedding, content, source, metadata)
28
+ VALUES ($1, $2::vector, $3, $4, $5::jsonb)
29
+ ON CONFLICT (id) DO UPDATE
30
+ SET embedding = $2::vector, content = $3, source = $4, metadata = $5::jsonb, updated_at = NOW()`,
31
+ [id, pgVector, content, source, JSON.stringify(metadata)]
32
+ );
45
33
  }
46
34
 
47
35
  async query(vector, topK = 5) {
48
- const vectorStr = `[${vector.join(',')}]`;
49
-
50
- const query = `
51
- SELECT id, content, source, metadata,
52
- 1 - (embedding <=> $1::vector) AS score
53
- FROM doc_embeddings
54
- ORDER BY embedding <=> $1::vector
55
- LIMIT $2`;
36
+ const pgVector = this.arrayToPgArray(vector);
56
37
 
57
- const res = await this.pool.query(query, [vectorStr, topK]);
38
+ const res = await this.pool.query(
39
+ `SELECT id, content, source, metadata,
40
+ 1 - (embedding <=> $1::vector) AS score
41
+ FROM doc_embeddings
42
+ ORDER BY embedding <=> $1::vector
43
+ LIMIT $2`,
44
+ [pgVector, topK]
45
+ );
58
46
 
59
- // Return in the format your resolver expects
60
47
  return res.rows.map(row => ({
61
48
  id: row.id,
62
49
  content: row.content,
63
50
  source: row.source,
64
- metadata: row.metadata,
51
+ meta: row.metadata,
65
52
  score: parseFloat(row.score)
66
53
  }));
67
54
  }