@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.
Files changed (224) hide show
  1. package/openclaw.plugin.json +1 -1
  2. package/package.json +3 -5
  3. package/prebuilds/darwin-arm64/better_sqlite3.node +0 -0
  4. package/prebuilds/darwin-x64/better_sqlite3.node +0 -0
  5. package/prebuilds/linux-x64/better_sqlite3.node +0 -0
  6. package/prebuilds/win32-x64/better_sqlite3.node +0 -0
  7. package/scripts/postinstall.cjs +44 -44
  8. package/skill/memos-memory-guide/SKILL.md +20 -0
  9. package/src/update-check.ts +2 -7
  10. package/src/viewer/html.ts +4 -4
  11. package/src/viewer/server.ts +12 -2
  12. package/telemetry.credentials.json +5 -0
  13. package/dist/capture/index.d.ts +0 -26
  14. package/dist/capture/index.d.ts.map +0 -1
  15. package/dist/capture/index.js +0 -283
  16. package/dist/capture/index.js.map +0 -1
  17. package/dist/client/connector.d.ts +0 -34
  18. package/dist/client/connector.d.ts.map +0 -1
  19. package/dist/client/connector.js +0 -381
  20. package/dist/client/connector.js.map +0 -1
  21. package/dist/client/hub.d.ts +0 -61
  22. package/dist/client/hub.d.ts.map +0 -1
  23. package/dist/client/hub.js +0 -174
  24. package/dist/client/hub.js.map +0 -1
  25. package/dist/client/skill-sync.d.ts +0 -36
  26. package/dist/client/skill-sync.d.ts.map +0 -1
  27. package/dist/client/skill-sync.js +0 -226
  28. package/dist/client/skill-sync.js.map +0 -1
  29. package/dist/config.d.ts +0 -5
  30. package/dist/config.d.ts.map +0 -1
  31. package/dist/config.js +0 -171
  32. package/dist/config.js.map +0 -1
  33. package/dist/embedding/index.d.ts +0 -14
  34. package/dist/embedding/index.d.ts.map +0 -1
  35. package/dist/embedding/index.js +0 -105
  36. package/dist/embedding/index.js.map +0 -1
  37. package/dist/embedding/local.d.ts +0 -3
  38. package/dist/embedding/local.d.ts.map +0 -1
  39. package/dist/embedding/local.js +0 -66
  40. package/dist/embedding/local.js.map +0 -1
  41. package/dist/embedding/providers/cohere.d.ts +0 -4
  42. package/dist/embedding/providers/cohere.d.ts.map +0 -1
  43. package/dist/embedding/providers/cohere.js +0 -57
  44. package/dist/embedding/providers/cohere.js.map +0 -1
  45. package/dist/embedding/providers/gemini.d.ts +0 -3
  46. package/dist/embedding/providers/gemini.d.ts.map +0 -1
  47. package/dist/embedding/providers/gemini.js +0 -31
  48. package/dist/embedding/providers/gemini.js.map +0 -1
  49. package/dist/embedding/providers/mistral.d.ts +0 -3
  50. package/dist/embedding/providers/mistral.d.ts.map +0 -1
  51. package/dist/embedding/providers/mistral.js +0 -25
  52. package/dist/embedding/providers/mistral.js.map +0 -1
  53. package/dist/embedding/providers/openai.d.ts +0 -3
  54. package/dist/embedding/providers/openai.d.ts.map +0 -1
  55. package/dist/embedding/providers/openai.js +0 -35
  56. package/dist/embedding/providers/openai.js.map +0 -1
  57. package/dist/embedding/providers/voyage.d.ts +0 -3
  58. package/dist/embedding/providers/voyage.d.ts.map +0 -1
  59. package/dist/embedding/providers/voyage.js +0 -25
  60. package/dist/embedding/providers/voyage.js.map +0 -1
  61. package/dist/hub/auth.d.ts +0 -19
  62. package/dist/hub/auth.d.ts.map +0 -1
  63. package/dist/hub/auth.js +0 -70
  64. package/dist/hub/auth.js.map +0 -1
  65. package/dist/hub/server.d.ts +0 -52
  66. package/dist/hub/server.d.ts.map +0 -1
  67. package/dist/hub/server.js +0 -1197
  68. package/dist/hub/server.js.map +0 -1
  69. package/dist/hub/user-manager.d.ts +0 -40
  70. package/dist/hub/user-manager.d.ts.map +0 -1
  71. package/dist/hub/user-manager.js +0 -153
  72. package/dist/hub/user-manager.js.map +0 -1
  73. package/dist/index.d.ts +0 -46
  74. package/dist/index.d.ts.map +0 -1
  75. package/dist/index.js +0 -82
  76. package/dist/index.js.map +0 -1
  77. package/dist/ingest/chunker.d.ts +0 -15
  78. package/dist/ingest/chunker.d.ts.map +0 -1
  79. package/dist/ingest/chunker.js +0 -192
  80. package/dist/ingest/chunker.js.map +0 -1
  81. package/dist/ingest/dedup.d.ts +0 -19
  82. package/dist/ingest/dedup.d.ts.map +0 -1
  83. package/dist/ingest/dedup.js +0 -50
  84. package/dist/ingest/dedup.js.map +0 -1
  85. package/dist/ingest/providers/anthropic.d.ts +0 -21
  86. package/dist/ingest/providers/anthropic.d.ts.map +0 -1
  87. package/dist/ingest/providers/anthropic.js +0 -314
  88. package/dist/ingest/providers/anthropic.js.map +0 -1
  89. package/dist/ingest/providers/bedrock.d.ts +0 -21
  90. package/dist/ingest/providers/bedrock.d.ts.map +0 -1
  91. package/dist/ingest/providers/bedrock.js +0 -313
  92. package/dist/ingest/providers/bedrock.js.map +0 -1
  93. package/dist/ingest/providers/gemini.d.ts +0 -21
  94. package/dist/ingest/providers/gemini.d.ts.map +0 -1
  95. package/dist/ingest/providers/gemini.js +0 -298
  96. package/dist/ingest/providers/gemini.js.map +0 -1
  97. package/dist/ingest/providers/index.d.ts +0 -68
  98. package/dist/ingest/providers/index.d.ts.map +0 -1
  99. package/dist/ingest/providers/index.js +0 -611
  100. package/dist/ingest/providers/index.js.map +0 -1
  101. package/dist/ingest/providers/openai.d.ts +0 -30
  102. package/dist/ingest/providers/openai.d.ts.map +0 -1
  103. package/dist/ingest/providers/openai.js +0 -387
  104. package/dist/ingest/providers/openai.js.map +0 -1
  105. package/dist/ingest/task-processor.d.ts +0 -91
  106. package/dist/ingest/task-processor.d.ts.map +0 -1
  107. package/dist/ingest/task-processor.js +0 -478
  108. package/dist/ingest/task-processor.js.map +0 -1
  109. package/dist/ingest/worker.d.ts +0 -23
  110. package/dist/ingest/worker.d.ts.map +0 -1
  111. package/dist/ingest/worker.js +0 -255
  112. package/dist/ingest/worker.js.map +0 -1
  113. package/dist/openclaw-api.d.ts +0 -53
  114. package/dist/openclaw-api.d.ts.map +0 -1
  115. package/dist/openclaw-api.js +0 -189
  116. package/dist/openclaw-api.js.map +0 -1
  117. package/dist/recall/engine.d.ts +0 -28
  118. package/dist/recall/engine.d.ts.map +0 -1
  119. package/dist/recall/engine.js +0 -343
  120. package/dist/recall/engine.js.map +0 -1
  121. package/dist/recall/mmr.d.ts +0 -17
  122. package/dist/recall/mmr.d.ts.map +0 -1
  123. package/dist/recall/mmr.js +0 -53
  124. package/dist/recall/mmr.js.map +0 -1
  125. package/dist/recall/recency.d.ts +0 -20
  126. package/dist/recall/recency.d.ts.map +0 -1
  127. package/dist/recall/recency.js +0 -26
  128. package/dist/recall/recency.js.map +0 -1
  129. package/dist/recall/rrf.d.ts +0 -16
  130. package/dist/recall/rrf.d.ts.map +0 -1
  131. package/dist/recall/rrf.js +0 -15
  132. package/dist/recall/rrf.js.map +0 -1
  133. package/dist/shared/llm-call.d.ts +0 -30
  134. package/dist/shared/llm-call.d.ts.map +0 -1
  135. package/dist/shared/llm-call.js +0 -253
  136. package/dist/shared/llm-call.js.map +0 -1
  137. package/dist/sharing/types.contract.d.ts +0 -2
  138. package/dist/sharing/types.contract.d.ts.map +0 -1
  139. package/dist/sharing/types.contract.js +0 -3
  140. package/dist/sharing/types.contract.js.map +0 -1
  141. package/dist/sharing/types.d.ts +0 -80
  142. package/dist/sharing/types.d.ts.map +0 -1
  143. package/dist/sharing/types.js +0 -3
  144. package/dist/sharing/types.js.map +0 -1
  145. package/dist/skill/bundled-memory-guide.d.ts +0 -2
  146. package/dist/skill/bundled-memory-guide.d.ts.map +0 -1
  147. package/dist/skill/bundled-memory-guide.js +0 -45
  148. package/dist/skill/bundled-memory-guide.js.map +0 -1
  149. package/dist/skill/evaluator.d.ts +0 -28
  150. package/dist/skill/evaluator.d.ts.map +0 -1
  151. package/dist/skill/evaluator.js +0 -169
  152. package/dist/skill/evaluator.js.map +0 -1
  153. package/dist/skill/evolver.d.ts +0 -48
  154. package/dist/skill/evolver.d.ts.map +0 -1
  155. package/dist/skill/evolver.js +0 -406
  156. package/dist/skill/evolver.js.map +0 -1
  157. package/dist/skill/generator.d.ts +0 -26
  158. package/dist/skill/generator.d.ts.map +0 -1
  159. package/dist/skill/generator.js +0 -521
  160. package/dist/skill/generator.js.map +0 -1
  161. package/dist/skill/installer.d.ts +0 -42
  162. package/dist/skill/installer.d.ts.map +0 -1
  163. package/dist/skill/installer.js +0 -165
  164. package/dist/skill/installer.js.map +0 -1
  165. package/dist/skill/upgrader.d.ts +0 -19
  166. package/dist/skill/upgrader.d.ts.map +0 -1
  167. package/dist/skill/upgrader.js +0 -366
  168. package/dist/skill/upgrader.js.map +0 -1
  169. package/dist/skill/validator.d.ts +0 -30
  170. package/dist/skill/validator.d.ts.map +0 -1
  171. package/dist/skill/validator.js +0 -272
  172. package/dist/skill/validator.js.map +0 -1
  173. package/dist/storage/ensure-binding.d.ts +0 -12
  174. package/dist/storage/ensure-binding.d.ts.map +0 -1
  175. package/dist/storage/ensure-binding.js +0 -53
  176. package/dist/storage/ensure-binding.js.map +0 -1
  177. package/dist/storage/sqlite.d.ts +0 -649
  178. package/dist/storage/sqlite.d.ts.map +0 -1
  179. package/dist/storage/sqlite.js +0 -2657
  180. package/dist/storage/sqlite.js.map +0 -1
  181. package/dist/storage/vector.d.ts +0 -12
  182. package/dist/storage/vector.d.ts.map +0 -1
  183. package/dist/storage/vector.js +0 -34
  184. package/dist/storage/vector.js.map +0 -1
  185. package/dist/telemetry.d.ts +0 -47
  186. package/dist/telemetry.d.ts.map +0 -1
  187. package/dist/telemetry.js +0 -312
  188. package/dist/telemetry.js.map +0 -1
  189. package/dist/tools/index.d.ts +0 -5
  190. package/dist/tools/index.d.ts.map +0 -1
  191. package/dist/tools/index.js +0 -12
  192. package/dist/tools/index.js.map +0 -1
  193. package/dist/tools/memory-get.d.ts +0 -4
  194. package/dist/tools/memory-get.d.ts.map +0 -1
  195. package/dist/tools/memory-get.js +0 -64
  196. package/dist/tools/memory-get.js.map +0 -1
  197. package/dist/tools/memory-search.d.ts +0 -7
  198. package/dist/tools/memory-search.d.ts.map +0 -1
  199. package/dist/tools/memory-search.js +0 -84
  200. package/dist/tools/memory-search.js.map +0 -1
  201. package/dist/tools/memory-timeline.d.ts +0 -4
  202. package/dist/tools/memory-timeline.d.ts.map +0 -1
  203. package/dist/tools/memory-timeline.js +0 -73
  204. package/dist/tools/memory-timeline.js.map +0 -1
  205. package/dist/tools/network-memory-detail.d.ts +0 -4
  206. package/dist/tools/network-memory-detail.d.ts.map +0 -1
  207. package/dist/tools/network-memory-detail.js +0 -34
  208. package/dist/tools/network-memory-detail.js.map +0 -1
  209. package/dist/types.d.ts +0 -330
  210. package/dist/types.d.ts.map +0 -1
  211. package/dist/types.js +0 -38
  212. package/dist/types.js.map +0 -1
  213. package/dist/update-check.d.ts +0 -21
  214. package/dist/update-check.d.ts.map +0 -1
  215. package/dist/update-check.js +0 -110
  216. package/dist/update-check.js.map +0 -1
  217. package/dist/viewer/html.d.ts +0 -2
  218. package/dist/viewer/html.d.ts.map +0 -1
  219. package/dist/viewer/html.js +0 -9168
  220. package/dist/viewer/html.js.map +0 -1
  221. package/dist/viewer/server.d.ts +0 -205
  222. package/dist/viewer/server.d.ts.map +0 -1
  223. package/dist/viewer/server.js +0 -4876
  224. package/dist/viewer/server.js.map +0 -1
