agentic-qe 2.3.3 → 2.3.4
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 +97 -0
- package/README.md +1 -1
- package/dist/agents/BaseAgent.d.ts +10 -0
- package/dist/agents/BaseAgent.d.ts.map +1 -1
- package/dist/agents/BaseAgent.js +113 -0
- package/dist/agents/BaseAgent.js.map +1 -1
- package/dist/cli/commands/dream/index.d.ts +50 -0
- package/dist/cli/commands/dream/index.d.ts.map +1 -0
- package/dist/cli/commands/dream/index.js +282 -0
- package/dist/cli/commands/dream/index.js.map +1 -0
- package/dist/cli/commands/learn/index.d.ts +31 -5
- package/dist/cli/commands/learn/index.d.ts.map +1 -1
- package/dist/cli/commands/learn/index.js +183 -50
- package/dist/cli/commands/learn/index.js.map +1 -1
- package/dist/cli/commands/transfer/index.d.ts +55 -0
- package/dist/cli/commands/transfer/index.d.ts.map +1 -0
- package/dist/cli/commands/transfer/index.js +317 -0
- package/dist/cli/commands/transfer/index.js.map +1 -0
- package/dist/cli/index.js +156 -3
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/init/index.d.ts.map +1 -1
- package/dist/cli/init/index.js +12 -4
- package/dist/cli/init/index.js.map +1 -1
- package/dist/cli/init/learning-init.d.ts +39 -0
- package/dist/cli/init/learning-init.d.ts.map +1 -0
- package/dist/cli/init/learning-init.js +239 -0
- package/dist/cli/init/learning-init.js.map +1 -0
- package/dist/core/memory/HNSWVectorMemory.js +1 -1
- package/dist/learning/baselines/BaselineCollector.d.ts +178 -0
- package/dist/learning/baselines/BaselineCollector.d.ts.map +1 -0
- package/dist/learning/baselines/BaselineCollector.js +398 -0
- package/dist/learning/baselines/BaselineCollector.js.map +1 -0
- package/dist/learning/baselines/StandardTaskSuite.d.ts +88 -0
- package/dist/learning/baselines/StandardTaskSuite.d.ts.map +1 -0
- package/dist/learning/baselines/StandardTaskSuite.js +801 -0
- package/dist/learning/baselines/StandardTaskSuite.js.map +1 -0
- package/dist/learning/baselines/index.d.ts +10 -0
- package/dist/learning/baselines/index.d.ts.map +1 -0
- package/dist/learning/baselines/index.js +15 -0
- package/dist/learning/baselines/index.js.map +1 -0
- package/dist/learning/capture/ExecutionRecorder.d.ts +97 -0
- package/dist/learning/capture/ExecutionRecorder.d.ts.map +1 -0
- package/dist/learning/capture/ExecutionRecorder.js +195 -0
- package/dist/learning/capture/ExecutionRecorder.js.map +1 -0
- package/dist/learning/capture/ExperienceCapture.d.ts +177 -0
- package/dist/learning/capture/ExperienceCapture.d.ts.map +1 -0
- package/dist/learning/capture/ExperienceCapture.js +432 -0
- package/dist/learning/capture/ExperienceCapture.js.map +1 -0
- package/dist/learning/capture/index.d.ts +12 -0
- package/dist/learning/capture/index.d.ts.map +1 -0
- package/dist/learning/capture/index.js +17 -0
- package/dist/learning/capture/index.js.map +1 -0
- package/dist/learning/dashboard/MetricsDashboard.d.ts +63 -0
- package/dist/learning/dashboard/MetricsDashboard.d.ts.map +1 -0
- package/dist/learning/dashboard/MetricsDashboard.js +230 -0
- package/dist/learning/dashboard/MetricsDashboard.js.map +1 -0
- package/dist/learning/dashboard/index.d.ts +7 -0
- package/dist/learning/dashboard/index.d.ts.map +1 -0
- package/dist/learning/dashboard/index.js +23 -0
- package/dist/learning/dashboard/index.js.map +1 -0
- package/dist/learning/dream/ConceptGraph.d.ts +160 -0
- package/dist/learning/dream/ConceptGraph.d.ts.map +1 -0
- package/dist/learning/dream/ConceptGraph.js +445 -0
- package/dist/learning/dream/ConceptGraph.js.map +1 -0
- package/dist/learning/dream/DreamEngine.d.ts +150 -0
- package/dist/learning/dream/DreamEngine.d.ts.map +1 -0
- package/dist/learning/dream/DreamEngine.js +551 -0
- package/dist/learning/dream/DreamEngine.js.map +1 -0
- package/dist/learning/dream/InsightGenerator.d.ts +152 -0
- package/dist/learning/dream/InsightGenerator.d.ts.map +1 -0
- package/dist/learning/dream/InsightGenerator.js +463 -0
- package/dist/learning/dream/InsightGenerator.js.map +1 -0
- package/dist/learning/dream/SpreadingActivation.d.ts +138 -0
- package/dist/learning/dream/SpreadingActivation.d.ts.map +1 -0
- package/dist/learning/dream/SpreadingActivation.js +320 -0
- package/dist/learning/dream/SpreadingActivation.js.map +1 -0
- package/dist/learning/dream/index.d.ts +14 -0
- package/dist/learning/dream/index.d.ts.map +1 -0
- package/dist/learning/dream/index.js +22 -0
- package/dist/learning/dream/index.js.map +1 -0
- package/dist/learning/metrics/AlertManager.d.ts +107 -0
- package/dist/learning/metrics/AlertManager.d.ts.map +1 -0
- package/dist/learning/metrics/AlertManager.js +246 -0
- package/dist/learning/metrics/AlertManager.js.map +1 -0
- package/dist/learning/metrics/LearningMetrics.d.ts +184 -0
- package/dist/learning/metrics/LearningMetrics.d.ts.map +1 -0
- package/dist/learning/metrics/LearningMetrics.js +754 -0
- package/dist/learning/metrics/LearningMetrics.js.map +1 -0
- package/dist/learning/metrics/MetricsCollector.d.ts +108 -0
- package/dist/learning/metrics/MetricsCollector.d.ts.map +1 -0
- package/dist/learning/metrics/MetricsCollector.js +240 -0
- package/dist/learning/metrics/MetricsCollector.js.map +1 -0
- package/dist/learning/metrics/MetricsStore.d.ts +149 -0
- package/dist/learning/metrics/MetricsStore.d.ts.map +1 -0
- package/dist/learning/metrics/MetricsStore.js +502 -0
- package/dist/learning/metrics/MetricsStore.js.map +1 -0
- package/dist/learning/metrics/TrendAnalyzer.d.ts +85 -0
- package/dist/learning/metrics/TrendAnalyzer.d.ts.map +1 -0
- package/dist/learning/metrics/TrendAnalyzer.js +210 -0
- package/dist/learning/metrics/TrendAnalyzer.js.map +1 -0
- package/dist/learning/metrics/index.d.ts +13 -0
- package/dist/learning/metrics/index.d.ts.map +1 -0
- package/dist/learning/metrics/index.js +39 -0
- package/dist/learning/metrics/index.js.map +1 -0
- package/dist/learning/scheduler/IdleDetector.d.ts +126 -0
- package/dist/learning/scheduler/IdleDetector.d.ts.map +1 -0
- package/dist/learning/scheduler/IdleDetector.js +281 -0
- package/dist/learning/scheduler/IdleDetector.js.map +1 -0
- package/dist/learning/scheduler/SleepCycle.d.ts +150 -0
- package/dist/learning/scheduler/SleepCycle.d.ts.map +1 -0
- package/dist/learning/scheduler/SleepCycle.js +506 -0
- package/dist/learning/scheduler/SleepCycle.js.map +1 -0
- package/dist/learning/scheduler/SleepScheduler.d.ts +131 -0
- package/dist/learning/scheduler/SleepScheduler.d.ts.map +1 -0
- package/dist/learning/scheduler/SleepScheduler.js +299 -0
- package/dist/learning/scheduler/SleepScheduler.js.map +1 -0
- package/dist/learning/scheduler/TimeBasedTrigger.d.ts +108 -0
- package/dist/learning/scheduler/TimeBasedTrigger.d.ts.map +1 -0
- package/dist/learning/scheduler/TimeBasedTrigger.js +222 -0
- package/dist/learning/scheduler/TimeBasedTrigger.js.map +1 -0
- package/dist/learning/scheduler/index.d.ts +16 -0
- package/dist/learning/scheduler/index.d.ts.map +1 -0
- package/dist/learning/scheduler/index.js +23 -0
- package/dist/learning/scheduler/index.js.map +1 -0
- package/dist/learning/synthesis/PatternSynthesis.d.ts +162 -0
- package/dist/learning/synthesis/PatternSynthesis.d.ts.map +1 -0
- package/dist/learning/synthesis/PatternSynthesis.js +479 -0
- package/dist/learning/synthesis/PatternSynthesis.js.map +1 -0
- package/dist/learning/synthesis/index.d.ts +10 -0
- package/dist/learning/synthesis/index.d.ts.map +1 -0
- package/dist/learning/synthesis/index.js +14 -0
- package/dist/learning/synthesis/index.js.map +1 -0
- package/dist/learning/transfer/CompatibilityScorer.d.ts +115 -0
- package/dist/learning/transfer/CompatibilityScorer.d.ts.map +1 -0
- package/dist/learning/transfer/CompatibilityScorer.js +319 -0
- package/dist/learning/transfer/CompatibilityScorer.js.map +1 -0
- package/dist/learning/transfer/TransferProtocol.d.ts +172 -0
- package/dist/learning/transfer/TransferProtocol.d.ts.map +1 -0
- package/dist/learning/transfer/TransferProtocol.js +611 -0
- package/dist/learning/transfer/TransferProtocol.js.map +1 -0
- package/dist/learning/transfer/TransferPrototype.d.ts +93 -0
- package/dist/learning/transfer/TransferPrototype.d.ts.map +1 -0
- package/dist/learning/transfer/TransferPrototype.js +433 -0
- package/dist/learning/transfer/TransferPrototype.js.map +1 -0
- package/dist/learning/transfer/TransferValidator.d.ts +140 -0
- package/dist/learning/transfer/TransferValidator.d.ts.map +1 -0
- package/dist/learning/transfer/TransferValidator.js +413 -0
- package/dist/learning/transfer/TransferValidator.js.map +1 -0
- package/dist/learning/transfer/index.d.ts +14 -0
- package/dist/learning/transfer/index.d.ts.map +1 -0
- package/dist/learning/transfer/index.js +22 -0
- package/dist/learning/transfer/index.js.map +1 -0
- package/dist/mcp/handlers/test/test-generate-enhanced.d.ts +26 -2
- package/dist/mcp/handlers/test/test-generate-enhanced.d.ts.map +1 -1
- package/dist/mcp/handlers/test/test-generate-enhanced.js +159 -27
- package/dist/mcp/handlers/test/test-generate-enhanced.js.map +1 -1
- package/dist/mcp/server-instructions.d.ts +1 -1
- package/dist/mcp/server-instructions.js +1 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +2 -1
- package/dist/mcp/server.js.map +1 -1
- package/package.json +5 -2
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* SleepScheduler - Orchestrates learning cycles during system idle periods
|
|
4
|
+
*
|
|
5
|
+
* Triggers learning activities when the system is idle, using either:
|
|
6
|
+
* - Idle detection (CPU/memory monitoring)
|
|
7
|
+
* - Time-based scheduling (cron-like)
|
|
8
|
+
* - Hybrid mode (both)
|
|
9
|
+
*
|
|
10
|
+
* Part of the Nightly-Learner Phase 1 implementation.
|
|
11
|
+
*
|
|
12
|
+
* @version 1.0.0
|
|
13
|
+
* @module src/learning/scheduler/SleepScheduler
|
|
14
|
+
*/
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.SleepScheduler = void 0;
|
|
17
|
+
const events_1 = require("events");
|
|
18
|
+
const IdleDetector_1 = require("./IdleDetector");
|
|
19
|
+
const SleepCycle_1 = require("./SleepCycle");
|
|
20
|
+
const Logger_1 = require("../../utils/Logger");
|
|
21
|
+
/**
|
|
22
|
+
* SleepScheduler orchestrates learning cycles during idle periods
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```typescript
|
|
26
|
+
* const scheduler = new SleepScheduler({
|
|
27
|
+
* mode: 'hybrid',
|
|
28
|
+
* learningBudget: { maxPatternsPerCycle: 50, maxAgentsPerCycle: 5 },
|
|
29
|
+
* });
|
|
30
|
+
*
|
|
31
|
+
* scheduler.on('sleep:start', (cycle) => console.log('Learning cycle started'));
|
|
32
|
+
* scheduler.on('sleep:end', (summary) => console.log('Cycle complete:', summary));
|
|
33
|
+
*
|
|
34
|
+
* await scheduler.start();
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
class SleepScheduler extends events_1.EventEmitter {
|
|
38
|
+
constructor(config) {
|
|
39
|
+
super();
|
|
40
|
+
this.currentCycle = null;
|
|
41
|
+
this.isRunning = false;
|
|
42
|
+
this.timeBasedTimer = null;
|
|
43
|
+
this.lastCycleEnd = null;
|
|
44
|
+
this.cyclesCompleted = 0;
|
|
45
|
+
this.totalPatternsProcessed = 0;
|
|
46
|
+
this.totalAgentsProcessed = 0;
|
|
47
|
+
this.logger = Logger_1.Logger.getInstance();
|
|
48
|
+
// Apply defaults
|
|
49
|
+
this.config = {
|
|
50
|
+
mode: config.mode,
|
|
51
|
+
idleConfig: {
|
|
52
|
+
cpuThreshold: 20,
|
|
53
|
+
memoryThreshold: 70,
|
|
54
|
+
taskQueueEmpty: true,
|
|
55
|
+
minIdleDuration: 60000,
|
|
56
|
+
checkInterval: 10000,
|
|
57
|
+
debug: config.debug ?? false,
|
|
58
|
+
...config.idleConfig,
|
|
59
|
+
},
|
|
60
|
+
schedule: {
|
|
61
|
+
startHour: 2,
|
|
62
|
+
durationMinutes: 60,
|
|
63
|
+
daysOfWeek: [0, 1, 2, 3, 4, 5, 6],
|
|
64
|
+
...config.schedule,
|
|
65
|
+
},
|
|
66
|
+
learningBudget: {
|
|
67
|
+
maxPatternsPerCycle: 50,
|
|
68
|
+
maxAgentsPerCycle: 5,
|
|
69
|
+
maxDurationMs: 3600000,
|
|
70
|
+
...config.learningBudget,
|
|
71
|
+
},
|
|
72
|
+
minCycleInterval: config.minCycleInterval ?? 3600000,
|
|
73
|
+
debug: config.debug ?? false,
|
|
74
|
+
};
|
|
75
|
+
this.idleDetector = new IdleDetector_1.IdleDetector(this.config.idleConfig);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Start the sleep scheduler
|
|
79
|
+
*/
|
|
80
|
+
async start() {
|
|
81
|
+
if (this.isRunning) {
|
|
82
|
+
this.logger.warn('[SleepScheduler] Already running');
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
this.isRunning = true;
|
|
86
|
+
this.logger.info('[SleepScheduler] Starting', {
|
|
87
|
+
mode: this.config.mode,
|
|
88
|
+
budget: this.config.learningBudget,
|
|
89
|
+
});
|
|
90
|
+
// Set up idle-based triggering
|
|
91
|
+
if (this.config.mode === 'idle' || this.config.mode === 'hybrid') {
|
|
92
|
+
this.idleDetector.on('idle:detected', this.handleIdleDetected.bind(this));
|
|
93
|
+
await this.idleDetector.start();
|
|
94
|
+
this.logger.info('[SleepScheduler] Idle detection enabled');
|
|
95
|
+
}
|
|
96
|
+
// Set up time-based triggering
|
|
97
|
+
if (this.config.mode === 'time' || this.config.mode === 'hybrid') {
|
|
98
|
+
this.scheduleTimeBased();
|
|
99
|
+
this.logger.info('[SleepScheduler] Time-based scheduling enabled', {
|
|
100
|
+
startHour: this.config.schedule.startHour,
|
|
101
|
+
durationMinutes: this.config.schedule.durationMinutes,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
this.emit('scheduler:started', this.getState());
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Stop the sleep scheduler
|
|
108
|
+
*/
|
|
109
|
+
async stop() {
|
|
110
|
+
if (!this.isRunning)
|
|
111
|
+
return;
|
|
112
|
+
this.logger.info('[SleepScheduler] Stopping');
|
|
113
|
+
this.isRunning = false;
|
|
114
|
+
// Stop idle detection
|
|
115
|
+
await this.idleDetector.stop();
|
|
116
|
+
// Clear time-based timer
|
|
117
|
+
if (this.timeBasedTimer) {
|
|
118
|
+
clearTimeout(this.timeBasedTimer);
|
|
119
|
+
this.timeBasedTimer = null;
|
|
120
|
+
}
|
|
121
|
+
// Abort current cycle if active
|
|
122
|
+
if (this.currentCycle?.isActive) {
|
|
123
|
+
await this.currentCycle.abort();
|
|
124
|
+
}
|
|
125
|
+
this.emit('scheduler:stopped', this.getState());
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Manually trigger a learning cycle
|
|
129
|
+
*/
|
|
130
|
+
async triggerCycle(reason = 'manual') {
|
|
131
|
+
if (!this.isRunning) {
|
|
132
|
+
this.logger.warn('[SleepScheduler] Cannot trigger cycle - scheduler not running');
|
|
133
|
+
return null;
|
|
134
|
+
}
|
|
135
|
+
if (this.currentCycle?.isActive) {
|
|
136
|
+
this.logger.warn('[SleepScheduler] Cycle already in progress');
|
|
137
|
+
return null;
|
|
138
|
+
}
|
|
139
|
+
this.logger.info('[SleepScheduler] Manual cycle triggered', { reason });
|
|
140
|
+
return await this.executeCycle(reason);
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Get current scheduler state
|
|
144
|
+
*/
|
|
145
|
+
getState() {
|
|
146
|
+
return {
|
|
147
|
+
isRunning: this.isRunning,
|
|
148
|
+
mode: this.config.mode,
|
|
149
|
+
currentCycle: this.currentCycle,
|
|
150
|
+
lastCycleEnd: this.lastCycleEnd,
|
|
151
|
+
cyclesCompleted: this.cyclesCompleted,
|
|
152
|
+
totalPatternsProcessed: this.totalPatternsProcessed,
|
|
153
|
+
totalAgentsProcessed: this.totalAgentsProcessed,
|
|
154
|
+
nextScheduledRun: this.getNextScheduledRun(),
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Register a task to prevent idle detection during critical operations
|
|
159
|
+
*/
|
|
160
|
+
registerTask(taskId) {
|
|
161
|
+
this.idleDetector.registerTask(taskId);
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Unregister a task to allow idle detection
|
|
165
|
+
*/
|
|
166
|
+
unregisterTask(taskId) {
|
|
167
|
+
this.idleDetector.unregisterTask(taskId);
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Handle idle detection event
|
|
171
|
+
*/
|
|
172
|
+
async handleIdleDetected(state) {
|
|
173
|
+
// Check if we're within minimum cycle interval
|
|
174
|
+
if (this.lastCycleEnd) {
|
|
175
|
+
const timeSinceLastCycle = Date.now() - this.lastCycleEnd.getTime();
|
|
176
|
+
if (timeSinceLastCycle < this.config.minCycleInterval) {
|
|
177
|
+
this.logger.debug('[SleepScheduler] Skipping cycle - too soon since last', {
|
|
178
|
+
timeSinceLastCycle,
|
|
179
|
+
minInterval: this.config.minCycleInterval,
|
|
180
|
+
});
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
this.logger.info('[SleepScheduler] Idle detected, triggering cycle', {
|
|
185
|
+
idleDuration: state.idleDuration,
|
|
186
|
+
cpu: state.cpuUsage.toFixed(1) + '%',
|
|
187
|
+
memory: state.memoryUsage.toFixed(1) + '%',
|
|
188
|
+
});
|
|
189
|
+
await this.executeCycle('idle');
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Execute a learning cycle
|
|
193
|
+
*/
|
|
194
|
+
async executeCycle(trigger) {
|
|
195
|
+
const cycleConfig = {
|
|
196
|
+
budget: this.config.learningBudget,
|
|
197
|
+
debug: this.config.debug,
|
|
198
|
+
};
|
|
199
|
+
this.currentCycle = new SleepCycle_1.SleepCycle(cycleConfig);
|
|
200
|
+
// Forward cycle events
|
|
201
|
+
this.currentCycle.on('phase:start', (phase) => {
|
|
202
|
+
this.emit('sleep:phase', phase);
|
|
203
|
+
});
|
|
204
|
+
this.currentCycle.on('phase:complete', (phase, result) => {
|
|
205
|
+
this.emit('sleep:phase:complete', phase, result);
|
|
206
|
+
});
|
|
207
|
+
this.emit('sleep:start', {
|
|
208
|
+
cycle: this.currentCycle,
|
|
209
|
+
trigger,
|
|
210
|
+
timestamp: new Date(),
|
|
211
|
+
});
|
|
212
|
+
try {
|
|
213
|
+
const summary = await this.currentCycle.execute();
|
|
214
|
+
this.lastCycleEnd = new Date();
|
|
215
|
+
this.cyclesCompleted++;
|
|
216
|
+
this.totalPatternsProcessed += summary.patternsDiscovered + summary.patternsConsolidated;
|
|
217
|
+
this.totalAgentsProcessed += summary.agentsProcessed.length;
|
|
218
|
+
this.emit('sleep:end', summary);
|
|
219
|
+
this.logger.info('[SleepScheduler] Cycle completed', {
|
|
220
|
+
duration: summary.endTime.getTime() - summary.startTime.getTime(),
|
|
221
|
+
patternsDiscovered: summary.patternsDiscovered,
|
|
222
|
+
patternsConsolidated: summary.patternsConsolidated,
|
|
223
|
+
agentsProcessed: summary.agentsProcessed.length,
|
|
224
|
+
errors: summary.errors.length,
|
|
225
|
+
});
|
|
226
|
+
return summary;
|
|
227
|
+
}
|
|
228
|
+
catch (error) {
|
|
229
|
+
this.logger.error('[SleepScheduler] Cycle failed', error);
|
|
230
|
+
this.emit('error', error);
|
|
231
|
+
throw error;
|
|
232
|
+
}
|
|
233
|
+
finally {
|
|
234
|
+
this.currentCycle = null;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Set up time-based scheduling
|
|
239
|
+
*/
|
|
240
|
+
scheduleTimeBased() {
|
|
241
|
+
const scheduleNext = () => {
|
|
242
|
+
const nextRun = this.getNextScheduledRun();
|
|
243
|
+
if (!nextRun)
|
|
244
|
+
return;
|
|
245
|
+
const delay = nextRun.getTime() - Date.now();
|
|
246
|
+
this.logger.debug('[SleepScheduler] Next scheduled run', {
|
|
247
|
+
nextRun: nextRun.toISOString(),
|
|
248
|
+
delayMs: delay,
|
|
249
|
+
});
|
|
250
|
+
this.timeBasedTimer = setTimeout(async () => {
|
|
251
|
+
if (!this.isRunning)
|
|
252
|
+
return;
|
|
253
|
+
// Check if today is a scheduled day
|
|
254
|
+
const today = new Date().getDay();
|
|
255
|
+
if (this.config.schedule.daysOfWeek?.includes(today)) {
|
|
256
|
+
try {
|
|
257
|
+
await this.executeCycle('scheduled');
|
|
258
|
+
}
|
|
259
|
+
catch (error) {
|
|
260
|
+
this.logger.error('[SleepScheduler] Scheduled cycle failed', error);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
// Schedule next run
|
|
264
|
+
scheduleNext();
|
|
265
|
+
}, delay);
|
|
266
|
+
};
|
|
267
|
+
scheduleNext();
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Calculate next scheduled run time
|
|
271
|
+
*/
|
|
272
|
+
getNextScheduledRun() {
|
|
273
|
+
if (this.config.mode === 'idle')
|
|
274
|
+
return null;
|
|
275
|
+
const now = new Date();
|
|
276
|
+
const nextRun = new Date(now);
|
|
277
|
+
// Set to scheduled hour
|
|
278
|
+
nextRun.setHours(this.config.schedule?.startHour ?? 2, 0, 0, 0);
|
|
279
|
+
// If that time has passed today, schedule for tomorrow
|
|
280
|
+
if (nextRun <= now) {
|
|
281
|
+
nextRun.setDate(nextRun.getDate() + 1);
|
|
282
|
+
}
|
|
283
|
+
// Find next valid day
|
|
284
|
+
const daysOfWeek = this.config.schedule.daysOfWeek || [0, 1, 2, 3, 4, 5, 6];
|
|
285
|
+
while (!daysOfWeek.includes(nextRun.getDay())) {
|
|
286
|
+
nextRun.setDate(nextRun.getDate() + 1);
|
|
287
|
+
}
|
|
288
|
+
return nextRun;
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* Get configuration
|
|
292
|
+
*/
|
|
293
|
+
getConfig() {
|
|
294
|
+
return { ...this.config };
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
exports.SleepScheduler = SleepScheduler;
|
|
298
|
+
exports.default = SleepScheduler;
|
|
299
|
+
//# sourceMappingURL=SleepScheduler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SleepScheduler.js","sourceRoot":"","sources":["../../../src/learning/scheduler/SleepScheduler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TimeBasedTrigger - Cron-like scheduling for learning cycles
|
|
3
|
+
*
|
|
4
|
+
* Provides time-based triggering as a fallback or supplement to idle detection.
|
|
5
|
+
* Supports daily scheduling with configurable hours and days of week.
|
|
6
|
+
*
|
|
7
|
+
* Part of the Nightly-Learner Phase 1 implementation.
|
|
8
|
+
*
|
|
9
|
+
* @version 1.0.0
|
|
10
|
+
* @module src/learning/scheduler/TimeBasedTrigger
|
|
11
|
+
*/
|
|
12
|
+
import { EventEmitter } from 'events';
|
|
13
|
+
export interface TimeBasedTriggerConfig {
|
|
14
|
+
/** Hour to trigger (0-23). Default: 2 (2 AM) */
|
|
15
|
+
hour: number;
|
|
16
|
+
/** Minute to trigger (0-59). Default: 0 */
|
|
17
|
+
minute?: number;
|
|
18
|
+
/** Days of week to trigger (0=Sunday, 6=Saturday). Default: all days */
|
|
19
|
+
daysOfWeek?: number[];
|
|
20
|
+
/** Timezone offset in hours. Default: 0 (UTC) */
|
|
21
|
+
timezoneOffset?: number;
|
|
22
|
+
/** Enable debug logging */
|
|
23
|
+
debug?: boolean;
|
|
24
|
+
}
|
|
25
|
+
export interface TriggerEvent {
|
|
26
|
+
timestamp: Date;
|
|
27
|
+
scheduledTime: Date;
|
|
28
|
+
dayOfWeek: number;
|
|
29
|
+
triggered: boolean;
|
|
30
|
+
skipped?: string;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* TimeBasedTrigger provides cron-like scheduling
|
|
34
|
+
*
|
|
35
|
+
* @example
|
|
36
|
+
* ```typescript
|
|
37
|
+
* const trigger = new TimeBasedTrigger({
|
|
38
|
+
* hour: 2,
|
|
39
|
+
* minute: 30,
|
|
40
|
+
* daysOfWeek: [1, 2, 3, 4, 5], // Weekdays only
|
|
41
|
+
* });
|
|
42
|
+
*
|
|
43
|
+
* trigger.on('trigger', () => {
|
|
44
|
+
* console.log('Time to learn!');
|
|
45
|
+
* });
|
|
46
|
+
*
|
|
47
|
+
* trigger.start();
|
|
48
|
+
* ```
|
|
49
|
+
*/
|
|
50
|
+
export declare class TimeBasedTrigger extends EventEmitter {
|
|
51
|
+
private config;
|
|
52
|
+
private logger;
|
|
53
|
+
private timer;
|
|
54
|
+
private isRunning;
|
|
55
|
+
private triggerHistory;
|
|
56
|
+
private skipNextTrigger;
|
|
57
|
+
constructor(config: TimeBasedTriggerConfig);
|
|
58
|
+
/**
|
|
59
|
+
* Start the time-based trigger
|
|
60
|
+
*/
|
|
61
|
+
start(): void;
|
|
62
|
+
/**
|
|
63
|
+
* Stop the time-based trigger
|
|
64
|
+
*/
|
|
65
|
+
stop(): void;
|
|
66
|
+
/**
|
|
67
|
+
* Skip the next scheduled trigger
|
|
68
|
+
*/
|
|
69
|
+
skipNext(reason?: string): void;
|
|
70
|
+
/**
|
|
71
|
+
* Get the next scheduled trigger time
|
|
72
|
+
*/
|
|
73
|
+
getNextTriggerTime(): Date | null;
|
|
74
|
+
/**
|
|
75
|
+
* Get time until next trigger in milliseconds
|
|
76
|
+
*/
|
|
77
|
+
getTimeUntilNextTrigger(): number | null;
|
|
78
|
+
/**
|
|
79
|
+
* Get trigger history
|
|
80
|
+
*/
|
|
81
|
+
getHistory(limit?: number): TriggerEvent[];
|
|
82
|
+
/**
|
|
83
|
+
* Check if a specific day is enabled
|
|
84
|
+
*/
|
|
85
|
+
isDayEnabled(day: number): boolean;
|
|
86
|
+
/**
|
|
87
|
+
* Update configuration (requires restart)
|
|
88
|
+
*/
|
|
89
|
+
updateConfig(config: Partial<TimeBasedTriggerConfig>): void;
|
|
90
|
+
/**
|
|
91
|
+
* Schedule the next trigger
|
|
92
|
+
*/
|
|
93
|
+
private scheduleNextTrigger;
|
|
94
|
+
/**
|
|
95
|
+
* Handle a trigger event
|
|
96
|
+
*/
|
|
97
|
+
private handleTrigger;
|
|
98
|
+
/**
|
|
99
|
+
* Get configuration
|
|
100
|
+
*/
|
|
101
|
+
getConfig(): TimeBasedTriggerConfig;
|
|
102
|
+
/**
|
|
103
|
+
* Check if trigger is running
|
|
104
|
+
*/
|
|
105
|
+
getIsRunning(): boolean;
|
|
106
|
+
}
|
|
107
|
+
export default TimeBasedTrigger;
|
|
108
|
+
//# sourceMappingURL=TimeBasedTrigger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TimeBasedTrigger.d.ts","sourceRoot":"","sources":["../../../src/learning/scheduler/TimeBasedTrigger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAGtC,MAAM,WAAW,sBAAsB;IACrC,gDAAgD;IAChD,IAAI,EAAE,MAAM,CAAC;IACb,2CAA2C;IAC3C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wEAAwE;IACxE,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,iDAAiD;IACjD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,2BAA2B;IAC3B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,IAAI,CAAC;IAChB,aAAa,EAAE,IAAI,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,gBAAiB,SAAQ,YAAY;IAChD,OAAO,CAAC,MAAM,CAAmC;IACjD,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAA+B;IAC5C,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,cAAc,CAAsB;IAC5C,OAAO,CAAC,eAAe,CAAkB;gBAE7B,MAAM,EAAE,sBAAsB;IAqB1C;;OAEG;IACH,KAAK,IAAI,IAAI;IAmBb;;OAEG;IACH,IAAI,IAAI,IAAI;IAcZ;;OAEG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;IAK/B;;OAEG;IACH,kBAAkB,IAAI,IAAI,GAAG,IAAI;IAyBjC;;OAEG;IACH,uBAAuB,IAAI,MAAM,GAAG,IAAI;IAMxC;;OAEG;IACH,UAAU,CAAC,KAAK,GAAE,MAAW,GAAG,YAAY,EAAE;IAI9C;;OAEG;IACH,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIlC;;OAEG;IACH,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,sBAAsB,CAAC,GAAG,IAAI;IAiB3D;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAiB3B;;OAEG;IACH,OAAO,CAAC,aAAa;IAkCrB;;OAEG;IACH,SAAS,IAAI,sBAAsB;IAInC;;OAEG;IACH,YAAY,IAAI,OAAO;CAGxB;AAED,eAAe,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* TimeBasedTrigger - Cron-like scheduling for learning cycles
|
|
4
|
+
*
|
|
5
|
+
* Provides time-based triggering as a fallback or supplement to idle detection.
|
|
6
|
+
* Supports daily scheduling with configurable hours and days of week.
|
|
7
|
+
*
|
|
8
|
+
* Part of the Nightly-Learner Phase 1 implementation.
|
|
9
|
+
*
|
|
10
|
+
* @version 1.0.0
|
|
11
|
+
* @module src/learning/scheduler/TimeBasedTrigger
|
|
12
|
+
*/
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.TimeBasedTrigger = void 0;
|
|
15
|
+
const events_1 = require("events");
|
|
16
|
+
const Logger_1 = require("../../utils/Logger");
|
|
17
|
+
/**
|
|
18
|
+
* TimeBasedTrigger provides cron-like scheduling
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```typescript
|
|
22
|
+
* const trigger = new TimeBasedTrigger({
|
|
23
|
+
* hour: 2,
|
|
24
|
+
* minute: 30,
|
|
25
|
+
* daysOfWeek: [1, 2, 3, 4, 5], // Weekdays only
|
|
26
|
+
* });
|
|
27
|
+
*
|
|
28
|
+
* trigger.on('trigger', () => {
|
|
29
|
+
* console.log('Time to learn!');
|
|
30
|
+
* });
|
|
31
|
+
*
|
|
32
|
+
* trigger.start();
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
class TimeBasedTrigger extends events_1.EventEmitter {
|
|
36
|
+
constructor(config) {
|
|
37
|
+
super();
|
|
38
|
+
this.timer = null;
|
|
39
|
+
this.isRunning = false;
|
|
40
|
+
this.triggerHistory = [];
|
|
41
|
+
this.skipNextTrigger = false;
|
|
42
|
+
this.logger = Logger_1.Logger.getInstance();
|
|
43
|
+
this.config = {
|
|
44
|
+
hour: config.hour,
|
|
45
|
+
minute: config.minute ?? 0,
|
|
46
|
+
daysOfWeek: config.daysOfWeek ?? [0, 1, 2, 3, 4, 5, 6],
|
|
47
|
+
timezoneOffset: config.timezoneOffset ?? 0,
|
|
48
|
+
debug: config.debug ?? false,
|
|
49
|
+
};
|
|
50
|
+
// Validate config
|
|
51
|
+
if (this.config.hour < 0 || this.config.hour > 23) {
|
|
52
|
+
throw new Error('Hour must be between 0 and 23');
|
|
53
|
+
}
|
|
54
|
+
if (this.config.minute < 0 || this.config.minute > 59) {
|
|
55
|
+
throw new Error('Minute must be between 0 and 59');
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Start the time-based trigger
|
|
60
|
+
*/
|
|
61
|
+
start() {
|
|
62
|
+
if (this.isRunning) {
|
|
63
|
+
this.logger.warn('[TimeBasedTrigger] Already running');
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
this.isRunning = true;
|
|
67
|
+
this.scheduleNextTrigger();
|
|
68
|
+
this.logger.info('[TimeBasedTrigger] Started', {
|
|
69
|
+
hour: this.config.hour,
|
|
70
|
+
minute: this.config.minute,
|
|
71
|
+
daysOfWeek: this.config.daysOfWeek,
|
|
72
|
+
nextTrigger: this.getNextTriggerTime()?.toISOString(),
|
|
73
|
+
});
|
|
74
|
+
this.emit('started');
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Stop the time-based trigger
|
|
78
|
+
*/
|
|
79
|
+
stop() {
|
|
80
|
+
if (!this.isRunning)
|
|
81
|
+
return;
|
|
82
|
+
this.isRunning = false;
|
|
83
|
+
if (this.timer) {
|
|
84
|
+
clearTimeout(this.timer);
|
|
85
|
+
this.timer = null;
|
|
86
|
+
}
|
|
87
|
+
this.logger.info('[TimeBasedTrigger] Stopped');
|
|
88
|
+
this.emit('stopped');
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Skip the next scheduled trigger
|
|
92
|
+
*/
|
|
93
|
+
skipNext(reason) {
|
|
94
|
+
this.skipNextTrigger = true;
|
|
95
|
+
this.logger.info('[TimeBasedTrigger] Next trigger will be skipped', { reason });
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Get the next scheduled trigger time
|
|
99
|
+
*/
|
|
100
|
+
getNextTriggerTime() {
|
|
101
|
+
if (!this.isRunning)
|
|
102
|
+
return null;
|
|
103
|
+
const now = new Date();
|
|
104
|
+
const next = new Date(now);
|
|
105
|
+
// Set to configured time
|
|
106
|
+
next.setHours(this.config.hour, this.config.minute, 0, 0);
|
|
107
|
+
// Adjust for timezone
|
|
108
|
+
next.setTime(next.getTime() - this.config.timezoneOffset * 60 * 60 * 1000);
|
|
109
|
+
// If time has passed today, move to tomorrow
|
|
110
|
+
if (next <= now) {
|
|
111
|
+
next.setDate(next.getDate() + 1);
|
|
112
|
+
}
|
|
113
|
+
// Find next valid day of week
|
|
114
|
+
while (!this.config.daysOfWeek.includes(next.getDay())) {
|
|
115
|
+
next.setDate(next.getDate() + 1);
|
|
116
|
+
}
|
|
117
|
+
return next;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Get time until next trigger in milliseconds
|
|
121
|
+
*/
|
|
122
|
+
getTimeUntilNextTrigger() {
|
|
123
|
+
const next = this.getNextTriggerTime();
|
|
124
|
+
if (!next)
|
|
125
|
+
return null;
|
|
126
|
+
return Math.max(0, next.getTime() - Date.now());
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Get trigger history
|
|
130
|
+
*/
|
|
131
|
+
getHistory(limit = 10) {
|
|
132
|
+
return this.triggerHistory.slice(-limit);
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Check if a specific day is enabled
|
|
136
|
+
*/
|
|
137
|
+
isDayEnabled(day) {
|
|
138
|
+
return this.config.daysOfWeek.includes(day);
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Update configuration (requires restart)
|
|
142
|
+
*/
|
|
143
|
+
updateConfig(config) {
|
|
144
|
+
const wasRunning = this.isRunning;
|
|
145
|
+
if (wasRunning) {
|
|
146
|
+
this.stop();
|
|
147
|
+
}
|
|
148
|
+
this.config = {
|
|
149
|
+
...this.config,
|
|
150
|
+
...config,
|
|
151
|
+
};
|
|
152
|
+
if (wasRunning) {
|
|
153
|
+
this.start();
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Schedule the next trigger
|
|
158
|
+
*/
|
|
159
|
+
scheduleNextTrigger() {
|
|
160
|
+
const nextTime = this.getNextTriggerTime();
|
|
161
|
+
if (!nextTime)
|
|
162
|
+
return;
|
|
163
|
+
const delay = nextTime.getTime() - Date.now();
|
|
164
|
+
if (this.config.debug) {
|
|
165
|
+
this.logger.debug('[TimeBasedTrigger] Scheduling next trigger', {
|
|
166
|
+
nextTime: nextTime.toISOString(),
|
|
167
|
+
delayMs: delay,
|
|
168
|
+
delayHours: (delay / 1000 / 60 / 60).toFixed(2),
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
this.timer = setTimeout(() => this.handleTrigger(nextTime), delay);
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Handle a trigger event
|
|
175
|
+
*/
|
|
176
|
+
handleTrigger(scheduledTime) {
|
|
177
|
+
if (!this.isRunning)
|
|
178
|
+
return;
|
|
179
|
+
const event = {
|
|
180
|
+
timestamp: new Date(),
|
|
181
|
+
scheduledTime,
|
|
182
|
+
dayOfWeek: new Date().getDay(),
|
|
183
|
+
triggered: false,
|
|
184
|
+
};
|
|
185
|
+
// Check if we should skip this trigger
|
|
186
|
+
if (this.skipNextTrigger) {
|
|
187
|
+
event.skipped = 'Manual skip requested';
|
|
188
|
+
this.skipNextTrigger = false;
|
|
189
|
+
this.logger.info('[TimeBasedTrigger] Trigger skipped', { reason: event.skipped });
|
|
190
|
+
}
|
|
191
|
+
else if (!this.config.daysOfWeek.includes(event.dayOfWeek)) {
|
|
192
|
+
event.skipped = `Day ${event.dayOfWeek} not in schedule`;
|
|
193
|
+
}
|
|
194
|
+
else {
|
|
195
|
+
event.triggered = true;
|
|
196
|
+
this.logger.info('[TimeBasedTrigger] Triggering');
|
|
197
|
+
this.emit('trigger', event);
|
|
198
|
+
}
|
|
199
|
+
this.triggerHistory.push(event);
|
|
200
|
+
// Keep history limited
|
|
201
|
+
if (this.triggerHistory.length > 100) {
|
|
202
|
+
this.triggerHistory = this.triggerHistory.slice(-50);
|
|
203
|
+
}
|
|
204
|
+
// Schedule next trigger
|
|
205
|
+
this.scheduleNextTrigger();
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Get configuration
|
|
209
|
+
*/
|
|
210
|
+
getConfig() {
|
|
211
|
+
return { ...this.config };
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Check if trigger is running
|
|
215
|
+
*/
|
|
216
|
+
getIsRunning() {
|
|
217
|
+
return this.isRunning;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
exports.TimeBasedTrigger = TimeBasedTrigger;
|
|
221
|
+
exports.default = TimeBasedTrigger;
|
|
222
|
+
//# sourceMappingURL=TimeBasedTrigger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TimeBasedTrigger.js","sourceRoot":"","sources":["../../../src/learning/scheduler/TimeBasedTrigger.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;;AAEH,mCAAsC;AACtC,+CAA4C;AAuB5C;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAa,gBAAiB,SAAQ,qBAAY;IAQhD,YAAY,MAA8B;QACxC,KAAK,EAAE,CAAC;QANF,UAAK,GAA0B,IAAI,CAAC;QACpC,cAAS,GAAY,KAAK,CAAC;QAC3B,mBAAc,GAAmB,EAAE,CAAC;QACpC,oBAAe,GAAY,KAAK,CAAC;QAIvC,IAAI,CAAC,MAAM,GAAG,eAAM,CAAC,WAAW,EAAE,CAAC;QAEnC,IAAI,CAAC,MAAM,GAAG;YACZ,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,CAAC;YAC1B,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YACtD,cAAc,EAAE,MAAM,CAAC,cAAc,IAAI,CAAC;YAC1C,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,KAAK;SAC7B,CAAC;QAEF,kBAAkB;QAClB,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC;YAClD,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;QACnD,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;YACtD,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;YACvD,OAAO;QACT,CAAC;QAED,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAE3B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,4BAA4B,EAAE;YAC7C,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;YACtB,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;YAC1B,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU;YAClC,WAAW,EAAE,IAAI,CAAC,kBAAkB,EAAE,EAAE,WAAW,EAAE;SACtD,CAAC,CAAC;QAEH,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,IAAI;QACF,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE,OAAO;QAE5B,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QAEvB,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACzB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QACpB,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;QAC/C,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,MAAe;QACtB,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC5B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,iDAAiD,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IAClF,CAAC;IAED;;OAEG;IACH,kBAAkB;QAChB,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE,OAAO,IAAI,CAAC;QAEjC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC;QAE3B,yBAAyB;QACzB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAE1D,sBAAsB;QACtB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,cAAc,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QAE3E,6CAA6C;QAC7C,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC;YAChB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;QACnC,CAAC;QAED,8BAA8B;QAC9B,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;YACvD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;QACnC,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,uBAAuB;QACrB,MAAM,IAAI,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACvC,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC;QACvB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAClD,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,QAAgB,EAAE;QAC3B,OAAO,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC;IAC3C,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,GAAW;QACtB,OAAO,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC9C,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,MAAuC;QAClD,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC;QAElC,IAAI,UAAU,EAAE,CAAC;YACf,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,CAAC;QAED,IAAI,CAAC,MAAM,GAAG;YACZ,GAAG,IAAI,CAAC,MAAM;YACd,GAAG,MAAM;SACV,CAAC;QAEF,IAAI,UAAU,EAAE,CAAC;YACf,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,CAAC;IACH,CAAC;IAED;;OAEG;IACK,mBAAmB;QACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC3C,IAAI,CAAC,QAAQ;YAAE,OAAO;QAEtB,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE9C,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YACtB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,4CAA4C,EAAE;gBAC9D,QAAQ,EAAE,QAAQ,CAAC,WAAW,EAAE;gBAChC,OAAO,EAAE,KAAK;gBACd,UAAU,EAAE,CAAC,KAAK,GAAG,IAAI,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;aAChD,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,CAAC;IACrE,CAAC;IAED;;OAEG;IACK,aAAa,CAAC,aAAmB;QACvC,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE,OAAO;QAE5B,MAAM,KAAK,GAAiB;YAC1B,SAAS,EAAE,IAAI,IAAI,EAAE;YACrB,aAAa;YACb,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,MAAM,EAAE;YAC9B,SAAS,EAAE,KAAK;SACjB,CAAC;QAEF,uCAAuC;QACvC,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,KAAK,CAAC,OAAO,GAAG,uBAAuB,CAAC;YACxC,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;YAC7B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,oCAAoC,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACpF,CAAC;aAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7D,KAAK,CAAC,OAAO,GAAG,OAAO,KAAK,CAAC,SAAS,kBAAkB,CAAC;QAC3D,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC;YACvB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;YAClD,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAC9B,CAAC;QAED,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAEhC,uBAAuB;QACvB,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;YACrC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;QACvD,CAAC;QAED,wBAAwB;QACxB,IAAI,CAAC,mBAAmB,EAAE,CAAC;IAC7B,CAAC;IAED;;OAEG;IACH,SAAS;QACP,OAAO,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,YAAY;QACV,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;CACF;AAzND,4CAyNC;AAED,kBAAe,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Learning Scheduler Module
|
|
3
|
+
*
|
|
4
|
+
* Provides scheduling infrastructure for the Nightly-Learner system:
|
|
5
|
+
* - IdleDetector: Monitor system idle state
|
|
6
|
+
* - SleepScheduler: Orchestrate learning cycles
|
|
7
|
+
* - SleepCycle: Execute learning phases
|
|
8
|
+
* - TimeBasedTrigger: Cron-like fallback scheduling
|
|
9
|
+
*
|
|
10
|
+
* @module src/learning/scheduler
|
|
11
|
+
*/
|
|
12
|
+
export { IdleDetector, IdleDetectorConfig, IdleState } from './IdleDetector';
|
|
13
|
+
export { SleepScheduler, SleepSchedulerConfig, SleepSchedulerState, LearningBudget, ScheduleConfig, } from './SleepScheduler';
|
|
14
|
+
export { SleepCycle, SleepCycleConfig, SleepPhase, PhaseResult, CycleSummary, } from './SleepCycle';
|
|
15
|
+
export { TimeBasedTrigger, TimeBasedTriggerConfig, TriggerEvent, } from './TimeBasedTrigger';
|
|
16
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/learning/scheduler/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC7E,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,mBAAmB,EACnB,cAAc,EACd,cAAc,GACf,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,UAAU,EACV,gBAAgB,EAChB,UAAU,EACV,WAAW,EACX,YAAY,GACb,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,gBAAgB,EAChB,sBAAsB,EACtB,YAAY,GACb,MAAM,oBAAoB,CAAC"}
|