@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.
Files changed (95) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +328 -0
  3. package/dist/action-context-factory.d.ts +11 -0
  4. package/dist/action-context-factory.d.ts.map +1 -0
  5. package/dist/action-context-factory.js +258 -0
  6. package/dist/action-context-factory.js.map +1 -0
  7. package/dist/capability-dispatch-helper.d.ts +106 -0
  8. package/dist/capability-dispatch-helper.d.ts.map +1 -0
  9. package/dist/capability-dispatch-helper.js +269 -0
  10. package/dist/capability-dispatch-helper.js.map +1 -0
  11. package/dist/command-executor.d.ts +53 -0
  12. package/dist/command-executor.d.ts.map +1 -0
  13. package/dist/command-executor.js +329 -0
  14. package/dist/command-executor.js.map +1 -0
  15. package/dist/event-adapter.d.ts +44 -0
  16. package/dist/event-adapter.d.ts.map +1 -0
  17. package/dist/event-adapter.js +127 -0
  18. package/dist/event-adapter.js.map +1 -0
  19. package/dist/event-sequencer.d.ts +73 -0
  20. package/dist/event-sequencer.d.ts.map +1 -0
  21. package/dist/event-sequencer.js +134 -0
  22. package/dist/event-sequencer.js.map +1 -0
  23. package/dist/events/event-emitter.d.ts +34 -0
  24. package/dist/events/event-emitter.d.ts.map +1 -0
  25. package/dist/events/event-emitter.js +67 -0
  26. package/dist/events/event-emitter.js.map +1 -0
  27. package/dist/game-engine.d.ts +292 -0
  28. package/dist/game-engine.d.ts.map +1 -0
  29. package/dist/game-engine.js +1631 -0
  30. package/dist/game-engine.js.map +1 -0
  31. package/dist/index.d.ts +27 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +62 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/narrative/index.d.ts +5 -0
  36. package/dist/narrative/index.d.ts.map +1 -0
  37. package/dist/narrative/index.js +10 -0
  38. package/dist/narrative/index.js.map +1 -0
  39. package/dist/narrative/narrative-settings.d.ts +73 -0
  40. package/dist/narrative/narrative-settings.d.ts.map +1 -0
  41. package/dist/narrative/narrative-settings.js +28 -0
  42. package/dist/narrative/narrative-settings.js.map +1 -0
  43. package/dist/parser-interface.d.ts +77 -0
  44. package/dist/parser-interface.d.ts.map +1 -0
  45. package/dist/parser-interface.js +48 -0
  46. package/dist/parser-interface.js.map +1 -0
  47. package/dist/platform-operations.d.ts +83 -0
  48. package/dist/platform-operations.d.ts.map +1 -0
  49. package/dist/platform-operations.js +218 -0
  50. package/dist/platform-operations.js.map +1 -0
  51. package/dist/save-restore-service.d.ts +133 -0
  52. package/dist/save-restore-service.d.ts.map +1 -0
  53. package/dist/save-restore-service.js +446 -0
  54. package/dist/save-restore-service.js.map +1 -0
  55. package/dist/scheduler/index.d.ts +9 -0
  56. package/dist/scheduler/index.d.ts.map +1 -0
  57. package/dist/scheduler/index.js +25 -0
  58. package/dist/scheduler/index.js.map +1 -0
  59. package/dist/scheduler/scheduler-service.d.ts +75 -0
  60. package/dist/scheduler/scheduler-service.d.ts.map +1 -0
  61. package/dist/scheduler/scheduler-service.js +310 -0
  62. package/dist/scheduler/scheduler-service.js.map +1 -0
  63. package/dist/scheduler/seeded-random.d.ts +7 -0
  64. package/dist/scheduler/seeded-random.d.ts.map +1 -0
  65. package/dist/scheduler/seeded-random.js +11 -0
  66. package/dist/scheduler/seeded-random.js.map +1 -0
  67. package/dist/scheduler/types.d.ts +134 -0
  68. package/dist/scheduler/types.d.ts.map +1 -0
  69. package/dist/scheduler/types.js +9 -0
  70. package/dist/scheduler/types.js.map +1 -0
  71. package/dist/shared-data-keys.d.ts +53 -0
  72. package/dist/shared-data-keys.d.ts.map +1 -0
  73. package/dist/shared-data-keys.js +29 -0
  74. package/dist/shared-data-keys.js.map +1 -0
  75. package/dist/story.d.ts +211 -0
  76. package/dist/story.d.ts.map +1 -0
  77. package/dist/story.js +60 -0
  78. package/dist/story.js.map +1 -0
  79. package/dist/test-helpers/mock-text-service.d.ts +11 -0
  80. package/dist/test-helpers/mock-text-service.d.ts.map +1 -0
  81. package/dist/test-helpers/mock-text-service.js +47 -0
  82. package/dist/test-helpers/mock-text-service.js.map +1 -0
  83. package/dist/turn-event-processor.d.ts +89 -0
  84. package/dist/turn-event-processor.d.ts.map +1 -0
  85. package/dist/turn-event-processor.js +144 -0
  86. package/dist/turn-event-processor.js.map +1 -0
  87. package/dist/types.d.ts +214 -0
  88. package/dist/types.d.ts.map +1 -0
  89. package/dist/types.js +8 -0
  90. package/dist/types.js.map +1 -0
  91. package/dist/vocabulary-manager.d.ts +35 -0
  92. package/dist/vocabulary-manager.d.ts.map +1 -0
  93. package/dist/vocabulary-manager.js +74 -0
  94. package/dist/vocabulary-manager.js.map +1 -0
  95. package/package.json +70 -0
