genesis-ai-cli 7.4.5

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 (227) hide show
  1. package/.env.example +78 -0
  2. package/README.md +282 -0
  3. package/dist/src/active-inference/actions.d.ts +75 -0
  4. package/dist/src/active-inference/actions.js +250 -0
  5. package/dist/src/active-inference/autonomous-loop.d.ts +103 -0
  6. package/dist/src/active-inference/autonomous-loop.js +289 -0
  7. package/dist/src/active-inference/core.d.ts +85 -0
  8. package/dist/src/active-inference/core.js +555 -0
  9. package/dist/src/active-inference/demo-autonomous-loop.d.ts +8 -0
  10. package/dist/src/active-inference/demo-autonomous-loop.js +338 -0
  11. package/dist/src/active-inference/demo-value-integration.d.ts +8 -0
  12. package/dist/src/active-inference/demo-value-integration.js +174 -0
  13. package/dist/src/active-inference/index.d.ts +32 -0
  14. package/dist/src/active-inference/index.js +88 -0
  15. package/dist/src/active-inference/integration.d.ts +114 -0
  16. package/dist/src/active-inference/integration.js +698 -0
  17. package/dist/src/active-inference/memory-integration.d.ts +51 -0
  18. package/dist/src/active-inference/memory-integration.js +232 -0
  19. package/dist/src/active-inference/observations.d.ts +67 -0
  20. package/dist/src/active-inference/observations.js +147 -0
  21. package/dist/src/active-inference/test-active-inference.d.ts +8 -0
  22. package/dist/src/active-inference/test-active-inference.js +320 -0
  23. package/dist/src/active-inference/test-value-integration.d.ts +6 -0
  24. package/dist/src/active-inference/test-value-integration.js +168 -0
  25. package/dist/src/active-inference/types.d.ts +150 -0
  26. package/dist/src/active-inference/types.js +59 -0
  27. package/dist/src/active-inference/value-integration.d.ts +164 -0
  28. package/dist/src/active-inference/value-integration.js +459 -0
  29. package/dist/src/agents/base-agent.d.ts +53 -0
  30. package/dist/src/agents/base-agent.js +178 -0
  31. package/dist/src/agents/builder.d.ts +67 -0
  32. package/dist/src/agents/builder.js +537 -0
  33. package/dist/src/agents/critic.d.ts +35 -0
  34. package/dist/src/agents/critic.js +322 -0
  35. package/dist/src/agents/ethicist.d.ts +54 -0
  36. package/dist/src/agents/ethicist.js +393 -0
  37. package/dist/src/agents/explorer.d.ts +26 -0
  38. package/dist/src/agents/explorer.js +216 -0
  39. package/dist/src/agents/feeling.d.ts +41 -0
  40. package/dist/src/agents/feeling.js +320 -0
  41. package/dist/src/agents/index.d.ts +111 -0
  42. package/dist/src/agents/index.js +222 -0
  43. package/dist/src/agents/memory.d.ts +69 -0
  44. package/dist/src/agents/memory.js +404 -0
  45. package/dist/src/agents/message-bus.d.ts +88 -0
  46. package/dist/src/agents/message-bus.js +267 -0
  47. package/dist/src/agents/narrator.d.ts +90 -0
  48. package/dist/src/agents/narrator.js +473 -0
  49. package/dist/src/agents/planner.d.ts +38 -0
  50. package/dist/src/agents/planner.js +341 -0
  51. package/dist/src/agents/predictor.d.ts +73 -0
  52. package/dist/src/agents/predictor.js +506 -0
  53. package/dist/src/agents/sensor.d.ts +88 -0
  54. package/dist/src/agents/sensor.js +377 -0
  55. package/dist/src/agents/test-agents.d.ts +6 -0
  56. package/dist/src/agents/test-agents.js +73 -0
  57. package/dist/src/agents/types.d.ts +194 -0
  58. package/dist/src/agents/types.js +7 -0
  59. package/dist/src/brain/index.d.ts +185 -0
  60. package/dist/src/brain/index.js +843 -0
  61. package/dist/src/brain/trace.d.ts +91 -0
  62. package/dist/src/brain/trace.js +327 -0
  63. package/dist/src/brain/types.d.ts +165 -0
  64. package/dist/src/brain/types.js +51 -0
  65. package/dist/src/cli/chat.d.ts +237 -0
  66. package/dist/src/cli/chat.js +1959 -0
  67. package/dist/src/cli/dispatcher.d.ts +182 -0
  68. package/dist/src/cli/dispatcher.js +718 -0
  69. package/dist/src/cli/human-loop.d.ts +170 -0
  70. package/dist/src/cli/human-loop.js +543 -0
  71. package/dist/src/cli/index.d.ts +12 -0
  72. package/dist/src/cli/index.js +28 -0
  73. package/dist/src/cli/interactive.d.ts +141 -0
  74. package/dist/src/cli/interactive.js +757 -0
  75. package/dist/src/cli/ui.d.ts +205 -0
  76. package/dist/src/cli/ui.js +632 -0
  77. package/dist/src/consciousness/attention-schema.d.ts +154 -0
  78. package/dist/src/consciousness/attention-schema.js +432 -0
  79. package/dist/src/consciousness/global-workspace.d.ts +149 -0
  80. package/dist/src/consciousness/global-workspace.js +422 -0
  81. package/dist/src/consciousness/index.d.ts +186 -0
  82. package/dist/src/consciousness/index.js +476 -0
  83. package/dist/src/consciousness/phi-calculator.d.ts +119 -0
  84. package/dist/src/consciousness/phi-calculator.js +445 -0
  85. package/dist/src/consciousness/phi-decisions.d.ts +169 -0
  86. package/dist/src/consciousness/phi-decisions.js +383 -0
  87. package/dist/src/consciousness/phi-monitor.d.ts +153 -0
  88. package/dist/src/consciousness/phi-monitor.js +465 -0
  89. package/dist/src/consciousness/types.d.ts +260 -0
  90. package/dist/src/consciousness/types.js +44 -0
  91. package/dist/src/daemon/dream-mode.d.ts +115 -0
  92. package/dist/src/daemon/dream-mode.js +470 -0
  93. package/dist/src/daemon/index.d.ts +162 -0
  94. package/dist/src/daemon/index.js +542 -0
  95. package/dist/src/daemon/maintenance.d.ts +139 -0
  96. package/dist/src/daemon/maintenance.js +549 -0
  97. package/dist/src/daemon/process.d.ts +82 -0
  98. package/dist/src/daemon/process.js +442 -0
  99. package/dist/src/daemon/scheduler.d.ts +90 -0
  100. package/dist/src/daemon/scheduler.js +494 -0
  101. package/dist/src/daemon/types.d.ts +213 -0
  102. package/dist/src/daemon/types.js +50 -0
  103. package/dist/src/epistemic/index.d.ts +74 -0
  104. package/dist/src/epistemic/index.js +225 -0
  105. package/dist/src/grounding/epistemic-stack.d.ts +100 -0
  106. package/dist/src/grounding/epistemic-stack.js +408 -0
  107. package/dist/src/grounding/feedback.d.ts +98 -0
  108. package/dist/src/grounding/feedback.js +276 -0
  109. package/dist/src/grounding/index.d.ts +123 -0
  110. package/dist/src/grounding/index.js +224 -0
  111. package/dist/src/grounding/verifier.d.ts +149 -0
  112. package/dist/src/grounding/verifier.js +484 -0
  113. package/dist/src/healing/detector.d.ts +110 -0
  114. package/dist/src/healing/detector.js +436 -0
  115. package/dist/src/healing/fixer.d.ts +138 -0
  116. package/dist/src/healing/fixer.js +572 -0
  117. package/dist/src/healing/index.d.ts +23 -0
  118. package/dist/src/healing/index.js +43 -0
  119. package/dist/src/hooks/index.d.ts +135 -0
  120. package/dist/src/hooks/index.js +317 -0
  121. package/dist/src/index.d.ts +23 -0
  122. package/dist/src/index.js +1266 -0
  123. package/dist/src/kernel/index.d.ts +155 -0
  124. package/dist/src/kernel/index.js +795 -0
  125. package/dist/src/kernel/invariants.d.ts +153 -0
  126. package/dist/src/kernel/invariants.js +355 -0
  127. package/dist/src/kernel/test-kernel.d.ts +6 -0
  128. package/dist/src/kernel/test-kernel.js +108 -0
  129. package/dist/src/kernel/test-real-mcp.d.ts +10 -0
  130. package/dist/src/kernel/test-real-mcp.js +295 -0
  131. package/dist/src/llm/index.d.ts +146 -0
  132. package/dist/src/llm/index.js +428 -0
  133. package/dist/src/llm/router.d.ts +136 -0
  134. package/dist/src/llm/router.js +510 -0
  135. package/dist/src/mcp/index.d.ts +85 -0
  136. package/dist/src/mcp/index.js +657 -0
  137. package/dist/src/mcp/resilient.d.ts +139 -0
  138. package/dist/src/mcp/resilient.js +417 -0
  139. package/dist/src/memory/cache.d.ts +118 -0
  140. package/dist/src/memory/cache.js +356 -0
  141. package/dist/src/memory/cognitive-workspace.d.ts +231 -0
  142. package/dist/src/memory/cognitive-workspace.js +521 -0
  143. package/dist/src/memory/consolidation.d.ts +99 -0
  144. package/dist/src/memory/consolidation.js +443 -0
  145. package/dist/src/memory/episodic.d.ts +114 -0
  146. package/dist/src/memory/episodic.js +394 -0
  147. package/dist/src/memory/forgetting.d.ts +134 -0
  148. package/dist/src/memory/forgetting.js +324 -0
  149. package/dist/src/memory/index.d.ts +211 -0
  150. package/dist/src/memory/index.js +367 -0
  151. package/dist/src/memory/indexer.d.ts +123 -0
  152. package/dist/src/memory/indexer.js +479 -0
  153. package/dist/src/memory/procedural.d.ts +136 -0
  154. package/dist/src/memory/procedural.js +479 -0
  155. package/dist/src/memory/semantic.d.ts +132 -0
  156. package/dist/src/memory/semantic.js +497 -0
  157. package/dist/src/memory/types.d.ts +193 -0
  158. package/dist/src/memory/types.js +15 -0
  159. package/dist/src/orchestrator.d.ts +65 -0
  160. package/dist/src/orchestrator.js +317 -0
  161. package/dist/src/persistence/index.d.ts +257 -0
  162. package/dist/src/persistence/index.js +763 -0
  163. package/dist/src/pipeline/executor.d.ts +51 -0
  164. package/dist/src/pipeline/executor.js +695 -0
  165. package/dist/src/pipeline/index.d.ts +7 -0
  166. package/dist/src/pipeline/index.js +11 -0
  167. package/dist/src/self-production.d.ts +67 -0
  168. package/dist/src/self-production.js +205 -0
  169. package/dist/src/subagents/executor.d.ts +58 -0
  170. package/dist/src/subagents/executor.js +283 -0
  171. package/dist/src/subagents/index.d.ts +37 -0
  172. package/dist/src/subagents/index.js +53 -0
  173. package/dist/src/subagents/registry.d.ts +23 -0
  174. package/dist/src/subagents/registry.js +167 -0
  175. package/dist/src/subagents/types.d.ts +79 -0
  176. package/dist/src/subagents/types.js +14 -0
  177. package/dist/src/tools/bash.d.ts +139 -0
  178. package/dist/src/tools/bash.js +583 -0
  179. package/dist/src/tools/edit.d.ts +125 -0
  180. package/dist/src/tools/edit.js +424 -0
  181. package/dist/src/tools/git.d.ts +179 -0
  182. package/dist/src/tools/git.js +504 -0
  183. package/dist/src/tools/index.d.ts +21 -0
  184. package/dist/src/tools/index.js +163 -0
  185. package/dist/src/types.d.ts +145 -0
  186. package/dist/src/types.js +7 -0
  187. package/dist/src/world-model/decoder.d.ts +163 -0
  188. package/dist/src/world-model/decoder.js +517 -0
  189. package/dist/src/world-model/digital-twin.d.ts +219 -0
  190. package/dist/src/world-model/digital-twin.js +695 -0
  191. package/dist/src/world-model/encoder.d.ts +141 -0
  192. package/dist/src/world-model/encoder.js +564 -0
  193. package/dist/src/world-model/index.d.ts +221 -0
  194. package/dist/src/world-model/index.js +772 -0
  195. package/dist/src/world-model/predictor.d.ts +161 -0
  196. package/dist/src/world-model/predictor.js +681 -0
  197. package/dist/src/world-model/test-value-jepa.d.ts +8 -0
  198. package/dist/src/world-model/test-value-jepa.js +430 -0
  199. package/dist/src/world-model/types.d.ts +341 -0
  200. package/dist/src/world-model/types.js +69 -0
  201. package/dist/src/world-model/value-jepa.d.ts +247 -0
  202. package/dist/src/world-model/value-jepa.js +622 -0
  203. package/dist/test/brain.test.d.ts +11 -0
  204. package/dist/test/brain.test.js +358 -0
  205. package/dist/test/cli/dispatcher.test.d.ts +4 -0
  206. package/dist/test/cli/dispatcher.test.js +332 -0
  207. package/dist/test/cli/human-loop.test.d.ts +4 -0
  208. package/dist/test/cli/human-loop.test.js +270 -0
  209. package/dist/test/grounding/feedback.test.d.ts +4 -0
  210. package/dist/test/grounding/feedback.test.js +462 -0
  211. package/dist/test/grounding/verifier.test.d.ts +4 -0
  212. package/dist/test/grounding/verifier.test.js +442 -0
  213. package/dist/test/grounding.test.d.ts +6 -0
  214. package/dist/test/grounding.test.js +246 -0
  215. package/dist/test/healing/detector.test.d.ts +4 -0
  216. package/dist/test/healing/detector.test.js +266 -0
  217. package/dist/test/healing/fixer.test.d.ts +4 -0
  218. package/dist/test/healing/fixer.test.js +369 -0
  219. package/dist/test/integration.test.d.ts +5 -0
  220. package/dist/test/integration.test.js +290 -0
  221. package/dist/test/tools/bash.test.d.ts +4 -0
  222. package/dist/test/tools/bash.test.js +348 -0
  223. package/dist/test/tools/edit.test.d.ts +4 -0
  224. package/dist/test/tools/edit.test.js +350 -0
  225. package/dist/test/tools/git.test.d.ts +4 -0
  226. package/dist/test/tools/git.test.js +350 -0
  227. package/package.json +60 -0
