@satelliteoflove/godot-mcp 0.1.5 → 0.1.6

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 (33) hide show
  1. package/dist/__tests__/helpers/mock-godot.d.ts +17 -0
  2. package/dist/__tests__/helpers/mock-godot.d.ts.map +1 -0
  3. package/dist/__tests__/helpers/mock-godot.js +33 -0
  4. package/dist/__tests__/helpers/mock-godot.js.map +1 -0
  5. package/dist/__tests__/tools/animation.test.d.ts +2 -0
  6. package/dist/__tests__/tools/animation.test.d.ts.map +1 -0
  7. package/dist/__tests__/tools/animation.test.js +315 -0
  8. package/dist/__tests__/tools/animation.test.js.map +1 -0
  9. package/dist/__tests__/tools/node.test.d.ts +2 -0
  10. package/dist/__tests__/tools/node.test.d.ts.map +1 -0
  11. package/dist/__tests__/tools/node.test.js +173 -0
  12. package/dist/__tests__/tools/node.test.js.map +1 -0
  13. package/dist/__tests__/tools/scene.test.d.ts +2 -0
  14. package/dist/__tests__/tools/scene.test.d.ts.map +1 -0
  15. package/dist/__tests__/tools/scene.test.js +127 -0
  16. package/dist/__tests__/tools/scene.test.js.map +1 -0
  17. package/dist/__tests__/tools/tilemap.test.d.ts +2 -0
  18. package/dist/__tests__/tools/tilemap.test.d.ts.map +1 -0
  19. package/dist/__tests__/tools/tilemap.test.js +333 -0
  20. package/dist/__tests__/tools/tilemap.test.js.map +1 -0
  21. package/dist/tools/animation.d.ts +152 -216
  22. package/dist/tools/animation.d.ts.map +1 -1
  23. package/dist/tools/animation.js +324 -372
  24. package/dist/tools/animation.js.map +1 -1
  25. package/dist/tools/tilemap.d.ts +267 -253
  26. package/dist/tools/tilemap.d.ts.map +1 -1
  27. package/dist/tools/tilemap.js +273 -304
  28. package/dist/tools/tilemap.js.map +1 -1
  29. package/package.json +4 -2
  30. package/dist/__tests__/registry.test.d.ts +0 -2
  31. package/dist/__tests__/registry.test.d.ts.map +0 -1
  32. package/dist/__tests__/registry.test.js +0 -116
  33. package/dist/__tests__/registry.test.js.map +0 -1
