@memtensor/memos-local-openclaw-plugin 1.0.6-beta.9 → 1.0.7
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/openclaw.plugin.json +1 -1
- package/package.json +3 -5
- package/prebuilds/darwin-arm64/better_sqlite3.node +0 -0
- package/prebuilds/darwin-x64/better_sqlite3.node +0 -0
- package/prebuilds/linux-x64/better_sqlite3.node +0 -0
- package/prebuilds/win32-x64/better_sqlite3.node +0 -0
- package/scripts/postinstall.cjs +44 -44
- package/skill/memos-memory-guide/SKILL.md +20 -0
- package/src/update-check.ts +2 -7
- package/src/viewer/html.ts +4 -4
- package/src/viewer/server.ts +12 -2
- package/telemetry.credentials.json +5 -0
- package/dist/capture/index.d.ts +0 -26
- package/dist/capture/index.d.ts.map +0 -1
- package/dist/capture/index.js +0 -283
- package/dist/capture/index.js.map +0 -1
- package/dist/client/connector.d.ts +0 -34
- package/dist/client/connector.d.ts.map +0 -1
- package/dist/client/connector.js +0 -381
- package/dist/client/connector.js.map +0 -1
- package/dist/client/hub.d.ts +0 -61
- package/dist/client/hub.d.ts.map +0 -1
- package/dist/client/hub.js +0 -174
- package/dist/client/hub.js.map +0 -1
- package/dist/client/skill-sync.d.ts +0 -36
- package/dist/client/skill-sync.d.ts.map +0 -1
- package/dist/client/skill-sync.js +0 -226
- package/dist/client/skill-sync.js.map +0 -1
- package/dist/config.d.ts +0 -5
- package/dist/config.d.ts.map +0 -1
- package/dist/config.js +0 -171
- package/dist/config.js.map +0 -1
- package/dist/embedding/index.d.ts +0 -14
- package/dist/embedding/index.d.ts.map +0 -1
- package/dist/embedding/index.js +0 -105
- package/dist/embedding/index.js.map +0 -1
- package/dist/embedding/local.d.ts +0 -3
- package/dist/embedding/local.d.ts.map +0 -1
- package/dist/embedding/local.js +0 -66
- package/dist/embedding/local.js.map +0 -1
- package/dist/embedding/providers/cohere.d.ts +0 -4
- package/dist/embedding/providers/cohere.d.ts.map +0 -1
- package/dist/embedding/providers/cohere.js +0 -57
- package/dist/embedding/providers/cohere.js.map +0 -1
- package/dist/embedding/providers/gemini.d.ts +0 -3
- package/dist/embedding/providers/gemini.d.ts.map +0 -1
- package/dist/embedding/providers/gemini.js +0 -31
- package/dist/embedding/providers/gemini.js.map +0 -1
- package/dist/embedding/providers/mistral.d.ts +0 -3
- package/dist/embedding/providers/mistral.d.ts.map +0 -1
- package/dist/embedding/providers/mistral.js +0 -25
- package/dist/embedding/providers/mistral.js.map +0 -1
- package/dist/embedding/providers/openai.d.ts +0 -3
- package/dist/embedding/providers/openai.d.ts.map +0 -1
- package/dist/embedding/providers/openai.js +0 -35
- package/dist/embedding/providers/openai.js.map +0 -1
- package/dist/embedding/providers/voyage.d.ts +0 -3
- package/dist/embedding/providers/voyage.d.ts.map +0 -1
- package/dist/embedding/providers/voyage.js +0 -25
- package/dist/embedding/providers/voyage.js.map +0 -1
- package/dist/hub/auth.d.ts +0 -19
- package/dist/hub/auth.d.ts.map +0 -1
- package/dist/hub/auth.js +0 -70
- package/dist/hub/auth.js.map +0 -1
- package/dist/hub/server.d.ts +0 -52
- package/dist/hub/server.d.ts.map +0 -1
- package/dist/hub/server.js +0 -1197
- package/dist/hub/server.js.map +0 -1
- package/dist/hub/user-manager.d.ts +0 -40
- package/dist/hub/user-manager.d.ts.map +0 -1
- package/dist/hub/user-manager.js +0 -153
- package/dist/hub/user-manager.js.map +0 -1
- package/dist/index.d.ts +0 -46
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -82
- package/dist/index.js.map +0 -1
- package/dist/ingest/chunker.d.ts +0 -15
- package/dist/ingest/chunker.d.ts.map +0 -1
- package/dist/ingest/chunker.js +0 -192
- package/dist/ingest/chunker.js.map +0 -1
- package/dist/ingest/dedup.d.ts +0 -19
- package/dist/ingest/dedup.d.ts.map +0 -1
- package/dist/ingest/dedup.js +0 -50
- package/dist/ingest/dedup.js.map +0 -1
- package/dist/ingest/providers/anthropic.d.ts +0 -21
- package/dist/ingest/providers/anthropic.d.ts.map +0 -1
- package/dist/ingest/providers/anthropic.js +0 -314
- package/dist/ingest/providers/anthropic.js.map +0 -1
- package/dist/ingest/providers/bedrock.d.ts +0 -21
- package/dist/ingest/providers/bedrock.d.ts.map +0 -1
- package/dist/ingest/providers/bedrock.js +0 -313
- package/dist/ingest/providers/bedrock.js.map +0 -1
- package/dist/ingest/providers/gemini.d.ts +0 -21
- package/dist/ingest/providers/gemini.d.ts.map +0 -1
- package/dist/ingest/providers/gemini.js +0 -298
- package/dist/ingest/providers/gemini.js.map +0 -1
- package/dist/ingest/providers/index.d.ts +0 -68
- package/dist/ingest/providers/index.d.ts.map +0 -1
- package/dist/ingest/providers/index.js +0 -611
- package/dist/ingest/providers/index.js.map +0 -1
- package/dist/ingest/providers/openai.d.ts +0 -30
- package/dist/ingest/providers/openai.d.ts.map +0 -1
- package/dist/ingest/providers/openai.js +0 -387
- package/dist/ingest/providers/openai.js.map +0 -1
- package/dist/ingest/task-processor.d.ts +0 -91
- package/dist/ingest/task-processor.d.ts.map +0 -1
- package/dist/ingest/task-processor.js +0 -478
- package/dist/ingest/task-processor.js.map +0 -1
- package/dist/ingest/worker.d.ts +0 -23
- package/dist/ingest/worker.d.ts.map +0 -1
- package/dist/ingest/worker.js +0 -255
- package/dist/ingest/worker.js.map +0 -1
- package/dist/openclaw-api.d.ts +0 -53
- package/dist/openclaw-api.d.ts.map +0 -1
- package/dist/openclaw-api.js +0 -189
- package/dist/openclaw-api.js.map +0 -1
- package/dist/recall/engine.d.ts +0 -28
- package/dist/recall/engine.d.ts.map +0 -1
- package/dist/recall/engine.js +0 -343
- package/dist/recall/engine.js.map +0 -1
- package/dist/recall/mmr.d.ts +0 -17
- package/dist/recall/mmr.d.ts.map +0 -1
- package/dist/recall/mmr.js +0 -53
- package/dist/recall/mmr.js.map +0 -1
- package/dist/recall/recency.d.ts +0 -20
- package/dist/recall/recency.d.ts.map +0 -1
- package/dist/recall/recency.js +0 -26
- package/dist/recall/recency.js.map +0 -1
- package/dist/recall/rrf.d.ts +0 -16
- package/dist/recall/rrf.d.ts.map +0 -1
- package/dist/recall/rrf.js +0 -15
- package/dist/recall/rrf.js.map +0 -1
- package/dist/shared/llm-call.d.ts +0 -30
- package/dist/shared/llm-call.d.ts.map +0 -1
- package/dist/shared/llm-call.js +0 -253
- package/dist/shared/llm-call.js.map +0 -1
- package/dist/sharing/types.contract.d.ts +0 -2
- package/dist/sharing/types.contract.d.ts.map +0 -1
- package/dist/sharing/types.contract.js +0 -3
- package/dist/sharing/types.contract.js.map +0 -1
- package/dist/sharing/types.d.ts +0 -80
- package/dist/sharing/types.d.ts.map +0 -1
- package/dist/sharing/types.js +0 -3
- package/dist/sharing/types.js.map +0 -1
- package/dist/skill/bundled-memory-guide.d.ts +0 -2
- package/dist/skill/bundled-memory-guide.d.ts.map +0 -1
- package/dist/skill/bundled-memory-guide.js +0 -45
- package/dist/skill/bundled-memory-guide.js.map +0 -1
- package/dist/skill/evaluator.d.ts +0 -28
- package/dist/skill/evaluator.d.ts.map +0 -1
- package/dist/skill/evaluator.js +0 -169
- package/dist/skill/evaluator.js.map +0 -1
- package/dist/skill/evolver.d.ts +0 -48
- package/dist/skill/evolver.d.ts.map +0 -1
- package/dist/skill/evolver.js +0 -406
- package/dist/skill/evolver.js.map +0 -1
- package/dist/skill/generator.d.ts +0 -26
- package/dist/skill/generator.d.ts.map +0 -1
- package/dist/skill/generator.js +0 -521
- package/dist/skill/generator.js.map +0 -1
- package/dist/skill/installer.d.ts +0 -42
- package/dist/skill/installer.d.ts.map +0 -1
- package/dist/skill/installer.js +0 -165
- package/dist/skill/installer.js.map +0 -1
- package/dist/skill/upgrader.d.ts +0 -19
- package/dist/skill/upgrader.d.ts.map +0 -1
- package/dist/skill/upgrader.js +0 -366
- package/dist/skill/upgrader.js.map +0 -1
- package/dist/skill/validator.d.ts +0 -30
- package/dist/skill/validator.d.ts.map +0 -1
- package/dist/skill/validator.js +0 -272
- package/dist/skill/validator.js.map +0 -1
- package/dist/storage/ensure-binding.d.ts +0 -12
- package/dist/storage/ensure-binding.d.ts.map +0 -1
- package/dist/storage/ensure-binding.js +0 -53
- package/dist/storage/ensure-binding.js.map +0 -1
- package/dist/storage/sqlite.d.ts +0 -649
- package/dist/storage/sqlite.d.ts.map +0 -1
- package/dist/storage/sqlite.js +0 -2657
- package/dist/storage/sqlite.js.map +0 -1
- package/dist/storage/vector.d.ts +0 -12
- package/dist/storage/vector.d.ts.map +0 -1
- package/dist/storage/vector.js +0 -34
- package/dist/storage/vector.js.map +0 -1
- package/dist/telemetry.d.ts +0 -47
- package/dist/telemetry.d.ts.map +0 -1
- package/dist/telemetry.js +0 -312
- package/dist/telemetry.js.map +0 -1
- package/dist/tools/index.d.ts +0 -5
- package/dist/tools/index.d.ts.map +0 -1
- package/dist/tools/index.js +0 -12
- package/dist/tools/index.js.map +0 -1
- package/dist/tools/memory-get.d.ts +0 -4
- package/dist/tools/memory-get.d.ts.map +0 -1
- package/dist/tools/memory-get.js +0 -64
- package/dist/tools/memory-get.js.map +0 -1
- package/dist/tools/memory-search.d.ts +0 -7
- package/dist/tools/memory-search.d.ts.map +0 -1
- package/dist/tools/memory-search.js +0 -84
- package/dist/tools/memory-search.js.map +0 -1
- package/dist/tools/memory-timeline.d.ts +0 -4
- package/dist/tools/memory-timeline.d.ts.map +0 -1
- package/dist/tools/memory-timeline.js +0 -73
- package/dist/tools/memory-timeline.js.map +0 -1
- package/dist/tools/network-memory-detail.d.ts +0 -4
- package/dist/tools/network-memory-detail.d.ts.map +0 -1
- package/dist/tools/network-memory-detail.js +0 -34
- package/dist/tools/network-memory-detail.js.map +0 -1
- package/dist/types.d.ts +0 -330
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -38
- package/dist/types.js.map +0 -1
- package/dist/update-check.d.ts +0 -21
- package/dist/update-check.d.ts.map +0 -1
- package/dist/update-check.js +0 -110
- package/dist/update-check.js.map +0 -1
- package/dist/viewer/html.d.ts +0 -2
- package/dist/viewer/html.d.ts.map +0 -1
- package/dist/viewer/html.js +0 -9168
- package/dist/viewer/html.js.map +0 -1
- package/dist/viewer/server.d.ts +0 -205
- package/dist/viewer/server.d.ts.map +0 -1
- package/dist/viewer/server.js +0 -4876
- package/dist/viewer/server.js.map +0 -1
package/openclaw.plugin.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"name": "MemOS Local Memory",
|
|
4
4
|
"description": "Full-write local conversation memory with hybrid search (RRF + MMR + recency), task summarization, skill evolution, and team sharing (Hub-Client). Provides memory_search, memory_get, task_summary, skill_search, task_share, network_skill_pull, network_team_info, memory_viewer for layered retrieval and team collaboration.",
|
|
5
5
|
"kind": "memory",
|
|
6
|
-
"version": "1.0.6-beta.
|
|
6
|
+
"version": "1.0.6-beta.11",
|
|
7
7
|
"skills": [
|
|
8
8
|
"skill/memos-memory-guide"
|
|
9
9
|
],
|
package/package.json
CHANGED
|
@@ -1,14 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@memtensor/memos-local-openclaw-plugin",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.7",
|
|
4
4
|
"description": "MemOS Local memory plugin for OpenClaw — full-write, hybrid-recall, progressive retrieval",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "index.ts",
|
|
7
|
-
"types": "dist/index.d.ts",
|
|
8
7
|
"files": [
|
|
9
8
|
"index.ts",
|
|
10
9
|
"src",
|
|
11
|
-
"dist",
|
|
12
10
|
"skill",
|
|
13
11
|
"prebuilds",
|
|
14
12
|
"scripts/native-binding.cjs",
|
|
@@ -36,7 +34,7 @@
|
|
|
36
34
|
"test:watch": "vitest",
|
|
37
35
|
"test:accuracy": "tsx scripts/run-accuracy-test.ts",
|
|
38
36
|
"postinstall": "node scripts/postinstall.cjs",
|
|
39
|
-
"prepublishOnly": "
|
|
37
|
+
"prepublishOnly": "echo 'Source-only publish — no build needed.'"
|
|
40
38
|
},
|
|
41
39
|
"keywords": [
|
|
42
40
|
"openclaw",
|
|
@@ -47,7 +45,7 @@
|
|
|
47
45
|
],
|
|
48
46
|
"license": "MIT",
|
|
49
47
|
"engines": {
|
|
50
|
-
"node": ">=
|
|
48
|
+
"node": ">=22.0.0"
|
|
51
49
|
},
|
|
52
50
|
"dependencies": {
|
|
53
51
|
"@huggingface/transformers": "^3.8.0",
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/scripts/postinstall.cjs
CHANGED
|
@@ -117,7 +117,7 @@ try {
|
|
|
117
117
|
* ═══════════════════════════════════════════════════════════ */
|
|
118
118
|
|
|
119
119
|
function ensureDependencies() {
|
|
120
|
-
phase(0, "
|
|
120
|
+
phase(0, "Check core dependencies / 检测核心依赖");
|
|
121
121
|
|
|
122
122
|
const coreDeps = ["@sinclair/typebox", "uuid", "@huggingface/transformers"];
|
|
123
123
|
const missing = [];
|
|
@@ -170,7 +170,7 @@ try {
|
|
|
170
170
|
* ═══════════════════════════════════════════════════════════ */
|
|
171
171
|
|
|
172
172
|
function cleanupLegacy() {
|
|
173
|
-
phase(1, "
|
|
173
|
+
phase(1, "Clean up legacy plugins / 清理旧版本插件");
|
|
174
174
|
|
|
175
175
|
const home = process.env.HOME || process.env.USERPROFILE || "";
|
|
176
176
|
if (!home) { log("Cannot determine HOME directory, skipping."); return; }
|
|
@@ -281,7 +281,7 @@ try {
|
|
|
281
281
|
* ═══════════════════════════════════════════════════════════ */
|
|
282
282
|
|
|
283
283
|
function installBundledSkill() {
|
|
284
|
-
phase(2, "
|
|
284
|
+
phase(2, "Install memory skill / 安装记忆技能");
|
|
285
285
|
|
|
286
286
|
const home = process.env.HOME || process.env.USERPROFILE || "";
|
|
287
287
|
if (!home) { warn("Cannot determine HOME directory, skipping skill install."); return; }
|
|
@@ -347,7 +347,7 @@ try {
|
|
|
347
347
|
* Phase 3: Verify better-sqlite3 native module
|
|
348
348
|
* ═══════════════════════════════════════════════════════════ */
|
|
349
349
|
|
|
350
|
-
phase(3, "检查 better-sqlite3 原生模块
|
|
350
|
+
phase(3, "Check native module / 检查 better-sqlite3 原生模块");
|
|
351
351
|
|
|
352
352
|
const sqliteModulePath = path.join(pluginDir, "node_modules", "better-sqlite3");
|
|
353
353
|
|
|
@@ -502,43 +502,43 @@ async function setupSharingWizard() {
|
|
|
502
502
|
const existingSharing = pluginEntry?.config?.sharing;
|
|
503
503
|
|
|
504
504
|
if (existingSharing?.enabled) {
|
|
505
|
-
const roleLabel = existingSharing.role === "hub" ? "Hub (
|
|
506
|
-
log(
|
|
505
|
+
const roleLabel = existingSharing.role === "hub" ? "Hub (Team Center)" : "Client (Team Member)";
|
|
506
|
+
log(`Sharing config detected: role = ${BOLD}${roleLabel}${RESET}`);
|
|
507
507
|
const prompt = createPrompt();
|
|
508
|
-
const ans = await prompt.ask(`
|
|
508
|
+
const ans = await prompt.ask(` Reconfigure? / 是否重新配置?(y/N) > `);
|
|
509
509
|
prompt.close();
|
|
510
510
|
if (ans.toLowerCase() !== "y") {
|
|
511
|
-
ok("保留现有共享配置。");
|
|
511
|
+
ok("Keeping existing sharing config. / 保留现有共享配置。");
|
|
512
512
|
return;
|
|
513
513
|
}
|
|
514
514
|
}
|
|
515
515
|
|
|
516
|
-
phase(3, "
|
|
516
|
+
phase(3, "LAN Sharing Setup / 局域网共享设置");
|
|
517
517
|
|
|
518
518
|
const prompt = createPrompt();
|
|
519
519
|
|
|
520
|
-
const enableAns = await prompt.ask(`
|
|
520
|
+
const enableAns = await prompt.ask(` Enable LAN sharing? / 是否启用局域网记忆共享?(y/N) > `);
|
|
521
521
|
if (enableAns.toLowerCase() !== "y") {
|
|
522
522
|
prompt.close();
|
|
523
|
-
log("
|
|
523
|
+
log("Sharing not enabled. You can configure it later in openclaw.json. / 未启用共享。");
|
|
524
524
|
return;
|
|
525
525
|
}
|
|
526
526
|
|
|
527
527
|
console.log(`
|
|
528
|
-
${BOLD}
|
|
529
|
-
${GREEN}1)${RESET}
|
|
530
|
-
${GREEN}2)${RESET}
|
|
528
|
+
${BOLD}Choose your role / 请选择你的角色:${RESET}
|
|
529
|
+
${GREEN}1)${RESET} Create Team (Hub) — become the team admin, others connect to you / 创建团队
|
|
530
|
+
${GREEN}2)${RESET} Join Team (Client) — connect to an existing Hub / 加入团队
|
|
531
531
|
`);
|
|
532
532
|
|
|
533
|
-
const roleAns = await prompt.ask(`
|
|
533
|
+
const roleAns = await prompt.ask(` Enter 1 or 2 / 请输入 1 或 2 > `);
|
|
534
534
|
|
|
535
535
|
let sharingConfig;
|
|
536
536
|
|
|
537
537
|
if (roleAns === "1") {
|
|
538
|
-
console.log(`\n ${CYAN}${BOLD}── Hub
|
|
538
|
+
console.log(`\n ${CYAN}${BOLD}── Hub Setup / Hub 设置 ──${RESET}\n`);
|
|
539
539
|
|
|
540
|
-
const teamName = (await prompt.ask(`
|
|
541
|
-
const portStr = (await prompt.ask(` Hub
|
|
540
|
+
const teamName = (await prompt.ask(` Team name / 团队名称 (default: My Team) > `)) || "My Team";
|
|
541
|
+
const portStr = (await prompt.ask(` Hub port / Hub 端口 (default: 18800) > `)) || "18800";
|
|
542
542
|
const port = parseInt(portStr, 10) || 18800;
|
|
543
543
|
const teamToken = generateTeamToken();
|
|
544
544
|
|
|
@@ -553,46 +553,46 @@ async function setupSharingWizard() {
|
|
|
553
553
|
|
|
554
554
|
console.log(`
|
|
555
555
|
${GREEN}${BOLD} ┌────────────────────────────────────────────────────────────┐
|
|
556
|
-
│ ✔ Hub
|
|
556
|
+
│ ✔ Hub configured! / Hub 配置完成! │
|
|
557
557
|
│ │
|
|
558
|
-
│ 请将以下信息分享给团队成员: │
|
|
559
558
|
│ Share this info with your team: │
|
|
559
|
+
│ 请将以下信息分享给团队成员: │
|
|
560
560
|
│ │
|
|
561
|
-
│ ${CYAN}Hub 地址
|
|
561
|
+
│ ${CYAN}Address / Hub 地址 : ${displayIP}:${port}${GREEN}
|
|
562
562
|
│ ${CYAN}Team Token : ${teamToken}${GREEN}
|
|
563
563
|
│ │
|
|
564
|
-
│
|
|
564
|
+
│ Team members should choose "Join Team" during install. │
|
|
565
565
|
└────────────────────────────────────────────────────────────┘${RESET}
|
|
566
566
|
`);
|
|
567
567
|
|
|
568
568
|
if (localIPs.length > 1) {
|
|
569
|
-
log("
|
|
569
|
+
log("Multiple network interfaces detected / 检测到多个网络接口:");
|
|
570
570
|
for (const ip of localIPs) {
|
|
571
571
|
log(` ${ip.name}: ${BOLD}${ip.address}:${port}${RESET}`);
|
|
572
572
|
}
|
|
573
573
|
}
|
|
574
574
|
|
|
575
575
|
} else if (roleAns === "2") {
|
|
576
|
-
console.log(`\n ${CYAN}${BOLD}──
|
|
576
|
+
console.log(`\n ${CYAN}${BOLD}── Join Team / 加入团队 ──${RESET}\n`);
|
|
577
577
|
|
|
578
|
-
const hubAddress = await prompt.ask(` Hub
|
|
578
|
+
const hubAddress = await prompt.ask(` Hub address / Hub 地址 (e.g. 192.168.1.100:18800) > `);
|
|
579
579
|
if (!hubAddress) {
|
|
580
580
|
prompt.close();
|
|
581
|
-
warn("Hub
|
|
581
|
+
warn("Hub address cannot be empty, skipping. / Hub 地址不能为空。");
|
|
582
582
|
return;
|
|
583
583
|
}
|
|
584
584
|
|
|
585
|
-
const teamToken = await prompt.ask(` Team Token (
|
|
585
|
+
const teamToken = await prompt.ask(` Team Token (from Hub creator / 由 Hub 创建者提供) > `);
|
|
586
586
|
if (!teamToken) {
|
|
587
587
|
prompt.close();
|
|
588
|
-
warn("Team Token
|
|
588
|
+
warn("Team Token cannot be empty, skipping. / Team Token 不能为空。");
|
|
589
589
|
return;
|
|
590
590
|
}
|
|
591
591
|
|
|
592
|
-
const username = (await prompt.ask(`
|
|
592
|
+
const username = (await prompt.ask(` Your username / 你的用户名 (default: ${os.userInfo().username}) > `)) || os.userInfo().username;
|
|
593
593
|
|
|
594
594
|
const hubUrl = /^https?:\/\//i.test(hubAddress.trim()) ? hubAddress.trim() : `http://${hubAddress.trim()}`;
|
|
595
|
-
log(
|
|
595
|
+
log(`Joining team at / 正在加入团队: ${BOLD}${hubUrl}${RESET} ...`);
|
|
596
596
|
|
|
597
597
|
let userToken = "";
|
|
598
598
|
let joinOk = false;
|
|
@@ -626,18 +626,18 @@ ${GREEN}${BOLD} ┌────────────────────
|
|
|
626
626
|
if (joinResult.status === 200 && joinResult.body.userToken) {
|
|
627
627
|
userToken = joinResult.body.userToken;
|
|
628
628
|
joinOk = true;
|
|
629
|
-
ok(
|
|
629
|
+
ok(`Joined successfully! / 加入成功!User: ${BOLD}${username}${RESET}`);
|
|
630
630
|
} else if (joinResult.status === 403) {
|
|
631
631
|
prompt.close();
|
|
632
|
-
fail("Team Token
|
|
632
|
+
fail("Invalid Team Token / Team Token 无效");
|
|
633
633
|
return;
|
|
634
634
|
} else {
|
|
635
|
-
warn(`Hub
|
|
636
|
-
log("
|
|
635
|
+
warn(`Hub responded / Hub 返回: ${joinResult.status} ${JSON.stringify(joinResult.body)}`);
|
|
636
|
+
log("Config will be saved; gateway will auto-retry joining with Team Token on startup. / 配置将被保存,gateway 启动时会自动重试。");
|
|
637
637
|
}
|
|
638
638
|
} catch (e) {
|
|
639
|
-
warn(
|
|
640
|
-
log("
|
|
639
|
+
warn(`Cannot reach Hub / 无法连接 Hub: ${e.message}`);
|
|
640
|
+
log("Config will be saved; gateway will auto-retry joining on startup. / 配置将被保存,gateway 启动时会自动重试。");
|
|
641
641
|
}
|
|
642
642
|
|
|
643
643
|
sharingConfig = {
|
|
@@ -648,11 +648,11 @@ ${GREEN}${BOLD} ┌────────────────────
|
|
|
648
648
|
if (userToken) sharingConfig.client.userToken = userToken;
|
|
649
649
|
|
|
650
650
|
const statusMsg = joinOk
|
|
651
|
-
?
|
|
652
|
-
: `Hub
|
|
651
|
+
? `Joined team, restart gateway to take effect`
|
|
652
|
+
: `Hub unreachable, gateway will auto-join on startup`;
|
|
653
653
|
console.log(`
|
|
654
654
|
${GREEN}${BOLD} ┌────────────────────────────────────────────────────────────┐
|
|
655
|
-
│ ✔ Client
|
|
655
|
+
│ ✔ Client configured! / Client 配置完成! │
|
|
656
656
|
│ ${CYAN}Hub: ${hubAddress}${GREEN}
|
|
657
657
|
│ ${CYAN}${statusMsg}${GREEN}
|
|
658
658
|
└────────────────────────────────────────────────────────────┘${RESET}
|
|
@@ -660,7 +660,7 @@ ${GREEN}${BOLD} ┌────────────────────
|
|
|
660
660
|
|
|
661
661
|
} else {
|
|
662
662
|
prompt.close();
|
|
663
|
-
warn(
|
|
663
|
+
warn(`Invalid choice "${roleAns}", skipping. You can configure later in openclaw.json. / 无效选择,跳过配置。`);
|
|
664
664
|
return;
|
|
665
665
|
}
|
|
666
666
|
|
|
@@ -679,11 +679,11 @@ ${GREEN}${BOLD} ┌────────────────────
|
|
|
679
679
|
const backup = cfgPath + ".bak-" + Date.now();
|
|
680
680
|
fs.copyFileSync(cfgPath, backup);
|
|
681
681
|
fs.writeFileSync(cfgPath, JSON.stringify(cfg, null, 2) + "\n", "utf-8");
|
|
682
|
-
ok(
|
|
683
|
-
log(
|
|
682
|
+
ok(`Config saved / 配置已写入: ${DIM}~/.openclaw/openclaw.json${RESET}`);
|
|
683
|
+
log(`Backup / 备份: ${DIM}${backup}${RESET}`);
|
|
684
684
|
} catch (e) {
|
|
685
|
-
fail(
|
|
686
|
-
warn("
|
|
685
|
+
fail(`Config write failed / 写入配置失败: ${e.message}`);
|
|
686
|
+
warn("Please manually edit ~/.openclaw/openclaw.json to add sharing config. / 请手动编辑配置。");
|
|
687
687
|
}
|
|
688
688
|
}
|
|
689
689
|
|
|
@@ -1,6 +1,26 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: memos-memory-guide
|
|
3
3
|
description: "Use the MemOS Local memory system to search and use the user's past conversations. Use this skill whenever the user refers to past chats, their own preferences or history, or when you need to answer from prior context. When auto-recall returns nothing (long or unclear user query), generate your own short search query and call memory_search. Available tools: memory_search, memory_get, memory_write_public, memory_share, memory_unshare, task_summary, skill_get, skill_search, skill_install, skill_publish, skill_unpublish, network_memory_detail, network_skill_pull, network_team_info, memory_timeline, memory_viewer."
|
|
4
|
+
metadata:
|
|
5
|
+
openclaw:
|
|
6
|
+
requires:
|
|
7
|
+
bins:
|
|
8
|
+
- node
|
|
9
|
+
- npm
|
|
10
|
+
anyBins:
|
|
11
|
+
- curl
|
|
12
|
+
- wget
|
|
13
|
+
env:
|
|
14
|
+
- OPENCLAW_STATE_DIR
|
|
15
|
+
- OPENCLAW_CONFIG_PATH
|
|
16
|
+
config:
|
|
17
|
+
- ~/.openclaw/openclaw.json
|
|
18
|
+
install:
|
|
19
|
+
- kind: node
|
|
20
|
+
package: better-sqlite3
|
|
21
|
+
bins: []
|
|
22
|
+
emoji: "\U0001F9E0"
|
|
23
|
+
homepage: https://github.com/nicekate/MemOS
|
|
4
24
|
---
|
|
5
25
|
|
|
6
26
|
# MemOS Local Memory — Agent Guide
|
package/src/update-check.ts
CHANGED
|
@@ -52,26 +52,21 @@ export async function computeUpdateCheck(
|
|
|
52
52
|
|
|
53
53
|
if (onBeta) {
|
|
54
54
|
channel = "beta";
|
|
55
|
-
// Beta users: only compare against beta tag; never suggest "updating" to stable via gt confusion.
|
|
56
55
|
if (betaTag && semver.valid(betaTag) && semver.gt(betaTag, current)) {
|
|
57
56
|
updateAvailable = true;
|
|
58
57
|
targetVersion = betaTag;
|
|
59
|
-
installCommand = `openclaw plugins install ${packageName}@beta`;
|
|
60
58
|
} else {
|
|
61
59
|
targetVersion = betaTag && semver.valid(betaTag) ? betaTag : current;
|
|
62
|
-
if (betaTag && semver.valid(betaTag) && semver.eq(betaTag, current)) {
|
|
63
|
-
installCommand = `openclaw plugins install ${packageName}@beta`;
|
|
64
|
-
}
|
|
65
60
|
}
|
|
61
|
+
installCommand = `openclaw plugins install ${packageName}@${targetVersion}`;
|
|
66
62
|
} else {
|
|
67
|
-
// Stable users: compare against latest only.
|
|
68
63
|
if (latestTag && semver.valid(latestTag) && semver.gt(latestTag, current)) {
|
|
69
64
|
updateAvailable = true;
|
|
70
65
|
targetVersion = latestTag;
|
|
71
|
-
installCommand = `openclaw plugins install ${packageName}`;
|
|
72
66
|
} else {
|
|
73
67
|
targetVersion = latestTag && semver.valid(latestTag) ? latestTag : current;
|
|
74
68
|
}
|
|
69
|
+
installCommand = `openclaw plugins install ${packageName}@${targetVersion}`;
|
|
75
70
|
}
|
|
76
71
|
|
|
77
72
|
// Beta user + stable exists on latest: optional hint to switch to stable (not counted as "update").
|
package/src/viewer/html.ts
CHANGED
|
@@ -9051,11 +9051,11 @@ function waitForGatewayAndReload(maxAttempts,attempt){
|
|
|
9051
9051
|
});
|
|
9052
9052
|
},delay);
|
|
9053
9053
|
}
|
|
9054
|
-
function doUpdateInstall(packageSpec,btnEl,statusEl){
|
|
9054
|
+
function doUpdateInstall(packageSpec,btnEl,statusEl,targetVersion){
|
|
9055
9055
|
btnEl.disabled=true;
|
|
9056
9056
|
btnEl.textContent=t('update.installing');
|
|
9057
9057
|
btnEl.style.cssText='background:rgba(99,102,241,.15);color:var(--pri);border:1px solid rgba(99,102,241,.3);border-radius:6px;padding:4px 14px;font-size:12px;font-weight:600;cursor:wait;white-space:nowrap';
|
|
9058
|
-
fetch('/api/update-install',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({packageSpec:packageSpec})})
|
|
9058
|
+
fetch('/api/update-install',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({packageSpec:packageSpec,targetVersion:targetVersion||''})})
|
|
9059
9059
|
.then(function(r){return r.json()})
|
|
9060
9060
|
.then(function(d){
|
|
9061
9061
|
if(d.ok){
|
|
@@ -9082,7 +9082,7 @@ async function checkForUpdate(){
|
|
|
9082
9082
|
if(!r.ok)return;
|
|
9083
9083
|
const d=await r.json();
|
|
9084
9084
|
if(!d.updateAvailable)return;
|
|
9085
|
-
const pkgSpec=d.
|
|
9085
|
+
const pkgSpec=d.packageName+'@'+d.latest;
|
|
9086
9086
|
var bannerWrap=document.createElement('div');
|
|
9087
9087
|
bannerWrap.id='updateBannerWrap';
|
|
9088
9088
|
bannerWrap.style.cssText='background:linear-gradient(135deg,rgba(99,102,241,.08),rgba(139,92,246,.06));border-bottom:1px solid rgba(99,102,241,.18);backdrop-filter:blur(8px);animation:slideIn .3s ease';
|
|
@@ -9099,7 +9099,7 @@ async function checkForUpdate(){
|
|
|
9099
9099
|
btnUpdate.onmouseleave=function(){this.style.opacity='1';this.style.transform='scale(1)'};
|
|
9100
9100
|
var statusDiv=document.createElement('div');
|
|
9101
9101
|
statusDiv.style.cssText='font-size:11px;opacity:.7;flex-shrink:0';
|
|
9102
|
-
btnUpdate.onclick=function(){doUpdateInstall(pkgSpec,btnUpdate,statusDiv)};
|
|
9102
|
+
btnUpdate.onclick=function(){doUpdateInstall(pkgSpec,btnUpdate,statusDiv,d.latest)};
|
|
9103
9103
|
textNode.appendChild(btnUpdate);
|
|
9104
9104
|
var spacer=document.createElement('div');
|
|
9105
9105
|
spacer.style.cssText='flex:1';
|
package/src/viewer/server.ts
CHANGED
|
@@ -3332,13 +3332,14 @@ export class ViewerServer {
|
|
|
3332
3332
|
req.on("data", (chunk: Buffer) => { body += chunk.toString(); });
|
|
3333
3333
|
req.on("end", () => {
|
|
3334
3334
|
try {
|
|
3335
|
-
const { packageSpec: rawSpec } = JSON.parse(body);
|
|
3335
|
+
const { packageSpec: rawSpec, targetVersion: rawTargetVersion } = JSON.parse(body);
|
|
3336
3336
|
if (!rawSpec || typeof rawSpec !== "string") {
|
|
3337
3337
|
res.writeHead(400, { "Content-Type": "application/json" });
|
|
3338
3338
|
res.end(JSON.stringify({ ok: false, error: "Missing packageSpec" }));
|
|
3339
3339
|
return;
|
|
3340
3340
|
}
|
|
3341
3341
|
const packageSpec = rawSpec.trim().replace(/^(?:npx\s+)?openclaw\s+plugins\s+install\s+/i, "");
|
|
3342
|
+
const targetVersion = typeof rawTargetVersion === "string" ? rawTargetVersion.trim() : "";
|
|
3342
3343
|
const allowed = /^@[\w-]+\/[\w.-]+(@[\w.-]+)?$/;
|
|
3343
3344
|
this.log.info(`update-install: received packageSpec="${packageSpec}" (len=${packageSpec.length})`);
|
|
3344
3345
|
if (!allowed.test(packageSpec)) {
|
|
@@ -3465,13 +3466,22 @@ export class ViewerServer {
|
|
|
3465
3466
|
return;
|
|
3466
3467
|
}
|
|
3467
3468
|
|
|
3468
|
-
// Read new version
|
|
3469
3469
|
let newVersion = "unknown";
|
|
3470
3470
|
try {
|
|
3471
3471
|
const newPkg = JSON.parse(fs.readFileSync(path.join(extDir, "package.json"), "utf-8"));
|
|
3472
3472
|
newVersion = newPkg.version ?? newVersion;
|
|
3473
3473
|
} catch {}
|
|
3474
3474
|
|
|
3475
|
+
if (targetVersion && newVersion !== targetVersion) {
|
|
3476
|
+
this.log.warn(`update-install: version mismatch! expected=${targetVersion}, got=${newVersion} — rolling back`);
|
|
3477
|
+
rollbackInstall();
|
|
3478
|
+
this.jsonResponse(res, {
|
|
3479
|
+
ok: false,
|
|
3480
|
+
error: `Version mismatch: expected ${targetVersion} but downloaded ${newVersion}. npm cache may be stale — please try again.`,
|
|
3481
|
+
});
|
|
3482
|
+
return;
|
|
3483
|
+
}
|
|
3484
|
+
|
|
3475
3485
|
discardBackup();
|
|
3476
3486
|
this.log.info(`update-install: success! Updated to ${newVersion}`);
|
|
3477
3487
|
this.jsonResponseAndRestart(res, { ok: true, version: newVersion }, "update-install");
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
{
|
|
2
|
+
"endpoint": "https://proj-xtrace-e218d9316b328f196a3c640cc7ca84-cn-hangzhou.cn-hangzhou.log.aliyuncs.com/rum/web/v2?workspace=default-cms-1026429231103299-cn-hangzhou&service_id=a3u72ukxmr@066657d42a13a9a9f337f",
|
|
3
|
+
"pid": "a3u72ukxmr@066657d42a13a9a9f337f",
|
|
4
|
+
"env": "prod"
|
|
5
|
+
}
|
package/dist/capture/index.d.ts
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import type { ConversationMessage, Logger } from "../types";
|
|
2
|
-
/**
|
|
3
|
-
* Extract writable messages from a conversation turn.
|
|
4
|
-
*
|
|
5
|
-
* Stores the user's actual text — strips only OpenClaw's injected metadata
|
|
6
|
-
* prefixes (Sender info, conversation context, etc.) which are not user content.
|
|
7
|
-
* Only skips: system prompts and our own memory tool results (prevents loop).
|
|
8
|
-
*/
|
|
9
|
-
export declare function captureMessages(messages: Array<{
|
|
10
|
-
role: string;
|
|
11
|
-
content: string;
|
|
12
|
-
toolName?: string;
|
|
13
|
-
}>, sessionKey: string, turnId: string, evidenceTag: string, log: Logger, owner?: string, userSearchTime?: number): ConversationMessage[];
|
|
14
|
-
/**
|
|
15
|
-
* Strip OpenClaw-injected inbound metadata blocks from user messages.
|
|
16
|
-
*
|
|
17
|
-
* These blocks have the shape:
|
|
18
|
-
* Sender (untrusted metadata):
|
|
19
|
-
* ```json
|
|
20
|
-
* { "label": "...", "id": "..." }
|
|
21
|
-
* ```
|
|
22
|
-
*
|
|
23
|
-
* Also strips the envelope timestamp prefix like "[Tue 2026-03-03 21:58 GMT+8] "
|
|
24
|
-
*/
|
|
25
|
-
export declare function stripInboundMetadata(text: string): string;
|
|
26
|
-
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/capture/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAQ,MAAM,EAAE,MAAM,UAAU,CAAC;AAiDlE;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,EACrE,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,MAAM,EACX,KAAK,CAAC,EAAE,MAAM,EACd,cAAc,CAAC,EAAE,MAAM,GACtB,mBAAmB,EAAE,CA6DvB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CA+CzD"}
|