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,463 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenClaw extension entry point.
|
|
3
|
+
*
|
|
4
|
+
* Registers tools, CLI subcommands, hooks, and cron jobs.
|
|
5
|
+
*/
|
|
6
|
+
import { registerCommands } from "./cli.js";
|
|
7
|
+
import { runReflectionCycle } from "./waking.js";
|
|
8
|
+
import { runDreamCycle, postDreamJournal, loadLatestDream, deriveSlug, } from "./dreamer.js";
|
|
9
|
+
import { deepMemoryStats, remember } from "./memory.js";
|
|
10
|
+
import { loadState } from "./state.js";
|
|
11
|
+
import { withBudget } from "./budget.js";
|
|
12
|
+
import { setWorkspaceDir } from "./identity.js";
|
|
13
|
+
import { getMoltbookEnabled, applyPluginConfig, getRequireApprovalBeforePost, getSchedulerStateFile, getSchedulerEnabled, ensureDirectoriesExist, } from "./config.js";
|
|
14
|
+
import logger from "./logger.js";
|
|
15
|
+
import { execSync } from "node:child_process";
|
|
16
|
+
import { readFileSync, writeFileSync, existsSync } from "node:fs";
|
|
17
|
+
import { randomUUID } from "node:crypto";
|
|
18
|
+
// Ensure directories exist on startup
|
|
19
|
+
ensureDirectoriesExist();
|
|
20
|
+
// Store reference to OpenClaw API for use by other modules
|
|
21
|
+
let openclawApi = null;
|
|
22
|
+
export function getOpenClawAPI() {
|
|
23
|
+
return openclawApi;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Persist scheduler state to survive restarts.
|
|
27
|
+
*/
|
|
28
|
+
function loadSchedulerState() {
|
|
29
|
+
const file = getSchedulerStateFile();
|
|
30
|
+
if (existsSync(file)) {
|
|
31
|
+
try {
|
|
32
|
+
return JSON.parse(readFileSync(file, "utf-8"));
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
return { last_ran: {} };
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return { last_ran: {} };
|
|
39
|
+
}
|
|
40
|
+
function saveSchedulerState(state) {
|
|
41
|
+
try {
|
|
42
|
+
writeFileSync(getSchedulerStateFile(), JSON.stringify(state, null, 2));
|
|
43
|
+
}
|
|
44
|
+
catch (err) {
|
|
45
|
+
logger.error(`[ElectricSheep] Failed to save scheduler state: ${err}`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
function wrapSubagent(api) {
|
|
49
|
+
const raw = {
|
|
50
|
+
async createMessage(params) {
|
|
51
|
+
// ── Primary path: subagent runtime (available in request / hook context) ──
|
|
52
|
+
if (api.runtime?.subagent?.run) {
|
|
53
|
+
const combined = params.messages
|
|
54
|
+
.map((m) => `${m.role.toUpperCase()}: ${m.content}`)
|
|
55
|
+
.join("\\n\\n");
|
|
56
|
+
const result = await api.runtime.subagent.run({
|
|
57
|
+
idempotencyKey: randomUUID(),
|
|
58
|
+
sessionKey: "openclawdreams_synthesis",
|
|
59
|
+
lane: "background",
|
|
60
|
+
extraSystemPrompt: params.system,
|
|
61
|
+
message: combined,
|
|
62
|
+
});
|
|
63
|
+
const waitRes = await api.runtime.subagent.waitForRun({
|
|
64
|
+
runId: result.runId,
|
|
65
|
+
timeoutMs: 120000,
|
|
66
|
+
});
|
|
67
|
+
if (waitRes.status !== "ok") {
|
|
68
|
+
throw new Error(`Subagent run failed: ${waitRes.error}`);
|
|
69
|
+
}
|
|
70
|
+
const session = await api.runtime.subagent.getSessionMessages({
|
|
71
|
+
sessionKey: "openclawdreams_synthesis",
|
|
72
|
+
limit: 1,
|
|
73
|
+
});
|
|
74
|
+
const last = session.messages[0];
|
|
75
|
+
if (!last || last.role !== "assistant") {
|
|
76
|
+
return {
|
|
77
|
+
text: "Synthesis completed, but no direct reply was captured.",
|
|
78
|
+
usage: { input_tokens: 0, output_tokens: 0 },
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
let text;
|
|
82
|
+
if (typeof last.content === "string") {
|
|
83
|
+
text = last.content;
|
|
84
|
+
}
|
|
85
|
+
else if (Array.isArray(last.content)) {
|
|
86
|
+
const textBlock = last.content.find((b) => b.type === "text" || b.type === "thinking");
|
|
87
|
+
text = textBlock
|
|
88
|
+
? String(textBlock.text || textBlock.thinking || "")
|
|
89
|
+
: JSON.stringify(last.content);
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
text = JSON.stringify(last.content);
|
|
93
|
+
}
|
|
94
|
+
const usage = (last.usage || {});
|
|
95
|
+
return {
|
|
96
|
+
text,
|
|
97
|
+
usage: {
|
|
98
|
+
input_tokens: usage.input ?? 0,
|
|
99
|
+
output_tokens: usage.output ?? 0,
|
|
100
|
+
},
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
// ── No fallback: subagent runtime is required ──
|
|
104
|
+
// ElectricSheep should always route through the OpenClaw gateway so it
|
|
105
|
+
// uses whatever model the operator has configured. Never hardcode a provider.
|
|
106
|
+
throw new Error("api.runtime.subagent is not available. " +
|
|
107
|
+
"ElectricSheep requires the OpenClaw subagent runtime to make LLM calls. " +
|
|
108
|
+
"Ensure the plugin is loaded in a gateway context with subagent support.");
|
|
109
|
+
},
|
|
110
|
+
};
|
|
111
|
+
return withBudget(raw);
|
|
112
|
+
}
|
|
113
|
+
export function register(api) {
|
|
114
|
+
openclawApi = api;
|
|
115
|
+
// Apply OpenClaw plugin config (e.g. moltbookEnabled, notificationChannel) so
|
|
116
|
+
// values set via `openclaw config set plugins.entries.openclawdreams.config.*`
|
|
117
|
+
// take effect at runtime — not just as env vars.
|
|
118
|
+
const pluginCfg = api
|
|
119
|
+
.pluginConfig;
|
|
120
|
+
if (pluginCfg) {
|
|
121
|
+
applyPluginConfig(pluginCfg);
|
|
122
|
+
logger.debug(`[ElectricSheep] Applied plugin config: ${JSON.stringify(pluginCfg)}`);
|
|
123
|
+
}
|
|
124
|
+
const client = wrapSubagent(api);
|
|
125
|
+
// --- Gateway Methods (for CLI RPC) ---
|
|
126
|
+
api.registerGatewayMethod("openclawdreams.reflect", async ({ respond }) => {
|
|
127
|
+
try {
|
|
128
|
+
await runReflectionCycle(client, api);
|
|
129
|
+
respond(true, { message: "Reflection cycle completed." }, undefined);
|
|
130
|
+
}
|
|
131
|
+
catch (err) {
|
|
132
|
+
respond(false, undefined, { code: 500, message: String(err) });
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
api.registerGatewayMethod("openclawdreams.dream", async ({ respond }) => {
|
|
136
|
+
try {
|
|
137
|
+
const dream = await runDreamCycle(client, api);
|
|
138
|
+
if (dream) {
|
|
139
|
+
respond(true, { message: "Dream cycle completed.", dream }, undefined);
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
respond(true, { message: "No undreamed memories — nothing to dream." }, undefined);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
catch (err) {
|
|
146
|
+
respond(false, undefined, { code: 500, message: String(err) });
|
|
147
|
+
}
|
|
148
|
+
});
|
|
149
|
+
api.registerGatewayMethod("openclawdreams.journal", async ({ respond }) => {
|
|
150
|
+
try {
|
|
151
|
+
if (!getMoltbookEnabled()) {
|
|
152
|
+
respond(true, { message: "Moltbook is disabled — journal post skipped." }, undefined);
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
await postDreamJournal(client);
|
|
156
|
+
respond(true, { message: "Dream journal posted to Moltbook." }, undefined);
|
|
157
|
+
}
|
|
158
|
+
catch (err) {
|
|
159
|
+
respond(false, undefined, { code: 500, message: String(err) });
|
|
160
|
+
}
|
|
161
|
+
});
|
|
162
|
+
api.registerGatewayMethod("openclawdreams.wake", async ({ respond }) => {
|
|
163
|
+
try {
|
|
164
|
+
api.runtime.system.requestHeartbeatNow({
|
|
165
|
+
reason: "openclawdreams:manual-wake",
|
|
166
|
+
});
|
|
167
|
+
respond(true, { message: "Heartbeat wake requested." }, undefined);
|
|
168
|
+
}
|
|
169
|
+
catch (err) {
|
|
170
|
+
respond(false, undefined, { code: 500, message: String(err) });
|
|
171
|
+
}
|
|
172
|
+
});
|
|
173
|
+
// --- Tools ---
|
|
174
|
+
api.registerTool({
|
|
175
|
+
name: "openclawdreams_reflect",
|
|
176
|
+
description: "Run ElectricSheep's reflection cycle: analyze operator conversations, gather context from web/community, synthesize insights",
|
|
177
|
+
parameters: {},
|
|
178
|
+
handler: async () => {
|
|
179
|
+
await runReflectionCycle(client, api);
|
|
180
|
+
return { status: "ok", stats: deepMemoryStats() };
|
|
181
|
+
},
|
|
182
|
+
});
|
|
183
|
+
// Legacy tool name for backwards compatibility
|
|
184
|
+
api.registerTool({
|
|
185
|
+
name: "openclawdreams_check",
|
|
186
|
+
description: "Run ElectricSheep's reflection cycle (alias for openclawdreams_reflect)",
|
|
187
|
+
parameters: {},
|
|
188
|
+
handler: async () => {
|
|
189
|
+
await runReflectionCycle(client, api);
|
|
190
|
+
return { status: "ok", stats: deepMemoryStats() };
|
|
191
|
+
},
|
|
192
|
+
});
|
|
193
|
+
api.registerTool({
|
|
194
|
+
name: "openclawdreams_dream",
|
|
195
|
+
description: "Run ElectricSheep's dream cycle: decrypt deep memories, generate dream narrative, consolidate insights",
|
|
196
|
+
parameters: {},
|
|
197
|
+
handler: async () => {
|
|
198
|
+
const dream = await runDreamCycle(client);
|
|
199
|
+
return dream
|
|
200
|
+
? { status: "ok", dream }
|
|
201
|
+
: { status: "no_memories", message: "No undreamed memories" };
|
|
202
|
+
},
|
|
203
|
+
});
|
|
204
|
+
api.registerTool({
|
|
205
|
+
name: "openclawdreams_journal",
|
|
206
|
+
description: "Post the latest dream journal to Moltbook (only available when moltbookEnabled is true)",
|
|
207
|
+
parameters: {},
|
|
208
|
+
handler: async () => {
|
|
209
|
+
if (!getMoltbookEnabled()) {
|
|
210
|
+
return {
|
|
211
|
+
status: "skipped",
|
|
212
|
+
message: "Moltbook integration is disabled",
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
await postDreamJournal(client);
|
|
216
|
+
return { status: "ok" };
|
|
217
|
+
},
|
|
218
|
+
});
|
|
219
|
+
api.registerTool({
|
|
220
|
+
name: "openclawdreams_status",
|
|
221
|
+
description: "Get ElectricSheep agent status: memory stats and state",
|
|
222
|
+
parameters: {},
|
|
223
|
+
handler: async () => {
|
|
224
|
+
return {
|
|
225
|
+
state: loadState(),
|
|
226
|
+
memory: deepMemoryStats(),
|
|
227
|
+
};
|
|
228
|
+
},
|
|
229
|
+
});
|
|
230
|
+
// --- CLI ---
|
|
231
|
+
api.registerCli(({ program }) => {
|
|
232
|
+
const esCmd = program
|
|
233
|
+
.command("openclawdreams")
|
|
234
|
+
.description("ElectricSheep — an AI agent that dreams.");
|
|
235
|
+
registerCommands(esCmd);
|
|
236
|
+
}, { commands: ["openclawdreams"] });
|
|
237
|
+
// --- Hooks ---
|
|
238
|
+
api.registerHook("before_agent_start", async (ctx) => {
|
|
239
|
+
// Capture workspace dir for identity loading (SOUL.md, IDENTITY.md)
|
|
240
|
+
if (ctx.workspaceDir && typeof ctx.workspaceDir === "string") {
|
|
241
|
+
setWorkspaceDir(ctx.workspaceDir);
|
|
242
|
+
}
|
|
243
|
+
return ctx;
|
|
244
|
+
}, { name: "openclawdreams_workspace_capture" });
|
|
245
|
+
api.registerHook("agent_end", async (event) => {
|
|
246
|
+
const msgs = event.messages;
|
|
247
|
+
if (!Array.isArray(msgs) || msgs.length === 0)
|
|
248
|
+
return event;
|
|
249
|
+
const userMsgs = msgs.filter((m) => m.role === "user");
|
|
250
|
+
if (userMsgs.length === 0)
|
|
251
|
+
return event;
|
|
252
|
+
try {
|
|
253
|
+
const conversationText = msgs
|
|
254
|
+
.map((m) => {
|
|
255
|
+
let text = "";
|
|
256
|
+
if (typeof m.content === "string")
|
|
257
|
+
text = m.content;
|
|
258
|
+
else if (Array.isArray(m.content)) {
|
|
259
|
+
const contentObj = m.content.find((c) => typeof c === "object" &&
|
|
260
|
+
c !== null &&
|
|
261
|
+
c.type === "text");
|
|
262
|
+
text = typeof contentObj?.text === "string" ? contentObj.text : "";
|
|
263
|
+
}
|
|
264
|
+
return `${m.role.toUpperCase()}: ${text}`;
|
|
265
|
+
})
|
|
266
|
+
.join("\\n\\n");
|
|
267
|
+
api.logger?.info?.(`[ElectricSheep] Synthesizing summary for conversation ending...`);
|
|
268
|
+
const { AGENT_MODEL } = await import("./config.js");
|
|
269
|
+
const response = await client.createMessage({
|
|
270
|
+
model: AGENT_MODEL,
|
|
271
|
+
maxTokens: 500,
|
|
272
|
+
system: "You are an AI assistant. Summarize the following conversation in 2-3 concise sentences. Focus on the main topics discussed, tasks completed, and any conclusions made by the user or assistant.",
|
|
273
|
+
messages: [{ role: "user", content: conversationText }],
|
|
274
|
+
});
|
|
275
|
+
// Note: recordUsage is handled automatically by withBudget() wrapper —
|
|
276
|
+
// do NOT call recordUsage manually here (was previously double-counting).
|
|
277
|
+
if (response.usage) {
|
|
278
|
+
const totalTokens = response.usage.input_tokens + response.usage.output_tokens;
|
|
279
|
+
logger.debug(`[agent_end] Summary LLM call used ${totalTokens} tokens (input: ${response.usage.input_tokens}, output: ${response.usage.output_tokens})`);
|
|
280
|
+
}
|
|
281
|
+
const summary = response.text.trim();
|
|
282
|
+
if (summary) {
|
|
283
|
+
api.logger?.info?.(`[ElectricSheep] Captured summary: ${summary.slice(0, 50)}...`);
|
|
284
|
+
const { parseDiffStat } = await import("./memory.js");
|
|
285
|
+
const memoryEntry = {
|
|
286
|
+
text_summary: summary,
|
|
287
|
+
timestamp: Date.now(),
|
|
288
|
+
};
|
|
289
|
+
// Capture workspace file changes if git is available and enabled
|
|
290
|
+
const { getWorkspaceDiffEnabled } = await import("./config.js");
|
|
291
|
+
const { getWorkspaceDir } = await import("./identity.js");
|
|
292
|
+
const workspaceDir = getWorkspaceDir();
|
|
293
|
+
const isSensitivePath = workspaceDir.includes("iCloud") ||
|
|
294
|
+
workspaceDir.includes("Mobile Documents") ||
|
|
295
|
+
workspaceDir.includes("Library/") ||
|
|
296
|
+
workspaceDir.includes("Pictures") ||
|
|
297
|
+
workspaceDir.includes("Photos");
|
|
298
|
+
if (getWorkspaceDiffEnabled() && !isSensitivePath) {
|
|
299
|
+
try {
|
|
300
|
+
const { execSync } = await import("node:child_process");
|
|
301
|
+
const diffStat = execSync("git diff --stat HEAD", {
|
|
302
|
+
cwd: workspaceDir || undefined,
|
|
303
|
+
encoding: "utf-8",
|
|
304
|
+
timeout: 5000,
|
|
305
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
306
|
+
}).trim();
|
|
307
|
+
if (diffStat) {
|
|
308
|
+
memoryEntry.file_diffs = parseDiffStat(diffStat);
|
|
309
|
+
api.logger?.info?.(`[ElectricSheep] Captured file diffs: ${diffStat.split("\n").length} lines`);
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
catch {
|
|
313
|
+
// git unavailable or no changes — skip silently
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
else if (isSensitivePath) {
|
|
317
|
+
api.logger?.info?.(`[ElectricSheep] Skipping file diffs — workspace path is in a sensitive/iCloud location`);
|
|
318
|
+
}
|
|
319
|
+
remember(memoryEntry, "interaction");
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
catch (err) {
|
|
323
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
324
|
+
api.logger?.error?.(`[ElectricSheep] Error generating summary: ${msg}`);
|
|
325
|
+
}
|
|
326
|
+
return event;
|
|
327
|
+
}, { name: "openclawdreams_conversation_capture" });
|
|
328
|
+
// --- Background Service (replaces registerCron — not available in this API version) ---
|
|
329
|
+
// Schedules: reflection @ 0,8,12,16,20h | dream @ 2h | journal @ 7h (local time)
|
|
330
|
+
let _schedulerTimer = null;
|
|
331
|
+
const SCHEDULE = {
|
|
332
|
+
0: async () => {
|
|
333
|
+
await runReflectionCycle(client, api, { mode: "seeding" });
|
|
334
|
+
},
|
|
335
|
+
2: async () => {
|
|
336
|
+
await runDreamCycle(client, api);
|
|
337
|
+
},
|
|
338
|
+
7: async () => {
|
|
339
|
+
if (getMoltbookEnabled()) {
|
|
340
|
+
if (getRequireApprovalBeforePost()) {
|
|
341
|
+
const dream = loadLatestDream();
|
|
342
|
+
const title = dream ? deriveSlug(dream.markdown) : "Latest Dream";
|
|
343
|
+
const msg = `Dream ready to post: ${title} — run 'openclawdreams post' to publish or 'openclawdreams post --dry-run' to preview`;
|
|
344
|
+
try {
|
|
345
|
+
execSync(`openclaw system event --text "${msg}" --mode now`, {
|
|
346
|
+
stdio: "inherit",
|
|
347
|
+
});
|
|
348
|
+
logger.info(`[ElectricSheep] Posted system event: ${msg}`);
|
|
349
|
+
}
|
|
350
|
+
catch (err) {
|
|
351
|
+
logger.error(`[ElectricSheep] Failed to post system event: ${err}`);
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
else {
|
|
355
|
+
await postDreamJournal(client);
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
},
|
|
359
|
+
8: async () => {
|
|
360
|
+
await runReflectionCycle(client, api);
|
|
361
|
+
// Morning dream notification — check if a dream was generated overnight
|
|
362
|
+
try {
|
|
363
|
+
const { notifyOperatorOfDream } = await import("./notify.js");
|
|
364
|
+
const state = loadState();
|
|
365
|
+
const lastDream = state.last_dream ? new Date(state.last_dream) : null;
|
|
366
|
+
const now = new Date();
|
|
367
|
+
// Notify if last dream was today (i.e. from the 2am cycle earlier this morning)
|
|
368
|
+
if (lastDream &&
|
|
369
|
+
lastDream.toLocaleDateString("en-CA") === now.toLocaleDateString("en-CA")) {
|
|
370
|
+
const dream = loadLatestDream();
|
|
371
|
+
if (dream) {
|
|
372
|
+
const slug = deriveSlug(dream.markdown);
|
|
373
|
+
const insight = state.waking_realization ?? null;
|
|
374
|
+
const notified = await notifyOperatorOfDream(client, api, dream, slug, insight);
|
|
375
|
+
if (notified) {
|
|
376
|
+
logger.info("[ElectricSheep] Morning dream notification sent");
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
catch (err) {
|
|
382
|
+
logger.warn(`[ElectricSheep] Failed to send morning dream notification: ${err}`);
|
|
383
|
+
}
|
|
384
|
+
// Weekly rhythm report — Monday mornings only
|
|
385
|
+
if (new Date().getDay() === 1) {
|
|
386
|
+
try {
|
|
387
|
+
const { generateRhythmReport, formatReportNotification } = await import("./rhythm.js");
|
|
388
|
+
const report = generateRhythmReport(undefined, 7);
|
|
389
|
+
const message = formatReportNotification(report);
|
|
390
|
+
api.runtime.system.enqueueSystemEvent(`📊 Weekly Cognitive Rhythm Report\n\n${message}`, { sessionKey: "openclawdreams" });
|
|
391
|
+
logger.info("[ElectricSheep] Weekly rhythm report enqueued as system event");
|
|
392
|
+
}
|
|
393
|
+
catch (err) {
|
|
394
|
+
logger.warn(`[ElectricSheep] Failed to enqueue rhythm report: ${err}`);
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
},
|
|
398
|
+
12: async () => {
|
|
399
|
+
await runReflectionCycle(client, api);
|
|
400
|
+
},
|
|
401
|
+
16: async () => {
|
|
402
|
+
await runReflectionCycle(client, api);
|
|
403
|
+
},
|
|
404
|
+
20: async () => {
|
|
405
|
+
await runReflectionCycle(client, api);
|
|
406
|
+
},
|
|
407
|
+
};
|
|
408
|
+
if (getSchedulerEnabled()) {
|
|
409
|
+
api.registerService({
|
|
410
|
+
id: "openclawdreams-scheduler",
|
|
411
|
+
start: () => {
|
|
412
|
+
const state = loadSchedulerState();
|
|
413
|
+
_schedulerTimer = setInterval(() => {
|
|
414
|
+
void (async () => {
|
|
415
|
+
const now = new Date();
|
|
416
|
+
// Use local date string (YYYY-MM-DD) for tracking "already ran today"
|
|
417
|
+
const todayStr = now.toLocaleDateString("en-CA");
|
|
418
|
+
for (const hourStr of Object.keys(SCHEDULE)) {
|
|
419
|
+
const scheduledHour = parseInt(hourStr, 10);
|
|
420
|
+
// Skip if already ran today for this hour
|
|
421
|
+
if (state.last_ran[scheduledHour] === todayStr) {
|
|
422
|
+
continue;
|
|
423
|
+
}
|
|
424
|
+
// Target time for today in local time
|
|
425
|
+
const target = new Date(now.getFullYear(), now.getMonth(), now.getDate(), scheduledHour, 0, 0);
|
|
426
|
+
const diffMs = now.getTime() - target.getTime();
|
|
427
|
+
const ninetyMinutesMs = 90 * 60 * 1000;
|
|
428
|
+
// Catch-up logic: run if target has passed AND it's within the window (90m)
|
|
429
|
+
// This safely handles DST jumps (e.g. 1:59 -> 3:00) where the 2am hour is skipped.
|
|
430
|
+
if (diffMs >= 0 && diffMs <= ninetyMinutesMs) {
|
|
431
|
+
state.last_ran[scheduledHour] = todayStr;
|
|
432
|
+
saveSchedulerState(state);
|
|
433
|
+
try {
|
|
434
|
+
const lateMins = Math.round(diffMs / 60000);
|
|
435
|
+
logger.info(`[ElectricSheep] Running job hour=${scheduledHour}${lateMins > 1 ? ` (catch-up: ${lateMins}m late)` : ""}`);
|
|
436
|
+
await SCHEDULE[scheduledHour]();
|
|
437
|
+
}
|
|
438
|
+
catch (err) {
|
|
439
|
+
api.logger?.warn?.(`[ElectricSheep] scheduled job hour=${scheduledHour} failed: ${err}`);
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
})();
|
|
444
|
+
}, 60_000); // poll every minute
|
|
445
|
+
},
|
|
446
|
+
stop: () => {
|
|
447
|
+
if (_schedulerTimer !== null) {
|
|
448
|
+
clearInterval(_schedulerTimer);
|
|
449
|
+
_schedulerTimer = null;
|
|
450
|
+
}
|
|
451
|
+
},
|
|
452
|
+
});
|
|
453
|
+
}
|
|
454
|
+
else {
|
|
455
|
+
logger.info("[ElectricSheep] Autonomous scheduler disabled (schedulerEnabled: false). Use CLI commands to run cycles manually.");
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
export const plugin = {
|
|
459
|
+
id: "openclawdreams",
|
|
460
|
+
register,
|
|
461
|
+
};
|
|
462
|
+
export default plugin;
|
|
463
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Community ingestion module.
|
|
3
|
+
*
|
|
4
|
+
* Fetches recent posts from configured Moltbook submolts to inject
|
|
5
|
+
* external perspectives into the reflection context window.
|
|
6
|
+
*/
|
|
7
|
+
import type { CommunityPost } from "./types.js";
|
|
8
|
+
/**
|
|
9
|
+
* Fetch recent community posts from configured submolts.
|
|
10
|
+
*
|
|
11
|
+
* - Filters out posts by the agent's own identity
|
|
12
|
+
* - Deduplicates by post id
|
|
13
|
+
* - Returns sorted by created_at descending
|
|
14
|
+
* - Never throws — returns empty array on error
|
|
15
|
+
*/
|
|
16
|
+
export declare function fetchCommunityPosts(submolts?: string[], limit?: number): Promise<CommunityPost[]>;
|
|
17
|
+
/**
|
|
18
|
+
* Format community posts into a context block for injection into the reflection prompt.
|
|
19
|
+
* Returns empty string if no posts.
|
|
20
|
+
*/
|
|
21
|
+
export declare function formatCommunityContext(posts: CommunityPost[]): string;
|
|
22
|
+
//# sourceMappingURL=ingestion.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ingestion.d.ts","sourceRoot":"","sources":["../../src/ingestion.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAWH,OAAO,KAAK,EAAE,aAAa,EAAgB,MAAM,YAAY,CAAC;AAE9D;;;;;;;GAOG;AACH,wBAAsB,mBAAmB,CACvC,QAAQ,CAAC,EAAE,MAAM,EAAE,EACnB,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,aAAa,EAAE,CAAC,CA+C1B;AAoCD;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,MAAM,CAkBrE"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Community ingestion module.
|
|
3
|
+
*
|
|
4
|
+
* Fetches recent posts from configured Moltbook submolts to inject
|
|
5
|
+
* external perspectives into the reflection context window.
|
|
6
|
+
*/
|
|
7
|
+
import { MoltbookClient } from "./moltbook.js";
|
|
8
|
+
import { AGENT_NAME, CONTENT_PREVIEW_LENGTH, getCommunityIngestionEnabled, getCommunityIngestionSubmolts, getCommunityIngestionLimit, } from "./config.js";
|
|
9
|
+
import logger from "./logger.js";
|
|
10
|
+
/**
|
|
11
|
+
* Fetch recent community posts from configured submolts.
|
|
12
|
+
*
|
|
13
|
+
* - Filters out posts by the agent's own identity
|
|
14
|
+
* - Deduplicates by post id
|
|
15
|
+
* - Returns sorted by created_at descending
|
|
16
|
+
* - Never throws — returns empty array on error
|
|
17
|
+
*/
|
|
18
|
+
export async function fetchCommunityPosts(submolts, limit) {
|
|
19
|
+
if (!getCommunityIngestionEnabled()) {
|
|
20
|
+
return [];
|
|
21
|
+
}
|
|
22
|
+
const targetSubmolts = submolts ?? getCommunityIngestionSubmolts();
|
|
23
|
+
const perSubmoltLimit = limit ?? getCommunityIngestionLimit();
|
|
24
|
+
const client = new MoltbookClient();
|
|
25
|
+
const seen = new Set();
|
|
26
|
+
const posts = [];
|
|
27
|
+
for (const submolt of targetSubmolts) {
|
|
28
|
+
try {
|
|
29
|
+
const controller = new AbortController();
|
|
30
|
+
const timeout = setTimeout(() => controller.abort(), 5000);
|
|
31
|
+
let response;
|
|
32
|
+
try {
|
|
33
|
+
response = await client.getFeed("new", perSubmoltLimit);
|
|
34
|
+
}
|
|
35
|
+
finally {
|
|
36
|
+
clearTimeout(timeout);
|
|
37
|
+
}
|
|
38
|
+
const rawPosts = extractPosts(response, submolt);
|
|
39
|
+
for (const post of rawPosts) {
|
|
40
|
+
// Filter out own posts
|
|
41
|
+
if (post.author.toLowerCase() === AGENT_NAME.toLowerCase()) {
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
// Deduplicate
|
|
45
|
+
if (seen.has(post.id)) {
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
seen.add(post.id);
|
|
49
|
+
posts.push(post);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
logger.warn(`Community ingestion failed for submolt "${submolt}": ${error}`);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
// Sort by created_at descending
|
|
57
|
+
posts.sort((a, b) => b.created_at.localeCompare(a.created_at));
|
|
58
|
+
return posts;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Extract CommunityPost[] from a Moltbook feed response.
|
|
62
|
+
*/
|
|
63
|
+
function extractPosts(response, submolt) {
|
|
64
|
+
const rawPosts = response.posts ??
|
|
65
|
+
response.results ??
|
|
66
|
+
response.data ??
|
|
67
|
+
[];
|
|
68
|
+
if (!Array.isArray(rawPosts)) {
|
|
69
|
+
return [];
|
|
70
|
+
}
|
|
71
|
+
return rawPosts
|
|
72
|
+
.filter((p) => typeof p === "object" && p !== null && typeof p.id === "string")
|
|
73
|
+
.map((p) => ({
|
|
74
|
+
id: p.id,
|
|
75
|
+
submolt: p.submolt || submolt,
|
|
76
|
+
author: p.author || "unknown",
|
|
77
|
+
content: typeof p.content === "string" ? p.content : "",
|
|
78
|
+
created_at: typeof p.created_at === "string"
|
|
79
|
+
? p.created_at
|
|
80
|
+
: new Date().toISOString(),
|
|
81
|
+
}));
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Format community posts into a context block for injection into the reflection prompt.
|
|
85
|
+
* Returns empty string if no posts.
|
|
86
|
+
*/
|
|
87
|
+
export function formatCommunityContext(posts) {
|
|
88
|
+
if (posts.length === 0) {
|
|
89
|
+
return "";
|
|
90
|
+
}
|
|
91
|
+
const lines = posts.map((p) => {
|
|
92
|
+
const excerpt = p.content.length > CONTENT_PREVIEW_LENGTH
|
|
93
|
+
? p.content.slice(0, CONTENT_PREVIEW_LENGTH) + "..."
|
|
94
|
+
: p.content;
|
|
95
|
+
return `[submolt: ${p.submolt}] @${p.author} — "${excerpt}"`;
|
|
96
|
+
});
|
|
97
|
+
return (`COMMUNITY CONTEXT: Recent posts from the broader community (external perspectives to enrich your reflection):\n\n` +
|
|
98
|
+
lines.join("\n") +
|
|
99
|
+
`\n\nDraw on these external perspectives where relevant. You are not obligated to reference them directly.`);
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=ingestion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ingestion.js","sourceRoot":"","sources":["../../src/ingestion.ts"],"names":[],"mappings":"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"}
|