@memtensor/memos-local-openclaw-plugin 1.0.2 → 1.0.4-alpha.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 (41) hide show
  1. package/dist/embedding/index.d.ts.map +1 -1
  2. package/dist/embedding/index.js +4 -3
  3. package/dist/embedding/index.js.map +1 -1
  4. package/dist/index.d.ts.map +1 -1
  5. package/dist/index.js +2 -0
  6. package/dist/index.js.map +1 -1
  7. package/dist/ingest/providers/index.d.ts.map +1 -1
  8. package/dist/ingest/providers/index.js +39 -2
  9. package/dist/ingest/providers/index.js.map +1 -1
  10. package/dist/recall/engine.js +1 -1
  11. package/dist/recall/engine.js.map +1 -1
  12. package/dist/storage/ensure-binding.d.ts +12 -0
  13. package/dist/storage/ensure-binding.d.ts.map +1 -0
  14. package/dist/storage/ensure-binding.js +72 -0
  15. package/dist/storage/ensure-binding.js.map +1 -0
  16. package/dist/storage/sqlite.js +7 -8
  17. package/dist/storage/sqlite.js.map +1 -1
  18. package/dist/types.d.ts +1 -1
  19. package/dist/types.d.ts.map +1 -1
  20. package/dist/types.js.map +1 -1
  21. package/dist/update-check.d.ts.map +1 -1
  22. package/dist/update-check.js +0 -1
  23. package/dist/update-check.js.map +1 -1
  24. package/dist/viewer/html.d.ts.map +1 -1
  25. package/dist/viewer/html.js +73 -37
  26. package/dist/viewer/html.js.map +1 -1
  27. package/dist/viewer/server.d.ts.map +1 -1
  28. package/dist/viewer/server.js +116 -18
  29. package/dist/viewer/server.js.map +1 -1
  30. package/index.ts +20 -9
  31. package/package.json +5 -3
  32. package/src/embedding/index.ts +4 -2
  33. package/src/index.ts +3 -0
  34. package/src/ingest/providers/index.ts +39 -2
  35. package/src/recall/engine.ts +1 -1
  36. package/src/storage/ensure-binding.ts +40 -0
  37. package/src/storage/sqlite.ts +8 -7
  38. package/src/types.ts +7 -1
  39. package/src/update-check.ts +0 -1
  40. package/src/viewer/html.ts +73 -37
  41. package/src/viewer/server.ts +102 -16
@@ -38,6 +38,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
38
38
  Object.defineProperty(exports, "__esModule", { value: true });
39
39
  exports.ViewerServer = void 0;
40
40
  const node_http_1 = __importDefault(require("node:http"));
41
+ const node_os_1 = __importDefault(require("node:os"));
41
42
  const node_crypto_1 = __importDefault(require("node:crypto"));
42
43
  const node_child_process_1 = require("node:child_process");
43
44
  const node_fs_1 = __importDefault(require("node:fs"));
