@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,106 @@
1
+ /**
2
+ * Capability Dispatch Helper for Universal Dispatch
3
+ *
4
+ * Enables capability dispatch for ALL stdlib actions, not just specialized verbs.
5
+ * When an entity's trait declares a capability for an action, the trait's behavior
6
+ * handles the action instead of the stdlib default.
7
+ *
8
+ * This enables patterns like:
9
+ * - Troll blocking: TrollTrait handles 'if.action.going' to block passage
10
+ * - Custom containers: ChestTrait handles 'if.action.opening' for locked chest
11
+ * - Guardian items: AxeTrait handles 'if.action.taking' while troll guards it
12
+ *
13
+ * Resolution modes (ADR-090 extension):
14
+ * - first-wins: First entity with capability determines result
15
+ * - any-blocks: Any entity returning valid: false blocks
16
+ * - all-must-pass: All entities must return valid: true
17
+ * - highest-priority: Only highest priority entity is checked
18
+ */
19
+ import { ISemanticEvent } from '@sharpee/core';
20
+ import { IFEntity, CapabilityBehavior, CapabilitySharedData, ITrait, CapabilityResolution } from '@sharpee/world-model';
21
+ import { ActionContext, ValidationResult } from '@sharpee/stdlib';
22
+ /**
23
+ * A single capability claim from an entity.
24
+ */
25
+ export interface CapabilityClaim {
26
+ /** The entity making the claim */
27
+ entity: IFEntity;
28
+ /** The trait claiming the capability */
29
+ trait: ITrait;
30
+ /** The behavior to use */
31
+ behavior: CapabilityBehavior;
32
+ /** Priority for resolution ordering */
33
+ priority: number;
34
+ /** Resolution override from binding (if any) */
35
+ resolutionOverride?: CapabilityResolution;
36
+ }
37
+ /**
38
+ * Result of checking for capability dispatch.
39
+ */
40
+ export interface CapabilityDispatchCheck {
41
+ /** Whether capability dispatch should be used */
42
+ shouldDispatch: boolean;
43
+ /** The trait claiming the capability (if found) - for single dispatch */
44
+ trait?: ITrait;
45
+ /** The behavior to use (if found) - for single dispatch */
46
+ behavior?: CapabilityBehavior;
47
+ /** The entity with the capability - for single dispatch */
48
+ entity?: IFEntity;
49
+ /** All claims found (for multi-entity resolution) */
50
+ claims?: CapabilityClaim[];
51
+ /** Resolution mode to use */
52
+ resolution?: CapabilityResolution;
53
+ }
54
+ /**
55
+ * Data stored for capability dispatch between phases.
56
+ */
57
+ export interface CapabilityDispatchData {
58
+ trait: ITrait;
59
+ behavior: CapabilityBehavior;
60
+ entityId: string;
61
+ entityName: string;
62
+ sharedData: CapabilitySharedData;
63
+ }
64
+ /**
65
+ * Check if capability dispatch should be used for this action and target.
66
+ *
67
+ * @param actionId - The action being executed
68
+ * @param target - The target entity (directObject) - for backward compatibility
69
+ * @returns Check result with trait and behavior if dispatch should be used
70
+ */
71
+ export declare function checkCapabilityDispatch(actionId: string, target: IFEntity | undefined): CapabilityDispatchCheck;
72
+ /**
73
+ * Check if capability dispatch should be used for this action across multiple entities.
74
+ *
75
+ * Collects all capability claims from the provided entities, sorts by priority,
76
+ * and returns the appropriate dispatch information based on resolution config.
77
+ *
78
+ * @param actionId - The action being executed
79
+ * @param entities - All entities involved in the action (directObject, indirectObject, etc.)
80
+ * @returns Check result with claims and resolution mode
81
+ */
82
+ export declare function checkCapabilityDispatchMulti(actionId: string, entities: (IFEntity | undefined)[]): CapabilityDispatchCheck;
83
+ /**
84
+ * Execute capability dispatch validation phase.
85
+ *
86
+ * Handles resolution modes:
87
+ * - first-wins/highest-priority: Single behavior validates
88
+ * - any-blocks: All behaviors validate, any false blocks
89
+ * - all-must-pass: All behaviors must return true
90
+ *
91
+ * @returns ValidationResult with dispatch data if valid
92
+ */
93
+ export declare function executeCapabilityValidate(check: CapabilityDispatchCheck, context: ActionContext): ValidationResult;
94
+ /**
95
+ * Execute capability dispatch execute phase.
96
+ */
97
+ export declare function executeCapabilityExecute(context: ActionContext): void;
98
+ /**
99
+ * Execute capability dispatch report phase.
100
+ */
101
+ export declare function executeCapabilityReport(context: ActionContext): ISemanticEvent[];
102
+ /**
103
+ * Execute capability dispatch blocked phase.
104
+ */
105
+ export declare function executeCapabilityBlocked(context: ActionContext, result: ValidationResult, actionId: string): ISemanticEvent[];
106
+ //# sourceMappingURL=capability-dispatch-helper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capability-dispatch-helper.d.ts","sourceRoot":"","sources":["../src/capability-dispatch-helper.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EACL,QAAQ,EAKR,kBAAkB,EAClB,oBAAoB,EAEpB,MAAM,EAEN,oBAAoB,EACrB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAU,aAAa,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAE1E;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,kCAAkC;IAClC,MAAM,EAAE,QAAQ,CAAC;IACjB,wCAAwC;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,0BAA0B;IAC1B,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,uCAAuC;IACvC,QAAQ,EAAE,MAAM,CAAC;IACjB,gDAAgD;IAChD,kBAAkB,CAAC,EAAE,oBAAoB,CAAC;CAC3C;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,iDAAiD;IACjD,cAAc,EAAE,OAAO,CAAC;IACxB,yEAAyE;IACzE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,kBAAkB,CAAC;IAC9B,2DAA2D;IAC3D,MAAM,CAAC,EAAE,QAAQ,CAAC;IAClB,qDAAqD;IACrD,MAAM,CAAC,EAAE,eAAe,EAAE,CAAC;IAC3B,6BAA6B;IAC7B,UAAU,CAAC,EAAE,oBAAoB,CAAC;CACnC;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,oBAAoB,CAAC;CAClC;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,QAAQ,GAAG,SAAS,GAC3B,uBAAuB,CAOzB;AAED;;;;;;;;;GASG;AACH,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,CAAC,QAAQ,GAAG,SAAS,CAAC,EAAE,GACjC,uBAAuB,CAmEzB;AAYD;;;;;;;;;GASG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,uBAAuB,EAC9B,OAAO,EAAE,aAAa,GACrB,gBAAgB,CAiGlB;AAuCD;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,aAAa,GACrB,IAAI,CAUN;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,aAAa,GACrB,cAAc,EAAE,CAgBlB;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,aAAa,EACtB,MAAM,EAAE,gBAAgB,EACxB,QAAQ,EAAE,MAAM,GACf,cAAc,EAAE,CAyBlB"}
@@ -0,0 +1,269 @@
1
+ "use strict";
2
+ /**
3
+ * Capability Dispatch Helper for Universal Dispatch
4
+ *
5
+ * Enables capability dispatch for ALL stdlib actions, not just specialized verbs.
6
+ * When an entity's trait declares a capability for an action, the trait's behavior
7
+ * handles the action instead of the stdlib default.
8
+ *
9
+ * This enables patterns like:
10
+ * - Troll blocking: TrollTrait handles 'if.action.going' to block passage
11
+ * - Custom containers: ChestTrait handles 'if.action.opening' for locked chest
12
+ * - Guardian items: AxeTrait handles 'if.action.taking' while troll guards it
13
+ *
14
+ * Resolution modes (ADR-090 extension):
15
+ * - first-wins: First entity with capability determines result
16
+ * - any-blocks: Any entity returning valid: false blocks
17
+ * - all-must-pass: All entities must return valid: true
18
+ * - highest-priority: Only highest priority entity is checked
19
+ */
20
+ Object.defineProperty(exports, "__esModule", { value: true });
21
+ exports.checkCapabilityDispatch = checkCapabilityDispatch;
22
+ exports.checkCapabilityDispatchMulti = checkCapabilityDispatchMulti;
23
+ exports.executeCapabilityValidate = executeCapabilityValidate;
24
+ exports.executeCapabilityExecute = executeCapabilityExecute;
25
+ exports.executeCapabilityReport = executeCapabilityReport;
26
+ exports.executeCapabilityBlocked = executeCapabilityBlocked;
27
+ const world_model_1 = require("@sharpee/world-model");
28
+ /**
29
+ * Check if capability dispatch should be used for this action and target.
30
+ *
31
+ * @param actionId - The action being executed
32
+ * @param target - The target entity (directObject) - for backward compatibility
33
+ * @returns Check result with trait and behavior if dispatch should be used
34
+ */
35
+ function checkCapabilityDispatch(actionId, target) {
36
+ if (!target) {
37
+ return { shouldDispatch: false };
38
+ }
39
+ // Use the multi-entity version with single entity
40
+ return checkCapabilityDispatchMulti(actionId, [target]);
41
+ }
42
+ /**
43
+ * Check if capability dispatch should be used for this action across multiple entities.
44
+ *
45
+ * Collects all capability claims from the provided entities, sorts by priority,
46
+ * and returns the appropriate dispatch information based on resolution config.
47
+ *
48
+ * @param actionId - The action being executed
49
+ * @param entities - All entities involved in the action (directObject, indirectObject, etc.)
50
+ * @returns Check result with claims and resolution mode
51
+ */
52
+ function checkCapabilityDispatchMulti(actionId, entities) {
53
+ const validEntities = entities.filter((e) => e !== undefined);
54
+ if (validEntities.length === 0) {
55
+ return { shouldDispatch: false };
56
+ }
57
+ // Collect all claims
58
+ const claims = [];
59
+ for (const entity of validEntities) {
60
+ const trait = (0, world_model_1.findTraitWithCapability)(entity, actionId);
61
+ if (!trait)
62
+ continue;
63
+ const binding = (0, world_model_1.getBehaviorBinding)(trait, actionId);
64
+ if (!binding) {
65
+ // Trait claims capability but no behavior registered
66
+ console.warn(`Universal dispatch: trait "${trait.type}" claims "${actionId}" ` +
67
+ `but no behavior registered. Falling back to stdlib action.`);
68
+ continue;
69
+ }
70
+ claims.push({
71
+ entity,
72
+ trait,
73
+ behavior: binding.behavior,
74
+ priority: binding.priority,
75
+ resolutionOverride: binding.resolution
76
+ });
77
+ }
78
+ if (claims.length === 0) {
79
+ return { shouldDispatch: false };
80
+ }
81
+ // Sort by priority (highest first)
82
+ claims.sort((a, b) => b.priority - a.priority);
83
+ // Get resolution mode (use first binding override if present, else global config)
84
+ const firstOverride = claims.find(c => c.resolutionOverride)?.resolutionOverride;
85
+ const config = (0, world_model_1.getCapabilityConfig)(actionId);
86
+ const resolution = firstOverride ?? config.resolution;
87
+ // For single claim or first-wins/highest-priority, return simple result
88
+ if (claims.length === 1 || resolution === 'first-wins' || resolution === 'highest-priority') {
89
+ const primary = claims[0];
90
+ return {
91
+ shouldDispatch: true,
92
+ trait: primary.trait,
93
+ behavior: primary.behavior,
94
+ entity: primary.entity,
95
+ claims,
96
+ resolution
97
+ };
98
+ }
99
+ // For any-blocks or all-must-pass, return all claims for aggregate validation
100
+ return {
101
+ shouldDispatch: true,
102
+ trait: claims[0].trait,
103
+ behavior: claims[0].behavior,
104
+ entity: claims[0].entity,
105
+ claims,
106
+ resolution
107
+ };
108
+ }
109
+ /**
110
+ * Convert capability effects to semantic events.
111
+ */
112
+ function effectsToEvents(effects, context) {
113
+ return effects.map(effect => context.event(effect.type, effect.payload));
114
+ }
115
+ /**
116
+ * Execute capability dispatch validation phase.
117
+ *
118
+ * Handles resolution modes:
119
+ * - first-wins/highest-priority: Single behavior validates
120
+ * - any-blocks: All behaviors validate, any false blocks
121
+ * - all-must-pass: All behaviors must return true
122
+ *
123
+ * @returns ValidationResult with dispatch data if valid
124
+ */
125
+ function executeCapabilityValidate(check, context) {
126
+ const { trait, behavior, entity, claims, resolution } = check;
127
+ if (!trait || !behavior || !entity) {
128
+ return { valid: false, error: 'capability_dispatch_error' };
129
+ }
130
+ // Create sharedData for passing data between behavior phases
131
+ const sharedData = {};
132
+ // For first-wins or highest-priority (or single claim), just validate the primary
133
+ if (!claims || claims.length <= 1 || resolution === 'first-wins' || resolution === 'highest-priority') {
134
+ return validateSingleBehavior(entity, trait, behavior, context, sharedData);
135
+ }
136
+ // For any-blocks: validate all, return first failure
137
+ if (resolution === 'any-blocks') {
138
+ for (const claim of claims) {
139
+ const claimSharedData = {};
140
+ const result = claim.behavior.validate(claim.entity, context.world, context.player.id, claimSharedData);
141
+ if (!result.valid) {
142
+ // This claim blocks - use its error
143
+ const data = {
144
+ trait: claim.trait,
145
+ behavior: claim.behavior,
146
+ entityId: claim.entity.id,
147
+ entityName: claim.entity.name,
148
+ sharedData: claimSharedData
149
+ };
150
+ return {
151
+ valid: false,
152
+ error: result.error,
153
+ params: result.params,
154
+ data
155
+ };
156
+ }
157
+ }
158
+ // All passed - use primary for execute/report
159
+ const data = {
160
+ trait,
161
+ behavior,
162
+ entityId: entity.id,
163
+ entityName: entity.name,
164
+ sharedData
165
+ };
166
+ return { valid: true, data };
167
+ }
168
+ // For all-must-pass: same logic as any-blocks (any failure = overall failure)
169
+ if (resolution === 'all-must-pass') {
170
+ for (const claim of claims) {
171
+ const claimSharedData = {};
172
+ const result = claim.behavior.validate(claim.entity, context.world, context.player.id, claimSharedData);
173
+ if (!result.valid) {
174
+ const data = {
175
+ trait: claim.trait,
176
+ behavior: claim.behavior,
177
+ entityId: claim.entity.id,
178
+ entityName: claim.entity.name,
179
+ sharedData: claimSharedData
180
+ };
181
+ return {
182
+ valid: false,
183
+ error: result.error,
184
+ params: result.params,
185
+ data
186
+ };
187
+ }
188
+ }
189
+ const data = {
190
+ trait,
191
+ behavior,
192
+ entityId: entity.id,
193
+ entityName: entity.name,
194
+ sharedData
195
+ };
196
+ return { valid: true, data };
197
+ }
198
+ // Default: first-wins fallback
199
+ return validateSingleBehavior(entity, trait, behavior, context, sharedData);
200
+ }
201
+ /**
202
+ * Validate a single behavior (helper for executeCapabilityValidate).
203
+ */
204
+ function validateSingleBehavior(entity, trait, behavior, context, sharedData) {
205
+ const behaviorResult = behavior.validate(entity, context.world, context.player.id, sharedData);
206
+ const data = {
207
+ trait,
208
+ behavior,
209
+ entityId: entity.id,
210
+ entityName: entity.name,
211
+ sharedData
212
+ };
213
+ if (!behaviorResult.valid) {
214
+ return {
215
+ valid: false,
216
+ error: behaviorResult.error,
217
+ params: behaviorResult.params,
218
+ data
219
+ };
220
+ }
221
+ return { valid: true, data };
222
+ }
223
+ /**
224
+ * Execute capability dispatch execute phase.
225
+ */
226
+ function executeCapabilityExecute(context) {
227
+ const data = context.validationResult?.data;
228
+ const entity = context.command.directObject?.entity;
229
+ if (!entity || !data?.behavior) {
230
+ return;
231
+ }
232
+ // Delegate execution to behavior
233
+ data.behavior.execute(entity, context.world, context.player.id, data.sharedData);
234
+ }
235
+ /**
236
+ * Execute capability dispatch report phase.
237
+ */
238
+ function executeCapabilityReport(context) {
239
+ const data = context.validationResult?.data;
240
+ const entity = context.command.directObject?.entity;
241
+ if (!entity || !data?.behavior) {
242
+ return [];
243
+ }
244
+ // Delegate reporting to behavior
245
+ const effects = data.behavior.report(entity, context.world, context.player.id, data.sharedData);
246
+ return effectsToEvents(effects, context);
247
+ }
248
+ /**
249
+ * Execute capability dispatch blocked phase.
250
+ */
251
+ function executeCapabilityBlocked(context, result, actionId) {
252
+ // Check both validationResult.data and result.data
253
+ const data = (context.validationResult?.data ?? result.data);
254
+ const entity = context.command.directObject?.entity;
255
+ // If we have a behavior, let it handle the blocked message
256
+ if (entity && data?.behavior) {
257
+ const effects = data.behavior.blocked(entity, context.world, context.player.id, result.error || 'action_blocked', data.sharedData);
258
+ return effectsToEvents(effects, context);
259
+ }
260
+ // Default blocked event (shouldn't normally reach here)
261
+ return [
262
+ context.event('action.blocked', {
263
+ actionId,
264
+ messageId: result.error || 'action_blocked',
265
+ params: result.params || {}
266
+ })
267
+ ];
268
+ }
269
+ //# sourceMappingURL=capability-dispatch-helper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capability-dispatch-helper.js","sourceRoot":"","sources":["../src/capability-dispatch-helper.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;GAiBG;;AAsEH,0DAUC;AAYD,oEAsEC;AAsBD,8DAoGC;AA0CD,4DAYC;AAKD,0DAkBC;AAKD,4DA6BC;AAxYD,sDAY8B;AAgD9B;;;;;;GAMG;AACH,SAAgB,uBAAuB,CACrC,QAAgB,EAChB,MAA4B;IAE5B,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC;IACnC,CAAC;IAED,kDAAkD;IAClD,OAAO,4BAA4B,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;AAC1D,CAAC;AAED;;;;;;;;;GASG;AACH,SAAgB,4BAA4B,CAC1C,QAAgB,EAChB,QAAkC;IAElC,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAiB,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC;IAE7E,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC;IACnC,CAAC;IAED,qBAAqB;IACrB,MAAM,MAAM,GAAsB,EAAE,CAAC;IAErC,KAAK,MAAM,MAAM,IAAI,aAAa,EAAE,CAAC;QACnC,MAAM,KAAK,GAAG,IAAA,qCAAuB,EAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QACxD,IAAI,CAAC,KAAK;YAAE,SAAS;QAErB,MAAM,OAAO,GAAG,IAAA,gCAAkB,EAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACpD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,qDAAqD;YACrD,OAAO,CAAC,IAAI,CACV,8BAA8B,KAAK,CAAC,IAAI,aAAa,QAAQ,IAAI;gBACjE,4DAA4D,CAC7D,CAAC;YACF,SAAS;QACX,CAAC;QAED,MAAM,CAAC,IAAI,CAAC;YACV,MAAM;YACN,KAAK;YACL,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,kBAAkB,EAAE,OAAO,CAAC,UAAU;SACvC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC;IACnC,CAAC;IAED,mCAAmC;IACnC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;IAE/C,kFAAkF;IAClF,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;IACjF,MAAM,MAAM,GAAG,IAAA,iCAAmB,EAAC,QAAQ,CAAC,CAAC;IAC7C,MAAM,UAAU,GAAG,aAAa,IAAI,MAAM,CAAC,UAAU,CAAC;IAEtD,wEAAwE;IACxE,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,UAAU,KAAK,YAAY,IAAI,UAAU,KAAK,kBAAkB,EAAE,CAAC;QAC5F,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QAC1B,OAAO;YACL,cAAc,EAAE,IAAI;YACpB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,MAAM;YACN,UAAU;SACX,CAAC;IACJ,CAAC;IAED,8EAA8E;IAC9E,OAAO;QACL,cAAc,EAAE,IAAI;QACpB,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK;QACtB,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ;QAC5B,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM;QACxB,MAAM;QACN,UAAU;KACX,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CACtB,OAA2B,EAC3B,OAAsB;IAEtB,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;AAC3E,CAAC;AAED;;;;;;;;;GASG;AACH,SAAgB,yBAAyB,CACvC,KAA8B,EAC9B,OAAsB;IAEtB,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,KAAK,CAAC;IAE9D,IAAI,CAAC,KAAK,IAAI,CAAC,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC;QACnC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,2BAA2B,EAAE,CAAC;IAC9D,CAAC;IAED,6DAA6D;IAC7D,MAAM,UAAU,GAAyB,EAAE,CAAC;IAE5C,kFAAkF;IAClF,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,IAAI,UAAU,KAAK,YAAY,IAAI,UAAU,KAAK,kBAAkB,EAAE,CAAC;QACtG,OAAO,sBAAsB,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;IAC9E,CAAC;IAED,qDAAqD;IACrD,IAAI,UAAU,KAAK,YAAY,EAAE,CAAC;QAChC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,MAAM,eAAe,GAAyB,EAAE,CAAC;YACjD,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,QAAQ,CACpC,KAAK,CAAC,MAAM,EACZ,OAAO,CAAC,KAAK,EACb,OAAO,CAAC,MAAM,CAAC,EAAE,EACjB,eAAe,CAChB,CAAC;YAEF,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;gBAClB,oCAAoC;gBACpC,MAAM,IAAI,GAA2B;oBACnC,KAAK,EAAE,KAAK,CAAC,KAAK;oBAClB,QAAQ,EAAE,KAAK,CAAC,QAAQ;oBACxB,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE;oBACzB,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI;oBAC7B,UAAU,EAAE,eAAe;iBAC5B,CAAC;gBAEF,OAAO;oBACL,KAAK,EAAE,KAAK;oBACZ,KAAK,EAAE,MAAM,CAAC,KAAK;oBACnB,MAAM,EAAE,MAAM,CAAC,MAAM;oBACrB,IAAI;iBACL,CAAC;YACJ,CAAC;QACH,CAAC;QAED,8CAA8C;QAC9C,MAAM,IAAI,GAA2B;YACnC,KAAK;YACL,QAAQ;YACR,QAAQ,EAAE,MAAM,CAAC,EAAE;YACnB,UAAU,EAAE,MAAM,CAAC,IAAI;YACvB,UAAU;SACX,CAAC;QACF,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAC/B,CAAC;IAED,8EAA8E;IAC9E,IAAI,UAAU,KAAK,eAAe,EAAE,CAAC;QACnC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,MAAM,eAAe,GAAyB,EAAE,CAAC;YACjD,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,QAAQ,CACpC,KAAK,CAAC,MAAM,EACZ,OAAO,CAAC,KAAK,EACb,OAAO,CAAC,MAAM,CAAC,EAAE,EACjB,eAAe,CAChB,CAAC;YAEF,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;gBAClB,MAAM,IAAI,GAA2B;oBACnC,KAAK,EAAE,KAAK,CAAC,KAAK;oBAClB,QAAQ,EAAE,KAAK,CAAC,QAAQ;oBACxB,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE;oBACzB,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI;oBAC7B,UAAU,EAAE,eAAe;iBAC5B,CAAC;gBAEF,OAAO;oBACL,KAAK,EAAE,KAAK;oBACZ,KAAK,EAAE,MAAM,CAAC,KAAK;oBACnB,MAAM,EAAE,MAAM,CAAC,MAAM;oBACrB,IAAI;iBACL,CAAC;YACJ,CAAC;QACH,CAAC;QAED,MAAM,IAAI,GAA2B;YACnC,KAAK;YACL,QAAQ;YACR,QAAQ,EAAE,MAAM,CAAC,EAAE;YACnB,UAAU,EAAE,MAAM,CAAC,IAAI;YACvB,UAAU;SACX,CAAC;QACF,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAC/B,CAAC;IAED,+BAA+B;IAC/B,OAAO,sBAAsB,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;AAC9E,CAAC;AAED;;GAEG;AACH,SAAS,sBAAsB,CAC7B,MAAgB,EAChB,KAAa,EACb,QAA4B,EAC5B,OAAsB,EACtB,UAAgC;IAEhC,MAAM,cAAc,GAAG,QAAQ,CAAC,QAAQ,CACtC,MAAM,EACN,OAAO,CAAC,KAAK,EACb,OAAO,CAAC,MAAM,CAAC,EAAE,EACjB,UAAU,CACX,CAAC;IAEF,MAAM,IAAI,GAA2B;QACnC,KAAK;QACL,QAAQ;QACR,QAAQ,EAAE,MAAM,CAAC,EAAE;QACnB,UAAU,EAAE,MAAM,CAAC,IAAI;QACvB,UAAU;KACX,CAAC;IAEF,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;QAC1B,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,KAAK,EAAE,cAAc,CAAC,KAAK;YAC3B,MAAM,EAAE,cAAc,CAAC,MAAM;YAC7B,IAAI;SACL,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AAC/B,CAAC;AAED;;GAEG;AACH,SAAgB,wBAAwB,CACtC,OAAsB;IAEtB,MAAM,IAAI,GAAG,OAAO,CAAC,gBAAgB,EAAE,IAA0C,CAAC;IAClF,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,YAAY,EAAE,MAAM,CAAC;IAEpD,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC;QAC/B,OAAO;IACT,CAAC;IAED,iCAAiC;IACjC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;AACnF,CAAC;AAED;;GAEG;AACH,SAAgB,uBAAuB,CACrC,OAAsB;IAEtB,MAAM,IAAI,GAAG,OAAO,CAAC,gBAAgB,EAAE,IAA0C,CAAC;IAClF,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,YAAY,EAAE,MAAM,CAAC;IAEpD,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC;QAC/B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,iCAAiC;IACjC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAClC,MAAM,EACN,OAAO,CAAC,KAAK,EACb,OAAO,CAAC,MAAM,CAAC,EAAE,EACjB,IAAI,CAAC,UAAU,CAChB,CAAC;IACF,OAAO,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AAC3C,CAAC;AAED;;GAEG;AACH,SAAgB,wBAAwB,CACtC,OAAsB,EACtB,MAAwB,EACxB,QAAgB;IAEhB,mDAAmD;IACnD,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,gBAAgB,EAAE,IAAI,IAAI,MAAM,CAAC,IAAI,CAAuC,CAAC;IACnG,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,YAAY,EAAE,MAAM,CAAC;IAEpD,2DAA2D;IAC3D,IAAI,MAAM,IAAI,IAAI,EAAE,QAAQ,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CACnC,MAAM,EACN,OAAO,CAAC,KAAK,EACb,OAAO,CAAC,MAAM,CAAC,EAAE,EACjB,MAAM,CAAC,KAAK,IAAI,gBAAgB,EAChC,IAAI,CAAC,UAAU,CAChB,CAAC;QACF,OAAO,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC;IAED,wDAAwD;IACxD,OAAO;QACL,OAAO,CAAC,KAAK,CAAC,gBAAgB,EAAE;YAC9B,QAAQ;YACR,SAAS,EAAE,MAAM,CAAC,KAAK,IAAI,gBAAgB;YAC3C,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,EAAE;SAC5B,CAAC;KACH,CAAC;AACJ,CAAC"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Command Executor - Orchestrates command pipeline
3
+ *
4
+ * Responsibilities:
5
+ * - Orchestrate the four-phase pattern (validate → execute → report/blocked)
6
+ * - Handle implicit inference (ADR-104) when validation fails with pronouns
7
+ * - Pass results between phases
8
+ * - Return the final TurnResult
9
+ *
10
+ * All event creation is owned by the action components themselves.
11
+ */
12
+ import { ISystemEvent, IGenericEventSource } from '@sharpee/core';
13
+ import { IParser, IParsedCommand } from '@sharpee/world-model';
14
+ import { WorldModel } from '@sharpee/world-model';
15
+ import { EventProcessor } from '@sharpee/event-processor';
16
+ import { ActionRegistry } from '@sharpee/stdlib';
17
+ import { GameContext, TurnResult, EngineConfig } from './types';
18
+ /**
19
+ * Transformer function for parsed commands.
20
+ * Called after parsing but before validation.
21
+ * Can modify the parsed command to bypass or alter validation behavior.
22
+ *
23
+ * @param parsed - The parsed command from the parser
24
+ * @param world - The world model for checking state (e.g., gdtMode)
25
+ * @returns The (potentially modified) parsed command
26
+ */
27
+ export type ParsedCommandTransformer = (parsed: IParsedCommand, world: WorldModel) => IParsedCommand;
28
+ export declare class CommandExecutor {
29
+ private parser;
30
+ private validator;
31
+ private actionRegistry;
32
+ private eventProcessor;
33
+ private scopeResolver?;
34
+ private parsedCommandTransformers;
35
+ constructor(world: WorldModel, actionRegistry: ActionRegistry, eventProcessor: EventProcessor, parser: IParser, systemEvents?: IGenericEventSource<ISystemEvent>);
36
+ /**
37
+ * Register a transformer that can modify parsed commands before validation.
38
+ * Transformers are called in order of registration.
39
+ *
40
+ * @param transformer - Function to transform parsed commands
41
+ */
42
+ registerParsedCommandTransformer(transformer: ParsedCommandTransformer): void;
43
+ /**
44
+ * Unregister a previously registered transformer.
45
+ *
46
+ * @param transformer - The transformer to remove
47
+ * @returns true if the transformer was found and removed
48
+ */
49
+ unregisterParsedCommandTransformer(transformer: ParsedCommandTransformer): boolean;
50
+ execute(input: string, world: WorldModel, context: GameContext, config?: EngineConfig): Promise<TurnResult>;
51
+ }
52
+ export declare function createCommandExecutor(world: WorldModel, actionRegistry: ActionRegistry, eventProcessor: EventProcessor, parser: IParser, systemEvents?: IGenericEventSource<ISystemEvent>): CommandExecutor;
53
+ //# sourceMappingURL=command-executor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-executor.d.ts","sourceRoot":"","sources":["../src/command-executor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAkB,YAAY,EAAE,mBAAmB,EAA0B,MAAM,eAAe,CAAC;AAC1G,OAAO,EAAE,OAAO,EAAqB,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAGlF,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAEL,cAAc,EAKf,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAYhE;;;;;;;;GAQG;AACH,MAAM,MAAM,wBAAwB,GAAG,CACrC,MAAM,EAAE,cAAc,EACtB,KAAK,EAAE,UAAU,KACd,cAAc,CAAC;AAEpB,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAU;IACxB,OAAO,CAAC,SAAS,CAAmB;IACpC,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,aAAa,CAAC,CAAgB;IACtC,OAAO,CAAC,yBAAyB,CAAkC;gBAGjE,KAAK,EAAE,UAAU,EACjB,cAAc,EAAE,cAAc,EAC9B,cAAc,EAAE,cAAc,EAC9B,MAAM,EAAE,OAAO,EACf,YAAY,CAAC,EAAE,mBAAmB,CAAC,YAAY,CAAC;IAgBlD;;;;;OAKG;IACH,gCAAgC,CAAC,WAAW,EAAE,wBAAwB,GAAG,IAAI;IAI7E;;;;;OAKG;IACH,kCAAkC,CAAC,WAAW,EAAE,wBAAwB,GAAG,OAAO;IAS5E,OAAO,CACX,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,UAAU,EACjB,OAAO,EAAE,WAAW,EACpB,MAAM,CAAC,EAAE,YAAY,GACpB,OAAO,CAAC,UAAU,CAAC;CA4SvB;AAED,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,UAAU,EACjB,cAAc,EAAE,cAAc,EAC9B,cAAc,EAAE,cAAc,EAC9B,MAAM,EAAE,OAAO,EACf,YAAY,CAAC,EAAE,mBAAmB,CAAC,YAAY,CAAC,GAC/C,eAAe,CAEjB"}