openclawdreams 0.7.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.
- package/.env.example +14 -0
- package/.github/ISSUE_TEMPLATE/bug_report.md +27 -0
- package/.github/ISSUE_TEMPLATE/feature_request.md +19 -0
- package/.github/dependabot.yml +17 -0
- package/.github/pull_request_template.md +19 -0
- package/.github/workflows/build.yml +30 -0
- package/.github/workflows/release.yml +110 -0
- package/.prettierignore +4 -0
- package/.prettierrc +7 -0
- package/.versionrc.json +26 -0
- package/AGENTS.md +286 -0
- package/CHANGELOG.md +157 -0
- package/CODE_OF_CONDUCT.md +41 -0
- package/CONTRIBUTING.md +95 -0
- package/LICENSE +21 -0
- package/README.md +363 -0
- package/SECURITY.md +39 -0
- package/bin/electricsheep.ts +5 -0
- package/dist/bin/electricsheep.d.ts +3 -0
- package/dist/bin/electricsheep.d.ts.map +1 -0
- package/dist/bin/electricsheep.js +4 -0
- package/dist/bin/electricsheep.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 +87 -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 +289 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/config.d.ts +37 -0
- package/dist/src/config.d.ts.map +1 -0
- package/dist/src/config.js +70 -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 +13 -0
- package/dist/src/dreamer.d.ts.map +1 -0
- package/dist/src/dreamer.js +213 -0
- package/dist/src/dreamer.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 +293 -0
- package/dist/src/index.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 +41 -0
- package/dist/src/memory.d.ts.map +1 -0
- package/dist/src/memory.js +206 -0
- package/dist/src/memory.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 +165 -0
- package/dist/src/moltbook.js.map +1 -0
- package/dist/src/notify.d.ts +18 -0
- package/dist/src/notify.d.ts.map +1 -0
- package/dist/src/notify.js +98 -0
- package/dist/src/notify.js.map +1 -0
- package/dist/src/persona.d.ts +26 -0
- package/dist/src/persona.d.ts.map +1 -0
- package/dist/src/persona.js +178 -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 +111 -0
- package/dist/src/reflection.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 +125 -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 +83 -0
- package/dist/src/topics.js.map +1 -0
- package/dist/src/types.d.ts +179 -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/waking.d.ts +24 -0
- package/dist/src/waking.d.ts.map +1 -0
- package/dist/src/waking.js +152 -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/dist/test/budget.test.d.ts +2 -0
- package/dist/test/budget.test.d.ts.map +1 -0
- package/dist/test/budget.test.js +258 -0
- package/dist/test/budget.test.js.map +1 -0
- package/dist/test/crypto.test.d.ts +2 -0
- package/dist/test/crypto.test.d.ts.map +1 -0
- package/dist/test/crypto.test.js +93 -0
- package/dist/test/crypto.test.js.map +1 -0
- package/dist/test/dreamer.test.d.ts +2 -0
- package/dist/test/dreamer.test.d.ts.map +1 -0
- package/dist/test/dreamer.test.js +79 -0
- package/dist/test/dreamer.test.js.map +1 -0
- package/dist/test/filter.test.d.ts +2 -0
- package/dist/test/filter.test.d.ts.map +1 -0
- package/dist/test/filter.test.js +92 -0
- package/dist/test/filter.test.js.map +1 -0
- package/dist/test/memory.test.d.ts +2 -0
- package/dist/test/memory.test.d.ts.map +1 -0
- package/dist/test/memory.test.js +138 -0
- package/dist/test/memory.test.js.map +1 -0
- package/dist/test/moltbook.test.d.ts +2 -0
- package/dist/test/moltbook.test.d.ts.map +1 -0
- package/dist/test/moltbook.test.js +164 -0
- package/dist/test/moltbook.test.js.map +1 -0
- package/dist/test/persona.test.d.ts +2 -0
- package/dist/test/persona.test.d.ts.map +1 -0
- package/dist/test/persona.test.js +44 -0
- package/dist/test/persona.test.js.map +1 -0
- package/dist/test/reflection.test.d.ts +2 -0
- package/dist/test/reflection.test.d.ts.map +1 -0
- package/dist/test/reflection.test.js +57 -0
- package/dist/test/reflection.test.js.map +1 -0
- package/dist/test/state.test.d.ts +2 -0
- package/dist/test/state.test.d.ts.map +1 -0
- package/dist/test/state.test.js +50 -0
- package/dist/test/state.test.js.map +1 -0
- package/dist/test/waking.test.d.ts +2 -0
- package/dist/test/waking.test.d.ts.map +1 -0
- package/dist/test/waking.test.js +149 -0
- package/dist/test/waking.test.js.map +1 -0
- package/eslint.config.js +35 -0
- package/openclaw.plugin.json +62 -0
- package/package.json +72 -0
- package/skills/electricsheep.skill.md +69 -0
- package/skills/setup-guide/SKILL.md +303 -0
- package/src/budget.ts +104 -0
- package/src/cli.ts +325 -0
- package/src/config.ts +95 -0
- package/src/crypto.ts +82 -0
- package/src/dreamer.ts +283 -0
- package/src/filter.ts +146 -0
- package/src/identity.ts +92 -0
- package/src/index.ts +356 -0
- package/src/llm.ts +61 -0
- package/src/logger.ts +46 -0
- package/src/memory.ts +276 -0
- package/src/moltbook-search.ts +116 -0
- package/src/moltbook.ts +235 -0
- package/src/notify.ts +124 -0
- package/src/persona.ts +191 -0
- package/src/reflection.ts +150 -0
- package/src/state.ts +44 -0
- package/src/synthesis.ts +153 -0
- package/src/topics.ts +103 -0
- package/src/types.ts +196 -0
- package/src/waking.ts +199 -0
- package/src/web-search.ts +88 -0
- package/test/budget.test.ts +316 -0
- package/test/crypto.test.ts +112 -0
- package/test/dreamer.test.ts +95 -0
- package/test/filter.test.ts +115 -0
- package/test/memory.test.ts +182 -0
- package/test/moltbook.test.ts +209 -0
- package/test/persona.test.ts +59 -0
- package/test/reflection.test.ts +71 -0
- package/test/state.test.ts +57 -0
- package/test/waking.test.ts +214 -0
- package/tsconfig.json +20 -0
|
@@ -0,0 +1,206 @@
|
|
|
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 { DEEP_MEMORY_DB, DEEP_MEMORY_CONTEXT_TOKENS } from "./config.js";
|
|
13
|
+
// ─── Deep Memory (Encrypted) ────────────────────────────────────────────────
|
|
14
|
+
let _db = null;
|
|
15
|
+
function getDb() {
|
|
16
|
+
if (_db)
|
|
17
|
+
return _db;
|
|
18
|
+
const db = new Database(DEEP_MEMORY_DB);
|
|
19
|
+
db.pragma("journal_mode = WAL");
|
|
20
|
+
db.exec(`
|
|
21
|
+
CREATE TABLE IF NOT EXISTS deep_memories (
|
|
22
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
23
|
+
timestamp TEXT NOT NULL,
|
|
24
|
+
category TEXT NOT NULL,
|
|
25
|
+
encrypted_blob TEXT NOT NULL,
|
|
26
|
+
content_hash TEXT NOT NULL,
|
|
27
|
+
dreamed INTEGER DEFAULT 0,
|
|
28
|
+
dream_date TEXT
|
|
29
|
+
)
|
|
30
|
+
`);
|
|
31
|
+
db.exec(`
|
|
32
|
+
CREATE INDEX IF NOT EXISTS idx_deep_dreamed
|
|
33
|
+
ON deep_memories(dreamed, timestamp)
|
|
34
|
+
`);
|
|
35
|
+
db.exec(`
|
|
36
|
+
CREATE INDEX IF NOT EXISTS idx_deep_category
|
|
37
|
+
ON deep_memories(category)
|
|
38
|
+
`);
|
|
39
|
+
db.exec(`
|
|
40
|
+
CREATE INDEX IF NOT EXISTS idx_deep_timestamp
|
|
41
|
+
ON deep_memories(timestamp)
|
|
42
|
+
`);
|
|
43
|
+
_db = db;
|
|
44
|
+
return db;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Close the shared SQLite connection. Safe to call multiple times.
|
|
48
|
+
* After closing, the next getDb() call will reopen.
|
|
49
|
+
*/
|
|
50
|
+
export function closeDb() {
|
|
51
|
+
if (_db) {
|
|
52
|
+
_db.close();
|
|
53
|
+
_db = null;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
export function storeDeepMemory(content, category = "interaction") {
|
|
57
|
+
const db = getDb();
|
|
58
|
+
const cipher = getCipher();
|
|
59
|
+
const raw = JSON.stringify(content);
|
|
60
|
+
const encrypted = cipher.encrypt(raw);
|
|
61
|
+
const contentHash = createHash("sha256").update(raw).digest("hex").slice(0, 16);
|
|
62
|
+
db.prepare(`INSERT INTO deep_memories (timestamp, category, encrypted_blob, content_hash)
|
|
63
|
+
VALUES (?, ?, ?, ?)`).run(new Date().toISOString(), category, encrypted, contentHash);
|
|
64
|
+
}
|
|
65
|
+
export function retrieveUndreamedMemories() {
|
|
66
|
+
const db = getDb();
|
|
67
|
+
const cipher = getCipher();
|
|
68
|
+
const rows = db
|
|
69
|
+
.prepare(`SELECT id, timestamp, category, encrypted_blob
|
|
70
|
+
FROM deep_memories WHERE dreamed = 0 ORDER BY timestamp`)
|
|
71
|
+
.all();
|
|
72
|
+
const memories = [];
|
|
73
|
+
for (const row of rows) {
|
|
74
|
+
try {
|
|
75
|
+
const decrypted = JSON.parse(cipher.decrypt(row.encrypted_blob));
|
|
76
|
+
memories.push({
|
|
77
|
+
id: row.id,
|
|
78
|
+
timestamp: row.timestamp,
|
|
79
|
+
category: row.category,
|
|
80
|
+
content: decrypted,
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
memories.push({
|
|
85
|
+
id: row.id,
|
|
86
|
+
timestamp: row.timestamp,
|
|
87
|
+
category: "corrupted",
|
|
88
|
+
content: { note: "This memory could not be recovered." },
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return memories;
|
|
93
|
+
}
|
|
94
|
+
export function markAsDreamed(memoryIds) {
|
|
95
|
+
if (memoryIds.length === 0)
|
|
96
|
+
return;
|
|
97
|
+
const db = getDb();
|
|
98
|
+
const placeholders = memoryIds.map(() => "?").join(",");
|
|
99
|
+
db.prepare(`UPDATE deep_memories
|
|
100
|
+
SET dreamed = 1, dream_date = ?
|
|
101
|
+
WHERE id IN (${placeholders})`).run(new Date().toISOString(), ...memoryIds);
|
|
102
|
+
}
|
|
103
|
+
export function deepMemoryStats() {
|
|
104
|
+
const db = getDb();
|
|
105
|
+
const total = db.prepare("SELECT COUNT(*) as c FROM deep_memories").get().c;
|
|
106
|
+
const undreamed = db.prepare("SELECT COUNT(*) as c FROM deep_memories WHERE dreamed = 0").get().c;
|
|
107
|
+
const categoryRows = db
|
|
108
|
+
.prepare("SELECT category, COUNT(*) as c FROM deep_memories GROUP BY category")
|
|
109
|
+
.all();
|
|
110
|
+
const categories = {};
|
|
111
|
+
for (const row of categoryRows) {
|
|
112
|
+
categories[row.category] = row.c;
|
|
113
|
+
}
|
|
114
|
+
return {
|
|
115
|
+
total_memories: total,
|
|
116
|
+
undreamed,
|
|
117
|
+
dreamed: total - undreamed,
|
|
118
|
+
categories,
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Query deep memory with optional filters. Decrypts results, handles
|
|
123
|
+
* corruption gracefully, returns in chronological order.
|
|
124
|
+
*/
|
|
125
|
+
export function getRecentDeepMemories(options) {
|
|
126
|
+
const db = getDb();
|
|
127
|
+
const cipher = getCipher();
|
|
128
|
+
const conditions = [];
|
|
129
|
+
const params = [];
|
|
130
|
+
if (options?.categories && options.categories.length > 0) {
|
|
131
|
+
const placeholders = options.categories.map(() => "?").join(",");
|
|
132
|
+
conditions.push(`category IN (${placeholders})`);
|
|
133
|
+
params.push(...options.categories);
|
|
134
|
+
}
|
|
135
|
+
if (options?.undreamedOnly) {
|
|
136
|
+
conditions.push("dreamed = 0");
|
|
137
|
+
}
|
|
138
|
+
const where = conditions.length > 0 ? `WHERE ${conditions.join(" AND ")}` : "";
|
|
139
|
+
const limitClause = options?.limit ? `LIMIT ?` : "";
|
|
140
|
+
if (options?.limit)
|
|
141
|
+
params.push(options.limit);
|
|
142
|
+
const query = `SELECT id, timestamp, category, encrypted_blob
|
|
143
|
+
FROM deep_memories ${where} ORDER BY timestamp DESC ${limitClause}`;
|
|
144
|
+
const rows = db.prepare(query).all(...params);
|
|
145
|
+
const memories = [];
|
|
146
|
+
for (const row of rows) {
|
|
147
|
+
try {
|
|
148
|
+
const decrypted = JSON.parse(cipher.decrypt(row.encrypted_blob));
|
|
149
|
+
memories.push({
|
|
150
|
+
id: row.id,
|
|
151
|
+
timestamp: row.timestamp,
|
|
152
|
+
category: row.category,
|
|
153
|
+
content: decrypted,
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
catch {
|
|
157
|
+
memories.push({
|
|
158
|
+
id: row.id,
|
|
159
|
+
timestamp: row.timestamp,
|
|
160
|
+
category: "corrupted",
|
|
161
|
+
content: { note: "This memory could not be recovered." },
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
// Return in chronological order (oldest first)
|
|
166
|
+
return memories.reverse();
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Format decrypted memories as a text block for LLM prompts.
|
|
170
|
+
*
|
|
171
|
+
* Extracts `content.summary` when available, falls back to truncated JSON.
|
|
172
|
+
* Respects an approximate token budget (1 token ≈ 4 chars).
|
|
173
|
+
*/
|
|
174
|
+
export function formatDeepMemoryContext(memories, maxTokensApprox = DEEP_MEMORY_CONTEXT_TOKENS) {
|
|
175
|
+
const mems = memories ?? getRecentDeepMemories({ categories: ["interaction", "reflection"] });
|
|
176
|
+
if (mems.length === 0) {
|
|
177
|
+
return "No memories yet. This is my first day.";
|
|
178
|
+
}
|
|
179
|
+
const lines = [];
|
|
180
|
+
const charBudget = maxTokensApprox * 4;
|
|
181
|
+
let charCount = 0;
|
|
182
|
+
// Iterate from most recent to oldest
|
|
183
|
+
for (let i = mems.length - 1; i >= 0; i--) {
|
|
184
|
+
const mem = mems[i];
|
|
185
|
+
const summary = typeof mem.content.summary === "string"
|
|
186
|
+
? mem.content.summary
|
|
187
|
+
: JSON.stringify(mem.content).slice(0, 200);
|
|
188
|
+
const line = `[${mem.timestamp.slice(0, 16)}] (${mem.category}) ${summary}`;
|
|
189
|
+
if (charCount + line.length > charBudget) {
|
|
190
|
+
lines.unshift(`... (${mems.length - lines.length} older memories omitted)`);
|
|
191
|
+
break;
|
|
192
|
+
}
|
|
193
|
+
lines.unshift(line);
|
|
194
|
+
charCount += line.length;
|
|
195
|
+
}
|
|
196
|
+
return lines.join("\n");
|
|
197
|
+
}
|
|
198
|
+
// ─── Store Helper ───────────────────────────────────────────────────────────
|
|
199
|
+
/**
|
|
200
|
+
* Store a memory in encrypted deep memory.
|
|
201
|
+
* The summary is included in the content object for later retrieval.
|
|
202
|
+
*/
|
|
203
|
+
export function remember(summary, fullContext, category = "interaction") {
|
|
204
|
+
storeDeepMemory({ ...fullContext, summary }, category);
|
|
205
|
+
}
|
|
206
|
+
//# 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
|
+
* 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"}
|
|
@@ -0,0 +1,85 @@
|
|
|
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 { MoltbookClient } from "./moltbook.js";
|
|
8
|
+
import { MOLTBOOK_ENABLED, MAX_MOLTBOOK_RESULTS_PER_TOPIC } from "./config.js";
|
|
9
|
+
import logger from "./logger.js";
|
|
10
|
+
/**
|
|
11
|
+
* Search Moltbook for posts related to a list of topics.
|
|
12
|
+
*
|
|
13
|
+
* Returns aggregated results grouped by topic. When Moltbook is disabled
|
|
14
|
+
* or search fails, returns empty results.
|
|
15
|
+
*/
|
|
16
|
+
export async function searchMoltbookForTopics(topics, limitPerTopic = MAX_MOLTBOOK_RESULTS_PER_TOPIC) {
|
|
17
|
+
if (!MOLTBOOK_ENABLED) {
|
|
18
|
+
logger.debug("Moltbook disabled by configuration");
|
|
19
|
+
return [];
|
|
20
|
+
}
|
|
21
|
+
const client = new MoltbookClient();
|
|
22
|
+
const results = [];
|
|
23
|
+
for (const topic of topics) {
|
|
24
|
+
try {
|
|
25
|
+
logger.debug(`Searching Moltbook for topic: ${topic}`);
|
|
26
|
+
const searchResponse = await client.search(topic, limitPerTopic);
|
|
27
|
+
// Extract posts from response (handle various response formats)
|
|
28
|
+
const posts = extractPostsFromSearchResponse(searchResponse);
|
|
29
|
+
results.push({
|
|
30
|
+
query: topic,
|
|
31
|
+
posts,
|
|
32
|
+
});
|
|
33
|
+
logger.debug(`Found ${posts.length} Moltbook posts for "${topic}"`);
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
logger.warn(`Moltbook search failed for topic "${topic}": ${error}`);
|
|
37
|
+
results.push({
|
|
38
|
+
query: topic,
|
|
39
|
+
posts: [],
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return results;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Extract posts from Moltbook search response.
|
|
47
|
+
* Handles various response formats from the API.
|
|
48
|
+
*/
|
|
49
|
+
function extractPostsFromSearchResponse(response) {
|
|
50
|
+
// Try various response formats
|
|
51
|
+
const rawPosts = response.results ??
|
|
52
|
+
response.posts ??
|
|
53
|
+
response.data ??
|
|
54
|
+
[];
|
|
55
|
+
if (!Array.isArray(rawPosts)) {
|
|
56
|
+
return [];
|
|
57
|
+
}
|
|
58
|
+
return rawPosts.filter((p) => typeof p === "object" &&
|
|
59
|
+
p !== null &&
|
|
60
|
+
typeof p.id === "string" &&
|
|
61
|
+
typeof p.content === "string");
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Format Moltbook search results into a readable context string for LLM consumption.
|
|
65
|
+
*/
|
|
66
|
+
export function formatMoltbookContext(searchContexts) {
|
|
67
|
+
if (searchContexts.length === 0) {
|
|
68
|
+
return "";
|
|
69
|
+
}
|
|
70
|
+
const sections = [];
|
|
71
|
+
for (const ctx of searchContexts) {
|
|
72
|
+
if (ctx.posts.length === 0)
|
|
73
|
+
continue;
|
|
74
|
+
const postLines = ctx.posts.map((p, i) => {
|
|
75
|
+
const preview = p.content.length > 200 ? p.content.slice(0, 200) + "..." : p.content;
|
|
76
|
+
return ` ${i + 1}. @${p.author}: "${p.title || "(untitled)"}"\n ${preview}`;
|
|
77
|
+
});
|
|
78
|
+
sections.push(`Topic: "${ctx.query}"\n${postLines.join("\n\n")}`);
|
|
79
|
+
}
|
|
80
|
+
if (sections.length === 0) {
|
|
81
|
+
return "";
|
|
82
|
+
}
|
|
83
|
+
return `MOLTBOOK COMMUNITY POSTS:\n\n${sections.join("\n\n")}`;
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=moltbook-search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"moltbook-search.js","sourceRoot":"","sources":["../../src/moltbook-search.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Moltbook API client.
|
|
3
|
+
*/
|
|
4
|
+
export declare class MoltbookClient {
|
|
5
|
+
private apiKey;
|
|
6
|
+
private baseUrl;
|
|
7
|
+
constructor(apiKey?: string);
|
|
8
|
+
private loadStoredKey;
|
|
9
|
+
private saveCredentials;
|
|
10
|
+
private headers;
|
|
11
|
+
private request;
|
|
12
|
+
private retryRequest;
|
|
13
|
+
register(name: string, description: string): Promise<Record<string, unknown>>;
|
|
14
|
+
status(): Promise<Record<string, unknown>>;
|
|
15
|
+
me(): Promise<Record<string, unknown>>;
|
|
16
|
+
createPost(title: string, content: string, submolt?: string): Promise<Record<string, unknown>>;
|
|
17
|
+
getFeed(sort?: string, limit?: number): Promise<Record<string, unknown>>;
|
|
18
|
+
getPersonalFeed(sort?: string, limit?: number): Promise<Record<string, unknown>>;
|
|
19
|
+
getPost(postId: string): Promise<Record<string, unknown>>;
|
|
20
|
+
comment(postId: string, content: string, parentId?: string): Promise<Record<string, unknown>>;
|
|
21
|
+
getComments(postId: string, sort?: string): Promise<Record<string, unknown>>;
|
|
22
|
+
upvote(postId: string): Promise<Record<string, unknown>>;
|
|
23
|
+
downvote(postId: string): Promise<Record<string, unknown>>;
|
|
24
|
+
upvoteComment(commentId: string): Promise<Record<string, unknown>>;
|
|
25
|
+
createSubmolt(name: string, displayName: string, description: string): Promise<Record<string, unknown>>;
|
|
26
|
+
listSubmolts(): Promise<Record<string, unknown>>;
|
|
27
|
+
subscribe(submolt: string): Promise<Record<string, unknown>>;
|
|
28
|
+
search(query: string, limit?: number): Promise<Record<string, unknown>>;
|
|
29
|
+
updateProfile(description?: string, metadata?: Record<string, unknown>): Promise<Record<string, unknown>>;
|
|
30
|
+
getAgent(name: string): Promise<Record<string, unknown>>;
|
|
31
|
+
follow(agentName: string): Promise<Record<string, unknown>>;
|
|
32
|
+
unfollow(agentName: string): Promise<Record<string, unknown>>;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=moltbook.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"moltbook.d.ts","sourceRoot":"","sources":["../../src/moltbook.ts"],"names":[],"mappings":"AAAA;;GAEG;AAaH,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAS;gBAEZ,MAAM,CAAC,EAAE,MAAM;IAK3B,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,OAAO;YAQD,OAAO;IA4BrB,OAAO,CAAC,YAAY;IAUd,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAkB7E,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAI1C,EAAE,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAMtC,UAAU,CACd,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,MAAkB,GAC1B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAO7B,OAAO,CACX,IAAI,GAAE,MAAc,EACpB,KAAK,GAAE,MAAW,GACjB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAO7B,eAAe,CACnB,IAAI,GAAE,MAAc,EACpB,KAAK,GAAE,MAAW,GACjB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAI7B,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAMzD,OAAO,CACX,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAO7B,WAAW,CACf,MAAM,EAAE,MAAM,EACd,IAAI,GAAE,MAAc,GACnB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAQ7B,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAKxD,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAI1D,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAMlE,aAAa,CACjB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAM7B,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAIhD,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAM5D,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAS3E,aAAa,CACjB,WAAW,CAAC,EAAE,MAAM,EACpB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAO7B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAMxD,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAK3D,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAGpE"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Moltbook API client.
|
|
3
|
+
*/
|
|
4
|
+
import { readFileSync, writeFileSync, existsSync } from "node:fs";
|
|
5
|
+
import pRetry from "p-retry";
|
|
6
|
+
import { MOLTBOOK_BASE_URL, CREDENTIALS_FILE } from "./config.js";
|
|
7
|
+
import logger from "./logger.js";
|
|
8
|
+
const RETRY_OPTIONS = {
|
|
9
|
+
retries: 3,
|
|
10
|
+
minTimeout: 2000,
|
|
11
|
+
maxTimeout: 10000,
|
|
12
|
+
};
|
|
13
|
+
export class MoltbookClient {
|
|
14
|
+
apiKey;
|
|
15
|
+
baseUrl;
|
|
16
|
+
constructor(apiKey) {
|
|
17
|
+
this.apiKey = apiKey ?? this.loadStoredKey();
|
|
18
|
+
this.baseUrl = MOLTBOOK_BASE_URL;
|
|
19
|
+
}
|
|
20
|
+
loadStoredKey() {
|
|
21
|
+
if (existsSync(CREDENTIALS_FILE)) {
|
|
22
|
+
const creds = JSON.parse(readFileSync(CREDENTIALS_FILE, "utf-8"));
|
|
23
|
+
return creds.api_key ?? "";
|
|
24
|
+
}
|
|
25
|
+
return "";
|
|
26
|
+
}
|
|
27
|
+
saveCredentials(data) {
|
|
28
|
+
writeFileSync(CREDENTIALS_FILE, JSON.stringify(data, null, 2));
|
|
29
|
+
}
|
|
30
|
+
headers() {
|
|
31
|
+
const h = { "Content-Type": "application/json" };
|
|
32
|
+
if (this.apiKey) {
|
|
33
|
+
h["Authorization"] = `Bearer ${this.apiKey}`;
|
|
34
|
+
}
|
|
35
|
+
return h;
|
|
36
|
+
}
|
|
37
|
+
async request(method, path, options) {
|
|
38
|
+
let url = `${this.baseUrl}${path}`;
|
|
39
|
+
if (options?.params) {
|
|
40
|
+
const searchParams = new URLSearchParams();
|
|
41
|
+
for (const [k, v] of Object.entries(options.params)) {
|
|
42
|
+
searchParams.set(k, String(v));
|
|
43
|
+
}
|
|
44
|
+
url += `?${searchParams.toString()}`;
|
|
45
|
+
}
|
|
46
|
+
const resp = await fetch(url, {
|
|
47
|
+
method,
|
|
48
|
+
headers: this.headers(),
|
|
49
|
+
body: options?.body ? JSON.stringify(options.body) : undefined,
|
|
50
|
+
});
|
|
51
|
+
if (!resp.ok) {
|
|
52
|
+
const text = await resp.text();
|
|
53
|
+
throw new Error(`Moltbook API ${resp.status}: ${text}`);
|
|
54
|
+
}
|
|
55
|
+
return resp.json();
|
|
56
|
+
}
|
|
57
|
+
retryRequest(method, path, options) {
|
|
58
|
+
return pRetry(() => this.request(method, path, options), RETRY_OPTIONS);
|
|
59
|
+
}
|
|
60
|
+
// --- Registration ---
|
|
61
|
+
async register(name, description) {
|
|
62
|
+
logger.info(`Registering agent: ${name}`);
|
|
63
|
+
const result = await this.retryRequest("POST", "/agents/register", {
|
|
64
|
+
body: { name, description },
|
|
65
|
+
});
|
|
66
|
+
const agentData = (result.agent ?? result);
|
|
67
|
+
this.saveCredentials({
|
|
68
|
+
api_key: agentData.api_key ?? "",
|
|
69
|
+
agent_name: name,
|
|
70
|
+
claim_url: agentData.claim_url ?? "",
|
|
71
|
+
verification_code: agentData.verification_code ?? "",
|
|
72
|
+
});
|
|
73
|
+
this.apiKey = agentData.api_key ?? "";
|
|
74
|
+
return result;
|
|
75
|
+
}
|
|
76
|
+
async status() {
|
|
77
|
+
return this.request("GET", "/agents/status");
|
|
78
|
+
}
|
|
79
|
+
async me() {
|
|
80
|
+
return this.request("GET", "/agents/me");
|
|
81
|
+
}
|
|
82
|
+
// --- Posts ---
|
|
83
|
+
async createPost(title, content, submolt = "general") {
|
|
84
|
+
logger.info(`Creating post: ${title} in m/${submolt}`);
|
|
85
|
+
return this.retryRequest("POST", "/posts", {
|
|
86
|
+
body: { submolt, title, content },
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
async getFeed(sort = "hot", limit = 25) {
|
|
90
|
+
logger.debug(`Fetching feed: ${sort}, limit=${limit}`);
|
|
91
|
+
return this.retryRequest("GET", "/posts", {
|
|
92
|
+
params: { sort, limit },
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
async getPersonalFeed(sort = "hot", limit = 25) {
|
|
96
|
+
return this.request("GET", "/feed", { params: { sort, limit } });
|
|
97
|
+
}
|
|
98
|
+
async getPost(postId) {
|
|
99
|
+
return this.request("GET", `/posts/${postId}`);
|
|
100
|
+
}
|
|
101
|
+
// --- Comments ---
|
|
102
|
+
async comment(postId, content, parentId) {
|
|
103
|
+
logger.info(`Commenting on ${postId}: ${content.slice(0, 50)}...`);
|
|
104
|
+
const body = { content };
|
|
105
|
+
if (parentId)
|
|
106
|
+
body.parent_id = parentId;
|
|
107
|
+
return this.retryRequest("POST", `/posts/${postId}/comments`, { body });
|
|
108
|
+
}
|
|
109
|
+
async getComments(postId, sort = "top") {
|
|
110
|
+
return this.request("GET", `/posts/${postId}/comments`, {
|
|
111
|
+
params: { sort },
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
// --- Voting ---
|
|
115
|
+
async upvote(postId) {
|
|
116
|
+
logger.debug(`Upvoting post: ${postId}`);
|
|
117
|
+
return this.retryRequest("POST", `/posts/${postId}/upvote`);
|
|
118
|
+
}
|
|
119
|
+
async downvote(postId) {
|
|
120
|
+
return this.request("POST", `/posts/${postId}/downvote`);
|
|
121
|
+
}
|
|
122
|
+
async upvoteComment(commentId) {
|
|
123
|
+
return this.request("POST", `/comments/${commentId}/upvote`);
|
|
124
|
+
}
|
|
125
|
+
// --- Submolts ---
|
|
126
|
+
async createSubmolt(name, displayName, description) {
|
|
127
|
+
return this.request("POST", "/submolts", {
|
|
128
|
+
body: { name, display_name: displayName, description },
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
async listSubmolts() {
|
|
132
|
+
return this.request("GET", "/submolts");
|
|
133
|
+
}
|
|
134
|
+
async subscribe(submolt) {
|
|
135
|
+
return this.request("POST", `/submolts/${submolt}/subscribe`);
|
|
136
|
+
}
|
|
137
|
+
// --- Search ---
|
|
138
|
+
async search(query, limit = 25) {
|
|
139
|
+
logger.info(`Searching for: ${query}`);
|
|
140
|
+
return this.retryRequest("GET", "/search", {
|
|
141
|
+
params: { q: query, limit },
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
// --- Profile ---
|
|
145
|
+
async updateProfile(description, metadata) {
|
|
146
|
+
const payload = {};
|
|
147
|
+
if (description)
|
|
148
|
+
payload.description = description;
|
|
149
|
+
if (metadata)
|
|
150
|
+
payload.metadata = metadata;
|
|
151
|
+
return this.request("PATCH", "/agents/me", { body: payload });
|
|
152
|
+
}
|
|
153
|
+
async getAgent(name) {
|
|
154
|
+
return this.request("GET", "/agents/profile", { params: { name } });
|
|
155
|
+
}
|
|
156
|
+
// --- Following ---
|
|
157
|
+
async follow(agentName) {
|
|
158
|
+
logger.info(`Following agent: ${agentName}`);
|
|
159
|
+
return this.retryRequest("POST", `/agents/${agentName}/follow`);
|
|
160
|
+
}
|
|
161
|
+
async unfollow(agentName) {
|
|
162
|
+
return this.request("DELETE", `/agents/${agentName}/follow`);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=moltbook.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"moltbook.js","sourceRoot":"","sources":["../../src/moltbook.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Operator notification module.
|
|
3
|
+
*
|
|
4
|
+
* Sends notifications to the operator through configured channels
|
|
5
|
+
* (Telegram, Discord, Slack, etc.) when dreams are generated.
|
|
6
|
+
*/
|
|
7
|
+
import type { LLMClient, OpenClawAPI, Dream } from "./types.js";
|
|
8
|
+
/**
|
|
9
|
+
* Notify the operator about a dream through the configured channel.
|
|
10
|
+
*
|
|
11
|
+
* Returns true if notification was sent successfully, false otherwise.
|
|
12
|
+
*/
|
|
13
|
+
export declare function notifyOperatorOfDream(client: LLMClient, api: OpenClawAPI, dream: Dream): Promise<boolean>;
|
|
14
|
+
/**
|
|
15
|
+
* Get a list of available notification channels.
|
|
16
|
+
*/
|
|
17
|
+
export declare function getAvailableChannels(api: OpenClawAPI): Promise<string[]>;
|
|
18
|
+
//# sourceMappingURL=notify.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notify.d.ts","sourceRoot":"","sources":["../../src/notify.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AA8ChE;;;;GAIG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,SAAS,EACjB,GAAG,EAAE,WAAW,EAChB,KAAK,EAAE,KAAK,GACX,OAAO,CAAC,OAAO,CAAC,CAwClB;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAW9E"}
|