@rtif-sdk/engine 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/engine.js ADDED
@@ -0,0 +1,527 @@
1
+ /**
2
+ * EditorEngine — the state machine that drives all document mutations.
3
+ * See docs/spec/plugin-contract.md for specification.
4
+ */
5
+ import { apply, resolve, blockTextLength, getMarksAtOffset, getMarksInRange, getBlockAtOffset } from '@rtif-sdk/core';
6
+ import { normalizeCommandHandler } from './registries.js';
7
+ import { createHistory, pushUndoGroup, popUndo, popRedo, pushRedoGroup, pushUndoGroupKeepRedo, } from './history.js';
8
+ import { EngineError } from './errors.js';
9
+ import { transformSelection } from './selection-transform.js';
10
+ import { EngineCommands } from './commands.js';
11
+ /** Max consecutive plugin errors before auto-disable */
12
+ const MAX_CONSECUTIVE_ERRORS = 3;
13
+ /**
14
+ * EditorEngine class — internal implementation.
15
+ * Consumers use `createEngine()` factory and the `IEditorEngine` interface.
16
+ */
17
+ class EditorEngine {
18
+ _state;
19
+ _history;
20
+ _plugins = [];
21
+ _commands = new Map();
22
+ _blockTypes = new Map();
23
+ _markTypes = new Map();
24
+ _inputRules = [];
25
+ _shortcuts = [];
26
+ _changeListeners = new Set();
27
+ _selectionListeners = new Set();
28
+ _errorListeners = new Set();
29
+ _dispatching = false;
30
+ _pendingDispatches = [];
31
+ _initializingPluginId = null;
32
+ _destroyed = false;
33
+ _pendingMarks = {};
34
+ constructor(doc) {
35
+ this._state = {
36
+ doc,
37
+ selection: { anchor: { offset: 0 }, focus: { offset: 0 } },
38
+ pluginState: {},
39
+ };
40
+ this._history = createHistory();
41
+ // Register built-in undo/redo commands
42
+ this._commands.set(EngineCommands.UNDO, {
43
+ execute: (engine) => engine.undo(),
44
+ canExecute: (engine) => engine._history.undoStack.length > 0,
45
+ });
46
+ this._commands.set(EngineCommands.REDO, {
47
+ execute: (engine) => engine.redo(),
48
+ canExecute: (engine) => engine._history.redoStack.length > 0,
49
+ });
50
+ }
51
+ get state() {
52
+ return this._state;
53
+ }
54
+ dispatch(ops) {
55
+ this._assertNotDestroyed();
56
+ const opsArray = Array.isArray(ops) ? ops : [ops];
57
+ if (opsArray.length === 0)
58
+ return;
59
+ if (this._dispatching) {
60
+ // Queue nested dispatches from afterApply hooks
61
+ this._pendingDispatches.push(opsArray);
62
+ return;
63
+ }
64
+ this._executeDispatch(opsArray);
65
+ // Drain queued dispatches (FIFO)
66
+ while (this._pendingDispatches.length > 0) {
67
+ const queued = this._pendingDispatches.shift();
68
+ this._executeDispatch(queued);
69
+ }
70
+ }
71
+ exec(command, payload) {
72
+ this._assertNotDestroyed();
73
+ const descriptor = this._commands.get(command);
74
+ if (!descriptor) {
75
+ throw new EngineError('COMMAND_NOT_FOUND', `Command '${command}' is not registered`);
76
+ }
77
+ descriptor.execute(this, payload);
78
+ }
79
+ canExecute(command, payload) {
80
+ const descriptor = this._commands.get(command);
81
+ if (!descriptor)
82
+ return false;
83
+ if (descriptor.canExecute)
84
+ return descriptor.canExecute(this, payload);
85
+ return true;
86
+ }
87
+ isActive(command, payload) {
88
+ const descriptor = this._commands.get(command);
89
+ if (!descriptor)
90
+ return false;
91
+ if (descriptor.isActive)
92
+ return descriptor.isActive(this, payload);
93
+ return false;
94
+ }
95
+ undo() {
96
+ this._assertNotDestroyed();
97
+ const result = popUndo(this._history);
98
+ if (!result)
99
+ return;
100
+ const { entry, history: newHistory } = result;
101
+ this._history = newHistory;
102
+ /*
103
+ * Apply inverse ops in REVERSE order.
104
+ *
105
+ * Why reverse? Because each inverse op was computed against an intermediate
106
+ * document state during the original dispatch. Given forward ops [A, B]:
107
+ * - A was applied to doc₀, producing doc₁ and inv(A)
108
+ * - B was applied to doc₁, producing doc₂ and inv(B)
109
+ *
110
+ * inv(B) expects doc₂ as input (the state after both A and B).
111
+ * inv(A) expects doc₁ as input (the state after only A).
112
+ *
113
+ * So to undo: first apply inv(B) to doc₂ → doc₁, then inv(A) to doc₁ → doc₀.
114
+ * That's reverse order.
115
+ */
116
+ let doc = this._state.doc;
117
+ let selection = this._state.selection;
118
+ for (let i = entry.inverse.length - 1; i >= 0; i--) {
119
+ const invOp = entry.inverse[i];
120
+ // For merge_block, compute merge point BEFORE applying (block still exists)
121
+ let mergePointOffset;
122
+ if (invOp.type === 'merge_block') {
123
+ mergePointOffset = this._computeMergePointOffset(doc, invOp.blockId);
124
+ }
125
+ const { doc: newDoc } = apply(doc, invOp);
126
+ doc = newDoc;
127
+ selection = this._transformSelectionForOp(selection, invOp, doc, mergePointOffset);
128
+ }
129
+ this._history = pushRedoGroup(this._history, entry);
130
+ this._state = { ...this._state, doc, selection };
131
+ this._pendingMarks = {};
132
+ this._fireOnChange();
133
+ }
134
+ redo() {
135
+ this._assertNotDestroyed();
136
+ const result = popRedo(this._history);
137
+ if (!result)
138
+ return;
139
+ const { entry, history: newHistory } = result;
140
+ this._history = newHistory;
141
+ // Replay forward ops directly — no need to recompute inverses
142
+ let doc = this._state.doc;
143
+ let selection = this._state.selection;
144
+ for (const op of entry.forward) {
145
+ // For merge_block, compute merge point BEFORE applying (block still exists)
146
+ let mergePointOffset;
147
+ if (op.type === 'merge_block') {
148
+ mergePointOffset = this._computeMergePointOffset(doc, op.blockId);
149
+ }
150
+ const { doc: newDoc } = apply(doc, op);
151
+ doc = newDoc;
152
+ selection = this._transformSelectionForOp(selection, op, doc, mergePointOffset);
153
+ }
154
+ this._history = pushUndoGroupKeepRedo(this._history, entry);
155
+ this._state = { ...this._state, doc, selection };
156
+ this._pendingMarks = {};
157
+ this._fireOnChange();
158
+ }
159
+ use(plugin) {
160
+ this._assertNotDestroyed();
161
+ // Check duplicate ID
162
+ if (this._plugins.some((e) => e.plugin.id === plugin.id)) {
163
+ throw new EngineError('PLUGIN_ID_CONFLICT', `Plugin '${plugin.id}' is already registered`);
164
+ }
165
+ const pluginEntry = {
166
+ plugin,
167
+ disabled: false,
168
+ consecutiveErrors: 0,
169
+ };
170
+ this._plugins.push(pluginEntry);
171
+ // Call init with registry access gated
172
+ if (plugin.init) {
173
+ this._initializingPluginId = plugin.id;
174
+ try {
175
+ plugin.init(this._createPluginContext());
176
+ }
177
+ catch (e) {
178
+ this._emitPluginError({
179
+ error: e,
180
+ pluginId: plugin.id,
181
+ hook: 'init',
182
+ });
183
+ }
184
+ finally {
185
+ this._initializingPluginId = null;
186
+ }
187
+ }
188
+ }
189
+ onChange(listener) {
190
+ this._changeListeners.add(listener);
191
+ return () => {
192
+ this._changeListeners.delete(listener);
193
+ };
194
+ }
195
+ onSelectionChange(listener) {
196
+ this._selectionListeners.add(listener);
197
+ return () => {
198
+ this._selectionListeners.delete(listener);
199
+ };
200
+ }
201
+ onError(listener) {
202
+ this._errorListeners.add(listener);
203
+ return () => {
204
+ this._errorListeners.delete(listener);
205
+ };
206
+ }
207
+ setSelection(selection) {
208
+ this._assertNotDestroyed();
209
+ const prev = this._state.selection;
210
+ if (prev.anchor.offset === selection.anchor.offset &&
211
+ prev.focus.offset === selection.focus.offset) {
212
+ return;
213
+ }
214
+ this._state = { ...this._state, selection };
215
+ this._fireOnSelectionChange();
216
+ }
217
+ destroy() {
218
+ if (this._destroyed)
219
+ return;
220
+ this._destroyed = true;
221
+ // Call destroy on all plugins in reverse registration order
222
+ for (let i = this._plugins.length - 1; i >= 0; i--) {
223
+ const entry = this._plugins[i];
224
+ if (entry.plugin.destroy) {
225
+ try {
226
+ entry.plugin.destroy();
227
+ }
228
+ catch (e) {
229
+ this._emitPluginError({
230
+ error: e,
231
+ pluginId: entry.plugin.id,
232
+ hook: 'destroy',
233
+ });
234
+ }
235
+ }
236
+ }
237
+ // Clear all internal state
238
+ this._plugins.length = 0;
239
+ this._commands.clear();
240
+ this._blockTypes.clear();
241
+ this._markTypes.clear();
242
+ this._inputRules.length = 0;
243
+ this._shortcuts.length = 0;
244
+ this._changeListeners.clear();
245
+ this._selectionListeners.clear();
246
+ this._errorListeners.clear();
247
+ this._pendingMarks = {};
248
+ }
249
+ // --- Query methods ---
250
+ getMarksAtOffset(offset) {
251
+ return getMarksAtOffset(this._state.doc, offset);
252
+ }
253
+ getMarksInRange(offset, count) {
254
+ return getMarksInRange(this._state.doc, offset, count);
255
+ }
256
+ getBlockAtOffset(offset) {
257
+ return getBlockAtOffset(this._state.doc, offset);
258
+ }
259
+ // --- Pending marks ---
260
+ setPendingMark(mark, value) {
261
+ this._pendingMarks[mark] = value;
262
+ }
263
+ togglePendingMark(mark, value) {
264
+ if (mark in this._pendingMarks) {
265
+ delete this._pendingMarks[mark];
266
+ }
267
+ else {
268
+ this._pendingMarks[mark] = value ?? true;
269
+ }
270
+ }
271
+ getPendingMarks() {
272
+ return { ...this._pendingMarks };
273
+ }
274
+ clearPendingMarks() {
275
+ this._pendingMarks = {};
276
+ }
277
+ // --- Shortcuts ---
278
+ getShortcuts() {
279
+ return this._shortcuts;
280
+ }
281
+ // --- PluginRegistries implementation ---
282
+ registerBlockType(type, config) {
283
+ this._assertRegistryOpen();
284
+ this._blockTypes.set(type, config);
285
+ }
286
+ registerMarkType(type, config) {
287
+ this._assertRegistryOpen();
288
+ this._markTypes.set(type, config);
289
+ }
290
+ registerCommand(name, handler) {
291
+ this._assertRegistryOpen();
292
+ this._commands.set(name, normalizeCommandHandler(handler));
293
+ }
294
+ registerInputRule(rule) {
295
+ this._assertRegistryOpen();
296
+ this._inputRules.push({ rule, pluginId: this._initializingPluginId });
297
+ }
298
+ registerShortcut(descriptor, command, payload) {
299
+ this._assertRegistryOpen();
300
+ this._shortcuts.push({ descriptor, command, payload });
301
+ }
302
+ // --- Private methods ---
303
+ _assertNotDestroyed() {
304
+ if (this._destroyed) {
305
+ throw new EngineError('ENGINE_DESTROYED', 'Cannot perform operations on a destroyed engine');
306
+ }
307
+ }
308
+ _assertRegistryOpen() {
309
+ if (this._initializingPluginId === null) {
310
+ throw new EngineError('REGISTRY_CLOSED', 'Registry methods can only be called during plugin init()');
311
+ }
312
+ }
313
+ _createPluginContext() {
314
+ // Proper wrapper object — avoids `this as unknown as PluginContext` unsafe cast
315
+ const self = this;
316
+ return {
317
+ get state() { return self.state; },
318
+ dispatch: (ops) => this.dispatch(ops),
319
+ exec: (command, payload) => this.exec(command, payload),
320
+ canExecute: (command, payload) => this.canExecute(command, payload),
321
+ isActive: (command, payload) => this.isActive(command, payload),
322
+ undo: () => this.undo(),
323
+ redo: () => this.redo(),
324
+ use: (plugin) => this.use(plugin),
325
+ onChange: (listener) => this.onChange(listener),
326
+ onSelectionChange: (listener) => this.onSelectionChange(listener),
327
+ onError: (listener) => this.onError(listener),
328
+ setSelection: (selection) => this.setSelection(selection),
329
+ destroy: () => this.destroy(),
330
+ getMarksAtOffset: (offset) => this.getMarksAtOffset(offset),
331
+ getMarksInRange: (offset, count) => this.getMarksInRange(offset, count),
332
+ getBlockAtOffset: (offset) => this.getBlockAtOffset(offset),
333
+ getShortcuts: () => this.getShortcuts(),
334
+ setPendingMark: (mark, value) => this.setPendingMark(mark, value),
335
+ togglePendingMark: (mark, value) => this.togglePendingMark(mark, value),
336
+ getPendingMarks: () => this.getPendingMarks(),
337
+ clearPendingMarks: () => this.clearPendingMarks(),
338
+ registerBlockType: (type, config) => this.registerBlockType(type, config),
339
+ registerMarkType: (type, config) => this.registerMarkType(type, config),
340
+ registerCommand: (name, handler) => this.registerCommand(name, handler),
341
+ registerInputRule: (rule) => this.registerInputRule(rule),
342
+ registerShortcut: (descriptor, command, payload) => this.registerShortcut(descriptor, command, payload),
343
+ };
344
+ }
345
+ /**
346
+ * Compute the merge point offset for a merge_block operation.
347
+ * The merge point is the absolute offset at the end of the block before the merged block
348
+ * (i.e., where the virtual \n was).
349
+ */
350
+ _computeMergePointOffset(doc, blockId) {
351
+ const blockIndex = doc.blocks.findIndex((b) => b.id === blockId);
352
+ if (blockIndex <= 0)
353
+ return undefined;
354
+ let offset = 0;
355
+ for (let i = 0; i < blockIndex - 1; i++) {
356
+ offset += blockTextLength(doc.blocks[i]);
357
+ offset += 1; // virtual \n
358
+ }
359
+ offset += blockTextLength(doc.blocks[blockIndex - 1]);
360
+ return offset;
361
+ }
362
+ /**
363
+ * Transform the selection for a single operation.
364
+ * For merge_block, computes the merge point from the pre-apply doc.
365
+ */
366
+ _transformSelectionForOp(selection, op, _docAfter, mergePointOffset) {
367
+ return transformSelection(selection, op, mergePointOffset);
368
+ }
369
+ _executeDispatch(ops) {
370
+ const prevState = this._state;
371
+ // 1. Run beforeApply pipeline
372
+ let currentOps = ops;
373
+ for (const entry of this._plugins) {
374
+ if (entry.disabled || !entry.plugin.beforeApply)
375
+ continue;
376
+ try {
377
+ const result = entry.plugin.beforeApply(currentOps, this._state);
378
+ // Check for Promise (async not supported in v1)
379
+ if (result && typeof result.then === 'function') {
380
+ this._handlePluginError(entry, 'beforeApply', new Error('Async beforeApply not supported'), ops);
381
+ continue;
382
+ }
383
+ currentOps = result;
384
+ entry.consecutiveErrors = 0;
385
+ if (currentOps.length === 0) {
386
+ // Cancelled — abort entire dispatch
387
+ return;
388
+ }
389
+ }
390
+ catch (e) {
391
+ this._handlePluginError(entry, 'beforeApply', e, ops);
392
+ }
393
+ }
394
+ // 2. Apply each op via core apply(), collect inverses, transform selection
395
+ const inverseOps = [];
396
+ let doc = this._state.doc;
397
+ let selection = this._state.selection;
398
+ for (const op of currentOps) {
399
+ // For merge_block, compute merge point BEFORE applying
400
+ let mergePointOffset;
401
+ if (op.type === 'merge_block') {
402
+ mergePointOffset = this._computeMergePointOffset(doc, op.blockId);
403
+ }
404
+ const { doc: newDoc, inverse } = apply(doc, op);
405
+ doc = newDoc;
406
+ inverseOps.push(inverse);
407
+ // Transform selection after each op
408
+ selection = transformSelection(selection, op, mergePointOffset);
409
+ }
410
+ // 3. Construct new state
411
+ this._state = { ...this._state, doc, selection };
412
+ // 4. Run input rules (only if any op was insert_text)
413
+ if (this._inputRules.length > 0) {
414
+ this._runInputRules(currentOps);
415
+ }
416
+ // 5. Run afterApply hooks
417
+ this._dispatching = true;
418
+ try {
419
+ for (const entry of this._plugins) {
420
+ if (entry.disabled || !entry.plugin.afterApply)
421
+ continue;
422
+ try {
423
+ entry.plugin.afterApply(currentOps, prevState, this._state);
424
+ entry.consecutiveErrors = 0;
425
+ }
426
+ catch (e) {
427
+ this._handlePluginError(entry, 'afterApply', e, currentOps);
428
+ }
429
+ }
430
+ }
431
+ finally {
432
+ this._dispatching = false;
433
+ }
434
+ // 6. Push to undo stack (both forward and inverse ops)
435
+ this._history = pushUndoGroup(this._history, {
436
+ forward: currentOps,
437
+ inverse: inverseOps,
438
+ });
439
+ // 7. Clear pending marks after every dispatch
440
+ this._pendingMarks = {};
441
+ // 8. Fire onChange listeners
442
+ this._fireOnChange();
443
+ }
444
+ _runInputRules(ops) {
445
+ const insertOps = ops.filter((op) => op.type === 'insert_text');
446
+ if (insertOps.length === 0)
447
+ return;
448
+ for (const op of insertOps) {
449
+ if (op.type !== 'insert_text')
450
+ continue;
451
+ // Resolve the offset to find the affected block in the current (post-apply) state
452
+ const resolved = resolve(this._state.doc, op.offset);
453
+ const block = this._state.doc.blocks[resolved.blockIndex];
454
+ if (!block)
455
+ continue;
456
+ // Scoped matching: only test text up to the cursor position after the insert
457
+ const blockText = block.spans.map((s) => s.text).join('');
458
+ const cursorLocal = resolved.localOffset + op.text.length;
459
+ const testText = blockText.substring(0, cursorLocal);
460
+ for (const { rule, pluginId } of this._inputRules) {
461
+ const entry = this._plugins.find((p) => p.plugin.id === pluginId);
462
+ if (!entry || entry.disabled)
463
+ continue;
464
+ const match = rule.pattern.exec(testText);
465
+ if (match) {
466
+ try {
467
+ rule.handler(this, match, block.id);
468
+ entry.consecutiveErrors = 0;
469
+ }
470
+ catch (e) {
471
+ this._handlePluginError(entry, 'inputRule', e, ops);
472
+ }
473
+ if (rule.exclusive)
474
+ break;
475
+ }
476
+ }
477
+ }
478
+ }
479
+ _handlePluginError(entry, hook, error, ops) {
480
+ entry.consecutiveErrors++;
481
+ this._emitPluginError({
482
+ error,
483
+ pluginId: entry.plugin.id,
484
+ hook,
485
+ ops,
486
+ });
487
+ if (entry.consecutiveErrors >= MAX_CONSECUTIVE_ERRORS) {
488
+ entry.disabled = true;
489
+ }
490
+ }
491
+ _emitPluginError(pluginError) {
492
+ for (const listener of this._errorListeners) {
493
+ listener(pluginError);
494
+ }
495
+ }
496
+ _fireOnChange() {
497
+ const state = this._state;
498
+ for (const listener of this._changeListeners) {
499
+ listener(state);
500
+ }
501
+ }
502
+ _fireOnSelectionChange() {
503
+ const state = this._state;
504
+ for (const listener of this._selectionListeners) {
505
+ listener(state);
506
+ }
507
+ }
508
+ }
509
+ /**
510
+ * Create a new EditorEngine with the given initial document.
511
+ *
512
+ * @param doc - The initial document
513
+ * @returns A new engine instance
514
+ *
515
+ * @example
516
+ * ```ts
517
+ * const engine = createEngine({
518
+ * version: 1,
519
+ * blocks: [{ id: 'b1', type: 'text', spans: [{ text: '' }] }],
520
+ * });
521
+ * engine.dispatch({ type: 'insert_text', offset: 0, text: 'hello' });
522
+ * ```
523
+ */
524
+ export function createEngine(doc) {
525
+ return new EditorEngine(doc);
526
+ }
527
+ //# sourceMappingURL=engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAYtH,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,EACL,aAAa,EACb,aAAa,EACb,OAAO,EACP,OAAO,EACP,aAAa,EACb,qBAAqB,GACtB,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AA0I/C,wDAAwD;AACxD,MAAM,sBAAsB,GAAG,CAAC,CAAC;AAejC;;;GAGG;AACH,MAAM,YAAY;IACR,MAAM,CAAc;IACpB,QAAQ,CAAe;IACd,QAAQ,GAAkB,EAAE,CAAC;IAC7B,SAAS,GAAG,IAAI,GAAG,EAA6B,CAAC;IACjD,WAAW,GAAG,IAAI,GAAG,EAA2B,CAAC;IACjD,UAAU,GAAG,IAAI,GAAG,EAA0B,CAAC;IAC/C,WAAW,GAAqB,EAAE,CAAC;IACnC,UAAU,GAAsB,EAAE,CAAC;IACnC,gBAAgB,GAAsC,IAAI,GAAG,EAAE,CAAC;IAChE,mBAAmB,GAAsC,IAAI,GAAG,EAAE,CAAC;IACnE,eAAe,GAAsC,IAAI,GAAG,EAAE,CAAC;IACxE,YAAY,GAAG,KAAK,CAAC;IACZ,kBAAkB,GAAkB,EAAE,CAAC;IAChD,qBAAqB,GAAkB,IAAI,CAAC;IAC5C,UAAU,GAAG,KAAK,CAAC;IACnB,aAAa,GAA4B,EAAE,CAAC;IAEpD,YAAY,GAAa;QACvB,IAAI,CAAC,MAAM,GAAG;YACZ,GAAG;YACH,SAAS,EAAE,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE;YAC1D,WAAW,EAAE,EAAE;SAChB,CAAC;QACF,IAAI,CAAC,QAAQ,GAAG,aAAa,EAAE,CAAC;QAEhC,uCAAuC;QACvC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE;YACtC,OAAO,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE;YAClC,UAAU,EAAE,CAAC,MAAM,EAAE,EAAE,CAAE,MAAuB,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC;SAC/E,CAAC,CAAC;QACH,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE;YACtC,OAAO,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE;YAClC,UAAU,EAAE,CAAC,MAAM,EAAE,EAAE,CAAE,MAAuB,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC;SAC/E,CAAC,CAAC;IACL,CAAC;IAED,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,QAAQ,CAAC,GAA4B;QACnC,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAClD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAElC,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,gDAAgD;YAChD,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACvC,OAAO;QACT,CAAC;QAED,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAEhC,iCAAiC;QACjC,OAAO,IAAI,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAG,CAAC;YAChD,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAED,IAAI,CAAC,OAAe,EAAE,OAAiB;QACrC,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3B,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC/C,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,IAAI,WAAW,CAAC,mBAAmB,EAAE,YAAY,OAAO,qBAAqB,CAAC,CAAC;QACvF,CAAC;QACD,UAAU,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACpC,CAAC;IAED,UAAU,CAAC,OAAe,EAAE,OAAiB;QAC3C,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC/C,IAAI,CAAC,UAAU;YAAE,OAAO,KAAK,CAAC;QAC9B,IAAI,UAAU,CAAC,UAAU;YAAE,OAAO,UAAU,CAAC,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACvE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,QAAQ,CAAC,OAAe,EAAE,OAAiB;QACzC,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC/C,IAAI,CAAC,UAAU;YAAE,OAAO,KAAK,CAAC;QAC9B,IAAI,UAAU,CAAC,QAAQ;YAAE,OAAO,UAAU,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACnE,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI;QACF,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACtC,IAAI,CAAC,MAAM;YAAE,OAAO;QAEpB,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC;QAC9C,IAAI,CAAC,QAAQ,GAAG,UAAU,CAAC;QAE3B;;;;;;;;;;;;;WAaG;QACH,IAAI,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;QAC1B,IAAI,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;QACtC,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACnD,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC;YAEhC,4EAA4E;YAC5E,IAAI,gBAAoC,CAAC;YACzC,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;gBACjC,gBAAgB,GAAG,IAAI,CAAC,wBAAwB,CAAC,GAAG,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;YACvE,CAAC;YAED,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YAC1C,GAAG,GAAG,MAAM,CAAC;YACb,SAAS,GAAG,IAAI,CAAC,wBAAwB,CAAC,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,gBAAgB,CAAC,CAAC;QACrF,CAAC;QAED,IAAI,CAAC,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAEpD,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC;QACjD,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;QACxB,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAED,IAAI;QACF,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACtC,IAAI,CAAC,MAAM;YAAE,OAAO;QAEpB,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC;QAC9C,IAAI,CAAC,QAAQ,GAAG,UAAU,CAAC;QAE3B,8DAA8D;QAC9D,IAAI,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;QAC1B,IAAI,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;QACtC,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YAC/B,4EAA4E;YAC5E,IAAI,gBAAoC,CAAC;YACzC,IAAI,EAAE,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;gBAC9B,gBAAgB,GAAG,IAAI,CAAC,wBAAwB,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC;YACpE,CAAC;YAED,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACvC,GAAG,GAAG,MAAM,CAAC;YACb,SAAS,GAAG,IAAI,CAAC,wBAAwB,CAAC,SAAS,EAAE,EAAE,EAAE,GAAG,EAAE,gBAAgB,CAAC,CAAC;QAClF,CAAC;QAED,IAAI,CAAC,QAAQ,GAAG,qBAAqB,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAE5D,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC;QACjD,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;QACxB,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAED,GAAG,CAAC,MAAc;QAChB,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3B,qBAAqB;QACrB,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;YACzD,MAAM,IAAI,WAAW,CACnB,oBAAoB,EACpB,WAAW,MAAM,CAAC,EAAE,yBAAyB,CAC9C,CAAC;QACJ,CAAC;QAED,MAAM,WAAW,GAAgB;YAC/B,MAAM;YACN,QAAQ,EAAE,KAAK;YACf,iBAAiB,EAAE,CAAC;SACrB,CAAC;QACF,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAEhC,uCAAuC;QACvC,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;YAChB,IAAI,CAAC,qBAAqB,GAAG,MAAM,CAAC,EAAE,CAAC;YACvC,IAAI,CAAC;gBACH,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC,CAAC;YAC3C,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,IAAI,CAAC,gBAAgB,CAAC;oBACpB,KAAK,EAAE,CAAC;oBACR,QAAQ,EAAE,MAAM,CAAC,EAAE;oBACnB,IAAI,EAAE,MAAM;iBACb,CAAC,CAAC;YACL,CAAC;oBAAS,CAAC;gBACT,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC;YACpC,CAAC;QACH,CAAC;IACH,CAAC;IAED,QAAQ,CAAC,QAAsC;QAC7C,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACpC,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACzC,CAAC,CAAC;IACJ,CAAC;IAED,iBAAiB,CAAC,QAAsC;QACtD,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACvC,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC5C,CAAC,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,QAAsC;QAC5C,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACnC,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACxC,CAAC,CAAC;IACJ,CAAC;IAED,YAAY,CAAC,SAAoB;QAC/B,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;QACnC,IACE,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS,CAAC,MAAM,CAAC,MAAM;YAC9C,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,KAAK,CAAC,MAAM,EAC5C,CAAC;YACD,OAAO;QACT,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC;QAC5C,IAAI,CAAC,sBAAsB,EAAE,CAAC;IAChC,CAAC;IAED,OAAO;QACL,IAAI,IAAI,CAAC,UAAU;YAAE,OAAO;QAC5B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QAEvB,4DAA4D;QAC5D,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACnD,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC;YAChC,IAAI,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACzB,IAAI,CAAC;oBACH,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACzB,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACX,IAAI,CAAC,gBAAgB,CAAC;wBACpB,KAAK,EAAE,CAAC;wBACR,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE;wBACzB,IAAI,EAAE,SAAS;qBAChB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAED,2BAA2B;QAC3B,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;QACzB,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QACvB,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QACxB,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;QAC5B,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;QAC3B,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC;QAC9B,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,CAAC;QACjC,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;QAC7B,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;IAC1B,CAAC;IAED,wBAAwB;IAExB,gBAAgB,CAAC,MAAc;QAC7B,OAAO,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACnD,CAAC;IAED,eAAe,CAAC,MAAc,EAAE,KAAa;QAC3C,OAAO,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;IACzD,CAAC;IAED,gBAAgB,CAAC,MAAc;QAC7B,OAAO,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACnD,CAAC;IAED,wBAAwB;IAExB,cAAc,CAAC,IAAY,EAAE,KAAc;QACzC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;IACnC,CAAC;IAED,iBAAiB,CAAC,IAAY,EAAE,KAAe;QAC7C,IAAI,IAAI,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YAC/B,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QAClC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,KAAK,IAAI,IAAI,CAAC;QAC3C,CAAC;IACH,CAAC;IAED,eAAe;QACb,OAAO,EAAE,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;IACnC,CAAC;IAED,iBAAiB;QACf,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;IAC1B,CAAC;IAED,oBAAoB;IAEpB,YAAY;QACV,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED,0CAA0C;IAE1C,iBAAiB,CAAC,IAAY,EAAE,MAAuB;QACrD,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3B,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACrC,CAAC;IAED,gBAAgB,CAAC,IAAY,EAAE,MAAsB;QACnD,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACpC,CAAC;IAED,eAAe,CAAC,IAAY,EAAE,OAAuB;QACnD,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,uBAAuB,CAAC,OAAO,CAAC,CAAC,CAAC;IAC7D,CAAC;IAED,iBAAiB,CAAC,IAAe;QAC/B,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3B,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,qBAAsB,EAAE,CAAC,CAAC;IACzE,CAAC;IAED,gBAAgB,CAAC,UAA8B,EAAE,OAAe,EAAE,OAAiB;QACjF,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;IACzD,CAAC;IAED,0BAA0B;IAElB,mBAAmB;QACzB,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,MAAM,IAAI,WAAW,CACnB,kBAAkB,EAClB,iDAAiD,CAClD,CAAC;QACJ,CAAC;IACH,CAAC;IAEO,mBAAmB;QACzB,IAAI,IAAI,CAAC,qBAAqB,KAAK,IAAI,EAAE,CAAC;YACxC,MAAM,IAAI,WAAW,CACnB,iBAAiB,EACjB,0DAA0D,CAC3D,CAAC;QACJ,CAAC;IACH,CAAC;IAEO,oBAAoB;QAC1B,gFAAgF;QAChF,MAAM,IAAI,GAAG,IAAI,CAAC;QAClB,OAAO;YACL,IAAI,KAAK,KAAK,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;YAClC,QAAQ,EAAE,CAAC,GAA4B,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;YAC9D,IAAI,EAAE,CAAC,OAAe,EAAE,OAAiB,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC;YACzE,UAAU,EAAE,CAAC,OAAe,EAAE,OAAiB,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC;YACrF,QAAQ,EAAE,CAAC,OAAe,EAAE,OAAiB,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;YACjF,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE;YACvB,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE;YACvB,GAAG,EAAE,CAAC,MAAc,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC;YACzC,QAAQ,EAAE,CAAC,QAAsC,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAC7E,iBAAiB,EAAE,CAAC,QAAsC,EAAE,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC;YAC/F,OAAO,EAAE,CAAC,QAAsC,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;YAC3E,YAAY,EAAE,CAAC,SAAoB,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC;YACpE,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE;YAC7B,gBAAgB,EAAE,CAAC,MAAc,EAAE,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC;YACnE,eAAe,EAAE,CAAC,MAAc,EAAE,KAAa,EAAE,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,KAAK,CAAC;YACvF,gBAAgB,EAAE,CAAC,MAAc,EAAE,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC;YACnE,YAAY,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,YAAY,EAAE;YACvC,cAAc,EAAE,CAAC,IAAY,EAAE,KAAc,EAAE,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,KAAK,CAAC;YAClF,iBAAiB,EAAE,CAAC,IAAY,EAAE,KAAe,EAAE,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,KAAK,CAAC;YACzF,eAAe,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,eAAe,EAAE;YAC7C,iBAAiB,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,iBAAiB,EAAE;YACjD,iBAAiB,EAAE,CAAC,IAAY,EAAE,MAAuB,EAAE,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,MAAM,CAAC;YAClG,gBAAgB,EAAE,CAAC,IAAY,EAAE,MAAsB,EAAE,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC;YAC/F,eAAe,EAAE,CAAC,IAAY,EAAE,OAAuB,EAAE,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,OAAO,CAAC;YAC/F,iBAAiB,EAAE,CAAC,IAAe,EAAE,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC;YACpE,gBAAgB,EAAE,CAAC,UAA8B,EAAE,OAAe,EAAE,OAAiB,EAAE,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC;SAC9I,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACK,wBAAwB,CAAC,GAAa,EAAE,OAAe;QAC7D,MAAM,UAAU,GAAG,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,CAAC;QACjE,IAAI,UAAU,IAAI,CAAC;YAAE,OAAO,SAAS,CAAC;QAEtC,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACxC,MAAM,IAAI,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,CAAC;YAC1C,MAAM,IAAI,CAAC,CAAC,CAAC,aAAa;QAC5B,CAAC;QACD,MAAM,IAAI,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,GAAG,CAAC,CAAE,CAAC,CAAC;QACvD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;;OAGG;IACK,wBAAwB,CAC9B,SAAoB,EACpB,EAAa,EACb,SAAmB,EACnB,gBAAyB;QAEzB,OAAO,kBAAkB,CAAC,SAAS,EAAE,EAAE,EAAE,gBAAgB,CAAC,CAAC;IAC7D,CAAC;IAEO,gBAAgB,CAAC,GAAgB;QACvC,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC;QAE9B,8BAA8B;QAC9B,IAAI,UAAU,GAAG,GAAG,CAAC;QACrB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClC,IAAI,KAAK,CAAC,QAAQ,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW;gBAAE,SAAS;YAC1D,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;gBACjE,gDAAgD;gBAChD,IAAI,MAAM,IAAI,OAAQ,MAAsC,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;oBACjF,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,aAAa,EAAE,IAAI,KAAK,CAAC,iCAAiC,CAAC,EAAE,GAAG,CAAC,CAAC;oBACjG,SAAS;gBACX,CAAC;gBACD,UAAU,GAAG,MAAM,CAAC;gBACpB,KAAK,CAAC,iBAAiB,GAAG,CAAC,CAAC;gBAC5B,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAC5B,oCAAoC;oBACpC,OAAO;gBACT,CAAC;YACH,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,aAAa,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;YACxD,CAAC;QACH,CAAC;QAED,2EAA2E;QAC3E,MAAM,UAAU,GAAgB,EAAE,CAAC;QACnC,IAAI,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;QAC1B,IAAI,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;QAEtC,KAAK,MAAM,EAAE,IAAI,UAAU,EAAE,CAAC;YAC5B,uDAAuD;YACvD,IAAI,gBAAoC,CAAC;YACzC,IAAI,EAAE,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;gBAC9B,gBAAgB,GAAG,IAAI,CAAC,wBAAwB,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC;YACpE,CAAC;YAED,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YAChD,GAAG,GAAG,MAAM,CAAC;YACb,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAEzB,oCAAoC;YACpC,SAAS,GAAG,kBAAkB,CAAC,SAAS,EAAE,EAAE,EAAE,gBAAgB,CAAC,CAAC;QAClE,CAAC;QAED,yBAAyB;QACzB,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC;QAEjD,sDAAsD;QACtD,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChC,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;QAClC,CAAC;QAED,0BAA0B;QAC1B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC;YACH,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAClC,IAAI,KAAK,CAAC,QAAQ,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU;oBAAE,SAAS;gBACzD,IAAI,CAAC;oBACH,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,UAAU,EAAE,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;oBAC5D,KAAK,CAAC,iBAAiB,GAAG,CAAC,CAAC;gBAC9B,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACX,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,YAAY,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC;gBAC9D,CAAC;YACH,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;QAC5B,CAAC;QAED,uDAAuD;QACvD,IAAI,CAAC,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE;YAC3C,OAAO,EAAE,UAAU;YACnB,OAAO,EAAE,UAAU;SACpB,CAAC,CAAC;QAEH,8CAA8C;QAC9C,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;QAExB,6BAA6B;QAC7B,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAEO,cAAc,CAAC,GAAgB;QACrC,MAAM,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,KAAK,aAAa,CAAC,CAAC;QAChE,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAEnC,KAAK,MAAM,EAAE,IAAI,SAAS,EAAE,CAAC;YAC3B,IAAI,EAAE,CAAC,IAAI,KAAK,aAAa;gBAAE,SAAS;YAExC,kFAAkF;YAClF,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC;YACrD,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;YAC1D,IAAI,CAAC,KAAK;gBAAE,SAAS;YAErB,6EAA6E;YAC7E,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC1D,MAAM,WAAW,GAAG,QAAQ,CAAC,WAAW,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC;YAC1D,MAAM,QAAQ,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;YAErD,KAAK,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;gBAClD,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC;gBAClE,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,QAAQ;oBAAE,SAAS;gBAEvC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAC1C,IAAI,KAAK,EAAE,CAAC;oBACV,IAAI,CAAC;wBACH,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;wBACpC,KAAK,CAAC,iBAAiB,GAAG,CAAC,CAAC;oBAC9B,CAAC;oBAAC,OAAO,CAAC,EAAE,CAAC;wBACX,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,WAAW,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;oBACtD,CAAC;oBACD,IAAI,IAAI,CAAC,SAAS;wBAAE,MAAM;gBAC5B,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAEO,kBAAkB,CACxB,KAAkB,EAClB,IAAgD,EAChD,KAAc,EACd,GAAgB;QAEhB,KAAK,CAAC,iBAAiB,EAAE,CAAC;QAC1B,IAAI,CAAC,gBAAgB,CAAC;YACpB,KAAK;YACL,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE;YACzB,IAAI;YACJ,GAAG;SACJ,CAAC,CAAC;QACH,IAAI,KAAK,CAAC,iBAAiB,IAAI,sBAAsB,EAAE,CAAC;YACtD,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC;QACxB,CAAC;IACH,CAAC;IAEO,gBAAgB,CAAC,WAAwB;QAC/C,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YAC5C,QAAQ,CAAC,WAAW,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IAEO,aAAa;QACnB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC;QAC1B,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC7C,QAAQ,CAAC,KAAK,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAEO,sBAAsB;QAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC;QAC1B,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAChD,QAAQ,CAAC,KAAK,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;CACF;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,YAAY,CAAC,GAAa;IACxC,OAAO,IAAI,YAAY,CAAC,GAAG,CAAC,CAAC;AAC/B,CAAC"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Engine-specific error types.
3
+ * Mirrors @rtif-sdk/core's RtifError pattern for engine-layer concerns.
4
+ */
5
+ import type { Operation } from '@rtif-sdk/core';
6
+ /** Error codes specific to the engine layer */
7
+ export type EngineErrorCode = 'COMMAND_NOT_FOUND' | 'PLUGIN_ID_CONFLICT' | 'REGISTRY_CLOSED' | 'ENGINE_DESTROYED';
8
+ /**
9
+ * Engine-layer error with a typed error code.
10
+ *
11
+ * @example
12
+ * ```ts
13
+ * throw new EngineError('COMMAND_NOT_FOUND', `Command 'foo' is not registered`);
14
+ * ```
15
+ */
16
+ export declare class EngineError extends Error {
17
+ readonly code: EngineErrorCode;
18
+ constructor(code: EngineErrorCode, message: string);
19
+ }
20
+ /**
21
+ * Event emitted when a plugin hook throws an error.
22
+ * Consumed by `onError` listeners on the engine.
23
+ */
24
+ export interface PluginError {
25
+ /** The error that was thrown */
26
+ readonly error: unknown;
27
+ /** The plugin ID that threw */
28
+ readonly pluginId: string;
29
+ /** The hook that threw */
30
+ readonly hook: 'init' | 'beforeApply' | 'afterApply' | 'destroy' | 'inputRule';
31
+ /** The operations being processed when the error occurred (if applicable) */
32
+ readonly ops?: ReadonlyArray<Operation>;
33
+ }
34
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,+CAA+C;AAC/C,MAAM,MAAM,eAAe,GACvB,mBAAmB,GACnB,oBAAoB,GACpB,iBAAiB,GACjB,kBAAkB,CAAC;AAEvB;;;;;;;GAOG;AACH,qBAAa,WAAY,SAAQ,KAAK;IACpC,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;gBAEnB,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM;CAKnD;AAED;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B,gCAAgC;IAChC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,+BAA+B;IAC/B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,0BAA0B;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,YAAY,GAAG,SAAS,GAAG,WAAW,CAAC;IAC/E,6EAA6E;IAC7E,QAAQ,CAAC,GAAG,CAAC,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC;CACzC"}
package/dist/errors.js ADDED
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Engine-specific error types.
3
+ * Mirrors @rtif-sdk/core's RtifError pattern for engine-layer concerns.
4
+ */
5
+ /**
6
+ * Engine-layer error with a typed error code.
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * throw new EngineError('COMMAND_NOT_FOUND', `Command 'foo' is not registered`);
11
+ * ```
12
+ */
13
+ export class EngineError extends Error {
14
+ code;
15
+ constructor(code, message) {
16
+ super(message);
17
+ this.name = 'EngineError';
18
+ this.code = code;
19
+ }
20
+ }
21
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAWH;;;;;;;GAOG;AACH,MAAM,OAAO,WAAY,SAAQ,KAAK;IAC3B,IAAI,CAAkB;IAE/B,YAAY,IAAqB,EAAE,OAAe;QAChD,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;QAC1B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF"}