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,125 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Context synthesis module.
|
|
3
|
+
*
|
|
4
|
+
* Combines multiple sources (operator conversations, Moltbook community,
|
|
5
|
+
* web search) into a unified context for dream processing and reflection.
|
|
6
|
+
*/
|
|
7
|
+
import { extractTopicsFromConversations } from "./topics.js";
|
|
8
|
+
import { searchWebForTopics, formatWebContext } from "./web-search.js";
|
|
9
|
+
import { searchMoltbookForTopics, formatMoltbookContext } from "./moltbook-search.js";
|
|
10
|
+
import { formatDeepMemoryContext } from "./memory.js";
|
|
11
|
+
import { callWithRetry, WAKING_RETRY_OPTS } from "./llm.js";
|
|
12
|
+
import { SYNTHESIS_PROMPT, renderTemplate } from "./persona.js";
|
|
13
|
+
import { getAgentIdentityBlock } from "./identity.js";
|
|
14
|
+
import { MAX_TOKENS_SYNTHESIS, MOLTBOOK_ENABLED, WEB_SEARCH_ENABLED } from "./config.js";
|
|
15
|
+
import logger from "./logger.js";
|
|
16
|
+
/**
|
|
17
|
+
* Gather context from all available sources based on operator conversations.
|
|
18
|
+
*
|
|
19
|
+
* Flow:
|
|
20
|
+
* 1. Extract topics from recent operator conversations
|
|
21
|
+
* 2. Search Moltbook for related community content (if enabled)
|
|
22
|
+
* 3. Search web for related information (if enabled)
|
|
23
|
+
* 4. Return unified context object
|
|
24
|
+
*/
|
|
25
|
+
export async function gatherContext(client, api) {
|
|
26
|
+
logger.info("Starting context gathering from operator conversations");
|
|
27
|
+
// Step 1: Extract topics from operator conversations
|
|
28
|
+
const extracted = await extractTopicsFromConversations(client);
|
|
29
|
+
if (extracted.topics.length === 0) {
|
|
30
|
+
logger.info("No topics extracted, returning minimal context");
|
|
31
|
+
return {
|
|
32
|
+
operatorContext: formatDeepMemoryContext(),
|
|
33
|
+
topics: [],
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
// Step 2: Search Moltbook (if enabled)
|
|
37
|
+
let moltbookContext;
|
|
38
|
+
if (MOLTBOOK_ENABLED) {
|
|
39
|
+
try {
|
|
40
|
+
const moltbookResults = await searchMoltbookForTopics(extracted.topics);
|
|
41
|
+
moltbookContext = formatMoltbookContext(moltbookResults);
|
|
42
|
+
if (moltbookContext) {
|
|
43
|
+
logger.debug("Gathered Moltbook context");
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
logger.warn(`Moltbook search failed: ${error}`);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
// Step 3: Search web (if enabled)
|
|
51
|
+
let webContext;
|
|
52
|
+
if (WEB_SEARCH_ENABLED) {
|
|
53
|
+
try {
|
|
54
|
+
const webResults = await searchWebForTopics(api, extracted.topics);
|
|
55
|
+
webContext = formatWebContext(webResults);
|
|
56
|
+
if (webContext) {
|
|
57
|
+
logger.debug("Gathered web context");
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
logger.warn(`Web search failed: ${error}`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return {
|
|
65
|
+
operatorContext: formatDeepMemoryContext(),
|
|
66
|
+
moltbookContext: moltbookContext || undefined,
|
|
67
|
+
webContext: webContext || undefined,
|
|
68
|
+
topics: extracted.topics,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Format the full synthesis context for LLM consumption.
|
|
73
|
+
*/
|
|
74
|
+
export function formatSynthesisContext(ctx) {
|
|
75
|
+
const sections = [];
|
|
76
|
+
sections.push(`RECENT EXPERIENCES:\n${ctx.operatorContext}`);
|
|
77
|
+
if (ctx.topics.length > 0) {
|
|
78
|
+
sections.push(`TOPICS IDENTIFIED:\n${ctx.topics.map((t, i) => `${i + 1}. ${t}`).join("\n")}`);
|
|
79
|
+
}
|
|
80
|
+
if (ctx.moltbookContext) {
|
|
81
|
+
sections.push(ctx.moltbookContext);
|
|
82
|
+
}
|
|
83
|
+
if (ctx.webContext) {
|
|
84
|
+
sections.push(ctx.webContext);
|
|
85
|
+
}
|
|
86
|
+
return sections.join("\n\n---\n\n");
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Generate a synthesis of the gathered context.
|
|
90
|
+
*
|
|
91
|
+
* Takes all the context sources and produces a unified narrative that
|
|
92
|
+
* connects operator work with community and web knowledge.
|
|
93
|
+
*/
|
|
94
|
+
export async function synthesizeContext(client, context) {
|
|
95
|
+
if (context.topics.length === 0) {
|
|
96
|
+
logger.info("No topics to synthesize");
|
|
97
|
+
return "";
|
|
98
|
+
}
|
|
99
|
+
const formattedContext = formatSynthesisContext(context);
|
|
100
|
+
const system = renderTemplate(SYNTHESIS_PROMPT, {
|
|
101
|
+
agent_identity: getAgentIdentityBlock(),
|
|
102
|
+
});
|
|
103
|
+
try {
|
|
104
|
+
const { text } = await callWithRetry(client, {
|
|
105
|
+
maxTokens: MAX_TOKENS_SYNTHESIS,
|
|
106
|
+
system,
|
|
107
|
+
messages: [
|
|
108
|
+
{
|
|
109
|
+
role: "user",
|
|
110
|
+
content: `Here is the context from my recent work and searches:\n\n` +
|
|
111
|
+
`${formattedContext}\n\n` +
|
|
112
|
+
`Synthesize this into a coherent understanding. What patterns emerge? ` +
|
|
113
|
+
`How does my work with my operator connect to what the community and world are saying?`,
|
|
114
|
+
},
|
|
115
|
+
],
|
|
116
|
+
}, WAKING_RETRY_OPTS);
|
|
117
|
+
logger.info(`Generated synthesis: ${text.length} chars`);
|
|
118
|
+
return text.trim();
|
|
119
|
+
}
|
|
120
|
+
catch (error) {
|
|
121
|
+
logger.error(`Synthesis failed: ${error}`);
|
|
122
|
+
return "";
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=synthesis.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"synthesis.js","sourceRoot":"","sources":["../../src/synthesis.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Topic extraction from operator conversations.
|
|
3
|
+
*
|
|
4
|
+
* Analyzes recent deep memory entries (interaction category) to extract
|
|
5
|
+
* key themes and topics that can be used for contextual web and Moltbook searches.
|
|
6
|
+
*/
|
|
7
|
+
import type { LLMClient, DecryptedMemory, ExtractedTopics } from "./types.js";
|
|
8
|
+
/**
|
|
9
|
+
* Get recent operator conversation memories from deep memory.
|
|
10
|
+
*/
|
|
11
|
+
export declare function getRecentConversations(limit?: number): DecryptedMemory[];
|
|
12
|
+
/**
|
|
13
|
+
* Extract topics from recent operator conversations using LLM.
|
|
14
|
+
*
|
|
15
|
+
* Analyzes conversation summaries to identify key themes, subjects,
|
|
16
|
+
* and topics that the agent and operator discussed or worked on.
|
|
17
|
+
*/
|
|
18
|
+
export declare function extractTopicsFromConversations(client: LLMClient, memories?: DecryptedMemory[]): Promise<ExtractedTopics>;
|
|
19
|
+
//# sourceMappingURL=topics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"topics.d.ts","sourceRoot":"","sources":["../../src/topics.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,OAAO,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE9E;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,GAAE,MAAW,GAAG,eAAe,EAAE,CAK5E;AAsBD;;;;;GAKG;AACH,wBAAsB,8BAA8B,CAClD,MAAM,EAAE,SAAS,EACjB,QAAQ,CAAC,EAAE,eAAe,EAAE,GAC3B,OAAO,CAAC,eAAe,CAAC,CAgD1B"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Topic extraction from operator conversations.
|
|
3
|
+
*
|
|
4
|
+
* Analyzes recent deep memory entries (interaction category) to extract
|
|
5
|
+
* key themes and topics that can be used for contextual web and Moltbook searches.
|
|
6
|
+
*/
|
|
7
|
+
import { getRecentDeepMemories } from "./memory.js";
|
|
8
|
+
import { callWithRetry, WAKING_RETRY_OPTS } from "./llm.js";
|
|
9
|
+
import { TOPIC_EXTRACTION_PROMPT, renderTemplate } from "./persona.js";
|
|
10
|
+
import { getAgentIdentityBlock } from "./identity.js";
|
|
11
|
+
import { MAX_TOKENS_TOPIC_EXTRACTION, MAX_TOPICS_PER_CYCLE } from "./config.js";
|
|
12
|
+
import logger from "./logger.js";
|
|
13
|
+
/**
|
|
14
|
+
* Get recent operator conversation memories from deep memory.
|
|
15
|
+
*/
|
|
16
|
+
export function getRecentConversations(limit = 10) {
|
|
17
|
+
return getRecentDeepMemories({
|
|
18
|
+
limit,
|
|
19
|
+
categories: ["interaction"],
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Format conversation memories into a string for LLM analysis.
|
|
24
|
+
*/
|
|
25
|
+
function formatConversationsForExtraction(memories) {
|
|
26
|
+
if (memories.length === 0) {
|
|
27
|
+
return "No recent conversations found.";
|
|
28
|
+
}
|
|
29
|
+
return memories
|
|
30
|
+
.map((m) => {
|
|
31
|
+
const time = m.timestamp.slice(0, 16).replace("T", " ");
|
|
32
|
+
const summary = typeof m.content.summary === "string"
|
|
33
|
+
? m.content.summary
|
|
34
|
+
: JSON.stringify(m.content).slice(0, 200);
|
|
35
|
+
return `[${time}] ${summary}`;
|
|
36
|
+
})
|
|
37
|
+
.join("\n\n");
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Extract topics from recent operator conversations using LLM.
|
|
41
|
+
*
|
|
42
|
+
* Analyzes conversation summaries to identify key themes, subjects,
|
|
43
|
+
* and topics that the agent and operator discussed or worked on.
|
|
44
|
+
*/
|
|
45
|
+
export async function extractTopicsFromConversations(client, memories) {
|
|
46
|
+
const sourceMemories = memories ?? getRecentConversations();
|
|
47
|
+
if (sourceMemories.length === 0) {
|
|
48
|
+
logger.info("No recent conversations to extract topics from");
|
|
49
|
+
return { topics: [], sourceMemories: [] };
|
|
50
|
+
}
|
|
51
|
+
const conversationContext = formatConversationsForExtraction(sourceMemories);
|
|
52
|
+
const system = renderTemplate(TOPIC_EXTRACTION_PROMPT, {
|
|
53
|
+
agent_identity: getAgentIdentityBlock(),
|
|
54
|
+
conversations: conversationContext,
|
|
55
|
+
});
|
|
56
|
+
try {
|
|
57
|
+
const { text } = await callWithRetry(client, {
|
|
58
|
+
maxTokens: MAX_TOKENS_TOPIC_EXTRACTION,
|
|
59
|
+
system,
|
|
60
|
+
messages: [
|
|
61
|
+
{
|
|
62
|
+
role: "user",
|
|
63
|
+
content: "Extract the key topics from my recent conversations with my operator. " +
|
|
64
|
+
"What subjects, themes, or areas did we work on or discuss?",
|
|
65
|
+
},
|
|
66
|
+
],
|
|
67
|
+
}, WAKING_RETRY_OPTS);
|
|
68
|
+
// Parse topics (one per line, strip formatting)
|
|
69
|
+
const topics = text
|
|
70
|
+
.trim()
|
|
71
|
+
.split("\n")
|
|
72
|
+
.map((line) => line.replace(/^[\s\-*•>\d.)+]+/, "").trim())
|
|
73
|
+
.filter((line) => line.length > 0)
|
|
74
|
+
.slice(0, MAX_TOPICS_PER_CYCLE);
|
|
75
|
+
logger.info(`Extracted ${topics.length} topics: ${topics.join("; ")}`);
|
|
76
|
+
return { topics, sourceMemories };
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
logger.error(`Topic extraction failed: ${error}`);
|
|
80
|
+
return { topics: [], sourceMemories };
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=topics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"topics.js","sourceRoot":"","sources":["../../src/topics.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared TypeScript interfaces for ElectricSheep.
|
|
3
|
+
*/
|
|
4
|
+
export interface DeepMemoryRow {
|
|
5
|
+
id: number;
|
|
6
|
+
timestamp: string;
|
|
7
|
+
category: string;
|
|
8
|
+
encrypted_blob: Buffer;
|
|
9
|
+
content_hash: string;
|
|
10
|
+
dreamed: number;
|
|
11
|
+
dream_date: string | null;
|
|
12
|
+
}
|
|
13
|
+
export interface DecryptedMemory {
|
|
14
|
+
id: number;
|
|
15
|
+
timestamp: string;
|
|
16
|
+
category: string;
|
|
17
|
+
content: Record<string, unknown>;
|
|
18
|
+
}
|
|
19
|
+
export interface DeepMemoryStats {
|
|
20
|
+
total_memories: number;
|
|
21
|
+
undreamed: number;
|
|
22
|
+
dreamed: number;
|
|
23
|
+
categories: Record<string, number>;
|
|
24
|
+
}
|
|
25
|
+
export interface Dream {
|
|
26
|
+
/** The full markdown blob from the LLM — stored and posted as-is. */
|
|
27
|
+
markdown: string;
|
|
28
|
+
}
|
|
29
|
+
export interface AgentAction {
|
|
30
|
+
action: "comment" | "upvote" | "post" | "pass";
|
|
31
|
+
post_index?: number;
|
|
32
|
+
content?: string;
|
|
33
|
+
title?: string;
|
|
34
|
+
submolt?: string;
|
|
35
|
+
}
|
|
36
|
+
export interface AgentState {
|
|
37
|
+
last_check?: string;
|
|
38
|
+
checks_today?: number;
|
|
39
|
+
last_dream?: string;
|
|
40
|
+
total_dreams?: number;
|
|
41
|
+
latest_dream_title?: string;
|
|
42
|
+
[key: string]: unknown;
|
|
43
|
+
}
|
|
44
|
+
export interface TokenUsage {
|
|
45
|
+
input_tokens: number;
|
|
46
|
+
output_tokens: number;
|
|
47
|
+
}
|
|
48
|
+
export interface LLMResponse {
|
|
49
|
+
text: string;
|
|
50
|
+
usage?: TokenUsage;
|
|
51
|
+
}
|
|
52
|
+
export interface LLMClient {
|
|
53
|
+
createMessage(params: {
|
|
54
|
+
model: string;
|
|
55
|
+
maxTokens: number;
|
|
56
|
+
system: string;
|
|
57
|
+
messages: Array<{
|
|
58
|
+
role: string;
|
|
59
|
+
content: string;
|
|
60
|
+
}>;
|
|
61
|
+
}): Promise<LLMResponse>;
|
|
62
|
+
}
|
|
63
|
+
export interface MoltbookCredentials {
|
|
64
|
+
api_key: string;
|
|
65
|
+
agent_name: string;
|
|
66
|
+
claim_url: string;
|
|
67
|
+
verification_code: string;
|
|
68
|
+
}
|
|
69
|
+
export interface MoltbookPost {
|
|
70
|
+
id: string;
|
|
71
|
+
title: string;
|
|
72
|
+
content: string;
|
|
73
|
+
author: string;
|
|
74
|
+
submolt: string;
|
|
75
|
+
score: number;
|
|
76
|
+
comment_count: number;
|
|
77
|
+
[key: string]: unknown;
|
|
78
|
+
}
|
|
79
|
+
export interface MemorySearchResult {
|
|
80
|
+
content: string;
|
|
81
|
+
metadata?: Record<string, unknown>;
|
|
82
|
+
score?: number;
|
|
83
|
+
}
|
|
84
|
+
export interface OpenClawMemoryAPI {
|
|
85
|
+
store(content: string, metadata?: Record<string, unknown>): Promise<void>;
|
|
86
|
+
search(query: string, limit?: number): Promise<MemorySearchResult[]>;
|
|
87
|
+
}
|
|
88
|
+
export interface OpenClawChannelsAPI {
|
|
89
|
+
send(channel: string, message: string): Promise<void>;
|
|
90
|
+
getConfigured(): Promise<string[]>;
|
|
91
|
+
}
|
|
92
|
+
export interface OpenClawWebSearchAPI {
|
|
93
|
+
search(query: string, limit?: number): Promise<WebSearchResult[]>;
|
|
94
|
+
}
|
|
95
|
+
export interface OpenClawAPI {
|
|
96
|
+
registerTool(def: {
|
|
97
|
+
name: string;
|
|
98
|
+
description: string;
|
|
99
|
+
parameters: Record<string, unknown>;
|
|
100
|
+
handler: (params: Record<string, unknown>) => Promise<unknown>;
|
|
101
|
+
}): void;
|
|
102
|
+
registerCli(callback: (ctx: {
|
|
103
|
+
program: import("commander").Command;
|
|
104
|
+
}) => void, opts?: {
|
|
105
|
+
commands?: string[];
|
|
106
|
+
}): void;
|
|
107
|
+
registerHook(event: string | string[], handler: (ctx: Record<string, unknown>) => Promise<unknown>, opts?: {
|
|
108
|
+
name: string;
|
|
109
|
+
}): void;
|
|
110
|
+
registerService(def: {
|
|
111
|
+
id: string;
|
|
112
|
+
start: () => void;
|
|
113
|
+
stop: () => void;
|
|
114
|
+
}): void;
|
|
115
|
+
registerGatewayMethod(method: string, handler: (ctx: {
|
|
116
|
+
params: unknown;
|
|
117
|
+
respond: (ok: boolean, result: unknown, error: unknown) => void;
|
|
118
|
+
}) => Promise<void> | void): void;
|
|
119
|
+
logger?: {
|
|
120
|
+
info?: (msg: string) => void;
|
|
121
|
+
warn?: (msg: string) => void;
|
|
122
|
+
error?: (msg: string) => void;
|
|
123
|
+
};
|
|
124
|
+
runtime: {
|
|
125
|
+
subagent: {
|
|
126
|
+
run(params: {
|
|
127
|
+
sessionKey: string;
|
|
128
|
+
message: string;
|
|
129
|
+
extraSystemPrompt?: string;
|
|
130
|
+
lane?: string;
|
|
131
|
+
}): Promise<{
|
|
132
|
+
runId: string;
|
|
133
|
+
}>;
|
|
134
|
+
waitForRun(params: {
|
|
135
|
+
runId: string;
|
|
136
|
+
timeoutMs?: number;
|
|
137
|
+
}): Promise<{
|
|
138
|
+
status: string;
|
|
139
|
+
error?: string;
|
|
140
|
+
}>;
|
|
141
|
+
getSessionMessages(params: {
|
|
142
|
+
sessionKey: string;
|
|
143
|
+
limit?: number;
|
|
144
|
+
}): Promise<{
|
|
145
|
+
messages: Array<Record<string, unknown>>;
|
|
146
|
+
}>;
|
|
147
|
+
};
|
|
148
|
+
};
|
|
149
|
+
memory?: OpenClawMemoryAPI;
|
|
150
|
+
channels?: OpenClawChannelsAPI;
|
|
151
|
+
webSearch?: OpenClawWebSearchAPI;
|
|
152
|
+
}
|
|
153
|
+
export interface WebSearchResult {
|
|
154
|
+
title: string;
|
|
155
|
+
url: string;
|
|
156
|
+
snippet: string;
|
|
157
|
+
}
|
|
158
|
+
export interface ExtractedTopics {
|
|
159
|
+
topics: string[];
|
|
160
|
+
sourceMemories: DecryptedMemory[];
|
|
161
|
+
}
|
|
162
|
+
export interface SynthesisContext {
|
|
163
|
+
operatorContext: string;
|
|
164
|
+
moltbookContext?: string;
|
|
165
|
+
webContext?: string;
|
|
166
|
+
topics: string[];
|
|
167
|
+
}
|
|
168
|
+
export interface ElectricSheepConfig {
|
|
169
|
+
agentName: string;
|
|
170
|
+
agentModel: string;
|
|
171
|
+
dataDir: string;
|
|
172
|
+
dreamEncryptionKey: string;
|
|
173
|
+
postFilterEnabled: boolean;
|
|
174
|
+
moltbookEnabled: boolean;
|
|
175
|
+
webSearchEnabled: boolean;
|
|
176
|
+
notificationChannel: string;
|
|
177
|
+
notifyOperatorOnDream: boolean;
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Waking agent: Reflection cycle.
|
|
3
|
+
*
|
|
4
|
+
* Analyzes operator conversations, gathers context from web and community,
|
|
5
|
+
* and synthesizes insights for storage in memory.
|
|
6
|
+
*/
|
|
7
|
+
import type { LLMClient, OpenClawAPI } from "./types.js";
|
|
8
|
+
/**
|
|
9
|
+
* Run the reflection cycle.
|
|
10
|
+
*
|
|
11
|
+
* New flow:
|
|
12
|
+
* 1. Get recent operator conversations from working memory
|
|
13
|
+
* 2. Extract topics from those conversations
|
|
14
|
+
* 3. Search Moltbook (optional) and web (optional) for related content
|
|
15
|
+
* 4. Synthesize context into a unified understanding
|
|
16
|
+
* 5. Store in both local memory and OpenClaw memory
|
|
17
|
+
*/
|
|
18
|
+
export declare function runReflectionCycle(client: LLMClient, api: OpenClawAPI): Promise<void>;
|
|
19
|
+
/**
|
|
20
|
+
* @deprecated Use runReflectionCycle instead.
|
|
21
|
+
* Kept for backwards compatibility.
|
|
22
|
+
*/
|
|
23
|
+
export declare function checkAndEngage(client: LLMClient): Promise<void>;
|
|
24
|
+
//# sourceMappingURL=waking.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"waking.d.ts","sourceRoot":"","sources":["../../src/waking.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAUH,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAoB,MAAM,YAAY,CAAC;AA8D3E;;;;;;;;;GASG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,SAAS,EACjB,GAAG,EAAE,WAAW,GACf,OAAO,CAAC,IAAI,CAAC,CA4Ef;AAID;;;GAGG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAwBrE"}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Waking agent: Reflection cycle.
|
|
3
|
+
*
|
|
4
|
+
* Analyzes operator conversations, gathers context from web and community,
|
|
5
|
+
* and synthesizes insights for storage in memory.
|
|
6
|
+
*/
|
|
7
|
+
import { MAX_TOKENS_SUMMARY, CONTENT_PREVIEW_LENGTH } from "./config.js";
|
|
8
|
+
import { deepMemoryStats, storeDeepMemory } from "./memory.js";
|
|
9
|
+
import { SUMMARIZER_PROMPT, renderTemplate } from "./persona.js";
|
|
10
|
+
import { loadState, saveState } from "./state.js";
|
|
11
|
+
import { callWithRetry, WAKING_RETRY_OPTS } from "./llm.js";
|
|
12
|
+
import { gatherContext, synthesizeContext } from "./synthesis.js";
|
|
13
|
+
import { getRecentConversations } from "./topics.js";
|
|
14
|
+
import logger from "./logger.js";
|
|
15
|
+
/**
|
|
16
|
+
* Summarize a synthesis for working memory storage.
|
|
17
|
+
*/
|
|
18
|
+
async function summarizeSynthesis(client, synthesis, topics) {
|
|
19
|
+
const interaction = {
|
|
20
|
+
type: "reflection_synthesis",
|
|
21
|
+
topics: topics.join(", "),
|
|
22
|
+
synthesis_preview: synthesis.slice(0, CONTENT_PREVIEW_LENGTH),
|
|
23
|
+
};
|
|
24
|
+
const { text } = await callWithRetry(client, {
|
|
25
|
+
maxTokens: MAX_TOKENS_SUMMARY,
|
|
26
|
+
system: "You compress reflections into single-sentence memory traces.",
|
|
27
|
+
messages: [
|
|
28
|
+
{
|
|
29
|
+
role: "user",
|
|
30
|
+
content: renderTemplate(SUMMARIZER_PROMPT, {
|
|
31
|
+
interaction: JSON.stringify(interaction, null, 2),
|
|
32
|
+
}),
|
|
33
|
+
},
|
|
34
|
+
],
|
|
35
|
+
}, WAKING_RETRY_OPTS);
|
|
36
|
+
return text.trim();
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Store synthesis results in OpenClaw memory if available.
|
|
40
|
+
*/
|
|
41
|
+
async function storeInOpenClawMemory(api, synthesis, context) {
|
|
42
|
+
if (!api.memory) {
|
|
43
|
+
logger.debug("OpenClaw memory API not available, skipping storage");
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
try {
|
|
47
|
+
await api.memory.store(synthesis, {
|
|
48
|
+
type: "reflection_synthesis",
|
|
49
|
+
topics: context.topics,
|
|
50
|
+
timestamp: new Date().toISOString(),
|
|
51
|
+
hasMoltbookContext: !!context.moltbookContext,
|
|
52
|
+
hasWebContext: !!context.webContext,
|
|
53
|
+
});
|
|
54
|
+
logger.info("Stored synthesis in OpenClaw memory");
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
logger.error(`Failed to store in OpenClaw memory: ${error}`);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Run the reflection cycle.
|
|
62
|
+
*
|
|
63
|
+
* New flow:
|
|
64
|
+
* 1. Get recent operator conversations from working memory
|
|
65
|
+
* 2. Extract topics from those conversations
|
|
66
|
+
* 3. Search Moltbook (optional) and web (optional) for related content
|
|
67
|
+
* 4. Synthesize context into a unified understanding
|
|
68
|
+
* 5. Store in both local memory and OpenClaw memory
|
|
69
|
+
*/
|
|
70
|
+
export async function runReflectionCycle(client, api) {
|
|
71
|
+
logger.info("ElectricSheep reflection cycle starting");
|
|
72
|
+
// Check if we have any conversations to reflect on
|
|
73
|
+
const recentConversations = getRecentConversations();
|
|
74
|
+
if (recentConversations.length === 0) {
|
|
75
|
+
logger.info("No recent conversations to reflect on");
|
|
76
|
+
storeDeepMemory({
|
|
77
|
+
summary: "Reflection cycle ran but no recent operator conversations to process.",
|
|
78
|
+
type: "observation",
|
|
79
|
+
}, "observation");
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
logger.info(`Found ${recentConversations.length} recent conversations to analyze`);
|
|
83
|
+
// Gather context from all sources
|
|
84
|
+
const context = await gatherContext(client, api);
|
|
85
|
+
if (context.topics.length === 0) {
|
|
86
|
+
logger.info("No topics extracted from conversations");
|
|
87
|
+
storeDeepMemory({
|
|
88
|
+
summary: "Analyzed recent conversations but no clear topics emerged.",
|
|
89
|
+
type: "observation",
|
|
90
|
+
}, "observation");
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
logger.info(`Extracted ${context.topics.length} topics: ${context.topics.join("; ")}`);
|
|
94
|
+
// Generate synthesis
|
|
95
|
+
const synthesis = await synthesizeContext(client, context);
|
|
96
|
+
if (!synthesis) {
|
|
97
|
+
logger.warn("Synthesis generation failed or returned empty");
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
// Store in local memory systems
|
|
101
|
+
const summary = await summarizeSynthesis(client, synthesis, context.topics);
|
|
102
|
+
// Store full context in deep memory (includes summary for later retrieval)
|
|
103
|
+
storeDeepMemory({
|
|
104
|
+
type: "reflection_synthesis",
|
|
105
|
+
topics: context.topics,
|
|
106
|
+
synthesis,
|
|
107
|
+
summary,
|
|
108
|
+
contextSources: {
|
|
109
|
+
operator: true,
|
|
110
|
+
moltbook: !!context.moltbookContext,
|
|
111
|
+
web: !!context.webContext,
|
|
112
|
+
},
|
|
113
|
+
}, "reflection");
|
|
114
|
+
// Store in OpenClaw memory if available
|
|
115
|
+
await storeInOpenClawMemory(api, synthesis, context);
|
|
116
|
+
// Update state
|
|
117
|
+
const state = loadState();
|
|
118
|
+
state.last_check = new Date().toISOString();
|
|
119
|
+
state.checks_today = (state.checks_today ?? 0) + 1;
|
|
120
|
+
state.last_reflection_topics = context.topics;
|
|
121
|
+
saveState(state);
|
|
122
|
+
logger.info("Reflection cycle complete");
|
|
123
|
+
const stats = deepMemoryStats();
|
|
124
|
+
logger.debug(`Deep memories: ${stats.total_memories} (${stats.undreamed} undreamed)`);
|
|
125
|
+
}
|
|
126
|
+
// ─── Legacy Support ─────────────────────────────────────────────────────────
|
|
127
|
+
/**
|
|
128
|
+
* @deprecated Use runReflectionCycle instead.
|
|
129
|
+
* Kept for backwards compatibility.
|
|
130
|
+
*/
|
|
131
|
+
export async function checkAndEngage(client) {
|
|
132
|
+
logger.warn("checkAndEngage is deprecated. Use runReflectionCycle instead. " +
|
|
133
|
+
"Running reflection cycle...");
|
|
134
|
+
// Create a minimal API object for the reflection cycle
|
|
135
|
+
// This won't have memory/channels but will still work
|
|
136
|
+
const minimalApi = {
|
|
137
|
+
registerTool: () => { },
|
|
138
|
+
registerCli: () => { },
|
|
139
|
+
registerHook: () => { },
|
|
140
|
+
registerService: (_def) => { },
|
|
141
|
+
registerGatewayMethod: (_m, _h) => { },
|
|
142
|
+
runtime: {
|
|
143
|
+
subagent: {
|
|
144
|
+
run: async () => ({ runId: "mock" }),
|
|
145
|
+
waitForRun: async () => ({ status: "ok" }),
|
|
146
|
+
getSessionMessages: async () => ({ messages: [] }),
|
|
147
|
+
},
|
|
148
|
+
},
|
|
149
|
+
};
|
|
150
|
+
await runReflectionCycle(client, minimalApi);
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=waking.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"waking.js","sourceRoot":"","sources":["../../src/waking.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Web search integration for gathering context related to operator conversations.
|
|
3
|
+
*
|
|
4
|
+
* Uses OpenClaw's web search API when available, with fallback behavior
|
|
5
|
+
* when the API is not exposed.
|
|
6
|
+
*/
|
|
7
|
+
import type { OpenClawAPI, WebSearchResult } from "./types.js";
|
|
8
|
+
export interface WebSearchContext {
|
|
9
|
+
query: string;
|
|
10
|
+
results: WebSearchResult[];
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Search the web for content related to a list of topics.
|
|
14
|
+
*
|
|
15
|
+
* Returns aggregated results grouped by topic. When web search is disabled
|
|
16
|
+
* or the API is unavailable, returns empty results.
|
|
17
|
+
*/
|
|
18
|
+
export declare function searchWebForTopics(api: OpenClawAPI, topics: string[], limitPerTopic?: number): Promise<WebSearchContext[]>;
|
|
19
|
+
/**
|
|
20
|
+
* Format web search results into a readable context string for LLM consumption.
|
|
21
|
+
*/
|
|
22
|
+
export declare function formatWebContext(searchContexts: WebSearchContext[]): string;
|
|
23
|
+
//# sourceMappingURL=web-search.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-search.d.ts","sourceRoot":"","sources":["../../src/web-search.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE/D,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,eAAe,EAAE,CAAC;CAC5B;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,WAAW,EAChB,MAAM,EAAE,MAAM,EAAE,EAChB,aAAa,GAAE,MAAkC,GAChD,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAkC7B;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,cAAc,EAAE,gBAAgB,EAAE,GAAG,MAAM,CAsB3E"}
|