@t0ken.ai/memoryx-openclaw-plugin 2.2.18 → 2.2.20
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/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +39 -12
- package/package.json +2 -2
package/dist/index.d.ts
CHANGED
|
@@ -48,6 +48,7 @@ declare class MemoryXPlugin {
|
|
|
48
48
|
private timersStarted;
|
|
49
49
|
constructor(pluginConfig?: PluginConfig);
|
|
50
50
|
init(): Promise<void>;
|
|
51
|
+
startTimersIfNeeded(): Promise<void>;
|
|
51
52
|
onMessage(role: string, content: string): Promise<boolean>;
|
|
52
53
|
recall(query: string, limit?: number): Promise<RecallResult>;
|
|
53
54
|
endConversation(): Promise<void>;
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAkDH,UAAU,YAAY;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,UAAU,YAAY;IAClB,QAAQ,EAAE,KAAK,CAAC;QACZ,EAAE,EAAE,MAAM,CAAC;QACX,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;IACH,eAAe,EAAE,KAAK,CAAC;QACnB,EAAE,EAAE,MAAM,CAAC;QACX,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;IACH,SAAS,EAAE,OAAO,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB;AAqDD,cAAM,aAAa;IACf,OAAO,CAAC,YAAY,CAA2B;IAC/C,OAAO,CAAC,WAAW,CAAkB;IACrC,OAAO,CAAC,aAAa,CAAkB;gBAE3B,YAAY,CAAC,EAAE,YAAY;IAIjC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAad,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC;IAUpC,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA6B1D,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,GAAE,MAAU,GAAG,OAAO,CAAC,YAAY,CAAC;IAyC/D,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAYhC,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAc1C,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAcvE,IAAI,CAAC,KAAK,GAAE,MAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAiBxC,cAAc,IAAI,OAAO,CAAC;QACnC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;QACtB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QACvB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;QACzB,WAAW,EAAE,OAAO,CAAC;QACrB,KAAK,CAAC,EAAE,GAAG,CAAC;KACf,CAAC;IAwBW,cAAc,IAAI,OAAO,CAAC;QACnC,OAAO,EAAE,OAAO,CAAC;QACjB,IAAI,CAAC,EAAE;YACH,QAAQ,EAAE,MAAM,CAAC;YACjB,IAAI,EAAE,MAAM,CAAC;YACb,UAAU,EAAE,MAAM,CAAC;YACnB,YAAY,EAAE,MAAM,CAAC;YACrB,iBAAiB,EAAE,MAAM,CAAC;YAC1B,gBAAgB,EAAE,MAAM,CAAC;YACzB,mBAAmB,EAAE,MAAM,CAAC;YAC5B,MAAM,EAAE,MAAM,CAAC;YACf,OAAO,EAAE,MAAM,CAAC;SACnB,CAAC;QACF,KAAK,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;CAcL;;;;;;kBAUiB,GAAG,iBAAiB,YAAY,GAAG,IAAI;;AANzD,wBAgfE;AAEF,OAAO,EAAE,aAAa,EAAE,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -26,7 +26,7 @@ import * as fs from "fs";
|
|
|
26
26
|
import * as path from "path";
|
|
27
27
|
import * as os from "os";
|
|
28
28
|
// 插件版本号 - 由 prebuild 脚本自动从 package.json 同步
|
|
29
|
-
const PLUGIN_VERSION = "2.2.
|
|
29
|
+
const PLUGIN_VERSION = "2.2.20";
|
|
30
30
|
const DEFAULT_API_BASE = "https://t0ken.ai/api";
|
|
31
31
|
const PLUGIN_DIR = path.join(os.homedir(), ".openclaw", "extensions", "memoryx-openclaw-plugin");
|
|
32
32
|
let logStream = null;
|
|
@@ -36,8 +36,19 @@ function ensureDir() {
|
|
|
36
36
|
fs.mkdirSync(PLUGIN_DIR, { recursive: true });
|
|
37
37
|
}
|
|
38
38
|
}
|
|
39
|
-
|
|
40
|
-
|
|
39
|
+
/**
|
|
40
|
+
* 分层日志系统
|
|
41
|
+
* - 所有日志都写入文件
|
|
42
|
+
* - console=true 时同时写入控制台(用于重要/引导性信息)
|
|
43
|
+
* - console=false 时只写文件(用于调试信息)
|
|
44
|
+
*/
|
|
45
|
+
function log(message, options = {}) {
|
|
46
|
+
const { console: toConsole = false } = options;
|
|
47
|
+
// 写入控制台(如果需要)
|
|
48
|
+
if (toConsole) {
|
|
49
|
+
console.log(`[MemoryX] ${message}`);
|
|
50
|
+
}
|
|
51
|
+
// 所有日志都写入文件
|
|
41
52
|
setImmediate(() => {
|
|
42
53
|
try {
|
|
43
54
|
if (!logStreamReady) {
|
|
@@ -55,6 +66,8 @@ function log(message) {
|
|
|
55
66
|
// Lazy-loaded SDK instance
|
|
56
67
|
let sdkInstance = null;
|
|
57
68
|
let sdkInitPromise = null;
|
|
69
|
+
// SDK 版本号(延迟加载)
|
|
70
|
+
let sdkVersion = null;
|
|
58
71
|
async function getSDK(pluginConfig) {
|
|
59
72
|
if (sdkInstance)
|
|
60
73
|
return sdkInstance;
|
|
@@ -62,7 +75,8 @@ async function getSDK(pluginConfig) {
|
|
|
62
75
|
return sdkInitPromise;
|
|
63
76
|
sdkInitPromise = (async () => {
|
|
64
77
|
// Dynamic import SDK
|
|
65
|
-
const { MemoryXSDK } = await import("@t0ken.ai/memoryx-sdk");
|
|
78
|
+
const { MemoryXSDK, VERSION } = await import("@t0ken.ai/memoryx-sdk");
|
|
79
|
+
sdkVersion = VERSION;
|
|
66
80
|
// Agent name 使用主机名,保证重安装时 agent_id 不变
|
|
67
81
|
// 服务端重安装检测: agent_name + agent_type + machine_fingerprint
|
|
68
82
|
const agentName = os.hostname();
|
|
@@ -83,7 +97,9 @@ async function getSDK(pluginConfig) {
|
|
|
83
97
|
// Set debug mode
|
|
84
98
|
const { setDebug } = await import("@t0ken.ai/memoryx-sdk");
|
|
85
99
|
setDebug(true);
|
|
86
|
-
|
|
100
|
+
// 注意:不在这里启动定时器!
|
|
101
|
+
// 定时器在 onMessage 第一次收到消息时启动,避免阻塞 openclaw status 命令
|
|
102
|
+
log(`SDK v${sdkVersion} initialized with conversation preset (30k tokens / 5min idle)`, { console: true });
|
|
87
103
|
return sdkInstance;
|
|
88
104
|
})();
|
|
89
105
|
return sdkInitPromise;
|
|
@@ -108,15 +124,17 @@ class MemoryXPlugin {
|
|
|
108
124
|
log(`Init failed: ${e}`);
|
|
109
125
|
}
|
|
110
126
|
}
|
|
127
|
+
async startTimersIfNeeded() {
|
|
128
|
+
if (this.timersStarted)
|
|
129
|
+
return;
|
|
130
|
+
await this.init();
|
|
131
|
+
const sdk = await getSDK(this.pluginConfig);
|
|
132
|
+
sdk.startTimers();
|
|
133
|
+
this.timersStarted = true;
|
|
134
|
+
log("Timers started");
|
|
135
|
+
}
|
|
111
136
|
async onMessage(role, content) {
|
|
112
137
|
await this.init();
|
|
113
|
-
// 第一次收到消息时启动定时器
|
|
114
|
-
if (!this.timersStarted) {
|
|
115
|
-
const sdk = await getSDK(this.pluginConfig);
|
|
116
|
-
sdk.startTimers();
|
|
117
|
-
this.timersStarted = true;
|
|
118
|
-
log("Timers started on first message");
|
|
119
|
-
}
|
|
120
138
|
if (!content || content.length < 2) {
|
|
121
139
|
return false;
|
|
122
140
|
}
|
|
@@ -639,11 +657,20 @@ export default {
|
|
|
639
657
|
// Auto-inject memories via prependContext
|
|
640
658
|
// Note: OpenClaw's systemPrompt field is extracted but NEVER USED (bug in attempt.ts:918-928)
|
|
641
659
|
// We use prependContext which works, but the context will be visible in the user's prompt
|
|
660
|
+
//
|
|
661
|
+
// IMPORTANT: 对话流走的是 before_agent_start 事件,不是 message_received!
|
|
662
|
+
// message_received 只在 auto-reply 功能中触发
|
|
642
663
|
api.on("before_agent_start", async (event, ctx) => {
|
|
643
664
|
const { prompt } = event;
|
|
644
665
|
if (!prompt || prompt.length < 2 || !plugin)
|
|
645
666
|
return;
|
|
646
667
|
try {
|
|
668
|
+
// 1. 启动定时器(第一次对话时)
|
|
669
|
+
// 对话流不走 message_received,必须在这里启动定时器
|
|
670
|
+
await plugin.startTimersIfNeeded();
|
|
671
|
+
// 2. 保存用户消息到队列
|
|
672
|
+
await plugin.onMessage("user", prompt);
|
|
673
|
+
// 3. 搜索相关记忆
|
|
647
674
|
const result = await plugin.recall(prompt, 5);
|
|
648
675
|
if (result.isLimited) {
|
|
649
676
|
// Don't inject upgrade hints into prompt - just log
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@t0ken.ai/memoryx-openclaw-plugin",
|
|
3
|
-
"version": "2.2.
|
|
3
|
+
"version": "2.2.20",
|
|
4
4
|
"description": "MemoryX real-time memory capture and recall plugin for OpenClaw (powered by @t0ken.ai/memoryx-sdk)",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"author": "MemoryX Team",
|
|
@@ -36,6 +36,6 @@
|
|
|
36
36
|
"typescript": "^5.0.0"
|
|
37
37
|
},
|
|
38
38
|
"dependencies": {
|
|
39
|
-
"@t0ken.ai/memoryx-sdk": "^1.4.
|
|
39
|
+
"@t0ken.ai/memoryx-sdk": "^1.4.9"
|
|
40
40
|
}
|
|
41
41
|
}
|