@@ -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.9",
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.6-beta.9",
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": "npm run build"
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": ">=18.0.0"
48
+ "node": ">=22.0.0"
51
49
  },
52
50
  "dependencies": {
53
51
  "@huggingface/transformers": "^3.8.0",
@@ -117,7 +117,7 @@ try {
117
117
  * ═══════════════════════════════════════════════════════════ */
118
118
 
119
119
  function ensureDependencies() {
120
- phase(0, "检测核心依赖 / Check core dependencies");
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, "清理旧版本插件 / Clean up legacy plugins");
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, "安装记忆技能 / Install memory skill");
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 原生模块 / Check native module");
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 (团队中心)" : "Client (团队成员)";
506
- log(`已检测到共享配置: 角色 = ${BOLD}${roleLabel}${RESET}`);
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(` 是否重新配置?/ Reconfigure? (y/N) > `);
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, "局域网共享设置 / LAN Sharing Setup");
516
+ phase(3, "LAN Sharing Setup / 局域网共享设置");
517
517
 
518
518
  const prompt = createPrompt();
519
519
 
520
- const enableAns = await prompt.ask(` 是否启用局域网记忆共享?/ Enable LAN sharing? (y/N) > `);
520
+ const enableAns = await prompt.ask(` Enable LAN sharing? / 是否启用局域网记忆共享?(y/N) > `);
521
521
  if (enableAns.toLowerCase() !== "y") {
522
522
  prompt.close();
523
- log("未启用共享。你可以稍后在 openclaw.json 中手动配置。");
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}请选择你的角色 / Choose your role:${RESET}
529
- ${GREEN}1)${RESET} 创建团队 (Hub) — 成为团队管理员,其他人连接你
530
- ${GREEN}2)${RESET} 加入团队 (Client) 连接到已有的 Hub
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(` 请输入 1 2 / Enter 1 or 2 > `);
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 设置 / Hub Setup ──${RESET}\n`);
538
+ console.log(`\n ${CYAN}${BOLD}── Hub Setup / Hub 设置 ──${RESET}\n`);
539
539
 
540
- const teamName = (await prompt.ask(` 团队名称 / Team name (默认: My Team) > `)) || "My Team";
541
- const portStr = (await prompt.ask(` Hub 端口 / Hub port (默认: 18800) > `)) || "18800";
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 配置完成!/ Hub configured!
556
+ │ ✔ Hub configured! / Hub 配置完成!
557
557
  │ │
558
- │ 请将以下信息分享给团队成员: │
559
558
  │ Share this info with your team: │
559
+ │ 请将以下信息分享给团队成员: │
560
560
  │ │
561
- │ ${CYAN}Hub 地址 / Address : ${displayIP}:${port}${GREEN}
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("检测到多个网络接口 / Multiple network interfaces:");
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}── 加入团队 / Join Team ──${RESET}\n`);
576
+ console.log(`\n ${CYAN}${BOLD}── Join Team / 加入团队 ──${RESET}\n`);
577
577
 