@@ -1260,36 +1261,133 @@ class ViewerServer {
1260
1261
  req.on("data", (chunk) => { body += chunk.toString(); });
1261
1262
  req.on("end", () => {
1262
1263
  try {
1263
- const { packageSpec } = JSON.parse(body);
1264
- if (!packageSpec || typeof packageSpec !== "string") {
1264
+ const { packageSpec: rawSpec } = JSON.parse(body);
1265
+ if (!rawSpec || typeof rawSpec !== "string") {
1265
1266
  res.writeHead(400, { "Content-Type": "application/json" });
1266
1267
  res.end(JSON.stringify({ ok: false, error: "Missing packageSpec" }));
1267
1268
  return;
1268
1269
  }
1270
+ const packageSpec = rawSpec.trim().replace(/^(?:npx\s+)?openclaw\s+plugins\s+install\s+/i, "");
1269
1271
  const allowed = /^@[\w-]+\/[\w.-]+(@[\w.-]+)?$/;
1272
+ this.log.info(`update-install: received packageSpec="${packageSpec}" (len=${packageSpec.length})`);
1270
1273
  if (!allowed.test(packageSpec)) {
1274
+ this.log.warn(`update-install: rejected packageSpec="${packageSpec}" — does not match ${allowed}`);
1271
1275
  res.writeHead(400, { "Content-Type": "application/json" });
1272
- res.end(JSON.stringify({ ok: false, error: "Invalid package spec" }));
1276
+ res.end(JSON.stringify({ ok: false, error: `Invalid package spec: "${packageSpec}"` }));
1273
1277
  return;
1274
1278
  }
1275
- this.log.info(`update-install: installing ${packageSpec}...`);
1276
- (0, node_child_process_1.exec)(`npx openclaw plugins install ${packageSpec}`, { timeout: 120_000 }, (err, stdout, stderr) => {
1277
- if (err) {
1278
- this.log.warn(`update-install failed: ${err.message}\n${stderr}`);
1279
- this.jsonResponse(res, { ok: false, error: stderr || err.message });
1279
+ const pkgPath = this.findPluginPackageJson();
1280
+ const pluginName = pkgPath
1281
+ ? (() => { try {
1282
+ return JSON.parse(node_fs_1.default.readFileSync(pkgPath, "utf-8")).name;
1283
+ }
1284
+ catch {
1285
+ return null;
1286
+ } })()
1287
+ : null;
1288
+ const shortName = pluginName?.replace(/^@[\w-]+\//, "") ?? "memos-local-openclaw-plugin";
1289
+ const extDir = node_path_1.default.join(node_os_1.default.homedir(), ".openclaw", "extensions", shortName);
1290
+ const tmpDir = node_path_1.default.join(node_os_1.default.tmpdir(), `openclaw-update-${Date.now()}`);
1291
+ // Download via npm pack, extract, and replace extension dir.
1292
+ // Does NOT touch openclaw.json → no config watcher SIGUSR1.
1293
+ this.log.info(`update-install: downloading ${packageSpec} via npm pack...`);
1294
+ node_fs_1.default.mkdirSync(tmpDir, { recursive: true });
1295
+ (0, node_child_process_1.exec)(`npm pack ${packageSpec} --pack-destination ${tmpDir}`, { timeout: 60_000 }, (packErr, packOut) => {
1296
+ if (packErr) {
1297
+ this.log.warn(`update-install: npm pack failed: ${packErr.message}`);
1298
+ this.jsonResponse(res, { ok: false, error: `Download failed: ${packErr.message}` });
1299
+ try {
1300
+ node_fs_1.default.rmSync(tmpDir, { recursive: true, force: true });
1301
+ }
1302
+ catch { }
1280
1303
  return;
1281
1304
  }
1282
- this.log.info(`update-install success: ${stdout}`);
1283
- this.jsonResponse(res, { ok: true, output: stdout });
1284
- this.log.info(`update-install: restarting gateway...`);
1285
- setTimeout(() => {
1286
- (0, node_child_process_1.exec)("npx openclaw gateway restart", { timeout: 30_000 }, (restartErr) => {
1287
- if (restartErr)
1288
- this.log.warn(`gateway restart failed: ${restartErr.message}`);
1289
- else
1290
- this.log.info("gateway restart initiated");
1305
+ const tgzFile = packOut.trim().split("\n").pop();
1306
+ const tgzPath = node_path_1.default.join(tmpDir, tgzFile);
1307
+ this.log.info(`update-install: downloaded ${tgzFile}, extracting...`);
1308
+ const extractDir = node_path_1.default.join(tmpDir, "extract");
1309
+ node_fs_1.default.mkdirSync(extractDir, { recursive: true });
1310
+ (0, node_child_process_1.exec)(`tar -xzf ${tgzPath} -C ${extractDir}`, { timeout: 30_000 }, (tarErr) => {
1311
+ if (tarErr) {
1312
+ this.log.warn(`update-install: tar extract failed: ${tarErr.message}`);
1313
+ this.jsonResponse(res, { ok: false, error: `Extract failed: ${tarErr.message}` });
1314
+ try {
1315
+ node_fs_1.default.rmSync(tmpDir, { recursive: true, force: true });
1316
+ }
1317
+ catch { }
1318
+ return;
1319
+ }
1320
+ // npm pack extracts to a "package" subdirectory
1321
+ const srcDir = node_path_1.default.join(extractDir, "package");
1322
+ if (!node_fs_1.default.existsSync(srcDir)) {
1323
+ this.jsonResponse(res, { ok: false, error: "Extracted package has no 'package' dir" });
1324
+ try {
1325
+ node_fs_1.default.rmSync(tmpDir, { recursive: true, force: true });
1326
+ }
1327
+ catch { }
1328
+ return;
1329
+ }
1330
+ // Replace extension directory
1331
+ this.log.info(`update-install: replacing ${extDir}...`);
1332
+ try {
1333
+ node_fs_1.default.rmSync(extDir, { recursive: true, force: true });
1334
+ }
1335
+ catch { }
1336
+ node_fs_1.default.mkdirSync(node_path_1.default.dirname(extDir), { recursive: true });
1337
+ node_fs_1.default.renameSync(srcDir, extDir);
1338
+ // Install dependencies
1339
+ this.log.info(`update-install: installing dependencies...`);
1340
+ (0, node_child_process_1.exec)(`cd ${extDir} && npm install --omit=dev --ignore-scripts`, { timeout: 120_000 }, (npmErr, npmOut, npmStderr) => {
1341
+ if (npmErr) {
1342
+ try {
1343
+ node_fs_1.default.rmSync(tmpDir, { recursive: true, force: true });
1344
+ }
1345
+ catch { }
1346
+ this.log.warn(`update-install: npm install failed: ${npmErr.message}`);
1347
+ this.jsonResponse(res, { ok: false, error: `Dependency install failed: ${npmStderr || npmErr.message}` });
1348
+ return;
1349
+ }
1350
+ // Rebuild native modules (do not swallow errors)
1351
+ (0, node_child_process_1.exec)(`cd ${extDir} && npm rebuild better-sqlite3`, { timeout: 60_000 }, (rebuildErr, rebuildOut, rebuildStderr) => {
1352
+ if (rebuildErr) {
1353
+ this.log.warn(`update-install: better-sqlite3 rebuild failed: ${rebuildErr.message}`);
1354
+ const stderr = String(rebuildStderr || "").trim();
1355
+ if (stderr)
1356
+ this.log.warn(`update-install: rebuild stderr: ${stderr.slice(0, 500)}`);
1357
+ // Continue so postinstall.cjs can run (it will try rebuild again and show user guidance)
1358
+ }
1359
+ // Run postinstall.cjs: legacy cleanup, skill install, version marker, and optional sqlite re-check
1360
+ this.log.info(`update-install: running postinstall...`);
1361
+ (0, node_child_process_1.exec)(`cd ${extDir} && node scripts/postinstall.cjs`, { timeout: 180_000 }, (postErr, postOut, postStderr) => {
1362
+ try {
1363
+ node_fs_1.default.rmSync(tmpDir, { recursive: true, force: true });
1364
+ }
1365
+ catch { }
1366
+ if (postErr) {
1367
+ this.log.warn(`update-install: postinstall failed: ${postErr.message}`);
1368
+ const postStderrStr = String(postStderr || "").trim();
1369
+ if (postStderrStr)
1370
+ this.log.warn(`update-install: postinstall stderr: ${postStderrStr.slice(0, 500)}`);
1371
+ // Still report success; plugin is updated, user can run postinstall manually if needed
1372
+ }
1373
+ // Read new version
1374
+ let newVersion = "unknown";
1375
+ try {
1376
+ const newPkg = JSON.parse(node_fs_1.default.readFileSync(node_path_1.default.join(extDir, "package.json"), "utf-8"));
1377
+ newVersion = newPkg.version ?? newVersion;
1378
+ }
1379
+ catch { }
1380
+ this.log.info(`update-install: success! Updated to ${newVersion}`);
1381
+ this.jsonResponse(res, { ok: true, version: newVersion });
1382
+ // Trigger Gateway restart after response is sent
1383
+ setTimeout(() => {
1384
+ this.log.info(`update-install: triggering gateway restart...`);
1385
+ process.kill(process.pid, "SIGUSR1");
1386
+ }, 500);
1387
+ });
1388
+ });
1291
1389
  });
1292
- }, 1000);
1390
+ });
1293
1391
  });
1294
1392
  }
1295
1393
  catch (e) {