@@ -0,0 +1,542 @@
1
+ "use strict";
2
+ /**
3
+ * Genesis 6.0 - Daemon Module
4
+ *
5
+ * Unified daemon for background task scheduling, self-maintenance, and dream mode.
6
+ *
7
+ * This module provides:
8
+ * - Scheduler: Background task execution with priorities and retries
9
+ * - Maintenance: Self-repair and health monitoring
10
+ * - Dream Mode: Offline memory consolidation and creative synthesis
11
+ *
12
+ * Usage:
13
+ * ```typescript
14
+ * import { createDaemon } from './daemon/index.js';
15
+ * import { createMemorySystem } from './memory/index.js';
16
+ *
17
+ * const memory = createMemorySystem();
18
+ * const daemon = createDaemon({ memory });
19
+ *
20
+ * // Start the daemon
21
+ * daemon.start();
22
+ *
23
+ * // Schedule a custom task
24
+ * daemon.schedule({
25
+ * name: 'my-task',
26
+ * schedule: { type: 'interval', intervalMs: 60000 },
27
+ * handler: async (ctx) => {
28
+ * ctx.logger.info('Running my task');
29
+ * return { success: true, duration: 100 };
30
+ * },
31
+ * });
32
+ *
33
+ * // Trigger a dream session
34
+ * await daemon.dream();
35
+ *
36
+ * // Check status
37
+ * console.log(daemon.status());
38
+ *
39
+ * // Stop the daemon
40
+ * daemon.stop();
41
+ * ```
42
+ */
43
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
44
+ if (k2 === undefined) k2 = k;
45
+ var desc = Object.getOwnPropertyDescriptor(m, k);
46
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
47
+ desc = { enumerable: true, get: function() { return m[k]; } };
48
+ }
49
+ Object.defineProperty(o, k2, desc);
50
+ }) : (function(o, m, k, k2) {
51
+ if (k2 === undefined) k2 = k;
52
+ o[k2] = m[k];
53
+ }));
54
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
55
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
56
+ };
57
+ Object.defineProperty(exports, "__esModule", { value: true });
58
+ exports.Daemon = exports.createDreamService = exports.DreamService = exports.createMaintenanceService = exports.MaintenanceService = exports.createScheduler = exports.Scheduler = void 0;
59
+ exports.createDaemon = createDaemon;
60
+ exports.getDaemon = getDaemon;
61
+ exports.resetDaemon = resetDaemon;
62
+ // Re-export types
63
+ __exportStar(require("./types.js"), exports);
64
+ // Re-export components
65
+ var scheduler_js_1 = require("./scheduler.js");
66
+ Object.defineProperty(exports, "Scheduler", { enumerable: true, get: function () { return scheduler_js_1.Scheduler; } });
67
+ Object.defineProperty(exports, "createScheduler", { enumerable: true, get: function () { return scheduler_js_1.createScheduler; } });
68
+ var maintenance_js_1 = require("./maintenance.js");
69
+ Object.defineProperty(exports, "MaintenanceService", { enumerable: true, get: function () { return maintenance_js_1.MaintenanceService; } });
70
+ Object.defineProperty(exports, "createMaintenanceService", { enumerable: true, get: function () { return maintenance_js_1.createMaintenanceService; } });
71
+ var dream_mode_js_1 = require("./dream-mode.js");
72
+ Object.defineProperty(exports, "DreamService", { enumerable: true, get: function () { return dream_mode_js_1.DreamService; } });
73
+ Object.defineProperty(exports, "createDreamService", { enumerable: true, get: function () { return dream_mode_js_1.createDreamService; } });
74
+ const types_js_1 = require("./types.js");
75
+ const scheduler_js_2 = require("./scheduler.js");
76
+ const maintenance_js_2 = require("./maintenance.js");
77
+ const dream_mode_js_2 = require("./dream-mode.js");
78
+ // ============================================================================
79
+ // Daemon Class
80
+ // ============================================================================
81
+ class Daemon {
82
+ config;
83
+ state = 'stopped';
84
+ startedAt = null;
85
+ errors = [];
86
+ eventHandlers = new Set();
87
+ heartbeatTimer = null;
88
+ // Components
89
+ scheduler;
90
+ maintenance;
91
+ dreamService;
92
+ // Dependencies
93
+ deps;
94
+ constructor(deps = {}, config = {}) {
95
+ this.config = { ...types_js_1.DEFAULT_DAEMON_CONFIG, ...config };
96
+ this.deps = deps;
97
+ // Create components
98
+ this.scheduler = (0, scheduler_js_2.createScheduler)(this.config.scheduler);
99
+ this.maintenance = (0, maintenance_js_2.createMaintenanceService)(this.config.maintenance, this.buildMaintenanceContext());
100
+ this.dreamService = (0, dream_mode_js_2.createDreamService)(this.config.dream, this.buildDreamContext());
101
+ // Wire up events
102
+ this.setupEventForwarding();
103
+ // Setup default tasks
104
+ this.setupDefaultTasks();
105
+ }
106
+ // ============================================================================
107
+ // Lifecycle
108
+ // ============================================================================
109
+ start() {
110
+ if (this.state !== 'stopped') {
111
+ throw new Error(`Cannot start daemon in state: ${this.state}`);
112
+ }
113
+ this.state = 'starting';
114
+ this.startedAt = new Date();
115
+ this.log('Daemon starting...');
116
+ // Start heartbeat
117
+ this.heartbeatTimer = setInterval(() => this.heartbeat(), this.config.heartbeatIntervalMs);
118
+ // Start components
119
+ if (this.config.scheduler.enabled) {
120
+ this.scheduler.start();
121
+ }
122
+ if (this.config.maintenance.enabled) {
123
+ this.maintenance.start();
124
+ }
125
+ if (this.config.dream.autoTrigger) {
126
+ this.dreamService.startAutoTrigger();
127
+ }
128
+ this.state = 'running';
129
+ this.emit({ type: 'daemon_started', timestamp: new Date(), data: null });
130
+ this.log('Daemon started');
131
+ }
132
+ stop() {
133
+ if (this.state === 'stopped' || this.state === 'stopping') {
134
+ return;
135
+ }
136
+ this.state = 'stopping';
137
+ this.log('Daemon stopping...');
138
+ // Stop heartbeat
139
+ if (this.heartbeatTimer) {
140
+ clearInterval(this.heartbeatTimer);
141
+ this.heartbeatTimer = null;
142
+ }
143
+ // Stop components
144
+ this.scheduler.stop();
145
+ this.maintenance.stop();
146
+ this.dreamService.stopAutoTrigger();
147
+ // Interrupt dream if running
148
+ if (this.dreamService.isDreaming()) {
149
+ this.dreamService.interruptDream('Daemon stopping');
150
+ }
151
+ this.state = 'stopped';
152
+ this.emit({ type: 'daemon_stopped', timestamp: new Date(), data: null });
153
+ this.log('Daemon stopped');
154
+ }
155
+ restart() {
156
+ this.stop();
157
+ this.start();
158
+ }
159
+ getState() {
160
+ return this.state;
161
+ }
162
+ isRunning() {
163
+ return this.state === 'running' || this.state === 'dreaming' || this.state === 'maintaining';
164
+ }
165
+ // ============================================================================
166
+ // Task Scheduling
167
+ // ============================================================================
168
+ schedule(options) {
169
+ return this.scheduler.schedule(options);
170
+ }
171
+ cancelTask(taskId) {
172
+ return this.scheduler.cancel(taskId);
173
+ }
174
+ triggerTask(taskId) {
175
+ return this.scheduler.trigger(taskId);
176
+ }
177
+ getTasks() {
178
+ return this.scheduler.getAll();
179
+ }
180
+ // ============================================================================
181
+ // Maintenance
182
+ // ============================================================================
183
+ async runMaintenance() {
184
+ const previousState = this.state;
185
+ this.state = 'maintaining';
186
+ try {
187
+ const report = await this.maintenance.runCycle();
188
+ return report;
189
+ }
190
+ finally {
191
+ this.state = previousState;
192
+ }
193
+ }
194
+ getMaintenanceIssues() {
195
+ return this.maintenance.getOpenIssues();
196
+ }
197
+ // ============================================================================
198
+ // Dream Mode
199
+ // ============================================================================
200
+ async dream(options = {}) {
201
+ if (this.dreamService.isDreaming()) {
202
+ throw new Error('Already dreaming');
203
+ }
204
+ const previousState = this.state;
205
+ this.state = 'dreaming';
206
+ try {
207
+ await this.dreamService.startDream(options);
208
+ const results = await this.dreamService.waitForWake();
209
+ return results;
210
+ }
211
+ finally {
212
+ this.state = previousState;
213
+ }
214
+ }
215
+ interruptDream(reason) {
216
+ return this.dreamService.interruptDream(reason);
217
+ }
218
+ isDreaming() {
219
+ return this.dreamService.isDreaming();
220
+ }
221
+ getDreamMetrics() {
222
+ return this.dreamService.getMetrics();
223
+ }
224
+ // ============================================================================
225
+ // Activity Tracking
226
+ // ============================================================================
227
+ recordActivity() {
228
+ this.dreamService.recordActivity();
229
+ }
230
+ // ============================================================================
231
+ // Status
232
+ // ============================================================================
233
+ status() {
234
+ const now = new Date();
235
+ const uptime = this.startedAt
236
+ ? now.getTime() - this.startedAt.getTime()
237
+ : 0;
238
+ const schedulerStats = this.scheduler.stats();
239
+ return {
240
+ state: this.state,
241
+ uptime,
242
+ startedAt: this.startedAt,
243
+ lastHeartbeat: now,
244
+ activeTasks: schedulerStats.running,
245
+ completedTasks: schedulerStats.completed,
246
+ failedTasks: schedulerStats.failed,
247
+ dreamCycles: this.dreamService.getMetrics().dreamCycles,
248
+ maintenanceCycles: this.maintenance.stats().cyclesRun,
249
+ errors: this.errors.slice(-10), // Last 10 errors
250
+ };
251
+ }
252
+ // ============================================================================
253
+ // Events
254
+ // ============================================================================
255
+ on(handler) {
256
+ this.eventHandlers.add(handler);
257
+ return () => this.eventHandlers.delete(handler);
258
+ }
259
+ emit(event) {
260
+ for (const handler of this.eventHandlers) {
261
+ try {
262
+ handler(event);
263
+ }
264
+ catch (err) {
265
+ console.error('Daemon event handler error:', err);
266
+ }
267
+ }
268
+ }
269
+ // ============================================================================
270
+ // Internal
271
+ // ============================================================================
272
+ heartbeat() {
273
+ // Check for too many errors
274
+ if (this.errors.length >= this.config.maxErrors) {
275
+ const recentErrors = this.errors.filter((e) => Date.now() - e.timestamp.getTime() < 60000);
276
+ if (recentErrors.length >= this.config.maxErrors) {
277
+ this.log('Too many errors, entering error state', 'error');
278
+ this.state = 'error';
279
+ this.emit({
280
+ type: 'daemon_error',
281
+ timestamp: new Date(),
282
+ data: { message: 'Too many errors' },
283
+ });
284
+ }
285
+ }
286
+ }
287
+ setupEventForwarding() {
288
+ // Forward scheduler events
289
+ this.scheduler.on((event) => {
290
+ const eventType = `task_${event.type.replace('task_', '')}`;
291
+ if (['task_scheduled', 'task_started', 'task_completed', 'task_failed', 'task_cancelled'].includes(eventType)) {
292
+ this.emit({
293
+ type: eventType,
294
+ timestamp: new Date(),
295
+ data: event.task,
296
+ });
297
+ }
298
+ });
299
+ // Forward maintenance events
300
+ this.maintenance.on((event) => {
301
+ if (event.type === 'cycle_started') {
302
+ this.emit({
303
+ type: 'maintenance_started',
304
+ timestamp: new Date(),
305
+ data: null,
306
+ });
307
+ }
308
+ else if (event.type === 'cycle_completed') {
309
+ this.emit({
310
+ type: 'maintenance_completed',
311
+ timestamp: new Date(),
312
+ data: event.data,
313
+ });
314
+ }
315
+ else if (event.type === 'issue_detected') {
316
+ this.emit({
317
+ type: 'maintenance_issue',
318
+ timestamp: new Date(),
319
+ data: event.data,
320
+ });
321
+ }
322
+ });
323
+ // Forward dream events
324
+ this.dreamService.on((event) => {
325
+ if (event.type === 'dream_started') {
326
+ this.emit({
327
+ type: 'dream_started',
328
+ timestamp: new Date(),
329
+ data: event.session,
330
+ });
331
+ }
332
+ else if (event.type === 'phase_changed') {
333
+ this.emit({
334
+ type: 'dream_phase_changed',
335
+ timestamp: new Date(),
336
+ data: event.data,
337
+ });
338
+ }
339
+ else if (event.type === 'dream_completed') {
340
+ this.emit({
341
+ type: 'dream_completed',
342
+ timestamp: new Date(),
343
+ data: event.session?.results,
344
+ });
345
+ }
346
+ else if (event.type === 'dream_interrupted') {
347
+ this.emit({
348
+ type: 'dream_interrupted',
349
+ timestamp: new Date(),
350
+ data: { reason: event.session?.interruptReason },
351
+ });
352
+ }
353
+ });
354
+ }
355
+ setupDefaultTasks() {
356
+ // Health check task
357
+ this.scheduler.schedule({
358
+ name: 'health-check',
359
+ description: 'Periodic agent health check',
360
+ schedule: { type: 'interval', intervalMs: this.config.maintenance.healthCheckIntervalMs },
361
+ priority: 'normal',
362
+ handler: async (ctx) => {
363
+ ctx.logger.debug('Running health check');
364
+ const issues = await this.maintenance.checkHealth();
365
+ return {
366
+ success: true,
367
+ duration: 0,
368
+ output: { issues: issues.length },
369
+ };
370
+ },
371
+ tags: ['system', 'health'],
372
+ });
373
+ // Memory cleanup task
374
+ if (this.deps.memory) {
375
+ this.scheduler.schedule({
376
+ name: 'memory-cleanup',
377
+ description: 'Periodic memory forgetting and cleanup',
378
+ schedule: { type: 'interval', intervalMs: this.config.maintenance.memoryCleanupIntervalMs },
379
+ priority: 'low',
380
+ handler: async (ctx) => {
381
+ ctx.logger.debug('Running memory cleanup');
382
+ const result = await this.maintenance.cleanupMemory();
383
+ return {
384
+ success: true,
385
+ duration: 0,
386
+ output: result,
387
+ };
388
+ },
389
+ tags: ['system', 'memory'],
390
+ });
391
+ }
392
+ }
393
+ buildMaintenanceContext() {
394
+ return {
395
+ checkAgentHealth: this.deps.kernel?.checkAgentHealth,
396
+ getMemoryStats: this.deps.memory
397
+ ? () => {
398
+ const stats = this.deps.memory.getStats();
399
+ return {
400
+ total: stats.total,
401
+ byType: {
402
+ episodic: stats.episodic.total,
403
+ semantic: stats.semantic.total,
404
+ procedural: stats.procedural.total,
405
+ },
406
+ avgRetention: 0.5, // Would need to calculate from memories
407
+ };
408
+ }
409
+ : undefined,
410
+ runMemoryForgetting: this.deps.memory
411
+ ? () => this.deps.memory.episodic.runForgetting()
412
+ : undefined,
413
+ runMemoryConsolidation: this.deps.memory
414
+ ? async () => {
415
+ const result = await this.deps.memory.consolidation.sleep();
416
+ return { consolidated: result.consolidated };
417
+ }
418
+ : undefined,
419
+ checkInvariants: this.deps.kernel?.checkInvariants,
420
+ repairInvariant: this.deps.kernel?.repairInvariant,
421
+ getState: this.deps.kernel?.getState,
422
+ resetState: this.deps.kernel?.resetState,
423
+ log: (message, level) => this.log(message, level),
424
+ };
425
+ }
426
+ buildDreamContext() {
427
+ return {
428
+ getEpisodicMemories: this.deps.memory
429
+ ? () => this.deps.memory.episodic.getAll()
430
+ : undefined,
431
+ getSemanticMemories: this.deps.memory
432
+ ? () => this.deps.memory.semantic.getAll()
433
+ : undefined,
434
+ getProceduralMemories: this.deps.memory
435
+ ? () => this.deps.memory.procedural.getAll()
436
+ : undefined,
437
+ consolidateMemory: this.deps.memory
438
+ ? async (episodeId) => {
439
+ // This would need proper implementation
440
+ return null;
441
+ }
442
+ : undefined,
443
+ extractPattern: this.deps.memory
444
+ ? async (episodeIds) => {
445
+ // This would need proper implementation
446
+ return null;
447
+ }
448
+ : undefined,
449
+ forgetMemory: this.deps.memory
450
+ ? (memoryId) => {
451
+ // This would need proper implementation
452
+ return false;
453
+ }
454
+ : undefined,
455
+ getState: this.deps.kernel?.getState,
456
+ rechargeEnergy: this.deps.kernel?.rechargeEnergy,
457
+ checkInvariants: this.deps.kernel
458
+ ? async () => {
459
+ const results = await this.deps.kernel.checkInvariants();
460
+ return results.every((r) => r.satisfied);
461
+ }
462
+ : undefined,
463
+ repairState: this.deps.kernel
464
+ ? async () => {
465
+ // Count repairs
466
+ return 0;
467
+ }
468
+ : undefined,
469
+ log: (message, level) => this.log(message, level),
470
+ };
471
+ }
472
+ log(message, level = 'info') {
473
+ if (this.deps.log) {
474
+ this.deps.log(message, level);
475
+ }
476
+ else {
477
+ const prefix = '[Daemon]';
478
+ const shouldLog = level === 'error' ||
479
+ level === 'warn' ||
480
+ (level === 'info' && this.config.logLevel !== 'error' && this.config.logLevel !== 'warn') ||
481
+ (level === 'debug' && this.config.logLevel === 'debug');
482
+ if (shouldLog) {
483
+ switch (level) {
484
+ case 'debug':
485
+ console.log(`${prefix} DEBUG: ${message}`);
486
+ break;
487
+ case 'info':
488
+ console.log(`${prefix} ${message}`);
489
+ break;
490
+ case 'warn':
491
+ console.warn(`${prefix} ${message}`);
492
+ break;
493
+ case 'error':
494
+ console.error(`${prefix} ${message}`);
495
+ break;
496
+ }
497
+ }
498
+ }
499
+ }
500
+ recordError(code, message, source) {
501
+ const error = {
502
+ timestamp: new Date(),
503
+ code,
504
+ message,
505
+ source,
506
+ recovered: false,
507
+ };
508
+ this.errors.push(error);
509
+ // Keep only last 100 errors
510
+ if (this.errors.length > 100) {
511
+ this.errors = this.errors.slice(-100);
512
+ }
513
+ this.emit({
514
+ type: 'daemon_error',
515
+ timestamp: new Date(),
516
+ data: error,
517
+ });
518
+ }
519
+ }
520
+ exports.Daemon = Daemon;
521
+ // ============================================================================
522
+ // Factory
523
+ // ============================================================================
524
+ function createDaemon(deps, config) {
525
+ return new Daemon(deps, config);
526
+ }
527
+ // ============================================================================
528
+ // Singleton Instance (optional)
529
+ // ============================================================================
530
+ let daemonInstance = null;
531
+ function getDaemon(deps, config) {
532
+ if (!daemonInstance) {
533
+ daemonInstance = createDaemon(deps, config);
534
+ }
535
+ return daemonInstance;
536
+ }
537
+ function resetDaemon() {
538
+ if (daemonInstance) {
539
+ daemonInstance.stop();
540
+ daemonInstance = null;
541
+ }
542
+ }
@@ -0,0 +1,139 @@
1
+ /**
2
+ * Genesis 6.0 - Maintenance Service
3
+ *
4
+ * Self-repair and health maintenance for the Genesis system.
5
+ *
6
+ * Features:
7
+ * - Health monitoring (agent responsiveness)
8
+ * - Memory cleanup (weak memories, cache)
9
+ * - State repair (invariant violations)
10
+ * - Resource management
11
+ * - Automatic recovery
12
+ *
13
+ * Based on:
14
+ * - Kubernetes liveness/readiness probes
15
+ * - Self-healing systems patterns
16
+ * - Autonomic computing (IBM, 2001)
17
+ *
18
+ * Usage:
19
+ * ```typescript
20
+ * import { createMaintenanceService } from './daemon/maintenance.js';
21
+ *
22
+ * const maintenance = createMaintenanceService({
23
+ * autoRepair: true,
24
+ * intervalMs: 300000, // 5 minutes
25
+ * });
26
+ *
27
+ * // Run maintenance cycle
28
+ * const report = await maintenance.runCycle();
29
+ *
30
+ * // Check specific component
31
+ * const issues = await maintenance.checkHealth();
32
+ * ```
33
+ */
34
+ import { MaintenanceConfig, MaintenanceTask, MaintenanceAction, MaintenanceReport, MaintenanceIssue } from './types.js';
35
+ export interface HealthCheckResult {
36
+ component: string;
37
+ healthy: boolean;
38
+ latency?: number;
39
+ details?: string;
40
+ lastCheck: Date;
41
+ }
42
+ export interface SystemHealth {
43
+ overall: 'healthy' | 'degraded' | 'unhealthy';
44
+ components: HealthCheckResult[];
45
+ timestamp: Date;
46
+ }
47
+ export interface MaintenanceContext {
48
+ checkAgentHealth?: () => Promise<Array<{
49
+ id: string;
50
+ healthy: boolean;
51
+ latency?: number;
52
+ }>>;
53
+ getMemoryStats?: () => {
54
+ total: number;
55
+ byType: {
56
+ episodic: number;
57
+ semantic: number;
58
+ procedural: number;
59
+ };
60
+ avgRetention: number;
61
+ };
62
+ runMemoryForgetting?: () => {
63
+ forgotten: number;
64
+ };
65
+ runMemoryConsolidation?: () => Promise<{
66
+ consolidated: number;
67
+ }>;
68
+ checkInvariants?: () => Promise<Array<{
69
+ id: string;
70
+ satisfied: boolean;
71
+ message?: string;
72
+ }>>;
73
+ repairInvariant?: (id: string) => Promise<boolean>;
74
+ getState?: () => {
75
+ state: string;
76
+ energy: number;
77
+ };
78
+ resetState?: () => void;
79
+ log?: (message: string, level?: 'debug' | 'info' | 'warn' | 'error') => void;
80
+ }
81
+ export type MaintenanceEventType = 'cycle_started' | 'cycle_completed' | 'issue_detected' | 'issue_resolved' | 'action_started' | 'action_completed' | 'action_failed';
82
+ export type MaintenanceEventHandler = (event: {
83
+ type: MaintenanceEventType;
84
+ data?: unknown;
85
+ }) => void;
86
+ export declare class MaintenanceService {
87
+ private config;
88
+ private context;
89
+ private tasks;
90
+ private issues;
91
+ private cycleTimer;
92
+ private running;
93
+ private eventHandlers;
94
+ private cyclesRun;
95
+ private issuesDetected;
96
+ private issuesResolved;
97
+ private lastCycleAt;
98
+ constructor(config?: Partial<MaintenanceConfig>, context?: MaintenanceContext);
99
+ start(): void;
100
+ stop(): void;
101
+ isRunning(): boolean;
102
+ setContext(context: Partial<MaintenanceContext>): void;
103
+ runCycle(): Promise<MaintenanceReport>;
104
+ checkHealth(): Promise<MaintenanceIssue[]>;
105
+ checkMemory(): Promise<MaintenanceIssue[]>;
106
+ checkInvariants(): Promise<MaintenanceIssue[]>;
107
+ checkResources(): Promise<MaintenanceIssue[]>;
108
+ autoRepair(issues: MaintenanceIssue[]): Promise<MaintenanceTask[]>;
109
+ private getRepairAction;
110
+ private createTask;
111
+ private getActionPriority;
112
+ private executeRepair;
113
+ runAction(action: MaintenanceAction, target?: string): Promise<MaintenanceTask>;
114
+ cleanupMemory(): Promise<{
115
+ forgotten: number;
116
+ consolidated: number;
117
+ }>;
118
+ getIssues(options?: {
119
+ severity?: 'critical' | 'warning' | 'info';
120
+ resolved?: boolean;
121
+ limit?: number;
122
+ }): MaintenanceIssue[];
123
+ getOpenIssues(): MaintenanceIssue[];
124
+ getTasks(): MaintenanceTask[];
125
+ stats(): {
126
+ cyclesRun: number;
127
+ issuesDetected: number;
128
+ issuesResolved: number;
129
+ openIssues: number;
130
+ lastCycleAt: Date | null;
131
+ tasksTotal: number;
132
+ tasksSucceeded: number;
133
+ tasksFailed: number;
134
+ };
135
+ on(handler: MaintenanceEventHandler): () => void;
136
+ private emit;
137
+ private log;
138
+ }
139
+ export declare function createMaintenanceService(config?: Partial<MaintenanceConfig>, context?: MaintenanceContext): MaintenanceService;