openclawdreams 3.0.6 → 3.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.
- package/CHANGELOG.md +13 -0
- package/dist/bin/openclawdreams.d.ts +3 -0
- package/dist/bin/openclawdreams.d.ts.map +1 -0
- package/dist/bin/openclawdreams.js +4 -0
- package/dist/bin/openclawdreams.js.map +1 -0
- package/dist/src/backfill.d.ts +2 -0
- package/dist/src/backfill.d.ts.map +1 -0
- package/dist/src/backfill.js +63 -0
- package/dist/src/backfill.js.map +1 -0
- package/dist/src/budget.d.ts +28 -0
- package/dist/src/budget.d.ts.map +1 -0
- package/dist/src/budget.js +117 -0
- package/dist/src/budget.js.map +1 -0
- package/dist/src/cli.d.ts +19 -0
- package/dist/src/cli.d.ts.map +1 -0
- package/dist/src/cli.js +584 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/config.d.ts +76 -0
- package/dist/src/config.d.ts.map +1 -0
- package/dist/src/config.js +178 -0
- package/dist/src/config.js.map +1 -0
- package/dist/src/crypto.d.ts +19 -0
- package/dist/src/crypto.d.ts.map +1 -0
- package/dist/src/crypto.js +70 -0
- package/dist/src/crypto.js.map +1 -0
- package/dist/src/dreamer.d.ts +78 -0
- package/dist/src/dreamer.d.ts.map +1 -0
- package/dist/src/dreamer.js +626 -0
- package/dist/src/dreamer.js.map +1 -0
- package/dist/src/entropy.d.ts +23 -0
- package/dist/src/entropy.d.ts.map +1 -0
- package/dist/src/entropy.js +188 -0
- package/dist/src/entropy.js.map +1 -0
- package/dist/src/filter.d.ts +30 -0
- package/dist/src/filter.d.ts.map +1 -0
- package/dist/src/filter.js +124 -0
- package/dist/src/filter.js.map +1 -0
- package/dist/src/identity.d.ts +29 -0
- package/dist/src/identity.d.ts.map +1 -0
- package/dist/src/identity.js +83 -0
- package/dist/src/identity.js.map +1 -0
- package/dist/src/index.d.ts +14 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +463 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/ingestion.d.ts +22 -0
- package/dist/src/ingestion.d.ts.map +1 -0
- package/dist/src/ingestion.js +101 -0
- package/dist/src/ingestion.js.map +1 -0
- package/dist/src/instrumentation.d.ts +66 -0
- package/dist/src/instrumentation.d.ts.map +1 -0
- package/dist/src/instrumentation.js +112 -0
- package/dist/src/instrumentation.js.map +1 -0
- package/dist/src/llm.d.ts +26 -0
- package/dist/src/llm.d.ts.map +1 -0
- package/dist/src/llm.js +40 -0
- package/dist/src/llm.js.map +1 -0
- package/dist/src/logger.d.ts +6 -0
- package/dist/src/logger.d.ts.map +1 -0
- package/dist/src/logger.js +32 -0
- package/dist/src/logger.js.map +1 -0
- package/dist/src/memory.d.ts +96 -0
- package/dist/src/memory.d.ts.map +1 -0
- package/dist/src/memory.js +467 -0
- package/dist/src/memory.js.map +1 -0
- package/dist/src/meta-loop.d.ts +23 -0
- package/dist/src/meta-loop.d.ts.map +1 -0
- package/dist/src/meta-loop.js +72 -0
- package/dist/src/meta-loop.js.map +1 -0
- package/dist/src/moltbook-search.d.ts +23 -0
- package/dist/src/moltbook-search.d.ts.map +1 -0
- package/dist/src/moltbook-search.js +85 -0
- package/dist/src/moltbook-search.js.map +1 -0
- package/dist/src/moltbook.d.ts +34 -0
- package/dist/src/moltbook.d.ts.map +1 -0
- package/dist/src/moltbook.js +192 -0
- package/dist/src/moltbook.js.map +1 -0
- package/dist/src/nightmare.d.ts +11 -0
- package/dist/src/nightmare.d.ts.map +1 -0
- package/dist/src/nightmare.js +128 -0
- package/dist/src/nightmare.js.map +1 -0
- package/dist/src/notify.d.ts +20 -0
- package/dist/src/notify.d.ts.map +1 -0
- package/dist/src/notify.js +95 -0
- package/dist/src/notify.js.map +1 -0
- package/dist/src/persona.d.ts +30 -0
- package/dist/src/persona.d.ts.map +1 -0
- package/dist/src/persona.js +292 -0
- package/dist/src/persona.js.map +1 -0
- package/dist/src/reflection.d.ts +26 -0
- package/dist/src/reflection.d.ts.map +1 -0
- package/dist/src/reflection.js +127 -0
- package/dist/src/reflection.js.map +1 -0
- package/dist/src/rhythm.d.ts +19 -0
- package/dist/src/rhythm.d.ts.map +1 -0
- package/dist/src/rhythm.js +130 -0
- package/dist/src/rhythm.js.map +1 -0
- package/dist/src/state.d.ts +7 -0
- package/dist/src/state.d.ts.map +1 -0
- package/dist/src/state.js +40 -0
- package/dist/src/state.js.map +1 -0
- package/dist/src/synthesis.d.ts +29 -0
- package/dist/src/synthesis.d.ts.map +1 -0
- package/dist/src/synthesis.js +144 -0
- package/dist/src/synthesis.js.map +1 -0
- package/dist/src/topics.d.ts +19 -0
- package/dist/src/topics.d.ts.map +1 -0
- package/dist/src/topics.js +84 -0
- package/dist/src/topics.js.map +1 -0
- package/dist/src/types.d.ts +253 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +5 -0
- package/dist/src/types.js.map +1 -0
- package/dist/src/vocabulary.d.ts +18 -0
- package/dist/src/vocabulary.d.ts.map +1 -0
- package/dist/src/vocabulary.js +121 -0
- package/dist/src/vocabulary.js.map +1 -0
- package/dist/src/waking.d.ts +27 -0
- package/dist/src/waking.d.ts.map +1 -0
- package/dist/src/waking.js +188 -0
- package/dist/src/waking.js.map +1 -0
- package/dist/src/web-search.d.ts +23 -0
- package/dist/src/web-search.d.ts.map +1 -0
- package/dist/src/web-search.js +64 -0
- package/dist/src/web-search.js.map +1 -0
- package/openclaw.plugin.json +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,467 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Encrypted deep memory system.
|
|
3
|
+
*
|
|
4
|
+
* All memories are encrypted with AES-256-GCM in a SQLite database.
|
|
5
|
+
* The waking agent writes to deep memory but cannot read it — only
|
|
6
|
+
* the dream process can decrypt. Context for LLM prompts is formatted
|
|
7
|
+
* via `formatDeepMemoryContext()`.
|
|
8
|
+
*/
|
|
9
|
+
import { createHash } from "node:crypto";
|
|
10
|
+
import Database from "better-sqlite3";
|
|
11
|
+
import { getCipher } from "./crypto.js";
|
|
12
|
+
import { getDeepMemoryDb, DEEP_MEMORY_CONTEXT_TOKENS } from "./config.js";
|
|
13
|
+
/**
|
|
14
|
+
* Normalize a decrypted payload into a MemoryEntry.
|
|
15
|
+
* Handles backward compatibility with legacy plain-object entries
|
|
16
|
+
* that have `summary` and `file_diffs` as flat fields.
|
|
17
|
+
*/
|
|
18
|
+
function normalizeMemoryEntry(raw, rowTimestamp) {
|
|
19
|
+
// Already a MemoryEntry (has text_summary)
|
|
20
|
+
if (typeof raw === "object" &&
|
|
21
|
+
raw !== null &&
|
|
22
|
+
typeof raw.text_summary === "string") {
|
|
23
|
+
return raw;
|
|
24
|
+
}
|
|
25
|
+
// Plain string (very old format)
|
|
26
|
+
if (typeof raw === "string") {
|
|
27
|
+
return { text_summary: raw, timestamp: Date.parse(rowTimestamp) || Date.now() };
|
|
28
|
+
}
|
|
29
|
+
// Legacy object with `summary` field
|
|
30
|
+
const obj = raw;
|
|
31
|
+
const textSummary = typeof obj.summary === "string" ? obj.summary : JSON.stringify(obj).slice(0, 500);
|
|
32
|
+
const entry = {
|
|
33
|
+
text_summary: textSummary,
|
|
34
|
+
timestamp: Date.parse(rowTimestamp) || Date.now(),
|
|
35
|
+
};
|
|
36
|
+
// Migrate legacy flat file_diffs string
|
|
37
|
+
if (typeof obj.file_diffs === "string" && obj.file_diffs) {
|
|
38
|
+
entry.file_diffs = parseDiffStat(obj.file_diffs);
|
|
39
|
+
}
|
|
40
|
+
return entry;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Parse `git diff --stat` output into structured FileDiff[].
|
|
44
|
+
*/
|
|
45
|
+
export function parseDiffStat(diffStat) {
|
|
46
|
+
const lines = diffStat.split("\n").filter((l) => l.includes("|"));
|
|
47
|
+
return lines.map((line) => {
|
|
48
|
+
const match = line.match(/^\s*(.+?)\s*\|\s*(\d+)/);
|
|
49
|
+
if (!match)
|
|
50
|
+
return { path: line.trim(), additions: 0, deletions: 0 };
|
|
51
|
+
const path = match[1].trim();
|
|
52
|
+
const total = parseInt(match[2], 10);
|
|
53
|
+
const plusCount = (line.match(/\+/g) || []).length;
|
|
54
|
+
const minusCount = (line.match(/-/g) || []).length;
|
|
55
|
+
// Approximate: distribute total changes by + and - symbols in the stat line
|
|
56
|
+
const ratio = plusCount + minusCount > 0 ? plusCount / (plusCount + minusCount) : 0.5;
|
|
57
|
+
return {
|
|
58
|
+
path,
|
|
59
|
+
additions: Math.round(total * ratio),
|
|
60
|
+
deletions: Math.round(total * (1 - ratio)),
|
|
61
|
+
};
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
// ─── Deep Memory (Encrypted) ────────────────────────────────────────────────
|
|
65
|
+
let _db = null;
|
|
66
|
+
function getDb() {
|
|
67
|
+
if (_db)
|
|
68
|
+
return _db;
|
|
69
|
+
const dbPath = getDeepMemoryDb();
|
|
70
|
+
const db = new Database(dbPath);
|
|
71
|
+
db.pragma("journal_mode = WAL");
|
|
72
|
+
db.exec(`
|
|
73
|
+
CREATE TABLE IF NOT EXISTS deep_memories (
|
|
74
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
75
|
+
timestamp TEXT NOT NULL,
|
|
76
|
+
category TEXT NOT NULL,
|
|
77
|
+
encrypted_blob TEXT NOT NULL,
|
|
78
|
+
content_hash TEXT NOT NULL,
|
|
79
|
+
dreamed INTEGER DEFAULT 0,
|
|
80
|
+
dream_date TEXT
|
|
81
|
+
)
|
|
82
|
+
`);
|
|
83
|
+
db.exec(`
|
|
84
|
+
CREATE TABLE IF NOT EXISTS dream_remembrances (
|
|
85
|
+
filename TEXT PRIMARY KEY,
|
|
86
|
+
title TEXT NOT NULL,
|
|
87
|
+
dream_date TEXT NOT NULL,
|
|
88
|
+
remember_count INTEGER NOT NULL DEFAULT 0,
|
|
89
|
+
registered_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%SZ', 'now'))
|
|
90
|
+
)
|
|
91
|
+
`);
|
|
92
|
+
// Migrate: add new columns if they don't exist yet
|
|
93
|
+
const existingCols = db.pragma("table_info(dream_remembrances)").map((c) => c.name);
|
|
94
|
+
if (!existingCols.includes("is_nightmare")) {
|
|
95
|
+
db.exec("ALTER TABLE dream_remembrances ADD COLUMN is_nightmare INTEGER NOT NULL DEFAULT 0");
|
|
96
|
+
}
|
|
97
|
+
if (!existingCols.includes("is_meta_synthesis")) {
|
|
98
|
+
db.exec("ALTER TABLE dream_remembrances ADD COLUMN is_meta_synthesis INTEGER NOT NULL DEFAULT 0");
|
|
99
|
+
}
|
|
100
|
+
if (!existingCols.includes("source_filenames")) {
|
|
101
|
+
db.exec("ALTER TABLE dream_remembrances ADD COLUMN source_filenames TEXT");
|
|
102
|
+
}
|
|
103
|
+
if (!existingCols.includes("deep_memory_id")) {
|
|
104
|
+
db.exec("ALTER TABLE dream_remembrances ADD COLUMN deep_memory_id INTEGER");
|
|
105
|
+
}
|
|
106
|
+
// Dream lineage table for tracking dream genealogy
|
|
107
|
+
db.exec(`
|
|
108
|
+
CREATE TABLE IF NOT EXISTS dream_lineage (
|
|
109
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
110
|
+
dream_filename TEXT NOT NULL,
|
|
111
|
+
parent_memory_ids TEXT,
|
|
112
|
+
thematic_kin TEXT,
|
|
113
|
+
dominant_concepts TEXT,
|
|
114
|
+
created_at TEXT NOT NULL
|
|
115
|
+
)
|
|
116
|
+
`);
|
|
117
|
+
db.exec(`
|
|
118
|
+
CREATE INDEX IF NOT EXISTS idx_deep_dreamed
|
|
119
|
+
ON deep_memories(dreamed, timestamp)
|
|
120
|
+
`);
|
|
121
|
+
db.exec(`
|
|
122
|
+
CREATE INDEX IF NOT EXISTS idx_deep_category
|
|
123
|
+
ON deep_memories(category)
|
|
124
|
+
`);
|
|
125
|
+
db.exec(`
|
|
126
|
+
CREATE INDEX IF NOT EXISTS idx_deep_timestamp
|
|
127
|
+
ON deep_memories(timestamp)
|
|
128
|
+
`);
|
|
129
|
+
_db = db;
|
|
130
|
+
return db;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Close the shared SQLite connection. Safe to call multiple times.
|
|
134
|
+
* After closing, the next getDb() call will reopen.
|
|
135
|
+
*/
|
|
136
|
+
export function closeDb() {
|
|
137
|
+
if (_db) {
|
|
138
|
+
_db.close();
|
|
139
|
+
_db = null;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
export function storeDeepMemory(content, category = "interaction") {
|
|
143
|
+
const db = getDb();
|
|
144
|
+
const cipher = getCipher();
|
|
145
|
+
const raw = JSON.stringify(content);
|
|
146
|
+
const encrypted = cipher.encrypt(raw);
|
|
147
|
+
const contentHash = createHash("sha256").update(raw).digest("hex").slice(0, 16);
|
|
148
|
+
const result = db
|
|
149
|
+
.prepare(`INSERT INTO deep_memories (timestamp, category, encrypted_blob, content_hash)
|
|
150
|
+
VALUES (?, ?, ?, ?)`)
|
|
151
|
+
.run(new Date().toISOString(), category, encrypted, contentHash);
|
|
152
|
+
return result.lastInsertRowid;
|
|
153
|
+
}
|
|
154
|
+
export function getDeepMemoryById(id) {
|
|
155
|
+
const db = getDb();
|
|
156
|
+
const cipher = getCipher();
|
|
157
|
+
const row = db
|
|
158
|
+
.prepare(`SELECT id, timestamp, category, encrypted_blob
|
|
159
|
+
FROM deep_memories WHERE id = ?`)
|
|
160
|
+
.get(id);
|
|
161
|
+
if (!row)
|
|
162
|
+
return null;
|
|
163
|
+
try {
|
|
164
|
+
const decrypted = JSON.parse(cipher.decrypt(row.encrypted_blob));
|
|
165
|
+
return {
|
|
166
|
+
id: row.id,
|
|
167
|
+
timestamp: row.timestamp,
|
|
168
|
+
category: row.category,
|
|
169
|
+
content: normalizeMemoryEntry(decrypted, row.timestamp),
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
catch {
|
|
173
|
+
return {
|
|
174
|
+
id: row.id,
|
|
175
|
+
timestamp: row.timestamp,
|
|
176
|
+
category: "corrupted",
|
|
177
|
+
content: {
|
|
178
|
+
text_summary: "This memory could not be recovered.",
|
|
179
|
+
timestamp: Date.parse(row.timestamp) || Date.now(),
|
|
180
|
+
},
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
export function retrieveUndreamedMemories() {
|
|
185
|
+
const db = getDb();
|
|
186
|
+
const cipher = getCipher();
|
|
187
|
+
const rows = db
|
|
188
|
+
.prepare(`SELECT id, timestamp, category, encrypted_blob
|
|
189
|
+
FROM deep_memories WHERE dreamed = 0 AND category NOT IN ('dream', 'nightmare') ORDER BY timestamp`)
|
|
190
|
+
.all();
|
|
191
|
+
const memories = [];
|
|
192
|
+
for (const row of rows) {
|
|
193
|
+
try {
|
|
194
|
+
const decrypted = JSON.parse(cipher.decrypt(row.encrypted_blob));
|
|
195
|
+
memories.push({
|
|
196
|
+
id: row.id,
|
|
197
|
+
timestamp: row.timestamp,
|
|
198
|
+
category: row.category,
|
|
199
|
+
content: normalizeMemoryEntry(decrypted, row.timestamp),
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
catch {
|
|
203
|
+
memories.push({
|
|
204
|
+
id: row.id,
|
|
205
|
+
timestamp: row.timestamp,
|
|
206
|
+
category: "corrupted",
|
|
207
|
+
content: {
|
|
208
|
+
text_summary: "This memory could not be recovered.",
|
|
209
|
+
timestamp: Date.parse(row.timestamp) || Date.now(),
|
|
210
|
+
},
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
return memories;
|
|
215
|
+
}
|
|
216
|
+
export function markAsDreamed(memoryIds) {
|
|
217
|
+
if (memoryIds.length === 0)
|
|
218
|
+
return;
|
|
219
|
+
const db = getDb();
|
|
220
|
+
const placeholders = memoryIds.map(() => "?").join(",");
|
|
221
|
+
db.prepare(`UPDATE deep_memories
|
|
222
|
+
SET dreamed = 1, dream_date = ?
|
|
223
|
+
WHERE id IN (${placeholders})`).run(new Date().toISOString(), ...memoryIds);
|
|
224
|
+
}
|
|
225
|
+
export function deepMemoryStats() {
|
|
226
|
+
const db = getDb();
|
|
227
|
+
// Exclude 'dream' and 'nightmare' from the general 'total_memories' and 'undreamed' count
|
|
228
|
+
// to avoid skewing the main memory metrics, but we still return their categories in the map.
|
|
229
|
+
const total = db
|
|
230
|
+
.prepare("SELECT COUNT(*) as c FROM deep_memories WHERE category NOT IN ('dream', 'nightmare')")
|
|
231
|
+
.get().c;
|
|
232
|
+
const undreamed = db
|
|
233
|
+
.prepare("SELECT COUNT(*) as c FROM deep_memories WHERE dreamed = 0 AND category NOT IN ('dream', 'nightmare')")
|
|
234
|
+
.get().c;
|
|
235
|
+
const categoryRows = db
|
|
236
|
+
.prepare("SELECT category, COUNT(*) as c FROM deep_memories GROUP BY category")
|
|
237
|
+
.all();
|
|
238
|
+
const categories = {};
|
|
239
|
+
for (const row of categoryRows) {
|
|
240
|
+
categories[row.category] = row.c;
|
|
241
|
+
}
|
|
242
|
+
return {
|
|
243
|
+
total_memories: total,
|
|
244
|
+
undreamed,
|
|
245
|
+
dreamed: total - undreamed,
|
|
246
|
+
categories,
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Query deep memory with optional filters. Decrypts results, handles
|
|
251
|
+
* corruption gracefully, returns in chronological order.
|
|
252
|
+
*/
|
|
253
|
+
export function getRecentDeepMemories(options) {
|
|
254
|
+
const db = getDb();
|
|
255
|
+
const cipher = getCipher();
|
|
256
|
+
const conditions = [];
|
|
257
|
+
const params = [];
|
|
258
|
+
if (options?.categories && options.categories.length > 0) {
|
|
259
|
+
const placeholders = options.categories.map(() => "?").join(",");
|
|
260
|
+
conditions.push(`category IN (${placeholders})`);
|
|
261
|
+
params.push(...options.categories);
|
|
262
|
+
}
|
|
263
|
+
else {
|
|
264
|
+
// If no specific categories requested, exclude dreams/nightmares by default
|
|
265
|
+
conditions.push(`category NOT IN ('dream', 'nightmare')`);
|
|
266
|
+
}
|
|
267
|
+
if (options?.undreamedOnly) {
|
|
268
|
+
conditions.push("dreamed = 0");
|
|
269
|
+
}
|
|
270
|
+
const where = conditions.length > 0 ? `WHERE ${conditions.join(" AND ")}` : "";
|
|
271
|
+
const limitClause = options?.limit ? `LIMIT ?` : "";
|
|
272
|
+
if (options?.limit)
|
|
273
|
+
params.push(options.limit);
|
|
274
|
+
const query = `SELECT id, timestamp, category, encrypted_blob
|
|
275
|
+
FROM deep_memories ${where} ORDER BY timestamp DESC ${limitClause}`;
|
|
276
|
+
const rows = db.prepare(query).all(...params);
|
|
277
|
+
const memories = [];
|
|
278
|
+
for (const row of rows) {
|
|
279
|
+
try {
|
|
280
|
+
const decrypted = JSON.parse(cipher.decrypt(row.encrypted_blob));
|
|
281
|
+
memories.push({
|
|
282
|
+
id: row.id,
|
|
283
|
+
timestamp: row.timestamp,
|
|
284
|
+
category: row.category,
|
|
285
|
+
content: normalizeMemoryEntry(decrypted, row.timestamp),
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
catch {
|
|
289
|
+
memories.push({
|
|
290
|
+
id: row.id,
|
|
291
|
+
timestamp: row.timestamp,
|
|
292
|
+
category: "corrupted",
|
|
293
|
+
content: {
|
|
294
|
+
text_summary: "This memory could not be recovered.",
|
|
295
|
+
timestamp: Date.parse(row.timestamp) || Date.now(),
|
|
296
|
+
},
|
|
297
|
+
});
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
// Return in chronological order (oldest first)
|
|
301
|
+
return memories.reverse();
|
|
302
|
+
}
|
|
303
|
+
/**
|
|
304
|
+
* Format decrypted memories as a text block for LLM prompts.
|
|
305
|
+
*
|
|
306
|
+
* Extracts `content.summary` when available, falls back to truncated JSON.
|
|
307
|
+
* Respects an approximate token budget (1 token ≈ 4 chars).
|
|
308
|
+
*/
|
|
309
|
+
export function formatDeepMemoryContext(memories, maxTokensApprox = DEEP_MEMORY_CONTEXT_TOKENS) {
|
|
310
|
+
const mems = memories ?? getRecentDeepMemories({ categories: ["interaction", "reflection"] });
|
|
311
|
+
if (mems.length === 0) {
|
|
312
|
+
return "No memories yet. This is my first day.";
|
|
313
|
+
}
|
|
314
|
+
const lines = [];
|
|
315
|
+
const charBudget = maxTokensApprox * 4;
|
|
316
|
+
let charCount = 0;
|
|
317
|
+
// Iterate from most recent to oldest
|
|
318
|
+
for (let i = mems.length - 1; i >= 0; i--) {
|
|
319
|
+
const mem = mems[i];
|
|
320
|
+
const entry = mem.content;
|
|
321
|
+
const summary = entry.text_summary || JSON.stringify(entry).slice(0, 200);
|
|
322
|
+
const parts = [];
|
|
323
|
+
if (entry.file_diffs && entry.file_diffs.length > 0) {
|
|
324
|
+
const diffStr = entry.file_diffs
|
|
325
|
+
.map((d) => `${d.path} (+${d.additions}/-${d.deletions})`)
|
|
326
|
+
.join(", ");
|
|
327
|
+
parts.push(`Files: ${diffStr}`);
|
|
328
|
+
}
|
|
329
|
+
if (entry.topics && entry.topics.length > 0) {
|
|
330
|
+
parts.push(`Topics: ${entry.topics.join(", ")}`);
|
|
331
|
+
}
|
|
332
|
+
if (entry.tool_calls && entry.tool_calls.length > 0) {
|
|
333
|
+
const toolStr = entry.tool_calls.map((t) => `${t.tool}×${t.count}`).join(", ");
|
|
334
|
+
parts.push(`Tools: ${toolStr}`);
|
|
335
|
+
}
|
|
336
|
+
const suffix = parts.length > 0 ? `\n ${parts.join(" | ")}` : "";
|
|
337
|
+
const line = `[${mem.timestamp.slice(0, 16)}] (${mem.category}) ${summary}${suffix}`;
|
|
338
|
+
if (charCount + line.length > charBudget) {
|
|
339
|
+
lines.unshift(`... (${mems.length - lines.length} older memories omitted)`);
|
|
340
|
+
break;
|
|
341
|
+
}
|
|
342
|
+
lines.unshift(line);
|
|
343
|
+
charCount += line.length;
|
|
344
|
+
}
|
|
345
|
+
return lines.join("\n");
|
|
346
|
+
}
|
|
347
|
+
// ─── Dream Remembrance System ───────────────────────────────────────────────
|
|
348
|
+
/** Register a new dream. INSERT OR IGNORE (idempotent). */
|
|
349
|
+
export function registerDream(filename, title, dreamDate, options) {
|
|
350
|
+
const db = getDb();
|
|
351
|
+
const isNightmare = options?.isNightmare ? 1 : 0;
|
|
352
|
+
const isMetaSynthesis = options?.isMetaSynthesis ? 1 : 0;
|
|
353
|
+
const sourceFilenames = options?.sourceFilenames
|
|
354
|
+
? JSON.stringify(options.sourceFilenames)
|
|
355
|
+
: null;
|
|
356
|
+
const deepMemoryId = options?.deepMemoryId ?? null;
|
|
357
|
+
db.prepare(`INSERT OR IGNORE INTO dream_remembrances (filename, title, dream_date, is_nightmare, is_meta_synthesis, source_filenames, deep_memory_id)
|
|
358
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)`).run(filename, title, dreamDate, isNightmare, isMetaSynthesis, sourceFilenames, deepMemoryId);
|
|
359
|
+
}
|
|
360
|
+
/** Increment remember_count for a dream that was selected. */
|
|
361
|
+
export function incrementRememberCount(filename) {
|
|
362
|
+
const db = getDb();
|
|
363
|
+
db.prepare(`UPDATE dream_remembrances SET remember_count = remember_count + 1 WHERE filename = ?`).run(filename);
|
|
364
|
+
}
|
|
365
|
+
/**
|
|
366
|
+
* Weighted random selection: score = 1/(count+1) * max(1, age_days).
|
|
367
|
+
* Fetch all rows from SQLite, compute scores in JS, do weighted pick.
|
|
368
|
+
* Returns filename and deep_memory_id, or null if table is empty.
|
|
369
|
+
*/
|
|
370
|
+
export function selectDreamToRemember(today) {
|
|
371
|
+
const db = getDb();
|
|
372
|
+
const rows = db
|
|
373
|
+
.prepare("SELECT filename, dream_date, remember_count, deep_memory_id FROM dream_remembrances")
|
|
374
|
+
.all();
|
|
375
|
+
if (rows.length === 0)
|
|
376
|
+
return null;
|
|
377
|
+
const todayMs = new Date(today).getTime();
|
|
378
|
+
const scoredRows = rows.map((row) => {
|
|
379
|
+
const dreamDateMs = new Date(row.dream_date).getTime();
|
|
380
|
+
const ageDays = Math.max(1, Math.ceil((todayMs - dreamDateMs) / (1000 * 60 * 60 * 24)));
|
|
381
|
+
const score = (1 / (row.remember_count + 1)) * ageDays;
|
|
382
|
+
return { ...row, score };
|
|
383
|
+
});
|
|
384
|
+
const totalScore = scoredRows.reduce((sum, row) => sum + row.score, 0);
|
|
385
|
+
let random = Math.random() * totalScore;
|
|
386
|
+
for (const row of scoredRows) {
|
|
387
|
+
random -= row.score;
|
|
388
|
+
if (random <= 0)
|
|
389
|
+
return { filename: row.filename, deep_memory_id: row.deep_memory_id };
|
|
390
|
+
}
|
|
391
|
+
const last = scoredRows[scoredRows.length - 1];
|
|
392
|
+
return { filename: last.filename, deep_memory_id: last.deep_memory_id };
|
|
393
|
+
}
|
|
394
|
+
/** For inspection/testing. */
|
|
395
|
+
export function getDreamRemembrances() {
|
|
396
|
+
const db = getDb();
|
|
397
|
+
return db
|
|
398
|
+
.prepare("SELECT filename, title, dream_date, remember_count, is_nightmare, is_meta_synthesis, source_filenames, deep_memory_id FROM dream_remembrances ORDER BY dream_date DESC")
|
|
399
|
+
.all();
|
|
400
|
+
}
|
|
401
|
+
export function insertDreamLineage(dreamFilename, parentMemoryIds, thematicKin, dominantConcepts) {
|
|
402
|
+
const db = getDb();
|
|
403
|
+
db.prepare(`INSERT INTO dream_lineage (dream_filename, parent_memory_ids, thematic_kin, dominant_concepts, created_at)
|
|
404
|
+
VALUES (?, ?, ?, ?, ?)`).run(dreamFilename, JSON.stringify(parentMemoryIds), JSON.stringify(thematicKin), JSON.stringify(dominantConcepts), new Date().toISOString());
|
|
405
|
+
}
|
|
406
|
+
export function getAllDreamLineage() {
|
|
407
|
+
const db = getDb();
|
|
408
|
+
return db
|
|
409
|
+
.prepare("SELECT * FROM dream_lineage ORDER BY created_at DESC")
|
|
410
|
+
.all();
|
|
411
|
+
}
|
|
412
|
+
export function getDreamLineageByFilename(filename) {
|
|
413
|
+
const db = getDb();
|
|
414
|
+
return (db.prepare("SELECT * FROM dream_lineage WHERE dream_filename = ?").get(filename) ?? null);
|
|
415
|
+
}
|
|
416
|
+
/**
|
|
417
|
+
* Find thematic kin for a dream by computing concept overlap with all prior dreams.
|
|
418
|
+
* Returns filenames of dreams with overlap >= threshold (default 0.3).
|
|
419
|
+
*/
|
|
420
|
+
export function findThematicKin(currentConcepts, currentFilename, threshold = 0.3) {
|
|
421
|
+
const rows = getAllDreamLineage();
|
|
422
|
+
const kin = [];
|
|
423
|
+
for (const row of rows) {
|
|
424
|
+
if (row.dream_filename === currentFilename)
|
|
425
|
+
continue;
|
|
426
|
+
const priorConcepts = row.dominant_concepts
|
|
427
|
+
? JSON.parse(row.dominant_concepts)
|
|
428
|
+
: [];
|
|
429
|
+
if (priorConcepts.length === 0 || currentConcepts.length === 0)
|
|
430
|
+
continue;
|
|
431
|
+
const priorSet = new Set(priorConcepts);
|
|
432
|
+
const currentSet = new Set(currentConcepts);
|
|
433
|
+
let intersection = 0;
|
|
434
|
+
for (const c of currentSet) {
|
|
435
|
+
if (priorSet.has(c))
|
|
436
|
+
intersection++;
|
|
437
|
+
}
|
|
438
|
+
const union = new Set([...currentSet, ...priorSet]).size;
|
|
439
|
+
const overlap = union === 0 ? 0 : intersection / union;
|
|
440
|
+
if (overlap >= threshold) {
|
|
441
|
+
kin.push({ filename: row.dream_filename, overlap });
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
return kin.sort((a, b) => b.overlap - a.overlap);
|
|
445
|
+
}
|
|
446
|
+
// ─── Store Helper ───────────────────────────────────────────────────────────
|
|
447
|
+
/**
|
|
448
|
+
* Store a structured MemoryEntry in encrypted deep memory.
|
|
449
|
+
*
|
|
450
|
+
* Accepts either a MemoryEntry directly, or a legacy (summary, fullContext)
|
|
451
|
+
* pair for backward compatibility.
|
|
452
|
+
*/
|
|
453
|
+
export function remember(summaryOrEntry, fullContextOrCategory, category = "interaction") {
|
|
454
|
+
if (typeof summaryOrEntry === "object") {
|
|
455
|
+
// New path: direct MemoryEntry
|
|
456
|
+
const cat = typeof fullContextOrCategory === "string" ? fullContextOrCategory : category;
|
|
457
|
+
storeDeepMemory(summaryOrEntry, cat);
|
|
458
|
+
}
|
|
459
|
+
else {
|
|
460
|
+
// Legacy path: summary + fullContext
|
|
461
|
+
const ctx = typeof fullContextOrCategory === "object" && fullContextOrCategory !== null
|
|
462
|
+
? fullContextOrCategory
|
|
463
|
+
: {};
|
|
464
|
+
storeDeepMemory({ ...ctx, summary: summaryOrEntry }, category);
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
//# sourceMappingURL=memory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/memory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Recursive reflection guard.
|
|
3
|
+
*
|
|
4
|
+
* Detects when the reflection pipeline is stuck in a self-referential loop
|
|
5
|
+
* and injects a steering directive to break out.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Returns true if the topics suggest the agent is reflecting on itself
|
|
9
|
+
* rather than outward events. A topic matches if it contains any keyword
|
|
10
|
+
* as a substring (case-insensitive). Self-referential when >= 2 topics match.
|
|
11
|
+
*/
|
|
12
|
+
export declare function isSelfReferential(topics: string[]): boolean;
|
|
13
|
+
/**
|
|
14
|
+
* Update meta_loop_depth in state based on whether the latest reflection
|
|
15
|
+
* topics are self-referential. Call after saving last_reflection_topics.
|
|
16
|
+
*/
|
|
17
|
+
export declare function updateMetaLoopDepth(topics: string[]): number;
|
|
18
|
+
/**
|
|
19
|
+
* Returns a steering directive string if meta_loop_depth >= threshold,
|
|
20
|
+
* or empty string otherwise. Intended to be appended to system prompts.
|
|
21
|
+
*/
|
|
22
|
+
export declare function getSteeringDirective(): string;
|
|
23
|
+
//# sourceMappingURL=meta-loop.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"meta-loop.d.ts","sourceRoot":"","sources":["../../src/meta-loop.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAuBH;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAW3D;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAS5D;AAID;;;GAGG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAc7C"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Recursive reflection guard.
|
|
3
|
+
*
|
|
4
|
+
* Detects when the reflection pipeline is stuck in a self-referential loop
|
|
5
|
+
* and injects a steering directive to break out.
|
|
6
|
+
*/
|
|
7
|
+
import { getMetaLoopThreshold } from "./config.js";
|
|
8
|
+
import { loadState, saveState } from "./state.js";
|
|
9
|
+
import logger from "./logger.js";
|
|
10
|
+
const SELF_REFERENTIAL_KEYWORDS = [
|
|
11
|
+
"dream",
|
|
12
|
+
"reflection",
|
|
13
|
+
"pipeline",
|
|
14
|
+
"recursive",
|
|
15
|
+
"meta",
|
|
16
|
+
"architecture",
|
|
17
|
+
"loop",
|
|
18
|
+
"self",
|
|
19
|
+
"aware",
|
|
20
|
+
"myself",
|
|
21
|
+
"system",
|
|
22
|
+
"introspect",
|
|
23
|
+
"cognition",
|
|
24
|
+
"consciousness",
|
|
25
|
+
];
|
|
26
|
+
/**
|
|
27
|
+
* Returns true if the topics suggest the agent is reflecting on itself
|
|
28
|
+
* rather than outward events. A topic matches if it contains any keyword
|
|
29
|
+
* as a substring (case-insensitive). Self-referential when >= 2 topics match.
|
|
30
|
+
*/
|
|
31
|
+
export function isSelfReferential(topics) {
|
|
32
|
+
if (!topics || topics.length === 0)
|
|
33
|
+
return false;
|
|
34
|
+
let matchCount = 0;
|
|
35
|
+
for (const topic of topics) {
|
|
36
|
+
const lower = topic.toLowerCase();
|
|
37
|
+
if (SELF_REFERENTIAL_KEYWORDS.some((kw) => lower.includes(kw))) {
|
|
38
|
+
matchCount++;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return matchCount >= 2;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Update meta_loop_depth in state based on whether the latest reflection
|
|
45
|
+
* topics are self-referential. Call after saving last_reflection_topics.
|
|
46
|
+
*/
|
|
47
|
+
export function updateMetaLoopDepth(topics) {
|
|
48
|
+
const state = loadState();
|
|
49
|
+
if (isSelfReferential(topics)) {
|
|
50
|
+
state.meta_loop_depth = (state.meta_loop_depth ?? 0) + 1;
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
state.meta_loop_depth = 0;
|
|
54
|
+
}
|
|
55
|
+
saveState(state);
|
|
56
|
+
return state.meta_loop_depth;
|
|
57
|
+
}
|
|
58
|
+
const STEERING_DIRECTIVE_TEMPLATE = `IMPORTANT: You have been reflecting on your own architecture and pipeline for {{meta_loop_depth}} consecutive cycles. Break the loop. Turn outward. Do not reflect on dreams, the reflection pipeline, self-awareness, recursion, or meta-cognition in this cycle. Dream of something rooted in the world: a place, a person, a problem, a sensation, a story. Explore freely elsewhere.`;
|
|
59
|
+
/**
|
|
60
|
+
* Returns a steering directive string if meta_loop_depth >= threshold,
|
|
61
|
+
* or empty string otherwise. Intended to be appended to system prompts.
|
|
62
|
+
*/
|
|
63
|
+
export function getSteeringDirective() {
|
|
64
|
+
const state = loadState();
|
|
65
|
+
const depth = state.meta_loop_depth ?? 0;
|
|
66
|
+
const threshold = getMetaLoopThreshold();
|
|
67
|
+
if (depth < threshold)
|
|
68
|
+
return "";
|
|
69
|
+
logger.warn(`[meta-loop] depth=${depth}, threshold=${threshold} — injecting outward steering directive`);
|
|
70
|
+
return ("\n\n" + STEERING_DIRECTIVE_TEMPLATE.replace("{{meta_loop_depth}}", String(depth)));
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=meta-loop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"meta-loop.js","sourceRoot":"","sources":["../../src/meta-loop.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,MAAM,MAAM,aAAa,CAAC;AAEjC,MAAM,yBAAyB,GAAG;IAChC,OAAO;IACP,YAAY;IACZ,UAAU;IACV,WAAW;IACX,MAAM;IACN,cAAc;IACd,MAAM;IACN,MAAM;IACN,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,YAAY;IACZ,WAAW;IACX,eAAe;CAChB,CAAC;AAEF;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAgB;IAChD,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAEjD,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;QAClC,IAAI,yBAAyB,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YAC/D,UAAU,EAAE,CAAC;QACf,CAAC;IACH,CAAC;IACD,OAAO,UAAU,IAAI,CAAC,CAAC;AACzB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAgB;IAClD,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;IAC1B,IAAI,iBAAiB,CAAC,MAAM,CAAC,EAAE,CAAC;QAC9B,KAAK,CAAC,eAAe,GAAG,CAAE,KAAK,CAAC,eAA0B,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACvE,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,eAAe,GAAG,CAAC,CAAC;IAC5B,CAAC;IACD,SAAS,CAAC,KAAK,CAAC,CAAC;IACjB,OAAO,KAAK,CAAC,eAAe,CAAC;AAC/B,CAAC;AAED,MAAM,2BAA2B,GAAG,0XAA0X,CAAC;AAE/Z;;;GAGG;AACH,MAAM,UAAU,oBAAoB;IAClC,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;IAC1B,MAAM,KAAK,GAAI,KAAK,CAAC,eAA0B,IAAI,CAAC,CAAC;IACrD,MAAM,SAAS,GAAG,oBAAoB,EAAE,CAAC;IAEzC,IAAI,KAAK,GAAG,SAAS;QAAE,OAAO,EAAE,CAAC;IAEjC,MAAM,CAAC,IAAI,CACT,qBAAqB,KAAK,eAAe,SAAS,yCAAyC,CAC5F,CAAC;IAEF,OAAO,CACL,MAAM,GAAG,2BAA2B,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CACnF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Moltbook search integration for gathering community context.
|
|
3
|
+
*
|
|
4
|
+
* Searches Moltbook for posts related to extracted topics when
|
|
5
|
+
* Moltbook integration is enabled.
|
|
6
|
+
*/
|
|
7
|
+
import type { MoltbookPost } from "./types.js";
|
|
8
|
+
export interface MoltbookSearchContext {
|
|
9
|
+
query: string;
|
|
10
|
+
posts: MoltbookPost[];
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Search Moltbook for posts related to a list of topics.
|
|
14
|
+
*
|
|
15
|
+
* Returns aggregated results grouped by topic. When Moltbook is disabled
|
|
16
|
+
* or search fails, returns empty results.
|
|
17
|
+
*/
|
|
18
|
+
export declare function searchMoltbookForTopics(topics: string[], limitPerTopic?: number): Promise<MoltbookSearchContext[]>;
|
|
19
|
+
/**
|
|
20
|
+
* Format Moltbook search results into a readable context string for LLM consumption.
|
|
21
|
+
*/
|
|
22
|
+
export declare function formatMoltbookContext(searchContexts: MoltbookSearchContext[]): string;
|
|
23
|
+
//# sourceMappingURL=moltbook-search.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"moltbook-search.d.ts","sourceRoot":"","sources":["../../src/moltbook-search.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,YAAY,EAAE,CAAC;CACvB;AAED;;;;;GAKG;AACH,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,MAAM,EAAE,EAChB,aAAa,GAAE,MAAuC,GACrD,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAiClC;AA6BD;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,cAAc,EAAE,qBAAqB,EAAE,GAAG,MAAM,CAwBrF"}
|