@sharpee/if-domain 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 (86) hide show
  1. package/README.md +71 -0
  2. package/dist/changes.d.ts +8 -0
  3. package/dist/changes.d.ts.map +1 -0
  4. package/dist/changes.js +6 -0
  5. package/dist/changes.js.map +1 -0
  6. package/dist/contracts.d.ts +270 -0
  7. package/dist/contracts.d.ts.map +1 -0
  8. package/dist/contracts.js +6 -0
  9. package/dist/contracts.js.map +1 -0
  10. package/dist/events.d.ts +124 -0
  11. package/dist/events.d.ts.map +1 -0
  12. package/dist/events.js +123 -0
  13. package/dist/events.js.map +1 -0
  14. package/dist/grammar/grammar-builder.d.ts +507 -0
  15. package/dist/grammar/grammar-builder.d.ts.map +1 -0
  16. package/dist/grammar/grammar-builder.js +47 -0
  17. package/dist/grammar/grammar-builder.js.map +1 -0
  18. package/dist/grammar/grammar-engine.d.ts +65 -0
  19. package/dist/grammar/grammar-engine.d.ts.map +1 -0
  20. package/dist/grammar/grammar-engine.js +370 -0
  21. package/dist/grammar/grammar-engine.js.map +1 -0
  22. package/dist/grammar/index.d.ts +10 -0
  23. package/dist/grammar/index.d.ts.map +1 -0
  24. package/dist/grammar/index.js +26 -0
  25. package/dist/grammar/index.js.map +1 -0
  26. package/dist/grammar/pattern-compiler.d.ts +38 -0
  27. package/dist/grammar/pattern-compiler.d.ts.map +1 -0
  28. package/dist/grammar/pattern-compiler.js +22 -0
  29. package/dist/grammar/pattern-compiler.js.map +1 -0
  30. package/dist/grammar/scope-builder.d.ts +26 -0
  31. package/dist/grammar/scope-builder.d.ts.map +1 -0
  32. package/dist/grammar/scope-builder.js +67 -0
  33. package/dist/grammar/scope-builder.js.map +1 -0
  34. package/dist/grammar/vocabulary-provider.d.ts +163 -0
  35. package/dist/grammar/vocabulary-provider.d.ts.map +1 -0
  36. package/dist/grammar/vocabulary-provider.js +89 -0
  37. package/dist/grammar/vocabulary-provider.js.map +1 -0
  38. package/dist/index.d.ts +16 -0
  39. package/dist/index.d.ts.map +1 -0
  40. package/dist/index.js +40 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/language-provider.d.ts +106 -0
  43. package/dist/language-provider.d.ts.map +1 -0
  44. package/dist/language-provider.js +14 -0
  45. package/dist/language-provider.js.map +1 -0
  46. package/dist/parser-contracts/index.d.ts +10 -0
  47. package/dist/parser-contracts/index.d.ts.map +1 -0
  48. package/dist/parser-contracts/index.js +26 -0
  49. package/dist/parser-contracts/index.js.map +1 -0
  50. package/dist/parser-contracts/parser-factory.d.ts +46 -0
  51. package/dist/parser-contracts/parser-factory.d.ts.map +1 -0
  52. package/dist/parser-contracts/parser-factory.js +78 -0
  53. package/dist/parser-contracts/parser-factory.js.map +1 -0
  54. package/dist/parser-contracts/parser-internals.d.ts +125 -0
  55. package/dist/parser-contracts/parser-internals.d.ts.map +1 -0
  56. package/dist/parser-contracts/parser-internals.js +26 -0
  57. package/dist/parser-contracts/parser-internals.js.map +1 -0
  58. package/dist/parser-contracts/parser-types.d.ts +128 -0
  59. package/dist/parser-contracts/parser-types.d.ts.map +1 -0
  60. package/dist/parser-contracts/parser-types.js +9 -0
  61. package/dist/parser-contracts/parser-types.js.map +1 -0
  62. package/dist/parser-language-provider.d.ts +158 -0
  63. package/dist/parser-language-provider.d.ts.map +1 -0
  64. package/dist/parser-language-provider.js +10 -0
  65. package/dist/parser-language-provider.js.map +1 -0
  66. package/dist/sequencing.d.ts +53 -0
  67. package/dist/sequencing.d.ts.map +1 -0
  68. package/dist/sequencing.js +6 -0
  69. package/dist/sequencing.js.map +1 -0
  70. package/dist/vocabulary-contracts/index.d.ts +7 -0
  71. package/dist/vocabulary-contracts/index.d.ts.map +1 -0
  72. package/dist/vocabulary-contracts/index.js +23 -0
  73. package/dist/vocabulary-contracts/index.js.map +1 -0
  74. package/dist/vocabulary-contracts/vocabulary-adapters.d.ts +19 -0
  75. package/dist/vocabulary-contracts/vocabulary-adapters.d.ts.map +1 -0
  76. package/dist/vocabulary-contracts/vocabulary-adapters.js +73 -0
  77. package/dist/vocabulary-contracts/vocabulary-adapters.js.map +1 -0
  78. package/dist/vocabulary-contracts/vocabulary-registry.d.ts +98 -0
  79. package/dist/vocabulary-contracts/vocabulary-registry.d.ts.map +1 -0
  80. package/dist/vocabulary-contracts/vocabulary-registry.js +383 -0
  81. package/dist/vocabulary-contracts/vocabulary-registry.js.map +1 -0
  82. package/dist/vocabulary-contracts/vocabulary-types.d.ts +240 -0
  83. package/dist/vocabulary-contracts/vocabulary-types.d.ts.map +1 -0
  84. package/dist/vocabulary-contracts/vocabulary-types.js +64 -0
  85. package/dist/vocabulary-contracts/vocabulary-types.js.map +1 -0
  86. package/package.json +56 -0