@@ -0,0 +1,329 @@
1
+ "use strict";
2
+ /**
3
+ * Command Executor - Orchestrates command pipeline
4
+ *
5
+ * Responsibilities:
6
+ * - Orchestrate the four-phase pattern (validate → execute → report/blocked)
7
+ * - Handle implicit inference (ADR-104) when validation fails with pronouns
8
+ * - Pass results between phases
9
+ * - Return the final TurnResult
10
+ *
11
+ * All event creation is owned by the action components themselves.
12
+ */
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.CommandExecutor = void 0;
15
+ exports.createCommandExecutor = createCommandExecutor;
16
+ const core_1 = require("@sharpee/core");
17
+ const parser_interface_1 = require("./parser-interface");
18
+ const shared_data_keys_1 = require("./shared-data-keys");
19
+ const stdlib_1 = require("@sharpee/stdlib");
20
+ const event_sequencer_1 = require("./event-sequencer");
21
+ const action_context_factory_1 = require("./action-context-factory");
22
+ const capability_dispatch_helper_1 = require("./capability-dispatch-helper");
23
+ class CommandExecutor {
24
+ parser;
25
+ validator;
26
+ actionRegistry;
27
+ eventProcessor;
28
+ scopeResolver;
29
+ parsedCommandTransformers = [];
30
+ constructor(world, actionRegistry, eventProcessor, parser, systemEvents) {
31
+ if (!world)
32
+ throw new Error('World model is required');
33
+ if (!actionRegistry)
34
+ throw new Error('Action registry is required');
35
+ if (!eventProcessor)
36
+ throw new Error('Event processor is required');
37
+ if (!parser)
38
+ throw new Error('Parser is required');
39
+ this.parser = parser;
40
+ this.validator = new stdlib_1.CommandValidator(world, actionRegistry);
41
+ if (systemEvents) {
42
+ this.validator.setSystemEventSource(systemEvents);
43
+ }
44
+ this.actionRegistry = actionRegistry;
45
+ this.eventProcessor = eventProcessor;
46
+ }
47
+ /**
48
+ * Register a transformer that can modify parsed commands before validation.
49
+ * Transformers are called in order of registration.
50
+ *
51
+ * @param transformer - Function to transform parsed commands
52
+ */
53
+ registerParsedCommandTransformer(transformer) {
54
+ this.parsedCommandTransformers.push(transformer);
55
+ }
56
+ /**
57
+ * Unregister a previously registered transformer.
58
+ *
59
+ * @param transformer - The transformer to remove
60
+ * @returns true if the transformer was found and removed
61
+ */
62
+ unregisterParsedCommandTransformer(transformer) {
63
+ const index = this.parsedCommandTransformers.indexOf(transformer);
64
+ if (index !== -1) {
65
+ this.parsedCommandTransformers.splice(index, 1);
66
+ return true;
67
+ }
68
+ return false;
69
+ }
70
+ async execute(input, world, context, config) {
71
+ const turn = context.currentTurn;
72
+ event_sequencer_1.eventSequencer.resetTurn(turn);
73
+ // Timing tracking
74
+ const startTime = config?.collectTiming ? Date.now() : 0;
75
+ let parseTime = 0;
76
+ let executionTime = 0;
77
+ try {
78
+ // Set world context for parser entity resolution
79
+ const player = world.getPlayer();
80
+ if (player && (0, parser_interface_1.hasWorldContext)(this.parser)) {
81
+ const playerLocation = world.getLocation(player.id) || '';
82
+ this.parser.setWorldContext(world, player.id, playerLocation);
83
+ }
84
+ // Phase 1: Parse
85
+ const parseStart = config?.collectTiming ? Date.now() : 0;
86
+ const parseResult = this.parser.parse(input);
87
+ if (config?.collectTiming) {
88
+ parseTime = Date.now() - parseStart;
89
+ }
90
+ if (!parseResult.success) {
91
+ throw new Error(`Parse failed: ${parseResult.error.code}`);
92
+ }
93
+ // Phase 1.5: Apply parsed command transformers
94
+ // Allows stories to modify parsed commands before validation
95
+ let parsedCommand = parseResult.value;
96
+ for (const transformer of this.parsedCommandTransformers) {
97
+ parsedCommand = transformer(parsedCommand, world);
98
+ }
99
+ // Phase 2: Validate
100
+ const validationResult = this.validator.validate(parsedCommand);
101
+ if (!validationResult.success) {
102
+ // Check for disambiguation - emit client.query event instead of throwing
103
+ if (validationResult.error.code === 'AMBIGUOUS_ENTITY') {
104
+ const details = validationResult.error.details || {};
105
+ const candidates = details.ambiguousEntities || [];
106
+ // Emit client.query event for disambiguation
107
+ const queryEvent = event_sequencer_1.eventSequencer.sequence({
108
+ type: 'client.query',
109
+ data: {
110
+ source: core_1.QuerySource.DISAMBIGUATION,
111
+ type: core_1.QueryType.DISAMBIGUATION,
112
+ messageId: 'core.disambiguation_prompt',
113
+ candidates: candidates,
114
+ searchText: details.searchText,
115
+ originalCommand: parsedCommand
116
+ }
117
+ }, turn);
118
+ // Return early with query pending
119
+ return {
120
+ turn,
121
+ input,
122
+ success: false,
123
+ needsInput: true,
124
+ events: [queryEvent],
125
+ error: 'DISAMBIGUATION_NEEDED'
126
+ };
127
+ }
128
+ // Other validation errors still throw
129
+ throw new Error(`Validation failed: ${validationResult.error.code}`);
130
+ }
131
+ // Phase 3: Execute action's three-phase pattern
132
+ const executionStart = config?.collectTiming ? Date.now() : 0;
133
+ const command = validationResult.value;
134
+ const action = this.actionRegistry.get(command.actionId);
135
+ if (!action) {
136
+ throw new Error(`Action not found: ${command.actionId}`);
137
+ }
138
+ // Create context
139
+ if (!this.scopeResolver) {
140
+ this.scopeResolver = (0, stdlib_1.createScopeResolver)(world);
141
+ }
142
+ const actionContext = (0, action_context_factory_1.createActionContext)(world, context, command, action, this.scopeResolver);
143
+ // Universal Capability Dispatch: Check if any involved entity has a capability for this action
144
+ // If so, the entity's behavior handles the action instead of the stdlib default
145
+ // Check all entities: directObject, indirectObject, and any others
146
+ const involvedEntities = [
147
+ command.directObject?.entity,
148
+ command.indirectObject?.entity
149
+ ];
150
+ const capabilityCheck = (0, capability_dispatch_helper_1.checkCapabilityDispatchMulti)(command.actionId, involvedEntities);
151
+ // Run action's four phases: validate → execute → report (or blocked)
152
+ // If capability dispatch applies, use capability behavior; otherwise use action
153
+ let actionValidation = capabilityCheck.shouldDispatch
154
+ ? (0, capability_dispatch_helper_1.executeCapabilityValidate)(capabilityCheck, actionContext)
155
+ : action.validate(actionContext);
156
+ let currentCommand = command;
157
+ let currentContext = actionContext;
158
+ let useCapabilityDispatch = capabilityCheck.shouldDispatch;
159
+ // ADR-104: Implicit inference - if validation fails and pronoun was used,
160
+ // try to find a valid alternative target
161
+ // Check story-level config first
162
+ const inferenceEnabled = context.implicitActions?.inference !== false;
163
+ if (!actionValidation.valid && action.targetRequirements && inferenceEnabled) {
164
+ const directObject = command.directObject;
165
+ // Check if pronoun was used (INounPhrase has wasPronoun, cast is safe)
166
+ const parsedNounPhrase = directObject?.parsed;
167
+ const wasPronoun = parsedNounPhrase?.wasPronoun === true;
168
+ if (wasPronoun && directObject?.entity) {
169
+ // Note: directObject.parsed is typed as IParsedObjectReference but at runtime
170
+ // it's actually an INounPhrase (command-validator sets it from the noun phrase)
171
+ // Get entities in scope for inference (visible entities)
172
+ const scopeEntities = this.scopeResolver.getVisible(world.getPlayer());
173
+ // Try to infer a different target
174
+ const inferenceResult = (0, stdlib_1.tryInferTarget)(directObject.entity, wasPronoun, action, scopeEntities, world);
175
+ if (inferenceResult.inferred && inferenceResult.inferredTarget) {
176
+ // Create a modified command with the inferred target
177
+ const inferredCommand = {
178
+ ...command,
179
+ directObject: {
180
+ entity: inferenceResult.inferredTarget,
181
+ parsed: {
182
+ ...directObject.parsed,
183
+ // Update text to reflect inferred entity
184
+ text: inferenceResult.inferredTarget.name
185
+ }
186
+ }
187
+ };
188
+ // Create new context with inferred command
189
+ const inferredContext = (0, action_context_factory_1.createActionContext)(world, context, inferredCommand, action, this.scopeResolver);
190
+ // Mark that inference occurred (for "(the leaflet)" message)
191
+ const sharedData = inferredContext.sharedData;
192
+ sharedData[shared_data_keys_1.SharedDataKeys.INFERENCE_PERFORMED] = true;
193
+ sharedData[shared_data_keys_1.SharedDataKeys.ORIGINAL_TARGET] = directObject.entity;
194
+ sharedData[shared_data_keys_1.SharedDataKeys.INFERRED_TARGET] = inferenceResult.inferredTarget;
195
+ // Re-check capability dispatch for inferred target
196
+ const inferredInvolvedEntities = [
197
+ inferenceResult.inferredTarget,
198
+ command.indirectObject?.entity
199
+ ];
200
+ const inferredCapabilityCheck = (0, capability_dispatch_helper_1.checkCapabilityDispatchMulti)(command.actionId, inferredInvolvedEntities);
201
+ // Re-validate with inferred target (using capability dispatch if applicable)
202
+ const retryValidation = inferredCapabilityCheck.shouldDispatch
203
+ ? (0, capability_dispatch_helper_1.executeCapabilityValidate)(inferredCapabilityCheck, inferredContext)
204
+ : action.validate(inferredContext);
205
+ if (retryValidation.valid) {
206
+ // Inference succeeded - use the inferred command
207
+ actionValidation = retryValidation;
208
+ currentCommand = inferredCommand;
209
+ currentContext = inferredContext;
210
+ useCapabilityDispatch = inferredCapabilityCheck.shouldDispatch;
211
+ }
212
+ }
213
+ }
214
+ }
215
+ // Thread validation result to later phases via context
216
+ // This allows actions to access data from validate() in execute/report
217
+ currentContext.validationResult = actionValidation;
218
+ let events;
219
+ if (actionValidation.valid) {
220
+ if (useCapabilityDispatch) {
221
+ // Capability dispatch: use behavior phases
222
+ (0, capability_dispatch_helper_1.executeCapabilityExecute)(currentContext);
223
+ events = (0, capability_dispatch_helper_1.executeCapabilityReport)(currentContext);
224
+ }
225
+ else {
226
+ // Standard action: use action phases
227
+ const executeResult = action.execute(currentContext);
228
+ // Check pattern (new vs old)
229
+ if (executeResult === undefined || executeResult === null) {
230
+ // New pattern: use report() for success events only
231
+ if (action.report) {
232
+ events = action.report(currentContext);
233
+ }
234
+ else {
235
+ throw new Error(`Action ${action.id} uses new pattern but lacks report()`);
236
+ }
237
+ }
238
+ else {
239
+ // Old pattern: events from execute()
240
+ events = executeResult;
241
+ }
242
+ }
243
+ }
244
+ else {
245
+ // Validation failed - use blocked() for error events
246
+ if (useCapabilityDispatch) {
247
+ // Capability dispatch: use behavior's blocked phase
248
+ events = (0, capability_dispatch_helper_1.executeCapabilityBlocked)(currentContext, actionValidation, command.actionId);
249
+ }
250
+ else if (action.blocked) {
251
+ events = action.blocked(currentContext, actionValidation);
252
+ }
253
+ else {
254
+ // Fallback for unmigrated actions
255
+ events = [{
256
+ id: `${turn}-error`,
257
+ type: 'action.error',
258
+ timestamp: Date.now(),
259
+ data: {
260
+ actionId: command.actionId,
261
+ messageId: actionValidation.error || 'validation_failed',
262
+ params: actionValidation.params || {}
263
+ },
264
+ entities: {}
265
+ }];
266
+ }
267
+ }
268
+ if (config?.collectTiming) {
269
+ executionTime = Date.now() - executionStart;
270
+ }
271
+ // Process events and collect reactions (ADR-052 entity handlers)
272
+ let allEvents = events;
273
+ if (events.length > 0) {
274
+ const processed = this.eventProcessor.processEvents(events);
275
+ // Add reaction events from entity handlers
276
+ if (processed.reactions && processed.reactions.length > 0) {
277
+ allEvents = [...events, ...processed.reactions];
278
+ }
279
+ }
280
+ // Preserve all event properties (including requiresClientAction for platform events)
281
+ const sequenced = event_sequencer_1.eventSequencer.sequenceAll(allEvents, turn);
282
+ const result = {
283
+ turn,
284
+ input,
285
+ success: !events.some(e => e.type === 'action.error'),
286
+ events: sequenced,
287
+ actionId: command.actionId,
288
+ parsedCommand: command.parsed,
289
+ validatedCommand: command
290
+ };
291
+ // Add timing data if requested
292
+ if (config?.collectTiming) {
293
+ result.timing = {
294
+ parsing: parseTime,
295
+ execution: executionTime,
296
+ total: Date.now() - startTime
297
+ };
298
+ }
299
+ return result;
300
+ }
301
+ catch (error) {
302
+ // Minimal error handling - just return failure
303
+ const result = {
304
+ turn,
305
+ input,
306
+ success: false,
307
+ events: [event_sequencer_1.eventSequencer.sequence({
308
+ type: 'command.failed',
309
+ data: { reason: error.message, input }
310
+ }, turn)],
311
+ error: error.message
312
+ };
313
+ // Add timing data even for errors if requested
314
+ if (config?.collectTiming) {
315
+ result.timing = {
316
+ parsing: parseTime,
317
+ execution: executionTime,
318
+ total: Date.now() - startTime
319
+ };
320
+ }
321
+ return result;
322
+ }
323
+ }
324
+ }
325
+ exports.CommandExecutor = CommandExecutor;
326
+ function createCommandExecutor(world, actionRegistry, eventProcessor, parser, systemEvents) {
327
+ return new CommandExecutor(world, actionRegistry, eventProcessor, parser, systemEvents);
328
+ }
329
+ //# sourceMappingURL=command-executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-executor.js","sourceRoot":"","sources":["../src/command-executor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Event Adapter - Converts between SemanticEvent and SequencedEvent
3
+ *
4
+ * This adapter handles:
5
+ * - Event normalization for consistent structure
6
+ * - Event enrichment pipeline for adding metadata
7
+ */
8
+ import { ISemanticEvent } from '@sharpee/core';
9
+ import { SequencedEvent } from './types';
10
+ /**
11
+ * Event normalization - ensures consistent event structure
12
+ * Preserves all original properties (including requiresClientAction for platform events)
13
+ */
14
+ export declare function normalizeEvent(event: ISemanticEvent): ISemanticEvent;
15
+ /**
16
+ * Event enrichment pipeline - adds additional metadata
17
+ */
18
+ export declare function enrichEvent(event: ISemanticEvent, context?: EventProcessingContext): ISemanticEvent;
19
+ /**
20
+ * Event processing context for enrichment
21
+ */
22
+ export interface EventProcessingContext {
23
+ turn?: number;
24
+ playerId?: string;
25
+ locationId?: string;
26
+ }
27
+ /**
28
+ * Process an event through the pipeline.
29
+ *
30
+ * Pipeline stages:
31
+ * 1. Normalization (ensure required fields, lowercase type)
32
+ * 2. Enrichment (add turn info, default entities)
33
+ */
34
+ export declare function processEvent(event: ISemanticEvent, context?: EventProcessingContext): ISemanticEvent;
35
+ /**
36
+ * Convert a SemanticEvent to a SequencedEvent
37
+ */
38
+ export declare function toSequencedEvent(event: ISemanticEvent, turn: number, sequence: number): SequencedEvent;
39
+ /**
40
+ * Convert a SequencedEvent back to a SemanticEvent
41
+ * Preserves all original properties (including requiresClientAction for platform events)
42
+ */
43
+ export declare function toSemanticEvent(event: SequencedEvent): ISemanticEvent;
44
+ //# sourceMappingURL=event-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-adapter.d.ts","sourceRoot":"","sources":["../src/event-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAEzC;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,cAAc,GAAG,cAAc,CAcpE;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,cAAc,EACrB,OAAO,CAAC,EAAE,sBAAsB,GAC/B,cAAc,CAmChB;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,cAAc,EACrB,OAAO,CAAC,EAAE,sBAAsB,GAC/B,cAAc,CAIhB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,cAAc,EACrB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,GACf,cAAc,CAYhB;AAsBD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,cAAc,GAAG,cAAc,CASrE"}
@@ -0,0 +1,127 @@
1
+ "use strict";
2
+ /**
3
+ * Event Adapter - Converts between SemanticEvent and SequencedEvent
4
+ *
5
+ * This adapter handles:
6
+ * - Event normalization for consistent structure
7
+ * - Event enrichment pipeline for adding metadata
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.normalizeEvent = normalizeEvent;
11
+ exports.enrichEvent = enrichEvent;
12
+ exports.processEvent = processEvent;
13
+ exports.toSequencedEvent = toSequencedEvent;
14
+ exports.toSemanticEvent = toSemanticEvent;
15
+ /**
16
+ * Event normalization - ensures consistent event structure
17
+ * Preserves all original properties (including requiresClientAction for platform events)
18
+ */
19
+ function normalizeEvent(event) {
20
+ const normalized = {
21
+ ...event, // Preserve all original properties (e.g., requiresClientAction)
22
+ id: event.id || generateEventId(),
23
+ type: event.type.toLowerCase(),
24
+ timestamp: event.timestamp || Date.now(),
25
+ entities: event.entities || {},
26
+ data: event.data,
27
+ tags: event.tags,
28
+ priority: event.priority,
29
+ narrate: event.narrate
30
+ };
31
+ return normalized;
32
+ }
33
+ /**
34
+ * Event enrichment pipeline - adds additional metadata
35
+ */
36
+ function enrichEvent(event, context) {
37
+ const enriched = { ...event };
38
+ if (context) {
39
+ // Add turn information to data
40
+ if (context.turn !== undefined && enriched.data && typeof enriched.data === 'object') {
41
+ enriched.data = { ...enriched.data, turn: context.turn };
42
+ }
43
+ // Add player as actor if not specified
44
+ if (context.playerId && !enriched.entities.actor) {
45
+ enriched.entities = { ...enriched.entities, actor: context.playerId };
46
+ }
47
+ // Add location if not specified
48
+ if (context.locationId && !enriched.entities.location) {
49
+ enriched.entities = { ...enriched.entities, location: context.locationId };
50
+ }
51
+ }
52
+ // Add default tags based on event type
53
+ if (!enriched.tags) {
54
+ enriched.tags = [];
55
+ }
56
+ // Add category tags
57
+ if (enriched.type.startsWith('action.') && !enriched.tags.includes('action')) {
58
+ enriched.tags = [...enriched.tags, 'action'];
59
+ }
60
+ else if (enriched.type.startsWith('system.') && !enriched.tags.includes('system')) {
61
+ enriched.tags = [...enriched.tags, 'system'];
62
+ }
63
+ else if (enriched.type.startsWith('game.') && !enriched.tags.includes('game')) {
64
+ enriched.tags = [...enriched.tags, 'game'];
65
+ }
66
+ return enriched;
67
+ }
68
+ /**
69
+ * Process an event through the pipeline.
70
+ *
71
+ * Pipeline stages:
72
+ * 1. Normalization (ensure required fields, lowercase type)
73
+ * 2. Enrichment (add turn info, default entities)
74
+ */
75
+ function processEvent(event, context) {
76
+ const normalized = normalizeEvent(event);
77
+ const enriched = enrichEvent(normalized, context);
78
+ return enriched;
79
+ }
80
+ /**
81
+ * Convert a SemanticEvent to a SequencedEvent
82
+ */
83
+ function toSequencedEvent(event, turn, sequence) {
84
+ const processed = processEvent(event, { turn });
85
+ return {
86
+ type: processed.type,
87
+ data: processed.data,
88
+ sequence,
89
+ timestamp: new Date(processed.timestamp),
90
+ turn,
91
+ scope: determineScope(processed),
92
+ source: processed.id
93
+ };
94
+ }
95
+ /**
96
+ * Generate a unique event ID
97
+ */
98
+ function generateEventId() {
99
+ return `event-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
100
+ }
101
+ /**
102
+ * Determine the scope of an event
103
+ */
104
+ function determineScope(event) {
105
+ if (event.type.startsWith('platform.')) {
106
+ return 'system';
107
+ }
108
+ if (event.type === 'action.error') {
109
+ return 'turn';
110
+ }
111
+ return 'turn';
112
+ }
113
+ /**
114
+ * Convert a SequencedEvent back to a SemanticEvent
115
+ * Preserves all original properties (including requiresClientAction for platform events)
116
+ */
117
+ function toSemanticEvent(event) {
118
+ return {
119
+ ...event, // Preserve all original properties (e.g., requiresClientAction, payload)
120
+ id: event.source || `${event.turn}-${event.sequence}`,
121
+ type: event.type,
122
+ timestamp: event.timestamp.getTime(),
123
+ data: event.data,
124
+ entities: event.entities || {}
125
+ };
126
+ }
127
+ //# sourceMappingURL=event-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-adapter.js","sourceRoot":"","sources":["../src/event-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Event Sequencer - Manages event ordering within turns
3
+ *
4
+ * Ensures all events have proper sequence numbers for ordering
5
+ * and grouping within a turn.
6
+ */
7
+ import { GameEvent, SequencedEvent } from './types';
8
+ /**
9
+ * Event sequencer class
10
+ */
11
+ declare class EventSequencer {
12
+ private counter;
13
+ /**
14
+ * Get next sequence number
15
+ */
16
+ next(): number;
17
+ /**
18
+ * Reset turn counter (optional, for testing)
19
+ */
20
+ resetTurn(turn: number): void;
21
+ /**
22
+ * Sequence a single event
23
+ */
24
+ sequence(event: GameEvent, turn: number): SequencedEvent;
25
+ /**
26
+ * Sequence multiple events
27
+ */
28
+ sequenceAll(events: GameEvent[], turn: number): SequencedEvent[];
29
+ }
30
+ /**
31
+ * Event sequence utilities
32
+ */
33
+ export declare class EventSequenceUtils {
34
+ /**
35
+ * Sort events by sequence number
36
+ */
37
+ static sort(events: SequencedEvent[]): SequencedEvent[];
38
+ /**
39
+ * Filter events by type
40
+ */
41
+ static filterByType(events: SequencedEvent[], type: string): SequencedEvent[];
42
+ /**
43
+ * Filter events by turn
44
+ */
45
+ static filterByTurn(events: SequencedEvent[], turn: number): SequencedEvent[];
46
+ /**
47
+ * Filter events by scope
48
+ */
49
+ static filterByScope(events: SequencedEvent[], scope: SequencedEvent['scope']): SequencedEvent[];
50
+ /**
51
+ * Group events by type
52
+ */
53
+ static groupByType(events: SequencedEvent[]): Record<string, SequencedEvent[]>;
54
+ /**
55
+ * Group events by turn
56
+ */
57
+ static groupByTurn(events: SequencedEvent[]): Record<number, SequencedEvent[]>;
58
+ /**
59
+ * Get latest event by type
60
+ */
61
+ static getLatestByType(events: SequencedEvent[], type: string): SequencedEvent | undefined;
62
+ /**
63
+ * Count events by type
64
+ */
65
+ static countByType(events: SequencedEvent[]): Record<string, number>;
66
+ /**
67
+ * Get events in sequence range
68
+ */
69
+ static getInRange(events: SequencedEvent[], start: number, end: number, inclusive?: boolean): SequencedEvent[];
70
+ }
71
+ export declare const eventSequencer: EventSequencer;
72
+ export {};
73
+ //# sourceMappingURL=event-sequencer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-sequencer.d.ts","sourceRoot":"","sources":["../src/event-sequencer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAEpD;;GAEG;AACH,cAAM,cAAc;IAClB,OAAO,CAAC,OAAO,CAAsB;IAErC;;OAEG;IACH,IAAI,IAAI,MAAM;IAId;;OAEG;IACH,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI7B;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,cAAc;IAUxD;;OAEG;IACH,WAAW,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,cAAc,EAAE;CAGjE;AAED;;GAEG;AACH,qBAAa,kBAAkB;IAC7B;;OAEG;IACH,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,cAAc,EAAE;IAIvD;;OAEG;IACH,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,cAAc,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,cAAc,EAAE;IAI7E;;OAEG;IACH,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,cAAc,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,cAAc,EAAE;IAI7E;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,MAAM,EAAE,cAAc,EAAE,EAAE,KAAK,EAAE,cAAc,CAAC,OAAO,CAAC,GAAG,cAAc,EAAE;IAIhG;;OAEG;IACH,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,cAAc,EAAE,CAAC;IAa9E;;OAEG;IACH,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,cAAc,EAAE,CAAC;IAa9E;;OAEG;IACH,MAAM,CAAC,eAAe,CAAC,MAAM,EAAE,cAAc,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAS1F;;OAEG;IACH,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAUpE;;OAEG;IACH,MAAM,CAAC,UAAU,CACf,MAAM,EAAE,cAAc,EAAE,EACxB,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,EACX,SAAS,GAAE,OAAc,GACxB,cAAc,EAAE;CAOpB;AAGD,eAAO,MAAM,cAAc,gBAAuB,CAAC"}