@memextend/opencode 0.2.0 → 0.3.2
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/README.md +1 -1
- package/dist/index.d.ts +1 -26
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -1
- package/dist/index.js.map +1 -1
- package/dist/mcp/server.cjs +107 -90
- package/dist/mcp/server.js +13 -13
- package/dist/mcp/server.js.map +1 -1
- package/package.json +2 -2
- package/scripts/build.js +9 -1
package/README.md
CHANGED
|
@@ -195,7 +195,7 @@ OpenCode automatically loads `AGENTS.md` files and includes them in the agent's
|
|
|
195
195
|
2. **Tool Discovery**: OpenCode discovers the memextend tools at startup
|
|
196
196
|
3. **Semantic Search**: Memories are embedded using the Nomic embed model for semantic search
|
|
197
197
|
4. **Hybrid Search**: Combines vector similarity with full-text search for best results
|
|
198
|
-
5. **Persistent Storage**: Memories are stored in SQLite with
|
|
198
|
+
5. **Persistent Storage**: Memories are stored in SQLite with sqlite-vec for vectors
|
|
199
199
|
|
|
200
200
|
## Configuration Reference
|
|
201
201
|
|
package/dist/index.d.ts
CHANGED
|
@@ -1,30 +1,5 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* OpenCode Adapter for memextend
|
|
3
|
-
*
|
|
4
|
-
* This adapter provides memextend integration for OpenCode (https://github.com/anomalyco/opencode)
|
|
5
|
-
* via MCP (Model Context Protocol) server.
|
|
6
|
-
*
|
|
7
|
-
* OpenCode is an open-source AI coding agent by Anomaly that supports:
|
|
8
|
-
* - Multiple AI providers (Anthropic, OpenAI, Google, local models)
|
|
9
|
-
* - Built-in agents (build, plan, general)
|
|
10
|
-
* - MCP server integration for custom tools
|
|
11
|
-
* - LSP support for code intelligence
|
|
12
|
-
* - TUI interface
|
|
13
|
-
*
|
|
14
|
-
* Integration approach:
|
|
15
|
-
* - MCP server provides mid-session memory tools (search, save, forget, status, context)
|
|
16
|
-
* - Users configure memextend in their opencode.json config
|
|
17
|
-
* - No native hook system, so session capture requires manual saves or external triggers
|
|
18
|
-
*
|
|
19
|
-
* Configuration location:
|
|
20
|
-
* - ~/.config/opencode/opencode.json (global)
|
|
21
|
-
* - ./opencode.json (project-local)
|
|
22
|
-
*
|
|
23
|
-
* OpenCode documentation: https://opencode.ai/docs
|
|
24
|
-
* GitHub: https://github.com/anomalyco/opencode
|
|
25
|
-
*/
|
|
26
1
|
export declare const ADAPTER_NAME = "opencode";
|
|
27
|
-
export declare const ADAPTER_VERSION
|
|
2
|
+
export declare const ADAPTER_VERSION: any;
|
|
28
3
|
export declare const ADAPTER_STATUS = "implemented";
|
|
29
4
|
export * from './mcp/index.js';
|
|
30
5
|
export * from './config/index.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAqCA,eAAO,MAAM,YAAY,aAAa,CAAC;AACvC,eAAO,MAAM,eAAe,KAAc,CAAC;AAC3C,eAAO,MAAM,cAAc,gBAAgB,CAAC;AAG5C,cAAc,gBAAgB,CAAC;AAG/B,cAAc,mBAAmB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
// packages/adapters/opencode/src/index.ts
|
|
2
2
|
// Copyright (c) 2026 ZodTTD LLC. MIT License.
|
|
3
|
+
import { readFileSync } from 'fs';
|
|
4
|
+
import { dirname, join } from 'path';
|
|
5
|
+
import { fileURLToPath } from 'url';
|
|
3
6
|
/**
|
|
4
7
|
* OpenCode Adapter for memextend
|
|
5
8
|
*
|
|
@@ -25,8 +28,11 @@
|
|
|
25
28
|
* OpenCode documentation: https://opencode.ai/docs
|
|
26
29
|
* GitHub: https://github.com/anomalyco/opencode
|
|
27
30
|
*/
|
|
31
|
+
// Read version from package.json
|
|
32
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
33
|
+
const pkg = JSON.parse(readFileSync(join(__dirname, '..', 'package.json'), 'utf-8'));
|
|
28
34
|
export const ADAPTER_NAME = 'opencode';
|
|
29
|
-
export const ADAPTER_VERSION =
|
|
35
|
+
export const ADAPTER_VERSION = pkg.version;
|
|
30
36
|
export const ADAPTER_STATUS = 'implemented';
|
|
31
37
|
// Export MCP server utilities
|
|
32
38
|
export * from './mcp/index.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,0CAA0C;AAC1C,8CAA8C;AAE9C;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,MAAM,CAAC,MAAM,YAAY,GAAG,UAAU,CAAC;AACvC,MAAM,CAAC,MAAM,eAAe,GAAG,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,0CAA0C;AAC1C,8CAA8C;AAE9C,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,iCAAiC;AACjC,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;AAErF,MAAM,CAAC,MAAM,YAAY,GAAG,UAAU,CAAC;AACvC,MAAM,CAAC,MAAM,eAAe,GAAG,GAAG,CAAC,OAAO,CAAC;AAC3C,MAAM,CAAC,MAAM,cAAc,GAAG,aAAa,CAAC;AAE5C,8BAA8B;AAC9B,cAAc,gBAAgB,CAAC;AAE/B,iCAAiC;AACjC,cAAc,mBAAmB,CAAC"}
|
package/dist/mcp/server.cjs
CHANGED
|
@@ -13730,6 +13730,7 @@ var SQLiteStorage = class {
|
|
|
13730
13730
|
constructor(dbPath) {
|
|
13731
13731
|
this.db = new import_better_sqlite3.default(dbPath);
|
|
13732
13732
|
this.db.pragma("journal_mode = WAL");
|
|
13733
|
+
this.db.pragma("busy_timeout = 5000");
|
|
13733
13734
|
this.initialize();
|
|
13734
13735
|
}
|
|
13735
13736
|
initialize() {
|
|
@@ -14083,122 +14084,138 @@ var SQLiteStorage = class {
|
|
|
14083
14084
|
};
|
|
14084
14085
|
}
|
|
14085
14086
|
close() {
|
|
14087
|
+
try {
|
|
14088
|
+
this.db.pragma("wal_checkpoint(TRUNCATE)");
|
|
14089
|
+
} catch {
|
|
14090
|
+
}
|
|
14086
14091
|
this.db.close();
|
|
14087
14092
|
}
|
|
14088
14093
|
};
|
|
14089
14094
|
|
|
14090
|
-
// ../../core/dist/storage/
|
|
14091
|
-
var
|
|
14092
|
-
var
|
|
14095
|
+
// ../../core/dist/storage/sqlite-vec.js
|
|
14096
|
+
var import_better_sqlite32 = __toESM(require("better-sqlite3"), 1);
|
|
14097
|
+
var sqliteVec = __toESM(require("sqlite-vec"), 1);
|
|
14098
|
+
var SQLiteVecStorage = class _SQLiteVecStorage {
|
|
14093
14099
|
db;
|
|
14094
|
-
|
|
14095
|
-
tableName = "memories";
|
|
14100
|
+
tableName = "memory_vectors";
|
|
14096
14101
|
dimensions = 384;
|
|
14097
14102
|
constructor(db) {
|
|
14098
14103
|
this.db = db;
|
|
14099
14104
|
}
|
|
14100
14105
|
static async create(dbPath) {
|
|
14101
|
-
|
|
14102
|
-
|
|
14103
|
-
|
|
14106
|
+
let actualPath = dbPath;
|
|
14107
|
+
if (dbPath.endsWith("vectors") || dbPath.endsWith("vectors/")) {
|
|
14108
|
+
actualPath = dbPath.replace(/\/?$/, ".db");
|
|
14109
|
+
}
|
|
14110
|
+
const db = new import_better_sqlite32.default(actualPath);
|
|
14111
|
+
sqliteVec.load(db);
|
|
14112
|
+
db.pragma("journal_mode = WAL");
|
|
14113
|
+
db.pragma("busy_timeout = 5000");
|
|
14114
|
+
const storage = new _SQLiteVecStorage(db);
|
|
14115
|
+
storage.initialize();
|
|
14104
14116
|
return storage;
|
|
14105
14117
|
}
|
|
14106
|
-
|
|
14107
|
-
|
|
14108
|
-
|
|
14109
|
-
|
|
14110
|
-
|
|
14118
|
+
initialize() {
|
|
14119
|
+
this.db.exec(`
|
|
14120
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS ${this.tableName} USING vec0(
|
|
14121
|
+
id TEXT PRIMARY KEY,
|
|
14122
|
+
vector FLOAT[${this.dimensions}]
|
|
14123
|
+
)
|
|
14124
|
+
`);
|
|
14111
14125
|
}
|
|
14112
14126
|
async insertVector(id, vector) {
|
|
14113
14127
|
if (vector.length !== this.dimensions) {
|
|
14114
14128
|
throw new Error(`Vector must have ${this.dimensions} dimensions, got ${vector.length}`);
|
|
14115
14129
|
}
|
|
14116
|
-
const
|
|
14117
|
-
|
|
14118
|
-
|
|
14119
|
-
|
|
14120
|
-
|
|
14121
|
-
|
|
14122
|
-
|
|
14130
|
+
const float32 = new Float32Array(vector);
|
|
14131
|
+
const vectorBuffer = Buffer.from(float32.buffer);
|
|
14132
|
+
const stmt = this.db.prepare(`
|
|
14133
|
+
INSERT OR REPLACE INTO ${this.tableName} (id, vector)
|
|
14134
|
+
VALUES (?, ?)
|
|
14135
|
+
`);
|
|
14136
|
+
stmt.run(id, vectorBuffer);
|
|
14123
14137
|
}
|
|
14124
14138
|
async insertVectors(items) {
|
|
14125
|
-
|
|
14126
|
-
|
|
14127
|
-
|
|
14139
|
+
const stmt = this.db.prepare(`
|
|
14140
|
+
INSERT OR REPLACE INTO ${this.tableName} (id, vector)
|
|
14141
|
+
VALUES (?, ?)
|
|
14142
|
+
`);
|
|
14143
|
+
const insertMany = this.db.transaction((items2) => {
|
|
14144
|
+
for (const item of items2) {
|
|
14145
|
+
if (item.vector.length !== this.dimensions) {
|
|
14146
|
+
throw new Error(`Vector must have ${this.dimensions} dimensions, got ${item.vector.length}`);
|
|
14147
|
+
}
|
|
14148
|
+
const float32 = new Float32Array(item.vector);
|
|
14149
|
+
const vectorBuffer = Buffer.from(float32.buffer);
|
|
14150
|
+
stmt.run(item.id, vectorBuffer);
|
|
14128
14151
|
}
|
|
14129
|
-
}
|
|
14130
|
-
|
|
14131
|
-
this.table = await this.db.createTable(this.tableName, items);
|
|
14132
|
-
} else {
|
|
14133
|
-
await this.table.add(items);
|
|
14134
|
-
}
|
|
14135
|
-
await this.optimize();
|
|
14152
|
+
});
|
|
14153
|
+
insertMany(items);
|
|
14136
14154
|
}
|
|
14137
14155
|
async search(vector, limit = 10) {
|
|
14138
|
-
if (
|
|
14156
|
+
if (vector.length !== this.dimensions) {
|
|
14157
|
+
throw new Error(`Query vector must have ${this.dimensions} dimensions, got ${vector.length}`);
|
|
14158
|
+
}
|
|
14159
|
+
const count = await this.getVectorCount();
|
|
14160
|
+
if (count === 0) {
|
|
14139
14161
|
return [];
|
|
14140
14162
|
}
|
|
14141
14163
|
const effectiveLimit = limit > 0 ? limit : 100;
|
|
14142
|
-
const
|
|
14143
|
-
|
|
14164
|
+
const float32 = new Float32Array(vector);
|
|
14165
|
+
const vectorBuffer = Buffer.from(float32.buffer);
|
|
14166
|
+
const stmt = this.db.prepare(`
|
|
14167
|
+
SELECT id, distance
|
|
14168
|
+
FROM ${this.tableName}
|
|
14169
|
+
WHERE vector MATCH ?
|
|
14170
|
+
AND k = ?
|
|
14171
|
+
ORDER BY distance
|
|
14172
|
+
`);
|
|
14173
|
+
const rows = stmt.all(vectorBuffer, effectiveLimit);
|
|
14174
|
+
return rows.map((row) => ({
|
|
14144
14175
|
id: row.id,
|
|
14145
|
-
score: 1
|
|
14146
|
-
// Convert distance to similarity
|
|
14176
|
+
score: 1 / (1 + row.distance)
|
|
14147
14177
|
}));
|
|
14148
14178
|
}
|
|
14149
14179
|
async deleteVector(id) {
|
|
14150
|
-
|
|
14151
|
-
|
|
14152
|
-
const sanitizedId = id.replace(/'/g, "''");
|
|
14153
|
-
await this.table.delete(`id = '${sanitizedId}'`);
|
|
14180
|
+
const stmt = this.db.prepare(`DELETE FROM ${this.tableName} WHERE id = ?`);
|
|
14181
|
+
stmt.run(id);
|
|
14154
14182
|
}
|
|
14155
14183
|
async getVectorCount() {
|
|
14156
|
-
|
|
14157
|
-
|
|
14158
|
-
return
|
|
14184
|
+
const stmt = this.db.prepare(`SELECT COUNT(*) as count FROM ${this.tableName}`);
|
|
14185
|
+
const result = stmt.get();
|
|
14186
|
+
return result.count;
|
|
14159
14187
|
}
|
|
14160
14188
|
async getVectorsByIds(ids) {
|
|
14161
14189
|
const result = /* @__PURE__ */ new Map();
|
|
14162
|
-
if (
|
|
14190
|
+
if (ids.length === 0)
|
|
14163
14191
|
return result;
|
|
14164
14192
|
const BATCH_SIZE = 100;
|
|
14165
|
-
|
|
14166
|
-
|
|
14167
|
-
|
|
14168
|
-
|
|
14169
|
-
|
|
14170
|
-
|
|
14171
|
-
|
|
14172
|
-
|
|
14173
|
-
|
|
14193
|
+
for (let i = 0; i < ids.length; i += BATCH_SIZE) {
|
|
14194
|
+
const batch = ids.slice(i, i + BATCH_SIZE);
|
|
14195
|
+
const placeholders = batch.map(() => "?").join(",");
|
|
14196
|
+
const stmt = this.db.prepare(`
|
|
14197
|
+
SELECT id, vector FROM ${this.tableName}
|
|
14198
|
+
WHERE id IN (${placeholders})
|
|
14199
|
+
`);
|
|
14200
|
+
const rows = stmt.all(...batch);
|
|
14201
|
+
for (const row of rows) {
|
|
14202
|
+
const vector = Array.from(new Float32Array(row.vector));
|
|
14203
|
+
result.set(row.id, vector);
|
|
14174
14204
|
}
|
|
14175
|
-
} catch {
|
|
14176
14205
|
}
|
|
14177
14206
|
return result;
|
|
14178
14207
|
}
|
|
14179
14208
|
async close() {
|
|
14180
|
-
}
|
|
14181
|
-
/**
|
|
14182
|
-
* Optimize the LanceDB table to reduce storage.
|
|
14183
|
-
* This compacts files, prunes old versions, and optimizes indices.
|
|
14184
|
-
* Should be called periodically (e.g., after many inserts or on cleanup command).
|
|
14185
|
-
*
|
|
14186
|
-
* @param cleanupOlderThan - Date before which old versions should be pruned (default: now)
|
|
14187
|
-
*/
|
|
14188
|
-
async optimize(cleanupOlderThan) {
|
|
14189
|
-
if (!this.table)
|
|
14190
|
-
return null;
|
|
14191
14209
|
try {
|
|
14192
|
-
|
|
14193
|
-
|
|
14194
|
-
return {
|
|
14195
|
-
compacted: stats?.compaction?.filesRemoved ?? 0,
|
|
14196
|
-
pruned: stats?.prune?.versionsRemoved ?? 0
|
|
14197
|
-
};
|
|
14198
|
-
} catch (error2) {
|
|
14199
|
-
console.error("[memextend] LanceDB optimize failed:", error2);
|
|
14200
|
-
return null;
|
|
14210
|
+
this.db.pragma("wal_checkpoint(TRUNCATE)");
|
|
14211
|
+
} catch {
|
|
14201
14212
|
}
|
|
14213
|
+
this.db.close();
|
|
14214
|
+
}
|
|
14215
|
+
// No optimize needed - SQLite handles this automatically!
|
|
14216
|
+
async optimize() {
|
|
14217
|
+
this.db.exec("VACUUM");
|
|
14218
|
+
return { compacted: 0, pruned: 0 };
|
|
14202
14219
|
}
|
|
14203
14220
|
};
|
|
14204
14221
|
|
|
@@ -14334,12 +14351,12 @@ async function createEmbedFunction(modelsDir) {
|
|
|
14334
14351
|
// ../../core/dist/memory/retrieve.js
|
|
14335
14352
|
var MemoryRetriever = class {
|
|
14336
14353
|
sqlite;
|
|
14337
|
-
|
|
14354
|
+
vectorStore;
|
|
14338
14355
|
embed;
|
|
14339
14356
|
options;
|
|
14340
|
-
constructor(sqlite2,
|
|
14357
|
+
constructor(sqlite2, vectorStore2, embed, options = {}) {
|
|
14341
14358
|
this.sqlite = sqlite2;
|
|
14342
|
-
this.
|
|
14359
|
+
this.vectorStore = vectorStore2;
|
|
14343
14360
|
this.embed = embed;
|
|
14344
14361
|
this.options = {
|
|
14345
14362
|
defaultLimit: options.defaultLimit ?? 0,
|
|
@@ -14357,12 +14374,12 @@ var MemoryRetriever = class {
|
|
|
14357
14374
|
return this.sqlite.searchFTS(query, limit);
|
|
14358
14375
|
}
|
|
14359
14376
|
/**
|
|
14360
|
-
* Vector similarity search
|
|
14377
|
+
* Vector similarity search
|
|
14361
14378
|
*/
|
|
14362
14379
|
async vectorSearch(query, options = {}) {
|
|
14363
14380
|
const limit = options.limit ?? this.options.defaultLimit;
|
|
14364
14381
|
const queryVector = await this.embed(query);
|
|
14365
|
-
const vectorResults = await this.
|
|
14382
|
+
const vectorResults = await this.vectorStore.search(queryVector, limit * 2);
|
|
14366
14383
|
const results = [];
|
|
14367
14384
|
for (const vr of vectorResults) {
|
|
14368
14385
|
const memory = this.sqlite.getMemory(vr.id);
|
|
@@ -14447,25 +14464,25 @@ var DB_PATH = (0, import_path2.join)(MEMEXTEND_DIR, "memextend.db");
|
|
|
14447
14464
|
var VECTORS_PATH = (0, import_path2.join)(MEMEXTEND_DIR, "vectors");
|
|
14448
14465
|
var MODELS_PATH = (0, import_path2.join)(MEMEXTEND_DIR, "models");
|
|
14449
14466
|
var sqlite = null;
|
|
14450
|
-
var
|
|
14467
|
+
var vectorStore = null;
|
|
14451
14468
|
var retriever = null;
|
|
14452
14469
|
var embedder = null;
|
|
14453
14470
|
async function getStorage() {
|
|
14454
|
-
if (!sqlite || !
|
|
14471
|
+
if (!sqlite || !vectorStore || !retriever || !embedder) {
|
|
14455
14472
|
if (!(0, import_fs2.existsSync)(DB_PATH)) {
|
|
14456
14473
|
throw new Error("memextend not initialized. Run `memextend init` first.");
|
|
14457
14474
|
}
|
|
14458
14475
|
sqlite = new SQLiteStorage(DB_PATH);
|
|
14459
|
-
|
|
14476
|
+
vectorStore = await SQLiteVecStorage.create(VECTORS_PATH);
|
|
14460
14477
|
embedder = await createEmbedFunction(MODELS_PATH);
|
|
14461
|
-
retriever = new MemoryRetriever(sqlite,
|
|
14478
|
+
retriever = new MemoryRetriever(sqlite, vectorStore, embedder.embedQuery);
|
|
14462
14479
|
}
|
|
14463
|
-
return { sqlite,
|
|
14480
|
+
return { sqlite, vectorStore, retriever, embedder };
|
|
14464
14481
|
}
|
|
14465
14482
|
var server = new Server(
|
|
14466
14483
|
{
|
|
14467
14484
|
name: "memextend",
|
|
14468
|
-
version: "0.2
|
|
14485
|
+
version: "0.3.2"
|
|
14469
14486
|
},
|
|
14470
14487
|
{
|
|
14471
14488
|
capabilities: {
|
|
@@ -14595,7 +14612,7 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
14595
14612
|
${formatted}` }] };
|
|
14596
14613
|
}
|
|
14597
14614
|
case "memextend_save": {
|
|
14598
|
-
const { sqlite: sqlite2,
|
|
14615
|
+
const { sqlite: sqlite2, vectorStore: vectorStore2, embedder: embedder2 } = await getStorage();
|
|
14599
14616
|
const content = args?.content;
|
|
14600
14617
|
const projectId = args?.projectId ?? "default";
|
|
14601
14618
|
if (!content || content.length < 10) {
|
|
@@ -14616,7 +14633,7 @@ ${formatted}` }] };
|
|
|
14616
14633
|
metadata: null
|
|
14617
14634
|
});
|
|
14618
14635
|
const vector = await embedder2.embed(content);
|
|
14619
|
-
await
|
|
14636
|
+
await vectorStore2.insertVector(memoryId, vector);
|
|
14620
14637
|
return { content: [{ type: "text", text: `Memory saved with ID: ${memoryId}` }] };
|
|
14621
14638
|
}
|
|
14622
14639
|
case "memextend_save_global": {
|
|
@@ -14639,20 +14656,20 @@ ${formatted}` }] };
|
|
|
14639
14656
|
return { content: [{ type: "text", text: `Global ${type} saved: "${content}"` }] };
|
|
14640
14657
|
}
|
|
14641
14658
|
case "memextend_forget": {
|
|
14642
|
-
const { sqlite: sqlite2,
|
|
14659
|
+
const { sqlite: sqlite2, vectorStore: vectorStore2 } = await getStorage();
|
|
14643
14660
|
const memoryId = args?.memoryId;
|
|
14644
14661
|
const deleted = sqlite2.deleteMemory(memoryId);
|
|
14645
14662
|
if (deleted) {
|
|
14646
|
-
await
|
|
14663
|
+
await vectorStore2.deleteVector(memoryId);
|
|
14647
14664
|
return { content: [{ type: "text", text: `Memory ${memoryId} deleted.` }] };
|
|
14648
14665
|
} else {
|
|
14649
14666
|
return { content: [{ type: "text", text: `Memory ${memoryId} not found.` }] };
|
|
14650
14667
|
}
|
|
14651
14668
|
}
|
|
14652
14669
|
case "memextend_status": {
|
|
14653
|
-
const { sqlite: sqlite2,
|
|
14670
|
+
const { sqlite: sqlite2, vectorStore: vectorStore2, embedder: embedder2 } = await getStorage();
|
|
14654
14671
|
const memoryCount = sqlite2.getMemoryCount();
|
|
14655
|
-
const vectorCount = await
|
|
14672
|
+
const vectorCount = await vectorStore2.getVectorCount();
|
|
14656
14673
|
return {
|
|
14657
14674
|
content: [{
|
|
14658
14675
|
type: "text",
|
package/dist/mcp/server.js
CHANGED
|
@@ -7,31 +7,31 @@ import { randomUUID } from 'crypto';
|
|
|
7
7
|
import { existsSync } from 'fs';
|
|
8
8
|
import { join } from 'path';
|
|
9
9
|
import { homedir } from 'os';
|
|
10
|
-
import { SQLiteStorage,
|
|
10
|
+
import { SQLiteStorage, SQLiteVecStorage, MemoryRetriever, createEmbedFunction } from '@memextend/core';
|
|
11
11
|
const MEMEXTEND_DIR = join(homedir(), '.memextend');
|
|
12
12
|
const DB_PATH = join(MEMEXTEND_DIR, 'memextend.db');
|
|
13
13
|
const VECTORS_PATH = join(MEMEXTEND_DIR, 'vectors');
|
|
14
14
|
const MODELS_PATH = join(MEMEXTEND_DIR, 'models');
|
|
15
15
|
// Lazy-loaded storage instances
|
|
16
16
|
let sqlite = null;
|
|
17
|
-
let
|
|
17
|
+
let vectorStore = null;
|
|
18
18
|
let retriever = null;
|
|
19
19
|
let embedder = null;
|
|
20
20
|
async function getStorage() {
|
|
21
|
-
if (!sqlite || !
|
|
21
|
+
if (!sqlite || !vectorStore || !retriever || !embedder) {
|
|
22
22
|
if (!existsSync(DB_PATH)) {
|
|
23
23
|
throw new Error('memextend not initialized. Run `memextend init` first.');
|
|
24
24
|
}
|
|
25
25
|
sqlite = new SQLiteStorage(DB_PATH);
|
|
26
|
-
|
|
26
|
+
vectorStore = await SQLiteVecStorage.create(VECTORS_PATH);
|
|
27
27
|
embedder = await createEmbedFunction(MODELS_PATH);
|
|
28
|
-
retriever = new MemoryRetriever(sqlite,
|
|
28
|
+
retriever = new MemoryRetriever(sqlite, vectorStore, embedder.embedQuery);
|
|
29
29
|
}
|
|
30
|
-
return { sqlite,
|
|
30
|
+
return { sqlite, vectorStore, retriever, embedder };
|
|
31
31
|
}
|
|
32
32
|
const server = new Server({
|
|
33
33
|
name: 'memextend',
|
|
34
|
-
version:
|
|
34
|
+
version: MEMEXTEND_VERSION,
|
|
35
35
|
}, {
|
|
36
36
|
capabilities: {
|
|
37
37
|
tools: {},
|
|
@@ -158,7 +158,7 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
158
158
|
return { content: [{ type: 'text', text: `Found ${results.length} memories:\n\n${formatted}` }] };
|
|
159
159
|
}
|
|
160
160
|
case 'memextend_save': {
|
|
161
|
-
const { sqlite,
|
|
161
|
+
const { sqlite, vectorStore, embedder } = await getStorage();
|
|
162
162
|
const content = args?.content;
|
|
163
163
|
const projectId = args?.projectId ?? 'default';
|
|
164
164
|
// Validate content
|
|
@@ -180,7 +180,7 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
180
180
|
metadata: null,
|
|
181
181
|
});
|
|
182
182
|
const vector = await embedder.embed(content);
|
|
183
|
-
await
|
|
183
|
+
await vectorStore.insertVector(memoryId, vector);
|
|
184
184
|
return { content: [{ type: 'text', text: `Memory saved with ID: ${memoryId}` }] };
|
|
185
185
|
}
|
|
186
186
|
case 'memextend_save_global': {
|
|
@@ -204,12 +204,12 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
204
204
|
return { content: [{ type: 'text', text: `Global ${type} saved: "${content}"` }] };
|
|
205
205
|
}
|
|
206
206
|
case 'memextend_forget': {
|
|
207
|
-
const { sqlite,
|
|
207
|
+
const { sqlite, vectorStore } = await getStorage();
|
|
208
208
|
const memoryId = args?.memoryId;
|
|
209
209
|
const deleted = sqlite.deleteMemory(memoryId);
|
|
210
210
|
if (deleted) {
|
|
211
211
|
// Also delete the vector embedding
|
|
212
|
-
await
|
|
212
|
+
await vectorStore.deleteVector(memoryId);
|
|
213
213
|
return { content: [{ type: 'text', text: `Memory ${memoryId} deleted.` }] };
|
|
214
214
|
}
|
|
215
215
|
else {
|
|
@@ -217,9 +217,9 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
217
217
|
}
|
|
218
218
|
}
|
|
219
219
|
case 'memextend_status': {
|
|
220
|
-
const { sqlite,
|
|
220
|
+
const { sqlite, vectorStore, embedder } = await getStorage();
|
|
221
221
|
const memoryCount = sqlite.getMemoryCount();
|
|
222
|
-
const vectorCount = await
|
|
222
|
+
const vectorCount = await vectorStore.getVectorCount();
|
|
223
223
|
return {
|
|
224
224
|
content: [{
|
|
225
225
|
type: 'text',
|
package/dist/mcp/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C,8CAA8C;AAE9C,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAE7B,OAAO,EAAE,aAAa,EAAE,
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@memextend/opencode",
|
|
3
|
-
"version": "0.2
|
|
3
|
+
"version": "0.3.2",
|
|
4
4
|
"description": "OpenCode adapter for memextend - MCP server for anomalyco/opencode AI memory",
|
|
5
5
|
"author": "ZodTTD LLC <repo@zodttd.com>",
|
|
6
6
|
"license": "MIT",
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
"setup": "node dist/setup.js"
|
|
29
29
|
},
|
|
30
30
|
"dependencies": {
|
|
31
|
-
"@memextend/core": "^0.2
|
|
31
|
+
"@memextend/core": "^0.3.2",
|
|
32
32
|
"@modelcontextprotocol/sdk": "^1.0.0"
|
|
33
33
|
},
|
|
34
34
|
"devDependencies": {
|
package/scripts/build.js
CHANGED
|
@@ -5,11 +5,16 @@ import { build } from 'esbuild';
|
|
|
5
5
|
import { join, dirname } from 'path';
|
|
6
6
|
import { fileURLToPath } from 'url';
|
|
7
7
|
import { mkdir } from 'fs/promises';
|
|
8
|
+
import { readFileSync } from 'fs';
|
|
8
9
|
|
|
9
10
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
10
11
|
const srcDir = join(__dirname, '..', 'src');
|
|
11
12
|
const distDir = join(__dirname, '..', 'dist');
|
|
12
13
|
|
|
14
|
+
// Read version from root package.json
|
|
15
|
+
const rootPkg = JSON.parse(readFileSync(join(__dirname, '..', '..', '..', '..', 'package.json'), 'utf-8'));
|
|
16
|
+
const version = rootPkg.version;
|
|
17
|
+
|
|
13
18
|
const commonOptions = {
|
|
14
19
|
bundle: true,
|
|
15
20
|
platform: 'node',
|
|
@@ -17,8 +22,11 @@ const commonOptions = {
|
|
|
17
22
|
format: 'cjs',
|
|
18
23
|
// External packages that should not be bundled
|
|
19
24
|
// These are native modules or have complex dependencies
|
|
20
|
-
external: ['better-sqlite3', 'node-llama-cpp', '
|
|
25
|
+
external: ['better-sqlite3', 'node-llama-cpp', 'sqlite-vec'],
|
|
21
26
|
logLevel: 'warning',
|
|
27
|
+
define: {
|
|
28
|
+
'MEMEXTEND_VERSION': JSON.stringify(version),
|
|
29
|
+
},
|
|
22
30
|
};
|
|
23
31
|
|
|
24
32
|
async function buildMCP() {
|