@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
@@ -0,0 +1,246 @@
1
+ "use strict";
2
+ /**
3
+ * AIF-BIN file indexer for AIF-BIN Recall
4
+ * Parses AIF-BIN v2 binary format
5
+ */
6
+ var __importDefault = (this && this.__importDefault) || function (mod) {
7
+ return (mod && mod.__esModule) ? mod : { "default": mod };
8
+ };
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.Indexer = void 0;
11
+ exports.parseAifBinFile = parseAifBinFile;
12
+ exports.findAifBinFiles = findAifBinFiles;
13
+ const fs_1 = __importDefault(require("fs"));
14
+ const path_1 = __importDefault(require("path"));
15
+ const msgpackr_1 = require("msgpackr");
16
+ // AIF-BIN v2 constants
17
+ const MAGIC = Buffer.from([0x41, 0x49, 0x46, 0x42, 0x49, 0x4e, 0x00, 0x01]); // "AIFBIN\x00\x01"
18
+ const HEADER_SIZE = 64;
19
+ const ABSENT_OFFSET = BigInt('0xFFFFFFFFFFFFFFFF');
20
+ // Chunk types
21
+ var ChunkType;
22
+ (function (ChunkType) {
23
+ ChunkType[ChunkType["TEXT"] = 1] = "TEXT";
24
+ ChunkType[ChunkType["TABLE_JSON"] = 2] = "TABLE_JSON";
25
+ ChunkType[ChunkType["IMAGE"] = 3] = "IMAGE";
26
+ ChunkType[ChunkType["AUDIO"] = 4] = "AUDIO";
27
+ ChunkType[ChunkType["VIDEO"] = 5] = "VIDEO";
28
+ ChunkType[ChunkType["CODE"] = 6] = "CODE";
29
+ })(ChunkType || (ChunkType = {}));
30
+ /**
31
+ * Parse an AIF-BIN v2 file
32
+ */
33
+ function parseAifBinFile(filePath) {
34
+ const buffer = fs_1.default.readFileSync(filePath);
35
+ if (buffer.length < HEADER_SIZE) {
36
+ throw new Error(`File too small: ${filePath}`);
37
+ }
38
+ // Verify magic bytes
39
+ const magic = buffer.subarray(0, 8);
40
+ if (!magic.equals(MAGIC)) {
41
+ throw new Error(`Invalid AIF-BIN file: bad magic bytes in ${filePath}`);
42
+ }
43
+ // Parse header (64 bytes)
44
+ const view = new DataView(buffer.buffer, buffer.byteOffset, buffer.byteLength);
45
+ const version = view.getUint32(8, true);
46
+ // padding at 12-15
47
+ const metadataOffset = view.getBigUint64(16, true);
48
+ const originalRawOffset = view.getBigUint64(24, true);
49
+ const contentChunksOffset = view.getBigUint64(32, true);
50
+ const versionsOffset = view.getBigUint64(40, true);
51
+ const footerOffset = view.getBigUint64(48, true);
52
+ const totalSize = view.getBigUint64(56, true);
53
+ const header = {
54
+ magic: new Uint8Array(magic),
55
+ version,
56
+ flags: 0,
57
+ chunkCount: 0,
58
+ embeddingDim: 0,
59
+ createdAt: 0,
60
+ modifiedAt: 0,
61
+ };
62
+ // Parse metadata section
63
+ let metadata = {};
64
+ if (metadataOffset !== ABSENT_OFFSET) {
65
+ const metaStart = Number(metadataOffset);
66
+ const metaLength = view.getBigUint64(metaStart, true);
67
+ const metaData = buffer.subarray(metaStart + 8, metaStart + 8 + Number(metaLength));
68
+ try {
69
+ metadata = (0, msgpackr_1.unpack)(metaData);
70
+ }
71
+ catch (e) {
72
+ // Metadata parse failed, continue with empty
73
+ }
74
+ }
75
+ // Parse content chunks section
76
+ const chunks = [];
77
+ if (contentChunksOffset !== ABSENT_OFFSET) {
78
+ const chunksStart = Number(contentChunksOffset);
79
+ const chunkCount = view.getUint32(chunksStart, true);
80
+ header.chunkCount = chunkCount;
81
+ let offset = chunksStart + 4;
82
+ for (let i = 0; i < chunkCount; i++) {
83
+ try {
84
+ const chunkType = view.getUint32(offset, true);
85
+ offset += 4;
86
+ const dataLength = Number(view.getBigUint64(offset, true));
87
+ offset += 8;
88
+ const metadataLength = Number(view.getBigUint64(offset, true));
89
+ offset += 8;
90
+ // Parse chunk metadata
91
+ let chunkMeta = {};
92
+ if (metadataLength > 0) {
93
+ const chunkMetaData = buffer.subarray(offset, offset + metadataLength);
94
+ try {
95
+ chunkMeta = (0, msgpackr_1.unpack)(chunkMetaData);
96
+ }
97
+ catch (e) {
98
+ // Skip bad metadata
99
+ }
100
+ offset += metadataLength;
101
+ }
102
+ // Parse chunk data
103
+ const chunkData = buffer.subarray(offset, offset + dataLength);
104
+ offset += dataLength;
105
+ // Extract text content based on chunk type
106
+ let text = '';
107
+ if (chunkType === ChunkType.TEXT || chunkType === ChunkType.CODE) {
108
+ text = chunkData.toString('utf-8');
109
+ }
110
+ else if (chunkType === ChunkType.TABLE_JSON) {
111
+ try {
112
+ const tableData = JSON.parse(chunkData.toString('utf-8'));
113
+ text = JSON.stringify(tableData);
114
+ }
115
+ catch {
116
+ text = chunkData.toString('utf-8');
117
+ }
118
+ }
119
+ // Extract embedding if present in chunk metadata
120
+ const embedding = chunkMeta.embedding || [];
121
+ if (embedding.length > 0 && header.embeddingDim === 0) {
122
+ header.embeddingDim = embedding.length;
123
+ }
124
+ chunks.push({
125
+ id: chunkMeta.id || crypto.randomUUID(),
126
+ text,
127
+ embedding,
128
+ metadata: chunkMeta,
129
+ });
130
+ }
131
+ catch (e) {
132
+ // Skip malformed chunk
133
+ console.error(` Warning: Failed to parse chunk ${i} in ${path_1.default.basename(filePath)}`);
134
+ break;
135
+ }
136
+ }
137
+ }
138
+ // Extract timestamps from metadata if available
139
+ if (metadata.created_at) {
140
+ header.createdAt = new Date(metadata.created_at).getTime();
141
+ }
142
+ if (metadata.modified_at) {
143
+ header.modifiedAt = new Date(metadata.modified_at).getTime();
144
+ }
145
+ return {
146
+ header,
147
+ chunks,
148
+ sourcePath: filePath,
149
+ };
150
+ }
151
+ /**
152
+ * Find all .aif-bin files in a directory
153
+ */
154
+ function findAifBinFiles(dir, recursive = true) {
155
+ const files = [];
156
+ function scan(currentDir) {
157
+ const entries = fs_1.default.readdirSync(currentDir, { withFileTypes: true });
158
+ for (const entry of entries) {
159
+ const fullPath = path_1.default.join(currentDir, entry.name);
160
+ if (entry.isDirectory() && recursive) {
161
+ scan(fullPath);
162
+ }
163
+ else if (entry.isFile() && entry.name.endsWith('.aif-bin')) {
164
+ files.push(fullPath);
165
+ }
166
+ }
167
+ }
168
+ scan(dir);
169
+ return files;
170
+ }
171
+ class Indexer {
172
+ db;
173
+ constructor(db) {
174
+ this.db = db;
175
+ }
176
+ /**
177
+ * Index a single AIF-BIN file into a collection
178
+ */
179
+ indexFile(filePath, collectionId) {
180
+ const aifbin = parseAifBinFile(filePath);
181
+ // Skip files with no chunks or no embeddings
182
+ const chunksWithEmbeddings = aifbin.chunks.filter(c => c.embedding.length > 0);
183
+ if (chunksWithEmbeddings.length === 0) {
184
+ console.log(` Skipped: ${path_1.default.basename(filePath)} (no embeddings)`);
185
+ return 0;
186
+ }
187
+ // Delete existing chunks from this file (for re-indexing)
188
+ this.db.deleteChunksBySource(filePath);
189
+ // Convert to MemoryChunks and insert
190
+ const chunks = chunksWithEmbeddings.map((chunk, index) => ({
191
+ id: chunk.id || crypto.randomUUID(),
192
+ collectionId,
193
+ sourceFile: filePath,
194
+ chunkIndex: index,
195
+ text: chunk.text,
196
+ embedding: chunk.embedding,
197
+ metadata: {
198
+ ...chunk.metadata,
199
+ embeddingDim: aifbin.header.embeddingDim,
200
+ originalCreatedAt: aifbin.header.createdAt,
201
+ originalModifiedAt: aifbin.header.modifiedAt,
202
+ },
203
+ }));
204
+ this.db.insertChunks(chunks);
205
+ return chunks.length;
206
+ }
207
+ /**
208
+ * Index a directory of AIF-BIN files
209
+ */
210
+ indexDirectory(dir, options) {
211
+ const { collection, recursive = true } = options;
212
+ // Get or create collection
213
+ let col = this.db.getCollection(collection);
214
+ if (!col) {
215
+ col = this.db.createCollection(collection);
216
+ }
217
+ // Find all .aif-bin files
218
+ const files = findAifBinFiles(dir, recursive);
219
+ let totalChunks = 0;
220
+ let successFiles = 0;
221
+ for (const file of files) {
222
+ try {
223
+ const count = this.indexFile(file, col.id);
224
+ if (count > 0) {
225
+ totalChunks += count;
226
+ successFiles++;
227
+ console.log(` Indexed: ${path_1.default.basename(file)} (${count} chunks)`);
228
+ }
229
+ }
230
+ catch (err) {
231
+ console.error(` Failed: ${path_1.default.basename(file)} - ${err}`);
232
+ }
233
+ }
234
+ // Update collection stats
235
+ this.db.updateCollectionStats(col.id);
236
+ return { files: successFiles, chunks: totalChunks };
237
+ }
238
+ /**
239
+ * Remove a file from the index
240
+ */
241
+ removeFile(filePath) {
242
+ return this.db.deleteChunksBySource(filePath);
243
+ }
244
+ }
245
+ exports.Indexer = Indexer;
246
+ //# sourceMappingURL=indexer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"indexer.js","sourceRoot":"","sources":["../src/indexer.ts"],"names":[],"mappings":"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"}
package/dist/mcp.d.ts ADDED
@@ -0,0 +1,7 @@
1
+ /**
2
+ * MCP (Model Context Protocol) server for AIF-BIN Recall
3
+ * Enables AI agents to query semantic memories
4
+ */
5
+ import { EngramDB } from './db.js';
6
+ export declare function startMcpServer(db: EngramDB): Promise<void>;
7
+ //# sourceMappingURL=mcp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAKnC,wBAAsB,cAAc,CAAC,EAAE,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAmOhE"}
package/dist/mcp.js ADDED
@@ -0,0 +1,207 @@
1
+ "use strict";
2
+ /**
3
+ * MCP (Model Context Protocol) server for AIF-BIN Recall
4
+ * Enables AI agents to query semantic memories
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.startMcpServer = startMcpServer;
8
+ const index_js_1 = require("@modelcontextprotocol/sdk/server/index.js");
9
+ const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
10
+ const types_js_1 = require("@modelcontextprotocol/sdk/types.js");
11
+ const search_js_1 = require("./search.js");
12
+ const indexer_js_1 = require("./indexer.js");
13
+ const embedder_js_1 = require("./embedder.js");
14
+ async function startMcpServer(db) {
15
+ const search = new search_js_1.SearchEngine(db);
16
+ const indexer = new indexer_js_1.Indexer(db);
17
+ const embedder = new embedder_js_1.Embedder('minilm');
18
+ const server = new index_js_1.Server({
19
+ name: 'aifbin-recall',
20
+ version: '0.1.0',
21
+ }, {
22
+ capabilities: {
23
+ tools: {},
24
+ },
25
+ });
26
+ // List available tools
27
+ server.setRequestHandler(types_js_1.ListToolsRequestSchema, async () => {
28
+ return {
29
+ tools: [
30
+ {
31
+ name: 'recall_search',
32
+ description: 'Search semantic memories using natural language. Automatically embeds your query text. Returns relevant text chunks with similarity scores.',
33
+ inputSchema: {
34
+ type: 'object',
35
+ properties: {
36
+ query: {
37
+ type: 'string',
38
+ description: 'Natural language search query (will be embedded automatically)',
39
+ },
40
+ embedding: {
41
+ type: 'array',
42
+ items: { type: 'number' },
43
+ description: 'Pre-computed query embedding vector (optional, query text is preferred)',
44
+ },
45
+ collection: {
46
+ type: 'string',
47
+ description: 'Collection name to search (optional, searches all if omitted)',
48
+ },
49
+ limit: {
50
+ type: 'number',
51
+ description: 'Maximum results to return (default: 10)',
52
+ },
53
+ },
54
+ required: ['query'],
55
+ },
56
+ },
57
+ {
58
+ name: 'recall_get',
59
+ description: 'Retrieve a specific memory chunk by ID',
60
+ inputSchema: {
61
+ type: 'object',
62
+ properties: {
63
+ id: {
64
+ type: 'string',
65
+ description: 'Chunk ID to retrieve',
66
+ },
67
+ },
68
+ required: ['id'],
69
+ },
70
+ },
71
+ {
72
+ name: 'recall_collections',
73
+ description: 'List all available memory collections',
74
+ inputSchema: {
75
+ type: 'object',
76
+ properties: {},
77
+ },
78
+ },
79
+ {
80
+ name: 'recall_index',
81
+ description: 'Index a directory of AIF-BIN files into a collection',
82
+ inputSchema: {
83
+ type: 'object',
84
+ properties: {
85
+ path: {
86
+ type: 'string',
87
+ description: 'Directory path containing .aif-bin files',
88
+ },
89
+ collection: {
90
+ type: 'string',
91
+ description: 'Collection name to index into',
92
+ },
93
+ recursive: {
94
+ type: 'boolean',
95
+ description: 'Search subdirectories (default: true)',
96
+ },
97
+ },
98
+ required: ['path', 'collection'],
99
+ },
100
+ },
101
+ ],
102
+ };
103
+ });
104
+ // Handle tool calls
105
+ server.setRequestHandler(types_js_1.CallToolRequestSchema, async (request) => {
106
+ const { name, arguments: args } = request.params;
107
+ try {
108
+ switch (name) {
109
+ case 'recall_search': {
110
+ const { embedding, query, collection, limit } = args;
111
+ if (!query && (!embedding || !Array.isArray(embedding))) {
112
+ return {
113
+ content: [{ type: 'text', text: 'Error: query text required' }],
114
+ isError: true,
115
+ };
116
+ }
117
+ // Generate embedding from query text if not provided
118
+ let queryEmbedding;
119
+ if (embedding && Array.isArray(embedding)) {
120
+ queryEmbedding = embedding;
121
+ }
122
+ else {
123
+ queryEmbedding = await embedder.embed(query);
124
+ }
125
+ const options = { collection, limit: limit || 10 };
126
+ const results = await search.hybridSearch(queryEmbedding, query, options);
127
+ const formatted = results.map((r, i) => `[${i + 1}] Score: ${r.score.toFixed(3)}\n` +
128
+ ` Source: ${r.chunk.sourceFile}\n` +
129
+ ` Text: ${r.chunk.text.slice(0, 500)}${r.chunk.text.length > 500 ? '...' : ''}\n` +
130
+ ` ID: ${r.chunk.id}`).join('\n\n');
131
+ return {
132
+ content: [{
133
+ type: 'text',
134
+ text: results.length > 0
135
+ ? `Found ${results.length} results:\n\n${formatted}`
136
+ : 'No results found.',
137
+ }],
138
+ };
139
+ }
140
+ case 'recall_get': {
141
+ const { id } = args;
142
+ const chunk = search.recall(id);
143
+ if (!chunk) {
144
+ return {
145
+ content: [{ type: 'text', text: `Chunk not found: ${id}` }],
146
+ isError: true,
147
+ };
148
+ }
149
+ return {
150
+ content: [{
151
+ type: 'text',
152
+ text: `Source: ${chunk.sourceFile}\n` +
153
+ `Chunk: ${chunk.chunkIndex}\n` +
154
+ `Created: ${chunk.createdAt.toISOString()}\n\n` +
155
+ `Text:\n${chunk.text}`,
156
+ }],
157
+ };
158
+ }
159
+ case 'recall_collections': {
160
+ const collections = db.listCollections();
161
+ if (collections.length === 0) {
162
+ return {
163
+ content: [{ type: 'text', text: 'No collections found. Use recall_index to create one.' }],
164
+ };
165
+ }
166
+ const formatted = collections.map(c => `• ${c.name}: ${c.chunkCount} chunks from ${c.fileCount} files` +
167
+ (c.description ? ` - ${c.description}` : '')).join('\n');
168
+ return {
169
+ content: [{
170
+ type: 'text',
171
+ text: `Available collections:\n\n${formatted}`,
172
+ }],
173
+ };
174
+ }
175
+ case 'recall_index': {
176
+ const { path: dirPath, collection, recursive } = args;
177
+ const result = indexer.indexDirectory(dirPath, {
178
+ collection,
179
+ recursive: recursive !== false,
180
+ });
181
+ return {
182
+ content: [{
183
+ type: 'text',
184
+ text: `Indexed ${result.files} files (${result.chunks} chunks) into collection "${collection}"`,
185
+ }],
186
+ };
187
+ }
188
+ default:
189
+ return {
190
+ content: [{ type: 'text', text: `Unknown tool: ${name}` }],
191
+ isError: true,
192
+ };
193
+ }
194
+ }
195
+ catch (err) {
196
+ return {
197
+ content: [{ type: 'text', text: `Error: ${err}` }],
198
+ isError: true,
199
+ };
200
+ }
201
+ });
202
+ // Start the server
203
+ const transport = new stdio_js_1.StdioServerTransport();
204
+ await server.connect(transport);
205
+ console.error('AIF-BIN Recall MCP server running');
206
+ }
207
+ //# sourceMappingURL=mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Search functionality for AIF-BIN Recall
3
+ */
4
+ import type { MemoryChunk, SearchResult, SearchOptions, SearchConfig } from './types.js';
5
+ import { EngramDB } from './db.js';
6
+ /**
7
+ * Calculate cosine similarity between two vectors
8
+ */
9
+ export declare function cosineSimilarity(a: number[], b: number[]): number;
10
+ export declare class SearchEngine {
11
+ private db;
12
+ private config;
13
+ constructor(db: EngramDB, config?: Partial<SearchConfig>);
14
+ /**
15
+ * Perform semantic search using query embedding
16
+ */
17
+ search(queryEmbedding: number[], options?: SearchOptions): Promise<SearchResult[]>;
18
+ /**
19
+ * Perform hybrid search combining vector similarity and keyword matching
20
+ */
21
+ hybridSearch(queryEmbedding: number[], queryText: string, options?: SearchOptions): Promise<SearchResult[]>;
22
+ /**
23
+ * Recall a specific chunk by ID
24
+ */
25
+ recall(id: string): MemoryChunk | null;
26
+ }
27
+ //# sourceMappingURL=search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../src/search.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEzF,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnC;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAmBjE;AAsBD,qBAAa,YAAY;IACvB,OAAO,CAAC,EAAE,CAAW;IACrB,OAAO,CAAC,MAAM,CAAe;gBAEjB,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC;IAKxD;;OAEG;IACG,MAAM,CACV,cAAc,EAAE,MAAM,EAAE,EACxB,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,YAAY,EAAE,CAAC;IAuD1B;;OAEG;IACG,YAAY,CAChB,cAAc,EAAE,MAAM,EAAE,EACxB,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,YAAY,EAAE,CAAC;IAiE1B;;OAEG;IACH,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;CAGvC"}