package/README.md ADDED
@@ -0,0 +1,71 @@
1
+ # @sharpee/if-domain
2
+
3
+ Core domain model and contracts for the Sharpee Interactive Fiction Platform.
4
+
5
+ ## Overview
6
+
7
+ This package contains the shared domain types, events, and contracts that define the Interactive Fiction domain model. It serves as the single source of truth for domain concepts used across the Sharpee platform.
8
+
9
+ ## Contents
10
+
11
+ ### Events (`events.ts`)
12
+ - `IFEvents` - Standard interactive fiction event constants
13
+ - `IFEventType` - Type-safe event type
14
+ - `IFEventCategory` - Event categorization for filtering and handling
15
+
16
+ ### Contracts (`contracts.ts`)
17
+ - `EventHandler` - Function type for handling events
18
+ - `EventValidator` - Function type for validating events
19
+ - `EventPreviewer` - Function type for previewing event effects
20
+ - `WorldChange` - Interface for world state changes
21
+ - `ProcessedEvents` - Result of event processing
22
+ - `ProcessorOptions` - Event processing configuration
23
+
24
+ ### Changes (`changes.ts`)
25
+ - `WorldChangeType` - Types of world state changes
26
+ - `ContentsOptions` - Options for querying entity contents
27
+ - `FindOptions` - Options for finding entities
28
+ - `WorldConfig` - World behavior configuration
29
+ - `WorldState` - World state storage interface
30
+
31
+ ### Sequencing (`sequencing.ts`)
32
+ - `TurnPhase` - Phases of turn execution
33
+ - `EventSequence` - Sequencing information for events
34
+ - `SequencedEvent` - Event with sequence information
35
+ - `EventSequencer` - Interface for event sequencing
36
+
37
+ ## Usage
38
+
39
+ ```typescript
40
+ import { IFEvents, EventHandler, WorldChange } from '@sharpee/if-domain';
41
+
42
+ // Use event constants
43
+ const moveEvent = {
44
+ type: IFEvents.ACTOR_MOVED,
45
+ // ...
46
+ };
47
+
48
+ // Implement event handlers
49
+ const handleMove: EventHandler = (event, world) => {
50
+ // Handle the event
51
+ };
52
+ ```
53
+
54
+ ## Design Principles
55
+
56
+ 1. **Domain-Driven Design**: All types represent domain concepts, not technical implementations
57
+ 2. **Single Source of Truth**: Event constants and core types defined once
58
+ 3. **No Implementation**: Pure type definitions with no runtime code (except constants)
59
+ 4. **Minimal Dependencies**: Only depends on @sharpee/core for base types
60
+
61
+ ## Dependencies
62
+
63
+ - `@sharpee/core` - Core semantic event types
64
+
65
+ ## Build Order
66
+
67
+ This package must be built after `core` but before:
68
+ - `world-model`
69
+ - `event-processor`
70
+ - `engine`
71
+ - `stdlib`
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Domain types for world state changes
3
+ */
4
+ /**
5
+ * Types of changes that can occur in the world
6
+ */
7
+ export type WorldChangeType = 'move' | 'create' | 'delete' | 'modify' | 'relate' | 'unrelate';
8
+ //# sourceMappingURL=changes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"changes.d.ts","sourceRoot":"","sources":["../src/changes.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,CAAC"}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ /**
3
+ * Domain types for world state changes
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ //# sourceMappingURL=changes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"changes.js","sourceRoot":"","sources":["../src/changes.ts"],"names":[],"mappings":";AAAA;;GAEG"}
@@ -0,0 +1,270 @@
1
+ /**
2
+ * Domain contracts for world state changes and event processing
3
+ */
4
+ import { ISemanticEvent, IEntity } from '@sharpee/core';
5
+ /**
6
+ * Represents a change to the world state
7
+ */
8
+ export interface WorldChange {
9
+ type: 'move' | 'create' | 'delete' | 'modify' | 'relate' | 'unrelate';
10
+ entityId: string;
11
+ field?: string;
12
+ oldValue?: unknown;
13
+ newValue?: unknown;
14
+ details?: Record<string, unknown>;
15
+ }
16
+ /**
17
+ * Configuration for world model behavior
18
+ */
19
+ export interface WorldConfig {
20
+ enableSpatialIndex?: boolean;
21
+ maxDepth?: number;
22
+ strictMode?: boolean;
23
+ }
24
+ /**
25
+ * World state storage
26
+ */
27
+ export interface WorldState {
28
+ [key: string]: any;
29
+ }
30
+ /**
31
+ * Options for finding entities
32
+ */
33
+ export interface FindOptions {
34
+ includeScenery?: boolean;
35
+ includeInvisible?: boolean;
36
+ maxDepth?: number;
37
+ }
38
+ /**
39
+ * Options for getting contents
40
+ */
41
+ export interface ContentsOptions {
42
+ recursive?: boolean;
43
+ includeWorn?: boolean;
44
+ visibleOnly?: boolean;
45
+ }
46
+ /**
47
+ * Result of processing events
48
+ */
49
+ export interface ProcessedEvents {
50
+ /**
51
+ * Events that were successfully applied
52
+ */
53
+ applied: ISemanticEvent[];
54
+ /**
55
+ * Events that failed validation
56
+ */
57
+ failed: Array<{
58
+ event: ISemanticEvent;
59
+ reason: string;
60
+ }>;
61
+ /**
62
+ * World changes that occurred
63
+ */
64
+ changes: WorldChange[];
65
+ /**
66
+ * Events generated as reactions to the processed events
67
+ */
68
+ reactions: ISemanticEvent[];
69
+ }
70
+ /**
71
+ * Options for event processing
72
+ */
73
+ export interface ProcessorOptions {
74
+ /**
75
+ * Whether to validate events before applying them
76
+ */
77
+ validate?: boolean;
78
+ /**
79
+ * Whether to preview changes before applying
80
+ */
81
+ preview?: boolean;
82
+ /**
83
+ * Maximum depth for reaction processing
84
+ */
85
+ maxReactionDepth?: number;
86
+ }
87
+ /**
88
+ * Simple command input for actions
89
+ *
90
+ * This is what actions receive - no parser internals, just the essentials.
91
+ * The rich parsing data stays in world-model where it belongs.
92
+ */
93
+ export interface CommandInput {
94
+ /** The action being executed */
95
+ actionId: string;
96
+ /** Direct object if present */
97
+ directObject?: EntityReference;
98
+ /** Indirect object if present */
99
+ indirectObject?: EntityReference;
100
+ /** Preposition used (if any) - raw text for backward compatibility */
101
+ preposition?: string;
102
+ /** Semantic properties derived from grammar */
103
+ semantics?: CommandSemantics;
104
+ /** Original input text for reference */
105
+ inputText: string;
106
+ }
107
+ /**
108
+ * Semantic properties derived from grammar rules
109
+ *
110
+ * These replace the need for actions to inspect verb.text, preposition variations,
111
+ * or modify parsed commands. The grammar rules provide normalized semantic meaning.
112
+ */
113
+ export interface CommandSemantics {
114
+ /** How the action should be performed */
115
+ manner?: 'normal' | 'careful' | 'careless' | 'forceful' | 'stealthy' | 'quick';
116
+ /** Spatial relationship (normalized from preposition variations) */
117
+ spatialRelation?: 'in' | 'on' | 'under' | 'behind' | 'beside' | 'above' | 'below';
118
+ /** Movement direction (normalized from direction variations) */
119
+ direction?: 'north' | 'south' | 'east' | 'west' | 'up' | 'down' | 'northeast' | 'northwest' | 'southeast' | 'southwest' | 'in' | 'out';
120
+ /** Whether a preposition was implicit in the grammar */
121
+ implicitPreposition?: boolean;
122
+ /** Whether a direction was implicit */
123
+ implicitDirection?: boolean;
124
+ /** Action-specific semantics */
125
+ custom?: Record<string, any>;
126
+ }
127
+ /**
128
+ * Reference to an entity in a command
129
+ */
130
+ export interface EntityReference {
131
+ /** The resolved entity */
132
+ entity: IEntity;
133
+ /** The text that matched this entity */
134
+ matchedText: string;
135
+ /** How the entity was referenced */
136
+ referenceType?: 'name' | 'pronoun' | 'definite' | 'indefinite';
137
+ }
138
+ /**
139
+ * Validation result from an action
140
+ */
141
+ export interface ValidationResult {
142
+ /** Whether the action can proceed */
143
+ valid: boolean;
144
+ /** Error code if validation failed */
145
+ error?: string;
146
+ /** Parameters for error message formatting */
147
+ params?: Record<string, any>;
148
+ }
149
+ /**
150
+ * Context provided to actions
151
+ *
152
+ * This is the contract for what actions can access.
153
+ * No world-model internals, no parser details.
154
+ */
155
+ export interface IActionContext {
156
+ /** The player entity */
157
+ readonly player: IEntity;
158
+ /** The player's current location */
159
+ readonly currentLocation: IEntity;
160
+ /** The command being executed */
161
+ readonly command: CommandInput;
162
+ /** The action being executed */
163
+ readonly action: IAction;
164
+ /**
165
+ * Check if an entity is visible to the player
166
+ */
167
+ canSee(entity: IEntity): boolean;
168
+ /**
169
+ * Check if an entity is reachable by the player
170
+ */
171
+ canReach(entity: IEntity): boolean;
172
+ /**
173
+ * Check if an entity can be taken by the player
174
+ */
175
+ canTake(entity: IEntity): boolean;
176
+ /**
177
+ * Check if an entity is in scope for the player
178
+ */
179
+ isInScope(entity: IEntity): boolean;
180
+ /**
181
+ * Get all visible entities
182
+ */
183
+ getVisible(): IEntity[];
184
+ /**
185
+ * Get all entities in scope
186
+ */
187
+ getInScope(): IEntity[];
188
+ /**
189
+ * Get an entity by ID
190
+ */
191
+ getEntity(entityId: string): IEntity | undefined;
192
+ /**
193
+ * Get an entity's location
194
+ */
195
+ getEntityLocation(entityId: string): string | undefined;
196
+ /**
197
+ * Get entities contained within an entity
198
+ */
199
+ getEntityContents(entityId: string): IEntity[];
200
+ /**
201
+ * Get the room containing an entity
202
+ */
203
+ getContainingRoom(entityId: string): IEntity | undefined;
204
+ /**
205
+ * Get a world capability (scoring, etc.)
206
+ */
207
+ getWorldCapability(name: string): any;
208
+ /**
209
+ * Move an entity to a new location
210
+ */
211
+ moveEntity(entityId: string, newLocationId: string): boolean;
212
+ /**
213
+ * Create an event
214
+ */
215
+ event(type: string, data: any): ISemanticEvent;
216
+ }
217
+ /**
218
+ * Action contract
219
+ *
220
+ * Actions implement game verbs. They validate and execute commands.
221
+ */
222
+ export interface IAction {
223
+ /** Unique identifier */
224
+ id: string;
225
+ /** Validate if the action can be executed */
226
+ validate(context: IActionContext): ValidationResult;
227
+ /** Execute the action and return events */
228
+ execute(context: IActionContext): ISemanticEvent[];
229
+ /** Required message IDs for this action */
230
+ requiredMessages?: string[];
231
+ /** Optional description for help/documentation */
232
+ descriptionMessageId?: string;
233
+ /** Optional examples for help/documentation */
234
+ examplesMessageId?: string;
235
+ }
236
+ /**
237
+ * Action registry contract
238
+ */
239
+ export interface IActionRegistry {
240
+ /** Register an action */
241
+ register(action: IAction): void;
242
+ /** Get an action by ID */
243
+ get(actionId: string): IAction | undefined;
244
+ /** Get all registered actions */
245
+ getAll(): IAction[];
246
+ /** Check if an action exists */
247
+ has(actionId: string): boolean;
248
+ }
249
+ /**
250
+ * Scope levels for entity visibility and accessibility
251
+ */
252
+ export type ScopeLevel = 'carried' | 'reachable' | 'visible' | 'audible' | 'detectable' | 'out_of_scope';
253
+ /**
254
+ * Basic scope resolver interface for actions
255
+ */
256
+ export interface IScopeResolver {
257
+ /**
258
+ * Get the highest level of scope for a target entity
259
+ */
260
+ getScope(actor: IEntity, target: IEntity): ScopeLevel;
261
+ /**
262
+ * Check if actor can see the target
263
+ */
264
+ canSee(actor: IEntity, target: IEntity): boolean;
265
+ /**
266
+ * Check if actor can physically reach the target
267
+ */
268
+ canReach(actor: IEntity, target: IEntity): boolean;
269
+ }
270
+ //# sourceMappingURL=contracts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contracts.d.ts","sourceRoot":"","sources":["../src/contracts.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAExD;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,CAAC;IACtE,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B;;OAEG;IACH,OAAO,EAAE,cAAc,EAAE,CAAC;IAE1B;;OAEG;IACH,MAAM,EAAE,KAAK,CAAC;QACZ,KAAK,EAAE,cAAc,CAAC;QACtB,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC,CAAC;IAEH;;OAEG;IACH,OAAO,EAAE,WAAW,EAAE,CAAC;IAEvB;;OAEG;IACH,SAAS,EAAE,cAAc,EAAE,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB;;OAEG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAMD;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC3B,gCAAgC;IAChC,QAAQ,EAAE,MAAM,CAAC;IAEjB,+BAA+B;IAC/B,YAAY,CAAC,EAAE,eAAe,CAAC;IAE/B,iCAAiC;IACjC,cAAc,CAAC,EAAE,eAAe,CAAC;IAEjC,sEAAsE;IACtE,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,+CAA+C;IAC/C,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAE7B,wCAAwC;IACxC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;GAKG;AACH,MAAM,WAAW,gBAAgB;IAC/B,yCAAyC;IACzC,MAAM,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,UAAU,GAAG,UAAU,GAAG,UAAU,GAAG,OAAO,CAAC;IAE/E,oEAAoE;IACpE,eAAe,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,OAAO,CAAC;IAElF,gEAAgE;IAChE,SAAS,CAAC,EAAE,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,MAAM,GACnD,WAAW,GAAG,WAAW,GAAG,WAAW,GAAG,WAAW,GACrD,IAAI,GAAG,KAAK,CAAC;IAEzB,wDAAwD;IACxD,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAE9B,uCAAuC;IACvC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAE5B,gCAAgC;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,0BAA0B;IAC1B,MAAM,EAAE,OAAO,CAAC;IAEhB,wCAAwC;IACxC,WAAW,EAAE,MAAM,CAAC;IAEpB,oCAAoC;IACpC,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,UAAU,GAAG,YAAY,CAAC;CAChE;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,qCAAqC;IACrC,KAAK,EAAE,OAAO,CAAC;IAEf,sCAAsC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,8CAA8C;IAC9C,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC9B;AAED;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC7B,wBAAwB;IACxB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IAEzB,oCAAoC;IACpC,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;IAElC,iCAAiC;IACjC,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC;IAE/B,gCAAgC;IAChC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IAEzB;;OAEG;IACH,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC;IAEjC;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC;IAEnC;;OAEG;IACH,OAAO,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC;IAElC;;OAEG;IACH,SAAS,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC;IAEpC;;OAEG;IACH,UAAU,IAAI,OAAO,EAAE,CAAC;IAExB;;OAEG;IACH,UAAU,IAAI,OAAO,EAAE,CAAC;IAExB;;OAEG;IACH,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;IAEjD;;OAEG;IACH,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IAExD;;OAEG;IACH,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,EAAE,CAAC;IAE/C;;OAEG;IACH,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;IAEzD;;OAEG;IACH,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAAC;IAEtC;;OAEG;IACH,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC;IAE7D;;OAEG;IACH,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,cAAc,CAAC;CAChD;AAED;;;;GAIG;AACH,MAAM,WAAW,OAAO;IACtB,wBAAwB;IACxB,EAAE,EAAE,MAAM,CAAC;IAEX,6CAA6C;IAC7C,QAAQ,CAAC,OAAO,EAAE,cAAc,GAAG,gBAAgB,CAAC;IAEpD,2CAA2C;IAC3C,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,cAAc,EAAE,CAAC;IAEnD,2CAA2C;IAC3C,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAE5B,kDAAkD;IAClD,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAE9B,+CAA+C;IAC/C,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,yBAAyB;IACzB,QAAQ,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC;IAEhC,0BAA0B;IAC1B,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;IAE3C,iCAAiC;IACjC,MAAM,IAAI,OAAO,EAAE,CAAC;IAEpB,gCAAgC;IAChC,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;CAChC;AAMD;;GAEG;AACH,MAAM,MAAM,UAAU,GAClB,SAAS,GACT,WAAW,GACX,SAAS,GACT,SAAS,GACT,YAAY,GACZ,cAAc,CAAA;AAElB;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAG,UAAU,CAAC;IAEtD;;OAEG;IACH,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC;IAEjD;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC;CACpD"}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ /**
3
+ * Domain contracts for world state changes and event processing
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ //# sourceMappingURL=contracts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contracts.js","sourceRoot":"","sources":["../src/contracts.ts"],"names":[],"mappings":";AAAA;;GAEG"}
@@ -0,0 +1,124 @@
1
+ /**
2
+ * Standard Interactive Fiction events.
3
+ *
4
+ * These are the core events that can occur in the IF world model.
5
+ * Extensions can add their own events using namespaced identifiers.
6
+ */
7
+ export declare const IFEvents: {
8
+ readonly TAKEN: "taken";
9
+ readonly DROPPED: "dropped";
10
+ readonly MOVED: "moved";
11
+ readonly EXAMINED: "examined";
12
+ readonly PUT_IN: "put_in";
13
+ readonly PUT_ON: "put_on";
14
+ readonly REMOVED_FROM: "removed_from";
15
+ readonly ITEM_PUT_ON: "item_put_on";
16
+ readonly ITEM_REMOVED_FROM: "item_removed_from";
17
+ readonly CONTAINER_EMPTIED: "container_emptied";
18
+ readonly CONTAINER_NOT_OPEN: "container_not_open";
19
+ readonly NOT_A_CONTAINER: "not_a_container";
20
+ readonly NOT_A_SUPPORTER: "not_a_supporter";
21
+ readonly DOESNT_FIT: "doesnt_fit";
22
+ readonly OPENED: "opened";
23
+ readonly CLOSED: "closed";
24
+ readonly NOT_OPENABLE: "not_openable";
25
+ readonly LOCKED: "locked";
26
+ readonly UNLOCKED: "unlocked";
27
+ readonly CONTAINER_LOCKED: "container_locked";
28
+ readonly CONTAINER_UNLOCKED: "container_unlocked";
29
+ readonly ALREADY_LOCKED: "already_locked";
30
+ readonly ALREADY_UNLOCKED: "already_unlocked";
31
+ readonly UNLOCK_FAILED: "unlock_failed";
32
+ readonly NOT_LOCKABLE: "not_lockable";
33
+ readonly SWITCHED_ON: "switched_on";
34
+ readonly SWITCHED_OFF: "switched_off";
35
+ readonly DEVICE_SWITCHED_ON: "device_switched_on";
36
+ readonly DEVICE_SWITCHED_OFF: "device_switched_off";
37
+ readonly DEVICE_ACTIVATED: "device_activated";
38
+ readonly WORN: "worn";
39
+ readonly REMOVED: "removed";
40
+ readonly EATEN: "eaten";
41
+ readonly DRUNK: "drunk";
42
+ readonly ITEM_EATEN: "item_eaten";
43
+ readonly ITEM_DRUNK: "item_drunk";
44
+ readonly ITEM_DESTROYED: "item_destroyed";
45
+ readonly ACTOR_MOVED: "actor_moved";
46
+ readonly ACTOR_ENTERED: "actor_entered";
47
+ readonly ACTOR_EXITED: "actor_exited";
48
+ readonly MOVEMENT_BLOCKED: "movement_blocked";
49
+ readonly ENTERED: "entered";
50
+ readonly EXITED: "exited";
51
+ readonly EVACUATED: "evacuated";
52
+ readonly CLIMBED: "climbed";
53
+ readonly ROOM_ENTERED: "room_entered";
54
+ readonly ROOM_EXITED: "room_exited";
55
+ readonly ROOM_DESCRIBED: "room_described";
56
+ readonly ROOM_FIRST_ENTERED: "room_first_entered";
57
+ readonly ROOM_ILLUMINATED: "room_illuminated";
58
+ readonly ROOM_DARKENED: "room_darkened";
59
+ readonly NEW_EXIT_REVEALED: "new_exit_revealed";
60
+ readonly LIGHT_CHANGED: "light_changed";
61
+ readonly LOCATION_ILLUMINATED: "location_illuminated";
62
+ readonly LOCATION_DARKENED: "location_darkened";
63
+ readonly FUEL_DEPLETED: "fuel_depleted";
64
+ readonly FUEL_LOW: "fuel_low";
65
+ readonly REFUELED: "refueled";
66
+ readonly READ: "read";
67
+ readonly SEARCHED: "searched";
68
+ readonly LISTENED: "listened";
69
+ readonly SMELLED: "smelled";
70
+ readonly TOUCHED: "touched";
71
+ readonly GIVEN: "given";
72
+ readonly SHOWN: "shown";
73
+ readonly THROWN: "thrown";
74
+ readonly PUSHED: "pushed";
75
+ readonly PULLED: "pulled";
76
+ readonly TURNED: "turned";
77
+ readonly USED: "used";
78
+ readonly CUSTOM_MESSAGE: "custom_message";
79
+ readonly VISIBILITY_CHANGED: "visibility_changed";
80
+ readonly ACTION_PREVENTED: "action_prevented";
81
+ readonly ACTION_FAILED: "action_failed";
82
+ readonly ACTION_SUCCEEDED: "action_succeeded";
83
+ readonly WAITED: "waited";
84
+ readonly SCORE_DISPLAYED: "score_displayed";
85
+ readonly HELP_DISPLAYED: "help_displayed";
86
+ readonly ABOUT_DISPLAYED: "about_displayed";
87
+ readonly SCORE_GAINED: "if.event.score_gained";
88
+ readonly SCORE_LOST: "if.event.score_lost";
89
+ };
90
+ export type IFEventType = typeof IFEvents[keyof typeof IFEvents];
91
+ /**
92
+ * Event categories for filtering and handling
93
+ */
94
+ export declare const IFEventCategory: {
95
+ readonly MANIPULATION: "manipulation";
96
+ readonly MOVEMENT: "movement";
97
+ readonly STATE_CHANGE: "state_change";
98
+ readonly PERCEPTION: "perception";
99
+ readonly META: "meta";
100
+ };
101
+ export type IFEventCategoryType = typeof IFEventCategory[keyof typeof IFEventCategory];
102
+ /**
103
+ * Event processor wiring types (ADR-086)
104
+ *
105
+ * These types allow WorldModel to wire its event handlers to the engine's
106
+ * EventProcessor without creating a circular dependency.
107
+ */
108
+ import type { ISemanticEvent } from '@sharpee/core';
109
+ /**
110
+ * Callback for registering a handler with the event processor.
111
+ * The handler returns an array (Effect[] in practice, but typed loosely to avoid circular deps).
112
+ */
113
+ export type EventProcessorRegisterFn = (eventType: string, handler: (event: ISemanticEvent) => unknown[]) => void;
114
+ /**
115
+ * Interface for wiring WorldModel handlers to EventProcessor.
116
+ * WorldModel receives this during engine initialization.
117
+ */
118
+ export interface IEventProcessorWiring {
119
+ /**
120
+ * Register a handler with the event processor
121
+ */
122
+ registerHandler: EventProcessorRegisterFn;
123
+ }
124
+ //# sourceMappingURL=events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyHX,CAAC;AAEX,MAAM,MAAM,WAAW,GAAG,OAAO,QAAQ,CAAC,MAAM,OAAO,QAAQ,CAAC,CAAC;AAEjE;;GAEG;AACH,eAAO,MAAM,eAAe;;;;;;CAMlB,CAAC;AAEX,MAAM,MAAM,mBAAmB,GAAG,OAAO,eAAe,CAAC,MAAM,OAAO,eAAe,CAAC,CAAC;AAEvF;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEpD;;;GAGG;AACH,MAAM,MAAM,wBAAwB,GAAG,CACrC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,OAAO,EAAE,KAC1C,IAAI,CAAC;AAEV;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC;;OAEG;IACH,eAAe,EAAE,wBAAwB,CAAC;CAC3C"}
package/dist/events.js ADDED
@@ -0,0 +1,123 @@
1
+ "use strict";
2
+ /**
3
+ * Standard Interactive Fiction events.
4
+ *
5
+ * These are the core events that can occur in the IF world model.
6
+ * Extensions can add their own events using namespaced identifiers.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.IFEventCategory = exports.IFEvents = void 0;
10
+ exports.IFEvents = {
11
+ // Core object manipulation
12
+ TAKEN: 'taken',
13
+ DROPPED: 'dropped',
14
+ MOVED: 'moved',
15
+ EXAMINED: 'examined',
16
+ // Container/supporter events
17
+ PUT_IN: 'put_in',
18
+ PUT_ON: 'put_on',
19
+ REMOVED_FROM: 'removed_from',
20
+ ITEM_PUT_ON: 'item_put_on',
21
+ ITEM_REMOVED_FROM: 'item_removed_from',
22
+ CONTAINER_EMPTIED: 'container_emptied',
23
+ CONTAINER_NOT_OPEN: 'container_not_open',
24
+ NOT_A_CONTAINER: 'not_a_container',
25
+ NOT_A_SUPPORTER: 'not_a_supporter',
26
+ DOESNT_FIT: 'doesnt_fit',
27
+ // Openable events
28
+ OPENED: 'opened',
29
+ CLOSED: 'closed',
30
+ NOT_OPENABLE: 'not_openable',
31
+ // Lockable events
32
+ LOCKED: 'locked',
33
+ UNLOCKED: 'unlocked',
34
+ CONTAINER_LOCKED: 'container_locked',
35
+ CONTAINER_UNLOCKED: 'container_unlocked',
36
+ ALREADY_LOCKED: 'already_locked',
37
+ ALREADY_UNLOCKED: 'already_unlocked',
38
+ UNLOCK_FAILED: 'unlock_failed',
39
+ NOT_LOCKABLE: 'not_lockable',
40
+ // Switchable events
41
+ SWITCHED_ON: 'switched_on',
42
+ SWITCHED_OFF: 'switched_off',
43
+ DEVICE_SWITCHED_ON: 'device_switched_on',
44
+ DEVICE_SWITCHED_OFF: 'device_switched_off',
45
+ DEVICE_ACTIVATED: 'device_activated',
46
+ // Wearable events
47
+ WORN: 'worn',
48
+ REMOVED: 'removed',
49
+ // Edible events
50
+ EATEN: 'eaten',
51
+ DRUNK: 'drunk',
52
+ ITEM_EATEN: 'item_eaten',
53
+ ITEM_DRUNK: 'item_drunk',
54
+ ITEM_DESTROYED: 'item_destroyed',
55
+ // Movement events
56
+ ACTOR_MOVED: 'actor_moved',
57
+ ACTOR_ENTERED: 'actor_entered',
58
+ ACTOR_EXITED: 'actor_exited',
59
+ MOVEMENT_BLOCKED: 'movement_blocked',
60
+ // Entry/exit events
61
+ ENTERED: 'entered',
62
+ EXITED: 'exited',
63
+ EVACUATED: 'evacuated',
64
+ CLIMBED: 'climbed',
65
+ // Room events
66
+ ROOM_ENTERED: 'room_entered',
67
+ ROOM_EXITED: 'room_exited',
68
+ ROOM_DESCRIBED: 'room_described',
69
+ ROOM_FIRST_ENTERED: 'room_first_entered',
70
+ ROOM_ILLUMINATED: 'room_illuminated',
71
+ ROOM_DARKENED: 'room_darkened',
72
+ NEW_EXIT_REVEALED: 'new_exit_revealed',
73
+ // Light events
74
+ LIGHT_CHANGED: 'light_changed',
75
+ LOCATION_ILLUMINATED: 'location_illuminated',
76
+ LOCATION_DARKENED: 'location_darkened',
77
+ FUEL_DEPLETED: 'fuel_depleted',
78
+ FUEL_LOW: 'fuel_low',
79
+ REFUELED: 'refueled',
80
+ // Reading events
81
+ READ: 'read',
82
+ // Observation events
83
+ SEARCHED: 'searched',
84
+ LISTENED: 'listened',
85
+ SMELLED: 'smelled',
86
+ TOUCHED: 'touched',
87
+ // Social/interaction events
88
+ GIVEN: 'given',
89
+ SHOWN: 'shown',
90
+ THROWN: 'thrown',
91
+ // Device manipulation events
92
+ PUSHED: 'pushed',
93
+ PULLED: 'pulled',
94
+ TURNED: 'turned',
95
+ USED: 'used',
96
+ // General message events
97
+ CUSTOM_MESSAGE: 'custom_message',
98
+ // Visibility events
99
+ VISIBILITY_CHANGED: 'visibility_changed',
100
+ // Action meta-events
101
+ ACTION_PREVENTED: 'action_prevented',
102
+ ACTION_FAILED: 'action_failed',
103
+ ACTION_SUCCEEDED: 'action_succeeded',
104
+ // Meta action events
105
+ WAITED: 'waited',
106
+ SCORE_DISPLAYED: 'score_displayed',
107
+ HELP_DISPLAYED: 'help_displayed',
108
+ ABOUT_DISPLAYED: 'about_displayed',
109
+ // Scoring events (ADR-085)
110
+ SCORE_GAINED: 'if.event.score_gained',
111
+ SCORE_LOST: 'if.event.score_lost',
112
+ };
113
+ /**
114
+ * Event categories for filtering and handling
115
+ */
116
+ exports.IFEventCategory = {
117
+ MANIPULATION: 'manipulation',
118
+ MOVEMENT: 'movement',
119
+ STATE_CHANGE: 'state_change',
120
+ PERCEPTION: 'perception',
121
+ META: 'meta',
122
+ };
123
+ //# sourceMappingURL=events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"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"}