@clude/sdk 3.0.1

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.
@@ -0,0 +1,268 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // packages/brain/src/mcp/local-store.ts
21
+ var local_store_exports = {};
22
+ __export(local_store_exports, {
23
+ localClinamen: () => localClinamen,
24
+ localDelete: () => localDelete,
25
+ localList: () => localList,
26
+ localRecall: () => localRecall,
27
+ localStats: () => localStats,
28
+ localStore: () => localStore,
29
+ localUpdate: () => localUpdate
30
+ });
31
+ module.exports = __toCommonJS(local_store_exports);
32
+ var import_fs = require("fs");
33
+ var import_path = require("path");
34
+ var CLUDE_DIR = (0, import_path.join)(process.env.HOME || process.env.USERPROFILE || ".", ".clude");
35
+ var MEMORIES_FILE = (0, import_path.join)(CLUDE_DIR, "memories.json");
36
+ function ensureDir() {
37
+ if (!(0, import_fs.existsSync)(CLUDE_DIR)) {
38
+ (0, import_fs.mkdirSync)(CLUDE_DIR, { recursive: true });
39
+ }
40
+ }
41
+ function loadStore() {
42
+ ensureDir();
43
+ if (!(0, import_fs.existsSync)(MEMORIES_FILE)) {
44
+ return { version: 1, next_id: 1, memories: [] };
45
+ }
46
+ try {
47
+ const raw = (0, import_fs.readFileSync)(MEMORIES_FILE, "utf-8");
48
+ const data = JSON.parse(raw);
49
+ if (!data || !Array.isArray(data.memories)) {
50
+ console.error("[clude-local] Warning: memories.json has invalid structure, starting fresh. Backup saved.");
51
+ try {
52
+ (0, import_fs.writeFileSync)(MEMORIES_FILE + ".bak", raw);
53
+ } catch {
54
+ }
55
+ return { version: 1, next_id: 1, memories: [] };
56
+ }
57
+ return data;
58
+ } catch (err) {
59
+ console.error("[clude-local] Warning: failed to parse memories.json:", err.message);
60
+ try {
61
+ const raw = (0, import_fs.readFileSync)(MEMORIES_FILE, "utf-8");
62
+ (0, import_fs.writeFileSync)(MEMORIES_FILE + ".bak", raw);
63
+ console.error("[clude-local] Backup saved to memories.json.bak");
64
+ } catch {
65
+ }
66
+ return { version: 1, next_id: 1, memories: [] };
67
+ }
68
+ }
69
+ function saveStore(store) {
70
+ ensureDir();
71
+ const tmpFile = MEMORIES_FILE + ".tmp";
72
+ (0, import_fs.writeFileSync)(tmpFile, JSON.stringify(store, null, 2));
73
+ (0, import_fs.renameSync)(tmpFile, MEMORIES_FILE);
74
+ }
75
+ function scoreRelevance(query, memory) {
76
+ const queryTerms = query.toLowerCase().split(/\s+/).filter((t) => t.length > 2);
77
+ if (queryTerms.length === 0) return 0.5;
78
+ const text = `${memory.summary} ${memory.content} ${memory.tags.join(" ")}`.toLowerCase();
79
+ let matches = 0;
80
+ for (const term of queryTerms) {
81
+ if (text.includes(term)) matches++;
82
+ }
83
+ const termScore = queryTerms.length > 0 ? matches / queryTerms.length : 0;
84
+ const recency = Math.max(0, 1 - (Date.now() - new Date(memory.created_at).getTime()) / (30 * 864e5));
85
+ const score = termScore * 0.6 + memory.importance * 0.2 + memory.decay_factor * 0.1 + recency * 0.1;
86
+ return Math.min(1, score);
87
+ }
88
+ function localRecall(opts) {
89
+ const store = loadStore();
90
+ let results = store.memories;
91
+ if (opts.memory_types?.length) {
92
+ results = results.filter((m) => opts.memory_types.includes(m.memory_type));
93
+ }
94
+ if (opts.tags?.length) {
95
+ results = results.filter((m) => m.tags.some((t) => opts.tags.includes(t)));
96
+ }
97
+ if (opts.min_importance !== void 0) {
98
+ results = results.filter((m) => m.importance >= opts.min_importance);
99
+ }
100
+ if (opts.min_decay !== void 0) {
101
+ results = results.filter((m) => m.decay_factor >= opts.min_decay);
102
+ }
103
+ if (opts.related_user) {
104
+ results = results.filter((m) => m.related_user === opts.related_user);
105
+ }
106
+ if (opts.related_wallet) {
107
+ results = results.filter((m) => m.related_wallet === opts.related_wallet);
108
+ }
109
+ if (opts.query) {
110
+ results = results.map((m) => ({ ...m, _score: scoreRelevance(opts.query, m) })).filter((m) => m._score > 0.1).sort((a, b) => b._score - a._score);
111
+ } else {
112
+ results = results.sort((a, b) => new Date(b.created_at).getTime() - new Date(a.created_at).getTime());
113
+ }
114
+ const limit = opts.limit || 5;
115
+ const returned = results.slice(0, limit);
116
+ for (const r of returned) {
117
+ const mem = store.memories.find((m) => m.id === r.id);
118
+ if (mem) {
119
+ mem.access_count++;
120
+ mem.last_accessed = (/* @__PURE__ */ new Date()).toISOString();
121
+ mem.importance = Math.min(1, mem.importance + 0.01);
122
+ }
123
+ }
124
+ saveStore(store);
125
+ return returned;
126
+ }
127
+ function localStore(opts) {
128
+ const store = loadStore();
129
+ const now = (/* @__PURE__ */ new Date()).toISOString();
130
+ const id = store.next_id++;
131
+ store.memories.push({
132
+ id,
133
+ memory_type: opts.type,
134
+ content: opts.content,
135
+ summary: opts.summary,
136
+ tags: opts.tags || [],
137
+ concepts: opts.concepts || [],
138
+ importance: opts.importance ?? 0.5,
139
+ decay_factor: 1,
140
+ access_count: 0,
141
+ emotional_valence: opts.emotional_valence ?? 0,
142
+ source: opts.source,
143
+ source_id: opts.source_id,
144
+ related_user: opts.related_user,
145
+ related_wallet: opts.related_wallet,
146
+ metadata: opts.metadata || {},
147
+ created_at: now,
148
+ last_accessed: now
149
+ });
150
+ saveStore(store);
151
+ return id;
152
+ }
153
+ function localStats() {
154
+ const store = loadStore();
155
+ const memories = store.memories;
156
+ const byType = {};
157
+ let totalImportance = 0;
158
+ let totalDecay = 0;
159
+ const tagCounts = {};
160
+ const sourceCounts = {};
161
+ let oldest = "";
162
+ let newest = "";
163
+ let mostAccessed = null;
164
+ for (const m of memories) {
165
+ byType[m.memory_type] = (byType[m.memory_type] || 0) + 1;
166
+ totalImportance += m.importance;
167
+ totalDecay += m.decay_factor;
168
+ for (const t of m.tags) {
169
+ tagCounts[t] = (tagCounts[t] || 0) + 1;
170
+ }
171
+ if (m.source) {
172
+ sourceCounts[m.source] = (sourceCounts[m.source] || 0) + 1;
173
+ }
174
+ if (!oldest || m.created_at < oldest) oldest = m.created_at;
175
+ if (!newest || m.created_at > newest) newest = m.created_at;
176
+ if (!mostAccessed || m.access_count > mostAccessed.access_count) {
177
+ mostAccessed = { summary: m.summary, access_count: m.access_count };
178
+ }
179
+ }
180
+ const topTags = Object.entries(tagCounts).sort(([, a], [, b]) => b - a).slice(0, 10).map(([tag, count]) => ({ tag, count }));
181
+ return {
182
+ status: "active",
183
+ mode: "local",
184
+ storage: MEMORIES_FILE,
185
+ total_memories: memories.length,
186
+ by_type: byType,
187
+ avg_importance: memories.length > 0 ? +(totalImportance / memories.length).toFixed(3) : 0,
188
+ avg_decay: memories.length > 0 ? +(totalDecay / memories.length).toFixed(3) : 0,
189
+ top_tags: topTags,
190
+ sources: sourceCounts,
191
+ oldest_memory: oldest || null,
192
+ newest_memory: newest || null,
193
+ most_accessed: mostAccessed
194
+ };
195
+ }
196
+ function localClinamen(opts) {
197
+ const store = loadStore();
198
+ const minImp = opts.min_importance ?? 0.6;
199
+ const maxRel = opts.max_relevance ?? 0.35;
200
+ const limit = opts.limit ?? 3;
201
+ let candidates = store.memories.filter((m) => m.importance >= minImp);
202
+ if (opts.memory_types?.length) {
203
+ candidates = candidates.filter((m) => opts.memory_types.includes(m.memory_type));
204
+ }
205
+ const contextTerms = opts.context.toLowerCase().split(/\s+/).filter((t) => t.length > 2);
206
+ const scored = candidates.map((m) => {
207
+ const text = `${m.summary} ${m.content}`.toLowerCase();
208
+ let matches = 0;
209
+ for (const term of contextTerms) {
210
+ if (text.includes(term)) matches++;
211
+ }
212
+ const relevance = contextTerms.length > 0 ? matches / contextTerms.length : 0;
213
+ const divergence = m.importance * (1 - relevance);
214
+ return { ...m, _divergence: divergence, _relevanceSim: relevance };
215
+ });
216
+ return scored.filter((m) => m._relevanceSim < maxRel).sort((a, b) => b._divergence - a._divergence).slice(0, limit);
217
+ }
218
+ function localDelete(id) {
219
+ const store = loadStore();
220
+ const idx = store.memories.findIndex((m) => m.id === id);
221
+ if (idx === -1) return false;
222
+ store.memories.splice(idx, 1);
223
+ saveStore(store);
224
+ return true;
225
+ }
226
+ function localUpdate(id, patches) {
227
+ const store = loadStore();
228
+ const mem = store.memories.find((m) => m.id === id);
229
+ if (!mem) return false;
230
+ if (patches.summary !== void 0) mem.summary = patches.summary;
231
+ if (patches.content !== void 0) mem.content = patches.content;
232
+ if (patches.tags !== void 0) mem.tags = patches.tags;
233
+ if (patches.importance !== void 0) mem.importance = Math.max(0, Math.min(1, patches.importance));
234
+ if (patches.memory_type !== void 0) mem.memory_type = patches.memory_type;
235
+ saveStore(store);
236
+ return true;
237
+ }
238
+ function localList(opts) {
239
+ const store = loadStore();
240
+ let memories = [...store.memories];
241
+ if (opts.memory_type) {
242
+ memories = memories.filter((m) => m.memory_type === opts.memory_type);
243
+ }
244
+ if (opts.min_importance !== void 0) {
245
+ memories = memories.filter((m) => m.importance >= opts.min_importance);
246
+ }
247
+ const order = opts.order ?? "created_at";
248
+ memories.sort((a, b) => {
249
+ if (order === "importance") return b.importance - a.importance;
250
+ if (order === "last_accessed") return b.last_accessed.localeCompare(a.last_accessed);
251
+ return b.created_at.localeCompare(a.created_at);
252
+ });
253
+ const total = memories.length;
254
+ const pageSize = Math.min(opts.page_size ?? 20, 100);
255
+ const page = Math.max(opts.page ?? 1, 1);
256
+ const start = (page - 1) * pageSize;
257
+ return { memories: memories.slice(start, start + pageSize), total };
258
+ }
259
+ // Annotate the CommonJS export names for ESM import in node:
260
+ 0 && (module.exports = {
261
+ localClinamen,
262
+ localDelete,
263
+ localList,
264
+ localRecall,
265
+ localStats,
266
+ localStore,
267
+ localUpdate
268
+ });