@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.
- package/dist/embedding/index.d.ts.map +1 -1
- package/dist/embedding/index.js +4 -3
- package/dist/embedding/index.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/ingest/providers/index.d.ts.map +1 -1
- package/dist/ingest/providers/index.js +39 -2
- package/dist/ingest/providers/index.js.map +1 -1
- package/dist/recall/engine.js +1 -1
- package/dist/recall/engine.js.map +1 -1
- package/dist/storage/ensure-binding.d.ts +12 -0
- package/dist/storage/ensure-binding.d.ts.map +1 -0
- package/dist/storage/ensure-binding.js +72 -0
- package/dist/storage/ensure-binding.js.map +1 -0
- package/dist/storage/sqlite.js +7 -8
- package/dist/storage/sqlite.js.map +1 -1
- package/dist/types.d.ts +1 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/update-check.d.ts.map +1 -1
- package/dist/update-check.js +0 -1
- package/dist/update-check.js.map +1 -1
- package/dist/viewer/html.d.ts.map +1 -1
- package/dist/viewer/html.js +73 -37
- package/dist/viewer/html.js.map +1 -1
- package/dist/viewer/server.d.ts.map +1 -1
- package/dist/viewer/server.js +116 -18
- package/dist/viewer/server.js.map +1 -1
- package/index.ts +20 -9
- package/package.json +5 -3
- package/src/embedding/index.ts +4 -2
- package/src/index.ts +3 -0
- package/src/ingest/providers/index.ts +39 -2
- package/src/recall/engine.ts +1 -1
- package/src/storage/ensure-binding.ts +40 -0
- package/src/storage/sqlite.ts +8 -7
- package/src/types.ts +7 -1
- package/src/update-check.ts +0 -1
- package/src/viewer/html.ts +73 -37
- package/src/viewer/server.ts +102 -16
package/dist/viewer/server.js
CHANGED
|
@@ -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 (!
|
|
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:
|
|
1276
|
+
res.end(JSON.stringify({ ok: false, error: `Invalid package spec: "${packageSpec}"` }));
|
|
1273
1277
|
return;
|
|
1274
1278
|
}
|
|
1275
|
-
this.
|
|
1276
|
-
|
|
1277
|
-
|
|
1278
|
-
|
|
1279
|
-
|
|
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
|
-
|
|
1283
|
-
|
|
1284
|
-
this.log.info(`update-install:
|
|
1285
|
-
|
|
1286
|
-
|
|
1287
|
-
|
|
1288
|
-
|
|
1289
|
-
|
|
1290
|
-
|
|
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
|
-
}
|
|
1390
|
+
});
|
|
1293
1391
|
});
|
|
1294
1392
|
}
|
|
1295
1393
|
catch (e) {
|