@mrc2204/agent-smart-memo 4.1.2 → 5.0.0

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 (57) hide show
  1. package/README.md +317 -135
  2. package/dist/adapters/openclaw/tool-runtime.d.ts +29 -0
  3. package/dist/adapters/openclaw/tool-runtime.d.ts.map +1 -0
  4. package/dist/adapters/openclaw/tool-runtime.js +48 -0
  5. package/dist/adapters/openclaw/tool-runtime.js.map +1 -0
  6. package/dist/core/contracts/adapter-contracts.d.ts +31 -0
  7. package/dist/core/contracts/adapter-contracts.d.ts.map +1 -0
  8. package/dist/core/contracts/adapter-contracts.js +2 -0
  9. package/dist/core/contracts/adapter-contracts.js.map +1 -0
  10. package/dist/core/runtime-boundary.d.ts +23 -0
  11. package/dist/core/runtime-boundary.d.ts.map +1 -0
  12. package/dist/core/runtime-boundary.js +39 -0
  13. package/dist/core/runtime-boundary.js.map +1 -0
  14. package/dist/core/usecases/default-memory-usecase-port.d.ts +21 -0
  15. package/dist/core/usecases/default-memory-usecase-port.d.ts.map +1 -0
  16. package/dist/core/usecases/default-memory-usecase-port.js +263 -0
  17. package/dist/core/usecases/default-memory-usecase-port.js.map +1 -0
  18. package/dist/core/usecases/semantic-memory-usecase.d.ts +52 -0
  19. package/dist/core/usecases/semantic-memory-usecase.d.ts.map +1 -0
  20. package/dist/core/usecases/semantic-memory-usecase.js +136 -0
  21. package/dist/core/usecases/semantic-memory-usecase.js.map +1 -0
  22. package/dist/hooks/tool-context-injector.d.ts +9 -0
  23. package/dist/hooks/tool-context-injector.d.ts.map +1 -0
  24. package/dist/hooks/tool-context-injector.js +55 -0
  25. package/dist/hooks/tool-context-injector.js.map +1 -0
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +30 -10
  28. package/dist/index.js.map +1 -1
  29. package/dist/tools/graph-tools.d.ts +2 -0
  30. package/dist/tools/graph-tools.d.ts.map +1 -1
  31. package/dist/tools/graph-tools.js +126 -177
  32. package/dist/tools/graph-tools.js.map +1 -1
  33. package/dist/tools/semantic-memory-tools.d.ts +8 -0
  34. package/dist/tools/semantic-memory-tools.d.ts.map +1 -0
  35. package/dist/tools/semantic-memory-tools.js +111 -0
  36. package/dist/tools/semantic-memory-tools.js.map +1 -0
  37. package/dist/tools/slot-tools.d.ts +3 -1
  38. package/dist/tools/slot-tools.d.ts.map +1 -1
  39. package/dist/tools/slot-tools.js +82 -156
  40. package/dist/tools/slot-tools.js.map +1 -1
  41. package/package.json +25 -32
  42. package/dist/config.d.ts +0 -62
  43. package/dist/config.d.ts.map +0 -1
  44. package/dist/config.js +0 -102
  45. package/dist/config.js.map +0 -1
  46. package/dist/scripts/reembed-collection.d.ts +0 -2
  47. package/dist/scripts/reembed-collection.d.ts.map +0 -1
  48. package/dist/scripts/reembed-collection.js +0 -165
  49. package/dist/scripts/reembed-collection.js.map +0 -1
  50. package/dist/tools/memory_search.d.ts +0 -89
  51. package/dist/tools/memory_search.d.ts.map +0 -1
  52. package/dist/tools/memory_search.js +0 -188
  53. package/dist/tools/memory_search.js.map +0 -1
  54. package/dist/tools/memory_store.d.ts +0 -65
  55. package/dist/tools/memory_store.d.ts.map +0 -1
  56. package/dist/tools/memory_store.js +0 -196
  57. package/dist/tools/memory_store.js.map +0 -1
