@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.
Files changed (51) hide show
  1. package/CONTRIBUTING.md +65 -0
  2. package/LICENSE +21 -0
  3. package/NOTICE +36 -0
  4. package/README.md +250 -0
  5. package/dist/cli.d.ts +6 -0
  6. package/dist/cli.d.ts.map +1 -0
  7. package/dist/cli.js +182 -0
  8. package/dist/cli.js.map +1 -0
  9. package/dist/db.d.ts +29 -0
  10. package/dist/db.d.ts.map +1 -0
  11. package/dist/db.js +252 -0
  12. package/dist/db.js.map +1 -0
  13. package/dist/embedder.d.ts +47 -0
  14. package/dist/embedder.d.ts.map +1 -0
  15. package/dist/embedder.js +152 -0
  16. package/dist/embedder.js.map +1 -0
  17. package/dist/index.d.ts +27 -0
  18. package/dist/index.d.ts.map +1 -0
  19. package/dist/index.js +45 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/indexer.d.ts +34 -0
  22. package/dist/indexer.d.ts.map +1 -0
  23. package/dist/indexer.js +246 -0
  24. package/dist/indexer.js.map +1 -0
  25. package/dist/mcp.d.ts +7 -0
  26. package/dist/mcp.d.ts.map +1 -0
  27. package/dist/mcp.js +207 -0
  28. package/dist/mcp.js.map +1 -0
  29. package/dist/search.d.ts +27 -0
  30. package/dist/search.d.ts.map +1 -0
  31. package/dist/search.js +159 -0
  32. package/dist/search.js.map +1 -0
  33. package/dist/server.d.ts +13 -0
  34. package/dist/server.d.ts.map +1 -0
  35. package/dist/server.js +250 -0
  36. package/dist/server.js.map +1 -0
  37. package/dist/types.d.ts +79 -0
  38. package/dist/types.d.ts.map +1 -0
  39. package/dist/types.js +20 -0
  40. package/dist/types.js.map +1 -0
  41. package/package.json +64 -0
  42. package/src/cli.ts +195 -0
  43. package/src/db.ts +295 -0
  44. package/src/embedder.ts +175 -0
  45. package/src/index.ts +46 -0
  46. package/src/indexer.ts +272 -0
  47. package/src/mcp.ts +244 -0
  48. package/src/search.ts +201 -0
  49. package/src/server.ts +270 -0
  50. package/src/types.ts +103 -0
  51. 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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"}
@@ -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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"}
@@ -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
+ }