@alex900530/claude-persistent-memory 1.1.0 → 1.1.1

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 (2) hide show
  1. package/bin/setup.js +30 -13
  2. package/package.json +1 -1
package/bin/setup.js CHANGED
@@ -195,29 +195,46 @@ async function setupModel() {
195
195
  const cacheDir = path.join(os.homedir(), '.cache', 'huggingface', 'transformers-js');
196
196
  const modelDir = path.join(cacheDir, 'Xenova', 'bge-m3', 'onnx');
197
197
 
198
- // Check if model is already cached
199
- if (fs.existsSync(path.join(modelDir, 'model.onnx_data'))) {
200
- const stat = fs.statSync(path.join(modelDir, 'model.onnx_data'));
201
- if (stat.size > 300 * 1024 * 1024) { // > 300MB = likely complete
202
- ok(` Model already cached (${(stat.size / 1024 / 1024 / 1024).toFixed(1)}GB).`);
198
+ const modelFile = path.join(modelDir, 'model.onnx_data');
199
+ const modelBaseDir = path.join(cacheDir, 'Xenova', 'bge-m3');
200
+
201
+ // Helper: import transformers.js (handles both ESM and CJS re-export)
202
+ async function loadTransformers() {
203
+ const transformersPath = require.resolve('@huggingface/transformers', { paths: [PKG_DIR] });
204
+ const mod = await import(transformersPath);
205
+ const pipeline = mod.pipeline || mod.default?.pipeline;
206
+ const env = mod.env || mod.default?.env;
207
+ if (env) env.cacheDir = cacheDir;
208
+ return { pipeline, env };
209
+ }
210
+
211
+ // Check if model is already cached — verify by running inference
212
+ if (fs.existsSync(modelFile)) {
213
+ try {
214
+ const { pipeline } = await loadTransformers();
215
+ const extractor = await pipeline('feature-extraction', 'Xenova/bge-m3', { device: 'cpu' });
216
+ await extractor('test', { pooling: 'cls', normalize: true });
217
+ const stat = fs.statSync(modelFile);
218
+ ok(` Model already cached and verified (${(stat.size / 1024 / 1024 / 1024).toFixed(1)}GB).`);
203
219
  return;
220
+ } catch (e) {
221
+ warn(` Cached model is corrupt or incomplete, cleaning up ...`);
222
+ try { fs.rmSync(modelBaseDir, { recursive: true, force: true }); } catch {}
204
223
  }
205
- warn(' Incomplete model cache detected, re-downloading ...');
206
224
  }
207
225
 
208
226
  log(' Downloading model (~2GB, this may take a few minutes) ...');
209
227
  try {
210
- // Resolve from package's own dependencies
211
- const transformersPath = require.resolve('@huggingface/transformers', { paths: [PKG_DIR] });
212
- const { pipeline, env } = await import(transformersPath);
213
- env.cacheDir = cacheDir;
228
+ const { pipeline } = await loadTransformers();
214
229
  const extractor = await pipeline('feature-extraction', 'Xenova/bge-m3', { device: 'cpu' });
215
- // Quick test to verify model works
216
230
  await extractor('test', { pooling: 'cls', normalize: true });
217
231
  ok(' Model downloaded and verified.');
218
232
  } catch (e) {
219
- warn(` Model download failed: ${e.message}`);
220
- warn(' The embedding server will retry on first start.');
233
+ // Clean up partial download
234
+ try { fs.rmSync(modelBaseDir, { recursive: true, force: true }); } catch {}
235
+ console.error(`${PREFIX} \x1b[31mModel download failed: ${e.message}\x1b[0m`);
236
+ console.error(`${PREFIX} Please retry: npm install @alex900530/claude-persistent-memory`);
237
+ process.exit(1);
221
238
  }
222
239
  }
223
240
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@alex900530/claude-persistent-memory",
3
- "version": "1.1.0",
3
+ "version": "1.1.1",
4
4
  "description": "Persistent memory system for Claude Code — hybrid BM25 + vector search, LLM-driven structuring, automatic clustering",
5
5
  "main": "lib/memory-db.js",
6
6
  "bin": {