@yun-zero/claw-memory 0.1.4 → 0.1.6
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/hooks/message.d.ts +2 -16
- package/dist/hooks/message.d.ts.map +1 -1
- package/dist/hooks/message.js +11 -17
- package/dist/hooks/message.js.map +1 -1
- package/dist/plugin.d.ts +3 -6
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +9 -8
- package/dist/plugin.js.map +1 -1
- package/dist/types.d.ts +9 -0
- package/dist/types.d.ts.map +1 -1
- package/openclaw.plugin.json +1 -1
- package/package.json +1 -1
- package/src/hooks/message.ts +14 -33
- package/src/plugin.ts +12 -14
- package/src/types.ts +12 -0
package/dist/hooks/message.d.ts
CHANGED
|
@@ -1,18 +1,4 @@
|
|
|
1
1
|
import type { Database } from 'better-sqlite3';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
role: 'user' | 'assistant';
|
|
5
|
-
content: string;
|
|
6
|
-
};
|
|
7
|
-
session: {
|
|
8
|
-
id: string;
|
|
9
|
-
key: string;
|
|
10
|
-
};
|
|
11
|
-
conversation?: Array<{
|
|
12
|
-
role: 'user' | 'assistant';
|
|
13
|
-
content: string;
|
|
14
|
-
}>;
|
|
15
|
-
}
|
|
16
|
-
export declare function handleMessageSent(event: MessageEvent, db: Database, dataDir: string): Promise<void>;
|
|
17
|
-
export {};
|
|
2
|
+
import type { InternalHookEvent } from '../types.js';
|
|
3
|
+
export declare function handleMessageSent(event: InternalHookEvent, db: Database, dataDir: string): Promise<void>;
|
|
18
4
|
//# sourceMappingURL=message.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message.d.ts","sourceRoot":"","sources":["../../src/hooks/message.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"message.d.ts","sourceRoot":"","sources":["../../src/hooks/message.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAK/C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAErD,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,iBAAiB,EACxB,EAAE,EAAE,QAAQ,EACZ,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CA+Cf"}
|
package/dist/hooks/message.js
CHANGED
|
@@ -3,28 +3,22 @@ import * as path from 'path';
|
|
|
3
3
|
import * as fs from 'fs';
|
|
4
4
|
import { homedir } from 'os';
|
|
5
5
|
export async function handleMessageSent(event, db, dataDir) {
|
|
6
|
-
//
|
|
7
|
-
if (event.
|
|
6
|
+
// 确保 context 存在
|
|
7
|
+
if (!event.context || typeof event.context !== 'object') {
|
|
8
8
|
return;
|
|
9
9
|
}
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
if (
|
|
13
|
-
|
|
14
|
-
for (let i = event.conversation.length - 1; i >= 0; i--) {
|
|
15
|
-
if (event.conversation[i].role === 'user') {
|
|
16
|
-
userMessage = event.conversation[i].content;
|
|
17
|
-
break;
|
|
18
|
-
}
|
|
19
|
-
}
|
|
10
|
+
const ctx = event.context;
|
|
11
|
+
// 只处理成功发送的消息
|
|
12
|
+
if (ctx.success !== true) {
|
|
13
|
+
return;
|
|
20
14
|
}
|
|
21
|
-
const assistantMessage =
|
|
22
|
-
if (!
|
|
23
|
-
console.log('[ClawMemory] Skipping - no
|
|
15
|
+
const assistantMessage = ctx.content;
|
|
16
|
+
if (!assistantMessage) {
|
|
17
|
+
console.log('[ClawMemory] Skipping - no message content');
|
|
24
18
|
return;
|
|
25
19
|
}
|
|
26
|
-
// 构建 Q&A
|
|
27
|
-
const qaContent = `
|
|
20
|
+
// 构建 Q&A(简化版,只保存AI回复)
|
|
21
|
+
const qaContent = `A: ${assistantMessage}`;
|
|
28
22
|
// 解析 dataDir 中的 ~
|
|
29
23
|
const resolvedDataDir = dataDir.replace(/^~/, homedir());
|
|
30
24
|
// 直接创建目录(recursive: true 已处理存在的情况)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message.js","sourceRoot":"","sources":["../../src/hooks/message.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,MAAM,CAAC;AACpC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"message.js","sourceRoot":"","sources":["../../src/hooks/message.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,MAAM,CAAC;AACpC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAG7B,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,KAAwB,EACxB,EAAY,EACZ,OAAe;IAEf,gBAAgB;IAChB,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QACxD,OAAO;IACT,CAAC;IAED,MAAM,GAAG,GAAG,KAAK,CAAC,OAAkC,CAAC;IAErD,aAAa;IACb,IAAI,GAAG,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;QACzB,OAAO;IACT,CAAC;IAED,MAAM,gBAAgB,GAAG,GAAG,CAAC,OAAiB,CAAC;IAE/C,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;QAC1D,OAAO;IACT,CAAC;IAED,sBAAsB;IACtB,MAAM,SAAS,GAAG,MAAM,gBAAgB,EAAE,CAAC;IAE3C,kBAAkB;IAClB,MAAM,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IAEzD,mCAAmC;IACnC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;IAC3D,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE/C,OAAO;IACP,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC;IAC1B,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,QAAQ,KAAK,CAAC,CAAC;IAE7D,SAAS;IACT,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,WAAW,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IAE7D,gBAAgB;IAChB,MAAM,OAAO,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAEnD,QAAQ;IACR,EAAE,CAAC,OAAO,CAAC;;;GAGV,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;IAEvC,OAAO,CAAC,GAAG,CAAC,8BAA8B,QAAQ,EAAE,CAAC,CAAC;AACxD,CAAC"}
|
package/dist/plugin.d.ts
CHANGED
|
@@ -1,10 +1,7 @@
|
|
|
1
|
+
import type { InternalHookHandler } from './types.js';
|
|
1
2
|
export interface OpenClawPluginContext {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
};
|
|
5
|
-
tools: {
|
|
6
|
-
register: (tool: any) => void;
|
|
7
|
-
};
|
|
3
|
+
registerHook: (events: string | string[], handler: InternalHookHandler) => void;
|
|
4
|
+
registerTool: (tool: any) => void;
|
|
8
5
|
config?: any;
|
|
9
6
|
}
|
|
10
7
|
export interface OpenClawPlugin {
|
package/dist/plugin.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEtD,MAAM,WAAW,qBAAqB;IACpC,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,OAAO,EAAE,mBAAmB,KAAK,IAAI,CAAC;IAChF,YAAY,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,CAAC;IAClC,MAAM,CAAC,EAAE,GAAG,CAAC;CACd;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,CAAC,OAAO,EAAE,qBAAqB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7D;AAED,wBAAgB,YAAY,CAAC,MAAM,CAAC,EAAE,GAAG,GAAG,cAAc,CA2DzD;;AAGD,wBAA8B"}
|
package/dist/plugin.js
CHANGED
|
@@ -8,8 +8,8 @@ export function createPlugin(config) {
|
|
|
8
8
|
const pluginConfig = getConfig(config);
|
|
9
9
|
return {
|
|
10
10
|
name: 'claw-memory',
|
|
11
|
-
version: '0.1.
|
|
12
|
-
async register(
|
|
11
|
+
version: '0.1.6',
|
|
12
|
+
async register(api) {
|
|
13
13
|
if (!pluginConfig.enabled) {
|
|
14
14
|
console.log('[ClawMemory] Plugin disabled');
|
|
15
15
|
return;
|
|
@@ -18,7 +18,7 @@ export function createPlugin(config) {
|
|
|
18
18
|
// 初始化数据库
|
|
19
19
|
const db = getDatabase(pluginConfig.dataDir + '/memory.db');
|
|
20
20
|
// 注册 message:sent hook
|
|
21
|
-
|
|
21
|
+
api.registerHook('message:sent', async (event) => {
|
|
22
22
|
if (pluginConfig.autoSave) {
|
|
23
23
|
try {
|
|
24
24
|
await handleMessageSent(event, db, pluginConfig.dataDir);
|
|
@@ -29,12 +29,13 @@ export function createPlugin(config) {
|
|
|
29
29
|
}
|
|
30
30
|
});
|
|
31
31
|
// 注册 agent:bootstrap hook
|
|
32
|
-
|
|
32
|
+
api.registerHook('agent:bootstrap', async (event) => {
|
|
33
33
|
try {
|
|
34
34
|
const summary = await handleAgentBootstrap(db);
|
|
35
|
-
if (summary) {
|
|
36
|
-
|
|
37
|
-
|
|
35
|
+
if (summary && event.context) {
|
|
36
|
+
const ctx = event.context;
|
|
37
|
+
ctx.context = ctx.context || '';
|
|
38
|
+
ctx.context += '\n\n' + summary;
|
|
38
39
|
}
|
|
39
40
|
}
|
|
40
41
|
catch (error) {
|
|
@@ -42,7 +43,7 @@ export function createPlugin(config) {
|
|
|
42
43
|
}
|
|
43
44
|
});
|
|
44
45
|
// 注册 Agent Tools
|
|
45
|
-
registerMemoryTools(
|
|
46
|
+
registerMemoryTools({ register: api.registerTool }, db, pluginConfig.dataDir);
|
|
46
47
|
// 启动 Scheduler
|
|
47
48
|
if (pluginConfig.scheduler.enabled) {
|
|
48
49
|
try {
|
package/dist/plugin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAgB,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAgB,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAepD,MAAM,UAAU,YAAY,CAAC,MAAY;IACvC,MAAM,YAAY,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;IAEvC,OAAO;QACL,IAAI,EAAE,aAAa;QACnB,OAAO,EAAE,OAAO;QAEhB,KAAK,CAAC,QAAQ,CAAC,GAA0B;YACvC,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;gBAC1B,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;gBAC5C,OAAO;YACT,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;YAExC,SAAS;YACT,MAAM,EAAE,GAAG,WAAW,CAAC,YAAY,CAAC,OAAO,GAAG,YAAY,CAAC,CAAC;YAE5D,uBAAuB;YACvB,GAAG,CAAC,YAAY,CAAC,cAAc,EAAE,KAAK,EAAE,KAAU,EAAE,EAAE;gBACpD,IAAI,YAAY,CAAC,QAAQ,EAAE,CAAC;oBAC1B,IAAI,CAAC;wBACH,MAAM,iBAAiB,CAAC,KAAK,EAAE,EAAE,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC;oBAC3D,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACf,OAAO,CAAC,KAAK,CAAC,qCAAqC,EAAE,KAAK,CAAC,CAAC;oBAC9D,CAAC;gBACH,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,0BAA0B;YAC1B,GAAG,CAAC,YAAY,CAAC,iBAAiB,EAAE,KAAK,EAAE,KAAU,EAAE,EAAE;gBACvD,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,MAAM,oBAAoB,CAAC,EAAE,CAAC,CAAC;oBAC/C,IAAI,OAAO,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;wBAC7B,MAAM,GAAG,GAAG,KAAK,CAAC,OAAkC,CAAC;wBACrD,GAAG,CAAC,OAAO,GAAI,GAAG,CAAC,OAAkB,IAAI,EAAE,CAAC;wBAC5C,GAAG,CAAC,OAAO,IAAI,MAAM,GAAG,OAAO,CAAC;oBAClC,CAAC;gBACH,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,OAAO,CAAC,KAAK,CAAC,wCAAwC,EAAE,KAAK,CAAC,CAAC;gBACjE,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,iBAAiB;YACjB,mBAAmB,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,YAAY,EAAE,EAAE,EAAE,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC;YAE9E,eAAe;YACf,IAAI,YAAY,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;gBACnC,IAAI,CAAC;oBACH,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC,EAAE,EAAE,YAAY,CAAC,SAAS,CAAC,CAAC;oBAC5D,SAAS,CAAC,KAAK,EAAE,CAAC;gBACpB,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,OAAO,CAAC,KAAK,CAAC,yCAAyC,EAAE,KAAK,CAAC,CAAC;gBAClE,CAAC;YACH,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;QACnD,CAAC;KACF,CAAC;AACJ,CAAC;AAED,qBAAqB;AACrB,eAAe,YAAY,EAAE,CAAC"}
|
package/dist/types.d.ts
CHANGED
|
@@ -2,6 +2,15 @@
|
|
|
2
2
|
* Claw-Memory Type Definitions
|
|
3
3
|
* Lightweight AI memory system for OpenClaw and Claude Code
|
|
4
4
|
*/
|
|
5
|
+
export type InternalHookHandler = (event: any) => Promise<void> | void;
|
|
6
|
+
export interface InternalHookEvent {
|
|
7
|
+
type?: string;
|
|
8
|
+
action?: string;
|
|
9
|
+
sessionKey?: string;
|
|
10
|
+
context?: Record<string, unknown>;
|
|
11
|
+
timestamp?: Date;
|
|
12
|
+
messages?: string[];
|
|
13
|
+
}
|
|
5
14
|
export interface IntegratedSummary {
|
|
6
15
|
active_areas: string[];
|
|
7
16
|
key_topics: string[];
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/openclaw.plugin.json
CHANGED
package/package.json
CHANGED
package/src/hooks/message.ts
CHANGED
|
@@ -3,53 +3,34 @@ import { v4 as uuidv4 } from 'uuid';
|
|
|
3
3
|
import * as path from 'path';
|
|
4
4
|
import * as fs from 'fs';
|
|
5
5
|
import { homedir } from 'os';
|
|
6
|
-
|
|
7
|
-
interface MessageEvent {
|
|
8
|
-
message: {
|
|
9
|
-
role: 'user' | 'assistant';
|
|
10
|
-
content: string;
|
|
11
|
-
};
|
|
12
|
-
session: {
|
|
13
|
-
id: string;
|
|
14
|
-
key: string;
|
|
15
|
-
};
|
|
16
|
-
conversation?: Array<{
|
|
17
|
-
role: 'user' | 'assistant';
|
|
18
|
-
content: string;
|
|
19
|
-
}>;
|
|
20
|
-
}
|
|
6
|
+
import type { InternalHookEvent } from '../types.js';
|
|
21
7
|
|
|
22
8
|
export async function handleMessageSent(
|
|
23
|
-
event:
|
|
9
|
+
event: InternalHookEvent,
|
|
24
10
|
db: Database,
|
|
25
11
|
dataDir: string
|
|
26
12
|
): Promise<void> {
|
|
27
|
-
//
|
|
28
|
-
if (event.
|
|
13
|
+
// 确保 context 存在
|
|
14
|
+
if (!event.context || typeof event.context !== 'object') {
|
|
29
15
|
return;
|
|
30
16
|
}
|
|
31
17
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
if (event.conversation[i].role === 'user') {
|
|
38
|
-
userMessage = event.conversation[i].content;
|
|
39
|
-
break;
|
|
40
|
-
}
|
|
41
|
-
}
|
|
18
|
+
const ctx = event.context as Record<string, unknown>;
|
|
19
|
+
|
|
20
|
+
// 只处理成功发送的消息
|
|
21
|
+
if (ctx.success !== true) {
|
|
22
|
+
return;
|
|
42
23
|
}
|
|
43
24
|
|
|
44
|
-
const assistantMessage =
|
|
25
|
+
const assistantMessage = ctx.content as string;
|
|
45
26
|
|
|
46
|
-
if (!
|
|
47
|
-
console.log('[ClawMemory] Skipping - no
|
|
27
|
+
if (!assistantMessage) {
|
|
28
|
+
console.log('[ClawMemory] Skipping - no message content');
|
|
48
29
|
return;
|
|
49
30
|
}
|
|
50
31
|
|
|
51
|
-
// 构建 Q&A
|
|
52
|
-
const qaContent = `
|
|
32
|
+
// 构建 Q&A(简化版,只保存AI回复)
|
|
33
|
+
const qaContent = `A: ${assistantMessage}`;
|
|
53
34
|
|
|
54
35
|
// 解析 dataDir 中的 ~
|
|
55
36
|
const resolvedDataDir = dataDir.replace(/^~/, homedir());
|
package/src/plugin.ts
CHANGED
|
@@ -4,14 +4,11 @@ import { handleMessageSent } from './hooks/message.js';
|
|
|
4
4
|
import { handleAgentBootstrap } from './hooks/bootstrap.js';
|
|
5
5
|
import { registerMemoryTools } from './tools/memory.js';
|
|
6
6
|
import { Scheduler } from './services/scheduler.js';
|
|
7
|
+
import type { InternalHookHandler } from './types.js';
|
|
7
8
|
|
|
8
9
|
export interface OpenClawPluginContext {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
};
|
|
12
|
-
tools: {
|
|
13
|
-
register: (tool: any) => void;
|
|
14
|
-
};
|
|
10
|
+
registerHook: (events: string | string[], handler: InternalHookHandler) => void;
|
|
11
|
+
registerTool: (tool: any) => void;
|
|
15
12
|
config?: any;
|
|
16
13
|
}
|
|
17
14
|
|
|
@@ -26,9 +23,9 @@ export function createPlugin(config?: any): OpenClawPlugin {
|
|
|
26
23
|
|
|
27
24
|
return {
|
|
28
25
|
name: 'claw-memory',
|
|
29
|
-
version: '0.1.
|
|
26
|
+
version: '0.1.6',
|
|
30
27
|
|
|
31
|
-
async register(
|
|
28
|
+
async register(api: OpenClawPluginContext) {
|
|
32
29
|
if (!pluginConfig.enabled) {
|
|
33
30
|
console.log('[ClawMemory] Plugin disabled');
|
|
34
31
|
return;
|
|
@@ -40,7 +37,7 @@ export function createPlugin(config?: any): OpenClawPlugin {
|
|
|
40
37
|
const db = getDatabase(pluginConfig.dataDir + '/memory.db');
|
|
41
38
|
|
|
42
39
|
// 注册 message:sent hook
|
|
43
|
-
|
|
40
|
+
api.registerHook('message:sent', async (event: any) => {
|
|
44
41
|
if (pluginConfig.autoSave) {
|
|
45
42
|
try {
|
|
46
43
|
await handleMessageSent(event, db, pluginConfig.dataDir);
|
|
@@ -51,12 +48,13 @@ export function createPlugin(config?: any): OpenClawPlugin {
|
|
|
51
48
|
});
|
|
52
49
|
|
|
53
50
|
// 注册 agent:bootstrap hook
|
|
54
|
-
|
|
51
|
+
api.registerHook('agent:bootstrap', async (event: any) => {
|
|
55
52
|
try {
|
|
56
53
|
const summary = await handleAgentBootstrap(db);
|
|
57
|
-
if (summary) {
|
|
58
|
-
|
|
59
|
-
|
|
54
|
+
if (summary && event.context) {
|
|
55
|
+
const ctx = event.context as Record<string, unknown>;
|
|
56
|
+
ctx.context = (ctx.context as string) || '';
|
|
57
|
+
ctx.context += '\n\n' + summary;
|
|
60
58
|
}
|
|
61
59
|
} catch (error) {
|
|
62
60
|
console.error('[ClawMemory] Failed to inject summary:', error);
|
|
@@ -64,7 +62,7 @@ export function createPlugin(config?: any): OpenClawPlugin {
|
|
|
64
62
|
});
|
|
65
63
|
|
|
66
64
|
// 注册 Agent Tools
|
|
67
|
-
registerMemoryTools(
|
|
65
|
+
registerMemoryTools({ register: api.registerTool }, db, pluginConfig.dataDir);
|
|
68
66
|
|
|
69
67
|
// 启动 Scheduler
|
|
70
68
|
if (pluginConfig.scheduler.enabled) {
|
package/src/types.ts
CHANGED
|
@@ -3,6 +3,18 @@
|
|
|
3
3
|
* Lightweight AI memory system for OpenClaw and Claude Code
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
+
export type InternalHookHandler = (event: any) => Promise<void> | void;
|
|
7
|
+
|
|
8
|
+
// OpenClaw InternalHookEvent 结构
|
|
9
|
+
export interface InternalHookEvent {
|
|
10
|
+
type?: string;
|
|
11
|
+
action?: string;
|
|
12
|
+
sessionKey?: string;
|
|
13
|
+
context?: Record<string, unknown>;
|
|
14
|
+
timestamp?: Date;
|
|
15
|
+
messages?: string[];
|
|
16
|
+
}
|
|
17
|
+
|
|
6
18
|
export interface IntegratedSummary {
|
|
7
19
|
active_areas: string[];
|
|
8
20
|
key_topics: string[];
|