@@ -0,0 +1,17 @@
1
+ import { vi } from 'vitest';
2
+ import type { GodotConnection } from '../../connection/websocket.js';
3
+ export interface CommandCall {
4
+ command: string;
5
+ params: Record<string, unknown>;
6
+ }
7
+ export interface MockGodotConnection {
8
+ sendCommand: ReturnType<typeof vi.fn>;
9
+ calls: CommandCall[];
10
+ mockResponse: (response: unknown) => void;
11
+ mockError: (error: Error) => void;
12
+ }
13
+ export declare function createMockGodot(): MockGodotConnection;
14
+ export declare function createToolContext(mock: MockGodotConnection): {
15
+ godot: GodotConnection;
16
+ };
17
+ //# sourceMappingURL=mock-godot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock-godot.d.ts","sourceRoot":"","sources":["../../../src/__tests__/helpers/mock-godot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC5B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAErE,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAED,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,UAAU,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;IACtC,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,YAAY,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;IAC1C,SAAS,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CACnC;AAED,wBAAgB,eAAe,IAAI,mBAAmB,CA2BrD;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,mBAAmB;WAEA,eAAe;EAEzE"}
@@ -0,0 +1,33 @@
1
+ import { vi } from 'vitest';
2
+ export function createMockGodot() {
3
+ const calls = [];
4
+ let nextResponse = {};
5
+ let nextError = null;
6
+ const sendCommand = vi.fn(async (command, params = {}) => {
7
+ calls.push({ command, params });
8
+ if (nextError) {
9
+ const err = nextError;
10
+ nextError = null;
11
+ throw err;
12
+ }
13
+ const response = nextResponse;
14
+ nextResponse = {};
15
+ return response;
16
+ });
17
+ return {
18
+ sendCommand,
19
+ calls,
20
+ mockResponse: (response) => {
21
+ nextResponse = response;
22
+ },
23
+ mockError: (error) => {
24
+ nextError = error;
25
+ },
26
+ };
27
+ }
28
+ export function createToolContext(mock) {
29
+ return {
30
+ godot: { sendCommand: mock.sendCommand },
31
+ };
32
+ }
33
+ //# sourceMappingURL=mock-godot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock-godot.js","sourceRoot":"","sources":["../../../src/__tests__/helpers/mock-godot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAe5B,MAAM,UAAU,eAAe;IAC7B,MAAM,KAAK,GAAkB,EAAE,CAAC;IAChC,IAAI,YAAY,GAAY,EAAE,CAAC;IAC/B,IAAI,SAAS,GAAiB,IAAI,CAAC;IAEnC,MAAM,WAAW,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,OAAe,EAAE,SAAkC,EAAE,EAAE,EAAE;QACxF,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QAChC,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,GAAG,GAAG,SAAS,CAAC;YACtB,SAAS,GAAG,IAAI,CAAC;YACjB,MAAM,GAAG,CAAC;QACZ,CAAC;QACD,MAAM,QAAQ,GAAG,YAAY,CAAC;QAC9B,YAAY,GAAG,EAAE,CAAC;QAClB,OAAO,QAAQ,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,WAAW;QACX,KAAK;QACL,YAAY,EAAE,CAAC,QAAiB,EAAE,EAAE;YAClC,YAAY,GAAG,QAAQ,CAAC;QAC1B,CAAC;QACD,SAAS,EAAE,CAAC,KAAY,EAAE,EAAE;YAC1B,SAAS,GAAG,KAAK,CAAC;QACpB,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAyB;IACzD,OAAO;QACL,KAAK,EAAE,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAgC;KACvE,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=animation.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"animation.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/tools/animation.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,315 @@
1
+ import { describe, it, expect, beforeEach } from 'vitest';
2
+ import { createMockGodot, createToolContext } from '../helpers/mock-godot.js';
3
+ import { animationQuery, animationPlayback, animationEdit } from '../../tools/animation.js';
4
+ describe('animation_query', () => {
5
+ let mock;
6
+ beforeEach(() => {
7
+ mock = createMockGodot();
8
+ });
9
+ it('list_players sends command and formats empty result', async () => {
10
+ mock.mockResponse({ animation_players: [] });
11
+ const ctx = createToolContext(mock);
12
+ const result = await animationQuery.execute({ action: 'list_players' }, ctx);
13
+ expect(mock.calls[0].command).toBe('list_animation_players');
14
+ expect(result).toBe('No AnimationPlayer nodes found in scene');
15
+ });
16
+ it('list_players formats found players', async () => {
17
+ mock.mockResponse({
18
+ animation_players: [
19
+ { path: '/root/Player/AnimPlayer', name: 'AnimPlayer' },
20
+ { path: '/root/Enemy/AnimPlayer', name: 'AnimPlayer' },
21
+ ],
22
+ });
23
+ const ctx = createToolContext(mock);
24
+ const result = await animationQuery.execute({ action: 'list_players' }, ctx);
25
+ expect(result).toContain('Found 2 AnimationPlayer(s)');
26
+ expect(result).toContain('/root/Player/AnimPlayer');
27
+ });
28
+ it('get_info sends command and returns JSON', async () => {
29
+ const info = { current_animation: 'idle', is_playing: true, current_position: 0.5 };
30
+ mock.mockResponse(info);
31
+ const ctx = createToolContext(mock);
32
+ const result = await animationQuery.execute({
33
+ action: 'get_info',
34
+ node_path: '/root/AnimPlayer',
35
+ }, ctx);
36
+ expect(mock.calls[0].command).toBe('get_animation_player_info');
37
+ expect(mock.calls[0].params.node_path).toBe('/root/AnimPlayer');
38
+ expect(result).toBe(JSON.stringify(info, null, 2));
39
+ });
40
+ it('get_details sends command with animation name', async () => {
41
+ const details = { name: 'walk', length: 1.5, track_count: 3 };
42
+ mock.mockResponse(details);
43
+ const ctx = createToolContext(mock);
44
+ const result = await animationQuery.execute({
45
+ action: 'get_details',
46
+ node_path: '/root/AnimPlayer',
47
+ animation_name: 'walk',
48
+ }, ctx);
49
+ expect(mock.calls[0].command).toBe('get_animation_details');
50
+ expect(mock.calls[0].params.animation_name).toBe('walk');
51
+ expect(result).toBe(JSON.stringify(details, null, 2));
52
+ });
53
+ it('get_keyframes sends command with track index', async () => {
54
+ const keyframes = { track_path: 'Sprite:frame', keyframes: [{ time: 0, value: 0 }] };
55
+ mock.mockResponse(keyframes);
56
+ const ctx = createToolContext(mock);
57
+ const result = await animationQuery.execute({
58
+ action: 'get_keyframes',
59
+ node_path: '/root/AnimPlayer',
60
+ animation_name: 'walk',
61
+ track_index: 0,
62
+ }, ctx);
63
+ expect(mock.calls[0].command).toBe('get_track_keyframes');
64
+ expect(mock.calls[0].params.track_index).toBe(0);
65
+ expect(result).toBe(JSON.stringify(keyframes, null, 2));
66
+ });
67
+ it('throws on error from Godot', async () => {
68
+ mock.mockError(new Error('Node not found'));
69
+ const ctx = createToolContext(mock);
70
+ await expect(animationQuery.execute({
71
+ action: 'get_info',
72
+ node_path: '/root/Missing',
73
+ }, ctx)).rejects.toThrow('Node not found');
74
+ });
75
+ });
76
+ describe('animation_playback', () => {
77
+ let mock;
78
+ beforeEach(() => {
79
+ mock = createMockGodot();
80
+ });
81
+ it('play sends command and returns confirmation', async () => {
82
+ mock.mockResponse({ playing: 'run', from_position: 0 });
83
+ const ctx = createToolContext(mock);
84
+ const result = await animationPlayback.execute({
85
+ action: 'play',
86
+ node_path: '/root/AnimPlayer',
87
+ animation_name: 'run',
88
+ }, ctx);
89
+ expect(mock.calls[0].command).toBe('play_animation');
90
+ expect(mock.calls[0].params.animation_name).toBe('run');
91
+ expect(result).toBe('Playing animation: run');
92
+ });
93
+ it('play passes optional params', async () => {
94
+ mock.mockResponse({ playing: 'walk', from_position: 0 });
95
+ const ctx = createToolContext(mock);
96
+ await animationPlayback.execute({
97
+ action: 'play',
98
+ node_path: '/root/AnimPlayer',
99
+ animation_name: 'walk',
100
+ custom_speed: 2.0,
101
+ custom_blend: 0.5,
102
+ from_end: true,
103
+ }, ctx);
104
+ expect(mock.calls[0].params.custom_speed).toBe(2.0);
105
+ expect(mock.calls[0].params.custom_blend).toBe(0.5);
106
+ expect(mock.calls[0].params.from_end).toBe(true);
107
+ });
108
+ it('stop sends command and returns confirmation', async () => {
109
+ mock.mockResponse({});
110
+ const ctx = createToolContext(mock);
111
+ const result = await animationPlayback.execute({
112
+ action: 'stop',
113
+ node_path: '/root/AnimPlayer',
114
+ }, ctx);
115
+ expect(mock.calls[0].command).toBe('stop_animation');
116
+ expect(result).toBe('Animation stopped');
117
+ });
118
+ it('pause sends command with paused=true', async () => {
119
+ mock.mockResponse({});
120
+ const ctx = createToolContext(mock);
121
+ const result = await animationPlayback.execute({
122
+ action: 'pause',
123
+ node_path: '/root/AnimPlayer',
124
+ paused: true,
125
+ }, ctx);
126
+ expect(mock.calls[0].command).toBe('pause_animation');
127
+ expect(mock.calls[0].params.paused).toBe(true);
128
+ expect(result).toBe('Animation paused');
129
+ });
130
+ it('pause sends command with paused=false', async () => {
131
+ mock.mockResponse({});
132
+ const ctx = createToolContext(mock);
133
+ const result = await animationPlayback.execute({
134
+ action: 'pause',
135
+ node_path: '/root/AnimPlayer',
136
+ paused: false,
137
+ }, ctx);
138
+ expect(mock.calls[0].params.paused).toBe(false);
139
+ expect(result).toBe('Animation unpaused');
140
+ });
141
+ it('seek sends command and returns position', async () => {
142
+ mock.mockResponse({ position: 1.5 });
143
+ const ctx = createToolContext(mock);
144
+ const result = await animationPlayback.execute({
145
+ action: 'seek',
146
+ node_path: '/root/AnimPlayer',
147
+ seconds: 1.5,
148
+ }, ctx);
149
+ expect(mock.calls[0].command).toBe('seek_animation');
150
+ expect(mock.calls[0].params.seconds).toBe(1.5);
151
+ expect(result).toBe('Seeked to position: 1.5');
152
+ });
153
+ it('queue sends command and returns queue info', async () => {
154
+ mock.mockResponse({ queued: 'attack', queue_length: 3 });
155
+ const ctx = createToolContext(mock);
156
+ const result = await animationPlayback.execute({
157
+ action: 'queue',
158
+ node_path: '/root/AnimPlayer',
159
+ animation_name: 'attack',
160
+ }, ctx);
161
+ expect(mock.calls[0].command).toBe('queue_animation');
162
+ expect(result).toBe('Queued animation: attack (queue length: 3)');
163
+ });
164
+ it('clear_queue sends command and returns confirmation', async () => {
165
+ mock.mockResponse({});
166
+ const ctx = createToolContext(mock);
167
+ const result = await animationPlayback.execute({
168
+ action: 'clear_queue',
169
+ node_path: '/root/AnimPlayer',
170
+ }, ctx);
171
+ expect(mock.calls[0].command).toBe('clear_animation_queue');
172
+ expect(result).toBe('Animation queue cleared');
173
+ });
174
+ });
175
+ describe('animation_edit', () => {
176
+ let mock;
177
+ beforeEach(() => {
178
+ mock = createMockGodot();
179
+ });
180
+ it('create sends command and returns confirmation', async () => {
181
+ mock.mockResponse({ created: 'new_anim', library: '' });
182
+ const ctx = createToolContext(mock);
183
+ const result = await animationEdit.execute({
184
+ action: 'create',
185
+ node_path: '/root/AnimPlayer',
186
+ animation_name: 'new_anim',
187
+ length: 2.0,
188
+ }, ctx);
189
+ expect(mock.calls[0].command).toBe('create_animation');
190
+ expect(mock.calls[0].params.animation_name).toBe('new_anim');
191
+ expect(mock.calls[0].params.length).toBe(2.0);
192
+ expect(result).toBe('Created animation: new_anim');
193
+ });
194
+ it('create includes library in result when provided', async () => {
195
+ mock.mockResponse({ created: 'walk', library: 'movement' });
196
+ const ctx = createToolContext(mock);
197
+ const result = await animationEdit.execute({
198
+ action: 'create',
199
+ node_path: '/root/AnimPlayer',
200
+ animation_name: 'walk',
201
+ library_name: 'movement',
202
+ }, ctx);
203
+ expect(result).toBe('Created animation: walk in library: movement');
204
+ });
205
+ it('delete sends command and returns confirmation', async () => {
206
+ mock.mockResponse({ deleted: 'old_anim' });
207
+ const ctx = createToolContext(mock);
208
+ const result = await animationEdit.execute({
209
+ action: 'delete',
210
+ node_path: '/root/AnimPlayer',
211
+ animation_name: 'old_anim',
212
+ }, ctx);
213
+ expect(mock.calls[0].command).toBe('delete_animation');
214
+ expect(result).toBe('Deleted animation: old_anim');
215
+ });
216
+ it('rename sends command with old and new names', async () => {
217
+ mock.mockResponse({ renamed: { from: 'walk', to: 'walk_slow' } });
218
+ const ctx = createToolContext(mock);
219
+ const result = await animationEdit.execute({
220
+ action: 'rename',
221
+ node_path: '/root/AnimPlayer',
222
+ old_name: 'walk',
223
+ new_name: 'walk_slow',
224
+ }, ctx);
225
+ expect(mock.calls[0].command).toBe('rename_animation');
226
+ expect(mock.calls[0].params.old_name).toBe('walk');
227
+ expect(mock.calls[0].params.new_name).toBe('walk_slow');
228
+ expect(result).toBe('Renamed animation: walk -> walk_slow');
229
+ });
230
+ it('update_props sends command and returns updated properties', async () => {
231
+ mock.mockResponse({ updated: 'walk', properties: { length: 2.0, loop_mode: 'linear' } });
232
+ const ctx = createToolContext(mock);
233
+ const result = await animationEdit.execute({
234
+ action: 'update_props',
235
+ node_path: '/root/AnimPlayer',
236
+ animation_name: 'walk',
237
+ length: 2.0,
238
+ loop_mode: 'linear',
239
+ }, ctx);
240
+ expect(mock.calls[0].command).toBe('update_animation_properties');
241
+ expect(result).toContain('Updated animation: walk');
242
+ expect(result).toContain('"length":2');
243
+ });
244
+ it('add_track sends command and returns track info', async () => {
245
+ mock.mockResponse({ track_index: 0, track_path: 'Sprite2D:frame', track_type: 'value' });
246
+ const ctx = createToolContext(mock);
247
+ const result = await animationEdit.execute({
248
+ action: 'add_track',
249
+ node_path: '/root/AnimPlayer',
250
+ animation_name: 'walk',
251
+ track_type: 'value',
252
+ track_path: 'Sprite2D:frame',
253
+ }, ctx);
254
+ expect(mock.calls[0].command).toBe('add_animation_track');
255
+ expect(result).toBe('Added track 0: value -> Sprite2D:frame');
256
+ });
257
+ it('remove_track sends command and returns confirmation', async () => {
258
+ mock.mockResponse({ removed_track: 2 });
259
+ const ctx = createToolContext(mock);
260
+ const result = await animationEdit.execute({
261
+ action: 'remove_track',
262
+ node_path: '/root/AnimPlayer',
263
+ animation_name: 'walk',
264
+ track_index: 2,
265
+ }, ctx);
266
+ expect(mock.calls[0].command).toBe('remove_animation_track');
267
+ expect(result).toBe('Removed track: 2');
268
+ });
269
+ it('add_keyframe sends command and returns keyframe info', async () => {
270
+ mock.mockResponse({ keyframe_index: 0, time: 0.5, value: 3 });
271
+ const ctx = createToolContext(mock);
272
+ const result = await animationEdit.execute({
273
+ action: 'add_keyframe',
274
+ node_path: '/root/AnimPlayer',
275
+ animation_name: 'walk',
276
+ track_index: 0,
277
+ time: 0.5,
278
+ value: 3,
279
+ }, ctx);
280
+ expect(mock.calls[0].command).toBe('add_keyframe');
281
+ expect(mock.calls[0].params.time).toBe(0.5);
282
+ expect(mock.calls[0].params.value).toBe(3);
283
+ expect(result).toBe('Added keyframe 0 at 0.5s');
284
+ });
285
+ it('remove_keyframe sends command and returns confirmation', async () => {
286
+ mock.mockResponse({ removed_keyframe: 1, track_index: 0 });
287
+ const ctx = createToolContext(mock);
288
+ const result = await animationEdit.execute({
289
+ action: 'remove_keyframe',
290
+ node_path: '/root/AnimPlayer',
291
+ animation_name: 'walk',
292
+ track_index: 0,
293
+ keyframe_index: 1,
294
+ }, ctx);
295
+ expect(mock.calls[0].command).toBe('remove_keyframe');
296
+ expect(result).toBe('Removed keyframe 1 from track 0');
297
+ });
298
+ it('update_keyframe sends command and returns changes', async () => {
299
+ mock.mockResponse({ updated_keyframe: 0, changes: { time: 0.75, value: 5 } });
300
+ const ctx = createToolContext(mock);
301
+ const result = await animationEdit.execute({
302
+ action: 'update_keyframe',
303
+ node_path: '/root/AnimPlayer',
304
+ animation_name: 'walk',
305
+ track_index: 0,
306
+ keyframe_index: 0,
307
+ time: 0.75,
308
+ value: 5,
309
+ }, ctx);
310
+ expect(mock.calls[0].command).toBe('update_keyframe');
311
+ expect(result).toContain('Updated keyframe 0');
312
+ expect(result).toContain('"time":0.75');
313
+ });
314
+ });
315
+ //# sourceMappingURL=animation.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"animation.test.js","sourceRoot":"","sources":["../../../src/__tests__/tools/animation.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAuB,MAAM,0BAA0B,CAAC;AACnG,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAE5F,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,IAAI,IAAyB,CAAC;IAE9B,UAAU,CAAC,GAAG,EAAE;QACd,IAAI,GAAG,eAAe,EAAE,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACnE,IAAI,CAAC,YAAY,CAAC,EAAE,iBAAiB,EAAE,EAAE,EAAE,CAAC,CAAC;QAC7C,MAAM,GAAG,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAEpC,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,cAAc,EAAE,EAAE,GAAG,CAAC,CAAC;QAE7E,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QAC7D,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;QAClD,IAAI,CAAC,YAAY,CAAC;YAChB,iBAAiB,EAAE;gBACjB,EAAE,IAAI,EAAE,yBAAyB,EAAE,IAAI,EAAE,YAAY,EAAE;gBACvD,EAAE,IAAI,EAAE,wBAAwB,EAAE,IAAI,EAAE,YAAY,EAAE;aACvD;SACF,CAAC,CAAC;QACH,MAAM,GAAG,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAEpC,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,cAAc,EAAE,EAAE,GAAG,CAAC,CAAC;QAE7E,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAC;QACvD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,yBAAyB,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;QACvD,MAAM,IAAI,GAAG,EAAE,iBAAiB,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,gBAAgB,EAAE,GAAG,EAAE,CAAC;QACpF,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QACxB,MAAM,GAAG,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAEpC,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC;YAC1C,MAAM,EAAE,UAAU;YAClB,SAAS,EAAE,kBAAkB;SAC9B,EAAE,GAAG,CAAC,CAAC;QAER,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;QAChE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAChE,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAC7D,MAAM,OAAO,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;QAC9D,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QAC3B,MAAM,GAAG,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAEpC,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC;YAC1C,MAAM,EAAE,aAAa;YACrB,SAAS,EAAE,kBAAkB;YAC7B,cAAc,EAAE,MAAM;SACvB,EAAE,GAAG,CAAC,CAAC;QAER,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QAC5D,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACzD,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;QAC5D,MAAM,SAAS,GAAG,EAAE,UAAU,EAAE,cAAc,EAAE,SAAS,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;QACrF,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;QAC7B,MAAM,GAAG,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAEpC,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC;YAC1C,MAAM,EAAE,eAAe;YACvB,SAAS,EAAE,kBAAkB;YAC7B,cAAc,EAAE,MAAM;YACtB,WAAW,EAAE,CAAC;SACf,EAAE,GAAG,CAAC,CAAC;QAER,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;QAC1D,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjD,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,KAAK,IAAI,EAAE;QAC1C,IAAI,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC;QAC5C,MAAM,GAAG,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAEpC,MAAM,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC;YAClC,MAAM,EAAE,UAAU;YAClB,SAAS,EAAE,eAAe;SAC3B,EAAE,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,IAAI,IAAyB,CAAC;IAE9B,UAAU,CAAC,GAAG,EAAE;QACd,IAAI,GAAG,eAAe,EAAE,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;QAC3D,IAAI,CAAC,YAAY,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,EAAE,CAAC,CAAC;QACxD,MAAM,GAAG,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAEpC,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,OAAO,CAAC;YAC7C,MAAM,EAAE,MAAM;YACd,SAAS,EAAE,kBAAkB;YAC7B,cAAc,EAAE,KAAK;SACtB,EAAE,GAAG,CAAC,CAAC;QAER,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACrD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxD,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;QAC3C,IAAI,CAAC,YAAY,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC,EAAE,CAAC,CAAC;QACzD,MAAM,GAAG,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAEpC,MAAM,iBAAiB,CAAC,OAAO,CAAC;YAC9B,MAAM,EAAE,MAAM;YACd,SAAS,EAAE,kBAAkB;YAC7B,cAAc,EAAE,MAAM;YACtB,YAAY,EAAE,GAAG;YACjB,YAAY,EAAE,GAAG;YACjB,QAAQ,EAAE,IAAI;SACf,EAAE,GAAG,CAAC,CAAC;QAER,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACpD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACpD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;QAC3D,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QACtB,MAAM,GAAG,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAEpC,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,OAAO,CAAC;YAC7C,MAAM,EAAE,MAAM;YACd,SAAS,EAAE,kBAAkB;SAC9B,EAAE,GAAG,CAAC,CAAC;QAER,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACrD,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;QACpD,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QACtB,MAAM,GAAG,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAEpC,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,OAAO,CAAC;YAC7C,MAAM,EAAE,OAAO;YACf,SAAS,EAAE,kBAAkB;YAC7B,MAAM,EAAE,IAAI;SACb,EAAE,GAAG,CAAC,CAAC;QAER,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QACtD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/C,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;QACrD,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QACtB,MAAM,GAAG,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAEpC,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,OAAO,CAAC;YAC7C,MAAM,EAAE,OAAO;YACf,SAAS,EAAE,kBAAkB;YAC7B,MAAM,EAAE,KAAK;SACd,EAAE,GAAG,CAAC,CAAC;QAER,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChD,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;QACvD,IAAI,CAAC,YAAY,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC;QACrC,MAAM,GAAG,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAEpC,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,OAAO,CAAC;YAC7C,MAAM,EAAE,MAAM;YACd,SAAS,EAAE,kBAAkB;YAC7B,OAAO,EAAE,GAAG;SACb,EAAE,GAAG,CAAC,CAAC;QAER,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACrD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC/C,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QAC1D,IAAI,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC,CAAC;QACzD,MAAM,GAAG,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAEpC,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,OAAO,CAAC;YAC7C,MAAM,EAAE,OAAO;YACf,SAAS,EAAE,kBAAkB;YAC7B,cAAc,EAAE,QAAQ;SACzB,EAAE,GAAG,CAAC,CAAC;QAER,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QACtD,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;QAClE,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QACtB,MAAM,GAAG,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAEpC,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,OAAO,CAAC;YAC7C,MAAM,EAAE,aAAa;YACrB,SAAS,EAAE,kBAAkB;SAC9B,EAAE,GAAG,CAAC,CAAC;QAER,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QAC5D,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,IAAI,IAAyB,CAAC;IAE9B,UAAU,CAAC,GAAG,EAAE;QACd,IAAI,GAAG,eAAe,EAAE,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAC7D,IAAI,CAAC,YAAY,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;QACxD,MAAM,GAAG,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAEpC,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC;YACzC,MAAM,EAAE,QAAQ;YAChB,SAAS,EAAE,kBAAkB;YAC7B,cAAc,EAAE,UAAU;YAC1B,MAAM,EAAE,GAAG;SACZ,EAAE,GAAG,CAAC,CAAC;QAER,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QACvD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC7D,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC9C,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;QAC/D,IAAI,CAAC,YAAY,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;QAC5D,MAAM,GAAG,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAEpC,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC;YACzC,MAAM,EAAE,QAAQ;YAChB,SAAS,EAAE,kBAAkB;YAC7B,cAAc,EAAE,MAAM;YACtB,YAAY,EAAE,UAAU;SACzB,EAAE,GAAG,CAAC,CAAC;QAER,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAC7D,IAAI,CAAC,YAAY,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;QAC3C,MAAM,GAAG,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAEpC,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC;YACzC,MAAM,EAAE,QAAQ;YAChB,SAAS,EAAE,kBAAkB;YAC7B,cAAc,EAAE,UAAU;SAC3B,EAAE,GAAG,CAAC,CAAC;QAER,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QACvD,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;QAC3D,IAAI,CAAC,YAAY,CAAC,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC;QAClE,MAAM,GAAG,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAEpC,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC;YACzC,MAAM,EAAE,QAAQ;YAChB,SAAS,EAAE,kBAAkB;YAC7B,QAAQ,EAAE,MAAM;YAChB,QAAQ,EAAE,WAAW;SACtB,EAAE,GAAG,CAAC,CAAC;QAER,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QACvD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACnD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACxD,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;QACzE,IAAI,CAAC,YAAY,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;QACzF,MAAM,GAAG,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAEpC,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC;YACzC,MAAM,EAAE,cAAc;YACtB,SAAS,EAAE,kBAAkB;YAC7B,cAAc,EAAE,MAAM;YACtB,MAAM,EAAE,GAAG;YACX,SAAS,EAAE,QAAQ;SACpB,EAAE,GAAG,CAAC,CAAC;QAER,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;QAClE,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,yBAAyB,CAAC,CAAC;QACpD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;QAC9D,IAAI,CAAC,YAAY,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,UAAU,EAAE,gBAAgB,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC;QACzF,MAAM,GAAG,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAEpC,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC;YACzC,MAAM,EAAE,WAAW;YACnB,SAAS,EAAE,kBAAkB;YAC7B,cAAc,EAAE,MAAM;YACtB,UAAU,EAAE,OAAO;YACnB,UAAU,EAAE,gBAAgB;SAC7B,EAAE,GAAG,CAAC,CAAC;QAER,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;QAC1D,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACnE,IAAI,CAAC,YAAY,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,CAAC,CAAC;QACxC,MAAM,GAAG,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAEpC,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC;YACzC,MAAM,EAAE,cAAc;YACtB,SAAS,EAAE,kBAAkB;YAC7B,cAAc,EAAE,MAAM;YACtB,WAAW,EAAE,CAAC;SACf,EAAE,GAAG,CAAC,CAAC;QAER,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QAC7D,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;QACpE,IAAI,CAAC,YAAY,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;QAC9D,MAAM,GAAG,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAEpC,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC;YACzC,MAAM,EAAE,cAAc;YACtB,SAAS,EAAE,kBAAkB;YAC7B,cAAc,EAAE,MAAM;YACtB,WAAW,EAAE,CAAC;YACd,IAAI,EAAE,GAAG;YACT,KAAK,EAAE,CAAC;SACT,EAAE,GAAG,CAAC,CAAC;QAER,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACnD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC5C,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC3C,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;QACtE,IAAI,CAAC,YAAY,CAAC,EAAE,gBAAgB,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC;QAC3D,MAAM,GAAG,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAEpC,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC;YACzC,MAAM,EAAE,iBAAiB;YACzB,SAAS,EAAE,kBAAkB;YAC7B,cAAc,EAAE,MAAM;YACtB,WAAW,EAAE,CAAC;YACd,cAAc,EAAE,CAAC;SAClB,EAAE,GAAG,CAAC,CAAC;QAER,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QACtD,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;QACjE,IAAI,CAAC,YAAY,CAAC,EAAE,gBAAgB,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAC9E,MAAM,GAAG,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAEpC,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC;YACzC,MAAM,EAAE,iBAAiB;YACzB,SAAS,EAAE,kBAAkB;YAC7B,cAAc,EAAE,MAAM;YACtB,WAAW,EAAE,CAAC;YACd,cAAc,EAAE,CAAC;YACjB,IAAI,EAAE,IAAI;YACV,KAAK,EAAE,CAAC;SACT,EAAE,GAAG,CAAC,CAAC;QAER,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QACtD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;QAC/C,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=node.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/tools/node.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,173 @@
1
+ import { describe, it, expect, beforeEach } from 'vitest';
2
+ import { createMockGodot, createToolContext } from '../helpers/mock-godot.js';
3
+ import { getNodeProperties, createNode, updateNode, deleteNode, reparentNode, } from '../../tools/node.js';
4
+ describe('Node Tools', () => {
5
+ let mock;
6
+ beforeEach(() => {
7
+ mock = createMockGodot();
8
+ });
9
+ describe('get_node_properties', () => {
10
+ it('sends get_node_properties command with node_path', async () => {
11
+ mock.mockResponse({ properties: { position: { x: 0, y: 0 } } });
12
+ const ctx = createToolContext(mock);
13
+ await getNodeProperties.execute({ node_path: '/root/Main/Player' }, ctx);
14
+ expect(mock.calls).toHaveLength(1);
15
+ expect(mock.calls[0].command).toBe('get_node_properties');
16
+ expect(mock.calls[0].params).toEqual({ node_path: '/root/Main/Player' });
17
+ });
18
+ it('returns formatted JSON properties', async () => {
19
+ const properties = { position: { x: 100, y: 200 }, visible: true, name: 'Player' };
20
+ mock.mockResponse({ properties });
21
+ const ctx = createToolContext(mock);
22
+ const result = await getNodeProperties.execute({ node_path: '/root/Main/Player' }, ctx);
23
+ expect(result).toBe(JSON.stringify(properties, null, 2));
24
+ });
25
+ it('requires node_path', () => {
26
+ expect(getNodeProperties.schema.safeParse({}).success).toBe(false);
27
+ expect(getNodeProperties.schema.safeParse({ node_path: '/root/Test' }).success).toBe(true);
28
+ });
29
+ });
30
+ describe('create_node', () => {
31
+ it('sends create_node command with required params', async () => {
32
+ mock.mockResponse({ node_path: '/root/Main/NewSprite' });
33
+ const ctx = createToolContext(mock);
34
+ await createNode.execute({
35
+ parent_path: '/root/Main',
36
+ node_type: 'Sprite2D',
37
+ node_name: 'NewSprite',
38
+ }, ctx);
39
+ expect(mock.calls).toHaveLength(1);
40
+ expect(mock.calls[0].command).toBe('create_node');
41
+ expect(mock.calls[0].params).toEqual({
42
+ parent_path: '/root/Main',
43
+ node_type: 'Sprite2D',
44
+ node_name: 'NewSprite',
45
+ properties: {},
46
+ });
47
+ });
48
+ it('passes optional properties to Godot', async () => {
49
+ mock.mockResponse({ node_path: '/root/Main/Enemy' });
50
+ const ctx = createToolContext(mock);
51
+ await createNode.execute({
52
+ parent_path: '/root/Main',
53
+ node_type: 'CharacterBody2D',
54
+ node_name: 'Enemy',
55
+ properties: { position: { x: 50, y: 100 }, scale: { x: 2, y: 2 } },
56
+ }, ctx);
57
+ expect(mock.calls[0].params.properties).toEqual({
58
+ position: { x: 50, y: 100 },
59
+ scale: { x: 2, y: 2 },
60
+ });
61
+ });
62
+ it('returns created node path', async () => {
63
+ mock.mockResponse({ node_path: '/root/Main/NewNode' });
64
+ const ctx = createToolContext(mock);
65
+ const result = await createNode.execute({
66
+ parent_path: '/root/Main',
67
+ node_type: 'Node2D',
68
+ node_name: 'NewNode',
69
+ }, ctx);
70
+ expect(result).toBe('Created node: /root/Main/NewNode');
71
+ });
72
+ it('requires parent_path, node_type, and node_name', () => {
73
+ const schema = createNode.schema;
74
+ expect(schema.safeParse({}).success).toBe(false);
75
+ expect(schema.safeParse({ parent_path: '/root' }).success).toBe(false);
76
+ expect(schema.safeParse({ parent_path: '/root', node_type: 'Node2D' }).success).toBe(false);
77
+ expect(schema.safeParse({
78
+ parent_path: '/root',
79
+ node_type: 'Node2D',
80
+ node_name: 'Test',
81
+ }).success).toBe(true);
82
+ });
83
+ });
84
+ describe('update_node', () => {
85
+ it('sends update_node command with node_path and properties', async () => {
86
+ mock.mockResponse({});
87
+ const ctx = createToolContext(mock);
88
+ await updateNode.execute({
89
+ node_path: '/root/Main/Player',
90
+ properties: { health: 100, speed: 200 },
91
+ }, ctx);
92
+ expect(mock.calls).toHaveLength(1);
93
+ expect(mock.calls[0].command).toBe('update_node');
94
+ expect(mock.calls[0].params).toEqual({
95
+ node_path: '/root/Main/Player',
96
+ properties: { health: 100, speed: 200 },
97
+ });
98
+ });
99
+ it('returns confirmation with node path', async () => {
100
+ mock.mockResponse({});
101
+ const ctx = createToolContext(mock);
102
+ const result = await updateNode.execute({
103
+ node_path: '/root/Main/Enemy',
104
+ properties: { visible: false },
105
+ }, ctx);
106
+ expect(result).toBe('Updated node: /root/Main/Enemy');
107
+ });
108
+ it('requires node_path and properties', () => {
109
+ const schema = updateNode.schema;
110
+ expect(schema.safeParse({}).success).toBe(false);
111
+ expect(schema.safeParse({ node_path: '/root' }).success).toBe(false);
112
+ expect(schema.safeParse({
113
+ node_path: '/root/Test',
114
+ properties: { key: 'value' },
115
+ }).success).toBe(true);
116
+ });
117
+ });
118
+ describe('delete_node', () => {
119
+ it('sends delete_node command with node_path', async () => {
120
+ mock.mockResponse({});
121
+ const ctx = createToolContext(mock);
122
+ await deleteNode.execute({ node_path: '/root/Main/Obsolete' }, ctx);
123
+ expect(mock.calls).toHaveLength(1);
124
+ expect(mock.calls[0].command).toBe('delete_node');
125
+ expect(mock.calls[0].params).toEqual({ node_path: '/root/Main/Obsolete' });
126
+ });
127
+ it('returns confirmation with deleted path', async () => {
128
+ mock.mockResponse({});
129
+ const ctx = createToolContext(mock);
130
+ const result = await deleteNode.execute({ node_path: '/root/Main/ToRemove' }, ctx);
131
+ expect(result).toBe('Deleted node: /root/Main/ToRemove');
132
+ });
133
+ it('requires node_path', () => {
134
+ expect(deleteNode.schema.safeParse({}).success).toBe(false);
135
+ expect(deleteNode.schema.safeParse({ node_path: '/root/Test' }).success).toBe(true);
136
+ });
137
+ });
138
+ describe('reparent_node', () => {
139
+ it('sends reparent_node command with both paths', async () => {
140
+ mock.mockResponse({});
141
+ const ctx = createToolContext(mock);
142
+ await reparentNode.execute({
143
+ node_path: '/root/Main/Child',
144
+ new_parent_path: '/root/Main/NewParent',
145
+ }, ctx);
146
+ expect(mock.calls).toHaveLength(1);
147
+ expect(mock.calls[0].command).toBe('reparent_node');
148
+ expect(mock.calls[0].params).toEqual({
149
+ node_path: '/root/Main/Child',
150
+ new_parent_path: '/root/Main/NewParent',
151
+ });
152
+ });
153
+ it('returns confirmation with both paths', async () => {
154
+ mock.mockResponse({});
155
+ const ctx = createToolContext(mock);
156
+ const result = await reparentNode.execute({
157
+ node_path: '/root/Old/Node',
158
+ new_parent_path: '/root/New',
159
+ }, ctx);
160
+ expect(result).toBe('Moved node /root/Old/Node to /root/New');
161
+ });
162
+ it('requires both node_path and new_parent_path', () => {
163
+ const schema = reparentNode.schema;
164
+ expect(schema.safeParse({}).success).toBe(false);
165
+ expect(schema.safeParse({ node_path: '/root/Test' }).success).toBe(false);
166
+ expect(schema.safeParse({
167
+ node_path: '/root/Test',
168
+ new_parent_path: '/root/New',
169
+ }).success).toBe(true);
170
+ });
171
+ });
172
+ });
173
+ //# sourceMappingURL=node.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node.test.js","sourceRoot":"","sources":["../../../src/__tests__/tools/node.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=scene.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scene.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/tools/scene.test.ts"],"names":[],"mappings":""}