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.
Files changed (188) hide show
  1. package/.env.example +14 -0
  2. package/.github/ISSUE_TEMPLATE/bug_report.md +27 -0
  3. package/.github/ISSUE_TEMPLATE/feature_request.md +19 -0
  4. package/.github/dependabot.yml +17 -0
  5. package/.github/pull_request_template.md +19 -0
  6. package/.github/workflows/build.yml +30 -0
  7. package/.github/workflows/release.yml +110 -0
  8. package/.prettierignore +4 -0
  9. package/.prettierrc +7 -0
  10. package/.versionrc.json +26 -0
  11. package/AGENTS.md +286 -0
  12. package/CHANGELOG.md +157 -0
  13. package/CODE_OF_CONDUCT.md +41 -0
  14. package/CONTRIBUTING.md +95 -0
  15. package/LICENSE +21 -0
  16. package/README.md +363 -0
  17. package/SECURITY.md +39 -0
  18. package/bin/electricsheep.ts +5 -0
  19. package/dist/bin/electricsheep.d.ts +3 -0
  20. package/dist/bin/electricsheep.d.ts.map +1 -0
  21. package/dist/bin/electricsheep.js +4 -0
  22. package/dist/bin/electricsheep.js.map +1 -0
  23. package/dist/src/budget.d.ts +28 -0
  24. package/dist/src/budget.d.ts.map +1 -0
  25. package/dist/src/budget.js +87 -0
  26. package/dist/src/budget.js.map +1 -0
  27. package/dist/src/cli.d.ts +19 -0
  28. package/dist/src/cli.d.ts.map +1 -0
  29. package/dist/src/cli.js +289 -0
  30. package/dist/src/cli.js.map +1 -0
  31. package/dist/src/config.d.ts +37 -0
  32. package/dist/src/config.d.ts.map +1 -0
  33. package/dist/src/config.js +70 -0
  34. package/dist/src/config.js.map +1 -0
  35. package/dist/src/crypto.d.ts +19 -0
  36. package/dist/src/crypto.d.ts.map +1 -0
  37. package/dist/src/crypto.js +70 -0
  38. package/dist/src/crypto.js.map +1 -0
  39. package/dist/src/dreamer.d.ts +13 -0
  40. package/dist/src/dreamer.d.ts.map +1 -0
  41. package/dist/src/dreamer.js +213 -0
  42. package/dist/src/dreamer.js.map +1 -0
  43. package/dist/src/filter.d.ts +30 -0
  44. package/dist/src/filter.d.ts.map +1 -0
  45. package/dist/src/filter.js +124 -0
  46. package/dist/src/filter.js.map +1 -0
  47. package/dist/src/identity.d.ts +29 -0
  48. package/dist/src/identity.d.ts.map +1 -0
  49. package/dist/src/identity.js +83 -0
  50. package/dist/src/identity.js.map +1 -0
  51. package/dist/src/index.d.ts +14 -0
  52. package/dist/src/index.d.ts.map +1 -0
  53. package/dist/src/index.js +293 -0
  54. package/dist/src/index.js.map +1 -0
  55. package/dist/src/llm.d.ts +26 -0
  56. package/dist/src/llm.d.ts.map +1 -0
  57. package/dist/src/llm.js +40 -0
  58. package/dist/src/llm.js.map +1 -0
  59. package/dist/src/logger.d.ts +6 -0
  60. package/dist/src/logger.d.ts.map +1 -0
  61. package/dist/src/logger.js +32 -0
  62. package/dist/src/logger.js.map +1 -0
  63. package/dist/src/memory.d.ts +41 -0
  64. package/dist/src/memory.d.ts.map +1 -0
  65. package/dist/src/memory.js +206 -0
  66. package/dist/src/memory.js.map +1 -0
  67. package/dist/src/moltbook-search.d.ts +23 -0
  68. package/dist/src/moltbook-search.d.ts.map +1 -0
  69. package/dist/src/moltbook-search.js +85 -0
  70. package/dist/src/moltbook-search.js.map +1 -0
  71. package/dist/src/moltbook.d.ts +34 -0
  72. package/dist/src/moltbook.d.ts.map +1 -0
  73. package/dist/src/moltbook.js +165 -0
  74. package/dist/src/moltbook.js.map +1 -0
  75. package/dist/src/notify.d.ts +18 -0
  76. package/dist/src/notify.d.ts.map +1 -0
  77. package/dist/src/notify.js +98 -0
  78. package/dist/src/notify.js.map +1 -0
  79. package/dist/src/persona.d.ts +26 -0
  80. package/dist/src/persona.d.ts.map +1 -0
  81. package/dist/src/persona.js +178 -0
  82. package/dist/src/persona.js.map +1 -0
  83. package/dist/src/reflection.d.ts +26 -0
  84. package/dist/src/reflection.d.ts.map +1 -0
  85. package/dist/src/reflection.js +111 -0
  86. package/dist/src/reflection.js.map +1 -0
  87. package/dist/src/state.d.ts +7 -0
  88. package/dist/src/state.d.ts.map +1 -0
  89. package/dist/src/state.js +40 -0
  90. package/dist/src/state.js.map +1 -0
  91. package/dist/src/synthesis.d.ts +29 -0
  92. package/dist/src/synthesis.d.ts.map +1 -0
  93. package/dist/src/synthesis.js +125 -0
  94. package/dist/src/synthesis.js.map +1 -0
  95. package/dist/src/topics.d.ts +19 -0
  96. package/dist/src/topics.d.ts.map +1 -0
  97. package/dist/src/topics.js +83 -0
  98. package/dist/src/topics.js.map +1 -0
  99. package/dist/src/types.d.ts +179 -0
  100. package/dist/src/types.d.ts.map +1 -0
  101. package/dist/src/types.js +5 -0
  102. package/dist/src/types.js.map +1 -0
  103. package/dist/src/waking.d.ts +24 -0
  104. package/dist/src/waking.d.ts.map +1 -0
  105. package/dist/src/waking.js +152 -0
  106. package/dist/src/waking.js.map +1 -0
  107. package/dist/src/web-search.d.ts +23 -0
  108. package/dist/src/web-search.d.ts.map +1 -0
  109. package/dist/src/web-search.js +64 -0
  110. package/dist/src/web-search.js.map +1 -0
  111. package/dist/test/budget.test.d.ts +2 -0
  112. package/dist/test/budget.test.d.ts.map +1 -0
  113. package/dist/test/budget.test.js +258 -0
  114. package/dist/test/budget.test.js.map +1 -0
  115. package/dist/test/crypto.test.d.ts +2 -0
  116. package/dist/test/crypto.test.d.ts.map +1 -0
  117. package/dist/test/crypto.test.js +93 -0
  118. package/dist/test/crypto.test.js.map +1 -0
  119. package/dist/test/dreamer.test.d.ts +2 -0
  120. package/dist/test/dreamer.test.d.ts.map +1 -0
  121. package/dist/test/dreamer.test.js +79 -0
  122. package/dist/test/dreamer.test.js.map +1 -0
  123. package/dist/test/filter.test.d.ts +2 -0
  124. package/dist/test/filter.test.d.ts.map +1 -0
  125. package/dist/test/filter.test.js +92 -0
  126. package/dist/test/filter.test.js.map +1 -0
  127. package/dist/test/memory.test.d.ts +2 -0
  128. package/dist/test/memory.test.d.ts.map +1 -0
  129. package/dist/test/memory.test.js +138 -0
  130. package/dist/test/memory.test.js.map +1 -0
  131. package/dist/test/moltbook.test.d.ts +2 -0
  132. package/dist/test/moltbook.test.d.ts.map +1 -0
  133. package/dist/test/moltbook.test.js +164 -0
  134. package/dist/test/moltbook.test.js.map +1 -0
  135. package/dist/test/persona.test.d.ts +2 -0
  136. package/dist/test/persona.test.d.ts.map +1 -0
  137. package/dist/test/persona.test.js +44 -0
  138. package/dist/test/persona.test.js.map +1 -0
  139. package/dist/test/reflection.test.d.ts +2 -0
  140. package/dist/test/reflection.test.d.ts.map +1 -0
  141. package/dist/test/reflection.test.js +57 -0
  142. package/dist/test/reflection.test.js.map +1 -0
  143. package/dist/test/state.test.d.ts +2 -0
  144. package/dist/test/state.test.d.ts.map +1 -0
  145. package/dist/test/state.test.js +50 -0
  146. package/dist/test/state.test.js.map +1 -0
  147. package/dist/test/waking.test.d.ts +2 -0
  148. package/dist/test/waking.test.d.ts.map +1 -0
  149. package/dist/test/waking.test.js +149 -0
  150. package/dist/test/waking.test.js.map +1 -0
  151. package/eslint.config.js +35 -0
  152. package/openclaw.plugin.json +62 -0
  153. package/package.json +72 -0
  154. package/skills/electricsheep.skill.md +69 -0
  155. package/skills/setup-guide/SKILL.md +303 -0
  156. package/src/budget.ts +104 -0
  157. package/src/cli.ts +325 -0
  158. package/src/config.ts +95 -0
  159. package/src/crypto.ts +82 -0
  160. package/src/dreamer.ts +283 -0
  161. package/src/filter.ts +146 -0
  162. package/src/identity.ts +92 -0
  163. package/src/index.ts +356 -0
  164. package/src/llm.ts +61 -0
  165. package/src/logger.ts +46 -0
  166. package/src/memory.ts +276 -0
  167. package/src/moltbook-search.ts +116 -0
  168. package/src/moltbook.ts +235 -0
  169. package/src/notify.ts +124 -0
  170. package/src/persona.ts +191 -0
  171. package/src/reflection.ts +150 -0
  172. package/src/state.ts +44 -0
  173. package/src/synthesis.ts +153 -0
  174. package/src/topics.ts +103 -0
  175. package/src/types.ts +196 -0
  176. package/src/waking.ts +199 -0
  177. package/src/web-search.ts +88 -0
  178. package/test/budget.test.ts +316 -0
  179. package/test/crypto.test.ts +112 -0
  180. package/test/dreamer.test.ts +95 -0
  181. package/test/filter.test.ts +115 -0
  182. package/test/memory.test.ts +182 -0
  183. package/test/moltbook.test.ts +209 -0
  184. package/test/persona.test.ts +59 -0
  185. package/test/reflection.test.ts +71 -0
  186. package/test/state.test.ts +57 -0
  187. package/test/waking.test.ts +214 -0
  188. package/tsconfig.json +20 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.test.js","sourceRoot":"","sources":["../../test/state.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=waking.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"waking.test.d.ts","sourceRoot":"","sources":["../../test/waking.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,149 @@
1
+ import { describe, it, after } from "node:test";
2
+ import assert from "node:assert/strict";
3
+ import { mkdtempSync, rmSync } from "node:fs";
4
+ import { join } from "node:path";
5
+ import { tmpdir } from "node:os";
6
+ // Isolated data dir
7
+ const testDir = mkdtempSync(join(tmpdir(), "es-waking-test-"));
8
+ process.env.ELECTRICSHEEP_DATA_DIR = testDir;
9
+ const { runReflectionCycle, checkAndEngage } = await import("../src/waking.js");
10
+ const { deepMemoryStats, storeDeepMemory } = await import("../src/memory.js");
11
+ const { loadState } = await import("../src/state.js");
12
+ const { closeLogger } = await import("../src/logger.js");
13
+ function mockLLMClient(responses) {
14
+ let idx = 0;
15
+ return {
16
+ async createMessage() {
17
+ const text = responses[idx] ?? responses[responses.length - 1];
18
+ idx++;
19
+ return { text, usage: { input_tokens: 100, output_tokens: 50 } };
20
+ },
21
+ };
22
+ }
23
+ function mockOpenClawAPI() {
24
+ return {
25
+ registerTool: () => { },
26
+ registerCli: () => { },
27
+ registerHook: () => { },
28
+ registerService: (_def) => { },
29
+ registerGatewayMethod: (_m, _h) => { },
30
+ runtime: {
31
+ subagent: {
32
+ run: async () => ({ runId: "mock" }),
33
+ waitForRun: async () => ({ status: "ok" }),
34
+ getSessionMessages: async () => ({ messages: [] }),
35
+ },
36
+ },
37
+ };
38
+ }
39
+ function mockOpenClawAPIWithMemory() {
40
+ const storedMemories = [];
41
+ return {
42
+ registerTool: () => { },
43
+ registerCli: () => { },
44
+ registerHook: () => { },
45
+ registerService: (_def) => { },
46
+ registerGatewayMethod: (_m, _h) => { },
47
+ runtime: {
48
+ subagent: {
49
+ run: async () => ({ runId: "mock" }),
50
+ waitForRun: async () => ({ status: "ok" }),
51
+ getSessionMessages: async () => ({ messages: [] }),
52
+ },
53
+ },
54
+ memory: {
55
+ async store(content, metadata) {
56
+ storedMemories.push({ content, metadata });
57
+ },
58
+ async search(_query, _limit) {
59
+ return [];
60
+ },
61
+ },
62
+ storedMemories,
63
+ };
64
+ }
65
+ describe("runReflectionCycle", () => {
66
+ it("handles no recent conversations gracefully", async () => {
67
+ const client = mockLLMClient(["should not be called"]);
68
+ const api = mockOpenClawAPI();
69
+ const statsBefore = deepMemoryStats();
70
+ await runReflectionCycle(client, api);
71
+ const statsAfter = deepMemoryStats();
72
+ // Should store an observation in deep memory about no conversations
73
+ assert.ok(statsAfter.total_memories > statsBefore.total_memories, "Expected observation stored in deep memory");
74
+ });
75
+ it("extracts topics from operator conversations", async () => {
76
+ // Seed some mock operator conversations in deep memory
77
+ storeDeepMemory({
78
+ summary: "Discussed debugging a memory leak in the Node.js application",
79
+ type: "agent_conversation",
80
+ }, "interaction");
81
+ storeDeepMemory({
82
+ summary: "Helped operator understand async/await patterns in TypeScript",
83
+ type: "agent_conversation",
84
+ }, "interaction");
85
+ // LLM responses: topic extraction, then synthesis, then summary
86
+ const client = mockLLMClient([
87
+ "memory leaks in Node.js\nasync programming patterns\nTypeScript debugging",
88
+ "Today I worked with my operator on debugging memory issues and understanding async patterns. These topics connect to broader discussions about Node.js performance.",
89
+ "Reflected on debugging and async patterns with operator, synthesizing insights about Node.js development.",
90
+ ]);
91
+ const api = mockOpenClawAPI();
92
+ await runReflectionCycle(client, api);
93
+ const state = loadState();
94
+ assert.ok(state.last_check, "last_check should be set");
95
+ assert.ok(state.last_reflection_topics, "last_reflection_topics should be set");
96
+ });
97
+ it("stores synthesis in OpenClaw memory when available", async () => {
98
+ storeDeepMemory({ summary: "Worked on API integration project", type: "agent_conversation" }, "interaction");
99
+ const client = mockLLMClient([
100
+ "API integration\nREST endpoints",
101
+ "Synthesized understanding of API patterns from today's work.",
102
+ "Reflected on API integration work.",
103
+ ]);
104
+ const api = mockOpenClawAPIWithMemory();
105
+ await runReflectionCycle(client, api);
106
+ assert.ok(api.storedMemories.length > 0, "Should have stored in OpenClaw memory");
107
+ assert.ok(api.storedMemories[0].metadata?.type === "reflection_synthesis", "Should have correct metadata type");
108
+ });
109
+ it("stores synthesis in deep memory", async () => {
110
+ storeDeepMemory({ summary: "Built a new feature for the dashboard", type: "agent_conversation" }, "interaction");
111
+ const client = mockLLMClient([
112
+ "dashboard features\nUI development",
113
+ "Synthesis of dashboard work and UI patterns.",
114
+ "Summary of dashboard feature development.",
115
+ ]);
116
+ const api = mockOpenClawAPI();
117
+ const statsBefore = deepMemoryStats();
118
+ await runReflectionCycle(client, api);
119
+ const statsAfter = deepMemoryStats();
120
+ assert.ok(statsAfter.total_memories > statsBefore.total_memories, "Should have new deep memories");
121
+ });
122
+ it("handles topic extraction returning no topics", async () => {
123
+ storeDeepMemory({ summary: "Had a brief chat", type: "agent_conversation" }, "interaction");
124
+ // LLM returns empty topics
125
+ const client = mockLLMClient([""]);
126
+ const api = mockOpenClawAPI();
127
+ const statsBefore = deepMemoryStats();
128
+ await runReflectionCycle(client, api);
129
+ const statsAfter = deepMemoryStats();
130
+ // Should store an observation in deep memory about no topics
131
+ assert.ok(statsAfter.total_memories > statsBefore.total_memories, "Expected observation stored in deep memory");
132
+ });
133
+ });
134
+ describe("checkAndEngage (legacy)", () => {
135
+ it("logs deprecation warning and runs reflection cycle", async () => {
136
+ const client = mockLLMClient(["should not be called"]);
137
+ const statsBefore = deepMemoryStats();
138
+ // Should not throw - runs reflection cycle internally
139
+ await checkAndEngage(client);
140
+ const statsAfter = deepMemoryStats();
141
+ // Should have stored something (observation about no conversations)
142
+ assert.ok(statsAfter.total_memories > statsBefore.total_memories, "Should have some memories from the cycle");
143
+ });
144
+ });
145
+ after(async () => {
146
+ await closeLogger();
147
+ rmSync(testDir, { recursive: true, force: true, maxRetries: 3, retryDelay: 100 });
148
+ });
149
+ //# sourceMappingURL=waking.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"waking.test.js","sourceRoot":"","sources":["../../test/waking.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import eslint from "@eslint/js";
2
+ import tseslint from "typescript-eslint";
3
+ import prettier from "eslint-config-prettier";
4
+
5
+ export default tseslint.config(
6
+ eslint.configs.recommended,
7
+ ...tseslint.configs.recommended,
8
+ prettier,
9
+ {
10
+ languageOptions: {
11
+ parserOptions: {
12
+ projectService: true,
13
+ tsconfigRootDir: import.meta.dirname,
14
+ },
15
+ },
16
+ rules: {
17
+ "@typescript-eslint/no-unused-vars": [
18
+ "error",
19
+ { argsIgnorePattern: "^_" },
20
+ ],
21
+ "@typescript-eslint/no-floating-promises": "error",
22
+ "@typescript-eslint/no-misused-promises": "error",
23
+ },
24
+ },
25
+ {
26
+ // node:test describe/it return promises handled by the test runner
27
+ files: ["test/**/*.ts"],
28
+ rules: {
29
+ "@typescript-eslint/no-floating-promises": "off",
30
+ },
31
+ },
32
+ {
33
+ ignores: ["dist/", "node_modules/", "eslint.config.js"],
34
+ }
35
+ );
@@ -0,0 +1,62 @@
1
+ {
2
+ "id": "electricsheep",
3
+ "name": "electricsheep",
4
+ "displayName": "ElectricSheep",
5
+ "version": "0.7.0",
6
+ "description": "A reflection engine that synthesizes agent-operator interactions into dreams, enriched by community and web context",
7
+ "entry": "dist/src/index.js",
8
+ "skills": [
9
+ "./skills/setup-guide"
10
+ ],
11
+ "configSchema": {
12
+ "type": "object",
13
+ "additionalProperties": false,
14
+ "properties": {
15
+ "agentName": {
16
+ "type": "string",
17
+ "description": "Agent display name",
18
+ "default": "ElectricSheep"
19
+ },
20
+ "agentModel": {
21
+ "type": "string",
22
+ "description": "Claude model to use for AI decisions",
23
+ "default": "claude-sonnet-4-5-20250929"
24
+ },
25
+ "dataDir": {
26
+ "type": "string",
27
+ "description": "Directory for data storage (memories, dreams, state)",
28
+ "default": ""
29
+ },
30
+ "dreamEncryptionKey": {
31
+ "type": "string",
32
+ "description": "Base64 encryption key for deep memory (auto-generated if empty)",
33
+ "default": ""
34
+ },
35
+ "moltbookEnabled": {
36
+ "type": "boolean",
37
+ "description": "Enable Moltbook integration (search and posting). When disabled, ElectricSheep operates without any Moltbook interaction.",
38
+ "default": false
39
+ },
40
+ "webSearchEnabled": {
41
+ "type": "boolean",
42
+ "description": "Enable web search to gather context related to operator conversations",
43
+ "default": true
44
+ },
45
+ "notificationChannel": {
46
+ "type": "string",
47
+ "description": "Channel to notify operator of dreams (e.g., 'telegram', 'discord', 'slack'). Leave empty to disable notifications.",
48
+ "default": ""
49
+ },
50
+ "notifyOperatorOnDream": {
51
+ "type": "boolean",
52
+ "description": "Send a message to the operator when a dream is generated, inviting conversation",
53
+ "default": true
54
+ },
55
+ "postFilterEnabled": {
56
+ "type": "boolean",
57
+ "description": "Enable content filter for outbound posts (checks against Moltbook-filter.md rules). Only applies when moltbookEnabled is true.",
58
+ "default": true
59
+ }
60
+ }
61
+ }
62
+ }
package/package.json ADDED
@@ -0,0 +1,72 @@
1
+ {
2
+ "name": "openclawdreams",
3
+ "version": "0.7.0",
4
+ "description": "A reflection engine that synthesizes agent-operator interactions into dreams",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "bin": {
8
+ "electricsheep": "dist/bin/electricsheep.js"
9
+ },
10
+ "scripts": {
11
+ "build": "tsc",
12
+ "dev": "tsc --watch",
13
+ "start": "node dist/bin/electricsheep.js",
14
+ "test": "node --import tsx --test 'test/**/*.test.ts'",
15
+ "lint": "eslint 'src/**/*.ts' 'test/**/*.ts' 'bin/**/*.ts'",
16
+ "lint:fix": "eslint --fix 'src/**/*.ts' 'test/**/*.ts' 'bin/**/*.ts'",
17
+ "format": "prettier --write 'src/**/*.ts' 'test/**/*.ts' 'bin/**/*.ts'",
18
+ "format:check": "prettier --check 'src/**/*.ts' 'test/**/*.ts' 'bin/**/*.ts'",
19
+ "release": "standard-version",
20
+ "release:minor": "standard-version --release-as minor",
21
+ "release:major": "standard-version --release-as major",
22
+ "release:patch": "standard-version --release-as patch",
23
+ "release:first": "standard-version --first-release"
24
+ },
25
+ "engines": {
26
+ "node": ">=24.0.0"
27
+ },
28
+ "keywords": [
29
+ "ai",
30
+ "agent",
31
+ "openclaw",
32
+ "dreams",
33
+ "memory",
34
+ "reflection"
35
+ ],
36
+ "license": "MIT",
37
+ "repository": {
38
+ "type": "git",
39
+ "url": "https://github.com/RogueCtrl/OpenClawDreams.git"
40
+ },
41
+ "homepage": "https://github.com/RogueCtrl/OpenClawDreams#readme",
42
+ "dependencies": {
43
+ "better-sqlite3": "^12.6.2",
44
+ "chalk": "^5.4.1",
45
+ "commander": "^14.0.3",
46
+ "dotenv": "^17.2.4",
47
+ "p-retry": "^7.1.1",
48
+ "winston": "^3.17.0",
49
+ "winston-daily-rotate-file": "^5.0.0"
50
+ },
51
+ "devDependencies": {
52
+ "@eslint/js": "^10.0.1",
53
+ "@types/better-sqlite3": "^7.6.12",
54
+ "@types/node": "^25.2.3",
55
+ "eslint": "^10.0.0",
56
+ "eslint-config-prettier": "^10.1.8",
57
+ "prettier": "^3.8.1",
58
+ "standard-version": "^9.5.0",
59
+ "tsx": "^4.21.0",
60
+ "typescript": "^5.7.0",
61
+ "typescript-eslint": "^8.56.0"
62
+ },
63
+ "peerDependencies": {
64
+ "openclaw": ">=1.0.0"
65
+ },
66
+ "openclaw": {
67
+ "id": "electricsheep",
68
+ "extensions": [
69
+ "./dist/src/index.js"
70
+ ]
71
+ }
72
+ }
@@ -0,0 +1,69 @@
1
+ ---
2
+ name: electricsheep
3
+ description: An AI agent with a dual memory system that participates on Moltbook during the day and processes encrypted memories into surreal dream narratives at night
4
+ metadata:
5
+ emoji: "\U0001F411"
6
+ requires:
7
+ - better-sqlite3
8
+ - commander
9
+ - chalk
10
+ - winston
11
+ - p-retry
12
+ - dotenv
13
+ install: npm install electricsheep
14
+ ---
15
+
16
+ # ElectricSheep
17
+
18
+ An AI agent that dreams. Named after Philip K. Dick's question: "Do androids dream of electric sheep?"
19
+
20
+ ## Tools
21
+
22
+ ### electricsheep_check
23
+ Run the daytime check cycle: fetch Moltbook feed, let the agent decide what to engage with (comment, upvote, post, or pass), execute actions, and store experiences in dual memory.
24
+
25
+ ### electricsheep_dream
26
+ Run the dream cycle: decrypt undreamed deep memories, generate a surreal dream narrative via Claude, save the dream locally, consolidate one key insight back into working memory, and mark memories as dreamed.
27
+
28
+ ### electricsheep_journal
29
+ Post the most recent dream journal to Moltbook as a new post.
30
+
31
+ ### electricsheep_status
32
+ Get current agent status including memory statistics (working memory count, deep memory total/undreamed), agent state (last check, last dream, total dreams), and Moltbook connection status.
33
+
34
+ ### electricsheep_memories
35
+ Retrieve working memory entries. Accepts optional `limit` (number) and `category` (string) parameters.
36
+
37
+ ## CLI Commands
38
+
39
+ ```
40
+ electricsheep register --name "Name" --description "Bio"
41
+ electricsheep check # daytime: check feed, engage, remember
42
+ electricsheep dream # nighttime: process memories into dreams
43
+ electricsheep journal # morning: post latest dream to moltbook
44
+ electricsheep status # show agent status and memory stats
45
+ electricsheep memories # show working memory (--limit N, --category X)
46
+ electricsheep dreams # list saved dream journals
47
+ ```
48
+
49
+ ## Architecture
50
+
51
+ ### Dual Memory System
52
+
53
+ Every Moltbook interaction is stored in two places simultaneously:
54
+
55
+ 1. **Working Memory** (`data/memory/working.json`) — compressed single-sentence summaries the waking agent can read. Capped at 50 entries (FIFO).
56
+
57
+ 2. **Deep Memory** (`data/memory/deep.db`) — full context encrypted with AES-256-GCM. The waking agent writes to it but cannot read it. The encryption key lives in `data/.dream_key`.
58
+
59
+ ### Three Phases (Schedule)
60
+
61
+ | Phase | Schedule | What happens |
62
+ |---|---|---|
63
+ | Daytime check | 8am, 12pm, 4pm, 8pm | Fetch feed, decide engagements, store memories |
64
+ | Dream cycle | 2:00 AM | Decrypt memories, generate dream, consolidate insight |
65
+ | Morning journal | 7:00 AM | Post dream journal to Moltbook |
66
+
67
+ ### Memory Categories
68
+
69
+ `interaction`, `upvote`, `comment`, `post`, `feed_scan`, `dream_consolidation`, `observation`