@sharpee/plugin-scheduler 0.9.66-beta → 0.9.67-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/index.d.ts ADDED
@@ -0,0 +1,8 @@
1
+ /**
2
+ * @sharpee/plugin-scheduler - Scheduler plugin for daemons and fuses (ADR-071, ADR-120)
3
+ */
4
+ export * from './types';
5
+ export * from './seeded-random';
6
+ export * from './scheduler-service';
7
+ export * from './scheduler-plugin';
8
+ //# sourceMappingURL=index.d.ts.map
package/index.d.ts.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../mnt/c/repotemp/sharpee/packages/plugin-scheduler/src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,SAAS,CAAC;AACxB,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC"}
package/index.js ADDED
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ /**
3
+ * @sharpee/plugin-scheduler - Scheduler plugin for daemons and fuses (ADR-071, ADR-120)
4
+ */
5
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ var desc = Object.getOwnPropertyDescriptor(m, k);
8
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
+ desc = { enumerable: true, get: function() { return m[k]; } };
10
+ }
11
+ Object.defineProperty(o, k2, desc);
12
+ }) : (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ o[k2] = m[k];
15
+ }));
16
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
17
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
18
+ };
19
+ Object.defineProperty(exports, "__esModule", { value: true });
20
+ __exportStar(require("./types"), exports);
21
+ __exportStar(require("./seeded-random"), exports);
22
+ __exportStar(require("./scheduler-service"), exports);
23
+ __exportStar(require("./scheduler-plugin"), exports);
24
+ //# sourceMappingURL=index.js.map
package/index.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../../mnt/c/repotemp/sharpee/packages/plugin-scheduler/src/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;;;;;;;;;;;AAEH,0CAAwB;AACxB,kDAAgC;AAChC,sDAAoC;AACpC,qDAAmC"}
package/package.json CHANGED
@@ -1,9 +1,8 @@
1
1
  {
2
2
  "name": "@sharpee/plugin-scheduler",
3
- "version": "0.9.66-beta",
3
+ "version": "0.9.67-beta",
4
4
  "description": "Scheduler plugin for Sharpee engine - daemons and fuses (ADR-071, ADR-120)",
5
5
  "main": "./index.js",
6
- "module": "dist-npm/index.js",
7
6
  "types": "./index.d.ts",
8
7
  "exports": {
9
8
  ".": {
@@ -12,14 +11,6 @@
12
11
  "default": "./index.js"
13
12
  }
14
13
  },
15
- "scripts": {
16
- "build": "tsc",
17
- "clean": "rimraf dist",
18
- "build:npm": "tsc --outDir dist-npm"
19
- },
20
- "files": [
21
- "dist-npm"
22
- ],
23
14
  "keywords": [
24
15
  "interactive-fiction",
25
16
  "sharpee",
@@ -0,0 +1,21 @@
1
+ /**
2
+ * SchedulerPlugin - Wraps SchedulerService as a TurnPlugin (ADR-120)
3
+ *
4
+ * Priority 50: Runs after NPCs (100) and state machines (75).
5
+ * Daemons and fuses are background temporal events.
6
+ */
7
+ import { ISemanticEvent } from "./src/index";
8
+ import { TurnPlugin, TurnPluginContext } from "./src/index";
9
+ import { ISchedulerService } from './scheduler-service';
10
+ export declare class SchedulerPlugin implements TurnPlugin {
11
+ id: string;
12
+ priority: number;
13
+ private service;
14
+ constructor(seed?: number);
15
+ onAfterAction(ctx: TurnPluginContext): ISemanticEvent[];
16
+ getState(): unknown;
17
+ setState(state: unknown): void;
18
+ /** Public access for stories that need daemon/fuse registration */
19
+ getScheduler(): ISchedulerService;
20
+ }
21
+ //# sourceMappingURL=scheduler-plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduler-plugin.d.ts","sourceRoot":"","sources":["../../../../../mnt/c/repotemp/sharpee/packages/plugin-scheduler/src/scheduler-plugin.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAA0B,MAAM,qBAAqB,CAAC;AAGhF,qBAAa,eAAgB,YAAW,UAAU;IAChD,EAAE,SAA8B;IAChC,QAAQ,SAAM;IACd,OAAO,CAAC,OAAO,CAAoB;gBAEvB,IAAI,CAAC,EAAE,MAAM;IAIzB,aAAa,CAAC,GAAG,EAAE,iBAAiB,GAAG,cAAc,EAAE;IAIvD,QAAQ,IAAI,OAAO;IAInB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAI9B,mEAAmE;IACnE,YAAY,IAAI,iBAAiB;CAGlC"}
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ /**
3
+ * SchedulerPlugin - Wraps SchedulerService as a TurnPlugin (ADR-120)
4
+ *
5
+ * Priority 50: Runs after NPCs (100) and state machines (75).
6
+ * Daemons and fuses are background temporal events.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.SchedulerPlugin = void 0;
10
+ const scheduler_service_1 = require("./scheduler-service");
11
+ class SchedulerPlugin {
12
+ id = 'sharpee.plugin.scheduler';
13
+ priority = 50;
14
+ service;
15
+ constructor(seed) {
16
+ this.service = (0, scheduler_service_1.createSchedulerService)(seed);
17
+ }
18
+ onAfterAction(ctx) {
19
+ return this.service.tick(ctx.world, ctx.turn, ctx.playerId).events;
20
+ }
21
+ getState() {
22
+ return this.service.getState();
23
+ }
24
+ setState(state) {
25
+ this.service.setState(state);
26
+ }
27
+ /** Public access for stories that need daemon/fuse registration */
28
+ getScheduler() {
29
+ return this.service;
30
+ }
31
+ }
32
+ exports.SchedulerPlugin = SchedulerPlugin;
33
+ //# sourceMappingURL=scheduler-plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduler-plugin.js","sourceRoot":"","sources":["../../../../../../../../mnt/c/repotemp/sharpee/packages/plugin-scheduler/src/scheduler-plugin.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAIH,2DAAgF;AAGhF,MAAa,eAAe;IAC1B,EAAE,GAAG,0BAA0B,CAAC;IAChC,QAAQ,GAAG,EAAE,CAAC;IACN,OAAO,CAAoB;IAEnC,YAAY,IAAa;QACvB,IAAI,CAAC,OAAO,GAAG,IAAA,0CAAsB,EAAC,IAAI,CAAC,CAAC;IAC9C,CAAC;IAED,aAAa,CAAC,GAAsB;QAClC,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC;IACrE,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;IACjC,CAAC;IAED,QAAQ,CAAC,KAAc;QACrB,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAuB,CAAC,CAAC;IACjD,CAAC;IAED,mEAAmE;IACnE,YAAY;QACV,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;CACF;AAzBD,0CAyBC"}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * SchedulerService - Manages Daemons and Fuses (ADR-071)
3
+ *
4
+ * The scheduler runs during the turn cycle, after NPCs act:
5
+ * 1. Player action
6
+ * 2. NPC turns
7
+ * 3. Scheduler tick (daemons run, fuses count down)
8
+ * 4. Turn complete
9
+ */
10
+ import { ISemanticEvent, EntityId } from "./src/index";
11
+ import { WorldModel } from "./src/index";
12
+ import { Daemon, Fuse, DaemonInfo, FuseInfo, SchedulerResult, SchedulerState, SeededRandom } from './types';
13
+ /**
14
+ * SchedulerService interface
15
+ */
16
+ export interface ISchedulerService {
17
+ registerDaemon(daemon: Daemon): void;
18
+ removeDaemon(id: string): void;
19
+ pauseDaemon(id: string): void;
20
+ resumeDaemon(id: string): void;
21
+ hasDaemon(id: string): boolean;
22
+ setFuse(fuse: Fuse): void;
23
+ cancelFuse(id: string): ISemanticEvent[];
24
+ getFuseRemaining(id: string): number | undefined;
25
+ adjustFuse(id: string, delta: number): void;
26
+ pauseFuse(id: string): void;
27
+ resumeFuse(id: string): void;
28
+ hasFuse(id: string): boolean;
29
+ tick(world: WorldModel, turn: number, playerId: EntityId): SchedulerResult;
30
+ getActiveDaemons(): DaemonInfo[];
31
+ getActiveFuses(): FuseInfo[];
32
+ getState(): SchedulerState;
33
+ setState(state: SchedulerState): void;
34
+ cleanupEntity(entityId: EntityId): ISemanticEvent[];
35
+ getRandom(): SeededRandom;
36
+ }
37
+ /**
38
+ * SchedulerService implementation
39
+ */
40
+ export declare class SchedulerService implements ISchedulerService {
41
+ private daemons;
42
+ private daemonStates;
43
+ private fuses;
44
+ private fuseStates;
45
+ private random;
46
+ private currentTurn;
47
+ constructor(seed?: number);
48
+ registerDaemon(daemon: Daemon): void;
49
+ removeDaemon(id: string): void;
50
+ pauseDaemon(id: string): void;
51
+ resumeDaemon(id: string): void;
52
+ hasDaemon(id: string): boolean;
53
+ setFuse(fuse: Fuse): void;
54
+ cancelFuse(id: string): ISemanticEvent[];
55
+ getFuseRemaining(id: string): number | undefined;
56
+ adjustFuse(id: string, delta: number): void;
57
+ pauseFuse(id: string): void;
58
+ resumeFuse(id: string): void;
59
+ hasFuse(id: string): boolean;
60
+ tick(world: WorldModel, turn: number, playerId: EntityId): SchedulerResult;
61
+ getActiveDaemons(): DaemonInfo[];
62
+ getActiveFuses(): FuseInfo[];
63
+ getState(): SchedulerState;
64
+ setState(state: SchedulerState): void;
65
+ cleanupEntity(entityId: EntityId): ISemanticEvent[];
66
+ getRandom(): SeededRandom;
67
+ private createContext;
68
+ private getSortedDaemons;
69
+ private getSortedFuses;
70
+ }
71
+ /**
72
+ * Create a new SchedulerService instance
73
+ */
74
+ export declare function createSchedulerService(seed?: number): ISchedulerService;
75
+ //# sourceMappingURL=scheduler-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduler-service.d.ts","sourceRoot":"","sources":["../../../../../mnt/c/repotemp/sharpee/packages/plugin-scheduler/src/scheduler-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,315 @@
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
+ const daemon = this.daemons.get(state.id);
244
+ const runnerState = daemon?.getRunnerState?.();
245
+ daemons.push({ ...state, ...(runnerState !== undefined ? { runnerState } : {}) });
246
+ }
247
+ for (const state of this.fuseStates.values()) {
248
+ fuses.push({ ...state });
249
+ }
250
+ return {
251
+ turn: this.currentTurn,
252
+ daemons,
253
+ fuses,
254
+ randomSeed: this.random.getSeed(),
255
+ };
256
+ }
257
+ setState(state) {
258
+ this.currentTurn = state.turn;
259
+ this.random.setSeed(state.randomSeed);
260
+ // Restore daemon states (daemons must be re-registered at game start)
261
+ for (const daemonState of state.daemons) {
262
+ if (this.daemons.has(daemonState.id)) {
263
+ this.daemonStates.set(daemonState.id, { ...daemonState });
264
+ if (daemonState.runnerState) {
265
+ this.daemons.get(daemonState.id)?.restoreRunnerState?.(daemonState.runnerState);
266
+ }
267
+ }
268
+ }
269
+ // Restore fuse states (fuses must be re-registered at game start)
270
+ for (const fuseState of state.fuses) {
271
+ if (this.fuses.has(fuseState.id)) {
272
+ this.fuseStates.set(fuseState.id, { ...fuseState });
273
+ }
274
+ }
275
+ }
276
+ // ==================== Entity Cleanup ====================
277
+ cleanupEntity(entityId) {
278
+ const events = [];
279
+ // Cancel any fuses bound to this entity
280
+ for (const [id, state] of this.fuseStates) {
281
+ if (state.entityId === entityId) {
282
+ events.push(...this.cancelFuse(id));
283
+ }
284
+ }
285
+ return events;
286
+ }
287
+ // ==================== Random Access ====================
288
+ getRandom() {
289
+ return this.random;
290
+ }
291
+ // ==================== Private Helpers ====================
292
+ createContext(world, turn, playerLocation, playerId) {
293
+ return {
294
+ world,
295
+ turn,
296
+ random: this.random,
297
+ playerLocation,
298
+ playerId: playerId || '',
299
+ };
300
+ }
301
+ getSortedDaemons() {
302
+ return Array.from(this.daemons.values()).sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0));
303
+ }
304
+ getSortedFuses() {
305
+ return Array.from(this.fuses.values()).sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0));
306
+ }
307
+ }
308
+ exports.SchedulerService = SchedulerService;
309
+ /**
310
+ * Create a new SchedulerService instance
311
+ */
312
+ function createSchedulerService(seed) {
313
+ return new SchedulerService(seed);
314
+ }
315
+ //# sourceMappingURL=scheduler-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduler-service.js","sourceRoot":"","sources":["../../../../../../../../mnt/c/repotemp/sharpee/packages/plugin-scheduler/src/scheduler-service.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;AAoaH,wDAEC;AAtZD,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,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC1C,MAAM,WAAW,GAAG,MAAM,EAAE,cAAc,EAAE,EAAE,CAAC;YAC/C,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,KAAK,EAAE,GAAG,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACpF,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;gBAC1D,IAAI,WAAW,CAAC,WAAW,EAAE,CAAC;oBAC5B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC,EAAE,kBAAkB,EAAE,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;gBAClF,CAAC;YACH,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;AA7VD,4CA6VC;AAED;;GAEG;AACH,SAAgB,sBAAsB,CAAC,IAAa;IAClD,OAAO,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAC;AACpC,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Seeded Random Number Generator
3
+ *
4
+ * Re-exports from @sharpee/core for convenience.
5
+ */
6
+ export { createSeededRandom, SeededRandom } from "./src/index";
7
+ //# sourceMappingURL=seeded-random.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seeded-random.d.ts","sourceRoot":"","sources":["../../../../../mnt/c/repotemp/sharpee/packages/plugin-scheduler/src/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("./src/index.js");
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":["../../../../../../../../mnt/c/repotemp/sharpee/packages/plugin-scheduler/src/seeded-random.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAEH,sCAAiE;AAAxD,0GAAA,kBAAkB,OAAA"}
package/types.d.ts ADDED
@@ -0,0 +1,140 @@
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 "./src/index";
8
+ import { WorldModel } from "./src/index";
9
+ export { SeededRandom } from "./src/index";
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
+ /** Optional: return runner-specific state for serialization (ADR-123) */
42
+ getRunnerState?: () => Record<string, unknown>;
43
+ /** Optional: restore runner-specific state after deserialization (ADR-123) */
44
+ restoreRunnerState?: (state: Record<string, unknown>) => void;
45
+ }
46
+ /**
47
+ * A fuse is a countdown timer that triggers after N turns
48
+ */
49
+ export interface Fuse {
50
+ /** Unique identifier */
51
+ id: string;
52
+ /** Human-readable name for debugging */
53
+ name: string;
54
+ /** Turns until trigger (counts down each tick) */
55
+ turns: number;
56
+ /** What happens when it triggers - returns semantic events */
57
+ trigger: (context: SchedulerContext) => ISemanticEvent[];
58
+ /** Optional: entity this fuse is bound to (for automatic cleanup) */
59
+ entityId?: EntityId;
60
+ /** Optional: condition for ticking (if false, turn doesn't count down) */
61
+ tickCondition?: (context: SchedulerContext) => boolean;
62
+ /** What happens if cancelled before triggering (cleanup) */
63
+ onCancel?: (context: SchedulerContext) => ISemanticEvent[];
64
+ /** Priority for ordering multiple simultaneous triggers */
65
+ priority?: number;
66
+ /** If true, fuse repeats after triggering */
67
+ repeat?: boolean;
68
+ /** Original turns value for repeating fuses */
69
+ originalTurns?: number;
70
+ }
71
+ /**
72
+ * Runtime state for a daemon
73
+ */
74
+ export interface DaemonState {
75
+ id: string;
76
+ isPaused: boolean;
77
+ runCount: number;
78
+ /** Runner-specific state for typed daemons (ADR-123) */
79
+ runnerState?: Record<string, unknown>;
80
+ }
81
+ /**
82
+ * Runtime state for a fuse
83
+ */
84
+ export interface FuseState {
85
+ id: string;
86
+ turnsRemaining: number;
87
+ isPaused: boolean;
88
+ entityId?: EntityId;
89
+ }
90
+ /**
91
+ * Info about an active daemon (for debugging/introspection)
92
+ */
93
+ export interface DaemonInfo {
94
+ id: string;
95
+ name: string;
96
+ isPaused: boolean;
97
+ runCount: number;
98
+ priority: number;
99
+ }
100
+ /**
101
+ * Info about an active fuse (for debugging/introspection)
102
+ */
103
+ export interface FuseInfo {
104
+ id: string;
105
+ name: string;
106
+ turnsRemaining: number;
107
+ isPaused: boolean;
108
+ entityId?: EntityId;
109
+ priority: number;
110
+ repeat: boolean;
111
+ }
112
+ /**
113
+ * Result of a scheduler tick
114
+ */
115
+ export interface SchedulerResult {
116
+ /** Events generated by daemons and fuses */
117
+ events: ISemanticEvent[];
118
+ /** IDs of fuses that triggered this tick */
119
+ fusesTriggered: string[];
120
+ /** IDs of daemons that ran this tick */
121
+ daemonsRun: string[];
122
+ }
123
+ /**
124
+ * Serializable scheduler state for save/load
125
+ */
126
+ export interface SchedulerState {
127
+ /** Current turn number */
128
+ turn: number;
129
+ /** Daemon states */
130
+ daemons: DaemonState[];
131
+ /** Fuse states */
132
+ fuses: FuseState[];
133
+ /** Random seed */
134
+ randomSeed: number;
135
+ }
136
+ /**
137
+ * Scheduler event types for lifecycle events
138
+ */
139
+ export type SchedulerEventType = 'daemon.registered' | 'daemon.removed' | 'daemon.paused' | 'daemon.resumed' | 'fuse.set' | 'fuse.triggered' | 'fuse.cancelled' | 'fuse.paused' | 'fuse.resumed';
140
+ //# sourceMappingURL=types.d.ts.map
package/types.d.ts.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../mnt/c/repotemp/sharpee/packages/plugin-scheduler/src/types.ts"],"names":[],"mappings":"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"}
package/types.js ADDED
@@ -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
package/types.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../../../../mnt/c/repotemp/sharpee/packages/plugin-scheduler/src/types.ts"],"names":[],"mappings":";AAAA;;;;;GAKG"}