@@ -1,65 +0,0 @@
1
- import { QdrantClient } from "../services/qdrant.js";
2
- import { EmbeddingClient } from "../services/embedding.js";
3
- import { DeduplicationService } from "../services/dedupe.js";
4
- import { StoreParams, ToolResult, MemoryNamespace } from "../types.js";
5
- export declare const memoryStoreSchema: {
6
- type: string;
7
- properties: {
8
- text: {
9
- type: string;
10
- description: string;
11
- };
12
- namespace: {
13
- type: string;
14
- description: string;
15
- };
16
- sessionId: {
17
- type: string;
18
- description: string;
19
- };
20
- userId: {
21
- type: string;
22
- description: string;
23
- };
24
- metadata: {
25
- type: string;
26
- description: string;
27
- };
28
- };
29
- required: string[];
30
- };
31
- export declare function createMemoryStoreTool(qdrant: QdrantClient, embedding: EmbeddingClient, dedupe: DeduplicationService, defaultNamespace: MemoryNamespace): {
32
- name: string;
33
- label: string;
34
- description: string;
35
- parameters: {
36
- type: string;
37
- properties: {
38
- text: {
39
- type: string;
40
- description: string;
41
- };
42
- namespace: {
43
- type: string;
44
- description: string;
45
- };
46
- sessionId: {
47
- type: string;
48
- description: string;
49
- };
50
- userId: {
51
- type: string;
52
- description: string;
53
- };
54
- metadata: {
55
- type: string;
56
- description: string;
57
- };
58
- };
59
- required: string[];
60
- };
61
- execute(_id: string, params: StoreParams & {
62
- agentId?: string;
63
- }, _signal?: AbortSignal): Promise<ToolResult>;
64
- };
65
- //# sourceMappingURL=memory_store.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"memory_store.d.ts","sourceRoot":"","sources":["../../src/tools/memory_store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,UAAU,EAAS,eAAe,EAAE,MAAM,aAAa,CAAC;AAyB9E,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;CAyB7B,CAAC;AAEF,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,YAAY,EACpB,SAAS,EAAE,eAAe,EAC1B,MAAM,EAAE,oBAAoB,EAC5B,gBAAgB,EAAE,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAcxB,MAAM,UACH,WAAW,GAAG;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,YAChC,WAAW,GACpB,OAAO,CAAC,UAAU,CAAC;EAwJzB"}
@@ -1,196 +0,0 @@
1
- import { normalizeNamespace, parseExplicitNamespace, toCoreAgent, evaluateNoiseV2 } from "../shared/memory-config.js";
2
- function resolveAgentFromRuntimeParams(params) {
3
- const directAgentId = typeof params.agentId === "string" ? params.agentId.trim() : "";
4
- if (directAgentId)
5
- return toCoreAgent(directAgentId);
6
- const sessionId = typeof params.sessionId === "string" ? params.sessionId.trim() : "";
7
- if (sessionId) {
8
- const parts = sessionId.split(":");
9
- if (parts.length >= 2 && parts[0] === "agent") {
10
- const fromSession = parts[1]?.trim();
11
- if (fromSession)
12
- return toCoreAgent(fromSession);
13
- }
14
- }
15
- const namespace = typeof params.namespace === "string" ? params.namespace.trim() : "";
16
- const nsMatch = /^agent\.([a-z0-9][a-z0-9_-]*)\.(working_memory|lessons|decisions)$/i.exec(namespace);
17
- if (nsMatch?.[1]) {
18
- return toCoreAgent(nsMatch[1]);
19
- }
20
- return "assistant";
21
- }
22
- export const memoryStoreSchema = {
23
- type: "object",
24
- properties: {
25
- text: {
26
- type: "string",
27
- description: "The content to remember",
28
- },
29
- namespace: {
30
- type: "string",
31
- description: "Namespace for organization (default: 'shared.project_context')",
32
- },
33
- sessionId: {
34
- type: "string",
35
- description: "Optional session ID for context isolation",
36
- },
37
- userId: {
38
- type: "string",
39
- description: "Optional user ID for multi-user systems",
40
- },
41
- metadata: {
42
- type: "object",
43
- description: "Additional metadata to store",
44
- },
45
- },
46
- required: ["text"],
47
- };
48
- export function createMemoryStoreTool(qdrant, embedding, dedupe, defaultNamespace) {
49
- const createDetails = (text, extra = {}) => ({
50
- ...extra,
51
- toolResult: { text },
52
- });
53
- return {
54
- name: "memory_store",
55
- label: "Memory Store",
56
- description: "Store a memory in the vector database. Automatically deduplicates similar content.",
57
- parameters: memoryStoreSchema,
58
- async execute(_id, params, _signal) {
59
- try {
60
- // Validate
61
- if (!params.text || typeof params.text !== "string") {
62
- return {
63
- content: [{ type: "text", text: "Error: text is required" }],
64
- isError: true,
65
- details: createDetails("Error: text is required", { error: "Missing text parameter" }),
66
- };
67
- }
68
- const text = params.text.trim();
69
- if (text.length === 0) {
70
- return {
71
- content: [{ type: "text", text: "Error: text cannot be empty" }],
72
- isError: true,
73
- details: createDetails("Error: text cannot be empty", { error: "Empty text" }),
74
- };
75
- }
76
- if (text.length > 10000) {
77
- return {
78
- content: [{ type: "text", text: "Error: text exceeds 10000 character limit" }],
79
- isError: true,
80
- details: createDetails("Error: text exceeds 10000 character limit", { error: "Text too long", length: text.length }),
81
- };
82
- }
83
- // Namespace router + normalization policy (ASM-5)
84
- const sourceAgent = resolveAgentFromRuntimeParams(params);
85
- const requestedNamespace = typeof params.namespace === "string" && params.namespace.trim().length > 0
86
- ? params.namespace
87
- : `agent.${sourceAgent}.working_memory`;
88
- let namespace = typeof params.namespace === "string" && params.namespace.trim().length > 0
89
- ? parseExplicitNamespace(requestedNamespace, sourceAgent)
90
- : normalizeNamespace(requestedNamespace, sourceAgent);
91
- // Noise policy v2: quarantine noisy content into noise.filtered
92
- const noise = evaluateNoiseV2(text, "tool_call");
93
- if (noise.isNoise) {
94
- namespace = "noise.filtered";
95
- }
96
- // Generate embedding (chunking + weighted average)
97
- const embeddingResult = typeof embedding.embedDetailed === "function"
98
- ? await embedding.embedDetailed(text)
99
- : {
100
- vector: await embedding.embed(text),
101
- metadata: {
102
- embedding_chunked: false,
103
- embedding_chunks_count: 1,
104
- embedding_chunking_strategy: "array_batch_weighted_avg",
105
- embedding_model: "unknown",
106
- embedding_model_key: "unknown",
107
- embedding_provider: "auto",
108
- embedding_max_tokens: 0,
109
- embedding_safe_chunk_tokens: 0,
110
- embedding_source: "docs",
111
- embedding_fallback_hash: false,
112
- },
113
- };
114
- const vector = embeddingResult.vector;
115
- // Check for duplicates
116
- const candidates = await qdrant.search(vector, 5, {
117
- must: [
118
- { key: "namespace", match: { value: namespace } },
119
- ],
120
- });
121
- const duplicateId = dedupe.findDuplicate(text, candidates);
122
- if (duplicateId) {
123
- // Update existing memory
124
- const point = {
125
- id: duplicateId,
126
- vector,
127
- payload: {
128
- text,
129
- namespace,
130
- agent: sourceAgent,
131
- source_agent: sourceAgent,
132
- source_type: "tool_call",
133
- sessionId: params.sessionId || null,
134
- userId: params.userId || null,
135
- metadata: {
136
- ...(params.metadata || {}),
137
- ...embeddingResult.metadata,
138
- noise_score: noise.score,
139
- noise_matched_patterns: noise.matchedPatterns,
140
- },
141
- ...embeddingResult.metadata,
142
- timestamp: Date.now(),
143
- noise_score: noise.score,
144
- updatedAt: Date.now(),
145
- },
146
- };
147
- await qdrant.upsert([point]);
148
- const textOut = `Memory updated (duplicate detected, ID: ${duplicateId})`;
149
- return {
150
- content: [{ type: "text", text: textOut }],
151
- details: createDetails(textOut, { id: duplicateId, updated: true }),
152
- };
153
- }
154
- // Create new memory with UUID v4
155
- const id = crypto.randomUUID();
156
- const point = {
157
- id,
158
- vector,
159
- payload: {
160
- text,
161
- namespace,
162
- agent: sourceAgent,
163
- source_agent: sourceAgent,
164
- source_type: "tool_call",
165
- sessionId: params.sessionId || null,
166
- userId: params.userId || null,
167
- metadata: {
168
- ...(params.metadata || {}),
169
- ...embeddingResult.metadata,
170
- noise_score: noise.score,
171
- noise_matched_patterns: noise.matchedPatterns,
172
- },
173
- ...embeddingResult.metadata,
174
- timestamp: Date.now(),
175
- noise_score: noise.score,
176
- },
177
- };
178
- await qdrant.upsert([point]);
179
- const textOut = `Memory stored successfully (ID: ${id})`;
180
- return {
181
- content: [{ type: "text", text: textOut }],
182
- details: createDetails(textOut, { id, created: true }),
183
- };
184
- }
185
- catch (error) {
186
- const textOut = `Error storing memory: ${error.message}`;
187
- return {
188
- content: [{ type: "text", text: textOut }],
189
- isError: true,
190
- details: createDetails(textOut, { error: error.message }),
191
- };
192
- }
193
- },
194
- };
195
- }
196
- //# sourceMappingURL=memory_store.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"memory_store.js","sourceRoot":"","sources":["../../src/tools/memory_store.ts"],"names":[],"mappings":"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"}