@terronex-dev/aifbin-recall 0.1.0
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/CONTRIBUTING.md +65 -0
- package/LICENSE +21 -0
- package/NOTICE +36 -0
- package/README.md +250 -0
- package/dist/cli.d.ts +6 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +182 -0
- package/dist/cli.js.map +1 -0
- package/dist/db.d.ts +29 -0
- package/dist/db.d.ts.map +1 -0
- package/dist/db.js +252 -0
- package/dist/db.js.map +1 -0
- package/dist/embedder.d.ts +47 -0
- package/dist/embedder.d.ts.map +1 -0
- package/dist/embedder.js +152 -0
- package/dist/embedder.js.map +1 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +45 -0
- package/dist/index.js.map +1 -0
- package/dist/indexer.d.ts +34 -0
- package/dist/indexer.d.ts.map +1 -0
- package/dist/indexer.js +246 -0
- package/dist/indexer.js.map +1 -0
- package/dist/mcp.d.ts +7 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +207 -0
- package/dist/mcp.js.map +1 -0
- package/dist/search.d.ts +27 -0
- package/dist/search.d.ts.map +1 -0
- package/dist/search.js +159 -0
- package/dist/search.js.map +1 -0
- package/dist/server.d.ts +13 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +250 -0
- package/dist/server.js.map +1 -0
- package/dist/types.d.ts +79 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +20 -0
- package/dist/types.js.map +1 -0
- package/package.json +64 -0
- package/src/cli.ts +195 -0
- package/src/db.ts +295 -0
- package/src/embedder.ts +175 -0
- package/src/index.ts +46 -0
- package/src/indexer.ts +272 -0
- package/src/mcp.ts +244 -0
- package/src/search.ts +201 -0
- package/src/server.ts +270 -0
- package/src/types.ts +103 -0
- package/tsconfig.json +20 -0
package/dist/search.js
ADDED
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Search functionality for AIF-BIN Recall
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.SearchEngine = void 0;
|
|
7
|
+
exports.cosineSimilarity = cosineSimilarity;
|
|
8
|
+
const types_js_1 = require("./types.js");
|
|
9
|
+
/**
|
|
10
|
+
* Calculate cosine similarity between two vectors
|
|
11
|
+
*/
|
|
12
|
+
function cosineSimilarity(a, b) {
|
|
13
|
+
if (a.length !== b.length) {
|
|
14
|
+
throw new Error(`Vector dimension mismatch: ${a.length} vs ${b.length}`);
|
|
15
|
+
}
|
|
16
|
+
let dotProduct = 0;
|
|
17
|
+
let normA = 0;
|
|
18
|
+
let normB = 0;
|
|
19
|
+
for (let i = 0; i < a.length; i++) {
|
|
20
|
+
dotProduct += a[i] * b[i];
|
|
21
|
+
normA += a[i] * a[i];
|
|
22
|
+
normB += b[i] * b[i];
|
|
23
|
+
}
|
|
24
|
+
const magnitude = Math.sqrt(normA) * Math.sqrt(normB);
|
|
25
|
+
if (magnitude === 0)
|
|
26
|
+
return 0;
|
|
27
|
+
return dotProduct / magnitude;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Normalize BM25 scores to 0-1 range
|
|
31
|
+
*/
|
|
32
|
+
function normalizeBM25Scores(scores) {
|
|
33
|
+
if (scores.length === 0)
|
|
34
|
+
return new Map();
|
|
35
|
+
// BM25 scores are negative in SQLite FTS5 (lower is better)
|
|
36
|
+
const minScore = Math.min(...scores.map(s => s.score));
|
|
37
|
+
const maxScore = Math.max(...scores.map(s => s.score));
|
|
38
|
+
const range = maxScore - minScore || 1;
|
|
39
|
+
const normalized = new Map();
|
|
40
|
+
for (const { id, score } of scores) {
|
|
41
|
+
// Invert and normalize: best match (lowest BM25) becomes highest score
|
|
42
|
+
normalized.set(id, 1 - (score - minScore) / range);
|
|
43
|
+
}
|
|
44
|
+
return normalized;
|
|
45
|
+
}
|
|
46
|
+
class SearchEngine {
|
|
47
|
+
db;
|
|
48
|
+
config;
|
|
49
|
+
constructor(db, config) {
|
|
50
|
+
this.db = db;
|
|
51
|
+
this.config = { ...types_js_1.DEFAULT_CONFIG.search, ...config };
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Perform semantic search using query embedding
|
|
55
|
+
*/
|
|
56
|
+
async search(queryEmbedding, options = {}) {
|
|
57
|
+
const { collection, limit = this.config.defaultLimit, threshold = 0.0, hybridWeight = this.config.hybridWeight, } = options;
|
|
58
|
+
// Get collection ID if name provided
|
|
59
|
+
let collectionId;
|
|
60
|
+
if (collection) {
|
|
61
|
+
const col = this.db.getCollection(collection);
|
|
62
|
+
if (!col) {
|
|
63
|
+
throw new Error(`Collection not found: ${collection}`);
|
|
64
|
+
}
|
|
65
|
+
collectionId = col.id;
|
|
66
|
+
}
|
|
67
|
+
// Get all chunks with embeddings
|
|
68
|
+
const chunks = this.db.getAllChunksWithEmbeddings(collectionId);
|
|
69
|
+
if (chunks.length === 0) {
|
|
70
|
+
return [];
|
|
71
|
+
}
|
|
72
|
+
// Calculate vector similarity scores
|
|
73
|
+
const vectorScores = [];
|
|
74
|
+
for (const chunk of chunks) {
|
|
75
|
+
const score = cosineSimilarity(queryEmbedding, chunk.embedding);
|
|
76
|
+
if (score >= threshold) {
|
|
77
|
+
vectorScores.push({ chunk, score });
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
// Sort by vector score
|
|
81
|
+
vectorScores.sort((a, b) => b.score - a.score);
|
|
82
|
+
// If pure vector search (hybridWeight = 1), return top results
|
|
83
|
+
if (hybridWeight >= 1.0) {
|
|
84
|
+
return vectorScores.slice(0, limit).map(({ chunk, score }) => ({
|
|
85
|
+
chunk,
|
|
86
|
+
score,
|
|
87
|
+
vectorScore: score,
|
|
88
|
+
}));
|
|
89
|
+
}
|
|
90
|
+
// For hybrid search, we need the query text (not available here)
|
|
91
|
+
// This will be handled at a higher level
|
|
92
|
+
return vectorScores.slice(0, limit).map(({ chunk, score }) => ({
|
|
93
|
+
chunk,
|
|
94
|
+
score,
|
|
95
|
+
vectorScore: score,
|
|
96
|
+
}));
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Perform hybrid search combining vector similarity and keyword matching
|
|
100
|
+
*/
|
|
101
|
+
async hybridSearch(queryEmbedding, queryText, options = {}) {
|
|
102
|
+
const { collection, limit = this.config.defaultLimit, threshold = 0.0, hybridWeight = this.config.hybridWeight, } = options;
|
|
103
|
+
// Get collection ID
|
|
104
|
+
let collectionId;
|
|
105
|
+
if (collection) {
|
|
106
|
+
const col = this.db.getCollection(collection);
|
|
107
|
+
if (!col) {
|
|
108
|
+
throw new Error(`Collection not found: ${collection}`);
|
|
109
|
+
}
|
|
110
|
+
collectionId = col.id;
|
|
111
|
+
}
|
|
112
|
+
// Get all chunks
|
|
113
|
+
const chunks = this.db.getAllChunksWithEmbeddings(collectionId);
|
|
114
|
+
if (chunks.length === 0)
|
|
115
|
+
return [];
|
|
116
|
+
// Calculate vector scores
|
|
117
|
+
const vectorScoreMap = new Map();
|
|
118
|
+
for (const chunk of chunks) {
|
|
119
|
+
const score = cosineSimilarity(queryEmbedding, chunk.embedding);
|
|
120
|
+
vectorScoreMap.set(chunk.id, score);
|
|
121
|
+
}
|
|
122
|
+
// Get keyword scores (BM25)
|
|
123
|
+
const keywordResults = this.db.keywordSearch(queryText, collectionId, limit * 3);
|
|
124
|
+
const keywordScoreMap = normalizeBM25Scores(keywordResults);
|
|
125
|
+
// Combine scores
|
|
126
|
+
const results = [];
|
|
127
|
+
const chunkMap = new Map(chunks.map(c => [c.id, c]));
|
|
128
|
+
// Score all chunks that have either vector or keyword hits
|
|
129
|
+
const allIds = new Set([...vectorScoreMap.keys(), ...keywordScoreMap.keys()]);
|
|
130
|
+
for (const id of allIds) {
|
|
131
|
+
const chunk = chunkMap.get(id);
|
|
132
|
+
if (!chunk)
|
|
133
|
+
continue;
|
|
134
|
+
const vectorScore = vectorScoreMap.get(id) || 0;
|
|
135
|
+
const keywordScore = keywordScoreMap.get(id) || 0;
|
|
136
|
+
// Weighted combination
|
|
137
|
+
const combinedScore = hybridWeight * vectorScore + (1 - hybridWeight) * keywordScore;
|
|
138
|
+
if (combinedScore >= threshold) {
|
|
139
|
+
results.push({
|
|
140
|
+
chunk,
|
|
141
|
+
score: combinedScore,
|
|
142
|
+
vectorScore,
|
|
143
|
+
keywordScore,
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
// Sort by combined score and limit
|
|
148
|
+
results.sort((a, b) => b.score - a.score);
|
|
149
|
+
return results.slice(0, limit);
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Recall a specific chunk by ID
|
|
153
|
+
*/
|
|
154
|
+
recall(id) {
|
|
155
|
+
return this.db.getChunk(id);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
exports.SearchEngine = SearchEngine;
|
|
159
|
+
//# sourceMappingURL=search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../src/search.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP server for AIF-BIN Recall
|
|
3
|
+
*/
|
|
4
|
+
import express from 'express';
|
|
5
|
+
import type { ServerConfig } from './types.js';
|
|
6
|
+
import { EngramDB } from './db.js';
|
|
7
|
+
export interface ServerOptions {
|
|
8
|
+
db: EngramDB;
|
|
9
|
+
config?: Partial<ServerConfig>;
|
|
10
|
+
}
|
|
11
|
+
export declare function createServer(options: ServerOptions): express.Application;
|
|
12
|
+
export declare function startServer(options: ServerOptions): void;
|
|
13
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,OAA4C,MAAM,SAAS,CAAC;AAEnE,OAAO,KAAK,EAAE,YAAY,EAAiB,MAAM,YAAY,CAAC;AAE9D,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAKnC,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,QAAQ,CAAC;IACb,MAAM,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;CAChC;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,WAAW,CA0OxE;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI,CAexD"}
|
package/dist/server.js
ADDED
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* HTTP server for AIF-BIN Recall
|
|
4
|
+
*/
|
|
5
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
6
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.createServer = createServer;
|
|
10
|
+
exports.startServer = startServer;
|
|
11
|
+
const express_1 = __importDefault(require("express"));
|
|
12
|
+
const cors_1 = __importDefault(require("cors"));
|
|
13
|
+
const types_js_1 = require("./types.js");
|
|
14
|
+
const search_js_1 = require("./search.js");
|
|
15
|
+
const indexer_js_1 = require("./indexer.js");
|
|
16
|
+
const embedder_js_1 = require("./embedder.js");
|
|
17
|
+
function createServer(options) {
|
|
18
|
+
const { db, config } = options;
|
|
19
|
+
const serverConfig = { ...types_js_1.DEFAULT_CONFIG.server, ...config };
|
|
20
|
+
const app = (0, express_1.default)();
|
|
21
|
+
const search = new search_js_1.SearchEngine(db);
|
|
22
|
+
const indexer = new indexer_js_1.Indexer(db);
|
|
23
|
+
// Middleware
|
|
24
|
+
app.use((0, cors_1.default)());
|
|
25
|
+
app.use(express_1.default.json({ limit: '10mb' }));
|
|
26
|
+
// Health check
|
|
27
|
+
app.get('/health', (_req, res) => {
|
|
28
|
+
res.json({ status: 'ok', version: '0.1.0' });
|
|
29
|
+
});
|
|
30
|
+
// List collections
|
|
31
|
+
app.get('/collections', (_req, res) => {
|
|
32
|
+
try {
|
|
33
|
+
const collections = db.listCollections();
|
|
34
|
+
res.json({ collections });
|
|
35
|
+
}
|
|
36
|
+
catch (err) {
|
|
37
|
+
res.status(500).json({ error: String(err) });
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
// Get collection
|
|
41
|
+
app.get('/collections/:name', (req, res) => {
|
|
42
|
+
try {
|
|
43
|
+
const collection = db.getCollection(req.params.name);
|
|
44
|
+
if (!collection) {
|
|
45
|
+
res.status(404).json({ error: 'Collection not found' });
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
res.json(collection);
|
|
49
|
+
}
|
|
50
|
+
catch (err) {
|
|
51
|
+
res.status(500).json({ error: String(err) });
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
// Create collection
|
|
55
|
+
app.post('/collections/:name', (req, res) => {
|
|
56
|
+
try {
|
|
57
|
+
const { description } = req.body || {};
|
|
58
|
+
const existing = db.getCollection(req.params.name);
|
|
59
|
+
if (existing) {
|
|
60
|
+
res.json(existing);
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
const collection = db.createCollection(req.params.name, description);
|
|
64
|
+
res.status(201).json(collection);
|
|
65
|
+
}
|
|
66
|
+
catch (err) {
|
|
67
|
+
res.status(500).json({ error: String(err) });
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
// Delete collection
|
|
71
|
+
app.delete('/collections/:name', (req, res) => {
|
|
72
|
+
try {
|
|
73
|
+
const deleted = db.deleteCollection(req.params.name);
|
|
74
|
+
if (!deleted) {
|
|
75
|
+
res.status(404).json({ error: 'Collection not found' });
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
res.json({ deleted: true });
|
|
79
|
+
}
|
|
80
|
+
catch (err) {
|
|
81
|
+
res.status(500).json({ error: String(err) });
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
// Lazy-loaded embedder for text queries
|
|
85
|
+
let embedder = null;
|
|
86
|
+
async function getEmbedder(model) {
|
|
87
|
+
if (!embedder) {
|
|
88
|
+
embedder = new embedder_js_1.Embedder(model || 'minilm');
|
|
89
|
+
await embedder.init();
|
|
90
|
+
}
|
|
91
|
+
return embedder;
|
|
92
|
+
}
|
|
93
|
+
// Search - accepts either embedding array OR text query (will embed automatically)
|
|
94
|
+
app.post('/search', async (req, res) => {
|
|
95
|
+
try {
|
|
96
|
+
const { embedding, query, text, collection, limit, threshold, hybridWeight, model } = req.body;
|
|
97
|
+
// Use 'query' or 'text' for the search text
|
|
98
|
+
const queryText = query || text;
|
|
99
|
+
// Get or generate embedding
|
|
100
|
+
let queryEmbedding;
|
|
101
|
+
if (embedding && Array.isArray(embedding)) {
|
|
102
|
+
queryEmbedding = embedding;
|
|
103
|
+
}
|
|
104
|
+
else if (queryText) {
|
|
105
|
+
// Auto-embed the query text
|
|
106
|
+
const emb = await getEmbedder(model);
|
|
107
|
+
queryEmbedding = await emb.embed(queryText);
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
res.status(400).json({
|
|
111
|
+
error: 'Either "query" (text) or "embedding" (array) required',
|
|
112
|
+
hint: 'Send { "query": "your search text" } for automatic embedding',
|
|
113
|
+
});
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
const options = {
|
|
117
|
+
collection,
|
|
118
|
+
limit: limit || 10,
|
|
119
|
+
threshold: threshold || 0,
|
|
120
|
+
hybridWeight: hybridWeight ?? 0.7,
|
|
121
|
+
};
|
|
122
|
+
let results;
|
|
123
|
+
if (queryText && (hybridWeight ?? 0.7) < 1.0) {
|
|
124
|
+
results = await search.hybridSearch(queryEmbedding, queryText, options);
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
results = await search.search(queryEmbedding, options);
|
|
128
|
+
}
|
|
129
|
+
res.json({
|
|
130
|
+
results: results.map(r => ({
|
|
131
|
+
id: r.chunk.id,
|
|
132
|
+
text: r.chunk.text,
|
|
133
|
+
score: r.score,
|
|
134
|
+
vectorScore: r.vectorScore,
|
|
135
|
+
keywordScore: r.keywordScore,
|
|
136
|
+
sourceFile: r.chunk.sourceFile,
|
|
137
|
+
chunkIndex: r.chunk.chunkIndex,
|
|
138
|
+
metadata: r.chunk.metadata,
|
|
139
|
+
})),
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
catch (err) {
|
|
143
|
+
res.status(500).json({ error: String(err) });
|
|
144
|
+
}
|
|
145
|
+
});
|
|
146
|
+
// GET search - simple text query
|
|
147
|
+
app.get('/search', async (req, res) => {
|
|
148
|
+
try {
|
|
149
|
+
const { q, query, collection, limit } = req.query;
|
|
150
|
+
const queryText = (q || query);
|
|
151
|
+
if (!queryText) {
|
|
152
|
+
res.status(400).json({
|
|
153
|
+
error: 'Query parameter "q" or "query" required',
|
|
154
|
+
example: '/search?q=your+search+text&collection=myproject',
|
|
155
|
+
});
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
// Embed the query
|
|
159
|
+
const emb = await getEmbedder();
|
|
160
|
+
const queryEmbedding = await emb.embed(queryText);
|
|
161
|
+
const options = {
|
|
162
|
+
collection: collection,
|
|
163
|
+
limit: limit ? parseInt(limit, 10) : 10,
|
|
164
|
+
};
|
|
165
|
+
const results = await search.hybridSearch(queryEmbedding, queryText, options);
|
|
166
|
+
res.json({
|
|
167
|
+
query: queryText,
|
|
168
|
+
results: results.map(r => ({
|
|
169
|
+
id: r.chunk.id,
|
|
170
|
+
text: r.chunk.text,
|
|
171
|
+
score: r.score,
|
|
172
|
+
vectorScore: r.vectorScore,
|
|
173
|
+
keywordScore: r.keywordScore,
|
|
174
|
+
sourceFile: r.chunk.sourceFile,
|
|
175
|
+
chunkIndex: r.chunk.chunkIndex,
|
|
176
|
+
metadata: r.chunk.metadata,
|
|
177
|
+
})),
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
catch (err) {
|
|
181
|
+
res.status(500).json({ error: String(err) });
|
|
182
|
+
}
|
|
183
|
+
});
|
|
184
|
+
// Recall specific chunk
|
|
185
|
+
app.get('/recall/:id', (req, res) => {
|
|
186
|
+
try {
|
|
187
|
+
const chunk = search.recall(req.params.id);
|
|
188
|
+
if (!chunk) {
|
|
189
|
+
res.status(404).json({ error: 'Chunk not found' });
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
res.json({
|
|
193
|
+
id: chunk.id,
|
|
194
|
+
text: chunk.text,
|
|
195
|
+
sourceFile: chunk.sourceFile,
|
|
196
|
+
chunkIndex: chunk.chunkIndex,
|
|
197
|
+
metadata: chunk.metadata,
|
|
198
|
+
createdAt: chunk.createdAt,
|
|
199
|
+
updatedAt: chunk.updatedAt,
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
catch (err) {
|
|
203
|
+
res.status(500).json({ error: String(err) });
|
|
204
|
+
}
|
|
205
|
+
});
|
|
206
|
+
// Index a directory
|
|
207
|
+
app.post('/index', (req, res) => {
|
|
208
|
+
try {
|
|
209
|
+
const { path: dirPath, collection, recursive } = req.body;
|
|
210
|
+
if (!dirPath || !collection) {
|
|
211
|
+
res.status(400).json({ error: 'path and collection required' });
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
const result = indexer.indexDirectory(dirPath, {
|
|
215
|
+
collection,
|
|
216
|
+
recursive: recursive !== false,
|
|
217
|
+
});
|
|
218
|
+
res.json({
|
|
219
|
+
indexed: true,
|
|
220
|
+
files: result.files,
|
|
221
|
+
chunks: result.chunks,
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
catch (err) {
|
|
225
|
+
res.status(500).json({ error: String(err) });
|
|
226
|
+
}
|
|
227
|
+
});
|
|
228
|
+
// Error handler
|
|
229
|
+
app.use((err, _req, res, _next) => {
|
|
230
|
+
console.error('Server error:', err);
|
|
231
|
+
res.status(500).json({ error: 'Internal server error' });
|
|
232
|
+
});
|
|
233
|
+
return app;
|
|
234
|
+
}
|
|
235
|
+
function startServer(options) {
|
|
236
|
+
const config = { ...types_js_1.DEFAULT_CONFIG.server, ...options.config };
|
|
237
|
+
const app = createServer(options);
|
|
238
|
+
app.listen(config.port, config.host, () => {
|
|
239
|
+
console.log(`AIF-BIN Recall server running at http://${config.host}:${config.port}`);
|
|
240
|
+
console.log('');
|
|
241
|
+
console.log('Endpoints:');
|
|
242
|
+
console.log(' GET /health - Health check');
|
|
243
|
+
console.log(' GET /collections - List collections');
|
|
244
|
+
console.log(' POST /collections/:n - Create collection');
|
|
245
|
+
console.log(' POST /search - Semantic search');
|
|
246
|
+
console.log(' GET /recall/:id - Retrieve chunk');
|
|
247
|
+
console.log(' POST /index - Index directory');
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core types for AIF-BIN Recall memory server
|
|
3
|
+
*/
|
|
4
|
+
export interface MemoryChunk {
|
|
5
|
+
id: string;
|
|
6
|
+
collectionId: string;
|
|
7
|
+
sourceFile: string;
|
|
8
|
+
chunkIndex: number;
|
|
9
|
+
text: string;
|
|
10
|
+
embedding: number[];
|
|
11
|
+
metadata: Record<string, unknown>;
|
|
12
|
+
createdAt: Date;
|
|
13
|
+
updatedAt: Date;
|
|
14
|
+
}
|
|
15
|
+
export interface Collection {
|
|
16
|
+
id: string;
|
|
17
|
+
name: string;
|
|
18
|
+
description?: string;
|
|
19
|
+
fileCount: number;
|
|
20
|
+
chunkCount: number;
|
|
21
|
+
createdAt: Date;
|
|
22
|
+
updatedAt: Date;
|
|
23
|
+
}
|
|
24
|
+
export interface SearchResult {
|
|
25
|
+
chunk: MemoryChunk;
|
|
26
|
+
score: number;
|
|
27
|
+
vectorScore: number;
|
|
28
|
+
keywordScore?: number;
|
|
29
|
+
}
|
|
30
|
+
export interface SearchOptions {
|
|
31
|
+
collection?: string;
|
|
32
|
+
limit?: number;
|
|
33
|
+
threshold?: number;
|
|
34
|
+
hybridWeight?: number;
|
|
35
|
+
filters?: Record<string, unknown>;
|
|
36
|
+
}
|
|
37
|
+
export interface IndexOptions {
|
|
38
|
+
collection: string;
|
|
39
|
+
recursive?: boolean;
|
|
40
|
+
watch?: boolean;
|
|
41
|
+
}
|
|
42
|
+
export interface ServerConfig {
|
|
43
|
+
port: number;
|
|
44
|
+
host: string;
|
|
45
|
+
}
|
|
46
|
+
export interface IndexConfig {
|
|
47
|
+
path: string;
|
|
48
|
+
}
|
|
49
|
+
export interface SearchConfig {
|
|
50
|
+
defaultLimit: number;
|
|
51
|
+
hybridWeight: number;
|
|
52
|
+
}
|
|
53
|
+
export interface EngramConfig {
|
|
54
|
+
server: ServerConfig;
|
|
55
|
+
index: IndexConfig;
|
|
56
|
+
search: SearchConfig;
|
|
57
|
+
}
|
|
58
|
+
export declare const DEFAULT_CONFIG: EngramConfig;
|
|
59
|
+
export interface AifBinHeader {
|
|
60
|
+
magic: Uint8Array;
|
|
61
|
+
version: number;
|
|
62
|
+
flags: number;
|
|
63
|
+
chunkCount: number;
|
|
64
|
+
embeddingDim: number;
|
|
65
|
+
createdAt: number;
|
|
66
|
+
modifiedAt: number;
|
|
67
|
+
}
|
|
68
|
+
export interface AifBinChunk {
|
|
69
|
+
id: string;
|
|
70
|
+
text: string;
|
|
71
|
+
embedding: number[];
|
|
72
|
+
metadata: Record<string, unknown>;
|
|
73
|
+
}
|
|
74
|
+
export interface AifBinFile {
|
|
75
|
+
header: AifBinHeader;
|
|
76
|
+
chunks: AifBinChunk[];
|
|
77
|
+
sourcePath: string;
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,WAAW,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,YAAY;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,YAAY,CAAC;IACrB,KAAK,EAAE,WAAW,CAAC;IACnB,MAAM,EAAE,YAAY,CAAC;CACtB;AAED,eAAO,MAAM,cAAc,EAAE,YAY5B,CAAC;AAEF,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,UAAU,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,YAAY,CAAC;IACrB,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Core types for AIF-BIN Recall memory server
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.DEFAULT_CONFIG = void 0;
|
|
7
|
+
exports.DEFAULT_CONFIG = {
|
|
8
|
+
server: {
|
|
9
|
+
port: 3847,
|
|
10
|
+
host: 'localhost',
|
|
11
|
+
},
|
|
12
|
+
index: {
|
|
13
|
+
path: '~/.aifbin-recall/index.db',
|
|
14
|
+
},
|
|
15
|
+
search: {
|
|
16
|
+
defaultLimit: 10,
|
|
17
|
+
hybridWeight: 0.7,
|
|
18
|
+
},
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAiEU,QAAA,cAAc,GAAiB;IAC1C,MAAM,EAAE;QACN,IAAI,EAAE,IAAI;QACV,IAAI,EAAE,WAAW;KAClB;IACD,KAAK,EAAE;QACL,IAAI,EAAE,2BAA2B;KAClC;IACD,MAAM,EAAE;QACN,YAAY,EAAE,EAAE;QAChB,YAAY,EAAE,GAAG;KAClB;CACF,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@terronex-dev/aifbin-recall",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Local-first memory server for AI agents. Query AIF-BIN semantic memory files via HTTP/MCP.",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"bin": {
|
|
8
|
+
"aifbin-recall": "./dist/cli.js"
|
|
9
|
+
},
|
|
10
|
+
"scripts": {
|
|
11
|
+
"build": "tsc",
|
|
12
|
+
"dev": "tsx watch src/cli.ts",
|
|
13
|
+
"start": "node dist/cli.js",
|
|
14
|
+
"test": "vitest",
|
|
15
|
+
"test:run": "vitest run",
|
|
16
|
+
"lint": "eslint src/",
|
|
17
|
+
"prepublishOnly": "npm run build"
|
|
18
|
+
},
|
|
19
|
+
"keywords": [
|
|
20
|
+
"ai",
|
|
21
|
+
"memory",
|
|
22
|
+
"semantic-search",
|
|
23
|
+
"vector-database",
|
|
24
|
+
"rag",
|
|
25
|
+
"mcp",
|
|
26
|
+
"aif-bin",
|
|
27
|
+
"embeddings",
|
|
28
|
+
"local-first"
|
|
29
|
+
],
|
|
30
|
+
"author": "Terronex <terronex.dev@gmail.com>",
|
|
31
|
+
"license": "MIT",
|
|
32
|
+
"repository": {
|
|
33
|
+
"type": "git",
|
|
34
|
+
"url": "https://github.com/terronexdev/aifbin-recall.git"
|
|
35
|
+
},
|
|
36
|
+
"homepage": "https://github.com/Terronex-dev/aifbin-recall#readme",
|
|
37
|
+
"bugs": {
|
|
38
|
+
"url": "https://github.com/Terronex-dev/aifbin-recall/issues"
|
|
39
|
+
},
|
|
40
|
+
"engines": {
|
|
41
|
+
"node": ">=18"
|
|
42
|
+
},
|
|
43
|
+
"dependencies": {
|
|
44
|
+
"@anthropic-ai/sdk": "^0.30.0",
|
|
45
|
+
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
46
|
+
"@xenova/transformers": "^2.17.0",
|
|
47
|
+
"better-sqlite3": "^11.0.0",
|
|
48
|
+
"commander": "^12.0.0",
|
|
49
|
+
"cors": "^2.8.5",
|
|
50
|
+
"express": "^4.18.2",
|
|
51
|
+
"msgpackr": "^1.10.0",
|
|
52
|
+
"yaml": "^2.3.4"
|
|
53
|
+
},
|
|
54
|
+
"devDependencies": {
|
|
55
|
+
"@types/better-sqlite3": "^7.6.8",
|
|
56
|
+
"@types/cors": "^2.8.17",
|
|
57
|
+
"@types/express": "^4.17.21",
|
|
58
|
+
"@types/node": "^20.10.0",
|
|
59
|
+
"eslint": "^8.56.0",
|
|
60
|
+
"tsx": "^4.7.0",
|
|
61
|
+
"typescript": "^5.3.3",
|
|
62
|
+
"vitest": "^2.0.0"
|
|
63
|
+
}
|
|
64
|
+
}
|