578
- const hubAddress = await prompt.ask(` Hub 地址 / Hub address ( 192.168.1.100:18800) > `);
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 ( Hub 创建者提供 / from Hub creator) > `);
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(` 你的用户名 / Your username (默认: ${os.userInfo().username}) > `)) || os.userInfo().username;
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(`正在加入团队 / Joining team at: ${BOLD}${hubUrl}${RESET} ...`);
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(`加入成功!/ Joined successfully! 用户: ${BOLD}${username}${RESET}`);
629
+ ok(`Joined successfully! / 加入成功!User: ${BOLD}${username}${RESET}`);
630
630
  } else if (joinResult.status === 403) {
631
631
  prompt.close();
632
- fail("Team Token 无效 / Invalid Team Token");
632
+ fail("Invalid Team Token / Team Token 无效");
633
633
  return;
634
634
  } else {
635
- warn(`Hub 返回 / Hub responded: ${joinResult.status} ${JSON.stringify(joinResult.body)}`);
636
- log("配置将被保存,gateway 启动时会用 Team Token 自动重试加入。");
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(`无法连接 Hub / Cannot reach Hub: ${e.message}`);
640
- log("配置将被保存,gateway 启动时会用 Team Token 自动重试加入。");
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
- ? `已加入团队,重启 gateway 即生效`
652
- : `Hub 暂不可达,gateway 启动时会自动加入`;
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 配置完成!/ Client configured!
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(`无效选择 "${roleAns}",跳过配置。你可以稍后在 openclaw.json 中手动配置。`);
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(`配置已写入 / Config saved: ${DIM}~/.openclaw/openclaw.json${RESET}`);
683
- log(`备份 / Backup: ${DIM}${backup}${RESET}`);
682
+ ok(`Config saved / 配置已写入: ${DIM}~/.openclaw/openclaw.json${RESET}`);
683
+ log(`Backup / 备份: ${DIM}${backup}${RESET}`);
684
684
  } catch (e) {
685
- fail(`写入配置失败 / Config write failed: ${e.message}`);
686
- warn("请手动编辑 ~/.openclaw/openclaw.json 添加 sharing 配置。");
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
@@ -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").
@@ -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.installCommand?d.installCommand.replace(/^(?:npx\s+)?openclaw\s+plugins\s+install\s+/,''):(d.packageName+'@'+d.latest);
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';
@@ -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
+ }
@@ -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"}