@sharpee/engine 0.9.60-beta
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/LICENSE +21 -0
- package/README.md +328 -0
- package/dist/action-context-factory.d.ts +11 -0
- package/dist/action-context-factory.d.ts.map +1 -0
- package/dist/action-context-factory.js +258 -0
- package/dist/action-context-factory.js.map +1 -0
- package/dist/capability-dispatch-helper.d.ts +106 -0
- package/dist/capability-dispatch-helper.d.ts.map +1 -0
- package/dist/capability-dispatch-helper.js +269 -0
- package/dist/capability-dispatch-helper.js.map +1 -0
- package/dist/command-executor.d.ts +53 -0
- package/dist/command-executor.d.ts.map +1 -0
- package/dist/command-executor.js +329 -0
- package/dist/command-executor.js.map +1 -0
- package/dist/event-adapter.d.ts +44 -0
- package/dist/event-adapter.d.ts.map +1 -0
- package/dist/event-adapter.js +127 -0
- package/dist/event-adapter.js.map +1 -0
- package/dist/event-sequencer.d.ts +73 -0
- package/dist/event-sequencer.d.ts.map +1 -0
- package/dist/event-sequencer.js +134 -0
- package/dist/event-sequencer.js.map +1 -0
- package/dist/events/event-emitter.d.ts +34 -0
- package/dist/events/event-emitter.d.ts.map +1 -0
- package/dist/events/event-emitter.js +67 -0
- package/dist/events/event-emitter.js.map +1 -0
- package/dist/game-engine.d.ts +292 -0
- package/dist/game-engine.d.ts.map +1 -0
- package/dist/game-engine.js +1631 -0
- package/dist/game-engine.js.map +1 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +62 -0
- package/dist/index.js.map +1 -0
- package/dist/narrative/index.d.ts +5 -0
- package/dist/narrative/index.d.ts.map +1 -0
- package/dist/narrative/index.js +10 -0
- package/dist/narrative/index.js.map +1 -0
- package/dist/narrative/narrative-settings.d.ts +73 -0
- package/dist/narrative/narrative-settings.d.ts.map +1 -0
- package/dist/narrative/narrative-settings.js +28 -0
- package/dist/narrative/narrative-settings.js.map +1 -0
- package/dist/parser-interface.d.ts +77 -0
- package/dist/parser-interface.d.ts.map +1 -0
- package/dist/parser-interface.js +48 -0
- package/dist/parser-interface.js.map +1 -0
- package/dist/platform-operations.d.ts +83 -0
- package/dist/platform-operations.d.ts.map +1 -0
- package/dist/platform-operations.js +218 -0
- package/dist/platform-operations.js.map +1 -0
- package/dist/save-restore-service.d.ts +133 -0
- package/dist/save-restore-service.d.ts.map +1 -0
- package/dist/save-restore-service.js +446 -0
- package/dist/save-restore-service.js.map +1 -0
- package/dist/scheduler/index.d.ts +9 -0
- package/dist/scheduler/index.d.ts.map +1 -0
- package/dist/scheduler/index.js +25 -0
- package/dist/scheduler/index.js.map +1 -0
- package/dist/scheduler/scheduler-service.d.ts +75 -0
- package/dist/scheduler/scheduler-service.d.ts.map +1 -0
- package/dist/scheduler/scheduler-service.js +310 -0
- package/dist/scheduler/scheduler-service.js.map +1 -0
- package/dist/scheduler/seeded-random.d.ts +7 -0
- package/dist/scheduler/seeded-random.d.ts.map +1 -0
- package/dist/scheduler/seeded-random.js +11 -0
- package/dist/scheduler/seeded-random.js.map +1 -0
- package/dist/scheduler/types.d.ts +134 -0
- package/dist/scheduler/types.d.ts.map +1 -0
- package/dist/scheduler/types.js +9 -0
- package/dist/scheduler/types.js.map +1 -0
- package/dist/shared-data-keys.d.ts +53 -0
- package/dist/shared-data-keys.d.ts.map +1 -0
- package/dist/shared-data-keys.js +29 -0
- package/dist/shared-data-keys.js.map +1 -0
- package/dist/story.d.ts +211 -0
- package/dist/story.d.ts.map +1 -0
- package/dist/story.js +60 -0
- package/dist/story.js.map +1 -0
- package/dist/test-helpers/mock-text-service.d.ts +11 -0
- package/dist/test-helpers/mock-text-service.d.ts.map +1 -0
- package/dist/test-helpers/mock-text-service.js +47 -0
- package/dist/test-helpers/mock-text-service.js.map +1 -0
- package/dist/turn-event-processor.d.ts +89 -0
- package/dist/turn-event-processor.d.ts.map +1 -0
- package/dist/turn-event-processor.js +144 -0
- package/dist/turn-event-processor.js.map +1 -0
- package/dist/types.d.ts +214 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +8 -0
- package/dist/types.js.map +1 -0
- package/dist/vocabulary-manager.d.ts +35 -0
- package/dist/vocabulary-manager.d.ts.map +1 -0
- package/dist/vocabulary-manager.js +74 -0
- package/dist/vocabulary-manager.js.map +1 -0
- package/package.json +70 -0
|
@@ -0,0 +1,310 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* SchedulerService - Manages Daemons and Fuses (ADR-071)
|
|
4
|
+
*
|
|
5
|
+
* The scheduler runs during the turn cycle, after NPCs act:
|
|
6
|
+
* 1. Player action
|
|
7
|
+
* 2. NPC turns
|
|
8
|
+
* 3. Scheduler tick (daemons run, fuses count down)
|
|
9
|
+
* 4. Turn complete
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.SchedulerService = void 0;
|
|
13
|
+
exports.createSchedulerService = createSchedulerService;
|
|
14
|
+
const seeded_random_1 = require("./seeded-random");
|
|
15
|
+
/**
|
|
16
|
+
* Create a unique event ID
|
|
17
|
+
*/
|
|
18
|
+
function createEventId(prefix) {
|
|
19
|
+
return `${prefix}_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* SchedulerService implementation
|
|
23
|
+
*/
|
|
24
|
+
class SchedulerService {
|
|
25
|
+
daemons = new Map();
|
|
26
|
+
daemonStates = new Map();
|
|
27
|
+
fuses = new Map();
|
|
28
|
+
fuseStates = new Map();
|
|
29
|
+
random;
|
|
30
|
+
currentTurn = 0;
|
|
31
|
+
constructor(seed) {
|
|
32
|
+
this.random = (0, seeded_random_1.createSeededRandom)(seed);
|
|
33
|
+
}
|
|
34
|
+
// ==================== Daemon Management ====================
|
|
35
|
+
registerDaemon(daemon) {
|
|
36
|
+
if (this.daemons.has(daemon.id)) {
|
|
37
|
+
throw new Error(`Daemon with id "${daemon.id}" already exists`);
|
|
38
|
+
}
|
|
39
|
+
this.daemons.set(daemon.id, daemon);
|
|
40
|
+
this.daemonStates.set(daemon.id, {
|
|
41
|
+
id: daemon.id,
|
|
42
|
+
isPaused: false,
|
|
43
|
+
runCount: 0,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
removeDaemon(id) {
|
|
47
|
+
this.daemons.delete(id);
|
|
48
|
+
this.daemonStates.delete(id);
|
|
49
|
+
}
|
|
50
|
+
pauseDaemon(id) {
|
|
51
|
+
const state = this.daemonStates.get(id);
|
|
52
|
+
if (state) {
|
|
53
|
+
state.isPaused = true;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
resumeDaemon(id) {
|
|
57
|
+
const state = this.daemonStates.get(id);
|
|
58
|
+
if (state) {
|
|
59
|
+
state.isPaused = false;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
hasDaemon(id) {
|
|
63
|
+
return this.daemons.has(id);
|
|
64
|
+
}
|
|
65
|
+
// ==================== Fuse Management ====================
|
|
66
|
+
setFuse(fuse) {
|
|
67
|
+
// Store original turns for repeating fuses
|
|
68
|
+
const fuseWithOriginal = {
|
|
69
|
+
...fuse,
|
|
70
|
+
originalTurns: fuse.originalTurns ?? fuse.turns,
|
|
71
|
+
};
|
|
72
|
+
this.fuses.set(fuse.id, fuseWithOriginal);
|
|
73
|
+
this.fuseStates.set(fuse.id, {
|
|
74
|
+
id: fuse.id,
|
|
75
|
+
turnsRemaining: fuse.turns,
|
|
76
|
+
isPaused: false,
|
|
77
|
+
entityId: fuse.entityId,
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
cancelFuse(id) {
|
|
81
|
+
const fuse = this.fuses.get(id);
|
|
82
|
+
const state = this.fuseStates.get(id);
|
|
83
|
+
if (!fuse || !state) {
|
|
84
|
+
return [];
|
|
85
|
+
}
|
|
86
|
+
// Call onCancel if defined
|
|
87
|
+
let events = [];
|
|
88
|
+
if (fuse.onCancel) {
|
|
89
|
+
const context = this.createContext(undefined, this.currentTurn, '');
|
|
90
|
+
try {
|
|
91
|
+
events = fuse.onCancel(context);
|
|
92
|
+
}
|
|
93
|
+
catch (error) {
|
|
94
|
+
console.error(`Error in fuse "${id}" onCancel:`, error);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
this.fuses.delete(id);
|
|
98
|
+
this.fuseStates.delete(id);
|
|
99
|
+
return events;
|
|
100
|
+
}
|
|
101
|
+
getFuseRemaining(id) {
|
|
102
|
+
return this.fuseStates.get(id)?.turnsRemaining;
|
|
103
|
+
}
|
|
104
|
+
adjustFuse(id, delta) {
|
|
105
|
+
const state = this.fuseStates.get(id);
|
|
106
|
+
if (state) {
|
|
107
|
+
state.turnsRemaining = Math.max(0, state.turnsRemaining + delta);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
pauseFuse(id) {
|
|
111
|
+
const state = this.fuseStates.get(id);
|
|
112
|
+
if (state) {
|
|
113
|
+
state.isPaused = true;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
resumeFuse(id) {
|
|
117
|
+
const state = this.fuseStates.get(id);
|
|
118
|
+
if (state) {
|
|
119
|
+
state.isPaused = false;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
hasFuse(id) {
|
|
123
|
+
return this.fuses.has(id);
|
|
124
|
+
}
|
|
125
|
+
// ==================== Tick (Main Loop) ====================
|
|
126
|
+
tick(world, turn, playerId) {
|
|
127
|
+
this.currentTurn = turn;
|
|
128
|
+
const events = [];
|
|
129
|
+
const fusesTriggered = [];
|
|
130
|
+
const daemonsRun = [];
|
|
131
|
+
// Get player location
|
|
132
|
+
const playerLocation = world.getLocation(playerId) || '';
|
|
133
|
+
// Create context
|
|
134
|
+
const context = this.createContext(world, turn, playerLocation, playerId);
|
|
135
|
+
// 1. Run daemons (sorted by priority, highest first)
|
|
136
|
+
const sortedDaemons = this.getSortedDaemons();
|
|
137
|
+
for (const daemon of sortedDaemons) {
|
|
138
|
+
const state = this.daemonStates.get(daemon.id);
|
|
139
|
+
if (!state || state.isPaused)
|
|
140
|
+
continue;
|
|
141
|
+
// Check condition
|
|
142
|
+
if (daemon.condition && !daemon.condition(context)) {
|
|
143
|
+
continue;
|
|
144
|
+
}
|
|
145
|
+
// Run the daemon
|
|
146
|
+
try {
|
|
147
|
+
const daemonEvents = daemon.run(context);
|
|
148
|
+
if (daemonEvents.length > 0) {
|
|
149
|
+
events.push(...daemonEvents);
|
|
150
|
+
daemonsRun.push(daemon.id);
|
|
151
|
+
state.runCount++;
|
|
152
|
+
// Remove if runOnce and produced events
|
|
153
|
+
if (daemon.runOnce) {
|
|
154
|
+
this.removeDaemon(daemon.id);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
catch (error) {
|
|
159
|
+
console.error(`Error running daemon "${daemon.id}":`, error);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
// 2. Process fuses
|
|
163
|
+
const fusesToRemove = [];
|
|
164
|
+
const sortedFuses = this.getSortedFuses();
|
|
165
|
+
for (const fuse of sortedFuses) {
|
|
166
|
+
const state = this.fuseStates.get(fuse.id);
|
|
167
|
+
if (!state || state.isPaused)
|
|
168
|
+
continue;
|
|
169
|
+
// Check tick condition
|
|
170
|
+
if (fuse.tickCondition && !fuse.tickCondition(context)) {
|
|
171
|
+
continue;
|
|
172
|
+
}
|
|
173
|
+
// Decrement turns
|
|
174
|
+
state.turnsRemaining--;
|
|
175
|
+
// Check if triggered
|
|
176
|
+
if (state.turnsRemaining <= 0) {
|
|
177
|
+
try {
|
|
178
|
+
const fuseEvents = fuse.trigger(context);
|
|
179
|
+
events.push(...fuseEvents);
|
|
180
|
+
fusesTriggered.push(fuse.id);
|
|
181
|
+
if (fuse.repeat && fuse.originalTurns) {
|
|
182
|
+
// Reset for repeat
|
|
183
|
+
state.turnsRemaining = fuse.originalTurns;
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
// Mark for removal
|
|
187
|
+
fusesToRemove.push(fuse.id);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
catch (error) {
|
|
191
|
+
console.error(`Error triggering fuse "${fuse.id}":`, error);
|
|
192
|
+
fusesToRemove.push(fuse.id);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
// Remove triggered fuses
|
|
197
|
+
for (const id of fusesToRemove) {
|
|
198
|
+
this.fuses.delete(id);
|
|
199
|
+
this.fuseStates.delete(id);
|
|
200
|
+
}
|
|
201
|
+
return { events, fusesTriggered, daemonsRun };
|
|
202
|
+
}
|
|
203
|
+
// ==================== Introspection ====================
|
|
204
|
+
getActiveDaemons() {
|
|
205
|
+
const infos = [];
|
|
206
|
+
for (const [id, daemon] of this.daemons) {
|
|
207
|
+
const state = this.daemonStates.get(id);
|
|
208
|
+
if (!state)
|
|
209
|
+
continue;
|
|
210
|
+
infos.push({
|
|
211
|
+
id: daemon.id,
|
|
212
|
+
name: daemon.name,
|
|
213
|
+
isPaused: state.isPaused,
|
|
214
|
+
runCount: state.runCount,
|
|
215
|
+
priority: daemon.priority ?? 0,
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
return infos.sort((a, b) => b.priority - a.priority);
|
|
219
|
+
}
|
|
220
|
+
getActiveFuses() {
|
|
221
|
+
const infos = [];
|
|
222
|
+
for (const [id, fuse] of this.fuses) {
|
|
223
|
+
const state = this.fuseStates.get(id);
|
|
224
|
+
if (!state)
|
|
225
|
+
continue;
|
|
226
|
+
infos.push({
|
|
227
|
+
id: fuse.id,
|
|
228
|
+
name: fuse.name,
|
|
229
|
+
turnsRemaining: state.turnsRemaining,
|
|
230
|
+
isPaused: state.isPaused,
|
|
231
|
+
entityId: state.entityId,
|
|
232
|
+
priority: fuse.priority ?? 0,
|
|
233
|
+
repeat: fuse.repeat ?? false,
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
return infos.sort((a, b) => b.priority - a.priority);
|
|
237
|
+
}
|
|
238
|
+
// ==================== Serialization ====================
|
|
239
|
+
getState() {
|
|
240
|
+
const daemons = [];
|
|
241
|
+
const fuses = [];
|
|
242
|
+
for (const state of this.daemonStates.values()) {
|
|
243
|
+
daemons.push({ ...state });
|
|
244
|
+
}
|
|
245
|
+
for (const state of this.fuseStates.values()) {
|
|
246
|
+
fuses.push({ ...state });
|
|
247
|
+
}
|
|
248
|
+
return {
|
|
249
|
+
turn: this.currentTurn,
|
|
250
|
+
daemons,
|
|
251
|
+
fuses,
|
|
252
|
+
randomSeed: this.random.getSeed(),
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
setState(state) {
|
|
256
|
+
this.currentTurn = state.turn;
|
|
257
|
+
this.random.setSeed(state.randomSeed);
|
|
258
|
+
// Restore daemon states (daemons must be re-registered at game start)
|
|
259
|
+
for (const daemonState of state.daemons) {
|
|
260
|
+
if (this.daemons.has(daemonState.id)) {
|
|
261
|
+
this.daemonStates.set(daemonState.id, { ...daemonState });
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
// Restore fuse states (fuses must be re-registered at game start)
|
|
265
|
+
for (const fuseState of state.fuses) {
|
|
266
|
+
if (this.fuses.has(fuseState.id)) {
|
|
267
|
+
this.fuseStates.set(fuseState.id, { ...fuseState });
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
// ==================== Entity Cleanup ====================
|
|
272
|
+
cleanupEntity(entityId) {
|
|
273
|
+
const events = [];
|
|
274
|
+
// Cancel any fuses bound to this entity
|
|
275
|
+
for (const [id, state] of this.fuseStates) {
|
|
276
|
+
if (state.entityId === entityId) {
|
|
277
|
+
events.push(...this.cancelFuse(id));
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
return events;
|
|
281
|
+
}
|
|
282
|
+
// ==================== Random Access ====================
|
|
283
|
+
getRandom() {
|
|
284
|
+
return this.random;
|
|
285
|
+
}
|
|
286
|
+
// ==================== Private Helpers ====================
|
|
287
|
+
createContext(world, turn, playerLocation, playerId) {
|
|
288
|
+
return {
|
|
289
|
+
world,
|
|
290
|
+
turn,
|
|
291
|
+
random: this.random,
|
|
292
|
+
playerLocation,
|
|
293
|
+
playerId: playerId || '',
|
|
294
|
+
};
|
|
295
|
+
}
|
|
296
|
+
getSortedDaemons() {
|
|
297
|
+
return Array.from(this.daemons.values()).sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0));
|
|
298
|
+
}
|
|
299
|
+
getSortedFuses() {
|
|
300
|
+
return Array.from(this.fuses.values()).sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0));
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
exports.SchedulerService = SchedulerService;
|
|
304
|
+
/**
|
|
305
|
+
* Create a new SchedulerService instance
|
|
306
|
+
*/
|
|
307
|
+
function createSchedulerService(seed) {
|
|
308
|
+
return new SchedulerService(seed);
|
|
309
|
+
}
|
|
310
|
+
//# sourceMappingURL=scheduler-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scheduler-service.js","sourceRoot":"","sources":["../../src/scheduler/scheduler-service.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;AA+ZH,wDAEC;AAjZD,mDAAqD;AAwCrD;;GAEG;AACH,SAAS,aAAa,CAAC,MAAc;IACnC,OAAO,GAAG,MAAM,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;AAC9E,CAAC;AAED;;GAEG;AACH,MAAa,gBAAgB;IACnB,OAAO,GAAwB,IAAI,GAAG,EAAE,CAAC;IACzC,YAAY,GAA6B,IAAI,GAAG,EAAE,CAAC;IACnD,KAAK,GAAsB,IAAI,GAAG,EAAE,CAAC;IACrC,UAAU,GAA2B,IAAI,GAAG,EAAE,CAAC;IAC/C,MAAM,CAAe;IACrB,WAAW,GAAW,CAAC,CAAC;IAEhC,YAAY,IAAa;QACvB,IAAI,CAAC,MAAM,GAAG,IAAA,kCAAkB,EAAC,IAAI,CAAC,CAAC;IACzC,CAAC;IAED,8DAA8D;IAE9D,cAAc,CAAC,MAAc;QAC3B,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CAAC,mBAAmB,MAAM,CAAC,EAAE,kBAAkB,CAAC,CAAC;QAClE,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QACpC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE;YAC/B,EAAE,EAAE,MAAM,CAAC,EAAE;YACb,QAAQ,EAAE,KAAK;YACf,QAAQ,EAAE,CAAC;SACZ,CAAC,CAAC;IACL,CAAC;IAED,YAAY,CAAC,EAAU;QACrB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACxB,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC/B,CAAC;IAED,WAAW,CAAC,EAAU;QACpB,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACxC,IAAI,KAAK,EAAE,CAAC;YACV,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC;QACxB,CAAC;IACH,CAAC;IAED,YAAY,CAAC,EAAU;QACrB,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACxC,IAAI,KAAK,EAAE,CAAC;YACV,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC;QACzB,CAAC;IACH,CAAC;IAED,SAAS,CAAC,EAAU;QAClB,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC9B,CAAC;IAED,4DAA4D;IAE5D,OAAO,CAAC,IAAU;QAChB,2CAA2C;QAC3C,MAAM,gBAAgB,GAAS;YAC7B,GAAG,IAAI;YACP,aAAa,EAAE,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,KAAK;SAChD,CAAC;QAEF,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,gBAAgB,CAAC,CAAC;QAC1C,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE;YAC3B,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,cAAc,EAAE,IAAI,CAAC,KAAK;YAC1B,QAAQ,EAAE,KAAK;YACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACxB,CAAC,CAAC;IACL,CAAC;IAED,UAAU,CAAC,EAAU;QACnB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChC,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAEtC,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACpB,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,2BAA2B;QAC3B,IAAI,MAAM,GAAqB,EAAE,CAAC;QAClC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,SAAgB,EAAE,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;YAC3E,IAAI,CAAC;gBACH,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAClC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,kBAAkB,EAAE,aAAa,EAAE,KAAK,CAAC,CAAC;YAC1D,CAAC;QACH,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACtB,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAE3B,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,gBAAgB,CAAC,EAAU;QACzB,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,cAAc,CAAC;IACjD,CAAC;IAED,UAAU,CAAC,EAAU,EAAE,KAAa;QAClC,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACtC,IAAI,KAAK,EAAE,CAAC;YACV,KAAK,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,cAAc,GAAG,KAAK,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;IAED,SAAS,CAAC,EAAU;QAClB,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACtC,IAAI,KAAK,EAAE,CAAC;YACV,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC;QACxB,CAAC;IACH,CAAC;IAED,UAAU,CAAC,EAAU;QACnB,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACtC,IAAI,KAAK,EAAE,CAAC;YACV,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC;QACzB,CAAC;IACH,CAAC;IAED,OAAO,CAAC,EAAU;QAChB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC5B,CAAC;IAED,6DAA6D;IAE7D,IAAI,CAAC,KAAiB,EAAE,IAAY,EAAE,QAAkB;QACtD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QAExB,MAAM,MAAM,GAAqB,EAAE,CAAC;QACpC,MAAM,cAAc,GAAa,EAAE,CAAC;QACpC,MAAM,UAAU,GAAa,EAAE,CAAC;QAEhC,sBAAsB;QACtB,MAAM,cAAc,GAAG,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QAEzD,iBAAiB;QACjB,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC;QAE1E,qDAAqD;QACrD,MAAM,aAAa,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC9C,KAAK,MAAM,MAAM,IAAI,aAAa,EAAE,CAAC;YACnC,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC/C,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,QAAQ;gBAAE,SAAS;YAEvC,kBAAkB;YAClB,IAAI,MAAM,CAAC,SAAS,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;gBACnD,SAAS;YACX,CAAC;YAED,iBAAiB;YACjB,IAAI,CAAC;gBACH,MAAM,YAAY,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBACzC,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC5B,MAAM,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,CAAC;oBAC7B,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;oBAC3B,KAAK,CAAC,QAAQ,EAAE,CAAC;oBAEjB,wCAAwC;oBACxC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;wBACnB,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;oBAC/B,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,yBAAyB,MAAM,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;YAC/D,CAAC;QACH,CAAC;QAED,mBAAmB;QACnB,MAAM,aAAa,GAAa,EAAE,CAAC;QACnC,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QAE1C,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;YAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC3C,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,QAAQ;gBAAE,SAAS;YAEvC,uBAAuB;YACvB,IAAI,IAAI,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC;gBACvD,SAAS;YACX,CAAC;YAED,kBAAkB;YAClB,KAAK,CAAC,cAAc,EAAE,CAAC;YAEvB,qBAAqB;YACrB,IAAI,KAAK,CAAC,cAAc,IAAI,CAAC,EAAE,CAAC;gBAC9B,IAAI,CAAC;oBACH,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;oBACzC,MAAM,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,CAAC;oBAC3B,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBAE7B,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;wBACtC,mBAAmB;wBACnB,KAAK,CAAC,cAAc,GAAG,IAAI,CAAC,aAAa,CAAC;oBAC5C,CAAC;yBAAM,CAAC;wBACN,mBAAmB;wBACnB,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBAC9B,CAAC;gBACH,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,OAAO,CAAC,KAAK,CAAC,0BAA0B,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;oBAC5D,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAC9B,CAAC;YACH,CAAC;QACH,CAAC;QAED,yBAAyB;QACzB,KAAK,MAAM,EAAE,IAAI,aAAa,EAAE,CAAC;YAC/B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACtB,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC7B,CAAC;QAED,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,UAAU,EAAE,CAAC;IAChD,CAAC;IAED,0DAA0D;IAE1D,gBAAgB;QACd,MAAM,KAAK,GAAiB,EAAE,CAAC;QAE/B,KAAK,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACxC,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACxC,IAAI,CAAC,KAAK;gBAAE,SAAS;YAErB,KAAK,CAAC,IAAI,CAAC;gBACT,EAAE,EAAE,MAAM,CAAC,EAAE;gBACb,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,CAAC;aAC/B,CAAC,CAAC;QACL,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;IACvD,CAAC;IAED,cAAc;QACZ,MAAM,KAAK,GAAe,EAAE,CAAC;QAE7B,KAAK,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACpC,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACtC,IAAI,CAAC,KAAK;gBAAE,SAAS;YAErB,KAAK,CAAC,IAAI,CAAC;gBACT,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,cAAc,EAAE,KAAK,CAAC,cAAc;gBACpC,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,CAAC;gBAC5B,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,KAAK;aAC7B,CAAC,CAAC;QACL,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;IACvD,CAAC;IAED,0DAA0D;IAE1D,QAAQ;QACN,MAAM,OAAO,GAAkB,EAAE,CAAC;QAClC,MAAM,KAAK,GAAgB,EAAE,CAAC;QAE9B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,EAAE,CAAC;YAC/C,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;QAC7B,CAAC;QAED,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC;YAC7C,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;QAC3B,CAAC;QAED,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,WAAW;YACtB,OAAO;YACP,KAAK;YACL,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;SAClC,CAAC;IACJ,CAAC;IAED,QAAQ,CAAC,KAAqB;QAC5B,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC;QAC9B,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAEtC,sEAAsE;QACtE,KAAK,MAAM,WAAW,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YACxC,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC,EAAE,CAAC;gBACrC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,EAAE,EAAE,GAAG,WAAW,EAAE,CAAC,CAAC;YAC5D,CAAC;QACH,CAAC;QAED,kEAAkE;QAClE,KAAK,MAAM,SAAS,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YACpC,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC;gBACjC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,GAAG,SAAS,EAAE,CAAC,CAAC;YACtD,CAAC;QACH,CAAC;IACH,CAAC;IAED,2DAA2D;IAE3D,aAAa,CAAC,QAAkB;QAC9B,MAAM,MAAM,GAAqB,EAAE,CAAC;QAEpC,wCAAwC;QACxC,KAAK,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YAC1C,IAAI,KAAK,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBAChC,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;YACtC,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,0DAA0D;IAE1D,SAAS;QACP,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,4DAA4D;IAEpD,aAAa,CACnB,KAAiB,EACjB,IAAY,EACZ,cAAwB,EACxB,QAAmB;QAEnB,OAAO;YACL,KAAK;YACL,IAAI;YACJ,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,cAAc;YACd,QAAQ,EAAE,QAAQ,IAAI,EAAE;SACzB,CAAC;IACJ,CAAC;IAEO,gBAAgB;QACtB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAC3C,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,CAChD,CAAC;IACJ,CAAC;IAEO,cAAc;QACpB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CACzC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,CAChD,CAAC;IACJ,CAAC;CACF;AAxVD,4CAwVC;AAED;;GAEG;AACH,SAAgB,sBAAsB,CAAC,IAAa;IAClD,OAAO,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAC;AACpC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seeded-random.d.ts","sourceRoot":"","sources":["../../src/scheduler/seeded-random.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Seeded Random Number Generator
|
|
4
|
+
*
|
|
5
|
+
* Re-exports from @sharpee/core for convenience.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.createSeededRandom = void 0;
|
|
9
|
+
var core_1 = require("@sharpee/core");
|
|
10
|
+
Object.defineProperty(exports, "createSeededRandom", { enumerable: true, get: function () { return core_1.createSeededRandom; } });
|
|
11
|
+
//# sourceMappingURL=seeded-random.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seeded-random.js","sourceRoot":"","sources":["../../src/scheduler/seeded-random.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAEH,sCAAiE;AAAxD,0GAAA,kBAAkB,OAAA"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scheduler types for Daemons and Fuses (ADR-071)
|
|
3
|
+
*
|
|
4
|
+
* Daemons: Processes that run every turn
|
|
5
|
+
* Fuses: Countdown timers that trigger after N turns
|
|
6
|
+
*/
|
|
7
|
+
import { ISemanticEvent, EntityId, SeededRandom } from '@sharpee/core';
|
|
8
|
+
import { WorldModel } from '@sharpee/world-model';
|
|
9
|
+
export { SeededRandom } from '@sharpee/core';
|
|
10
|
+
/**
|
|
11
|
+
* Context passed to daemon and fuse handlers
|
|
12
|
+
*/
|
|
13
|
+
export interface SchedulerContext {
|
|
14
|
+
/** The world model */
|
|
15
|
+
world: WorldModel;
|
|
16
|
+
/** Current turn number */
|
|
17
|
+
turn: number;
|
|
18
|
+
/** Seeded random number generator */
|
|
19
|
+
random: SeededRandom;
|
|
20
|
+
/** Player's current location */
|
|
21
|
+
playerLocation: EntityId;
|
|
22
|
+
/** Player entity ID */
|
|
23
|
+
playerId: EntityId;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* A daemon is a function that runs every turn
|
|
27
|
+
*/
|
|
28
|
+
export interface Daemon {
|
|
29
|
+
/** Unique identifier */
|
|
30
|
+
id: string;
|
|
31
|
+
/** Human-readable name for debugging */
|
|
32
|
+
name: string;
|
|
33
|
+
/** Condition for running (optional - if omitted, always runs) */
|
|
34
|
+
condition?: (context: SchedulerContext) => boolean;
|
|
35
|
+
/** The daemon's action - returns semantic events */
|
|
36
|
+
run: (context: SchedulerContext) => ISemanticEvent[];
|
|
37
|
+
/** Priority for ordering (higher = runs first, default 0) */
|
|
38
|
+
priority?: number;
|
|
39
|
+
/** If true, daemon removes itself after first successful run */
|
|
40
|
+
runOnce?: boolean;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* A fuse is a countdown timer that triggers after N turns
|
|
44
|
+
*/
|
|
45
|
+
export interface Fuse {
|
|
46
|
+
/** Unique identifier */
|
|
47
|
+
id: string;
|
|
48
|
+
/** Human-readable name for debugging */
|
|
49
|
+
name: string;
|
|
50
|
+
/** Turns until trigger (counts down each tick) */
|
|
51
|
+
turns: number;
|
|
52
|
+
/** What happens when it triggers - returns semantic events */
|
|
53
|
+
trigger: (context: SchedulerContext) => ISemanticEvent[];
|
|
54
|
+
/** Optional: entity this fuse is bound to (for automatic cleanup) */
|
|
55
|
+
entityId?: EntityId;
|
|
56
|
+
/** Optional: condition for ticking (if false, turn doesn't count down) */
|
|
57
|
+
tickCondition?: (context: SchedulerContext) => boolean;
|
|
58
|
+
/** What happens if cancelled before triggering (cleanup) */
|
|
59
|
+
onCancel?: (context: SchedulerContext) => ISemanticEvent[];
|
|
60
|
+
/** Priority for ordering multiple simultaneous triggers */
|
|
61
|
+
priority?: number;
|
|
62
|
+
/** If true, fuse repeats after triggering */
|
|
63
|
+
repeat?: boolean;
|
|
64
|
+
/** Original turns value for repeating fuses */
|
|
65
|
+
originalTurns?: number;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Runtime state for a daemon
|
|
69
|
+
*/
|
|
70
|
+
export interface DaemonState {
|
|
71
|
+
id: string;
|
|
72
|
+
isPaused: boolean;
|
|
73
|
+
runCount: number;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Runtime state for a fuse
|
|
77
|
+
*/
|
|
78
|
+
export interface FuseState {
|
|
79
|
+
id: string;
|
|
80
|
+
turnsRemaining: number;
|
|
81
|
+
isPaused: boolean;
|
|
82
|
+
entityId?: EntityId;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Info about an active daemon (for debugging/introspection)
|
|
86
|
+
*/
|
|
87
|
+
export interface DaemonInfo {
|
|
88
|
+
id: string;
|
|
89
|
+
name: string;
|
|
90
|
+
isPaused: boolean;
|
|
91
|
+
runCount: number;
|
|
92
|
+
priority: number;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Info about an active fuse (for debugging/introspection)
|
|
96
|
+
*/
|
|
97
|
+
export interface FuseInfo {
|
|
98
|
+
id: string;
|
|
99
|
+
name: string;
|
|
100
|
+
turnsRemaining: number;
|
|
101
|
+
isPaused: boolean;
|
|
102
|
+
entityId?: EntityId;
|
|
103
|
+
priority: number;
|
|
104
|
+
repeat: boolean;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Result of a scheduler tick
|
|
108
|
+
*/
|
|
109
|
+
export interface SchedulerResult {
|
|
110
|
+
/** Events generated by daemons and fuses */
|
|
111
|
+
events: ISemanticEvent[];
|
|
112
|
+
/** IDs of fuses that triggered this tick */
|
|
113
|
+
fusesTriggered: string[];
|
|
114
|
+
/** IDs of daemons that ran this tick */
|
|
115
|
+
daemonsRun: string[];
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Serializable scheduler state for save/load
|
|
119
|
+
*/
|
|
120
|
+
export interface SchedulerState {
|
|
121
|
+
/** Current turn number */
|
|
122
|
+
turn: number;
|
|
123
|
+
/** Daemon states */
|
|
124
|
+
daemons: DaemonState[];
|
|
125
|
+
/** Fuse states */
|
|
126
|
+
fuses: FuseState[];
|
|
127
|
+
/** Random seed */
|
|
128
|
+
randomSeed: number;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Scheduler event types for lifecycle events
|
|
132
|
+
*/
|
|
133
|
+
export type SchedulerEventType = 'daemon.registered' | 'daemon.removed' | 'daemon.paused' | 'daemon.resumed' | 'fuse.set' | 'fuse.triggered' | 'fuse.cancelled' | 'fuse.paused' | 'fuse.resumed';
|
|
134
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/scheduler/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Scheduler types for Daemons and Fuses (ADR-071)
|
|
4
|
+
*
|
|
5
|
+
* Daemons: Processes that run every turn
|
|
6
|
+
* Fuses: Countdown timers that trigger after N turns
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/scheduler/types.ts"],"names":[],"mappings":";AAAA;;;;;GAKG"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Typed constants for sharedData keys used by the engine orchestration.
|
|
3
|
+
*
|
|
4
|
+
* SharedData is passed between action phases (validate/execute/report/blocked)
|
|
5
|
+
* and allows phases to communicate without modifying the context directly.
|
|
6
|
+
*
|
|
7
|
+
* This file defines only engine-level keys. Actions define their own
|
|
8
|
+
* action-specific keys as needed.
|
|
9
|
+
*/
|
|
10
|
+
import type { ISemanticEvent } from '@sharpee/core';
|
|
11
|
+
import type { IFEntity } from '@sharpee/world-model';
|
|
12
|
+
import type { ValidationResult } from '@sharpee/stdlib';
|
|
13
|
+
/**
|
|
14
|
+
* Constants for engine-level sharedData keys.
|
|
15
|
+
* Using constants prevents typos and enables IDE autocomplete.
|
|
16
|
+
*/
|
|
17
|
+
export declare const SharedDataKeys: {
|
|
18
|
+
/** Whether pronoun inference was performed (ADR-104) */
|
|
19
|
+
readonly INFERENCE_PERFORMED: "inferencePerformed";
|
|
20
|
+
/** The original target entity before inference */
|
|
21
|
+
readonly ORIGINAL_TARGET: "originalTarget";
|
|
22
|
+
/** The inferred target entity after inference */
|
|
23
|
+
readonly INFERRED_TARGET: "inferredTarget";
|
|
24
|
+
/** Events from implicit take actions (ADR-104) */
|
|
25
|
+
readonly IMPLICIT_TAKE_EVENTS: "implicitTakeEvents";
|
|
26
|
+
/** Validation result from the validate phase */
|
|
27
|
+
readonly VALIDATION_RESULT: "validationResult";
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* Type for the value type of a SharedDataKey
|
|
31
|
+
*/
|
|
32
|
+
export type SharedDataKeyType = typeof SharedDataKeys[keyof typeof SharedDataKeys];
|
|
33
|
+
/**
|
|
34
|
+
* Typed interface for engine-level shared data.
|
|
35
|
+
*
|
|
36
|
+
* Note: Actions can store additional keys beyond these.
|
|
37
|
+
* This interface covers only the engine orchestration keys.
|
|
38
|
+
*/
|
|
39
|
+
export interface EngineSharedData {
|
|
40
|
+
/** Whether pronoun inference was performed */
|
|
41
|
+
[SharedDataKeys.INFERENCE_PERFORMED]?: boolean;
|
|
42
|
+
/** The original target entity before inference */
|
|
43
|
+
[SharedDataKeys.ORIGINAL_TARGET]?: IFEntity;
|
|
44
|
+
/** The inferred target entity after inference */
|
|
45
|
+
[SharedDataKeys.INFERRED_TARGET]?: IFEntity;
|
|
46
|
+
/** Events from implicit take actions */
|
|
47
|
+
[SharedDataKeys.IMPLICIT_TAKE_EVENTS]?: ISemanticEvent[];
|
|
48
|
+
/** Validation result from the validate phase */
|
|
49
|
+
[SharedDataKeys.VALIDATION_RESULT]?: ValidationResult;
|
|
50
|
+
/** Allow additional action-specific keys */
|
|
51
|
+
[key: string]: unknown;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=shared-data-keys.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared-data-keys.d.ts","sourceRoot":"","sources":["../src/shared-data-keys.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAExD;;;GAGG;AACH,eAAO,MAAM,cAAc;IACzB,wDAAwD;;IAGxD,kDAAkD;;IAGlD,iDAAiD;;IAGjD,kDAAkD;;IAGlD,gDAAgD;;CAExC,CAAC;AAEX;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG,OAAO,cAAc,CAAC,MAAM,OAAO,cAAc,CAAC,CAAC;AAEnF;;;;;GAKG;AACH,MAAM,WAAW,gBAAgB;IAC/B,8CAA8C;IAC9C,CAAC,cAAc,CAAC,mBAAmB,CAAC,CAAC,EAAE,OAAO,CAAC;IAE/C,kDAAkD;IAClD,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC,EAAE,QAAQ,CAAC;IAE5C,iDAAiD;IACjD,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC,EAAE,QAAQ,CAAC;IAE5C,wCAAwC;IACxC,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAC,EAAE,cAAc,EAAE,CAAC;IAEzD,gDAAgD;IAChD,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC,EAAE,gBAAgB,CAAC;IAEtD,4CAA4C;IAC5C,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Typed constants for sharedData keys used by the engine orchestration.
|
|
4
|
+
*
|
|
5
|
+
* SharedData is passed between action phases (validate/execute/report/blocked)
|
|
6
|
+
* and allows phases to communicate without modifying the context directly.
|
|
7
|
+
*
|
|
8
|
+
* This file defines only engine-level keys. Actions define their own
|
|
9
|
+
* action-specific keys as needed.
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.SharedDataKeys = void 0;
|
|
13
|
+
/**
|
|
14
|
+
* Constants for engine-level sharedData keys.
|
|
15
|
+
* Using constants prevents typos and enables IDE autocomplete.
|
|
16
|
+
*/
|
|
17
|
+
exports.SharedDataKeys = {
|
|
18
|
+
/** Whether pronoun inference was performed (ADR-104) */
|
|
19
|
+
INFERENCE_PERFORMED: 'inferencePerformed',
|
|
20
|
+
/** The original target entity before inference */
|
|
21
|
+
ORIGINAL_TARGET: 'originalTarget',
|
|
22
|
+
/** The inferred target entity after inference */
|
|
23
|
+
INFERRED_TARGET: 'inferredTarget',
|
|
24
|
+
/** Events from implicit take actions (ADR-104) */
|
|
25
|
+
IMPLICIT_TAKE_EVENTS: 'implicitTakeEvents',
|
|
26
|
+
/** Validation result from the validate phase */
|
|
27
|
+
VALIDATION_RESULT: 'validationResult',
|
|
28
|
+
};
|
|
29
|
+
//# sourceMappingURL=shared-data-keys.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared-data-keys.js","sourceRoot":"","sources":["../src/shared-data-keys.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;AAMH;;;GAGG;AACU,QAAA,cAAc,GAAG;IAC5B,wDAAwD;IACxD,mBAAmB,EAAE,oBAAoB;IAEzC,kDAAkD;IAClD,eAAe,EAAE,gBAAgB;IAEjC,iDAAiD;IACjD,eAAe,EAAE,gBAAgB;IAEjC,kDAAkD;IAClD,oBAAoB,EAAE,oBAAoB;IAE1C,gDAAgD;IAChD,iBAAiB,EAAE,kBAAkB;CAC7B,CAAC"}
|